From d10e32e141534d73063b4ecbd779a9a506468208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20=28avd=29?= Date: Fri, 15 Apr 2022 10:10:27 +0000 Subject: [PATCH] [REV] expression: revert performance search one2many commit Revert commit 54cd73a4f4 as it prevents customers from closing their pos sessions without timeouting. closes odoo/odoo#88941 X-original-commit: 43165dc3f7a8cc199219b8a32b65eb0ee7b5c2dd Signed-off-by: Julien Castiaux Signed-off-by: Olivier Dony --- odoo/addons/base/tests/test_expression.py | 14 ++++++-------- odoo/osv/expression.py | 11 +++-------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/odoo/addons/base/tests/test_expression.py b/odoo/addons/base/tests/test_expression.py index 45b1cfe976d..dafd2583d8d 100644 --- a/odoo/addons/base/tests/test_expression.py +++ b/odoo/addons/base/tests/test_expression.py @@ -1673,10 +1673,9 @@ class TestOne2many(TransactionCase): with self.assertQueries([''' SELECT "res_partner".id FROM "res_partner" - WHERE EXISTS ( - SELECT 1 FROM "res_partner_bank" AS "res_partner__bank_ids" - WHERE "res_partner__bank_ids"."partner_id" = "res_partner".id - ) + WHERE ("res_partner"."id" IN ( + SELECT "partner_id" FROM "res_partner_bank" WHERE "partner_id" IS NOT NULL + )) ORDER BY "res_partner"."id" ''']): self.Partner.search([('bank_ids', '!=', False)], order='id') @@ -1684,10 +1683,9 @@ class TestOne2many(TransactionCase): with self.assertQueries([''' SELECT "res_partner".id FROM "res_partner" - WHERE NOT EXISTS ( - SELECT 1 FROM "res_partner_bank" AS "res_partner__bank_ids" - WHERE "res_partner__bank_ids"."partner_id" = "res_partner".id - ) + WHERE ("res_partner"."id" NOT IN ( + SELECT "partner_id" FROM "res_partner_bank" WHERE "partner_id" IS NOT NULL + )) ORDER BY "res_partner"."id" ''']): self.Partner.search([('bank_ids', '=', False)], order='id') diff --git a/odoo/osv/expression.py b/odoo/osv/expression.py index a1d03437dba..be9ce5f3de4 100644 --- a/odoo/osv/expression.py +++ b/odoo/osv/expression.py @@ -809,14 +809,9 @@ class expression(object): else: if inverse_field.store and not (inverse_is_int and domain): # rewrite condition to match records with/without lines - exists = 'EXISTS' if operator in NEGATIVE_TERM_OPERATORS else 'NOT EXISTS' - rel_alias = _generate_table_alias(alias, field.name) - push_result(f""" - {exists} ( - SELECT 1 FROM "{comodel._table}" AS "{rel_alias}" - WHERE "{rel_alias}"."{inverse_field.name}" = "{alias}".id - ) - """, []) + op1 = 'inselect' if operator in NEGATIVE_TERM_OPERATORS else 'not inselect' + subquery = f'SELECT "{inverse_field.name}" FROM "{comodel._table}" WHERE "{inverse_field.name}" IS NOT NULL' + push(('id', op1, (subquery, [])), model, alias, internal=True) else: comodel_domain = [(inverse_field.name, '!=', False)] if inverse_is_int and domain: