2020package org .elasticsearch .search .aggregations .bucket .filters ;
2121
2222import org .apache .lucene .index .LeafReaderContext ;
23+ import org .apache .lucene .search .IndexSearcher ;
2324import org .apache .lucene .search .Query ;
2425import org .apache .lucene .search .Weight ;
2526import org .apache .lucene .util .Bits ;
@@ -57,31 +58,26 @@ static class KeyedFilter {
5758 }
5859
5960 private final String [] keys ;
60- private final Weight [] filters ;
61+ private Weight [] filters ;
6162 private final boolean keyed ;
6263 private final boolean showOtherBucket ;
6364 private final String otherBucketKey ;
6465 private final int totalNumKeys ;
6566
66- public FiltersAggregator (String name , AggregatorFactories factories , List < KeyedFilter > filters , boolean keyed , String otherBucketKey ,
67+ public FiltersAggregator (String name , AggregatorFactories factories , String [] keys , Weight [] filters , boolean keyed , String otherBucketKey ,
6768 AggregationContext aggregationContext ,
6869 Aggregator parent , List <PipelineAggregator > pipelineAggregators , Map <String , Object > metaData )
6970 throws IOException {
7071 super (name , factories , aggregationContext , parent , pipelineAggregators , metaData );
7172 this .keyed = keyed ;
72- this .keys = new String [ filters . size ()] ;
73- this .filters = new Weight [ filters . size ()] ;
73+ this .keys = keys ;
74+ this .filters = filters ;
7475 this .showOtherBucket = otherBucketKey != null ;
7576 this .otherBucketKey = otherBucketKey ;
7677 if (showOtherBucket ) {
77- this .totalNumKeys = filters . size () + 1 ;
78+ this .totalNumKeys = keys . length + 1 ;
7879 } else {
79- this .totalNumKeys = filters .size ();
80- }
81- for (int i = 0 ; i < filters .size (); ++i ) {
82- KeyedFilter keyedFilter = filters .get (i );
83- this .keys [i ] = keyedFilter .key ;
84- this .filters [i ] = aggregationContext .searchContext ().searcher ().createNormalizedWeight (keyedFilter .filter , false );
80+ this .totalNumKeys = keys .length ;
8581 }
8682 }
8783
@@ -146,6 +142,7 @@ final long bucketOrd(long owningBucketOrdinal, int filterOrd) {
146142 public static class Factory extends AggregatorFactory {
147143
148144 private final List <KeyedFilter > filters ;
145+ private final String [] keys ;
149146 private boolean keyed ;
150147 private String otherBucketKey ;
151148
@@ -154,12 +151,33 @@ public Factory(String name, List<KeyedFilter> filters, boolean keyed, String oth
154151 this .filters = filters ;
155152 this .keyed = keyed ;
156153 this .otherBucketKey = otherBucketKey ;
154+ this .keys = new String [filters .size ()];
155+ for (int i = 0 ; i < filters .size (); ++i ) {
156+ KeyedFilter keyedFilter = filters .get (i );
157+ this .keys [i ] = keyedFilter .key ;
158+ }
157159 }
158160
161+ // TODO: refactor in order to initialize the factory once with its parent,
162+ // the context, etc. and then have a no-arg lightweight create method
163+ // (since create may be called thousands of times)
164+
165+ private IndexSearcher searcher ;
166+ private Weight [] weights ;
167+
159168 @ Override
160169 public Aggregator createInternal (AggregationContext context , Aggregator parent , boolean collectsFromSingleBucket ,
161170 List <PipelineAggregator > pipelineAggregators , Map <String , Object > metaData ) throws IOException {
162- return new FiltersAggregator (name , factories , filters , keyed , otherBucketKey , context , parent , pipelineAggregators , metaData );
171+ IndexSearcher contextSearcher = context .searchContext ().searcher ();
172+ if (searcher != contextSearcher ) {
173+ searcher = contextSearcher ;
174+ weights = new Weight [filters .size ()];
175+ for (int i = 0 ; i < filters .size (); ++i ) {
176+ KeyedFilter keyedFilter = filters .get (i );
177+ this .weights [i ] = contextSearcher .createNormalizedWeight (keyedFilter .filter , false );
178+ }
179+ }
180+ return new FiltersAggregator (name , factories , keys , weights , keyed , otherBucketKey , context , parent , pipelineAggregators , metaData );
163181 }
164182 }
165183
0 commit comments