Skip to content

Commit

Permalink
[IMP] stock: use subquery in some _search methods
Browse files Browse the repository at this point in the history
- Improve _search methods of stock/product by using subqueries
- Improve efficiency _search_on_hand of stock.quant (see
#77190)

closes #78071

Signed-off-by: Arnold Moyaux <amoyaux@users.noreply.github.com>
  • Loading branch information
ryv-odoo committed Oct 22, 2021
1 parent 29eb6d3 commit 82562cc
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 11 deletions.
19 changes: 10 additions & 9 deletions addons/stock/models/product.py
Expand Up @@ -391,7 +391,8 @@ def _search_qty_available_new(self, operator, value, lot_id=False, owner_id=Fals
if include_zero:
products_without_quants_in_domain = self.env['product.product'].search([
('type', '=', 'product'),
('id', 'not in', list(processed_product_ids))]
('id', 'not in', list(processed_product_ids))],
order='id'
)
product_ids |= set(products_without_quants_in_domain.ids)
return list(product_ids)
Expand Down Expand Up @@ -775,23 +776,23 @@ def _get_action_view_related_putaway_rules(self, domain):

def _search_qty_available(self, operator, value):
domain = [('qty_available', operator, value)]
product_variant_ids = self.env['product.product'].search(domain)
return [('product_variant_ids', 'in', product_variant_ids.ids)]
product_variant_query = self.env['product.product']._search(domain)
return [('product_variant_ids', 'in', product_variant_query)]

def _search_virtual_available(self, operator, value):
domain = [('virtual_available', operator, value)]
product_variant_ids = self.env['product.product'].search(domain)
return [('product_variant_ids', 'in', product_variant_ids.ids)]
product_variant_query = self.env['product.product']._search(domain)
return [('product_variant_ids', 'in', product_variant_query)]

def _search_incoming_qty(self, operator, value):
domain = [('incoming_qty', operator, value)]
product_variant_ids = self.env['product.product'].search(domain)
return [('product_variant_ids', 'in', product_variant_ids.ids)]
product_variant_query = self.env['product.product']._search(domain)
return [('product_variant_ids', 'in', product_variant_query)]

def _search_outgoing_qty(self, operator, value):
domain = [('outgoing_qty', operator, value)]
product_variant_ids = self.env['product.product'].search(domain)
return [('product_variant_ids', 'in', product_variant_ids.ids)]
product_variant_query = self.env['product.product']._search(domain)
return [('product_variant_ids', 'in', product_variant_query)]

def _compute_nbr_reordering_rules(self):
res = {k: {'nbr_reordering_rules': 0, 'reordering_min_qty': 0, 'reordering_max_qty': 0} for k in self.ids}
Expand Down
4 changes: 2 additions & 2 deletions addons/stock/models/stock_quant.py
Expand Up @@ -162,12 +162,12 @@ def _search_on_hand(self, operator, value):
if operator not in ['=', '!='] or not isinstance(value, bool):
raise UserError(_('Operation not supported'))
domain_loc = self.env['product.product']._get_domain_locations()[0]
quant_ids = [l['id'] for l in self.env['stock.quant'].search_read(domain_loc, ['id'])]
quant_query = self.env['stock.quant']._search(domain_loc)
if (operator == '!=' and value is True) or (operator == '=' and value is False):
domain_operator = 'not in'
else:
domain_operator = 'in'
return [('id', domain_operator, quant_ids)]
return [('id', domain_operator, quant_query)]

@api.model
def create(self, vals):
Expand Down

0 comments on commit 82562cc

Please sign in to comment.