21
21
import org .apache .lucene .index .IndexReaderContext ;
22
22
import org .apache .lucene .index .IndexWriterConfig ;
23
23
import org .apache .lucene .index .LeafReaderContext ;
24
+ import org .apache .lucene .index .MultiReader ;
24
25
import org .apache .lucene .index .NoMergePolicy ;
25
26
import org .apache .lucene .sandbox .document .HalfFloatPoint ;
26
27
import org .apache .lucene .search .Collector ;
56
57
import org .elasticsearch .common .util .MockBigArrays ;
57
58
import org .elasticsearch .common .util .MockPageCacheRecycler ;
58
59
import org .elasticsearch .core .CheckedConsumer ;
60
+ import org .elasticsearch .core .IOUtils ;
59
61
import org .elasticsearch .core .Releasable ;
60
62
import org .elasticsearch .core .Releasables ;
61
63
import org .elasticsearch .index .Index ;
@@ -451,6 +453,7 @@ protected <A extends InternalAggregation, C extends Aggregator> A searchAndReduc
451
453
aggTestConfig .builder (),
452
454
aggTestConfig .maxBuckets (),
453
455
aggTestConfig .splitLeavesIntoSeparateAggregators (),
456
+ aggTestConfig .shouldBeCached (),
454
457
crankyService ,
455
458
aggTestConfig .fieldTypes ()
456
459
);
@@ -469,6 +472,7 @@ protected <A extends InternalAggregation, C extends Aggregator> A searchAndReduc
469
472
aggTestConfig .builder (),
470
473
aggTestConfig .maxBuckets (),
471
474
aggTestConfig .splitLeavesIntoSeparateAggregators (),
475
+ aggTestConfig .shouldBeCached (),
472
476
breakerService ,
473
477
aggTestConfig .fieldTypes ()
474
478
);
@@ -482,6 +486,7 @@ private <A extends InternalAggregation, C extends Aggregator> A searchAndReduce(
482
486
AggregationBuilder builder ,
483
487
int maxBucket ,
484
488
boolean splitLeavesIntoSeparateAggregators ,
489
+ boolean shouldBeCached ,
485
490
CircuitBreakerService breakerService ,
486
491
MappedFieldType ... fieldTypes
487
492
) throws IOException {
@@ -535,6 +540,7 @@ private <A extends InternalAggregation, C extends Aggregator> A searchAndReduce(
535
540
root .postCollection ();
536
541
aggs .add (root .buildTopLevel ());
537
542
}
543
+ assertEquals (shouldBeCached , context .isCacheable ());
538
544
assertRoundTrip (aggs );
539
545
if (randomBoolean () && aggs .size () > 1 ) {
540
546
// sometimes do an incremental reduce
@@ -624,6 +630,55 @@ protected <T extends AggregationBuilder, V extends InternalAggregation> void tes
624
630
}
625
631
}
626
632
633
+ protected <T extends AggregationBuilder , V extends InternalAggregation > void multiIndexTestCase (
634
+ T aggregationBuilder ,
635
+ Query query ,
636
+ List <CheckedConsumer <RandomIndexWriter , IOException >> indexBuilders ,
637
+ Consumer <V > verify ,
638
+ MappedFieldType ... fieldTypes
639
+ ) throws IOException {
640
+ Directory [] directories = new Directory [indexBuilders .size ()];
641
+ boolean timeSeries = aggregationBuilder .isInSortOrderExecutionRequired ();
642
+ try {
643
+ for (int i = 0 ; i < indexBuilders .size (); i ++) {
644
+ directories [i ] = newDirectory ();
645
+ IndexWriterConfig config = LuceneTestCase .newIndexWriterConfig (random (), new MockAnalyzer (random ()));
646
+ if (timeSeries ) {
647
+ Sort sort = new Sort (
648
+ new SortField (TimeSeriesIdFieldMapper .NAME , SortField .Type .STRING , false ),
649
+ new SortedNumericSortField (DataStreamTimestampFieldMapper .DEFAULT_PATH , SortField .Type .LONG , true )
650
+ );
651
+ config .setIndexSort (sort );
652
+ }
653
+ RandomIndexWriter indexWriter = new RandomIndexWriter (random (), directories [i ], config );
654
+ indexBuilders .get (i ).accept (indexWriter );
655
+ indexWriter .close ();
656
+ }
657
+ // construct the multi-reader
658
+ List <DirectoryReader > directoryReaders = new ArrayList <>();
659
+ try {
660
+ for (Directory directory : directories ) {
661
+ DirectoryReader open = DirectoryReader .open (directory );
662
+ directoryReaders .add (open );
663
+ }
664
+ DirectoryReader [] readers = directoryReaders .toArray (new DirectoryReader [0 ]);
665
+ try (MultiReader multiReader = new MultiReader (readers )) {
666
+ IndexSearcher indexSearcher = newIndexSearcher (multiReader );
667
+
668
+ V agg = searchAndReduce (new AggTestConfig (indexSearcher , query , aggregationBuilder , fieldTypes ));
669
+ verify .accept (agg );
670
+
671
+ verifyOutputFieldNames (aggregationBuilder , agg );
672
+ }
673
+ } finally {
674
+ IOUtils .close (directoryReaders );
675
+ }
676
+ } finally {
677
+ IOUtils .close (directories );
678
+ }
679
+
680
+ }
681
+
627
682
protected void withIndex (
628
683
CheckedConsumer <RandomIndexWriter , IOException > buildIndex ,
629
684
CheckedConsumer <IndexSearcher , IOException > consume
@@ -1421,26 +1476,31 @@ public record AggTestConfig(
1421
1476
AggregationBuilder builder ,
1422
1477
int maxBuckets ,
1423
1478
boolean splitLeavesIntoSeparateAggregators ,
1479
+ boolean shouldBeCached ,
1424
1480
MappedFieldType ... fieldTypes
1425
1481
) {
1426
1482
public AggTestConfig (IndexSearcher searcher , AggregationBuilder builder , MappedFieldType ... fieldTypes ) {
1427
- this (searcher , new MatchAllDocsQuery (), builder , DEFAULT_MAX_BUCKETS , randomBoolean (), fieldTypes );
1483
+ this (searcher , new MatchAllDocsQuery (), builder , DEFAULT_MAX_BUCKETS , randomBoolean (), true , fieldTypes );
1428
1484
}
1429
1485
1430
1486
public AggTestConfig (IndexSearcher searcher , Query query , AggregationBuilder builder , MappedFieldType ... fieldTypes ) {
1431
- this (searcher , query , builder , DEFAULT_MAX_BUCKETS , randomBoolean (), fieldTypes );
1487
+ this (searcher , query , builder , DEFAULT_MAX_BUCKETS , randomBoolean (), true , fieldTypes );
1432
1488
}
1433
1489
1434
1490
public AggTestConfig withQuery (Query query ) {
1435
- return new AggTestConfig (searcher , query , builder , maxBuckets , splitLeavesIntoSeparateAggregators , fieldTypes );
1491
+ return new AggTestConfig (searcher , query , builder , maxBuckets , splitLeavesIntoSeparateAggregators , shouldBeCached , fieldTypes );
1436
1492
}
1437
1493
1438
1494
public AggTestConfig withSplitLeavesIntoSeperateAggregators (boolean splitLeavesIntoSeparateAggregators ) {
1439
- return new AggTestConfig (searcher , query , builder , maxBuckets , splitLeavesIntoSeparateAggregators , fieldTypes );
1495
+ return new AggTestConfig (searcher , query , builder , maxBuckets , splitLeavesIntoSeparateAggregators , shouldBeCached , fieldTypes );
1496
+ }
1497
+
1498
+ public AggTestConfig withShouldBeCached (boolean shouldBeCached ) {
1499
+ return new AggTestConfig (searcher , query , builder , maxBuckets , splitLeavesIntoSeparateAggregators , shouldBeCached , fieldTypes );
1440
1500
}
1441
1501
1442
1502
public AggTestConfig withMaxBuckets (int maxBuckets ) {
1443
- return new AggTestConfig (searcher , query , builder , maxBuckets , splitLeavesIntoSeparateAggregators , fieldTypes );
1503
+ return new AggTestConfig (searcher , query , builder , maxBuckets , splitLeavesIntoSeparateAggregators , shouldBeCached , fieldTypes );
1444
1504
}
1445
1505
}
1446
1506
}
0 commit comments