This is an automated email from the ASF dual-hosted git repository.
dlych 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 b4121e4 [NO ISSUE][COMP] Refactor Projection clause
b4121e4 is described below
commit b4121e45221a94877cb682aa461d2d77f0845b7b
Author: Dmitry Lychagin <[email protected]>
AuthorDate: Thu Sep 23 15:55:09 2021 -0700
[NO ISSUE][COMP] Refactor Projection clause
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Introduce Projection.Kind for projection kinds
and use it instead of boolean flags
- OperatorExpr.opIsComparison() should return true
for DISTINCT/NOT_DISTINCT operators
- Add missing setters to SelectClause and SelectExpression
Change-Id: I2dd25b4118251c1bf1edf0906a358500c3ce89fc
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/13364
Integration-Tests: Jenkins <[email protected]>
Tested-by: Jenkins <[email protected]>
Reviewed-by: Dmitry Lychagin <[email protected]>
Reviewed-by: Ali Alsuliman <[email protected]>
---
.../lang/common/expression/OperatorExpr.java | 2 +
.../asterix/lang/sqlpp/clause/Projection.java | 84 +++++++++++++++++++---
.../asterix/lang/sqlpp/clause/SelectClause.java | 10 +++
.../lang/sqlpp/expression/SelectExpression.java | 8 +++
.../visitor/GenerateColumnNameVisitor.java | 2 +-
.../rewrites/visitor/InlineColumnAliasVisitor.java | 2 +-
.../visitor/SqlppGatherFunctionCallsVisitor.java | 5 +-
.../rewrites/visitor/SqlppGroupingSetsVisitor.java | 65 ++++++++++-------
.../rewrites/visitor/SqlppInlineUdfsVisitor.java | 2 +-
.../visitor/SqlppRightJoinRewriteVisitor.java | 3 +-
.../sqlpp/visitor/CheckSql92AggregateVisitor.java | 5 +-
.../lang/sqlpp/visitor/CheckSubqueryVisitor.java | 5 +-
.../lang/sqlpp/visitor/DeepCopyVisitor.java | 6 +-
.../lang/sqlpp/visitor/FreeVariableVisitor.java | 5 +-
.../lang/sqlpp/visitor/SqlppAstPrintVisitor.java | 17 +++--
.../SqlppCloneAndSubstituteVariablesVisitor.java | 8 +--
.../sqlpp/visitor/SqlppFormatPrintVisitor.java | 27 +++----
.../base/AbstractSqlppSimpleExpressionVisitor.java | 2 +-
.../asterix-lang-sqlpp/src/main/javacc/SQLPP.jj | 10 +--
19 files changed, 180 insertions(+), 88 deletions(-)
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OperatorExpr.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OperatorExpr.java
index a37a366..3deedfd 100644
---
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OperatorExpr.java
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OperatorExpr.java
@@ -77,6 +77,8 @@ public class OperatorExpr extends AbstractExpression {
case GE:
case LT:
case LE:
+ case DISTINCT:
+ case NOT_DISTINCT:
return true;
default:
return false;
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/Projection.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/Projection.java
index 7f353d6..7aa3cec 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/Projection.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/Projection.java
@@ -29,16 +29,56 @@ import
org.apache.asterix.lang.sqlpp.visitor.base.ISqlppVisitor;
public class Projection extends AbstractClause {
+ public enum Kind {
+ NAMED_EXPR, // expr AS name
+ STAR, // *
+ VAR_STAR // variable.*
+ }
+
+ private Kind kind;
private Expression expr;
private String name;
- private boolean star;
- private boolean varStar;
- public Projection(Expression expr, String name, boolean star, boolean
varStar) {
+ public Projection(Kind kind, Expression expr, String name) {
+ validateKind(kind, expr, name);
+ this.kind = kind;
this.expr = expr;
this.name = name;
- this.star = star;
- this.varStar = varStar;
+ }
+
+ private static void validateKind(Kind kind, Expression expr, String name) {
+ switch (kind) {
+ case NAMED_EXPR:
+ if (expr == null) {
+ throw new NullPointerException();
+ }
+ break;
+ case STAR:
+ if (expr != null || name != null) {
+ throw new IllegalArgumentException();
+ }
+ break;
+ case VAR_STAR:
+ if (expr == null) {
+ throw new NullPointerException();
+ }
+ if (name != null) {
+ throw new IllegalArgumentException();
+ }
+ break;
+ default:
+ throw new IllegalArgumentException();
+ }
+ }
+
+ @Deprecated
+ public Projection(Expression expr, String name, boolean star, boolean
varStar) {
+ this(asKind(star, varStar), expr, name);
+ }
+
+ @Deprecated
+ private static Kind asKind(boolean star, boolean varStar) {
+ return star ? Kind.STAR : varStar ? Kind.VAR_STAR : Kind.NAMED_EXPR;
}
@Override
@@ -59,6 +99,10 @@ public class Projection extends AbstractClause {
this.expr = expr;
}
+ public boolean hasExpression() {
+ return expr != null;
+ }
+
public String getName() {
return name;
}
@@ -71,22 +115,41 @@ public class Projection extends AbstractClause {
return name != null;
}
+ public Kind getKind() {
+ return kind;
+ }
+
+ public void setKind(Kind kind) {
+ this.kind = kind;
+ }
+
+ @Deprecated
public boolean star() {
- return star;
+ return kind == Kind.STAR;
}
+ @Deprecated
public boolean varStar() {
- return varStar;
+ return kind == Kind.VAR_STAR;
}
@Override
public String toString() {
- return star ? "*" : (String.valueOf(expr) + (varStar ? ".*" :
(hasName() ? " as " + getName() : "")));
+ switch (kind) {
+ case NAMED_EXPR:
+ return expr + (hasName() ? " as " + getName() : "");
+ case STAR:
+ return "*";
+ case VAR_STAR:
+ return expr + ".*";
+ default:
+ throw new IllegalStateException();
+ }
}
@Override
public int hashCode() {
- return Objects.hash(expr, varStar, name, star);
+ return Objects.hash(kind, expr, name);
}
@Override
@@ -98,7 +161,6 @@ public class Projection extends AbstractClause {
return false;
}
Projection target = (Projection) object;
- return Objects.equals(expr, target.expr) && Objects.equals(name,
target.name) && varStar == target.varStar
- && star == target.star;
+ return kind == target.kind && Objects.equals(expr, target.expr) &&
Objects.equals(name, target.name);
}
}
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectClause.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectClause.java
index 3b550a3..ea6bac9 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectClause.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectClause.java
@@ -48,6 +48,16 @@ public class SelectClause extends AbstractClause {
return ClauseType.SELECT_CLAUSE;
}
+ public void setSelectElement(SelectElement selectElement) {
+ this.selectElement = selectElement;
+ this.selectRegular = null;
+ }
+
+ public void setSelectRegular(SelectRegular selectRegular) {
+ this.selectRegular = selectRegular;
+ this.selectElement = null;
+ }
+
public SelectElement getSelectElement() {
return selectElement;
}
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/SelectExpression.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/SelectExpression.java
index 62b8734..2a3ec4e 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/SelectExpression.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/SelectExpression.java
@@ -68,10 +68,18 @@ public class SelectExpression extends AbstractExpression {
return selectSetOperation;
}
+ public void setOrderbyClause(OrderbyClause orderbyClause) {
+ this.orderbyClause = orderbyClause;
+ }
+
public OrderbyClause getOrderbyClause() {
return orderbyClause;
}
+ public void setLimitClause(LimitClause limitClause) {
+ this.limitClause = limitClause;
+ }
+
public LimitClause getLimitClause() {
return limitClause;
}
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/GenerateColumnNameVisitor.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/GenerateColumnNameVisitor.java
index 3067641..e488e9d 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/GenerateColumnNameVisitor.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/GenerateColumnNameVisitor.java
@@ -67,7 +67,7 @@ public class GenerateColumnNameVisitor extends
AbstractSqlppExpressionScopingVis
@Override
public Expression visit(Projection projection, ILangExpression arg) throws
CompilationException {
- if (!projection.star() && !projection.varStar() &&
projection.getName() == null) {
+ if (projection.getKind() == Projection.Kind.NAMED_EXPR &&
!projection.hasName()) {
projection.setName(SqlppVariableUtil.variableNameToDisplayedFieldName(context.newVariable().getValue()));
}
return super.visit(projection, arg);
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 416f49b..53cd6de 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
@@ -151,7 +151,7 @@ public class InlineColumnAliasVisitor extends
AbstractSqlppExpressionScopingVisi
private Map<Expression, ColumnAliasBinding>
mapProjections(List<Projection> projections) {
Map<Expression, ColumnAliasBinding> exprMap = new HashMap<>();
for (Projection projection : projections) {
- if (!projection.star() && !projection.varStar()) {
+ if (projection.getKind() == Projection.Kind.NAMED_EXPR) {
String varName =
SqlppVariableUtil.toInternalVariableName(projection.getName());
exprMap.put(new VariableExpr(new VarIdentifier(varName)),
ColumnAliasBinding.of(projection));
}
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGatherFunctionCallsVisitor.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGatherFunctionCallsVisitor.java
index 8559c96..592d3f6 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGatherFunctionCallsVisitor.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGatherFunctionCallsVisitor.java
@@ -89,10 +89,7 @@ public final class SqlppGatherFunctionCallsVisitor extends
GatherFunctionCallsVi
@Override
public Void visit(Projection projection, Void arg) throws
CompilationException {
- if (!projection.star()) {
- projection.getExpression().accept(this, arg);
- }
- return null;
+ return projection.hasExpression() ?
projection.getExpression().accept(this, arg) : null;
}
@Override
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupingSetsVisitor.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupingSetsVisitor.java
index 791bfe1..9aca37a 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupingSetsVisitor.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupingSetsVisitor.java
@@ -177,33 +177,43 @@ public final class SqlppGroupingSetsVisitor extends
AbstractSqlppExpressionScopi
List<VariableExpr> gbyBindingVars = null, postGbyBindingVars = null;
for (VariableExpr freeVarPostSetOp : freeVarsPostSetOp) {
String projectionName = null;
- for (int i = projectionList.size() - 1; i >= 0; i--) {
+ inner_loop: for (int i = projectionList.size() - 1; i >= 0; i--) {
Projection projection = projectionList.get(i);
- if (projection.varStar()) {
- throw new
CompilationException(ErrorCode.UNSUPPORTED_GBY_OBY_SELECT_COMBO,
- selectBlock.getSourceLocation());
- } else if (projection.star()) {
- if (gbyBindingVars == null) {
- gbyBindingVars =
SqlppVariableUtil.getBindingVariables(selectBlock.getGroupbyClause());
- }
- if (postGbyBindingVars == null) {
- postGbyBindingVars =
selectBlock.hasLetHavingClausesAfterGroupby()
- ?
SqlppVariableUtil.getLetBindingVariables(selectBlock.getLetHavingListAfterGroupby())
- : Collections.emptyList();
- }
- if (gbyBindingVars.contains(freeVarPostSetOp) ||
postGbyBindingVars.contains(freeVarPostSetOp)) {
- projectionName = SqlppVariableUtil
-
.variableNameToDisplayedFieldName(freeVarPostSetOp.getVar().getValue());
+ switch (projection.getKind()) {
+ case VAR_STAR:
+ throw new
CompilationException(ErrorCode.UNSUPPORTED_GBY_OBY_SELECT_COMBO,
+ selectBlock.getSourceLocation());
+ case STAR:
+ if (gbyBindingVars == null) {
+ gbyBindingVars =
SqlppVariableUtil.getBindingVariables(selectBlock.getGroupbyClause());
+ }
+ if (postGbyBindingVars == null) {
+ postGbyBindingVars =
+
selectBlock.hasLetHavingClausesAfterGroupby()
+ ? SqlppVariableUtil
+
.getLetBindingVariables(selectBlock.getLetHavingListAfterGroupby())
+ : Collections.emptyList();
+ }
+ if (gbyBindingVars.contains(freeVarPostSetOp)
+ ||
postGbyBindingVars.contains(freeVarPostSetOp)) {
+ projectionName = SqlppVariableUtil
+
.variableNameToDisplayedFieldName(freeVarPostSetOp.getVar().getValue());
+ break;
+ }
break;
- }
- } else if (projection.hasName()) {
- if (projection.getExpression().equals(freeVarPostSetOp)) {
- projectionName = projection.getName();
+ case NAMED_EXPR:
+ if (!projection.hasName()) {
+ throw new
CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
+ selectBlock.getSourceLocation(), "");
+ }
+ if
(projection.getExpression().equals(freeVarPostSetOp)) {
+ projectionName = projection.getName();
+ break inner_loop;
+ }
break;
- }
- } else {
- throw new
CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
selectBlock.getSourceLocation(),
- "");
+ default:
+ throw new
CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
+ selectBlock.getSourceLocation(), "");
}
}
@@ -396,7 +406,8 @@ public final class SqlppGroupingSetsVisitor extends
AbstractSqlppExpressionScopi
}
SelectElement selectElement = selectClause.getSelectElement();
List<Projection> projectionList = new ArrayList<>(1);
- projectionList.add(new Projection(selectElement.getExpression(),
mainProjectionName, false, false));
+ projectionList
+ .add(new Projection(Projection.Kind.NAMED_EXPR,
selectElement.getExpression(), mainProjectionName));
SelectRegular newSelectRegular = new SelectRegular(projectionList);
newSelectRegular.setSourceLocation(selectElement.getSourceLocation());
SelectClause newSelectClause = new SelectClause(null,
newSelectRegular, selectClause.distinct());
@@ -412,8 +423,8 @@ public final class SqlppGroupingSetsVisitor extends
AbstractSqlppExpressionScopi
}
SelectRegular selectRegular = selectClause.getSelectRegular();
for (Map.Entry<VariableExpr, String> me : projections.entrySet()) {
- Projection newProjection =
- new Projection((VariableExpr)
SqlppRewriteUtil.deepCopy(me.getKey()), me.getValue(), false, false);
+ Projection newProjection = new
Projection(Projection.Kind.NAMED_EXPR,
+ (VariableExpr) SqlppRewriteUtil.deepCopy(me.getKey()),
me.getValue());
selectRegular.getProjections().add(newProjection);
}
}
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 56fdd19..9f93363 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
@@ -119,7 +119,7 @@ public class SqlppInlineUdfsVisitor extends
AbstractInlineUdfsVisitor implements
@Override
public Boolean visit(Projection projection, Void arg) throws
CompilationException {
- if (projection.star()) {
+ if (!projection.hasExpression()) {
return false;
}
Pair<Boolean, Expression> p =
inlineUdfsAndViewsInExpr(projection.getExpression());
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppRightJoinRewriteVisitor.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppRightJoinRewriteVisitor.java
index a8db06f..8a3b913 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppRightJoinRewriteVisitor.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppRightJoinRewriteVisitor.java
@@ -370,7 +370,8 @@ public final class SqlppRightJoinRewriteVisitor extends
AbstractSqlppSimpleExpre
}
private Projection createProjection(VariableExpr var, String fieldName,
SourceLocation sourceLoc) {
- Projection projection = new Projection(newVariableExpr(var.getVar(),
null), fieldName, false, false);
+ Projection projection =
+ new Projection(Projection.Kind.NAMED_EXPR,
newVariableExpr(var.getVar(), null), fieldName);
projection.setSourceLocation(sourceLoc);
return projection;
}
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 027560c..3192541 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
@@ -240,10 +240,7 @@ public class CheckSql92AggregateVisitor extends
AbstractSqlppQueryExpressionVisi
@Override
public Boolean visit(Projection projection, ILangExpression
parentSelectBlock) throws CompilationException {
- if (projection.star()) {
- return false;
- }
- return projection.getExpression().accept(this, parentSelectBlock);
+ return projection.hasExpression() ?
projection.getExpression().accept(this, parentSelectBlock) : false;
}
@Override
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 bc31e62..a903279 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
@@ -107,10 +107,7 @@ public class CheckSubqueryVisitor extends
AbstractSqlppQueryExpressionVisitor<Bo
@Override
public Boolean visit(Projection projection, ILangExpression arg) throws
CompilationException {
- if (projection.star()) {
- return false;
- }
- return visit(projection.getExpression(), arg);
+ return projection.hasExpression() && visit(projection.getExpression(),
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 ec6de6e..283b416 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
@@ -143,9 +143,9 @@ public class DeepCopyVisitor extends
AbstractSqlppQueryExpressionVisitor<ILangEx
@Override
public Projection visit(Projection projection, Void arg) throws
CompilationException {
- Projection copy =
- new Projection(projection.star() ? null : (Expression)
projection.getExpression().accept(this, arg),
- projection.getName(), projection.star(),
projection.varStar());
+ Projection copy = new Projection(projection.getKind(),
+ projection.hasExpression() ? (Expression)
projection.getExpression().accept(this, arg) : null,
+ projection.getName());
copy.setSourceLocation(projection.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 0c14688..77b9991 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
@@ -146,10 +146,7 @@ public class FreeVariableVisitor extends
AbstractSqlppQueryExpressionVisitor<Voi
@Override
public Void visit(Projection projection, Collection<VariableExpr>
freeVars) throws CompilationException {
- if (!projection.star()) {
- projection.getExpression().accept(this, freeVars);
- }
- return null;
+ return projection.hasExpression() ?
projection.getExpression().accept(this, freeVars) : null;
}
@Override
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 90e7448..27c3952 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
@@ -131,11 +131,18 @@ public class SqlppAstPrintVisitor extends
QueryPrintVisitor implements ISqlppVis
@Override
public Void visit(Projection projection, Integer step) throws
CompilationException {
- if (projection.star()) {
- out.println(skip(step) + "*");
- } else {
- projection.getExpression().accept(this, step);
- out.println(skip(step) + (projection.varStar() ? ".*" :
projection.getName()));
+ switch (projection.getKind()) {
+ case STAR:
+ out.println(skip(step) + "*");
+ break;
+ case VAR_STAR:
+ projection.getExpression().accept(this, step);
+ out.println(skip(step) + ".*");
+ break;
+ case NAMED_EXPR:
+ projection.getExpression().accept(this, step);
+ out.println(skip(step) + projection.getName());
+ break;
}
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 bd64314..e664d49 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
@@ -202,11 +202,9 @@ public class SqlppCloneAndSubstituteVariablesVisitor
extends CloneAndSubstituteV
@Override
public Pair<ILangExpression, VariableSubstitutionEnvironment>
visit(Projection projection,
VariableSubstitutionEnvironment env) throws CompilationException {
- if (projection.star()) {
- return new Pair<>(projection, env);
- }
- Projection newProjection = new Projection((Expression)
projection.getExpression().accept(this, env).first,
- projection.getName(), projection.star(), projection.varStar());
+ Projection newProjection = new Projection(projection.getKind(),
+ projection.hasExpression() ? (Expression)
projection.getExpression().accept(this, env).first : null,
+ projection.getName());
newProjection.setSourceLocation(projection.getSourceLocation());
return new Pair<>(newProjection, env);
}
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 395e916..34ca727 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
@@ -123,18 +123,21 @@ public class SqlppFormatPrintVisitor extends
FormatPrintVisitor implements ISqlp
@Override
public Void visit(Projection projection, Integer step) throws
CompilationException {
- if (projection.star()) {
- out.print(" * ");
- return null;
- }
- projection.getExpression().accept(this, step);
- if (projection.varStar()) {
- out.print(".* ");
- } else {
- String name = projection.getName();
- if (name != null) {
- out.print(" as " + name);
- }
+ switch (projection.getKind()) {
+ case STAR:
+ out.print(" * ");
+ break;
+ case VAR_STAR:
+ projection.getExpression().accept(this, step);
+ out.print(".* ");
+ break;
+ case NAMED_EXPR:
+ projection.getExpression().accept(this, step);
+ String name = projection.getName();
+ if (name != null) {
+ out.print(" as " + name);
+ }
+ break;
}
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 e331173..ef8b43c 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
@@ -113,7 +113,7 @@ public class AbstractSqlppSimpleExpressionVisitor
@Override
public Expression visit(Projection projection, ILangExpression arg) throws
CompilationException {
- if (!projection.star()) {
+ if (projection.hasExpression()) {
projection.setExpression(visit(projection.getExpression(), 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 e94ad6b..735cae5 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
+++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
@@ -4507,7 +4507,7 @@ SelectClause SelectClause() throws ParseException:
{
SourceLocation sourceLoc = getSourceLocation(startToken);
if (selectRegular == null && selectElement == null){
- Projection projection = new Projection(null, null, true, false);
+ Projection projection = new Projection(Projection.Kind.STAR, null,
null);
projection.setSourceLocation(sourceLoc);
List<Projection> projections = new ArrayList<Projection>();
projections.add(projection);
@@ -4564,15 +4564,17 @@ Projection Projection() throws ParseException :
Expression expr = null;
Identifier identifier = null;
String name = null;
+ Projection.Kind kind = null;
boolean star = false;
boolean varStar = false;
}
{
(
- <MUL> { star = true; startSrcLoc = getSourceLocation(token); }
- | LOOKAHEAD(3) expr = VariableRef() <DOT> <MUL> { varStar = true; }
+ <MUL> { kind = Projection.Kind.STAR; startSrcLoc =
getSourceLocation(token); }
+ | LOOKAHEAD(3) expr = VariableRef() <DOT> <MUL> { kind =
Projection.Kind.VAR_STAR; }
| expr = Expression() ((<AS>)? name = Identifier())?
{
+ kind = Projection.Kind.NAMED_EXPR;
if (name == null) {
String generatedColumnIdentifier =
ExpressionToVariableUtil.getGeneratedIdentifier(expr, false);
if (generatedColumnIdentifier != null) {
@@ -4582,7 +4584,7 @@ Projection Projection() throws ParseException :
}
)
{
- Projection projection = new Projection(expr, name, star, varStar);
+ Projection projection = new Projection(kind, expr, name);
projection.setSourceLocation(expr != null ? expr.getSourceLocation() :
startSrcLoc);
return projection;
}