| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- # sql/_py_util.py
- # Copyright (C) 2005-2025 the SQLAlchemy authors and contributors
- # <see AUTHORS file>
- #
- # This module is part of SQLAlchemy and is released under
- # the MIT License: https://www.opensource.org/licenses/mit-license.php
- from __future__ import annotations
- import typing
- from typing import Any
- from typing import Dict
- from typing import Tuple
- from typing import Union
- from ..util.typing import Literal
- if typing.TYPE_CHECKING:
- from .cache_key import CacheConst
- class prefix_anon_map(Dict[str, str]):
- """A map that creates new keys for missing key access.
- Considers keys of the form "<ident> <name>" to produce
- new symbols "<name>_<index>", where "index" is an incrementing integer
- corresponding to <name>.
- Inlines the approach taken by :class:`sqlalchemy.util.PopulateDict` which
- is otherwise usually used for this type of operation.
- """
- def __missing__(self, key: str) -> str:
- (ident, derived) = key.split(" ", 1)
- anonymous_counter = self.get(derived, 1)
- self[derived] = anonymous_counter + 1 # type: ignore
- value = f"{derived}_{anonymous_counter}"
- self[key] = value
- return value
- class cache_anon_map(
- Dict[Union[int, "Literal[CacheConst.NO_CACHE]"], Union[Literal[True], str]]
- ):
- """A map that creates new keys for missing key access.
- Produces an incrementing sequence given a series of unique keys.
- This is similar to the compiler prefix_anon_map class although simpler.
- Inlines the approach taken by :class:`sqlalchemy.util.PopulateDict` which
- is otherwise usually used for this type of operation.
- """
- _index = 0
- def get_anon(self, object_: Any) -> Tuple[str, bool]:
- idself = id(object_)
- if idself in self:
- s_val = self[idself]
- assert s_val is not True
- return s_val, True
- else:
- # inline of __missing__
- self[idself] = id_ = str(self._index)
- self._index += 1
- return id_, False
- def __missing__(self, key: int) -> str:
- self[key] = val = str(self._index)
- self._index += 1
- return val
|