diff options
Diffstat (limited to 'lib/sqlalchemy/orm/path_registry.py')
| -rw-r--r-- | lib/sqlalchemy/orm/path_registry.py | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/sqlalchemy/orm/path_registry.py b/lib/sqlalchemy/orm/path_registry.py index 36c14a672..8a51ded5f 100644 --- a/lib/sqlalchemy/orm/path_registry.py +++ b/lib/sqlalchemy/orm/path_registry.py @@ -393,6 +393,9 @@ class RootRegistry(CreatesToken): f"invalid argument for RootRegistry.__getitem__: {entity}" ) + def _truncate_recursive(self) -> RootRegistry: + return self + if not TYPE_CHECKING: __getitem__ = _getitem @@ -584,6 +587,17 @@ class PropRegistry(PathRegistry): self._default_path_loader_key = self.prop._default_path_loader_key self._loader_key = ("loader", self.natural_path) + def _truncate_recursive(self) -> PropRegistry: + earliest = None + for i, token in enumerate(reversed(self.path[:-1])): + if token is self.prop: + earliest = i + + if earliest is None: + return self + else: + return self.coerce(self.path[0 : -(earliest + 1)]) # type: ignore + @property def entity_path(self) -> AbstractEntityRegistry: assert self.entity is not None @@ -663,6 +677,9 @@ class AbstractEntityRegistry(CreatesToken): # self.natural_path = parent.natural_path + (entity, ) self.natural_path = self.path + def _truncate_recursive(self) -> AbstractEntityRegistry: + return self.parent._truncate_recursive()[self.entity] + @property def root_entity(self) -> _InternalEntityType[Any]: return cast("_InternalEntityType[Any]", self.path[0]) |
