Skip to content

Commit 5fd9e23

Browse files
authored
fix(java): keep async query responses as bytes (#321)
This updates only the Java async client codegen path to use a vendored native template and keep binary query responses as `byte[]`. The async generator now explicitly uses `openapi-generator-cli 7.20.0`, while the repository default remains `7.12.0` so the existing Python, Rust, sync Java client, and Spring server codegen outputs stay unchanged. The previous async client path could either parse Arrow IPC bytes as JSON (`ARROW1`) or generate `File` handling that mismatched our `--type-mappings file=byte[]` configuration. I regenerated the async client, ran `make check` in `java/` with JDK 17, and ran top-level `make gen` to confirm the spec codegen check stays clean.
1 parent 98a0541 commit 5fd9e23

5 files changed

Lines changed: 845 additions & 42 deletions

File tree

java/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ gen-async-client: clean-async-client
2323
-g java \
2424
-o lance-namespace-async-client \
2525
--ignore-file-override=.async-client-ignore \
26+
--template-dir openapi-templates \
2627
--type-mappings=file=byte[] \
2728
--additional-properties=groupId=org.lance,artifactId=lance-namespace-async-client,artifactVersion=$(VERSION),parentGroupId=org.lance,parentArtifactId=lance-namespace-root,parentVersion=$(VERSION),parentRelativePath=pom.xml,library=native,asyncNative=true,apiPackage=org.lance.namespace.client.async.api,modelPackage=org.lance.namespace.model,hideGenerationTimestamp=true,licenseName=Apache-2.0,licenseUrl=https://www.apache.org/licenses/LICENSE-2.0.txt
2829
rm -rf lance-namespace-async-client/.openapi-generator-ignore
@@ -139,4 +140,4 @@ check: check-apache-client check-async-client check-springboot-server check-core
139140
lint: lint-apache-client lint-async-client lint-springboot-server lint-core lint-core-async
140141

141142
.PHONY: build
142-
build: build-apache-client build-async-client build-springboot-server build-core build-core-async
143+
build: build-apache-client build-async-client build-springboot-server build-core build-core-async

java/lance-namespace-async-client/src/main/java/org/lance/namespace/client/async/api/DataApi.java

Lines changed: 67 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1489,20 +1489,44 @@ public CompletableFuture<byte[]> queryTable(
14891489
HttpRequest.Builder localVarRequestBuilder =
14901490
queryTableRequestBuilder(id, queryTableRequest, delimiter);
14911491
return memberVarHttpClient
1492-
.sendAsync(localVarRequestBuilder.build(), HttpResponse.BodyHandlers.ofString())
1492+
.sendAsync(localVarRequestBuilder.build(), HttpResponse.BodyHandlers.ofInputStream())
14931493
.thenComposeAsync(
14941494
localVarResponse -> {
14951495
if (localVarResponse.statusCode() / 100 != 2) {
1496-
return CompletableFuture.failedFuture(
1497-
getApiException("queryTable", localVarResponse));
1496+
try {
1497+
InputStream responseBody = localVarResponse.body();
1498+
String responseText = null;
1499+
try {
1500+
responseText =
1501+
responseBody == null ? null : new String(responseBody.readAllBytes());
1502+
} finally {
1503+
if (responseBody != null) {
1504+
responseBody.close();
1505+
}
1506+
}
1507+
String message =
1508+
formatExceptionMessage(
1509+
"queryTable", localVarResponse.statusCode(), responseText);
1510+
return CompletableFuture.failedFuture(
1511+
new ApiException(
1512+
localVarResponse.statusCode(),
1513+
message,
1514+
localVarResponse.headers(),
1515+
responseText));
1516+
} catch (IOException e) {
1517+
return CompletableFuture.failedFuture(new ApiException(e));
1518+
}
14981519
}
14991520
try {
1500-
String responseBody = localVarResponse.body();
1501-
return CompletableFuture.completedFuture(
1502-
responseBody == null || responseBody.isBlank()
1503-
? null
1504-
: memberVarObjectMapper.readValue(
1505-
responseBody, new TypeReference<byte[]>() {}));
1521+
InputStream responseBody = localVarResponse.body();
1522+
if (responseBody == null) {
1523+
return CompletableFuture.completedFuture(null);
1524+
}
1525+
try {
1526+
return CompletableFuture.completedFuture(responseBody.readAllBytes());
1527+
} finally {
1528+
responseBody.close();
1529+
}
15061530
} catch (IOException e) {
15071531
return CompletableFuture.failedFuture(new ApiException(e));
15081532
}
@@ -1535,26 +1559,49 @@ public CompletableFuture<ApiResponse<byte[]>> queryTableWithHttpInfo(
15351559
HttpRequest.Builder localVarRequestBuilder =
15361560
queryTableRequestBuilder(id, queryTableRequest, delimiter);
15371561
return memberVarHttpClient
1538-
.sendAsync(localVarRequestBuilder.build(), HttpResponse.BodyHandlers.ofString())
1562+
.sendAsync(localVarRequestBuilder.build(), HttpResponse.BodyHandlers.ofInputStream())
15391563
.thenComposeAsync(
15401564
localVarResponse -> {
1541-
if (memberVarAsyncResponseInterceptor != null) {
1542-
memberVarAsyncResponseInterceptor.accept(localVarResponse);
1543-
}
15441565
if (localVarResponse.statusCode() / 100 != 2) {
1545-
return CompletableFuture.failedFuture(
1546-
getApiException("queryTable", localVarResponse));
1566+
try {
1567+
InputStream responseBody = localVarResponse.body();
1568+
String responseText = null;
1569+
try {
1570+
responseText =
1571+
responseBody == null ? null : new String(responseBody.readAllBytes());
1572+
} finally {
1573+
if (responseBody != null) {
1574+
responseBody.close();
1575+
}
1576+
}
1577+
String message =
1578+
formatExceptionMessage(
1579+
"queryTable", localVarResponse.statusCode(), responseText);
1580+
return CompletableFuture.failedFuture(
1581+
new ApiException(
1582+
localVarResponse.statusCode(),
1583+
message,
1584+
localVarResponse.headers(),
1585+
responseText));
1586+
} catch (IOException e) {
1587+
return CompletableFuture.failedFuture(new ApiException(e));
1588+
}
15471589
}
15481590
try {
1549-
String responseBody = localVarResponse.body();
1591+
InputStream responseBody = localVarResponse.body();
1592+
byte[] responseBytes = null;
1593+
try {
1594+
responseBytes = responseBody == null ? null : responseBody.readAllBytes();
1595+
} finally {
1596+
if (responseBody != null) {
1597+
responseBody.close();
1598+
}
1599+
}
15501600
return CompletableFuture.completedFuture(
15511601
new ApiResponse<byte[]>(
15521602
localVarResponse.statusCode(),
15531603
localVarResponse.headers().map(),
1554-
responseBody == null || responseBody.isBlank()
1555-
? null
1556-
: memberVarObjectMapper.readValue(
1557-
responseBody, new TypeReference<byte[]>() {})));
1604+
responseBytes));
15581605
} catch (IOException e) {
15591606
return CompletableFuture.failedFuture(new ApiException(e));
15601607
}

java/lance-namespace-async-client/src/main/java/org/lance/namespace/client/async/api/TableApi.java

Lines changed: 67 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5415,20 +5415,44 @@ public CompletableFuture<byte[]> queryTable(
54155415
HttpRequest.Builder localVarRequestBuilder =
54165416
queryTableRequestBuilder(id, queryTableRequest, delimiter);
54175417
return memberVarHttpClient
5418-
.sendAsync(localVarRequestBuilder.build(), HttpResponse.BodyHandlers.ofString())
5418+
.sendAsync(localVarRequestBuilder.build(), HttpResponse.BodyHandlers.ofInputStream())
54195419
.thenComposeAsync(
54205420
localVarResponse -> {
54215421
if (localVarResponse.statusCode() / 100 != 2) {
5422-
return CompletableFuture.failedFuture(
5423-
getApiException("queryTable", localVarResponse));
5422+
try {
5423+
InputStream responseBody = localVarResponse.body();
5424+
String responseText = null;
5425+
try {
5426+
responseText =
5427+
responseBody == null ? null : new String(responseBody.readAllBytes());
5428+
} finally {
5429+
if (responseBody != null) {
5430+
responseBody.close();
5431+
}
5432+
}
5433+
String message =
5434+
formatExceptionMessage(
5435+
"queryTable", localVarResponse.statusCode(), responseText);
5436+
return CompletableFuture.failedFuture(
5437+
new ApiException(
5438+
localVarResponse.statusCode(),
5439+
message,
5440+
localVarResponse.headers(),
5441+
responseText));
5442+
} catch (IOException e) {
5443+
return CompletableFuture.failedFuture(new ApiException(e));
5444+
}
54245445
}
54255446
try {
5426-
String responseBody = localVarResponse.body();
5427-
return CompletableFuture.completedFuture(
5428-
responseBody == null || responseBody.isBlank()
5429-
? null
5430-
: memberVarObjectMapper.readValue(
5431-
responseBody, new TypeReference<byte[]>() {}));
5447+
InputStream responseBody = localVarResponse.body();
5448+
if (responseBody == null) {
5449+
return CompletableFuture.completedFuture(null);
5450+
}
5451+
try {
5452+
return CompletableFuture.completedFuture(responseBody.readAllBytes());
5453+
} finally {
5454+
responseBody.close();
5455+
}
54325456
} catch (IOException e) {
54335457
return CompletableFuture.failedFuture(new ApiException(e));
54345458
}
@@ -5461,26 +5485,49 @@ public CompletableFuture<ApiResponse<byte[]>> queryTableWithHttpInfo(
54615485
HttpRequest.Builder localVarRequestBuilder =
54625486
queryTableRequestBuilder(id, queryTableRequest, delimiter);
54635487
return memberVarHttpClient
5464-
.sendAsync(localVarRequestBuilder.build(), HttpResponse.BodyHandlers.ofString())
5488+
.sendAsync(localVarRequestBuilder.build(), HttpResponse.BodyHandlers.ofInputStream())
54655489
.thenComposeAsync(
54665490
localVarResponse -> {
5467-
if (memberVarAsyncResponseInterceptor != null) {
5468-
memberVarAsyncResponseInterceptor.accept(localVarResponse);
5469-
}
54705491
if (localVarResponse.statusCode() / 100 != 2) {
5471-
return CompletableFuture.failedFuture(
5472-
getApiException("queryTable", localVarResponse));
5492+
try {
5493+
InputStream responseBody = localVarResponse.body();
5494+
String responseText = null;
5495+
try {
5496+
responseText =
5497+
responseBody == null ? null : new String(responseBody.readAllBytes());
5498+
} finally {
5499+
if (responseBody != null) {
5500+
responseBody.close();
5501+
}
5502+
}
5503+
String message =
5504+
formatExceptionMessage(
5505+
"queryTable", localVarResponse.statusCode(), responseText);
5506+
return CompletableFuture.failedFuture(
5507+
new ApiException(
5508+
localVarResponse.statusCode(),
5509+
message,
5510+
localVarResponse.headers(),
5511+
responseText));
5512+
} catch (IOException e) {
5513+
return CompletableFuture.failedFuture(new ApiException(e));
5514+
}
54735515
}
54745516
try {
5475-
String responseBody = localVarResponse.body();
5517+
InputStream responseBody = localVarResponse.body();
5518+
byte[] responseBytes = null;
5519+
try {
5520+
responseBytes = responseBody == null ? null : responseBody.readAllBytes();
5521+
} finally {
5522+
if (responseBody != null) {
5523+
responseBody.close();
5524+
}
5525+
}
54765526
return CompletableFuture.completedFuture(
54775527
new ApiResponse<byte[]>(
54785528
localVarResponse.statusCode(),
54795529
localVarResponse.headers().map(),
5480-
responseBody == null || responseBody.isBlank()
5481-
? null
5482-
: memberVarObjectMapper.readValue(
5483-
responseBody, new TypeReference<byte[]>() {})));
5530+
responseBytes));
54845531
} catch (IOException e) {
54855532
return CompletableFuture.failedFuture(new ApiException(e));
54865533
}

0 commit comments

Comments
 (0)