Impacted versions:
8.0 and so on

Steps to reproduce:
create a many2many field in product.product such as:
`'company_ids':fields.many2many('res.company','res_company_product_rel','partner_id','company_ids',string=u'multi company''),`
and add a ir.rule for product.product with  domain such as
`['|',('company_id','=',False),('company_ids','in',[c.id for c in user.company_ids])]`
and import 10 thousand product.
then login with normal user(not super) and open the product.produt list view
it taks several minus to open

Current behavior:
when I search product.product
all product id have been hard coded in the sql 
lead to low performance.

Expected behavior:
not hard code produt id

Video/Screenshot link (optional):
in the sql below 10 thousand product id have been hard code in the position %s
AND ("product_product__product_tmpl_id"."company_id" IS NULL   OR  ("product_product"."id" in (%s)))

openerp/osv/expression.py
if ids2:
                            operator = 'in'
                    elif isinstance(right, collections.Iterable):
                        ids2 = right
                    else:
                        ids2 = [right]
                    if not ids2:
                        if operator in ['like', 'ilike', 'in', '=']:
                            #n
                            call_null = False
                            push(create_substitution_leaf(leaf, FALSE_LEAF, model))
                    else:
                        # 
                        if comodel._fields[column._fields_id].store:
                            ids1 = select_from_where(cr, column._fields_id, comodel._table, 'id', ids2, operator)
                        else:
                            recs = comodel.browse(cr, SUPERUSER_ID, ids2, {'prefetch_fields': False})
                            ids1 = recs.mapped(column._fields_id).ids
                        if ids1:
                            call_null = False
                            o2m_op = 'not in' if operator in NEGATIVE_TERM_OPERATORS else 'in'
                            push(create_substitution_leaf(leaf, ('id', o2m_op, ids1), model))
                        elif operator in ('like', 'ilike', 'in', '='):
                            # 
                            call_null = False
                            push(create_substitution_leaf(leaf, FALSE_LEAF, model))
                if call_null:
                    o2m_op = 'in' if operator in NEGATIVE_TERM_OPERATORS else 'not in'
                    # 
                    if comodel._fields[column._fields_id].store: