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();
+ }
+
}