diff options
Diffstat (limited to 'lib/sqlalchemy/orm/loading.py')
-rw-r--r-- | lib/sqlalchemy/orm/loading.py | 55 |
1 files changed, 20 insertions, 35 deletions
diff --git a/lib/sqlalchemy/orm/loading.py b/lib/sqlalchemy/orm/loading.py index e728946e3..bcb783480 100644 --- a/lib/sqlalchemy/orm/loading.py +++ b/lib/sqlalchemy/orm/loading.py @@ -12,13 +12,14 @@ the functions here are called primarily by Query, Mapper, as well as some of the attribute loading strategies. """ - +from __future__ import absolute_import from .. import util from . import attributes, exc as orm_exc from ..sql import util as sql_util from .util import _none_set, state_str from .. import exc as sa_exc +import collections _new_runid = util.counter() @@ -212,6 +213,9 @@ def load_on_ident(query, key, except orm_exc.NoResultFound: return None +_populator_struct = collections.namedtuple( + 'populators', ['new', 'existing', 'eager', 'delayed']) + def instance_processor(mapper, context, result, path, adapter, polymorphic_from=None, @@ -254,9 +258,22 @@ def instance_processor(mapper, context, result, path, adapter, identity_class = mapper._identity_class + populators = _populator_struct([], [], [], []) + + props = mapper._props.values() + if only_load_props is not None: + props = (p for p in props if p.key in only_load_props) + + for prop in props: + prop.create_row_processor( + context, path, mapper, result, adapter, populators) + + if populators.delayed: + populators.new.extend(populators.delayed) + (new_populators, existing_populators, - eager_populators) = _populators( - mapper, context, path, result, adapter, only_load_props) + eager_populators) = ( + populators.new, populators.existing, populators.eager) load_path = context.query._current_path + path \ if context.query._current_path.path \ @@ -431,38 +448,6 @@ def instance_processor(mapper, context, result, path, adapter, return _instance -def _populators(mapper, context, path, result, adapter, only_load_props): - """Produce a collection of attribute level row processor - callables.""" - - new_populators = [] - existing_populators = [] - delayed_populators = [] - eager_populators = [] - invoke_eagers = context.invoke_all_eagers - - props = mapper._props.values() - if only_load_props is not None: - props = (p for p in props if p.key in only_load_props) - - for prop in props: - np, ep, dp, gp = prop.create_row_processor( - context, path, mapper, result, adapter) - if np: - new_populators.append((prop.key, np)) - if ep: - existing_populators.append((prop.key, ep)) - if dp: - delayed_populators.append((prop.key, dp)) - if invoke_eagers and gp: - eager_populators.append((prop.key, gp)) - - if delayed_populators: - new_populators += delayed_populators - - return new_populators, existing_populators, eager_populators - - def _configure_subclass_mapper(mapper, context, result, path, adapter): """Produce a mapper level row processor callable factory for mappers inheriting this one.""" |