|
@@ -4,10 +4,11 @@ from django.db.models import (
|
|
|
from django.db.models.fields.json import KeyTextTransform, KeyTransform
|
|
|
from django.db.models.functions import Cast, Concat, Substr
|
|
|
from django.test.utils import Approximate, ignore_warnings
|
|
|
+from django.utils import timezone
|
|
|
from django.utils.deprecation import RemovedInDjango50Warning
|
|
|
|
|
|
from . import PostgreSQLTestCase
|
|
|
-from .models import AggregateTestModel, StatTestModel
|
|
|
+from .models import AggregateTestModel, HotelReservation, Room, StatTestModel
|
|
|
|
|
|
try:
|
|
|
from django.contrib.postgres.aggregates import (
|
|
@@ -392,6 +393,48 @@ class TestGeneralAggregate(PostgreSQLTestCase):
|
|
|
)
|
|
|
self.assertEqual(values, {'jsonbagg': ['en', 'pl']})
|
|
|
|
|
|
+ def test_jsonb_agg_key_index_transforms(self):
|
|
|
+ room101 = Room.objects.create(number=101)
|
|
|
+ room102 = Room.objects.create(number=102)
|
|
|
+ datetimes = [
|
|
|
+ timezone.datetime(2018, 6, 20),
|
|
|
+ timezone.datetime(2018, 6, 24),
|
|
|
+ timezone.datetime(2018, 6, 28),
|
|
|
+ ]
|
|
|
+ HotelReservation.objects.create(
|
|
|
+ datespan=(datetimes[0].date(), datetimes[1].date()),
|
|
|
+ start=datetimes[0],
|
|
|
+ end=datetimes[1],
|
|
|
+ room=room102,
|
|
|
+ requirements={'double_bed': True, 'parking': True},
|
|
|
+ )
|
|
|
+ HotelReservation.objects.create(
|
|
|
+ datespan=(datetimes[1].date(), datetimes[2].date()),
|
|
|
+ start=datetimes[1],
|
|
|
+ end=datetimes[2],
|
|
|
+ room=room102,
|
|
|
+ requirements={'double_bed': False, 'sea_view': True, 'parking': False},
|
|
|
+ )
|
|
|
+ HotelReservation.objects.create(
|
|
|
+ datespan=(datetimes[0].date(), datetimes[2].date()),
|
|
|
+ start=datetimes[0],
|
|
|
+ end=datetimes[2],
|
|
|
+ room=room101,
|
|
|
+ requirements={'sea_view': False},
|
|
|
+ )
|
|
|
+ values = Room.objects.annotate(
|
|
|
+ requirements=JSONBAgg(
|
|
|
+ 'hotelreservation__requirements',
|
|
|
+ ordering='-hotelreservation__start',
|
|
|
+ )
|
|
|
+ ).filter(requirements__0__sea_view=True).values('number', 'requirements')
|
|
|
+ self.assertSequenceEqual(values, [
|
|
|
+ {'number': 102, 'requirements': [
|
|
|
+ {'double_bed': False, 'sea_view': True, 'parking': False},
|
|
|
+ {'double_bed': True, 'parking': True},
|
|
|
+ ]},
|
|
|
+ ])
|
|
|
+
|
|
|
def test_string_agg_array_agg_ordering_in_subquery(self):
|
|
|
stats = []
|
|
|
for i, agg in enumerate(AggregateTestModel.objects.order_by('char_field')):
|