|
1 |
| -from .. import json |
| 1 | +from .. import json, pg |
| 2 | + |
| 3 | +MEMORY_CAP = 2 * 10**8 # 200Mo |
2 | 4 |
|
3 | 5 |
|
4 | 6 | def iter_commands(cr, like_all=(), like_any=()):
|
5 | 7 | if not (bool(like_all) ^ bool(like_any)):
|
6 | 8 | raise ValueError("Please specify `like_all` or `like_any`, not both")
|
7 |
| - cr.execute( |
8 |
| - """ |
9 |
| - SELECT id, |
10 |
| - commands |
11 |
| - FROM spreadsheet_revision |
12 |
| - WHERE commands LIKE {}(%s::text[]) |
13 |
| - """.format("ALL" if like_all else "ANY"), |
14 |
| - [list(like_all or like_any)], |
15 |
| - ) |
16 |
| - for revision_id, data in cr.fetchall(): |
17 |
| - data_loaded = json.loads(data) |
18 |
| - if "commands" not in data_loaded: |
19 |
| - continue |
20 |
| - data_old = json.dumps(data_loaded, sort_keys=True) |
21 |
| - |
22 |
| - changed = yield data_loaded["commands"] |
23 |
| - if changed is None: |
24 |
| - changed = data_old != json.dumps(data_loaded, sort_keys=True) |
25 |
| - |
26 |
| - if changed: |
27 |
| - cr.execute( |
28 |
| - "UPDATE spreadsheet_revision SET commands=%s WHERE id=%s", [json.dumps(data_loaded), revision_id] |
| 9 | + |
| 10 | + with pg.named_cursor(cr, itersize=1) as ncr: |
| 11 | + ncr.execute( |
| 12 | + """ |
| 13 | + WITH buckets AS ( |
| 14 | + SELECT id, |
| 15 | + SUM(LENGTH(commands)) OVER (ORDER BY id) / {memory_cap} AS num, |
| 16 | + commands |
| 17 | + FROM spreadsheet_revision |
| 18 | + WHERE commands LIKE {condition}(%s::text[]) |
| 19 | + ORDER BY id |
29 | 20 | )
|
| 21 | + SELECT ARRAY_AGG(id ORDER BY id), |
| 22 | + ARRAY_AGG(commands ORDER BY id) |
| 23 | + FROM buckets |
| 24 | + GROUP BY num |
| 25 | + """.format(memory_cap=MEMORY_CAP, condition="ALL" if like_all else "ANY"), |
| 26 | + [list(like_all or like_any)], |
| 27 | + ) |
| 28 | + for ids, commands in ncr: |
| 29 | + for revision_id, data in zip(ids, commands): |
| 30 | + data_loaded = json.loads(data) |
| 31 | + if "commands" not in data_loaded: |
| 32 | + continue |
| 33 | + data_old = json.dumps(data_loaded, sort_keys=True) |
| 34 | + |
| 35 | + changed = yield data_loaded["commands"] |
| 36 | + if changed is None: |
| 37 | + changed = data_old != json.dumps(data_loaded, sort_keys=True) |
| 38 | + |
| 39 | + if changed: |
| 40 | + cr.execute( |
| 41 | + "UPDATE spreadsheet_revision SET commands=%s WHERE id=%s", |
| 42 | + [json.dumps(data_loaded), revision_id], |
| 43 | + ) |
30 | 44 |
|
31 | 45 |
|
32 | 46 | def process_commands(cr, callback, *args, **kwargs):
|
|
0 commit comments