summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2012-02-11 15:43:05 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2012-02-11 15:43:05 -0500
commit0634ea79b1a23a8b88c886a8a3f434ed300691e2 (patch)
tree68aa780526e321f55b9215544aa409cb1c9179c7 /lib
parent7d693180be8c7f9db79831351751a15d786b86a7 (diff)
downloadsqlalchemy-0634ea79b1a23a8b88c886a8a3f434ed300691e2.tar.gz
many fixes but still can't get heuristics to work as well as what's existing,
tests still failing
Diffstat (limited to 'lib')
-rw-r--r--lib/sqlalchemy/orm/properties.py4
-rw-r--r--lib/sqlalchemy/orm/relationships.py6
-rw-r--r--lib/sqlalchemy/orm/util.py3
-rw-r--r--lib/sqlalchemy/sql/util.py3
4 files changed, 11 insertions, 5 deletions
diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py
index f7a979d0e..17b12e50f 100644
--- a/lib/sqlalchemy/orm/properties.py
+++ b/lib/sqlalchemy/orm/properties.py
@@ -18,7 +18,7 @@ from sqlalchemy.sql import operators, expression, visitors
from sqlalchemy.orm import attributes, dependency, mapper, \
object_mapper, strategies, configure_mappers, relationships
from sqlalchemy.orm.util import CascadeOptions, _class_to_mapper, \
- _orm_annotate, _orm_deannotate
+ _orm_annotate, _orm_deannotate, _orm_full_deannotate
from sqlalchemy.orm.interfaces import MANYTOMANY, MANYTOONE, \
MapperProperty, ONETOMANY, PropComparator, StrategizedProperty
@@ -62,7 +62,7 @@ class ColumnProperty(StrategizedProperty):
"""
self._orig_columns = [expression._labeled(c) for c in columns]
- self.columns = [expression._labeled(_orm_deannotate(c))
+ self.columns = [expression._labeled(_orm_full_deannotate(c))
for c in columns]
self.group = kwargs.pop('group', None)
self.deferred = kwargs.pop('deferred', False)
diff --git a/lib/sqlalchemy/orm/relationships.py b/lib/sqlalchemy/orm/relationships.py
index 413397fda..adba2d542 100644
--- a/lib/sqlalchemy/orm/relationships.py
+++ b/lib/sqlalchemy/orm/relationships.py
@@ -328,7 +328,11 @@ class JoinCondition(object):
_annotate_selfref(lambda col:"foreign" in col._annotations)
else:
def repl(element):
- if self.child_selectable.c.contains_column(element):
+ if self.child_selectable.c.contains_column(element) and \
+ (
+ not self.parent_local_selectable.c.contains_column(element)
+ or self.child_local_selectable.c.contains_column(element)
+ ):
return element._annotate({"remote":True})
self.primaryjoin = visitors.replacement_traverse(
diff --git a/lib/sqlalchemy/orm/util.py b/lib/sqlalchemy/orm/util.py
index f17f675f4..aaff6ce4a 100644
--- a/lib/sqlalchemy/orm/util.py
+++ b/lib/sqlalchemy/orm/util.py
@@ -379,6 +379,9 @@ def _orm_deannotate(element):
values=("_orm_adapt", "parententity")
)
+def _orm_full_deannotate(element):
+ return sql_util._deep_deannotate(element)
+
class _ORMJoin(expression.Join):
"""Extend Join to support ORM constructs as input."""
diff --git a/lib/sqlalchemy/sql/util.py b/lib/sqlalchemy/sql/util.py
index 511a5b0c2..e4e2c00e1 100644
--- a/lib/sqlalchemy/sql/util.py
+++ b/lib/sqlalchemy/sql/util.py
@@ -100,8 +100,7 @@ def visit_binary_product(fn, expr):
"""
stack = []
def visit(element):
- if isinstance(element, (expression.FromClause,
- expression._ScalarSelect)):
+ if isinstance(element, (expression._ScalarSelect)):
# we dont want to dig into correlated subqueries,
# those are just column elements by themselves
yield element