Skip to content

Commit db2c660

Browse files
committed
refactor: refactor querydbmetadata to be a list of columnmetadata
1 parent a482c01 commit db2c660

File tree

8 files changed

+137
-206
lines changed

8 files changed

+137
-206
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/**
2+
* This file is part of https://github.com/forcedotcom/datacloud-jdbc which is released under the
3+
* Apache 2.0 license. See https://github.com/forcedotcom/datacloud-jdbc/blob/main/LICENSE.txt
4+
*/
5+
package com.salesforce.datacloud.jdbc.core;
6+
7+
import static com.salesforce.datacloud.jdbc.util.Constants.INTEGER;
8+
import static com.salesforce.datacloud.jdbc.util.Constants.SHORT;
9+
import static com.salesforce.datacloud.jdbc.util.Constants.TEXT;
10+
11+
import com.google.common.collect.ImmutableList;
12+
import com.salesforce.datacloud.jdbc.core.metadata.ColumnMetadata;
13+
import com.salesforce.datacloud.jdbc.core.metadata.ColumnType;
14+
import java.sql.JDBCType;
15+
import java.sql.Types;
16+
import java.util.List;
17+
18+
/**
19+
* Static column metadata for standard JDBC DatabaseMetaData result set schemas (e.g. getTables,
20+
* getColumns). Each field is a list of {@link ColumnMetadata} describing the columns of that result
21+
* set.
22+
*/
23+
public final class MetadataSchemas {
24+
25+
public static final List<ColumnMetadata> TABLE_TYPES = ImmutableList.of(column("TABLE_TYPE", TEXT, Types.VARCHAR));
26+
27+
public static final List<ColumnMetadata> CATALOGS = ImmutableList.of(column("TABLE_CAT", TEXT, Types.VARCHAR));
28+
29+
public static final List<ColumnMetadata> SCHEMAS =
30+
ImmutableList.of(column("TABLE_SCHEM", TEXT, Types.VARCHAR), column("TABLE_CATALOG", TEXT, Types.VARCHAR));
31+
32+
public static final List<ColumnMetadata> TABLES = ImmutableList.of(
33+
column("TABLE_CAT", TEXT, Types.VARCHAR),
34+
column("TABLE_SCHEM", TEXT, Types.VARCHAR),
35+
column("TABLE_NAME", TEXT, Types.VARCHAR),
36+
column("TABLE_TYPE", TEXT, Types.VARCHAR),
37+
column("REMARKS", TEXT, Types.VARCHAR),
38+
column("TYPE_CAT", TEXT, Types.VARCHAR),
39+
column("TYPE_SCHEM", TEXT, Types.VARCHAR),
40+
column("TYPE_NAME", TEXT, Types.VARCHAR),
41+
column("SELF_REFERENCING_COL_NAME", TEXT, Types.VARCHAR),
42+
column("REF_GENERATION", TEXT, Types.VARCHAR));
43+
44+
public static final List<ColumnMetadata> COLUMNS = ImmutableList.of(
45+
column("TABLE_CAT", TEXT, Types.VARCHAR),
46+
column("TABLE_SCHEM", TEXT, Types.VARCHAR),
47+
column("TABLE_NAME", TEXT, Types.VARCHAR),
48+
column("COLUMN_NAME", TEXT, Types.VARCHAR),
49+
column("DATA_TYPE", INTEGER, Types.INTEGER),
50+
column("TYPE_NAME", TEXT, Types.VARCHAR),
51+
column("COLUMN_SIZE", INTEGER, Types.INTEGER),
52+
column("BUFFER_LENGTH", INTEGER, Types.INTEGER),
53+
column("DECIMAL_DIGITS", INTEGER, Types.INTEGER),
54+
column("NUM_PREC_RADIX", INTEGER, Types.INTEGER),
55+
column("NULLABLE", INTEGER, Types.INTEGER),
56+
column("REMARKS", TEXT, Types.VARCHAR),
57+
column("COLUMN_DEF", TEXT, Types.VARCHAR),
58+
column("SQL_DATA_TYPE", INTEGER, Types.INTEGER),
59+
column("SQL_DATETIME_SUB", INTEGER, Types.INTEGER),
60+
column("CHAR_OCTET_LENGTH", INTEGER, Types.INTEGER),
61+
column("ORDINAL_POSITION", INTEGER, Types.INTEGER),
62+
column("IS_NULLABLE", TEXT, Types.VARCHAR),
63+
column("SCOPE_CATALOG", TEXT, Types.VARCHAR),
64+
column("SCOPE_SCHEMA", TEXT, Types.VARCHAR),
65+
column("SCOPE_TABLE", TEXT, Types.VARCHAR),
66+
column("SOURCE_DATA_TYPE", SHORT, Types.SMALLINT),
67+
column("IS_AUTOINCREMENT", TEXT, Types.VARCHAR),
68+
column("IS_GENERATEDCOLUMN", TEXT, Types.VARCHAR));
69+
70+
private static ColumnMetadata column(String name, String typeName, int typeId) {
71+
JDBCType jdbcType = JDBCType.valueOf(typeId);
72+
return new ColumnMetadata(name, new ColumnType(jdbcType, true), typeName);
73+
}
74+
75+
private MetadataSchemas() {
76+
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
77+
}
78+
}

jdbc-core/src/main/java/com/salesforce/datacloud/jdbc/core/QueryDBMetadata.java

Lines changed: 0 additions & 122 deletions
This file was deleted.

jdbc-core/src/main/java/com/salesforce/datacloud/jdbc/core/QueryMetadataUtil.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.google.common.base.Strings;
1313
import com.google.common.collect.ImmutableList;
1414
import com.google.common.collect.ImmutableMap;
15+
import com.salesforce.datacloud.jdbc.core.metadata.ColumnMetadata;
1516
import com.salesforce.datacloud.jdbc.core.metadata.SimpleResultSetMetaData;
1617
import com.salesforce.datacloud.jdbc.util.StringCompatibility;
1718
import com.salesforce.datacloud.jdbc.util.ThrowingJdbcSupplier;
@@ -87,11 +88,11 @@ public static ResultSet createTableResultSet(
8788
data = constructTableData(resultSet);
8889
}
8990

90-
return getMetadataResultSet(QueryDBMetadata.GET_TABLES, data);
91+
return getMetadataResultSet(MetadataSchemas.TABLES, data);
9192
}
9293

93-
static ResultSet getMetadataResultSet(QueryDBMetadata queryDbMetadata, List<Object> data) throws SQLException {
94-
return SimpleMetadataResultSet.of(new SimpleResultSetMetaData(queryDbMetadata), data);
94+
static ResultSet getMetadataResultSet(List<ColumnMetadata> columns, List<Object> data) throws SQLException {
95+
return SimpleMetadataResultSet.of(new SimpleResultSetMetaData(columns), data);
9596
}
9697

9798
private static List<Object> constructTableData(ResultSet resultSet) throws SQLException {
@@ -153,7 +154,7 @@ public static ResultSet createColumnResultSet(
153154
data = constructColumnData(resultSet);
154155
}
155156

156-
return getMetadataResultSet(QueryDBMetadata.GET_COLUMNS, data);
157+
return getMetadataResultSet(MetadataSchemas.COLUMNS, data);
157158
}
158159

159160
private static String getColumnsQueryInner(
@@ -273,7 +274,7 @@ public static ResultSet createSchemaResultSet(String schemaPattern, Connection c
273274
data = constructSchemaData(resultSet);
274275
}
275276

276-
return getMetadataResultSet(QueryDBMetadata.GET_SCHEMAS, data);
277+
return getMetadataResultSet(MetadataSchemas.SCHEMAS, data);
277278
}
278279

279280
private static String getSchemasQuery(String schemaPattern) {
@@ -295,11 +296,8 @@ private static List<Object> constructSchemaData(ResultSet resultSet) throws SQLE
295296
}
296297

297298
public static ResultSet createTableTypesResultSet() throws SQLException {
298-
299299
List<Object> data = constructTableTypesData();
300-
QueryDBMetadata queryDbMetadata = QueryDBMetadata.GET_TABLE_TYPES;
301-
302-
return getMetadataResultSet(queryDbMetadata, data);
300+
return getMetadataResultSet(MetadataSchemas.TABLE_TYPES, data);
303301
}
304302

305303
private static List<Object> constructTableTypesData() {
@@ -329,7 +327,7 @@ static List<Object> getLakehouse(ThrowingJdbcSupplier<String> lakehouseSupplier)
329327
public static ResultSet createCatalogsResultSet(ThrowingJdbcSupplier<String> lakehouseSupplier)
330328
throws SQLException {
331329
val data = getLakehouse(lakehouseSupplier);
332-
return getMetadataResultSet(QueryDBMetadata.GET_CATALOGS, data);
330+
return getMetadataResultSet(MetadataSchemas.CATALOGS, data);
333331
}
334332

335333
private static final Map<String, Map<String, String>> tableTypeClauses = ImmutableMap.ofEntries(

jdbc-core/src/main/java/com/salesforce/datacloud/jdbc/core/metadata/SimpleResultSetMetaData.java

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,8 @@
44
*/
55
package com.salesforce.datacloud.jdbc.core.metadata;
66

7-
import com.salesforce.datacloud.jdbc.core.QueryDBMetadata;
8-
import java.sql.JDBCType;
97
import java.sql.ResultSetMetaData;
108
import java.sql.SQLException;
11-
import java.sql.Types;
129
import java.util.List;
1310
import lombok.val;
1411

@@ -20,39 +17,9 @@ public SimpleResultSetMetaData(ColumnMetadata[] columns) {
2017
this.columns = columns;
2118
}
2219

23-
public SimpleResultSetMetaData(QueryDBMetadata metadata) {
24-
this.columns = convertToColumnMetadata(metadata);
25-
}
26-
27-
private static ColumnMetadata[] convertToColumnMetadata(QueryDBMetadata queryDbMetadata) {
28-
List<String> columnNames = queryDbMetadata.getColumnNames();
29-
List<Integer> columnTypeIds = queryDbMetadata.getColumnTypeIds();
30-
List<String> columnTypes = queryDbMetadata.getColumnTypes();
31-
32-
ColumnMetadata[] columns = new ColumnMetadata[columnNames.size()];
33-
for (int i = 0; i < columnNames.size(); i++) {
34-
String name = columnNames.get(i);
35-
String columnType = columnTypes.get(i);
36-
int jdbcType = columnTypeIds.get(i);
37-
ColumnType columnSqlType = jdbcTypeToSqlType(jdbcType, name);
38-
columns[i] = new ColumnMetadata(name, columnSqlType, columnType);
39-
}
40-
return columns;
41-
}
42-
43-
private static ColumnType jdbcTypeToSqlType(int jdbcType, String name) {
44-
switch (jdbcType) {
45-
case Types.SMALLINT:
46-
return new ColumnType(JDBCType.SMALLINT, 38, 18, true);
47-
case Types.INTEGER:
48-
return new ColumnType(JDBCType.INTEGER, 38, 18, true);
49-
case Types.VARCHAR:
50-
case Types.LONGVARCHAR:
51-
return new ColumnType(JDBCType.VARCHAR, name.length(), 0, true);
52-
default:
53-
// Default to VARCHAR for unknown types
54-
return new ColumnType(JDBCType.VARCHAR, name.length(), 0, true);
55-
}
20+
/** Builds metadata from a list of column definitions (e.g. from {@link com.salesforce.datacloud.jdbc.core.MetadataSchemas}). */
21+
public SimpleResultSetMetaData(List<ColumnMetadata> columns) {
22+
this.columns = columns.toArray(new ColumnMetadata[0]);
5623
}
5724
/// Find a column by label
5825
/// Proprietary extension to the JDBC API

jdbc-core/src/test/java/com/salesforce/datacloud/jdbc/core/QueryDBMetadataTest.java renamed to jdbc-core/src/test/java/com/salesforce/datacloud/jdbc/core/MetadataSchemasTest.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66

77
import static org.assertj.core.api.Assertions.assertThat;
88

9+
import com.salesforce.datacloud.jdbc.core.metadata.ColumnMetadata;
910
import java.sql.Types;
1011
import java.util.Arrays;
1112
import java.util.List;
13+
import java.util.stream.Collectors;
1214
import org.junit.jupiter.api.Test;
1315

14-
public class QueryDBMetadataTest {
16+
class MetadataSchemasTest {
1517
private static final List<String> COLUMN_NAMES = Arrays.asList(
1618
"TABLE_CAT",
1719
"TABLE_SCHEM",
@@ -70,23 +72,31 @@ public class QueryDBMetadataTest {
7072
Types.VARCHAR);
7173

7274
@Test
73-
public void testGetColumnNames() {
74-
assertThat(QueryDBMetadata.GET_COLUMNS.getColumnNames()).isEqualTo(COLUMN_NAMES);
75-
assertThat(QueryDBMetadata.GET_COLUMNS.getColumnNames().size()).isEqualTo(24);
76-
assertThat(QueryDBMetadata.GET_COLUMNS.getColumnNames().get(0)).isEqualTo("TABLE_CAT");
75+
void columnsSchemaHasExpectedNames() {
76+
List<String> names =
77+
MetadataSchemas.COLUMNS.stream().map(ColumnMetadata::getName).collect(Collectors.toList());
78+
assertThat(names).isEqualTo(COLUMN_NAMES);
79+
assertThat(names).hasSize(24);
80+
assertThat(names.get(0)).isEqualTo("TABLE_CAT");
7781
}
7882

7983
@Test
80-
public void testGetColumnTypes() {
81-
assertThat(QueryDBMetadata.GET_COLUMNS.getColumnTypes()).isEqualTo(COLUMN_TYPES);
82-
assertThat(QueryDBMetadata.GET_COLUMNS.getColumnTypes().size()).isEqualTo(24);
83-
assertThat(QueryDBMetadata.GET_COLUMNS.getColumnTypes().get(0)).isEqualTo("TEXT");
84+
void columnsSchemaHasExpectedTypeNames() {
85+
List<String> typeNames = MetadataSchemas.COLUMNS.stream()
86+
.map(ColumnMetadata::getTypeName)
87+
.collect(Collectors.toList());
88+
assertThat(typeNames).isEqualTo(COLUMN_TYPES);
89+
assertThat(typeNames).hasSize(24);
90+
assertThat(typeNames.get(0)).isEqualTo("TEXT");
8491
}
8592

8693
@Test
87-
public void testGetColumnTypeIds() {
88-
assertThat(QueryDBMetadata.GET_COLUMNS.getColumnTypeIds()).isEqualTo(COLUMN_TYPE_IDS);
89-
assertThat(QueryDBMetadata.GET_COLUMNS.getColumnTypeIds().size()).isEqualTo(24);
90-
assertThat(QueryDBMetadata.GET_COLUMNS.getColumnTypeIds().get(0)).isEqualTo(Types.VARCHAR);
94+
void columnsSchemaHasExpectedJdbcTypeIds() {
95+
List<Integer> typeIds = MetadataSchemas.COLUMNS.stream()
96+
.map(c -> c.getType().getType().getVendorTypeNumber())
97+
.collect(Collectors.toList());
98+
assertThat(typeIds).isEqualTo(COLUMN_TYPE_IDS);
99+
assertThat(typeIds).hasSize(24);
100+
assertThat(typeIds.get(0)).isEqualTo(Types.VARCHAR);
91101
}
92102
}

jdbc-core/src/test/java/com/salesforce/datacloud/jdbc/core/SimpleMetadataResultSetTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,10 @@
2020
class SimpleMetadataResultSetTest {
2121
SimpleMetadataResultSet simpleMetadataResultSet;
2222

23-
QueryDBMetadata queryDBMetadata = QueryDBMetadata.GET_COLUMNS;
24-
2523
@BeforeEach
2624
public void init() throws SQLException {
27-
simpleMetadataResultSet = SimpleMetadataResultSet.of(new SimpleResultSetMetaData(queryDBMetadata), null);
25+
simpleMetadataResultSet =
26+
SimpleMetadataResultSet.of(new SimpleResultSetMetaData(MetadataSchemas.COLUMNS), null);
2827
}
2928

3029
@Test

0 commit comments

Comments
 (0)