Search in sources :

Example 1 with AggregateExpressionRewriter

use of io.confluent.ksql.util.AggregateExpressionRewriter in project ksql by confluentinc.

the class LogicalPlanBuilder method buildLogicalPlan.

public PlanNode buildLogicalPlan(String queryStr) {
    List<Statement> statements = parser.buildAst(queryStr, metaStore);
    Analysis analysis = new Analysis();
    Analyzer analyzer = new Analyzer(queryStr, analysis, metaStore);
    analyzer.process(statements.get(0), new AnalysisContext(null));
    AggregateAnalysis aggregateAnalysis = new AggregateAnalysis();
    AggregateAnalyzer aggregateAnalyzer = new AggregateAnalyzer(aggregateAnalysis, analysis, functionRegistry);
    AggregateExpressionRewriter aggregateExpressionRewriter = new AggregateExpressionRewriter(functionRegistry);
    for (Expression expression : analysis.getSelectExpressions()) {
        aggregateAnalyzer.process(expression, new AnalysisContext(null));
        if (!aggregateAnalyzer.isHasAggregateFunction()) {
            aggregateAnalysis.addNonAggResultColumns(expression);
        }
        aggregateAnalysis.addFinalSelectExpression(ExpressionTreeRewriter.rewriteWith(aggregateExpressionRewriter, expression));
        aggregateAnalyzer.setHasAggregateFunction(false);
    }
    // Build a logical plan
    return new LogicalPlanner(analysis, aggregateAnalysis, functionRegistry).buildPlan();
}
Also used : LogicalPlanner(io.confluent.ksql.planner.LogicalPlanner) AggregateAnalyzer(io.confluent.ksql.analyzer.AggregateAnalyzer) Expression(io.confluent.ksql.parser.tree.Expression) Statement(io.confluent.ksql.parser.tree.Statement) Analysis(io.confluent.ksql.analyzer.Analysis) AggregateAnalysis(io.confluent.ksql.analyzer.AggregateAnalysis) AggregateAnalysis(io.confluent.ksql.analyzer.AggregateAnalysis) AnalysisContext(io.confluent.ksql.analyzer.AnalysisContext) AggregateExpressionRewriter(io.confluent.ksql.util.AggregateExpressionRewriter) AggregateAnalyzer(io.confluent.ksql.analyzer.AggregateAnalyzer) Analyzer(io.confluent.ksql.analyzer.Analyzer)

Example 2 with AggregateExpressionRewriter

use of io.confluent.ksql.util.AggregateExpressionRewriter in project ksql by confluentinc.

the class AggregateAnalyzerTest method analyzeAggregates.

private AggregateAnalysis analyzeAggregates(final String queryStr) {
    System.out.println("Test query:" + queryStr);
    Analysis analysis = analyze(queryStr);
    AggregateAnalysis aggregateAnalysis = new AggregateAnalysis();
    AggregateAnalyzer aggregateAnalyzer = new AggregateAnalyzer(aggregateAnalysis, analysis, functionRegistry);
    AggregateExpressionRewriter aggregateExpressionRewriter = new AggregateExpressionRewriter(functionRegistry);
    for (Expression expression : analysis.getSelectExpressions()) {
        aggregateAnalyzer.process(expression, new AnalysisContext(null));
        if (!aggregateAnalyzer.isHasAggregateFunction()) {
            aggregateAnalysis.addNonAggResultColumns(expression);
        }
        aggregateAnalysis.addFinalSelectExpression(ExpressionTreeRewriter.rewriteWith(aggregateExpressionRewriter, expression));
        aggregateAnalyzer.setHasAggregateFunction(false);
    }
    if (analysis.getHavingExpression() != null) {
        aggregateAnalyzer.process(analysis.getHavingExpression(), new AnalysisContext(null));
        if (!aggregateAnalyzer.isHasAggregateFunction()) {
            aggregateAnalysis.addNonAggResultColumns(analysis.getHavingExpression());
        }
        aggregateAnalysis.setHavingExpression(ExpressionTreeRewriter.rewriteWith(aggregateExpressionRewriter, analysis.getHavingExpression()));
        aggregateAnalyzer.setHasAggregateFunction(false);
    }
    return aggregateAnalysis;
}
Also used : Expression(io.confluent.ksql.parser.tree.Expression) ComparisonExpression(io.confluent.ksql.parser.tree.ComparisonExpression) AggregateExpressionRewriter(io.confluent.ksql.util.AggregateExpressionRewriter)

Example 3 with AggregateExpressionRewriter

use of io.confluent.ksql.util.AggregateExpressionRewriter in project ksql by confluentinc.

the class QueryAnalyzer method analyzeAggregate.

public AggregateAnalysis analyzeAggregate(final Query query, final Analysis analysis) {
    AggregateAnalysis aggregateAnalysis = new AggregateAnalysis();
    AggregateAnalyzer aggregateAnalyzer = new AggregateAnalyzer(aggregateAnalysis, analysis, functionRegistry);
    AggregateExpressionRewriter aggregateExpressionRewriter = new AggregateExpressionRewriter(functionRegistry);
    processSelectExpressions(analysis, aggregateAnalysis, aggregateAnalyzer, aggregateExpressionRewriter);
    if (!aggregateAnalysis.getAggregateFunctionArguments().isEmpty() && analysis.getGroupByExpressions().isEmpty()) {
        throw new KsqlException("Aggregate query needs GROUP BY clause. query:" + query);
    }
    // TODO: make sure only aggregates are in the expression. For now we assume this is the case.
    if (analysis.getHavingExpression() != null) {
        processHavingExpression(analysis, aggregateAnalysis, aggregateAnalyzer, aggregateExpressionRewriter);
    }
    enforceAggregateRules(query, aggregateAnalysis);
    return aggregateAnalysis;
}
Also used : AggregateExpressionRewriter(io.confluent.ksql.util.AggregateExpressionRewriter) KsqlException(io.confluent.ksql.util.KsqlException)

Aggregations

AggregateExpressionRewriter (io.confluent.ksql.util.AggregateExpressionRewriter)3 Expression (io.confluent.ksql.parser.tree.Expression)2 AggregateAnalysis (io.confluent.ksql.analyzer.AggregateAnalysis)1 AggregateAnalyzer (io.confluent.ksql.analyzer.AggregateAnalyzer)1 Analysis (io.confluent.ksql.analyzer.Analysis)1 AnalysisContext (io.confluent.ksql.analyzer.AnalysisContext)1 Analyzer (io.confluent.ksql.analyzer.Analyzer)1 ComparisonExpression (io.confluent.ksql.parser.tree.ComparisonExpression)1 Statement (io.confluent.ksql.parser.tree.Statement)1 LogicalPlanner (io.confluent.ksql.planner.LogicalPlanner)1 KsqlException (io.confluent.ksql.util.KsqlException)1