Thread: [Sqlalchemy-commits] sqlalchemy: dont need the wrapper here
Brought to you by:
zzzeek
From: <co...@sq...> - 2010-12-21 01:30:45
|
details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/a9e6f68171aa changeset: 7185:a9e6f68171aa user: zzzeek date: Mon Dec 20 17:59:08 2010 -0500 description: dont need the wrapper here Subject: sqlalchemy: callcount reduction details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/d2f82f314edd changeset: 7186:d2f82f314edd user: zzzeek date: Mon Dec 20 19:00:36 2010 -0500 description: callcount reduction Subject: sqlalchemy: - modest inlinings into the MapperProperty.setup/row_processor chain details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/2718e601135f changeset: 7187:2718e601135f user: zzzeek date: Mon Dec 20 20:30:29 2010 -0500 description: - modest inlinings into the MapperProperty.setup/row_processor chain diffstat: lib/sqlalchemy/orm/attributes.py | 6 +- lib/sqlalchemy/orm/descriptor_props.py | 9 ---- lib/sqlalchemy/orm/dynamic.py | 3 - lib/sqlalchemy/orm/interfaces.py | 44 ++++++++++--------- lib/sqlalchemy/orm/mapper.py | 12 +++-- lib/sqlalchemy/orm/query.py | 21 ++++++-- lib/sqlalchemy/orm/strategies.py | 76 +++++++++++++++++---------------- lib/sqlalchemy/sql/expression.py | 34 ++++++++------ lib/sqlalchemy/util/_collections.py | 7 +- test/aaa_profiling/test_compiler.py | 2 +- test/aaa_profiling/test_orm.py | 2 +- test/aaa_profiling/test_zoomark_orm.py | 14 +++--- 12 files changed, 121 insertions(+), 109 deletions(-) diffs (truncated from 697 to 300 lines): diff -r c12ea7f2c98a -r 2718e601135f lib/sqlalchemy/orm/attributes.py --- a/lib/sqlalchemy/orm/attributes.py Mon Dec 20 17:50:57 2010 -0500 +++ b/lib/sqlalchemy/orm/attributes.py Mon Dec 20 20:30:29 2010 -0500 @@ -919,11 +919,11 @@ passive=PASSIVE_NO_FETCH) if uselist: - event.listen(attribute, "on_append", append, retval=False, raw=True) + event.listen(attribute, "on_append", append, retval=True, raw=True) else: - event.listen(attribute, "on_set", set_, retval=False, raw=True) + event.listen(attribute, "on_set", set_, retval=True, raw=True) # TODO: need coverage in test/orm/ of remove event - event.listen(attribute, "on_remove", remove, retval=False, raw=True) + event.listen(attribute, "on_remove", remove, retval=True, raw=True) class History(tuple): """A 3-tuple of added, unchanged and deleted values, diff -r c12ea7f2c98a -r 2718e601135f lib/sqlalchemy/orm/descriptor_props.py --- a/lib/sqlalchemy/orm/descriptor_props.py Mon Dec 20 17:50:57 2010 -0500 +++ b/lib/sqlalchemy/orm/descriptor_props.py Mon Dec 20 20:30:29 2010 -0500 @@ -85,15 +85,6 @@ descriptor.impl = _ProxyImpl(self.key) mapper.class_manager.instrument_attribute(self.key, descriptor) - def setup(self, context, entity, path, adapter, **kwargs): - pass - - def create_row_processor(self, selectcontext, path, mapper, row, adapter): - return None, None, None - - def merge(self, session, source_state, source_dict, - dest_state, dest_dict, load, _recursive): - pass class CompositeProperty(DescriptorProperty): diff -r c12ea7f2c98a -r 2718e601135f lib/sqlalchemy/orm/dynamic.py --- a/lib/sqlalchemy/orm/dynamic.py Mon Dec 20 17:50:57 2010 -0500 +++ b/lib/sqlalchemy/orm/dynamic.py Mon Dec 20 20:30:29 2010 -0500 @@ -35,9 +35,6 @@ query_class=self.parent_property.query_class ) - def create_row_processor(self, selectcontext, path, mapper, row, adapter): - return None, None, None - log.class_logger(DynaLoader) class DynamicAttributeImpl(attributes.AttributeImpl): diff -r c12ea7f2c98a -r 2718e601135f lib/sqlalchemy/orm/interfaces.py --- a/lib/sqlalchemy/orm/interfaces.py Mon Dec 20 17:50:57 2010 -0500 +++ b/lib/sqlalchemy/orm/interfaces.py Mon Dec 20 20:30:29 2010 -0500 @@ -71,7 +71,7 @@ """ - def setup(self, context, entity, path, adapter, **kwargs): + def setup(self, context, entity, path, reduced_path, adapter, **kwargs): """Called by Query for the purposes of constructing a SQL statement. Each MapperProperty associated with the target mapper processes the @@ -81,12 +81,12 @@ pass - def create_row_processor(self, selectcontext, path, mapper, row, adapter): + def create_row_processor(self, selectcontext, path, reduced_path, + mapper, row, adapter): """Return a 3-tuple consisting of three row processing functions. """ - - raise NotImplementedError() + return None, None, None def cascade_iterator(self, type_, state, visited_instances=None, halt_on=None): @@ -166,7 +166,7 @@ """Merge the attribute represented by this ``MapperProperty`` from source to destination object""" - raise NotImplementedError() + pass def compare(self, operator, value): """Return a compare operation for the columns represented by @@ -295,10 +295,10 @@ """ - def _get_context_strategy(self, context, path): - cls = context.attributes.get(('loaderstrategy', - _reduce_path(path)), None) - if cls: + def _get_context_strategy(self, context, reduced_path): + key = ('loaderstrategy', reduced_path) + if key in context.attributes: + cls = context.attributes[key] try: return self._strategies[cls] except KeyError: @@ -317,13 +317,15 @@ strategy.init() return strategy - def setup(self, context, entity, path, adapter, **kwargs): - self._get_context_strategy(context, path + (self.key,)).\ - setup_query(context, entity, path, adapter, **kwargs) + def setup(self, context, entity, path, reduced_path, adapter, **kwargs): + self._get_context_strategy(context, reduced_path + (self.key,)).\ + setup_query(context, entity, path, + reduced_path, adapter, **kwargs) - def create_row_processor(self, context, path, mapper, row, adapter): - return self._get_context_strategy(context, path + (self.key,)).\ - create_row_processor(context, path, mapper, row, adapter) + def create_row_processor(self, context, path, reduced_path, mapper, row, adapter): + return self._get_context_strategy(context, reduced_path + (self.key,)).\ + create_row_processor(context, path, + reduced_path, mapper, row, adapter) def do_init(self): self._strategies = {} @@ -546,9 +548,9 @@ """ return tuple([i % 2 != 0 and - path[i] or - getattr(path[i], 'base_mapper', path[i]) - for i in xrange(len(path))]) + element or + getattr(element, 'base_mapper', element) + for i, element in enumerate(path)]) class LoaderStrategy(object): """Describe the loading behavior of a StrategizedProperty object. @@ -587,10 +589,10 @@ def init_class_attribute(self, mapper): pass - def setup_query(self, context, entity, path, adapter, **kwargs): + def setup_query(self, context, entity, path, reduced_path, adapter, **kwargs): pass - def create_row_processor(self, selectcontext, path, mapper, + def create_row_processor(self, selectcontext, path, reduced_path, mapper, row, adapter): """Return row processing functions which fulfill the contract specified by MapperProperty.create_row_processor. @@ -598,7 +600,7 @@ StrategizedProperty delegates its create_row_processor method directly to this method. """ - raise NotImplementedError() + return None, None, None def __str__(self): return str(self.parent_property) diff -r c12ea7f2c98a -r 2718e601135f lib/sqlalchemy/orm/mapper.py --- a/lib/sqlalchemy/orm/mapper.py Mon Dec 20 17:50:57 2010 -0500 +++ b/lib/sqlalchemy/orm/mapper.py Mon Dec 20 20:30:29 2010 -0500 @@ -2068,7 +2068,7 @@ for state, state_dict, mapper, has_identity, connection in tups: mapper.dispatch.on_after_delete(mapper, connection, state) - def _instance_processor(self, context, path, adapter, + def _instance_processor(self, context, path, reduced_path, adapter, polymorphic_from=None, only_load_props=None, refresh_state=None, polymorphic_discriminator=None): @@ -2087,7 +2087,7 @@ polymorphic_on = self.polymorphic_on polymorphic_instances = util.PopulateDict( self._configure_subclass_mapper( - context, path, adapter) + context, path, reduced_path, adapter) ) version_id_col = self.version_id_col @@ -2115,7 +2115,7 @@ state.load_path = load_path if not new_populators: - self._populators(context, path, row, adapter, + self._populators(context, path, reduced_path, row, adapter, new_populators, existing_populators ) @@ -2307,7 +2307,7 @@ return instance return _instance - def _populators(self, context, path, row, adapter, + def _populators(self, context, path, reduced_path, row, adapter, new_populators, existing_populators): """Produce a collection of attribute level row processor callables.""" @@ -2315,6 +2315,7 @@ for prop in self._props.itervalues(): newpop, existingpop, delayedpop = prop.create_row_processor( context, path, + reduced_path, self, row, adapter) if newpop: new_populators.append((prop.key, newpop)) @@ -2325,7 +2326,7 @@ if delayed_populators: new_populators.extend(delayed_populators) - def _configure_subclass_mapper(self, context, path, adapter): + def _configure_subclass_mapper(self, context, path, reduced_path, adapter): """Produce a mapper level row processor callable factory for mappers inheriting this one.""" @@ -2349,6 +2350,7 @@ #assert mapper.isa(_class_to_mapper(path[-1])) return mapper._instance_processor(context, path[0:-1] + (mapper,), + reduced_path[0:-1] + (mapper.base_mapper,), adapter, polymorphic_from=self) return configure_subclass_mapper diff -r c12ea7f2c98a -r 2718e601135f lib/sqlalchemy/orm/query.py --- a/lib/sqlalchemy/orm/query.py Mon Dec 20 17:50:57 2010 -0500 +++ b/lib/sqlalchemy/orm/query.py Mon Dec 20 20:30:29 2010 -0500 @@ -2567,13 +2567,18 @@ self._polymorphic_discriminator = None self.is_aliased_class = is_aliased_class if is_aliased_class: - self.path_entity = self.entity = self.entity_zero = entity - self._label_name = self.entity._sa_label_name + self.path_entity = self.entity_zero = entity + self._path = (entity,) + self._label_name = self.entity_zero._sa_label_name + self._reduced_path = (self.path_entity, ) else: self.path_entity = mapper - self.entity = self.entity_zero = mapper + self._path = (mapper,) + self._reduced_path = (mapper.base_mapper, ) + self.entity_zero = mapper self._label_name = self.mapper.class_.__name__ + def set_with_polymorphic(self, query, cls_or_mappers, selectable, discriminator): if cls_or_mappers is None: @@ -2642,7 +2647,8 @@ if self.primary_entity: _instance = self.mapper._instance_processor( context, - (self.path_entity,), + self._path, + self._reduced_path, adapter, only_load_props=query._only_load_props, refresh_state=context.refresh_state, @@ -2652,7 +2658,8 @@ else: _instance = self.mapper._instance_processor( context, - (self.path_entity,), + self._path, + self._reduced_path, adapter, polymorphic_discriminator= self._polymorphic_discriminator) @@ -2680,6 +2687,7 @@ self._with_polymorphic) else: poly_properties = self.mapper._polymorphic_properties + for value in poly_properties: if query._only_load_props and \ value.key not in query._only_load_props: @@ -2687,7 +2695,8 @@ value.setup( context, self, - (self.path_entity,), + self._path, + self._reduced_path, adapter, only_load_props=query._only_load_props, column_collection=context.primary_columns diff -r c12ea7f2c98a -r 2718e601135f lib/sqlalchemy/orm/strategies.py --- a/lib/sqlalchemy/orm/strategies.py Mon Dec 20 17:50:57 2010 -0500 +++ b/lib/sqlalchemy/orm/strategies.py Mon Dec 20 20:30:29 2010 -0500 @@ -99,14 +99,14 @@ def init(self): self.columns = self.parent_property.columns - def setup_query(self, context, entity, path, adapter, + def setup_query(self, context, entity, path, reduced_path, adapter, column_collection=None, **kwargs): for c in self.columns: if adapter: c = adapter.columns[c] column_collection.append(c) |