From: Mike Bayer Date: Thu, 11 Sep 2014 15:51:44 +0000 (-0400) Subject: - Fixed warning that would emit when a complex self-referential X-Git-Tag: rel_1_0_0b1~194^2~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f98c89d2bee2ae562c79d91aeb96fd55875db917;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - 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. fixes #3194 --- diff --git a/doc/build/changelog/changelog_09.rst b/doc/build/changelog/changelog_09.rst index accd827f8f..329e054b08 100644 --- a/doc/build/changelog/changelog_09.rst +++ b/doc/build/changelog/changelog_09.rst @@ -13,9 +13,19 @@ .. 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 diff --git a/lib/sqlalchemy/orm/relationships.py b/lib/sqlalchemy/orm/relationships.py index 95ff21444f..56a33742d1 100644 --- a/lib/sqlalchemy/orm/relationships.py +++ b/lib/sqlalchemy/orm/relationships.py @@ -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: diff --git a/test/orm/test_rel_fn.py b/test/orm/test_rel_fn.py index f0aa538f46..150b59b757 100644 --- a/test/orm/test_rel_fn.py +++ b/test/orm/test_rel_fn.py @@ -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