mirror of https://github.com/status-im/fathom.git
sqlstore GetXStats funcs should return nil when there are 0 results. #50
This commit is contained in:
parent
901e09bcac
commit
ce8f585827
|
@ -9,19 +9,25 @@ import (
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
type aggregator struct {
|
type Aggregator struct {
|
||||||
database datastore.Datastore
|
database datastore.Datastore
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type results struct {
|
||||||
|
Sites map[string]*models.SiteStats
|
||||||
|
Pages map[string]*models.PageStats
|
||||||
|
Referrers map[string]*models.ReferrerStats
|
||||||
|
}
|
||||||
|
|
||||||
// New returns a new aggregator instance with the database dependency injected.
|
// New returns a new aggregator instance with the database dependency injected.
|
||||||
func New(db datastore.Datastore) *aggregator {
|
func New(db datastore.Datastore) *Aggregator {
|
||||||
return &aggregator{
|
return &Aggregator{
|
||||||
database: db,
|
database: db,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run processes the pageviews which are ready to be processed and adds them to daily aggregation
|
// Run processes the pageviews which are ready to be processed and adds them to daily aggregation
|
||||||
func (agg *aggregator) Run() int {
|
func (agg *Aggregator) Run() int {
|
||||||
// Get unprocessed pageviews
|
// Get unprocessed pageviews
|
||||||
pageviews, err := agg.database.GetProcessablePageviews()
|
pageviews, err := agg.database.GetProcessablePageviews()
|
||||||
if err != nil && err != datastore.ErrNoResults {
|
if err != nil && err != datastore.ErrNoResults {
|
||||||
|
@ -51,17 +57,20 @@ func (agg *aggregator) Run() int {
|
||||||
|
|
||||||
// create map of public tracking ID's => site ID
|
// create map of public tracking ID's => site ID
|
||||||
trackingIDMap := make(map[string]int64, len(sites)+1)
|
trackingIDMap := make(map[string]int64, len(sites)+1)
|
||||||
trackingIDMap[""] = 1
|
|
||||||
for _, s := range sites {
|
for _, s := range sites {
|
||||||
trackingIDMap[s.TrackingID] = s.ID
|
trackingIDMap[s.TrackingID] = s.ID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if no explicit site ID was given in the tracking request, default to site with ID 1
|
||||||
|
trackingIDMap[""] = 1
|
||||||
|
|
||||||
// add each pageview to the various statistics we gather
|
// add each pageview to the various statistics we gather
|
||||||
for _, p := range pageviews {
|
for _, p := range pageviews {
|
||||||
|
|
||||||
// discard pageview if site tracking ID is unknown
|
// discard pageview if site tracking ID is unknown
|
||||||
siteID, ok := trackingIDMap[p.SiteTrackingID]
|
siteID, ok := trackingIDMap[p.SiteTrackingID]
|
||||||
if !ok {
|
if !ok {
|
||||||
|
log.Debugf("discarding pageview because of unrecognized site tracking ID %s", p.SiteTrackingID)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,29 +109,25 @@ func (agg *aggregator) Run() int {
|
||||||
|
|
||||||
// update stats
|
// update stats
|
||||||
for _, site := range results.Sites {
|
for _, site := range results.Sites {
|
||||||
err = agg.database.SaveSiteStats(site)
|
if err := agg.database.SaveSiteStats(site); err != nil {
|
||||||
if err != nil {
|
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, pageStats := range results.Pages {
|
for _, pageStats := range results.Pages {
|
||||||
err = agg.database.SavePageStats(pageStats)
|
if err := agg.database.SavePageStats(pageStats); err != nil {
|
||||||
if err != nil {
|
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, referrerStats := range results.Referrers {
|
for _, referrerStats := range results.Referrers {
|
||||||
err = agg.database.SaveReferrerStats(referrerStats)
|
if err := agg.database.SaveReferrerStats(referrerStats); err != nil {
|
||||||
if err != nil {
|
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// finally, remove pageviews that we just processed
|
// finally, remove pageviews that we just processed
|
||||||
err = agg.database.DeletePageviews(pageviews)
|
if err := agg.database.DeletePageviews(pageviews); err != nil {
|
||||||
if err != nil {
|
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
package aggregator
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/usefathom/fathom/pkg/models"
|
|
||||||
)
|
|
||||||
|
|
||||||
type results struct {
|
|
||||||
Sites map[string]*models.SiteStats
|
|
||||||
Pages map[string]*models.PageStats
|
|
||||||
Referrers map[string]*models.ReferrerStats
|
|
||||||
}
|
|
||||||
|
|
||||||
func newResults() *results {
|
|
||||||
return &results{
|
|
||||||
Sites: map[string]*models.SiteStats{},
|
|
||||||
Pages: map[string]*models.PageStats{},
|
|
||||||
Referrers: map[string]*models.ReferrerStats{},
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
"github.com/usefathom/fathom/pkg/models"
|
"github.com/usefathom/fathom/pkg/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (agg *aggregator) getSiteStats(r *results, siteID int64, t time.Time) (*models.SiteStats, error) {
|
func (agg *Aggregator) getSiteStats(r *results, siteID int64, t time.Time) (*models.SiteStats, error) {
|
||||||
// get from map
|
// get from map
|
||||||
cacheKey := fmt.Sprintf("%d-%s", siteID, t.Format("2006-01-02"))
|
cacheKey := fmt.Sprintf("%d-%s", siteID, t.Format("2006-01-02"))
|
||||||
if stats, ok := r.Sites[cacheKey]; ok {
|
if stats, ok := r.Sites[cacheKey]; ok {
|
||||||
|
@ -35,7 +35,7 @@ func (agg *aggregator) getSiteStats(r *results, siteID int64, t time.Time) (*mod
|
||||||
return stats, nil
|
return stats, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (agg *aggregator) getPageStats(r *results, siteID int64, t time.Time, hostname string, pathname string) (*models.PageStats, error) {
|
func (agg *Aggregator) getPageStats(r *results, siteID int64, t time.Time, hostname string, pathname string) (*models.PageStats, error) {
|
||||||
cacheKey := fmt.Sprintf("%d-%s-%s-%s", siteID, t.Format("2006-01-02"), hostname, pathname)
|
cacheKey := fmt.Sprintf("%d-%s-%s-%s", siteID, t.Format("2006-01-02"), hostname, pathname)
|
||||||
if stats, ok := r.Pages[cacheKey]; ok {
|
if stats, ok := r.Pages[cacheKey]; ok {
|
||||||
return stats, nil
|
return stats, nil
|
||||||
|
@ -61,7 +61,7 @@ func (agg *aggregator) getPageStats(r *results, siteID int64, t time.Time, hostn
|
||||||
return stats, nil
|
return stats, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (agg *aggregator) getReferrerStats(r *results, siteID int64, t time.Time, hostname string, pathname string) (*models.ReferrerStats, error) {
|
func (agg *Aggregator) getReferrerStats(r *results, siteID int64, t time.Time, hostname string, pathname string) (*models.ReferrerStats, error) {
|
||||||
cacheKey := fmt.Sprintf("%d-%s-%s-%s", siteID, t.Format("2006-01-02"), hostname, pathname)
|
cacheKey := fmt.Sprintf("%d-%s-%s-%s", siteID, t.Format("2006-01-02"), hostname, pathname)
|
||||||
if stats, ok := r.Referrers[cacheKey]; ok {
|
if stats, ok := r.Referrers[cacheKey]; ok {
|
||||||
return stats, nil
|
return stats, nil
|
||||||
|
|
|
@ -1,15 +1,20 @@
|
||||||
package sqlstore
|
package sqlstore
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"database/sql"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/usefathom/fathom/pkg/models"
|
"github.com/usefathom/fathom/pkg/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (db *sqlstore) GetPageStats(siteID int64, date time.Time, hostname string, pathname string) (*models.PageStats, error) {
|
func (db *sqlstore) GetPageStats(siteID int64, date time.Time, hostname string, pathname string) (*models.PageStats, error) {
|
||||||
stats := &models.PageStats{}
|
stats := &models.PageStats{New: false}
|
||||||
query := db.Rebind(`SELECT * FROM daily_page_stats WHERE site_id = ? AND hostname = ? AND pathname = ? AND date = ? LIMIT 1`)
|
query := db.Rebind(`SELECT * FROM daily_page_stats WHERE site_id = ? AND hostname = ? AND pathname = ? AND date = ? LIMIT 1`)
|
||||||
err := db.Get(stats, query, siteID, hostname, pathname, date.Format("2006-01-02"))
|
err := db.Get(stats, query, siteID, hostname, pathname, date.Format("2006-01-02"))
|
||||||
|
if err == sql.ErrNoRows {
|
||||||
|
return nil, ErrNoResults
|
||||||
|
}
|
||||||
|
|
||||||
return stats, mapError(err)
|
return stats, mapError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,20 @@
|
||||||
package sqlstore
|
package sqlstore
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"database/sql"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/usefathom/fathom/pkg/models"
|
"github.com/usefathom/fathom/pkg/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (db *sqlstore) GetReferrerStats(siteID int64, date time.Time, hostname string, pathname string) (*models.ReferrerStats, error) {
|
func (db *sqlstore) GetReferrerStats(siteID int64, date time.Time, hostname string, pathname string) (*models.ReferrerStats, error) {
|
||||||
stats := &models.ReferrerStats{}
|
stats := &models.ReferrerStats{New: false}
|
||||||
query := db.Rebind(`SELECT * FROM daily_referrer_stats WHERE site_id = ? AND date = ? AND hostname = ? AND pathname = ? LIMIT 1`)
|
query := db.Rebind(`SELECT * FROM daily_referrer_stats WHERE site_id = ? AND date = ? AND hostname = ? AND pathname = ? LIMIT 1`)
|
||||||
err := db.Get(stats, query, siteID, date.Format("2006-01-02"), hostname, pathname)
|
err := db.Get(stats, query, siteID, date.Format("2006-01-02"), hostname, pathname)
|
||||||
|
if err == sql.ErrNoRows {
|
||||||
|
return nil, ErrNoResults
|
||||||
|
}
|
||||||
|
|
||||||
return stats, mapError(err)
|
return stats, mapError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,12 @@ import (
|
||||||
func (db *sqlstore) GetSiteStats(siteID int64, date time.Time) (*models.SiteStats, error) {
|
func (db *sqlstore) GetSiteStats(siteID int64, date time.Time) (*models.SiteStats, error) {
|
||||||
stats := &models.SiteStats{New: false}
|
stats := &models.SiteStats{New: false}
|
||||||
query := db.Rebind(`SELECT * FROM daily_site_stats WHERE site_id = ? AND date = ? LIMIT 1`)
|
query := db.Rebind(`SELECT * FROM daily_site_stats WHERE site_id = ? AND date = ? LIMIT 1`)
|
||||||
|
|
||||||
err := db.Get(stats, query, siteID, date.Format("2006-01-02"))
|
err := db.Get(stats, query, siteID, date.Format("2006-01-02"))
|
||||||
|
if err == sql.ErrNoRows {
|
||||||
|
return nil, ErrNoResults
|
||||||
|
}
|
||||||
|
|
||||||
return stats, mapError(err)
|
return stats, mapError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue