mirror of
https://github.com/django/django.git
synced 2025-08-03 18:38:50 +00:00
Fixed #26067 -- Added ordering support to ArrayAgg and StringAgg.
This commit is contained in:
parent
2a0116266c
commit
96199e562d
5 changed files with 146 additions and 12 deletions
|
@ -22,21 +22,57 @@ class TestGeneralAggregate(PostgreSQLTestCase):
|
|||
def setUpTestData(cls):
|
||||
AggregateTestModel.objects.create(boolean_field=True, char_field='Foo1', integer_field=0)
|
||||
AggregateTestModel.objects.create(boolean_field=False, char_field='Foo2', integer_field=1)
|
||||
AggregateTestModel.objects.create(boolean_field=False, char_field='Foo3', integer_field=2)
|
||||
AggregateTestModel.objects.create(boolean_field=True, char_field='Foo4', integer_field=0)
|
||||
AggregateTestModel.objects.create(boolean_field=False, char_field='Foo4', integer_field=2)
|
||||
AggregateTestModel.objects.create(boolean_field=True, char_field='Foo3', integer_field=0)
|
||||
|
||||
def test_array_agg_charfield(self):
|
||||
values = AggregateTestModel.objects.aggregate(arrayagg=ArrayAgg('char_field'))
|
||||
self.assertEqual(values, {'arrayagg': ['Foo1', 'Foo2', 'Foo3', 'Foo4']})
|
||||
self.assertEqual(values, {'arrayagg': ['Foo1', 'Foo2', 'Foo4', 'Foo3']})
|
||||
|
||||
def test_array_agg_charfield_ordering(self):
|
||||
ordering_test_cases = (
|
||||
(F('char_field').desc(), ['Foo4', 'Foo3', 'Foo2', 'Foo1']),
|
||||
(F('char_field').asc(), ['Foo1', 'Foo2', 'Foo3', 'Foo4']),
|
||||
(F('char_field'), ['Foo1', 'Foo2', 'Foo3', 'Foo4']),
|
||||
([F('boolean_field'), F('char_field').desc()], ['Foo4', 'Foo2', 'Foo3', 'Foo1']),
|
||||
((F('boolean_field'), F('char_field').desc()), ['Foo4', 'Foo2', 'Foo3', 'Foo1']),
|
||||
('char_field', ['Foo1', 'Foo2', 'Foo3', 'Foo4']),
|
||||
('-char_field', ['Foo4', 'Foo3', 'Foo2', 'Foo1']),
|
||||
)
|
||||
for ordering, expected_output in ordering_test_cases:
|
||||
with self.subTest(ordering=ordering, expected_output=expected_output):
|
||||
values = AggregateTestModel.objects.aggregate(
|
||||
arrayagg=ArrayAgg('char_field', ordering=ordering)
|
||||
)
|
||||
self.assertEqual(values, {'arrayagg': expected_output})
|
||||
|
||||
def test_array_agg_integerfield(self):
|
||||
values = AggregateTestModel.objects.aggregate(arrayagg=ArrayAgg('integer_field'))
|
||||
self.assertEqual(values, {'arrayagg': [0, 1, 2, 0]})
|
||||
|
||||
def test_array_agg_integerfield_ordering(self):
|
||||
values = AggregateTestModel.objects.aggregate(
|
||||
arrayagg=ArrayAgg('integer_field', ordering=F('integer_field').desc())
|
||||
)
|
||||
self.assertEqual(values, {'arrayagg': [2, 1, 0, 0]})
|
||||
|
||||
def test_array_agg_booleanfield(self):
|
||||
values = AggregateTestModel.objects.aggregate(arrayagg=ArrayAgg('boolean_field'))
|
||||
self.assertEqual(values, {'arrayagg': [True, False, False, True]})
|
||||
|
||||
def test_array_agg_booleanfield_ordering(self):
|
||||
ordering_test_cases = (
|
||||
(F('boolean_field').asc(), [False, False, True, True]),
|
||||
(F('boolean_field').desc(), [True, True, False, False]),
|
||||
(F('boolean_field'), [False, False, True, True]),
|
||||
)
|
||||
for ordering, expected_output in ordering_test_cases:
|
||||
with self.subTest(ordering=ordering, expected_output=expected_output):
|
||||
values = AggregateTestModel.objects.aggregate(
|
||||
arrayagg=ArrayAgg('boolean_field', ordering=ordering)
|
||||
)
|
||||
self.assertEqual(values, {'arrayagg': expected_output})
|
||||
|
||||
def test_array_agg_empty_result(self):
|
||||
AggregateTestModel.objects.all().delete()
|
||||
values = AggregateTestModel.objects.aggregate(arrayagg=ArrayAgg('char_field'))
|
||||
|
@ -122,17 +158,36 @@ class TestGeneralAggregate(PostgreSQLTestCase):
|
|||
|
||||
def test_string_agg_charfield(self):
|
||||
values = AggregateTestModel.objects.aggregate(stringagg=StringAgg('char_field', delimiter=';'))
|
||||
self.assertEqual(values, {'stringagg': 'Foo1;Foo2;Foo3;Foo4'})
|
||||
self.assertEqual(values, {'stringagg': 'Foo1;Foo2;Foo4;Foo3'})
|
||||
|
||||
def test_string_agg_charfield_ordering(self):
|
||||
ordering_test_cases = (
|
||||
(F('char_field').desc(), 'Foo4;Foo3;Foo2;Foo1'),
|
||||
(F('char_field').asc(), 'Foo1;Foo2;Foo3;Foo4'),
|
||||
(F('char_field'), 'Foo1;Foo2;Foo3;Foo4'),
|
||||
)
|
||||
for ordering, expected_output in ordering_test_cases:
|
||||
with self.subTest(ordering=ordering, expected_output=expected_output):
|
||||
values = AggregateTestModel.objects.aggregate(
|
||||
stringagg=StringAgg('char_field', delimiter=';', ordering=ordering)
|
||||
)
|
||||
self.assertEqual(values, {'stringagg': expected_output})
|
||||
|
||||
def test_string_agg_empty_result(self):
|
||||
AggregateTestModel.objects.all().delete()
|
||||
values = AggregateTestModel.objects.aggregate(stringagg=StringAgg('char_field', delimiter=';'))
|
||||
self.assertEqual(values, {'stringagg': ''})
|
||||
|
||||
def test_orderable_agg_alternative_fields(self):
|
||||
values = AggregateTestModel.objects.aggregate(
|
||||
arrayagg=ArrayAgg('integer_field', ordering=F('char_field').asc())
|
||||
)
|
||||
self.assertEqual(values, {'arrayagg': [0, 1, 0, 2]})
|
||||
|
||||
@skipUnlessDBFeature('has_jsonb_agg')
|
||||
def test_json_agg(self):
|
||||
values = AggregateTestModel.objects.aggregate(jsonagg=JSONBAgg('char_field'))
|
||||
self.assertEqual(values, {'jsonagg': ['Foo1', 'Foo2', 'Foo3', 'Foo4']})
|
||||
self.assertEqual(values, {'jsonagg': ['Foo1', 'Foo2', 'Foo4', 'Foo3']})
|
||||
|
||||
@skipUnlessDBFeature('has_jsonb_agg')
|
||||
def test_json_agg_empty(self):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue