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>