mirror of https://github.com/apache/lucene.git
LUCENE-1415: MultiPhraseQuery has incorrect hashCode() and equals()
git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@703565 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b0e6bac10d
commit
00f98b1fd7
|
@ -9,6 +9,10 @@ API Changes
|
||||||
|
|
||||||
Bug fixes
|
Bug fixes
|
||||||
|
|
||||||
|
1. LUCENE-1415: MultiPhraseQuery has incorrect hashCode() and equals()
|
||||||
|
implementation - Leads to Solr Cache misses.
|
||||||
|
(Todd Feak, Mark Miller via yonik)
|
||||||
|
|
||||||
New features
|
New features
|
||||||
|
|
||||||
Optimizations
|
Optimizations
|
||||||
|
|
|
@ -311,7 +311,7 @@ public class MultiPhraseQuery extends Query {
|
||||||
MultiPhraseQuery other = (MultiPhraseQuery)o;
|
MultiPhraseQuery other = (MultiPhraseQuery)o;
|
||||||
return this.getBoost() == other.getBoost()
|
return this.getBoost() == other.getBoost()
|
||||||
&& this.slop == other.slop
|
&& this.slop == other.slop
|
||||||
&& this.termArrays.equals(other.termArrays)
|
&& termArraysEquals(this.termArrays, other.termArrays)
|
||||||
&& this.positions.equals(other.positions);
|
&& this.positions.equals(other.positions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,8 +319,52 @@ public class MultiPhraseQuery extends Query {
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return Float.floatToIntBits(getBoost())
|
return Float.floatToIntBits(getBoost())
|
||||||
^ slop
|
^ slop
|
||||||
^ termArrays.hashCode()
|
^ termArraysHashCode()
|
||||||
^ positions.hashCode()
|
^ positions.hashCode()
|
||||||
^ 0x4AC65113;
|
^ 0x4AC65113;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Breakout calculation of the termArrays hashcode
|
||||||
|
private int termArraysHashCode() {
|
||||||
|
int hashCode = 1;
|
||||||
|
Iterator iterator = termArrays.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
Term[] termArray = (Term[]) iterator.next();
|
||||||
|
hashCode = 31 * hashCode
|
||||||
|
+ (termArray == null ? 0 : arraysHashCode(termArray));
|
||||||
|
}
|
||||||
|
return hashCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int arraysHashCode(Term[] termArray) {
|
||||||
|
if (termArray == null)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int result = 1;
|
||||||
|
|
||||||
|
for (int i = 0; i < termArray.length; i++) {
|
||||||
|
Term term = termArray[i];
|
||||||
|
result = 31 * result + (term == null ? 0 : term.hashCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Breakout calculation of the termArrays equals
|
||||||
|
private boolean termArraysEquals(List termArrays1, List termArrays2) {
|
||||||
|
if (termArrays1.size() != termArrays2.size()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ListIterator iterator1 = termArrays1.listIterator();
|
||||||
|
ListIterator iterator2 = termArrays2.listIterator();
|
||||||
|
while (iterator1.hasNext()) {
|
||||||
|
Term[] termArray1 = (Term[]) iterator1.next();
|
||||||
|
Term[] termArray2 = (Term[]) iterator2.next();
|
||||||
|
if (!(termArray1 == null ? termArray2 == null : Arrays.equals(termArray1,
|
||||||
|
termArray2))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -191,6 +191,35 @@ public class TestMultiPhraseQuery extends LuceneTestCase
|
||||||
searcher.close();
|
searcher.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testHashCodeAndEquals(){
|
||||||
|
MultiPhraseQuery query1 = new MultiPhraseQuery();
|
||||||
|
MultiPhraseQuery query2 = new MultiPhraseQuery();
|
||||||
|
|
||||||
|
assertEquals(query1.hashCode(), query2.hashCode());
|
||||||
|
assertEquals(query1,query2);
|
||||||
|
|
||||||
|
Term term1= new Term("someField","someText");
|
||||||
|
|
||||||
|
query1.add(term1);
|
||||||
|
query2.add(term1);
|
||||||
|
|
||||||
|
assertEquals(query1.hashCode(), query2.hashCode());
|
||||||
|
assertEquals(query1,query2);
|
||||||
|
|
||||||
|
Term term2= new Term("someField","someMoreText");
|
||||||
|
|
||||||
|
query1.add(term2);
|
||||||
|
|
||||||
|
assertFalse(query1.hashCode()==query2.hashCode());
|
||||||
|
assertFalse(query1.equals(query2));
|
||||||
|
|
||||||
|
query2.add(term2);
|
||||||
|
|
||||||
|
assertEquals(query1.hashCode(), query2.hashCode());
|
||||||
|
assertEquals(query1,query2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void add(String s, String type, IndexWriter writer) throws IOException {
|
private void add(String s, String type, IndexWriter writer) throws IOException {
|
||||||
Document doc = new Document();
|
Document doc = new Document();
|
||||||
doc.add(new Field("body", s, Field.Store.YES, Field.Index.ANALYZED));
|
doc.add(new Field("body", s, Field.Store.YES, Field.Index.ANALYZED));
|
||||||
|
|
Loading…
Reference in New Issue