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):
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):
"""
- 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
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):
"""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
"""
- def _get_context_strategy(self, context, path):
- key = ('loaderstrategy', _reduce_path(path))
+ def _get_context_strategy(self, context, reduced_path):
+ key = ('loaderstrategy', reduced_path)
if key in context.attributes:
cls = context.attributes[key]
try:
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 = {}
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.
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)
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):
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
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
)
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."""
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))
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."""
#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
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:
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,
else:
_instance = self.mapper._instance_processor(
context,
- (self.path_entity,),
+ self._path,
+ self._reduced_path,
adapter,
polymorphic_discriminator=
self._polymorphic_discriminator)
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:
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
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)
- def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+ def create_row_processor(self, selectcontext, path, reduced_path, mapper, row, adapter):
return None, None, None
class ColumnLoader(LoaderStrategy):
self.columns = self.parent_property.columns
self.is_composite = hasattr(self.parent_property, 'composite_class')
- 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:
active_history = active_history
)
- def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+ def create_row_processor(self, selectcontext, path, reduced_path, mapper, row, adapter):
key = self.key
# look through list of columns represented here
# to see which, if any, is present in the row.
class DeferredColumnLoader(LoaderStrategy):
"""Strategize the loading of a deferred column-based MapperProperty."""
- def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+ def create_row_processor(self, selectcontext, path, reduced_path, mapper, row, adapter):
col = self.columns[0]
if adapter:
col = adapter.columns[col]
if col in row:
return self.parent_property._get_strategy(ColumnLoader).\
create_row_processor(
- selectcontext, path, mapper, row, adapter)
+ selectcontext, path, reduced_path, mapper, row, adapter)
elif not self.is_class_level:
def new_execute(state, dict_, row):
expire_missing=False
)
- def setup_query(self, context, entity, path, adapter,
+ def setup_query(self, context, entity, path, reduced_path, adapter,
only_load_props=None, **kwargs):
if (
self.group is not None and
) or (only_load_props and self.key in only_load_props):
self.parent_property._get_strategy(ColumnLoader).\
setup_query(context, entity,
- path, adapter, **kwargs)
+ path, reduced_path, adapter, **kwargs)
def _load_for_state(self, state, passive):
if not state.key:
typecallable = self.parent_property.collection_class,
)
- def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+ def create_row_processor(self, selectcontext, path, reduced_path, mapper, row, adapter):
def new_execute(state, dict_, row):
state.initialize(self.key)
return new_execute, None, None
else:
return None
- def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+ def create_row_processor(self, selectcontext, path, reduced_path,
+ mapper, row, adapter):
key = self.key
if not self.is_class_level:
def new_execute(state, dict_, row):
init_class_attribute(mapper)
def setup_query(self, context, entity,
- path, adapter, column_collection=None,
+ path, reduced_path, adapter, column_collection=None,
parentmapper=None, **kwargs):
pass
- def create_row_processor(self, context, path, mapper, row, adapter):
+ def create_row_processor(self, context, path, reduced_path, mapper, row, adapter):
def execute(state, dict_, row):
state.get_impl(self.key).get(state, dict_)
init_class_attribute(mapper)
def setup_query(self, context, entity,
- path, adapter, column_collection=None,
+ path, reduced_path, adapter, column_collection=None,
parentmapper=None, **kwargs):
if not context.query._enable_eagerloads:
return
path = path + (self.key, )
-
+ reduced_path = reduced_path + (self.key, )
+
# build up a path indicating the path from the leftmost
# entity to the thing we're subquery loading.
subq_path = context.attributes.get(('subquery_path', None), ())
subq_path = subq_path + path
- reduced_path = interfaces._reduce_path(path)
-
# join-depth / recursion check
if ("loaderstrategy", reduced_path) not in context.attributes:
if self.join_depth:
secondary_synchronize_pairs
]
- def create_row_processor(self, context, path, mapper, row, adapter):
+ def create_row_processor(self, context, path, reduced_path,
+ mapper, row, adapter):
if not self.parent.class_manager[self.key].impl.supports_population:
raise sa_exc.InvalidRequestError(
"'%s' does not support object "
"population - eager loading cannot be applied." %
self)
- path = path + (self.key,)
-
- path = interfaces._reduce_path(path)
+ reduced_path = reduced_path + (self.key,)
- if ('subquery', path) not in context.attributes:
+ if ('subquery', reduced_path) not in context.attributes:
return None, None, None
local_cols, remote_cols = self._local_remote_columns(self.parent_property)
self.mapper._columntoproperty[c].key
for c in remote_cols]
- q = context.attributes[('subquery', path)]
+ q = context.attributes[('subquery', reduced_path)]
collections = dict(
(k, [v[0] for v in v])
self.parent_property.\
_get_strategy(LazyLoader).init_class_attribute(mapper)
- def setup_query(self, context, entity, path, adapter, \
+ def setup_query(self, context, entity, path, reduced_path, adapter, \
column_collection=None, parentmapper=None,
allow_innerjoin=True,
**kwargs):
return
path = path + (self.key,)
-
- reduced_path = interfaces._reduce_path(path)
+ reduced_path = reduced_path + (self.key,)
# check for user-defined eager alias
if ("user_defined_eager_row_processor", reduced_path) in\
context.attributes[
("eager_row_processor", reduced_path)
] = clauses
-
+
+ path += (self.mapper,)
+ reduced_path += (self.mapper.base_mapper,)
+
for value in self.mapper._polymorphic_properties:
value.setup(
context,
entity,
- path + (self.mapper,),
+ path,
+ reduced_path,
clauses,
parentmapper=self.mapper,
column_collection=add_to_collection,
)
- def _create_eager_adapter(self, context, row, adapter, path):
- reduced_path = interfaces._reduce_path(path)
+ def _create_eager_adapter(self, context, row, adapter, path, reduced_path):
if ("user_defined_eager_row_processor", reduced_path) in \
context.attributes:
decorator = context.attributes[
# processor, will cause a degrade to lazy
return False
- def create_row_processor(self, context, path, mapper, row, adapter):
+ def create_row_processor(self, context, path, reduced_path, mapper, row, adapter):
if not self.parent.class_manager[self.key].impl.supports_population:
raise sa_exc.InvalidRequestError(
"'%s' does not support object "
"population - eager loading cannot be applied." %
self)
- path = path + (self.key,)
-
+ our_path = path + (self.key,)
+ our_reduced_path = reduced_path + (self.key,)
eager_adapter = self._create_eager_adapter(
context,
row,
- adapter, path)
+ adapter, our_path,
+ our_reduced_path)
if eager_adapter is not False:
key = self.key
_instance = self.mapper._instance_processor(
- context,
- path + (self.mapper,),
- eager_adapter)
+ context,
+ our_path + (self.mapper,),
+ our_reduced_path + (self.mapper.base_mapper,),
+ eager_adapter)
if not self.uselist:
def new_execute(state, dict_, row):
_get_strategy(LazyLoader).\
create_row_processor(
context, path,
+ reduced_path,
mapper, row, adapter)
log.class_logger(EagerLoader)
def test_update_whereclause(self):
t1.update().where(t1.c.c2==12).compile()
- @profiling.function_call_count(195, versions={'2.4':112,
+ @profiling.function_call_count(178, versions={'2.4':105,
'3.0':208, '3.1':208})
def test_select(self):
s = select([t1], t1.c.c2==t2.c.c1)
# using sqlite3 the C extension took it back up to approx. 1257
# (py2.6)
- @profiling.function_call_count(1194,
+ @profiling.function_call_count(1067,
versions={'2.5':1191, '2.6':1191,
'2.6+cextension':1194,
'2.4': 763}
# this number...
@profiling.function_call_count(6783, {
- '2.6': 7194,
- '2.7': 7298,
- '2.7+cextension': 6894,
+ '2.6': 7094,
+ '2.7': 6250,
+ '2.7+cextension': 6170,
'2.6+cextension': 7184,
})
def test_profile_3_properties(self):
# and this number go down slightly when using the C extensions
- @profiling.function_call_count(22510, {'2.6': 22775, '2.7': 22921})
+ @profiling.function_call_count(19335, {'2.6': 22775, '2.7':20299})
def test_profile_4_expressions(self):
self.test_baseline_4_expressions()
- @profiling.function_call_count(1313, {'2.6+cextension': 1236,
- '2.7+cextension': 1207},
+ @profiling.function_call_count(1172, {'2.6+cextension': 1090,
+ '2.7+cextension': 1086},
variance=0.1)
def test_profile_5_aggregates(self):
self.test_baseline_5_aggregates()
- @profiling.function_call_count(2774)
+ @profiling.function_call_count(2550)
def test_profile_6_editing(self):
self.test_baseline_6_editing()