[ASTERIXDB-3259][MTD] Add metadata API to get the databases

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

Details:
Add metadata API to get the databases.

Change-Id: Ia3767125e349d42bccabfc43e3f9fdb4506cc199
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17867
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
Reviewed-by: Murtadha Hubail <mhubail@apache.org>
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 f404ca5..a792267 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
@@ -2015,6 +2015,7 @@
             }
 
             // #. prepare jobs which will drop corresponding libraries
+            //TODO(DB): library database
             List<Library> libraries = MetadataManager.INSTANCE.getDatabaseLibraries(mdTxnCtx, databaseName);
             for (Library library : libraries) {
                 jobsToExecute.add(ExternalLibraryJobUtils.buildDropLibraryJobSpec(library.getDataverseName(),
@@ -2214,7 +2215,7 @@
             List<Library> libraries =
                     MetadataManager.INSTANCE.getDataverseLibraries(mdTxnCtx, databaseName, dataverseName);
             for (Library library : libraries) {
-                //TODO(DB):
+                //TODO(DB): library database
                 jobsToExecute.add(ExternalLibraryJobUtils.buildDropLibraryJobSpec(dataverseName, library.getName(),
                         metadataProvider));
             }
@@ -2310,12 +2311,12 @@
     }
 
     protected void validateDatabaseStateBeforeDrop(MetadataProvider metadataProvider, Database database,
-            SourceLocation sourceLoc) throws AlgebricksException {
+            SourceLocation sourceLoc) throws AlgebricksException, HyracksDataException {
         // may be overridden by product extensions for additional checks before dropping the database
     }
 
     protected void validateDataverseStateBeforeDrop(MetadataProvider metadataProvider, Dataverse dataverse,
-            SourceLocation sourceLoc) throws AlgebricksException {
+            SourceLocation sourceLoc) throws AlgebricksException, HyracksDataException {
         // may be overridden by product extensions for additional checks before dropping the dataverse
     }
 
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
index ed3474d..2c71084 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
@@ -256,6 +256,15 @@
     }
 
     @Override
+    public List<Database> getDatabases(MetadataTransactionContext ctx) throws AlgebricksException {
+        try {
+            return metadataNode.getDatabases(ctx.getTxnId());
+        } catch (RemoteException e) {
+            throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
+        }
+    }
+
+    @Override
     public List<Dataverse> getDataverses(MetadataTransactionContext ctx) throws AlgebricksException {
         try {
             return metadataNode.getDataverses(ctx.getTxnId());
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
index 5383ac9..0571eff 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
@@ -1115,6 +1115,19 @@
     }
 
     @Override
+    public List<Database> getDatabases(TxnId txnId) throws AlgebricksException, RemoteException {
+        try {
+            DatabaseTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDatabaseTupleTranslator(false);
+            IValueExtractor<Database> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
+            List<Database> results = new ArrayList<>();
+            searchIndex(txnId, mdIndexesProvider.getDatabaseEntity().getIndex(), null, valueExtractor, results);
+            return results;
+        } catch (HyracksDataException e) {
+            throw new AlgebricksException(e);
+        }
+    }
+
+    @Override
     public List<Dataverse> getDataverses(TxnId txnId) throws AlgebricksException {
         try {
             DataverseTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDataverseTupleTranslator(false);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java
index f3cc811..d5e0157 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java
@@ -108,6 +108,8 @@
      */
     void addDataverse(MetadataTransactionContext ctx, Dataverse dataverse) throws AlgebricksException;
 
+    List<Database> getDatabases(MetadataTransactionContext ctx) throws AlgebricksException;
+
     /**
      * Retrieves all dataverses
      *
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
index a4f2ca7..0d753d8 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
@@ -130,6 +130,8 @@
     Dataverse getDataverse(TxnId txnId, String database, DataverseName dataverseName)
             throws AlgebricksException, RemoteException;
 
+    List<Database> getDatabases(TxnId txnId) throws AlgebricksException, RemoteException;
+
     /**
      * Retrieves all dataverses, acquiring local locks on behalf of the given
      * transaction id.