From bb4de829893359c3f2b40b42d61302c65ac55abb Mon Sep 17 00:00:00 2001 From: Dongjoon Hyun Date: Thu, 19 Mar 2015 15:47:07 +0900 Subject: [PATCH] TAJO-1420: Support GROUPING SET syntax --- .../main/java/org/apache/tajo/algebra/Aggregation.java | 1 + .../antlr4/org/apache/tajo/engine/parser/SQLParser.g4 | 9 +++++++-- .../java/org/apache/tajo/engine/parser/SQLAnalyzer.java | 6 +++++- .../org/apache/tajo/plan/algebra/BaseAlgebraVisitor.java | 2 ++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java index 8bcd7e2998..084b1e3a08 100644 --- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java +++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java @@ -149,6 +149,7 @@ public static enum GroupType { OrdinaryGroup(""), Cube("Cube"), Rollup("Rollup"), + GroupingSet("GroupingSet"), EmptySet("()"); String displayName; diff --git a/tajo-core/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4 b/tajo-core/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4 index 1a63470bf8..cd2f761e80 100644 --- a/tajo-core/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4 +++ b/tajo-core/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4 @@ -1106,7 +1106,8 @@ grouping_element_list grouping_element : rollup_list | cube_list - | empty_grouping_set + | grouping_set_list + | empty_set | ordinary_grouping_set ; @@ -1127,7 +1128,11 @@ cube_list : CUBE LEFT_PAREN c=ordinary_grouping_set_list RIGHT_PAREN ; -empty_grouping_set +grouping_set_list + : GROUPING SET LEFT_PAREN c=ordinary_grouping_set_list RIGHT_PAREN + ; + +empty_set : LEFT_PAREN RIGHT_PAREN ; diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java b/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java index 6d32fa5274..d0258dcb4e 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java @@ -334,7 +334,7 @@ public Aggregation visitGroupby_clause(SQLParser.Groupby_clauseContext ctx) { Aggregation clause = new Aggregation(); // If grouping group is not empty - if (ctx.grouping_element_list().grouping_element().get(0).empty_grouping_set() == null) { + if (ctx.grouping_element_list().grouping_element().get(0).empty_set() == null) { int elementSize = ctx.grouping_element_list().grouping_element().size(); ArrayList groups = new ArrayList(elementSize + 1); ArrayList ordinaryExprs = null; @@ -357,6 +357,10 @@ public Aggregation visitGroupby_clause(SQLParser.Groupby_clauseContext ctx) { groupSize++; groups.add(new GroupElement(GroupType.Cube, getRowValuePredicandsFromOrdinaryGroupingSetList(element.cube_list().c))); + } else if (element.grouping_set_list() != null) { + groupSize++; + groups.add(new GroupElement(GroupType.GroupingSet, + getRowValuePredicandsFromOrdinaryGroupingSetList(element.grouping_set_list().c))); } } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/algebra/BaseAlgebraVisitor.java b/tajo-plan/src/main/java/org/apache/tajo/plan/algebra/BaseAlgebraVisitor.java index bd105144de..35209a7e87 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/algebra/BaseAlgebraVisitor.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/algebra/BaseAlgebraVisitor.java @@ -350,6 +350,8 @@ public RESULT visitHaving(CONTEXT ctx, Stack stack, Having expr) throws Pl public RESULT visitGroupBy(CONTEXT ctx, Stack stack, Aggregation expr) throws PlanningException { stack.push(expr); + if (expr.getGroupSet() == null) + throw new PlanningException("Empty Group Set"); for (org.apache.tajo.algebra.Aggregation.GroupElement groupElement : expr.getGroupSet()) { for (Expr groupingSet : groupElement.getGroupingSets()) { visit(ctx, stack, groupingSet);