From 3ed71f067435ab09a42d0534f374dd225a0f04aa Mon Sep 17 00:00:00 2001 From: Bertrand Chenal Date: Wed, 12 Aug 2009 10:34:49 +0200 Subject: [PATCH] Faster implementation of unique constraint validation --- trytond/model/modelsql.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py index 9e9b90eec0..242a0654ce 100644 --- a/trytond/model/modelsql.py +++ b/trytond/model/modelsql.py @@ -2075,12 +2075,28 @@ class ModelSQL(ModelStorage): m = _RE_UNIQUE.match(sql) if m: sql = m.group(1) - cursor.execute('SELECT COUNT(id) ' \ - 'FROM "' + self._table + '" ' \ - 'GROUP BY ' + sql + ' ' \ - 'HAVING COUNT(id) > 1') - if cursor.fetchone(): - self.raise_user_error(cursor, error, context=context) + sql_clause = ' AND '.join('%s = %%s' % \ + i for i in sql.split(',')) + sql_clause = '(id != %s AND ' + sql_clause + ')' + + for i in range(0, len(ids), cursor.IN_MAX): + sub_ids = ids[i:i + cursor.IN_MAX] + + cursor.execute('SELECT id,' + sql + ' ' \ + 'FROM "' + self._table + '" ' \ + 'WHERE id IN (' + \ + ','.join('%s' for i in sub_ids) + ')', sub_ids) + + cursor.execute('SELECT id ' \ + 'FROM "' + self._table + '" ' \ + 'WHERE ' + \ + ' OR '.join(sql_clause for i in sub_ids), + reduce(lambda x, y: x + list(y), + cursor.fetchall(), + [])) + + if cursor.fetchone(): + self.raise_user_error(cursor, error, context=context) continue m = _RE_CHECK.match(sql) if m: