diff --git a/api/src/main/java/org/apache/iceberg/types/PruneColumns.java b/api/src/main/java/org/apache/iceberg/types/PruneColumns.java index 2944ec7bb5c0..2228ea17a2e6 100644 --- a/api/src/main/java/org/apache/iceberg/types/PruneColumns.java +++ b/api/src/main/java/org/apache/iceberg/types/PruneColumns.java @@ -68,10 +68,12 @@ public Type struct(Types.StructType struct, List fieldResults) { sameTypes = false; // signal that some types were altered if (field.isOptional()) { selectedFields.add( - Types.NestedField.optional(field.fieldId(), field.name(), projectedType, field.doc())); + Types.NestedField.optional(field.fieldId(), field.name(), projectedType, field.doc(), + field.initialDefault(), field.writeDefault())); } else { selectedFields.add( - Types.NestedField.required(field.fieldId(), field.name(), projectedType, field.doc())); + Types.NestedField.required(field.fieldId(), field.name(), projectedType, field.doc(), + field.initialDefault(), field.writeDefault())); } } } diff --git a/api/src/main/java/org/apache/iceberg/types/Types.java b/api/src/main/java/org/apache/iceberg/types/Types.java index 1b050725afd0..971019f99377 100644 --- a/api/src/main/java/org/apache/iceberg/types/Types.java +++ b/api/src/main/java/org/apache/iceberg/types/Types.java @@ -415,27 +415,42 @@ public int hashCode() { public static class NestedField implements Serializable { public static NestedField optional(int id, String name, Type type) { - return new NestedField(true, id, name, type, null); + return new NestedField(true, id, name, type, null, null, null); } public static NestedField optional(int id, String name, Type type, String doc) { - return new NestedField(true, id, name, type, doc); + return new NestedField(true, id, name, type, doc, null, null); + } + + public static NestedField optional(int id, String name, Type type, String doc, + Object initialDefault, Object writeDefault) { + return new NestedField(true, id, name, type, doc, initialDefault, writeDefault); } public static NestedField required(int id, String name, Type type) { - return new NestedField(false, id, name, type, null); + return new NestedField(false, id, name, type, null, null, null); } public static NestedField required(int id, String name, Type type, String doc) { - return new NestedField(false, id, name, type, doc); + return new NestedField(false, id, name, type, doc, null, null); + } + + public static NestedField required(int id, String name, Type type, String doc, + Object initialDefault, Object writeDefault) { + return new NestedField(false, id, name, type, doc, initialDefault, writeDefault); } public static NestedField of(int id, boolean isOptional, String name, Type type) { - return new NestedField(isOptional, id, name, type, null); + return new NestedField(isOptional, id, name, type, null, null, null); } public static NestedField of(int id, boolean isOptional, String name, Type type, String doc) { - return new NestedField(isOptional, id, name, type, doc); + return new NestedField(isOptional, id, name, type, doc, null, null); + } + + public static NestedField of(int id, boolean isOptional, String name, Type type, String doc, + Object initialDefault, Object writeDefault) { + return new NestedField(isOptional, id, name, type, doc, initialDefault, writeDefault); } private final boolean isOptional; @@ -443,8 +458,12 @@ public static NestedField of(int id, boolean isOptional, String name, Type type, private final String name; private final Type type; private final String doc; + private final Object initialDefault; + private final Object writeDefault; - private NestedField(boolean isOptional, int id, String name, Type type, String doc) { + private NestedField( + boolean isOptional, int id, String name, Type type, String doc, + Object initialDefault, Object writeDefault) { Preconditions.checkNotNull(name, "Name cannot be null"); Preconditions.checkNotNull(type, "Type cannot be null"); this.isOptional = isOptional; @@ -452,6 +471,8 @@ private NestedField(boolean isOptional, int id, String name, Type type, String d this.name = name; this.type = type; this.doc = doc; + this.initialDefault = initialDefault; + this.writeDefault = writeDefault; } public boolean isOptional() { @@ -462,7 +483,7 @@ public NestedField asOptional() { if (isOptional) { return this; } - return new NestedField(true, id, name, type, doc); + return new NestedField(true, id, name, type, doc, initialDefault, writeDefault); } public boolean isRequired() { @@ -473,7 +494,11 @@ public NestedField asRequired() { if (!isOptional) { return this; } - return new NestedField(false, id, name, type, doc); + return new NestedField(false, id, name, type, doc, initialDefault, writeDefault); + } + + public NestedField withWriteDefault(Object newWriteDefault) { + return new NestedField(isOptional, id, name, type, doc, initialDefault, newWriteDefault); } public int fieldId() { @@ -492,6 +517,14 @@ public String doc() { return doc; } + public Object initialDefault() { + return initialDefault; + } + + public Object writeDefault() { + return writeDefault; + } + @Override public String toString() { return String.format("%d: %s: %s %s",