0001-sql-prefetch-evolutions-in-user-forms-API-38903.patch
tests/test_sql.py | ||
---|---|---|
1350 | 1350 |
objects2 = sql.AnyFormData.select(order_by='receipt_time', limit=10, offset=20) |
1351 | 1351 |
assert [(x.formdef_id, x.id) for x in objects2] == [(x.formdef_id, x.id) for x in objects][20:30] |
1352 | 1352 | |
1353 |
@postgresql |
|
1354 |
def test_load_all_evolutions_on_any_formdata(): |
|
1355 |
drop_formdef_tables() |
|
1356 |
conn, cur = sql.get_connection_and_cursor() |
|
1357 | ||
1358 |
now = datetime.datetime.now() |
|
1359 | ||
1360 |
cnt = 0 |
|
1361 |
for i in range(5): |
|
1362 |
formdef = FormDef() |
|
1363 |
formdef.name = 'test any %d' % i |
|
1364 |
formdef.fields = [] |
|
1365 |
formdef.store() |
|
1366 | ||
1367 |
data_class = formdef.data_class(mode='sql') |
|
1368 |
for j in range(20): |
|
1369 |
formdata = data_class() |
|
1370 |
formdata.just_created() |
|
1371 |
formdata.user_id = '%s' % ((i+j)%11) |
|
1372 |
# set receipt_time to make sure all entries are unique. |
|
1373 |
formdata.receipt_time = (now + datetime.timedelta(seconds=cnt)).timetuple() |
|
1374 |
formdata.status = ['wf-new', 'wf-accepted', 'wf-rejected', 'wf-finished'][(i+j)%4] |
|
1375 |
formdata.store() |
|
1376 |
cnt += 1 |
|
1377 | ||
1378 |
objects = sql.AnyFormData.select() |
|
1379 |
assert len(objects) == 100 |
|
1380 |
assert len([x for x in objects if x._evolution is None]) == 100 |
|
1381 |
sql.AnyFormData.load_all_evolutions(objects) |
|
1382 |
assert len([x for x in objects if x._evolution is not None]) == 100 |
|
1383 | ||
1384 | ||
1353 | 1385 |
@postgresql |
1354 | 1386 |
def test_geoloc_in_global_view(): |
1355 | 1387 |
drop_formdef_tables() |
wcs/api.py | ||
---|---|---|
689 | 689 |
# ignore confidential forms |
690 | 690 |
forms = [x for x in forms if x.readable or not x.formdef.skip_from_360_view] |
691 | 691 | |
692 |
if get_publisher().is_using_postgresql() and not get_request().form.get('full') == 'on': |
|
693 |
# prefetch evolutions to avoid individual loads when computing |
|
694 |
# formdata.get_visible_status(). |
|
695 |
from wcs import sql |
|
696 |
sql.AnyFormData.load_all_evolutions(forms) |
|
697 | ||
692 | 698 |
include_drafts = include_drafts or get_query_flag('include-drafts') |
693 | 699 |
result = [] |
694 | 700 |
for form in forms: |
wcs/sql.py | ||
---|---|---|
2131 | 2131 |
o.geolocations = {'base': {'lon': o.geoloc_base_x, 'lat': o.geoloc_base_y}} |
2132 | 2132 |
return o |
2133 | 2133 | |
2134 |
@classmethod |
|
2135 |
@guard_postgres |
|
2136 |
def load_all_evolutions(cls, formdatas): |
|
2137 |
classes = {} |
|
2138 |
for formdata in formdatas: |
|
2139 |
if not formdata._table_name in classes: |
|
2140 |
classes[formdata._table_name] = [] |
|
2141 |
classes[formdata._table_name].append(formdata) |
|
2142 |
for formdatas in classes.values(): |
|
2143 |
formdatas[0].load_all_evolutions(formdatas) |
|
2144 | ||
2134 | 2145 | |
2135 | 2146 |
def get_period_query(period_start=None, period_end=None, criterias=None, parameters=None): |
2136 | 2147 |
clause = [NotNull('receipt_time')] |
2137 |
- |