Skip to content

Commit 49fda11

Browse files
iverasekkrik-es
andauthored
Use LogDocMergePolicy in CompositeAggregatorTests (#103174) (#105494)
* Use LogDocMergePolicy in CompositeAggregatorTests The latest lucene upgrade adds a new merge policy that reverse the order of the documents. To avoid randomisation we hardcode the merge policy to LogDocMergePolicy. This has also been applied to NestedAggregatorTests, so the logic is moved to AggregatorTestCase to be available to all agg tests. Fixes #103105 * make policy optional * update comment * suggested updates Co-authored-by: Kostas Krikellas <[email protected]>
1 parent 1ed60a2 commit 49fda11

File tree

4 files changed

+62
-33
lines changed

4 files changed

+62
-33
lines changed

server/src/test/java/org/elasticsearch/search/aggregations/bucket/composite/CompositeAggregatorTests.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.apache.lucene.index.DirectoryReader;
2222
import org.apache.lucene.index.IndexWriterConfig;
2323
import org.apache.lucene.index.IndexableField;
24+
import org.apache.lucene.index.LogDocMergePolicy;
2425
import org.apache.lucene.index.NoMergePolicy;
2526
import org.apache.lucene.index.Term;
2627
import org.apache.lucene.search.FieldExistsQuery;
@@ -766,7 +767,10 @@ public void testUsingTestCase() throws Exception {
766767
assertEquals(2L, result.getBuckets().get(1).getDocCount());
767768
assertEquals("{keyword=d}", result.getBuckets().get(2).getKeyAsString());
768769
assertEquals(1L, result.getBuckets().get(2).getDocCount());
769-
}, new AggTestConfig(new CompositeAggregationBuilder("name", Collections.singletonList(terms)), FIELD_TYPES));
770+
},
771+
new AggTestConfig(new CompositeAggregationBuilder("name", Collections.singletonList(terms)), FIELD_TYPES)
772+
.withLogDocMergePolicy()
773+
);
770774
}
771775

772776
/**
@@ -819,7 +823,7 @@ public void testSubAggregationOfNested() throws Exception {
819823
builder,
820824
new KeywordFieldMapper.KeywordFieldType(nestedPath + "." + leafNameField),
821825
new NumberFieldMapper.NumberFieldType("price", NumberFieldMapper.NumberType.LONG)
822-
)
826+
).withLogDocMergePolicy()
823827
);
824828
}
825829

@@ -874,7 +878,7 @@ public void testSubAggregationOfNestedAggregateAfter() throws Exception {
874878
builder,
875879
new KeywordFieldMapper.KeywordFieldType(nestedPath + "." + leafNameField),
876880
new NumberFieldMapper.NumberFieldType("price", NumberFieldMapper.NumberType.LONG)
877-
)
881+
).withLogDocMergePolicy()
878882
);
879883
}
880884

@@ -3095,7 +3099,7 @@ public void testIndexSortWithDuplicate() throws Exception {
30953099

30963100
public void testParentFactoryValidation() throws Exception {
30973101
try (Directory directory = newDirectory()) {
3098-
try (RandomIndexWriter indexWriter = new RandomIndexWriter(random(), directory)) {
3102+
try (RandomIndexWriter indexWriter = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
30993103
Document document = new Document();
31003104
document.clear();
31013105
addToDocument(0, document, createDocument("term-field", "a", "long", 100L));
@@ -3650,6 +3654,9 @@ private <T extends AggregationBuilder, V extends InternalAggregation> void execu
36503654
}
36513655
if (forceMerge == false) {
36523656
config.setMergePolicy(NoMergePolicy.INSTANCE);
3657+
} else {
3658+
// Use LogDocMergePolicy to avoid randomization issues with the doc retrieval order.
3659+
config.setMergePolicy(new LogDocMergePolicy());
36533660
}
36543661
try (RandomIndexWriter indexWriter = new RandomIndexWriter(random(), directory, config)) {
36553662
Document document = new Document();

server/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/NestedAggregatorTests.java

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.apache.lucene.search.ConstantScoreQuery;
2626
import org.apache.lucene.search.TermQuery;
2727
import org.apache.lucene.store.Directory;
28-
import org.apache.lucene.tests.analysis.MockAnalyzer;
2928
import org.apache.lucene.tests.index.RandomIndexWriter;
3029
import org.apache.lucene.util.BytesRef;
3130
import org.elasticsearch.common.lucene.search.Queries;
@@ -137,14 +136,9 @@ protected ScriptService getMockScriptService() {
137136
return new ScriptService(Settings.EMPTY, engines, ScriptModule.CORE_CONTEXTS, () -> 1L);
138137
}
139138

140-
private static RandomIndexWriter newRandomIndexWriter(Directory directory) throws IOException {
141-
final IndexWriterConfig conf = newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(new LogDocMergePolicy());
142-
return new RandomIndexWriter(random(), directory, conf);
143-
}
144-
145139
public void testNoDocs() throws IOException {
146140
try (Directory directory = newDirectory()) {
147-
try (RandomIndexWriter iw = newRandomIndexWriter(directory)) {
141+
try (RandomIndexWriter iw = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
148142
// intentionally not writing any docs
149143
}
150144
try (DirectoryReader indexReader = wrapInMockESDirectoryReader(DirectoryReader.open(directory))) {
@@ -171,7 +165,7 @@ public void testSingleNestingMax() throws IOException {
171165
int expectedNestedDocs = 0;
172166
double expectedMaxValue = Double.NEGATIVE_INFINITY;
173167
try (Directory directory = newDirectory()) {
174-
try (RandomIndexWriter iw = newRandomIndexWriter(directory)) {
168+
try (RandomIndexWriter iw = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
175169
for (int i = 0; i < numRootDocs; i++) {
176170
List<Iterable<IndexableField>> documents = new ArrayList<>();
177171
int numNestedDocs = randomIntBetween(0, 20);
@@ -220,7 +214,7 @@ public void testDoubleNestingMax() throws IOException {
220214
int expectedNestedDocs = 0;
221215
double expectedMaxValue = Double.NEGATIVE_INFINITY;
222216
try (Directory directory = newDirectory()) {
223-
try (RandomIndexWriter iw = newRandomIndexWriter(directory)) {
217+
try (RandomIndexWriter iw = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
224218
for (int i = 0; i < numRootDocs; i++) {
225219
List<Iterable<IndexableField>> documents = new ArrayList<>();
226220
int numNestedDocs = randomIntBetween(0, 20);
@@ -270,7 +264,7 @@ public void testOrphanedDocs() throws IOException {
270264
int expectedNestedDocs = 0;
271265
double expectedSum = 0;
272266
try (Directory directory = newDirectory()) {
273-
try (RandomIndexWriter iw = newRandomIndexWriter(directory)) {
267+
try (RandomIndexWriter iw = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
274268
for (int i = 0; i < numRootDocs; i++) {
275269
List<Iterable<IndexableField>> documents = new ArrayList<>();
276270
int numNestedDocs = randomIntBetween(0, 20);
@@ -394,7 +388,7 @@ public void testResetRootDocId() throws Exception {
394388

395389
public void testNestedOrdering() throws IOException {
396390
try (Directory directory = newDirectory()) {
397-
try (RandomIndexWriter iw = newRandomIndexWriter(directory)) {
391+
try (RandomIndexWriter iw = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
398392
iw.addDocuments(generateBook("1", new String[] { "a" }, new int[] { 12, 13, 14 }));
399393
iw.addDocuments(generateBook("2", new String[] { "b" }, new int[] { 5, 50 }));
400394
iw.addDocuments(generateBook("3", new String[] { "c" }, new int[] { 39, 19 }));
@@ -521,7 +515,7 @@ public void testNestedOrdering_random() throws IOException {
521515
books.add(Tuple.tuple(Strings.format("%03d", i), chapters));
522516
}
523517
try (Directory directory = newDirectory()) {
524-
try (RandomIndexWriter iw = newRandomIndexWriter(directory)) {
518+
try (RandomIndexWriter iw = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
525519
int id = 0;
526520
for (Tuple<String, int[]> book : books) {
527521
iw.addDocuments(generateBook(Strings.format("%03d", id), new String[] { book.v1() }, book.v2()));
@@ -571,7 +565,7 @@ public void testNestedOrdering_random() throws IOException {
571565

572566
public void testPreGetChildLeafCollectors() throws IOException {
573567
try (Directory directory = newDirectory()) {
574-
try (RandomIndexWriter iw = newRandomIndexWriter(directory)) {
568+
try (RandomIndexWriter iw = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
575569
List<Iterable<IndexableField>> documents = new ArrayList<>();
576570
LuceneDocument document = new LuceneDocument();
577571
document.add(new StringField(IdFieldMapper.NAME, Uid.encodeId("1"), Field.Store.NO));
@@ -689,7 +683,7 @@ public void testFieldAlias() throws IOException {
689683
MappedFieldType fieldType = new NumberFieldMapper.NumberFieldType(VALUE_FIELD_NAME, NumberFieldMapper.NumberType.LONG);
690684

691685
try (Directory directory = newDirectory()) {
692-
try (RandomIndexWriter iw = newRandomIndexWriter(directory)) {
686+
try (RandomIndexWriter iw = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
693687
for (int i = 0; i < numRootDocs; i++) {
694688
List<Iterable<IndexableField>> documents = new ArrayList<>();
695689
int numNestedDocs = randomIntBetween(0, 20);
@@ -730,7 +724,7 @@ public void testNestedWithPipeline() throws IOException {
730724
int expectedNestedDocs = 0;
731725
double expectedMaxValue = Double.NEGATIVE_INFINITY;
732726
try (Directory directory = newDirectory()) {
733-
try (RandomIndexWriter iw = newRandomIndexWriter(directory)) {
727+
try (RandomIndexWriter iw = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
734728
for (int i = 0; i < numRootDocs; i++) {
735729
List<Iterable<IndexableField>> documents = new ArrayList<>();
736730
expectedMaxValue = Math.max(expectedMaxValue, generateMaxDocs(documents, 1, i, NESTED_OBJECT, VALUE_FIELD_NAME));
@@ -796,7 +790,7 @@ public void testNestedUnderTerms() throws IOException {
796790
)
797791
);
798792
try (Directory directory = newDirectory()) {
799-
try (RandomIndexWriter iw = newRandomIndexWriter(directory)) {
793+
try (RandomIndexWriter iw = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
800794
buildResellerData(numProducts, numResellers).accept(iw);
801795
}
802796
try (DirectoryReader indexReader = wrapInMockESDirectoryReader(DirectoryReader.open(directory))) {

server/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/ReverseNestedAggregatorTests.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,8 @@
1313
import org.apache.lucene.document.SortedNumericDocValuesField;
1414
import org.apache.lucene.document.StringField;
1515
import org.apache.lucene.index.DirectoryReader;
16-
import org.apache.lucene.index.IndexWriterConfig;
1716
import org.apache.lucene.index.IndexableField;
18-
import org.apache.lucene.index.LogDocMergePolicy;
1917
import org.apache.lucene.store.Directory;
20-
import org.apache.lucene.tests.analysis.MockAnalyzer;
2118
import org.apache.lucene.tests.index.RandomIndexWriter;
2219
import org.elasticsearch.index.mapper.IdFieldMapper;
2320
import org.elasticsearch.index.mapper.LuceneDocument;
@@ -62,14 +59,9 @@ protected DirectoryReader wrapDirectoryReader(DirectoryReader reader) throws IOE
6259
return wrapInMockESDirectoryReader(reader);
6360
}
6461

65-
private static RandomIndexWriter newRandomIndexWriter(Directory directory) throws IOException {
66-
final IndexWriterConfig conf = newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(new LogDocMergePolicy());
67-
return new RandomIndexWriter(random(), directory, conf);
68-
}
69-
7062
public void testNoDocs() throws IOException {
7163
try (Directory directory = newDirectory()) {
72-
try (RandomIndexWriter iw = newRandomIndexWriter(directory)) {
64+
try (RandomIndexWriter iw = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
7365
// intentionally not writing any docs
7466
}
7567
try (DirectoryReader indexReader = wrapInMockESDirectoryReader(DirectoryReader.open(directory))) {
@@ -98,7 +90,7 @@ public void testMaxFromParentDocs() throws IOException {
9890
int expectedNestedDocs = 0;
9991
double expectedMaxValue = Double.NEGATIVE_INFINITY;
10092
try (Directory directory = newDirectory()) {
101-
try (RandomIndexWriter iw = newRandomIndexWriter(directory)) {
93+
try (RandomIndexWriter iw = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
10294
for (int i = 0; i < numParentDocs; i++) {
10395
List<Iterable<IndexableField>> documents = new ArrayList<>();
10496
int numNestedDocs = randomIntBetween(0, 20);
@@ -154,7 +146,7 @@ public void testFieldAlias() throws IOException {
154146
MappedFieldType fieldType = new NumberFieldMapper.NumberFieldType(VALUE_FIELD_NAME, NumberFieldMapper.NumberType.LONG);
155147

156148
try (Directory directory = newDirectory()) {
157-
try (RandomIndexWriter iw = newRandomIndexWriter(directory)) {
149+
try (RandomIndexWriter iw = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
158150
for (int i = 0; i < numParentDocs; i++) {
159151
List<Iterable<IndexableField>> documents = new ArrayList<>();
160152
int numNestedDocs = randomIntBetween(0, 20);
@@ -219,7 +211,7 @@ public void testNestedUnderTerms() throws IOException {
219211
);
220212

221213
try (Directory directory = newDirectory()) {
222-
try (RandomIndexWriter iw = newRandomIndexWriter(directory)) {
214+
try (RandomIndexWriter iw = newRandomIndexWriterWithLogDocMergePolicy(directory)) {
223215
NestedAggregatorTests.buildResellerData(numProducts, numResellers).accept(iw);
224216
}
225217
try (DirectoryReader indexReader = wrapInMockESDirectoryReader(DirectoryReader.open(directory))) {

test/framework/src/main/java/org/elasticsearch/search/aggregations/AggregatorTestCase.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.apache.lucene.index.IndexReaderContext;
2424
import org.apache.lucene.index.IndexWriterConfig;
2525
import org.apache.lucene.index.LeafReaderContext;
26+
import org.apache.lucene.index.LogDocMergePolicy;
2627
import org.apache.lucene.index.NoMergePolicy;
2728
import org.apache.lucene.index.OrdinalMap;
2829
import org.apache.lucene.index.SortedDocValues;
@@ -487,6 +488,17 @@ protected ScriptService getMockScriptService() {
487488
return null;
488489
}
489490

491+
/**
492+
* Create a RandomIndexWriter that uses the LogDocMergePolicy.
493+
*
494+
* The latest lucene upgrade adds a new merge policy that reverses the order of the documents and it is not compatible with some
495+
* aggregation types. This writer avoids randomization by hardcoding the merge policy to LogDocMergePolicy.
496+
*/
497+
protected static RandomIndexWriter newRandomIndexWriterWithLogDocMergePolicy(Directory directory) throws IOException {
498+
final IndexWriterConfig conf = newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(new LogDocMergePolicy());
499+
return new RandomIndexWriter(random(), directory, conf);
500+
}
501+
490502
/**
491503
* Collects all documents that match the provided query {@link Query} and
492504
* returns the reduced {@link InternalAggregation}.
@@ -713,6 +725,10 @@ protected <T extends AggregationBuilder, V extends InternalAggregation> void tes
713725
boolean timeSeries = aggTestConfig.builder().isInSortOrderExecutionRequired();
714726
try (Directory directory = newDirectory()) {
715727
IndexWriterConfig config = LuceneTestCase.newIndexWriterConfig(random(), new MockAnalyzer(random()));
728+
if (aggTestConfig.useLogDocMergePolicy()) {
729+
// Use LogDocMergePolicy to avoid randomization issues with the doc retrieval order for nested aggs.
730+
config.setMergePolicy(new LogDocMergePolicy());
731+
}
716732
if (timeSeries) {
717733
Sort sort = new Sort(
718734
new SortField(TimeSeriesIdFieldMapper.NAME, SortField.Type.STRING, false),
@@ -1524,11 +1540,13 @@ public record AggTestConfig(
15241540
boolean splitLeavesIntoSeparateAggregators,
15251541
boolean shouldBeCached,
15261542
boolean incrementalReduce,
1543+
1544+
boolean useLogDocMergePolicy,
15271545
MappedFieldType... fieldTypes
15281546
) {
15291547

15301548
public AggTestConfig(AggregationBuilder builder, MappedFieldType... fieldTypes) {
1531-
this(new MatchAllDocsQuery(), builder, DEFAULT_MAX_BUCKETS, randomBoolean(), true, randomBoolean(), fieldTypes);
1549+
this(new MatchAllDocsQuery(), builder, DEFAULT_MAX_BUCKETS, randomBoolean(), true, randomBoolean(), false, fieldTypes);
15321550
}
15331551

15341552
public AggTestConfig withQuery(Query query) {
@@ -1539,6 +1557,7 @@ public AggTestConfig withQuery(Query query) {
15391557
splitLeavesIntoSeparateAggregators,
15401558
shouldBeCached,
15411559
incrementalReduce,
1560+
useLogDocMergePolicy,
15421561
fieldTypes
15431562
);
15441563
}
@@ -1551,6 +1570,7 @@ public AggTestConfig withSplitLeavesIntoSeperateAggregators(boolean splitLeavesI
15511570
splitLeavesIntoSeparateAggregators,
15521571
shouldBeCached,
15531572
incrementalReduce,
1573+
useLogDocMergePolicy,
15541574
fieldTypes
15551575
);
15561576
}
@@ -1563,6 +1583,7 @@ public AggTestConfig withShouldBeCached(boolean shouldBeCached) {
15631583
splitLeavesIntoSeparateAggregators,
15641584
shouldBeCached,
15651585
incrementalReduce,
1586+
useLogDocMergePolicy,
15661587
fieldTypes
15671588
);
15681589
}
@@ -1575,6 +1596,7 @@ public AggTestConfig withMaxBuckets(int maxBuckets) {
15751596
splitLeavesIntoSeparateAggregators,
15761597
shouldBeCached,
15771598
incrementalReduce,
1599+
useLogDocMergePolicy,
15781600
fieldTypes
15791601
);
15801602
}
@@ -1587,6 +1609,20 @@ public AggTestConfig withIncrementalReduce(boolean incrementalReduce) {
15871609
splitLeavesIntoSeparateAggregators,
15881610
shouldBeCached,
15891611
incrementalReduce,
1612+
useLogDocMergePolicy,
1613+
fieldTypes
1614+
);
1615+
}
1616+
1617+
public AggTestConfig withLogDocMergePolicy() {
1618+
return new AggTestConfig(
1619+
query,
1620+
builder,
1621+
maxBuckets,
1622+
splitLeavesIntoSeparateAggregators,
1623+
shouldBeCached,
1624+
incrementalReduce,
1625+
true,
15901626
fieldTypes
15911627
);
15921628
}

0 commit comments

Comments
 (0)