summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2015-02-28 19:04:40 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2015-02-28 19:04:40 -0500
commit43289c86134108f2c99ab0d3a006eda161c310fa (patch)
tree24b8693a53997c69f6a805d34f654460141aefaf
parent149bcd108d9ab7b1a49ad728f72af1d3df7a7ecc (diff)
downloadsqlalchemy-43289c86134108f2c99ab0d3a006eda161c310fa.tar.gz
- this adds polymorphic
-rw-r--r--lib/sqlalchemy/orm/loading.py41
-rw-r--r--lib/sqlalchemy/orm/query.py3
-rw-r--r--lib/sqlalchemy/sql/util.py6
3 files changed, 26 insertions, 24 deletions
diff --git a/lib/sqlalchemy/orm/loading.py b/lib/sqlalchemy/orm/loading.py
index 33b916fd4..aca6ad60b 100644
--- a/lib/sqlalchemy/orm/loading.py
+++ b/lib/sqlalchemy/orm/loading.py
@@ -29,6 +29,9 @@ 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
@@ -229,9 +232,10 @@ def load_on_ident(query, key,
def _instance_processor(
- mapper, context, column_collection,
+ mapper, context,
query_entity, path, adapter,
- props_toload=None, result=None,
+ props_toload=None,
+ column_collection=None, result=None,
only_load_props=None, refresh_state=None,
polymorphic_discriminator=None,
_polymorphic_from=None):
@@ -402,6 +406,13 @@ def _instance_processor(
return instance
+ if load_is_polymorphic and not _polymorphic_from and not refresh_state:
+ # 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,
+ polymorphic_discriminator, adapter)
+
if result is not None:
props = mapper._props.values()
if only_load_props is not None:
@@ -414,28 +425,13 @@ def _instance_processor(
return _instance
def setup_result(result):
- if context.outer_adapter:
- populators["quick"] = [
- (key, result._getter(context.outer_adapter.columns[col]))
- for key, col in populators["quick"]
- ]
- else:
- populators["quick"] = [
- (key, result._getter(col)) for key, col in populators["quick"]
- ]
+ populators["quick"] = [
+ (key, result._getter(col)) for key, col in populators["quick"]
+ ]
return _instance
return setup_result
- if load_is_polymorphic and not _polymorphic_from and not refresh_state:
- # 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,
- polymorphic_discriminator, adapter)
-
- #return _instance
-
def _populate_full(
context, row, state, dict_, isnew,
@@ -549,8 +545,9 @@ def _decorate_polymorphic_switch(
return None
return _instance_processor(
- sub_mapper, None, context, result[0], None,
- query_entity, path, adapter, _polymorphic_from=mapper)
+ sub_mapper, context,
+ query_entity, path, adapter, result=result[0],
+ _polymorphic_from=mapper)
polymorphic_instances = util.PopulateDict(
configure_subclass_mapper
diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py
index 01fd26827..d039b28e9 100644
--- a/lib/sqlalchemy/orm/query.py
+++ b/lib/sqlalchemy/orm/query.py
@@ -3298,11 +3298,11 @@ class _MapperEntity(_QueryEntity):
_instance = loading._instance_processor(
self.mapper,
context,
- context.primary_columns,
self,
self.path,
adapter,
props_toload=props_toload,
+ column_collection=context.primary_columns,
only_load_props=only_load_props,
refresh_state=refresh_state,
polymorphic_discriminator=self._polymorphic_discriminator
@@ -3325,7 +3325,6 @@ class _MapperEntity(_QueryEntity):
_instance = loading._instance_processor(
self.mapper,
context,
- context.primary_columns,
self,
self.path,
adapter,
diff --git a/lib/sqlalchemy/sql/util.py b/lib/sqlalchemy/sql/util.py
index fbbe15da3..0bd65422f 100644
--- a/lib/sqlalchemy/sql/util.py
+++ b/lib/sqlalchemy/sql/util.py
@@ -600,6 +600,12 @@ class ColumnAdapter(ClauseAdapter):
return c
+ def _adapt_to_resultproxy(self, result):
+ keymap = result._metadata._keymap
+
+ for col in self.selectable.c:
+ keymap[col] = keymap[self.columns[col]]
+
def __getstate__(self):
d = self.__dict__.copy()
del d['columns']