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);
     }

Reply via email to