abstract total visitor count away into count package

This commit is contained in:
Danny van Kooten 2016-12-11 11:53:03 +01:00
parent f25c18a7fe
commit 2f110fc059
12 changed files with 58 additions and 84 deletions

View File

@ -10,7 +10,7 @@ import (
type Datapoint struct { type Datapoint struct {
Count int Count int
Label string Label string
Percentage float32 `json:",omitempty"` Percentage float64 `json:",omitempty"`
} }
const defaultPeriod = 7 const defaultPeriod = 7

View File

@ -3,6 +3,7 @@ package api
import ( import (
"net/http" "net/http"
"github.com/dannyvankooten/ana/db" "github.com/dannyvankooten/ana/db"
"github.com/dannyvankooten/ana/count"
"encoding/json" "encoding/json"
) )
@ -11,19 +12,10 @@ var GetBrowsersHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Re
before, after := getRequestedPeriods(r) before, after := getRequestedPeriods(r)
// get total // get total
stmt, err := db.Conn.Prepare(` total := count.TotalVisitors(before, after)
SELECT
COUNT(DISTINCT(pv.visitor_id))
FROM pageviews pv
WHERE UNIX_TIMESTAMP(pv.timestamp) <= ? AND UNIX_TIMESTAMP(pv.timestamp) >= ?
`)
checkError(err)
defer stmt.Close()
var total float32
stmt.QueryRow(before, after).Scan(&total)
// get rows // get rows
stmt, err = db.Conn.Prepare(` stmt, err := db.Conn.Prepare(`
SELECT SELECT
v.browser_name, v.browser_name,
COUNT(DISTINCT(pv.visitor_id)) AS count COUNT(DISTINCT(pv.visitor_id)) AS count
@ -45,7 +37,7 @@ var GetBrowsersHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Re
err = rows.Scan(&d.Label, &d.Count); err = rows.Scan(&d.Label, &d.Count);
checkError(err) checkError(err)
d.Percentage = float32(d.Count) / total * 100 d.Percentage = float64(d.Count) / total * 100
results = append(results, d) results = append(results, d)
} }

View File

@ -3,6 +3,7 @@ package api
import ( import (
"net/http" "net/http"
"github.com/dannyvankooten/ana/db" "github.com/dannyvankooten/ana/db"
"github.com/dannyvankooten/ana/count"
"encoding/json" "encoding/json"
) )
@ -11,19 +12,10 @@ var GetCountriesHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.R
before, after := getRequestedPeriods(r) before, after := getRequestedPeriods(r)
// get total // get total
stmt, err := db.Conn.Prepare(` total := count.TotalVisitors(before, after)
SELECT
COUNT(DISTINCT(pv.visitor_id))
FROM pageviews pv
WHERE UNIX_TIMESTAMP(pv.timestamp) <= ? AND UNIX_TIMESTAMP(pv.timestamp) >= ?
`)
checkError(err)
defer stmt.Close()
var total float32
stmt.QueryRow(before, after).Scan(&total)
// get rows // get rows
stmt, err = db.Conn.Prepare(` stmt, err := db.Conn.Prepare(`
SELECT SELECT
v.country, v.country,
COUNT(DISTINCT(pv.visitor_id)) AS count COUNT(DISTINCT(pv.visitor_id)) AS count
@ -45,7 +37,7 @@ var GetCountriesHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.R
err = rows.Scan(&d.Label, &d.Count); err = rows.Scan(&d.Label, &d.Count);
checkError(err) checkError(err)
d.Percentage = float32(d.Count) / total * 100 d.Percentage = float64(d.Count) / total * 100
results = append(results, d) results = append(results, d)
} }

View File

@ -3,6 +3,7 @@ package api
import ( import (
"net/http" "net/http"
"github.com/dannyvankooten/ana/db" "github.com/dannyvankooten/ana/db"
"github.com/dannyvankooten/ana/count"
"encoding/json" "encoding/json"
) )
@ -10,19 +11,10 @@ import (
var GetLanguagesHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var GetLanguagesHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
before, after := getRequestedPeriods(r) before, after := getRequestedPeriods(r)
stmt, err := db.Conn.Prepare(` // get total
SELECT total := count.TotalVisitors(before, after)
COUNT(DISTINCT(pv.visitor_id))
FROM pageviews pv
LEFT JOIN visitors v ON v.id = pv.visitor_id
WHERE UNIX_TIMESTAMP(pv.timestamp) <= ? AND UNIX_TIMESTAMP(pv.timestamp) >= ?
`)
checkError(err)
defer stmt.Close()
var total float32
stmt.QueryRow(before, after).Scan(&total)
stmt, err = db.Conn.Prepare(` stmt, err := db.Conn.Prepare(`
SELECT SELECT
v.browser_language, v.browser_language,
COUNT(v.id) AS count COUNT(v.id) AS count
@ -46,7 +38,7 @@ var GetLanguagesHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.R
err = rows.Scan(&d.Label, &d.Count); err = rows.Scan(&d.Label, &d.Count);
checkError(err) checkError(err)
d.Percentage = float32(d.Count) / total * 100 d.Percentage = float64(d.Count) / total * 100
results = append(results, d) results = append(results, d)
} }

View File

@ -51,7 +51,7 @@ var GetPageviewsCountHandler = http.HandlerFunc(func(w http.ResponseWriter, r *h
before, after := getRequestedPeriods(r) before, after := getRequestedPeriods(r)
stmt, err := db.Conn.Prepare(` stmt, err := db.Conn.Prepare(`
SELECT SELECT
SUM(a.count) AS count SUM(a.count) AS count
FROM archive a FROM archive a
WHERE a.metric = 'pageviews' AND UNIX_TIMESTAMP(a.date) <= ? AND UNIX_TIMESTAMP(a.date) >= ?`) WHERE a.metric = 'pageviews' AND UNIX_TIMESTAMP(a.date) <= ? AND UNIX_TIMESTAMP(a.date) >= ?`)
checkError(err) checkError(err)

View File

@ -3,6 +3,7 @@ package api
import ( import (
"net/http" "net/http"
"github.com/dannyvankooten/ana/db" "github.com/dannyvankooten/ana/db"
"github.com/dannyvankooten/ana/count"
"encoding/json" "encoding/json"
"strings" "strings"
) )
@ -12,18 +13,10 @@ var GetReferrersHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.R
before, after := getRequestedPeriods(r) before, after := getRequestedPeriods(r)
// get total // get total
stmt, err := db.Conn.Prepare(` total := count.TotalVisitors(before, after)
SELECT
COUNT(DISTINCT(pv.visitor_id))
FROM pageviews pv
WHERE UNIX_TIMESTAMP(pv.timestamp) <= ? AND UNIX_TIMESTAMP(pv.timestamp) >= ?`)
checkError(err)
defer stmt.Close()
var total float32
stmt.QueryRow(before, after).Scan(&total)
// get rows // get rows
stmt, err = db.Conn.Prepare(` stmt, err := db.Conn.Prepare(`
SELECT SELECT
pv.referrer_url, pv.referrer_url,
COUNT(DISTINCT(pv.visitor_id)) AS count COUNT(DISTINCT(pv.visitor_id)) AS count
@ -49,7 +42,7 @@ var GetReferrersHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.R
d.Label = strings.TrimRight(d.Label, "/") d.Label = strings.TrimRight(d.Label, "/")
checkError(err) checkError(err)
d.Percentage = float32(d.Count) / total * 100 d.Percentage = float64(d.Count) / total * 100
results = append(results, d) results = append(results, d)
} }

View File

@ -3,6 +3,7 @@ package api
import ( import (
"net/http" "net/http"
"github.com/dannyvankooten/ana/db" "github.com/dannyvankooten/ana/db"
"github.com/dannyvankooten/ana/count"
"encoding/json" "encoding/json"
) )
@ -11,18 +12,10 @@ var GetScreenResolutionsHandler = http.HandlerFunc(func(w http.ResponseWriter, r
before, after := getRequestedPeriods(r) before, after := getRequestedPeriods(r)
// get total // get total
stmt, err := db.Conn.Prepare(` total := count.TotalVisitors(before, after)
SELECT
COUNT(DISTINCT(pv.visitor_id))
FROM pageviews pv
WHERE UNIX_TIMESTAMP(pv.timestamp) <= ? AND UNIX_TIMESTAMP(pv.timestamp) >= ?`)
checkError(err)
defer stmt.Close()
var total float32
stmt.QueryRow(before, after).Scan(&total)
// get rows // get rows
stmt, err = db.Conn.Prepare(` stmt, err := db.Conn.Prepare(`
SELECT SELECT
v.screen_resolution, v.screen_resolution,
COUNT(DISTINCT(pv.visitor_id)) AS count COUNT(DISTINCT(pv.visitor_id)) AS count
@ -44,7 +37,7 @@ var GetScreenResolutionsHandler = http.HandlerFunc(func(w http.ResponseWriter, r
err = rows.Scan(&d.Label, &d.Count); err = rows.Scan(&d.Label, &d.Count);
checkError(err) checkError(err)
d.Percentage = float32(d.Count) / total * 100 d.Percentage = float64(d.Count) / total * 100
results = append(results, d) results = append(results, d)
} }

View File

@ -15,9 +15,7 @@ var GetVisitorsCountHandler = http.HandlerFunc(func(w http.ResponseWriter, r *ht
SELECT SELECT
SUM(a.count) SUM(a.count)
FROM archive a FROM archive a
WHERE a.metric = 'visitors' AND UNIX_TIMESTAMP(a.date) <= ? AND UNIX_TIMESTAMP(a.date) >= ? WHERE a.metric = 'visitors' AND UNIX_TIMESTAMP(a.date) <= ? AND UNIX_TIMESTAMP(a.date) >= ?`)
`)
checkError(err) checkError(err)
defer stmt.Close() defer stmt.Close()

View File

@ -2,6 +2,7 @@ package commands
import( import(
"github.com/dannyvankooten/ana/db" "github.com/dannyvankooten/ana/db"
"github.com/dannyvankooten/ana/count"
) )
func seedData() { func seedData() {
@ -9,5 +10,5 @@ func seedData() {
} }
func archiveData() { func archiveData() {
db.CreateArchives() count.CreateArchives()
} }

View File

@ -1,11 +1,11 @@
package db package count
import( import(
"database/sql" "database/sql"
"log" "log"
"github.com/dannyvankooten/ana/db"
) )
type Archive struct { type Archive struct {
ID int64 ID int64
Metric string Metric string
@ -14,8 +14,8 @@ type Archive struct {
Date string Date string
} }
func (a *Archive) Save(conn *sql.DB) error { func (a *Archive) Save(Conn *sql.DB) error {
stmt, err := conn.Prepare(`INSERT INTO archive( stmt, err := db.Conn.Prepare(`INSERT INTO archive(
metric, metric,
value, value,
count, count,
@ -44,7 +44,7 @@ func CreateArchives() {
} }
func CreatePageviewArchives() { func CreatePageviewArchives() {
stmt, err := Conn.Prepare(` stmt, err := db.Conn.Prepare(`
SELECT SELECT
COUNT(*) AS count, COUNT(*) AS count,
DATE_FORMAT(pv.timestamp, "%Y-%m-%d") AS date_group DATE_FORMAT(pv.timestamp, "%Y-%m-%d") AS date_group
@ -62,7 +62,7 @@ func CreatePageviewArchives() {
checkError(err) checkError(err)
defer rows.Close() defer rows.Close()
Conn.Exec("START TRANSACTION") db.Conn.Exec("START TRANSACTION")
for rows.Next() { for rows.Next() {
a := Archive{ a := Archive{
Metric: "pageviews", Metric: "pageviews",
@ -70,21 +70,14 @@ func CreatePageviewArchives() {
} }
err = rows.Scan(&a.Count, &a.Date); err = rows.Scan(&a.Count, &a.Date);
checkError(err) checkError(err)
a.Save(Conn) a.Save(db.Conn)
} }
Conn.Exec("COMMIT") db.Conn.Exec("COMMIT")
} }
func CreateVisitorArchives() { func CreateVisitorArchives() {
/* stmt, err := db.Conn.Prepare(`
SELECT
COUNT(DISTINCT(visitor_id)) AS count, DATE_FORMAT(timestamp, ?) AS date_group
FROM pageviews pv
WHERE UNIX_TIMESTAMP(pv.timestamp) <= ? AND UNIX_TIMESTAMP(pv.timestamp) >= ?
GROUP BY date_group
*/
stmt, err := Conn.Prepare(`
SELECT SELECT
COUNT(DISTINCT(pv.visitor_id)) AS count, COUNT(DISTINCT(pv.visitor_id)) AS count,
DATE_FORMAT(pv.timestamp, "%Y-%m-%d") AS date_group DATE_FORMAT(pv.timestamp, "%Y-%m-%d") AS date_group
@ -102,7 +95,7 @@ func CreateVisitorArchives() {
checkError(err) checkError(err)
defer rows.Close() defer rows.Close()
Conn.Exec("START TRANSACTION") db.Conn.Exec("START TRANSACTION")
for rows.Next() { for rows.Next() {
a := Archive{ a := Archive{
Metric: "visitors", Metric: "visitors",
@ -110,9 +103,9 @@ func CreateVisitorArchives() {
} }
err = rows.Scan(&a.Count, &a.Date); err = rows.Scan(&a.Count, &a.Date);
checkError(err) checkError(err)
a.Save(Conn) a.Save(db.Conn)
} }
Conn.Exec("COMMIT") db.Conn.Exec("COMMIT")
} }
func checkError(err error) { func checkError(err error) {

19
count/totals.go Normal file
View File

@ -0,0 +1,19 @@
package count
import(
"github.com/dannyvankooten/ana/db"
)
func TotalVisitors(before int64, after int64) float64 {
// get total
stmt, err := db.Conn.Prepare(`
SELECT
SUM(a.count)
FROM archive a
WHERE a.metric = 'visitors' AND UNIX_TIMESTAMP(a.date) <= ? AND UNIX_TIMESTAMP(a.date) >= ?`)
checkError(err)
defer stmt.Close()
var total float64
stmt.QueryRow(before, after).Scan(&total)
return total
}

1
do
View File

@ -8,6 +8,7 @@ install_dependencies() {
go get "github.com/Pallinder/go-randomdata" go get "github.com/Pallinder/go-randomdata"
go get "github.com/gorilla/handlers" go get "github.com/gorilla/handlers"
go get "github.com/go-sql-driver/mysql" go get "github.com/go-sql-driver/mysql"
go get -u "github.com/mattes/migrate"
} }
bin() { bin() {