LUCENE-7798: Add .equals and .hashCode to ToParentBlockJoinSortField

This commit is contained in:
Mikhail Khludnev 2017-04-29 13:35:24 +03:00
parent 460b3b36e9
commit e96dc4f21c
5 changed files with 64 additions and 11 deletions

View File

@ -106,6 +106,9 @@ Bug Fixes
* LUCENE-7808: Fixed PayloadScoreQuery and SpanPayloadCheckQuery
.equals and .hashCode methods. (Erik Hatcher)
* LUCENE-7798: Add .equals and .hashCode to ToParentBlockJoinSortField
(Mikhail Khludnev)
Improvements
* LUCENE-7782: OfflineSorter now passes the total number of items it

View File

@ -207,4 +207,30 @@ public class ToParentBlockJoinSortField extends SortField {
}
};
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((childFilter == null) ? 0 : childFilter.hashCode());
result = prime * result + (order ? 1231 : 1237);
result = prime * result + ((parentFilter == null) ? 0 : parentFilter.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!super.equals(obj)) return false;
if (getClass() != obj.getClass()) return false;
ToParentBlockJoinSortField other = (ToParentBlockJoinSortField) obj;
if (childFilter == null) {
if (other.childFilter != null) return false;
} else if (!childFilter.equals(other.childFilter)) return false;
if (order != other.order) return false;
if (parentFilter == null) {
if (other.parentFilter != null) return false;
} else if (!parentFilter.equals(other.parentFilter)) return false;
return true;
}
}

View File

@ -18,6 +18,7 @@ package org.apache.lucene.search.join;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.document.Document;
@ -237,9 +238,10 @@ public class TestBlockJoinSorting extends LuceneTestCase {
assertEquals("i", ((BytesRef) ((FieldDoc) topDocs.scoreDocs[4]).fields[0]).utf8ToString());
// Sort by field ascending, order last
sortField = new ToParentBlockJoinSortField(
sortField = notEqual(sortField, () -> new ToParentBlockJoinSortField(
"field2", SortField.Type.STRING, false, true, parentFilter, childFilter
);
));
sort = new Sort(sortField);
topDocs = searcher.search(query, 5, sort);
assertEquals(7, topDocs.totalHits);
@ -256,9 +258,9 @@ public class TestBlockJoinSorting extends LuceneTestCase {
assertEquals("k", ((BytesRef) ((FieldDoc) topDocs.scoreDocs[4]).fields[0]).utf8ToString());
// Sort by field descending, order last
sortField = new ToParentBlockJoinSortField(
sortField = notEqual(sortField, () -> new ToParentBlockJoinSortField(
"field2", SortField.Type.STRING, true, parentFilter, childFilter
);
));
sort = new Sort(sortField);
topDocs = searcher.search(query, 5, sort);
assertEquals(topDocs.totalHits, 7);
@ -273,17 +275,19 @@ public class TestBlockJoinSorting extends LuceneTestCase {
assertEquals("i", ((BytesRef) ((FieldDoc) topDocs.scoreDocs[3]).fields[0]).utf8ToString());
assertEquals(11, topDocs.scoreDocs[4].doc);
assertEquals("g", ((BytesRef) ((FieldDoc) topDocs.scoreDocs[4]).fields[0]).utf8ToString());
// Sort by field descending, order last, sort filter (filter_1:T)
childFilter = new QueryBitSetProducer(new TermQuery((new Term("filter_1", "T"))));
BitSetProducer childFilter1T = new QueryBitSetProducer(new TermQuery((new Term("filter_1", "T"))));
query = new ToParentBlockJoinQuery(
new TermQuery((new Term("filter_1", "T"))),
parentFilter,
ScoreMode.None
);
sortField = new ToParentBlockJoinSortField(
"field2", SortField.Type.STRING, true, parentFilter, childFilter
);
sortField = notEqual(sortField, () -> new ToParentBlockJoinSortField(
"field2", SortField.Type.STRING, true, parentFilter, childFilter1T
));
sort = new Sort(sortField);
topDocs = searcher.search(query, 5, sort);
assertEquals(6, topDocs.totalHits);
@ -299,8 +303,27 @@ public class TestBlockJoinSorting extends LuceneTestCase {
assertEquals(7, topDocs.scoreDocs[4].doc);
assertEquals("e", ((BytesRef) ((FieldDoc) topDocs.scoreDocs[4]).fields[0]).utf8ToString());
sortField = notEqual(sortField, () -> new ToParentBlockJoinSortField(
"field2", SortField.Type.STRING, true,
new QueryBitSetProducer(new TermQuery(new Term("__type", "another")))
, childFilter1T
));
searcher.getIndexReader().close();
dir.close();
}
private ToParentBlockJoinSortField notEqual(ToParentBlockJoinSortField old, Supplier<ToParentBlockJoinSortField> create) {
final ToParentBlockJoinSortField newObj = create.get();
assertFalse(old.equals(newObj));
assertNotSame( old, newObj);
final ToParentBlockJoinSortField bro = create.get();
assertEquals(newObj, bro);
assertEquals(newObj.hashCode(), bro.hashCode());
assertNotSame( bro, newObj);
assertFalse(old.equals(bro));
return newObj;
}
}

View File

@ -39,6 +39,8 @@ import org.apache.solr.common.cloud.ZkStateReader;
import org.junit.BeforeClass;
import org.junit.Test;
import com.carrotsearch.randomizedtesting.annotations.Repeat;
public class TestCloudNestedDocsSort extends SolrCloudTestCase {
private static ArrayList<String> vals = new ArrayList<>();
@ -113,7 +115,7 @@ public class TestCloudNestedDocsSort extends SolrCloudTestCase {
}
}
@Test
@Test @Repeat(iterations=2)
public void test() throws SolrServerException, IOException {
final boolean asc = random().nextBoolean();
final String dir = asc ? "asc": "desc";

View File

@ -46,7 +46,6 @@ public class TestNestedDocsSort extends SolrTestCaseJ4 {
parseAssertNe("childfield(name_s1,$q) asc", "childfield(surname_s1,$q2) desc");
}
@AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/LUCENE-7798")
public void testEqualityUpToBlockJoin(){
parseAssertNe("childfield(name_s1,$q) asc","childfield(name_s1,$q2) asc");
}