This is an automated email from the ASF dual-hosted git repository. alsuliman pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push: new c39cdf11de [ASTERIXDB-3483][MTD]: Metadata changes for Owner c39cdf11de is described below commit c39cdf11decae2152bd2ed89e68bee23cd5880e5 Author: janhavitripurwar <janhavi.tripur...@couchbase.com> AuthorDate: Wed Aug 7 15:42:42 2024 +0530 [ASTERIXDB-3483][MTD]: Metadata changes for Owner - user model changes: no - storage format changes: no - interface changes: yes Details - Introducethe default owner '@sys'. - Add 'ownerName' field in the open part of the record in database and dataverse entities. - Extend 'handleCreateDatabaseStatement' and 'handleCreateDataverseStatement' to pass the owner name. - This change is backward Compatible. Database and Dataverse records with and without owner fields stay together, For example: { Database: { DatabaseName: "db", SystemDatabase: false, Timestamp: "Tue Aug 13 10:30:34 IST 2024", PendingOp: 0 } } { Database: { DatabaseName: "db1", SystemDatabase: false, Timestamp: "Tue Aug 13 10:48:54 IST 2024", PendingOp: 0, OwnerName: "@sys" } } Ext-ref: MB-62971 Change-Id: If799816f5f6a076cc1f5f95c2080f1414fdf2352 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18628 Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: Janhavi Tripurwar <janhavi.tripur...@couchbase.com> Reviewed-by: Ali Alsuliman <ali.al.solai...@gmail.com> Tested-by: Ali Alsuliman <ali.al.solai...@gmail.com> --- .../asterix/app/translator/QueryTranslator.java | 34 +++++++++++---------- .../asterix/app/bootstrap/TestNodeController.java | 9 +++--- .../asterix/common/metadata/MetadataConstants.java | 3 ++ .../metadata/MetadataTransactionContext.java | 4 +-- .../bootstrap/MetadataBuiltinEntities.java | 19 ++++++------ .../metadata/bootstrap/MetadataRecordTypes.java | 3 ++ .../apache/asterix/metadata/entities/Database.java | 8 ++++- .../asterix/metadata/entities/Dataverse.java | 8 ++++- .../DatabaseTupleTranslator.java | 32 +++++++++++++++++++- .../DataverseTupleTranslator.java | 35 ++++++++++++++++++++-- 10 files changed, 120 insertions(+), 35 deletions(-) diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java index 0c736a245b..26020e53a1 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 @@ -383,10 +383,12 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen activeNamespace = handleUseDataverseStatement(metadataProvider, stmt); break; case CREATE_DATABASE: - handleCreateDatabaseStatement(metadataProvider, stmt, requestParameters); + handleCreateDatabaseStatement(metadataProvider, stmt, requestParameters, + MetadataConstants.DEFAULT_OWNER); break; case CREATE_DATAVERSE: - handleCreateDataverseStatement(metadataProvider, stmt, requestParameters); + handleCreateDataverseStatement(metadataProvider, stmt, requestParameters, + MetadataConstants.DEFAULT_OWNER); break; case DATASET_DECL: handleCreateDatasetStatement(metadataProvider, stmt, hcc, requestParameters); @@ -656,7 +658,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen } protected void handleCreateDatabaseStatement(MetadataProvider metadataProvider, Statement stmt, - IRequestParameters requestParameters) throws Exception { + IRequestParameters requestParameters, String ownerName) throws Exception { CreateDatabaseStatement stmtCreateDatabase = (CreateDatabaseStatement) stmt; String database = stmtCreateDatabase.getDatabaseName().getValue(); metadataProvider.validateDatabaseName(database, stmt.getSourceLocation()); @@ -665,14 +667,14 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen } lockUtil.createDatabaseBegin(lockManager, metadataProvider.getLocks(), database); try { - doCreateDatabaseStatement(metadataProvider, stmtCreateDatabase, requestParameters); + doCreateDatabaseStatement(metadataProvider, stmtCreateDatabase, requestParameters, ownerName); } finally { metadataProvider.getLocks().unlock(); } } protected boolean doCreateDatabaseStatement(MetadataProvider mdProvider, CreateDatabaseStatement stmtCreateDatabase, - IRequestParameters requestParameters) throws Exception { + IRequestParameters requestParameters, String ownerName) throws Exception { MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction(); mdProvider.setMetadataTxnContext(mdTxnCtx); try { @@ -687,8 +689,9 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen databaseName); } } + MetadataManager.INSTANCE.addDatabase(mdTxnCtx, - new Database(databaseName, false, MetadataUtil.PENDING_NO_OP)); + new Database(databaseName, false, ownerName, MetadataUtil.PENDING_NO_OP)); MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); return true; } catch (Exception e) { @@ -698,7 +701,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen } protected void handleCreateDataverseStatement(MetadataProvider metadataProvider, Statement stmt, - IRequestParameters requestParameters) throws Exception { + IRequestParameters requestParameters, String ownerName) throws Exception { CreateDataverseStatement stmtCreateDataverse = (CreateDataverseStatement) stmt; DataverseName dvName = stmtCreateDataverse.getDataverseName(); String dbName = stmtCreateDataverse.getDatabaseName(); @@ -709,7 +712,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen } lockUtil.createDataverseBegin(lockManager, metadataProvider.getLocks(), dbName, dvName); try { - doCreateDataverseStatement(metadataProvider, stmtCreateDataverse, requestParameters); + doCreateDataverseStatement(metadataProvider, stmtCreateDataverse, requestParameters, ownerName); } finally { metadataProvider.getLocks().unlock(); } @@ -717,7 +720,8 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen @SuppressWarnings("squid:S00112") protected boolean doCreateDataverseStatement(MetadataProvider metadataProvider, - CreateDataverseStatement stmtCreateDataverse, IRequestParameters requestParameters) throws Exception { + CreateDataverseStatement stmtCreateDataverse, IRequestParameters requestParameters, String ownerName) + throws Exception { MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction(); metadataProvider.setMetadataTxnContext(mdTxnCtx); try { @@ -740,8 +744,8 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen dvName); } } - MetadataManager.INSTANCE.addDataverse(metadataProvider.getMetadataTxnContext(), - new Dataverse(dbName, dvName, stmtCreateDataverse.getFormat(), MetadataUtil.PENDING_NO_OP)); + MetadataManager.INSTANCE.addDataverse(metadataProvider.getMetadataTxnContext(), new Dataverse(dbName, + dvName, stmtCreateDataverse.getFormat(), MetadataUtil.PENDING_NO_OP, ownerName)); MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); return true; } catch (Exception e) { @@ -2068,8 +2072,8 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen // second, inserting the database record with the PendingDropOp value into the 'Database' collection // Note: the delete operation fails if the database cannot be deleted due to metadata dependencies MetadataManager.INSTANCE.dropDatabase(mdTxnCtx, databaseName); - MetadataManager.INSTANCE.addDatabase(mdTxnCtx, - new Database(databaseName, database.isSystemDatabase(), MetadataUtil.PENDING_DROP_OP)); + MetadataManager.INSTANCE.addDatabase(mdTxnCtx, new Database(databaseName, database.isSystemDatabase(), + MetadataConstants.DEFAULT_OWNER, MetadataUtil.PENDING_DROP_OP)); MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); bActiveTxn = false; @@ -2254,8 +2258,8 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen // second, inserting the dataverse record with the PendingDropOp value into the DATAVERSE_DATASET // Note: the delete operation fails if the dataverse cannot be deleted due to metadata dependencies MetadataManager.INSTANCE.dropDataverse(mdTxnCtx, databaseName, dataverseName); - MetadataManager.INSTANCE.addDataverse(mdTxnCtx, - new Dataverse(databaseName, dataverseName, dv.getDataFormat(), MetadataUtil.PENDING_DROP_OP)); + MetadataManager.INSTANCE.addDataverse(mdTxnCtx, new Dataverse(databaseName, dataverseName, + dv.getDataFormat(), MetadataUtil.PENDING_DROP_OP, MetadataConstants.DEFAULT_OWNER)); MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); bActiveTxn = false; diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java index 8aa25ad2ba..2af06b74f7 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java @@ -36,6 +36,7 @@ import org.apache.asterix.common.context.TransactionSubsystemProvider; import org.apache.asterix.common.dataflow.ICcApplicationContext; import org.apache.asterix.common.dataflow.LSMInsertDeleteOperatorNodePushable; import org.apache.asterix.common.exceptions.ACIDException; +import org.apache.asterix.common.metadata.MetadataConstants; import org.apache.asterix.common.metadata.MetadataUtil; import org.apache.asterix.common.metadata.Namespace; import org.apache.asterix.common.metadata.NamespacePathResolver; @@ -500,7 +501,7 @@ public class TestNodeController { PrimaryIndexInfo primaryIndexInfo = new PrimaryIndexInfo(dataset, primaryKeyTypes, recordType, metaType, mergePolicy.first, mergePolicy.second, filterFields, primaryKeyIndexes, primaryKeyIndicators); Dataverse dataverse = new Dataverse(dataset.getDatabaseName(), dataset.getDataverseName(), - NonTaggedDataFormat.class.getName(), MetadataUtil.PENDING_NO_OP); + NonTaggedDataFormat.class.getName(), MetadataUtil.PENDING_NO_OP, MetadataConstants.DEFAULT_OWNER); Namespace namespace = new Namespace(dataverse.getDatabaseName(), dataverse.getDataverseName()); MetadataProvider mdProvider = MetadataProvider.create( (ICcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext(), namespace); @@ -526,9 +527,9 @@ public class TestNodeController { org.apache.hyracks.algebricks.common.utils.Pair<ILSMMergePolicyFactory, Map<String, String>> mergePolicy = DatasetUtil.getMergePolicyFactory(primaryIndexInfo.dataset, mdTxnCtx); MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); - Dataverse dataverse = - new Dataverse(primaryIndexInfo.dataset.getDatabaseName(), primaryIndexInfo.dataset.getDataverseName(), - NonTaggedDataFormat.class.getName(), MetadataUtil.PENDING_NO_OP); + Dataverse dataverse = new Dataverse(primaryIndexInfo.dataset.getDatabaseName(), + primaryIndexInfo.dataset.getDataverseName(), NonTaggedDataFormat.class.getName(), + MetadataUtil.PENDING_NO_OP, MetadataConstants.DEFAULT_OWNER); Namespace namespace = new Namespace(dataverse.getDatabaseName(), dataverse.getDataverseName()); MetadataProvider mdProvider = MetadataProvider.create( (ICcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext(), namespace); diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataConstants.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataConstants.java index 9b1d5ae934..5bff2c148f 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataConstants.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataConstants.java @@ -38,6 +38,9 @@ public class MetadataConstants { public static final String SYSTEM_DATABASE = "System"; public static final String DEFAULT_DATABASE = "Default"; + // Pre-defined owner + public static final String DEFAULT_OWNER = "@sys"; + // Name of the dataverse the metadata lives in. public static final DataverseName METADATA_DATAVERSE_NAME = DataverseName.createBuiltinDataverseName("Metadata"); 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 aeb6d13d2d..76b8a0bf77 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 @@ -178,13 +178,13 @@ public class MetadataTransactionContext extends MetadataCache { } public void dropDatabase(String databaseName) { - Database database = new Database(databaseName, false, MetadataUtil.PENDING_NO_OP); + Database database = new Database(databaseName, false, null, MetadataUtil.PENDING_NO_OP); droppedCache.addDatabaseIfNotExists(database); logAndApply(new MetadataLogicalOperation(database, false)); } public void dropDataverse(String database, DataverseName dataverseName) { - Dataverse dataverse = new Dataverse(database, dataverseName, null, MetadataUtil.PENDING_NO_OP); + Dataverse dataverse = new Dataverse(database, dataverseName, null, MetadataUtil.PENDING_NO_OP, null); droppedCache.addDataverseIfNotExists(dataverse); logAndApply(new MetadataLogicalOperation(dataverse, false)); } diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java index 7b33682341..7f6034536a 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java @@ -30,19 +30,20 @@ import org.apache.asterix.runtime.formats.NonTaggedDataFormat; public class MetadataBuiltinEntities { //--------------------------------------- Databases ----------------------------------------// - public static final Database SYSTEM_DATABASE = - new Database(MetadataConstants.SYSTEM_DATABASE, true, MetadataUtil.PENDING_NO_OP); + public static final Database SYSTEM_DATABASE = new Database(MetadataConstants.SYSTEM_DATABASE, true, + MetadataConstants.DEFAULT_OWNER, MetadataUtil.PENDING_NO_OP); - public static final Database DEFAULT_DATABASE = - new Database(MetadataConstants.DEFAULT_DATABASE, false, MetadataUtil.PENDING_NO_OP); + public static final Database DEFAULT_DATABASE = new Database(MetadataConstants.DEFAULT_DATABASE, false, + MetadataConstants.DEFAULT_OWNER, MetadataUtil.PENDING_NO_OP); //--------------------------------------- Dataverses ----------------------------------------// - public static final Dataverse METADATA_DATAVERSE = - new Dataverse(MetadataConstants.SYSTEM_DATABASE, MetadataConstants.METADATA_DATAVERSE_NAME, - NonTaggedDataFormat.NON_TAGGED_DATA_FORMAT, MetadataUtil.PENDING_NO_OP); + public static final Dataverse METADATA_DATAVERSE = new Dataverse(MetadataConstants.SYSTEM_DATABASE, + MetadataConstants.METADATA_DATAVERSE_NAME, NonTaggedDataFormat.NON_TAGGED_DATA_FORMAT, + MetadataUtil.PENDING_NO_OP, MetadataConstants.DEFAULT_OWNER); - public static final Dataverse DEFAULT_DATAVERSE = new Dataverse(MetadataConstants.DEFAULT_DATABASE, - MetadataConstants.DEFAULT_DATAVERSE_NAME, NonTaggedDataFormat.class.getName(), MetadataUtil.PENDING_NO_OP); + public static final Dataverse DEFAULT_DATAVERSE = + new Dataverse(MetadataConstants.DEFAULT_DATABASE, MetadataConstants.DEFAULT_DATAVERSE_NAME, + NonTaggedDataFormat.class.getName(), MetadataUtil.PENDING_NO_OP, MetadataConstants.DEFAULT_OWNER); //--------------------------------------- Datatypes -----------------------------------------// public static final Datatype ANY_OBJECT_DATATYPE = 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 c35c03ac07..a6b38633c1 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 @@ -130,6 +130,9 @@ public final class MetadataRecordTypes { public static final String FIELD_NAME_FULL_TEXT_FILTER_PIPELINE = "FullTextFilterPipeline"; public static final String FIELD_NAME_FULL_TEXT_STOPWORD_LIST = "StopwordList"; + //open field + public static final String FIELD_NAME_OWNER_NAME = "OwnerName"; + //---------------------------------- Record Types Creation ----------------------------------// //--------------------------------------- Properties ----------------------------------------// public static final int PROPERTIES_NAME_FIELD_INDEX = 0; diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Database.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Database.java index 8be93e3ccb..e734e51f30 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Database.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Database.java @@ -33,11 +33,13 @@ public class Database implements IMetadataEntity<Database> { private final String databaseName; private final boolean isSystemDatabase; + private final String owner; private final int pendingOp; - public Database(String databaseName, boolean isSystemDatabase, int pendingOp) { + public Database(String databaseName, boolean isSystemDatabase, String owner, int pendingOp) { this.databaseName = databaseName; this.isSystemDatabase = isSystemDatabase; + this.owner = owner; this.pendingOp = pendingOp; } @@ -49,6 +51,10 @@ public class Database implements IMetadataEntity<Database> { return isSystemDatabase; } + public String getOwnerName() { + return owner; + } + public int getPendingOp() { return pendingOp; } diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataverse.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataverse.java index bba17636dd..a07a495554 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataverse.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataverse.java @@ -35,12 +35,14 @@ public class Dataverse implements IMetadataEntity<Dataverse> { private final DataverseName dataverseName; private final String dataFormat; private final int pendingOp; + private final String ownerName; - public Dataverse(String databaseName, DataverseName dataverseName, String format, int pendingOp) { + public Dataverse(String databaseName, DataverseName dataverseName, String format, int pendingOp, String ownerName) { this.databaseName = Objects.requireNonNull(databaseName); this.dataverseName = dataverseName; this.dataFormat = format; this.pendingOp = pendingOp; + this.ownerName = ownerName; } public String getDatabaseName() { @@ -59,6 +61,10 @@ public class Dataverse implements IMetadataEntity<Dataverse> { return pendingOp; } + public String getOwnerName() { + return ownerName; + } + @Override public Dataverse addToCache(MetadataCache cache) { return cache.addDataverseIfNotExists(this); diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatabaseTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatabaseTupleTranslator.java index 9752dc8655..9a5a5d8d8c 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatabaseTupleTranslator.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatabaseTupleTranslator.java @@ -21,13 +21,16 @@ package org.apache.asterix.metadata.entitytupletranslators; import java.util.Calendar; +import org.apache.asterix.common.metadata.MetadataConstants; import org.apache.asterix.metadata.bootstrap.DatabaseEntity; +import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes; import org.apache.asterix.metadata.entities.Database; import org.apache.asterix.om.base.ABoolean; import org.apache.asterix.om.base.AInt32; import org.apache.asterix.om.base.AMutableInt32; import org.apache.asterix.om.base.ARecord; import org.apache.asterix.om.base.AString; +import org.apache.asterix.om.types.ARecordType; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference; @@ -50,12 +53,20 @@ public class DatabaseTupleTranslator extends AbstractTupleTranslator<Database> { @Override protected Database createMetadataEntityFromARecord(ARecord databaseRecord) throws AlgebricksException { + ARecordType recType = databaseRecord.getType(); String databaseName = ((AString) databaseRecord.getValueByPos(databaseEntity.databaseNameIndex())).getStringValue(); boolean isSystemDatabase = ((ABoolean) databaseRecord.getValueByPos(databaseEntity.systemDatabaseIndex())).getBoolean(); + int ownerIndex = recType.getFieldIndex(MetadataRecordTypes.FIELD_NAME_OWNER_NAME); + String ownerName; + if (ownerIndex >= 0) { + ownerName = ((AString) databaseRecord.getValueByPos(ownerIndex)).getStringValue(); + } else { + ownerName = MetadataConstants.DEFAULT_OWNER; + } int pendingOp = ((AInt32) databaseRecord.getValueByPos(databaseEntity.pendingOpIndex())).getIntegerValue(); - return new Database(databaseName, isSystemDatabase, pendingOp); + return new Database(databaseName, isSystemDatabase, ownerName, pendingOp); } @Override @@ -94,6 +105,9 @@ public class DatabaseTupleTranslator extends AbstractTupleTranslator<Database> { int32Serde.serialize(aInt32, fieldValue.getDataOutput()); recordBuilder.addField(databaseEntity.pendingOpIndex(), fieldValue); + // write open fields + writeOpenFields(database); + // write the payload record recordBuilder.write(tupleBuilder.getDataOutput(), true); tupleBuilder.addFieldEndOffset(); @@ -101,4 +115,20 @@ public class DatabaseTupleTranslator extends AbstractTupleTranslator<Database> { tuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray()); return tuple; } + + protected void writeOpenFields(Database database) throws HyracksDataException { + writeDatabaseOwner(database); + } + + private void writeDatabaseOwner(Database database) throws HyracksDataException { + if (databaseEntity.databaseNameIndex() >= 0) { + fieldValue.reset(); + aString.setValue(MetadataRecordTypes.FIELD_NAME_OWNER_NAME); + stringSerde.serialize(aString, fieldName.getDataOutput()); + fieldValue.reset(); + aString.setValue(database.getOwnerName()); + stringSerde.serialize(aString, fieldValue.getDataOutput()); + recordBuilder.addField(fieldName, fieldValue); + } + } } diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DataverseTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DataverseTupleTranslator.java index 42fcfbb4b3..e2d097b079 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DataverseTupleTranslator.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DataverseTupleTranslator.java @@ -22,13 +22,16 @@ package org.apache.asterix.metadata.entitytupletranslators; import java.util.Calendar; import org.apache.asterix.common.metadata.DataverseName; +import org.apache.asterix.common.metadata.MetadataConstants; import org.apache.asterix.common.metadata.MetadataUtil; import org.apache.asterix.metadata.bootstrap.DataverseEntity; +import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes; import org.apache.asterix.metadata.entities.Dataverse; import org.apache.asterix.om.base.AInt32; import org.apache.asterix.om.base.AMutableInt32; import org.apache.asterix.om.base.ARecord; import org.apache.asterix.om.base.AString; +import org.apache.asterix.om.types.ARecordType; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference; @@ -51,20 +54,29 @@ public class DataverseTupleTranslator extends AbstractTupleTranslator<Dataverse> @Override protected Dataverse createMetadataEntityFromARecord(ARecord dataverseRecord) throws AlgebricksException { + ARecordType recType = dataverseRecord.getType(); + String dataverseCanonicalName = ((AString) dataverseRecord.getValueByPos(dataverseEntity.dataverseNameIndex())).getStringValue(); DataverseName dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName); int databaseNameIndex = dataverseEntity.databaseNameIndex(); - String databaseName; + int ownerNameIndex = recType.getFieldIndex(MetadataRecordTypes.FIELD_NAME_OWNER_NAME); + String databaseName, ownerName; if (databaseNameIndex >= 0) { databaseName = ((AString) dataverseRecord.getValueByPos(databaseNameIndex)).getStringValue(); } else { databaseName = MetadataUtil.databaseFor(dataverseName); } + + if (ownerNameIndex >= 0) { + ownerName = ((AString) dataverseRecord.getValueByPos(ownerNameIndex)).getStringValue(); + } else { + ownerName = MetadataConstants.DEFAULT_OWNER; + } String format = ((AString) dataverseRecord.getValueByPos(dataverseEntity.dataFormatIndex())).getStringValue(); int pendingOp = ((AInt32) dataverseRecord.getValueByPos(dataverseEntity.pendingOpIndex())).getIntegerValue(); - return new Dataverse(databaseName, dataverseName, format, pendingOp); + return new Dataverse(databaseName, dataverseName, format, pendingOp, ownerName); } @Override @@ -115,6 +127,9 @@ public class DataverseTupleTranslator extends AbstractTupleTranslator<Dataverse> int32Serde.serialize(aInt32, fieldValue.getDataOutput()); recordBuilder.addField(dataverseEntity.pendingOpIndex(), fieldValue); + // write open fields + writeOpenFields(dataverse); + // write record recordBuilder.write(tupleBuilder.getDataOutput(), true); tupleBuilder.addFieldEndOffset(); @@ -122,4 +137,20 @@ public class DataverseTupleTranslator extends AbstractTupleTranslator<Dataverse> tuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray()); return tuple; } + + protected void writeOpenFields(Dataverse dataverse) throws HyracksDataException { + writeDataverseOwner(dataverse); + } + + private void writeDataverseOwner(Dataverse dataverse) throws HyracksDataException { + if (dataverseEntity.databaseNameIndex() >= 0) { + fieldValue.reset(); + aString.setValue(MetadataRecordTypes.FIELD_NAME_OWNER_NAME); + stringSerde.serialize(aString, fieldName.getDataOutput()); + fieldValue.reset(); + aString.setValue(dataverse.getOwnerName()); + stringSerde.serialize(aString, fieldValue.getDataOutput()); + recordBuilder.addField(fieldName, fieldValue); + } + } }