[ASTERIXDB-2511][COMP] Refactor LET/WHERE clauses into a single list
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Consolidate LET and WHERE clauses into a single list in the SelectBlock
Change-Id: I9265dfc3adb9ef4d5eb963b0aa4d39c2ad0cc068
Reviewed-on: https://asterix-gerrit.ics.uci.edu/3118
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java
index fef765c..b39136f 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java
@@ -32,6 +32,7 @@
import org.apache.asterix.common.exceptions.CompilationException;
import org.apache.asterix.common.exceptions.ErrorCode;
import org.apache.asterix.common.functions.FunctionSignature;
+import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.Clause.ClauseType;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.Expression.Kind;
@@ -252,25 +253,19 @@
if (selectBlock.hasFromClause()) {
currentOpRef = new MutableObject<>(selectBlock.getFromClause().accept(this, currentOpRef).first);
}
- if (selectBlock.hasLetClauses()) {
- for (LetClause letClause : selectBlock.getLetList()) {
- currentOpRef = new MutableObject<>(letClause.accept(this, currentOpRef).first);
+ if (selectBlock.hasLetWhereClauses()) {
+ for (AbstractClause letWhereClause : selectBlock.getLetWhereList()) {
+ currentOpRef = new MutableObject<>(letWhereClause.accept(this, currentOpRef).first);
}
}
- if (selectBlock.hasWhereClause()) {
- currentOpRef = new MutableObject<>(selectBlock.getWhereClause().accept(this, currentOpRef).first);
- }
if (selectBlock.hasGroupbyClause()) {
currentOpRef = new MutableObject<>(selectBlock.getGroupbyClause().accept(this, currentOpRef).first);
}
- if (selectBlock.hasLetClausesAfterGroupby()) {
- for (LetClause letClause : selectBlock.getLetListAfterGroupby()) {
- currentOpRef = new MutableObject<>(letClause.accept(this, currentOpRef).first);
+ if (selectBlock.hasLetHavingClausesAfterGroupby()) {
+ for (AbstractClause letHavingClause : selectBlock.getLetHavingListAfterGroupby()) {
+ currentOpRef = new MutableObject<>(letHavingClause.accept(this, currentOpRef).first);
}
}
- if (selectBlock.hasHavingClause()) {
- currentOpRef = new MutableObject<>(selectBlock.getHavingClause().accept(this, currentOpRef).first);
- }
return processSelectClause(selectBlock, currentOpRef);
}
@@ -771,16 +766,16 @@
} else if (projection.star()) {
if (selectBlock.hasGroupbyClause()) {
getGroupBindings(selectBlock.getGroupbyClause(), fieldBindings, fieldNames);
- if (selectBlock.hasLetClausesAfterGroupby()) {
- getLetBindings(selectBlock.getLetListAfterGroupby(), fieldBindings, fieldNames);
+ if (selectBlock.hasLetHavingClausesAfterGroupby()) {
+ getLetBindings(selectBlock.getLetHavingListAfterGroupby(), fieldBindings, fieldNames);
}
} else if (selectBlock.hasFromClause()) {
getFromBindings(selectBlock.getFromClause(), fieldBindings, fieldNames);
- if (selectBlock.hasLetClauses()) {
- getLetBindings(selectBlock.getLetList(), fieldBindings, fieldNames);
+ if (selectBlock.hasLetWhereClauses()) {
+ getLetBindings(selectBlock.getLetWhereList(), fieldBindings, fieldNames);
}
- } else if (selectBlock.hasLetClauses()) {
- getLetBindings(selectBlock.getLetList(), fieldBindings, fieldNames);
+ } else if (selectBlock.hasLetWhereClauses()) {
+ getLetBindings(selectBlock.getLetWhereList(), fieldBindings, fieldNames);
}
} else if (projection.hasName()) {
fieldBindings.add(getFieldBinding(projection, fieldNames));
@@ -841,10 +836,13 @@
}
// Generates all field bindings according to the let clause.
- private void getLetBindings(List<LetClause> letClauses, List<FieldBinding> outFieldBindings,
+ private void getLetBindings(List<AbstractClause> clauses, List<FieldBinding> outFieldBindings,
Set<String> outFieldNames) throws CompilationException {
- for (LetClause letClause : letClauses) {
- outFieldBindings.add(getFieldBinding(letClause.getVarExpr(), outFieldNames));
+ for (AbstractClause clause : clauses) {
+ if (clause.getClauseType() == ClauseType.LET_CLAUSE) {
+ LetClause letClause = (LetClause) clause;
+ outFieldBindings.add(getFieldBinding(letClause.getVarExpr(), outFieldNames));
+ }
}
}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java
index d22e929..194358a 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java
@@ -225,7 +225,8 @@
// Constructing select clause
SelectElement selectElement = new SelectElement(previousVarExpr);
SelectClause selectClause = new SelectClause(selectElement, null, false);
- SelectBlock selectBlock = new SelectBlock(selectClause, fromClause, null, whereClause, null, null, null);
+ SelectBlock selectBlock = new SelectBlock(selectClause, fromClause,
+ whereClause != null ? Collections.singletonList(whereClause) : null, null, null);
SelectSetOperation selectSetOperation = new SelectSetOperation(new SetOperationInput(selectBlock, null), null);
SelectExpression body = new SelectExpression(null, selectSetOperation, null, null, true);
Query query = new Query(false, true, body, 0);
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in.plan
index c51b5e0..c9e4bcc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in.plan
@@ -17,7 +17,7 @@
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$42][$$32] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$42][$$31] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
@@ -25,7 +25,7 @@
-- DATASOURCE_SCAN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$32] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$31] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_ps.plan
index a60462d..97d8e3b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_ps.plan
@@ -21,7 +21,7 @@
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$42][$$32] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$42][$$31] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
@@ -29,7 +29,7 @@
-- DATASOURCE_SCAN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$32] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$31] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
@@ -56,7 +56,7 @@
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$42][$$32] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$42][$$31] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
@@ -64,7 +64,7 @@
-- DATASOURCE_SCAN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$32] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$31] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1580.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1580.plan
index 6a74727..ef29016 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1580.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1580.plan
@@ -3,10 +3,10 @@
-- STREAM_LIMIT |UNPARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
- -- SORT_MERGE_EXCHANGE [$$119(ASC) ] |PARTITIONED|
+ -- SORT_MERGE_EXCHANGE [$$120(ASC) ] |PARTITIONED|
-- STREAM_LIMIT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [topK: 100] [$$119(ASC)] |PARTITIONED|
+ -- STABLE_SORT [topK: 100] [$$120(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at06/at06.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at06/at06.3.ast
index a11de35..9a16c6c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at06/at06.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at06/at06.3.ast
@@ -96,6 +96,12 @@
AT
Variable [ Name=$p ]
]
+Where
+ OperatorExpr [
+ Variable [ Name=$p ]
+ <
+ LiteralExpr [LONG] [4]
+ ]
Let Variable [ Name=#1 ]
:=
FieldAccessor [
@@ -114,12 +120,6 @@
Variable [ Name=$j ]
Field=l_orderkey
]
-Where
- OperatorExpr [
- Variable [ Name=$p ]
- <
- LiteralExpr [LONG] [4]
- ]
Orderby
Variable [ Name=#1 ]
ASC
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.24.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.24.ast
index 92376cd..0da93150 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.24.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.24.ast
@@ -18,27 +18,6 @@
]
AS Variable [ Name=$user ]
]
-Let Variable [ Name=#1 ]
- :=
- FieldAccessor [
- Variable [ Name=$user ]
- Field=name
- ]
-Let Variable [ Name=#2 ]
- :=
- FieldAccessor [
- Variable [ Name=$user ]
- Field=alias
- ]
-Let Variable [ Name=#3 ]
- :=
- FunctionCall TinySocial.substring@2[
- FieldAccessor [
- Variable [ Name=$message ]
- Field=message
- ]
- LiteralExpr [LONG] [29]
- ]
Where
OperatorExpr [
OperatorExpr [
@@ -71,6 +50,27 @@
LiteralExpr [LONG] [11]
]
]
+Let Variable [ Name=#1 ]
+ :=
+ FieldAccessor [
+ Variable [ Name=$user ]
+ Field=name
+ ]
+Let Variable [ Name=#2 ]
+ :=
+ FieldAccessor [
+ Variable [ Name=$user ]
+ Field=alias
+ ]
+Let Variable [ Name=#3 ]
+ :=
+ FunctionCall TinySocial.substring@2[
+ FieldAccessor [
+ Variable [ Name=$message ]
+ Field=message
+ ]
+ LiteralExpr [LONG] [29]
+ ]
Orderby
Variable [ Name=#1 ]
ASC
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.ast
index 92376cd..0da93150 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.ast
@@ -18,27 +18,6 @@
]
AS Variable [ Name=$user ]
]
-Let Variable [ Name=#1 ]
- :=
- FieldAccessor [
- Variable [ Name=$user ]
- Field=name
- ]
-Let Variable [ Name=#2 ]
- :=
- FieldAccessor [
- Variable [ Name=$user ]
- Field=alias
- ]
-Let Variable [ Name=#3 ]
- :=
- FunctionCall TinySocial.substring@2[
- FieldAccessor [
- Variable [ Name=$message ]
- Field=message
- ]
- LiteralExpr [LONG] [29]
- ]
Where
OperatorExpr [
OperatorExpr [
@@ -71,6 +50,27 @@
LiteralExpr [LONG] [11]
]
]
+Let Variable [ Name=#1 ]
+ :=
+ FieldAccessor [
+ Variable [ Name=$user ]
+ Field=name
+ ]
+Let Variable [ Name=#2 ]
+ :=
+ FieldAccessor [
+ Variable [ Name=$user ]
+ Field=alias
+ ]
+Let Variable [ Name=#3 ]
+ :=
+ FunctionCall TinySocial.substring@2[
+ FieldAccessor [
+ Variable [ Name=$message ]
+ Field=message
+ ]
+ LiteralExpr [LONG] [29]
+ ]
Orderby
Variable [ Name=#1 ]
ASC
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectBlock.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectBlock.java
index 83b03ba..c934e32 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectBlock.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectBlock.java
@@ -26,8 +26,6 @@
import org.apache.asterix.common.exceptions.CompilationException;
import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.clause.GroupbyClause;
-import org.apache.asterix.lang.common.clause.LetClause;
-import org.apache.asterix.lang.common.clause.WhereClause;
import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
import org.apache.asterix.lang.sqlpp.visitor.base.ISqlppVisitor;
@@ -35,25 +33,20 @@
private SelectClause selectClause;
private FromClause fromClause;
- private List<LetClause> letClauses = new ArrayList<>();
- private WhereClause whereClause;
+ private final List<AbstractClause> letWhereClauses = new ArrayList<>();
private GroupbyClause groupbyClause;
- private List<LetClause> letClausesAfterGby = new ArrayList<>();
- private HavingClause havingClause;
+ private final List<AbstractClause> letHavingClausesAfterGby = new ArrayList<>();
- public SelectBlock(SelectClause selectClause, FromClause fromClause, List<LetClause> letClauses,
- WhereClause whereClause, GroupbyClause groupbyClause, List<LetClause> letClausesAfterGby,
- HavingClause havingClause) {
+ public SelectBlock(SelectClause selectClause, FromClause fromClause, List<AbstractClause> letWhereClauses,
+ GroupbyClause groupbyClause, List<AbstractClause> letHavingClausesAfterGby) {
this.selectClause = selectClause;
this.fromClause = fromClause;
- if (letClauses != null) {
- this.letClauses.addAll(letClauses);
+ if (letWhereClauses != null) {
+ this.letWhereClauses.addAll(letWhereClauses);
}
- this.whereClause = whereClause;
this.groupbyClause = groupbyClause;
- this.havingClause = havingClause;
- if (letClausesAfterGby != null) {
- this.letClausesAfterGby.addAll(letClausesAfterGby);
+ if (letHavingClausesAfterGby != null) {
+ this.letHavingClausesAfterGby.addAll(letHavingClausesAfterGby);
}
}
@@ -75,48 +68,32 @@
return fromClause;
}
- public List<LetClause> getLetList() {
- return letClauses;
- }
-
- public WhereClause getWhereClause() {
- return whereClause;
+ public List<AbstractClause> getLetWhereList() {
+ return letWhereClauses;
}
public GroupbyClause getGroupbyClause() {
return groupbyClause;
}
- public HavingClause getHavingClause() {
- return havingClause;
+ public List<AbstractClause> getLetHavingListAfterGroupby() {
+ return letHavingClausesAfterGby;
}
public boolean hasFromClause() {
return fromClause != null;
}
- public boolean hasLetClauses() {
- return !letClauses.isEmpty();
- }
-
- public boolean hasWhereClause() {
- return whereClause != null;
+ public boolean hasLetWhereClauses() {
+ return !letWhereClauses.isEmpty();
}
public boolean hasGroupbyClause() {
return groupbyClause != null;
}
- public boolean hasLetClausesAfterGroupby() {
- return !letClausesAfterGby.isEmpty();
- }
-
- public List<LetClause> getLetListAfterGroupby() {
- return letClausesAfterGby;
- }
-
- public boolean hasHavingClause() {
- return havingClause != null;
+ public boolean hasLetHavingClausesAfterGroupby() {
+ return !letHavingClausesAfterGby.isEmpty();
}
public void setGroupbyClause(GroupbyClause groupbyClause) {
@@ -125,8 +102,7 @@
@Override
public int hashCode() {
- return Objects.hash(fromClause, groupbyClause, havingClause, letClauses, letClausesAfterGby, selectClause,
- whereClause);
+ return Objects.hash(fromClause, groupbyClause, letWhereClauses, letHavingClausesAfterGby, selectClause);
}
@Override
@@ -140,9 +116,9 @@
}
SelectBlock target = (SelectBlock) object;
return Objects.equals(fromClause, target.fromClause) && Objects.equals(groupbyClause, target.groupbyClause)
- && Objects.equals(havingClause, target.havingClause) && Objects.equals(letClauses, target.letClauses)
- && Objects.equals(letClausesAfterGby, target.letClausesAfterGby)
- && Objects.equals(selectClause, target.selectClause) && Objects.equals(whereClause, target.whereClause);
+ && Objects.equals(letWhereClauses, target.letWhereClauses)
+ && Objects.equals(letHavingClausesAfterGby, target.letHavingClausesAfterGby)
+ && Objects.equals(selectClause, target.selectClause);
}
@Override
@@ -150,22 +126,16 @@
StringBuilder sb = new StringBuilder();
sb.append(selectClause);
if (hasFromClause()) {
- sb.append(" " + fromClause);
+ sb.append(' ').append(fromClause);
}
- if (hasLetClauses()) {
- sb.append(" " + letClauses);
- }
- if (hasWhereClause()) {
- sb.append(" " + whereClause);
+ if (hasLetWhereClauses()) {
+ sb.append(' ').append(letWhereClauses);
}
if (hasGroupbyClause()) {
- sb.append(" " + groupbyClause);
+ sb.append(' ').append(groupbyClause);
}
- if (hasLetClausesAfterGroupby()) {
- sb.append(" " + letClausesAfterGby);
- }
- if (hasHavingClause()) {
- sb.append(" " + havingClause);
+ if (hasLetHavingClausesAfterGroupby()) {
+ sb.append(' ').append(letHavingClausesAfterGby);
}
return sb.toString();
}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
index 942fc88..35de051 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
@@ -24,6 +24,7 @@
import java.util.Set;
import java.util.HashSet;
+import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -364,25 +365,19 @@
if (selectBlock.hasFromClause()) {
selectBlock.getFromClause().accept(this, arg);
}
- if (selectBlock.hasLetClauses()) {
- for (LetClause letClause : selectBlock.getLetList()) {
- letClause.accept(this, arg);
+ if (selectBlock.hasLetWhereClauses()) {
+ for (AbstractClause letWhereClause : selectBlock.getLetWhereList()) {
+ letWhereClause.accept(this, arg);
}
}
- if (selectBlock.hasWhereClause()) {
- selectBlock.getWhereClause().accept(this, arg);
- }
if (selectBlock.hasGroupbyClause()) {
selectBlock.getGroupbyClause().accept(this, arg);
}
- if (selectBlock.hasLetClausesAfterGroupby()) {
- for (LetClause letClause : selectBlock.getLetListAfterGroupby()) {
- letClause.accept(this, arg);
+ if (selectBlock.hasLetHavingClausesAfterGroupby()) {
+ for (AbstractClause letHavingClause : selectBlock.getLetHavingListAfterGroupby()) {
+ letHavingClause.accept(this, arg);
}
}
- if (selectBlock.hasHavingClause()) {
- selectBlock.getHavingClause().accept(this, arg);
- }
selectBlock.getSelectClause().accept(this, arg);
return null;
}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/AbstractSqlppExpressionExtractionVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/AbstractSqlppExpressionExtractionVisitor.java
index b78cd9c..3606b12 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/AbstractSqlppExpressionExtractionVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/AbstractSqlppExpressionExtractionVisitor.java
@@ -26,6 +26,7 @@
import org.apache.asterix.common.exceptions.CompilationException;
import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.ILangExpression;
import org.apache.asterix.lang.common.clause.LetClause;
@@ -64,54 +65,47 @@
handleUnsupportedClause(clause, extractionList);
}
}
- List<LetClause> letList = selectBlock.getLetList();
- if (selectBlock.hasLetClauses()) {
- visitLetClauses(letList, extractionList, arg);
- }
- if (selectBlock.hasWhereClause()) {
- selectBlock.getWhereClause().accept(this, arg);
- introduceLetClauses(extractionList, letList);
+ List<AbstractClause> letWhereList = selectBlock.getLetWhereList();
+ if (!letWhereList.isEmpty()) {
+ visitLetWhereClauses(letWhereList, extractionList, arg);
}
if (selectBlock.hasGroupbyClause()) {
selectBlock.getGroupbyClause().accept(this, arg);
- introduceLetClauses(extractionList, letList);
+ introduceLetClauses(extractionList, letWhereList);
}
- List<LetClause> letListAfterGby = selectBlock.getLetListAfterGroupby();
- if (selectBlock.hasLetClausesAfterGroupby()) {
- visitLetClauses(letListAfterGby, extractionList, arg);
- }
- if (selectBlock.hasHavingClause()) {
- selectBlock.getHavingClause().accept(this, arg);
- introduceLetClauses(extractionList, letListAfterGby);
+ List<AbstractClause> letHavingListAfterGby = selectBlock.getLetHavingListAfterGroupby();
+ if (!letHavingListAfterGby.isEmpty()) {
+ visitLetWhereClauses(letHavingListAfterGby, extractionList, arg);
}
selectBlock.getSelectClause().accept(this, arg);
- introduceLetClauses(extractionList, selectBlock.hasGroupbyClause() ? letListAfterGby : letList);
+ introduceLetClauses(extractionList, selectBlock.hasGroupbyClause() ? letHavingListAfterGby : letWhereList);
stack.pop();
return null;
}
- private void visitLetClauses(List<LetClause> letList, List<Pair<Expression, VarIdentifier>> extractionList,
- ILangExpression arg) throws CompilationException {
- List<LetClause> newLetList = new ArrayList<>(letList.size());
- for (LetClause letClause : letList) {
- letClause.accept(this, arg);
- introduceLetClauses(extractionList, newLetList);
- newLetList.add(letClause);
+ private void visitLetWhereClauses(List<AbstractClause> clauseList,
+ List<Pair<Expression, VarIdentifier>> extractionList, ILangExpression arg) throws CompilationException {
+ List<AbstractClause> newClauseList = new ArrayList<>(clauseList.size());
+ for (AbstractClause letWhereClause : clauseList) {
+ letWhereClause.accept(this, arg);
+ introduceLetClauses(extractionList, newClauseList);
+ newClauseList.add(letWhereClause);
}
- if (newLetList.size() > letList.size()) {
- letList.clear();
- letList.addAll(newLetList);
+ if (newClauseList.size() > clauseList.size()) {
+ clauseList.clear();
+ clauseList.addAll(newClauseList);
}
}
- private void introduceLetClauses(List<Pair<Expression, VarIdentifier>> fromBindingList, List<LetClause> toLetList) {
+ private void introduceLetClauses(List<Pair<Expression, VarIdentifier>> fromBindingList,
+ List<AbstractClause> toLetWhereList) {
for (Pair<Expression, VarIdentifier> p : fromBindingList) {
Expression bindExpr = p.first;
VarIdentifier var = p.second;
VariableExpr varExpr = new VariableExpr(var);
varExpr.setSourceLocation(bindExpr.getSourceLocation());
- toLetList.add(new LetClause(varExpr, bindExpr));
+ toLetWhereList.add(new LetClause(varExpr, bindExpr));
context.addExcludedForFieldAccessVar(var);
}
fromBindingList.clear();
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineColumnAliasVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineColumnAliasVisitor.java
index a270530..f68688f 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineColumnAliasVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineColumnAliasVisitor.java
@@ -18,17 +18,15 @@
*/
package org.apache.asterix.lang.sqlpp.rewrites.visitor;
-import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import org.apache.asterix.common.exceptions.CompilationException;
import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.Expression.Kind;
import org.apache.asterix.lang.common.base.ILangExpression;
@@ -77,15 +75,16 @@
// Removes all FROM/LET binding variables
if (selectBlock.hasGroupbyClause()) {
map.keySet().removeAll(SqlppVariableUtil.getBindingVariables(selectBlock.getGroupbyClause()));
- if (selectBlock.hasLetClausesAfterGroupby()) {
- map.keySet().removeAll(SqlppVariableUtil.getBindingVariables(selectBlock.getLetListAfterGroupby()));
+ if (selectBlock.hasLetHavingClausesAfterGroupby()) {
+ map.keySet().removeAll(
+ SqlppVariableUtil.getLetBindingVariables(selectBlock.getLetHavingListAfterGroupby()));
}
} else {
if (selectBlock.hasFromClause()) {
map.keySet().removeAll(SqlppVariableUtil.getBindingVariables(selectBlock.getFromClause()));
}
- if (selectBlock.hasLetClauses()) {
- map.keySet().removeAll(SqlppVariableUtil.getBindingVariables(selectBlock.getLetList()));
+ if (selectBlock.hasLetWhereClauses()) {
+ map.keySet().removeAll(SqlppVariableUtil.getLetBindingVariables(selectBlock.getLetWhereList()));
}
}
@@ -163,8 +162,8 @@
private void introduceLetClauses(Map<Expression, VarIdentifier> letVarMap,
Map<Expression, ColumnAliasBinding> aliasBindingMap, SelectBlock selectBlock) throws CompilationException {
- List<LetClause> targetLetClauses =
- selectBlock.hasGroupbyClause() ? selectBlock.getLetListAfterGroupby() : selectBlock.getLetList();
+ List<AbstractClause> targetLetClauses = selectBlock.hasGroupbyClause()
+ ? selectBlock.getLetHavingListAfterGroupby() : selectBlock.getLetWhereList();
for (Map.Entry<Expression, VarIdentifier> me : letVarMap.entrySet()) {
Expression columnAliasVarExpr = me.getKey();
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SetOperationVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SetOperationVisitor.java
index f0a0f87..dd02dbe 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SetOperationVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SetOperationVisitor.java
@@ -95,7 +95,7 @@
newFromClause.setSourceLocation(sourceLoc);
SelectClause selectClause = new SelectClause(new SelectElement(newBindingVar), null, false);
selectClause.setSourceLocation(sourceLoc);
- SelectBlock selectBlock = new SelectBlock(selectClause, newFromClause, null, null, null, null, null);
+ SelectBlock selectBlock = new SelectBlock(selectClause, newFromClause, null, null, null);
selectBlock.setSourceLocation(sourceLoc);
SelectSetOperation newSelectSetOperation =
new SelectSetOperation(new SetOperationInput(selectBlock, null), null);
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/Sql92AggregateFunctionVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/Sql92AggregateFunctionVisitor.java
index 2be752d..6e14e74 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/Sql92AggregateFunctionVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/Sql92AggregateFunctionVisitor.java
@@ -144,7 +144,7 @@
selectClause.setSourceLocation(sourceLoc);
// Construct the select expression.
- SelectBlock selectBlock = new SelectBlock(selectClause, fromClause, null, null, null, null, null);
+ SelectBlock selectBlock = new SelectBlock(selectClause, fromClause, null, null, null);
selectBlock.setSourceLocation(sourceLoc);
SelectSetOperation selectSetOperation = new SelectSetOperation(new SetOperationInput(selectBlock, null), null);
selectSetOperation.setSourceLocation(sourceLoc);
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppDistinctAggregationSugarVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppDistinctAggregationSugarVisitor.java
index efcd7e0..180f80c 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppDistinctAggregationSugarVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppDistinctAggregationSugarVisitor.java
@@ -119,7 +119,7 @@
selectClause.setSourceLocation(sourceLoc);
// Construct the select expression.
- SelectBlock selectBlock = new SelectBlock(selectClause, fromClause, null, null, null, null, null);
+ SelectBlock selectBlock = new SelectBlock(selectClause, fromClause, null, null, null);
selectBlock.setSourceLocation(sourceLoc);
SelectSetOperation selectSetOperation = new SelectSetOperation(new SetOperationInput(selectBlock, null), null);
selectSetOperation.setSourceLocation(sourceLoc);
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByAggregationSugarVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByAggregationSugarVisitor.java
index 1c55f99..ad1268f 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByAggregationSugarVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByAggregationSugarVisitor.java
@@ -19,6 +19,7 @@
package org.apache.asterix.lang.sqlpp.rewrites.visitor;
import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.ILangExpression;
import org.apache.asterix.lang.common.clause.GroupbyClause;
@@ -84,21 +85,16 @@
@Override
public Expression visit(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
- // Traverses the select block in the order of "from", "let"s, "where",
- // "group by", "let"s, "having" and "select".
+ // Traverses the select block in the order of "from", "let/where"s, "group by", "let/having"s and "select".
FromClause fromClause = selectBlock.getFromClause();
if (selectBlock.hasFromClause()) {
fromClause.accept(this, arg);
}
- if (selectBlock.hasLetClauses()) {
- List<LetClause> letList = selectBlock.getLetList();
- for (LetClause letClause : letList) {
- letClause.accept(this, arg);
+ if (selectBlock.hasLetWhereClauses()) {
+ for (AbstractClause letWhereClause : selectBlock.getLetWhereList()) {
+ letWhereClause.accept(this, arg);
}
}
- if (selectBlock.hasWhereClause()) {
- selectBlock.getWhereClause().accept(this, arg);
- }
if (selectBlock.hasGroupbyClause()) {
Set<VariableExpr> visibleVarsPreGroupByScope = scopeChecker.getCurrentScope().getLiveVariables();
@@ -109,29 +105,30 @@
VariableExpr groupVar = groupbyClause.getGroupVar();
Map<Expression, Identifier> groupFieldVars = getGroupFieldVariables(groupbyClause);
- Collection<VariableExpr> freeVariablesInGbyLets = new HashSet<>();
- if (selectBlock.hasLetClausesAfterGroupby()) {
- List<LetClause> letListAfterGby = selectBlock.getLetListAfterGroupby();
- for (LetClause letClauseAfterGby : letListAfterGby) {
- letClauseAfterGby.accept(this, arg);
- // Rewrites each let clause after the group-by.
- rewriteExpressionUsingGroupVariable(groupVar, groupFieldVars, letClauseAfterGby,
- visibleVarsPreGroupByScope);
- Collection<VariableExpr> freeVariablesInLet =
- SqlppVariableUtil.getFreeVariables(letClauseAfterGby.getBindingExpr());
- freeVariablesInLet.removeAll(visibleVarsInCurrentScope);
- freeVariablesInGbyLets.addAll(freeVariablesInLet);
- visibleVarsInCurrentScope.add(letClauseAfterGby.getVarExpr());
- }
- }
-
Collection<VariableExpr> freeVariables = new HashSet<>();
- if (selectBlock.hasHavingClause()) {
- // Rewrites the having clause.
- HavingClause havingClause = selectBlock.getHavingClause();
- havingClause.accept(this, arg);
- rewriteExpressionUsingGroupVariable(groupVar, groupFieldVars, havingClause, visibleVarsPreGroupByScope);
- freeVariables.addAll(SqlppVariableUtil.getFreeVariables(havingClause));
+ Collection<VariableExpr> freeVariablesInGbyLets = new HashSet<>();
+ if (selectBlock.hasLetHavingClausesAfterGroupby()) {
+ for (AbstractClause letHavingClause : selectBlock.getLetHavingListAfterGroupby()) {
+ letHavingClause.accept(this, arg);
+ // Rewrites each let/having clause after the group-by.
+ rewriteExpressionUsingGroupVariable(groupVar, groupFieldVars, letHavingClause,
+ visibleVarsPreGroupByScope);
+ switch (letHavingClause.getClauseType()) {
+ case LET_CLAUSE:
+ LetClause letClause = (LetClause) letHavingClause;
+ Collection<VariableExpr> freeVariablesInClause =
+ SqlppVariableUtil.getFreeVariables(letClause.getBindingExpr());
+ freeVariablesInClause.removeAll(visibleVarsInCurrentScope);
+ freeVariablesInGbyLets.addAll(freeVariablesInClause);
+ visibleVarsInCurrentScope.add(letClause.getVarExpr());
+ break;
+ case HAVING_CLAUSE:
+ freeVariables.addAll(SqlppVariableUtil.getFreeVariables(letHavingClause));
+ break;
+ default:
+ throw new IllegalStateException(String.valueOf(letHavingClause.getClauseType()));
+ }
+ }
}
SelectExpression parentSelectExpression = (SelectExpression) arg;
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 84aee71..4fe2699 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
@@ -123,7 +123,7 @@
private List<Pair<Expression, Identifier>> createGroupFieldList(SelectBlock selectBlock) {
List<Pair<Expression, Identifier>> groupFieldList = new ArrayList<>();
addToFieldList(groupFieldList, SqlppVariableUtil.getBindingVariables(selectBlock.getFromClause()));
- addToFieldList(groupFieldList, SqlppVariableUtil.getBindingVariables(selectBlock.getLetList()));
+ addToFieldList(groupFieldList, SqlppVariableUtil.getLetBindingVariables(selectBlock.getLetWhereList()));
return groupFieldList;
}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppInlineUdfsVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppInlineUdfsVisitor.java
index 1fd4ff7..2ff6b63 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppInlineUdfsVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppInlineUdfsVisitor.java
@@ -23,6 +23,7 @@
import java.util.Map;
import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.IRewriterFactory;
import org.apache.asterix.lang.common.clause.LetClause;
@@ -135,25 +136,19 @@
if (selectBlock.hasFromClause()) {
changed |= selectBlock.getFromClause().accept(this, funcs);
}
- if (selectBlock.hasLetClauses()) {
- for (LetClause letClause : selectBlock.getLetList()) {
- changed |= letClause.accept(this, funcs);
+ if (selectBlock.hasLetWhereClauses()) {
+ for (AbstractClause letWhereClause : selectBlock.getLetWhereList()) {
+ changed |= letWhereClause.accept(this, funcs);
}
}
- if (selectBlock.hasWhereClause()) {
- changed |= selectBlock.getWhereClause().accept(this, funcs);
- }
if (selectBlock.hasGroupbyClause()) {
changed |= selectBlock.getGroupbyClause().accept(this, funcs);
}
- if (selectBlock.hasLetClausesAfterGroupby()) {
- for (LetClause letClause : selectBlock.getLetListAfterGroupby()) {
- changed |= letClause.accept(this, funcs);
+ if (selectBlock.hasLetHavingClausesAfterGroupby()) {
+ for (AbstractClause letHavingClause : selectBlock.getLetHavingListAfterGroupby()) {
+ changed |= letHavingClause.accept(this, funcs);
}
}
- if (selectBlock.hasHavingClause()) {
- changed |= selectBlock.getHavingClause().accept(this, funcs);
- }
changed |= selectBlock.getSelectClause().accept(this, funcs);
return changed;
}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppWindowAggregationSugarVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppWindowAggregationSugarVisitor.java
index 0b2d2cf..910552a 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppWindowAggregationSugarVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppWindowAggregationSugarVisitor.java
@@ -125,9 +125,10 @@
List<Pair<Expression, Identifier>> fieldList = new ArrayList<>();
if (selectBlock != null) {
addToFieldList(fieldList, SqlppVariableUtil.getBindingVariables(selectBlock.getFromClause()));
- addToFieldList(fieldList, SqlppVariableUtil.getBindingVariables(selectBlock.getLetList()));
+ addToFieldList(fieldList, SqlppVariableUtil.getLetBindingVariables(selectBlock.getLetWhereList()));
addToFieldList(fieldList, SqlppVariableUtil.getBindingVariables(selectBlock.getGroupbyClause()));
- addToFieldList(fieldList, SqlppVariableUtil.getBindingVariables(selectBlock.getLetListAfterGroupby()));
+ addToFieldList(fieldList,
+ SqlppVariableUtil.getLetBindingVariables(selectBlock.getLetHavingListAfterGroupby()));
}
return fieldList;
}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SubstituteGroupbyExpressionWithVariableVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SubstituteGroupbyExpressionWithVariableVisitor.java
index 9e937d0..13f1128 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SubstituteGroupbyExpressionWithVariableVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SubstituteGroupbyExpressionWithVariableVisitor.java
@@ -24,10 +24,10 @@
import org.apache.asterix.common.exceptions.CompilationException;
import org.apache.asterix.common.functions.FunctionSignature;
+import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.Expression.Kind;
import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.expression.CallExpr;
import org.apache.asterix.lang.common.expression.GbyVariableExpressionPair;
import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
@@ -65,14 +65,11 @@
SubstituteGroupbyExpressionVisitor visitor = new SubstituteGroupbyExpressionVisitor(context, map);
// Rewrites LET/HAVING/SELECT clauses.
- if (selectBlock.hasLetClausesAfterGroupby()) {
- for (LetClause letClause : selectBlock.getLetListAfterGroupby()) {
- letClause.accept(visitor, arg);
+ if (selectBlock.hasLetHavingClausesAfterGroupby()) {
+ for (AbstractClause letHavingClause : selectBlock.getLetHavingListAfterGroupby()) {
+ letHavingClause.accept(visitor, arg);
}
}
- if (selectBlock.hasHavingClause()) {
- selectBlock.getHavingClause().accept(visitor, arg);
- }
selectBlock.getSelectClause().accept(visitor, arg);
SelectExpression selectExpression = (SelectExpression) arg;
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppVariableUtil.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppVariableUtil.java
index f71ae5b..a186cba 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppVariableUtil.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppVariableUtil.java
@@ -27,6 +27,8 @@
import java.util.Set;
import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.lang.common.base.Clause;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.ILangExpression;
import org.apache.asterix.lang.common.clause.GroupbyClause;
@@ -176,13 +178,16 @@
return bindingVars;
}
- public static List<VariableExpr> getBindingVariables(List<LetClause> letClauses) {
+ public static List<VariableExpr> getLetBindingVariables(List<? extends AbstractClause> clauses) {
List<VariableExpr> bindingVars = new ArrayList<>();
- if (letClauses == null || letClauses.isEmpty()) {
+ if (clauses == null || clauses.isEmpty()) {
return bindingVars;
}
- for (LetClause letClause : letClauses) {
- bindingVars.add(letClause.getVarExpr());
+ for (AbstractClause clause : clauses) {
+ if (clause.getClauseType() == Clause.ClauseType.LET_CLAUSE) {
+ LetClause letClause = (LetClause) clause;
+ bindingVars.add(letClause.getVarExpr());
+ }
}
return bindingVars;
}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSubqueryVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSubqueryVisitor.java
index c816d05..b9954a5 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSubqueryVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSubqueryVisitor.java
@@ -116,10 +116,9 @@
@Override
public Boolean visit(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
- boolean hasSubquery = visit(selectBlock.getFromClause(), arg) || visit(selectBlock.getGroupbyClause(), arg)
- || visit(selectBlock.getHavingClause(), arg) || visit(selectBlock.getWhereClause(), arg);
- return hasSubquery || visit(selectBlock.getSelectClause(), arg) || visitExprList(selectBlock.getLetList(), arg)
- || visitExprList(selectBlock.getLetListAfterGroupby(), arg);
+ return visit(selectBlock.getFromClause(), arg) || visit(selectBlock.getGroupbyClause(), arg)
+ || visit(selectBlock.getSelectClause(), arg) || visitExprList(selectBlock.getLetWhereList(), arg)
+ || visitExprList(selectBlock.getLetHavingListAfterGroupby(), arg);
}
@Override
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/DeepCopyVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/DeepCopyVisitor.java
index ed92bfd..96409d4 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/DeepCopyVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/DeepCopyVisitor.java
@@ -25,6 +25,7 @@
import java.util.Map.Entry;
import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.ILangExpression;
import org.apache.asterix.lang.common.clause.GroupbyClause;
@@ -152,41 +153,31 @@
@Override
public SelectBlock visit(SelectBlock selectBlock, Void arg) throws CompilationException {
FromClause fromClause = null;
- List<LetClause> letClauses = new ArrayList<>();
- WhereClause whereClause = null;
+ List<AbstractClause> letWhereClauses = new ArrayList<>();
GroupbyClause gbyClause = null;
- List<LetClause> gbyLetClauses = new ArrayList<>();
- HavingClause havingClause = null;
- SelectClause selectCluase;
- // Traverses the select block in the order of "from", "let"s, "where",
- // "group by", "let"s, "having" and "select".
+ List<AbstractClause> gbyLetHavingClauses = new ArrayList<>();
+ SelectClause selectClause;
+ // Traverses the select block in the order of "from", "let/where"s, "group by", "let/having"s, and "select".
if (selectBlock.hasFromClause()) {
fromClause = (FromClause) selectBlock.getFromClause().accept(this, arg);
}
- if (selectBlock.hasLetClauses()) {
- List<LetClause> letList = selectBlock.getLetList();
- for (LetClause letClause : letList) {
- letClauses.add((LetClause) letClause.accept(this, arg));
+ if (selectBlock.hasLetWhereClauses()) {
+ List<AbstractClause> letWhereList = selectBlock.getLetWhereList();
+ for (AbstractClause letWhereClause : letWhereList) {
+ letWhereClauses.add((AbstractClause) letWhereClause.accept(this, arg));
}
}
- if (selectBlock.hasWhereClause()) {
- whereClause = (WhereClause) selectBlock.getWhereClause().accept(this, arg);
- }
if (selectBlock.hasGroupbyClause()) {
gbyClause = (GroupbyClause) selectBlock.getGroupbyClause().accept(this, arg);
}
- if (selectBlock.hasLetClausesAfterGroupby()) {
- List<LetClause> letListAfterGby = selectBlock.getLetListAfterGroupby();
- for (LetClause letClauseAfterGby : letListAfterGby) {
- gbyLetClauses.add((LetClause) letClauseAfterGby.accept(this, arg));
+ if (selectBlock.hasLetHavingClausesAfterGroupby()) {
+ List<AbstractClause> letHavingListAfterGby = selectBlock.getLetHavingListAfterGroupby();
+ for (AbstractClause letHavingClauseAfterGby : letHavingListAfterGby) {
+ gbyLetHavingClauses.add((AbstractClause) letHavingClauseAfterGby.accept(this, arg));
}
}
- if (selectBlock.hasHavingClause()) {
- havingClause = (HavingClause) selectBlock.getHavingClause().accept(this, arg);
- }
- selectCluase = (SelectClause) selectBlock.getSelectClause().accept(this, arg);
- SelectBlock copy = new SelectBlock(selectCluase, fromClause, letClauses, whereClause, gbyClause, gbyLetClauses,
- havingClause);
+ selectClause = (SelectClause) selectBlock.getSelectClause().accept(this, arg);
+ SelectBlock copy = new SelectBlock(selectClause, fromClause, letWhereClauses, gbyClause, gbyLetHavingClauses);
copy.setSourceLocation(selectBlock.getSourceLocation());
return copy;
}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/FreeVariableVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/FreeVariableVisitor.java
index b61f4e6..d662988 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/FreeVariableVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/FreeVariableVisitor.java
@@ -23,6 +23,7 @@
import java.util.List;
import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.Clause.ClauseType;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.clause.GroupbyClause;
@@ -155,16 +156,16 @@
public Void visit(SelectBlock selectBlock, Collection<VariableExpr> freeVars) throws CompilationException {
Collection<VariableExpr> selectFreeVars = new HashSet<>();
Collection<VariableExpr> fromFreeVars = new HashSet<>();
- Collection<VariableExpr> letsFreeVars = new HashSet<>();
- Collection<VariableExpr> whereFreeVars = new HashSet<>();
+ Collection<VariableExpr> letWheresFreeVars = new HashSet<>();
Collection<VariableExpr> gbyFreeVars = new HashSet<>();
- Collection<VariableExpr> gbyLetsFreeVars = new HashSet<>();
+ Collection<VariableExpr> gbyLetHavingsFreeVars = new HashSet<>();
Collection<VariableExpr> fromBindingVars = SqlppVariableUtil.getBindingVariables(selectBlock.getFromClause());
- Collection<VariableExpr> letsBindingVars = SqlppVariableUtil.getBindingVariables(selectBlock.getLetList());
+ Collection<VariableExpr> letsBindingVars =
+ SqlppVariableUtil.getLetBindingVariables(selectBlock.getLetWhereList());
Collection<VariableExpr> gbyBindingVars = SqlppVariableUtil.getBindingVariables(selectBlock.getGroupbyClause());
Collection<VariableExpr> gbyLetsBindingVars =
- SqlppVariableUtil.getBindingVariables(selectBlock.getLetListAfterGroupby());
+ SqlppVariableUtil.getLetBindingVariables(selectBlock.getLetHavingListAfterGroupby());
selectBlock.getSelectClause().accept(this, selectFreeVars);
// Removes group-by, from, let, and gby-let binding vars.
@@ -174,30 +175,20 @@
if (selectBlock.hasFromClause()) {
selectBlock.getFromClause().accept(this, fromFreeVars);
}
- if (selectBlock.hasLetClauses()) {
- visitLetClauses(selectBlock.getLetList(), letsFreeVars);
- letsFreeVars.removeAll(fromBindingVars);
- }
- if (selectBlock.hasWhereClause()) {
- selectBlock.getWhereClause().accept(this, whereFreeVars);
- whereFreeVars.removeAll(fromBindingVars);
- whereFreeVars.removeAll(letsBindingVars);
+ if (selectBlock.hasLetWhereClauses()) {
+ visitLetWhereClauses(selectBlock.getLetWhereList(), letWheresFreeVars);
+ letWheresFreeVars.removeAll(fromBindingVars);
}
if (selectBlock.hasGroupbyClause()) {
selectBlock.getGroupbyClause().accept(this, gbyFreeVars);
// Remove group-by and let binding vars.
gbyFreeVars.removeAll(fromBindingVars);
gbyFreeVars.removeAll(letsBindingVars);
- if (selectBlock.hasLetClausesAfterGroupby()) {
- visitLetClauses(selectBlock.getLetListAfterGroupby(), gbyLetsFreeVars);
- gbyLetsFreeVars.removeAll(fromBindingVars);
- gbyLetsFreeVars.removeAll(letsBindingVars);
- gbyLetsFreeVars.removeAll(gbyBindingVars);
- }
- if (selectBlock.hasHavingClause()) {
- selectBlock.getHavingClause().accept(this, selectFreeVars);
- removeAllBindingVarsInSelectBlock(selectFreeVars, fromBindingVars, letsBindingVars, gbyBindingVars,
- gbyLetsBindingVars);
+ if (selectBlock.hasLetHavingClausesAfterGroupby()) {
+ visitLetWhereClauses(selectBlock.getLetHavingListAfterGroupby(), gbyLetHavingsFreeVars);
+ gbyLetHavingsFreeVars.removeAll(fromBindingVars);
+ gbyLetHavingsFreeVars.removeAll(letsBindingVars);
+ gbyLetHavingsFreeVars.removeAll(gbyBindingVars);
}
}
@@ -209,10 +200,9 @@
// Adds all free vars.
freeVars.addAll(selectFreeVars);
freeVars.addAll(fromFreeVars);
- freeVars.addAll(letsFreeVars);
- freeVars.addAll(whereFreeVars);
+ freeVars.addAll(letWheresFreeVars);
freeVars.addAll(gbyFreeVars);
- freeVars.addAll(gbyLetsFreeVars);
+ freeVars.addAll(gbyLetHavingsFreeVars);
return null;
}
@@ -322,7 +312,7 @@
throws CompilationException {
Collection<VariableExpr> letsFreeVars = new HashSet<>();
Collection<VariableExpr> selectFreeVars = new HashSet<>();
- visitLetClauses(selectExpression.getLetList(), letsFreeVars);
+ visitLetWhereClauses(selectExpression.getLetList(), letsFreeVars);
// visit order by
if (selectExpression.hasOrderby()) {
@@ -340,7 +330,7 @@
selectExpression.getSelectSetOperation().accept(this, selectFreeVars);
// Removed let binding variables.
- selectFreeVars.removeAll(SqlppVariableUtil.getBindingVariables(selectExpression.getLetList()));
+ selectFreeVars.removeAll(SqlppVariableUtil.getLetBindingVariables(selectExpression.getLetList()));
freeVars.addAll(letsFreeVars);
freeVars.addAll(selectFreeVars);
return null;
@@ -471,22 +461,24 @@
return null;
}
- private void visitLetClauses(List<LetClause> letClauses, Collection<VariableExpr> freeVars)
+ private void visitLetWhereClauses(List<? extends AbstractClause> clauseList, Collection<VariableExpr> freeVars)
throws CompilationException {
- if (letClauses == null || letClauses.isEmpty()) {
+ if (clauseList == null || clauseList.isEmpty()) {
return;
}
Collection<VariableExpr> bindingVars = new HashSet<>();
- for (LetClause letClause : letClauses) {
- Collection<VariableExpr> letFreeVars = new HashSet<>();
- letClause.accept(this, letFreeVars);
+ for (AbstractClause clause : clauseList) {
+ Collection<VariableExpr> clauseFreeVars = new HashSet<>();
+ clause.accept(this, clauseFreeVars);
// Removes previous binding variables.
- letFreeVars.removeAll(bindingVars);
- freeVars.addAll(letFreeVars);
+ clauseFreeVars.removeAll(bindingVars);
+ freeVars.addAll(clauseFreeVars);
// Adds let binding variables into the binding variable collection.
- bindingVars.add(letClause.getVarExpr());
+ if (clause.getClauseType() == ClauseType.LET_CLAUSE) {
+ bindingVars.add(((LetClause) clause).getVarExpr());
+ }
}
}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppAstPrintVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppAstPrintVisitor.java
index d906a82..da3c5df 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppAstPrintVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppAstPrintVisitor.java
@@ -24,6 +24,7 @@
import org.apache.asterix.common.exceptions.CompilationException;
import org.apache.asterix.common.functions.FunctionSignature;
+import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
@@ -141,25 +142,19 @@
if (selectBlock.hasFromClause()) {
selectBlock.getFromClause().accept(this, step);
}
- if (selectBlock.hasLetClauses()) {
- for (LetClause letClause : selectBlock.getLetList()) {
- letClause.accept(this, step);
+ if (selectBlock.hasLetWhereClauses()) {
+ for (AbstractClause letWhereClause : selectBlock.getLetWhereList()) {
+ letWhereClause.accept(this, step);
}
}
- if (selectBlock.hasWhereClause()) {
- selectBlock.getWhereClause().accept(this, step);
- }
if (selectBlock.hasGroupbyClause()) {
selectBlock.getGroupbyClause().accept(this, step);
- if (selectBlock.hasLetClausesAfterGroupby()) {
- for (LetClause letClause : selectBlock.getLetListAfterGroupby()) {
- letClause.accept(this, step);
+ if (selectBlock.hasLetHavingClausesAfterGroupby()) {
+ for (AbstractClause letHavingClause : selectBlock.getLetHavingListAfterGroupby()) {
+ letHavingClause.accept(this, step);
}
}
}
- if (selectBlock.hasHavingClause()) {
- selectBlock.getHavingClause().accept(this, step);
- }
return null;
}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppCloneAndSubstituteVariablesVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppCloneAndSubstituteVariablesVisitor.java
index 39e1883..dc3e565 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppCloneAndSubstituteVariablesVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppCloneAndSubstituteVariablesVisitor.java
@@ -22,6 +22,7 @@
import java.util.List;
import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.Clause.ClauseType;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.ILangExpression;
@@ -29,7 +30,6 @@
import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.clause.LimitClause;
import org.apache.asterix.lang.common.clause.OrderbyClause;
-import org.apache.asterix.lang.common.clause.WhereClause;
import org.apache.asterix.lang.common.expression.VariableExpr;
import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
import org.apache.asterix.lang.common.rewrites.VariableSubstitutionEnvironment;
@@ -215,13 +215,12 @@
public Pair<ILangExpression, VariableSubstitutionEnvironment> visit(SelectBlock selectBlock,
VariableSubstitutionEnvironment env) throws CompilationException {
Pair<ILangExpression, VariableSubstitutionEnvironment> newFrom = null;
- Pair<ILangExpression, VariableSubstitutionEnvironment> newLet;
- Pair<ILangExpression, VariableSubstitutionEnvironment> newWhere = null;
+ Pair<ILangExpression, VariableSubstitutionEnvironment> newLetWhere;
Pair<ILangExpression, VariableSubstitutionEnvironment> newGroupby = null;
- Pair<ILangExpression, VariableSubstitutionEnvironment> newHaving = null;
+ Pair<ILangExpression, VariableSubstitutionEnvironment> newLetHaving;
Pair<ILangExpression, VariableSubstitutionEnvironment> newSelect;
- List<LetClause> newLetClauses = new ArrayList<>();
- List<LetClause> newLetClausesAfterGby = new ArrayList<>();
+ List<AbstractClause> newLetWhereClauses = new ArrayList<>();
+ List<AbstractClause> newLetHavingClausesAfterGby = new ArrayList<>();
VariableSubstitutionEnvironment currentEnv = new VariableSubstitutionEnvironment(env);
if (selectBlock.hasFromClause()) {
@@ -229,44 +228,32 @@
currentEnv = newFrom.second;
}
- if (selectBlock.hasLetClauses()) {
- for (LetClause letClause : selectBlock.getLetList()) {
- newLet = letClause.accept(this, currentEnv);
- currentEnv = newLet.second;
- newLetClauses.add((LetClause) newLet.first);
+ if (selectBlock.hasLetWhereClauses()) {
+ for (AbstractClause letWhereClause : selectBlock.getLetWhereList()) {
+ newLetWhere = letWhereClause.accept(this, currentEnv);
+ currentEnv = newLetWhere.second;
+ newLetWhereClauses.add((AbstractClause) newLetWhere.first);
}
}
- if (selectBlock.hasWhereClause()) {
- newWhere = selectBlock.getWhereClause().accept(this, currentEnv);
- currentEnv = newWhere.second;
- }
-
if (selectBlock.hasGroupbyClause()) {
newGroupby = selectBlock.getGroupbyClause().accept(this, currentEnv);
currentEnv = newGroupby.second;
- if (selectBlock.hasLetClausesAfterGroupby()) {
- for (LetClause letClauseAfterGby : selectBlock.getLetListAfterGroupby()) {
- newLet = letClauseAfterGby.accept(this, currentEnv);
- currentEnv = newLet.second;
- newLetClausesAfterGby.add(letClauseAfterGby);
+ if (selectBlock.hasLetHavingClausesAfterGroupby()) {
+ for (AbstractClause letHavingClauseAfterGby : selectBlock.getLetHavingListAfterGroupby()) {
+ newLetHaving = letHavingClauseAfterGby.accept(this, currentEnv);
+ currentEnv = newLetHaving.second;
+ newLetHavingClausesAfterGby.add((AbstractClause) newLetHaving.first);
}
}
}
- if (selectBlock.hasHavingClause()) {
- newHaving = selectBlock.getHavingClause().accept(this, currentEnv);
- currentEnv = newHaving.second;
- }
-
newSelect = selectBlock.getSelectClause().accept(this, currentEnv);
currentEnv = newSelect.second;
FromClause fromClause = newFrom == null ? null : (FromClause) newFrom.first;
- WhereClause whereClause = newWhere == null ? null : (WhereClause) newWhere.first;
GroupbyClause groupbyClause = newGroupby == null ? null : (GroupbyClause) newGroupby.first;
- HavingClause havingClause = newHaving == null ? null : (HavingClause) newHaving.first;
- SelectBlock newSelectBlock = new SelectBlock((SelectClause) newSelect.first, fromClause, newLetClauses,
- whereClause, groupbyClause, newLetClausesAfterGby, havingClause);
+ SelectBlock newSelectBlock = new SelectBlock((SelectClause) newSelect.first, fromClause, newLetWhereClauses,
+ groupbyClause, newLetHavingClausesAfterGby);
newSelectBlock.setSourceLocation(selectBlock.getSourceLocation());
return new Pair<>(newSelectBlock, currentEnv);
}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java
index bf57184..8cfd04b 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java
@@ -86,7 +86,8 @@
selectClause.setSourceLocation(deleteStmt.getSourceLocation());
// Construct the select expression.
- SelectBlock selectBlock = new SelectBlock(selectClause, fromClause, null, whereClause, null, null, null);
+ SelectBlock selectBlock = new SelectBlock(selectClause, fromClause,
+ whereClause != null ? Collections.singletonList(whereClause) : null, null, null);
selectBlock.setSourceLocation(var.getSourceLocation());
SelectSetOperation selectSetOperation = new SelectSetOperation(new SetOperationInput(selectBlock, null), null);
selectSetOperation.setSourceLocation(var.getSourceLocation());
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppFormatPrintVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppFormatPrintVisitor.java
index 1ee3004..e541363 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppFormatPrintVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppFormatPrintVisitor.java
@@ -22,6 +22,7 @@
import java.util.List;
import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
@@ -144,25 +145,19 @@
if (selectBlock.hasFromClause()) {
selectBlock.getFromClause().accept(this, step);
}
- if (selectBlock.hasLetClauses()) {
- for (LetClause letClause : selectBlock.getLetList()) {
- letClause.accept(this, step);
+ if (selectBlock.hasLetWhereClauses()) {
+ for (AbstractClause letWhereClause : selectBlock.getLetWhereList()) {
+ letWhereClause.accept(this, step);
}
}
- if (selectBlock.hasWhereClause()) {
- selectBlock.getWhereClause().accept(this, step);
- }
if (selectBlock.hasGroupbyClause()) {
selectBlock.getGroupbyClause().accept(this, step);
- if (selectBlock.hasLetClausesAfterGroupby()) {
- for (LetClause letClause : selectBlock.getLetListAfterGroupby()) {
- letClause.accept(this, step);
+ if (selectBlock.hasLetHavingClausesAfterGroupby()) {
+ for (AbstractClause letHavingClause : selectBlock.getLetHavingListAfterGroupby()) {
+ letHavingClause.accept(this, step);
}
}
}
- if (selectBlock.hasHavingClause()) {
- selectBlock.getHavingClause().accept(this, step);
- }
return null;
}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppSimpleExpressionVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppSimpleExpressionVisitor.java
index d1092b3..345d5a5 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppSimpleExpressionVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppSimpleExpressionVisitor.java
@@ -22,6 +22,7 @@
import java.util.List;
import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.ILangExpression;
import org.apache.asterix.lang.common.clause.GroupbyClause;
@@ -120,32 +121,23 @@
@Override
public Expression visit(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
- // Traverses the select block in the order of "from", "let"s, "where",
- // "group by", "let"s, "having" and "select".
+ // Traverses the select block in the order of "from", "let/where"s, "group by", "let/having"s and "select".
if (selectBlock.hasFromClause()) {
selectBlock.getFromClause().accept(this, arg);
}
- if (selectBlock.hasLetClauses()) {
- List<LetClause> letList = selectBlock.getLetList();
- for (LetClause letClause : letList) {
- letClause.accept(this, arg);
+ if (selectBlock.hasLetWhereClauses()) {
+ for (AbstractClause clause : selectBlock.getLetWhereList()) {
+ clause.accept(this, arg);
}
}
- if (selectBlock.hasWhereClause()) {
- selectBlock.getWhereClause().accept(this, arg);
- }
if (selectBlock.hasGroupbyClause()) {
selectBlock.getGroupbyClause().accept(this, arg);
}
- if (selectBlock.hasLetClausesAfterGroupby()) {
- List<LetClause> letListAfterGby = selectBlock.getLetListAfterGroupby();
- for (LetClause letClauseAfterGby : letListAfterGby) {
- letClauseAfterGby.accept(this, arg);
+ if (selectBlock.hasLetHavingClausesAfterGroupby()) {
+ for (AbstractClause clause : selectBlock.getLetHavingListAfterGroupby()) {
+ clause.accept(this, arg);
}
}
- if (selectBlock.hasHavingClause()) {
- selectBlock.getHavingClause().accept(this, arg);
- }
selectBlock.getSelectClause().accept(this, arg);
return null;
}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
index 4078389..45ba7c3 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
+++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
@@ -67,6 +67,7 @@
import org.apache.asterix.common.exceptions.ErrorCode;
import org.apache.asterix.common.functions.FunctionConstants;
import org.apache.asterix.common.functions.FunctionSignature;
+import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.AbstractLangExpression;
import org.apache.asterix.lang.common.base.AbstractStatement;
import org.apache.asterix.lang.common.base.Expression;
@@ -3034,9 +3035,11 @@
FromClause fromClause = null;
List<LetClause> fromLetClauses = null;
WhereClause whereClause = null;
+ List<AbstractClause> fromLetWhereClauses = new ArrayList<AbstractClause>();
GroupbyClause groupbyClause = null;
List<LetClause> gbyLetClauses = null;
HavingClause havingClause = null;
+ List<AbstractClause> gbyLetHavingClauses = new ArrayList<AbstractClause>();
SourceLocation startSrcLoc = null;
}
{
@@ -3076,8 +3079,20 @@
selectClause = SelectClause()
)
{
- SelectBlock selectBlock = new SelectBlock(selectClause, fromClause, fromLetClauses, whereClause, groupbyClause,
- gbyLetClauses, havingClause);
+ if (fromLetClauses != null) {
+ fromLetWhereClauses.addAll(fromLetClauses);
+ }
+ if (whereClause != null) {
+ fromLetWhereClauses.add(whereClause);
+ }
+ if (gbyLetClauses != null) {
+ gbyLetHavingClauses.addAll(gbyLetClauses);
+ }
+ if (havingClause != null) {
+ gbyLetHavingClauses.add(havingClause);
+ }
+ SelectBlock selectBlock = new SelectBlock(selectClause, fromClause, fromLetWhereClauses, groupbyClause,
+ gbyLetHavingClauses);
selectBlock.setSourceLocation(startSrcLoc);
return selectBlock;
}