[IMP] core: use _search() and _name_search() for sub-searches
This avoids the formatting part of those methods (`browse` in the case of `search`, `display_name` in the case of `name_search`), which is useless in most cases. This also enables further optimizations where `_search` and `_name_search` return subqueries instead of record ids.
This commit is contained in:
+11
-11
@@ -565,7 +565,7 @@ class expression(object):
|
||||
return list({
|
||||
rid
|
||||
for name in names
|
||||
for rid, rname in comodel.name_search(name, [], 'ilike', limit=None)
|
||||
for rid in comodel._name_search(name, [], 'ilike', limit=None)
|
||||
})
|
||||
return list(value)
|
||||
|
||||
@@ -581,13 +581,13 @@ class expression(object):
|
||||
for rec in left_model.browse(ids)
|
||||
])
|
||||
if prefix:
|
||||
return [(left, 'in', left_model.search(doms, order='id').ids)]
|
||||
return [(left, 'in', left_model._search(doms, order='id'))]
|
||||
return doms
|
||||
else:
|
||||
parent_name = parent or left_model._parent_name
|
||||
child_ids = set(ids)
|
||||
while ids:
|
||||
ids = left_model.search([(parent_name, 'in', ids)], order='id').ids
|
||||
ids = left_model._search([(parent_name, 'in', ids)], order='id')
|
||||
child_ids.update(ids)
|
||||
return [(left, 'in', list(child_ids))]
|
||||
|
||||
@@ -739,12 +739,12 @@ class expression(object):
|
||||
raise NotImplementedError('auto_join attribute not supported on field %s' % field)
|
||||
|
||||
elif len(path) > 1 and field.store and field.type == 'many2one':
|
||||
right_ids = comodel.with_context(active_test=False).search([('.'.join(path[1:]), operator, right)], order='id').ids
|
||||
right_ids = comodel.with_context(active_test=False)._search([(path[1], operator, right)], order='id')
|
||||
push((path[0], 'in', right_ids), model, alias)
|
||||
|
||||
# Making search easier when there is a left operand as one2many or many2many
|
||||
elif len(path) > 1 and field.store and field.type in ('many2many', 'one2many'):
|
||||
right_ids = comodel.with_context(**field.context).search([('.'.join(path[1:]), operator, right)], order='id').ids
|
||||
right_ids = comodel.with_context(**field.context)._search([(path[1], operator, right)], order='id')
|
||||
push((path[0], 'in', right_ids), model, alias)
|
||||
|
||||
elif not field.store:
|
||||
@@ -759,7 +759,7 @@ class expression(object):
|
||||
else:
|
||||
# Let the field generate a domain.
|
||||
if len(path) > 1:
|
||||
right = comodel.search([('.'.join(path[1:]), operator, right)], order='id').ids
|
||||
right = comodel._search([(path[1], operator, right)], order='id')
|
||||
operator = 'in'
|
||||
domain = field.determine_domain(model, operator, right)
|
||||
|
||||
@@ -790,13 +790,13 @@ class expression(object):
|
||||
if isinstance(right, str):
|
||||
op2 = (TERM_OPERATORS_NEGATION[operator]
|
||||
if operator in NEGATIVE_TERM_OPERATORS else operator)
|
||||
ids2 = [x[0] for x in comodel.name_search(right, domain or [], op2, limit=None)]
|
||||
ids2 = comodel._name_search(right, domain or [], op2, limit=None)
|
||||
elif isinstance(right, collections.abc.Iterable):
|
||||
ids2 = right
|
||||
else:
|
||||
ids2 = [right]
|
||||
if ids2 and inverse_is_int and domain:
|
||||
ids2 = comodel.search([('id', 'in', ids2)] + domain, order='id').ids
|
||||
ids2 = comodel._search([('id', 'in', ids2)] + domain, order='id')
|
||||
|
||||
if ids2 and comodel._fields[field.inverse_name].store:
|
||||
op1 = 'not inselect' if operator in NEGATIVE_TERM_OPERATORS else 'inselect'
|
||||
@@ -835,7 +835,7 @@ class expression(object):
|
||||
# determine ids2 in comodel
|
||||
ids2 = to_ids(right, comodel, leaf)
|
||||
domain = HIERARCHY_FUNCS[operator]('id', ids2, comodel)
|
||||
ids2 = comodel.search(domain, order='id').ids
|
||||
ids2 = comodel._search(domain, order='id')
|
||||
|
||||
# rewrite condition in terms of ids2
|
||||
if comodel == model:
|
||||
@@ -850,7 +850,7 @@ class expression(object):
|
||||
domain = field.get_domain_list(model)
|
||||
op2 = (TERM_OPERATORS_NEGATION[operator]
|
||||
if operator in NEGATIVE_TERM_OPERATORS else operator)
|
||||
ids2 = [x[0] for x in comodel.name_search(right, domain or [], op2, limit=None)]
|
||||
ids2 = comodel._name_search(right, domain or [], op2, limit=None)
|
||||
elif isinstance(right, collections.abc.Iterable):
|
||||
ids2 = right
|
||||
else:
|
||||
@@ -889,7 +889,7 @@ class expression(object):
|
||||
operator = dict_op[operator]
|
||||
elif isinstance(right, list) and operator in ['!=', '=']: # for domain (FIELD,'=',['value1','value2'])
|
||||
operator = dict_op[operator]
|
||||
res_ids = [x[0] for x in comodel.with_context(active_test=False).name_search(right, [], operator, limit=None)]
|
||||
res_ids = comodel.with_context(active_test=False)._name_search(right, [], operator, limit=None)
|
||||
if operator in NEGATIVE_TERM_OPERATORS:
|
||||
res_ids.append(False) # TODO this should not be appended if False was in 'right'
|
||||
return left, 'in', res_ids
|
||||
|
||||
Reference in New Issue
Block a user