You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2012/04/22 23:28:15 UTC
svn commit: r1328981 - in /lucene/dev/trunk/lucene: ./
core/src/java/org/apache/lucene/search/
queryparser/src/java/org/apache/lucene/queryparser/xml/
queryparser/src/java/org/apache/lucene/queryparser/xml/builders/
queryparser/src/test/org/apache/luce...
Author: rmuir
Date: Sun Apr 22 21:28:15 2012
New Revision: 1328981
URL: http://svn.apache.org/viewvc?rev=1328981&view=rev
Log:
LUCENE-4004: add DisjunctionMaxQuery support to the xml query parser
Added:
lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/DisjunctionMaxQueryBuilder.java (with props)
lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/xml/DisjunctionMaxQuery.xml (with props)
Modified:
lucene/dev/trunk/lucene/CHANGES.txt
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/DisjunctionMaxQuery.java
lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/CoreParser.java
lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/xml/TestParser.java
Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1328981&r1=1328980&r2=1328981&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Sun Apr 22 21:28:15 2012
@@ -843,6 +843,9 @@ New features
analysis/ module. The 'smartcn' and 'stempel' components now depend on 'common'.
(Chris Male, Robert Muir)
+* LUCENE-4004: Add DisjunctionMaxQuery support to the xml query parser.
+ (Benson Margulies via Robert Muir)
+
Optimizations
* LUCENE-2588: Don't store unnecessary suffixes when writing the terms
Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/DisjunctionMaxQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/DisjunctionMaxQuery.java?rev=1328981&r1=1328980&r2=1328981&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/DisjunctionMaxQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/DisjunctionMaxQuery.java Sun Apr 22 21:28:15 2012
@@ -78,15 +78,30 @@ public class DisjunctionMaxQuery extends
/** Add a collection of disjuncts to this disjunction
* via Iterable<Query>
+ * @param disjuncts a collection of queries to add as disjuncts.
*/
public void add(Collection<Query> disjuncts) {
this.disjuncts.addAll(disjuncts);
}
- /** An Iterator<Query> over the disjuncts */
+ /** @return An Iterator<Query> over the disjuncts */
public Iterator<Query> iterator() {
return disjuncts.iterator();
}
+
+ /**
+ * @return the disjuncts.
+ */
+ public ArrayList<Query> getDisjuncts() {
+ return disjuncts;
+ }
+
+ /**
+ * @return tie breaker value for multiple matches.
+ */
+ public float getTieBreakerMultiplier() {
+ return tieBreakerMultiplier;
+ }
/**
* Expert: the Weight for DisjunctionMaxQuery, used to
@@ -279,4 +294,5 @@ public class DisjunctionMaxQuery extends
+ disjuncts.hashCode();
}
+
}
Modified: lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/CoreParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/CoreParser.java?rev=1328981&r1=1328980&r2=1328981&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/CoreParser.java (original)
+++ lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/CoreParser.java Sun Apr 22 21:28:15 2012
@@ -75,6 +75,7 @@ public class CoreParser implements Query
queryFactory.addBuilder("MatchAllDocsQuery", new MatchAllDocsQueryBuilder());
queryFactory.addBuilder("BooleanQuery", new BooleanQueryBuilder(queryFactory));
queryFactory.addBuilder("NumericRangeQuery", new NumericRangeQueryBuilder());
+ queryFactory.addBuilder("DisjunctionMaxQuery", new DisjunctionMaxQueryBuilder(queryFactory));
if (parser != null) {
queryFactory.addBuilder("UserQuery", new UserInputQueryBuilder(parser));
} else {
Added: lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/DisjunctionMaxQueryBuilder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/DisjunctionMaxQueryBuilder.java?rev=1328981&view=auto
==============================================================================
--- lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/DisjunctionMaxQueryBuilder.java (added)
+++ lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/DisjunctionMaxQueryBuilder.java Sun Apr 22 21:28:15 2012
@@ -0,0 +1,60 @@
+package org.apache.lucene.queryparser.xml.builders;
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.lucene.queryparser.xml.DOMUtils;
+import org.apache.lucene.queryparser.xml.ParserException;
+import org.apache.lucene.queryparser.xml.QueryBuilder;
+import org.apache.lucene.search.DisjunctionMaxQuery;
+import org.apache.lucene.search.Query;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Build a DisjunctionMaxQuery.
+ */
+public class DisjunctionMaxQueryBuilder implements QueryBuilder {
+
+ private final QueryBuilder factory;
+
+ public DisjunctionMaxQueryBuilder(QueryBuilder factory) {
+ this.factory = factory;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.lucene.xmlparser.QueryObjectBuilder#process(org.w3c.dom.Element)
+ */
+
+ public Query getQuery(Element e) throws ParserException {
+ float tieBreaker = DOMUtils.getAttribute(e, "tieBreaker", 0.0f);
+ DisjunctionMaxQuery dq = new DisjunctionMaxQuery(tieBreaker);
+ dq.setBoost(DOMUtils.getAttribute(e, "boost", 1.0f));
+
+ NodeList nl = e.getChildNodes();
+ for (int i = 0; i < nl.getLength(); i++) {
+ Node node = nl.item(i);
+ if (node instanceof Element) { // all elements are disjuncts.
+ Element queryElem = (Element) node;
+ Query q = factory.getQuery(queryElem);
+ dq.add(q);
+ }
+ }
+
+ return dq;
+ }
+}
Added: lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/xml/DisjunctionMaxQuery.xml
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/xml/DisjunctionMaxQuery.xml?rev=1328981&view=auto
==============================================================================
--- lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/xml/DisjunctionMaxQuery.xml (added)
+++ lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/xml/DisjunctionMaxQuery.xml Sun Apr 22 21:28:15 2012
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<DisjunctionMaxQuery>
+ <TermQuery fieldName="a">merger</TermQuery>
+ <DisjunctionMaxQuery tieBreaker="1.2">
+ <TermQuery fieldName="b">verger</TermQuery>
+ </DisjunctionMaxQuery>
+</DisjunctionMaxQuery>
\ No newline at end of file
Modified: lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/xml/TestParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/xml/TestParser.java?rev=1328981&r1=1328980&r2=1328981&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/xml/TestParser.java (original)
+++ lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/xml/TestParser.java Sun Apr 22 21:28:15 2012
@@ -27,6 +27,7 @@ import org.apache.lucene.document.TextFi
import org.apache.lucene.index.AtomicReaderContext;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.search.DisjunctionMaxQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
@@ -104,6 +105,17 @@ public class TestParser extends LuceneTe
Query q = parse("BooleanQuery.xml");
dumpResults("BooleanQuery", q, 5);
}
+
+ public void testDisjunctionMaxQueryXML() throws ParserException, IOException {
+ Query q = parse("DisjunctionMaxQuery.xml");
+ assertTrue(q instanceof DisjunctionMaxQuery);
+ DisjunctionMaxQuery d = (DisjunctionMaxQuery)q;
+ assertEquals(0.0f, d.getTieBreakerMultiplier(), 0.0001f);
+ assertEquals(2, d.getDisjuncts().size());
+ DisjunctionMaxQuery ndq = (DisjunctionMaxQuery) d.getDisjuncts().get(1);
+ assertEquals(1.2f, ndq.getTieBreakerMultiplier(), 0.0001f);
+ assertEquals(1, ndq.getDisjuncts().size());
+ }
public void testRangeFilterQueryXML() throws ParserException, IOException {
Query q = parse("RangeFilterQuery.xml");