[ASTERIXDB-3259][MTD] Include 'database' in 'dataverse' references
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
Anytime there is a reference to the dataverse in metadata, database
should be included.
- Dataset: include recordTypeDatabaseName/metaTypeDatabaseName.
- View:
- Function: include libraryDatabaseName
- Synonym: include objectDatabaseName
- Dataset SerDe: "DatatypeDatabaseName" & "MetatypeDatabaseName".
- View SerDe: "RefDatabaseName"
- Function SerDe: "ReturnTypeDatabaseName" & "LibraryDatabaseName"
- Synonym SerDe: "ObjectDatabaseName"
- DatasourceAdapter SerDe: "LibraryDatabaseName"
- Include 'database' in dependency list of views/functions
- Use DependencyFullyQualifiedName instead of
Triple<DataverseName, String, String>
Change-Id: I66f7ba17b7449def4f705b9c19346e1d5e53f5a3
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17832
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
Reviewed-by: Murtadha Hubail <mhubail@apache.org>
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 7ca021a..024cb17 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
@@ -90,6 +90,7 @@
import org.apache.asterix.common.functions.FunctionSignature;
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.IMetadataLockUtil;
import org.apache.asterix.common.metadata.MetadataConstants;
@@ -824,6 +825,8 @@
DataverseName metaItemTypeDataverseName, String metaItemTypeName, IHyracksClientConnection hcc,
IRequestParameters requestParameters) throws Exception {
String database = MetadataUtil.resolveDatabase(null, dataverseName);
+ String itemTypeDatabase = MetadataUtil.resolveDatabase(null, itemTypeDataverseName);
+ String metaItemDatabase = MetadataUtil.resolveDatabase(null, metaItemTypeDataverseName);
MutableObject<ProgressState> progress = new MutableObject<>(ProgressState.NO_PROGRESS);
SourceLocation sourceLoc = dd.getSourceLocation();
DatasetType dsType = dd.getDatasetType();
@@ -951,9 +954,10 @@
}
// #. add a new dataset with PendingAddOp
- dataset = (Dataset) createDataset(dd, database, dataverseName, datasetName, itemTypeDataverseName,
- itemTypeName, metaItemTypeDataverseName, metaItemTypeName, dsType, compactionPolicy,
- compactionPolicyProperties, compressionScheme, datasetFormatInfo, datasetDetails, ngName);
+ dataset = (Dataset) createDataset(dd, database, dataverseName, datasetName, itemTypeDatabase,
+ itemTypeDataverseName, itemTypeName, metaItemDatabase, metaItemTypeDataverseName, metaItemTypeName,
+ dsType, compactionPolicy, compactionPolicyProperties, compressionScheme, datasetFormatInfo,
+ datasetDetails, ngName);
MetadataManager.INSTANCE.addDataset(metadataProvider.getMetadataTxnContext(), dataset);
if (itemTypeIsInline) {
@@ -1046,14 +1050,14 @@
}
protected IDataset createDataset(DatasetDecl dd, String database, DataverseName dataverseName, String datasetName,
- DataverseName itemTypeDataverseName, String itemTypeName, DataverseName metaItemTypeDataverseName,
- String metaItemTypeName, DatasetType dsType, String compactionPolicy,
- Map<String, String> compactionPolicyProperties, String compressionScheme,
- DatasetFormatInfo datasetFormatInfo, IDatasetDetails datasetDetails, String ngName)
- throws AlgebricksException {
- return new Dataset(database, dataverseName, datasetName, itemTypeDataverseName, itemTypeName,
- metaItemTypeDataverseName, metaItemTypeName, ngName, compactionPolicy, compactionPolicyProperties,
- datasetDetails, dd.getHints(), dsType, DatasetIdFactory.generateDatasetId(),
+ String itemTypeDatabase, DataverseName itemTypeDataverseName, String itemTypeName,
+ String metaItemTypeDatabase, DataverseName metaItemTypeDataverseName, String metaItemTypeName,
+ DatasetType dsType, String compactionPolicy, Map<String, String> compactionPolicyProperties,
+ String compressionScheme, DatasetFormatInfo datasetFormatInfo, IDatasetDetails datasetDetails,
+ String ngName) throws AlgebricksException {
+ return new Dataset(database, dataverseName, datasetName, itemTypeDatabase, itemTypeDataverseName, itemTypeName,
+ metaItemTypeDatabase, metaItemTypeDataverseName, metaItemTypeName, ngName, compactionPolicy,
+ compactionPolicyProperties, datasetDetails, dd.getHints(), dsType, DatasetIdFactory.generateDatasetId(),
MetadataUtil.PENDING_ADD_OP, compressionScheme, datasetFormatInfo);
}
@@ -2658,6 +2662,7 @@
DataverseName dataverseName, String viewName, DataverseName itemTypeDataverseName, String itemTypeName,
IStatementRewriter stmtRewriter, IRequestParameters requestParameters) throws Exception {
String database = MetadataUtil.resolveDatabase(null, dataverseName);
+ String itemTypeDatabase = MetadataUtil.resolveDatabase(null, itemTypeDataverseName);
SourceLocation sourceLoc = cvs.getSourceLocation();
MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
metadataProvider.setMetadataTxnContext(mdTxnCtx);
@@ -2808,14 +2813,14 @@
apiFramework.reWriteQuery(langRewritingContext, wrappedQuery, sessionOutput, false, false,
Collections.emptyList());
- List<List<Triple<DataverseName, String, String>>> dependencies =
+ List<List<DependencyFullyQualifiedName>> dependencies =
ViewUtil.getViewDependencies(viewDecl, foreignKeys, queryRewriter);
ViewDetails viewDetails = new ViewDetails(cvs.getViewBody(), dependencies, cvs.getDefaultNull(),
primaryKeyFields, foreignKeys, datetimeFormat, dateFormat, timeFormat);
- Dataset view = new Dataset(database, dataverseName, viewName, itemTypeDataverseName, itemTypeName,
- MetadataConstants.METADATA_NODEGROUP_NAME, "", Collections.emptyMap(), viewDetails,
+ Dataset view = new Dataset(database, dataverseName, viewName, itemTypeDatabase, itemTypeDataverseName,
+ itemTypeName, MetadataConstants.METADATA_NODEGROUP_NAME, "", Collections.emptyMap(), viewDetails,
Collections.emptyMap(), DatasetType.VIEW, 0, MetadataUtil.PENDING_NO_OP);
if (existingDataset == null) {
if (itemTypeIsInline) {
@@ -2889,11 +2894,11 @@
DatasetUtil.getFullyQualifiedDisplayName(dataverseName, viewName));
}
MetadataManager.INSTANCE.dropDataset(mdTxnCtx, database, dataverseName, viewName, false);
- if (TypeUtil.isDatasetInlineTypeName(dataset, dataset.getItemTypeDataverseName(),
+ String itemTypeDatabaseName = dataset.getItemTypeDatabaseName();
+ if (TypeUtil.isDatasetInlineTypeName(dataset, itemTypeDatabaseName, dataset.getItemTypeDataverseName(),
dataset.getItemTypeName())) {
- String itemDatabase = MetadataUtil.resolveDatabase(null, dataset.getItemTypeDataverseName());
- MetadataManager.INSTANCE.dropDatatype(mdTxnCtx, itemDatabase, dataset.getItemTypeDataverseName(),
- dataset.getItemTypeName());
+ MetadataManager.INSTANCE.dropDatatype(mdTxnCtx, itemTypeDatabaseName,
+ dataset.getItemTypeDataverseName(), dataset.getItemTypeName());
}
MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
return true;
@@ -3053,12 +3058,12 @@
List<String> externalIdentifier = cfs.getExternalIdentifier();
ExternalFunctionCompilerUtil.validateExternalIdentifier(externalIdentifier, language,
cfs.getSourceLocation());
- List<List<Triple<DataverseName, String, String>>> dependencies =
+ List<List<DependencyFullyQualifiedName>> dependencies =
FunctionUtil.getExternalFunctionDependencies(depTypes);
function = new Function(functionSignature, paramNames, paramTypes, returnTypeSignature, null,
- FunctionKind.SCALAR.toString(), library.getLanguage(), libraryDataverseName, libraryName,
- externalIdentifier, cfs.getNullCall(), cfs.getDeterministic(), cfs.getResources(),
+ FunctionKind.SCALAR.toString(), library.getLanguage(), libraryDatabase, libraryDataverseName,
+ libraryName, externalIdentifier, cfs.getNullCall(), cfs.getDeterministic(), cfs.getResources(),
dependencies);
} else {
List<Pair<VarIdentifier, TypeExpression>> paramList = cfs.getParameters();
@@ -3091,13 +3096,13 @@
apiFramework.reWriteQuery(langRewritingContext, wrappedQuery, sessionOutput, false, false,
Collections.emptyList());
- List<List<Triple<DataverseName, String, String>>> dependencies =
+ List<List<DependencyFullyQualifiedName>> dependencies =
FunctionUtil.getFunctionDependencies(fd, queryRewriter);
newInlineTypes = Collections.emptyMap();
function = new Function(functionSignature, paramNames, null, null, cfs.getFunctionBody(),
FunctionKind.SCALAR.toString(), compilationProvider.getParserFactory().getLanguage(), null,
- null, null, null, null, null, dependencies);
+ null, null, null, null, null, null, dependencies);
}
if (existingFunction == null) {
@@ -3662,7 +3667,9 @@
}
throw new CompilationException(ErrorCode.SYNONYM_EXISTS, css.getSourceLocation(), synonymName);
}
- synonym = new Synonym(database, dataverseName, synonymName, objectDataverseName, objectName);
+ String objectDatabaseName = MetadataUtil.resolveDatabase(null, objectDataverseName);
+ synonym = new Synonym(database, dataverseName, synonymName, objectDatabaseName, objectDataverseName,
+ objectName);
MetadataManager.INSTANCE.addSynonym(metadataProvider.getMetadataTxnContext(), synonym);
MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
return CreateResult.CREATED;
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java
index 9cf4ec6..13dc4f9 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java
@@ -84,6 +84,7 @@
static String[] nodes = { "node1", "node2" };
static ActiveNotificationHandler handler;
static DataverseName dataverseName = MetadataConstants.DEFAULT_DATAVERSE_NAME;
+ static String recordTypeDatabaseName = null;
static String database = MetadataUtil.databaseFor(dataverseName);
static String entityName = "entityName";
static EntityId entityId = new EntityId(Feed.EXTENSION_NAME, database, dataverseName, entityName);
@@ -112,10 +113,10 @@
jobIdFactory = new JobIdFactory(CcId.valueOf((short) 0));
handler = new ActiveNotificationHandler();
allDatasets = new ArrayList<>();
- firstDataset = new Dataset(database, dataverseName, "firstDataset", null, null, null, null, null, null, null,
- null, 0, 0);
- secondDataset = new Dataset(database, dataverseName, "secondDataset", null, null, null, null, null, null, null,
- null, 0, 0);
+ firstDataset = new Dataset(database, dataverseName, "firstDataset", recordTypeDatabaseName, null, null, null,
+ null, null, null, null, null, 0, 0);
+ secondDataset = new Dataset(database, dataverseName, "secondDataset", recordTypeDatabaseName, null, null, null,
+ null, null, null, null, null, 0, 0);
allDatasets.add(firstDataset);
allDatasets.add(secondDataset);
AtomicInteger threadCounter = new AtomicInteger(0);
@@ -990,8 +991,8 @@
WaitForStateSubscriber recoveringSubscriber =
new WaitForStateSubscriber(listener, EnumSet.of(ActivityState.RECOVERING));
recoveringSubscriber.sync();
- Dataset newDataset = new Dataset(database, dataverseName, "newDataset", null, null, null, null, null, null,
- null, null, 0, 0);
+ Dataset newDataset = new Dataset(database, dataverseName, "newDataset", recordTypeDatabaseName, null, null,
+ null, null, null, null, null, null, 0, 0);
Action add = users[1].addDataset(newDataset, listener);
listener.allowStep();
runningSubscriber.sync();
@@ -1017,8 +1018,8 @@
new WaitForStateSubscriber(listener, EnumSet.of(ActivityState.RECOVERING));
recoveringSubscriber.sync();
tempFailSubscriber = new WaitForStateSubscriber(listener, EnumSet.of(ActivityState.TEMPORARILY_FAILED));
- Dataset newDataset = new Dataset(database, dataverseName, "newDataset", null, null, null, null, null, null,
- null, null, 0, 0);
+ Dataset newDataset = new Dataset(database, dataverseName, "newDataset", recordTypeDatabaseName, null, null,
+ null, null, null, null, null, null, 0, 0);
Action add = users[1].addDataset(newDataset, listener);
listener.allowStep();
tempFailSubscriber.sync();
@@ -1044,8 +1045,8 @@
new WaitForStateSubscriber(listener, EnumSet.of(ActivityState.RECOVERING));
recoveringSubscriber.sync();
tempFailSubscriber = new WaitForStateSubscriber(listener, EnumSet.of(ActivityState.TEMPORARILY_FAILED));
- Dataset newDataset = new Dataset(database, dataverseName, "newDataset", null, null, null, null, null, null,
- null, null, 0, 0);
+ Dataset newDataset = new Dataset(database, dataverseName, "newDataset", recordTypeDatabaseName, null, null,
+ null, null, null, null, null, null, 0, 0);
Action add = users[1].addDataset(newDataset, listener);
listener.allowStep();
tempFailSubscriber.sync();
@@ -1063,8 +1064,8 @@
WaitForStateSubscriber subscriber =
new WaitForStateSubscriber(listener, Collections.singleton(ActivityState.STARTING));
subscriber.sync();
- Dataset newDataset = new Dataset(database, dataverseName, "newDataset", null, null, null, null, null, null,
- null, null, 0, 0);
+ Dataset newDataset = new Dataset(database, dataverseName, "newDataset", recordTypeDatabaseName, null, null,
+ null, null, null, null, null, null, 0, 0);
Action createDatasetAction = users[1].addDataset(newDataset, listener);
listener.allowStep();
startAction.sync();
@@ -1079,8 +1080,8 @@
@Test
public void testCreateNewDatasetWhileRunning() throws Exception {
testStartWhenStartSucceed();
- Dataset newDataset = new Dataset(database, dataverseName, "newDataset", null, null, null, null, null, null,
- null, null, 0, 0);
+ Dataset newDataset = new Dataset(database, dataverseName, "newDataset", recordTypeDatabaseName, null, null,
+ null, null, null, null, null, null, 0, 0);
Action createDatasetAction = users[1].addDataset(newDataset, listener);
createDatasetAction.sync();
assertFailure(createDatasetAction, ErrorCode.CANNOT_ADD_DATASET_TO_ACTIVE_ENTITY);
@@ -1099,8 +1100,8 @@
WaitForStateSubscriber subscriber =
new WaitForStateSubscriber(listener, EnumSet.of(ActivityState.SUSPENDING, ActivityState.SUSPENDED));
subscriber.sync();
- Dataset newDataset = new Dataset(database, dataverseName, "newDataset", null, null, null, null, null, null,
- null, null, 0, 0);
+ Dataset newDataset = new Dataset(database, dataverseName, "newDataset", recordTypeDatabaseName, null, null,
+ null, null, null, null, null, null, 0, 0);
Action createDatasetAction = users[0].addDataset(newDataset, listener);
listener.allowStep();
listener.allowStep();
@@ -1118,8 +1119,8 @@
public void testCreateNewDatasetWhilePermanentFailure() throws Exception {
testRecoveryFailureAfterOneAttemptCompilationFailure();
Assert.assertEquals(ActivityState.STOPPED, listener.getState());
- Dataset newDataset = new Dataset(database, dataverseName, "newDataset", null, null, null, null, null, null,
- null, null, 0, 0);
+ Dataset newDataset = new Dataset(database, dataverseName, "newDataset", recordTypeDatabaseName, null, null,
+ null, null, null, null, null, null, 0, 0);
Action createDatasetAction = users[0].addDataset(newDataset, listener);
createDatasetAction.sync();
assertSuccess(createDatasetAction);
@@ -1551,8 +1552,8 @@
Action query = users[1].query(firstDataset, new Semaphore(1));
query.sync();
assertSuccess(query);
- Dataset newDataset = new Dataset(database, dataverseName, "newDataset", null, null, null, null, null, null,
- null, null, 0, 0);
+ Dataset newDataset = new Dataset(database, dataverseName, "newDataset", recordTypeDatabaseName, null, null,
+ null, null, null, null, null, null, 0, 0);
Action addDataset = users[1].addDataset(newDataset, listener);
// blocked by suspension
Assert.assertFalse(addDataset.isDone());
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestDataset.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestDataset.java
index 9175a1c..210440d 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestDataset.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestDataset.java
@@ -51,9 +51,10 @@
String recordTypeName, String nodeGroupName, String compactionPolicy,
Map<String, String> compactionPolicyProperties, IDatasetDetails datasetDetails, Map<String, String> hints,
DatasetType datasetType, int datasetId, int pendingOp) {
- super(MetadataUtil.databaseFor(dataverseName), dataverseName, datasetName, recordTypeDataverseName,
- recordTypeName, nodeGroupName, compactionPolicy, compactionPolicyProperties, datasetDetails, hints,
- datasetType, datasetId, pendingOp);
+ super(MetadataUtil.databaseFor(dataverseName), dataverseName, datasetName,
+ MetadataUtil.databaseFor(recordTypeDataverseName), recordTypeDataverseName, recordTypeName,
+ nodeGroupName, compactionPolicy, compactionPolicyProperties, datasetDetails, hints, datasetType,
+ datasetId, pendingOp);
}
@Override
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java
index 0900f03..7583307 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java
@@ -322,9 +322,9 @@
private void addDataset(ICcApplicationContext appCtx, Dataset source, int datasetPostfix, boolean abort)
throws Exception {
Dataset dataset = new Dataset(source.getDatabaseName(), source.getDataverseName(), "ds_" + datasetPostfix,
- source.getDataverseName(), source.getDatasetType().name(), source.getNodeGroupName(),
- NoMergePolicyFactory.NAME, null, source.getDatasetDetails(), source.getHints(),
- DatasetConfig.DatasetType.INTERNAL, datasetPostfix, 0);
+ source.getDatabaseName(), source.getDataverseName(), source.getDatasetType().name(),
+ source.getNodeGroupName(), NoMergePolicyFactory.NAME, null, source.getDatasetDetails(),
+ source.getHints(), DatasetConfig.DatasetType.INTERNAL, datasetPostfix, 0);
MetadataProvider metadataProvider = MetadataProvider.create(appCtx, null);
final MetadataTransactionContext writeTxn = MetadataManager.INSTANCE.beginTransaction();
metadataProvider.setMetadataTxnContext(writeTxn);
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
index 26e6798..d5c8465 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
@@ -109,8 +109,8 @@
String database = MetadataUtil.databaseFor(dvName);
List<List<String>> partitioningKeys = new ArrayList<>();
partitioningKeys.add(Collections.singletonList("key"));
- Dataset dataset = new Dataset(database, dvName, DATASET_NAME, dvName, DATA_TYPE_NAME, NODE_GROUP_NAME,
- NoMergePolicyFactory.NAME, null,
+ Dataset dataset = new Dataset(database, dvName, DATASET_NAME, database, dvName, DATA_TYPE_NAME,
+ NODE_GROUP_NAME, NoMergePolicyFactory.NAME, null,
new InternalDatasetDetails(null, InternalDatasetDetails.PartitioningStrategy.HASH, partitioningKeys,
null, null, null, false, null, null),
null, DatasetConfig.DatasetType.INTERNAL, DATASET_ID, 0);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/synonym/synonym-01/synonym-01.9.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/synonym/synonym-01/synonym-01.9.adm
index 0ff7309..6427b88 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/synonym/synonym-01/synonym-01.9.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/synonym/synonym-01/synonym-01.9.adm
@@ -1,4 +1,4 @@
-{ "DatabaseName": "Default", "DataverseName": "test", "SynonymName": "TweetMessagesSynonym", "ObjectDataverseName": "test", "ObjectName": "TweetMessages" }
-{ "DatabaseName": "Default", "DataverseName": "test", "SynonymName": "TweetMessagesSynonym2", "ObjectDataverseName": "test", "ObjectName": "TweetMessagesSynonym" }
-{ "DatabaseName": "Default", "DataverseName": "test", "SynonymName": "TwitterUsersSynonym", "ObjectDataverseName": "test", "ObjectName": "TwitterUsers" }
-{ "DatabaseName": "Default", "DataverseName": "test", "SynonymName": "TwitterUsersSynonym2", "ObjectDataverseName": "test", "ObjectName": "TwitterUsersSynonym" }
\ No newline at end of file
+{ "DatabaseName": "Default", "DataverseName": "test", "SynonymName": "TweetMessagesSynonym", "ObjectDataverseName": "test", "ObjectName": "TweetMessages", "ObjectDatabaseName": "Default" }
+{ "DatabaseName": "Default", "DataverseName": "test", "SynonymName": "TweetMessagesSynonym2", "ObjectDataverseName": "test", "ObjectName": "TweetMessagesSynonym", "ObjectDatabaseName": "Default" }
+{ "DatabaseName": "Default", "DataverseName": "test", "SynonymName": "TwitterUsersSynonym", "ObjectDataverseName": "test", "ObjectName": "TwitterUsers", "ObjectDatabaseName": "Default" }
+{ "DatabaseName": "Default", "DataverseName": "test", "SynonymName": "TwitterUsersSynonym2", "ObjectDataverseName": "test", "ObjectName": "TwitterUsersSynonym", "ObjectDatabaseName": "Default" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/user-defined-functions/check-dependencies-1/check-dependencies-1.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/user-defined-functions/check-dependencies-1/check-dependencies-1.1.adm
new file mode 100644
index 0000000..79599c6
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/user-defined-functions/check-dependencies-1/check-dependencies-1.1.adm
@@ -0,0 +1,7 @@
+{ "DataverseName": "B", "Name": "f0", "Dependencies": [ [ ], [ ], [ ] ] }
+{ "DataverseName": "B", "Name": "f5", "Dependencies": [ [ [ "", "Default", "B", "TweetMessages2" ], [ "", "Default", "C", "TweetMessages" ] ], [ [ "", "Default", "C", "f1", "2" ], [ "", "Default", "B", "f0", "2" ] ], [ ] ] }
+{ "DataverseName": "C", "Name": "f1", "Dependencies": [ [ ], [ ], [ ] ] }
+{ "DataverseName": "C", "Name": "f2", "Dependencies": [ [ [ "", "Default", "C", "TweetMessages" ] ], [ [ "", "Default", "C", "f1", "2" ], [ "", "Default", "B", "f0", "2" ] ], [ ] ] }
+{ "DataverseName": "C", "Name": "f3", "Dependencies": [ [ ], [ [ "", "Default", "C", "f2", "2" ] ], [ ] ] }
+{ "DataverseName": "C", "Name": "f4", "Dependencies": [ [ [ "", "Default", "C", "TweetMessages" ] ], [ ], [ ] ] }
+{ "DataverseName": "C", "Name": "f5", "Dependencies": [ [ ], [ ], [ ], [ [ "", "Default", "C", "TweetMessagesSyn1" ], [ "", "Default", "C", "TweetMessagesSyn2" ] ] ] }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/user-defined-functions/check-dependencies-1/check-dependencies-1.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/user-defined-functions/check-dependencies-1/check-dependencies-1.2.adm
new file mode 100644
index 0000000..2188fd8
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/user-defined-functions/check-dependencies-1/check-dependencies-1.2.adm
@@ -0,0 +1,5 @@
+{ "DataverseName": "X", "Name": "fx1", "Dependencies": [ [ ], [ ], [ ] ] }
+{ "DataverseName": "X", "Name": "fx2", "Dependencies": [ [ ], [ ], [ ] ] }
+{ "DataverseName": "X", "Name": "fx3", "Dependencies": [ [ ], [ [ "", "Default", "X", "fx1", "1" ], [ "", "Default", "X", "fx2", "-1" ] ], [ ] ] }
+{ "DataverseName": "Y", "Name": "fy1", "Dependencies": [ [ ], [ ], [ ] ] }
+{ "DataverseName": "Y", "Name": "fy3", "Dependencies": [ [ ], [ [ "", "Default", "Y", "fy1", "1" ], [ "", "Default", "X", "fx2", "-1" ] ], [ ] ] }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/user-defined-functions/udf23/udf23.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/user-defined-functions/udf23/udf23.1.adm
index e4d644b..784e825 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/user-defined-functions/udf23/udf23.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/user-defined-functions/udf23/udf23.1.adm
@@ -1,6 +1,6 @@
-{ "DatabaseName": "System", "DataverseName": "Metadata", "DatasetName": "CompactionPolicy", "DatatypeDataverseName": "Metadata", "DatatypeName": "CompactionPolicyRecordType", "DatasetType": "INTERNAL", "GroupName": "MetadataGroup", "CompactionPolicy": "concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": "1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "PartitioningStrategy": "HASH", "PartitioningKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "CompactionPolicy" ] ], "PrimaryKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "CompactionPolicy" ] ], "Autogenerated": false }, "Hints": {{ }}, "Timestamp": "Sat Sep 30 23:42:12 PDT 2023", "DatasetId": 13, "PendingOp": 0, "DatasetFormat": { "Format": "ROW" } }
-{ "DatabaseName": "System", "DataverseName": "Metadata", "DatasetName": "Database", "DatatypeDataverseName": "Metadata", "DatatypeName": "DatabaseRecordType", "DatasetType": "INTERNAL", "GroupName": "MetadataGroup", "CompactionPolicy": "concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": "1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "PartitioningStrategy": "HASH", "PartitioningKey": [ [ "DatabaseName" ] ], "PrimaryKey": [ [ "DatabaseName" ] ], "Autogenerated": false }, "Hints": {{ }}, "Timestamp": "Sat Sep 30 23:42:12 PDT 2023", "DatasetId": 18, "PendingOp": 0, "DatasetFormat": { "Format": "ROW" } }
-{ "DatabaseName": "System", "DataverseName": "Metadata", "DatasetName": "Dataset", "DatatypeDataverseName": "Metadata", "DatatypeName": "DatasetRecordType", "DatasetType": "INTERNAL", "GroupName": "MetadataGroup", "CompactionPolicy": "concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": "1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "PartitioningStrategy": "HASH", "PartitioningKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "DatasetName" ] ], "PrimaryKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "DatasetName" ] ], "Autogenerated": false }, "Hints": {{ }}, "Timestamp": "Sat Sep 30 23:42:12 PDT 2023", "DatasetId": 2, "PendingOp": 0, "DatasetFormat": { "Format": "ROW" } }
-{ "DatabaseName": "System", "DataverseName": "Metadata", "DatasetName": "DatasourceAdapter", "DatatypeDataverseName": "Metadata", "DatatypeName": "DatasourceAdapterRecordType", "DatasetType": "INTERNAL", "GroupName": "MetadataGroup", "CompactionPolicy": "concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": "1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "PartitioningStrategy": "HASH", "PartitioningKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "Name" ] ], "PrimaryKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "Name" ] ], "Autogenerated": false }, "Hints": {{ }}, "Timestamp": "Sat Sep 30 23:42:12 PDT 2023", "DatasetId": 8, "PendingOp": 0, "DatasetFormat": { "Format": "ROW" } }
-{ "DatabaseName": "System", "DataverseName": "Metadata", "DatasetName": "Datatype", "DatatypeDataverseName": "Metadata", "DatatypeName": "DatatypeRecordType", "DatasetType": "INTERNAL", "GroupName": "MetadataGroup", "CompactionPolicy": "concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": "1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "PartitioningStrategy": "HASH", "PartitioningKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "DatatypeName" ] ], "PrimaryKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "DatatypeName" ] ], "Autogenerated": false }, "Hints": {{ }}, "Timestamp": "Sat Sep 30 23:42:12 PDT 2023", "DatasetId": 3, "PendingOp": 0, "DatasetFormat": { "Format": "ROW" } }
-{ "DatabaseName": "System", "DataverseName": "Metadata", "DatasetName": "Dataverse", "DatatypeDataverseName": "Metadata", "DatatypeName": "DataverseRecordType", "DatasetType": "INTERNAL", "GroupName": "MetadataGroup", "CompactionPolicy": "concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": "1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "PartitioningStrategy": "HASH", "PartitioningKey": [ [ "DatabaseName" ], [ "DataverseName" ] ], "PrimaryKey": [ [ "DatabaseName" ], [ "DataverseName" ] ], "Autogenerated": false }, "Hints": {{ }}, "Timestamp": "Sat Sep 30 23:42:12 PDT 2023", "DatasetId": 1, "PendingOp": 0, "DatasetFormat": { "Format": "ROW" } }
\ No newline at end of file
+{ "DatabaseName": "System", "DataverseName": "Metadata", "DatasetName": "CompactionPolicy", "DatatypeDataverseName": "Metadata", "DatatypeName": "CompactionPolicyRecordType", "DatasetType": "INTERNAL", "GroupName": "MetadataGroup", "CompactionPolicy": "concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": "1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "PartitioningStrategy": "HASH", "PartitioningKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "CompactionPolicy" ] ], "PrimaryKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "CompactionPolicy" ] ], "Autogenerated": false }, "Hints": {{ }}, "Timestamp": "Tue Oct 03 12:04:25 PDT 2023", "DatasetId": 13, "PendingOp": 0, "DatatypeDatabaseName": "System", "DatasetFormat": { "Format": "ROW" } }
+{ "DatabaseName": "System", "DataverseName": "Metadata", "DatasetName": "Database", "DatatypeDataverseName": "Metadata", "DatatypeName": "DatabaseRecordType", "DatasetType": "INTERNAL", "GroupName": "MetadataGroup", "CompactionPolicy": "concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": "1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "PartitioningStrategy": "HASH", "PartitioningKey": [ [ "DatabaseName" ] ], "PrimaryKey": [ [ "DatabaseName" ] ], "Autogenerated": false }, "Hints": {{ }}, "Timestamp": "Tue Oct 03 12:04:25 PDT 2023", "DatasetId": 18, "PendingOp": 0, "DatatypeDatabaseName": "System", "DatasetFormat": { "Format": "ROW" } }
+{ "DatabaseName": "System", "DataverseName": "Metadata", "DatasetName": "Dataset", "DatatypeDataverseName": "Metadata", "DatatypeName": "DatasetRecordType", "DatasetType": "INTERNAL", "GroupName": "MetadataGroup", "CompactionPolicy": "concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": "1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "PartitioningStrategy": "HASH", "PartitioningKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "DatasetName" ] ], "PrimaryKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "DatasetName" ] ], "Autogenerated": false }, "Hints": {{ }}, "Timestamp": "Tue Oct 03 12:04:25 PDT 2023", "DatasetId": 2, "PendingOp": 0, "DatatypeDatabaseName": "System", "DatasetFormat": { "Format": "ROW" } }
+{ "DatabaseName": "System", "DataverseName": "Metadata", "DatasetName": "DatasourceAdapter", "DatatypeDataverseName": "Metadata", "DatatypeName": "DatasourceAdapterRecordType", "DatasetType": "INTERNAL", "GroupName": "MetadataGroup", "CompactionPolicy": "concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": "1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "PartitioningStrategy": "HASH", "PartitioningKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "Name" ] ], "PrimaryKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "Name" ] ], "Autogenerated": false }, "Hints": {{ }}, "Timestamp": "Tue Oct 03 12:04:25 PDT 2023", "DatasetId": 8, "PendingOp": 0, "DatatypeDatabaseName": "System", "DatasetFormat": { "Format": "ROW" } }
+{ "DatabaseName": "System", "DataverseName": "Metadata", "DatasetName": "Datatype", "DatatypeDataverseName": "Metadata", "DatatypeName": "DatatypeRecordType", "DatasetType": "INTERNAL", "GroupName": "MetadataGroup", "CompactionPolicy": "concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": "1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "PartitioningStrategy": "HASH", "PartitioningKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "DatatypeName" ] ], "PrimaryKey": [ [ "DatabaseName" ], [ "DataverseName" ], [ "DatatypeName" ] ], "Autogenerated": false }, "Hints": {{ }}, "Timestamp": "Tue Oct 03 12:04:25 PDT 2023", "DatasetId": 3, "PendingOp": 0, "DatatypeDatabaseName": "System", "DatasetFormat": { "Format": "ROW" } }
+{ "DatabaseName": "System", "DataverseName": "Metadata", "DatasetName": "Dataverse", "DatatypeDataverseName": "Metadata", "DatatypeName": "DataverseRecordType", "DatasetType": "INTERNAL", "GroupName": "MetadataGroup", "CompactionPolicy": "concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": "1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "PartitioningStrategy": "HASH", "PartitioningKey": [ [ "DatabaseName" ], [ "DataverseName" ] ], "PrimaryKey": [ [ "DatabaseName" ], [ "DataverseName" ] ], "Autogenerated": false }, "Hints": {{ }}, "Timestamp": "Tue Oct 03 12:04:25 PDT 2023", "DatasetId": 1, "PendingOp": 0, "DatatypeDatabaseName": "System", "DatasetFormat": { "Format": "ROW" } }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-1/create-view-1.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-1/create-view-1.3.adm
new file mode 100644
index 0000000..561966e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-1/create-view-1.3.adm
@@ -0,0 +1,3 @@
+{ "DataverseName": "test1", "DatasetName": "v1", "DatatypeDataverseName": "Metadata", "DatatypeName": "AnyObject", "ViewDetails": { "Definition": "select sum(r) as v1 from range(1,3) r", "Dependencies": [ [ ], [ ], [ ] ] } }
+{ "DataverseName": "test1", "DatasetName": "vA", "DatatypeDataverseName": "Metadata", "DatatypeName": "AnyObject", "ViewDetails": { "Definition": "select v1.*, v2.*, f1.*, f2.*, s1.*, s2.*, d1.*\n from\n v1 v1,\n test2.v2 v2,\n f1() f1,\n test2.f2() f2,\n (\n select count(*) as s1 from DataverseSyn1\n where DataverseName like \"te%\"\n ) s1,\n (\n select count(*) as s2 from test2.DataverseSyn2\n where DataverseName like \"tes%\"\n ) s2,\n (\n select count(*) as d1 from Metadata.`Dataverse`\n where DataverseName like \"test%\"\n ) d1", "Dependencies": [ [ [ "", "Default", "test1", "v1" ], [ "", "Default", "test2", "v2" ], [ "", "System", "Metadata", "Dataverse" ] ], [ [ "", "Default", "test1", "f1", "0" ], [ "", "Default", "test2", "f2", "0" ] ], [ ], [ [ "", "Default", "test1", "DataverseSyn1" ], [ "", "Default", "test2", "DataverseSyn2" ] ] ] } }
+{ "DataverseName": "test2", "DatasetName": "v2", "DatatypeDataverseName": "Metadata", "DatatypeName": "AnyObject", "ViewDetails": { "Definition": "select sum(r) as v2 from range(1,2) r", "Dependencies": [ [ ], [ ], [ ] ] } }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-1/create-view-1.6.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-1/create-view-1.6.adm
new file mode 100644
index 0000000..e725a89
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-1/create-view-1.6.adm
@@ -0,0 +1 @@
+{ "DataverseName": "test1", "DatasetName": "vA", "DatatypeDataverseName": "Metadata", "DatatypeName": "AnyObject", "ViewDetails": { "Definition": "select v1.*, v2.*, f1.*, f2.*, s1.*, s2.*, d1.*\n from\n v1 v1,\n test2.v2 v2,\n f1() f1,\n test2.f2() f2,\n (\n select count(*) as s1 from DataverseSyn1\n where DataverseName like \"te%\"\n ) s1,\n (\n select count(*) as s2 from test2.DataverseSyn2\n where DataverseName like \"tes%\"\n ) s2,\n (\n select count(*) as d1 from Metadata.`Dataverse`\n where DataverseName like \"test%\"\n ) d1", "Dependencies": [ [ [ "", "Default", "test1", "v1" ], [ "", "Default", "test2", "v2" ], [ "", "System", "Metadata", "Dataverse" ] ], [ [ "", "Default", "test1", "f1", "0" ], [ "", "Default", "test2", "f2", "0" ] ], [ ], [ [ "", "Default", "test1", "DataverseSyn1" ], [ "", "Default", "test2", "DataverseSyn2" ] ] ] } }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-3-typed/create-view-3-typed.12.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-3-typed/create-view-3-typed.12.adm
new file mode 100644
index 0000000..49fefa4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-3-typed/create-view-3-typed.12.adm
@@ -0,0 +1,9 @@
+{ "DataverseName": "test1", "DatasetName": "v1", "DatatypeFields": [ { "FieldName": "c_id", "FieldType": "int32", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_i8", "FieldType": "int8", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_i16", "FieldType": "int16", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_i32", "FieldType": "int32", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_i64", "FieldType": "int64", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_f", "FieldType": "float", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_d", "FieldType": "double", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_b", "FieldType": "boolean", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_s", "FieldType": "string", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_datetime", "FieldType": "datetime", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_date", "FieldType": "date", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_time", "FieldType": "time", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_dur", "FieldType": "duration", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_ymdur", "FieldType": "year-month-duration", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_dtdur", "FieldType": "day-time-duration", "IsNullable": true, "IsMissable": true } ], "ViewDetails": { "Definition": "t1", "Dependencies": [ [ [ "", "Default", "test1", "t1" ] ], [ ], [ ] ], "Default": null } }
+{ "DataverseName": "test1", "DatasetName": "v2_ref_type", "DatatypeFields": [ { "FieldName": "c_id", "FieldType": "int32", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_i8", "FieldType": "int8", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_i16", "FieldType": "int16", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_i32", "FieldType": "int32", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_i64", "FieldType": "int64", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_f", "FieldType": "float", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_d", "FieldType": "double", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_b", "FieldType": "boolean", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_s", "FieldType": "string", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_datetime", "FieldType": "datetime", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_date", "FieldType": "date", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_time", "FieldType": "time", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_dur", "FieldType": "duration", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_ymdur", "FieldType": "year-month-duration", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_dtdur", "FieldType": "day-time-duration", "IsNullable": true, "IsMissable": true } ], "ViewDetails": { "Definition": "select c_id,\n c_i8, c_i16, c_i32, c_i64, c_f, c_d,\n c_b, c_s,\n c_datetime, c_date, c_time,\n c_dur, c_ymdur, c_dtdur\n from t1", "Dependencies": [ [ [ "", "Default", "test1", "t1" ] ], [ ], [ ] ], "Default": null } }
+{ "DataverseName": "test1", "DatasetName": "v3_datetime_format", "DatatypeFields": [ { "FieldName": "c_id", "FieldType": "int32", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_datetime", "FieldType": "datetime", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_date", "FieldType": "date", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_time", "FieldType": "time", "IsNullable": true, "IsMissable": true } ], "ViewDetails": { "Definition": "t2", "Dependencies": [ [ [ "", "Default", "test1", "t2" ] ], [ ], [ ] ], "Default": null, "DataFormat": [ "MM/DD/YYYY hh:mm:ss.nnna", "MM/DD/YYYY", "hh:mm:ss.nnna" ] } }
+{ "DataverseName": "test1", "DatasetName": "v4_date_format_only", "DatatypeFields": [ { "FieldName": "c_id", "FieldType": "int32", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_datetime", "FieldType": "datetime", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_date", "FieldType": "date", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_time", "FieldType": "time", "IsNullable": true, "IsMissable": true } ], "ViewDetails": { "Definition": "t2", "Dependencies": [ [ [ "", "Default", "test1", "t2" ] ], [ ], [ ] ], "Default": null, "DataFormat": [ null, "MM/DD/YYYY", null ] } }
+{ "DataverseName": "test1", "DatasetName": "v5_pk", "DatatypeFields": [ { "FieldName": "c_id", "FieldType": "int32", "IsNullable": false, "IsMissable": false }, { "FieldName": "c_datetime", "FieldType": "datetime", "IsNullable": true, "IsMissable": true } ], "ViewDetails": { "Definition": "t2", "Dependencies": [ [ [ "", "Default", "test1", "t2" ] ], [ ], [ ] ], "Default": null, "PrimaryKey": [ [ "c_id" ] ], "PrimaryKeyEnforced": false, "DataFormat": [ "MM/DD/YYYY hh:mm:ss.nnna", null, null ] } }
+{ "DataverseName": "test1", "DatasetName": "v6_pk_no_nulls", "DatatypeFields": [ { "FieldName": "c_i64", "FieldType": "int64", "IsNullable": false, "IsMissable": false }, { "FieldName": "c_id", "FieldType": "int32", "IsNullable": true, "IsMissable": true } ], "ViewDetails": { "Definition": "t1", "Dependencies": [ [ [ "", "Default", "test1", "t1" ] ], [ ], [ ] ], "Default": null, "PrimaryKey": [ [ "c_i64" ] ], "PrimaryKeyEnforced": false } }
+{ "DataverseName": "test1", "DatasetName": "v7_no_nulls", "DatatypeFields": [ { "FieldName": "c_i64", "FieldType": "int64", "IsNullable": false, "IsMissable": false }, { "FieldName": "c_id", "FieldType": "int32", "IsNullable": true, "IsMissable": true } ], "ViewDetails": { "Definition": "t1", "Dependencies": [ [ [ "", "Default", "test1", "t1" ] ], [ ], [ ] ], "Default": null } }
+{ "DataverseName": "test1", "DatasetName": "v8_no_nulls_multi", "DatatypeFields": [ { "FieldName": "c_id", "FieldType": "int32", "IsNullable": true, "IsMissable": true }, { "FieldName": "c_x", "FieldType": "int64", "IsNullable": false, "IsMissable": false }, { "FieldName": "c_y", "FieldType": "int64", "IsNullable": false, "IsMissable": false } ], "ViewDetails": { "Definition": "select\n c_id,\n case when to_bigint(c_i32) >= 0 then to_bigint(c_i32) when to_bigint(c_i32) < 0 then null else 0 end as c_x,\n case when to_bigint(c_i64) >= 0 then null when to_bigint(c_i64) < 0 then to_bigint(c_i64) else 0 end as c_y\n from t1", "Dependencies": [ [ [ "", "Default", "test1", "t1" ] ], [ ], [ ] ], "Default": null } }
+{ "DataverseName": "test1", "DatasetName": "v9_pk_composite", "DatatypeFields": [ { "FieldName": "c_id1", "FieldType": "int32", "IsNullable": false, "IsMissable": false }, { "FieldName": "c_id2", "FieldType": "int32", "IsNullable": false, "IsMissable": false } ], "ViewDetails": { "Definition": "select c_id as c_id1, -c_id as c_id2\n from t1", "Dependencies": [ [ [ "", "Default", "test1", "t1" ] ], [ ], [ ] ], "Default": null, "PrimaryKey": [ [ "c_id1" ], [ "c_id2" ] ], "PrimaryKeyEnforced": false } }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-7-foreign-key/create-view-7-foreign-key.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-7-foreign-key/create-view-7-foreign-key.2.adm
new file mode 100644
index 0000000..e2cef78
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-7-foreign-key/create-view-7-foreign-key.2.adm
@@ -0,0 +1,3 @@
+{ "DataverseName": "test1", "DatasetName": "employee_v1", "ViewDetails": { "Definition": "employee", "Dependencies": [ [ [ "", "Default", "test1", "employee" ] ], [ ], [ ] ], "Default": null, "PrimaryKey": [ [ "e_id" ] ], "PrimaryKeyEnforced": false, "ForeignKeys": [ { "ForeignKey": [ [ "e_mgr_id" ] ], "RefDatabaseName": "Default", "RefDataverseName": "test1", "RefDatasetName": "employee_v1", "IsEnforced": false } ] } }
+{ "DataverseName": "test1", "DatasetName": "employee_v2", "ViewDetails": { "Definition": "employee", "Dependencies": [ [ [ "", "Default", "test1", "employee" ] ], [ ], [ ] ], "Default": null, "PrimaryKey": [ [ "e_id" ] ], "PrimaryKeyEnforced": false, "ForeignKeys": [ { "ForeignKey": [ [ "e_mgr_id" ] ], "RefDatabaseName": "Default", "RefDataverseName": "test1", "RefDatasetName": "employee_v2", "IsEnforced": false }, { "ForeignKey": [ [ "e_hrr_id" ] ], "RefDatabaseName": "Default", "RefDataverseName": "test1", "RefDatasetName": "employee_v2", "IsEnforced": false } ] } }
+{ "DataverseName": "test2", "DatasetName": "employee2_v1", "ViewDetails": { "Definition": "employee2", "Dependencies": [ [ [ "", "Default", "test2", "employee2" ] ], [ ], [ ] ], "Default": null, "PrimaryKey": [ [ "e_id1" ], [ "e_id2" ] ], "PrimaryKeyEnforced": false, "ForeignKeys": [ { "ForeignKey": [ [ "e_mgr_id1" ], [ "e_mgr_id2" ] ], "RefDatabaseName": "Default", "RefDataverseName": "test2", "RefDatasetName": "employee2_v1", "IsEnforced": false }, { "ForeignKey": [ [ "e_hrr_id1" ], [ "e_hrr_id2" ] ], "RefDatabaseName": "Default", "RefDataverseName": "test2", "RefDatasetName": "employee2_v1", "IsEnforced": false } ] } }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-7-foreign-key/create-view-7-foreign-key.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-7-foreign-key/create-view-7-foreign-key.4.adm
new file mode 100644
index 0000000..fd736eb
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/create-view-7-foreign-key/create-view-7-foreign-key.4.adm
@@ -0,0 +1,3 @@
+{ "DataverseName": "test1", "DatasetName": "orders_v", "ViewDetails": { "Definition": "test2.orders", "Dependencies": [ [ [ "", "Default", "test2", "orders" ], [ "", "Default", "test2", "customers_v" ], [ "", "Default", "test1", "stores_v" ] ], [ ], [ ] ], "Default": null, "PrimaryKey": [ [ "o_id" ] ], "PrimaryKeyEnforced": false, "ForeignKeys": [ { "ForeignKey": [ [ "o_cid" ] ], "RefDatabaseName": "Default", "RefDataverseName": "test2", "RefDatasetName": "customers_v", "IsEnforced": false }, { "ForeignKey": [ [ "o_sidX" ], [ "o_sidY" ] ], "RefDatabaseName": "Default", "RefDataverseName": "test1", "RefDatasetName": "stores_v", "IsEnforced": false } ] } }
+{ "DataverseName": "test1", "DatasetName": "stores_v", "ViewDetails": { "Definition": "test2.stores", "Dependencies": [ [ [ "", "Default", "test2", "stores" ] ], [ ], [ ] ], "Default": null, "PrimaryKey": [ [ "s_id1" ], [ "s_id2" ] ], "PrimaryKeyEnforced": false } }
+{ "DataverseName": "test2", "DatasetName": "customers_v", "ViewDetails": { "Definition": "customers", "Dependencies": [ [ [ "", "Default", "test2", "customers" ] ], [ ], [ ] ], "Default": null, "PrimaryKey": [ [ "c_id" ] ], "PrimaryKeyEnforced": false } }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/view-1/view-1.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/view-1/view-1.4.adm
new file mode 100644
index 0000000..53346c4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/view-1/view-1.4.adm
@@ -0,0 +1,3 @@
+{ "Kind": "FUNCTION", "Name": "f5", "Definition": "select c1, c2 from s4", "Dependencies": [ [ ], [ ], [ ], [ [ "", "Default", "test1", "s4" ] ] ] }
+{ "Kind": "VIEW", "Name": "v3", "Definition": "select c1, c2 from s2", "Dependencies": [ [ ], [ ], [ ], [ [ "", "Default", "test1", "s2" ] ] ] }
+{ "Kind": "VIEW", "Name": "v6", "Definition": "select c1, c2 from f5() f5", "Dependencies": [ [ ], [ [ "", "Default", "test1", "f5", "0" ] ], [ ] ] }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/view-1/view-1.8.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/view-1/view-1.8.adm
new file mode 100644
index 0000000..36193ee
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/view/view-1/view-1.8.adm
@@ -0,0 +1,5 @@
+{ "Kind": "FUNCTION", "Name": "f5", "Dependencies": [ [ [ "", "Default", "test2", "v3" ] ], [ ], [ ] ] }
+{ "Kind": "FUNCTION", "Name": "f6", "Dependencies": [ [ [ "", "Default", "test2", "v4" ] ], [ ], [ ] ] }
+{ "Kind": "VIEW", "Name": "v3", "Dependencies": [ [ [ "", "Default", "test2", "ds1" ], [ "", "Default", "test2", "ds2" ] ], [ ], [ ] ] }
+{ "Kind": "VIEW", "Name": "v4", "Dependencies": [ [ [ "", "Default", "test2", "ds1" ], [ "", "Default", "test2", "ds2" ] ], [ ], [ ] ] }
+{ "Kind": "VIEW", "Name": "v9", "Dependencies": [ [ [ "", "Default", "test2", "ds1" ], [ "", "Default", "test2", "ds2" ], [ "", "Default", "test2", "v3" ], [ "", "Default", "test2", "v4" ] ], [ [ "", "Default", "test2", "f5", "0" ], [ "", "Default", "test2", "f6", "0" ] ], [ ], [ [ "", "Default", "test2", "s7" ], [ "", "Default", "test2", "s8" ] ] ] }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/DependencyFullyQualifiedName.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/DependencyFullyQualifiedName.java
new file mode 100644
index 0000000..7e810b0
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/DependencyFullyQualifiedName.java
@@ -0,0 +1,79 @@
+/*
+ * 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.common.metadata;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class DependencyFullyQualifiedName implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private final String databaseName;
+ private final DataverseName dataverseName;
+ private final String subName1;
+ private final String subName2;
+
+ public DependencyFullyQualifiedName(String databaseName, DataverseName dataverseName, String subName1,
+ String subName2) {
+ this.databaseName = databaseName;
+ this.dataverseName = dataverseName;
+ this.subName1 = subName1;
+ this.subName2 = subName2;
+ }
+
+ public String getDatabaseName() {
+ return databaseName;
+ }
+
+ public DataverseName getDataverseName() {
+ return dataverseName;
+ }
+
+ public String getSubName1() {
+ return subName1;
+ }
+
+ public String getSubName2() {
+ return subName2;
+ }
+
+ @Override
+ public String toString() {
+ return databaseName + "." + dataverseName + "." + subName1 + "." + subName2;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o instanceof DependencyFullyQualifiedName) {
+ DependencyFullyQualifiedName that = (DependencyFullyQualifiedName) o;
+ return Objects.equals(databaseName, that.databaseName) && Objects.equals(dataverseName, that.dataverseName)
+ && Objects.equals(subName1, that.subName1) && Objects.equals(subName2, that.subName2);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(databaseName, dataverseName, subName1, subName2);
+ }
+}
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java
index 5c91aef..925fada 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java
@@ -32,7 +32,7 @@
import org.apache.asterix.common.exceptions.ErrorCode;
import org.apache.asterix.common.functions.FunctionSignature;
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.lang.common.base.AbstractStatement;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.IQueryRewriter;
@@ -244,9 +244,9 @@
}
public static void collectDependencies(Expression expression, IQueryRewriter rewriter,
- List<Triple<DataverseName, String, String>> outDatasetDependencies,
- List<Triple<DataverseName, String, String>> outSynonymDependencies,
- List<Triple<DataverseName, String, String>> outFunctionDependencies) throws CompilationException {
+ List<DependencyFullyQualifiedName> outDatasetDependencies,
+ List<DependencyFullyQualifiedName> outSynonymDependencies,
+ List<DependencyFullyQualifiedName> outFunctionDependencies) throws CompilationException {
// Duplicate elimination
Set<DatasetFullyQualifiedName> seenDatasets = new HashSet<>();
Set<DatasetFullyQualifiedName> seenSynonyms = new HashSet<>();
@@ -266,21 +266,24 @@
if (synonymReference != null) {
// resolved via synonym -> store synonym name as a dependency
if (seenSynonyms.add(synonymReference)) {
- outSynonymDependencies.add(new Triple<>(synonymReference.getDataverseName(),
+ outSynonymDependencies.add(new DependencyFullyQualifiedName(
+ synonymReference.getDatabaseName(), synonymReference.getDataverseName(),
synonymReference.getDatasetName(), null));
}
} else {
// resolved directly -> store dataset (or view) name as a dependency
DatasetFullyQualifiedName datasetReference = dsArgs.first;
if (seenDatasets.add(datasetReference)) {
- outDatasetDependencies.add(new Triple<>(datasetReference.getDataverseName(),
+ outDatasetDependencies.add(new DependencyFullyQualifiedName(
+ datasetReference.getDatabaseName(), datasetReference.getDataverseName(),
datasetReference.getDatasetName(), null));
}
}
}
} else {
if (seenFunctions.add(signature)) {
- outFunctionDependencies.add(new Triple<>(signature.getDataverseName(), signature.getName(),
+ outFunctionDependencies.add(new DependencyFullyQualifiedName(signature.getDatabaseName(),
+ signature.getDataverseName(), signature.getName(),
Integer.toString(signature.getArity())));
}
}
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
index 1fb314c..8fba54e 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
@@ -37,6 +37,7 @@
import org.apache.asterix.common.functions.FunctionSignature;
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.MetadataUtil;
import org.apache.asterix.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.IParser;
@@ -206,7 +207,7 @@
};
}
- public static List<List<Triple<DataverseName, String, String>>> getFunctionDependencies(FunctionDecl fd,
+ public static List<List<DependencyFullyQualifiedName>> getFunctionDependencies(FunctionDecl fd,
IQueryRewriter rewriter) throws CompilationException {
Expression normBody = fd.getNormalizedFuncBody();
if (normBody == null) {
@@ -215,25 +216,26 @@
}
// Get the list of used functions and used datasets
- List<Triple<DataverseName, String, String>> datasetDependencies = new ArrayList<>();
- List<Triple<DataverseName, String, String>> synonymDependencies = new ArrayList<>();
- List<Triple<DataverseName, String, String>> functionDependencies = new ArrayList<>();
+ List<DependencyFullyQualifiedName> datasetDependencies = new ArrayList<>();
+ List<DependencyFullyQualifiedName> synonymDependencies = new ArrayList<>();
+ List<DependencyFullyQualifiedName> functionDependencies = new ArrayList<>();
ExpressionUtils.collectDependencies(normBody, rewriter, datasetDependencies, synonymDependencies,
functionDependencies);
- List<Triple<DataverseName, String, String>> typeDependencies = Collections.emptyList();
+ List<DependencyFullyQualifiedName> typeDependencies = Collections.emptyList();
return Function.createDependencies(datasetDependencies, functionDependencies, typeDependencies,
synonymDependencies);
}
- public static List<List<Triple<DataverseName, String, String>>> getExternalFunctionDependencies(
+ public static List<List<DependencyFullyQualifiedName>> getExternalFunctionDependencies(
Collection<TypeSignature> dependentTypes) {
- List<Triple<DataverseName, String, String>> datasetDependencies = Collections.emptyList();
- List<Triple<DataverseName, String, String>> functionDependencies = Collections.emptyList();
- List<Triple<DataverseName, String, String>> typeDependencies = new ArrayList<>(dependentTypes.size());
- List<Triple<DataverseName, String, String>> synonymDependencies = Collections.emptyList();
+ List<DependencyFullyQualifiedName> datasetDependencies = Collections.emptyList();
+ List<DependencyFullyQualifiedName> functionDependencies = Collections.emptyList();
+ List<DependencyFullyQualifiedName> typeDependencies = new ArrayList<>(dependentTypes.size());
+ List<DependencyFullyQualifiedName> synonymDependencies = Collections.emptyList();
for (TypeSignature t : dependentTypes) {
- typeDependencies.add(new Triple<>(t.getDataverseName(), t.getName(), null));
+ typeDependencies.add(
+ new DependencyFullyQualifiedName(t.getDatabaseName(), t.getDataverseName(), t.getName(), null));
}
return Function.createDependencies(datasetDependencies, functionDependencies, typeDependencies,
synonymDependencies);
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ViewUtil.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ViewUtil.java
index 975a387..23a2d1a 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ViewUtil.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ViewUtil.java
@@ -30,7 +30,7 @@
import org.apache.asterix.common.exceptions.ErrorCode;
import org.apache.asterix.common.functions.FunctionSignature;
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.lang.common.base.Expression;
import org.apache.asterix.lang.common.base.IParser;
import org.apache.asterix.lang.common.base.IParserFactory;
@@ -78,7 +78,7 @@
}
}
- public static List<List<Triple<DataverseName, String, String>>> getViewDependencies(ViewDecl viewDecl,
+ public static List<List<DependencyFullyQualifiedName>> getViewDependencies(ViewDecl viewDecl,
List<ViewDetails.ForeignKey> foreignKeys, IQueryRewriter rewriter) throws CompilationException {
Expression normBody = viewDecl.getNormalizedViewBody();
if (normBody == null) {
@@ -87,9 +87,9 @@
}
// Get the list of used functions and used datasets
- List<Triple<DataverseName, String, String>> datasetDependencies = new ArrayList<>();
- List<Triple<DataverseName, String, String>> synonymDependencies = new ArrayList<>();
- List<Triple<DataverseName, String, String>> functionDependencies = new ArrayList<>();
+ List<DependencyFullyQualifiedName> datasetDependencies = new ArrayList<>();
+ List<DependencyFullyQualifiedName> synonymDependencies = new ArrayList<>();
+ List<DependencyFullyQualifiedName> functionDependencies = new ArrayList<>();
ExpressionUtils.collectDependencies(normBody, rewriter, datasetDependencies, synonymDependencies,
functionDependencies);
@@ -101,19 +101,22 @@
if (isSelfReference || containsDependency(datasetDependencies, refName)) {
continue;
}
- datasetDependencies.add(new Triple<>(refName.getDataverseName(), refName.getDatasetName(), null));
+ datasetDependencies.add(new DependencyFullyQualifiedName(refName.getDatabaseName(),
+ refName.getDataverseName(), refName.getDatasetName(), null));
}
}
- List<Triple<DataverseName, String, String>> typeDependencies = Collections.emptyList();
+ List<DependencyFullyQualifiedName> typeDependencies = Collections.emptyList();
return ViewDetails.createDependencies(datasetDependencies, functionDependencies, typeDependencies,
synonymDependencies);
}
- private static boolean containsDependency(List<Triple<DataverseName, String, String>> inList,
+ private static boolean containsDependency(List<DependencyFullyQualifiedName> inList,
DatasetFullyQualifiedName searchName) {
- for (Triple<DataverseName, String, String> d : inList) {
- if (d.first.equals(searchName.getDataverseName()) && d.second.equals(searchName.getDatasetName())) {
+ for (DependencyFullyQualifiedName d : inList) {
+ if (d.getDatabaseName().equals(searchName.getDatabaseName())
+ && d.getDataverseName().equals(searchName.getDataverseName())
+ && d.getSubName1().equals(searchName.getDatasetName())) {
return true;
}
}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/IDatasetDetails.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/IDatasetDetails.java
index 47c6432..c7de084 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/IDatasetDetails.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/IDatasetDetails.java
@@ -22,11 +22,12 @@
import java.io.Serializable;
import org.apache.asterix.common.config.DatasetConfig.DatasetType;
+import org.apache.asterix.metadata.bootstrap.DatasetEntity;
import org.apache.hyracks.api.exceptions.HyracksDataException;
public interface IDatasetDetails extends Serializable {
DatasetType getDatasetType();
- void writeDatasetDetailsRecordType(DataOutput out) throws HyracksDataException;
+ void writeDatasetDetailsRecordType(DataOutput out, DatasetEntity datasetEntity) throws HyracksDataException;
}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
index 37053bf..e895465 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
@@ -39,6 +39,7 @@
import org.apache.asterix.common.exceptions.MetadataException;
import org.apache.asterix.common.functions.FunctionSignature;
import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.DependencyFullyQualifiedName;
import org.apache.asterix.common.metadata.MetadataIndexImmutableProperties;
import org.apache.asterix.common.metadata.MetadataUtil;
import org.apache.asterix.common.transactions.IRecoveryManager.ResourceType;
@@ -124,7 +125,6 @@
import org.apache.asterix.transaction.management.opcallbacks.UpsertOperationCallback;
import org.apache.asterix.transaction.management.service.transaction.DatasetIdFactory;
import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.common.utils.Triple;
import org.apache.hyracks.api.dataflow.value.IBinaryComparator;
import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -1255,10 +1255,10 @@
if (dataset.getDatasetType() == DatasetType.VIEW) {
ViewDetails viewDetails = (ViewDetails) dataset.getDatasetDetails();
List<DependencyKind> dependenciesSchema = ViewDetails.DEPENDENCIES_SCHEMA;
- List<List<Triple<DataverseName, String, String>>> dependencies = viewDetails.getDependencies();
+ List<List<DependencyFullyQualifiedName>> dependencies = viewDetails.getDependencies();
for (int i = 0, n = dependencies.size(); i < n; i++) {
- for (Triple<DataverseName, String, String> dependency : dependencies.get(i)) {
- if (dependency.first.equals(dataverseName)) {
+ for (DependencyFullyQualifiedName dependency : dependencies.get(i)) {
+ if (dependency.getDataverseName().equals(dataverseName)) {
DependencyKind dependencyKind = dependenciesSchema.get(i);
throw new AsterixException(
org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_DATAVERSE_DEPENDENT_EXISTS,
@@ -1278,10 +1278,10 @@
continue;
}
List<DependencyKind> dependenciesSchema = Function.DEPENDENCIES_SCHEMA;
- List<List<Triple<DataverseName, String, String>>> dependencies = function.getDependencies();
+ List<List<DependencyFullyQualifiedName>> dependencies = function.getDependencies();
for (int i = 0, n = dependencies.size(); i < n; i++) {
- for (Triple<DataverseName, String, String> dependency : dependencies.get(i)) {
- if (dependency.first.equals(dataverseName)) {
+ for (DependencyFullyQualifiedName dependency : dependencies.get(i)) {
+ if (dependency.getDataverseName().equals(dataverseName)) {
DependencyKind dependencyKind = dependenciesSchema.get(i);
throw new AsterixException(
org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_DATAVERSE_DEPENDENT_EXISTS,
@@ -1355,14 +1355,15 @@
throw new AlgebricksException(ErrorCode.ILLEGAL_STATE);
}
for (Function function : allFunctions) {
- List<List<Triple<DataverseName, String, String>>> functionDependencies = function.getDependencies();
+ List<List<DependencyFullyQualifiedName>> functionDependencies = function.getDependencies();
if (functionDependencyIdx < functionDependencies.size()) {
- List<Triple<DataverseName, String, String>> functionObjectDependencies =
+ List<DependencyFullyQualifiedName> functionObjectDependencies =
functionDependencies.get(functionDependencyIdx);
if (functionObjectDependencies != null) {
- for (Triple<DataverseName, String, String> dependency : functionObjectDependencies) {
- if (dependency.first.equals(dataverseName) && dependency.second.equals(objectName)
- && (objectArg == null || objectArg.equals(dependency.third))) {
+ for (DependencyFullyQualifiedName dependency : functionObjectDependencies) {
+ if (dependency.getDataverseName().equals(dataverseName)
+ && dependency.getSubName1().equals(objectName)
+ && (objectArg == null || objectArg.equals(dependency.getSubName2()))) {
throw new AsterixException(
org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_OBJECT_DEPENDENT_EXISTS,
objectKindDisplayName, dependencyKind.getDependencyDisplayName(dependency),
@@ -1393,14 +1394,14 @@
for (Dataset dataset : allDatasets) {
if (dataset.getDatasetType() == DatasetType.VIEW) {
ViewDetails viewDetails = (ViewDetails) dataset.getDatasetDetails();
- List<List<Triple<DataverseName, String, String>>> viewDependencies = viewDetails.getDependencies();
+ List<List<DependencyFullyQualifiedName>> viewDependencies = viewDetails.getDependencies();
if (viewDependencyIdx < viewDependencies.size()) {
- List<Triple<DataverseName, String, String>> viewObjectDependencies =
- viewDependencies.get(viewDependencyIdx);
+ List<DependencyFullyQualifiedName> viewObjectDependencies = viewDependencies.get(viewDependencyIdx);
if (viewObjectDependencies != null) {
- for (Triple<DataverseName, String, String> dependency : viewObjectDependencies) {
- if (dependency.first.equals(dataverseName) && dependency.second.equals(objectName)
- && (objectArg == null || objectArg.equals(dependency.third))) {
+ for (DependencyFullyQualifiedName dependency : viewObjectDependencies) {
+ if (dependency.getDataverseName().equals(dataverseName)
+ && dependency.getSubName1().equals(objectName)
+ && (objectArg == null || objectArg.equals(dependency.getSubName2()))) {
throw new AsterixException(
org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_OBJECT_DEPENDENT_EXISTS,
objectKindDisplayName, dependencyKind.getDependencyDisplayName(dependency),
@@ -1474,7 +1475,7 @@
String libraryName) throws AlgebricksException {
List<Function> functions = getAllFunctions(txnId);
for (Function function : functions) {
- if (libraryName.equals(function.getLibraryName())
+ if (libraryName.equals(function.getLibraryName()) && database.equals(function.getLibraryDatabaseName())
&& dataverseName.equals(function.getLibraryDataverseName())) {
throw new AsterixException(
org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_OBJECT_DEPENDENT_EXISTS, "library",
@@ -1488,7 +1489,7 @@
String libraryName) throws AlgebricksException {
List<DatasourceAdapter> adapters = getAllAdapters(txnId);
for (DatasourceAdapter adapter : adapters) {
- if (libraryName.equals(adapter.getLibraryName())
+ if (libraryName.equals(adapter.getLibraryName()) && database.equals(adapter.getLibraryDatabaseName())
&& dataverseName.equals(adapter.getLibraryDataverseName())) {
throw new AsterixException(
org.apache.asterix.common.exceptions.ErrorCode.CANNOT_DROP_OBJECT_DEPENDENT_EXISTS, "library",
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
index 71015fc..aeb6d13 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
@@ -165,7 +165,7 @@
public void dropDataset(String database, DataverseName dataverseName, String datasetName) {
Dataset dataset = new Dataset(database, dataverseName, datasetName, null, null, null, null, null, null, null,
- null, -1, MetadataUtil.PENDING_NO_OP);
+ null, null, -1, MetadataUtil.PENDING_NO_OP);
droppedCache.addDatasetIfNotExists(dataset);
logAndApply(new MetadataLogicalOperation(dataset, false));
}
@@ -202,8 +202,8 @@
}
public void dropFunction(FunctionSignature signature) {
- Function function =
- new Function(signature, null, null, null, null, null, null, null, null, null, false, false, null, null);
+ Function function = new Function(signature, null, null, null, null, null, null, null, null, null, null, false,
+ false, null, null);
droppedCache.addFunctionIfNotExists(function);
logAndApply(new MetadataLogicalOperation(function, false));
}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
index 94ee46f..4bab4c9 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
@@ -220,9 +220,9 @@
indexes[i].getPartitioningExprType(), false, null, null);
MetadataManager.INSTANCE.addDataset(mdTxnCtx,
new Dataset(indexes[i].getDatabaseName(), indexes[i].getDataverseName(),
- indexes[i].getIndexedDatasetName(), indexes[i].getDataverseName(),
- indexes[i].getPayloadRecordType().getTypeName(), indexes[i].getNodeGroupName(),
- StorageConstants.DEFAULT_COMPACTION_POLICY_NAME,
+ indexes[i].getIndexedDatasetName(), indexes[i].getDatabaseName(),
+ indexes[i].getDataverseName(), indexes[i].getPayloadRecordType().getTypeName(),
+ indexes[i].getNodeGroupName(), StorageConstants.DEFAULT_COMPACTION_POLICY_NAME,
StorageConstants.DEFAULT_COMPACTION_POLICY_PROPERTIES, id, new HashMap<>(),
DatasetType.INTERNAL, indexes[i].getDatasetId().getId(), MetadataUtil.PENDING_NO_OP));
}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataRecordTypes.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataRecordTypes.java
index 5ae18ca..cecf3d3 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataRecordTypes.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataRecordTypes.java
@@ -42,6 +42,7 @@
public static final String FIELD_NAME_DATASET_NAME = "DatasetName";
public static final String FIELD_NAME_DATASET_TYPE = "DatasetType";
public static final String FIELD_NAME_DATASOURCE_ADAPTER = "DatasourceAdapter";
+ public static final String FIELD_NAME_DATATYPE_DATABASE_NAME = "DatatypeDatabaseName";
public static final String FIELD_NAME_DATATYPE_DATAVERSE_NAME = "DatatypeDataverseName";
public static final String FIELD_NAME_DATATYPE_NAME = "DatatypeName";
public static final String FIELD_NAME_DATABASE_NAME = "DatabaseName";
@@ -80,15 +81,18 @@
public static final String FIELD_NAME_KIND = "Kind";
public static final String FIELD_NAME_LANGUAGE = "Language";
public static final String FIELD_NAME_HASH = "MD5Hash";
+ public static final String FIELD_NAME_LIBRARY_DATABASE_NAME = "LibraryDatabaseName";
public static final String FIELD_NAME_LIBRARY_DATAVERSE_NAME = "LibraryDataverseName";
public static final String FIELD_NAME_LIBRARY_NAME = "LibraryName";
public static final String FIELD_NAME_LAST_REFRESH_TIME = "LastRefreshTime";
+ public static final String FIELD_NAME_METATYPE_DATABASE_NAME = "MetatypeDatabaseName";
public static final String FIELD_NAME_METATYPE_DATAVERSE_NAME = "MetatypeDataverseName";
public static final String FIELD_NAME_METATYPE_NAME = "MetatypeName";
public static final String FIELD_NAME_NAME = "Name";
public static final String FIELD_NAME_NODE_NAME = "NodeName";
public static final String FIELD_NAME_NODE_NAMES = "NodeNames";
public static final String FIELD_NAME_NUMBER_OF_CORES = "NumberOfCores";
+ public static final String FIELD_NAME_OBJECT_DATABASE_NAME = "ObjectDatabaseName";
public static final String FIELD_NAME_OBJECT_DATAVERSE_NAME = "ObjectDataverseName";
public static final String FIELD_NAME_OBJECT_NAME = "ObjectName";
public static final String FIELD_NAME_ORDERED_LIST = "OrderedList";
@@ -101,9 +105,11 @@
public static final String FIELD_NAME_PRIMARY_KEY_ENFORCED = "PrimaryKeyEnforced";
public static final String FIELD_NAME_PROPERTIES = "Properties";
public static final String FIELD_NAME_RECORD = "Record";
+ public static final String FIELD_NAME_REF_DATABASE_NAME = "RefDatabaseName";
public static final String FIELD_NAME_REF_DATAVERSE_NAME = "RefDataverseName";
public static final String FIELD_NAME_REF_DATASET_NAME = "RefDatasetName";
public static final String FIELD_NAME_RETURN_TYPE = "ReturnType";
+ public static final String FIELD_NAME_RETURN_TYPE_DATABASE_NAME = "ReturnTypeDatabaseName";
public static final String FIELD_NAME_RETURN_TYPE_DATAVERSE_NAME = "ReturnTypeDataverseName";
public static final String FIELD_NAME_SEARCH_KEY = "SearchKey";
public static final String FIELD_NAME_SYNONYM_NAME = "SynonymName";
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 9604f09..85fbad1 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
@@ -145,6 +145,7 @@
private final String databaseName;
private final DataverseName dataverseName;
private final String datasetName;
+ private final String recordTypeDatabaseName;
private final DataverseName recordTypeDataverseName;
private final String recordTypeName;
private final String nodeGroupName;
@@ -153,6 +154,7 @@
private final Map<String, String> compactionPolicyProperties;
private final DatasetType datasetType;
private final IDatasetDetails datasetDetails;
+ private final String metaTypeDatabaseName;
private final DataverseName metaTypeDataverseName;
private final String metaTypeName;
private final long rebalanceCount;
@@ -161,46 +163,50 @@
private final DatasetFullyQualifiedName datasetFullyQualifiedName;
private final DatasetFormatInfo datasetFormatInfo;
- public Dataset(String databaseName, DataverseName dataverseName, String datasetName,
+ public Dataset(String databaseName, DataverseName dataverseName, String datasetName, String recordTypeDatabaseName,
DataverseName recordTypeDataverseName, String recordTypeName, String nodeGroupName, String compactionPolicy,
Map<String, String> compactionPolicyProperties, IDatasetDetails datasetDetails, Map<String, String> hints,
DatasetType datasetType, int datasetId, int pendingOp) {
- this(databaseName, dataverseName, datasetName, recordTypeDataverseName, recordTypeName,
- /*metaTypeDataverseName*/null, /*metaTypeName*/null, nodeGroupName, compactionPolicy,
+ this(databaseName, dataverseName, datasetName, recordTypeDatabaseName, recordTypeDataverseName, recordTypeName,
+ null, /*metaTypeDataverseName*/null, /*metaTypeName*/null, nodeGroupName, compactionPolicy,
compactionPolicyProperties, datasetDetails, hints, datasetType, datasetId, pendingOp,
CompressionManager.NONE, DatasetFormatInfo.SYSTEM_DEFAULT);
}
- public Dataset(String databaseName, DataverseName dataverseName, String datasetName,
- DataverseName itemTypeDataverseName, String itemTypeName, DataverseName metaItemTypeDataverseName,
- String metaItemTypeName, String nodeGroupName, String compactionPolicy,
- Map<String, String> compactionPolicyProperties, IDatasetDetails datasetDetails, Map<String, String> hints,
- DatasetType datasetType, int datasetId, int pendingOp, String compressionScheme,
+ public Dataset(String databaseName, DataverseName dataverseName, String datasetName, String itemTypeDatabaseName,
+ DataverseName itemTypeDataverseName, String itemTypeName, String metaItemTypeDatabaseName,
+ DataverseName metaItemTypeDataverseName, String metaItemTypeName, String nodeGroupName,
+ String compactionPolicy, Map<String, String> compactionPolicyProperties, IDatasetDetails datasetDetails,
+ Map<String, String> hints, DatasetType datasetType, int datasetId, int pendingOp, String compressionScheme,
DatasetFormatInfo datasetFormatInfo) {
- this(databaseName, dataverseName, datasetName, itemTypeDataverseName, itemTypeName, metaItemTypeDataverseName,
- metaItemTypeName, nodeGroupName, compactionPolicy, compactionPolicyProperties, datasetDetails, hints,
- datasetType, datasetId, pendingOp, 0L, compressionScheme, datasetFormatInfo);
+ this(databaseName, dataverseName, datasetName, itemTypeDatabaseName, itemTypeDataverseName, itemTypeName,
+ metaItemTypeDatabaseName, metaItemTypeDataverseName, metaItemTypeName, nodeGroupName, compactionPolicy,
+ compactionPolicyProperties, datasetDetails, hints, datasetType, datasetId, pendingOp, 0L,
+ compressionScheme, datasetFormatInfo);
}
public Dataset(Dataset dataset) {
- this(dataset.databaseName, dataset.dataverseName, dataset.datasetName, dataset.recordTypeDataverseName,
- dataset.recordTypeName, dataset.metaTypeDataverseName, dataset.metaTypeName, dataset.nodeGroupName,
+ this(dataset.databaseName, dataset.dataverseName, dataset.datasetName, dataset.recordTypeDatabaseName,
+ dataset.recordTypeDataverseName, dataset.recordTypeName, dataset.metaTypeDatabaseName,
+ dataset.metaTypeDataverseName, dataset.metaTypeName, dataset.nodeGroupName,
dataset.compactionPolicyFactory, dataset.compactionPolicyProperties, dataset.datasetDetails,
dataset.hints, dataset.datasetType, dataset.datasetId, dataset.pendingOp, dataset.rebalanceCount,
dataset.compressionScheme, dataset.datasetFormatInfo);
}
- public Dataset(String databaseName, DataverseName dataverseName, String datasetName,
- DataverseName itemTypeDataverseName, String itemTypeName, DataverseName metaItemTypeDataverseName,
- String metaItemTypeName, String nodeGroupName, String compactionPolicy,
- Map<String, String> compactionPolicyProperties, IDatasetDetails datasetDetails, Map<String, String> hints,
- DatasetType datasetType, int datasetId, int pendingOp, long rebalanceCount, String compressionScheme,
- DatasetFormatInfo datasetFormatInfo) {
+ public Dataset(String databaseName, DataverseName dataverseName, String datasetName, String itemTypeDatabaseName,
+ DataverseName itemTypeDataverseName, String itemTypeName, String metaItemTypeDatabaseName,
+ DataverseName metaItemTypeDataverseName, String metaItemTypeName, String nodeGroupName,
+ String compactionPolicy, Map<String, String> compactionPolicyProperties, IDatasetDetails datasetDetails,
+ Map<String, String> hints, DatasetType datasetType, int datasetId, int pendingOp, long rebalanceCount,
+ String compressionScheme, DatasetFormatInfo datasetFormatInfo) {
this.databaseName = Objects.requireNonNull(databaseName);
this.dataverseName = dataverseName;
this.datasetName = datasetName;
this.recordTypeName = itemTypeName;
+ this.recordTypeDatabaseName = itemTypeDatabaseName;
this.recordTypeDataverseName = itemTypeDataverseName;
+ this.metaTypeDatabaseName = metaItemTypeDatabaseName;
this.metaTypeDataverseName = metaItemTypeDataverseName;
this.metaTypeName = metaItemTypeName;
this.nodeGroupName = nodeGroupName;
@@ -235,6 +241,10 @@
return recordTypeName;
}
+ public String getItemTypeDatabaseName() {
+ return recordTypeDatabaseName;
+ }
+
public DataverseName getItemTypeDataverseName() {
return recordTypeDataverseName;
}
@@ -271,6 +281,10 @@
return pendingOp;
}
+ public String getMetaItemTypeDatabaseName() {
+ return metaTypeDatabaseName;
+ }
+
public DataverseName getMetaItemTypeDataverseName() {
return metaTypeDataverseName;
}
@@ -310,7 +324,8 @@
return false;
}
Dataset otherDataset = (Dataset) other;
- return Objects.equals(dataverseName, otherDataset.dataverseName)
+ return Objects.equals(databaseName, otherDataset.databaseName)
+ && Objects.equals(dataverseName, otherDataset.dataverseName)
&& Objects.equals(datasetName, otherDataset.datasetName);
}
@@ -371,7 +386,8 @@
// #. mark the existing dataset as PendingDropOp
MetadataManager.INSTANCE.dropDataset(mdTxnCtx.getValue(), databaseName, dataverseName, datasetName, force);
MetadataManager.INSTANCE.addDataset(mdTxnCtx.getValue(),
- new Dataset(databaseName, dataverseName, datasetName, getItemTypeDataverseName(), getItemTypeName(),
+ new Dataset(databaseName, dataverseName, datasetName, getItemTypeDatabaseName(),
+ getItemTypeDataverseName(), getItemTypeName(), getMetaItemTypeDatabaseName(),
getMetaItemTypeDataverseName(), getMetaItemTypeName(), getNodeGroupName(),
getCompactionPolicy(), getCompactionPolicyProperties(), getDatasetDetails(), getHints(),
getDatasetType(), getDatasetId(), MetadataUtil.PENDING_DROP_OP, getCompressionScheme(),
@@ -396,14 +412,13 @@
MetadataManager.INSTANCE.dropDataset(mdTxnCtx.getValue(), databaseName, dataverseName, datasetName, force);
// drop inline types
- String recordTypeDatabase = MetadataUtil.resolveDatabase(null, recordTypeDataverseName);
- if (TypeUtil.isDatasetInlineTypeName(this, recordTypeDataverseName, recordTypeName)) {
- MetadataManager.INSTANCE.dropDatatype(mdTxnCtx.getValue(), recordTypeDatabase, recordTypeDataverseName,
+ if (TypeUtil.isDatasetInlineTypeName(this, recordTypeDatabaseName, recordTypeDataverseName, recordTypeName)) {
+ MetadataManager.INSTANCE.dropDatatype(mdTxnCtx.getValue(), recordTypeDatabaseName, recordTypeDataverseName,
recordTypeName);
}
- String metaTypeDatabase = MetadataUtil.resolveDatabase(null, metaTypeDataverseName);
- if (hasMetaPart() && TypeUtil.isDatasetInlineTypeName(this, metaTypeDataverseName, metaTypeName)) {
- MetadataManager.INSTANCE.dropDatatype(mdTxnCtx.getValue(), metaTypeDatabase, metaTypeDataverseName,
+ if (hasMetaPart()
+ && TypeUtil.isDatasetInlineTypeName(this, metaTypeDatabaseName, metaTypeDataverseName, metaTypeName)) {
+ MetadataManager.INSTANCE.dropDatatype(mdTxnCtx.getValue(), metaTypeDatabaseName, metaTypeDataverseName,
metaTypeName);
}
@@ -621,6 +636,7 @@
public Map<String, Object> toMap() {
Map<String, Object> tree = new HashMap<>();
+ //TODO(DB):
tree.put("datasetId", Integer.toString(datasetId));
tree.put("dataverseName", dataverseName);
tree.put("datasetName", datasetName);
@@ -643,7 +659,7 @@
@Override
public int hashCode() {
- return Objects.hash(dataverseName, datasetName);
+ return Objects.hash(databaseName, dataverseName, datasetName);
}
/**
@@ -831,11 +847,12 @@
// Gets the target dataset for the purpose of rebalance.
public Dataset getTargetDatasetForRebalance(String targetNodeGroupName) {
- return new Dataset(this.databaseName, this.dataverseName, this.datasetName, this.recordTypeDataverseName,
- this.recordTypeName, this.metaTypeDataverseName, this.metaTypeName, targetNodeGroupName,
- this.compactionPolicyFactory, this.compactionPolicyProperties, this.datasetDetails, this.hints,
- this.datasetType, DatasetIdFactory.generateAlternatingDatasetId(this.datasetId), this.pendingOp,
- this.rebalanceCount + 1, this.compressionScheme, this.datasetFormatInfo);
+ return new Dataset(this.databaseName, this.dataverseName, this.datasetName, this.recordTypeDatabaseName,
+ this.recordTypeDataverseName, this.recordTypeName, this.metaTypeDatabaseName,
+ this.metaTypeDataverseName, this.metaTypeName, targetNodeGroupName, this.compactionPolicyFactory,
+ this.compactionPolicyProperties, this.datasetDetails, this.hints, this.datasetType,
+ DatasetIdFactory.generateAlternatingDatasetId(this.datasetId), this.pendingOp, this.rebalanceCount + 1,
+ this.compressionScheme, this.datasetFormatInfo);
}
// Gets an array of partition numbers for this dataset.
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/DependencyKind.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/DependencyKind.java
index 5eef0dc..2837c94 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/DependencyKind.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/DependencyKind.java
@@ -22,28 +22,30 @@
import static org.apache.asterix.common.utils.IdentifierUtil.dataset;
import org.apache.asterix.common.functions.FunctionSignature;
-import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.DependencyFullyQualifiedName;
import org.apache.asterix.common.metadata.MetadataUtil;
import org.apache.asterix.metadata.utils.DatasetUtil;
import org.apache.asterix.metadata.utils.TypeUtil;
-import org.apache.hyracks.algebricks.common.utils.Triple;
public enum DependencyKind {
- DATASET(dependency -> DatasetUtil.getFullyQualifiedDisplayName(dependency.first, dependency.second)),
+ DATASET(
+ dependency -> DatasetUtil.getFullyQualifiedDisplayName(dependency.getDataverseName(),
+ dependency.getSubName1())),
FUNCTION(
- dependency -> new FunctionSignature(dependency.first, dependency.second, Integer.parseInt(dependency.third))
- .toString()),
- TYPE(dependency -> TypeUtil.getFullyQualifiedDisplayName(dependency.first, dependency.second)),
- SYNONYM(dependency -> MetadataUtil.getFullyQualifiedDisplayName(dependency.first, dependency.second));
+ dependency -> new FunctionSignature(dependency.getDataverseName(), dependency.getSubName1(),
+ Integer.parseInt(dependency.getSubName2())).toString()),
+ TYPE(dependency -> TypeUtil.getFullyQualifiedDisplayName(dependency.getDataverseName(), dependency.getSubName1())),
+ SYNONYM(
+ dependency -> MetadataUtil.getFullyQualifiedDisplayName(dependency.getDataverseName(),
+ dependency.getSubName1()));
- private final java.util.function.Function<Triple<DataverseName, String, String>, String> dependencyDisplayNameAccessor;
+ private final java.util.function.Function<DependencyFullyQualifiedName, String> dependencyDisplayNameAccessor;
- DependencyKind(
- java.util.function.Function<Triple<DataverseName, String, String>, String> dependencyDisplayNameAccessor) {
+ DependencyKind(java.util.function.Function<DependencyFullyQualifiedName, String> dependencyDisplayNameAccessor) {
this.dependencyDisplayNameAccessor = dependencyDisplayNameAccessor;
}
- public String getDependencyDisplayName(Triple<DataverseName, String, String> dependency) {
+ public String getDependencyDisplayName(DependencyFullyQualifiedName dependency) {
return dependencyDisplayNameAccessor.apply(dependency);
}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/ExternalDatasetDetails.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/ExternalDatasetDetails.java
index d1cd1fa..22aa431 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/ExternalDatasetDetails.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/ExternalDatasetDetails.java
@@ -32,6 +32,7 @@
import org.apache.asterix.external.util.ExternalDataConstants;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.metadata.IDatasetDetails;
+import org.apache.asterix.metadata.bootstrap.DatasetEntity;
import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes;
import org.apache.asterix.metadata.utils.DatasetUtil;
import org.apache.asterix.om.base.ADateTime;
@@ -83,7 +84,7 @@
@SuppressWarnings("unchecked")
@Override
- public void writeDatasetDetailsRecordType(DataOutput out) throws HyracksDataException {
+ public void writeDatasetDetailsRecordType(DataOutput out, DatasetEntity datasetEntity) throws HyracksDataException {
IARecordBuilder externalRecordBuilder = new RecordBuilder();
OrderedListBuilder listBuilder = new OrderedListBuilder();
ArrayBackedValueStorage fieldValue = new ArrayBackedValueStorage();
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Feed.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Feed.java
index 5796df9..75c171e 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Feed.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Feed.java
@@ -39,6 +39,7 @@
/** A string representation of the instance **/
private final String displayName;
/** Feed configurations */
+ //TODO(DB): check for keys in the map that are using dataverse and need to include database
private final Map<String, String> feedConfiguration;
public Feed(String databaseName, DataverseName dataverseName, String feedName,
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Function.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Function.java
index af78e0e..82c9514 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Function.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Function.java
@@ -26,10 +26,10 @@
import org.apache.asterix.common.functions.FunctionSignature;
import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.DependencyFullyQualifiedName;
import org.apache.asterix.metadata.MetadataCache;
import org.apache.asterix.metadata.api.IMetadataEntity;
import org.apache.asterix.om.types.TypeSignature;
-import org.apache.hyracks.algebricks.common.utils.Triple;
public class Function implements IMetadataEntity<Function> {
private static final long serialVersionUID = 5L;
@@ -41,20 +41,20 @@
private final String body;
private final String language;
private final String kind;
- private final String databaseName = null;
+ private final String libraryDatabaseName;
private final DataverseName libraryDataverseName;
private final String libraryName;
private final List<String> externalIdentifier;
private final Boolean deterministic; // null for SQL++ and AQL functions
private final Boolean nullCall; // null for SQL++ and AQL functions
private final Map<String, String> resources;
- private final List<List<Triple<DataverseName, String, String>>> dependencies;
+ private final List<List<DependencyFullyQualifiedName>> dependencies;
public Function(FunctionSignature signature, List<String> paramNames, List<TypeSignature> paramTypes,
TypeSignature returnType, String functionBody, String functionKind, String language,
- DataverseName libraryDataverseName, String libraryName, List<String> externalIdentifier, Boolean nullCall,
- Boolean deterministic, Map<String, String> resources,
- List<List<Triple<DataverseName, String, String>>> dependencies) {
+ String libraryDatabaseName, DataverseName libraryDataverseName, String libraryName,
+ List<String> externalIdentifier, Boolean nullCall, Boolean deterministic, Map<String, String> resources,
+ List<List<DependencyFullyQualifiedName>> dependencies) {
this.signature = signature;
this.paramNames = paramNames;
this.paramTypes = paramTypes;
@@ -62,6 +62,7 @@
this.returnType = returnType;
this.language = language;
this.kind = functionKind;
+ this.libraryDatabaseName = libraryDatabaseName;
this.libraryDataverseName = libraryDataverseName;
this.libraryName = libraryName;
this.externalIdentifier = externalIdentifier;
@@ -128,6 +129,10 @@
return externalIdentifier != null;
}
+ public String getLibraryDatabaseName() {
+ return libraryDatabaseName;
+ }
+
public DataverseName getLibraryDataverseName() {
return libraryDataverseName;
}
@@ -152,7 +157,7 @@
return resources;
}
- public List<List<Triple<DataverseName, String, String>>> getDependencies() {
+ public List<List<DependencyFullyQualifiedName>> getDependencies() {
return dependencies;
}
@@ -169,12 +174,12 @@
public static List<DependencyKind> DEPENDENCIES_SCHEMA =
Arrays.asList(DependencyKind.DATASET, DependencyKind.FUNCTION, DependencyKind.TYPE, DependencyKind.SYNONYM);
- public static List<List<Triple<DataverseName, String, String>>> createDependencies(
- List<Triple<DataverseName, String, String>> datasetDependencies,
- List<Triple<DataverseName, String, String>> functionDependencies,
- List<Triple<DataverseName, String, String>> typeDependencies,
- List<Triple<DataverseName, String, String>> synonymDependencies) {
- List<List<Triple<DataverseName, String, String>>> depList = new ArrayList<>(DEPENDENCIES_SCHEMA.size());
+ 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);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/InternalDatasetDetails.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/InternalDatasetDetails.java
index 5abad5d..113060e 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/InternalDatasetDetails.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/InternalDatasetDetails.java
@@ -30,6 +30,7 @@
import org.apache.asterix.common.config.DatasetConfig.DatasetType;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.metadata.IDatasetDetails;
+import org.apache.asterix.metadata.bootstrap.DatasetEntity;
import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes;
import org.apache.asterix.om.base.ABoolean;
import org.apache.asterix.om.base.AInt8;
@@ -155,7 +156,7 @@
}
@Override
- public void writeDatasetDetailsRecordType(DataOutput out) throws HyracksDataException {
+ public void writeDatasetDetailsRecordType(DataOutput out, DatasetEntity datasetEntity) throws HyracksDataException {
IARecordBuilder internalRecordBuilder = new RecordBuilder();
OrderedListBuilder listBuilder = new OrderedListBuilder();
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Synonym.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Synonym.java
index 135356a..ebe780a 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Synonym.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Synonym.java
@@ -35,15 +35,18 @@
private final String synonymName;
+ private final String objectDatabaseName;
+
private final DataverseName objectDataverseName;
private final String objectName;
- public Synonym(String databaseName, DataverseName dataverseName, String synonymName,
+ public Synonym(String databaseName, DataverseName dataverseName, String synonymName, String objectDatabaseName,
DataverseName objectDataverseName, String objectName) {
this.databaseName = Objects.requireNonNull(databaseName);
this.dataverseName = Objects.requireNonNull(dataverseName);
this.synonymName = Objects.requireNonNull(synonymName);
+ this.objectDatabaseName = Objects.requireNonNull(objectDatabaseName);
this.objectDataverseName = Objects.requireNonNull(objectDataverseName);
this.objectName = Objects.requireNonNull(objectName);
}
@@ -60,6 +63,10 @@
return synonymName;
}
+ public String getObjectDatabaseName() {
+ return objectDatabaseName;
+ }
+
public DataverseName getObjectDataverseName() {
return objectDataverseName;
}
@@ -76,13 +83,15 @@
return false;
Synonym synonym = (Synonym) o;
return Objects.equals(databaseName, synonym.databaseName) && dataverseName.equals(synonym.dataverseName)
- && synonymName.equals(synonym.synonymName) && objectDataverseName.equals(synonym.objectDataverseName)
- && objectName.equals(synonym.objectName);
+ && synonymName.equals(synonym.synonymName)
+ && Objects.equals(objectDatabaseName, synonym.objectDatabaseName)
+ && objectDataverseName.equals(synonym.objectDataverseName) && objectName.equals(synonym.objectName);
}
@Override
public int hashCode() {
- return Objects.hash(databaseName, dataverseName, synonymName, objectDataverseName, objectName);
+ return Objects.hash(databaseName, dataverseName, synonymName, objectDatabaseName, objectDataverseName,
+ objectName);
}
@Override
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/ViewDetails.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/ViewDetails.java
index 76c6b4d..0196369 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/ViewDetails.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/ViewDetails.java
@@ -20,6 +20,7 @@
package org.apache.asterix.metadata.entities;
import static org.apache.asterix.metadata.entitytupletranslators.AbstractTupleTranslator.writeDateTimeFormats;
+import static org.apache.asterix.metadata.entitytupletranslators.AbstractTupleTranslator.writeDeps;
import static org.apache.asterix.om.types.AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE;
import java.io.DataOutput;
@@ -34,32 +35,31 @@
import org.apache.asterix.builders.RecordBuilder;
import org.apache.asterix.common.config.DatasetConfig;
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.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.metadata.IDatasetDetails;
+import org.apache.asterix.metadata.bootstrap.DatasetEntity;
import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes;
-import org.apache.asterix.metadata.entitytupletranslators.AbstractTupleTranslator;
import org.apache.asterix.om.base.ABoolean;
import org.apache.asterix.om.base.AMutableString;
import org.apache.asterix.om.base.ANull;
import org.apache.asterix.om.base.AString;
import org.apache.asterix.om.types.BuiltinType;
import org.apache.asterix.om.utils.RecordUtil;
-import org.apache.hyracks.algebricks.common.utils.Triple;
import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
public class ViewDetails implements IDatasetDetails {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 2L;
public static List<DependencyKind> DEPENDENCIES_SCHEMA =
Arrays.asList(DependencyKind.DATASET, DependencyKind.FUNCTION, DependencyKind.TYPE, DependencyKind.SYNONYM);
private final String viewBody;
- private final List<List<Triple<DataverseName, String, String>>> dependencies;
+ private final List<List<DependencyFullyQualifiedName>> dependencies;
// Typed view parameters
@@ -75,9 +75,9 @@
private final List<ForeignKey> foreignKeys;
- public ViewDetails(String viewBody, List<List<Triple<DataverseName, String, String>>> dependencies,
- Boolean defaultNull, List<String> primaryKeyFields, List<ForeignKey> foreignKeys, String datetimeFormat,
- String dateFormat, String timeFormat) {
+ public ViewDetails(String viewBody, List<List<DependencyFullyQualifiedName>> dependencies, Boolean defaultNull,
+ List<String> primaryKeyFields, List<ForeignKey> foreignKeys, String datetimeFormat, String dateFormat,
+ String timeFormat) {
this.viewBody = Objects.requireNonNull(viewBody);
this.dependencies = Objects.requireNonNull(dependencies);
this.defaultNull = defaultNull;
@@ -97,7 +97,7 @@
return viewBody;
}
- public List<List<Triple<DataverseName, String, String>>> getDependencies() {
+ public List<List<DependencyFullyQualifiedName>> getDependencies() {
return dependencies;
}
@@ -128,7 +128,7 @@
}
@Override
- public void writeDatasetDetailsRecordType(DataOutput out) throws HyracksDataException {
+ public void writeDatasetDetailsRecordType(DataOutput out, DatasetEntity datasetEntity) throws HyracksDataException {
IARecordBuilder viewRecordBuilder = new RecordBuilder();
viewRecordBuilder.reset(RecordUtil.FULLY_OPEN_RECORD_TYPE);
@@ -162,25 +162,14 @@
OrderedListBuilder dependenciesListBuilder = new OrderedListBuilder();
OrderedListBuilder dependencyListBuilder = new OrderedListBuilder();
OrderedListBuilder dependencyNameListBuilder = new OrderedListBuilder();
- List<String> dependencySubnames = new ArrayList<>(3);
+ boolean writeDatabase = datasetEntity.databaseNameIndex() >= 0;
dependenciesListBuilder.reset(FULL_OPEN_ORDEREDLIST_TYPE);
- for (List<Triple<DataverseName, String, String>> dependenciesList : dependencies) {
+ for (List<DependencyFullyQualifiedName> dependenciesList : dependencies) {
dependencyListBuilder.reset(FULL_OPEN_ORDEREDLIST_TYPE);
- for (Triple<DataverseName, String, String> dependency : dependenciesList) {
- dependencyNameListBuilder.reset(FULL_OPEN_ORDEREDLIST_TYPE);
- dependencySubnames.clear();
- AbstractTupleTranslator.getDependencySubNames(dependency, dependencySubnames);
- for (String subName : dependencySubnames) {
- itemValue.reset();
- aString.setValue(subName);
- stringSerde.serialize(aString, itemValue.getDataOutput());
- dependencyNameListBuilder.addItem(itemValue);
- }
- itemValue.reset();
- dependencyNameListBuilder.write(itemValue.getDataOutput(), true);
- dependencyListBuilder.addItem(itemValue);
- }
+ writeDeps(dependencyListBuilder, itemValue, dependenciesList, dependencyNameListBuilder,
+ FULL_OPEN_ORDEREDLIST_TYPE, writeDatabase, aString, stringSerde);
+
itemValue.reset();
dependencyListBuilder.write(itemValue.getDataOutput(), true);
dependenciesListBuilder.addItem(itemValue);
@@ -246,6 +235,17 @@
keyListBuilder.write(fieldValue.getDataOutput(), true);
foreignKeyRecordBuilder.addField(fieldName, fieldValue);
+ // write field 'RefDatabaseName'
+ if (datasetEntity.databaseNameIndex() >= 0) {
+ fieldName.reset();
+ aString.setValue(MetadataRecordTypes.FIELD_NAME_REF_DATABASE_NAME);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ aString.setValue(foreignKey.getReferencedDatasetName().getDatabaseName());
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ foreignKeyRecordBuilder.addField(fieldName, fieldValue);
+ }
+
// write field 'RefDataverseName'
fieldName.reset();
aString.setValue(MetadataRecordTypes.FIELD_NAME_REF_DATAVERSE_NAME);
@@ -308,12 +308,12 @@
}
}
- public static List<List<Triple<DataverseName, String, String>>> createDependencies(
- List<Triple<DataverseName, String, String>> datasetDependencies,
- List<Triple<DataverseName, String, String>> functionDependencies,
- List<Triple<DataverseName, String, String>> typeDependencies,
- List<Triple<DataverseName, String, String>> synonymDependencies) {
- List<List<Triple<DataverseName, String, String>>> depList = new ArrayList<>(DEPENDENCIES_SCHEMA.size());
+ 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);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/AbstractDatatypeTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/AbstractDatatypeTupleTranslator.java
index 047abfe..5056340 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/AbstractDatatypeTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/AbstractDatatypeTupleTranslator.java
@@ -25,7 +25,6 @@
import org.apache.asterix.builders.OrderedListBuilder;
import org.apache.asterix.builders.RecordBuilder;
import org.apache.asterix.common.metadata.DataverseName;
-import org.apache.asterix.common.metadata.MetadataUtil;
import org.apache.asterix.common.transactions.TxnId;
import org.apache.asterix.metadata.MetadataNode;
import org.apache.asterix.metadata.api.IMetadataIndex;
@@ -63,8 +62,8 @@
this.metadataNode = metadataNode;
}
- protected void writeDerivedTypeRecord(DataverseName dataverseName, AbstractComplexType derivedDatatype,
- DataOutput out, boolean isAnonymous) throws HyracksDataException {
+ protected void writeDerivedTypeRecord(String databaseName, DataverseName dataverseName,
+ AbstractComplexType derivedDatatype, DataOutput out, boolean isAnonymous) throws HyracksDataException {
DerivedTypeTag tag;
IARecordBuilder derivedRecordBuilder = new RecordBuilder();
ArrayBackedValueStorage fieldValue = new ArrayBackedValueStorage();
@@ -99,18 +98,18 @@
switch (tag) {
case RECORD:
fieldValue.reset();
- writeRecordType(dataverseName, derivedDatatype, fieldValue.getDataOutput());
+ writeRecordType(databaseName, dataverseName, derivedDatatype, fieldValue.getDataOutput());
derivedRecordBuilder.addField(MetadataRecordTypes.DERIVEDTYPE_ARECORD_RECORD_FIELD_INDEX, fieldValue);
break;
case UNORDEREDLIST:
fieldValue.reset();
- writeCollectionType(dataverseName, derivedDatatype, fieldValue.getDataOutput());
+ writeCollectionType(databaseName, dataverseName, derivedDatatype, fieldValue.getDataOutput());
derivedRecordBuilder.addField(MetadataRecordTypes.DERIVEDTYPE_ARECORD_UNORDEREDLIST_FIELD_INDEX,
fieldValue);
break;
case ORDEREDLIST:
fieldValue.reset();
- writeCollectionType(dataverseName, derivedDatatype, fieldValue.getDataOutput());
+ writeCollectionType(databaseName, dataverseName, derivedDatatype, fieldValue.getDataOutput());
derivedRecordBuilder.addField(MetadataRecordTypes.DERIVEDTYPE_ARECORD_ORDEREDLIST_FIELD_INDEX,
fieldValue);
break;
@@ -118,19 +117,20 @@
derivedRecordBuilder.write(out, true);
}
- private void writeCollectionType(DataverseName dataverseName, AbstractComplexType type, DataOutput out)
- throws HyracksDataException {
+ private void writeCollectionType(String databaseName, DataverseName dataverseName, AbstractComplexType type,
+ DataOutput out) throws HyracksDataException {
AbstractCollectionType listType = (AbstractCollectionType) type;
IAType itemType = listType.getItemType();
if (itemType.getTypeTag().isDerivedType()) {
- handleNestedDerivedType(dataverseName, itemType.getTypeName(), (AbstractComplexType) itemType);
+ handleNestedDerivedType(databaseName, dataverseName, itemType.getTypeName(),
+ (AbstractComplexType) itemType);
}
aString.setValue(listType.getItemType().getTypeName());
stringSerde.serialize(aString, out);
}
- private void writeRecordType(DataverseName dataverseName, AbstractComplexType type, DataOutput out)
- throws HyracksDataException {
+ private void writeRecordType(String databaseName, DataverseName dataverseName, AbstractComplexType type,
+ DataOutput out) throws HyracksDataException {
ArrayBackedValueStorage fieldValue = new ArrayBackedValueStorage();
ArrayBackedValueStorage itemValue = new ArrayBackedValueStorage();
@@ -153,7 +153,8 @@
fieldType = fieldUnionType.getActualType();
}
if (fieldType.getTypeTag().isDerivedType()) {
- handleNestedDerivedType(dataverseName, fieldType.getTypeName(), (AbstractComplexType) fieldType);
+ handleNestedDerivedType(databaseName, dataverseName, fieldType.getTypeName(),
+ (AbstractComplexType) fieldType);
}
itemValue.reset();
@@ -207,10 +208,9 @@
recordRecordBuilder.write(out, true);
}
- protected void handleNestedDerivedType(DataverseName dataverseName, String typeName, AbstractComplexType nestedType)
- throws HyracksDataException {
+ protected void handleNestedDerivedType(String database, DataverseName dataverseName, String typeName,
+ AbstractComplexType nestedType) throws HyracksDataException {
try {
- String database = MetadataUtil.databaseFor(dataverseName);
metadataNode.addDatatype(txnId, new Datatype(database, dataverseName, typeName, nestedType, true));
} catch (AlgebricksException e) {
// The nested record type may have been inserted by a previous DDL statement or
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/AbstractTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/AbstractTupleTranslator.java
index 1ae2430..b0db901 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/AbstractTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/AbstractTupleTranslator.java
@@ -25,11 +25,14 @@
import java.io.DataInput;
import java.io.DataInputStream;
import java.util.Collection;
+import java.util.List;
import org.apache.asterix.builders.IARecordBuilder;
import org.apache.asterix.builders.OrderedListBuilder;
import org.apache.asterix.builders.RecordBuilder;
import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.DependencyFullyQualifiedName;
+import org.apache.asterix.common.metadata.MetadataUtil;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.metadata.api.IMetadataEntityTupleTranslator;
import org.apache.asterix.metadata.api.IMetadataIndex;
@@ -45,6 +48,7 @@
import org.apache.asterix.om.base.AString;
import org.apache.asterix.om.base.IACursor;
import org.apache.asterix.om.base.IAObject;
+import org.apache.asterix.om.types.AOrderedListType;
import org.apache.asterix.om.types.ARecordType;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
@@ -129,30 +133,49 @@
protected abstract T createMetadataEntityFromARecord(ARecord aRecord)
throws HyracksDataException, AlgebricksException;
- public static void getDependencySubNames(Triple<DataverseName, String, String> dependency,
+ public static void getDependencySubNames(DependencyFullyQualifiedName dependency,
Collection<? super String> outSubnames) {
- outSubnames.add(dependency.first.getCanonicalForm());
- if (dependency.second != null) {
- outSubnames.add(dependency.second);
+ outSubnames.add(dependency.getDatabaseName());
+ outSubnames.add(dependency.getDataverseName().getCanonicalForm());
+ if (dependency.getSubName1() != null) {
+ outSubnames.add(dependency.getSubName1());
}
- if (dependency.third != null) {
- outSubnames.add(dependency.third);
+ if (dependency.getSubName2() != null) {
+ outSubnames.add(dependency.getSubName2());
}
}
- public static Triple<DataverseName, String, String> getDependency(AOrderedList dependencySubnames)
+ public static DependencyFullyQualifiedName getDependency(AOrderedList dependencySubnames)
throws AlgebricksException {
- String dataverseCanonicalName = ((AString) dependencySubnames.getItem(0)).getStringValue();
- DataverseName dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName);
+ // there must be at least one item (the dataverse)
+ int currentIdx = 0;
+ IAObject databaseMarker = dependencySubnames.getItem(currentIdx);
+ String databaseName;
+ DataverseName dataverseName;
+ if (((AString) databaseMarker).getStringValue().isEmpty()) {
+ // move to database value
+ currentIdx++;
+ databaseName = ((AString) dependencySubnames.getItem(currentIdx)).getStringValue();
+ // move to dataverse value
+ currentIdx++;
+ String dataverseCanonicalName = ((AString) dependencySubnames.getItem(currentIdx)).getStringValue();
+ dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName);
+ } else {
+ String dataverseCanonicalName = ((AString) dependencySubnames.getItem(currentIdx)).getStringValue();
+ dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName);
+ databaseName = MetadataUtil.databaseFor(dataverseName);
+ }
+ currentIdx++;
String second = null, third = null;
int ln = dependencySubnames.size();
- if (ln > 1) {
- second = ((AString) dependencySubnames.getItem(1)).getStringValue();
- if (ln > 2) {
- third = ((AString) dependencySubnames.getItem(2)).getStringValue();
+ if (currentIdx < ln) {
+ second = ((AString) dependencySubnames.getItem(currentIdx)).getStringValue();
+ currentIdx++;
+ if (currentIdx < ln) {
+ third = ((AString) dependencySubnames.getItem(currentIdx)).getStringValue();
}
}
- return new Triple<>(dataverseName, second, third);
+ return new DependencyFullyQualifiedName(databaseName, dataverseName, second, third);
}
protected static String getStringValue(IAObject obj) {
@@ -203,4 +226,49 @@
recordBuilder.addField(nameValue, fieldValue);
}
}
+
+ public static void writeString(ArrayBackedValueStorage itemValue, AMutableString aString, String value,
+ ISerializerDeserializer<AString> stringSerde) throws HyracksDataException {
+ itemValue.reset();
+ aString.setValue(value);
+ stringSerde.serialize(aString, itemValue.getDataOutput());
+ }
+
+ public static void writeDeps(OrderedListBuilder dependencyListBuilder, ArrayBackedValueStorage itemValue,
+ List<DependencyFullyQualifiedName> dependencies, OrderedListBuilder dependencyNameListBuilder,
+ AOrderedListType stringList, boolean writeDatabase, AMutableString aString,
+ ISerializerDeserializer<AString> stringSerde) throws HyracksDataException {
+ for (DependencyFullyQualifiedName dependency : dependencies) {
+ dependencyNameListBuilder.reset(stringList);
+
+ if (writeDatabase) {
+ writeString(itemValue, aString, "", stringSerde);
+ dependencyNameListBuilder.addItem(itemValue);
+
+ writeString(itemValue, aString, dependency.getDatabaseName(), stringSerde);
+ dependencyNameListBuilder.addItem(itemValue);
+ }
+
+ // write dataverse
+ writeString(itemValue, aString, dependency.getDataverseName().getCanonicalForm(), stringSerde);
+ dependencyNameListBuilder.addItem(itemValue);
+
+ // write subName1
+ String subName1 = dependency.getSubName1();
+ if (subName1 != null) {
+ writeString(itemValue, aString, subName1, stringSerde);
+ dependencyNameListBuilder.addItem(itemValue);
+ }
+
+ // write subName2
+ String subName2 = dependency.getSubName2();
+ if (subName2 != null) {
+ writeString(itemValue, aString, subName2, stringSerde);
+ dependencyNameListBuilder.addItem(itemValue);
+ }
+ itemValue.reset();
+ dependencyNameListBuilder.write(itemValue.getDataOutput(), true);
+ dependencyListBuilder.addItem(itemValue);
+ }
+ }
}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslator.java
index 5530764..83c0d5b 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslator.java
@@ -40,6 +40,7 @@
import org.apache.asterix.common.exceptions.ErrorCode;
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.MetadataUtil;
import org.apache.asterix.metadata.IDatasetDetails;
import org.apache.asterix.metadata.bootstrap.DatasetEntity;
@@ -122,6 +123,13 @@
String typeDataverseCanonicalName =
((AString) datasetRecord.getValueByPos(datasetEntity.datatypeDataverseNameIndex())).getStringValue();
DataverseName typeDataverseName = DataverseName.createFromCanonicalForm(typeDataverseCanonicalName);
+ String itemTypeDatabaseName;
+ int typeDatabaseIdx = recType.getFieldIndex(MetadataRecordTypes.FIELD_NAME_DATATYPE_DATABASE_NAME);
+ if (typeDatabaseIdx >= 0) {
+ itemTypeDatabaseName = ((AString) datasetRecord.getValueByPos(typeDatabaseIdx)).getStringValue();
+ } else {
+ itemTypeDatabaseName = MetadataUtil.databaseFor(typeDataverseName);
+ }
DatasetType datasetType = DatasetType
.valueOf(((AString) datasetRecord.getValueByPos(datasetEntity.datasetTypeIndex())).getStringValue());
IDatasetDetails datasetDetails = null;
@@ -264,7 +272,7 @@
String definition = ((AString) datasetDetailsRecord.getValueByPos(definitionFieldPos)).getStringValue();
// Dependencies
- List<List<Triple<DataverseName, String, String>>> dependencies = Collections.emptyList();
+ List<List<DependencyFullyQualifiedName>> dependencies = Collections.emptyList();
int dependenciesFieldPos =
datasetDetailsRecord.getType().getFieldIndex(MetadataRecordTypes.FIELD_NAME_DEPENDENCIES);
if (dependenciesFieldPos >= 0) {
@@ -272,10 +280,10 @@
IACursor dependenciesCursor =
((AOrderedList) datasetDetailsRecord.getValueByPos(dependenciesFieldPos)).getCursor();
while (dependenciesCursor.next()) {
- List<Triple<DataverseName, String, String>> dependencyList = new ArrayList<>();
+ List<DependencyFullyQualifiedName> dependencyList = new ArrayList<>();
IACursor qualifiedDependencyCursor = ((AOrderedList) dependenciesCursor.get()).getCursor();
while (qualifiedDependencyCursor.next()) {
- Triple<DataverseName, String, String> dependency =
+ DependencyFullyQualifiedName dependency =
getDependency((AOrderedList) qualifiedDependencyCursor.get());
dependencyList.add(dependency);
}
@@ -346,14 +354,23 @@
DataverseName refDataverseName =
DataverseName.createFromCanonicalForm(refDataverseCanonicalName);
+ // 'RefDatabaseName'
+ String refDatabase;
+ int refDatabaseNameFieldPos = foreignKeyRecord.getType()
+ .getFieldIndex(MetadataRecordTypes.FIELD_NAME_REF_DATABASE_NAME);
+ if (refDatabaseNameFieldPos >= 0) {
+ refDatabase = ((AString) foreignKeyRecord.getValueByPos(refDatabaseNameFieldPos))
+ .getStringValue();
+ } else {
+ refDatabase = MetadataUtil.databaseFor(refDataverseName);
+ }
+
// 'RefDatasetName'
int refDatasetNameFieldPos = foreignKeyRecord.getType()
.getFieldIndex(MetadataRecordTypes.FIELD_NAME_REF_DATASET_NAME);
String refDatasetName =
((AString) foreignKeyRecord.getValueByPos(refDatasetNameFieldPos)).getStringValue();
- //TODO(DB):
- String refDatabase = MetadataUtil.resolveDatabase(null, refDataverseName);
foreignKeys.add(new ViewDetails.ForeignKey(foreignKeyFields,
new DatasetFullyQualifiedName(refDatabase, refDataverseName, refDatasetName)));
}
@@ -372,6 +389,7 @@
Map<String, String> hints = getDatasetHints(datasetRecord);
+ String metaItemTypeDatabaseName = null;
DataverseName metaTypeDataverseName = null;
String metaTypeName = null;
int metaTypeDataverseNameIndex = recType.getFieldIndex(MetadataRecordTypes.FIELD_NAME_METATYPE_DATAVERSE_NAME);
@@ -381,15 +399,24 @@
metaTypeDataverseName = DataverseName.createFromCanonicalForm(metaTypeDataverseCanonicalName);
int metaTypeNameIndex = recType.getFieldIndex(MetadataRecordTypes.FIELD_NAME_METATYPE_NAME);
metaTypeName = ((AString) datasetRecord.getValueByPos(metaTypeNameIndex)).getStringValue();
+
+ int metaTypeDatabaseIdx = recType.getFieldIndex(MetadataRecordTypes.FIELD_NAME_METATYPE_DATABASE_NAME);
+ if (metaTypeDatabaseIdx >= 0) {
+ metaItemTypeDatabaseName =
+ ((AString) datasetRecord.getValueByPos(metaTypeDatabaseIdx)).getStringValue();
+ } else {
+ metaItemTypeDatabaseName = MetadataUtil.databaseFor(metaTypeDataverseName);
+ }
}
long rebalanceCount = getRebalanceCount(datasetRecord);
String compressionScheme = getCompressionScheme(datasetRecord);
DatasetFormatInfo datasetFormatInfo = getDatasetFormatInfo(datasetRecord);
- return new Dataset(databaseName, dataverseName, datasetName, typeDataverseName, typeName, metaTypeDataverseName,
- metaTypeName, nodeGroupName, compactionPolicy.first, compactionPolicy.second, datasetDetails, hints,
- datasetType, datasetId, pendingOp, rebalanceCount, compressionScheme, datasetFormatInfo);
+ return new Dataset(databaseName, dataverseName, datasetName, itemTypeDatabaseName, typeDataverseName, typeName,
+ metaItemTypeDatabaseName, metaTypeDataverseName, metaTypeName, nodeGroupName, compactionPolicy.first,
+ compactionPolicy.second, datasetDetails, hints, datasetType, datasetId, pendingOp, rebalanceCount,
+ compressionScheme, datasetFormatInfo);
}
protected Pair<String, Map<String, String>> readCompactionPolicy(DatasetType datasetType, ARecord datasetRecord) {
@@ -521,6 +548,8 @@
stringSerde.serialize(aString, fieldValue.getDataOutput());
recordBuilder.addField(datasetEntity.datasetNameIndex(), fieldValue);
+ // itemTypeDatabaseName is written later by {@code writeOpenFields()}
+
// write field 2
fieldValue.reset();
aString.setValue(dataset.getItemTypeDataverseName().getCanonicalForm());
@@ -553,12 +582,12 @@
switch (dataset.getDatasetType()) {
case INTERNAL:
fieldValue.reset();
- dataset.getDatasetDetails().writeDatasetDetailsRecordType(fieldValue.getDataOutput());
+ dataset.getDatasetDetails().writeDatasetDetailsRecordType(fieldValue.getDataOutput(), datasetEntity);
recordBuilder.addField(datasetEntity.internalDetailsIndex(), fieldValue);
break;
case EXTERNAL:
fieldValue.reset();
- dataset.getDatasetDetails().writeDatasetDetailsRecordType(fieldValue.getDataOutput());
+ dataset.getDatasetDetails().writeDatasetDetailsRecordType(fieldValue.getDataOutput(), datasetEntity);
recordBuilder.addField(datasetEntity.externalDetailsIndex(), fieldValue);
break;
// VIEW details are written later by {@code writeOpenFields()}
@@ -639,6 +668,7 @@
* Keep protected to allow other extensions to add additional fields
*/
protected void writeOpenFields(Dataset dataset) throws HyracksDataException {
+ writeItemTypeDatabase(dataset);
writeMetaPart(dataset);
writeRebalanceCount(dataset);
writeBlockLevelStorageCompression(dataset);
@@ -653,13 +683,37 @@
aString.setValue(MetadataRecordTypes.FIELD_NAME_VIEW_DETAILS);
stringSerde.serialize(aString, fieldName.getDataOutput());
fieldValue.reset();
- dataset.getDatasetDetails().writeDatasetDetailsRecordType(fieldValue.getDataOutput());
+ dataset.getDatasetDetails().writeDatasetDetailsRecordType(fieldValue.getDataOutput(), datasetEntity);
+ recordBuilder.addField(fieldName, fieldValue);
+ }
+ }
+
+ private void writeItemTypeDatabase(Dataset dataset) throws HyracksDataException {
+ //TODO(DB): should use something better
+ if (datasetEntity.databaseNameIndex() >= 0) {
+ fieldName.reset();
+ aString.setValue(MetadataRecordTypes.FIELD_NAME_DATATYPE_DATABASE_NAME);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ aString.setValue(dataset.getItemTypeDatabaseName());
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
recordBuilder.addField(fieldName, fieldValue);
}
}
private void writeMetaPart(Dataset dataset) throws HyracksDataException {
if (dataset.hasMetaPart()) {
+ if (datasetEntity.databaseNameIndex() >= 0) {
+ fieldName.reset();
+ aString.setValue(MetadataRecordTypes.FIELD_NAME_METATYPE_DATABASE_NAME);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ //TODO(DB): can dataset.getMetaItemTypeDatabaseName() be null?
+ aString.setValue(dataset.getMetaItemTypeDatabaseName());
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ recordBuilder.addField(fieldName, fieldValue);
+ }
+
// write open field 1, the meta item type Dataverse name.
fieldName.reset();
aString.setValue(MetadataRecordTypes.FIELD_NAME_METATYPE_DATAVERSE_NAME);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasourceAdapterTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasourceAdapterTupleTranslator.java
index 1ed3fe8..6b9ad2d 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasourceAdapterTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasourceAdapterTupleTranslator.java
@@ -62,6 +62,7 @@
IDataSourceAdapter.AdapterType adapterType = IDataSourceAdapter.AdapterType
.valueOf(((AString) adapterRecord.getValueByPos(datasourceAdapterEntity.typeIndex())).getStringValue());
+ //TODO(DB): look into enforcing database and dataverse to be non-null
String libraryDatabase = null;
DataverseName libraryDataverseName = null;
String libraryName = null;
@@ -74,9 +75,13 @@
? DataverseName.createFromCanonicalForm(
((AString) adapterRecord.getValueByPos(libraryDataverseNameIdx)).getStringValue())
: dataverseName;
- libraryDatabase = MetadataUtil.resolveDatabase(libraryDatabase, libraryDataverseName);
- } else {
- libraryDatabase = MetadataUtil.resolveDatabase(libraryDatabase, dataverseName);
+ int libraryDatabaseNameIdx =
+ adapterRecord.getType().getFieldIndex(MetadataRecordTypes.FIELD_NAME_LIBRARY_DATABASE_NAME);
+ if (libraryDatabaseNameIdx >= 0) {
+ libraryDatabase = ((AString) adapterRecord.getValueByPos(libraryDatabaseNameIdx)).getStringValue();
+ } else {
+ libraryDatabase = MetadataUtil.databaseFor(libraryDataverseName);
+ }
}
return new DatasourceAdapter(new AdapterIdentifier(databaseName, dataverseName, adapterName), adapterType,
@@ -162,7 +167,17 @@
return;
}
- //TODO(DB): write library database name
+ //TODO(DB): change to check against something better
+ if (datasourceAdapterEntity.databaseNameIndex() >= 0) {
+ fieldName.reset();
+ aString.setValue(MetadataRecordTypes.FIELD_NAME_LIBRARY_DATABASE_NAME);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ aString.setValue(adapter.getLibraryDatabaseName());
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ recordBuilder.addField(fieldName, fieldValue);
+ }
+
fieldName.reset();
aString.setValue(MetadataRecordTypes.FIELD_NAME_LIBRARY_DATAVERSE_NAME);
stringSerde.serialize(aString, fieldName.getDataOutput());
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatatypeTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatatypeTupleTranslator.java
index f6e7a04..dc8b165 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatatypeTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatatypeTupleTranslator.java
@@ -192,8 +192,8 @@
IAType fieldType = dataType.getDatatype();
if (fieldType.getTypeTag().isDerivedType()) {
fieldValue.reset();
- writeDerivedTypeRecord(dataType.getDataverseName(), (AbstractComplexType) fieldType,
- fieldValue.getDataOutput(), dataType.getIsAnonymous());
+ writeDerivedTypeRecord(dataType.getDatabaseName(), dataType.getDataverseName(),
+ (AbstractComplexType) fieldType, fieldValue.getDataOutput(), dataType.getIsAnonymous());
recordBuilder.addField(datatypeEntity.derivedIndex(), fieldValue);
}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedConnectionTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedConnectionTupleTranslator.java
index 4e17dfe..4d2eb8c 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedConnectionTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedConnectionTupleTranslator.java
@@ -82,6 +82,7 @@
(AUnorderedList) feedConnectionRecord.getValueByPos(feedConnectionEntity.appliedFunctionsIndex());
cursor = afList.getCursor();
while (cursor.next()) {
+ //TODO(DB): deal with database
String afValue = ((AString) cursor.get()).getStringValue();
int pos = afValue.lastIndexOf('.'); //TODO(MULTI_PART_DATAVERSE_NAME):REVISIT
String afDataverseCanonicalName = afValue.substring(0, pos);
@@ -206,6 +207,7 @@
if (fc.getAppliedFunctions() != null) {
List<FunctionSignature> appliedFunctions = fc.getAppliedFunctions();
for (FunctionSignature af : appliedFunctions) {
+ //TODO(DB): deal with database
listEleBuffer.reset();
aString.setValue(af.getDataverseName().getCanonicalForm() + '.' + af.getName()); //TODO(MULTI_PART_DATAVERSE_NAME):REVISIT
stringSerde.serialize(aString, listEleBuffer.getDataOutput());
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FullTextFilterMetadataEntityTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FullTextFilterMetadataEntityTupleTranslator.java
index 61edecc..7f8611d 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FullTextFilterMetadataEntityTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FullTextFilterMetadataEntityTupleTranslator.java
@@ -65,19 +65,22 @@
@Override
protected FullTextFilterMetadataEntity createMetadataEntityFromARecord(ARecord aRecord) throws AlgebricksException {
+ AString dataverseName = (AString) aRecord.getValueByPos(fullTextFilterEntity.dataverseNameIndex());
+ DataverseName dataverse = DataverseName.createFromCanonicalForm(dataverseName.getStringValue());
int databaseNameIndex = fullTextFilterEntity.databaseNameIndex();
String databaseName;
if (databaseNameIndex >= 0) {
databaseName = ((AString) aRecord.getValueByPos(databaseNameIndex)).getStringValue();
+ } else {
+ databaseName = MetadataUtil.databaseFor(dataverse);
}
- AString dataverseName = (AString) aRecord.getValueByPos(fullTextFilterEntity.dataverseNameIndex());
AString filterName = (AString) aRecord.getValueByPos(fullTextFilterEntity.filterNameIndex());
AString filterTypeAString = (AString) aRecord.getValueByPos(fullTextFilterEntity.filterTypeIndex());
FullTextFilterType filterType = FullTextFilterType.getEnumIgnoreCase(filterTypeAString.getStringValue());
switch (filterType) {
case STOPWORDS:
- return createStopwordsFilterDescriptorFromARecord(dataverseName, filterName, aRecord);
+ return createStopwordsFilterDescriptorFromARecord(databaseName, dataverse, filterName, aRecord);
case STEMMER:
case SYNONYM:
default:
@@ -85,9 +88,9 @@
}
}
- public FullTextFilterMetadataEntity createStopwordsFilterDescriptorFromARecord(AString dataverseName, AString name,
- ARecord aRecord) throws AlgebricksException {
- ImmutableList.Builder<String> stopwordsBuilder = ImmutableList.<String> builder();
+ public FullTextFilterMetadataEntity createStopwordsFilterDescriptorFromARecord(String database,
+ DataverseName dataverse, AString name, ARecord aRecord) {
+ ImmutableList.Builder<String> stopwordsBuilder = ImmutableList.builder();
int fieldIndex = aRecord.getType().getFieldIndex(FIELD_NAME_FULL_TEXT_STOPWORD_LIST);
if (fieldIndex >= 0) {
IACursor stopwordsCursor = ((AOrderedList) (aRecord.getValueByPos(fieldIndex))).getCursor();
@@ -96,8 +99,6 @@
}
}
- DataverseName dataverse = DataverseName.createFromCanonicalForm(dataverseName.getStringValue());
- String database = MetadataUtil.databaseFor(dataverse);
StopwordsFullTextFilterDescriptor filterDescriptor = new StopwordsFullTextFilterDescriptor(database, dataverse,
name.getStringValue(), stopwordsBuilder.build());
return new FullTextFilterMetadataEntity(filterDescriptor);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
index aad1eb1..14d7d49 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
@@ -19,9 +19,12 @@
package org.apache.asterix.metadata.entitytupletranslators;
+import static org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_DATABASE_NAME;
import static org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_DATAVERSE_NAME;
+import static org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_LIBRARY_DATABASE_NAME;
import static org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_LIBRARY_DATAVERSE_NAME;
import static org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_NAME;
+import static org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_RETURN_TYPE_DATABASE_NAME;
import static org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_RETURN_TYPE_DATAVERSE_NAME;
import static org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_TYPE;
import static org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_VALUE;
@@ -51,6 +54,7 @@
import org.apache.asterix.common.functions.ExternalFunctionLanguage;
import org.apache.asterix.common.functions.FunctionSignature;
import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.DependencyFullyQualifiedName;
import org.apache.asterix.common.metadata.MetadataUtil;
import org.apache.asterix.common.transactions.TxnId;
import org.apache.asterix.metadata.MetadataNode;
@@ -71,7 +75,6 @@
import org.apache.asterix.om.types.BuiltinTypeMap;
import org.apache.asterix.om.types.TypeSignature;
import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.common.utils.Triple;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
@@ -97,7 +100,7 @@
dependenciesListBuilder = new OrderedListBuilder();
dependencyListBuilder = new OrderedListBuilder();
dependencyNameListBuilder = new OrderedListBuilder();
- dependencySubnames = new ArrayList<>(3);
+ dependencySubnames = new ArrayList<>(4);
stringList = new AOrderedListType(BuiltinType.ASTRING, null);
listOfLists = new AOrderedListType(new AOrderedListType(BuiltinType.ASTRING, null), null);
}
@@ -126,7 +129,7 @@
paramNames.add(((AString) paramNameCursor.get()).getStringValue());
}
- List<TypeSignature> paramTypes = getParamTypes(functionRecord, dataverseName);
+ List<TypeSignature> paramTypes = getParamTypes(functionRecord, databaseName, dataverseName);
TypeSignature returnType;
String returnTypeName =
@@ -134,8 +137,8 @@
if (returnTypeName.isEmpty()) {
returnType = null; // == any
} else {
- String returnTypeDataverseNameCanonical = getString(functionRecord, FIELD_NAME_RETURN_TYPE_DATAVERSE_NAME);
- returnType = getTypeSignature(returnTypeName, returnTypeDataverseNameCanonical, dataverseName);
+ returnType = getTypeSignature(functionRecord, returnTypeName, FIELD_NAME_RETURN_TYPE_DATABASE_NAME,
+ FIELD_NAME_RETURN_TYPE_DATAVERSE_NAME, databaseName, dataverseName);
}
String definition =
@@ -146,6 +149,7 @@
((AString) functionRecord.getValueByPos(functionEntity.functionKindIndex())).getStringValue();
Map<String, String> resources = null;
+ String libraryDatabaseName = null;
DataverseName libraryDataverseName = null;
String libraryName;
List<String> externalIdentifier = null;
@@ -160,12 +164,17 @@
libraryName = getString(functionRecord, MetadataRecordTypes.FIELD_NAME_LIBRARY_NAME);
String libraryDataverseCanonicalName = getString(functionRecord, FIELD_NAME_LIBRARY_DATAVERSE_NAME);
libraryDataverseName = DataverseName.createFromCanonicalForm(libraryDataverseCanonicalName);
+ libraryDatabaseName = getString(functionRecord, FIELD_NAME_LIBRARY_DATABASE_NAME);
+ if (libraryDatabaseName == null) {
+ libraryDatabaseName = MetadataUtil.databaseFor(libraryDataverseName);
+ }
resources = getResources(functionRecord, FUNCTION_ARECORD_FUNCTION_RESOURCES_FIELD_NAME);
definition = null;
} else {
// back-compat. get external identifier from function body
libraryName = getString(functionRecord, FUNCTION_ARECORD_FUNCTION_LIBRARY_FIELD_NAME);
if (libraryName != null) {
+ libraryDatabaseName = databaseName;
libraryDataverseName = dataverseName;
externalIdentifier =
decodeExternalIdentifierBackCompat(definition, ExternalFunctionLanguage.valueOf(language));
@@ -182,13 +191,12 @@
IACursor dependenciesCursor =
((AOrderedList) functionRecord.getValueByPos(functionEntity.functionDependenciesIndex())).getCursor();
- List<List<Triple<DataverseName, String, String>>> dependencies = new ArrayList<>();
+ List<List<DependencyFullyQualifiedName>> dependencies = new ArrayList<>();
while (dependenciesCursor.next()) {
- List<Triple<DataverseName, String, String>> dependencyList = new ArrayList<>();
+ List<DependencyFullyQualifiedName> dependencyList = new ArrayList<>();
IACursor qualifiedDependencyCursor = ((AOrderedList) dependenciesCursor.get()).getCursor();
while (qualifiedDependencyCursor.next()) {
- Triple<DataverseName, String, String> dependency =
- getDependency((AOrderedList) qualifiedDependencyCursor.get());
+ DependencyFullyQualifiedName dependency = getDependency((AOrderedList) qualifiedDependencyCursor.get());
dependencyList.add(dependency);
}
dependencies.add(dependencyList);
@@ -197,12 +205,12 @@
FunctionSignature signature = new FunctionSignature(dataverseName, functionName, arity);
return new Function(signature, paramNames, paramTypes, returnType, definition, functionKind, language,
- libraryDataverseName, libraryName, externalIdentifier, nullCall, deterministic, resources,
- dependencies);
+ libraryDatabaseName, libraryDataverseName, libraryName, externalIdentifier, nullCall, deterministic,
+ resources, dependencies);
}
- private List<TypeSignature> getParamTypes(ARecord functionRecord, DataverseName functionDataverseName)
- throws AlgebricksException {
+ private List<TypeSignature> getParamTypes(ARecord functionRecord, String functionDatabaseName,
+ DataverseName functionDataverseName) throws AlgebricksException {
ARecordType functionRecordType = functionRecord.getType();
int paramTypesFieldIdx = functionRecordType.getFieldIndex(FUNCTION_ARECORD_FUNCTION_PARAMTYPES_FIELD_NAME);
if (paramTypesFieldIdx < 0) {
@@ -222,8 +230,8 @@
case OBJECT:
ARecord paramTypeRecord = (ARecord) paramTypeObject;
String paramTypeName = getString(paramTypeRecord, FIELD_NAME_TYPE);
- String paramTypeDataverseNameCanonical = getString(paramTypeRecord, FIELD_NAME_DATAVERSE_NAME);
- paramType = getTypeSignature(paramTypeName, paramTypeDataverseNameCanonical, functionDataverseName);
+ paramType = getTypeSignature(paramTypeRecord, paramTypeName, FIELD_NAME_DATABASE_NAME,
+ FIELD_NAME_DATAVERSE_NAME, functionDatabaseName, functionDataverseName);
break;
default:
throw new AsterixException(ErrorCode.METADATA_ERROR, paramTypeObject.getType().getTypeName());
@@ -233,8 +241,8 @@
return paramTypes;
}
- private TypeSignature getTypeSignature(String typeName, String typeDataverseNameCanonical,
- DataverseName functionDataverseName) throws AlgebricksException {
+ private TypeSignature getTypeSignature(ARecord record, String typeName, String dbFieldName, String dvFieldName,
+ String functionDatabaseName, DataverseName functionDataverseName) throws AlgebricksException {
// back-compat: handle "any"
if (BuiltinType.ANY.getTypeName().equals(typeName)) {
return null; // == any
@@ -243,8 +251,21 @@
if (builtinType != null) {
return new TypeSignature(builtinType);
}
- DataverseName typeDataverseName = typeDataverseNameCanonical == null ? functionDataverseName
- : DataverseName.createFromCanonicalForm(typeDataverseNameCanonical);
+
+ String typeDatabaseName;
+ DataverseName typeDataverseName;
+ String typeDataverseNameCanonical = getString(record, dvFieldName);
+ if (typeDataverseNameCanonical == null) {
+ typeDataverseName = functionDataverseName;
+ typeDatabaseName = functionDatabaseName;
+ } else {
+ typeDataverseName = DataverseName.createFromCanonicalForm(typeDataverseNameCanonical);
+ typeDatabaseName = getString(record, dbFieldName);
+ if (typeDatabaseName == null) {
+ typeDatabaseName = MetadataUtil.databaseFor(typeDataverseName);
+ }
+ }
+
return new TypeSignature(typeDataverseName, typeName);
}
@@ -380,25 +401,12 @@
// write field 8
dependenciesListBuilder.reset((AOrderedListType) functionEntity.getRecordType().getFieldTypes()[functionEntity
.functionDependenciesIndex()]);
- List<List<Triple<DataverseName, String, String>>> dependenciesList = function.getDependencies();
- List<String> subNames = new ArrayList<>();
- for (List<Triple<DataverseName, String, String>> dependencies : dependenciesList) {
+ List<List<DependencyFullyQualifiedName>> dependenciesList = function.getDependencies();
+ boolean writeDatabase = functionEntity.databaseNameIndex() >= 0;
+ for (List<DependencyFullyQualifiedName> dependencies : dependenciesList) {
dependencyListBuilder.reset(listOfLists);
- for (Triple<DataverseName, String, String> dependency : dependencies) {
- dependencyNameListBuilder.reset(stringList);
- subNames.clear();
- getDependencySubNames(dependency, subNames);
- for (String subName : subNames) {
- itemValue.reset();
- aString.setValue(subName);
- stringSerde.serialize(aString, itemValue.getDataOutput());
- dependencyNameListBuilder.addItem(itemValue);
- }
- itemValue.reset();
- dependencyNameListBuilder.write(itemValue.getDataOutput(), true);
- dependencyListBuilder.addItem(itemValue);
-
- }
+ writeDeps(dependencyListBuilder, itemValue, dependencies, dependencyNameListBuilder, stringList,
+ writeDatabase, aString, stringSerde);
itemValue.reset();
dependencyListBuilder.write(itemValue.getDataOutput(), true);
dependenciesListBuilder.addItem(itemValue);
@@ -463,8 +471,8 @@
if (paramType == null) {
nullSerde.serialize(ANull.NULL, itemValue.getDataOutput());
} else {
- writeTypeRecord(paramType.getDataverseName(), paramType.getName(), function.getDataverseName(),
- itemValue.getDataOutput());
+ writeTypeRecord(paramType.getDatabaseName(), paramType.getDataverseName(), paramType.getName(),
+ function.getDatabaseName(), function.getDataverseName(), itemValue.getDataOutput());
}
listBuilder.addItem(itemValue);
}
@@ -483,6 +491,16 @@
return;
}
+ if (functionEntity.databaseNameIndex() >= 0) {
+ fieldName.reset();
+ aString.setValue(FIELD_NAME_LIBRARY_DATABASE_NAME);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ aString.setValue(function.getLibraryDatabaseName());
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ recordBuilder.addField(fieldName, fieldValue);
+ }
+
fieldName.reset();
aString.setValue(FIELD_NAME_LIBRARY_DATAVERSE_NAME);
stringSerde.serialize(aString, fieldName.getDataOutput());
@@ -522,9 +540,20 @@
return;
}
DataverseName returnTypeDataverseName = returnType.getDataverseName();
- if (returnTypeDataverseName == null || returnTypeDataverseName.equals(function.getDataverseName())) {
+ String returnTypeDatabaseName = returnType.getDatabaseName();
+ if (returnTypeDataverseName == null || (returnTypeDatabaseName.equals(function.getDatabaseName())
+ && returnTypeDataverseName.equals(function.getDataverseName()))) {
return;
}
+ if (functionEntity.databaseNameIndex() >= 0) {
+ fieldName.reset();
+ aString.setValue(FIELD_NAME_RETURN_TYPE_DATABASE_NAME);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ aString.setValue(returnTypeDatabaseName);
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ recordBuilder.addField(fieldName, fieldValue);
+ }
fieldName.reset();
aString.setValue(FIELD_NAME_RETURN_TYPE_DATAVERSE_NAME);
stringSerde.serialize(aString, fieldName.getDataOutput());
@@ -585,8 +614,9 @@
propertyRecordBuilder.write(out, true);
}
- public void writeTypeRecord(DataverseName typeDataverseName, String typeName, DataverseName functionDataverseName,
- DataOutput out) throws HyracksDataException {
+ public void writeTypeRecord(String typeDatabaseName, DataverseName typeDataverseName, String typeName,
+ String functionDatabaseName, DataverseName functionDataverseName, DataOutput out)
+ throws HyracksDataException {
IARecordBuilder propertyRecordBuilder = new RecordBuilder();
propertyRecordBuilder.reset(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
@@ -600,8 +630,19 @@
propertyRecordBuilder.addField(fieldName, fieldValue);
// write field "DataverseName"
- boolean skipTypeDataverseName = typeDataverseName == null || typeDataverseName.equals(functionDataverseName);
+ boolean skipTypeDataverseName = typeDataverseName == null
+ || (typeDatabaseName.equals(functionDatabaseName) && typeDataverseName.equals(functionDataverseName));
if (!skipTypeDataverseName) {
+ if (functionEntity.databaseNameIndex() >= 0) {
+ fieldName.reset();
+ aString.setValue(FIELD_NAME_DATABASE_NAME);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ aString.setValue(typeDatabaseName);
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ propertyRecordBuilder.addField(fieldName, fieldValue);
+ }
+
fieldName.reset();
aString.setValue(FIELD_NAME_DATAVERSE_NAME);
stringSerde.serialize(aString, fieldName.getDataOutput());
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
index be80e93..453ccc1 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
@@ -323,14 +323,13 @@
// from the record metadata
Dataset dataset = metadataNode.getDataset(txnId, databaseName, dataverseName, datasetName);
String datatypeName = dataset.getItemTypeName();
- //TODO(DB): get 'database' of item type and meta type
DataverseName datatypeDataverseName = dataset.getItemTypeDataverseName();
- String datatypeDatabase = MetadataUtil.databaseFor(datatypeDataverseName);
+ String datatypeDatabase = dataset.getItemTypeDatabaseName();
ARecordType recordDt = (ARecordType) metadataNode
.getDatatype(txnId, datatypeDatabase, datatypeDataverseName, datatypeName).getDatatype();
String metatypeName = dataset.getMetaItemTypeName();
DataverseName metatypeDataverseName = dataset.getMetaItemTypeDataverseName();
- String metaTypeDatabase = MetadataUtil.databaseFor(metatypeDataverseName);
+ String metaTypeDatabase = dataset.getMetaItemTypeDatabaseName();
ARecordType metaDt = null;
if (metatypeName != null && metatypeDataverseName != null) {
metaDt = (ARecordType) metadataNode
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/SynonymTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/SynonymTupleTranslator.java
index a6a9e05..bb3ad28 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/SynonymTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/SynonymTupleTranslator.java
@@ -21,6 +21,7 @@
import org.apache.asterix.common.metadata.DataverseName;
import org.apache.asterix.common.metadata.MetadataUtil;
+import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes;
import org.apache.asterix.metadata.bootstrap.SynonymEntity;
import org.apache.asterix.metadata.entities.Synonym;
import org.apache.asterix.om.base.ARecord;
@@ -59,9 +60,19 @@
((AString) synonymRecord.getValueByPos(synonymEntity.objectDataverseNameIndex())).getStringValue();
DataverseName objectDataverseName = DataverseName.createFromCanonicalForm(objectDataverseCanonicalName);
+ String objectDatabaseName;
+ int objectDatabaseIdx =
+ synonymRecord.getType().getFieldIndex(MetadataRecordTypes.FIELD_NAME_OBJECT_DATABASE_NAME);
+ if (objectDatabaseIdx >= 0) {
+ objectDatabaseName = ((AString) synonymRecord.getValueByPos(objectDatabaseIdx)).getStringValue();
+ } else {
+ objectDatabaseName = MetadataUtil.databaseFor(objectDataverseName);
+ }
+
String objectName = ((AString) synonymRecord.getValueByPos(synonymEntity.objectNameIndex())).getStringValue();
- return new Synonym(databaseName, dataverseName, synonymName, objectDataverseName, objectName);
+ return new Synonym(databaseName, dataverseName, synonymName, objectDatabaseName, objectDataverseName,
+ objectName);
}
@Override
@@ -116,6 +127,9 @@
stringSerde.serialize(aString, fieldValue.getDataOutput());
recordBuilder.addField(synonymEntity.objectNameIndex(), fieldValue);
+ // write open fields
+ writeOpenFields(synonym);
+
// write record
recordBuilder.write(tupleBuilder.getDataOutput(), true);
tupleBuilder.addFieldEndOffset();
@@ -123,4 +137,17 @@
tuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray());
return tuple;
}
+
+ private void writeOpenFields(Synonym synonym) throws HyracksDataException {
+ //TODO(DB): should use something better
+ if (synonymEntity.databaseNameIndex() >= 0) {
+ fieldName.reset();
+ aString.setValue(MetadataRecordTypes.FIELD_NAME_OBJECT_DATABASE_NAME);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ aString.setValue(synonym.getObjectDatabaseName());
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ recordBuilder.addField(fieldName, fieldValue);
+ }
+ }
}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtil.java
index 232ba33..484c2f7 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtil.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtil.java
@@ -80,6 +80,7 @@
throw new AsterixException(ErrorCode.METADATA_ERROR, function.getSignature().toString());
}
+ //TODO(DB): review
return new ExternalScalarFunctionInfo(function.getSignature().createFunctionIdentifier(), paramTypes,
returnType, typeComputer, lang, function.getLibraryDataverseName(), function.getLibraryName(),
function.getExternalIdentifier(), function.getResources(), deterministic, function.getNullCall());
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/TypeUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/TypeUtil.java
index d78e31d..3c6b63b 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/TypeUtil.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/TypeUtil.java
@@ -579,13 +579,16 @@
return DATASET_INLINE_TYPE_PREFIX + typeChar + TYPE_NAME_DELIMITER + datasetName;
}
- public static boolean isDatasetInlineTypeName(Dataset dataset, DataverseName typeDataverseName, String typeName) {
- return isInlineTypeName(dataset.getDataverseName(), typeDataverseName, typeName, DATASET_INLINE_TYPE_PREFIX);
+ public static boolean isDatasetInlineTypeName(Dataset dataset, String typeDatabaseName,
+ DataverseName typeDataverseName, String typeName) {
+ return isInlineTypeName(dataset.getDatabaseName(), dataset.getDataverseName(), typeDatabaseName,
+ typeDataverseName, typeName, DATASET_INLINE_TYPE_PREFIX);
}
- private static boolean isInlineTypeName(DataverseName entityDataverseName, DataverseName typeDataverseName,
- String typeName, String inlineTypePrefix) {
- return entityDataverseName.equals(typeDataverseName) && typeName.startsWith(inlineTypePrefix);
+ private static boolean isInlineTypeName(String entityDatabaseName, DataverseName entityDataverseName,
+ String typeDatabaseName, DataverseName typeDataverseName, String typeName, String inlineTypePrefix) {
+ return entityDatabaseName.equals(typeDatabaseName) && entityDataverseName.equals(typeDataverseName)
+ && typeName.startsWith(inlineTypePrefix);
}
public static String createFunctionParameterTypeName(String functionName, int arity, int parameterIndex) {
@@ -600,9 +603,10 @@
return sb.toString();
}
- public static boolean isFunctionInlineTypeName(Function function, DataverseName typeDataverseName,
- String typeName) {
- return isInlineTypeName(function.getDataverseName(), typeDataverseName, typeName, FUNCTION_INLINE_TYPE_PREFIX);
+ public static boolean isFunctionInlineTypeName(Function function, String typeDatabaseName,
+ DataverseName typeDataverseName, String typeName) {
+ return isInlineTypeName(function.getDatabaseName(), function.getDataverseName(), typeDatabaseName,
+ typeDataverseName, typeName, FUNCTION_INLINE_TYPE_PREFIX);
}
public static String getFullyQualifiedDisplayName(DataverseName dataverseName, String typeName) {
@@ -615,16 +619,16 @@
public static List<TypeSignature> getFunctionInlineTypes(Function function) {
List<TypeSignature> inlineTypes = Collections.emptyList();
TypeSignature returnType = function.getReturnType();
- if (returnType != null
- && isFunctionInlineTypeName(function, returnType.getDataverseName(), returnType.getName())) {
+ if (returnType != null && isFunctionInlineTypeName(function, returnType.getDatabaseName(),
+ returnType.getDataverseName(), returnType.getName())) {
inlineTypes = new ArrayList<>();
inlineTypes.add(returnType);
}
List<TypeSignature> parameterTypes = function.getParameterTypes();
if (parameterTypes != null) {
for (TypeSignature parameterType : parameterTypes) {
- if (parameterType != null && isFunctionInlineTypeName(function, parameterType.getDataverseName(),
- parameterType.getName())) {
+ if (parameterType != null && isFunctionInlineTypeName(function, parameterType.getDatabaseName(),
+ parameterType.getDataverseName(), parameterType.getName())) {
if (inlineTypes.isEmpty()) {
inlineTypes = new ArrayList<>();
}
diff --git a/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslatorTest.java b/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslatorTest.java
index 7bf8f6a..2832470 100644
--- a/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslatorTest.java
+++ b/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslatorTest.java
@@ -56,11 +56,15 @@
Collections.singletonList(BuiltinType.AINT64), false, null, null);
DataverseName dv = DataverseName.createSinglePartName("test");
+ DataverseName itemTypeDv = DataverseName.createSinglePartName("foo");
+ DataverseName metaTypeDv = DataverseName.createSinglePartName("CB");
String db = MetadataUtil.databaseFor(dv);
- Dataset dataset = new Dataset(db, dv, "log", DataverseName.createSinglePartName("foo"), "LogType",
- DataverseName.createSinglePartName("CB"), "MetaType", "DEFAULT_NG_ALL_NODES", "prefix",
- compactionPolicyProperties, details, Collections.emptyMap(), DatasetType.INTERNAL, 115, 0,
- CompressionManager.NONE, DatasetFormatInfo.SYSTEM_DEFAULT);
+ String itemTypeDb = MetadataUtil.databaseFor(itemTypeDv);
+ String metaTypeDb = MetadataUtil.databaseFor(metaTypeDv);
+ Dataset dataset = new Dataset(db, dv, "log", itemTypeDb, itemTypeDv, "LogType", metaTypeDb, metaTypeDv,
+ "MetaType", "DEFAULT_NG_ALL_NODES", "prefix", compactionPolicyProperties, details,
+ Collections.emptyMap(), DatasetType.INTERNAL, 115, 0, CompressionManager.NONE,
+ DatasetFormatInfo.SYSTEM_DEFAULT);
DatasetTupleTranslator dtTranslator = new DatasetTupleTranslator(true, DatasetEntity.of(false));
ITupleReference tuple = dtTranslator.getTupleFromMetadataEntity(dataset);
Dataset deserializedDataset = dtTranslator.getMetadataEntityFromTuple(tuple);
diff --git a/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java b/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java
index 0e25177..00f188d 100644
--- a/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java
+++ b/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java
@@ -71,9 +71,12 @@
DataverseName dvFoo = DataverseName.createSinglePartName("foo");
DataverseName dvCB = DataverseName.createSinglePartName("CB");
String dvTestDatabase = MetadataUtil.databaseFor(dvTest);
- Dataset dataset = new Dataset(dvTestDatabase, dvTest, "d1", dvFoo, "LogType", dvCB, "MetaType",
- "DEFAULT_NG_ALL_NODES", "prefix", compactionPolicyProperties, details, Collections.emptyMap(),
- DatasetType.INTERNAL, 115, 0, CompressionManager.NONE, DatasetFormatInfo.SYSTEM_DEFAULT);
+ String itemTypeDatabase = MetadataUtil.databaseFor(dvFoo);
+ String metaTypeDatabase = MetadataUtil.databaseFor(dvCB);
+ Dataset dataset = new Dataset(dvTestDatabase, dvTest, "d1", itemTypeDatabase, dvFoo, "LogType",
+ metaTypeDatabase, dvCB, "MetaType", "DEFAULT_NG_ALL_NODES", "prefix", compactionPolicyProperties,
+ details, Collections.emptyMap(), DatasetType.INTERNAL, 115, 0, CompressionManager.NONE,
+ DatasetFormatInfo.SYSTEM_DEFAULT);
Index index = new Index(dvTestDatabase, dvTest, "d1", "i1", IndexType.BTREE,
Collections.singletonList(Collections.singletonList("row_id")),
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/TypeSignature.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/TypeSignature.java
index 682ec6a..e08eff5 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/TypeSignature.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/TypeSignature.java
@@ -22,6 +22,7 @@
import java.util.Objects;
import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.MetadataUtil;
public class TypeSignature implements Serializable {
@@ -45,7 +46,8 @@
return false;
} else {
TypeSignature f = ((TypeSignature) o);
- return Objects.equals(dataverseName, f.getDataverseName()) && name.equals(f.getName());
+ return Objects.equals(getDatabaseName(), f.getDatabaseName())
+ && Objects.equals(dataverseName, f.getDataverseName()) && name.equals(f.getName());
}
}
@@ -56,7 +58,11 @@
@Override
public int hashCode() {
- return Objects.hash(dataverseName, name);
+ return Objects.hash(getDatabaseName(), dataverseName, name);
+ }
+
+ public String getDatabaseName() {
+ return MetadataUtil.databaseFor(dataverseName);
}
public DataverseName getDataverseName() {