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);
+    }
+  }
 }

Reply via email to