protected ADBResultSet executeGetImportedExportedKeysQuery()

in asterixdb-jdbc/asterix-jdbc-core/src/main/java/org/apache/asterix/jdbc/core/ADBMetaStatement.java [375:466]


    protected ADBResultSet executeGetImportedExportedKeysQuery(String comment, String pkCatalog, String pkSchema,
            String pkTable, String fkCatalog, String fkSchema, String fkTable, boolean orderByFk) throws SQLException {
        StringBuilder sql = new StringBuilder(2048);
        populateQueryProlog(sql, comment);

        sql.append("select PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME, PKCOLUMN_NAME, ");
        sql.append("FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, FKCOLUMN_NAME, KEY_SEQ, ");
        sql.append(DatabaseMetaData.importedKeyNoAction).append(" UPDATE_RULE, ");
        sql.append(DatabaseMetaData.importedKeyNoAction).append(" DELETE_RULE, ");
        sql.append("FK_NAME, PK_NAME, ");
        sql.append(DatabaseMetaData.importedKeyInitiallyDeferred).append(" DEFERRABILITY ");
        sql.append("from Metadata.`Dataset` ds ");
        sql.append("join Metadata.`Datatype` dt ");
        sql.append("on ds.DatatypeDataverseName = dt.DataverseName and ds.DatatypeName = dt.DatatypeName ");
        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 ");
        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, ");
                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, ");
                break;
            default:
                throw new IllegalStateException();
        }
        sql.append("ds2Details = coalesce(ds2.InternalDetails, ds2.ExternalDetails, ds2.ViewDetails), ");
        sql.append("FKTABLE_NAME = ds.DatasetName, ");
        sql.append("PKTABLE_NAME = ds2.DatasetName, ");
        sql.append("FKCOLUMN_NAME = fki[0], ");
        sql.append("PKCOLUMN_NAME = ds2Details.PrimaryKey[fkipos-1][0], ");
        sql.append("KEY_SEQ = fkipos, ");
        sql.append("PK_NAME = PKTABLE_NAME || '").append(PK_NAME_SUFFIX).append("', ");
        sql.append("FK_NAME = FKTABLE_NAME || '").append(FK_NAME_SUFFIX).append("_' || string(fkpos) ");
        sql.append("where (every fki2 in fk.ForeignKey satisfies array_length(fki2) = 1 end) ");
        sql.append("and (every fksi in fk.KeySourceIndicator satisfies fksi = 0 end ) ");
        sql.append("and (every pki in ds2Details.PrimaryKey satisfies array_length(pki) = 1 end) ");
        sql.append("and (every pksi in ds2Details.KeySourceIndicator satisfies pksi = 0 end) ");

        if (pkCatalog != null) {
            sql.append("and (").append("PKTABLE_CAT").append(" = $1) ");
        }
        if (pkSchema != null) {
            sql.append("and (if_null(").append("PKTABLE_SCHEM").append(", '') like $2) ");
        }
        if (pkTable != null) {
            sql.append("and (").append("PKTABLE_NAME").append(" like $3) ");
        }

        if (fkCatalog != null) {
            sql.append("and (").append("FKTABLE_CAT").append(" = $4) ");
        }
        if (fkSchema != null) {
            sql.append("and (if_null(").append("FKTABLE_SCHEM").append(", '') like $5) ");
        }
        if (fkTable != null) {
            sql.append("and (").append("FKTABLE_NAME").append(" like $6) ");
        }

        switch (connection.catalogDataverseMode) {
            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) ");
                break;
            default:
                throw new IllegalStateException();
        }
        if (!connection.catalogIncludesSchemaless) {
            sql.append("and hasFields ");
        }

        sql.append("order by ").append(
                orderByFk ? "FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME" : "PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME")
                .append(", KEY_SEQ");

        return executeQueryImpl(sql.toString(),
                Arrays.asList(pkCatalog, pkSchema, pkTable, fkCatalog, fkSchema, fkTable));
    }