|
42 | 42 | import org.opensearch.common.Rounding;
|
43 | 43 | import org.opensearch.common.lease.Releasables;
|
44 | 44 | import org.opensearch.index.codec.composite.CompositeIndexFieldInfo;
|
45 |
| -import org.opensearch.index.compositeindex.datacube.startree.index.StarTreeValues; |
46 | 45 | import org.opensearch.index.compositeindex.datacube.startree.utils.iterator.SortedNumericStarTreeValuesIterator;
|
47 | 46 | import org.opensearch.search.DocValueFormat;
|
48 | 47 | import org.opensearch.search.aggregations.Aggregator;
|
|
53 | 52 | import org.opensearch.search.aggregations.LeafBucketCollector;
|
54 | 53 | import org.opensearch.search.aggregations.LeafBucketCollectorBase;
|
55 | 54 | import org.opensearch.search.aggregations.StarTreeBucketCollector;
|
| 55 | +import org.opensearch.search.aggregations.StarTreePreComputeCollector; |
56 | 56 | import org.opensearch.search.aggregations.bucket.BucketsAggregator;
|
57 | 57 | import org.opensearch.search.aggregations.bucket.filterrewrite.DateHistogramAggregatorBridge;
|
58 | 58 | import org.opensearch.search.aggregations.bucket.filterrewrite.FilterRewriteOptimizationContext;
|
|
80 | 80 | *
|
81 | 81 | * @opensearch.internal
|
82 | 82 | */
|
83 |
| -class DateHistogramAggregator extends BucketsAggregator implements SizedBucketAggregator { |
| 83 | +class DateHistogramAggregator extends BucketsAggregator implements SizedBucketAggregator, StarTreePreComputeCollector { |
84 | 84 | private final ValuesSource.Numeric valuesSource;
|
85 | 85 | private final DocValueFormat formatter;
|
86 | 86 | private final Rounding rounding;
|
@@ -182,47 +182,9 @@ public LeafBucketCollector getLeafCollector(LeafReaderContext ctx, LeafBucketCol
|
182 | 182 | SortedNumericDocValues values = valuesSource.longValues(ctx);
|
183 | 183 | CompositeIndexFieldInfo supportedStarTree = getSupportedStarTree(this.context);
|
184 | 184 | if (supportedStarTree != null) {
|
185 |
| - StarTreeValues starTreeValues = getStarTreeValues(ctx, supportedStarTree); |
186 |
| - assert starTreeValues != null; |
187 |
| - |
188 |
| - FixedBitSet matchingDocsBitSet = StarTreeFilter.getPredicateValueToFixedBitSetMap(starTreeValues, "@timestamp_month"); |
189 |
| - |
190 |
| - SortedNumericStarTreeValuesIterator valuesIterator = (SortedNumericStarTreeValuesIterator) starTreeValues |
191 |
| - .getDimensionValuesIterator("@timestamp_month"); |
192 |
| - |
193 |
| - SortedNumericStarTreeValuesIterator metricValuesIterator = (SortedNumericStarTreeValuesIterator) starTreeValues |
194 |
| - .getMetricValuesIterator("startree1__doc_count_doc_count_metric"); |
195 |
| - |
196 |
| - int numBits = matchingDocsBitSet.length(); |
197 |
| - |
198 |
| - if (numBits > 0) { |
199 |
| - for (int bit = matchingDocsBitSet.nextSetBit(0); bit != DocIdSetIterator.NO_MORE_DOCS; bit = (bit + 1 < numBits) |
200 |
| - ? matchingDocsBitSet.nextSetBit(bit + 1) |
201 |
| - : DocIdSetIterator.NO_MORE_DOCS) { |
202 |
| - |
203 |
| - if (!valuesIterator.advanceExact(bit)) { |
204 |
| - continue; |
205 |
| - } |
206 |
| - |
207 |
| - for (int i = 0, count = valuesIterator.entryValueCount(); i < count; i++) { |
208 |
| - long dimensionValue = valuesIterator.nextValue(); |
209 |
| - |
210 |
| - if (metricValuesIterator.advanceExact(bit)) { |
211 |
| - long metricValue = metricValuesIterator.nextValue(); |
212 |
| - |
213 |
| - long bucketOrd = bucketOrds.add(0, dimensionValue); |
214 |
| - if (bucketOrd < 0) { |
215 |
| - bucketOrd = -1 - bucketOrd; |
216 |
| - collectStarTreeBucket((StarTreeBucketCollector) sub, metricValue, bucketOrd, bit); |
217 |
| - } else { |
218 |
| - grow(bucketOrd + 1); |
219 |
| - collectStarTreeBucket((StarTreeBucketCollector) sub, metricValue, bucketOrd, bit); |
220 |
| - } |
221 |
| - } |
222 |
| - } |
223 |
| - } |
| 185 | + if (preCompute(ctx, supportedStarTree) == true) { |
| 186 | + return LeafBucketCollector.NO_OP_COLLECTOR; |
224 | 187 | }
|
225 |
| - throw new CollectionTerminatedException(); |
226 | 188 | }
|
227 | 189 |
|
228 | 190 | return new LeafBucketCollectorBase(sub, values) {
|
@@ -255,6 +217,55 @@ public void collect(int doc, long owningBucketOrd) throws IOException {
|
255 | 217 | };
|
256 | 218 | }
|
257 | 219 |
|
| 220 | + @Override |
| 221 | + public StarTreeBucketCollector getStarTreeBucketCollector(LeafReaderContext ctx, CompositeIndexFieldInfo starTree) throws IOException { |
| 222 | + |
| 223 | + return new StarTreeBucketCollector() { |
| 224 | + |
| 225 | + public void setSubCollectors() throws IOException { |
| 226 | + for (Aggregator aggregator : subAggregators) { |
| 227 | + ((StarTreePreComputeCollector) aggregator).getStarTreeBucketCollector(ctx, starTree); |
| 228 | + } |
| 229 | + } |
| 230 | + |
| 231 | + { |
| 232 | + this.starTreeValues = getStarTreeValues(ctx, starTree); |
| 233 | + this.matchingDocsBitSet = StarTreeFilter.getPredicateValueToFixedBitSetMap(starTreeValues, "@timestamp_month"); |
| 234 | + this.setSubCollectors(); |
| 235 | + } |
| 236 | + SortedNumericStarTreeValuesIterator valuesIterator = (SortedNumericStarTreeValuesIterator) starTreeValues |
| 237 | + .getDimensionValuesIterator("@timestamp_month"); |
| 238 | + |
| 239 | + SortedNumericStarTreeValuesIterator metricValuesIterator = (SortedNumericStarTreeValuesIterator) starTreeValues |
| 240 | + .getMetricValuesIterator("startree1__doc_count_doc_count_metric"); |
| 241 | + |
| 242 | + @Override |
| 243 | + public void collectStarEntry(int starTreeEntry, long owningBucketOrd) throws IOException { |
| 244 | + |
| 245 | + if (!valuesIterator.advanceExact(starTreeEntry)) { |
| 246 | + return; |
| 247 | + } |
| 248 | + |
| 249 | + for (int i = 0, count = valuesIterator.entryValueCount(); i < count; i++) { |
| 250 | + long dimensionValue = valuesIterator.nextValue(); |
| 251 | + |
| 252 | + if (metricValuesIterator.advanceExact(starTreeEntry)) { |
| 253 | + long metricValue = metricValuesIterator.nextValue(); |
| 254 | + |
| 255 | + long bucketOrd = bucketOrds.add(owningBucketOrd, dimensionValue); |
| 256 | + if (bucketOrd < 0) { |
| 257 | + bucketOrd = -1 - bucketOrd; |
| 258 | + collectStarTreeBucket(this, metricValue, bucketOrd, starTreeEntry); |
| 259 | + } else { |
| 260 | + grow(bucketOrd + 1); |
| 261 | + collectStarTreeBucket(this, metricValue, bucketOrd, starTreeEntry); |
| 262 | + } |
| 263 | + } |
| 264 | + } |
| 265 | + } |
| 266 | + }; |
| 267 | + } |
| 268 | + |
258 | 269 | @Override
|
259 | 270 | public InternalAggregation[] buildAggregations(long[] owningBucketOrds) throws IOException {
|
260 | 271 | return buildAggregationsForVariableBuckets(owningBucketOrds, bucketOrds, (bucketValue, docCount, subAggregationResults) -> {
|
@@ -322,4 +333,22 @@ public double bucketSize(long bucket, Rounding.DateTimeUnit unitSize) {
|
322 | 333 | return 1.0;
|
323 | 334 | }
|
324 | 335 | }
|
| 336 | + |
| 337 | + public boolean preCompute(LeafReaderContext ctx, CompositeIndexFieldInfo starTree) throws IOException { |
| 338 | + // TODO: validate query shape - retrun false if cannot be resolved via star-tree |
| 339 | + StarTreeBucketCollector starTreeBucketCollector = getStarTreeBucketCollector(ctx, starTree); |
| 340 | + |
| 341 | + FixedBitSet matchingDocsBitSet = starTreeBucketCollector.getMatchingDocsBitSet(); |
| 342 | + |
| 343 | + int numBits = matchingDocsBitSet.length(); |
| 344 | + |
| 345 | + if (numBits > 0) { |
| 346 | + for (int bit = matchingDocsBitSet.nextSetBit(0); bit != DocIdSetIterator.NO_MORE_DOCS; bit = (bit + 1 < numBits) |
| 347 | + ? matchingDocsBitSet.nextSetBit(bit + 1) |
| 348 | + : DocIdSetIterator.NO_MORE_DOCS) { |
| 349 | + starTreeBucketCollector.collectStarEntry(bit, 0); |
| 350 | + } |
| 351 | + } |
| 352 | + return true; |
| 353 | + } |
325 | 354 | }
|
0 commit comments