[ASTERIXDB-3259][MTD] Include 'database' in tuple translators

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
Include 'database' in tuple translators.
Add 'database' to metadata entity objects.

Change-Id: I0d1525c76958b042cd4dca926a644cc340278044
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17777
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-external-data/src/main/java/org/apache/asterix/external/dataset/adapter/AdapterIdentifier.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataset/adapter/AdapterIdentifier.java
index 9f27b41..bc82898 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataset/adapter/AdapterIdentifier.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataset/adapter/AdapterIdentifier.java
@@ -19,6 +19,7 @@
 package org.apache.asterix.external.dataset.adapter;
 
 import java.io.Serializable;
+import java.util.Objects;
 
 import org.apache.asterix.common.metadata.DataverseName;
 
@@ -27,8 +28,9 @@
  */
 public class AdapterIdentifier implements Serializable {
 
-    private static final long serialVersionUID = 2L;
+    private static final long serialVersionUID = 3L;
 
+    private final String databaseName = null;
     private final DataverseName dataverseName;
     private final String adapterName;
 
@@ -37,6 +39,10 @@
         this.adapterName = name;
     }
 
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
     public DataverseName getDataverseName() {
         return dataverseName;
     }
@@ -47,7 +53,7 @@
 
     @Override
     public int hashCode() {
-        return (dataverseName + "@" + adapterName).hashCode();
+        return Objects.hash(databaseName, dataverseName + "@" + adapterName);
 
     }
 
@@ -63,6 +69,7 @@
             return false;
         }
         AdapterIdentifier a = (AdapterIdentifier) o;
-        return dataverseName.equals(a.dataverseName) && adapterName.equals(a.adapterName);
+        return Objects.equals(databaseName, a.databaseName) && dataverseName.equals(a.dataverseName)
+                && adapterName.equals(a.adapterName);
     }
 }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/policy/FeedPolicy.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/policy/FeedPolicy.java
index 79c5281..78075e2 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/policy/FeedPolicy.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/policy/FeedPolicy.java
@@ -20,14 +20,15 @@
 
 import java.io.Serializable;
 import java.util.Map;
+import java.util.Objects;
 
 import org.apache.asterix.common.metadata.DataverseName;
 
 public class FeedPolicy implements Serializable {
 
-    private static final long serialVersionUID = 2L;
+    private static final long serialVersionUID = 3L;
+    private final String databaseName = null;
     private final DataverseName dataverseName;
-    // Enforced to be unique within a dataverse.
     private final String policyName;
     // A description of the policy
     private final String description;
@@ -42,6 +43,10 @@
         this.properties = properties;
     }
 
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
     public DataverseName getDataverseName() {
         return dataverseName;
     }
@@ -59,6 +64,9 @@
             return false;
         }
         FeedPolicy otherPolicy = (FeedPolicy) other;
+        if (!Objects.equals(databaseName, otherPolicy.databaseName)) {
+            return false;
+        }
         if (!otherPolicy.dataverseName.equals(dataverseName)) {
             return false;
         }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/ExternalFile.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/ExternalFile.java
index 26a3a76..973e890 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/ExternalFile.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/ExternalFile.java
@@ -32,8 +32,9 @@
      * A class for metadata entity externalFile
      * This class represents an external dataset file and is intended for use for saving external data snapshot
      */
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 2L;
 
+    private final String databaseName = null;
     private DataverseName dataverseName;
     private String datasetName;
     private Date lastModefiedTime;
@@ -63,6 +64,10 @@
         this.setPendingOp(pendingOp);
     }
 
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
     public DataverseName getDataverseName() {
         return dataverseName;
     }
@@ -121,7 +126,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(dataverseName, datasetName, fileName);
+        return Objects.hash(databaseName, dataverseName, datasetName, fileName);
     }
 
     @Override
@@ -133,7 +138,8 @@
             return false;
         }
         ExternalFile anotherFile = (ExternalFile) obj;
-        return fileNumber == anotherFile.fileNumber && Objects.equals(dataverseName, anotherFile.getDataverseName())
+        return fileNumber == anotherFile.fileNumber && Objects.equals(databaseName, anotherFile.databaseName)
+                && Objects.equals(dataverseName, anotherFile.getDataverseName())
                 && Objects.equals(datasetName, anotherFile.getDatasetName());
     }
 
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/CompactionPolicy.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/CompactionPolicy.java
index 1b01d43..aae1da1 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/CompactionPolicy.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/CompactionPolicy.java
@@ -19,6 +19,8 @@
 
 package org.apache.asterix.metadata.entities;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.metadata.MetadataCache;
 import org.apache.asterix.metadata.api.IMetadataEntity;
@@ -28,10 +30,10 @@
  */
 public class CompactionPolicy implements IMetadataEntity<CompactionPolicy> {
 
-    private static final long serialVersionUID = 2L;
+    private static final long serialVersionUID = 3L;
 
+    private final String databaseName = null;
     private final DataverseName dataverseName;
-    // Enforced to be unique within a dataverse.
     private final String policyName;
     private final String className;
 
@@ -41,6 +43,10 @@
         this.className = className;
     }
 
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
     public DataverseName getDataverseName() {
         return dataverseName;
     }
@@ -62,6 +68,9 @@
             return false;
         }
         CompactionPolicy otherPolicy = (CompactionPolicy) other;
+        if (!Objects.equals(databaseName, otherPolicy.databaseName)) {
+            return false;
+        }
         if (!otherPolicy.dataverseName.equals(dataverseName)) {
             return false;
         }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Datatype.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Datatype.java
index 014f870..3e637df 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Datatype.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Datatype.java
@@ -33,10 +33,10 @@
  */
 public class Datatype implements IMetadataEntity<Datatype> {
 
-    private static final long serialVersionUID = 2L;
+    private static final long serialVersionUID = 3L;
 
+    private final String databaseName = null;
     private final DataverseName dataverseName;
-    // Enforced to be unique within a dataverse.
     private final String datatypeName;
     private final IAType datatype;
     private final boolean isAnonymous;
@@ -48,6 +48,10 @@
         this.isAnonymous = isAnonymous;
     }
 
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
     public DataverseName getDataverseName() {
         return dataverseName;
     }
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 5cde932..866fb8b 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
@@ -19,6 +19,8 @@
 
 package org.apache.asterix.metadata.entities;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.metadata.MetadataCache;
 import org.apache.asterix.metadata.api.IMetadataEntity;
@@ -28,8 +30,8 @@
  */
 public class Dataverse implements IMetadataEntity<Dataverse> {
 
-    private static final long serialVersionUID = 2L;
-    // Enforced to be unique within an Asterix cluster..
+    private static final long serialVersionUID = 3L;
+    private final String databaseName = null;
     private final DataverseName dataverseName;
     private final String dataFormat;
     private final int pendingOp;
@@ -40,6 +42,10 @@
         this.pendingOp = pendingOp;
     }
 
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
     public DataverseName getDataverseName() {
         return dataverseName;
     }
@@ -64,7 +70,7 @@
 
     @Override
     public String toString() {
-        return getClass().getSimpleName() + ":" + dataverseName;
+        return getClass().getSimpleName() + ":" + databaseName + ":" + dataverseName;
     }
 
     @Override
@@ -73,11 +79,11 @@
             return false;
         }
         Dataverse other = (Dataverse) o;
-        return dataverseName.equals(other.getDataverseName());
+        return Objects.equals(databaseName, other.databaseName) && dataverseName.equals(other.getDataverseName());
     }
 
     @Override
     public int hashCode() {
-        return dataverseName.hashCode();
+        return Objects.hash(databaseName, dataverseName);
     }
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/FeedConnection.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/FeedConnection.java
index 154391a..213682a 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/FeedConnection.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/FeedConnection.java
@@ -33,17 +33,18 @@
  */
 public class FeedConnection implements IMetadataEntity<FeedConnection> {
 
-    private static final long serialVersionUID = 2L;
+    private static final long serialVersionUID = 3L;
 
-    private EntityId feedId;
-    private String connectionId;
-    private DataverseName dataverseName;
-    private String feedName;
-    private String datasetName;
-    private String policyName;
-    private String whereClauseBody;
-    private String outputType;
-    private List<FunctionSignature> appliedFunctions;
+    private final EntityId feedId;
+    private final String connectionId;
+    private final String databaseName = null;
+    private final DataverseName dataverseName;
+    private final String feedName;
+    private final String datasetName;
+    private final String policyName;
+    private final String whereClauseBody;
+    private final String outputType;
+    private final List<FunctionSignature> appliedFunctions;
 
     public FeedConnection(DataverseName dataverseName, String feedName, String datasetName,
             List<FunctionSignature> appliedFunctions, String policyName, String whereClauseBody, String outputType) {
@@ -88,6 +89,10 @@
         return null;
     }
 
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
     public DataverseName getDataverseName() {
         return dataverseName;
     }
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 8853c02..94145e2 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
@@ -32,7 +32,7 @@
 import org.apache.hyracks.algebricks.common.utils.Triple;
 
 public class Function implements IMetadataEntity<Function> {
-    private static final long serialVersionUID = 4L;
+    private static final long serialVersionUID = 5L;
 
     private final FunctionSignature signature;
     private final List<String> paramNames;
@@ -41,6 +41,7 @@
     private final String body;
     private final String language;
     private final String kind;
+    private final String databaseName = null;
     private final DataverseName libraryDataverseName;
     private final String libraryName;
     private final List<String> externalIdentifier;
@@ -76,6 +77,10 @@
         return signature;
     }
 
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
     public DataverseName getDataverseName() {
         return signature.getDataverseName();
     }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
index cb9a090..92650ee 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
@@ -50,10 +50,11 @@
  */
 public class Index implements IMetadataEntity<Index>, Comparable<Index> {
 
-    private static final long serialVersionUID = 3L;
+    private static final long serialVersionUID = 4L;
     public static final int RECORD_INDICATOR = 0;
     public static final int META_RECORD_INDICATOR = 1;
 
+    private final String databaseName = null;
     private final DataverseName dataverseName;
     // Enforced to be unique within a dataverse.
     private final String datasetName;
@@ -104,6 +105,10 @@
                 false, true, pendingOp);
     }
 
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
     public DataverseName getDataverseName() {
         return dataverseName;
     }
@@ -213,7 +218,7 @@
 
     @Override
     public int hashCode() {
-        return indexName.hashCode() ^ datasetName.hashCode() ^ dataverseName.hashCode();
+        return Objects.hash(indexName, datasetName, dataverseName, databaseName);
     }
 
     @Override
@@ -228,7 +233,8 @@
         if (!datasetName.equals(otherIndex.getDatasetName())) {
             return false;
         }
-        return dataverseName.equals(otherIndex.getDataverseName());
+        return Objects.equals(databaseName, otherIndex.databaseName)
+                && dataverseName.equals(otherIndex.getDataverseName());
     }
 
     @Override
@@ -276,6 +282,7 @@
         if (result != 0) {
             return result;
         }
+        //TODO(DB): fix to also consider database
         return dataverseName.compareTo(otherIndex.getDataverseName());
     }
 
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Library.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Library.java
index 4a6a512..5373eb2 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Library.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Library.java
@@ -24,8 +24,9 @@
 
 public class Library implements IMetadataEntity<Library> {
 
-    private static final long serialVersionUID = 2L;
+    private static final long serialVersionUID = 3L;
 
+    private final String databaseName = null;
     private final DataverseName dataverse;
     private final String name;
     private final String language;
@@ -40,6 +41,10 @@
         this.pendingOp = pendingOp;
     }
 
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
     public DataverseName getDataverseName() {
         return dataverse;
     }
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 956a318..9da7f99 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
@@ -27,7 +27,9 @@
 
 public class Synonym implements IMetadataEntity<Synonym> {
 
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 2L;
+
+    private final String databaseName = null;
 
     private final DataverseName dataverseName;
 
@@ -45,6 +47,10 @@
         this.objectName = Objects.requireNonNull(objectName);
     }
 
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
     public DataverseName getDataverseName() {
         return dataverseName;
     }
@@ -68,13 +74,14 @@
         if (o == null || getClass() != o.getClass())
             return false;
         Synonym synonym = (Synonym) o;
-        return dataverseName.equals(synonym.dataverseName) && synonymName.equals(synonym.synonymName)
-                && objectDataverseName.equals(synonym.objectDataverseName) && objectName.equals(synonym.objectName);
+        return Objects.equals(databaseName, synonym.databaseName) && dataverseName.equals(synonym.dataverseName)
+                && synonymName.equals(synonym.synonymName) && objectDataverseName.equals(synonym.objectDataverseName)
+                && objectName.equals(synonym.objectName);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(dataverseName, synonymName, objectDataverseName, objectName);
+        return Objects.hash(databaseName, dataverseName, synonymName, objectDataverseName, objectName);
     }
 
     @Override
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/CompactionPolicyTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/CompactionPolicyTupleTranslator.java
index 56a9a77..e60d65b 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/CompactionPolicyTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/CompactionPolicyTupleTranslator.java
@@ -29,7 +29,7 @@
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 
 /**
- * Translates a Dataset metadata entity to an ITupleReference and vice versa.
+ * Translates a CompactionPolicy metadata entity to an ITupleReference and vice versa.
  */
 public class CompactionPolicyTupleTranslator extends AbstractTupleTranslator<CompactionPolicy> {
 
@@ -43,6 +43,11 @@
     @Override
     protected CompactionPolicy createMetadataEntityFromARecord(ARecord compactionPolicyRecord)
             throws AlgebricksException {
+        int databaseNameIndex = compactionPolicyEntity.databaseNameIndex();
+        String databaseName;
+        if (databaseNameIndex >= 0) {
+            databaseName = ((AString) compactionPolicyRecord.getValueByPos(databaseNameIndex)).getStringValue();
+        }
         String dataverseCanonicalName =
                 ((AString) compactionPolicyRecord.getValueByPos(compactionPolicyEntity.dataverseNameIndex()))
                         .getStringValue();
@@ -60,6 +65,11 @@
         String dataverseCanonicalName = compactionPolicy.getDataverseName().getCanonicalForm();
 
         tupleBuilder.reset();
+        if (compactionPolicyEntity.databaseNameIndex() >= 0) {
+            aString.setValue(compactionPolicy.getDatabaseName());
+            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+            tupleBuilder.addFieldEndOffset();
+        }
         aString.setValue(dataverseCanonicalName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
         tupleBuilder.addFieldEndOffset();
@@ -70,6 +80,12 @@
 
         recordBuilder.reset(compactionPolicyEntity.getRecordType());
 
+        if (compactionPolicyEntity.databaseNameIndex() >= 0) {
+            fieldValue.reset();
+            aString.setValue(compactionPolicy.getDatabaseName());
+            stringSerde.serialize(aString, fieldValue.getDataOutput());
+            recordBuilder.addField(compactionPolicyEntity.databaseNameIndex(), fieldValue);
+        }
         // write field 0
         fieldValue.reset();
         aString.setValue(dataverseCanonicalName);
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 e59041e..971f995 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
@@ -44,6 +44,11 @@
 
     @Override
     protected DatasourceAdapter createMetadataEntityFromARecord(ARecord adapterRecord) throws AlgebricksException {
+        int databaseNameIndex = datasourceAdapterEntity.databaseNameIndex();
+        String databaseName;
+        if (databaseNameIndex >= 0) {
+            databaseName = ((AString) adapterRecord.getValueByPos(databaseNameIndex)).getStringValue();
+        }
         String dataverseCanonicalName =
                 ((AString) adapterRecord.getValueByPos(datasourceAdapterEntity.dataverseNameIndex())).getStringValue();
         DataverseName dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName);
@@ -79,6 +84,11 @@
         // write the key in the first 2 fields of the tuple
         tupleBuilder.reset();
 
+        if (datasourceAdapterEntity.databaseNameIndex() >= 0) {
+            aString.setValue(adapterIdentifier.getDatabaseName());
+            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+            tupleBuilder.addFieldEndOffset();
+        }
         aString.setValue(dataverseCanonicalName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
         tupleBuilder.addFieldEndOffset();
@@ -87,9 +97,14 @@
         tupleBuilder.addFieldEndOffset();
 
         // write the pay-load in the third field of the tuple
-
         recordBuilder.reset(datasourceAdapterEntity.getRecordType());
 
+        if (datasourceAdapterEntity.databaseNameIndex() >= 0) {
+            fieldValue.reset();
+            aString.setValue(adapterIdentifier.getDatabaseName());
+            stringSerde.serialize(aString, fieldValue.getDataOutput());
+            recordBuilder.addField(datasourceAdapterEntity.databaseNameIndex(), fieldValue);
+        }
         // write field 0
         fieldValue.reset();
         aString.setValue(dataverseCanonicalName);
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 dc4fd59..1ad331a 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
@@ -58,6 +58,11 @@
 
     @Override
     protected Datatype createMetadataEntityFromARecord(ARecord datatypeRecord) throws AlgebricksException {
+        int databaseNameIndex = datatypeEntity.databaseNameIndex();
+        String databaseName;
+        if (databaseNameIndex >= 0) {
+            databaseName = ((AString) datatypeRecord.getValueByPos(databaseNameIndex)).getStringValue();
+        }
         String dataverseCanonicalName =
                 ((AString) datatypeRecord.getValueByPos(datatypeEntity.dataverseNameIndex())).getStringValue();
         DataverseName dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName);
@@ -145,6 +150,11 @@
 
         // write the key in the first two fields of the tuple
         tupleBuilder.reset();
+        if (datatypeEntity.databaseNameIndex() >= 0) {
+            aString.setValue(dataType.getDatabaseName());
+            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+            tupleBuilder.addFieldEndOffset();
+        }
         aString.setValue(dataverseCanonicalName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
         tupleBuilder.addFieldEndOffset();
@@ -155,6 +165,12 @@
         // write the payload in the third field of the tuple
         recordBuilder.reset(datatypeEntity.getRecordType());
 
+        if (datatypeEntity.databaseNameIndex() >= 0) {
+            fieldValue.reset();
+            aString.setValue(dataType.getDatabaseName());
+            stringSerde.serialize(aString, fieldValue.getDataOutput());
+            recordBuilder.addField(datatypeEntity.databaseNameIndex(), fieldValue);
+        }
         // write field 0
         fieldValue.reset();
         aString.setValue(dataverseCanonicalName);
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 8764054..1c79e76 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
@@ -50,6 +50,11 @@
 
     @Override
     protected Dataverse createMetadataEntityFromARecord(ARecord dataverseRecord) throws AlgebricksException {
+        int databaseNameIndex = dataverseEntity.databaseNameIndex();
+        String databaseName;
+        if (databaseNameIndex >= 0) {
+            databaseName = ((AString) dataverseRecord.getValueByPos(databaseNameIndex)).getStringValue();
+        }
         String dataverseCanonicalName =
                 ((AString) dataverseRecord.getValueByPos(dataverseEntity.dataverseNameIndex())).getStringValue();
         DataverseName dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName);
@@ -65,12 +70,24 @@
 
         // write the key in the first field of the tuple
         tupleBuilder.reset();
+        if (dataverseEntity.databaseNameIndex() >= 0) {
+            aString.setValue(dataverse.getDatabaseName());
+            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+            tupleBuilder.addFieldEndOffset();
+        }
         aString.setValue(dataverseCanonicalName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
         tupleBuilder.addFieldEndOffset();
 
         // write the payload in the second field of the tuple
         recordBuilder.reset(dataverseEntity.getRecordType());
+
+        if (dataverseEntity.databaseNameIndex() >= 0) {
+            fieldValue.reset();
+            aString.setValue(dataverse.getDatabaseName());
+            stringSerde.serialize(aString, fieldValue.getDataOutput());
+            recordBuilder.addField(dataverseEntity.databaseNameIndex(), fieldValue);
+        }
         // write field 0
         fieldValue.reset();
         aString.setValue(dataverseCanonicalName);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/ExternalFileTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/ExternalFileTupleTranslator.java
index 21cf462..3d1b054 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/ExternalFileTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/ExternalFileTupleTranslator.java
@@ -61,6 +61,11 @@
 
     @Override
     protected ExternalFile createMetadataEntityFromARecord(ARecord externalFileRecord) throws AlgebricksException {
+        int databaseNameIndex = externalFileEntity.databaseNameIndex();
+        String databaseName;
+        if (databaseNameIndex >= 0) {
+            databaseName = ((AString) externalFileRecord.getValueByPos(databaseNameIndex)).getStringValue();
+        }
         String dataverseCanonicalName =
                 ((AString) externalFileRecord.getValueByPos(externalFileEntity.dataverseNameIndex())).getStringValue();
         DataverseName dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName);
@@ -86,6 +91,11 @@
 
         // write the key in the first 3 fields of the tuple
         tupleBuilder.reset();
+        if (externalFileEntity.databaseNameIndex() >= 0) {
+            aString.setValue(externalFile.getDatabaseName());
+            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+            tupleBuilder.addFieldEndOffset();
+        }
         // dataverse name
         aString.setValue(dataverseCanonicalName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
@@ -102,6 +112,12 @@
         // write the pay-load in the fourth field of the tuple
         recordBuilder.reset(externalFileEntity.getRecordType());
 
+        if (externalFileEntity.databaseNameIndex() >= 0) {
+            fieldValue.reset();
+            aString.setValue(externalFile.getDatabaseName());
+            stringSerde.serialize(aString, fieldValue.getDataOutput());
+            recordBuilder.addField(externalFileEntity.databaseNameIndex(), fieldValue);
+        }
         // write field 0
         fieldValue.reset();
         aString.setValue(dataverseCanonicalName);
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 bef6937..6459c8d 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
@@ -52,6 +52,11 @@
 
     @Override
     protected FeedConnection createMetadataEntityFromARecord(ARecord feedConnectionRecord) throws AlgebricksException {
+        int databaseNameIndex = feedConnectionEntity.databaseNameIndex();
+        String databaseName;
+        if (databaseNameIndex >= 0) {
+            databaseName = ((AString) feedConnectionRecord.getValueByPos(databaseNameIndex)).getStringValue();
+        }
         String dataverseCanonicalName =
                 ((AString) feedConnectionRecord.getValueByPos(feedConnectionEntity.dataverseNameIndex()))
                         .getStringValue();
@@ -98,6 +103,11 @@
 
         tupleBuilder.reset();
 
+        if (feedConnectionEntity.databaseNameIndex() >= 0) {
+            aString.setValue(feedConnection.getDatabaseName());
+            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+            tupleBuilder.addFieldEndOffset();
+        }
         // key: dataverse
         aString.setValue(dataverseCanonicalName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
@@ -115,6 +125,13 @@
 
         recordBuilder.reset(feedConnectionEntity.getRecordType());
 
+        if (feedConnectionEntity.databaseNameIndex() >= 0) {
+            fieldValue.reset();
+            aString.setValue(feedConnection.getDatabaseName());
+            stringSerde.serialize(aString, fieldValue.getDataOutput());
+            recordBuilder.addField(feedConnectionEntity.databaseNameIndex(), fieldValue);
+        }
+
         // field dataverse
         fieldValue.reset();
         aString.setValue(dataverseCanonicalName);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedPolicyTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedPolicyTupleTranslator.java
index edfa69f..99b5f6f 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedPolicyTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedPolicyTupleTranslator.java
@@ -41,7 +41,7 @@
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 
 /**
- * Translates a Dataset metadata entity to an ITupleReference and vice versa.
+ * Translates a FeedPolicyEntity metadata entity to an ITupleReference and vice versa.
  */
 public class FeedPolicyTupleTranslator extends AbstractTupleTranslator<FeedPolicyEntity> {
 
@@ -55,6 +55,11 @@
 
     @Override
     protected FeedPolicyEntity createMetadataEntityFromARecord(ARecord feedPolicyRecord) throws AlgebricksException {
+        int databaseNameIndex = feedPolicyEntity.databaseNameIndex();
+        String databaseName;
+        if (databaseNameIndex >= 0) {
+            databaseName = ((AString) feedPolicyRecord.getValueByPos(databaseNameIndex)).getStringValue();
+        }
         String dataverseCanonicalName =
                 ((AString) feedPolicyRecord.getValueByPos(feedPolicyEntity.dataverseNameIndex())).getStringValue();
         DataverseName dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName);
@@ -84,6 +89,11 @@
 
         // write the key in the first three fields of the tuple
         tupleBuilder.reset();
+        if (feedPolicyEntity.databaseNameIndex() >= 0) {
+            aString.setValue(feedPolicy.getDatabaseName());
+            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+            tupleBuilder.addFieldEndOffset();
+        }
         aString.setValue(dataverseCanonicalName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
         tupleBuilder.addFieldEndOffset();
@@ -95,6 +105,12 @@
         recordBuilder.reset(feedPolicyEntity.getRecordType());
 
         // write field 0
+        if (feedPolicyEntity.databaseNameIndex() >= 0) {
+            fieldValue.reset();
+            aString.setValue(feedPolicy.getDatabaseName());
+            stringSerde.serialize(aString, fieldValue.getDataOutput());
+            recordBuilder.addField(feedPolicyEntity.databaseNameIndex(), fieldValue);
+        }
         fieldValue.reset();
         aString.setValue(dataverseCanonicalName);
         stringSerde.serialize(aString, fieldValue.getDataOutput());
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FullTextConfigMetadataEntityTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FullTextConfigMetadataEntityTupleTranslator.java
index 5403f1d..7a06954 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FullTextConfigMetadataEntityTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FullTextConfigMetadataEntityTupleTranslator.java
@@ -61,6 +61,11 @@
     @Override
     protected FullTextConfigMetadataEntity createMetadataEntityFromARecord(ARecord aRecord)
             throws HyracksDataException, AlgebricksException {
+        int databaseNameIndex = fullTextConfigEntity.databaseNameIndex();
+        String databaseName;
+        if (databaseNameIndex >= 0) {
+            databaseName = ((AString) aRecord.getValueByPos(databaseNameIndex)).getStringValue();
+        }
         DataverseName dataverseName = DataverseName.createFromCanonicalForm(
                 ((AString) aRecord.getValueByPos(fullTextConfigEntity.dataverseNameIndex())).getStringValue());
 
@@ -81,8 +86,13 @@
         return new FullTextConfigMetadataEntity(configDescriptor);
     }
 
-    private void writeIndex(String dataverseName, String configName, ArrayTupleBuilder tupleBuilder)
-            throws HyracksDataException {
+    private void writeIndex(String databaseName, String dataverseName, String configName,
+            ArrayTupleBuilder tupleBuilder) throws HyracksDataException {
+        if (fullTextConfigEntity.databaseNameIndex() >= 0) {
+            aString.setValue(databaseName);
+            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+            tupleBuilder.addFieldEndOffset();
+        }
         aString.setValue(dataverseName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
         tupleBuilder.addFieldEndOffset();
@@ -99,10 +109,17 @@
 
         FullTextConfigDescriptor configDescriptor = configMetadataEntity.getFullTextConfig();
 
-        writeIndex(configDescriptor.getDataverseName().getCanonicalForm(), configDescriptor.getName(), tupleBuilder);
+        writeIndex(configDescriptor.getDatabaseName(), configDescriptor.getDataverseName().getCanonicalForm(),
+                configDescriptor.getName(), tupleBuilder);
 
         recordBuilder.reset(fullTextConfigEntity.getRecordType());
 
+        if (fullTextConfigEntity.databaseNameIndex() >= 0) {
+            fieldValue.reset();
+            aString.setValue(configDescriptor.getDatabaseName());
+            stringSerde.serialize(aString, fieldValue.getDataOutput());
+            recordBuilder.addField(fullTextConfigEntity.databaseNameIndex(), fieldValue);
+        }
         // write dataverse name
         fieldValue.reset();
         aString.setValue(configDescriptor.getDataverseName().getCanonicalForm());
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 7d66f3b..6ab2fea 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
@@ -64,6 +64,11 @@
 
     @Override
     protected FullTextFilterMetadataEntity createMetadataEntityFromARecord(ARecord aRecord) throws AlgebricksException {
+        int databaseNameIndex = fullTextFilterEntity.databaseNameIndex();
+        String databaseName;
+        if (databaseNameIndex >= 0) {
+            databaseName = ((AString) aRecord.getValueByPos(databaseNameIndex)).getStringValue();
+        }
         AString dataverseName = (AString) aRecord.getValueByPos(fullTextFilterEntity.dataverseNameIndex());
         AString filterName = (AString) aRecord.getValueByPos(fullTextFilterEntity.filterNameIndex());
         AString filterTypeAString = (AString) aRecord.getValueByPos(fullTextFilterEntity.filterTypeIndex());
@@ -135,6 +140,12 @@
 
     private void writeFulltextFilter(AbstractFullTextFilterDescriptor filterDescriptor)
             throws AsterixException, HyracksDataException {
+        if (fullTextFilterEntity.databaseNameIndex() >= 0) {
+            fieldValue.reset();
+            aString.setValue(filterDescriptor.getDatabaseName());
+            stringSerde.serialize(aString, fieldValue.getDataOutput());
+            recordBuilder.addField(fullTextFilterEntity.databaseNameIndex(), fieldValue);
+        }
         fieldValue.reset();
         aString.setValue(filterDescriptor.getDataverseName().getCanonicalForm());
         stringSerde.serialize(aString, fieldValue.getDataOutput());
@@ -161,8 +172,13 @@
         }
     }
 
-    private void writeIndex(String dataverseName, String filterName, ArrayTupleBuilder tupleBuilder)
-            throws HyracksDataException {
+    private void writeIndex(String databaseName, String dataverseName, String filterName,
+            ArrayTupleBuilder tupleBuilder) throws HyracksDataException {
+        if (fullTextFilterEntity.databaseNameIndex() >= 0) {
+            aString.setValue(databaseName);
+            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+            tupleBuilder.addFieldEndOffset();
+        }
         aString.setValue(dataverseName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
         tupleBuilder.addFieldEndOffset();
@@ -177,7 +193,8 @@
             throws HyracksDataException, AsterixException {
         tupleBuilder.reset();
 
-        writeIndex(filterMetadataEntity.getFullTextFilter().getDataverseName().getCanonicalForm(),
+        writeIndex(filterMetadataEntity.getFullTextFilter().getDatabaseName(),
+                filterMetadataEntity.getFullTextFilter().getDataverseName().getCanonicalForm(),
                 filterMetadataEntity.getFullTextFilter().getName(), tupleBuilder);
 
         // Write the record
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 3f61115..2439ae9 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
@@ -103,6 +103,11 @@
     }
 
     protected Function createMetadataEntityFromARecord(ARecord functionRecord) throws AlgebricksException {
+        int databaseNameIndex = functionEntity.databaseNameIndex();
+        String databaseName;
+        if (databaseNameIndex >= 0) {
+            databaseName = ((AString) functionRecord.getValueByPos(databaseNameIndex)).getStringValue();
+        }
         String dataverseCanonicalName =
                 ((AString) functionRecord.getValueByPos(functionEntity.dataverseNameIndex())).getStringValue();
         DataverseName dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName);
@@ -285,6 +290,11 @@
 
         // write the key in the first 2 fields of the tuple
         tupleBuilder.reset();
+        if (functionEntity.databaseNameIndex() >= 0) {
+            aString.setValue(function.getDatabaseName());
+            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+            tupleBuilder.addFieldEndOffset();
+        }
         aString.setValue(dataverseCanonicalName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
         tupleBuilder.addFieldEndOffset();
@@ -299,6 +309,12 @@
 
         recordBuilder.reset(functionEntity.getRecordType());
 
+        if (functionEntity.databaseNameIndex() >= 0) {
+            fieldValue.reset();
+            aString.setValue(function.getDatabaseName());
+            stringSerde.serialize(aString, fieldValue.getDataOutput());
+            recordBuilder.addField(functionEntity.databaseNameIndex(), fieldValue);
+        }
         // write field 0
         fieldValue.reset();
         aString.setValue(dataverseCanonicalName);
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 e803843..8373574 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
@@ -147,6 +147,11 @@
 
     @Override
     protected Index createMetadataEntityFromARecord(ARecord indexRecord) throws AlgebricksException {
+        int databaseNameIndex = indexEntity.databaseNameIndex();
+        String databaseName;
+        if (databaseNameIndex >= 0) {
+            databaseName = ((AString) indexRecord.getValueByPos(databaseNameIndex)).getStringValue();
+        }
         String dataverseCanonicalName =
                 ((AString) indexRecord.getValueByPos(indexEntity.dataverseNameIndex())).getStringValue();
         DataverseName dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName);
@@ -534,6 +539,11 @@
 
         // write the key in the first 3 fields of the tuple
         tupleBuilder.reset();
+        if (indexEntity.databaseNameIndex() >= 0) {
+            aString.setValue(index.getDatabaseName());
+            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+            tupleBuilder.addFieldEndOffset();
+        }
         aString.setValue(dataverseCanonicalName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
         tupleBuilder.addFieldEndOffset();
@@ -547,6 +557,12 @@
         // write the payload in the fourth field of the tuple
         recordBuilder.reset(indexEntity.getRecordType());
 
+        if (indexEntity.databaseNameIndex() >= 0) {
+            fieldValue.reset();
+            aString.setValue(index.getDatabaseName());
+            stringSerde.serialize(aString, fieldValue.getDataOutput());
+            recordBuilder.addField(indexEntity.databaseNameIndex(), fieldValue);
+        }
         // write field 0
         fieldValue.reset();
         aString.setValue(dataverseCanonicalName);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/LibraryTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/LibraryTupleTranslator.java
index 04b1952..ba8a854 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/LibraryTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/LibraryTupleTranslator.java
@@ -52,6 +52,11 @@
 
     @Override
     protected Library createMetadataEntityFromARecord(ARecord libraryRecord) throws AlgebricksException {
+        int databaseNameIndex = libraryEntity.databaseNameIndex();
+        String databaseName;
+        if (databaseNameIndex >= 0) {
+            databaseName = ((AString) libraryRecord.getValueByPos(databaseNameIndex)).getStringValue();
+        }
         String dataverseCanonicalName =
                 ((AString) libraryRecord.getValueByPos(libraryEntity.dataverseNameIndex())).getStringValue();
         DataverseName dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName);
@@ -77,6 +82,11 @@
         String dataverseCanonicalName = library.getDataverseName().getCanonicalForm();
 
         // write the key in the first 2 fields of the tuple
+        if (libraryEntity.databaseNameIndex() >= 0) {
+            aString.setValue(library.getDatabaseName());
+            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+            tupleBuilder.addFieldEndOffset();
+        }
         tupleBuilder.reset();
         aString.setValue(dataverseCanonicalName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
@@ -86,9 +96,14 @@
         tupleBuilder.addFieldEndOffset();
 
         // write the pay-load in the third field of the tuple
-
         recordBuilder.reset(libraryEntity.getRecordType());
 
+        if (libraryEntity.databaseNameIndex() >= 0) {
+            fieldValue.reset();
+            aString.setValue(library.getDatabaseName());
+            stringSerde.serialize(aString, fieldValue.getDataOutput());
+            recordBuilder.addField(libraryEntity.databaseNameIndex(), fieldValue);
+        }
         // write field 0
         fieldValue.reset();
         aString.setValue(dataverseCanonicalName);
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 e3f2bdb..114e46c 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
@@ -42,6 +42,11 @@
 
     @Override
     protected Synonym createMetadataEntityFromARecord(ARecord synonymRecord) throws AlgebricksException {
+        int databaseNameIndex = synonymEntity.databaseNameIndex();
+        String databaseName;
+        if (databaseNameIndex >= 0) {
+            databaseName = ((AString) synonymRecord.getValueByPos(databaseNameIndex)).getStringValue();
+        }
         String dataverseCanonicalName =
                 ((AString) synonymRecord.getValueByPos(synonymEntity.dataverseNameIndex())).getStringValue();
         DataverseName dataverseName = DataverseName.createFromCanonicalForm(dataverseCanonicalName);
@@ -64,6 +69,11 @@
         // write the key in the first 2 fields of the tuple
         tupleBuilder.reset();
 
+        if (synonymEntity.databaseNameIndex() >= 0) {
+            aString.setValue(synonym.getDatabaseName());
+            stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+            tupleBuilder.addFieldEndOffset();
+        }
         aString.setValue(dataverseCanonicalName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
         tupleBuilder.addFieldEndOffset();
@@ -72,9 +82,14 @@
         tupleBuilder.addFieldEndOffset();
 
         // write the pay-load in the third field of the tuple
-
         recordBuilder.reset(synonymEntity.getRecordType());
 
+        if (synonymEntity.databaseNameIndex() >= 0) {
+            fieldValue.reset();
+            aString.setValue(synonym.getDatabaseName());
+            stringSerde.serialize(aString, fieldValue.getDataOutput());
+            recordBuilder.addField(synonymEntity.databaseNameIndex(), fieldValue);
+        }
         // write field 0
         fieldValue.reset();
         aString.setValue(dataverseCanonicalName);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/fulltext/AbstractFullTextFilterDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/fulltext/AbstractFullTextFilterDescriptor.java
index c61cdd3..139a983 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/fulltext/AbstractFullTextFilterDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/fulltext/AbstractFullTextFilterDescriptor.java
@@ -22,8 +22,9 @@
 import org.apache.asterix.common.metadata.DataverseName;
 
 public abstract class AbstractFullTextFilterDescriptor implements IFullTextFilterDescriptor {
-    private static final long serialVersionUID = 6884215200256734408L;
+    private static final long serialVersionUID = 5325972301942118022L;
 
+    private final String databaseName = null;
     protected final DataverseName dataverseName;
     protected final String name;
 
@@ -32,6 +33,10 @@
         this.name = name;
     }
 
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
     public DataverseName getDataverseName() {
         return dataverseName;
     }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/fulltext/FullTextConfigDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/fulltext/FullTextConfigDescriptor.java
index 6df92a1..524e46a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/fulltext/FullTextConfigDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/fulltext/FullTextConfigDescriptor.java
@@ -31,8 +31,9 @@
 // to tokenize and process tokens of full-text documents
 // When running the ftcontains() function, the full-text config can be used with or without a full-text index
 public class FullTextConfigDescriptor implements IFullTextConfigDescriptor {
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 2L;
 
+    private final String databaseName = null;
     private final DataverseName dataverseName;
     private final String name;
     private final TokenizerCategory tokenizerCategory;
@@ -55,6 +56,10 @@
         return new FullTextConfigDescriptor(null, null, TokenizerCategory.WORD, ImmutableList.of());
     }
 
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
     public DataverseName getDataverseName() {
         return dataverseName;
     }