Skip to content

Commit 3c07fce

Browse files
authored
Make DuckDB and Snowflake query client configs part of server-config.json (#1452)
1 parent 8825d49 commit 3c07fce

File tree

25 files changed

+162
-106
lines changed

25 files changed

+162
-106
lines changed

documentation/docs/configuration.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,10 @@ For dependent services, DataSQRL creates and uses the following environment vari
275275
* `POSTGRES_JDBC_URL`
276276
* `POSTGRES_USERNAME`
277277
* `POSTGRES_PASSWORD`
278-
278+
* **Snowflake**
279+
* `SNOWFLAKE_JDBC_URL`
280+
* `SNOWFLAKE_EXTERNAL_VOLUME`
281+
* `SNOWFLAKE_CATALOG_NAME`
279282
---
280283

281284
## Default Configuration
@@ -303,7 +306,7 @@ The built-in fallback (excerpt - full version [here](https://raw.githubuserconte
303306
"schema-type": "aws-glue",
304307
"catalog-name": "${SNOWFLAKE_CATALOG_NAME}",
305308
"external-volume": "${SNOWFLAKE_EXTERNAL_VOLUME}",
306-
"url": "jdbc:snowflake://${SNOWFLAKE_ID}.snowflakecomputing.com/?..."
309+
"url": "${SNOWFLAKE_JDBC_URL}"
307310
}
308311
},
309312
"compiler": {

pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -955,6 +955,13 @@
955955
<flinkrunner.image.repo>${flinkrunner.image.repo}</flinkrunner.image.repo>
956956
<flinkrunner.version>${flinkrunner.version}</flinkrunner.version>
957957
</systemPropertyVariables>
958+
<argLine>${argLine}
959+
--add-opens=java.base/java.util=ALL-UNNAMED
960+
--add-opens=java.base/java.lang=ALL-UNNAMED
961+
--add-opens=java.base/java.io=ALL-UNNAMED
962+
--add-opens=java.base/java.nio=ALL-UNNAMED
963+
--add-opens=java.base/java.net=ALL-UNNAMED
964+
</argLine>
958965
</configuration>
959966
<executions>
960967
<execution>

sqrl-cli/src/main/resources/templates/server-config.json

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,14 @@
109109
"http2RstFloodWindowDurationTimeUnit" : "SECONDS",
110110
"strictThreadMode" : false,
111111
"enabledSecureTransportProtocols" : [ "TLSv1", "TLSv1.1", "TLSv1.2" ],
112+
"useAlpn" : false,
113+
"sni" : false,
112114
"keyCertOptions" : null,
113115
"trustOptions" : null,
114116
"clientAuth" : "NONE",
115117
"sslHandshakeTimeout" : 10,
116118
"sslHandshakeTimeoutUnit" : "SECONDS",
117-
"fileRegionEnabled" : true,
118-
"useAlpn" : false,
119-
"sni" : false
119+
"fileRegionEnabled" : true
120120
},
121121
"pgConnectOptions" : {
122122
"host" : "${POSTGRES_HOST}",
@@ -195,5 +195,13 @@
195195
"value.deserializer" : "com.datasqrl.graphql.kafka.JsonDeserializer",
196196
"bootstrap.servers" : "${KAFKA_BOOTSTRAP_SERVERS}",
197197
"auto.offset.reset" : "latest"
198+
},
199+
"duckDbConfig" : {
200+
"url" : "jdbc:duckdb:",
201+
"driver" : null
202+
},
203+
"snowflakeConfig" : {
204+
"url" : "${SNOWFLAKE_URL}",
205+
"driver" : null
198206
}
199207
}

sqrl-cli/src/test/java/com/datasqrl/engine/server/GenericJavaServerEngineTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import static com.datasqrl.graphql.SqrlObjectMapper.MAPPER;
1919
import static org.assertj.core.api.Assertions.assertThat;
2020

21-
import com.datasqrl.config.PackageJson.EmptyEngineConfig;
21+
import com.datasqrl.config.PackageJsonImpl;
2222
import com.datasqrl.graphql.config.ServerConfigUtil;
2323
import com.fasterxml.jackson.databind.JsonNode;
2424
import java.util.List;
@@ -28,7 +28,7 @@
2828

2929
class GenericJavaServerEngineTest {
3030

31-
GenericJavaServerEngine underTest = new GenericJavaServerEngine("", new EmptyEngineConfig("")) {};
31+
GenericJavaServerEngine underTest = new GenericJavaServerEngine("", new PackageJsonImpl()) {};
3232

3333
@Test
3434
void test() {

sqrl-planner/src/main/java/com/datasqrl/engine/server/GenericJavaServerEngine.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@
1919
import static com.datasqrl.graphql.SqrlObjectMapper.MAPPER;
2020

2121
import com.datasqrl.config.EngineType;
22+
import com.datasqrl.config.PackageJson;
2223
import com.datasqrl.config.PackageJson.EngineConfig;
2324
import com.datasqrl.engine.EnginePhysicalPlan;
2425
import com.datasqrl.engine.EnginePhysicalPlan.DeploymentArtifact;
2526
import com.datasqrl.engine.ExecutionEngine;
27+
import com.datasqrl.engine.database.relational.DuckDBEngineFactory;
28+
import com.datasqrl.engine.database.relational.SnowflakeEngineFactory;
2629
import com.datasqrl.graphql.config.ServerConfig;
2730
import com.datasqrl.graphql.config.ServerConfigUtil;
2831
import io.vertx.core.json.JsonObject;
@@ -35,10 +38,12 @@
3538
public abstract class GenericJavaServerEngine extends ExecutionEngine.Base implements ServerEngine {
3639

3740
private final EngineConfig engineConfig;
41+
private final List<String> enabledEngines;
3842

39-
public GenericJavaServerEngine(String engineName, EngineConfig engineConfig) {
43+
public GenericJavaServerEngine(String engineName, PackageJson packageJson) {
4044
super(engineName, EngineType.SERVER, NO_CAPABILITIES);
41-
this.engineConfig = engineConfig;
45+
engineConfig = packageJson.getEngines().getEngineConfigOrEmpty(engineName);
46+
enabledEngines = packageJson.getEnabledEngines();
4247
}
4348

4449
@Override
@@ -68,8 +73,17 @@ ServerConfig readDefaultConfig() {
6873
ServerConfig serverConfig;
6974
try (var input = getClass().getResourceAsStream("/templates/server-config.json")) {
7075
var json = MAPPER.readValue(input, JsonObject.class);
76+
disableConfigIfNeeded(json, DuckDBEngineFactory.ENGINE_NAME, "duckDbConfig");
77+
disableConfigIfNeeded(json, SnowflakeEngineFactory.ENGINE_NAME, "snowflakeConfig");
78+
7179
serverConfig = new ServerConfig(json);
7280
}
7381
return serverConfig;
7482
}
83+
84+
private void disableConfigIfNeeded(JsonObject json, String engineName, String configName) {
85+
if (!enabledEngines.contains(engineName)) {
86+
json.putNull(configName);
87+
}
88+
}
7589
}

sqrl-planner/src/main/java/com/datasqrl/engine/server/VertxEngineFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public static class VertxEngine extends GenericJavaServerEngine {
4040

4141
@Inject
4242
public VertxEngine(PackageJson packageJson) {
43-
super(ENGINE_NAME, packageJson.getEngines().getEngineConfigOrEmpty(ENGINE_NAME));
43+
super(ENGINE_NAME, packageJson);
4444
}
4545
}
4646
}

sqrl-planner/src/main/resources/default-package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"schema-type": "aws-glue",
3939
"catalog-name": "${SNOWFLAKE_CATALOG_NAME}",
4040
"external-volume": "${SNOWFLAKE_EXTERNAL_VOLUME}",
41-
"url": "jdbc:snowflake://${SNOWFLAKE_ID}.snowflakecomputing.com/?user=${SNOWFLAKE_USER}&password=${SNOWFLAKE_PASSWORD}&warehouse=COMPUTE_WH&db=MYSNOWFLAKEDB&schema=public&disableSslHostnameVerification=true"
41+
"url": "${SNOWFLAKE_JDBC_URL}"
4242
}
4343
},
4444
"connectors": {

sqrl-server/sqrl-server-core/src/main/java/com/datasqrl/graphql/jdbc/JdbcExecutionContext.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,12 @@ public CompletableFuture runQuery(ResolvedSqlQuery resolvedQuery, boolean isList
7979
if (preparedQueryContainer != null) {
8080
return CompletableFuture.supplyAsync(
8181
() -> {
82-
try (PreparedStatement statement =
83-
preparedQueryContainer
84-
.getConnection()
85-
.prepareStatement(preparedQueryContainer.getPreparedQuery())) {
82+
try (final var conn = preparedQueryContainer.connection();
83+
final var stmt = conn.prepareStatement(preparedQueryContainer.preparedQuery())) {
8684
for (int i = 0; i < paramObj.size(); i++) {
87-
statement.setObject(i + 1, paramObj.get(i));
85+
stmt.setObject(i + 1, paramObj.get(i));
8886
}
89-
ResultSet resultSet = statement.executeQuery();
87+
var resultSet = stmt.executeQuery();
9088

9189
return unboxList(resultSetToList(resultSet), isList);
9290
} catch (SQLException e) {

sqrl-server/sqrl-server-core/src/main/java/com/datasqrl/graphql/jdbc/PreparedSqrlQueryImpl.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,6 @@
1717

1818
import com.datasqrl.graphql.server.RootGraphqlModel.PreparedSqrlQuery;
1919
import java.sql.Connection;
20-
import lombok.Value;
2120

22-
@Value
23-
public class PreparedSqrlQueryImpl implements PreparedSqrlQuery<String> {
24-
25-
Connection connection;
26-
String preparedQuery;
27-
}
21+
public record PreparedSqrlQueryImpl(Connection connection, String preparedQuery)
22+
implements PreparedSqrlQuery<String> {}

sqrl-server/sqrl-server-core/src/main/java/com/datasqrl/graphql/server/RootGraphqlModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,6 @@ public <R, C> R accept(ResolvedQueryVisitor<R, C> visitor, C context) {
511511

512512
public interface PreparedSqrlQuery<T> {
513513

514-
T getPreparedQuery();
514+
T preparedQuery();
515515
}
516516
}

0 commit comments

Comments
 (0)