From 4b004a803cf2a19699be4941a007a81924baeb66 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Else Date: Wed, 1 May 2019 12:17:37 +0200 Subject: [PATCH] Add limit filter and rename orderrow to ordercol Idk why I'm so stupid and confused rows and columns --- README.md | 4 +++- database.go | 26 ++++++++++++++++---------- main.go | 3 ++- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 19f78ab..88f15cc 100644 --- a/README.md +++ b/README.md @@ -64,10 +64,12 @@ The following filters are available: `ua`: filter user agents containing the string provided, so `Firefox` filters out all user agents that don't contain `Firefox` -`orderrow`: row to use for ordering, `first` for the data groups, `second` for the view counts +`ordercol`: column to use for ordering, `first` for the data groups, `second` for the view counts `order`: select whether to use ascending order (`ASC`) or descending order (`DESC`) +`limit`: limit the number of rows returned + `format`: the format to represent the data, default is `plain` for a simple plain text list, `json` for a JSON response or `chart` for a chart generated with ChartJS in the browser ## Daily email reports diff --git a/database.go b/database.go index 02c091e..0a07646 100644 --- a/database.go +++ b/database.go @@ -85,8 +85,9 @@ type ViewsRequest struct { url string ref string ua string - orderrow string + ordercol string order string + limit string } type RequestResultRow struct { @@ -134,26 +135,31 @@ func (request *ViewsRequest) buildStatement() (statement string, parameters []sq } orderrow := "first" order := "ASC" - if request.orderrow == "second" { + if request.ordercol == "second" { orderrow = "second" } if request.order == "DESC" { order = "DESC" } - orderstatement := " ORDER BY " + orderrow + " " + order + orderStatement := " ORDER BY " + orderrow + " " + order + limitStatement := "" + if len(request.limit) != 0 { + limitStatement = " LIMIT :limit" + parameters = append(parameters, sql.Named("limit", request.limit)) + } switch request.view { case PAGES: - statement = "SELECT url as first, count(*) as second from views" + filters + "group by first" + orderstatement + ";" + statement = "SELECT url as first, count(*) as second from views" + filters + "group by first" + orderStatement + limitStatement + ";" case REFERRERS: - statement = "SELECT ref as first, count(*) as second from views" + filters + "group by first" + orderstatement + ";" + statement = "SELECT ref as first, count(*) as second from views" + filters + "group by first" + orderStatement + limitStatement + ";" case USERAGENTS: - statement = "SELECT useragent as first, count(*) as second from views" + filters + "group by first" + orderstatement + ";" + statement = "SELECT useragent as first, count(*) as second from views" + filters + "group by first" + orderStatement + limitStatement + ";" case USERAGENTNAMES: - statement = "SELECT substr(useragent, 1, pos-1) as first, COUNT(*) as second from (SELECT *, instr(useragent,' ') AS pos FROM views)" + filters + "group by first" + orderstatement + ";" + statement = "SELECT substr(useragent, 1, pos-1) as first, COUNT(*) as second from (SELECT *, instr(useragent,' ') AS pos FROM views)" + filters + "group by first" + orderStatement + limitStatement + ";" case ALLHOURS: - statement = "WITH RECURSIVE hours(hour) AS ( VALUES (datetime(strftime('%Y-%m-%dT%H:00', (SELECT min(time) from views" + filters + "), 'localtime'))) UNION ALL SELECT datetime(hour, '+1 hour') FROM hours WHERE hour <= strftime('%Y-%m-%d %H', (SELECT max(time) from views" + filters + "), 'localtime') ) SELECT strftime('%Y-%m-%d %H', hours.hour) as first, COUNT(time) as second FROM hours LEFT OUTER JOIN (SELECT time from views" + filters + ") ON strftime('%Y-%m-%d %H', hours.hour) = strftime('%Y-%m-%d %H', time, 'localtime') GROUP BY first" + orderstatement + ";" + statement = "WITH RECURSIVE hours(hour) AS ( VALUES (datetime(strftime('%Y-%m-%dT%H:00', (SELECT min(time) from views" + filters + "), 'localtime'))) UNION ALL SELECT datetime(hour, '+1 hour') FROM hours WHERE hour <= strftime('%Y-%m-%d %H', (SELECT max(time) from views" + filters + "), 'localtime') ) SELECT strftime('%Y-%m-%d %H', hours.hour) as first, COUNT(time) as second FROM hours LEFT OUTER JOIN (SELECT time from views" + filters + ") ON strftime('%Y-%m-%d %H', hours.hour) = strftime('%Y-%m-%d %H', time, 'localtime') GROUP BY first" + orderStatement + limitStatement + ";" case ALLDAYS: - statement = "WITH RECURSIVE days(day) AS ( VALUES (datetime((SELECT min(time) from views" + filters + "), 'localtime', 'start of day')) UNION ALL SELECT datetime(day, '+1 day') FROM days WHERE day <= date((SELECT max(time) from views" + filters + "), 'localtime') ) SELECT strftime('%Y-%m-%d', days.day) as first, COUNT(time) as second FROM days LEFT OUTER JOIN (SELECT time from views" + filters + ") ON strftime('%Y-%m-%d', days.day) = strftime('%Y-%m-%d', time, 'localtime') GROUP BY first" + orderstatement + ";" + statement = "WITH RECURSIVE days(day) AS ( VALUES (datetime((SELECT min(time) from views" + filters + "), 'localtime', 'start of day')) UNION ALL SELECT datetime(day, '+1 day') FROM days WHERE day <= date((SELECT max(time) from views" + filters + "), 'localtime') ) SELECT strftime('%Y-%m-%d', days.day) as first, COUNT(time) as second FROM days LEFT OUTER JOIN (SELECT time from views" + filters + ") ON strftime('%Y-%m-%d', days.day) = strftime('%Y-%m-%d', time, 'localtime') GROUP BY first" + orderStatement + limitStatement + ";" case HOURS, DAYS, WEEKS, MONTHS: format := "" switch request.view { @@ -166,7 +172,7 @@ func (request *ViewsRequest) buildStatement() (statement string, parameters []sq case MONTHS: format = "%Y-%m" } - statement = "SELECT strftime('" + format + "', time, 'localtime') as first, count(*) as second from views" + filters + "group by first" + orderstatement + ";" + statement = "SELECT strftime('" + format + "', time, 'localtime') as first, count(*) as second from views" + filters + "group by first" + orderStatement + limitStatement + ";" } return } diff --git a/main.go b/main.go index 6cc34fb..cfa81c0 100644 --- a/main.go +++ b/main.go @@ -138,8 +138,9 @@ func StatsHandler(w http.ResponseWriter, r *http.Request) { url: queries.Get("url"), ref: queries.Get("ref"), ua: queries.Get("ua"), - orderrow: strings.ToLower(queries.Get("orderrow")), + ordercol: strings.ToLower(queries.Get("ordercol")), order: strings.ToUpper(queries.Get("order")), + limit: queries.Get("limit"), }) if e != nil { fmt.Println("Database request failed:", e)