Projet

Général

Profil

0001-sql-use-setweight-on-fts-strings-16252.patch

Lauréline Guérin, 15 mars 2022 16:59

Télécharger (6,81 ko)

Voir les différences:

Subject: [PATCH] sql: use setweight on fts strings (#16252)

 wcs/sql.py | 80 ++++++++++++++++++++++++++++++++----------------------
 1 file changed, 47 insertions(+), 33 deletions(-)
wcs/sql.py
2357 2357
                cur.execute(sql_statement, sql_dict)
2358 2358
                evo._sql_id = cur.fetchone()[0]
2359 2359

  
2360
        fts_strings = [str(self.id), self.get_display_id()]
2361
        fts_strings.append(self._formdef.name)
2360
        fts_strings = []
2361
        fts_strings.append(('A', str(self.id)))
2362
        fts_strings.append(('A', self.get_display_id()))
2363
        fts_strings.append(('C', self._formdef.name))
2362 2364
        if self.tracking_code:
2363
            fts_strings.append(self.tracking_code)
2365
            fts_strings.append(('A', self.tracking_code))
2364 2366

  
2365 2367
        def get_all_fields():
2366 2368
            for field in self._formdef.get_all_fields():
......
2385 2387
            elif field.key in ('item', 'items'):
2386 2388
                value = data.get('%s_display' % field.id)
2387 2389
            if value:
2390
                weight = 'C'
2391
                if field.include_in_listing:
2392
                    weight = 'B'
2388 2393
                if isinstance(value, str) and len(value) < 10000:
2389 2394
                    # avoid overlong strings, typically base64-encoded values
2390
                    fts_strings.append(value)
2395
                    fts_strings.append((weight, value))
2391 2396
                elif type(value) in (tuple, list):
2392
                    fts_strings.extend(value)
2397
                    for val in value:
2398
                        fts_strings.append((weight, val))
2393 2399
        if self._evolution:
2394 2400
            for evo in self._evolution:
2395 2401
                if evo.comment:
2396
                    fts_strings.append(evo.comment)
2402
                    fts_strings.append(('D', evo.comment))
2397 2403
                for part in evo.parts or []:
2398
                    fts_strings.append(part.render_for_fts() if part.render_for_fts else '')
2404
                    fts_strings.append(('D', part.render_for_fts() if part.render_for_fts else ''))
2399 2405
        user = self.get_user()
2400 2406
        if user:
2401
            fts_strings.append(user.get_display_name())
2402

  
2403
        sql_statement = (
2404
            '''UPDATE %s SET fts = to_tsvector( %%(fts)s)
2405
                            WHERE id = %%(id)s'''
2406
            % self._table_name
2407
        )
2408
        cur.execute(
2409
            sql_statement,
2410
            {
2411
                'id': self.id,
2412
                'fts': FtsMatch.get_fts_value(' '.join(str(fts_string) for fts_string in fts_strings)),
2413
            },
2407
            fts_strings.append(('A', user.get_display_name()))
2408

  
2409
        fts_parts = []
2410
        parameters = {'id': self.id}
2411
        for i, (weight, value) in enumerate(fts_strings):
2412
            fts_parts.append("setweight(to_tsvector(%%(fts%s)s), '%s')" % (i, weight))
2413
            parameters['fts%s' % i] = FtsMatch.get_fts_value(value)
2414
        sql_statement = '''UPDATE %s SET fts = %s
2415
                            WHERE id = %%(id)s''' % (
2416
            self._table_name,
2417
            ' || '.join(fts_parts) or "''",
2414 2418
        )
2419
        cur.execute(sql_statement, parameters)
2415 2420

  
2416 2421
        conn.commit()
2417 2422
        cur.close()
......
2688 2693

  
2689 2694
        fts_strings = []
2690 2695
        if self.name:
2691
            fts_strings.append(self.name)
2692
            fts_strings.append(self.ascii_name)
2696
            fts_strings.append(('A', self.name))
2697
            fts_strings.append(('A', self.ascii_name))
2693 2698
        if self.email:
2694
            fts_strings.append(self.email)
2699
            fts_strings.append(('B', self.email))
2695 2700
        if user_formdef and user_formdef.fields:
2696 2701
            for field in user_formdef.fields:
2697 2702
                if not self.form_data.get(field.id):
......
2703 2708
                    value = self.form_data.get('%s_display' % field.id)
2704 2709
                if value:
2705 2710
                    if isinstance(value, str):
2706
                        fts_strings.append(value)
2711
                        fts_strings.append(('B', value))
2707 2712
                    elif type(value) in (tuple, list):
2708
                        fts_strings.extend(value)
2709
        sql_statement = (
2710
            '''UPDATE %s SET fts = to_tsvector( %%(fts)s)
2711
                            WHERE id = %%(id)s'''
2712
            % self._table_name
2713
                        for val in value:
2714
                            fts_strings.append(('B', val))
2715

  
2716
        fts_parts = []
2717
        parameters = {'id': self.id}
2718
        for i, (weight, value) in enumerate(fts_strings):
2719
            fts_parts.append("setweight(to_tsvector(%%(fts%s)s), '%s')" % (i, weight))
2720
            parameters['fts%s' % i] = FtsMatch.get_fts_value(value)
2721
        sql_statement = '''UPDATE %s SET fts = %s
2722
                            WHERE id = %%(id)s''' % (
2723
            self._table_name,
2724
            ' || '.join(fts_parts) or "''",
2713 2725
        )
2714
        cur.execute(sql_statement, {'id': self.id, 'fts': ' '.join(fts_strings)})
2726
        cur.execute(sql_statement, parameters)
2715 2727

  
2716 2728
        conn.commit()
2717 2729
        cur.close()
......
3758 3770
# latest migration, number + description (description is not used
3759 3771
# programmaticaly but will make sure git conflicts if two migrations are
3760 3772
# separately added with the same number)
3761
SQL_LEVEL = (58, 'add workflow_merged_roles_dict')
3773
SQL_LEVEL = (59, 'use setweight on formdata é user indexation')
3762 3774

  
3763 3775

  
3764 3776
def migrate_global_views(conn, cur):
......
3879 3891
        migrate_views(conn, cur)
3880 3892
        for formdef in FormDef.select():
3881 3893
            formdef.data_class().rebuild_security()
3882
    if sql_level < 23:
3894
    if sql_level < 59:
3883 3895
        # 12: (second part), store fts in existing rows
3884 3896
        # 21: (second part), store ascii_name of users
3885 3897
        # 23: (first part), use misc.simplify() over full text queries
3898
        # 59: use setweight on formdata é user indexation
3886 3899
        set_reindex('user', 'needed', conn=conn, cur=cur)
3887
    if sql_level < 58:
3900
    if sql_level < 59:
3888 3901
        # 17: store last_update_time in tables
3889 3902
        # 18: add user name to full-text search index
3890 3903
        # 21: (third part), add user ascii_names to full-text index
......
3896 3909
        # 41: update full text normalization
3897 3910
        # 51: add index on formdata blockdef fields
3898 3911
        # 55: update full text normalisation (switch to unidecode)
3912
        # 59: use setweight on formdata é user indexation
3899 3913
        set_reindex('formdata', 'needed', conn=conn, cur=cur)
3900 3914
    if sql_level < 56:
3901 3915
        from wcs.carddef import CardDef
3902
-