diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-03-01 11:59:41 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-03-01 11:59:41 -0500 |
commit | 244bdae43fe71d3aaf80d23eeb6d6d5151329a09 (patch) | |
tree | 5012b5e722deb438618fcf94af1985b0e126c375 | |
parent | c5edbc6fdc611d3c812735d83fe056fbb7d113f5 (diff) | |
download | sqlalchemy-244bdae43fe71d3aaf80d23eeb6d6d5151329a09.tar.gz |
- factor setup into a function
-rw-r--r-- | lib/sqlalchemy/orm/loading.py | 35 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/query.py | 55 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/strategies.py | 20 |
3 files changed, 63 insertions, 47 deletions
diff --git a/lib/sqlalchemy/orm/loading.py b/lib/sqlalchemy/orm/loading.py index c59257039..56b420b80 100644 --- a/lib/sqlalchemy/orm/loading.py +++ b/lib/sqlalchemy/orm/loading.py @@ -218,6 +218,36 @@ def load_on_ident(query, key, return None +def _setup_entity_query( + context, mapper, query_entity, + path, adapter, column_collection, + with_polymorphic=None, only_load_props=None, **kw): + + if with_polymorphic: + poly_properties = mapper._iterate_polymorphic_properties( + with_polymorphic) + else: + poly_properties = mapper._polymorphic_properties + + quick_populators = {} + path.set(context.attributes, "quick_populators", quick_populators) + + for value in poly_properties: + if only_load_props and \ + value.key not in only_load_props: + continue + value.setup( + context, + query_entity, + path, + adapter, + only_load_props=only_load_props, + column_collection=column_collection, + quick_populators=quick_populators, + **kw + ) + + def instance_processor(mapper, context, result, path, adapter, only_load_props=None, refresh_state=None, polymorphic_discriminator=None, @@ -244,7 +274,12 @@ def instance_processor(mapper, context, result, path, adapter, if only_load_props is not None: props = (p for p in props if p.key in only_load_props) + #quick_populators = path.get(context.attributes, "quick_populators", ()) for prop in props: + #if prop.key in quick_populators: + # col = quick_populators[prop.key] + # populators["quick"].append((prop.key, result._getter(col))) + #else: prop.create_row_processor( context, path, mapper, result, adapter, populators) diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 205a5539f..0599f782b 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -3272,25 +3272,21 @@ class _MapperEntity(_QueryEntity): self.mapper._equivalent_columns) if query._primary_entity is self: - _instance = loading.instance_processor( - self.mapper, - context, - result, - self.path, - adapter, - only_load_props=query._only_load_props, - refresh_state=context.refresh_state, - polymorphic_discriminator=self._polymorphic_discriminator - ) + only_load_props = query._only_load_props + refresh_state = context.refresh_state else: - _instance = loading.instance_processor( - self.mapper, - context, - result, - self.path, - adapter, - polymorphic_discriminator=self._polymorphic_discriminator - ) + only_load_props = refresh_state = None + + _instance = loading.instance_processor( + self.mapper, + context, + result, + self.path, + adapter, + only_load_props=only_load_props, + refresh_state=refresh_state, + polymorphic_discriminator=self._polymorphic_discriminator + ) return _instance, self._label_name @@ -3311,24 +3307,11 @@ class _MapperEntity(_QueryEntity): ) ) - if self._with_polymorphic: - poly_properties = self.mapper._iterate_polymorphic_properties( - self._with_polymorphic) - else: - poly_properties = self.mapper._polymorphic_properties - - for value in poly_properties: - if query._only_load_props and \ - value.key not in query._only_load_props: - continue - value.setup( - context, - self, - self.path, - adapter, - only_load_props=query._only_load_props, - column_collection=context.primary_columns - ) + loading._setup_entity_query( + context, self.mapper, self, + self.path, adapter, context.primary_columns, + with_polymorphic=self._with_polymorphic, + only_load_props=query._only_load_props) if self._polymorphic_discriminator is not None and \ self._polymorphic_discriminator \ diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index 0444c63ae..68b6e55e8 100644 --- a/lib/sqlalchemy/orm/strategies.py +++ b/lib/sqlalchemy/orm/strategies.py @@ -139,11 +139,13 @@ class ColumnLoader(LoaderStrategy): def setup_query( self, context, entity, path, loadopt, - adapter, column_collection, **kwargs): + adapter, column_collection, quick_populators=None, **kwargs): for c in self.columns: if adapter: c = adapter.columns[c] column_collection.append(c) + if quick_populators is not None: + quick_populators[self.key] = self.columns[0] def init_class_attribute(self, mapper): self.is_class_level = True @@ -1153,16 +1155,12 @@ class JoinedLoader(AbstractRelationshipLoader): path = path[self.mapper] - for value in self.mapper._iterate_polymorphic_properties( - mappers=with_polymorphic): - value.setup( - context, - entity, - path, - clauses, - parentmapper=self.mapper, - column_collection=add_to_collection, - chained_from_outerjoin=chained_from_outerjoin) + loading._setup_entity_query( + context, self.mapper, entity, + path, clauses, add_to_collection, + with_polymorphic=with_polymorphic, + parentmapper=self.mapper, + chained_from_outerjoin=chained_from_outerjoin) if with_poly_info is not None and \ None in set(context.secondary_columns): |