[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:
@@ -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}
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user