change precision on numeric columns for postgres so we don't have to apply rounding. closes #116

This commit is contained in:
Danny van Kooten 2018-10-09 13:27:50 +02:00
parent 0f0db205ae
commit 1b06bd3179
4 changed files with 23 additions and 11 deletions

View File

@ -0,0 +1,12 @@
-- +migrate Up
ALTER TABLE daily_site_stats ALTER COLUMN bounce_rate TYPE NUMERIC;
ALTER TABLE daily_page_stats ALTER COLUMN bounce_rate TYPE NUMERIC;
ALTER TABLE daily_referrer_stats ALTER COLUMN bounce_rate TYPE NUMERIC;
ALTER TABLE daily_site_stats ALTER COLUMN avg_duration TYPE NUMERIC;
ALTER TABLE daily_page_stats ALTER COLUMN avg_duration TYPE NUMERIC;
ALTER TABLE daily_referrer_stats ALTER COLUMN avg_duration TYPE NUMERIC;
-- +migrate Down

View File

@ -28,7 +28,7 @@ func (db *sqlstore) insertPageStats(s *models.PageStats) error {
} }
func (db *sqlstore) updatePageStats(s *models.PageStats) error { func (db *sqlstore) updatePageStats(s *models.PageStats) error {
query := db.Rebind(`UPDATE daily_page_stats SET pageviews = ?, visitors = ?, entries = ?, bounce_rate = ROUND(?, 4), avg_duration = ROUND(?, 4), known_durations = ? WHERE site_id = ? AND hostname = ? AND pathname = ? AND date = ?`) query := db.Rebind(`UPDATE daily_page_stats SET pageviews = ?, visitors = ?, entries = ?, bounce_rate = ?, avg_duration = ?, known_durations = ? WHERE site_id = ? AND hostname = ? AND pathname = ? AND date = ?`)
_, err := db.Exec(query, s.Pageviews, s.Visitors, s.Entries, s.BounceRate, s.AvgDuration, s.KnownDurations, s.SiteID, s.Hostname, s.Pathname, s.Date.Format("2006-01-02")) _, err := db.Exec(query, s.Pageviews, s.Visitors, s.Entries, s.BounceRate, s.AvgDuration, s.KnownDurations, s.SiteID, s.Hostname, s.Pathname, s.Date.Format("2006-01-02"))
return err return err
} }
@ -41,8 +41,8 @@ func (db *sqlstore) GetAggregatedPageStats(siteID int64, startDate time.Time, en
SUM(pageviews) AS pageviews, SUM(pageviews) AS pageviews,
SUM(visitors) AS visitors, SUM(visitors) AS visitors,
SUM(entries) AS entries, SUM(entries) AS entries,
COALESCE(ROUND(SUM(entries*bounce_rate) / NULLIF(SUM(entries), 0), 4), 0.00) AS bounce_rate, COALESCE(SUM(entries*bounce_rate) / NULLIF(SUM(entries), 0), 0.00) AS bounce_rate,
COALESCE(ROUND(SUM(avg_duration*pageviews) / SUM(pageviews), 4), 0.00) AS avg_duration COALESCE(SUM(avg_duration*pageviews) / SUM(pageviews), 0.00) AS avg_duration
FROM daily_page_stats WHERE site_id = ? AND date >= ? AND date <= ? FROM daily_page_stats WHERE site_id = ? AND date >= ? AND date <= ?
GROUP BY hostname, pathname GROUP BY hostname, pathname
ORDER BY pageviews DESC LIMIT ?`) ORDER BY pageviews DESC LIMIT ?`)

View File

@ -28,7 +28,7 @@ func (db *sqlstore) insertReferrerStats(s *models.ReferrerStats) error {
} }
func (db *sqlstore) updateReferrerStats(s *models.ReferrerStats) error { func (db *sqlstore) updateReferrerStats(s *models.ReferrerStats) error {
query := db.Rebind(`UPDATE daily_referrer_stats SET visitors = ?, pageviews = ?, bounce_rate = ROUND(?, 4), avg_duration = ROUND(?, 4), known_durations = ?, groupname = ? WHERE site_id = ? AND hostname = ? AND pathname = ? AND date = ?`) query := db.Rebind(`UPDATE daily_referrer_stats SET visitors = ?, pageviews = ?, bounce_rate = ?, avg_duration = ?, known_durations = ?, groupname = ? WHERE site_id = ? AND hostname = ? AND pathname = ? AND date = ?`)
_, err := db.Exec(query, s.Visitors, s.Pageviews, s.BounceRate, s.AvgDuration, s.KnownDurations, s.Group, s.SiteID, s.Hostname, s.Pathname, s.Date.Format("2006-01-02")) _, err := db.Exec(query, s.Visitors, s.Pageviews, s.BounceRate, s.AvgDuration, s.KnownDurations, s.Group, s.SiteID, s.Hostname, s.Pathname, s.Date.Format("2006-01-02"))
return err return err
} }
@ -42,8 +42,8 @@ func (db *sqlstore) GetAggregatedReferrerStats(siteID int64, startDate time.Time
COALESCE(MIN(groupname), '') AS groupname, COALESCE(MIN(groupname), '') AS groupname,
SUM(visitors) AS visitors, SUM(visitors) AS visitors,
SUM(pageviews) AS pageviews, SUM(pageviews) AS pageviews,
COALESCE(ROUND(SUM(pageviews*NULLIF(bounce_rate, 0)) / SUM(pageviews), 4), 0.00) AS bounce_rate, COALESCE(SUM(pageviews*NULLIF(bounce_rate, 0)) / SUM(pageviews), 0.00) AS bounce_rate,
COALESCE(ROUND(SUM(avg_duration*pageviews) / SUM(pageviews), 4), 0.00) AS avg_duration COALESCE(SUM(avg_duration*pageviews) / SUM(pageviews), 0.00) AS avg_duration
FROM daily_referrer_stats FROM daily_referrer_stats
WHERE site_id = ? AND date >= ? AND date <= ? ` WHERE site_id = ? AND date >= ? AND date <= ? `

View File

@ -29,7 +29,7 @@ func (db *sqlstore) insertSiteStats(s *models.SiteStats) error {
} }
func (db *sqlstore) updateSiteStats(s *models.SiteStats) error { func (db *sqlstore) updateSiteStats(s *models.SiteStats) error {
query := db.Rebind(`UPDATE daily_site_stats SET visitors = ?, sessions = ?, pageviews = ?, bounce_rate = ROUND(?, 4), avg_duration = ROUND(?, 4), known_durations = ? WHERE site_id = ? AND date = ?`) query := db.Rebind(`UPDATE daily_site_stats SET visitors = ?, sessions = ?, pageviews = ?, bounce_rate = ?, avg_duration = ?, known_durations = ? WHERE site_id = ? AND date = ?`)
_, err := db.Exec(query, s.Visitors, s.Sessions, s.Pageviews, s.BounceRate, s.AvgDuration, s.KnownDurations, s.SiteID, s.Date.Format("2006-01-02")) _, err := db.Exec(query, s.Visitors, s.Sessions, s.Pageviews, s.BounceRate, s.AvgDuration, s.KnownDurations, s.SiteID, s.Date.Format("2006-01-02"))
return err return err
} }
@ -48,8 +48,8 @@ func (db *sqlstore) GetAggregatedSiteStats(siteID int64, startDate time.Time, en
COALESCE(SUM(pageviews), 0) AS pageviews, COALESCE(SUM(pageviews), 0) AS pageviews,
COALESCE(SUM(visitors), 0) AS visitors, COALESCE(SUM(visitors), 0) AS visitors,
COALESCE(SUM(sessions), 0) AS sessions, COALESCE(SUM(sessions), 0) AS sessions,
COALESCE(ROUND(SUM(pageviews*avg_duration) / NULLIF(SUM(pageviews), 0), 4), 0.00) AS avg_duration, COALESCE(SUM(pageviews*avg_duration) / NULLIF(SUM(pageviews), 0), 0.00) AS avg_duration,
COALESCE(ROUND(SUM(sessions*bounce_rate) / NULLIF(SUM(sessions), 0), 4), 0.00) AS bounce_rate COALESCE(SUM(sessions*bounce_rate) / NULLIF(SUM(sessions), 0), 0.00) AS bounce_rate
FROM daily_site_stats WHERE site_id = ? AND date >= ? AND date <= ? LIMIT 1`) 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")) err := db.Get(stats, query, siteID, startDate.Format("2006-01-02"), endDate.Format("2006-01-02"))
return stats, mapError(err) return stats, mapError(err)
@ -80,7 +80,7 @@ func (db *sqlstore) GetTotalSiteSessions(siteID int64, startDate time.Time, endD
} }
func (db *sqlstore) GetAverageSiteDuration(siteID int64, startDate time.Time, endDate time.Time) (float64, error) { func (db *sqlstore) GetAverageSiteDuration(siteID int64, startDate time.Time, endDate time.Time) (float64, error) {
sql := `SELECT COALESCE(ROUND(SUM(pageviews*avg_duration)/SUM(pageviews), 4), 0.00) FROM daily_site_stats WHERE site_id = ? AND date >= ? AND date <= ?` sql := `SELECT COALESCE(SUM(pageviews*avg_duration)/SUM(pageviews), 0.00) FROM daily_site_stats WHERE site_id = ? AND date >= ? AND date <= ?`
query := db.Rebind(sql) query := db.Rebind(sql)
var total float64 var total float64
err := db.Get(&total, query, siteID, startDate.Format("2006-01-02"), endDate.Format("2006-01-02")) err := db.Get(&total, query, siteID, startDate.Format("2006-01-02"), endDate.Format("2006-01-02"))
@ -88,7 +88,7 @@ func (db *sqlstore) GetAverageSiteDuration(siteID int64, startDate time.Time, en
} }
func (db *sqlstore) GetAverageSiteBounceRate(siteID int64, startDate time.Time, endDate time.Time) (float64, error) { func (db *sqlstore) GetAverageSiteBounceRate(siteID int64, startDate time.Time, endDate time.Time) (float64, error) {
sql := `SELECT COALESCE(ROUND(SUM(sessions*bounce_rate)/SUM(sessions), 4), 0.00) FROM daily_site_stats WHERE site_id = ? AND date >= ? AND date <= ?` sql := `SELECT COALESCE(SUM(sessions*bounce_rate)/SUM(sessions), 4) FROM daily_site_stats WHERE site_id = ? AND date >= ? AND date <= ?`
query := db.Rebind(sql) query := db.Rebind(sql)
var total float64 var total float64
err := db.Get(&total, query, siteID, startDate.Format("2006-01-02"), endDate.Format("2006-01-02")) err := db.Get(&total, query, siteID, startDate.Format("2006-01-02"), endDate.Format("2006-01-02"))