summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2009-10-02 22:25:51 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2009-10-02 22:25:51 +0000
commit1bab6f02ff3f04755c7b0a5d13f3eff4abd3837c (patch)
tree238fc45eaf83ec514cd73cc952da60153729ff47 /lib/sqlalchemy
parentb1c3c2463fcedbe842da92d3b6432d6bc1a4e37c (diff)
downloadsqlalchemy-1bab6f02ff3f04755c7b0a5d13f3eff4abd3837c.tar.gz
merged r6383 of trunk for [ticket:1553]
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/orm/__init__.py2
-rw-r--r--lib/sqlalchemy/orm/interfaces.py7
-rw-r--r--lib/sqlalchemy/orm/mapper.py4
-rw-r--r--lib/sqlalchemy/orm/query.py1
-rw-r--r--lib/sqlalchemy/orm/strategies.py18
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):