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