]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed warning that would emit when a complex self-referential
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 11 Sep 2014 15:51:44 +0000 (11:51 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 11 Sep 2014 15:51:44 +0000 (11:51 -0400)
primaryjoin contained functions, while at the same time remote_side
was specified; the warning would suggest setting "remote side".
It now only emits if remote_side isn't present.
fixes #3194

doc/build/changelog/changelog_09.rst
lib/sqlalchemy/orm/relationships.py
test/orm/test_rel_fn.py

index accd827f8f933812553c3e5d9096542dfd26faad..329e054b08316300d7a43c3a489beb04c700b98d 100644 (file)
 .. changelog::
     :version: 0.9.8
 
+    .. change::
+        :tags: bug, orm
+        :versions: 1.0.0
+        :tickets: 3194
+
+        Fixed warning that would emit when a complex self-referential
+        primaryjoin contained functions, while at the same time remote_side
+        was specified; the warning would suggest setting "remote side".
+        It now only emits if remote_side isn't present.
+
     .. change::
         :tags: bug, ext
-        :verions: 1.0.0
+        :versions: 1.0.0
         :tickets: 3191
 
         Fixed bug in ordering list where the order of items would be
index 95ff21444f58e2ba09d0185e511ec7d19a8919de..56a33742d18e66744fed237507b620d146bd31c2 100644 (file)
@@ -2181,7 +2181,7 @@ class JoinCondition(object):
         elif self._local_remote_pairs or self._remote_side:
             self._annotate_remote_from_args()
         elif self._refers_to_parent_table():
-            self._annotate_selfref(lambda col: "foreign" in col._annotations)
+            self._annotate_selfref(lambda col: "foreign" in col._annotations, False)
         elif self._tables_overlap():
             self._annotate_remote_with_overlap()
         else:
@@ -2200,7 +2200,7 @@ class JoinCondition(object):
         self.secondaryjoin = visitors.replacement_traverse(
             self.secondaryjoin, {}, repl)
 
-    def _annotate_selfref(self, fn):
+    def _annotate_selfref(self, fn, remote_side_given):
         """annotate 'remote' in primaryjoin, secondaryjoin
         when the relationship is detected as self-referential.
 
@@ -2215,7 +2215,7 @@ class JoinCondition(object):
                 if fn(binary.right) and not equated:
                     binary.right = binary.right._annotate(
                         {"remote": True})
-            else:
+            elif not remote_side_given:
                 self._warn_non_column_elements()
 
         self.primaryjoin = visitors.cloned_traverse(
@@ -2240,7 +2240,7 @@ class JoinCondition(object):
             remote_side = self._remote_side
 
         if self._refers_to_parent_table():
-            self._annotate_selfref(lambda col: col in remote_side)
+            self._annotate_selfref(lambda col: col in remote_side, True)
         else:
             def repl(element):
                 if element in remote_side:
index f0aa538f465de4bff722189e64ef97777ffce8f1..150b59b7576670f47c74c397d353c5cd982dac8e 100644 (file)
@@ -242,6 +242,22 @@ class _JoinFixtures(object):
             **kw
         )
 
+    def _join_fixture_o2m_composite_selfref_func_remote_side(self, **kw):
+        return relationships.JoinCondition(
+            self.composite_selfref,
+            self.composite_selfref,
+            self.composite_selfref,
+            self.composite_selfref,
+            primaryjoin=and_(
+                self.composite_selfref.c.group_id ==
+                    func.foo(self.composite_selfref.c.group_id),
+                self.composite_selfref.c.parent_id ==
+                    self.composite_selfref.c.id
+            ),
+            remote_side=set([self.composite_selfref.c.parent_id]),
+            **kw
+        )
+
     def _join_fixture_o2m_composite_selfref_func_annotated(self, **kw):
         return relationships.JoinCondition(
             self.composite_selfref,
@@ -729,6 +745,10 @@ class ColumnCollectionsTest(_JoinFixtures, fixtures.TestBase,
             self._join_fixture_o2m_composite_selfref_func
         )
 
+    def test_determine_local_remote_pairs_o2m_composite_selfref_func_rs(self):
+        # no warning
+        self._join_fixture_o2m_composite_selfref_func_remote_side()
+
     def test_determine_local_remote_pairs_o2m_overlap_func_warning(self):
         self._assert_non_simple_warning(
             self._join_fixture_m2o_sub_to_joined_sub_func