@@ -4,58 +4,58 @@ import DateOperations
44extension CustomQuery {
55 func precompiledRetentionQuery( ) throws -> CustomQuery {
66 var query = self
7-
7+
88 // Get the query intervals - we need at least one interval
99 guard let queryIntervals = intervals ?? relativeIntervals? . map ( { QueryTimeInterval . from ( relativeTimeInterval: $0) } ) ,
1010 let firstInterval = queryIntervals. first else {
1111 throw QueryGenerationError . keyMissing ( reason: " Missing intervals for retention query " )
1212 }
13-
13+
1414 let beginDate = firstInterval. beginningDate
1515 let endDate = firstInterval. endDate
16-
16+
1717 // Use the query's granularity to determine retention period, defaulting to month if not specified
1818 let retentionGranularity = query. granularity ?? . month
19-
19+
2020 // Validate minimum interval based on granularity
2121 try validateMinimumInterval ( from: beginDate, to: endDate, granularity: retentionGranularity)
22-
22+
2323 // Split into intervals based on the specified granularity
2424 let retentionIntervals = try splitIntoIntervals ( from: beginDate, to: endDate, granularity: retentionGranularity)
25-
25+
2626 // Generate Aggregators
2727 var aggregators = [ Aggregator] ( )
2828 for interval in retentionIntervals {
2929 aggregators. append ( aggregator ( for: interval) )
3030 }
31-
31+
3232 // Generate Post-Aggregators
3333 var postAggregators = [ PostAggregator] ( )
3434 for row in retentionIntervals {
3535 for column in retentionIntervals where column >= row {
3636 postAggregators. append ( postAggregatorBetween ( interval1: row, interval2: column) )
3737 }
3838 }
39-
39+
4040 // Set the query properties
4141 query. queryType = . groupBy
4242 query. granularity = . all
4343 query. aggregations = uniqued ( aggregators)
4444 query. postAggregations = uniqued ( postAggregators)
45-
45+
4646 return query
4747 }
48-
48+
4949 private func uniqued< T: Hashable > ( _ array: [ T ] ) -> [ T ] {
5050 var set = Set < T > ( )
5151 return array. filter { set. insert ( $0) . inserted }
5252 }
53-
53+
5454 // MARK: - Helper Methods
55-
55+
5656 private func validateMinimumInterval( from beginDate: Date , to endDate: Date , granularity: QueryGranularity ) throws {
5757 let calendar = Calendar . current
58-
58+
5959 switch granularity {
6060 case . day:
6161 let components = calendar. dateComponents ( [ . day] , from: beginDate, to: endDate)
@@ -86,11 +86,11 @@ extension CustomQuery {
8686 throw QueryGenerationError . notImplemented ( reason: " Retention queries support day, week, month, quarter, or year granularity " )
8787 }
8888 }
89-
89+
9090 private func splitIntoIntervals( from fromDate: Date , to toDate: Date , granularity: QueryGranularity ) throws -> [ DateInterval ] {
9191 let calendar = Calendar . current
9292 var intervals = [ DateInterval] ( )
93-
93+
9494 switch granularity {
9595 case . day:
9696 let numberOfDays = numberOfUnitsBetween ( beginDate: fromDate, endDate: toDate, component: . day)
@@ -100,7 +100,7 @@ extension CustomQuery {
100100 let endOfDay = startOfDay. end ( of: . day) ?? startOfDay
101101 intervals. append ( DateInterval ( start: startOfDay, end: endOfDay) )
102102 }
103-
103+
104104 case . week:
105105 let numberOfWeeks = numberOfUnitsBetween ( beginDate: fromDate, endDate: toDate, component: . weekOfYear)
106106 for week in 0 ... numberOfWeeks {
@@ -109,7 +109,7 @@ extension CustomQuery {
109109 let endOfWeek = startOfWeek. end ( of: . weekOfYear) ?? startOfWeek
110110 intervals. append ( DateInterval ( start: startOfWeek, end: endOfWeek) )
111111 }
112-
112+
113113 case . month:
114114 let numberOfMonths = numberOfUnitsBetween ( beginDate: fromDate, endDate: toDate, component: . month)
115115 for month in 0 ... numberOfMonths {
@@ -118,7 +118,7 @@ extension CustomQuery {
118118 let endOfMonth = startOfMonth. end ( of: . month) ?? startOfMonth
119119 intervals. append ( DateInterval ( start: startOfMonth, end: endOfMonth) )
120120 }
121-
121+
122122 case . quarter:
123123 let numberOfQuarters = numberOfUnitsBetween ( beginDate: fromDate, endDate: toDate, component: . quarter)
124124 for quarter in 0 ... numberOfQuarters {
@@ -127,7 +127,7 @@ extension CustomQuery {
127127 let endOfQuarter = startOfQuarter. end ( of: . quarter) ?? startOfQuarter
128128 intervals. append ( DateInterval ( start: startOfQuarter, end: endOfQuarter) )
129129 }
130-
130+
131131 case . year:
132132 let numberOfYears = numberOfUnitsBetween ( beginDate: fromDate, endDate: toDate, component: . year)
133133 for year in 0 ... numberOfYears {
@@ -136,18 +136,18 @@ extension CustomQuery {
136136 let endOfYear = startOfYear. end ( of: . year) ?? startOfYear
137137 intervals. append ( DateInterval ( start: startOfYear, end: endOfYear) )
138138 }
139-
139+
140140 default :
141141 throw QueryGenerationError . notImplemented ( reason: " Retention queries support day, week, month, quarter, or year granularity " )
142142 }
143-
143+
144144 return intervals
145145 }
146-
146+
147147 private func numberOfUnitsBetween( beginDate: Date , endDate: Date , component: Calendar . Component ) -> Int {
148148 let calendar = Calendar . current
149149 let components = calendar. dateComponents ( [ component] , from: beginDate, to: endDate)
150-
150+
151151 switch component {
152152 case . day:
153153 return components. day ?? 0
@@ -163,13 +163,13 @@ extension CustomQuery {
163163 return 0
164164 }
165165 }
166-
166+
167167 private func title( for interval: DateInterval ) -> String {
168168 let formatter = ISO8601DateFormatter ( )
169169 formatter. formatOptions = [ . withFullDate]
170170 return " \( formatter. string ( from: interval. start) ) _ \( formatter. string ( from: interval. end) ) "
171171 }
172-
172+
173173 private func aggregator( for interval: DateInterval ) -> Aggregator {
174174 . filtered( . init(
175175 filter: . interval( . init(
@@ -182,7 +182,7 @@ extension CustomQuery {
182182 ) )
183183 ) )
184184 }
185-
185+
186186 private func postAggregatorBetween( interval1: DateInterval , interval2: DateInterval ) -> PostAggregator {
187187 . thetaSketchEstimate( . init(
188188 name: " retention_ \( title ( for: interval1) ) _ \( title ( for: interval2) ) " ,
@@ -195,4 +195,4 @@ extension CustomQuery {
195195 ) )
196196 ) )
197197 }
198- }
198+ }
0 commit comments