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)