This is an automated email from the ASF dual-hosted git repository.
wyk 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 961f05dd4e [ASTERIXDB-3287][SQL++] Allow PATH to have multiple
expressions
961f05dd4e is described below
commit 961f05dd4e8ed44fa281e87aefc76870163d2b41
Author: Wail Alkowaileet <[email protected]>
AuthorDate: Tue Oct 31 07:10:34 2023 -0700
[ASTERIXDB-3287][SQL++] Allow PATH to have multiple expressions
- user model changes: yes
- storage format changes: no
- interface changes: no
Details:
- Allow users to sepcify multiple expressions in the
PATH clause in COPY TO
- The result of the multiple expressions will be
concatenated by a sperator char
Change-Id: I62a4616a4fc12bdb57fe5a673efff0aa87dbdc46
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17892
Integration-Tests: Jenkins <[email protected]>
Reviewed-by: Wail Alkowaileet <[email protected]>
Reviewed-by: Murtadha Hubail <[email protected]>
Tested-by: Wail Alkowaileet <[email protected]>
---
.../lang/common/statement/CopyToStatement.java | 30 ++++++++++------
.../common/visitor/AbstractInlineUdfsVisitor.java | 4 +--
.../lang/common/visitor/FormatPrintVisitor.java | 2 +-
.../common/visitor/GatherFunctionCallsVisitor.java | 2 +-
.../lang/sqlpp/visitor/CheckSubqueryVisitor.java | 2 +-
.../lang/sqlpp/visitor/FreeVariableVisitor.java | 2 +-
.../AbstractSqlppContainsExpressionVisitor.java | 2 +-
.../AbstractSqlppExpressionScopingVisitor.java | 4 +--
.../base/AbstractSqlppSimpleExpressionVisitor.java | 2 +-
.../asterix-lang-sqlpp/src/main/javacc/SQLPP.jj | 42 +++++++++++-----------
10 files changed, 51 insertions(+), 41 deletions(-)
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CopyToStatement.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CopyToStatement.java
index 52e357014d..5f13960235 100644
---
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CopyToStatement.java
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CopyToStatement.java
@@ -30,7 +30,9 @@ import org.apache.asterix.lang.common.base.AbstractStatement;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.IReturningStatement;
import org.apache.asterix.lang.common.clause.OrderbyClause;
+import org.apache.asterix.lang.common.expression.LiteralExpr;
import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.literal.StringLiteral;
import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
public class CopyToStatement extends AbstractStatement implements
IReturningStatement {
@@ -43,29 +45,34 @@ public class CopyToStatement extends AbstractStatement
implements IReturningStat
private final List<OrderbyClause.NullOrderModifier>
orderbyNullModifierList;
private Query query;
- private Expression pathExpression;
+ private List<Expression> pathExpressions;
private List<Expression> partitionExpressions;
private List<Expression> orderbyList;
private int varCounter;
public CopyToStatement(Namespace namespace, String datasetName, Query
query, VariableExpr sourceVariable,
- ExternalDetailsDecl externalDetailsDecl, Expression
pathExpression, List<Expression> partitionExpressions,
- Map<Integer, VariableExpr> partitionsVariables, List<Expression>
orderbyList,
- List<OrderbyClause.OrderModifier> orderbyModifiers,
+ ExternalDetailsDecl externalDetailsDecl, List<Expression>
pathExpressions,
+ List<Expression> partitionExpressions, Map<Integer, VariableExpr>
partitionsVariables,
+ List<Expression> orderbyList, List<OrderbyClause.OrderModifier>
orderbyModifiers,
List<OrderbyClause.NullOrderModifier> orderbyNullModifierList, int
varCounter) {
this.namespace = namespace;
this.datasetName = datasetName;
this.query = query;
this.sourceVariable = sourceVariable;
this.externalDetailsDecl = externalDetailsDecl;
- this.pathExpression = pathExpression;
+ this.pathExpressions = pathExpressions;
this.partitionExpressions = partitionExpressions;
this.partitionsVariables = partitionsVariables;
this.orderbyList = orderbyList;
this.orderbyModifiers = orderbyModifiers;
this.orderbyNullModifierList = orderbyNullModifierList;
this.varCounter = varCounter;
+
+ if (pathExpressions.isEmpty()) {
+ // Ensure path expressions to have at least an empty string
+ pathExpressions.add(new LiteralExpr(new StringLiteral("")));
+ }
}
@Override
@@ -107,12 +114,15 @@ public class CopyToStatement extends AbstractStatement
implements IReturningStat
return externalDetailsDecl;
}
- public Expression getPathExpression() {
- return pathExpression;
+ public List<Expression> getPathExpressions() {
+ return pathExpressions;
}
- public void setPathExpression(Expression pathExpression) {
- this.pathExpression = pathExpression;
+ public void setPathExpressions(List<Expression> pathExpressions) {
+ if (pathExpressions.isEmpty()) {
+ pathExpressions.add(new LiteralExpr(new StringLiteral("")));
+ }
+ this.pathExpressions = pathExpressions;
}
public List<Expression> getPartitionExpressions() {
@@ -170,7 +180,7 @@ public class CopyToStatement extends AbstractStatement
implements IReturningStat
public List<Expression> getDirectlyEnclosedExpressions() {
List<Expression> topLevelExpressions = new ArrayList<>();
topLevelExpressions.add(query.getBody());
- topLevelExpressions.add(pathExpression);
+ topLevelExpressions.addAll(pathExpressions);
topLevelExpressions.addAll(partitionExpressions);
topLevelExpressions.addAll(orderbyList);
return topLevelExpressions;
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 d91873cf52..22c011a6d0 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
@@ -290,9 +290,9 @@ public abstract class AbstractInlineUdfsVisitor extends
AbstractQueryExpressionV
changed |= queryBody.first;
stmtCopy.setBody(queryBody.second);
- Pair<Boolean, Expression> path =
inlineUdfsAndViewsInExpr(stmtCopy.getPathExpression());
+ Pair<Boolean, List<Expression>> path =
inlineUdfsInExprList(stmtCopy.getPathExpressions());
changed |= path.first;
- stmtCopy.setPathExpression(path.second);
+ stmtCopy.setPathExpressions(path.second);
Pair<Boolean, List<Expression>> part =
inlineUdfsInExprList(stmtCopy.getPartitionExpressions());
changed |= part.first;
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
index 7ac996717d..9c904dab88 100644
---
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
@@ -574,7 +574,7 @@ public abstract class FormatPrintVisitor implements
ILangVisitor<Void, Integer>
out.println();
out.print("path (");
- cto.getPathExpression().accept(this, step + 1);
+ printDelimitedExpressions(cto.getPathExpressions(), COMMA, step + 1);
out.print(")");
out.println();
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 4ea7789df9..33734950f4 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
@@ -252,7 +252,7 @@ public abstract class GatherFunctionCallsVisitor extends
AbstractQueryExpression
@Override
public Void visit(CopyToStatement stmtCopy, Void arg) throws
CompilationException {
stmtCopy.getQuery().accept(this, arg);
- stmtCopy.getPathExpression().accept(this, arg);
+ acceptList(stmtCopy.getPathExpressions(), arg);
acceptList(stmtCopy.getPartitionExpressions(), arg);
acceptList(stmtCopy.getOrderbyList(), arg);
return null;
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 387b7f7dbe..abae3ee428 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
@@ -315,7 +315,7 @@ public class CheckSubqueryVisitor extends
AbstractSqlppQueryExpressionVisitor<Bo
@Override
public Boolean visit(CopyToStatement stmtCopy, ILangExpression arg) throws
CompilationException {
- return stmtCopy.getQuery().accept(this, arg) ||
stmtCopy.getPathExpression().accept(this, arg)
+ return stmtCopy.getQuery().accept(this, arg) ||
visitExprList(stmtCopy.getPathExpressions(), arg)
|| visitExprList(stmtCopy.getPartitionExpressions(), arg)
|| visitExprList(stmtCopy.getOrderbyList(), 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 c1c124a273..45fd4bf5ea 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
@@ -516,7 +516,7 @@ public class FreeVariableVisitor extends
AbstractSqlppQueryExpressionVisitor<Voi
@Override
public Void visit(CopyToStatement stmtCopy, Collection<VariableExpr>
freeVars) throws CompilationException {
stmtCopy.getBody().accept(this, freeVars);
- stmtCopy.getPathExpression().accept(this, freeVars);
+ visit(stmtCopy.getPathExpressions(), freeVars);
visit(stmtCopy.getPartitionExpressions(), freeVars);
visit(stmtCopy.getOrderbyList(), freeVars);
return null;
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppContainsExpressionVisitor.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppContainsExpressionVisitor.java
index 368cf1d02c..39fe905a11 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppContainsExpressionVisitor.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppContainsExpressionVisitor.java
@@ -310,7 +310,7 @@ public abstract class
AbstractSqlppContainsExpressionVisitor<T>
@Override
public Boolean visit(CopyToStatement stmtCopy, T arg) throws
CompilationException {
- return stmtCopy.getQuery().accept(this, arg) ||
stmtCopy.getPathExpression().accept(this, arg)
+ return stmtCopy.accept(this, arg) ||
visitExprList(stmtCopy.getPathExpressions(), arg)
|| visitExprList(stmtCopy.getPartitionExpressions(), arg)
|| visitExprList(stmtCopy.getOrderbyList(), arg);
}
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 f2519f1822..1ecc3a221b 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
@@ -434,8 +434,8 @@ public class AbstractSqlppExpressionScopingVisitor extends
AbstractSqlppSimpleEx
// Visit order by
stmtCopy.setOrderbyList(visit(stmtCopy.getOrderbyList(), stmtCopy));
- // Visit path expr
- stmtCopy.setPathExpression(stmtCopy.getPathExpression().accept(this,
stmtCopy));
+ // Visit path exprs
+ stmtCopy.setPathExpressions(visit(stmtCopy.getPathExpressions(),
stmtCopy));
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 16fe67a8dd..9b2501d2a2 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
@@ -361,7 +361,7 @@ public class AbstractSqlppSimpleExpressionVisitor
@Override
public Expression visit(CopyToStatement stmtCopy, ILangExpression arg)
throws CompilationException {
stmtCopy.setBody(stmtCopy.getBody().accept(this, arg));
- stmtCopy.setPathExpression(stmtCopy.getPathExpression().accept(this,
arg));
+ stmtCopy.setPathExpressions(visit(stmtCopy.getPathExpressions(), arg));
stmtCopy.setPartitionExpressions(visit(stmtCopy.getPartitionExpressions(),
arg));
stmtCopy.setOrderbyList(visit(stmtCopy.getOrderbyList(), 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 f2dc18edc1..a665015647 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
+++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
@@ -2860,24 +2860,24 @@ Statement SetStatement() throws ParseException:
Statement CopyStatement() throws ParseException:
{
- Token startToken = null;
- Pair<Namespace,Identifier> nameComponents = null;
- Query query = null;
- Statement stmt = null;
- TypeExpression typeExpr = null;
- VariableExpr alias = null;
-}
-{
- <COPY>
- ( LOOKAHEAD(1) <INTO> { startToken = token; } nameComponents =
QualifiedName() stmt = CopyFromStatement(startToken, nameComponents, typeExpr)
- | LOOKAHEAD(1) <LEFTPAREN> { startToken = token; } query = Query()
<RIGHTPAREN> (<AS>)? alias = Variable() stmt = CopyToStatement(startToken,
nameComponents, query, alias)
- | { startToken = token; } nameComponents = QualifiedName()
- (<AS>)? (typeExpr =
DatasetTypeSpecification(RecordTypeDefinition.RecordKind.OPEN) | alias =
Variable())?
- (stmt = CopyFromStatement(startToken, nameComponents, typeExpr) | stmt
= CopyToStatement(startToken, nameComponents, query, alias))
- )
- {
- return stmt;
- }
+ Token startToken = null;
+ Pair<Namespace,Identifier> nameComponents = null;
+ Query query = null;
+ Statement stmt = null;
+ TypeExpression typeExpr = null;
+ VariableExpr alias = null;
+}
+{
+ <COPY>
+ ( LOOKAHEAD(1) <INTO> { startToken = token; } nameComponents =
QualifiedName() stmt = CopyFromStatement(startToken, nameComponents, typeExpr)
+ | LOOKAHEAD(1) <LEFTPAREN> { startToken = token; } query = Query()
<RIGHTPAREN> (<AS>)? alias = Variable() stmt = CopyToStatement(startToken,
nameComponents, query, alias)
+ | { startToken = token; } nameComponents = QualifiedName()
+ (<AS>)? (typeExpr =
DatasetTypeSpecification(RecordTypeDefinition.RecordKind.OPEN) | alias =
Variable())?
+ (stmt = CopyFromStatement(startToken, nameComponents, typeExpr) | stmt =
CopyToStatement(startToken, nameComponents, query, alias))
+ )
+ {
+ return stmt;
+ }
}
CopyFromStatement CopyFromStatement(Token startToken, Pair<Namespace,
Identifier> nameComponents, TypeExpression typeExpr) throws ParseException:
@@ -2913,7 +2913,7 @@ CopyToStatement CopyToStatement(Token startToken,
Pair<Namespace, Identifier> na
RecordConstructor withRecord;
Namespace namespace = nameComponents == null ? null : nameComponents.first;
String datasetName = nameComponents == null ? null :
nameComponents.second.getValue();
- Expression pathExpr = null;
+ List<Expression> pathExprs;
List<Expression> partitionExprs = new ArrayList<Expression>();
Map<Integer, VariableExpr> partitionVarExprs = new HashMap<Integer,
VariableExpr>();
@@ -2923,7 +2923,7 @@ CopyToStatement CopyToStatement(Token startToken,
Pair<Namespace, Identifier> na
}
{
<TO> adapterName = AdapterName()
- <PATH> <LEFTPAREN> pathExpr = Expression() <RIGHTPAREN>
+ <PATH> <LEFTPAREN> pathExprs = ExpressionList() <RIGHTPAREN>
(CopyToOverClause(partitionExprs, partitionVarExprs, orderbyList,
orderbyModifierList, orderbyNullModifierList))?
<WITH> withRecord = RecordConstructor()
{
@@ -2939,7 +2939,7 @@ CopyToStatement CopyToStatement(Token startToken,
Pair<Namespace, Identifier> na
usedAlias = new
VariableExpr(SqlppVariableUtil.toInternalVariableIdentifier(datasetName));
}
- CopyToStatement stmt = new CopyToStatement(namespace, datasetName,
query, usedAlias, edd, pathExpr,
+ CopyToStatement stmt = new CopyToStatement(namespace, datasetName,
query, usedAlias, edd, pathExprs,
partitionExprs, partitionVarExprs, orderbyList,
orderbyModifierList, orderbyNullModifierList, getVarCounter());
return addSourceLocation(stmt, startToken);
}