Skip to content

Commit f98c89d

Browse files
committed
- 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 sqlalchemy#3194
1 parent 14d2bb0 commit f98c89d

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

doc/build/changelog/changelog_09.rst

+11-1
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,19 @@
1313
.. changelog::
1414
:version: 0.9.8
1515

16+
.. change::
17+
:tags: bug, orm
18+
:versions: 1.0.0
19+
:tickets: 3194
20+
21+
Fixed warning that would emit when a complex self-referential
22+
primaryjoin contained functions, while at the same time remote_side
23+
was specified; the warning would suggest setting "remote side".
24+
It now only emits if remote_side isn't present.
25+
1626
.. change::
1727
:tags: bug, ext
18-
:verions: 1.0.0
28+
:versions: 1.0.0
1929
:tickets: 3191
2030

2131
Fixed bug in ordering list where the order of items would be

lib/sqlalchemy/orm/relationships.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -2181,7 +2181,7 @@ def _annotate_remote(self):
21812181
elif self._local_remote_pairs or self._remote_side:
21822182
self._annotate_remote_from_args()
21832183
elif self._refers_to_parent_table():
2184-
self._annotate_selfref(lambda col: "foreign" in col._annotations)
2184+
self._annotate_selfref(lambda col: "foreign" in col._annotations, False)
21852185
elif self._tables_overlap():
21862186
self._annotate_remote_with_overlap()
21872187
else:
@@ -2200,7 +2200,7 @@ def repl(element):
22002200
self.secondaryjoin = visitors.replacement_traverse(
22012201
self.secondaryjoin, {}, repl)
22022202

2203-
def _annotate_selfref(self, fn):
2203+
def _annotate_selfref(self, fn, remote_side_given):
22042204
"""annotate 'remote' in primaryjoin, secondaryjoin
22052205
when the relationship is detected as self-referential.
22062206
@@ -2215,7 +2215,7 @@ def visit_binary(binary):
22152215
if fn(binary.right) and not equated:
22162216
binary.right = binary.right._annotate(
22172217
{"remote": True})
2218-
else:
2218+
elif not remote_side_given:
22192219
self._warn_non_column_elements()
22202220

22212221
self.primaryjoin = visitors.cloned_traverse(
@@ -2240,7 +2240,7 @@ def _annotate_remote_from_args(self):
22402240
remote_side = self._remote_side
22412241

22422242
if self._refers_to_parent_table():
2243-
self._annotate_selfref(lambda col: col in remote_side)
2243+
self._annotate_selfref(lambda col: col in remote_side, True)
22442244
else:
22452245
def repl(element):
22462246
if element in remote_side:

test/orm/test_rel_fn.py

+20
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,22 @@ def _join_fixture_o2m_composite_selfref_func(self, **kw):
242242
**kw
243243
)
244244

245+
def _join_fixture_o2m_composite_selfref_func_remote_side(self, **kw):
246+
return relationships.JoinCondition(
247+
self.composite_selfref,
248+
self.composite_selfref,
249+
self.composite_selfref,
250+
self.composite_selfref,
251+
primaryjoin=and_(
252+
self.composite_selfref.c.group_id ==
253+
func.foo(self.composite_selfref.c.group_id),
254+
self.composite_selfref.c.parent_id ==
255+
self.composite_selfref.c.id
256+
),
257+
remote_side=set([self.composite_selfref.c.parent_id]),
258+
**kw
259+
)
260+
245261
def _join_fixture_o2m_composite_selfref_func_annotated(self, **kw):
246262
return relationships.JoinCondition(
247263
self.composite_selfref,
@@ -729,6 +745,10 @@ def test_determine_local_remote_pairs_o2m_composite_selfref_func_warning(self):
729745
self._join_fixture_o2m_composite_selfref_func
730746
)
731747

748+
def test_determine_local_remote_pairs_o2m_composite_selfref_func_rs(self):
749+
# no warning
750+
self._join_fixture_o2m_composite_selfref_func_remote_side()
751+
732752
def test_determine_local_remote_pairs_o2m_overlap_func_warning(self):
733753
self._assert_non_simple_warning(
734754
self._join_fixture_m2o_sub_to_joined_sub_func

0 commit comments

Comments
 (0)