[ASTERIXDB-2752][MTD] Add metadata for synonyms on upgrade

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

Details:
- On version upgrade insert synonyms dataset entry
  into Metadata.Dataset and corresponding type entry
  into Metadata.Datatype

Change-Id: I32b3bafab3c130666f13063d8959f5b6e5fb7261
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/6944
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Dmitry Lychagin <dmitry.lychagin@couchbase.com>
Reviewed-by: Michael Blow <mblow@apache.org>
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
index 4309c26..d85422d 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
@@ -21,6 +21,7 @@
 import java.io.File;
 import java.rmi.RemoteException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 
@@ -170,6 +171,7 @@
                 }
             } else {
                 insertNewCompactionPoliciesIfNotExist(mdTxnCtx);
+                insertSynonymEntitiesIfNotExist(mdTxnCtx);
             }
             // #. initialize datasetIdFactory
             MetadataManager.INSTANCE.initializeDatasetIdFactory(mdTxnCtx);
@@ -222,6 +224,10 @@
         }
     }
 
+    public static void getMetadataIndexes(List<IMetadataIndex> outIndexes) {
+        Collections.addAll(outIndexes, PRIMARY_INDEXES);
+    }
+
     private static void getMetadataTypes(ArrayList<IAType> types) {
         for (int i = 0; i < PRIMARY_INDEXES.length; i++) {
             types.add(PRIMARY_INDEXES[i].getPayloadRecordType());
@@ -293,6 +299,20 @@
         }
     }
 
+    private static void insertSynonymEntitiesIfNotExist(MetadataTransactionContext mdTxnCtx)
+            throws AlgebricksException {
+        IAType synonymDatasetRecordType = MetadataPrimaryIndexes.SYNONYM_DATASET.getPayloadRecordType();
+        if (MetadataManager.INSTANCE.getDatatype(mdTxnCtx, MetadataConstants.METADATA_DATAVERSE_NAME,
+                synonymDatasetRecordType.getTypeName()) == null) {
+            MetadataManager.INSTANCE.addDatatype(mdTxnCtx, new Datatype(MetadataConstants.METADATA_DATAVERSE_NAME,
+                    synonymDatasetRecordType.getTypeName(), synonymDatasetRecordType, false));
+        }
+        if (MetadataManager.INSTANCE.getDataset(mdTxnCtx, MetadataConstants.METADATA_DATAVERSE_NAME,
+                MetadataConstants.SYNONYM_DATASET_NAME) == null) {
+            insertMetadataDatasets(mdTxnCtx, new IMetadataIndex[] { MetadataPrimaryIndexes.SYNONYM_DATASET });
+        }
+    }
+
     private static DatasourceAdapter getAdapter(String adapterFactoryClassName) throws AlgebricksException {
         try {
             String adapterName =