Class: Lookout::Stats::AverageVisitDurationQuery

Inherits:
BaseQuery show all
Defined in:
app/queries/lookout/stats/average_visit_duration_query.rb

Instance Attribute Summary

Attributes inherited from ApplicationQuery

#params

Class Method Summary collapse

Instance Method Summary collapse

Methods included from LazyComparableQuery

#with_lazy_comparison

Methods included from ComparableQuery

#with_comparison

Methods inherited from ApplicationQuery

call, inherited, #initialize, #inspect

Constructor Details

This class inherits a constructor from Lookout::ApplicationQuery

Class Method Details

.cast_type(value) ⇒ Object



16
17
18
# File 'app/queries/lookout/stats/average_visit_duration_query.rb', line 16

def self.cast_type(value)
  ActiveRecord::Type.lookup(:string)
end

.cast_value(_type, value) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
# File 'app/queries/lookout/stats/average_visit_duration_query.rb', line 20

def self.cast_value(_type, value)
  if value.present?
    # SQLite returns numeric seconds, PostgreSQL returns interval string
    if value.is_a?(Numeric) || value.to_s.match?(/^\d+(\.\d+)?$/)
      value.to_f.seconds
    else
      ActiveSupport::Duration.parse(value)
    end
  else
    0.seconds
  end
end

Instance Method Details

#buildObject



4
5
6
7
8
9
10
11
12
13
14
# File 'app/queries/lookout/stats/average_visit_duration_query.rb', line 4

def build
  max_events = event_query.select("#{Lookout.event.table_name}.visit_id, max(#{Lookout.event.table_name}.time) as created_at").group("visit_id")
  
  # PostgreSQL has interval type, SQLite stores timestamp diff as numeric (seconds)
  duration_cast = Lookout::DatabaseAdapter.postgresql? ? 
    "avg((max_events.created_at - #{Lookout.visit.table_name}.started_at))::interval" :
    "avg(julianday(max_events.created_at) - julianday(#{Lookout.visit.table_name}.started_at)) * 86400"
  
  visit_query.select("#{duration_cast} as average_visit_duration")
             .joins("LEFT JOIN (#{max_events.to_sql}) as max_events ON #{Lookout.visit.table_name}.id = max_events.visit_id")
end