@@ -2,14 +2,33 @@ class PodcastMetricsController < ApplicationController
22 include MetricsUtils
33
44 before_action :set_podcast
5- before_action :check_clickhouse , except : %i[ show ]
6- before_action :set_date_range , except : %i[ dropdays ]
7- before_action :set_uniques , only : %i[ show uniques ]
8- before_action :set_dropday_range , only : %i[ show dropdays ]
5+ # before_action :check_clickhouse, except: %i[show]
96
107 def show
118 end
129
10+ def episode_sparkline
11+ @episode = Episode . find_by ( guid : metrics_params [ :episode_id ] )
12+ @prev_episode = Episode . find_by ( guid : metrics_params [ :prev_episode_id ] )
13+
14+ @episode_trend = calculate_episode_trend ( @episode , @prev_episode )
15+
16+ @sparkline_downloads =
17+ Rollups ::HourlyDownload
18+ . where ( episode_id : @episode [ :guid ] , hour : ( publish_hour ( @episode ) ..publish_hour ( @episode ) + 6 . months ) )
19+ . final
20+ . select ( :episode_id , "DATE_TRUNC('DAY', hour) AS hour" , "SUM(count) AS count" )
21+ . group ( :episode_id , "DATE_TRUNC('DAY', hour) AS hour" )
22+ . order ( Arel . sql ( "DATE_TRUNC('DAY', hour) ASC" ) )
23+ . load_async
24+
25+ render partial : "metrics/episode_sparkline" , locals : {
26+ episode : @episode ,
27+ downloads : @sparkline_downloads ,
28+ episode_trend : @episode_trend
29+ }
30+ end
31+
1332 def downloads
1433 @downloads_within_date_range =
1534 Rollups ::HourlyDownload
@@ -195,46 +214,39 @@ def set_podcast
195214 render_not_found ( e )
196215 end
197216
198- def set_date_range
199- @date_start = metrics_params [ :date_start ]
200- @date_end = metrics_params [ :date_end ]
201- @interval = metrics_params [ :interval ]
202- @date_range = generate_date_range ( @date_start , @date_end , @interval )
217+ def metrics_params
218+ params
219+ . permit ( :podcast_id , :episode_id , :prev_episode_id )
203220 end
204221
205- def set_uniques
206- @uniques_selection = uniques_params [ :uniques_selection ]
207- end
222+ def calculate_episode_trend ( episode , prev_episode )
223+ return nil unless episode . first_rss_published_at . present? && prev_episode . present?
224+ return nil if ( episode . first_rss_published_at + 1 . day ) > Time . now
208225
209- def set_dropday_range
210- @dropday_range = dropdays_params [ :dropday_range ]
211- end
226+ ep_dropday_sum = episode_dropday_query ( episode )
227+ previous_ep_dropday_sum = episode_dropday_query ( prev_episode )
212228
213- def metrics_params
214- params
215- . permit ( :podcast_id , :date_start , :date_end , :interval )
216- . with_defaults (
217- date_start : 30 . days . ago . utc_date ,
218- date_end : Date . utc_today ,
219- interval : "DAY"
220- )
229+ return nil if ep_dropday_sum <= 0 || previous_ep_dropday_sum <= 0
230+
231+ ( ( ep_dropday_sum . to_f / previous_ep_dropday_sum . to_f ) - 1 ) . round ( 3 )
221232 end
222233
223- def uniques_params
224- params
225- . permit ( :uniques_selection )
226- . with_defaults (
227- uniques_selection : "last_7_rolling"
228- )
229- . merge ( metrics_params )
234+ def episode_dropday_query ( ep )
235+ lowerbound = publish_hour ( ep )
236+ upperbound = lowerbound + 24 . hours
237+
238+ Rollups ::HourlyDownload
239+ . where ( episode_id : ep [ :guid ] , hour : ( lowerbound ...upperbound ) )
240+ . final
241+ . load_async
242+ . sum ( :count )
230243 end
231244
232- def dropdays_params
233- params
234- . permit ( :dropday_range , :interval )
235- . with_defaults (
236- dropday_range : 7
237- )
238- . merge ( metrics_params )
245+ def publish_hour ( episode )
246+ if episode . first_rss_published_at . present?
247+ episode . first_rss_published_at . beginning_of_hour
248+ else
249+ episode . published_at . beginning_of_hour
250+ end
239251 end
240252end
0 commit comments