Merge lp:~openerp-dev/openobject-server/7.0-unaccent-trans-search2-chs into lp:openobject-server/7.0

Proposed by Christophe Simonis (OpenERP)
Status: Merged
Merged at revision: 5268
Proposed branch: lp:~openerp-dev/openobject-server/7.0-unaccent-trans-search2-chs
Merge into: lp:openobject-server/7.0
Diff against target: 80 lines (+28/-22)
1 file modified
openerp/osv/expression.py (+28/-22)
To merge this branch: bzr merge lp:~openerp-dev/openobject-server/7.0-unaccent-trans-search2-chs
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+213449@code.launchpad.net
To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'openerp/osv/expression.py'
2--- openerp/osv/expression.py 2014-02-03 12:05:25 +0000
3+++ openerp/osv/expression.py 2014-03-31 12:31:12 +0000
4@@ -1020,6 +1020,7 @@
5 push(create_substitution_leaf(leaf, (left, operator, right), working_model))
6
7 elif field.translate and right:
8+ field = left
9 need_wildcard = operator in ('like', 'ilike', 'not like', 'not ilike')
10 sql_operator = {'=like': 'like', '=ilike': 'ilike'}.get(operator, operator)
11 if need_wildcard:
12@@ -1031,33 +1032,38 @@
13 sql_operator = sql_operator[4:] if sql_operator[:3] == 'not' else '='
14 inselect_operator = 'not inselect'
15
16- subselect = '( SELECT res_id' \
17- ' FROM ir_translation' \
18- ' WHERE name = %s' \
19- ' AND lang = %s' \
20- ' AND type = %s'
21- instr = ' %s'
22- #Covering in,not in operators with operands (%s,%s) ,etc.
23 if sql_operator == 'in':
24- instr = ','.join(['%s'] * len(right))
25- subselect += ' AND value ' + sql_operator + ' ' + " (" + instr + ")" \
26- ') UNION (' \
27- ' SELECT id' \
28- ' FROM "' + working_model._table + '"' \
29- ' WHERE "' + left + '" ' + sql_operator + ' ' + " (" + instr + "))"
30+ right = tuple(right)
31+
32+ if self.has_unaccent and sql_operator.endswith('like'):
33+ trans_left = 'unaccent(value)'
34+ left = 'unaccent("%s")' % (left,)
35+ instr = 'unaccent(%s)'
36 else:
37- subselect += ' AND value ' + sql_operator + instr + \
38- ') UNION (' \
39- ' SELECT id' \
40- ' FROM "' + working_model._table + '"' \
41- ' WHERE "' + left + '" ' + sql_operator + instr + ")"
42-
43- params = [working_model._name + ',' + left,
44+ trans_left = 'value'
45+ left = '"%s"' % (left,)
46+ instr = '%s'
47+
48+ subselect = """(SELECT res_id
49+ FROM ir_translation
50+ WHERE name = %s
51+ AND lang = %s
52+ AND type = %s
53+ AND {trans_left} {operator} {right}
54+ ) UNION (
55+ SELECT id
56+ FROM "{table}"
57+ WHERE {left} {operator} {right}
58+ )
59+ """.format(trans_left=trans_left, operator=sql_operator,
60+ right=instr, table=working_model._table, left=left)
61+
62+ params = [working_model._name + ',' + field,
63 context.get('lang', False) or 'en_US',
64 'model',
65 right,
66 right,
67- ]
68+ ]
69 push(create_substitution_leaf(leaf, ('id', inselect_operator, (subselect, params)), working_model))
70
71 else:
72@@ -1176,7 +1182,7 @@
73
74 if left in model._columns:
75 format = need_wildcard and '%s' or model._columns[left]._symbol_set[0]
76- if self.has_unaccent and sql_operator in ('ilike', 'not ilike'):
77+ if self.has_unaccent and sql_operator.endswith('like'):
78 query = '(unaccent(%s."%s") %s unaccent(%s))' % (table_alias, left, sql_operator, format)
79 else:
80 query = '(%s."%s" %s %s)' % (table_alias, left, sql_operator, format)