rdblue commented on code in PR #4619:
URL: https://github.com/apache/iceberg/pull/4619#discussion_r857161003
##########
python/src/iceberg/expressions/base.py:
##########
@@ -147,3 +148,61 @@ def get(self, container: StructProtocol) -> Any:
Any: The value at position `self.position` in the container
"""
return container.get(self.position)
+
+
+class BoundReference:
+ """A reference bound to a field with an accessor for acquiring the field's
value
+
+ Args:
+ field (NestedField): A referenced field in an Iceberg schema
+ accessor (Accessor): An Accessor object to access the value at the
field's position
+ """
+
+ def __init__(self, field: NestedField, accessor: Accessor):
+ self._field = field
+ self._accessor = accessor
+
+ def __str__(self):
+ return f"ref(id={self.field_id})"
+
+ def __repr__(self):
+ return f"BoundReference(field={repr(self.field)},
accessor={repr(self.accessor)})"
+
+ @property
+ def field(self) -> NestedField:
+ """The referenced field"""
+ return self._field
+
+ @property
+ def field_id(self) -> int:
+ """The ID referenced field"""
+ return self._field.field_id
+
+ @property
+ def field_type(self) -> IcebergType:
+ """The type of the referenced field"""
+ return self._field.type
+
+ @property
+ def accessor(self) -> Accessor:
+ """The accessor for retrieving the value at the referenced field's
position"""
+ return self._accessor
+
+ def __eq__(self, other) -> bool:
+ if self is other:
+ return True
+ elif not isinstance(other, BoundReference):
+ return False
+
+ return self.field_id == other.field_id and self.field_type ==
other.field_type
Review Comment:
I don't think I agree with this definition of equality. I think that
equality comes down to the accessor (position) and the type if we were to
implement it... But we may want to be more strict and include the entire field,
not just field ID.
We purposely don't implement equality in the JVM implementation because it's
weird to define what "equals" means for an expression: is it that the
expression produces the same result? Or is it the exact same expression
including the referenced field? If it is the latter, isn't that restrictive
because we don't really need the field in this class, just the type and the
accessor?
Rather than answer those questions, we test using the behavior and the
exposed API fields -- basically just `field_type` and `eval`.
--
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]