This is an automated email from the ASF dual-hosted git repository.
ggalvizo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push:
new d635e48ab6 [LANG][NO-ISSUE] Extension hook for AST rewrites /
translation.
d635e48ab6 is described below
commit d635e48ab63b24e2e9fa5ec03a0445a2d88d48e6
Author: ggalvizo <[email protected]>
AuthorDate: Wed Jul 13 22:08:43 2022 -0700
[LANG][NO-ISSUE] Extension hook for AST rewrites / translation.
- user model changes: no
- storage format changes: no
- interface changes: no
Languages must be aware that extensions exist, but can defer
implementation to an extension clause itself.
Change-Id: Ifb5bd518e52c9aa75742bed321fdf22a3f805fd9
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/16923
Tested-by: Jenkins <[email protected]>
Reviewed-by: Ian Maxon <[email protected]>
Integration-Tests: Ian Maxon <[email protected]>
---
.../SqlppExpressionToPlanTranslator.java | 8 ++
.../{Clause.java => AbstractExtensionClause.java} | 42 ++++-----
.../apache/asterix/lang/common/base/Clause.java | 4 +-
.../lang/common/base/IVisitorExtension.java | 69 ++++++++++++++
.../common/visitor/AbstractInlineUdfsVisitor.java | 6 ++
.../CloneAndSubstituteVariablesVisitor.java | 7 ++
.../common/visitor/GatherFunctionCallsVisitor.java | 6 ++
.../common/visitor/base/AbstractAstVisitor.java | 6 ++
.../lang/common/visitor/base/ILangVisitor.java | 3 +
.../rewrites/visitor/SqlppGroupByVisitor.java | 3 +-
.../SqlppWindowAggregationSugarVisitor.java | 3 +-
.../asterix/lang/sqlpp/util/SqlppVariableUtil.java | 72 +--------------
.../lang/sqlpp/visitor/BindingVariableVisitor.java | 101 +++++++++++++++++++++
.../visitor/CheckDatasetOnlyResolutionVisitor.java | 6 ++
.../CheckNonFunctionalExpressionVisitor.java | 6 ++
.../sqlpp/visitor/CheckSql92AggregateVisitor.java | 6 ++
.../lang/sqlpp/visitor/CheckSubqueryVisitor.java | 6 ++
.../lang/sqlpp/visitor/DeepCopyVisitor.java | 6 ++
.../lang/sqlpp/visitor/FreeVariableVisitor.java | 7 ++
.../lang/sqlpp/visitor/SqlppAstPrintVisitor.java | 7 ++
.../sqlpp/visitor/SqlppFormatPrintVisitor.java | 7 ++
.../visitor/base/AbstractSqlppAstVisitor.java | 6 ++
.../AbstractSqlppExpressionScopingVisitor.java | 6 ++
.../base/AbstractSqlppSimpleExpressionVisitor.java | 8 +-
24 files changed, 305 insertions(+), 96 deletions(-)
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 3c4537f98d..1cca5912fe 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
@@ -37,6 +37,7 @@ 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;
import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
import org.apache.asterix.lang.common.base.Literal;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
@@ -1029,6 +1030,13 @@ public class SqlppExpressionToPlanTranslator extends
LangExpressionToPlanTransla
: super.visit(qe, tupSource);
}
+ @Override
+ public Pair<ILogicalOperator, LogicalVariable> visit(IVisitorExtension ve,
Mutable<ILogicalOperator> arg)
+ throws CompilationException {
+ // Language extensions should create a child of this class.
+ throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
"Extension dispatch not implemented!");
+ }
+
// At this point "$x in list_expr" is a quantified expression:
// "some $y in list_expr satisfies $x = $y"
// Look for such quantified expression with a constant list_expr ([e1, e2,
... eN])
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Clause.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/AbstractExtensionClause.java
similarity index 51%
copy from
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Clause.java
copy to
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/AbstractExtensionClause.java
index 14f836b4d8..af9015b069 100644
---
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Clause.java
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/AbstractExtensionClause.java
@@ -18,32 +18,24 @@
*/
package org.apache.asterix.lang.common.base;
-public interface Clause extends ILangExpression {
- public ClauseType getClauseType();
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
- public enum ClauseType {
- FOR_CLAUSE,
- LET_CLAUSE,
- WHERE_CLAUSE,
- GROUP_BY_CLAUSE,
- DISTINCT_BY_CLAUSE,
- ORDER_BY_CLAUSE,
- LIMIT_CLAUSE,
- UPDATE_CLAUSE,
-
- // SQL related clause
- FROM_CLAUSE,
- FROM_TERM,
- HAVING_CLAUSE,
- JOIN_CLAUSE,
- NEST_CLAUSE,
- PROJECTION,
- SELECT_BLOCK,
- SELECT_CLAUSE,
- SELECT_ELEMENT,
- SELECT_REGULAR,
- SELECT_SET_OPERATION,
- UNNEST_CLAUSE
+public abstract class AbstractExtensionClause extends AbstractClause {
+ /**
+ * Parent languages should handle extension functionality via a new method
in {@link IVisitorExtension}.
+ */
+ @Override
+ public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws
CompilationException {
+ throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
getSourceLocation(),
+ "Unhandled dispatch to an extension clause node!");
}
+ public abstract IVisitorExtension getVisitorExtension();
+
+ @Override
+ public final ClauseType getClauseType() {
+ return ClauseType.EXTENSION;
+ }
}
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Clause.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Clause.java
index 14f836b4d8..95ed6dfc50 100644
---
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Clause.java
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Clause.java
@@ -43,7 +43,9 @@ public interface Clause extends ILangExpression {
SELECT_ELEMENT,
SELECT_REGULAR,
SELECT_SET_OPERATION,
- UNNEST_CLAUSE
+ UNNEST_CLAUSE,
+
+ EXTENSION
}
}
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IVisitorExtension.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IVisitorExtension.java
new file mode 100644
index 0000000000..9007eb816e
--- /dev/null
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IVisitorExtension.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.lang.common.base;
+
+import java.util.Collection;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.expression.AbstractCallExpression;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.parser.ScopeChecker;
+import org.apache.asterix.lang.common.rewrites.VariableSubstitutionEnvironment;
+import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+
+/**
+ * Contract for all extension AST nodes to allow existing rewrites to support
language extensions.
+ */
+public interface IVisitorExtension {
+ Expression simpleExpressionDispatch(ILangVisitor<Expression,
ILangExpression> simpleExpressionVisitor,
+ ILangExpression argument) throws CompilationException;
+
+ Void freeVariableDispatch(ILangVisitor<Void, Collection<VariableExpr>>
freeVariableVisitor,
+ Collection<VariableExpr> freeVariables) throws
CompilationException;
+
+ Void bindingVariableDispatch(ILangVisitor<Void, Collection<VariableExpr>>
bindingVariableVisitor,
+ Collection<VariableExpr> bindingVariables) throws
CompilationException;
+
+ Expression variableScopeDispatch(ILangVisitor<Expression, ILangExpression>
scopingVisitor, ILangExpression argument,
+ ScopeChecker scopeChecker) throws CompilationException;
+
+ ILangExpression deepCopyDispatch(ILangVisitor<ILangExpression, Void>
deepCopyVisitor) throws CompilationException;
+
+ Pair<ILangExpression, VariableSubstitutionEnvironment> remapCloneDispatch(
+ ILangVisitor<Pair<ILangExpression,
VariableSubstitutionEnvironment>, VariableSubstitutionEnvironment>
remapCloneVisitor,
+ VariableSubstitutionEnvironment substitutionEnvironment) throws
CompilationException;
+
+ Boolean inlineUDFsDispatch(ILangVisitor<Boolean, Void> inlineUDFsVisitor)
throws CompilationException;
+
+ Void gatherFunctionsDispatch(ILangVisitor<Void, Void>
gatherFunctionsVisitor,
+ Collection<? super AbstractCallExpression> functionCalls) throws
CompilationException;
+
+ Boolean checkSubqueryDispatch(ILangVisitor<Boolean, ILangExpression>
checkSubqueryVisitor, ILangExpression argument)
+ throws CompilationException;
+
+ Boolean check92AggregateDispatch(ILangVisitor<Boolean, ILangExpression>
check92AggregateVisitor,
+ ILangExpression argument) throws CompilationException;
+
+ Boolean checkNonFunctionalDispatch(ILangVisitor<Boolean, Void>
checkNonFunctionalVisitor)
+ throws CompilationException;
+
+ Boolean checkDatasetOnlyDispatch(ILangVisitor<Boolean, VariableExpr>
checkDatasetOnlyVisitor,
+ VariableExpr datasetCandidate) throws CompilationException;
+}
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
index 52775d3645..077748d9cc 100644
---
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
@@ -31,6 +31,7 @@ import
org.apache.asterix.common.metadata.DatasetFullyQualifiedName;
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.base.IVisitorExtension;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.clause.LimitClause;
@@ -263,6 +264,11 @@ public abstract class AbstractInlineUdfsVisitor extends
AbstractQueryExpressionV
return false;
}
+ @Override
+ public Boolean visit(IVisitorExtension ve, Void arg) throws
CompilationException {
+ return ve.inlineUDFsDispatch(this);
+ }
+
@Override
public Boolean visit(InsertStatement insert, Void arg) throws
CompilationException {
boolean changed = false;
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/CloneAndSubstituteVariablesVisitor.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/CloneAndSubstituteVariablesVisitor.java
index d73c2640fb..06f22b7000 100644
---
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/CloneAndSubstituteVariablesVisitor.java
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/CloneAndSubstituteVariablesVisitor.java
@@ -29,6 +29,7 @@ import org.apache.asterix.common.exceptions.ErrorCode;
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.base.IVisitorExtension;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.clause.LimitClause;
@@ -338,6 +339,12 @@ public class CloneAndSubstituteVariablesVisitor extends
return new Pair<>(resultExpression, env);
}
+ @Override
+ public Pair<ILangExpression, VariableSubstitutionEnvironment>
visit(IVisitorExtension ve,
+ VariableSubstitutionEnvironment arg) throws CompilationException {
+ return ve.remapCloneDispatch(this, arg);
+ }
+
@Override
public Pair<ILangExpression, VariableSubstitutionEnvironment>
visit(FieldAccessor fa,
VariableSubstitutionEnvironment env) throws CompilationException {
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/GatherFunctionCallsVisitor.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/GatherFunctionCallsVisitor.java
index b7cf7af743..6dcfb837c7 100644
---
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/GatherFunctionCallsVisitor.java
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/GatherFunctionCallsVisitor.java
@@ -25,6 +25,7 @@ import java.util.Map;
import org.apache.asterix.common.exceptions.CompilationException;
import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.clause.LimitClause;
@@ -226,6 +227,11 @@ public abstract class GatherFunctionCallsVisitor extends
AbstractQueryExpression
return null;
}
+ @Override
+ public Void visit(IVisitorExtension ve, Void arg) throws
CompilationException {
+ return ve.gatherFunctionsDispatch(this, calls);
+ }
+
@Override
public Void visit(WhereClause wc, Void arg) throws CompilationException {
wc.getWhereExpr().accept(this, arg);
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/AbstractAstVisitor.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/AbstractAstVisitor.java
index a422ef159a..a6092c6413 100644
---
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/AbstractAstVisitor.java
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/AbstractAstVisitor.java
@@ -19,6 +19,8 @@
package org.apache.asterix.lang.common.visitor.base;
import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.clause.LimitClause;
@@ -130,4 +132,8 @@ public abstract class AbstractAstVisitor<R, T> extends
AbstractQueryExpressionVi
return null;
}
+ @Override
+ public R visit(IVisitorExtension ve, T arg) throws CompilationException {
+ throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
"Extension dispatch not implemented!");
+ }
}
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/ILangVisitor.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/ILangVisitor.java
index b9de3472ac..8fda66e9cd 100644
---
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/ILangVisitor.java
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/ILangVisitor.java
@@ -19,6 +19,7 @@
package org.apache.asterix.lang.common.visitor.base;
import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.clause.LimitClause;
@@ -222,4 +223,6 @@ public interface ILangVisitor<R, T> {
R visit(ViewDropStatement vds, T arg) throws CompilationException;
R visit(ViewDecl vd, T arg) throws CompilationException;
+
+ R visit(IVisitorExtension ve, T arg) throws CompilationException;
}
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 d337de9d1e..c4fb951b81 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
@@ -124,7 +124,8 @@ public class SqlppGroupByVisitor extends
AbstractSqlppExpressionExtractionVisito
return expr.accept(visitor, selectBlock);
}
- private List<Pair<Expression, Identifier>>
createGroupFieldList(SelectBlock selectBlock) {
+ private List<Pair<Expression, Identifier>>
createGroupFieldList(SelectBlock selectBlock)
+ throws CompilationException {
List<Pair<Expression, Identifier>> groupFieldList = new ArrayList<>();
addToFieldList(groupFieldList,
SqlppVariableUtil.getBindingVariables(selectBlock.getFromClause()));
addToFieldList(groupFieldList,
SqlppVariableUtil.getLetBindingVariables(selectBlock.getLetWhereList()));
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 bf3e22736d..aa54851967 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
@@ -139,7 +139,8 @@ public class SqlppWindowAggregationSugarVisitor extends
AbstractSqlppExpressionS
winExpr.setExprList(newExprList);
}
- private List<Pair<Expression, Identifier>>
createWindowFieldList(SelectBlock selectBlock) {
+ private List<Pair<Expression, Identifier>>
createWindowFieldList(SelectBlock selectBlock)
+ throws CompilationException {
List<Pair<Expression, Identifier>> fieldList = new ArrayList<>();
if (selectBlock != null) {
addToFieldList(fieldList,
SqlppVariableUtil.getBindingVariables(selectBlock.getFromClause()));
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 9d50160f2b..0a8e5281dc 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
@@ -29,17 +29,11 @@ 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;
import org.apache.asterix.lang.common.clause.LetClause;
-import org.apache.asterix.lang.common.expression.GbyVariableExpressionPair;
-import org.apache.asterix.lang.common.expression.QuantifiedExpression;
import org.apache.asterix.lang.common.expression.VariableExpr;
import org.apache.asterix.lang.common.struct.Identifier;
-import org.apache.asterix.lang.common.struct.QuantifiedPair;
import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
-import org.apache.asterix.lang.sqlpp.clause.FromClause;
-import org.apache.asterix.lang.sqlpp.clause.FromTerm;
+import org.apache.asterix.lang.sqlpp.visitor.BindingVariableVisitor;
import org.apache.asterix.lang.sqlpp.visitor.FreeVariableVisitor;
import org.apache.hyracks.algebricks.common.utils.Pair;
import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
@@ -131,61 +125,14 @@ public class SqlppVariableUtil {
return freeVars;
}
- public static List<VariableExpr> getBindingVariables(FromClause
fromClause) {
- if (fromClause == null) {
+ public static List<VariableExpr> getBindingVariables(ILangExpression
langExpr) throws CompilationException {
+ if (langExpr == null) {
return Collections.emptyList();
}
- List<VariableExpr> bindingVars = new ArrayList<>();
- for (FromTerm fromTerm : fromClause.getFromTerms()) {
- bindingVars.addAll(getBindingVariables(fromTerm));
- }
- return bindingVars;
- }
-
- public static List<VariableExpr> getBindingVariables(FromTerm fromTerm) {
- List<VariableExpr> bindingVars = new ArrayList<>();
- if (fromTerm == null) {
- return bindingVars;
- }
- bindingVars.add(fromTerm.getLeftVariable());
- if (fromTerm.hasPositionalVariable()) {
- bindingVars.add(fromTerm.getPositionalVariable());
- }
- for (AbstractBinaryCorrelateClause correlateClause :
fromTerm.getCorrelateClauses()) {
- bindingVars.add(correlateClause.getRightVariable());
- if (correlateClause.hasPositionalVariable()) {
- bindingVars.add(correlateClause.getPositionalVariable());
- }
- }
- return bindingVars;
- }
- public static List<VariableExpr> getBindingVariables(GroupbyClause
gbyClause) {
+ final BindingVariableVisitor visitor = new BindingVariableVisitor();
List<VariableExpr> bindingVars = new ArrayList<>();
- if (gbyClause == null) {
- return bindingVars;
- }
- Set<VariableExpr> gbyKeyVars = new HashSet<>();
- for (List<GbyVariableExpressionPair> gbyPairList :
gbyClause.getGbyPairList()) {
- for (GbyVariableExpressionPair gbyKey : gbyPairList) {
- VariableExpr var = gbyKey.getVar();
- if (var != null && gbyKeyVars.add(var)) {
- bindingVars.add(var);
- }
- }
- }
- if (gbyClause.hasDecorList()) {
- for (GbyVariableExpressionPair gbyKey :
gbyClause.getDecorPairList()) {
- VariableExpr var = gbyKey.getVar();
- if (var != null) {
- bindingVars.add(var);
- }
- }
- }
- if (gbyClause.hasWithMap()) {
- bindingVars.addAll(gbyClause.getWithVarMap().values());
- }
- bindingVars.add(gbyClause.getGroupVar());
+ langExpr.accept(visitor, bindingVars);
return bindingVars;
}
@@ -203,15 +150,6 @@ public class SqlppVariableUtil {
return bindingVars;
}
- public static List<VariableExpr> getBindingVariables(QuantifiedExpression
qe) {
- List<QuantifiedPair> quantifiedList = qe.getQuantifiedList();
- List<VariableExpr> bindingVars = new
ArrayList<>(quantifiedList.size());
- for (QuantifiedPair qp : quantifiedList) {
- bindingVars.add(qp.getVarExpr());
- }
- return bindingVars;
- }
-
public static void addToFieldVariableList(VariableExpr varExpr,
List<Pair<Expression, Identifier>> outFieldList) {
VarIdentifier var = varExpr.getVar();
VariableExpr newVarExpr = new VariableExpr(var);
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/BindingVariableVisitor.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/BindingVariableVisitor.java
new file mode 100644
index 0000000000..1b7dc24194
--- /dev/null
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/BindingVariableVisitor.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.lang.sqlpp.visitor;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
+import org.apache.asterix.lang.common.clause.GroupbyClause;
+import org.apache.asterix.lang.common.expression.GbyVariableExpressionPair;
+import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.struct.QuantifiedPair;
+import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
+import org.apache.asterix.lang.sqlpp.clause.FromClause;
+import org.apache.asterix.lang.sqlpp.clause.FromTerm;
+import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppAstVisitor;
+
+public class BindingVariableVisitor extends AbstractSqlppAstVisitor<Void,
Collection<VariableExpr>> {
+ @Override
+ public Void visit(FromClause fromClause, Collection<VariableExpr>
bindingVars) throws CompilationException {
+ for (FromTerm fromTerm : fromClause.getFromTerms()) {
+ fromTerm.accept(this, bindingVars);
+ }
+ return null;
+ }
+
+ @Override
+ public Void visit(FromTerm fromTerm, Collection<VariableExpr> bindingVars)
throws CompilationException {
+ bindingVars.add(fromTerm.getLeftVariable());
+ if (fromTerm.hasPositionalVariable()) {
+ bindingVars.add(fromTerm.getPositionalVariable());
+ }
+ for (AbstractBinaryCorrelateClause correlateClause :
fromTerm.getCorrelateClauses()) {
+ bindingVars.add(correlateClause.getRightVariable());
+ if (correlateClause.hasPositionalVariable()) {
+ bindingVars.add(correlateClause.getPositionalVariable());
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Void visit(GroupbyClause groupbyClause, Collection<VariableExpr>
bindingVars) throws CompilationException {
+ Set<VariableExpr> gbyKeyVars = new HashSet<>();
+ for (List<GbyVariableExpressionPair> gbyPairList :
groupbyClause.getGbyPairList()) {
+ for (GbyVariableExpressionPair gbyKey : gbyPairList) {
+ VariableExpr var = gbyKey.getVar();
+ if (var != null && gbyKeyVars.add(var)) {
+ bindingVars.add(var);
+ }
+ }
+ }
+ if (groupbyClause.hasDecorList()) {
+ for (GbyVariableExpressionPair gbyKey :
groupbyClause.getDecorPairList()) {
+ VariableExpr var = gbyKey.getVar();
+ if (var != null) {
+ bindingVars.add(var);
+ }
+ }
+ }
+ if (groupbyClause.hasWithMap()) {
+ bindingVars.addAll(groupbyClause.getWithVarMap().values());
+ }
+ bindingVars.add(groupbyClause.getGroupVar());
+ return null;
+ }
+
+ @Override
+ public Void visit(QuantifiedExpression qe, Collection<VariableExpr>
bindingVars) throws CompilationException {
+ List<QuantifiedPair> quantifiedList = qe.getQuantifiedList();
+ for (QuantifiedPair qp : quantifiedList) {
+ bindingVars.add(qp.getVarExpr());
+ }
+ return null;
+ }
+
+ @Override
+ public Void visit(IVisitorExtension ve, Collection<VariableExpr> arg)
throws CompilationException {
+ return ve.bindingVariableDispatch(this, arg);
+ }
+}
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckDatasetOnlyResolutionVisitor.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckDatasetOnlyResolutionVisitor.java
index e4ccef550a..f700d212f9 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckDatasetOnlyResolutionVisitor.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckDatasetOnlyResolutionVisitor.java
@@ -21,6 +21,7 @@ package org.apache.asterix.lang.sqlpp.visitor;
import org.apache.asterix.common.exceptions.CompilationException;
import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.clause.LimitClause;
@@ -159,6 +160,11 @@ public final class CheckDatasetOnlyResolutionVisitor
return false;
}
+ @Override
+ public Boolean visit(IVisitorExtension ve, VariableExpr arg) throws
CompilationException {
+ return ve.checkDatasetOnlyDispatch(this, arg);
+ }
+
@Override
public Boolean visit(IfExpr ifexpr, VariableExpr arg) throws
CompilationException {
return false;
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckNonFunctionalExpressionVisitor.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckNonFunctionalExpressionVisitor.java
index d6ee1fc826..d16322e641 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckNonFunctionalExpressionVisitor.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckNonFunctionalExpressionVisitor.java
@@ -22,6 +22,7 @@ package org.apache.asterix.lang.sqlpp.visitor;
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.IVisitorExtension;
import org.apache.asterix.lang.common.expression.CallExpr;
import
org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppContainsExpressionVisitor;
import org.apache.asterix.metadata.declared.MetadataProvider;
@@ -68,4 +69,9 @@ public final class CheckNonFunctionalExpressionVisitor
extends AbstractSqlppCont
}
return super.visit(callExpr, arg);
}
+
+ @Override
+ public Boolean visit(IVisitorExtension ve, Void arg) throws
CompilationException {
+ return ve.checkNonFunctionalDispatch(this);
+ }
}
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSql92AggregateVisitor.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSql92AggregateVisitor.java
index 31925414c1..5e6a84ae07 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSql92AggregateVisitor.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSql92AggregateVisitor.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.Expression;
import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.clause.LimitClause;
@@ -156,6 +157,11 @@ public class CheckSql92AggregateVisitor extends
AbstractSqlppQueryExpressionVisi
return false;
}
+ @Override
+ public Boolean visit(IVisitorExtension ve, ILangExpression arg) throws
CompilationException {
+ return ve.check92AggregateDispatch(this, arg);
+ }
+
@Override
public Boolean visit(IfExpr ifexpr, ILangExpression parentSelectBlock)
throws CompilationException {
if (ifexpr.getCondExpr().accept(this, parentSelectBlock)) {
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 a903279a84..399e463eab 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
@@ -24,6 +24,7 @@ import java.util.List;
import org.apache.asterix.common.exceptions.CompilationException;
import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.clause.LimitClause;
@@ -230,6 +231,11 @@ public class CheckSubqueryVisitor extends
AbstractSqlppQueryExpressionVisitor<Bo
|| visit(expression.getEndIndexExpression(), arg);
}
+ @Override
+ public Boolean visit(IVisitorExtension ve, ILangExpression arg) throws
CompilationException {
+ return ve.checkSubqueryDispatch(this, arg);
+ }
+
@Override
public Boolean visit(IfExpr ifexpr, ILangExpression arg) throws
CompilationException {
return visit(ifexpr.getCondExpr(), arg) || visit(ifexpr.getThenExpr(),
arg) || visit(ifexpr.getElseExpr(), arg);
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 d74d0478f0..07dc24e041 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
@@ -28,6 +28,7 @@ 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.base.IVisitorExtension;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.clause.LimitClause;
@@ -506,6 +507,11 @@ public class DeepCopyVisitor extends
AbstractSqlppQueryExpressionVisitor<ILangEx
return copy;
}
+ @Override
+ public ILangExpression visit(IVisitorExtension ve, Void arg) throws
CompilationException {
+ return ve.deepCopyDispatch(this);
+ }
+
@Override
public ILangExpression visit(CaseExpression caseExpr, Void arg) throws
CompilationException {
Expression conditionExpr = (Expression)
caseExpr.getConditionExpr().accept(this, arg);
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 9115b1cce6..8ab87e71bb 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
@@ -27,6 +27,7 @@ import org.apache.asterix.common.exceptions.ErrorCode;
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.IVisitorExtension;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.clause.LimitClause;
@@ -467,6 +468,12 @@ public class FreeVariableVisitor extends
AbstractSqlppQueryExpressionVisitor<Voi
return null;
}
+ @Override
+ public Void visit(IVisitorExtension ve, Collection<VariableExpr> arg)
throws CompilationException {
+ ve.freeVariableDispatch(this, arg);
+ return null;
+ }
+
@Override
public Void visit(CaseExpression caseExpr, Collection<VariableExpr>
freeVars) throws CompilationException {
caseExpr.getConditionExpr().accept(this, freeVars);
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 c803d83f00..50ebde7b2c 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
@@ -28,6 +28,7 @@ import org.apache.asterix.common.functions.FunctionSignature;
import org.apache.asterix.common.metadata.DatasetFullyQualifiedName;
import org.apache.asterix.lang.common.base.AbstractClause;
import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
import org.apache.asterix.lang.common.base.Literal;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
@@ -372,6 +373,12 @@ public class SqlppAstPrintVisitor extends
QueryPrintVisitor implements ISqlppVis
return null;
}
+ @Override
+ public Void visit(IVisitorExtension ve, Integer arg) throws
CompilationException {
+ // Language extensions should create a child of this class.
+ return null;
+ }
+
@Override
public Void visit(WindowExpression winExpr, Integer step) throws
CompilationException {
out.print(skip(step) + "WINDOW ");
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 975379db9f..8052c7e770 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
@@ -24,6 +24,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.IVisitorExtension;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.expression.GbyVariableExpressionPair;
@@ -283,6 +284,12 @@ public class SqlppFormatPrintVisitor extends
FormatPrintVisitor implements ISqlp
return null;
}
+ @Override
+ public Void visit(IVisitorExtension ve, Integer arg) throws
CompilationException {
+ // Language extensions should create a child of this class.
+ return null;
+ }
+
@Override
public Void visit(InsertStatement insert, Integer step) throws
CompilationException {
out.print(skip(step) + "insert into " + datasetSymbol
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppAstVisitor.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppAstVisitor.java
index e9c0e4c8f3..797384173f 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppAstVisitor.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppAstVisitor.java
@@ -19,6 +19,7 @@
package org.apache.asterix.lang.sqlpp.visitor.base;
import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
import org.apache.asterix.lang.common.expression.ListSliceExpression;
import org.apache.asterix.lang.common.visitor.base.AbstractAstVisitor;
import org.apache.asterix.lang.sqlpp.clause.FromClause;
@@ -121,4 +122,9 @@ public abstract class AbstractSqlppAstVisitor<R, T> extends
AbstractAstVisitor<R
public R visit(ListSliceExpression expression, T arg) throws
CompilationException {
return null;
}
+
+ @Override
+ public R visit(IVisitorExtension ve, T arg) throws CompilationException {
+ return null;
+ }
}
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppExpressionScopingVisitor.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppExpressionScopingVisitor.java
index 7539046cb8..765c2be290 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppExpressionScopingVisitor.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppExpressionScopingVisitor.java
@@ -32,6 +32,7 @@ import
org.apache.asterix.common.exceptions.CompilationException;
import org.apache.asterix.common.exceptions.ErrorCode;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.clause.LimitClause;
@@ -413,6 +414,11 @@ public class AbstractSqlppExpressionScopingVisitor extends
AbstractSqlppSimpleEx
return winExpr;
}
+ @Override
+ public Expression visit(IVisitorExtension ve, ILangExpression arg) throws
CompilationException {
+ return ve.variableScopeDispatch(this, arg, scopeChecker);
+ }
+
// Adds a new encountered alias identifier into a scope
private void addNewVarSymbolToScope(Scope scope, VarIdentifier var,
SourceLocation sourceLoc,
SqlppVariableAnnotation... varAnnotations) throws
CompilationException {
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 ef8b43ca61..6bbb7406b0 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
@@ -25,6 +25,7 @@ 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.base.IVisitorExtension;
import org.apache.asterix.lang.common.clause.GroupbyClause;
import org.apache.asterix.lang.common.clause.LetClause;
import org.apache.asterix.lang.common.clause.LimitClause;
@@ -383,6 +384,11 @@ public class AbstractSqlppSimpleExpressionVisitor
return expression;
}
+ @Override
+ public Expression visit(IVisitorExtension ve, ILangExpression arg) throws
CompilationException {
+ return ve.simpleExpressionDispatch(this, arg);
+ }
+
@Override
public Expression visit(CaseExpression caseExpr, ILangExpression arg)
throws CompilationException {
caseExpr.setConditionExpr(visit(caseExpr.getConditionExpr(), arg));
@@ -403,7 +409,7 @@ public class AbstractSqlppSimpleExpressionVisitor
return null;
}
- protected Expression visit(Expression expr, ILangExpression arg) throws
CompilationException {
+ public Expression visit(Expression expr, ILangExpression arg) throws
CompilationException {
return postVisit(preVisit(expr).accept(this, arg));
}