@@ -591,4 +591,95 @@ private void testCase(AvgAggregationBuilder aggregationBuilder, Query query,
591591 indexReader .close ();
592592 directory .close ();
593593 }
594+
595+ /**
596+ * Make sure that an aggregation not using a script does get cached.
597+ */
598+ public void testCacheAggregation () throws IOException {
599+ Directory directory = newDirectory ();
600+ RandomIndexWriter indexWriter = new RandomIndexWriter (random (), directory );
601+ final int numDocs = 10 ;
602+ for (int i = 0 ; i < numDocs ; i ++) {
603+ indexWriter .addDocument (singleton (new NumericDocValuesField ("value" , i + 1 )));
604+ }
605+ indexWriter .close ();
606+
607+ Directory unmappedDirectory = newDirectory ();
608+ RandomIndexWriter unmappedIndexWriter = new RandomIndexWriter (random (), unmappedDirectory );
609+ unmappedIndexWriter .close ();
610+
611+ IndexReader indexReader = DirectoryReader .open (directory );
612+ IndexReader unamappedIndexReader = DirectoryReader .open (unmappedDirectory );
613+ MultiReader multiReader = new MultiReader (indexReader , unamappedIndexReader );
614+ IndexSearcher indexSearcher = newSearcher (multiReader , true , true );
615+
616+ MappedFieldType fieldType = new NumberFieldMapper .NumberFieldType (NumberFieldMapper .NumberType .INTEGER );
617+ fieldType .setName ("value" );
618+ AvgAggregationBuilder aggregationBuilder = new AvgAggregationBuilder ("avg" )
619+ .field ("value" );
620+
621+ AvgAggregator aggregator = createAggregator (aggregationBuilder , indexSearcher , fieldType );
622+ aggregator .preCollection ();
623+ indexSearcher .search (new MatchAllDocsQuery (), aggregator );
624+ aggregator .postCollection ();
625+
626+ InternalAvg avg = (InternalAvg ) aggregator .buildAggregation (0L );
627+
628+ assertEquals (5.5 , avg .getValue (), 0 );
629+ assertEquals ("avg" , avg .getName ());
630+ assertTrue (AggregationInspectionHelper .hasValue (avg ));
631+
632+ // Test that an aggregation not using a script does get cached
633+ assertTrue (aggregator .context ().getQueryShardContext ().isCacheable ());
634+
635+ multiReader .close ();
636+ directory .close ();
637+ unmappedDirectory .close ();
638+ }
639+
640+ /**
641+ * Make sure that an aggregation using a script does not get cached.
642+ */
643+ public void testDontCacheScripts () throws IOException {
644+ Directory directory = newDirectory ();
645+ RandomIndexWriter indexWriter = new RandomIndexWriter (random (), directory );
646+ final int numDocs = 10 ;
647+ for (int i = 0 ; i < numDocs ; i ++) {
648+ indexWriter .addDocument (singleton (new NumericDocValuesField ("value" , i + 1 )));
649+ }
650+ indexWriter .close ();
651+
652+ Directory unmappedDirectory = newDirectory ();
653+ RandomIndexWriter unmappedIndexWriter = new RandomIndexWriter (random (), unmappedDirectory );
654+ unmappedIndexWriter .close ();
655+
656+ IndexReader indexReader = DirectoryReader .open (directory );
657+ IndexReader unamappedIndexReader = DirectoryReader .open (unmappedDirectory );
658+ MultiReader multiReader = new MultiReader (indexReader , unamappedIndexReader );
659+ IndexSearcher indexSearcher = newSearcher (multiReader , true , true );
660+
661+ MappedFieldType fieldType = new NumberFieldMapper .NumberFieldType (NumberFieldMapper .NumberType .INTEGER );
662+ fieldType .setName ("value" );
663+ AvgAggregationBuilder aggregationBuilder = new AvgAggregationBuilder ("avg" )
664+ .field ("value" )
665+ .script (new Script (ScriptType .INLINE , MockScriptEngine .NAME , VALUE_SCRIPT , Collections .emptyMap ()));
666+
667+ AvgAggregator aggregator = createAggregator (aggregationBuilder , indexSearcher , fieldType );
668+ aggregator .preCollection ();
669+ indexSearcher .search (new MatchAllDocsQuery (), aggregator );
670+ aggregator .postCollection ();
671+
672+ InternalAvg avg = (InternalAvg ) aggregator .buildAggregation (0L );
673+
674+ assertEquals (5.5 , avg .getValue (), 0 );
675+ assertEquals ("avg" , avg .getName ());
676+ assertTrue (AggregationInspectionHelper .hasValue (avg ));
677+
678+ // Test that an aggregation using a script does not get cached
679+ assertFalse (aggregator .context ().getQueryShardContext ().isCacheable ());
680+
681+ multiReader .close ();
682+ directory .close ();
683+ unmappedDirectory .close ();
684+ }
594685}
0 commit comments