diff --git a/trytond/CHANGELOG b/trytond/CHANGELOG index 81d4c403f6..06207f128f 100644 --- a/trytond/CHANGELOG +++ b/trytond/CHANGELOG @@ -1,3 +1,4 @@ +* Support subset operator between index definitions * Add sum_tree helper * Convert sum attribute into boolean * Store records selection on export diff --git a/trytond/trytond/model/modelsql.py b/trytond/trytond/model/modelsql.py index d9c5cf33b4..8edc9221b0 100644 --- a/trytond/trytond/model/modelsql.py +++ b/trytond/trytond/model/modelsql.py @@ -189,6 +189,26 @@ class Index: return str(value) if isinstance(value, Expression) else value return {k: _format(v) for k, v in self.options.items()} + def __lt__(self, other): + if not isinstance(other, self.__class__): + return NotImplementedError + if (self.table != other.table + or self._options_cmp != other._options_cmp): + return False + if self == other: + return False + if len(self.expressions) >= len(other.expressions): + return False + for (c, u), (oc, ou) in zip(self.expressions, other.expressions): + if (str(c), u) != (str(oc), ou): + return False + return True + + def __le__(self, other): + if not isinstance(other, self.__class__): + return NotImplementedError + return self < other or self == other + class Unaccent(Expression): "Unaccent function if database support for index" __slots__ = ('_expression',) diff --git a/trytond/trytond/tests/test_model_index.py b/trytond/trytond/tests/test_model_index.py index 83ed5dfc7b..7c3ef89c37 100644 --- a/trytond/trytond/tests/test_model_index.py +++ b/trytond/trytond/tests/test_model_index.py @@ -129,6 +129,85 @@ class ModelIndexTestCase(unittest.TestCase): self.assertEqual(index1, index2) + def test_index_subset(self): + "Test Index subset" + table = Table('test') + index1 = Index( + table, + (table.foo, Index.Equality())) + index2 = Index( + table, + (table.foo, Index.Equality()), + (table.bar, Index.Equality())) + + self.assertEqual(index1 < index2, True) + self.assertEqual(index2 < index1, False) + + def test_index_subset_expressions(self): + "Test Index subset" + table = Table('test') + index1 = Index( + table, + (table.foo, Index.Equality())) + index2 = Index( + table, + (table.bar, Index.Equality()), + (table.foo, Index.Equality())) + + self.assertEqual(index1 < index2, False) + self.assertEqual(index2 < index1, False) + + def test_index_subset_same(self): + "Test Index subset" + table = Table('test') + index1 = Index( + table, + (table.foo, Index.Equality())) + index2 = Index( + table, + (table.foo, Index.Equality())) + + self.assertEqual(index1 < index2, False) + self.assertEqual(index2 < index1, False) + self.assertLessEqual(index1, index2) + + def test_index_subset_other(self): + "Test Index subset with other type" + table = Table('test') + index = Index(table) + + self.assertEqual(index < 0, NotImplementedError) + + def test_index_subset_table(self): + "Test Index subset on different table" + table1 = Table('foo') + table2 = Table('bar') + index1 = Index( + table1, + (table1.name, Index.Equality())) + index2 = Index( + table2, + (table2.name, Index.Equality())) + + self.assertEqual(index1 < index2, False) + self.assertEqual(index2 < index1, False) + + def test_index_subset_options(self): + "Test Index subset with different options" + table1 = Table('foo') + table2 = Table('bar') + index1 = Index( + table1, + (table1.name, Index.Equality()), + where=table1.name == 'bar') + index2 = Index( + table2, + (table2.name, Index.Equality()), + where=table2.name == 'foo') + + self.assertEqual(index1 < index2, False) + self.assertEqual(index2 < index1, False) + def test_index_hash(self): "Test Index hash" table1 = Table('test')