This is an automated email from the ASF dual-hosted git repository. mblow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit 84d8545fc98918e1f96de56114c72d0ab28bedaa Author: Ali Alsuliman <[email protected]> AuthorDate: Mon Aug 8 13:41:08 2022 -0700 [ASTERIXDB-3051][COMP] Add ANALYZE DATASET DROP STATISTICS statement - user model changes: no - storage format changes: no - interface changes: no Details: ANALYZE DATASET DROP STATISTICS should drop the samples indexes that are created by ANALYZE DATASET statement. Change-Id: I4cf6f52777ad9a038470348cc261f67dda673b00 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/16963 Contrib: Jenkins <[email protected]> Reviewed-by: Murtadha Hubail <[email protected]> Integration-Tests: Jenkins <[email protected]> Tested-by: Ian Maxon <[email protected]> Tested-by: Ali Alsuliman <[email protected]> Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17328 Reviewed-by: Michael Blow <[email protected]> Tested-by: Michael Blow <[email protected]> --- .../asterix/translator/AbstractLangTranslator.java | 11 ++ .../asterix/app/translator/QueryTranslator.java | 174 +++++++++++++++++++-- .../analyze-dataset-1.20.ddl.sqlpp | 5 +- ...20.ddl.sqlpp => analyze-dataset-1.22.ddl.sqlpp} | 7 +- ....ddl.sqlpp => analyze-dataset-1.23.query.sqlpp} | 6 +- ...20.ddl.sqlpp => analyze-dataset-1.24.ddl.sqlpp} | 5 +- ....ddl.sqlpp => analyze-dataset-1.25.query.sqlpp} | 6 +- .../ddl/analyze-dataset-1/analyze-dataset-1.23.adm | 1 + .../ddl/analyze-dataset-1/analyze-dataset-1.25.adm | 1 + .../asterix/common/metadata/IMetadataLockUtil.java | 3 + .../apache/asterix/lang/common/base/Statement.java | 1 + ...ropStatement.java => AnalyzeDropStatement.java} | 27 +--- .../lang/common/statement/IndexDropStatement.java | 8 +- .../lang/common/visitor/FormatPrintVisitor.java | 10 ++ .../base/AbstractQueryExpressionVisitor.java | 6 + .../lang/common/visitor/base/ILangVisitor.java | 3 + .../asterix-lang-sqlpp/src/main/javacc/SQLPP.jj | 31 +++- .../asterix/metadata/utils/MetadataLockUtil.java | 7 + 18 files changed, 251 insertions(+), 61 deletions(-) diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java index b0f9a1c054..6a24d5971f 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java @@ -40,6 +40,7 @@ import org.apache.asterix.common.functions.FunctionConstants; import org.apache.asterix.common.functions.FunctionSignature; import org.apache.asterix.common.metadata.DataverseName; import org.apache.asterix.lang.common.base.Statement; +import org.apache.asterix.lang.common.statement.AnalyzeDropStatement; import org.apache.asterix.lang.common.statement.AnalyzeStatement; import org.apache.asterix.lang.common.statement.CreateAdapterStatement; import org.apache.asterix.lang.common.statement.CreateDataverseStatement; @@ -383,6 +384,16 @@ public abstract class AbstractLangTranslator { message = String.format(BAD_DATAVERSE_OBJECT_DDL_MESSAGE, "analyze", dataset(), dataverseName); } break; + case ANALYZE_DROP: + AnalyzeDropStatement analyzeDropStmt = (AnalyzeDropStatement) stmt; + if (analyzeDropStmt.getDataverseName() != null) { + dataverseName = analyzeDropStmt.getDataverseName(); + } + invalidOperation = isMetadataDataverse(dataverseName); + if (invalidOperation) { + message = String.format(BAD_DATAVERSE_OBJECT_DDL_MESSAGE, "analyze drop", dataset(), dataverseName); + } + break; } if (invalidOperation) { 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 5b60cc050c..fa5507fdab 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 @@ -111,6 +111,7 @@ import org.apache.asterix.lang.common.expression.TypeExpression; import org.apache.asterix.lang.common.expression.TypeReferenceExpression; import org.apache.asterix.lang.common.expression.VariableExpr; import org.apache.asterix.lang.common.statement.AdapterDropStatement; +import org.apache.asterix.lang.common.statement.AnalyzeDropStatement; import org.apache.asterix.lang.common.statement.AnalyzeStatement; import org.apache.asterix.lang.common.statement.CompactStatement; import org.apache.asterix.lang.common.statement.ConnectFeedStatement; @@ -493,6 +494,9 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen case ANALYZE: handleAnalyzeStatement(metadataProvider, stmt, hcc, requestParameters); break; + case ANALYZE_DROP: + handleAnalyzeDropStatement(metadataProvider, stmt, hcc, requestParameters); + break; case COMPACT: handleCompactStatement(metadataProvider, stmt, hcc); break; @@ -2277,14 +2281,8 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen } ensureNonPrimaryIndexDrop(index, sourceLoc); validateDatasetState(metadataProvider, ds, sourceLoc); - // #. prepare a job to drop the index in NC. - jobsToExecute.add(IndexUtil.buildDropIndexJobSpec(index, metadataProvider, ds, sourceLoc)); - - // #. mark PendingDropOp on the existing index - MetadataManager.INSTANCE.dropIndex(mdTxnCtx, dataverseName, datasetName, indexName); - MetadataManager.INSTANCE.addIndex(mdTxnCtx, - new Index(dataverseName, datasetName, indexName, index.getIndexType(), index.getIndexDetails(), - index.isEnforced(), index.isPrimaryIndex(), MetadataUtil.PENDING_DROP_OP)); + prepareIndexDrop(metadataProvider, dataverseName, datasetName, sourceLoc, indexName, jobsToExecute, + mdTxnCtx, ds, index); // #. commit the existing transaction before calling runJob. MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); @@ -2318,8 +2316,9 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen "Dropping " + dataset() + " files index is not allowed."); } ensureNonPrimaryIndexDrop(index, sourceLoc); - // #. prepare a job to drop the index in NC. - jobsToExecute.add(IndexUtil.buildDropIndexJobSpec(index, metadataProvider, ds, sourceLoc)); + prepareIndexDrop(metadataProvider, dataverseName, datasetName, sourceLoc, indexName, jobsToExecute, + mdTxnCtx, ds, index); + List<Index> datasetIndexes = MetadataManager.INSTANCE.getDatasetIndexes(mdTxnCtx, dataverseName, datasetName); if (datasetIndexes.size() == 2) { @@ -2341,12 +2340,6 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen } } - // #. mark PendingDropOp on the existing index - MetadataManager.INSTANCE.dropIndex(mdTxnCtx, dataverseName, datasetName, indexName); - MetadataManager.INSTANCE.addIndex(mdTxnCtx, - new Index(dataverseName, datasetName, indexName, index.getIndexType(), index.getIndexDetails(), - index.isEnforced(), index.isPrimaryIndex(), MetadataUtil.PENDING_DROP_OP)); - // #. commit the existing transaction before calling runJob. MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); bActiveTxn = false; @@ -4429,6 +4422,155 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen } } + protected void handleAnalyzeDropStatement(MetadataProvider metadataProvider, Statement stmt, + IHyracksClientConnection hcc, IRequestParameters requestParams) throws Exception { + AnalyzeDropStatement analyzeDropStmt = (AnalyzeDropStatement) stmt; + metadataProvider.validateDatabaseObjectName(analyzeDropStmt.getDataverseName(), + analyzeDropStmt.getDatasetName(), analyzeDropStmt.getSourceLocation()); + DataverseName dataverseName = getActiveDataverseName(analyzeDropStmt.getDataverseName()); + String datasetName = analyzeDropStmt.getDatasetName(); + if (isCompileOnly()) { + return; + } + lockUtil.analyzeDatasetDropBegin(lockManager, metadataProvider.getLocks(), dataverseName, datasetName); + try { + doAnalyzeDatasetDrop(metadataProvider, analyzeDropStmt, dataverseName, datasetName, hcc, requestParams); + } finally { + metadataProvider.getLocks().unlock(); + } + } + + protected boolean doAnalyzeDatasetDrop(MetadataProvider metadataProvider, AnalyzeDropStatement stmtIndexDrop, + DataverseName dataverseName, String datasetName, IHyracksClientConnection hcc, + IRequestParameters requestParams) throws Exception { + SourceLocation sourceLoc = stmtIndexDrop.getSourceLocation(); + Pair<String, String> sampleIndexNames = IndexUtil.getSampleIndexNames(datasetName); + String indexName1 = sampleIndexNames.first; + String indexName2 = sampleIndexNames.second; + ProgressState progress = ProgressState.NO_PROGRESS; + List<JobSpecification> jobsToExecute = new ArrayList<>(); + + MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction(); + boolean bActiveTxn = true; + metadataProvider.setMetadataTxnContext(mdTxnCtx); + boolean index1Exists = false, index2Exists = false; + try { + Dataset ds = metadataProvider.findDataset(dataverseName, datasetName); + if (ds == null) { + throw new CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, datasetName, + dataverseName); + } + if (ds.getDatasetType() != DatasetType.INTERNAL) { + throw new CompilationException(ErrorCode.OPERATION_NOT_SUPPORTED, sourceLoc); + } + Index index1 = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataverseName, datasetName, indexName1); + Index index2 = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataverseName, datasetName, indexName2); + index1Exists = index1 != null; + index2Exists = index2 != null; + if (!index1Exists && !index2Exists) { + MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); + return false; + } + ensureNonPrimaryIndexesDrop(index1, index2, sourceLoc); + validateDatasetState(metadataProvider, ds, sourceLoc); + prepareIndexDrop(metadataProvider, dataverseName, datasetName, sourceLoc, indexName1, jobsToExecute, + mdTxnCtx, ds, index1); + prepareIndexDrop(metadataProvider, dataverseName, datasetName, sourceLoc, indexName2, jobsToExecute, + mdTxnCtx, ds, index2); + + // #. commit the existing transaction before calling runJob. + MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); + bActiveTxn = false; + progress = ProgressState.ADDED_PENDINGOP_RECORD_TO_METADATA; + + for (JobSpecification jobSpec : jobsToExecute) { + runJob(hcc, jobSpec); + } + + // #. begin a new transaction + mdTxnCtx = MetadataManager.INSTANCE.beginTransaction(); + bActiveTxn = true; + metadataProvider.setMetadataTxnContext(mdTxnCtx); + + // #. finally, delete the existing indexes + if (index1Exists) { + MetadataManager.INSTANCE.dropIndex(mdTxnCtx, dataverseName, datasetName, indexName1); + } + if (index2Exists) { + MetadataManager.INSTANCE.dropIndex(mdTxnCtx, dataverseName, datasetName, indexName2); + } + + MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); + return true; + } catch (Exception e) { + if (bActiveTxn) { + abort(e, e, mdTxnCtx); + } + + if (progress == ProgressState.ADDED_PENDINGOP_RECORD_TO_METADATA) { + // #. execute compensation operations remove the all indexes in NC + try { + for (JobSpecification jobSpec : jobsToExecute) { + runJob(hcc, jobSpec); + } + } catch (Exception e2) { + // do no throw exception since still the metadata needs to be compensated. + e.addSuppressed(e2); + } + + // remove the record from the metadata. + mdTxnCtx = MetadataManager.INSTANCE.beginTransaction(); + metadataProvider.setMetadataTxnContext(mdTxnCtx); + try { + if (index1Exists) { + MetadataManager.INSTANCE.dropIndex(metadataProvider.getMetadataTxnContext(), dataverseName, + datasetName, indexName1); + } + if (index2Exists) { + MetadataManager.INSTANCE.dropIndex(metadataProvider.getMetadataTxnContext(), dataverseName, + datasetName, indexName2); + } + MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); + } catch (Exception e2) { + e.addSuppressed(e2); + abort(e, e2, mdTxnCtx); + String msg = String.format( + "System is in inconsistent state: pending index %1$s.%2$s.%3$s and/or %1$s.%2$s.%4$s " + + "couldn't be removed from the metadata", + dataverseName, datasetName, indexName1, indexName2); + throw new IllegalStateException(msg, e); + } + } + + throw e; + } + } + + private void ensureNonPrimaryIndexesDrop(Index index1, Index index2, SourceLocation sourceLoc) + throws AlgebricksException { + if (index1 != null) { + ensureNonPrimaryIndexDrop(index1, sourceLoc); + } + if (index2 != null) { + ensureNonPrimaryIndexDrop(index2, sourceLoc); + } + } + + private void prepareIndexDrop(MetadataProvider metadataProvider, DataverseName dataverseName, String datasetName, + SourceLocation sourceLoc, String indexName, List<JobSpecification> jobsToExecute, + MetadataTransactionContext mdTxnCtx, Dataset ds, Index index) throws AlgebricksException { + if (index != null) { + // #. prepare a job to drop the index in NC. + jobsToExecute.add(IndexUtil.buildDropIndexJobSpec(index, metadataProvider, ds, sourceLoc)); + + // #. mark PendingDropOp on the existing index + MetadataManager.INSTANCE.dropIndex(mdTxnCtx, dataverseName, datasetName, indexName); + MetadataManager.INSTANCE.addIndex(mdTxnCtx, + new Index(dataverseName, datasetName, indexName, index.getIndexType(), index.getIndexDetails(), + index.isEnforced(), index.isPrimaryIndex(), MetadataUtil.PENDING_DROP_OP)); + } + } + protected void handleCompactStatement(MetadataProvider metadataProvider, Statement stmt, IHyracksClientConnection hcc) throws Exception { CompactStatement compactStatement = (CompactStatement) stmt; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp index ffa19b4ae8..3190b2dacb 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp @@ -18,10 +18,9 @@ */ /* - * Description: test that the sample index is dropped when - * its source dataset is dropped + * Description: test that the sample index is dropped using "analyze dataset drop statistics" statement */ use test; -drop dataset ds1; +analyze dataset ds1 drop statistics; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.22.ddl.sqlpp similarity index 86% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.22.ddl.sqlpp index ffa19b4ae8..7d6bf92041 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.22.ddl.sqlpp @@ -17,11 +17,6 @@ * under the License. */ -/* - * Description: test that the sample index is dropped when - * its source dataset is dropped - */ - use test; -drop dataset ds1; +analyze dataset ds1; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.23.query.sqlpp similarity index 87% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.23.query.sqlpp index ffa19b4ae8..a593df39ee 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.23.query.sqlpp @@ -18,10 +18,10 @@ */ /* - * Description: test that the sample index is dropped when - * its source dataset is dropped + * Description: check that the sample was re-created again */ use test; -drop dataset ds1; +select count(*) cnt +from listMetadata(true, false) v; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.24.ddl.sqlpp similarity index 87% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.24.ddl.sqlpp index ffa19b4ae8..151309ad0b 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.24.ddl.sqlpp @@ -18,10 +18,9 @@ */ /* - * Description: test that the sample index is dropped when - * its source dataset is dropped + * Description: test that the sample index is dropped when its source dataset is dropped */ use test; -drop dataset ds1; +drop dataset ds1; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.25.query.sqlpp similarity index 87% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.25.query.sqlpp index ffa19b4ae8..759fc3f417 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.20.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.25.query.sqlpp @@ -18,10 +18,10 @@ */ /* - * Description: test that the sample index is dropped when - * its source dataset is dropped + * Description: check that the sample was dropped */ use test; -drop dataset ds1; +select count(*) cnt +from listMetadata(true, false) v; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/analyze-dataset-1/analyze-dataset-1.23.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/analyze-dataset-1/analyze-dataset-1.23.adm new file mode 100644 index 0000000000..f86e66b707 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/analyze-dataset-1/analyze-dataset-1.23.adm @@ -0,0 +1 @@ +{ "cnt": 1 } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/analyze-dataset-1/analyze-dataset-1.25.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/analyze-dataset-1/analyze-dataset-1.25.adm new file mode 100644 index 0000000000..bacb60c0e2 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/analyze-dataset-1/analyze-dataset-1.25.adm @@ -0,0 +1 @@ +{ "cnt": 0 } \ No newline at end of file diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/IMetadataLockUtil.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/IMetadataLockUtil.java index 684ddaea1b..d830868625 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/IMetadataLockUtil.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/IMetadataLockUtil.java @@ -55,6 +55,9 @@ public interface IMetadataLockUtil { void analyzeDatasetBegin(IMetadataLockManager lockManager, LockList locks, DataverseName dataverseName, String datasetName) throws AlgebricksException; + void analyzeDatasetDropBegin(IMetadataLockManager lockMgr, LockList locks, DataverseName dataverseName, + String datasetName) throws AlgebricksException; + void compactBegin(IMetadataLockManager lockManager, LockList locks, DataverseName dataverseName, String datasetName) throws AlgebricksException; diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Statement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Statement.java index b1ad073cff..4330c4e8f0 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Statement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Statement.java @@ -108,6 +108,7 @@ public interface Statement extends ILangExpression { SYNONYM_DROP, VIEW_DROP, ANALYZE, + ANALYZE_DROP, COMPACT, EXTERNAL_DATASET_REFRESH, SUBSCRIBE_FEED, diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AnalyzeDropStatement.java similarity index 68% copy from asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java copy to asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AnalyzeDropStatement.java index c3583698ef..67cfeecc10 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/AnalyzeDropStatement.java @@ -21,46 +21,31 @@ package org.apache.asterix.lang.common.statement; import org.apache.asterix.common.exceptions.CompilationException; import org.apache.asterix.common.metadata.DataverseName; import org.apache.asterix.lang.common.base.AbstractStatement; -import org.apache.asterix.lang.common.base.Statement; -import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class IndexDropStatement extends AbstractStatement { +public class AnalyzeDropStatement extends AbstractStatement { - private DataverseName dataverseName; - private Identifier datasetName; - private Identifier indexName; - private boolean ifExists; + private final DataverseName dataverseName; + private final String datasetName; - public IndexDropStatement(DataverseName dataverseName, Identifier datasetName, Identifier indexName, - boolean ifExists) { + public AnalyzeDropStatement(DataverseName dataverseName, String datasetName) { this.dataverseName = dataverseName; this.datasetName = datasetName; - this.indexName = indexName; - this.ifExists = ifExists; } @Override public Kind getKind() { - return Statement.Kind.INDEX_DROP; + return Kind.ANALYZE_DROP; } public DataverseName getDataverseName() { return dataverseName; } - public Identifier getDatasetName() { + public String getDatasetName() { return datasetName; } - public Identifier getIndexName() { - return indexName; - } - - public boolean getIfExists() { - return ifExists; - } - @Override public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws CompilationException { return visitor.visit(this, arg); diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java index c3583698ef..d4796268de 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java @@ -27,10 +27,10 @@ import org.apache.asterix.lang.common.visitor.base.ILangVisitor; public class IndexDropStatement extends AbstractStatement { - private DataverseName dataverseName; - private Identifier datasetName; - private Identifier indexName; - private boolean ifExists; + private final DataverseName dataverseName; + private final Identifier datasetName; + private final Identifier indexName; + private final boolean ifExists; public IndexDropStatement(DataverseName dataverseName, Identifier datasetName, Identifier indexName, boolean ifExists) { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java index c6db0a3828..f42f2f075c 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java @@ -65,6 +65,7 @@ import org.apache.asterix.lang.common.expression.UnaryExpr; import org.apache.asterix.lang.common.expression.UnorderedListTypeDefinition; import org.apache.asterix.lang.common.expression.VariableExpr; import org.apache.asterix.lang.common.statement.AdapterDropStatement; +import org.apache.asterix.lang.common.statement.AnalyzeDropStatement; import org.apache.asterix.lang.common.statement.AnalyzeStatement; import org.apache.asterix.lang.common.statement.CompactStatement; import org.apache.asterix.lang.common.statement.ConnectFeedStatement; @@ -937,6 +938,15 @@ public abstract class FormatPrintVisitor implements ILangVisitor<Void, Integer> return null; } + @Override + public Void visit(AnalyzeDropStatement as, Integer step) throws CompilationException { + out.print(skip(step) + "analyze dataset "); + out.print(generateFullName(as.getDataverseName(), as.getDatasetName())); + out.print(" drop statistics"); + out.println(SEMICOLON); + return null; + } + @Override public Void visit(CompactStatement del, Integer step) throws CompilationException { return null; diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/AbstractQueryExpressionVisitor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/AbstractQueryExpressionVisitor.java index bc8a8d3497..a060d1ea9a 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/AbstractQueryExpressionVisitor.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/AbstractQueryExpressionVisitor.java @@ -25,6 +25,7 @@ import org.apache.asterix.lang.common.expression.RecordTypeDefinition; import org.apache.asterix.lang.common.expression.TypeReferenceExpression; import org.apache.asterix.lang.common.expression.UnorderedListTypeDefinition; import org.apache.asterix.lang.common.statement.AdapterDropStatement; +import org.apache.asterix.lang.common.statement.AnalyzeDropStatement; import org.apache.asterix.lang.common.statement.AnalyzeStatement; import org.apache.asterix.lang.common.statement.CompactStatement; import org.apache.asterix.lang.common.statement.ConnectFeedStatement; @@ -266,6 +267,11 @@ public abstract class AbstractQueryExpressionVisitor<R, T> implements ILangVisit return null; } + @Override + public R visit(AnalyzeDropStatement as, T arg) throws CompilationException { + return null; + } + @Override public R visit(CompactStatement del, T arg) throws CompilationException { return null; diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/ILangVisitor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/ILangVisitor.java index a5c71ef9d8..b9de3472ac 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/ILangVisitor.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/ILangVisitor.java @@ -42,6 +42,7 @@ import org.apache.asterix.lang.common.expression.UnaryExpr; import org.apache.asterix.lang.common.expression.UnorderedListTypeDefinition; import org.apache.asterix.lang.common.expression.VariableExpr; import org.apache.asterix.lang.common.statement.AdapterDropStatement; +import org.apache.asterix.lang.common.statement.AnalyzeDropStatement; import org.apache.asterix.lang.common.statement.AnalyzeStatement; import org.apache.asterix.lang.common.statement.CompactStatement; import org.apache.asterix.lang.common.statement.ConnectFeedStatement; @@ -210,6 +211,8 @@ public interface ILangVisitor<R, T> { R visit(AnalyzeStatement as, T arg) throws CompilationException; + R visit(AnalyzeDropStatement as, T step) throws CompilationException; + R visit(CompactStatement del, T arg) throws CompilationException; R visit(ListSliceExpression expression, T arg) throws CompilationException; diff --git a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj index 9edd07d3c8..a37b9cc569 100644 --- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj +++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj @@ -126,6 +126,7 @@ import org.apache.asterix.lang.common.literal.TrueLiteral; import org.apache.asterix.lang.common.parser.ScopeChecker; import org.apache.asterix.lang.common.statement.AdapterDropStatement; import org.apache.asterix.lang.common.statement.AnalyzeStatement; +import org.apache.asterix.lang.common.statement.AnalyzeDropStatement; import org.apache.asterix.lang.common.statement.CompactStatement; import org.apache.asterix.lang.common.statement.ConnectFeedStatement; import org.apache.asterix.lang.common.statement.StartFeedStatement; @@ -259,6 +260,7 @@ class SQLPPParser extends ScopeChecker implements IParser { private static final String REPLACE = "REPLACE"; private static final String RETURNS = "RETURNS"; private static final String CONFIG = "CONFIG"; + private static final String STATISTICS = "STATISTICS"; private static final String INT_TYPE_NAME = "int"; @@ -2634,15 +2636,29 @@ String AdapterName() throws ParseException : Statement AnalyzeStatement() throws ParseException: { Token startToken = null; + Statement stmt = null; Pair<DataverseName,Identifier> nameComponents = null; - RecordConstructor withRecord = null; } { <ANALYZE> { startToken = token; } Dataset() nameComponents = QualifiedName() + ( + stmt = AnalyzeDatasetDropStatement(startToken, nameComponents.first, nameComponents.second) + | stmt = AnalyzeDatasetStatement(startToken, nameComponents.first, nameComponents.second) + ) + { + return stmt; + } +} + +Statement AnalyzeDatasetStatement(Token startToken, DataverseName dvName, Identifier identifier) throws ParseException: +{ + RecordConstructor withRecord = null; +} +{ ( <WITH> withRecord = RecordConstructor() )? { try { - AnalyzeStatement stmt = new AnalyzeStatement(nameComponents.first, nameComponents.second.getValue(), withRecord); + AnalyzeStatement stmt = new AnalyzeStatement(dvName, identifier.getValue(), withRecord); return addSourceLocation(stmt, startToken); } catch (CompilationException e) { throw new SqlppParseException(getSourceLocation(startToken), e.getMessage()); @@ -2650,6 +2666,17 @@ Statement AnalyzeStatement() throws ParseException: } } +Statement AnalyzeDatasetDropStatement(Token startToken, DataverseName dvName, Identifier identifier) throws ParseException: +{ +} +{ + <DROP> <IDENTIFIER> { expectToken(STATISTICS); } + { + AnalyzeDropStatement stmt = new AnalyzeDropStatement(dvName, identifier.getValue()); + return addSourceLocation(stmt, startToken); + } +} + Statement CompactStatement() throws ParseException: { Token startToken = null; diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataLockUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataLockUtil.java index afd1582c02..1de387fbab 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataLockUtil.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataLockUtil.java @@ -317,6 +317,13 @@ public class MetadataLockUtil implements IMetadataLockUtil { lockMgr.acquireDatasetCreateIndexLock(locks, dataverseName, datasetName); } + @Override + public void analyzeDatasetDropBegin(IMetadataLockManager lockMgr, LockList locks, DataverseName dataverseName, + String datasetName) throws AlgebricksException { + lockMgr.acquireDataverseReadLock(locks, dataverseName); + lockMgr.acquireDatasetWriteLock(locks, dataverseName, datasetName); + } + @Override public void compactBegin(IMetadataLockManager lockMgr, LockList locks, DataverseName dataverseName, String datasetName) throws AlgebricksException {
