From aaabb405227638ca44eef65ac272ef1bfbfbe085 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Mon, 4 Nov 2024 12:36:41 +0100
Subject: [PATCH] Clean up

---
 default                     |  0
 django_pg_rrule/managers.py | 42 +++++++------------------------------
 2 files changed, 8 insertions(+), 34 deletions(-)
 create mode 100644 default

diff --git a/default b/default
new file mode 100644
index 0000000..e69de29
diff --git a/django_pg_rrule/managers.py b/django_pg_rrule/managers.py
index 0b7f346..17e8a09 100644
--- a/django_pg_rrule/managers.py
+++ b/django_pg_rrule/managers.py
@@ -18,8 +18,8 @@ class RecurrenceManager(CTEManager):
 
     def with_occurrences(
         self,
-        start: datetime | None = None,
-        end: datetime | None = None,
+        start: datetime,
+        end: datetime,
         start_qs: Q | None = None,
         additional_filter: Q | None = None,
         select_related: Sequence | None = None,
@@ -81,7 +81,7 @@ class RecurrenceManager(CTEManager):
                                 function="get_occurrences",
                                 output_field=DateTimeField(),
                             ),
-                            F("rdates"),
+                            Cast("rdates", output_field=ArrayField(DateTimeField())),
                             function="ARRAY_CAT",
                             output_field=ArrayField(DateTimeField()),
                         ),
@@ -100,7 +100,7 @@ class RecurrenceManager(CTEManager):
             with_qs.only("id"),
             name="qodatetimes",
         )
-        cte_query = (  # Join WITH clause with actual data
+        qs = (  # Join WITH clause with actual data
             cte.join(self.model, id=cte.col.id)
             .with_cte(cte)
             # Annotate WITH clause
@@ -117,40 +117,14 @@ class RecurrenceManager(CTEManager):
             )
         )
 
-        # single_events_qs = start_qs.filter(
-        #     rrule__isnull=True,
-        # )
-        #
-        # if additional_filter:
-        #     single_events_qs = single_events_qs.filter(additional_filter)
-        #
-        # single_events_qs = single_events_qs.filter(
-        #     Q(
-        #         **{
-        #             f"{self.datetime_start_field}__lte": end,
-        #             f"{self.datetime_end_field}__gte": start,
-        #         }
-        #     )
-        #     | Q(
-        #         **{
-        #             f"{self.date_start_field}__lte": end.date(),
-        #             f"{self.date_end_field}__gte": start.date(),
-        #         }
-        #     )
-        # ).annotate(
-        #     odatetime=F(self.datetime_start_field), odate=F(self.date_start_field)
-        # )
-
         if select_related:
-            cte_query = cte_query.select_related(*select_related)
-            # single_events_qs = single_events_qs.select_related(*select_related)
+            qs = qs.select_related(*select_related)
 
         if prefetch_related:
-            cte_query = cte_query.prefetch_related(*prefetch_related)
-            # single_events_qs = single_events_qs.prefetch_related(*prefetch_related)
+            qs = qs.prefetch_related(*prefetch_related)
 
-        # qs = (cte_query).union(single_events_qs)
-        qs = cte_query
+        # Hacky way to enforce RIGHT OUTER JOIN
+        # Otherwise, Django always will rewrite the join_type to LEFT OUTER JOIN/INNER JOIN
         qs.query.alias_map["qodatetimes"].join_type = "RIGHT OUTER JOIN"
 
         return qs
-- 
GitLab