jlelse
/
kis3
Archived
1
Fork 0

Add limit filter and rename orderrow to ordercol

Idk why I'm so stupid and confused rows and columns
This commit is contained in:
Jan-Lukas Else 2019-05-01 12:17:37 +02:00
parent 18c5ff85b0
commit 4b004a803c
3 changed files with 21 additions and 12 deletions

View File

@ -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

View File

@ -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
}

View File

@ -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)