@@ -50,7 +50,6 @@ defmodule Algora.Analytics.Metrics do
5050 where: not is_nil ( u . handle ) ,
5151 select: % {
5252 inserted_at: fragment ( "date_trunc(?, ?)" , ^ interval_str , u . inserted_at ) ,
53- last_active_at: fragment ( "date_trunc(?, ?)" , ^ interval_str , u . last_active_at ) ,
5453 is_org:
5554 fragment (
5655 """
@@ -78,17 +77,52 @@ defmodule Algora.Analytics.Metrics do
7877 }
7978 }
8079
81- # Get returns per period
80+ # Get returns per period using user_activities
8281 returns =
83- from q in subquery ( base_query ) ,
82+ from u in User ,
83+ inner_join: ua in "user_activities" ,
84+ on: ua . assoc_id == u . id and ua . type == "user_online" ,
85+ where: not is_nil ( u . handle ) ,
8486 right_join: p in subquery ( periods_query ) ,
85- on: q . last_active_at == p . period_start ,
87+ on: fragment ( "date_trunc(?, ?)" , ^ interval_str , ua . inserted_at ) == p . period_start ,
8688 group_by: p . period_start ,
8789 select: {
8890 p . period_start ,
8991 % {
90- org_returns: coalesce ( count ( fragment ( "CASE WHEN ? IS TRUE THEN 1 END" , q . is_org ) ) , 0 ) ,
91- dev_returns: coalesce ( count ( fragment ( "CASE WHEN ? IS NOT TRUE THEN 1 END" , q . is_org ) ) , 0 )
92+ org_returns:
93+ coalesce (
94+ count (
95+ fragment (
96+ """
97+ DISTINCT CASE WHEN EXISTS (
98+ SELECT 1 FROM members m
99+ INNER JOIN users o ON m.org_id = o.id
100+ WHERE m.user_id = ? AND o.id != m.user_id
101+ ) THEN ? END
102+ """ ,
103+ u . id ,
104+ u . id
105+ )
106+ ) ,
107+ 0
108+ ) ,
109+ dev_returns:
110+ coalesce (
111+ count (
112+ fragment (
113+ """
114+ DISTINCT CASE WHEN NOT EXISTS (
115+ SELECT 1 FROM members m
116+ INNER JOIN users o ON m.org_id = o.id
117+ WHERE m.user_id = ? AND o.id != m.user_id
118+ ) THEN ? END
119+ """ ,
120+ u . id ,
121+ u . id
122+ )
123+ ) ,
124+ 0
125+ )
92126 }
93127 }
94128
@@ -99,11 +133,13 @@ defmodule Algora.Analytics.Metrics do
99133 # Merge metrics
100134 periods = Repo . all ( periods_query )
101135
102- Enum . map ( periods , fn % { period_start: date } ->
136+ periods
137+ |> Enum . map ( fn % { period_start: date } ->
103138 signup_metrics = Map . get ( signups , date , % { org_signups: 0 , dev_signups: 0 } )
104139 return_metrics = Map . get ( returns , date , % { org_returns: 0 , dev_returns: 0 } )
105140 { date , Map . merge ( signup_metrics , return_metrics ) }
106141 end )
142+ |> Enum . sort_by ( & elem ( & 1 , 0 ) , { :desc , DateTime } )
107143 end
108144
109145 def period_start_date ( n_periods , interval ) do
0 commit comments