RussellSpitzer commented on code in PR #15994:
URL: https://github.com/apache/iceberg/pull/15994#discussion_r3175330484


##########
api/src/main/java/org/apache/iceberg/udf/UdfType.java:
##########
@@ -0,0 +1,104 @@
+/*
+ * 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.udf;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Represents a UDF data type as defined in the UDF spec. UDF types are based 
on Iceberg types but
+ * intentionally omit field IDs and element nullability. Primitive and 
semi-structured types (e.g.,
+ * "int", "string", "decimal(9,2)", "variant") are represented as type 
strings. Nested types
+ * (struct, list, map) are represented as structured JSON objects.
+ */
+public class UdfType {
+  private final String primitiveType;
+  private final Map<String, Object> nestedType;
+
+  private UdfType(String primitiveType, Map<String, Object> nestedType) {
+    this.primitiveType = primitiveType;
+    this.nestedType = nestedType;
+  }
+
+  /** Creates a UdfType for a primitive or semi-structured type (e.g., "int", 
"decimal(9,2)"). */
+  public static UdfType primitive(String type) {
+    if (type == null) {
+      throw new IllegalArgumentException("Primitive type string must not be 
null");
+    }
+
+    return new UdfType(type, null);
+  }
+
+  /** Creates a UdfType for a nested type (struct, list, or map). */
+  public static UdfType nested(Map<String, Object> type) {
+    if (type == null) {
+      throw new IllegalArgumentException("Nested type map must not be null");
+    }
+
+    return new UdfType(null, type);

Review Comment:
   This is a dangerous spot since a mutable map here could be silently 
modified. Which has some weird downstream implications (= still matching even 
though the map is modified). If you take a look at the Iceberg StructType (or 
friends) each one defensively copies which prevents that sort of thing.
   
   Like
   
   ```java
       private StructType(List<NestedField> fields) {
         Preconditions.checkNotNull(fields, "Field list cannot be null");
         this.fields = new NestedField[fields.size()];
         for (int i = 0; i < this.fields.length; i += 1) {
           this.fields[i] = fields.get(i);
         }
       }
   ```
   
   I think if we shift to the Iceberg Types we can avoid this sort of potential 
issue



-- 
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: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to