This is an automated email from the ASF dual-hosted git repository.
lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git
The following commit(s) were added to refs/heads/main by this push:
new 2bd8778a3 feat(java/driver/jni): add fluent connection interface
(#4452)
2bd8778a3 is described below
commit 2bd8778a36c0710644b0918581f3d15e55436c3e
Author: David Li <[email protected]>
AuthorDate: Thu Jul 2 15:55:37 2026 -0700
feat(java/driver/jni): add fluent connection interface (#4452)
---
.../adbc/driver/jni/PostgresIntegrationTest.java | 7 +--
.../adbc/driver/jni/SqlServerIntegrationTest.java | 17 +++++++
.../apache/arrow/adbc/driver/jni/JniDriver.java | 53 ++++++++++++++++++++++
3 files changed, 71 insertions(+), 6 deletions(-)
diff --git
a/java/driver/jni-validation/src/test/java/org/apache/arrow/adbc/driver/jni/PostgresIntegrationTest.java
b/java/driver/jni-validation/src/test/java/org/apache/arrow/adbc/driver/jni/PostgresIntegrationTest.java
index facf99507..994651dc7 100644
---
a/java/driver/jni-validation/src/test/java/org/apache/arrow/adbc/driver/jni/PostgresIntegrationTest.java
+++
b/java/driver/jni-validation/src/test/java/org/apache/arrow/adbc/driver/jni/PostgresIntegrationTest.java
@@ -24,7 +24,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -32,7 +31,6 @@ import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.apache.arrow.adbc.core.AdbcConnection;
import org.apache.arrow.adbc.core.AdbcDatabase;
-import org.apache.arrow.adbc.core.AdbcDriver;
import org.apache.arrow.adbc.core.AdbcException;
import org.apache.arrow.adbc.core.AdbcInfoCode;
import org.apache.arrow.adbc.core.AdbcOptions;
@@ -83,10 +81,7 @@ class PostgresIntegrationTest {
System.err.println("Connecting to PostgreSQL with URI: " + URI);
allocator = new RootAllocator();
driver = new JniDriver(allocator);
- Map<String, Object> parameters = new HashMap<>();
- JniDriver.PARAM_DRIVER.set(parameters, "adbc_driver_postgresql");
- AdbcDriver.PARAM_URI.set(parameters, URI);
- db = driver.open(parameters);
+ db = driver.load().driver("adbc_driver_postgresql").uri(URI).open();
conn = db.connect();
}
diff --git
a/java/driver/jni-validation/src/test/java/org/apache/arrow/adbc/driver/jni/SqlServerIntegrationTest.java
b/java/driver/jni-validation/src/test/java/org/apache/arrow/adbc/driver/jni/SqlServerIntegrationTest.java
index ae2ffc751..e895411a3 100644
---
a/java/driver/jni-validation/src/test/java/org/apache/arrow/adbc/driver/jni/SqlServerIntegrationTest.java
+++
b/java/driver/jni-validation/src/test/java/org/apache/arrow/adbc/driver/jni/SqlServerIntegrationTest.java
@@ -118,6 +118,23 @@ class SqlServerIntegrationTest {
assertThat(result.getReader().getVectorSchemaRoot().getVector(0).getObject(0)).isEqualTo(1);
}
}
+
+ // Also use the fluent API
+ var builder =
+ driver
+ .load()
+ .profile("myprofile")
+ .uri(URI)
+ .param(JniDriver.PARAM_PROFILE_SEARCH_PATH,
tempDir.toAbsolutePath().toString());
+ try (final var db = builder.open();
+ final var conn = db.connect();
+ final var stmt = conn.createStatement()) {
+ stmt.setSqlQuery("SELECT 1");
+ try (var result = stmt.executeQuery()) {
+ assertThat(result.getReader().loadNextBatch()).isTrue();
+
assertThat(result.getReader().getVectorSchemaRoot().getVector(0).getObject(0)).isEqualTo(1);
+ }
+ }
}
@Test
diff --git
a/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/JniDriver.java
b/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/JniDriver.java
index 9f33e0193..b61074a2d 100644
---
a/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/JniDriver.java
+++
b/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/JniDriver.java
@@ -99,4 +99,57 @@ public class JniDriver implements AdbcDriver {
NativeDatabaseHandle handle =
JniLoader.INSTANCE.openDatabase(nativeParameters);
return new JniDatabase(allocator, handle);
}
+
+ /** Fluent builder-style interface for loading a driver and establishing a
connection. */
+ public Builder load() {
+ return new Builder();
+ }
+
+ /** Fluent builder-style interface for loading a driver and establishing a
connection. */
+ public final class Builder {
+ private final Map<String, String> nativeParameters;
+
+ Builder() {
+ this.nativeParameters = new HashMap<>();
+ }
+
+ /** Load the given driver. */
+ public Builder driver(String driver) {
+ nativeParameters.put("driver", driver);
+ return this;
+ }
+
+ /** Load the given profile. */
+ public Builder profile(String profile) {
+ nativeParameters.put("profile", profile);
+ return this;
+ }
+
+ /** Connect to the given URI. */
+ public Builder uri(String uri) {
+ nativeParameters.put("uri", uri);
+ return this;
+ }
+
+ /** Set an arbitrary parameter. */
+ public Builder param(String key, String value) {
+ nativeParameters.put(key, value);
+ return this;
+ }
+
+ /** Set an arbitrary parameter. */
+ public Builder param(TypedKey<String> key, String value) {
+ String k = key.getKey();
+ if (k.startsWith("jni.")) {
+ k = k.substring(4);
+ }
+ return param(k, value);
+ }
+
+ /** Load the driver. */
+ public AdbcDatabase open() throws AdbcException {
+ NativeDatabaseHandle handle =
JniLoader.INSTANCE.openDatabase(nativeParameters);
+ return new JniDatabase(JniDriver.this.allocator, handle);
+ }
+ }
}