You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by er...@apache.org on 2013/08/21 22:31:39 UTC
svn commit: r1516299 - in /lucene/dev/trunk/solr: CHANGES.txt
core/src/java/org/apache/solr/search/QueryResultKey.java
core/src/test/org/apache/solr/core/QueryResultKeyTest.java
Author: erick
Date: Wed Aug 21 20:31:39 2013
New Revision: 1516299
URL: http://svn.apache.org/r1516299
Log:
SOLR-5057 - queryResultCache should match out-of-order fq clauses
Modified:
lucene/dev/trunk/solr/CHANGES.txt
lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryResultKey.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/QueryResultKeyTest.java
Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1516299&r1=1516298&r2=1516299&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Wed Aug 21 20:31:39 2013
@@ -155,6 +155,8 @@ Optimizations
* SOLR-5134: Have HdfsIndexOutput extend BufferedIndexOutput.
(Mark Miller, Uwe Schindler)
+ * SOLR-5057: QueryResultCache should not related with the order of fq's list (Feihong Huang via Erick Erickson)
+
Other Changes
----------------------
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryResultKey.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryResultKey.java?rev=1516299&r1=1516298&r2=1516299&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryResultKey.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryResultKey.java Wed Aug 21 20:31:39 2013
@@ -90,9 +90,36 @@ public final class QueryResultKey {
}
- private static boolean isEqual(Object o1, Object o2) {
- if (o1==o2) return true; // takes care of identity and null cases
- if (o1==null || o2==null) return false;
- return o1.equals(o2);
+ // Do fast version, expecting that filters are ordered and only
+ // fall back to unordered compare on the first non-equal elements.
+ // This will only be called if the hash code of the entire key already
+ // matched, so the slower unorderedCompare should pretty much never
+ // be called if filter lists are generally ordered.
+ private static boolean isEqual(List<Query> fqList1, List<Query> fqList2) {
+ if (fqList1 == fqList2) return true; // takes care of identity and null cases
+ if (fqList1 == null || fqList2 == null) return false;
+ int sz = fqList1.size();
+ if (sz != fqList2.size()) return false;
+ for (int i = 0; i < sz; i++) {
+ if (!fqList1.get(i).equals(fqList2.get(i))) {
+ return unorderedCompare(fqList1, fqList2, i);
+ }
+ }
+ return true;
}
+
+ private static boolean unorderedCompare(List<Query> fqList1, List<Query> fqList2, int start) {
+ int sz = fqList1.size();
+ outer:
+ for (int i = start; i < sz; i++) {
+ Query q1 = fqList1.get(i);
+ for (int j = start; j < sz; j++) {
+ if (q1.equals(fqList2.get(j)))
+ continue outer;
+ }
+ return false;
+ }
+ return true;
+ }
+
}
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/QueryResultKeyTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/QueryResultKeyTest.java?rev=1516299&r1=1516298&r2=1516299&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/QueryResultKeyTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/QueryResultKeyTest.java Wed Aug 21 20:31:39 2013
@@ -56,4 +56,24 @@ public class QueryResultKeyTest extends
assertEquals(qrk1.hashCode(), qrk2.hashCode());
}
+ @Test
+ public void testQueryResultKeySortedFilters() {
+ Query fq1 = new TermQuery(new Term("test1", "field1"));
+ Query fq2 = new TermQuery(new Term("test2", "field2"));
+
+ Query query = new TermQuery(new Term("test3", "field3"));
+ List<Query> filters = new ArrayList<Query>();
+ filters.add(fq1);
+ filters.add(fq2);
+
+ QueryResultKey key = new QueryResultKey(query, filters, null, 0);
+
+ List<Query> newFilters = new ArrayList<Query>();
+ newFilters.add(fq2);
+ newFilters.add(fq1);
+ QueryResultKey newKey = new QueryResultKey(query, newFilters, null, 0);
+
+ assertEquals(key, newKey);
+ }
+
}