This is an automated email from the ASF dual-hosted git repository.
alsuliman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push:
new ccbe8708bf [NO ISSUE][COMP] Add and collect dependent datasets
ccbe8708bf is described below
commit ccbe8708bf9696e1d1e187ee5c73c085f73643ba
Author: janhavitripurwar <[email protected]>
AuthorDate: Fri Jul 12 14:16:13 2024 +0530
[NO ISSUE][COMP] Add and collect dependent datasets
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Collect dataset/synonym/function for CREATE DATASET AS <QUERY> statement
- check SELECT on dependent collections
- Abort the dataset creation transaction in case of failure.
Ext-ref: MB-62587
Change-Id: I1a9ce0b883d85356ce6f2dc014d5e5b3dc948707
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18468
Integration-Tests: Jenkins <[email protected]>
Tested-by: Jenkins <[email protected]>
Reviewed-by: Janhavi Tripurwar <[email protected]>
Reviewed-by: Ali Alsuliman <[email protected]>
---
.../asterix/app/translator/QueryTranslator.java | 36 ++++++++++----
.../asterix/test/sqlpp/ParserTestExecutor.java | 2 +-
.../asterix/lang/common/base/IQueryRewriter.java | 6 +++
.../lang/common/rewrites/LangRewritingContext.java | 10 +++-
.../asterix/lang/common/statement/DatasetDecl.java | 12 ++++-
.../asterix/lang/common/util/LangDatasetUtil.java | 57 ++++++++++++++++++++++
.../lang/sqlpp/rewrites/SqlppQueryRewriter.java | 38 ++++++++++++++-
.../rewrites/visitor/SqlppLoadAccessedDataset.java | 21 +++++---
.../visitor/VariableCheckAndRewriteVisitor.java | 14 ++++++
.../apache/asterix/metadata/entities/Dataset.java | 22 +++++++++
10 files changed, 198 insertions(+), 20 deletions(-)
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 f60a99fe6b..ad74d6c4fb 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
@@ -172,6 +172,7 @@ import
org.apache.asterix.lang.common.statement.ViewDropStatement;
import org.apache.asterix.lang.common.struct.Identifier;
import org.apache.asterix.lang.common.struct.VarIdentifier;
import org.apache.asterix.lang.common.util.FunctionUtil;
+import org.apache.asterix.lang.common.util.LangDatasetUtil;
import org.apache.asterix.lang.common.util.ViewUtil;
import org.apache.asterix.lang.sqlpp.rewrites.SqlppQueryRewriter;
import org.apache.asterix.metadata.IDatasetDetails;
@@ -601,10 +602,10 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
}
protected LangRewritingContext createLangRewritingContext(MetadataProvider
metadataProvider,
- List<FunctionDecl> declaredFunctions, List<ViewDecl>
declaredViews, IWarningCollector warningCollector,
- int varCounter) {
+ List<FunctionDecl> declaredFunctions, List<ViewDecl>
declaredViews, List<DatasetDecl> declaredDatasets,
+ IWarningCollector warningCollector, int varCounter) {
return new LangRewritingContext(metadataProvider, declaredFunctions,
declaredViews, warningCollector,
- varCounter);
+ declaredDatasets, varCounter);
}
protected Namespace handleUseDataverseStatement(MetadataProvider
metadataProvider, Statement stmt)
@@ -921,6 +922,20 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
throw new CompilationException(ErrorCode.DATASET_EXISTS,
sourceLoc, datasetName, dataverseName);
}
}
+ if (dd.getQuery() != null) {
+ IQueryRewriter queryRewriter =
rewriterFactory.createQueryRewriter();
+ Query wrappedQuery =
queryRewriter.createDatasetAccessorQuery(dd, namespaceResolver, namespace);
+ dd.setNamespace(namespace);
+ LangRewritingContext langRewritingContext =
+ createLangRewritingContext(metadataProvider,
declaredFunctions, null,
+ Collections.singletonList(dd),
warningCollector, wrappedQuery.getVarCounter());
+ apiFramework.reWriteQuery(langRewritingContext, wrappedQuery,
sessionOutput, false, false,
+ Collections.emptyList());
+
+ LangDatasetUtil.getDatasetDependencies(metadataProvider, dd,
queryRewriter);
+ appCtx.getReceptionist().ensureAuthorized(requestParameters,
metadataProvider);
+ }
+
List<TypeExpression> partitioningExprTypes = null;
if (dsType == DatasetType.INTERNAL) {
partitioningExprTypes = ((InternalDetailsDecl)
dd.getDatasetDetailsDecl()).getPartitioningExprTypes();
@@ -1033,7 +1048,6 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
if (dsType == DatasetType.INTERNAL) {
JobSpecification jobSpec =
DatasetUtil.createDatasetJobSpec(dataset, metadataProvider);
-
// #. make metadataTxn commit before calling runJob.
MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
bActiveTxn = false;
@@ -2932,8 +2946,9 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
Query wrappedQuery =
queryRewriter.createViewAccessorQuery(viewDecl,
metadataProvider.getNamespaceResolver());
metadataProvider.setDefaultNamespace(ns);
+
LangRewritingContext langRewritingContext =
createLangRewritingContext(metadataProvider, declaredFunctions,
- Collections.singletonList(viewDecl), warningCollector,
wrappedQuery.getVarCounter());
+ Collections.singletonList(viewDecl), null,
warningCollector, wrappedQuery.getVarCounter());
apiFramework.reWriteQuery(langRewritingContext, wrappedQuery,
sessionOutput, false, false,
Collections.emptyList());
@@ -3237,7 +3252,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
fdList.add(fd);
metadataProvider.setDefaultNamespace(ns);
LangRewritingContext langRewritingContext =
createLangRewritingContext(metadataProvider, fdList, null,
- warningCollector, wrappedQuery.getVarCounter());
+ null, warningCollector, wrappedQuery.getVarCounter());
apiFramework.reWriteQuery(langRewritingContext, wrappedQuery,
sessionOutput, false, false,
Collections.emptyList());
@@ -4077,7 +4092,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
Map<VarIdentifier, IAObject> externalVars =
createExternalVariables(copyTo, stmtParams);
// Query Rewriting (happens under the same ongoing metadata
transaction)
LangRewritingContext langRewritingContext =
createLangRewritingContext(metadataProvider,
- declaredFunctions, null, warningCollector,
copyTo.getVarCounter());
+ declaredFunctions, null, null, warningCollector,
copyTo.getVarCounter());
Pair<IReturningStatement, Integer> rewrittenResult =
apiFramework.reWriteQuery(langRewritingContext,
copyTo, sessionOutput, true, true,
externalVars.keySet());
@@ -4141,6 +4156,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
metadataProvider.setWriteTransaction(true);
final JobSpecification jobSpec =
rewriteCompileInsertUpsert(hcc, metadataProvider,
stmtInsertUpsert, stmtParams);
+ appCtx.getReceptionist().ensureAuthorized(reqParams,
metadataProvider);
MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
bActiveTxn = false;
return isCompileOnly() ? null : jobSpec;
@@ -4298,7 +4314,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
// Query Rewriting (happens under the same ongoing metadata
transaction)
LangRewritingContext langRewritingContext =
createLangRewritingContext(metadataProvider, declaredFunctions,
- null, warningCollector, query.getVarCounter());
+ null, null, warningCollector, query.getVarCounter());
Pair<IReturningStatement, Integer> rewrittenResult =
apiFramework.reWriteQuery(langRewritingContext, query,
sessionOutput, true, true, externalVars.keySet());
@@ -4317,7 +4333,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
// Insert/upsert statement rewriting (happens under the same ongoing
metadata transaction)
LangRewritingContext langRewritingContext =
createLangRewritingContext(metadataProvider, declaredFunctions,
- null, warningCollector, insertUpsert.getVarCounter());
+ null, null, warningCollector, insertUpsert.getVarCounter());
Pair<IReturningStatement, Integer> rewrittenResult =
apiFramework.reWriteQuery(langRewritingContext,
insertUpsert, sessionOutput, true, true,
externalVars.keySet());
@@ -5226,7 +5242,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
}
private interface IStatementCompiler {
- JobSpecification compile() throws AlgebricksException,
RemoteException, ACIDException;
+ JobSpecification compile() throws AlgebricksException,
RemoteException, ACIDException, HyracksDataException;
}
protected void handleQuery(MetadataProvider metadataProvider, Query query,
IHyracksClientConnection hcc,
diff --git
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
index ba2381b6a9..7effe9d319 100644
---
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
+++
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
@@ -213,7 +213,7 @@ public class ParserTestExecutor extends TestExecutor {
Query query = (Query) st;
IQueryRewriter rewriter =
sqlppRewriterFactory.createQueryRewriter();
LangRewritingContext rwContext = new
LangRewritingContext(metadataProvider, functions, null,
- TestUtils.NOOP_WARNING_COLLECTOR,
query.getVarCounter());
+ TestUtils.NOOP_WARNING_COLLECTOR, null,
query.getVarCounter());
rewrite(rewriter, query, rwContext);
// Tests deep copy and deep equality.
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IQueryRewriter.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IQueryRewriter.java
index 12c3b93269..0f8e3e9c3a 100644
---
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IQueryRewriter.java
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IQueryRewriter.java
@@ -23,9 +23,11 @@ import java.util.Set;
import org.apache.asterix.common.api.INamespaceResolver;
import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.metadata.Namespace;
import org.apache.asterix.lang.common.expression.AbstractCallExpression;
import org.apache.asterix.lang.common.expression.VariableExpr;
import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
+import org.apache.asterix.lang.common.statement.DatasetDecl;
import org.apache.asterix.lang.common.statement.FunctionDecl;
import org.apache.asterix.lang.common.statement.Query;
import org.apache.asterix.lang.common.statement.ViewDecl;
@@ -66,4 +68,8 @@ public interface IQueryRewriter {
Query createFunctionAccessorQuery(FunctionDecl functionDecl);
Query createViewAccessorQuery(ViewDecl viewDecl, INamespaceResolver
namespaceResolver);
+
+ Query createDatasetAccessorQuery(DatasetDecl datasetDecl,
INamespaceResolver namespaceResolver,
+ Namespace namespace);
+
}
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/LangRewritingContext.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/LangRewritingContext.java
index 19b3cfabf2..196e717afa 100644
---
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/LangRewritingContext.java
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/rewrites/LangRewritingContext.java
@@ -25,6 +25,7 @@ import java.util.Map;
import org.apache.asterix.common.functions.FunctionSignature;
import org.apache.asterix.common.metadata.DatasetFullyQualifiedName;
+import org.apache.asterix.lang.common.statement.DatasetDecl;
import org.apache.asterix.lang.common.statement.FunctionDecl;
import org.apache.asterix.lang.common.statement.ViewDecl;
import org.apache.asterix.lang.common.struct.VarIdentifier;
@@ -37,16 +38,19 @@ public class LangRewritingContext {
private final IWarningCollector warningCollector;
private final Map<FunctionSignature, FunctionDecl> declaredFunctions;
private final Map<DatasetFullyQualifiedName, ViewDecl> declaredViews;
+ private final Map<DatasetFullyQualifiedName, DatasetDecl> declaredDatasets;
private final Counter varCounter;
private int systemVarCounter = 1;
private final Map<Integer, VarIdentifier> oldVarIdToNewVarId = new
HashMap<>();
public LangRewritingContext(MetadataProvider metadataProvider,
List<FunctionDecl> declaredFunctions,
- List<ViewDecl> declaredViews, IWarningCollector warningCollector,
int varCounter) {
+ List<ViewDecl> declaredViews, IWarningCollector warningCollector,
List<DatasetDecl> declaredDatasets,
+ int varCounter) {
this.metadataProvider = metadataProvider;
this.warningCollector = warningCollector;
this.declaredFunctions = createMap(declaredFunctions,
FunctionDecl::getSignature);
this.declaredViews = createMap(declaredViews, ViewDecl::getViewName);
+ this.declaredDatasets = createMap(declaredDatasets,
DatasetDecl::getDatasetName);
this.varCounter = new Counter(varCounter);
}
@@ -102,6 +106,10 @@ public class LangRewritingContext {
return declaredViews;
}
+ public Map<DatasetFullyQualifiedName, DatasetDecl> getDeclaredDatasets() {
+ return declaredDatasets;
+ }
+
private static <K, V> Map<K, V> createMap(List<V> values,
java.util.function.Function<V, K> keyMapper) {
if (values == null || values.isEmpty()) {
return Collections.emptyMap();
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java
index ab6097b957..210ffc57d1 100644
---
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java
@@ -23,6 +23,7 @@ import java.util.Map;
import org.apache.asterix.common.config.DatasetConfig;
import org.apache.asterix.common.config.DatasetConfig.DatasetType;
import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.metadata.DatasetFullyQualifiedName;
import org.apache.asterix.common.metadata.DataverseName;
import org.apache.asterix.common.metadata.Namespace;
import org.apache.asterix.lang.common.base.AbstractStatement;
@@ -42,7 +43,7 @@ import org.apache.hyracks.util.StorageUtil;
public class DatasetDecl extends AbstractStatement {
protected final Identifier name;
- protected final Namespace namespace;
+ protected Namespace namespace;
protected final TypeExpression itemType;
protected final TypeExpression metaItemType;
protected final DatasetType datasetType;
@@ -73,6 +74,11 @@ public class DatasetDecl extends AbstractStatement {
this.query = query;
}
+ public DatasetFullyQualifiedName getDatasetName() {
+ return new DatasetFullyQualifiedName(namespace.getDatabaseName(),
namespace.getDataverseName(),
+ name.getValue());
+ }
+
public boolean getIfNotExists() {
return this.ifNotExists;
}
@@ -105,6 +111,10 @@ public class DatasetDecl extends AbstractStatement {
return query;
}
+ public void setNamespace(Namespace namespace) {
+ this.namespace = namespace;
+ }
+
public String getNodegroupName() {
AdmObjectNode nodeGroupObj = (AdmObjectNode)
withObjectNode.get(DatasetDeclParametersUtil.NODE_GROUP_NAME);
if (nodeGroupObj == null) {
diff --git
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangDatasetUtil.java
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangDatasetUtil.java
new file mode 100644
index 0000000000..29737f5f06
--- /dev/null
+++
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangDatasetUtil.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.lang.common.util;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.common.metadata.DependencyFullyQualifiedName;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.IQueryRewriter;
+import org.apache.asterix.lang.common.statement.DatasetDecl;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.asterix.metadata.entities.Dataset;
+
+public class LangDatasetUtil {
+ private LangDatasetUtil() {
+ }
+
+ public static List<List<DependencyFullyQualifiedName>>
getDatasetDependencies(MetadataProvider metadataProvider,
+ DatasetDecl datasetDecl, IQueryRewriter rewriter) throws
CompilationException {
+ Expression normBody = datasetDecl.getQuery().getBody();
+ if (normBody == null) {
+ throw new
CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
datasetDecl.getSourceLocation(),
+ datasetDecl.getName().toString());
+ }
+
+ List<DependencyFullyQualifiedName> datasetDependencies = new
ArrayList<>();
+ List<DependencyFullyQualifiedName> synonymDependencies = new
ArrayList<>();
+ List<DependencyFullyQualifiedName> functionDependencies = new
ArrayList<>();
+ ExpressionUtils.collectDependencies(metadataProvider, normBody,
rewriter, datasetDependencies,
+ synonymDependencies, functionDependencies);
+
+ List<DependencyFullyQualifiedName> typeDependencies =
Collections.emptyList();
+ return Dataset.createDependencies(datasetDependencies,
functionDependencies, typeDependencies,
+ synonymDependencies);
+ }
+}
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
index 183b5e06cf..15865a2d9c 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
@@ -48,6 +48,7 @@ import org.apache.asterix.lang.common.expression.LiteralExpr;
import org.apache.asterix.lang.common.expression.VariableExpr;
import org.apache.asterix.lang.common.literal.MissingLiteral;
import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
+import org.apache.asterix.lang.common.statement.DatasetDecl;
import org.apache.asterix.lang.common.statement.FunctionDecl;
import org.apache.asterix.lang.common.statement.Query;
import org.apache.asterix.lang.common.statement.ViewDecl;
@@ -204,6 +205,8 @@ public class SqlppQueryRewriter implements IQueryRewriter {
// Load all the accessed datasets
loadAccessedDatasets();
+ rewriteDatasetQueryExpression();
+
// Inlines functions and views
loadAndInlineUdfsAndViews();
@@ -345,6 +348,17 @@ public class SqlppQueryRewriter implements IQueryRewriter {
rewriteTopExpr(visitor, null);
}
+ protected void rewriteDatasetQueryExpression() throws CompilationException
{
+ Map<DatasetFullyQualifiedName, DatasetDecl> ds =
context.getDeclaredDatasets();
+ if (ds != null && ds.size() > 0) {
+ DatasetFullyQualifiedName datasetName =
ds.keySet().iterator().next();
+ if (ds.get(datasetName) != null) {
+ Expression normBody = fetchDatasetDecl(ds.get(datasetName));
+ ds.get(datasetName).getQuery().setBody(normBody);
+ }
+ }
+ }
+
protected void loadAndInlineUdfsAndViews() throws CompilationException {
Pair<Map<FunctionSignature, FunctionDecl>,
Map<DatasetFullyQualifiedName, ViewDecl>> udfAndViewDecls =
loadUdfsAndViews(topStatement);
@@ -453,6 +467,7 @@ public class SqlppQueryRewriter implements IQueryRewriter {
fd.getNormalizedFuncBody().accept(callVisitor,
null);
}
}
+
}
break;
case WINDOW_EXPRESSION:
@@ -491,6 +506,16 @@ public class SqlppQueryRewriter implements IQueryRewriter {
return fd;
}
+ private Expression fetchDatasetDecl(DatasetDecl ds) throws
CompilationException {
+ String databaseName = ds.getNamespace().getDatabaseName();
+ DataverseName dataverseName = ds.getNamespace().getDataverseName();
+ String datasetName = ds.getName().toString();
+ Expression expression = rewriteFunctionOrViewBody(databaseName,
dataverseName,
+ new DatasetFullyQualifiedName(databaseName, dataverseName,
datasetName), ds.getQuery().getBody(),
+ Collections.emptyList(), false, ds.getSourceLocation());
+ return expression;
+ }
+
private ViewDecl fetchViewDecl(DatasetFullyQualifiedName viewName,
SourceLocation sourceLoc)
throws CompilationException {
IAType viewItemType = null;
@@ -617,7 +642,6 @@ public class SqlppQueryRewriter implements IQueryRewriter {
@Override
public Query createViewAccessorQuery(ViewDecl viewDecl, INamespaceResolver
namespaceResolver) {
boolean usingDatabase = namespaceResolver.isUsingDatabase();
- // dataverse_name.view_name
String databaseName = viewDecl.getViewName().getDatabaseName();
DataverseName dataverseName =
viewDecl.getViewName().getDataverseName();
String viewName = viewDecl.getViewName().getDatasetName();
@@ -626,6 +650,18 @@ public class SqlppQueryRewriter implements IQueryRewriter {
return ExpressionUtils.createWrappedQuery(vAccessExpr,
viewDecl.getSourceLocation());
}
+ @Override
+ public Query createDatasetAccessorQuery(DatasetDecl datasetDecl,
INamespaceResolver namespaceResolver,
+ Namespace namespace) {
+ boolean usingDatabase = namespaceResolver.isUsingDatabase();
+ String databaseName = namespace.getDatabaseName();
+ DataverseName dataverseName = namespace.getDataverseName();
+ String datasetName = datasetDecl.getName().toString();
+ Expression datasetAccessExpression =
createDatasetAccessExpression(databaseName, dataverseName, datasetName,
+ datasetDecl.getSourceLocation(), usingDatabase);
+ return ExpressionUtils.createWrappedQuery(datasetAccessExpression,
datasetDecl.getSourceLocation());
+ }
+
private static Expression createDatasetAccessExpression(String
databaseName, DataverseName dataverseName,
String datasetName, SourceLocation sourceLoc, boolean
usingDatabase) {
AbstractExpression resultExpr;
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppLoadAccessedDataset.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppLoadAccessedDataset.java
index 8b44df3d00..2f3323fb75 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppLoadAccessedDataset.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppLoadAccessedDataset.java
@@ -30,6 +30,7 @@ import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.ILangExpression;
import org.apache.asterix.lang.common.expression.CallExpr;
import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
+import org.apache.asterix.lang.common.statement.DatasetDecl;
import org.apache.asterix.lang.common.statement.FunctionDecl;
import org.apache.asterix.lang.common.statement.ViewDecl;
import org.apache.asterix.lang.common.util.ExpressionUtils;
@@ -66,18 +67,26 @@ public class SqlppLoadAccessedDataset extends
AbstractSqlppSimpleExpressionVisit
datasetName = ExpressionUtils.getStringLiteral(exprs.get(2));
EntityDetails.EntityType entityType =
EntityDetails.EntityType.DATASET;
- if (exprs.size() > 3 &&
Boolean.TRUE.equals(ExpressionUtils.getBooleanLiteral(exprs.get(3)))) {
- DatasetFullyQualifiedName viewDatasetName =
+ if (exprs.size() > 3) {
+ DatasetFullyQualifiedName viewOrDatasetName =
new DatasetFullyQualifiedName(databaseName,
dataverseName, datasetName);
- Map<DatasetFullyQualifiedName, ViewDecl> declaredViews =
context.getDeclaredViews();
- if (declaredViews.containsKey(viewDatasetName)) {
- return;
+ if
(Boolean.TRUE.equals(ExpressionUtils.getBooleanLiteral(exprs.get(3)))) {
+ Map<DatasetFullyQualifiedName, ViewDecl> declaredViews =
context.getDeclaredViews();
+ if (declaredViews.containsKey(viewOrDatasetName)) {
+ return;
+ }
+ entityType = EntityDetails.EntityType.VIEW;
+ } else if
(Boolean.FALSE.equals(ExpressionUtils.getBooleanLiteral(exprs.get(3)))) {
+ Map<DatasetFullyQualifiedName, DatasetDecl>
declaredVDatasets = context.getDeclaredDatasets();
+ if (declaredVDatasets.containsKey(viewOrDatasetName)) {
+ return;
+ }
}
- entityType = EntityDetails.EntityType.VIEW;
}
context.getMetadataProvider()
.addAccessedEntity(new EntityDetails(databaseName,
dataverseName, datasetName, entityType));
+
} else {
FunctionSignature signature = expression.getFunctionSignature();
Map<FunctionSignature, FunctionDecl> declaredFunctions =
context.getDeclaredFunctions();
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
index 346ad4f079..d5c43bb1e5 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
@@ -42,6 +42,7 @@ import org.apache.asterix.lang.common.expression.CallExpr;
import org.apache.asterix.lang.common.expression.FieldAccessor;
import org.apache.asterix.lang.common.expression.VariableExpr;
import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
+import org.apache.asterix.lang.common.statement.DatasetDecl;
import org.apache.asterix.lang.common.statement.ViewDecl;
import org.apache.asterix.lang.common.struct.Identifier;
import org.apache.asterix.lang.common.struct.VarIdentifier;
@@ -187,12 +188,19 @@ public class VariableCheckAndRewriteVisitor extends
AbstractSqlppExpressionScopi
String resolvedDatasetName;
boolean viaSynonym, isView;
ViewDecl viewDecl = findDeclaredView(databaseName, dataverseName,
datasetName);
+ DatasetDecl datasetDecl = findDeclaredDataset(databaseName,
dataverseName, datasetName);
if (viewDecl != null) {
resolvedDatabaseName = viewDecl.getViewName().getDatabaseName();
resolvedDataverseName = viewDecl.getViewName().getDataverseName();
resolvedDatasetName = viewDecl.getViewName().getDatasetName();
viaSynonym = false;
isView = true;
+ } else if (datasetDecl != null) {
+ resolvedDatabaseName = databaseName;
+ resolvedDataverseName = dataverseName;
+ resolvedDatasetName = datasetName;
+ viaSynonym = false;
+ isView = false;
} else {
Pair<Dataset, Boolean> p = findDataset(databaseName,
dataverseName, datasetName, true, sourceLoc);
if (p == null) {
@@ -305,6 +313,12 @@ public class VariableCheckAndRewriteVisitor extends
AbstractSqlppExpressionScopi
: declaredViews.get(new
DatasetFullyQualifiedName(databaseName, dataverseName, viewName));
}
+ private DatasetDecl findDeclaredDataset(String databaseName, DataverseName
dataverseName, String datasetName) {
+ Map<DatasetFullyQualifiedName, DatasetDecl> declaredDatasets =
context.getDeclaredDatasets();
+ return declaredDatasets.isEmpty() ? null
+ : declaredDatasets.get(new
DatasetFullyQualifiedName(databaseName, dataverseName, datasetName));
+ }
+
@Override
public Expression visit(CallExpr callExpr, ILangExpression arg) throws
CompilationException {
// skip variables inside SQL-92 aggregates (they will be resolved by
SqlppGroupByAggregationSugarVisitor)
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
index 9d41097111..9aa5d84bba 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
@@ -19,6 +19,8 @@
package org.apache.asterix.metadata.entities;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -42,6 +44,7 @@ import
org.apache.asterix.common.ioopcallbacks.LSMIndexIOOperationCallbackFactor
import
org.apache.asterix.common.ioopcallbacks.LSMIndexPageWriteCallbackFactory;
import org.apache.asterix.common.metadata.DatasetFullyQualifiedName;
import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.DependencyFullyQualifiedName;
import org.apache.asterix.common.metadata.IDataset;
import org.apache.asterix.common.metadata.MetadataUtil;
import org.apache.asterix.common.transactions.IRecoveryManager.ResourceType;
@@ -882,4 +885,23 @@ public class Dataset implements IMetadataEntity<Dataset>,
IDataset {
public ILSMTupleFilterCallbackFactory getTupleFilterCallbackFactory() {
return NoOpLSMTupleFilterCallbackFactory.INSTANCE;
}
+
+ public static List<DependencyKind> DEPENDENCIES_SCHEMA =
+ Arrays.asList(DependencyKind.DATASET, DependencyKind.FUNCTION,
DependencyKind.TYPE, DependencyKind.SYNONYM);
+
+ public static List<List<DependencyFullyQualifiedName>> createDependencies(
+ List<DependencyFullyQualifiedName> datasetDependencies,
+ List<DependencyFullyQualifiedName> functionDependencies,
+ List<DependencyFullyQualifiedName> typeDependencies,
+ List<DependencyFullyQualifiedName> synonymDependencies) {
+ List<List<DependencyFullyQualifiedName>> depList = new
ArrayList<>(DEPENDENCIES_SCHEMA.size());
+ depList.add(datasetDependencies);
+ depList.add(functionDependencies);
+ depList.add(typeDependencies);
+ if (!synonymDependencies.isEmpty()) {
+ depList.add(synonymDependencies);
+ }
+ return depList;
+ }
+
}