You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jb...@apache.org on 2014/02/08 19:13:37 UTC

svn commit: r1566071 - in /lucene/dev/trunk/solr: CHANGES.txt core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java core/src/test/org/apache/solr/search/QueryEqualityTest.java core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java

Author: jbernste
Date: Sat Feb  8 18:13:37 2014
New Revision: 1566071

URL: http://svn.apache.org/r1566071
Log:
SOLR-5624: Enable QueryResultCache for CollapsingQParserPlugin

Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1566071&r1=1566070&r2=1566071&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Sat Feb  8 18:13:37 2014
@@ -315,6 +315,9 @@ Optimizations
 * SOLR-4227: Wrap XML RequestWriter's OutputStreamWriter in a BufferedWriter
   to avoid frequent converter invocations. (Conrad Herrmann, shalin)
 
+* SOLR-5624: Enable QueryResultCache for CollapsingQParserPlugin.
+  (David Boychuck, Joel Bernstein)
+
 Other Changes
 ---------------------
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java?rev=1566071&r1=1566070&r2=1566071&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java Sat Feb  8 18:13:37 2014
@@ -23,6 +23,7 @@ import org.apache.lucene.queries.functio
 import org.apache.lucene.util.BytesRef;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.request.LocalSolrQueryRequest;
+import org.apache.solr.request.SolrRequestInfo;
 import org.apache.solr.schema.TrieFloatField;
 import org.apache.solr.schema.TrieIntField;
 import org.apache.solr.schema.TrieLongField;
@@ -126,13 +127,12 @@ public class CollapsingQParserPlugin ext
 
   public class CollapsingPostFilter extends ExtendedQueryBase implements PostFilter, ScoreFilter {
 
-    private Object cacheId;
     private String field;
     private String max;
     private String min;
     private boolean needsScores = true;
     private int nullPolicy;
-    private Map context;
+    private Set<String> boosted;
     public static final int NULL_POLICY_IGNORE = 0;
     public static final int NULL_POLICY_COLLAPSE = 1;
     public static final int NULL_POLICY_EXPAND = 2;
@@ -154,15 +154,25 @@ public class CollapsingQParserPlugin ext
     }
 
     public int hashCode() {
-      return this.cacheId.hashCode()*((1+Float.floatToIntBits(this.getBoost()))*31);
+      int hashCode = field.hashCode();
+      hashCode = max!=null ? hashCode+max.hashCode():hashCode;
+      hashCode = min!=null ? hashCode+min.hashCode():hashCode;
+      hashCode = boosted!=null ? hashCode+boosted.hashCode():hashCode;
+      hashCode = hashCode+nullPolicy;
+      hashCode = hashCode*((1+Float.floatToIntBits(this.getBoost()))*31);
+      return hashCode;
     }
 
     public boolean equals(Object o) {
-      //Uses the unique id for equals to ensure that the query result cache always fails.
+
       if(o instanceof CollapsingPostFilter) {
         CollapsingPostFilter c = (CollapsingPostFilter)o;
-        //Do object comparison to be sure only the same object will return true.
-        if(this.cacheId == c.cacheId && this.getBoost()==c.getBoost()) {
+        if(this.field.equals(c.field) &&
+           ((this.max == null && c.max == null) || (this.max != null && c.max != null && this.max.equals(c.max))) &&
+           ((this.min == null && c.min == null) || (this.min != null && c.min != null && this.min.equals(c.min))) &&
+           this.nullPolicy == c.nullPolicy &&
+           ((this.boosted == null && c.boosted == null) || (this.boosted == c.boosted)) &&
+           this.getBoost()==c.getBoost()) {
           return true;
         }
       }
@@ -178,11 +188,9 @@ public class CollapsingQParserPlugin ext
     }
 
     public CollapsingPostFilter(SolrParams localParams, SolrParams params, SolrQueryRequest request) throws IOException {
-      this.cacheId = new Object();
       this.field = localParams.get("field");
       this.max = localParams.get("max");
       this.min = localParams.get("min");
-      this.context = request.getContext();
       if(this.min != null || this.max != null) {
         this.needsScores = needsScores(params);
       }
@@ -201,6 +209,7 @@ public class CollapsingQParserPlugin ext
 
     private IntOpenHashSet getBoostDocs(SolrIndexSearcher indexSearcher, Set<String> boosted) throws IOException {
       IntOpenHashSet boostDocs = null;
+
       if(boosted != null) {
         SchemaField idField = indexSearcher.getSchema().getUniqueKeyField();
         String fieldName = idField.getName();
@@ -296,7 +305,10 @@ public class CollapsingQParserPlugin ext
         int maxDoc = searcher.maxDoc();
         int leafCount = searcher.getTopReaderContext().leaves().size();
 
-        IntOpenHashSet boostDocs = getBoostDocs(searcher, (Set<String>) (this.context.get(QueryElevationComponent.BOOSTED)));
+        SolrRequestInfo info = SolrRequestInfo.getRequestInfo();
+        this.boosted = (Set<String>)info.getReq().getContext().get(QueryElevationComponent.BOOSTED);
+
+        IntOpenHashSet boostDocs = getBoostDocs(searcher, this.boosted);
 
         if(this.min != null || this.max != null) {
 
@@ -344,7 +356,7 @@ public class CollapsingQParserPlugin ext
         }
       }
 
-      if(this.context.containsKey(QueryElevationComponent.BOOSTED)) {
+      if(this.boosted != null) {
         return true;
       }
 

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java?rev=1566071&r1=1566070&r2=1566071&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java Sat Feb  8 18:13:37 2014
@@ -18,6 +18,7 @@ package org.apache.solr.search;
 
 import java.util.HashSet;
 import java.util.Set;
+import java.util.Map;
 
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.QueryUtils;
@@ -197,9 +198,32 @@ public class QueryEqualityTest extends S
 
   public void testQueryCollapse() throws Exception {
     SolrQueryRequest req = req("myField","foo_s");
+
     try {
       assertQueryEquals("collapse", req,
           "{!collapse field=$myField}");
+
+      assertQueryEquals("collapse", req,
+          "{!collapse field=$myField max=a}");
+
+      assertQueryEquals("collapse", req,
+          "{!collapse field=$myField min=a}");
+
+      assertQueryEquals("collapse", req,
+          "{!collapse field=$myField max=a nullPolicy=expand}");
+
+      //Add boosted documents to the request context.
+      Map context = req.getContext();
+      Set boosted = new HashSet();
+      boosted.add("doc1");
+      boosted.add("doc2");
+      context.put("BOOSTED", boosted);
+
+      assertQueryEquals("collapse", req,
+          "{!collapse field=$myField min=a}",
+          "{!collapse field=$myField min=a nullPolicy=ignore}");
+
+
     } finally {
       req.close();
     }

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java?rev=1566071&r1=1566070&r2=1566071&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java Sat Feb  8 18:13:37 2014
@@ -140,9 +140,10 @@ public class TestCollapseQParserPlugin e
     params.add("qf", "term_s");
     params.add("qt", "/elevate");
     assertQ(req(params), "*[count(//doc)=4]",
-                         "//result/doc[1]/float[@name='id'][.='1.0']");
-
-
+                         "//result/doc[1]/float[@name='id'][.='1.0']",
+                         "//result/doc[2]/float[@name='id'][.='2.0']",
+                         "//result/doc[3]/float[@name='id'][.='3.0']",
+                         "//result/doc[4]/float[@name='id'][.='6.0']");
 
 
     //Test collapse by min int field and sort