if operator in ('=ilike', '=like'):
operator = operator[1:]
query_args = {'name': search_name}
- limit_str = ''
+ # TODO: simplify this in trunk with `display_name`, once it is stored
+ # Perf note: a CTE expression (WITH ...) seems to have an even higher cost
+ # than this query with duplicated CASE expressions. The bulk of
+ # the cost is the ORDER BY, and it is inevitable if we want
+ # relevant results for the next step, otherwise we'd return
+ # a random selection of `limit` results.
+ query = ('''SELECT partner.id FROM res_partner partner
+ LEFT JOIN res_partner company
+ ON partner.parent_id = company.id
+ WHERE partner.email ''' + operator + ''' %(name)s OR
+ CASE
+ WHEN company.id IS NULL OR partner.is_company
+ THEN partner.name
+ ELSE company.name || ', ' || partner.name
+ END ''' + operator + ''' %(name)s
+ ORDER BY
+ CASE
+ WHEN company.id IS NULL OR partner.is_company
+ THEN partner.name
+ ELSE company.name || ', ' || partner.name
+ END''')
if limit:
- limit_str = ' limit %(limit)s'
+ query += ' limit %(limit)s'
query_args['limit'] = limit
- # TODO: simplify this in trunk with _rec_name='display_name', once display_name
- # becomes a stored field
- cr.execute('''SELECT partner.id FROM res_partner partner
- LEFT JOIN res_partner company ON partner.parent_id = company.id
- WHERE partner.email ''' + operator +''' %(name)s OR
- CASE WHEN company.id IS NULL OR partner.is_company
- THEN partner.name
- ELSE
- company.name || ', ' || partner.name
- END
- ''' + operator + ' %(name)s ' + limit_str, query_args)
+ cr.execute(query, query_args)
ids = map(lambda x: x[0], cr.fetchall())
ids = self.search(cr, uid, [('id', 'in', ids)] + args, limit=limit, context=context)
if ids: