Skip to content
This repository was archived by the owner on Feb 13, 2025. It is now read-only.

Commit 9221172

Browse files
committed
use SPI for dialect initialization
1 parent 5476126 commit 9221172

File tree

11 files changed

+91
-15
lines changed

11 files changed

+91
-15
lines changed

build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ dependencies {
3232
testCompile group: 'junit', name: 'junit', version: '4.12'
3333
implementation 'com.upsolver:data-sources-interfaces:1.0.7'
3434

35-
3635
implementation group: 'com.amazon.redshift', name: 'redshift-jdbc42', version: '1.2.1.1001'
3736
implementation "mysql:mysql-connector-java:8.0.14"
3837
implementation "com.oracle.ojdbc:ojdbc8:19.3.0.0"

src/main/java/com/upsolver/datasources/jdbc/querybuilders/DefaultQueryDialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,4 +282,9 @@ public String getDriverClassName() {
282282
public ThrowingBiFunction<ResultSet, Integer, Object, SQLException> getValueGetter(int sqlType) {
283283
return valueGetters.getOrDefault(sqlType, defaultValueGetter);
284284
}
285+
286+
@Override
287+
public boolean acceptsURL(String url) {
288+
return url.startsWith("jdbc:");
289+
}
285290
}

src/main/java/com/upsolver/datasources/jdbc/querybuilders/OracleQueryDialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,4 +108,9 @@ public SQLType getJdbcType(SQLType sqlType) {
108108
}
109109
return sqlType;
110110
}
111+
112+
@Override
113+
public boolean acceptsURL(String url) {
114+
return url.startsWith("jdbc:oracle:");
115+
}
111116
}

src/main/java/com/upsolver/datasources/jdbc/querybuilders/PostgreSqlQueryDialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,9 @@ public boolean isAutoIncrementColumn(ResultSet columnsResultSet) throws SQLExcep
2727
public String getDriverClassName() {
2828
return "org.postgresql.Driver";
2929
}
30+
31+
@Override
32+
public boolean acceptsURL(String url) {
33+
return url.startsWith("jdbc:postgresql:");
34+
}
3035
}

src/main/java/com/upsolver/datasources/jdbc/querybuilders/QueryDialect.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,8 @@ NamedPreparedStatment queryFullTable(TableInfo tableInfo,
7171
String getDriverClassName();
7272

7373
ThrowingBiFunction<ResultSet, Integer, Object, SQLException> getValueGetter(int sqlType);
74+
75+
ThrowingBiFunction<ResultSet, Integer, String, SQLException> getStringValueGetter(int sqlType);
76+
77+
boolean acceptsURL(String url);
7478
}
Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,15 @@
11
package com.upsolver.datasources.jdbc.querybuilders;
22

3-
public class QueryDialectProvider {
3+
import java.util.ServiceLoader;
4+
import java.util.stream.StreamSupport;
45

5-
public static QueryDialect forConnection(String connectionString, boolean keepTypes) {
6+
public class QueryDialectProvider {
7+
public static QueryDialect forConnection(String connectionString) {
68
String connStr = connectionString.toLowerCase();
7-
if (connStr.startsWith("jdbc:sqlserver")) {
8-
return new SqlServerQueryDialect(keepTypes);
9-
} else if (connStr.startsWith("jdbc:oracle")) {
10-
return new OracleQueryDialect(keepTypes);
11-
} else if (connStr.startsWith("jdbc:redshift")) {
12-
return new RedshiftQueryDialect(keepTypes);
13-
} else if (connStr.startsWith("jdbc:postgresql")) {
14-
return new PostgreSqlQueryDialect(keepTypes);
15-
} else if (connStr.startsWith("jdbc:snowflake")) {
16-
return new SnowflakeQueryDialect(keepTypes);
17-
}
18-
return new DefaultQueryDialect(keepTypes);
9+
Iterable<QueryDialect> iterable = () -> ServiceLoader.load(QueryDialect.class).iterator();
10+
return StreamSupport.stream(iterable.spliterator(), false)
11+
.filter(d -> d.acceptsURL(connStr))
12+
.findFirst()
13+
.orElseGet(DefaultQueryDialect::new);
1914
}
2015
}

src/main/java/com/upsolver/datasources/jdbc/querybuilders/RedshiftQueryDialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,9 @@ public boolean isAutoIncrementColumn(ResultSet columnsResultSet) throws SQLExcep
2222
// Example default value: "identity"(707455, 0, '1,1'::text)
2323
return def != null && def.startsWith("\"identity\"(");
2424
}
25+
26+
@Override
27+
public boolean acceptsURL(String url) {
28+
return url.startsWith("jdbc:redshift:");
29+
}
2530
}

src/main/java/com/upsolver/datasources/jdbc/querybuilders/SnowflakeQueryDialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,9 @@ public long utcOffsetSeconds(Connection connection) throws SQLException {
1919
public boolean requiresUppercaseNames() {
2020
return true;
2121
}
22+
23+
@Override
24+
public boolean acceptsURL(String url) {
25+
return url.startsWith("jdbc:snowflake:");
26+
}
2227
}

src/main/java/com/upsolver/datasources/jdbc/querybuilders/SqlServerQueryDialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,9 @@ private static int getIntValue(Field field) {
6161
throw new IllegalStateException(e);
6262
}
6363
}
64+
65+
@Override
66+
public boolean acceptsURL(String url) {
67+
return url.startsWith("jdbc:sqlserver:");
68+
}
6469
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
com.upsolver.datasources.jdbc.querybuilders.SqlServerQueryDialect
2+
com.upsolver.datasources.jdbc.querybuilders.OracleQueryDialect
3+
com.upsolver.datasources.jdbc.querybuilders.RedshiftQueryDialect
4+
com.upsolver.datasources.jdbc.querybuilders.PostgreSqlQueryDialect
5+
com.upsolver.datasources.jdbc.querybuilders.SnowflakeQueryDialect
6+
com.upsolver.datasources.jdbc.querybuilders.DefaultQueryDialect
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.upsolver.datasources.jdbc.querybuilders;
2+
3+
import org.junit.Test;
4+
5+
import static org.junit.Assert.assertEquals;
6+
7+
public class QueryDialectProviderTest {
8+
@Test
9+
public void testDefault() {
10+
test("jdbc:unknown", DefaultQueryDialect.class);
11+
}
12+
13+
14+
@Test
15+
public void sqlServer() {
16+
test("jdbc:sqlserver://database-1.foo.us-east-1.rds.amazonaws.com:1433", SqlServerQueryDialect.class);
17+
}
18+
19+
@Test
20+
public void oracle() {
21+
test("jdbc:oracle:thin:@//temp-oracle.foo.us-east-1.rds.amazonaws.com:1521/test", OracleQueryDialect.class);
22+
}
23+
24+
@Test
25+
public void redshift() {
26+
test("jdbc:redshift://redshift-cluster-1.foo.us-east-1.redshift.amazonaws.com:5439/dev", RedshiftQueryDialect.class);
27+
}
28+
29+
@Test
30+
public void postgres() {
31+
test("jdbc:postgresql://1.1.1.1:5432/test_db", PostgreSqlQueryDialect.class);
32+
}
33+
34+
@Test
35+
public void snowflake() {
36+
test("jdbc:snowflake://oka43275.us-east-1.snowflakecomputing.com?db=demo_db&warehouse=test1", SnowflakeQueryDialect.class);
37+
}
38+
39+
private void test(String url, Class<? extends QueryDialect> expectedDialectClass) {
40+
assertEquals(expectedDialectClass, QueryDialectProvider.forConnection(url).getClass());
41+
}
42+
}

0 commit comments

Comments
 (0)