summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/loading.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/orm/loading.py')
-rw-r--r--lib/sqlalchemy/orm/loading.py85
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]