Skip to content

Commit c6f02ac

Browse files
Address second round review feedback
1 parent 580097c commit c6f02ac

15 files changed

+110
-60
lines changed

core/src/main/java/org/apache/iceberg/TableScanResponseParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public static List<DeleteFile> parseDeleteFiles(
5252
return deleteFilesBuilder.build();
5353
}
5454

55-
return null;
55+
return Lists.newArrayList();
5656
}
5757

5858
public static List<FileScanTask> parseFileScanTasks(
@@ -85,7 +85,7 @@ public static void serializeScanTasks(
8585
JsonGenerator gen)
8686
throws IOException {
8787
Map<String, Integer> deleteFilePathToIndex = Maps.newHashMap();
88-
if (deleteFiles != null) {
88+
if (deleteFiles != null && !deleteFiles.isEmpty()) {
8989
Preconditions.checkArgument(
9090
specsById != null, "Cannot serialize response without specs by ID defined");
9191
gen.writeArrayFieldStart(DELETE_FILES);

core/src/main/java/org/apache/iceberg/rest/PlanStatus.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public String status() {
4040
public static PlanStatus fromName(String status) {
4141
Preconditions.checkArgument(status != null, "Status is null");
4242
try {
43-
return PlanStatus.valueOf(status.toUpperCase(Locale.ENGLISH));
43+
return PlanStatus.valueOf(status.toUpperCase(Locale.ROOT));
4444
} catch (IllegalArgumentException e) {
4545
throw new IllegalArgumentException(String.format("Invalid status name: %s", status), e);
4646
}

core/src/main/java/org/apache/iceberg/rest/RESTSerializers.java

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -545,13 +545,8 @@ static class PlanTableScanResponseDeserializer<T extends PlanTableScanResponse>
545545
@Override
546546
public T deserialize(JsonParser p, DeserializationContext context) throws IOException {
547547
JsonNode jsonNode = p.getCodec().readTree(p);
548-
// Retrieve injectable values
549-
@SuppressWarnings("unchecked")
550-
Map<Integer, PartitionSpec> specsById =
551-
(Map<Integer, PartitionSpec>) context.findInjectableValue("specsById", null, null);
552548

553-
boolean caseSensitive = (boolean) context.findInjectableValue("caseSensitive", null, null);
554-
return (T) PlanTableScanResponseParser.fromJson(jsonNode, specsById, caseSensitive);
549+
return (T) PlanTableScanResponseParser.fromJson(jsonNode, parseScanResponseContext(context));
555550
}
556551
}
557552

@@ -569,13 +564,9 @@ static class FetchPlanningResultResponseDeserializer<T extends FetchPlanningResu
569564
@Override
570565
public T deserialize(JsonParser p, DeserializationContext context) throws IOException {
571566
JsonNode jsonNode = p.getCodec().readTree(p);
572-
// Retrieve injectable values
573-
@SuppressWarnings("unchecked")
574-
Map<Integer, PartitionSpec> specsById =
575-
(Map<Integer, PartitionSpec>) context.findInjectableValue("specsById", null, null);
576567

577-
boolean caseSensitive = (boolean) context.findInjectableValue("caseSensitive", null, null);
578-
return (T) FetchPlanningResultResponseParser.fromJson(jsonNode, specsById, caseSensitive);
568+
return (T)
569+
FetchPlanningResultResponseParser.fromJson(jsonNode, parseScanResponseContext(context));
579570
}
580571
}
581572

@@ -593,13 +584,17 @@ static class FetchScanTaskResponseDeserializer<T extends FetchScanTasksResponse>
593584
@Override
594585
public T deserialize(JsonParser p, DeserializationContext context) throws IOException {
595586
JsonNode jsonNode = p.getCodec().readTree(p);
596-
// Retrieve injectable values
597-
@SuppressWarnings("unchecked")
598-
Map<Integer, PartitionSpec> specsById =
599-
(Map<Integer, PartitionSpec>) context.findInjectableValue("specsById", null, null);
600587

601-
boolean caseSensitive = (boolean) context.findInjectableValue("caseSensitive", null, null);
602-
return (T) FetchScanTasksResponseParser.fromJson(jsonNode, specsById, caseSensitive);
588+
return (T) FetchScanTasksResponseParser.fromJson(jsonNode, parseScanResponseContext(context));
603589
}
604590
}
591+
592+
private static TableScanResponseContext parseScanResponseContext(DeserializationContext context)
593+
throws IOException {
594+
@SuppressWarnings("unchecked")
595+
Map<Integer, PartitionSpec> specsById =
596+
(Map<Integer, PartitionSpec>) context.findInjectableValue("specsById", null, null);
597+
boolean caseSensitive = (boolean) context.findInjectableValue("caseSensitive", null, null);
598+
return new TableScanResponseContext(specsById, caseSensitive);
599+
}
605600
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.apache.iceberg.rest;
20+
21+
import java.util.Map;
22+
import org.apache.iceberg.PartitionSpec;
23+
24+
public class TableScanResponseContext {
25+
private final Map<Integer, PartitionSpec> specsById;
26+
private final boolean caseSensitive;
27+
28+
public TableScanResponseContext(Map<Integer, PartitionSpec> specs, boolean caseSen) {
29+
this.specsById = specs;
30+
this.caseSensitive = caseSen;
31+
}
32+
33+
public Map<Integer, PartitionSpec> getSpecsById() {
34+
return specsById;
35+
}
36+
37+
public boolean isCaseSensitive() {
38+
return caseSensitive;
39+
}
40+
}

core/src/main/java/org/apache/iceberg/rest/requests/PlanTableScanRequest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ private PlanTableScanRequest(
8383
this.startSnapshotId = startSnapshotId;
8484
this.endSnapshotId = endSnapshotId;
8585
this.statsFields = statsFields;
86+
validate();
8687
}
8788

8889
@Override

core/src/main/java/org/apache/iceberg/rest/responses/BaseScanResponse.java renamed to core/src/main/java/org/apache/iceberg/rest/responses/BaseScanTaskResponse.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@
2525
import org.apache.iceberg.PartitionSpec;
2626
import org.apache.iceberg.rest.RESTResponse;
2727

28-
public abstract class BaseScanResponse implements RESTResponse {
28+
public abstract class BaseScanTaskResponse implements RESTResponse {
2929

3030
private final List<String> planTasks;
3131
private final List<FileScanTask> fileScanTasks;
3232
private final List<DeleteFile> deleteFiles;
3333
private final Map<Integer, PartitionSpec> specsById;
3434

35-
protected BaseScanResponse(
35+
protected BaseScanTaskResponse(
3636
List<String> planTasks,
3737
List<FileScanTask> fileScanTasks,
3838
List<DeleteFile> deleteFiles,
@@ -59,7 +59,7 @@ public Map<Integer, PartitionSpec> specsById() {
5959
return specsById;
6060
}
6161

62-
public abstract static class Builder<B extends Builder<B, R>, R extends BaseScanResponse> {
62+
public abstract static class Builder<B extends Builder<B, R>, R extends BaseScanTaskResponse> {
6363
private List<String> planTasks;
6464
private List<FileScanTask> fileScanTasks;
6565
private List<DeleteFile> deleteFiles;

core/src/main/java/org/apache/iceberg/rest/responses/FetchPlanningResultResponse.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import org.apache.iceberg.relocated.com.google.common.base.Preconditions;
2727
import org.apache.iceberg.rest.PlanStatus;
2828

29-
public class FetchPlanningResultResponse extends BaseScanResponse {
29+
public class FetchPlanningResultResponse extends BaseScanTaskResponse {
3030
private final PlanStatus planStatus;
3131

3232
private FetchPlanningResultResponse(
@@ -62,7 +62,7 @@ public void validate() {
6262
}
6363

6464
public static class Builder
65-
extends BaseScanResponse.Builder<Builder, FetchPlanningResultResponse> {
65+
extends BaseScanTaskResponse.Builder<Builder, FetchPlanningResultResponse> {
6666
private Builder() {}
6767

6868
private PlanStatus planStatus;

core/src/main/java/org/apache/iceberg/rest/responses/FetchPlanningResultResponseParser.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
import org.apache.iceberg.FileScanTask;
2828
import org.apache.iceberg.PartitionSpec;
2929
import org.apache.iceberg.TableScanResponseParser;
30+
import org.apache.iceberg.relocated.com.google.common.annotations.VisibleForTesting;
3031
import org.apache.iceberg.relocated.com.google.common.base.Preconditions;
3132
import org.apache.iceberg.rest.PlanStatus;
33+
import org.apache.iceberg.rest.TableScanResponseContext;
3234
import org.apache.iceberg.util.JsonUtil;
3335

3436
public class FetchPlanningResultResponseParser {
@@ -63,26 +65,30 @@ public static void toJson(FetchPlanningResultResponse response, JsonGenerator ge
6365
gen.writeEndObject();
6466
}
6567

66-
public static FetchPlanningResultResponse fromJson(
68+
@VisibleForTesting
69+
static FetchPlanningResultResponse fromJson(
6770
String json, Map<Integer, PartitionSpec> specsById, boolean caseSensitive) {
68-
Preconditions.checkArgument(json != null, "Invalid fetchPlanningResult response: null");
71+
Preconditions.checkArgument(
72+
json != null, "Invalid fetchPlanningResult response: null or empty");
6973
return JsonUtil.parse(
7074
json,
7175
node -> {
72-
return fromJson(node, specsById, caseSensitive);
76+
return fromJson(node, new TableScanResponseContext(specsById, caseSensitive));
7377
});
7478
}
7579

7680
public static FetchPlanningResultResponse fromJson(
77-
JsonNode json, Map<Integer, PartitionSpec> specsById, boolean caseSensitive) {
81+
JsonNode json, TableScanResponseContext context) {
7882
Preconditions.checkArgument(
7983
json != null && !json.isEmpty(), "Invalid fetchPlanningResult response: null or empty");
8084

8185
PlanStatus planStatus = PlanStatus.fromName(JsonUtil.getString(PLAN_STATUS, json));
8286
List<String> planTasks = JsonUtil.getStringListOrNull(PLAN_TASKS, json);
83-
List<DeleteFile> deleteFiles = TableScanResponseParser.parseDeleteFiles(json, specsById);
87+
List<DeleteFile> deleteFiles =
88+
TableScanResponseParser.parseDeleteFiles(json, context.getSpecsById());
8489
List<FileScanTask> fileScanTasks =
85-
TableScanResponseParser.parseFileScanTasks(json, deleteFiles, specsById, caseSensitive);
90+
TableScanResponseParser.parseFileScanTasks(
91+
json, deleteFiles, context.getSpecsById(), context.isCaseSensitive());
8692
return FetchPlanningResultResponse.builder()
8793
.withPlanStatus(planStatus)
8894
.withPlanTasks(planTasks)

core/src/main/java/org/apache/iceberg/rest/responses/FetchScanTasksResponse.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import org.apache.iceberg.PartitionSpec;
2626
import org.apache.iceberg.relocated.com.google.common.base.Preconditions;
2727

28-
public class FetchScanTasksResponse extends BaseScanResponse {
28+
public class FetchScanTasksResponse extends BaseScanTaskResponse {
2929

3030
private FetchScanTasksResponse(
3131
List<String> planTasks,
@@ -53,7 +53,8 @@ public static Builder builder() {
5353
return new Builder();
5454
}
5555

56-
public static class Builder extends BaseScanResponse.Builder<Builder, FetchScanTasksResponse> {
56+
public static class Builder
57+
extends BaseScanTaskResponse.Builder<Builder, FetchScanTasksResponse> {
5758
private Builder() {}
5859

5960
@Override

core/src/main/java/org/apache/iceberg/rest/responses/FetchScanTasksResponseParser.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
import org.apache.iceberg.FileScanTask;
2828
import org.apache.iceberg.PartitionSpec;
2929
import org.apache.iceberg.TableScanResponseParser;
30+
import org.apache.iceberg.relocated.com.google.common.annotations.VisibleForTesting;
3031
import org.apache.iceberg.relocated.com.google.common.base.Preconditions;
32+
import org.apache.iceberg.rest.TableScanResponseContext;
3133
import org.apache.iceberg.util.JsonUtil;
3234

3335
public class FetchScanTasksResponseParser {
@@ -59,24 +61,26 @@ public static void toJson(FetchScanTasksResponse response, JsonGenerator gen) th
5961
gen.writeEndObject();
6062
}
6163

62-
public static FetchScanTasksResponse fromJson(
64+
@VisibleForTesting
65+
static FetchScanTasksResponse fromJson(
6366
String json, Map<Integer, PartitionSpec> specsById, boolean caseSensitive) {
6467
Preconditions.checkArgument(json != null, "Cannot parse fetchScanTasks response from null");
6568
return JsonUtil.parse(
6669
json,
6770
node -> {
68-
return fromJson(node, specsById, caseSensitive);
71+
return fromJson(node, new TableScanResponseContext(specsById, caseSensitive));
6972
});
7073
}
7174

72-
public static FetchScanTasksResponse fromJson(
73-
JsonNode json, Map<Integer, PartitionSpec> specsById, boolean caseSensitive) {
75+
public static FetchScanTasksResponse fromJson(JsonNode json, TableScanResponseContext context) {
7476
Preconditions.checkArgument(
7577
json != null && !json.isEmpty(), "Invalid response: fetchScanTasksResponse null");
7678
List<String> planTasks = JsonUtil.getStringListOrNull(PLAN_TASKS, json);
77-
List<DeleteFile> deleteFiles = TableScanResponseParser.parseDeleteFiles(json, specsById);
79+
List<DeleteFile> deleteFiles =
80+
TableScanResponseParser.parseDeleteFiles(json, context.getSpecsById());
7881
List<FileScanTask> fileScanTasks =
79-
TableScanResponseParser.parseFileScanTasks(json, deleteFiles, specsById, caseSensitive);
82+
TableScanResponseParser.parseFileScanTasks(
83+
json, deleteFiles, context.getSpecsById(), context.isCaseSensitive());
8084
return FetchScanTasksResponse.builder()
8185
.withPlanTasks(planTasks)
8286
.withFileScanTasks(fileScanTasks)

0 commit comments

Comments
 (0)