diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-02-28 19:04:40 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-02-28 19:04:40 -0500 |
commit | 43289c86134108f2c99ab0d3a006eda161c310fa (patch) | |
tree | 24b8693a53997c69f6a805d34f654460141aefaf | |
parent | 149bcd108d9ab7b1a49ad728f72af1d3df7a7ecc (diff) | |
download | sqlalchemy-43289c86134108f2c99ab0d3a006eda161c310fa.tar.gz |
- this adds polymorphic
-rw-r--r-- | lib/sqlalchemy/orm/loading.py | 41 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/query.py | 3 | ||||
-rw-r--r-- | lib/sqlalchemy/sql/util.py | 6 |
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'] |