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");