Projet

Général

Profil

0001-sql-prefetch-evolutions-in-user-forms-API-38903.patch

Frédéric Péters, 12 janvier 2020 13:49

Télécharger (3,48 ko)

Voir les différences:

Subject: [PATCH] sql: prefetch evolutions in user forms API (#38903)

 tests/test_sql.py | 32 ++++++++++++++++++++++++++++++++
 wcs/api.py        |  6 ++++++
 wcs/sql.py        | 11 +++++++++++
 3 files changed, 49 insertions(+)
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
-