Fokko commented on code in PR #6437:
URL: https://github.com/apache/iceberg/pull/6437#discussion_r1056877937
##########
python/pyiceberg/schema.py:
##########
@@ -1046,3 +1055,79 @@ def _project_map(map_type: MapType, value_result:
IcebergType) -> MapType:
value_type=value_result,
value_required=map_type.value_required,
)
+
+
+@singledispatch
+def promote(file_type: IcebergType, read_type: IcebergType) -> IcebergType:
+ """Promotes reading a file type to a read type
+
+ Args:
+ file_type (IcebergType): The type of the Avro file
+ read_type (IcebergType): The requested read type
+
+ Raises:
+ ResolveException: If attempting to resolve an unrecognized object type
+ """
+ raise ResolveException(f"Cannot promote {file_type} to {read_type}")
+
+
[email protected](IntegerType)
+def _(file_type: IntegerType, read_type: IcebergType) -> IcebergType:
+ if isinstance(read_type, LongType):
+ # Ints/Longs are binary compatible in Avro, so this is okay
+ return read_type
+ else:
+ raise ResolveException(f"Cannot promote an int to {read_type}")
+
+
[email protected](FloatType)
+def _(file_type: FloatType, read_type: IcebergType) -> IcebergType:
+ if isinstance(read_type, DoubleType):
+ # A double type is wider
+ return read_type
+ else:
+ raise ResolveException(f"Cannot promote an float to {read_type}")
+
+
[email protected](StringType)
+def _(file_type: StringType, read_type: IcebergType) -> IcebergType:
+ if isinstance(read_type, BinaryType):
+ return read_type
+ else:
+ raise ResolveException(f"Cannot promote an string to {read_type}")
+
+
[email protected](BinaryType)
+def _(file_type: BinaryType, read_type: IcebergType) -> IcebergType:
+ if isinstance(read_type, StringType):
+ return read_type
+ else:
+ raise ResolveException(f"Cannot promote an binary to {read_type}")
+
+
[email protected](DecimalType)
+def _(file_type: DecimalType, read_type: IcebergType) -> IcebergType:
+ if isinstance(read_type, DecimalType):
+ if file_type.precision <= read_type.precision and file_type.scale ==
file_type.scale:
+ return read_type
+ else:
+ raise ResolveException(f"Cannot reduce precision from {file_type}
to {read_type}")
+ else:
+ raise ResolveException(f"Cannot promote an decimal to {read_type}")
+
+
[email protected](StructType)
+def _(file_type: StructType, read_type: IcebergType) -> IcebergType:
Review Comment:
Yes, we need this because we call it from the `field` method in the visitor,
and a field also can have a StructType. We don't have enough information to
call this on the primitive method.
--
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]