@Override public String toString() { return "LogicalMetric{\n" + "name=" + logicalMetricInfo.getName() + ",\n" + "templateDruidQuery=" + query + ",\n" + "calculation=" + calculation + "\n" + "}"; }
public String getName() { return logicalMetricInfo.getName(); }
public String getMetricName() { return logicalMetricInfo.getName(); }
@Override protected LogicalMetric makeInner(LogicalMetricInfo logicalMetricInfo, List<String> dependentDimensions) { Set<Dimension> dimensions = dependentDimensions.stream() .map(dimensionDictionary::findByApiName) .collect(Collectors.toSet()); Set<Aggregation> aggs = Collections.singleton( new CardinalityAggregation(logicalMetricInfo.getName(), dimensions, byRow) ); return new LogicalMetric(new TemplateDruidQuery(aggs, Collections.emptySet()), NO_OP_MAPPER, logicalMetricInfo); }
@Override protected LogicalMetric makeInner(LogicalMetricInfo logicalMetricInfo, List<String> dependentMetrics) { // Get the ArithmeticPostAggregation operands from the dependent metrics List<PostAggregation> operands = dependentMetrics.stream() .map(metrics::get) .map(LogicalMetric::getMetricField) .map(MetricMaker::getNumericField) .collect(Collectors.toList()); // Create the ArithmeticPostAggregation Set<PostAggregation> postAggregations = Collections.singleton(new ArithmeticPostAggregation( logicalMetricInfo.getName(), function, operands )); TemplateDruidQuery query = getMergedQuery(dependentMetrics).withPostAggregations(postAggregations); return new LogicalMetric( query, resultSetMapperSupplier.apply(logicalMetricInfo.getName()), logicalMetricInfo ); }
@Override protected LogicalMetric makeInner(LogicalMetricInfo logicalMetricInfo, List<String> dependentMetrics) { String metricName = logicalMetricInfo.getName(); Aggregation aggregation = aggregationFactory.apply(metricName, dependentMetrics.get(0)); return new LogicalMetric( new TemplateDruidQuery(Collections.singleton(aggregation), Collections.emptySet()), getResultSetMapper(metricName), logicalMetricInfo ); }
@Override public LogicalMetric make(LogicalMetricInfo logicalMetricInfo, List<String> dependentMetrics) { // Check that we have the right number of metrics assertRequiredDependentMetricCount(logicalMetricInfo.getName(), dependentMetrics); // Actually build the metric. return makeInner(logicalMetricInfo, dependentMetrics); }
@Override protected LogicalMetric makeInner(LogicalMetricInfo logicalMetricInfo, List<String> dependentMetrics) { String metricName = logicalMetricInfo.getName(); try { Set<PostAggregation> postAggregations = Collections.singleton(new ConstantPostAggregation( metricName, new Double(dependentMetrics.get(0)) )); return new LogicalMetric( new TemplateDruidQuery(Collections.emptySet(), postAggregations), NO_OP_MAPPER, logicalMetricInfo ); } catch (NumberFormatException nfe) { String message = String.format( "%s value '%s' does not parse to a number", metricName, dependentMetrics.get(0) ); LOG.error(message); throw new IllegalArgumentException(message, nfe); } }
@Override protected LogicalMetric makeInner(LogicalMetricInfo logicalMetricInfo, List<String> dependentMetrics) { TemplateDruidQuery query = new TemplateDruidQuery( Collections.singleton(new CountAggregation(logicalMetricInfo.getName())), Collections.emptySet() ); return new LogicalMetric(query, NO_OP_MAPPER, logicalMetricInfo); }
@Override protected LogicalMetric makeInner(LogicalMetricInfo logicalMetricInfo, List<String> dependentMetrics) { TemplateDruidQuery mergedQuery = getMergedQuery(dependentMetrics); // Get the ThetaSketchSetOperationPostAggregation operands from the dependent metrics List<PostAggregation> sketchPostAggregations = dependentMetrics.stream() .map(metrics::get) .map(LogicalMetric::getMetricField) .map(MetricMaker::getSketchField) .collect(Collectors.toList()); // Create the ThetaSketchSetOperationPostAggregation String metricName = logicalMetricInfo.getName(); ThetaSketchSetOperationPostAggregation setPostAggregation = new ThetaSketchSetOperationPostAggregation( metricName, function, sketchPostAggregations ); PostAggregation estimate = new ThetaSketchEstimatePostAggregation(metricName, setPostAggregation); TemplateDruidQuery query = mergedQuery.withPostAggregations(Collections.singleton(estimate)); return new LogicalMetric(query, new SketchRoundUpMapper(metricName), logicalMetricInfo); }
/** * Make the metric. * <p> * This method also sanity-checks the dependent metrics to make sure that they * are metrics we have built and are in the metric dictionary. * <p> * Also sanity-checks that the number of dependent metrics are correct for the maker. * * @param logicalMetricInfo Logical metric info provider * @param dependentMetrics Metrics this metric depends on * * @return The new logicalMetric */ public LogicalMetric make(LogicalMetricInfo logicalMetricInfo, List<String> dependentMetrics) { // Check that all of the dependent metrics are in the dictionary assertDependentMetricsExist(dependentMetrics); // Check that we have the right number of metrics assertRequiredDependentMetricCount(logicalMetricInfo.getName(), dependentMetrics); // Have the subclass actually build the metric return this.makeInner(logicalMetricInfo, dependentMetrics); }
@Override protected LogicalMetric makeInner(LogicalMetricInfo logicalMetricInfo, List<String> dependentMetrics) { LogicalMetric sourceMetric = metricDictionary.get(dependentMetrics.get(0)); Aggregation sourceAggregation = assertDependentIsAggregationMetric(sourceMetric); FilteredAggregation filteredAggregation = new FilteredAggregation( logicalMetricInfo.getName(), sourceAggregation, filter ); return new LogicalMetric( new TemplateDruidQuery( ImmutableSet.of(filteredAggregation), Collections.emptySet(), sourceMetric.getTemplateDruidQuery().getInnerQuery().orElse(null) ), sourceMetric.getCalculation(), logicalMetricInfo ); }
@Override protected LogicalMetric makeInner(LogicalMetricInfo logicalMetricInfo, List<String> dependentMetrics) { // Get the Metric that is being averaged over LogicalMetric dependentMetric = metrics.get(dependentMetrics.get(0)); // Get the field being subtotalled in the inner query MetricField sourceMetric = convertToSketchEstimateIfNeeded(dependentMetric.getMetricField()); // Build the TemplateDruidQuery for the metric TemplateDruidQuery innerQuery = buildInnerQuery(sourceMetric, dependentMetric.getTemplateDruidQuery()); TemplateDruidQuery outerQuery = buildOuterQuery(logicalMetricInfo.getName(), sourceMetric, innerQuery); return new LogicalMetric(outerQuery, NO_OP_MAPPER, logicalMetricInfo); }