Skip to content

Commit 2bd8778

Browse files
authored
feat(java/driver/jni): add fluent connection interface (#4452)
1 parent d63158d commit 2bd8778

3 files changed

Lines changed: 71 additions & 6 deletions

File tree

java/driver/jni-validation/src/test/java/org/apache/arrow/adbc/driver/jni/PostgresIntegrationTest.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,13 @@
2424
import java.io.ByteArrayInputStream;
2525
import java.io.ByteArrayOutputStream;
2626
import java.nio.charset.StandardCharsets;
27-
import java.util.HashMap;
2827
import java.util.HashSet;
2928
import java.util.List;
3029
import java.util.Map;
3130
import java.util.stream.Collectors;
3231
import java.util.stream.IntStream;
3332
import org.apache.arrow.adbc.core.AdbcConnection;
3433
import org.apache.arrow.adbc.core.AdbcDatabase;
35-
import org.apache.arrow.adbc.core.AdbcDriver;
3634
import org.apache.arrow.adbc.core.AdbcException;
3735
import org.apache.arrow.adbc.core.AdbcInfoCode;
3836
import org.apache.arrow.adbc.core.AdbcOptions;
@@ -83,10 +81,7 @@ void beforeEach() throws Exception {
8381
System.err.println("Connecting to PostgreSQL with URI: " + URI);
8482
allocator = new RootAllocator();
8583
driver = new JniDriver(allocator);
86-
Map<String, Object> parameters = new HashMap<>();
87-
JniDriver.PARAM_DRIVER.set(parameters, "adbc_driver_postgresql");
88-
AdbcDriver.PARAM_URI.set(parameters, URI);
89-
db = driver.open(parameters);
84+
db = driver.load().driver("adbc_driver_postgresql").uri(URI).open();
9085
conn = db.connect();
9186
}
9287

java/driver/jni-validation/src/test/java/org/apache/arrow/adbc/driver/jni/SqlServerIntegrationTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,23 @@ void profile(@TempDir Path tempDir) throws Exception {
118118
assertThat(result.getReader().getVectorSchemaRoot().getVector(0).getObject(0)).isEqualTo(1);
119119
}
120120
}
121+
122+
// Also use the fluent API
123+
var builder =
124+
driver
125+
.load()
126+
.profile("myprofile")
127+
.uri(URI)
128+
.param(JniDriver.PARAM_PROFILE_SEARCH_PATH, tempDir.toAbsolutePath().toString());
129+
try (final var db = builder.open();
130+
final var conn = db.connect();
131+
final var stmt = conn.createStatement()) {
132+
stmt.setSqlQuery("SELECT 1");
133+
try (var result = stmt.executeQuery()) {
134+
assertThat(result.getReader().loadNextBatch()).isTrue();
135+
assertThat(result.getReader().getVectorSchemaRoot().getVector(0).getObject(0)).isEqualTo(1);
136+
}
137+
}
121138
}
122139

123140
@Test

java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/JniDriver.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,57 @@ public AdbcDatabase open(Map<String, Object> parameters) throws AdbcException {
9999
NativeDatabaseHandle handle = JniLoader.INSTANCE.openDatabase(nativeParameters);
100100
return new JniDatabase(allocator, handle);
101101
}
102+
103+
/** Fluent builder-style interface for loading a driver and establishing a connection. */
104+
public Builder load() {
105+
return new Builder();
106+
}
107+
108+
/** Fluent builder-style interface for loading a driver and establishing a connection. */
109+
public final class Builder {
110+
private final Map<String, String> nativeParameters;
111+
112+
Builder() {
113+
this.nativeParameters = new HashMap<>();
114+
}
115+
116+
/** Load the given driver. */
117+
public Builder driver(String driver) {
118+
nativeParameters.put("driver", driver);
119+
return this;
120+
}
121+
122+
/** Load the given profile. */
123+
public Builder profile(String profile) {
124+
nativeParameters.put("profile", profile);
125+
return this;
126+
}
127+
128+
/** Connect to the given URI. */
129+
public Builder uri(String uri) {
130+
nativeParameters.put("uri", uri);
131+
return this;
132+
}
133+
134+
/** Set an arbitrary parameter. */
135+
public Builder param(String key, String value) {
136+
nativeParameters.put(key, value);
137+
return this;
138+
}
139+
140+
/** Set an arbitrary parameter. */
141+
public Builder param(TypedKey<String> key, String value) {
142+
String k = key.getKey();
143+
if (k.startsWith("jni.")) {
144+
k = k.substring(4);
145+
}
146+
return param(k, value);
147+
}
148+
149+
/** Load the driver. */
150+
public AdbcDatabase open() throws AdbcException {
151+
NativeDatabaseHandle handle = JniLoader.INSTANCE.openDatabase(nativeParameters);
152+
return new JniDatabase(JniDriver.this.allocator, handle);
153+
}
154+
}
102155
}

0 commit comments

Comments
 (0)