Projet

Général

Profil

0001-sql-unify-full-text-search-normalization-46015.patch

Frédéric Péters, 24 août 2020 10:21

Télécharger (2,97 ko)

Voir les différences:

Subject: [PATCH] sql: unify full text search normalization (#46015)

 tests/test_sql.py |  6 ++++++
 wcs/sql.py        | 11 +++++++----
 2 files changed, 13 insertions(+), 4 deletions(-)
tests/test_sql.py
975 975
    assert data_class.count() == 50
976 976
    assert len(data_class.select()) == 50
977 977

  
978
    assert set(data_class.get_ids_from_query('BAR')) == set(range(21, 51))
978 979
    assert [x.id for x in data_class.select([st.FtsMatch('BAR')], order_by='id')] == list(range(21, 51))
979 980

  
980 981
    # check fts against data in history
......
1012 1013
    assert data_class.count([st.FtsMatch(user.name)]) == 1
1013 1014
    assert data_class.count([st.FtsMatch('Frederic')]) == 1
1014 1015

  
1016
    # check looking up a display id
1017
    assert len(data_class.get_ids_from_query(formdata1.id_display)) == 1
1018
    assert len(data_class.select([st.FtsMatch(formdata1.id_display)])) == 1
1019
    assert data_class.select([st.FtsMatch(formdata1.id_display)])[0].id_display == formdata1.id_display
1020

  
1015 1021

  
1016 1022
def table_exists(cur, table_name):
1017 1023
    cur.execute('''SELECT COUNT(*) FROM information_schema.tables
wcs/sql.py
238 238

  
239 239
class FtsMatch(Criteria):
240 240
    def __init__(self, value):
241
        self.value = qommon.misc.simplify(value, space=' ')
241
        self.value = self.get_fts_value(value)
242

  
243
    @classmethod
244
    def get_fts_value(self, value):
245
        return unicodedata.normalize('NFKD', value).encode('ascii', 'ignore').decode('ascii')
242 246

  
243 247
    def as_sql(self):
244 248
        return 'fts @@ plainto_tsquery(%%(c%s)s)' % id(self.value)
......
1100 1104
            conn.commit()
1101 1105
            cur.close()
1102 1106

  
1103

  
1104 1107
    @classmethod
1105 1108
    @guard_postgres
1106 1109
    def get_ids_from_query(cls, query):
......
1108 1111

  
1109 1112
        sql_statement = '''SELECT id FROM %s
1110 1113
                            WHERE fts @@ plainto_tsquery(%%(value)s)''' % cls._table_name
1111
        cur.execute(sql_statement, {'value': qommon.misc.simplify(query, ' ')})
1114
        cur.execute(sql_statement, {'value': FtsMatch.get_fts_value(query)})
1112 1115
        all_ids = [x[0] for x in cur.fetchall()]
1113 1116
        cur.close()
1114 1117
        return all_ids
......
1694 1697
                            WHERE id = %%(id)s''' % self._table_name
1695 1698
        cur.execute(sql_statement, {
1696 1699
            'id': self.id,
1697
            'fts': unicodedata.normalize('NFKD', ' '.join(fts_strings)).encode('ascii', 'ignore').decode('ascii'),
1700
            'fts': FtsMatch.get_fts_value(' '.join(fts_strings)),
1698 1701
        })
1699 1702

  
1700 1703
        conn.commit()
1701
-