2016-12-11 10:53:03 +00:00
|
|
|
package count
|
|
|
|
|
2016-12-11 13:50:01 +00:00
|
|
|
import (
|
2018-04-24 08:28:23 +00:00
|
|
|
"github.com/usefathom/fathom/pkg/datastore"
|
2016-12-11 10:53:03 +00:00
|
|
|
)
|
|
|
|
|
2016-12-24 13:12:01 +00:00
|
|
|
// RealtimeVisitors returns the total number of visitors in the last 3 minutes
|
|
|
|
func RealtimeVisitors() int {
|
|
|
|
var result int
|
2017-01-25 12:46:43 +00:00
|
|
|
datastore.DB.QueryRow(`
|
2016-12-24 13:12:01 +00:00
|
|
|
SELECT COUNT(DISTINCT(pv.visitor_id))
|
|
|
|
FROM pageviews pv
|
|
|
|
WHERE pv.timestamp >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 HOUR_MINUTE) AND pv.timestamp <= CURRENT_TIMESTAMP`).Scan(&result)
|
|
|
|
return result
|
|
|
|
}
|
2016-12-24 11:07:33 +00:00
|
|
|
|
2016-12-23 14:03:11 +00:00
|
|
|
// Visitors returns the number of total visitors between the given timestamps
|
2017-01-06 14:58:16 +00:00
|
|
|
func Visitors(before int64, after int64) int {
|
2016-12-11 13:50:01 +00:00
|
|
|
// get total
|
2017-01-25 12:46:43 +00:00
|
|
|
stmt, err := datastore.DB.Prepare(`
|
2016-12-11 10:53:03 +00:00
|
|
|
SELECT
|
2016-12-24 11:07:33 +00:00
|
|
|
SUM(t.count)
|
|
|
|
FROM total_visitors t
|
|
|
|
WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?`)
|
2016-12-11 13:50:01 +00:00
|
|
|
checkError(err)
|
|
|
|
defer stmt.Close()
|
2017-01-06 14:58:16 +00:00
|
|
|
var total int
|
2016-12-11 13:50:01 +00:00
|
|
|
stmt.QueryRow(before, after).Scan(&total)
|
|
|
|
return total
|
2016-12-11 10:53:03 +00:00
|
|
|
}
|
2016-12-11 11:52:10 +00:00
|
|
|
|
2016-12-23 14:03:11 +00:00
|
|
|
// VisitorsPerDay returns a point slice containing visitor data per day
|
2016-12-11 13:50:01 +00:00
|
|
|
func VisitorsPerDay(before int64, after int64) []Point {
|
2017-01-25 12:46:43 +00:00
|
|
|
stmt, err := datastore.DB.Prepare(`SELECT
|
2016-12-24 11:07:33 +00:00
|
|
|
SUM(t.count) AS count,
|
|
|
|
DATE_FORMAT(t.date, '%Y-%m-%d') AS date_group
|
|
|
|
FROM total_visitors t
|
|
|
|
WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?
|
2016-12-11 11:52:10 +00:00
|
|
|
GROUP BY date_group`)
|
2016-12-11 13:50:01 +00:00
|
|
|
checkError(err)
|
|
|
|
defer stmt.Close()
|
2016-12-11 11:52:10 +00:00
|
|
|
|
2016-12-11 13:50:01 +00:00
|
|
|
rows, err := stmt.Query(before, after)
|
|
|
|
checkError(err)
|
2016-12-11 11:52:10 +00:00
|
|
|
|
2016-12-23 14:03:11 +00:00
|
|
|
var results []Point
|
2016-12-11 13:50:01 +00:00
|
|
|
defer rows.Close()
|
|
|
|
for rows.Next() {
|
|
|
|
p := Point{}
|
|
|
|
err = rows.Scan(&p.Value, &p.Label)
|
|
|
|
checkError(err)
|
|
|
|
results = append(results, p)
|
|
|
|
}
|
2016-12-11 11:52:10 +00:00
|
|
|
|
2016-12-11 13:50:01 +00:00
|
|
|
return results
|
2016-12-11 11:52:10 +00:00
|
|
|
}
|
2016-12-11 15:23:13 +00:00
|
|
|
|
2016-12-24 13:14:25 +00:00
|
|
|
// CreateVisitorTotals aggregates visitor data into daily totals
|
2016-12-25 16:24:53 +00:00
|
|
|
func CreateVisitorTotals(since string) {
|
2017-01-25 12:46:43 +00:00
|
|
|
stmt, err := datastore.DB.Prepare(`
|
2016-12-11 15:23:13 +00:00
|
|
|
SELECT
|
|
|
|
COUNT(DISTINCT(pv.visitor_id)) AS count,
|
|
|
|
DATE_FORMAT(pv.timestamp, "%Y-%m-%d") AS date_group
|
|
|
|
FROM pageviews pv
|
2016-12-25 16:24:53 +00:00
|
|
|
WHERE pv.timestamp > ?
|
2016-12-11 15:23:13 +00:00
|
|
|
GROUP BY date_group`)
|
|
|
|
checkError(err)
|
|
|
|
defer stmt.Close()
|
|
|
|
|
2016-12-24 13:14:25 +00:00
|
|
|
rows, err := stmt.Query(since)
|
2016-12-11 15:23:13 +00:00
|
|
|
checkError(err)
|
|
|
|
defer rows.Close()
|
|
|
|
|
2017-01-25 12:46:43 +00:00
|
|
|
datastore.DB.Exec("START TRANSACTION")
|
2016-12-11 15:23:13 +00:00
|
|
|
for rows.Next() {
|
2016-12-24 11:07:33 +00:00
|
|
|
var t Total
|
|
|
|
err = rows.Scan(&t.Count, &t.Date)
|
|
|
|
checkError(err)
|
|
|
|
|
2017-01-25 12:46:43 +00:00
|
|
|
stmt, err := datastore.DB.Prepare(`INSERT INTO total_visitors(
|
2016-12-24 11:07:33 +00:00
|
|
|
count,
|
|
|
|
date
|
2016-12-25 16:24:53 +00:00
|
|
|
) VALUES( ?, ? ) ON DUPLICATE KEY UPDATE count = ?`)
|
2016-12-24 11:07:33 +00:00
|
|
|
checkError(err)
|
|
|
|
defer stmt.Close()
|
|
|
|
|
|
|
|
_, err = stmt.Exec(
|
|
|
|
t.Count,
|
|
|
|
t.Date,
|
2016-12-25 16:24:53 +00:00
|
|
|
t.Count,
|
2016-12-24 11:07:33 +00:00
|
|
|
)
|
2016-12-11 15:23:13 +00:00
|
|
|
checkError(err)
|
|
|
|
}
|
2017-01-25 12:46:43 +00:00
|
|
|
datastore.DB.Exec("COMMIT")
|
2016-12-11 15:23:13 +00:00
|
|
|
}
|