2018-05-15 13:30:37 +02:00
package sqlstore
import (
"database/sql"
"time"
2018-09-19 08:21:04 +02:00
"github.com/usefathom/fathom/pkg/models"
2018-05-15 13:30:37 +02:00
)
2018-10-05 13:09:58 +02:00
func ( db * sqlstore ) GetSiteStats ( siteID int64 , date time . Time ) ( * models . SiteStats , error ) {
2018-10-05 14:19:11 +02:00
stats := & models . SiteStats { New : false }
2018-10-05 13:09:58 +02:00
query := db . Rebind ( ` SELECT * FROM daily_site_stats WHERE site_id = ? AND date = ? LIMIT 1 ` )
2018-10-10 09:02:32 +02:00
2018-10-05 13:09:58 +02:00
err := db . Get ( stats , query , siteID , date . Format ( "2006-01-02" ) )
2018-10-10 09:02:32 +02:00
if err == sql . ErrNoRows {
return nil , ErrNoResults
}
2018-10-05 14:34:39 +02:00
return stats , mapError ( err )
2018-05-15 13:30:37 +02:00
}
2018-10-05 14:19:11 +02:00
func ( db * sqlstore ) SaveSiteStats ( s * models . SiteStats ) error {
if s . New {
return db . insertSiteStats ( s )
}
return db . updateSiteStats ( s )
}
func ( db * sqlstore ) insertSiteStats ( s * models . SiteStats ) error {
query := db . Rebind ( ` INSERT INTO daily_site_stats(site_id, visitors, sessions, pageviews, bounce_rate, avg_duration, known_durations, date) VALUES(?, ?, ?, ?, ?, ?, ?, ?) ` )
2018-10-05 13:09:58 +02:00
_ , err := db . Exec ( query , s . SiteID , s . Visitors , s . Sessions , s . Pageviews , s . BounceRate , s . AvgDuration , s . KnownDurations , s . Date . Format ( "2006-01-02" ) )
2018-05-15 13:30:37 +02:00
return err
}
2018-10-05 14:19:11 +02:00
func ( db * sqlstore ) updateSiteStats ( s * models . SiteStats ) error {
2018-10-09 13:27:50 +02:00
query := db . Rebind ( ` UPDATE daily_site_stats SET visitors = ?, sessions = ?, pageviews = ?, bounce_rate = ?, avg_duration = ?, known_durations = ? WHERE site_id = ? AND date = ? ` )
2018-10-05 13:09:58 +02:00
_ , err := db . Exec ( query , s . Visitors , s . Sessions , s . Pageviews , s . BounceRate , s . AvgDuration , s . KnownDurations , s . SiteID , s . Date . Format ( "2006-01-02" ) )
2018-05-15 13:30:37 +02:00
return err
}
2018-10-05 13:09:58 +02:00
func ( db * sqlstore ) GetSiteStatsPerDay ( siteID int64 , startDate time . Time , endDate time . Time ) ( [ ] * models . SiteStats , error ) {
2018-05-22 12:23:17 +02:00
results := [ ] * models . SiteStats { }
2018-10-05 13:09:58 +02:00
sql := ` SELECT * FROM daily_site_stats WHERE site_id = ? AND date >= ? AND date <= ? `
2018-05-22 12:23:17 +02:00
query := db . Rebind ( sql )
2018-10-05 13:09:58 +02:00
err := db . Select ( & results , query , siteID , startDate . Format ( "2006-01-02" ) , endDate . Format ( "2006-01-02" ) )
2018-05-22 12:23:17 +02:00
return results , err
}
2018-10-05 13:09:58 +02:00
func ( db * sqlstore ) GetAggregatedSiteStats ( siteID int64 , startDate time . Time , endDate time . Time ) ( * models . SiteStats , error ) {
2018-06-04 12:53:17 +02:00
stats := & models . SiteStats { }
query := db . Rebind ( ` SELECT
COALESCE ( SUM ( pageviews ) , 0 ) AS pageviews ,
COALESCE ( SUM ( visitors ) , 0 ) AS visitors ,
COALESCE ( SUM ( sessions ) , 0 ) AS sessions ,
2018-10-09 13:27:50 +02:00
COALESCE ( SUM ( pageviews * avg_duration ) / NULLIF ( SUM ( pageviews ) , 0 ) , 0.00 ) AS avg_duration ,
COALESCE ( SUM ( sessions * bounce_rate ) / NULLIF ( SUM ( sessions ) , 0 ) , 0.00 ) AS bounce_rate
2018-10-05 13:09:58 +02:00
FROM daily_site_stats WHERE site_id = ? AND date >= ? AND date <= ? LIMIT 1 ` )
err := db . Get ( stats , query , siteID , startDate . Format ( "2006-01-02" ) , endDate . Format ( "2006-01-02" ) )
2018-10-05 14:34:39 +02:00
return stats , mapError ( err )
2018-06-04 12:53:17 +02:00
}
2018-10-05 13:09:58 +02:00
func ( db * sqlstore ) GetTotalSiteViews ( siteID int64 , startDate time . Time , endDate time . Time ) ( int64 , error ) {
sql := ` SELECT COALESCE(SUM(pageviews), 0) FROM daily_site_stats WHERE site_id = ? AND date >= ? AND date <= ? `
2018-05-15 13:30:37 +02:00
query := db . Rebind ( sql )
2018-10-05 13:09:58 +02:00
var total int64
err := db . Get ( & total , query , siteID , startDate . Format ( "2006-01-02" ) , endDate . Format ( "2006-01-02" ) )
2018-10-05 14:34:39 +02:00
return total , mapError ( err )
2018-05-15 13:30:37 +02:00
}
2018-10-05 13:09:58 +02:00
func ( db * sqlstore ) GetTotalSiteVisitors ( siteID int64 , startDate time . Time , endDate time . Time ) ( int64 , error ) {
sql := ` SELECT COALESCE(SUM(visitors), 0) FROM daily_site_stats WHERE site_id = ? AND date >= ? AND date <= ? `
2018-05-15 13:30:37 +02:00
query := db . Rebind ( sql )
2018-10-05 13:09:58 +02:00
var total int64
err := db . Get ( & total , query , siteID , startDate . Format ( "2006-01-02" ) , endDate . Format ( "2006-01-02" ) )
2018-10-05 14:34:39 +02:00
return total , mapError ( err )
2018-05-15 13:30:37 +02:00
}
2018-10-05 13:09:58 +02:00
func ( db * sqlstore ) GetTotalSiteSessions ( siteID int64 , startDate time . Time , endDate time . Time ) ( int64 , error ) {
sql := ` SELECT COALESCE(SUM(sessions), 0) FROM daily_site_stats WHERE site_id = ? AND date >= ? AND date <= ? `
2018-05-15 13:30:37 +02:00
query := db . Rebind ( sql )
2018-10-05 13:09:58 +02:00
var total int64
err := db . Get ( & total , query , siteID , startDate . Format ( "2006-01-02" ) , endDate . Format ( "2006-01-02" ) )
2018-10-05 14:34:39 +02:00
return total , mapError ( err )
2018-05-15 13:30:37 +02:00
}
2018-10-05 13:09:58 +02:00
func ( db * sqlstore ) GetAverageSiteDuration ( siteID int64 , startDate time . Time , endDate time . Time ) ( float64 , error ) {
2018-10-09 13:27:50 +02:00
sql := ` SELECT COALESCE(SUM(pageviews*avg_duration)/SUM(pageviews), 0.00) FROM daily_site_stats WHERE site_id = ? AND date >= ? AND date <= ? `
2018-05-15 13:30:37 +02:00
query := db . Rebind ( sql )
var total float64
2018-10-05 13:09:58 +02:00
err := db . Get ( & total , query , siteID , startDate . Format ( "2006-01-02" ) , endDate . Format ( "2006-01-02" ) )
2018-10-05 14:34:39 +02:00
return total , mapError ( err )
2018-05-15 13:30:37 +02:00
}
2018-10-05 13:09:58 +02:00
func ( db * sqlstore ) GetAverageSiteBounceRate ( siteID int64 , startDate time . Time , endDate time . Time ) ( float64 , error ) {
2018-10-09 13:27:50 +02:00
sql := ` SELECT COALESCE(SUM(sessions*bounce_rate)/SUM(sessions), 4) FROM daily_site_stats WHERE site_id = ? AND date >= ? AND date <= ? `
2018-05-15 13:30:37 +02:00
query := db . Rebind ( sql )
var total float64
2018-10-05 13:09:58 +02:00
err := db . Get ( & total , query , siteID , startDate . Format ( "2006-01-02" ) , endDate . Format ( "2006-01-02" ) )
2018-10-05 14:34:39 +02:00
return total , mapError ( err )
2018-05-15 13:30:37 +02:00
}
2018-10-05 13:09:58 +02:00
func ( db * sqlstore ) GetRealtimeVisitorCount ( siteID int64 ) ( int64 , error ) {
var siteTrackingID string
var total int64
if err := db . Get ( & siteTrackingID , db . Rebind ( ` SELECT tracking_id FROM sites WHERE id = ? ` ) , siteID ) ; err != nil && err != sql . ErrNoRows {
2018-10-05 14:34:39 +02:00
return 0 , mapError ( err )
2018-10-05 13:09:58 +02:00
}
2018-10-09 11:57:56 +02:00
sql := ` SELECT COUNT(*) FROM pageviews p WHERE ( site_tracking_id = ? OR ( ? = 1 AND site_tracking_id = "" )) AND ( duration = 0 OR is_bounce = TRUE) AND timestamp > ? `
2018-05-15 13:30:37 +02:00
query := db . Rebind ( sql )
2018-10-09 11:57:56 +02:00
if err := db . Get ( & total , query , siteTrackingID , siteID , time . Now ( ) . Add ( - 5 * time . Minute ) ) ; err != nil {
2018-10-05 14:34:39 +02:00
return 0 , mapError ( err )
2018-10-05 13:09:58 +02:00
}
return total , nil
2018-05-15 13:30:37 +02:00
}