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);
+        }
+    }
 }

Reply via email to