This is an automated email from the ASF dual-hosted git repository.

peeyush pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb-clients.git


The following commit(s) were added to refs/heads/master by this push:
     new b5d6318  [ASTERIXDB-3290][JDBC]  Changes to support database entity
b5d6318 is described below

commit b5d6318a78d28bd21a20dee87dcba0ed6d66faaa
Author: Peeyush Gupta <[email protected]>
AuthorDate: Sun Oct 22 22:28:28 2023 -0700

    [ASTERIXDB-3290][JDBC]  Changes to support database entity
    
    Details:
    Updated ADBMetadataStatement so that the Metadata queries
    generated in case database entity is supported by the server
    are compatible with the server metadata.
    
    Change-Id: I53242717a5278fffd77c682a66694bb3c02b3ee6
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb-clients/+/17873
    Reviewed-by: Peeyush Gupta <[email protected]>
    Reviewed-by: Ali Alsuliman <[email protected]>
    Tested-by: Jenkins <[email protected]>
---
 .../apache/asterix/jdbc/core/ADBConnection.java    |  44 +++++-
 .../apache/asterix/jdbc/core/ADBMetaStatement.java | 150 ++++++++++++++++-----
 .../apache/asterix/jdbc/core/ADBProtocolBase.java  |   5 +
 3 files changed, 161 insertions(+), 38 deletions(-)

diff --git 
a/asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBConnection.java
 
b/asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBConnection.java
index ca61992..628c3fe 100644
--- 
a/asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBConnection.java
+++ 
b/asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBConnection.java
@@ -60,6 +60,7 @@ public class ADBConnection extends ADBWrapperSupport 
implements Connection {
     private volatile ADBMetaStatement metaStatement;
     private volatile String catalog;
     private volatile String schema;
+    private final boolean databaseEntitySupported;
 
     // Lifecycle
 
@@ -76,20 +77,31 @@ public class ADBConnection extends ADBWrapperSupport 
implements Connection {
         this.catalogDataverseMode = getCatalogDataverseMode(properties, 
protocol.getErrorReporter());
         this.catalogIncludesSchemaless =
                 (Boolean) 
ADBDriverProperty.Common.CATALOG_INCLUDES_SCHEMALESS.fetchPropertyValue(properties);
+        this.databaseEntitySupported = checkDatabaseEntitySupport();
         initCatalogSchema(protocol, dataverseCanonicalName);
     }
 
     protected void initCatalogSchema(ADBProtocolBase protocol, String 
dataverseCanonicalName) throws SQLException {
         switch (catalogDataverseMode) {
             case CATALOG:
-                catalog = dataverseCanonicalName == null || 
dataverseCanonicalName.isEmpty()
-                        ? protocol.getDefaultDataverse() : 
dataverseCanonicalName;
+                if (dataverseCanonicalName == null || 
dataverseCanonicalName.isEmpty()) {
+                    catalog = isDatabaseEntitySupported()
+                            ? protocol.getDefaultDatabase() + "/" + 
protocol.getDefaultDataverse()
+                            : protocol.getDefaultDataverse();
+                } else {
+                    catalog = dataverseCanonicalName;
+                }
                 // schema = null
                 break;
             case CATALOG_SCHEMA:
                 if (dataverseCanonicalName == null || 
dataverseCanonicalName.isEmpty()) {
-                    catalog = protocol.getDefaultDataverse();
-                    // schema = null
+                    if (isDatabaseEntitySupported()) {
+                        catalog = protocol.getDefaultDatabase();
+                        schema = protocol.getDefaultDataverse();
+                    } else {
+                        catalog = protocol.getDefaultDataverse();
+                        // schema = null
+                    }
                 } else {
                     String[] parts = dataverseCanonicalName.split("/");
                     switch (parts.length) {
@@ -610,4 +622,28 @@ public class ADBConnection extends ADBWrapperSupport 
implements Connection {
     public void setClientInfo(String name, String value) throws 
SQLClientInfoException {
         throw 
getErrorReporter().errorClientInfoMethodNotSupported(Connection.class, 
"setClientInfo");
     }
+
+    protected boolean checkDatabaseEntitySupport() throws SQLException {
+        checkClosed();
+
+        StringBuilder sql = new StringBuilder(256);
+        ADBStatement stmt = createStatementImpl();
+
+        sql.append("select count(*) ");
+        sql.append("from Metadata.`Dataset` ");
+        sql.append("where DataverseName='Metadata' and 
DatasetName='Database'");
+        ADBResultSet resultSet = stmt.executeQuery(sql.toString());
+        try {
+            if (resultSet.next()) {
+                return resultSet.getInt(1) > 0;
+            }
+            return false;
+        } finally {
+            stmt.close();
+        }
+    }
+
+    public boolean isDatabaseEntitySupported() {
+        return databaseEntitySupported;
+    }
 }
diff --git 
a/asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBMetaStatement.java
 
b/asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBMetaStatement.java
index 4525062..c2e555a 100644
--- 
a/asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBMetaStatement.java
+++ 
b/asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBMetaStatement.java
@@ -61,12 +61,20 @@ public class ADBMetaStatement extends ADBStatement {
         sql.append("from Metadata.`Dataverse` ");
         switch (connection.catalogDataverseMode) {
             case CATALOG:
-                sql.append("let TABLE_CAT = DataverseName ");
+                if (connection.isDatabaseEntitySupported()) {
+                    sql.append("let TABLE_CAT = DatabaseName || '/' || 
DataverseName ");
+                } else {
+                    sql.append("let TABLE_CAT = DataverseName ");
+                }
                 break;
             case CATALOG_SCHEMA:
-                sql.append("let name = decode_dataverse_name(DataverseName), 
");
-                sql.append("TABLE_CAT = name[0] ");
-                sql.append("where (array_length(name) between 1 and 2) ");
+                if (connection.isDatabaseEntitySupported()) {
+                    sql.append("let TABLE_CAT = DatabaseName ");
+                } else {
+                    sql.append("let name = 
decode_dataverse_name(DataverseName), ");
+                    sql.append("TABLE_CAT = name[0] ");
+                    sql.append("where (array_length(name) between 1 and 2) ");
+                }
                 sql.append("group by TABLE_CAT ");
                 break;
             default:
@@ -109,15 +117,24 @@ public class ADBMetaStatement extends ADBStatement {
         sql.append("let ");
         switch (connection.catalogDataverseMode) {
             case CATALOG:
-                sql.append("TABLE_CATALOG = DataverseName, ");
+                if (connection.isDatabaseEntitySupported()) {
+                    sql.append("TABLE_CATALOG = DatabaseName || '/' || 
DataverseName, ");
+                } else {
+                    sql.append("TABLE_CATALOG = DataverseName, ");
+                }
                 sql.append("TABLE_SCHEM = null ");
                 sql.append("where true ");
                 break;
             case CATALOG_SCHEMA:
-                sql.append("name = decode_dataverse_name(DataverseName), ");
-                sql.append("TABLE_CATALOG = name[0], ");
-                sql.append("TABLE_SCHEM = case array_length(name) when 1 then 
null else name[1] end ");
-                sql.append("where (array_length(name) between 1 and 2) ");
+                if (connection.isDatabaseEntitySupported()) {
+                    sql.append("TABLE_CATALOG = DatabaseName, ");
+                    sql.append("TABLE_SCHEM = DataverseName ");
+                } else {
+                    sql.append("name = decode_dataverse_name(DataverseName), 
");
+                    sql.append("TABLE_CATALOG = name[0], ");
+                    sql.append("TABLE_SCHEM = case array_length(name) when 1 
then null else name[1] end ");
+                    sql.append("where (array_length(name) between 1 and 2) ");
+                }
                 break;
             default:
                 throw new IllegalStateException();
@@ -149,16 +166,28 @@ public class ADBMetaStatement extends ADBStatement {
         sql.append("null TYPE_SCHEM, null TYPE_NAME, null 
SELF_REFERENCING_COL_NAME, null REF_GENERATION ");
         sql.append("from Metadata.`Dataset` ds join Metadata.`Datatype` dt ");
         sql.append("on ds.DatatypeDataverseName = dt.DataverseName and 
ds.DatatypeName = dt.DatatypeName ");
+        if (connection.isDatabaseEntitySupported()) {
+            sql.append("and ds.DatatypeDatabaseName = dt.DatabaseName ");
+        }
         sql.append("let ");
         switch (connection.catalogDataverseMode) {
             case CATALOG:
-                sql.append("TABLE_CAT = ds.DataverseName, ");
+                if (connection.isDatabaseEntitySupported()) {
+                    sql.append("TABLE_CAT = ds.DatabaseName || '/' || 
ds.DataverseName, ");
+                } else {
+                    sql.append("TABLE_CAT = ds.DataverseName, ");
+                }
                 sql.append("TABLE_SCHEM = null, ");
                 break;
             case CATALOG_SCHEMA:
-                sql.append("dvname = decode_dataverse_name(ds.DataverseName), 
");
-                sql.append("TABLE_CAT = dvname[0], ");
-                sql.append("TABLE_SCHEM = case array_length(dvname) when 1 
then null else dvname[1] end, ");
+                if (connection.isDatabaseEntitySupported()) {
+                    sql.append("TABLE_CAT = ds.DatabaseName, ");
+                    sql.append("TABLE_SCHEM = ds.DataverseName, ");
+                } else {
+                    sql.append("dvname = 
decode_dataverse_name(ds.DataverseName), ");
+                    sql.append("TABLE_CAT = dvname[0], ");
+                    sql.append("TABLE_SCHEM = case array_length(dvname) when 1 
then null else dvname[1] end, ");
+                }
                 break;
             default:
                 throw new IllegalStateException();
@@ -189,7 +218,9 @@ public class ADBMetaStatement extends ADBStatement {
             case CATALOG:
                 break;
             case CATALOG_SCHEMA:
-                sql.append("and (array_length(dvname) between 1 and 2) ");
+                if (!connection.isDatabaseEntitySupported()) {
+                    sql.append("and (array_length(dvname) between 1 and 2) ");
+                }
                 break;
             default:
                 throw new IllegalStateException();
@@ -221,20 +252,35 @@ public class ADBMetaStatement extends ADBStatement {
         sql.append("from Metadata.`Dataset` ds ");
         sql.append("join Metadata.`Datatype` dt ");
         sql.append("on ds.DatatypeDataverseName = dt.DataverseName and 
ds.DatatypeName = dt.DatatypeName ");
+        if (connection.isDatabaseEntitySupported()) {
+            sql.append("and ds.DatatypeDatabaseName = dt.DatabaseName ");
+        }
         sql.append("unnest dt.Derived.Record.Fields as field at fieldpos ");
         sql.append("left join Metadata.`Datatype` dt2 ");
         sql.append(
                 "on field.FieldType = dt2.DatatypeName and ds.DataverseName = 
dt2.DataverseName and dt2.Derived is known ");
+        if (connection.isDatabaseEntitySupported()) {
+            sql.append("and ds.DatabaseName = dt2.DatabaseName ");
+        }
         sql.append("let ");
         switch (connection.catalogDataverseMode) {
             case CATALOG:
-                sql.append("TABLE_CAT = ds.DataverseName, ");
+                if (connection.isDatabaseEntitySupported()) {
+                    sql.append("TABLE_CAT = ds.DatabaseName || '/' || 
ds.DataverseName, ");
+                } else {
+                    sql.append("TABLE_CAT = ds.DataverseName, ");
+                }
                 sql.append("TABLE_SCHEM = null, ");
                 break;
             case CATALOG_SCHEMA:
-                sql.append("dvname = decode_dataverse_name(ds.DataverseName), 
");
-                sql.append("TABLE_CAT = dvname[0], ");
-                sql.append("TABLE_SCHEM = case array_length(dvname) when 1 
then null else dvname[1] end, ");
+                if (connection.isDatabaseEntitySupported()) {
+                    sql.append("TABLE_CAT = ds.DatabaseName, ");
+                    sql.append("TABLE_SCHEM = ds.DataverseName, ");
+                } else {
+                    sql.append("dvname = 
decode_dataverse_name(ds.DataverseName), ");
+                    sql.append("TABLE_CAT = dvname[0], ");
+                    sql.append("TABLE_SCHEM = case array_length(dvname) when 1 
then null else dvname[1] end, ");
+                }
                 break;
             default:
                 throw new IllegalStateException();
@@ -282,7 +328,9 @@ public class ADBMetaStatement extends ADBStatement {
             case CATALOG:
                 break;
             case CATALOG_SCHEMA:
-                sql.append("and (array_length(dvname) between 1 and 2) ");
+                if (!connection.isDatabaseEntitySupported()) {
+                    sql.append("and (array_length(dvname) between 1 and 2) ");
+                }
                 break;
             default:
                 throw new IllegalStateException();
@@ -304,18 +352,30 @@ public class ADBMetaStatement extends ADBStatement {
         sql.append("from Metadata.`Dataset` ds ");
         sql.append("join Metadata.`Datatype` dt ");
         sql.append("on ds.DatatypeDataverseName = dt.DataverseName and 
ds.DatatypeName = dt.DatatypeName ");
+        if (connection.isDatabaseEntitySupported()) {
+            sql.append("and ds.DatatypeDatabaseName = dt.DatabaseName ");
+        }
         sql.append("unnest coalesce(ds.InternalDetails, ds.ExternalDetails, 
ds.ViewDetails).PrimaryKey pki at pkipos ");
         sql.append("let ");
         sql.append("hasFields = array_length(dt.Derived.Record.Fields) > 0, ");
         switch (connection.catalogDataverseMode) {
             case CATALOG:
-                sql.append("TABLE_CAT = ds.DataverseName, ");
+                if (connection.isDatabaseEntitySupported()) {
+                    sql.append("TABLE_CAT = ds.DatabaseName || '/' || 
ds.DataverseName, ");
+                } else {
+                    sql.append("TABLE_CAT = ds.DataverseName, ");
+                }
                 sql.append("TABLE_SCHEM = null, ");
                 break;
             case CATALOG_SCHEMA:
-                sql.append("dvname = decode_dataverse_name(ds.DataverseName), 
");
-                sql.append("TABLE_CAT = dvname[0], ");
-                sql.append("TABLE_SCHEM = case array_length(dvname) when 1 
then null else dvname[1] end, ");
+                if (connection.isDatabaseEntitySupported()) {
+                    sql.append("TABLE_CAT = ds.DatabaseName, ");
+                    sql.append("TABLE_SCHEM = ds.DataverseName, ");
+                } else {
+                    sql.append("dvname = 
decode_dataverse_name(ds.DataverseName), ");
+                    sql.append("TABLE_CAT = dvname[0], ");
+                    sql.append("TABLE_SCHEM = case array_length(dvname) when 1 
then null else dvname[1] end, ");
+                }
                 break;
             default:
                 throw new IllegalStateException();
@@ -340,7 +400,9 @@ public class ADBMetaStatement extends ADBStatement {
             case CATALOG:
                 break;
             case CATALOG_SCHEMA:
-                sql.append("and (array_length(dvname) between 1 and 2) ");
+                if (!connection.isDatabaseEntitySupported()) {
+                    sql.append("and (array_length(dvname) between 1 and 2) ");
+                }
                 break;
             default:
                 throw new IllegalStateException();
@@ -386,26 +448,44 @@ public class ADBMetaStatement extends ADBStatement {
         sql.append("from Metadata.`Dataset` ds ");
         sql.append("join Metadata.`Datatype` dt ");
         sql.append("on ds.DatatypeDataverseName = dt.DataverseName and 
ds.DatatypeName = dt.DatatypeName ");
+        if (connection.isDatabaseEntitySupported()) {
+            sql.append("and ds.DatatypeDatabaseName = dt.DatabaseName ");
+        }
         sql.append("unnest coalesce(ds.InternalDetails, ds.ExternalDetails, 
ds.ViewDetails).ForeignKeys fk at fkpos ");
         sql.append("join Metadata.`Dataset` ds2 ");
         sql.append("on fk.RefDataverseName = ds2.DataverseName and 
fk.RefDatasetName = ds2.DatasetName ");
+        if (connection.isDatabaseEntitySupported()) {
+            sql.append("and fk.RefDatabaseName = ds2.DatabaseName ");
+        }
         sql.append("unnest fk.ForeignKey fki at fkipos ");
         sql.append("let ");
         sql.append("hasFields = array_length(dt.Derived.Record.Fields) > 0, ");
         switch (connection.catalogDataverseMode) {
             case CATALOG:
-                sql.append("FKTABLE_CAT = ds.DataverseName, ");
+                if (connection.isDatabaseEntitySupported()) {
+                    sql.append("FKTABLE_CAT = ds.DatabaseName || '/' || 
ds.DataverseName, ");
+                    sql.append("PKTABLE_CAT = ds2.DatabaseName || '/' || 
ds2.DataverseName, ");
+                } else {
+                    sql.append("FKTABLE_CAT = ds.DataverseName, ");
+                    sql.append("PKTABLE_CAT = ds2.DataverseName, ");
+                }
                 sql.append("FKTABLE_SCHEM = null, ");
-                sql.append("PKTABLE_CAT = ds2.DataverseName, ");
                 sql.append("PKTABLE_SCHEM = null, ");
                 break;
             case CATALOG_SCHEMA:
-                sql.append("dvname = decode_dataverse_name(ds.DataverseName), 
");
-                sql.append("FKTABLE_CAT = dvname[0], ");
-                sql.append("FKTABLE_SCHEM = case array_length(dvname) when 1 
then null else dvname[1] end, ");
-                sql.append("dvname2 = 
decode_dataverse_name(ds2.DataverseName), ");
-                sql.append("PKTABLE_CAT = dvname2[0], ");
-                sql.append("PKTABLE_SCHEM = case array_length(dvname2) when 1 
then null else dvname2[1] end, ");
+                if (connection.isDatabaseEntitySupported()) {
+                    sql.append("FKTABLE_CAT = ds.DatabaseName, ");
+                    sql.append("FKTABLE_SCHEM = ds.DataverseName, ");
+                    sql.append("PKTABLE_CAT = ds2.DatabaseName, ");
+                    sql.append("PKTABLE_SCHEM = ds2.DataverseName, ");
+                } else {
+                    sql.append("dvname = 
decode_dataverse_name(ds.DataverseName), ");
+                    sql.append("FKTABLE_CAT = dvname[0], ");
+                    sql.append("FKTABLE_SCHEM = case array_length(dvname) when 
1 then null else dvname[1] end, ");
+                    sql.append("dvname2 = 
decode_dataverse_name(ds2.DataverseName), ");
+                    sql.append("PKTABLE_CAT = dvname2[0], ");
+                    sql.append("PKTABLE_SCHEM = case array_length(dvname2) 
when 1 then null else dvname2[1] end, ");
+                }
                 break;
             default:
                 throw new IllegalStateException();
@@ -447,8 +527,10 @@ public class ADBMetaStatement extends ADBStatement {
             case CATALOG:
                 break;
             case CATALOG_SCHEMA:
-                sql.append("and (array_length(dvname) between 1 and 2) ");
-                sql.append("and (array_length(dvname2) between 1 and 2) ");
+                if (!connection.isDatabaseEntitySupported()) {
+                    sql.append("and (array_length(dvname) between 1 and 2) ");
+                    sql.append("and (array_length(dvname2) between 1 and 2) ");
+                }
                 break;
             default:
                 throw new IllegalStateException();
diff --git 
a/asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBProtocolBase.java
 
b/asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBProtocolBase.java
index 3186aa0..0235edd 100644
--- 
a/asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBProtocolBase.java
+++ 
b/asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBProtocolBase.java
@@ -62,6 +62,7 @@ public abstract class ADBProtocolBase {
     public static final String PLAN_FORMAT_STRING = "string";
 
     private static final String DEFAULT_DATAVERSE = "Default";
+    private static final String DEFAULT_DATABASE = "Default";
     private static final String OPTIONAL_TYPE_SUFFIX = "?";
     private static final String EXPLAIN_ONLY_RESULT_COLUMN_NAME = "$1";
 
@@ -259,6 +260,10 @@ public abstract class ADBProtocolBase {
         return DEFAULT_DATAVERSE;
     }
 
+    public String getDefaultDatabase() {
+        return DEFAULT_DATABASE;
+    }
+
     public static class SubmitStatementOptions {
         public String dataverseName;
         public int timeoutSeconds;

Reply via email to