changeset f04093042cc4 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset&node=f04093042cc4
description:
        Pass default class order to __search_query

        issue10838
        review383251002
diffstat:

 trytond/model/modelsql.py      |   4 ++--
 trytond/tests/modelsql.py      |  28 ++++++++++++++++++++++++++++
 trytond/tests/test_modelsql.py |  34 ++++++++++++++++++++++++++++++++++
 3 files changed, 64 insertions(+), 2 deletions(-)

diffs (110 lines):

diff -r c4e9e56d8759 -r f04093042cc4 trytond/model/modelsql.py
--- a/trytond/model/modelsql.py Mon Oct 11 08:53:21 2021 +0200
+++ b/trytond/model/modelsql.py Mon Oct 11 11:38:37 2021 +0200
@@ -1399,8 +1399,6 @@
             'NULLS LAST': NullsLast,
             None: lambda _: _
             }
-        if order is None or order is False:
-            order = cls._order
         for oexpr, otype in order:
             fname, _, extra_expr = oexpr.partition('.')
             field = cls._fields[fname]
@@ -1428,6 +1426,8 @@
         super(ModelSQL, cls).search(
             domain, offset=offset, limit=limit, order=order, count=count)
 
+        if order is None or order is False:
+            order = cls._order
         tables, expression = cls.__search_query(domain, count, query, order)
 
         main_table, _ = tables[None]
diff -r c4e9e56d8759 -r f04093042cc4 trytond/tests/modelsql.py
--- a/trytond/tests/modelsql.py Mon Oct 11 08:53:21 2021 +0200
+++ b/trytond/tests/modelsql.py Mon Oct 11 11:38:37 2021 +0200
@@ -111,6 +111,32 @@
     parent = fields.Many2One('test.modelsql.search.or2union', "Parent")
 
 
+class ModelSQLSearchOR2UnionOrder(ModelSQL):
+    "ModelSQL Search OR to UNION optimization with class order"
+    __name__ = 'test.modelsql.search.or2union.class_order'
+    name = fields.Char("Name")
+    reference = fields.Reference("Reference", [
+            (None, ''),
+            ('test.modelsql.search.or2union.class_order.target', "Target"),
+            ])
+    targets = fields.One2Many(
+        'test.modelsql.search.or2union.class_order.target', 'parent',
+        "Targets")
+
+    @classmethod
+    def __setup__(cls):
+        super().__setup__()
+        cls._order = [('reference', 'DESC')]
+
+
+class ModelSQLSearchOR2UnionOrderTarget(ModelSQL):
+    "ModelSQL Target to test read"
+    __name__ = 'test.modelsql.search.or2union.class_order.target'
+    name = fields.Char("Name")
+    parent = fields.Many2One(
+        'test.modelsql.search.or2union.class_order', "Parent")
+
+
 class ModelSQLForeignKey(DeactivableMixin, ModelSQL):
     "ModelSQL Foreign Key"
     __name__ = 'test.modelsql.fk'
@@ -208,6 +234,8 @@
         ModelSQLSearch,
         ModelSQLSearchOR2Union,
         ModelSQLSearchOR2UnionTarget,
+        ModelSQLSearchOR2UnionOrder,
+        ModelSQLSearchOR2UnionOrderTarget,
         ModelSQLForeignKey,
         ModelSQLForeignKeyTarget,
         NullOrder,
diff -r c4e9e56d8759 -r f04093042cc4 trytond/tests/test_modelsql.py
--- a/trytond/tests/test_modelsql.py    Mon Oct 11 08:53:21 2021 +0200
+++ b/trytond/tests/test_modelsql.py    Mon Oct 11 11:38:37 2021 +0200
@@ -882,6 +882,40 @@
         self.assertIn('UNION', str(Model.search(domain, query=True)))
         self.assertNotIn('UNION', str(query_without_split))
 
+    @with_transaction()
+    def test_search_or_to_union_class_order(self):
+        """
+        Test searching for 'OR'-ed domain when the class defines _order
+        """
+        pool = Pool()
+        Model = pool.get('test.modelsql.search.or2union.class_order')
+        Target = pool.get('test.modelsql.search.or2union.class_order.target')
+
+        target_a, target_b, target_c = Target.create([
+                {'name': 'A'}, {'name': 'B'}, {'name': 'C'},
+                ])
+        model_a, model_b, model_c = Model.create([{
+                    'name': 'A',
+                    'reference': str(target_a),
+                    }, {
+                    'name': 'B',
+                    'reference': str(target_b),
+                    }, {
+                    'name': 'C',
+                    'reference': str(target_c),
+                    'targets': [('create', [{
+                                    'name': 'C.A',
+                                    }]),
+                        ],
+                    }])
+
+        domain = ['OR',
+            ('name', 'ilike', '%A%'),
+            ('targets.name', 'ilike', '%A'),
+            ]
+        self.assertEqual(Model.search(domain), [model_c, model_a])
+        self.assertIn('UNION', str(Model.search(domain, query=True)))
+
     def test_split_subquery_domain_empty(self):
         """
         Test the split of domains in local and relation parts (empty domain)

Reply via email to