add compose cache to Mapper
This commit is contained in:
parent
9b7a793191
commit
545c20e26f
@ -19,10 +19,6 @@ class Accessor[C: Component](metaclass=ABCMeta):
|
|||||||
Access wrapper class for complex queries and easy integration with Composer tables.
|
Access wrapper class for complex queries and easy integration with Composer tables.
|
||||||
Implements high-level access to things like common constrained SELECT queries.
|
Implements high-level access to things like common constrained SELECT queries.
|
||||||
|
|
||||||
Parameters:
|
|
||||||
engine: SQLAlchemy engine to use for queries. Engine is initialized dynamically as
|
|
||||||
a property (based on the config) if not provided
|
|
||||||
|
|
||||||
Instance variables:
|
Instance variables:
|
||||||
access_log: time-indexed log of access queries performed
|
access_log: time-indexed log of access queries performed
|
||||||
'''
|
'''
|
||||||
|
@ -105,7 +105,7 @@ class Collector[C: Component]:
|
|||||||
|
|
||||||
return receipt
|
return receipt
|
||||||
|
|
||||||
def collect_inserts(self, receipts:list[str]|None=None):
|
def collect_inserts(self, receipts: list[str] | None = None):
|
||||||
'''
|
'''
|
||||||
Collect insert-ready dictionaries for the core primitive schema. This method is
|
Collect insert-ready dictionaries for the core primitive schema. This method is
|
||||||
effectively a light wrapper around the File and Note-based collection logic
|
effectively a light wrapper around the File and Note-based collection logic
|
||||||
|
43
co3/indexers/relational.py
Normal file
43
co3/indexers/relational.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
from co3.indexer import Indexer
|
||||||
|
|
||||||
|
|
||||||
|
class RelationalIndexer(Indexer):
|
||||||
|
_cls_select_cache = {}
|
||||||
|
_cls_groupby_cache = defaultdict(dict)
|
||||||
|
|
||||||
|
def __init__(self, accessor, cache_select=True, cache_groupby=True):
|
||||||
|
self.accessor = accessor
|
||||||
|
|
||||||
|
# set instance caches; if remains None, methods can't index
|
||||||
|
self._select_cache = None
|
||||||
|
self._groupby_cache = None
|
||||||
|
|
||||||
|
if cache_groupby and not cache_select:
|
||||||
|
raise ValueError('cannot cache groupbys without select caching enabled')
|
||||||
|
|
||||||
|
if cache_select:
|
||||||
|
self._select_cache = self._cls_select_cache
|
||||||
|
|
||||||
|
if cache_groupby:
|
||||||
|
self._groupby_cache = self._cls_groupby_cache
|
||||||
|
|
||||||
|
self._access_lock = threading.Lock()
|
||||||
|
|
||||||
|
def cache_clear(self, group_by_only=False):
|
||||||
|
self._groupby_cache.clear()
|
||||||
|
if not group_by_only:
|
||||||
|
self._select_cache.clear()
|
||||||
|
|
||||||
|
def cache_block(
|
||||||
|
self,
|
||||||
|
table,
|
||||||
|
**kwargs,
|
||||||
|
):
|
||||||
|
'''
|
||||||
|
Provide a user-friendly, dynamically re-indexable
|
||||||
|
'''
|
||||||
|
return CacheBlock(
|
||||||
|
indexer = self,
|
||||||
|
table = table,
|
||||||
|
**kwargs,
|
||||||
|
)
|
@ -388,6 +388,12 @@ class ComposableMapper[C: ComposableComponent](Mapper[C]):
|
|||||||
automatic discovery structures could help constrain schema definitions to be
|
automatic discovery structures could help constrain schema definitions to be
|
||||||
more in-line with the CO3 operational model. That all being said, this is a
|
more in-line with the CO3 operational model. That all being said, this is a
|
||||||
large amount of complexity and should likely be avoided until necessary.
|
large amount of complexity and should likely be avoided until necessary.
|
||||||
|
|
||||||
|
.. admonition:: Instance variables
|
||||||
|
|
||||||
|
- ``type_compose_cache``: index for previously computed compositions. This index
|
||||||
|
is reset if either ``attach`` or ``attach_many`` is
|
||||||
|
called to allow possible new type propagation.
|
||||||
'''
|
'''
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
@ -400,6 +406,18 @@ class ComposableMapper[C: ComposableComponent](Mapper[C]):
|
|||||||
self.attr_compose_map = attr_compose_map
|
self.attr_compose_map = attr_compose_map
|
||||||
self.coll_compose_map = coll_compose_map
|
self.coll_compose_map = coll_compose_map
|
||||||
|
|
||||||
|
self.type_compose_cache = {}
|
||||||
|
|
||||||
|
def attach(self, *args, **kwargs):
|
||||||
|
self.type_compose_cache = {}
|
||||||
|
|
||||||
|
super().attach(*args, **kwargs)
|
||||||
|
|
||||||
|
def attach_many(self, *args, **kwargs):
|
||||||
|
self.type_compose_cache = {}
|
||||||
|
|
||||||
|
super().attach_many(*args, **kwargs)
|
||||||
|
|
||||||
def compose(
|
def compose(
|
||||||
self,
|
self,
|
||||||
co3_ref: CO3 | type[CO3],
|
co3_ref: CO3 | type[CO3],
|
||||||
@ -426,6 +444,9 @@ class ComposableMapper[C: ComposableComponent](Mapper[C]):
|
|||||||
if isinstance(co3_ref, CO3):
|
if isinstance(co3_ref, CO3):
|
||||||
type_ref = co3_ref.__class__
|
type_ref = co3_ref.__class__
|
||||||
|
|
||||||
|
if type_ref in self.type_compose_cache:
|
||||||
|
return self.type_compose_cache[type_ref]
|
||||||
|
|
||||||
comp_agg = None
|
comp_agg = None
|
||||||
last_attr_comp = None
|
last_attr_comp = None
|
||||||
last_coll_comps = None
|
last_coll_comps = None
|
||||||
@ -489,4 +510,6 @@ class ComposableMapper[C: ComposableComponent](Mapper[C]):
|
|||||||
last_attr_comp = attr_comp
|
last_attr_comp = attr_comp
|
||||||
last_coll_comps = coll_list
|
last_coll_comps = coll_list
|
||||||
|
|
||||||
|
self.type_compose_cache[type_ref] = comp_agg
|
||||||
|
|
||||||
return comp_agg
|
return comp_agg
|
||||||
|
Loading…
Reference in New Issue
Block a user