11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
# File 'app/presenters/ahoy_captain/funnel_presenter.rb', line 11
def build
if AhoyCaptain.config.goals.none?
@goals = []
return self
end
queries = {
totals: @event_query.select("count(distinct(#{AhoyCaptain.event.table_name}.visit_id)) as unique_visits, '_internal_total_visits_' as name, count(distinct #{AhoyCaptain.event.table_name}.id) as total_events, 0 as sort_order")
}
selects = ["SELECT unique_visits, name, total_events, sort_order from totals"]
last_goal = nil
map = {}.with_indifferent_access
AhoyCaptain.config.goals.each_with_index do |goal, index|
queries[goal.id] = @event_query.select("count(distinct(#{AhoyCaptain.event.table_name}.visit_id)) as unique_visits, '#{goal.id}' as name, count(distinct #{AhoyCaptain.event.table_name}.id) as total_events, #{index + 1} as sort_order").merge(goal.event_query.call).group("#{AhoyCaptain.event.table_name}.name")
selects << ["SELECT unique_visits, name, total_events, sort_order from #{goal.id}"]
map[goal.id] = goal
last_goal = goal
end
select = selects.join(" UNION ").delete_suffix(" from #{last_goal.id}")
select = select.delete_prefix("SELECT ")
steps = ::Ahoy::Event.with(
queries,
).select(select).from("#{last_goal.id}").order("sort_order asc")
items = ::Ahoy::Event.with(steps: steps).select("total_events, unique_visits, name, round((total_events::numeric/lag(total_events, 1) over ()),2) as drop_off").from("steps").order("sort_order asc").index_by(&:name)
items.delete("_internal_total_visits_")
@steps = []
items.values.each do |item|
if map[item.name]
item.name = map[item.name].title
end
end
@steps = items.values
self
end
|