abdullah alamoudi has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/1642

Change subject: Ensure Metadata locks are acquired for SqlPP queries
......................................................................

Ensure Metadata locks are acquired for SqlPP queries

Change-Id: I5f468599897a37cbcb12d8577d072f340f0d949c
---
M 
asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
M 
asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/statement/SubscribeFeedStatement.java
M 
asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AqlDeleteRewriteVisitor.java
M asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/parser/ScopeChecker.java
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/CloneAndSubstituteVariablesVisitor.java
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/FromTerm.java
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SetOperationVisitor.java
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppRewriteUtil.java
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/DeepCopyVisitor.java
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppCloneAndSubstituteVariablesVisitor.java
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java
M asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataLockManager.java
19 files changed, 208 insertions(+), 217 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/42/1642/1

diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index 4ed8510..e220677 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -1199,8 +1199,8 @@
                             
MetadataManager.INSTANCE.getDatasetIndexes(mdTxnCtx, dataverseName, 
datasetName);
                     for (int k = 0; k < indexes.size(); k++) {
                         if (indexes.get(k).isSecondaryIndex()) {
-                            
jobsToExecute.add(IndexUtil.buildDropIndexJobSpec(indexes.get(k), 
metadataProvider,
-                                    datasets.get(j)));
+                            jobsToExecute.add(
+                                    
IndexUtil.buildDropIndexJobSpec(indexes.get(k), metadataProvider, 
datasets.get(j)));
                         }
                     }
                     Index primaryIndex =
@@ -1215,8 +1215,8 @@
                             
jobsToExecute.add(ExternalIndexingOperations.buildDropFilesIndexJobSpec(metadataProvider,
                                     datasets.get(j)));
                         } else {
-                            
jobsToExecute.add(IndexUtil.buildDropIndexJobSpec(indexes.get(k), 
metadataProvider,
-                                    datasets.get(j)));
+                            jobsToExecute.add(
+                                    
IndexUtil.buildDropIndexJobSpec(indexes.get(k), metadataProvider, 
datasets.get(j)));
                         }
                     }
                     
ExternalDatasetsRegistry.INSTANCE.removeDatasetInfo(datasets.get(j));
@@ -1708,20 +1708,19 @@
         InsertStatement stmtInsertUpsert = (InsertStatement) stmt;
         String dataverseName = 
getActiveDataverse(stmtInsertUpsert.getDataverseName());
         Query query = stmtInsertUpsert.getQuery();
+        List<String> dataverses = new ArrayList<>();
 
         final IMetadataLocker locker = new IMetadataLocker() {
             @Override
             public void lock() {
-                
MetadataLockManager.INSTANCE.insertDeleteUpsertBegin(dataverseName,
-                        dataverseName + "." + 
stmtInsertUpsert.getDatasetName(), query.getDataverses(),
-                        query.getDatasets());
+                
MetadataLockManager.INSTANCE.insertDeleteUpsertBegin(activeDataverse.getDataverseName(),
+                        dataverseName + "." + 
stmtInsertUpsert.getDatasetName(), dataverses, query.getDatasets());
             }
 
             @Override
             public void unlock() {
-                
MetadataLockManager.INSTANCE.insertDeleteUpsertEnd(dataverseName,
-                        dataverseName + "." + 
stmtInsertUpsert.getDatasetName(), query.getDataverses(),
-                        query.getDatasets());
+                MetadataLockManager.INSTANCE.insertDeleteUpsertEnd(
+                        dataverseName + "." + 
stmtInsertUpsert.getDatasetName(), dataverses, query.getDatasets());
             }
         };
         final IStatementCompiler compiler = () -> {
@@ -1770,9 +1769,9 @@
         MetadataTransactionContext mdTxnCtx = 
MetadataManager.INSTANCE.beginTransaction();
         boolean bActiveTxn = true;
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
-        MetadataLockManager.INSTANCE.insertDeleteUpsertBegin(dataverseName,
-                dataverseName + "." + stmtDelete.getDatasetName(), 
stmtDelete.getDataverses(),
-                stmtDelete.getDatasets());
+        List<String> dataverses = new ArrayList<>();
+        
MetadataLockManager.INSTANCE.insertDeleteUpsertBegin(activeDataverse.getDataverseName(),
+                dataverseName + "." + stmtDelete.getDatasetName(), dataverses, 
stmtDelete.getDatasets());
 
         try {
             metadataProvider.setWriteTransaction(true);
@@ -1788,16 +1787,14 @@
                 JobUtils.runJob(hcc, jobSpec, true);
             }
             return jobSpec;
-
         } catch (Exception e) {
             if (bActiveTxn) {
                 abort(e, e, mdTxnCtx);
             }
             throw e;
         } finally {
-            MetadataLockManager.INSTANCE.insertDeleteUpsertEnd(dataverseName,
-                    dataverseName + "." + stmtDelete.getDatasetName(), 
stmtDelete.getDataverses(),
-                    stmtDelete.getDatasets());
+            MetadataLockManager.INSTANCE.insertDeleteUpsertEnd(dataverseName + 
"." + stmtDelete.getDatasetName(),
+                    dataverses, stmtDelete.getDatasets());
         }
     }
 
@@ -2267,15 +2264,17 @@
     protected void handleQuery(MetadataProvider metadataProvider, Query query, 
IHyracksClientConnection hcc,
             IHyracksDataset hdc, ResultDelivery resultDelivery, Stats stats, 
String clientContextId,
             IStatementExecutorContext ctx) throws Exception {
+        List<String> dataverses = new ArrayList<>();
         final IMetadataLocker locker = new IMetadataLocker() {
             @Override
             public void lock() {
-                MetadataLockManager.INSTANCE.queryBegin(activeDataverse, 
query.getDataverses(), query.getDatasets());
+                
MetadataLockManager.INSTANCE.queryBegin(activeDataverse.getDataverseName(), 
dataverses,
+                        query.getDatasets());
             }
 
             @Override
             public void unlock() {
-                MetadataLockManager.INSTANCE.queryEnd(query.getDataverses(), 
query.getDatasets());
+                MetadataLockManager.INSTANCE.queryEnd(dataverses, 
query.getDatasets());
                 // release external datasets' locks acquired during 
compilation of the query
                 
ExternalDatasetsRegistry.INSTANCE.releaseAcquiredLocks(metadataProvider);
             }
@@ -2676,15 +2675,20 @@
         String dataverseNameTo = 
getActiveDataverse(pregelixStmt.getDataverseNameTo());
         String datasetNameFrom = pregelixStmt.getDatasetNameFrom().getValue();
         String datasetNameTo = pregelixStmt.getDatasetNameTo().getValue();
+        List<String> readDataverses = new ArrayList<>();
+        List<String> readDatasets = new ArrayList<>();
+        if (!DatasetUtil.isFullyQualifiedName(datasetNameFrom)) {
+            readDatasets.add(dataverseNameFrom + '.' + datasetNameFrom);
+        } else {
+            readDatasets.add(datasetNameFrom);
+        }
+        String fullyQualifiedDatasetNameTo =
+                DatasetUtil.isFullyQualifiedName(datasetNameTo) ? 
datasetNameTo : dataverseNameTo + '.' + datasetNameTo;
 
         MetadataTransactionContext mdTxnCtx = 
MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
-        List<String> readDataverses = new ArrayList<>();
-        readDataverses.add(dataverseNameFrom);
-        List<String> readDatasets = new ArrayList<>();
-        readDatasets.add(datasetNameFrom);
-        MetadataLockManager.INSTANCE.insertDeleteUpsertBegin(dataverseNameTo, 
datasetNameTo, readDataverses,
-                readDatasets);
+        
MetadataLockManager.INSTANCE.insertDeleteUpsertBegin(activeDataverse.getDataverseName(),
+                fullyQualifiedDatasetNameTo, readDataverses, readDatasets);
         try {
             prepareRunExternalRuntime(metadataProvider, hcc, pregelixStmt, 
dataverseNameFrom, dataverseNameTo,
                     datasetNameFrom, datasetNameTo, mdTxnCtx);
@@ -2729,7 +2733,7 @@
             }
             throw e;
         } finally {
-            
MetadataLockManager.INSTANCE.insertDeleteUpsertEnd(dataverseNameTo, 
datasetNameTo, readDataverses,
+            
MetadataLockManager.INSTANCE.insertDeleteUpsertEnd(fullyQualifiedDatasetNameTo, 
readDataverses,
                     readDatasets);
         }
     }
diff --git 
a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/statement/SubscribeFeedStatement.java
 
b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/statement/SubscribeFeedStatement.java
index 5150db3..8ca7467 100644
--- 
a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/statement/SubscribeFeedStatement.java
+++ 
b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/statement/SubscribeFeedStatement.java
@@ -41,10 +41,8 @@
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.MetadataTransactionContext;
 import org.apache.asterix.metadata.entities.Feed;
-import org.apache.asterix.metadata.entities.FeedConnection;
 import org.apache.asterix.metadata.entities.Function;
 import org.apache.asterix.metadata.feeds.FeedMetadataUtil;
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 
 /**
  * Represents the AQL statement for subscribing to a feed.
@@ -68,11 +66,11 @@
     }
 
     public void initialize(MetadataTransactionContext mdTxnCtx) throws 
MetadataException {
-        this.query = new Query(false);
+        this.query = new Query(false, null);
         EntityId sourceFeedId = connectionRequest.getReceivingFeedId();
-        Feed subscriberFeed = MetadataManager.INSTANCE.getFeed(mdTxnCtx,
-                connectionRequest.getReceivingFeedId().getDataverse(),
-                connectionRequest.getReceivingFeedId().getEntityName());
+        Feed subscriberFeed =
+                MetadataManager.INSTANCE.getFeed(mdTxnCtx, 
connectionRequest.getReceivingFeedId().getDataverse(),
+                        
connectionRequest.getReceivingFeedId().getEntityName());
         if (subscriberFeed == null) {
             throw new IllegalStateException(" Subscriber feed " + 
subscriberFeed + " not found.");
         }
diff --git 
a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AqlDeleteRewriteVisitor.java
 
b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AqlDeleteRewriteVisitor.java
index 9268422..2e5953f 100644
--- 
a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AqlDeleteRewriteVisitor.java
+++ 
b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AqlDeleteRewriteVisitor.java
@@ -41,17 +41,17 @@
 
     @Override
     public Void visit(DeleteStatement deleteStmt, Void visitArg) {
-        List<Expression> arguments = new ArrayList<Expression>();
+        List<Expression> arguments = new ArrayList<>();
         Identifier dataverseName = deleteStmt.getDataverseName();
         Identifier datasetName = deleteStmt.getDatasetName();
         String arg = dataverseName == null ? datasetName.getValue()
                 : dataverseName.getValue() + "." + datasetName.getValue();
         LiteralExpr argumentLiteral = new LiteralExpr(new StringLiteral(arg));
         arguments.add(argumentLiteral);
-        CallExpr callExpression = new CallExpr(new 
FunctionSignature(FunctionConstants.ASTERIX_NS, "dataset", 1),
-                arguments);
+        CallExpr callExpression =
+                new CallExpr(new 
FunctionSignature(FunctionConstants.ASTERIX_NS, "dataset", 1), arguments);
 
-        List<Clause> clauseList = new ArrayList<Clause>();
+        List<Clause> clauseList = new ArrayList<>();
         VariableExpr var = deleteStmt.getVariableExpr();
         Clause forClause = new ForClause(var, callExpression);
         clauseList.add(forClause);
@@ -64,7 +64,7 @@
         VariableExpr returnExpr = new VariableExpr(var.getVar());
         returnExpr.setIsNewVar(false);
         FLWOGRExpression flowgr = new FLWOGRExpression(clauseList, returnExpr);
-        Query query = new Query(false);
+        Query query = new Query(false, null);
         query.setBody(flowgr);
         deleteStmt.setQuery(query);
         return null;
diff --git a/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj 
b/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj
index 8d842e3..acc3ac4 100644
--- a/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj
+++ b/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj
@@ -1004,10 +1004,6 @@
   VariableExpr var = null;
   Expression condition = null;
   Pair<Identifier, Identifier> nameComponents;
-  // This is related to the new metadata lock management
-  setDataverses(new ArrayList<String>());
-  setDatasets(new ArrayList<String>());
-
 }
 {
   <DELETE> var = Variable()
@@ -1018,13 +1014,9 @@
   (<WHERE> condition = Expression())?
     {
       // First we get the dataverses and datasets that we want to lock
-      List<String> dataverses = getDataverses();
       List<String> datasets = getDatasets();
-      // we remove the pointer to the dataverses and datasets
-      setDataverses(null);
-      setDatasets(null);
       return new DeleteStatement(var, nameComponents.first, 
nameComponents.second,
-          condition, getVarCounter(), dataverses, datasets);
+          condition, getVarCounter(), datasets);
     }
 }
 
@@ -1609,10 +1601,7 @@
 
 Query Query() throws ParseException:
 {
-  Query query = new Query(false);
-  // we set the pointers to the dataverses and datasets lists to fill them 
with entities to be locked
-  setDataverses(query.getDataverses());
-  setDatasets(query.getDatasets());
+  Query query = new Query(false, getDatasets());
   Expression expr;
 }
 {
@@ -1620,9 +1609,6 @@
     {
       query.setBody(expr);
       query.setVarCounter(getVarCounter());
-      // we remove the pointers to the locked entities before we return the 
query object
-      setDataverses(null);
-      setDatasets(null);
       return query;
     }
 }
@@ -2272,7 +2258,6 @@
       ds.setValue( new StringLiteral(name) );
       nameArg = ds;
       if(arg2 != null){
-          addDataverse(arg1.toString());
           addDataset(name);
       } else {
           addDataset(defaultDataverse + "." + name);
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/parser/ScopeChecker.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/parser/ScopeChecker.java
index 1195d37..758e5e2 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/parser/ScopeChecker.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/parser/ScopeChecker.java
@@ -18,6 +18,7 @@
  */
 package org.apache.asterix.lang.common.parser;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Stack;
 
@@ -35,16 +36,15 @@
 
     protected Counter varCounter = new Counter(-1);
 
-    protected Stack<Scope> scopeStack = new Stack<Scope>();
+    protected Stack<Scope> scopeStack = new Stack<>();
 
-    protected Stack<Scope> forbiddenScopeStack = new Stack<Scope>();
+    protected Stack<Scope> forbiddenScopeStack = new Stack<>();
 
     protected String[] inputLines;
 
     protected String defaultDataverse;
 
-    private List<String> dataverses;
-    private List<String> datasets;
+    private final List<String> datasets = new ArrayList<>();
 
     public ScopeChecker() {
         scopeStack.push(RootScopeFactory.createRootScope(this));
@@ -324,28 +324,8 @@
         return extract.toString().trim();
     }
 
-    public void addDataverse(String dataverseName) {
-        if (dataverses != null) {
-            dataverses.add(dataverseName);
-        }
-    }
-
     public void addDataset(String datasetName) {
-        if (datasets != null) {
-            datasets.add(datasetName);
-        }
-    }
-
-    public void setDataverses(List<String> dataverses) {
-        this.dataverses = dataverses;
-    }
-
-    public void setDatasets(List<String> datasets) {
-        this.datasets = datasets;
-    }
-
-    public List<String> getDataverses() {
-        return dataverses;
+        datasets.add(datasetName);
     }
 
     public List<String> getDatasets() {
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
index 3bd309a..c8f3f1a 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
@@ -35,18 +35,16 @@
     private Identifier datasetName;
     private Expression condition;
     private int varCounter;
-    private List<String> dataverses;
     private List<String> datasets;
     private Query rewrittenQuery;
 
     public DeleteStatement(VariableExpr vars, Identifier dataverseName, 
Identifier datasetName, Expression condition,
-            int varCounter, List<String> dataverses, List<String> datasets) {
+            int varCounter, List<String> datasets) {
         this.vars = vars;
         this.dataverseName = dataverseName;
         this.datasetName = datasetName;
         this.condition = condition;
         this.varCounter = varCounter;
-        this.dataverses = dataverses;
         this.datasets = datasets;
     }
 
@@ -88,18 +86,13 @@
         return visitor.visit(this, arg);
     }
 
-    public List<String> getDataverses() {
-        return dataverses;
-    }
-
     public List<String> getDatasets() {
         return datasets;
     }
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(condition, datasetName, datasets, 
dataverseName, dataverses, rewrittenQuery,
-                vars);
+        return ObjectUtils.hashCodeMulti(condition, datasetName, datasets, 
dataverseName, rewrittenQuery, vars);
     }
 
     @Override
@@ -114,8 +107,8 @@
         boolean equals = ObjectUtils.equals(condition, target.condition)
                 && ObjectUtils.equals(datasetName, target.datasetName) && 
ObjectUtils.equals(datasets, target.datasets)
                 && ObjectUtils.equals(dataverseName, target.dataverseName);
-        return equals && ObjectUtils.equals(dataverses, target.dataverses)
-                && ObjectUtils.equals(rewrittenQuery, target.rewrittenQuery) 
&& ObjectUtils.equals(vars, target.vars);
+        return equals && ObjectUtils.equals(rewrittenQuery, 
target.rewrittenQuery)
+                && ObjectUtils.equals(vars, target.vars);
     }
 
     @Override
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java
index 2aee087..1eca358 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java
@@ -18,7 +18,6 @@
  */
 package org.apache.asterix.lang.common.statement;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -34,21 +33,19 @@
     private boolean topLevel = true;
     private Expression body;
     private int varCounter;
-    private List<String> dataverses = new ArrayList<>();
-    private List<String> datasets = new ArrayList<>();
+    private final List<String> datasets;
 
-    public Query(boolean explain) {
+    public Query(boolean explain, List<String> datasets) {
         this.explain = explain;
+        this.datasets = datasets;
     }
 
-    public Query(boolean explain, boolean topLevel, Expression body, int 
varCounter, List<String> dataverses,
-            List<String> datasets) {
+    public Query(boolean explain, boolean topLevel, Expression body, int 
varCounter, List<String> datasets) {
         this.explain = explain;
         this.topLevel = topLevel;
         this.body = body;
         this.varCounter = varCounter;
-        this.dataverses.addAll(dataverses);
-        this.datasets.addAll(datasets);
+        this.datasets = datasets;
     }
 
     @Override
@@ -99,25 +96,13 @@
         return visitor.visit(this, arg);
     }
 
-    public void setDataverses(List<String> dataverses) {
-        this.dataverses = dataverses;
-    }
-
-    public void setDatasets(List<String> datasets) {
-        this.datasets = datasets;
-    }
-
-    public List<String> getDataverses() {
-        return dataverses;
-    }
-
     public List<String> getDatasets() {
         return datasets;
     }
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(body, datasets, dataverses, topLevel, 
explain);
+        return ObjectUtils.hashCodeMulti(body, datasets, topLevel, explain);
     }
 
     @Override
@@ -130,8 +115,7 @@
         }
         Query target = (Query) object;
         return explain == target.explain && ObjectUtils.equals(body, 
target.body)
-                && ObjectUtils.equals(datasets, target.datasets) && 
ObjectUtils.equals(dataverses, target.dataverses)
-                && topLevel == target.topLevel;
+                && ObjectUtils.equals(datasets, target.datasets) && topLevel 
== target.topLevel;
     }
 
     @Override
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 858a8c2..bfa18d3 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
@@ -322,7 +322,7 @@
     }
 
     protected Expression rewriteFunctionBody(Expression expr) throws 
CompilationException {
-        Query wrappedQuery = new Query(false);
+        Query wrappedQuery = new Query(false, null);
         wrappedQuery.setBody(expr);
         wrappedQuery.setTopLevel(false);
         IQueryRewriter queryRewriter = rewriterFactory.createQueryRewriter();
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 9b419f1..d291e7d 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
@@ -102,7 +102,7 @@
         if (gc.hasGroupFieldList()) {
             for (Pair<Expression, Identifier> varId : gc.getGroupFieldList()) {
                 Expression newExpr = (Expression) varId.first.accept(this, 
env).first;
-                newGroupFieldList.add(new Pair<Expression, 
Identifier>(newExpr, varId.second));
+                newGroupFieldList.add(new Pair<>(newExpr, varId.second));
             }
         }
         GroupbyClause newGroup = new GroupbyClause(newGbyList, newDecorList, 
newWithMap, newGroupVar, newGroupFieldList,
@@ -235,7 +235,7 @@
     @Override
     public Pair<ILangExpression, VariableSubstitutionEnvironment> visit(Query 
q, VariableSubstitutionEnvironment env)
             throws CompilationException {
-        Query newQ = new Query(q.isExplain());
+        Query newQ = new Query(q.isExplain(), q.getDatasets());
         Pair<ILangExpression, VariableSubstitutionEnvironment> p1 = 
q.getBody().accept(this, env);
         newQ.setBody((Expression) p1.first);
         return new Pair<>(newQ, p1.second);
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/FromTerm.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/FromTerm.java
index e4390d9..ad513a4 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/FromTerm.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/FromTerm.java
@@ -25,8 +25,10 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Clause;
 import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.expression.FieldAccessor;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
 import org.apache.asterix.lang.sqlpp.visitor.base.ISqlppVisitor;
 import org.apache.commons.lang3.ObjectUtils;
 
@@ -37,13 +39,26 @@
     private List<AbstractBinaryCorrelateClause> correlateClauses = new 
ArrayList<>();
 
     public FromTerm(Expression leftExpr, VariableExpr leftVar, VariableExpr 
posVar,
-            List<AbstractBinaryCorrelateClause> correlateClauses) {
+            List<AbstractBinaryCorrelateClause> correlateClauses, List<String> 
datasets) {
         this.leftExpr = leftExpr;
         this.leftVar = leftVar;
         this.posVar = posVar;
         if (correlateClauses != null) {
             this.correlateClauses.addAll(correlateClauses);
         }
+        if (datasets != null) {
+            if (leftExpr instanceof FieldAccessor) {
+                FieldAccessor fa = (FieldAccessor) leftExpr;
+                if (fa.getExpr() instanceof VariableExpr) {
+                    VariableExpr var = (VariableExpr) fa.getExpr();
+                    
datasets.add(SqlppVariableUtil.toUserDefinedName(var.getVar().getValue()) + '.'
+                            + fa.getIdent().getValue());
+                }
+            } else if (leftExpr instanceof VariableExpr) {
+                VariableExpr var = (VariableExpr) leftExpr;
+                
datasets.add(SqlppVariableUtil.toUserDefinedName(var.getVar().getValue()));
+            }
+        }
     }
 
     @Override
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SetOperationVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SetOperationVisitor.java
index ddf3cd6..c7a28e4 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SetOperationVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SetOperationVisitor.java
@@ -84,7 +84,7 @@
         // Wraps the set operation part with a subquery.
         SelectExpression nestedSelectExpression = new SelectExpression(null, 
selectSetOperation, null, null, true);
         VariableExpr newBindingVar = new VariableExpr(context.newVariable()); 
// Binding variable for the subquery.
-        FromTerm newFromTerm = new FromTerm(nestedSelectExpression, 
newBindingVar, null, null);
+        FromTerm newFromTerm = new FromTerm(nestedSelectExpression, 
newBindingVar, null, null, null);
         FromClause newFromClause = new FromClause(new 
ArrayList<>(Collections.singletonList(newFromTerm)));
         SelectClause selectClause = new SelectClause(new 
SelectElement(newBindingVar), null, false);
         SelectBlock selectBlock = new SelectBlock(selectClause, newFromClause, 
null, null, null, null, null);
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java
index a1c17fc..a01b16e 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java
@@ -114,7 +114,7 @@
         Set<VariableExpr> freeVars = SqlppRewriteUtil.getFreeVariable(expr);
 
         VariableExpr fromBindingVar = new VariableExpr(context.newVariable());
-        FromTerm fromTerm = new FromTerm(groupVar, fromBindingVar, null, null);
+        FromTerm fromTerm = new FromTerm(groupVar, fromBindingVar, null, null, 
null);
         FromClause fromClause = new 
FromClause(Collections.singletonList(fromTerm));
 
         // Maps field variable expressions to field accesses.
@@ -123,15 +123,14 @@
             // Reference to a field in the group variable.
             if (fieldVars.contains(usedVar)) {
                 // Rewrites to a reference to a field in the group variable.
-                varExprMap.put(usedVar,
-                                new FieldAccessor(fromBindingVar, 
SqlppVariableUtil.toUserDefinedVariableName(usedVar
-                                        .getVar())));
+                varExprMap.put(usedVar, new FieldAccessor(fromBindingVar,
+                        
SqlppVariableUtil.toUserDefinedVariableName(usedVar.getVar())));
             }
         }
 
         // Select clause.
-        SelectElement selectElement = new SelectElement(
-                SqlppRewriteUtil.substituteExpression(expr, varExprMap, 
context));
+        SelectElement selectElement =
+                new SelectElement(SqlppRewriteUtil.substituteExpression(expr, 
varExprMap, context));
         SelectClause selectClause = new SelectClause(selectElement, null, 
false);
 
         // Construct the select expression.
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppRewriteUtil.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppRewriteUtil.java
index a066110..4b6a18a 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppRewriteUtil.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppRewriteUtil.java
@@ -42,8 +42,8 @@
 
     // Applying sugar rewriting for group-by.
     public static Expression rewriteExpressionUsingGroupVariable(VariableExpr 
groupVar,
-            Collection<VariableExpr> fieldVars, ILangExpression expr,
-            LangRewritingContext context) throws CompilationException {
+            Collection<VariableExpr> fieldVars, ILangExpression expr, 
LangRewritingContext context)
+            throws CompilationException {
         SqlppGroupBySugarVisitor visitor = new 
SqlppGroupBySugarVisitor(context, groupVar, fieldVars);
         return expr.accept(visitor, null);
     }
@@ -92,7 +92,7 @@
         }
         // Creates a wrapper query for the expression so that if the 
expression itself
         // is the key, it can also be replaced.
-        Query wrapper = new Query(false);
+        Query wrapper = new Query(false, null);
         wrapper.setBody(expression);
         // Creates a substitution visitor.
         SqlppSubstituteExpressionVisitor visitor = new 
SqlppSubstituteExpressionVisitor(context, exprMap);
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 7c2a174..afb86d7 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
@@ -95,7 +95,7 @@
         for (AbstractBinaryCorrelateClause correlateClause : 
fromTerm.getCorrelateClauses()) {
             correlateClauses.add((AbstractBinaryCorrelateClause) 
correlateClause.accept(this, arg));
         }
-        return new FromTerm(fromExpr, fromVar, positionVar, correlateClauses);
+        return new FromTerm(fromExpr, fromVar, positionVar, correlateClauses, 
null);
     }
 
     @Override
@@ -132,8 +132,7 @@
     @Override
     public Projection visit(Projection projection, Void arg) throws 
CompilationException {
         return new Projection(projection.star() ? null : (Expression) 
projection.getExpression().accept(this, arg),
-                projection.getName(),
-                projection.star(), projection.exprStar());
+                projection.getName(), projection.star(), 
projection.exprStar());
     }
 
     @Override
@@ -234,7 +233,7 @@
     @Override
     public Query visit(Query q, Void arg) throws CompilationException {
         return new Query(q.isExplain(), q.isTopLevel(), (Expression) 
q.getBody().accept(this, arg), q.getVarCounter(),
-                q.getDataverses(), q.getDatasets());
+                q.getDatasets());
     }
 
     @Override
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 9579741..08c1423 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
@@ -86,8 +86,8 @@
             VariableSubstitutionEnvironment env) throws CompilationException {
         VariableExpr leftVar = fromTerm.getLeftVariable();
         VariableExpr newLeftVar = generateNewVariable(context, leftVar);
-        VariableExpr newLeftPosVar = fromTerm.hasPositionalVariable() ? 
generateNewVariable(context,
-                fromTerm.getPositionalVariable()) : null;
+        VariableExpr newLeftPosVar = fromTerm.hasPositionalVariable()
+                ? generateNewVariable(context, 
fromTerm.getPositionalVariable()) : null;
         Expression newLeftExpr = (Expression) 
visitUnnesBindingExpression(fromTerm.getLeftExpression(), env).first;
         List<AbstractBinaryCorrelateClause> newCorrelateClauses = new 
ArrayList<>();
 
@@ -115,7 +115,7 @@
                 }
             }
         }
-        return new Pair<>(new FromTerm(newLeftExpr, newLeftVar, newLeftPosVar, 
newCorrelateClauses), currentEnv);
+        return new Pair<>(new FromTerm(newLeftExpr, newLeftVar, newLeftPosVar, 
newCorrelateClauses, null), currentEnv);
     }
 
     @Override
@@ -123,8 +123,8 @@
             VariableSubstitutionEnvironment env) throws CompilationException {
         VariableExpr rightVar = joinClause.getRightVariable();
         VariableExpr newRightVar = generateNewVariable(context, rightVar);
-        VariableExpr newRightPosVar = joinClause.hasPositionalVariable() ? 
generateNewVariable(context,
-                joinClause.getPositionalVariable()) : null;
+        VariableExpr newRightPosVar = joinClause.hasPositionalVariable()
+                ? generateNewVariable(context, 
joinClause.getPositionalVariable()) : null;
 
         // Visits the right expression.
         Expression newRightExpr = (Expression) 
visitUnnesBindingExpression(joinClause.getRightExpression(), env).first;
@@ -138,8 +138,8 @@
         // The condition can refer to the newRightVar and newRightPosVar.
         Expression conditionExpr = (Expression) 
joinClause.getConditionExpression().accept(this, currentEnv).first;
 
-        JoinClause newJoinClause = new JoinClause(joinClause.getJoinType(), 
newRightExpr, newRightVar, newRightPosVar,
-                conditionExpr);
+        JoinClause newJoinClause =
+                new JoinClause(joinClause.getJoinType(), newRightExpr, 
newRightVar, newRightPosVar, conditionExpr);
         return new Pair<>(newJoinClause, currentEnv);
     }
 
@@ -148,8 +148,8 @@
             VariableSubstitutionEnvironment env) throws CompilationException {
         VariableExpr rightVar = nestClause.getRightVariable();
         VariableExpr newRightVar = generateNewVariable(context, rightVar);
-        VariableExpr newRightPosVar = nestClause.hasPositionalVariable() ? 
generateNewVariable(context,
-                nestClause.getPositionalVariable()) : null;
+        VariableExpr newRightPosVar = nestClause.hasPositionalVariable()
+                ? generateNewVariable(context, 
nestClause.getPositionalVariable()) : null;
 
         // Visits the right expression.
         Expression rightExpr = (Expression) 
nestClause.getRightExpression().accept(this, env).first;
@@ -163,8 +163,8 @@
         // The condition can refer to the newRightVar and newRightPosVar.
         Expression conditionExpr = (Expression) 
nestClause.getConditionExpression().accept(this, currentEnv).first;
 
-        NestClause newJoinClause = new NestClause(nestClause.getJoinType(), 
rightExpr, newRightVar, newRightPosVar,
-                conditionExpr);
+        NestClause newJoinClause =
+                new NestClause(nestClause.getJoinType(), rightExpr, 
newRightVar, newRightPosVar, conditionExpr);
         return new Pair<>(newJoinClause, currentEnv);
     }
 
@@ -173,8 +173,8 @@
             VariableSubstitutionEnvironment env) throws CompilationException {
         VariableExpr rightVar = unnestClause.getRightVariable();
         VariableExpr newRightVar = generateNewVariable(context, rightVar);
-        VariableExpr newRightPosVar = unnestClause.hasPositionalVariable() ? 
generateNewVariable(context,
-                unnestClause.getPositionalVariable()) : null;
+        VariableExpr newRightPosVar = unnestClause.hasPositionalVariable()
+                ? generateNewVariable(context, 
unnestClause.getPositionalVariable()) : null;
 
         // Visits the right expression.
         Expression rightExpr = (Expression) 
visitUnnesBindingExpression(unnestClause.getRightExpression(), env).first;
@@ -186,8 +186,8 @@
             currentEnv.removeSubstitution(newRightPosVar);
         }
         // The condition can refer to the newRightVar and newRightPosVar.
-        UnnestClause newJoinClause = new 
UnnestClause(unnestClause.getJoinType(), rightExpr, newRightVar,
-                newRightPosVar);
+        UnnestClause newJoinClause =
+                new UnnestClause(unnestClause.getJoinType(), rightExpr, 
newRightVar, newRightPosVar);
         return new Pair<>(newJoinClause, currentEnv);
     }
 
@@ -265,13 +265,13 @@
             VariableSubstitutionEnvironment env) throws CompilationException {
         boolean distinct = selectClause.distinct();
         if (selectClause.selectElement()) {
-            Pair<ILangExpression, VariableSubstitutionEnvironment> 
newSelectElement = selectClause.getSelectElement()
-                    .accept(this, env);
+            Pair<ILangExpression, VariableSubstitutionEnvironment> 
newSelectElement =
+                    selectClause.getSelectElement().accept(this, env);
             return new Pair<>(new SelectClause((SelectElement) 
newSelectElement.first, null, distinct),
                     newSelectElement.second);
         } else {
-            Pair<ILangExpression, VariableSubstitutionEnvironment> 
newSelectRegular = selectClause.getSelectRegular()
-                    .accept(this, env);
+            Pair<ILangExpression, VariableSubstitutionEnvironment> 
newSelectRegular =
+                    selectClause.getSelectRegular().accept(this, env);
             return new Pair<>(new SelectClause(null, (SelectRegular) 
newSelectRegular.first, distinct),
                     newSelectRegular.second);
         }
@@ -280,8 +280,8 @@
     @Override
     public Pair<ILangExpression, VariableSubstitutionEnvironment> 
visit(SelectElement selectElement,
             VariableSubstitutionEnvironment env) throws CompilationException {
-        Pair<ILangExpression, VariableSubstitutionEnvironment> newExpr = 
selectElement.getExpression()
-                .accept(this, env);
+        Pair<ILangExpression, VariableSubstitutionEnvironment> newExpr =
+                selectElement.getExpression().accept(this, env);
         return new Pair<>(new SelectElement((Expression) newExpr.first), 
newExpr.second);
     }
 
@@ -318,12 +318,12 @@
                 SetOperationInput newRightInput;
                 SetOperationInput rightInput = 
right.getSetOperationRightInput();
                 if (rightInput.selectBlock()) {
-                    Pair<ILangExpression, VariableSubstitutionEnvironment> 
rightResult = rightInput.getSelectBlock()
-                            .accept(this, env);
+                    Pair<ILangExpression, VariableSubstitutionEnvironment> 
rightResult =
+                            rightInput.getSelectBlock().accept(this, env);
                     newRightInput = new SetOperationInput((SelectBlock) 
rightResult.first, null);
                 } else {
-                    Pair<ILangExpression, VariableSubstitutionEnvironment> 
rightResult = rightInput.getSubquery()
-                            .accept(this, env);
+                    Pair<ILangExpression, VariableSubstitutionEnvironment> 
rightResult =
+                            rightInput.getSubquery().accept(this, env);
                     newRightInput = new SetOperationInput(null, 
(SelectExpression) rightResult.first);
                 }
                 newRightInputs.add(new SetOperationRight(right.getSetOpType(), 
right.isSetSemantics(), newRightInput));
@@ -392,10 +392,10 @@
     public Pair<ILangExpression, VariableSubstitutionEnvironment> 
visit(CaseExpression caseExpr,
             VariableSubstitutionEnvironment env) throws CompilationException {
         Expression conditionExpr = (Expression) 
caseExpr.getConditionExpr().accept(this, env).first;
-        List<Expression> whenExprList = 
VariableCloneAndSubstitutionUtil.visitAndCloneExprList(caseExpr.getWhenExprs(),
-                env, this);
-        List<Expression> thenExprList = 
VariableCloneAndSubstitutionUtil.visitAndCloneExprList(caseExpr.getThenExprs(),
-                env, this);
+        List<Expression> whenExprList =
+                
VariableCloneAndSubstitutionUtil.visitAndCloneExprList(caseExpr.getWhenExprs(), 
env, this);
+        List<Expression> thenExprList =
+                
VariableCloneAndSubstitutionUtil.visitAndCloneExprList(caseExpr.getThenExprs(), 
env, this);
         Expression elseExpr = (Expression) caseExpr.getElseExpr().accept(this, 
env).first;
         CaseExpression newCaseExpr = new CaseExpression(conditionExpr, 
whenExprList, thenExprList, elseExpr);
         return new Pair<>(newCaseExpr, env);
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java
index 503437c..7730dc7 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java
@@ -58,12 +58,12 @@
                 : dataverseName.getValue() + "." + datasetName.getValue();
         LiteralExpr argumentLiteral = new LiteralExpr(new StringLiteral(arg));
         arguments.add(argumentLiteral);
-        CallExpr callExpression = new CallExpr(new 
FunctionSignature(FunctionConstants.ASTERIX_NS, "dataset", 1),
-                arguments);
+        CallExpr callExpression =
+                new CallExpr(new 
FunctionSignature(FunctionConstants.ASTERIX_NS, "dataset", 1), arguments);
 
         // From clause.
         VariableExpr var = deleteStmt.getVariableExpr();
-        FromTerm fromTerm = new FromTerm(callExpression, var, null, null);
+        FromTerm fromTerm = new FromTerm(callExpression, var, null, null, 
null);
         @SuppressWarnings("unchecked")
         FromClause fromClause = new 
FromClause(Collections.singletonList(fromTerm));
 
@@ -84,7 +84,7 @@
         SelectBlock selectBlock = new SelectBlock(selectClause, fromClause, 
null, whereClause, null, null, null);
         SelectSetOperation selectSetOperation = new SelectSetOperation(new 
SetOperationInput(selectBlock, null), null);
         SelectExpression selectExpression = new SelectExpression(null, 
selectSetOperation, null, null, false);
-        Query query = new Query(false, false, selectExpression, 0, new 
ArrayList<>(), new ArrayList<>());
+        Query query = new Query(false, false, selectExpression, 0, 
deleteStmt.getDatasets());
         query.setBody(selectExpression);
 
         // return the delete statement.
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj 
b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
index 71f96b9..fea60ad 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
+++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
@@ -1018,10 +1018,6 @@
   VariableExpr varExpr = null;
   Expression condition = null;
   Pair<Identifier, Identifier> nameComponents;
-  // This is related to the new metadata lock management
-  setDataverses(new ArrayList<String>());
-  setDatasets(new ArrayList<String>());
-
 }
 {
   <DELETE>
@@ -1029,20 +1025,15 @@
          ((<AS>)? varExpr = Variable())?
   (<WHERE> condition = Expression())?
   {
-      // First we get the dataverses and datasets that we want to lock
-      List<String> dataverses = getDataverses();
+      // First we get the datasets that we want to lock
       List<String> datasets = getDatasets();
-      // we remove the pointer to the dataverses and datasets
-      setDataverses(null);
-      setDatasets(null);
-
       if(varExpr == null){
         varExpr = new VariableExpr();
         VarIdentifier var = 
SqlppVariableUtil.toInternalVariableIdentifier(nameComponents.second.getValue());
         varExpr.setVar(var);
       }
       return new DeleteStatement(varExpr, nameComponents.first, 
nameComponents.second,
-          condition, getVarCounter(), dataverses, datasets);
+          condition, getVarCounter(), datasets);
   }
 }
 
@@ -1726,10 +1717,7 @@
 
 Query Query(boolean explain) throws ParseException:
 {
-  Query query = new Query(explain);
-  // we set the pointers to the dataverses and datasets lists to fill them 
with entities to be locked
-  setDataverses(query.getDataverses());
-  setDatasets(query.getDatasets());
+  Query query = new Query(explain, getDatasets());
   Expression expr;
 }
 {
@@ -1740,9 +1728,6 @@
   )
   {
     query.setBody(expr);
-    // we remove the pointers to the locked entities before we return the 
query object
-    setDataverses(null);
-    setDatasets(null);
     return query;
   }
 }
@@ -2812,7 +2797,7 @@
     if(leftVar==null){
         leftVar = ExpressionToVariableUtil.getGeneratedVariable(leftExpr, 
true);
     }
-    return new FromTerm(leftExpr, leftVar, posVar, correlateClauses);
+    return new FromTerm(leftExpr, leftVar, posVar, correlateClauses, 
getDatasets());
   }
 }
 
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
index 572cc75..ca56cc3 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
@@ -94,8 +94,8 @@
     private DatasetUtil() {
     }
 
-    public static IBinaryComparatorFactory[] 
computeKeysBinaryComparatorFactories(Dataset dataset,
-            ARecordType itemType, ARecordType metaItemType, 
IBinaryComparatorFactoryProvider comparatorFactoryProvider)
+    public static IBinaryComparatorFactory[] 
computeKeysBinaryComparatorFactories(Dataset dataset, ARecordType itemType,
+            ARecordType metaItemType, IBinaryComparatorFactoryProvider 
comparatorFactoryProvider)
             throws AlgebricksException {
         List<List<String>> partitioningKeys = getPartitioningKeys(dataset);
         IBinaryComparatorFactory[] bcfs = new 
IBinaryComparatorFactory[partitioningKeys.size()];
@@ -181,8 +181,7 @@
 
     public static List<List<String>> getPartitioningKeys(Dataset dataset) {
         if (dataset.getDatasetType() == DatasetType.EXTERNAL) {
-            return IndexingConstants
-                    .getRIDKeys(((ExternalDatasetDetails) 
dataset.getDatasetDetails()).getProperties());
+            return IndexingConstants.getRIDKeys(((ExternalDatasetDetails) 
dataset.getDatasetDetails()).getProperties());
         }
         return ((InternalDatasetDetails) 
dataset.getDatasetDetails()).getPartitioningKey();
     }
@@ -276,8 +275,7 @@
         String compactionPolicyFactoryClassName = 
compactionPolicy.getClassName();
         ILSMMergePolicyFactory mergePolicyFactory;
         try {
-            mergePolicyFactory =
-                    (ILSMMergePolicyFactory) 
Class.forName(compactionPolicyFactoryClassName).newInstance();
+            mergePolicyFactory = (ILSMMergePolicyFactory) 
Class.forName(compactionPolicyFactoryClassName).newInstance();
             if (mergePolicyFactory.getName().compareTo("correlated-prefix") == 
0) {
                 ((CorrelatedPrefixMergePolicyFactory) 
mergePolicyFactory).setDatasetID(dataset.getDatasetId());
             }
@@ -338,8 +336,8 @@
                 metadataProvider.getSplitProviderAndConstraints(dataset);
         Pair<ILSMMergePolicyFactory, Map<String, String>> compactionInfo =
                 DatasetUtil.getMergePolicyFactory(dataset, 
metadataProvider.getMetadataTxnContext());
-        IIndexDataflowHelperFactory indexDataflowHelperFactory = 
dataset.getIndexDataflowHelperFactory(
-                metadataProvider, primaryIndex, itemType, metaType, 
compactionInfo.first, compactionInfo.second);
+        IIndexDataflowHelperFactory indexDataflowHelperFactory = 
dataset.getIndexDataflowHelperFactory(metadataProvider,
+                primaryIndex, itemType, metaType, compactionInfo.first, 
compactionInfo.second);
         IStorageComponentProvider storageComponentProvider = 
metadataProvider.getStorageComponentProvider();
         IndexDropOperatorDescriptor primaryBtreeDrop =
                 new IndexDropOperatorDescriptor(specPrimary, 
storageComponentProvider.getStorageManager(),
@@ -393,8 +391,8 @@
         Pair<ILSMMergePolicyFactory, Map<String, String>> compactionInfo =
                 DatasetUtil.getMergePolicyFactory(dataset, 
metadataProvider.getMetadataTxnContext());
 
-        IIndexDataflowHelperFactory indexDataflowHelperFactory = 
dataset.getIndexDataflowHelperFactory(
-                metadataProvider, primaryIndex, itemType, metaType, 
compactionInfo.first, compactionInfo.second);
+        IIndexDataflowHelperFactory indexDataflowHelperFactory = 
dataset.getIndexDataflowHelperFactory(metadataProvider,
+                primaryIndex, itemType, metaType, compactionInfo.first, 
compactionInfo.second);
         IStorageComponentProvider storageComponentProvider = 
metadataProvider.getStorageComponentProvider();
         IndexDropOperatorDescriptor primaryBtreeDrop =
                 new IndexDropOperatorDescriptor(specPrimary, 
storageComponentProvider.getStorageManager(),
@@ -467,8 +465,8 @@
                 index, itemType, metaItemType, compactionInfo.first, 
compactionInfo.second);
         TreeIndexCreateOperatorDescriptor indexCreateOp = new 
TreeIndexCreateOperatorDescriptor(spec,
                 RuntimeComponentsProvider.RUNTIME_PROVIDER, 
RuntimeComponentsProvider.RUNTIME_PROVIDER,
-                splitsAndConstraint.first, typeTraits, comparatorFactories, 
bloomFilterKeyFields,
-                dataflowHelperFactory, localResourceFactoryProvider, 
NoOpOperationCallbackFactory.INSTANCE,
+                splitsAndConstraint.first, typeTraits, comparatorFactories, 
bloomFilterKeyFields, dataflowHelperFactory,
+                localResourceFactoryProvider, 
NoOpOperationCallbackFactory.INSTANCE,
                 storageComponentProvider.getMetadataPageManagerFactory());
         
AlgebricksPartitionConstraintHelper.setPartitionConstraintInJobSpec(spec, 
indexCreateOp,
                 splitsAndConstraint.second);
@@ -518,4 +516,13 @@
         spec.addRoot(compactOp);
         return spec;
     }
+
+    public static boolean isFullyQualifiedName(String datasetName) {
+        return datasetName.indexOf('.') > 0; //NOSONAR a fully qualified name 
can't start with a .
+    }
+
+    public static String getDataverseFromFullyQualifiedName(String 
datasetName) {
+        int idx = datasetName.indexOf('.');
+        return datasetName.substring(0, idx);
+    }
 }
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataLockManager.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataLockManager.java
index 9292008..513e144 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataLockManager.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataLockManager.java
@@ -18,13 +18,14 @@
  */
 package org.apache.asterix.metadata.utils;
 
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.function.Function;
 
-import org.apache.asterix.metadata.entities.Dataverse;
 import org.apache.asterix.metadata.entities.FeedConnection;
 
 public class MetadataLockManager {
@@ -344,10 +345,30 @@
         releaseDataverseReadLock(dataverseName);
     }
 
-    public void insertDeleteUpsertBegin(String dataverseName, String 
datasetFullyQualifiedName, List<String> dataverses,
-            List<String> datasets) {
-        dataverses.add(dataverseName);
+    public void insertDeleteUpsertBegin(String defaultDataverse, String 
datasetFullyQualifiedName,
+            List<String> dataverses, List<String> datasets) {
         datasets.add(datasetFullyQualifiedName);
+        // if dataset name is not fully qualified, we make it so
+        List<String> fullyQualifiedDatasets = null;
+        Iterator<String> it = datasets.iterator();
+        while (it.hasNext()) {
+            String datasetName = it.next();
+            if (!DatasetUtil.isFullyQualifiedName(datasetName)) {
+                if (fullyQualifiedDatasets == null) {
+                    fullyQualifiedDatasets = new ArrayList<>();
+                    dataverses.add(defaultDataverse);
+                }
+                fullyQualifiedDatasets.add(defaultDataverse + '.' + 
datasetName);
+                it.remove();
+            } else {
+                // add the dataverse to the dataverses to lock
+                
dataverses.add(DatasetUtil.getDataverseFromFullyQualifiedName(datasetName));
+            }
+        }
+        if (fullyQualifiedDatasets != null) {
+            datasets.addAll(fullyQualifiedDatasets);
+        }
+
         Collections.sort(dataverses);
         Collections.sort(datasets);
 
@@ -373,16 +394,10 @@
         }
     }
 
-    public void insertDeleteUpsertEnd(String dataverseName, String 
datasetFullyQualifiedName, List<String> dataverses,
+    public void insertDeleteUpsertEnd(String datasetFullyQualifiedName, 
List<String> dataverses,
             List<String> datasets) {
         String previous = null;
-        for (int i = dataverses.size() - 1; i >= 0; i--) {
-            String current = dataverses.get(i);
-            if (!current.equals(previous)) {
-                releaseDataverseReadLock(current);
-                previous = current;
-            }
-        }
+        // release datasets first
         for (int i = datasets.size() - 1; i >= 0; i--) {
             String current = datasets.get(i);
             if (!current.equals(previous)) {
@@ -391,6 +406,14 @@
                 } else {
                     releaseDatasetReadLock(current);
                 }
+                previous = current;
+            }
+        }
+
+        for (int i = dataverses.size() - 1; i >= 0; i--) {
+            String current = dataverses.get(i);
+            if (!current.equals(previous)) {
+                releaseDataverseReadLock(current);
                 previous = current;
             }
         }
@@ -514,9 +537,26 @@
         releaseDataverseReadLock(dataverseName);
     }
 
-    public void queryBegin(Dataverse dataverse, List<String> dataverses, 
List<String> datasets) {
-        if (dataverse != null) {
-            dataverses.add(dataverse.getDataverseName());
+    public void queryBegin(String activeDataverse, List<String> dataverses, 
List<String> datasets) {
+        // if dataset name is not fully qualified, we make it so
+        List<String> fullyQualifiedDatasets = null;
+        Iterator<String> it = datasets.iterator();
+        while (it.hasNext()) {
+            String datasetName = it.next();
+            if (!DatasetUtil.isFullyQualifiedName(datasetName)) {
+                if (fullyQualifiedDatasets == null) {
+                    fullyQualifiedDatasets = new ArrayList<>();
+                    dataverses.add(activeDataverse);
+                }
+                fullyQualifiedDatasets.add(activeDataverse + '.' + 
datasetName);
+                it.remove();
+            } else {
+                // add the dataverse to the dataverses to lock
+                
dataverses.add(DatasetUtil.getDataverseFromFullyQualifiedName(datasetName));
+            }
+        }
+        if (fullyQualifiedDatasets != null) {
+            datasets.addAll(fullyQualifiedDatasets);
         }
         Collections.sort(dataverses);
         Collections.sort(datasets);
@@ -541,13 +581,7 @@
 
     public void queryEnd(List<String> dataverses, List<String> datasets) {
         String previous = null;
-        for (int i = dataverses.size() - 1; i >= 0; i--) {
-            String current = dataverses.get(i);
-            if (!current.equals(previous)) {
-                releaseDataverseReadLock(current);
-                previous = current;
-            }
-        }
+        // release datasets first
         for (int i = datasets.size() - 1; i >= 0; i--) {
             String current = datasets.get(i);
             if (!current.equals(previous)) {
@@ -555,6 +589,14 @@
                 previous = current;
             }
         }
+        // then dataverses
+        for (int i = dataverses.size() - 1; i >= 0; i--) {
+            String current = dataverses.get(i);
+            if (!current.equals(previous)) {
+                releaseDataverseReadLock(current);
+                previous = current;
+            }
+        }
     }
 
     public void refreshDatasetBegin(String dataverseName, String 
datasetFullyQualifiedName) {

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/1642
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I5f468599897a37cbcb12d8577d072f340f0d949c
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: abdullah alamoudi <bamou...@gmail.com>

Reply via email to