Skip to content

Commit 27c5bc8

Browse files
committed
Make reverse multilink expressions work for mysql
1 parent 2d012fb commit 27c5bc8

File tree

2 files changed

+14
-11
lines changed

2 files changed

+14
-11
lines changed

roundup/backends/rdbms_common.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2396,10 +2396,13 @@ def _subselect(self, proptree, parentname=None):
23962396
return '%s.id not in (select %s from %s%s)'%(parentname, nodeid_name,
23972397
multilink_table, w)
23982398

2399-
def _filter_multilink_expression_fallback(
2400-
self, classname, multilink_table, expr):
2399+
def _filter_multilink_expression_fallback(self, proptree, expr):
24012400
'''This is a fallback for database that do not support
24022401
subselects.'''
2402+
classname = proptree.parent.uniqname
2403+
multilink_table = proptree.propclass.table_name
2404+
nid = proptree.propclass.nodeid_name
2405+
lid = proptree.propclass.linkid_name
24032406

24042407
is_valid = expr.evaluate
24052408

@@ -2417,21 +2420,21 @@ def _filter_multilink_expression_fallback(
24172420
# where the multilink table does not have join values
24182421
# needed in evaluation.
24192422

2420-
stmnt = "SELECT c.id, m.linkid FROM _%s c " \
2423+
stmnt = "SELECT c.id, m.%s FROM _%s c " \
24212424
"LEFT OUTER JOIN %s m " \
2422-
"ON c.id = m.nodeid ORDER BY c.id" % (
2423-
classname, multilink_table)
2425+
"ON c.id = m.%s ORDER BY c.id" % (
2426+
lid, classname, multilink_table, nid)
24242427
self.db.sql(stmnt)
24252428

24262429
# collect all multilink items for a class item
2427-
for nid, kw in self.db.sql_fetchiter():
2428-
if nid != last_id:
2430+
for nodeid, kw in self.db.sql_fetchiter():
2431+
if nodeid != last_id:
24292432
if last_id is None:
2430-
last_id = nid
2433+
last_id = nodeid
24312434
else:
24322435
# we have all multilink items -> evaluate!
24332436
if is_valid(kws): append(last_id)
2434-
last_id, kws = nid, []
2437+
last_id, kws = nodeid, []
24352438
if kw is not None:
24362439
kws.append(int(kw))
24372440

@@ -2462,7 +2465,7 @@ def _filter_multilink_expression(self, proptree, v):
24622465
# We heavily rely on subselects. If there is
24632466
# no decent support fall back to slower variant.
24642467
return self._filter_multilink_expression_fallback(
2465-
classname, multilink_table, expr)
2468+
proptree, expr)
24662469

24672470
atom = \
24682471
"%s IN(SELECT %s FROM %s WHERE %s=a.id)" % (

test/db_test_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2038,7 +2038,7 @@ def ls(x):
20382038
self.assertEqual(ls(self.db.user.get('4', ni)), ['1'])
20392039
self.assertEqual(ls(self.db.user.get('5', ni)), ['7'])
20402040

2041-
# Currently only works for sqlite and postgresql
2041+
# Currently only works for sql databases
20422042
@pytest.mark.xfail
20432043
def testFilteringRevMultilinkExpression(self):
20442044
ae, iiter = self.filteringSetupTransitiveSearch('user')

0 commit comments

Comments
 (0)