[ASTERIXDB-3483]: Synonym Owner changes
- user model changes: no
- storage format changes: no
- interface changes: yes
Ext-ref: MB-62971
Change-Id: I2ba30fc0adcb7517a329d348105fd0fa7945dca1
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18927
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
Tested-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
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 02f1085..2a26d63 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
@@ -455,7 +455,8 @@
handleLibraryDropStatement(metadataProvider, stmt, hcc, requestParameters);
break;
case CREATE_SYNONYM:
- handleCreateSynonymStatement(metadataProvider, stmt, requestParameters);
+ handleCreateSynonymStatement(metadataProvider, stmt, requestParameters,
+ Creator.DEFAULT_CREATOR);
break;
case SYNONYM_DROP:
handleDropSynonymStatement(metadataProvider, stmt, requestParameters);
@@ -3823,7 +3824,7 @@
}
protected void handleCreateSynonymStatement(MetadataProvider metadataProvider, Statement stmt,
- IRequestParameters requestParameters) throws Exception {
+ IRequestParameters requestParameters, Creator creator) throws Exception {
CreateSynonymStatement css = (CreateSynonymStatement) stmt;
metadataProvider.validateDatabaseObjectName(css.getNamespace(), css.getSynonymName(), css.getSourceLocation());
Namespace stmtActiveNamespace = getActiveNamespace(css.getNamespace());
@@ -3837,14 +3838,16 @@
}
lockUtil.createSynonymBegin(lockManager, metadataProvider.getLocks(), databaseName, dataverseName, synonymName);
try {
- doCreateSynonym(metadataProvider, css, stmtActiveNamespace, synonymName, objectNamespace, objectName);
+ doCreateSynonym(metadataProvider, css, stmtActiveNamespace, synonymName, objectNamespace, objectName,
+ creator);
} finally {
metadataProvider.getLocks().unlock();
}
}
protected CreateResult doCreateSynonym(MetadataProvider metadataProvider, CreateSynonymStatement css,
- Namespace namespace, String synonymName, Namespace objectNamespace, String objectName) throws Exception {
+ Namespace namespace, String synonymName, Namespace objectNamespace, String objectName, Creator creator)
+ throws Exception {
String databaseName = namespace.getDatabaseName();
DataverseName dataverseName = namespace.getDataverseName();
MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
@@ -3869,8 +3872,10 @@
throw new CompilationException(ErrorCode.SYNONYM_EXISTS, css.getSourceLocation(), synonymName);
}
synonym = new Synonym(databaseName, dataverseName, synonymName, objectNamespace.getDatabaseName(),
- objectNamespace.getDataverseName(), objectName);
+ objectNamespace.getDataverseName(), objectName, creator);
MetadataManager.INSTANCE.addSynonym(metadataProvider.getMetadataTxnContext(), synonym);
+ beforeTxnCommit(metadataProvider, creator,
+ EntityDetails.newSynonym(databaseName, dataverseName, synonymName));
MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
return CreateResult.CREATED;
} catch (Exception e) {
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 6427b88..886eef8 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", "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" }
+{ "DatabaseName": "Default", "DataverseName": "test", "SynonymName": "TweetMessagesSynonym", "ObjectDataverseName": "test", "ObjectName": "TweetMessages", "ObjectDatabaseName": "Default", "Creator": { "Name": "@sys", "Uuid": "97c793f3-bcbf-4595-8bf0-e9d6a5953523" } }
+{ "DatabaseName": "Default", "DataverseName": "test", "SynonymName": "TweetMessagesSynonym2", "ObjectDataverseName": "test", "ObjectName": "TweetMessagesSynonym", "ObjectDatabaseName": "Default", "Creator": { "Name": "@sys", "Uuid": "97c793f3-bcbf-4595-8bf0-e9d6a5953523" } }
+{ "DatabaseName": "Default", "DataverseName": "test", "SynonymName": "TwitterUsersSynonym", "ObjectDataverseName": "test", "ObjectName": "TwitterUsers", "ObjectDatabaseName": "Default", "Creator": { "Name": "@sys", "Uuid": "97c793f3-bcbf-4595-8bf0-e9d6a5953523" } }
+{ "DatabaseName": "Default", "DataverseName": "test", "SynonymName": "TwitterUsersSynonym2", "ObjectDataverseName": "test", "ObjectName": "TwitterUsersSynonym", "ObjectDatabaseName": "Default", "Creator": { "Name": "@sys", "Uuid": "97c793f3-bcbf-4595-8bf0-e9d6a5953523" } }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/EntityDetails.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/EntityDetails.java
index 532d107..1e95d0b 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/EntityDetails.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/EntityDetails.java
@@ -31,7 +31,8 @@
VIEW,
FUNCTION,
DATABASE,
- DATAVERSE
+ DATAVERSE,
+ SYNONYM
}
private final String databaseName;
@@ -66,6 +67,10 @@
return new EntityDetails(databaseName, dataverseName, functionName, EntityType.FUNCTION);
}
+ public static EntityDetails newSynonym(String databaseName, DataverseName dataverseName, String synonymName) {
+ return new EntityDetails(databaseName, dataverseName, synonymName, EntityType.SYNONYM);
+ }
+
public String getDatabaseName() {
return databaseName;
}
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 ebe780a..a355b6d 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
@@ -24,6 +24,7 @@
import org.apache.asterix.common.metadata.DataverseName;
import org.apache.asterix.metadata.MetadataCache;
import org.apache.asterix.metadata.api.IMetadataEntity;
+import org.apache.asterix.metadata.utils.Creator;
public class Synonym implements IMetadataEntity<Synonym> {
@@ -40,15 +41,17 @@
private final DataverseName objectDataverseName;
private final String objectName;
+ private final Creator creator;
public Synonym(String databaseName, DataverseName dataverseName, String synonymName, String objectDatabaseName,
- DataverseName objectDataverseName, String objectName) {
+ DataverseName objectDataverseName, String objectName, Creator creator) {
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);
+ this.creator = creator;
}
public String getDatabaseName() {
@@ -75,6 +78,10 @@
return objectName;
}
+ public Creator getCreator() {
+ return creator;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o)
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 bb3ad28..389322c 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
@@ -19,13 +19,16 @@
package org.apache.asterix.metadata.entitytupletranslators;
+import org.apache.asterix.builders.RecordBuilder;
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.metadata.utils.Creator;
import org.apache.asterix.om.base.ARecord;
import org.apache.asterix.om.base.AString;
+import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
@@ -70,9 +73,10 @@
}
String objectName = ((AString) synonymRecord.getValueByPos(synonymEntity.objectNameIndex())).getStringValue();
+ Creator creator = Creator.createOrDefault(synonymRecord);
return new Synonym(databaseName, dataverseName, synonymName, objectDatabaseName, objectDataverseName,
- objectName);
+ objectName, creator);
}
@Override
@@ -149,5 +153,37 @@
stringSerde.serialize(aString, fieldValue.getDataOutput());
recordBuilder.addField(fieldName, fieldValue);
}
+ writeSynonymCreator(synonym);
+ }
+
+ private void writeSynonymCreator(Synonym synonym) throws HyracksDataException {
+ if (synonymEntity.databaseNameIndex() >= 0) {
+ Creator creatorInfo = synonym.getCreator();
+ RecordBuilder creatorObject = new RecordBuilder();
+ creatorObject.reset(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
+
+ fieldName.reset();
+ aString.setValue(MetadataRecordTypes.FIELD_NAME_CREATOR_NAME);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ aString.setValue(creatorInfo.getName());
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ creatorObject.addField(fieldName, fieldValue);
+
+ fieldName.reset();
+ aString.setValue(MetadataRecordTypes.FIELD_NAME_CREATOR_UUID);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ aString.setValue(creatorInfo.getUuid());
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ creatorObject.addField(fieldName, fieldValue);
+
+ fieldName.reset();
+ aString.setValue(MetadataRecordTypes.CREATOR_ARECORD_FIELD_NAME);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ creatorObject.write(fieldValue.getDataOutput(), true);
+ recordBuilder.addField(fieldName, fieldValue);
+ }
}
}