Skip to content

Commit d97d115

Browse files
committed
[IMP] util/pg: allow multiple parallel filters
When exploding a query we may need to add the same parallel filter in multiple places. closes #38 Signed-off-by: Christophe Simonis (chs) <[email protected]>
1 parent ef4aec5 commit d97d115

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

src/base/tests/test_util.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,35 @@ def test_pg_text2html(self, value, expected):
435435
result = cr.fetchone()[0]
436436
self.assertEqual(result, expected)
437437

438+
def test_explode_mult_filters(self):
439+
cr = self.env.cr
440+
queries = util.explode_query_range(
441+
cr,
442+
"""
443+
WITH cte1 AS (
444+
SELECT id,
445+
login
446+
FROM res_users
447+
WHERE {parallel_filter}
448+
), cte2 AS (
449+
SELECT id,
450+
login
451+
FROM res_users
452+
WHERE {parallel_filter}
453+
) SELECT u.login = cte1.login AND u.login = cte2.login
454+
FROM cte1
455+
LEFT JOIN cte2
456+
ON cte2.id = cte1.id
457+
JOIN res_users u
458+
ON u.id = cte1.id
459+
""",
460+
table="res_users",
461+
bucket_size=4,
462+
)
463+
for q in queries:
464+
cr.execute(q)
465+
self.assertTrue(all(x for (x,) in cr.fetchall()))
466+
438467
def test_parallel_rowcount(self):
439468
cr = self.env.cr
440469
cr.execute("SELECT count(*) FROM res_lang")

src/util/pg.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,10 +212,11 @@ def explode_query_range(cr, query, table, alias=None, bucket_size=10000, prefix=
212212
parallel_filter = "{alias}.id IS NOT NULL".format(alias=alias)
213213
return [query.format(parallel_filter=parallel_filter)]
214214

215-
parallel_filter = "{alias}.id BETWEEN %s AND %s".format(alias=alias)
215+
parallel_filter = "{alias}.id BETWEEN %(lower-bound)s AND %(upper-bound)s".format(alias=alias)
216216
query = query.replace("%", "%%").format(parallel_filter=parallel_filter)
217217
return [
218-
cr.mogrify(query, [index, index + bucket_size - 1]).decode() for index in range(min_id, max_id, bucket_size)
218+
cr.mogrify(query, {"lower-bound": index, "upper-bound": index + bucket_size - 1}).decode()
219+
for index in range(min_id, max_id, bucket_size)
219220
]
220221

221222

0 commit comments

Comments
 (0)