From 5bf41b77d6d0421d520395da71fa6b7b00d447c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Voet=20=28ryv=29?= Date: Fri, 8 Oct 2021 11:52:30 +0000 Subject: [PATCH] [IMP] stock: use subquery in some _search methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 Signed-off-by: Rémy Voet --- addons/stock/models/product.py | 19 ++++++++++--------- addons/stock/models/stock_quant.py | 4 ++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/addons/stock/models/product.py b/addons/stock/models/product.py index 5335b97a928..a88998535f0 100644 --- a/addons/stock/models/product.py +++ b/addons/stock/models/product.py @@ -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} diff --git a/addons/stock/models/stock_quant.py b/addons/stock/models/stock_quant.py index 4e59c8a81a5..e56decce594 100644 --- a/addons/stock/models/stock_quant.py +++ b/addons/stock/models/stock_quant.py @@ -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):