diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-10-02 22:25:51 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-10-02 22:25:51 +0000 |
| commit | 1bab6f02ff3f04755c7b0a5d13f3eff4abd3837c (patch) | |
| tree | 238fc45eaf83ec514cd73cc952da60153729ff47 /lib/sqlalchemy | |
| parent | b1c3c2463fcedbe842da92d3b6432d6bc1a4e37c (diff) | |
| download | sqlalchemy-1bab6f02ff3f04755c7b0a5d13f3eff4abd3837c.tar.gz | |
merged r6383 of trunk for [ticket:1553]
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/orm/__init__.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/interfaces.py | 7 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/mapper.py | 4 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/query.py | 1 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/strategies.py | 18 |
5 files changed, 18 insertions, 14 deletions
diff --git a/lib/sqlalchemy/orm/__init__.py b/lib/sqlalchemy/orm/__init__.py index 2a20b05ef..357859b54 100644 --- a/lib/sqlalchemy/orm/__init__.py +++ b/lib/sqlalchemy/orm/__init__.py @@ -938,7 +938,7 @@ def contains_eager(*keys, **kwargs): if kwargs: raise exceptions.ArgumentError("Invalid kwargs for contains_eager: %r" % kwargs.keys()) - return (strategies.EagerLazyOption(keys, lazy=False, _only_on_lead=True), strategies.LoadEagerFromAliasOption(keys, alias=alias)) + return (strategies.EagerLazyOption(keys, lazy=False, propagate_to_loaders=False), strategies.LoadEagerFromAliasOption(keys, alias=alias)) @sa_util.accepts_a_list_as_starargs(list_deprecation='pending') def defer(*keys): diff --git a/lib/sqlalchemy/orm/interfaces.py b/lib/sqlalchemy/orm/interfaces.py index 8f0db5352..a145c865d 100644 --- a/lib/sqlalchemy/orm/interfaces.py +++ b/lib/sqlalchemy/orm/interfaces.py @@ -630,6 +630,11 @@ def deserialize_path(path): class MapperOption(object): """Describe a modification to a Query.""" + propagate_to_loaders = False + """if True, indicate this option should be carried along + Query object generated by scalar or object lazy loaders. + """ + def process_query(self, query): pass @@ -643,7 +648,7 @@ class MapperOption(object): class ExtensionOption(MapperOption): """a MapperOption that applies a MapperExtension to a query operation.""" - + def __init__(self, ext): self.ext = ext diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index b8842a5f8..1e9d0c1ab 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -1576,8 +1576,8 @@ class Mapper(object): def populate_state(state, dict_, row, isnew, only_load_props, **flags): if isnew: - if context.options: - state.load_options = context.options + if context.propagate_options: + state.load_options = context.propagate_options if state.load_options: state.load_path = context.query._current_path + path diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index db886dcb8..239f45562 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -2197,6 +2197,7 @@ class QueryContext(object): self.adapter = None self.options = set(query._with_options) + self.propagate_options = self.options.difference(o for o in self.options if not o.propagate_to_loaders) self.attributes = query._attributes.copy() class AliasOption(interfaces.MapperOption): diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index c55d431f8..38073811b 100644 --- a/lib/sqlalchemy/orm/strategies.py +++ b/lib/sqlalchemy/orm/strategies.py @@ -303,6 +303,8 @@ class LoadDeferredColumns(object): return attributes.ATTR_WAS_SET class DeferredOption(StrategizedOption): + propagate_to_loaders = True + def __init__(self, key, defer=False): super(DeferredOption, self).__init__(key) self.defer = defer @@ -314,6 +316,8 @@ class DeferredOption(StrategizedOption): return ColumnLoader class UndeferGroupOption(MapperOption): + propagate_to_loaders = True + def __init__(self, group): self.group = group def process_query(self, query): @@ -794,16 +798,13 @@ class EagerLoader(AbstractRelationLoader): log.class_logger(EagerLoader) class EagerLazyOption(StrategizedOption): - def __init__(self, key, lazy=True, chained=False, mapper=None, _only_on_lead=False): + + def __init__(self, key, lazy=True, chained=False, mapper=None, propagate_to_loaders=True): super(EagerLazyOption, self).__init__(key, mapper) self.lazy = lazy self.chained = chained - self._only_on_lead = _only_on_lead + self.propagate_to_loaders = propagate_to_loaders - def process_query_conditionally(self, query): - if not self._only_on_lead: - StrategizedOption.process_query_conditionally(self, query) - def is_chained(self): return not self.lazy and self.chained @@ -816,6 +817,7 @@ class EagerLazyOption(StrategizedOption): return NoLoader class LoadEagerFromAliasOption(PropertyOption): + def __init__(self, key, alias=None): super(LoadEagerFromAliasOption, self).__init__(key) if alias: @@ -823,10 +825,6 @@ class LoadEagerFromAliasOption(PropertyOption): m, alias, is_aliased_class = mapperutil._entity_info(alias) self.alias = alias - def process_query_conditionally(self, query): - # dont run this option on a secondary load - pass - def process_query_property(self, query, paths, mappers): if self.alias: if isinstance(self.alias, basestring): |
