You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2013/10/26 11:28:53 UTC

svn commit: r1535955 - in /lucene/dev/branches/branch_4x: ./ lucene/ lucene/core/ lucene/core/src/java/org/apache/lucene/search/ lucene/core/src/test/org/apache/lucene/search/ lucene/test-framework/ lucene/test-framework/src/java/org/apache/lucene/search/

Author: uschindler
Date: Sat Oct 26 09:28:53 2013
New Revision: 1535955

URL: http://svn.apache.org/r1535955
Log:
Merged revision(s) 1535950 from lucene/dev/trunk:
LUCENE-5307: Fix topScorer inconsistency in handling QueryWrapperFilter inside ConstantScoreQuery, which now rewrites to a query removing the obsolete QueryWrapperFilter

Added:
    lucene/dev/branches/branch_4x/lucene/test-framework/src/java/org/apache/lucene/search/AssertingQuery.java
      - copied unchanged from r1535950, lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/AssertingQuery.java
Modified:
    lucene/dev/branches/branch_4x/   (props changed)
    lucene/dev/branches/branch_4x/lucene/   (props changed)
    lucene/dev/branches/branch_4x/lucene/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/branch_4x/lucene/core/   (props changed)
    lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java
    lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/search/TestConstantScoreQuery.java
    lucene/dev/branches/branch_4x/lucene/test-framework/   (props changed)

Modified: lucene/dev/branches/branch_4x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/CHANGES.txt?rev=1535955&r1=1535954&r2=1535955&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/lucene/CHANGES.txt Sat Oct 26 09:28:53 2013
@@ -103,6 +103,10 @@ Bug Fixes
 * LUCENE-5303: OrdinalsCache did not use coreCacheKey, resulting in
   over caching across multiple threads. (Mike McCandless, Shai Erera)
 
+* LUCENE-5307: Fix topScorer inconsistency in handling QueryWrapperFilter
+  inside ConstantScoreQuery, which now rewrites to a query removing the
+  obsolete QueryWrapperFilter.  (Adrien Grand, Uwe Schindler)
+
 API Changes:
 
 * LUCENE-5222: Add SortField.needsScores(). Previously it was not possible

Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java?rev=1535955&r1=1535954&r2=1535955&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java (original)
+++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java Sat Oct 26 09:28:53 2013
@@ -78,6 +78,17 @@ public class ConstantScoreQuery extends 
         rewritten.setBoost(this.getBoost());
         return rewritten;
       }
+    } else {
+      assert filter != null;
+      // Fix outdated usage pattern from Lucene 2.x/early-3.x:
+      // because ConstantScoreQuery only accepted filters,
+      // QueryWrapperFilter was used to wrap queries.
+      if (filter instanceof QueryWrapperFilter) {
+        final QueryWrapperFilter qwf = (QueryWrapperFilter) filter;
+        final Query rewritten = new ConstantScoreQuery(qwf.getQuery().rewrite(reader));
+        rewritten.setBoost(this.getBoost());
+        return rewritten;
+      }
     }
     return this;
   }
@@ -239,7 +250,7 @@ public class ConstantScoreQuery extends 
     // this optimization allows out of order scoring as top scorer!
     @Override
     public void score(Collector collector) throws IOException {
-      if (docIdSetIterator instanceof Scorer) {
+      if (query != null) {
         ((Scorer) docIdSetIterator).score(wrapCollector(collector));
       } else {
         super.score(collector);
@@ -249,7 +260,7 @@ public class ConstantScoreQuery extends 
     // this optimization allows out of order scoring as top scorer,
     @Override
     public boolean score(Collector collector, int max, int firstDocID) throws IOException {
-      if (docIdSetIterator instanceof Scorer) {
+      if (query != null) {
         return ((Scorer) docIdSetIterator).score(wrapCollector(collector), max, firstDocID);
       } else {
         return super.score(collector, max, firstDocID);
@@ -258,7 +269,7 @@ public class ConstantScoreQuery extends 
 
     @Override
     public Collection<ChildScorer> getChildren() {
-      if (docIdSetIterator instanceof Scorer)
+      if (query != null)
         return Collections.singletonList(new ChildScorer((Scorer) docIdSetIterator, "constant"));
       else
         return Collections.emptyList();

Modified: lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/search/TestConstantScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/search/TestConstantScoreQuery.java?rev=1535955&r1=1535954&r2=1535955&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/search/TestConstantScoreQuery.java (original)
+++ lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/search/TestConstantScoreQuery.java Sat Oct 26 09:28:53 2013
@@ -156,5 +156,31 @@ public class TestConstantScoreQuery exte
     r.close();
     d.close();
   }
-  
+
+  // LUCENE-5307
+  // don't reuse the scorer of filters since they have been created with topScorer=false
+  public void testQueryWrapperFilter() throws IOException {
+    Directory d = newDirectory();
+    RandomIndexWriter w = new RandomIndexWriter(random(), d);
+    Document doc = new Document();
+    doc.add(newStringField("field", "a", Field.Store.NO));
+    w.addDocument(doc);
+    IndexReader r = w.getReader();
+    w.close();
+
+    Filter filter = new QueryWrapperFilter(AssertingQuery.wrap(random(), new TermQuery(new Term("field", "a"))));
+    IndexSearcher s = newSearcher(r);
+    assert s instanceof AssertingIndexSearcher;
+    // this used to fail
+    s.search(new ConstantScoreQuery(filter), new TotalHitCountCollector());
+    
+    // check the rewrite
+    Query rewritten = new ConstantScoreQuery(filter).rewrite(r);
+    assertTrue(rewritten instanceof ConstantScoreQuery);
+    assertTrue(((ConstantScoreQuery) rewritten).getQuery() instanceof AssertingQuery);
+    
+    r.close();
+    d.close();
+  }
+
 }