amogh-jahagirdar commented on code in PR #11369:
URL: https://github.com/apache/iceberg/pull/11369#discussion_r1809592523


##########
core/src/main/java/org/apache/iceberg/rest/responses/FetchPlanningResultResponse.java:
##########
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iceberg.rest.responses;
+
+import java.util.List;
+import java.util.Map;
+import org.apache.iceberg.DeleteFile;
+import org.apache.iceberg.FileScanTask;
+import org.apache.iceberg.PartitionSpec;
+import org.apache.iceberg.relocated.com.google.common.base.Preconditions;
+import org.apache.iceberg.rest.PlanStatus;
+import org.apache.iceberg.rest.RESTResponse;
+
+public class FetchPlanningResultResponse implements RESTResponse {
+  private PlanStatus planStatus;
+
+  private List<String> planTasks;
+
+  private List<FileScanTask> fileScanTasks;
+
+  private List<DeleteFile> deleteFiles;
+  private Map<Integer, PartitionSpec> specsById;
+
+  private FetchPlanningResultResponse(
+      PlanStatus planStatus,
+      List<String> planTasks,
+      List<FileScanTask> fileScanTasks,
+      List<DeleteFile> deleteFiles,
+      Map<Integer, PartitionSpec> specsById) {
+    this.planStatus = planStatus;
+    this.planTasks = planTasks;
+    this.fileScanTasks = fileScanTasks;
+    this.deleteFiles = deleteFiles;
+    this.specsById = specsById;
+    validate();
+  }
+
+  public PlanStatus planStatus() {
+    return planStatus;
+  }
+
+  public List<String> planTasks() {
+    return planTasks;
+  }
+
+  public List<FileScanTask> fileScanTasks() {
+    return fileScanTasks;
+  }
+
+  public List<DeleteFile> deleteFiles() {
+    return deleteFiles;
+  }
+
+  public Map<Integer, PartitionSpec> specsById() {
+    return specsById;
+  }
+
+  public static Builder builder() {
+    return new Builder();
+  }
+
+  @Override
+  public void validate() {
+    Preconditions.checkArgument(planStatus() != null, "Invalid status: null");
+    Preconditions.checkArgument(
+        planStatus() == PlanStatus.COMPLETED || (planTasks() == null && 
fileScanTasks() == null),
+        "Invalid response: tasks can only be returned in a 'completed' 
status");
+    if (fileScanTasks() == null || fileScanTasks.isEmpty()) {
+      Preconditions.checkArgument(
+          (deleteFiles() == null || deleteFiles().isEmpty()),
+          "Invalid response: deleteFiles should only be returned with 
fileScanTasks that reference them");
+    }
+  }
+
+  public static class Builder {
+    private Builder() {}
+
+    private PlanStatus planStatus;
+
+    private List<String> planTasks;
+
+    private List<FileScanTask> fileScanTasks;
+
+    private List<DeleteFile> deleteFiles;
+    private Map<Integer, PartitionSpec> specsById;
+
+    public Builder withPlanStatus(PlanStatus withPlanStatus) {
+      this.planStatus = withPlanStatus;
+      return this;
+    }
+
+    public Builder withPlanTasks(List<String> withPlanTasks) {
+      this.planTasks = withPlanTasks;
+      return this;
+    }
+
+    public Builder withFileScanTasks(List<FileScanTask> withFileScanTasks) {
+      this.fileScanTasks = withFileScanTasks;
+      return this;
+    }
+
+    public Builder withDeleteFiles(List<DeleteFile> withDeleteFiles) {
+      this.deleteFiles = withDeleteFiles;
+      return this;
+    }
+
+    public Builder withSpecsById(Map<Integer, PartitionSpec> withSpecsById) {

Review Comment:
   Verified it's possible and correct to derive from the file scan tasks, but 
during serialization it'll require a double pass either over the delete files 
or the file scan tasks. I think doing a double pass over delete files in the 
average case is probably better it if we think that the average query will have 
far more data files than delete files. But of course the worst case is there is 
some multiple of delete files compared to data files.
   
   It's nice to not have to pass this to the builder, but I also don't think 
it's worth overcomplicating since a server building the response can easily 
pass in the specs by ID.  I'll update if @rdblue @nastra @danielcweeks feel 
other wise.
   
   Note, this does not actually get serialized it's just used during 
serialization itself when serializing the actual files involved.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org
For additional commands, e-mail: issues-h...@iceberg.apache.org

Reply via email to