rdblue commented on code in PR #4685:
URL: https://github.com/apache/iceberg/pull/4685#discussion_r868705720
##########
python/src/iceberg/schema.py:
##########
@@ -262,10 +267,45 @@ def primitive(self, primitive: PrimitiveType) -> T:
... # pragma: no cover
+@dataclass(init=True, eq=True)
+class Accessor:
+ """An accessor for a specific position in a container that implements the
StructProtocol"""
+
+ position: int
+ inner: Optional["Accessor"] = None
+
+ def __str__(self):
+ return f"Accessor(position={self.position},inner={self.inner})"
+
+ def __repr__(self):
+ return self.__str__()
+
+ def with_inner(self, accessor: "Accessor") -> "Accessor":
+ parent = copy.deepcopy(self)
+ acc = parent
+ while acc.inner:
+ acc = acc.inner
+ acc.inner = accessor
+ return parent
+
+ def get(self, container: StructProtocol) -> Any:
+ """Returns the value at self.position in `container`
+
+ Args:
+ container(StructProtocol): A container to access at position
`self.position`
+
+ Returns:
+ Any: The value at position `self.position` in the container
+ """
+ return container.get(self.position)
+
+
@singledispatch
def visit(obj, visitor: SchemaVisitor[T]) -> T:
"""A generic function for applying a schema visitor to any point within a
schema
+ The function traverses the schema in pre-order fashion
Review Comment:
The purpose of the visitor pattern is to separate the logic that traverses
the tree structure from the logic that operates on it. Iceberg uses the pattern
of using a visitor to build a tree structure quite a bit, and to do that you
almost always want to use post-order so that you can wrap what was returned by
visiting the children of a node.
There are other ways to do it, but you end up keeping state in the visitor
(as in this PR) or needing to pass state down the tree. I think it's cleaner
and easier to work with using the existing pattern. But even if that's not
convincing, I'm concerned about having to rewrite all of the Java visitors to
use different logic, rather than being able to see what they're doing and port
the same logic. That's going to be quite a bit harder.
--
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]