@Override public boolean apply(PostAggregator input) { return input.getName().equals(metric); } }
public String getOutputName() { return postAggregator != null ? postAggregator.getName() : Iterables.getOnlyElement(aggregatorFactories).getName(); }
public static int getPostAggIndexForOrderBy(OrderByColumnSpec orderSpec, List<PostAggregator> postAggs) { int i = 0; for (PostAggregator postAgg : postAggs) { if (orderSpec.getDimension().equals((postAgg.getName()))) { return i; } i++; } return -1; }
/** * returns the list of dependent postAggregators that should be calculated in order to calculate given postAgg * * @param postAggregatorList List of postAggregator, there is a restriction that the list should be in an order such * that all the dependencies of any given aggregator should occur before that aggregator. * See AggregatorUtilTest.testOutOfOrderPruneDependentPostAgg for example. * @param postAggName name of the postAgg on which dependency is to be calculated * * @return the list of dependent postAggregators */ public static List<PostAggregator> pruneDependentPostAgg(List<PostAggregator> postAggregatorList, String postAggName) { ArrayList<PostAggregator> rv = new ArrayList<>(); Set<String> deps = new HashSet<>(); deps.add(postAggName); // Iterate backwards to find the last calculated aggregate and add dependent aggregator as we find dependencies // in reverse order for (PostAggregator agg : Lists.reverse(postAggregatorList)) { if (deps.contains(agg.getName())) { rv.add(agg); // add to the beginning of List deps.remove(agg.getName()); deps.addAll(agg.getDependentFields()); } } Collections.reverse(rv); return rv; }
@Override public Comparator getComparator(List<AggregatorFactory> aggregatorSpecs, List<PostAggregator> postAggregatorSpecs) { Comparator comp = null; for (AggregatorFactory factory : aggregatorSpecs) { if (metric.equals(factory.getName())) { comp = factory.getComparator(); break; } } for (PostAggregator pf : postAggregatorSpecs) { if (metric.equals(pf.getName())) { comp = pf.getComparator(); break; } } return comp; }
@Override public Function<Result<TimeseriesResultValue>, Object> prepareForCache(boolean isResultLevelCache) { return input -> { TimeseriesResultValue results = input.getValue(); final List<Object> retVal = Lists.newArrayListWithCapacity(1 + aggs.size()); retVal.add(input.getTimestamp().getMillis()); for (AggregatorFactory agg : aggs) { retVal.add(results.getMetric(agg.getName())); } if (isResultLevelCache) { for (PostAggregator postAgg : query.getPostAggregatorSpecs()) { retVal.add(results.getMetric(postAgg.getName())); } } return retVal; }; }
private static void verifyOutputNames( List<DimensionSpec> dimensions, List<AggregatorFactory> aggregators, List<PostAggregator> postAggregators ) { final Set<String> outputNames = new HashSet<>(); for (DimensionSpec dimension : dimensions) { if (!outputNames.add(dimension.getOutputName())) { throw new IAE("Duplicate output name[%s]", dimension.getOutputName()); } } for (AggregatorFactory aggregator : aggregators) { if (!outputNames.add(aggregator.getName())) { throw new IAE("Duplicate output name[%s]", aggregator.getName()); } } for (PostAggregator postAggregator : postAggregators) { if (!outputNames.add(postAggregator.getName())) { throw new IAE("Duplicate output name[%s]", postAggregator.getName()); } } if (outputNames.contains(ColumnHolder.TIME_COLUMN_NAME)) { throw new IAE( "'%s' cannot be used as an output name for dimensions, aggregators, or post-aggregators.", ColumnHolder.TIME_COLUMN_NAME ); } }
metricValues.put(postAgg.getName(), postAgg.compute(metricValues));
? postAggregator.getName() : Iterables.getOnlyElement(aggregatorFactories).getName();
aggAndPostAggNames.add(postAgg.getName());
); aggregations.add(postAggregator); rowOrder.add(postAggregator.getName());
retVal.put(pf.getName(), pf.compute(retVal));
postAggregatorsMap.put(postAgg.getName(), postAgg);
theVals.put(postAgg.getName(), postAgg.compute(theVals));
private Function<Result<TimeseriesResultValue>, Result<TimeseriesResultValue>> makeComputeManipulatorFn( final TimeseriesQuery query, final MetricManipulationFn fn, final boolean calculatePostAggs ) { return result -> { final TimeseriesResultValue holder = result.getValue(); final Map<String, Object> values = new HashMap<>(holder.getBaseObject()); if (calculatePostAggs && !query.getPostAggregatorSpecs().isEmpty()) { // put non finalized aggregators for calculating dependent post Aggregators for (AggregatorFactory agg : query.getAggregatorSpecs()) { values.put(agg.getName(), holder.getMetric(agg.getName())); } for (PostAggregator postAgg : query.getPostAggregatorSpecs()) { values.put(postAgg.getName(), postAgg.compute(values)); } } for (AggregatorFactory agg : query.getAggregatorSpecs()) { values.put(agg.getName(), fn.manipulate(agg, holder.getMetric(agg.getName()))); } return new Result<>( result.getTimestamp(), new TimeseriesResultValue(values) ); }; } }
dependency2, aggregator ), aggregator.getName() ); Assert.assertEquals(Lists.newArrayList(dependency1, dependency2, aggregator), prunedAgg);
), aggregator.getName() ); Assert.assertEquals(Lists.newArrayList(dependency1, aggregator), prunedAgg);
metricValues.put(postAggregator.getName(), postAggregator.compute(metricValues));