You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@iceberg.apache.org by GitBox <gi...@apache.org> on 2022/02/01 08:06:00 UTC

[GitHub] [iceberg] jun-he commented on a change in pull request #3988: Python: Add Decimal type conversion

jun-he commented on a change in pull request #3988:
URL: https://github.com/apache/iceberg/pull/3988#discussion_r796338920



##########
File path: python_legacy/iceberg/api/types/conversions.py
##########
@@ -53,48 +54,45 @@ class Conversions(object):
                                                                             & 0xFFFFFFFFFFFFFFFF),
                             TypeID.FIXED: lambda type_id, value: value,
                             TypeID.BINARY: lambda type_id, value: value,
-                            # TypeId.DECIMAL: lambda type_var, value: struct.pack(value.quantize(
-                            #     Decimal('.' + "".join(['0' for x in range(0, type_var.scale)]) + '1'))
+                            TypeID.DECIMAL: decimal_to_bytes
                             }
 
-    from_byte_buff_mapping = {TypeID.BOOLEAN: lambda type_id, value: struct.unpack('<?', value)[0] != 0,
-                              TypeID.INTEGER: lambda type_id, value: struct.unpack('<i', value)[0],
-                              TypeID.DATE: lambda type_id, value: struct.unpack('<i', value)[0],
-                              TypeID.LONG: lambda type_id, value: struct.unpack('<q', value)[0],
-                              TypeID.TIME: lambda type_id, value: struct.unpack('<q', value)[0],
-                              TypeID.TIMESTAMP: lambda type_id, value: struct.unpack('<q', value)[0],
-                              TypeID.FLOAT: lambda type_id, value: struct.unpack('<f', value)[0],
-                              TypeID.DOUBLE: lambda type_id, value: struct.unpack('<d', value)[0],
-                              TypeID.STRING: lambda type_id, value: bytes(value).decode("utf-8"),
-                              TypeID.UUID: lambda type_id, value:
+    from_byte_buff_mapping = {TypeID.BOOLEAN: lambda type_var, value: struct.unpack('<?', value)[0] != 0,
+                              TypeID.INTEGER: lambda type_var, value: struct.unpack('<i', value)[0],
+                              TypeID.DATE: lambda type_var, value: struct.unpack('<i', value)[0],
+                              TypeID.LONG: lambda type_var, value: struct.unpack('<q', value)[0],
+                              TypeID.TIME: lambda type_var, value: struct.unpack('<q', value)[0],
+                              TypeID.TIMESTAMP: lambda type_var, value: struct.unpack('<q', value)[0],
+                              TypeID.FLOAT: lambda type_var, value: struct.unpack('<f', value)[0],
+                              TypeID.DOUBLE: lambda type_var, value: struct.unpack('<d', value)[0],
+                              TypeID.STRING: lambda type_var, value: bytes(value).decode("utf-8"),
+                              TypeID.UUID: lambda type_var, value:
                               uuid.UUID(int=struct.unpack('>QQ', value)[0] << 64 | struct.unpack('>QQ', value)[1]),
-                              TypeID.FIXED: lambda type_id, value: value,
-                              TypeID.BINARY: lambda type_id, value: value}
+                              TypeID.FIXED: lambda type_var, value: value,
+                              TypeID.BINARY: lambda type_var, value: value,
+                              TypeID.DECIMAL: lambda type_var, value: Decimal(int.from_bytes(value, 'big', signed=True) * 10**-type_var.scale)
+                              }
 
     @staticmethod
     def from_partition_string(type_var, as_string):
         if as_string is None or Conversions.HIVE_NULL == as_string:
             return None
         part_func = Conversions.value_mapping.get(type_var.type_id)
         if part_func is None:
-            raise RuntimeError("Unsupported type for fromPartitionString: %s" % type_var)
+            raise RuntimeError(f"Unsupported type for from_partition_string: {type_var}")
 
         return part_func(as_string)
 
     @staticmethod
     def to_byte_buffer(type_id, value):

Review comment:
       nit: to be consistent to use `type_var` here as well.




-- 
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-unsubscribe@iceberg.apache.org

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



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