[IMP] stock: use subquery in some _search methods

- Improve _search methods of stock/product by using subqueries
- Improve efficiency _search_on_hand of stock.quant (see
odoo/odoo#77190)

closes odoo/odoo#78847

X-original-commit: 82562cc25c10500d30056ca19d816c1d211a24eb
Signed-off-by: Arnold Moyaux <arm@odoo.com>
Signed-off-by: Rémy Voet <ryv@odoo.com>
This commit is contained in:
Rémy Voet (ryv)
2021-10-25 07:31:48 +00:00
parent 46f9a22690
commit 5bf41b77d6
2 changed files with 12 additions and 11 deletions
+10 -9
View File
@@ -382,7 +382,8 @@ class Product(models.Model):
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)
@@ -749,23 +750,23 @@ class ProductTemplate(models.Model):
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}
+2 -2
View File
@@ -163,12 +163,12 @@ class StockQuant(models.Model):
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):