Skip to content

Commit 25dbeb4

Browse files
committed
Add unit test for SSI
1 parent 2dc921e commit 25dbeb4

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the "Elastic License
4+
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
package org.elasticsearch.index.fielddata.fieldcomparator;
11+
12+
import org.apache.lucene.document.Document;
13+
import org.apache.lucene.document.NumericDocValuesField;
14+
import org.apache.lucene.document.SortedDocValuesField;
15+
import org.apache.lucene.index.DocValuesSkipper;
16+
import org.apache.lucene.index.IndexReader;
17+
import org.apache.lucene.index.IndexWriterConfig;
18+
import org.apache.lucene.index.LeafReaderContext;
19+
import org.apache.lucene.index.NumericDocValues;
20+
import org.apache.lucene.search.DocIdSetIterator;
21+
import org.apache.lucene.search.DocValuesRangeIterator;
22+
import org.apache.lucene.search.Sort;
23+
import org.apache.lucene.search.SortField;
24+
import org.apache.lucene.search.TwoPhaseIterator;
25+
import org.apache.lucene.store.Directory;
26+
import org.apache.lucene.tests.analysis.MockAnalyzer;
27+
import org.apache.lucene.tests.index.RandomIndexWriter;
28+
import org.apache.lucene.util.BytesRef;
29+
import org.elasticsearch.test.ESTestCase;
30+
31+
import java.io.IOException;
32+
33+
public class SecondarySortIteratorTests extends ESTestCase {
34+
35+
public void testAgainstDocValuesRangeIterator() throws IOException {
36+
37+
Directory dir = newDirectory();
38+
Sort indexSort = new Sort(new SortField("hostname", SortField.Type.STRING), new SortField("@timestamp", SortField.Type.LONG, true));
39+
IndexWriterConfig iwc = new IndexWriterConfig(new MockAnalyzer(random())).setIndexSort(indexSort);
40+
RandomIndexWriter indexWriter = new RandomIndexWriter(random(), dir, iwc);
41+
42+
int numDocs = atLeast(1000);
43+
for (int i = 0; i < numDocs; i++) {
44+
Document doc = new Document();
45+
doc.add(SortedDocValuesField.indexedField("hostname", new BytesRef("host1")));
46+
doc.add(NumericDocValuesField.indexedField("@timestamp", 1_000_000 + i));
47+
indexWriter.addDocument(doc);
48+
}
49+
50+
indexWriter.forceMerge(1);
51+
52+
IndexReader reader = indexWriter.getReader();
53+
long start = 1_000_400;
54+
long end = 1_000_499;
55+
DocIdSetIterator dvIt = docValuesRangeIterator(reader.leaves().getFirst(), start, end);
56+
DocIdSetIterator ssIt = secondarySortIterator(reader.leaves().getFirst(), start, end);
57+
58+
// Because the primary sort field has only a single value, we should get exactly the same
59+
// results from the secondary sort iterator as from a standard DVRangeIterator over the
60+
// secondary field
61+
for (int doc = dvIt.nextDoc(); doc != DocIdSetIterator.NO_MORE_DOCS; doc = dvIt.nextDoc()) {
62+
assertEquals(doc, ssIt.nextDoc());
63+
}
64+
assertEquals(DocIdSetIterator.NO_MORE_DOCS, ssIt.nextDoc());
65+
66+
reader.close();
67+
indexWriter.close();
68+
dir.close();
69+
}
70+
71+
private static DocIdSetIterator secondarySortIterator(LeafReaderContext ctx, long start, long end) throws IOException {
72+
NumericDocValues timeStampDV = ctx.reader().getNumericDocValues("@timestamp");
73+
DocValuesSkipper primarySkipper = ctx.reader().getDocValuesSkipper("hostname");
74+
DocValuesSkipper secondarySkipper = ctx.reader().getDocValuesSkipper("@timestamp");
75+
return new SecondarySortIterator(timeStampDV, secondarySkipper, primarySkipper, start, end);
76+
}
77+
78+
private static DocIdSetIterator docValuesRangeIterator(LeafReaderContext ctx, long start, long end) throws IOException {
79+
NumericDocValues timeStampDV = ctx.reader().getNumericDocValues("@timestamp");
80+
TwoPhaseIterator twoPhaseIterator = new TwoPhaseIterator(timeStampDV) {
81+
@Override
82+
public boolean matches() throws IOException {
83+
return timeStampDV.longValue() >= start && timeStampDV.longValue() <= end;
84+
}
85+
86+
@Override
87+
public float matchCost() {
88+
return 2;
89+
}
90+
};
91+
DocValuesSkipper skipper = ctx.reader().getDocValuesSkipper("@timestamp");
92+
return TwoPhaseIterator.asDocIdSetIterator(new DocValuesRangeIterator(twoPhaseIterator, skipper, start, end, false));
93+
}
94+
}

0 commit comments

Comments
 (0)