public static void verifyOrderByAggregations( List<Expression> groupByExpressions, Scope sourceScope, Scope orderByScope, Expression expression, Metadata metadata, Analysis analysis) { AggregationAnalyzer analyzer = new AggregationAnalyzer(groupByExpressions, sourceScope, Optional.of(orderByScope), metadata, analysis); analyzer.analyze(expression); }
private List<FunctionCall> analyzeAggregations( QuerySpecification node, Scope sourceScope, Optional<Scope> orderByScope, List<Expression> groupByExpressions, List<Expression> outputExpressions, List<Expression> orderByExpressions) { checkState(orderByExpressions.isEmpty() || orderByScope.isPresent(), "non-empty orderByExpressions list without orderByScope provided"); List<FunctionCall> aggregates = extractAggregateFunctions(Iterables.concat(outputExpressions, orderByExpressions), metadata.getFunctionRegistry()); analysis.setAggregates(node, aggregates); if (analysis.isAggregation(node)) { // ensure SELECT, ORDER BY and HAVING are constant with respect to group // e.g, these are all valid expressions: // SELECT f(a) GROUP BY a // SELECT f(a + 1) GROUP BY a + 1 // SELECT a + sum(b) GROUP BY a List<Expression> distinctGroupingColumns = groupByExpressions.stream() .distinct() .collect(toImmutableList()); for (Expression expression : outputExpressions) { verifySourceAggregations(distinctGroupingColumns, sourceScope, expression, metadata, analysis); } for (Expression expression : orderByExpressions) { verifyOrderByAggregations(distinctGroupingColumns, sourceScope, orderByScope.get(), expression, metadata, analysis); } } return aggregates; }
private List<FunctionCall> analyzeAggregations( QuerySpecification node, Scope sourceScope, Optional<Scope> orderByScope, List<Expression> groupByExpressions, List<Expression> outputExpressions, List<Expression> orderByExpressions) { checkState(orderByExpressions.isEmpty() || orderByScope.isPresent(), "non-empty orderByExpressions list without orderByScope provided"); List<FunctionCall> aggregates = extractAggregateFunctions(Iterables.concat(outputExpressions, orderByExpressions), metadata.getFunctionRegistry()); analysis.setAggregates(node, aggregates); if (analysis.isAggregation(node)) { // ensure SELECT, ORDER BY and HAVING are constant with respect to group // e.g, these are all valid expressions: // SELECT f(a) GROUP BY a // SELECT f(a + 1) GROUP BY a + 1 // SELECT a + sum(b) GROUP BY a List<Expression> distinctGroupingColumns = groupByExpressions.stream() .distinct() .collect(toImmutableList()); for (Expression expression : outputExpressions) { verifySourceAggregations(distinctGroupingColumns, sourceScope, expression, metadata, analysis); } for (Expression expression : orderByExpressions) { verifyOrderByAggregations(distinctGroupingColumns, sourceScope, orderByScope.get(), expression, metadata, analysis); } } return aggregates; }
public static void verifySourceAggregations( List<Expression> groupByExpressions, Scope sourceScope, Expression expression, Metadata metadata, Analysis analysis) { AggregationAnalyzer analyzer = new AggregationAnalyzer(groupByExpressions, sourceScope, Optional.empty(), metadata, analysis); analyzer.analyze(expression); }
public static void verifyOrderByAggregations( List<Expression> groupByExpressions, Scope sourceScope, Scope orderByScope, Expression expression, Metadata metadata, Analysis analysis) { AggregationAnalyzer analyzer = new AggregationAnalyzer(groupByExpressions, sourceScope, Optional.of(orderByScope), metadata, analysis); analyzer.analyze(expression); }
public static void verifySourceAggregations( List<Expression> groupByExpressions, Scope sourceScope, Expression expression, Metadata metadata, Analysis analysis) { AggregationAnalyzer analyzer = new AggregationAnalyzer(groupByExpressions, sourceScope, Optional.empty(), metadata, analysis); analyzer.analyze(expression); }