Return-Path: X-Original-To: apmail-asterixdb-notifications-archive@minotaur.apache.org Delivered-To: apmail-asterixdb-notifications-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 38D9119E6E for ; Fri, 8 Apr 2016 00:30:59 +0000 (UTC) Received: (qmail 58777 invoked by uid 500); 8 Apr 2016 00:30:59 -0000 Delivered-To: apmail-asterixdb-notifications-archive@asterixdb.apache.org Received: (qmail 58740 invoked by uid 500); 8 Apr 2016 00:30:59 -0000 Mailing-List: contact notifications-help@asterixdb.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@asterixdb.incubator.apache.org Delivered-To: mailing list notifications@asterixdb.incubator.apache.org Received: (qmail 58731 invoked by uid 99); 8 Apr 2016 00:30:59 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 08 Apr 2016 00:30:59 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id A5BEEC637E for ; Fri, 8 Apr 2016 00:30:58 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 2.126 X-Spam-Level: ** X-Spam-Status: No, score=2.126 tagged_above=-999 required=6.31 tests=[MISSING_HEADERS=1.207, SPF_FAIL=0.919] autolearn=disabled Received: from mx2-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id cL13RtA0Ck5y for ; Fri, 8 Apr 2016 00:30:56 +0000 (UTC) Received: from unhygienix.ics.uci.edu (unhygienix.ics.uci.edu [128.195.14.130]) by mx2-lw-eu.apache.org (ASF Mail Server at mx2-lw-eu.apache.org) with ESMTP id 61B1E5F1B3 for ; Fri, 8 Apr 2016 00:30:55 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by unhygienix.ics.uci.edu (Postfix) with ESMTP id AEA7F241D79; Thu, 7 Apr 2016 17:25:45 -0700 (PDT) Date: Thu, 7 Apr 2016 17:25:45 -0700 From: "Yingyi Bu (Code Review)" CC: Jenkins , Till Westmann Reply-To: buyingyi@gmail.com X-Gerrit-MessageType: merged Subject: Change in asterixdb[master]: ASTERIXDB-1382: add examples for SQL++ group-by visitors. X-Gerrit-Change-Id: I4c125e286bd53126685a0d91a1f4526ebccf9335 X-Gerrit-ChangeURL: X-Gerrit-Commit: bce00de839d8446666e41de2958e1494a63efdde In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline User-Agent: Gerrit/2.8.4 Message-Id: <20160408002545.AEA7F241D79@unhygienix.ics.uci.edu> Yingyi Bu has submitted this change and it was merged. Change subject: ASTERIXDB-1382: add examples for SQL++ group-by visitors. ...................................................................... ASTERIXDB-1382: add examples for SQL++ group-by visitors. Change-Id: I4c125e286bd53126685a0d91a1f4526ebccf9335 Reviewed-on: https://asterix-gerrit.ics.uci.edu/790 Tested-by: Jenkins Reviewed-by: Till Westmann --- M asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-02/sugar-02.3.query.sqlpp M asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java M asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByVisitor.java 3 files changed, 63 insertions(+), 3 deletions(-) Approvals: Till Westmann: Looks good to me, approved Jenkins: Verified diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-02/sugar-02.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-02/sugar-02.3.query.sqlpp index e9c3326..e315533 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-02/sugar-02.3.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-02/sugar-02.3.query.sqlpp @@ -23,5 +23,5 @@ JOIN Incentive i ON e.job_category = i.job_category JOIN SuperStars s ON e.id = s.id GROUP BY e.department_id AS deptId -SELECT deptId as deptId, coll_sum(e.salary + i.bonus) AS star_cost; +SELECT deptId as deptId, SUM(e.salary + i.bonus) AS star_cost; diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java index ae47264..be9c697 100644 --- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java +++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java @@ -50,8 +50,35 @@ import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScopingVisitor; /** - * An AST pre-processor to rewrite group-by sugar queries. + * An AST pre-processor to rewrite group-by sugar queries, which does the following transformations: + * 1. Rewrite the argument expression of an aggregation function into a subquery if the argument + * expression is not a subquery; + * 2. Turn a SQL-92 aggregate function into a SQL++ core aggregate function when performing 1. */ + +// For example, this visitor turns the following query +// +// FROM Employee e +// JOIN Incentive i ON e.job_category = i.job_category +// JOIN SuperStars s ON e.id = s.id +// GROUP BY e.department_id AS deptId +// GROUP AS eis(e AS e, i AS i, s AS s) +// SELECT deptId as deptId, SUM(e.salary + i.bonus) AS star_cost; +// +// into the following core-version query: +// +// FROM Employee e +// JOIN Incentive i ON e.job_category = i.job_category +// JOIN SuperStars s ON e.id = s.id +// GROUP BY e.department_id AS deptId +// GROUP AS eis(e AS e, i AS i, s AS s) +// SELECT ELEMENT { +// 'deptId': deptId, +// 'star_cost': coll_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) ) +// }; +// +// where SUM(e.salary + i.bonus) is turned into coll_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) ). + public class SqlppGroupBySugarVisitor extends AbstractSqlppExpressionScopingVisitor { private final Expression groupVar; @@ -77,7 +104,8 @@ newExprList.add(newExpr.accept(this, arg)); } if (rewritten) { - // Rewrites the SQL-92 function name to core functions. + // Rewrites the SQL-92 function name to core functions, + // e.g., SUM --> coll_sum callExpr.setFunctionSignature(FunctionMapUtil.sql92ToCoreAggregateFunction(signature)); } callExpr.setExprList(newExprList); diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByVisitor.java index c9e7a6e..16e967c 100644 --- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByVisitor.java +++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByVisitor.java @@ -45,6 +45,38 @@ * A pre-processor that adds the group variable as well as its group field * list into the AST. It will also invoke SQL group-by aggregation sugar rewritings. */ +// This visitor rewrites non-core SQL++ group-by queries into their SQL++ core version +// queries. For example, for the non-core query in +// asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-01/sugar-01.3.query.sqlpp, +// +// FROM Employee e +// JOIN Incentive i ON e.job_category = i.job_category +// JOIN SuperStars s ON e.id = s.id +// GROUP BY e.department_id AS deptId +// SELECT deptId as deptId, SUM(e.salary + i.bonus) AS star_cost; +// +// this visitor transforms it into the core version in +// asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-01/sugar-01.3.query.sqlpp, +// +// FROM Employee e +// JOIN Incentive i ON e.job_category = i.job_category +// JOIN SuperStars s ON e.id = s.id +// GROUP BY e.department_id AS deptId +// GROUP AS eis(e AS e, i AS i, s AS s) +// SELECT ELEMENT { +// 'deptId': deptId, +// 'star_cost': coll_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) ) +// }; +/** + * The transformation include three things: + * 1. Add a group variable as well as its definition, e.g., GROUP AS eis(e AS e, i AS i, s AS s); + * 2. Rewrite the argument expression of an aggregation function into a subquery if the argument + * expression is not a subquery; + * 3. Turn a SQL-92 aggregate function into a SQL++ core aggregate function when performing 2, e.g., + * SUM(e.salary + i.bonus) becomes + * coll_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) ). + */ + public class SqlppGroupByVisitor extends AbstractSqlppExpressionScopingVisitor { public SqlppGroupByVisitor(LangRewritingContext context) { -- To view, visit https://asterix-gerrit.ics.uci.edu/790 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: I4c125e286bd53126685a0d91a1f4526ebccf9335 Gerrit-PatchSet: 5 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Yingyi Bu Gerrit-Reviewer: Jenkins Gerrit-Reviewer: Till Westmann Gerrit-Reviewer: Yingyi Bu