rdblue commented on code in PR #11831:
URL: https://github.com/apache/iceberg/pull/11831#discussion_r1927919640


##########
api/src/main/java/org/apache/iceberg/types/TypeUtil.java:
##########
@@ -709,6 +709,10 @@ public T map(Types.MapType map, Supplier<T> keyResult, 
Supplier<T> valueResult)
       return null;
     }
 
+    public T variant() {
+      return null;

Review Comment:
   The `map` and `list` methods have been part of the visitors from the start, 
so when new visitors are added, the author decides what to do for `map` and 
`list`. Now that `variant` is added, returning `null` may not be correct.
   
   Consider a simple example:
   ```java
     public static boolean isNestedTypes(Type type) {
       return visit(type, new SchemaVisitor<>() {
         @Override
         public Boolean struct(Types.StructType struct, List<Boolean> 
fieldResults) {
           return true;
         }
   
         @Override
         public Boolean field(Types.NestedField field, Boolean fieldResult) {
           return true;
         }
   
         @Override
         public Boolean list(Types.ListType list, Boolean elementResult) {
           return true;
         }
   
         @Override
         public Boolean map(Types.MapType map, Boolean keyResult, Boolean 
valueResult) {
           return true;
         }
   
         @Override
         public Boolean primitive(Type.PrimitiveType primitive) {
           return false;
         }
       });
     }
   ```
   
   When `TypeVisitor` has the new method added, nothing catches that it is not 
implemented and violates the assumptions of the existing implementation, which 
is that the methods return a `Boolean`. The result would be a 
`NullPointerException` when this code encounters a variant. It would be better 
if the result were a helpful error message that states that the visitor hasn't 
been updated for variant.
   
   In addition, some visitors use `null` to pass information. For example, 
`PruneColumns` returns `null` to indicate that a field was not projected. 
Returning null in those cases could result in incorrect behavior for the 
visitor. That's why I think it would be safer to throw an 
`UnsupportedOperationException` when the visitor does not implement `variant`.



-- 
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