diff options
Diffstat (limited to 'lib/sqlalchemy/orm/loading.py')
-rw-r--r-- | lib/sqlalchemy/orm/loading.py | 85 |
1 files changed, 29 insertions, 56 deletions
diff --git a/lib/sqlalchemy/orm/loading.py b/lib/sqlalchemy/orm/loading.py index aca6ad60b..752ec745d 100644 --- a/lib/sqlalchemy/orm/loading.py +++ b/lib/sqlalchemy/orm/loading.py @@ -29,9 +29,6 @@ def instances(query, cursor, context): context.runid = _new_runid() - if context.outer_adapter: - context.outer_adapter._adapt_to_resultproxy(cursor) - filter_fns = [ent.filter_fn for ent in query._entities] filtered = id in filter_fns @@ -46,21 +43,12 @@ def instances(query, cursor, context): return tuple(fn(x) for x, fn in zip(row, filter_fns)) try: - if context._predefined_statement: - labels, process = list(zip( - *[ - entity.create_row_processor(context, cursor, None) - for entity in query._entities - ] - )) - else: - labels, process = list(zip( - *[ - entity.create_row_processor(context, cursor, loader) - for entity, loader - in zip(query._entities, context.loaders) - ] - )) + labels, process = list(zip( + *[ + entity.row_processor(query, context, cursor) + for entity in query._entities + ] + )) if not single_entity: # TODO: this should be in context, so it can also be cached. @@ -232,11 +220,10 @@ def load_on_ident(query, key, def _instance_processor( - mapper, context, - query_entity, path, adapter, - props_toload=None, - column_collection=None, result=None, + mapper, context, result, + path, adapter, only_load_props=None, refresh_state=None, + quick_populators=None, polymorphic_discriminator=None, _polymorphic_from=None): """Produce a mapper level row processor callable @@ -246,20 +233,6 @@ def _instance_processor( populators = collections.defaultdict(list) - if props_toload: - for prop in props_toload: - - prop.setup( - context, - query_entity, - path, - mapper, - adapter, - column_collection, - populators, - only_load_props=only_load_props, - ) - pk_cols = mapper.primary_key if adapter: @@ -410,27 +383,31 @@ def _instance_processor( # if we are doing polymorphic, dispatch to a different _instance() # method specific to the subclass mapper _instance = _decorate_polymorphic_switch( - _instance, context, mapper, query_entity, path, + _instance, result, context, mapper, path, polymorphic_discriminator, adapter) - if result is not None: - props = mapper._props.values() + props = mapper._props.values() + if False: #quick_populators: + populators["quick"] = [ + (key, result._getter(col)) + for key, col in quick_populators["quick"].items() + ] + for prop in props: + if prop.key in populators["row_processor"]: + strategy, local_populators = \ + populators["row_processor"][prop.key] + prop.create_row_processor( + result, context, path, mapper, adapter, populators, + quick_populators=local_populators + ) + else: 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( result, context, path, mapper, adapter, populators) - return _instance - - def setup_result(result): - populators["quick"] = [ - (key, result._getter(col)) for key, col in populators["quick"] - ] - return _instance - - return setup_result + return _instance def _populate_full( @@ -515,7 +492,7 @@ def _validate_version_id(mapper, state, dict_, row, adapter): def _decorate_polymorphic_switch( - instance_fn, context, mapper, query_entity, + instance_fn, result, context, mapper, path, polymorphic_discriminator, adapter): if polymorphic_discriminator is not None: @@ -531,8 +508,6 @@ def _decorate_polymorphic_switch( if polymorphic_discriminator is not mapper.polymorphic_on: context.primary_columns.append(polymorphic_on) - result = [] - def configure_subclass_mapper(discriminator): try: sub_mapper = mapper.polymorphic_map[discriminator] @@ -545,8 +520,8 @@ def _decorate_polymorphic_switch( return None return _instance_processor( - sub_mapper, context, - query_entity, path, adapter, result=result[0], + sub_mapper, context, result, + path, adapter, _polymorphic_from=mapper) polymorphic_instances = util.PopulateDict( @@ -554,8 +529,6 @@ def _decorate_polymorphic_switch( ) def polymorphic_instance(row): - if not result: - result.append(row) discriminator = row[polymorphic_on] if discriminator is not None: _instance = polymorphic_instances[discriminator] |