jlelse
/
kis3
Archived
1
Fork 0

Add "orderrow" and "order" parameters to order result

This commit is contained in:
Jan-Lukas Else 2019-04-09 15:17:18 +02:00
parent e1603e19bf
commit 57aca37a5f
2 changed files with 33 additions and 22 deletions

View File

@ -77,12 +77,14 @@ const (
) )
type ViewsRequest struct { type ViewsRequest struct {
view View view View
from string from string
to string to string
url string url string
ref string ref string
ua string ua string
orderrow string
order string
} }
type RequestResultRow struct { type RequestResultRow struct {
@ -91,14 +93,11 @@ type RequestResultRow struct {
} }
func (db *Database) request(request *ViewsRequest) (resultRows []*RequestResultRow, e error) { func (db *Database) request(request *ViewsRequest) (resultRows []*RequestResultRow, e error) {
filterString, parameters := request.buildFilter() statement, parameters := request.buildStatement()
// Fix to use array as varargs
namedArgs := make([]interface{}, len(parameters)) namedArgs := make([]interface{}, len(parameters))
for i, v := range parameters { for i, v := range parameters {
namedArgs[i] = v namedArgs[i] = v
} }
// Query
statement := request.buildStatement(filterString)
rows, e := db.sqlDB.Query(statement, namedArgs...) rows, e := db.sqlDB.Query(statement, namedArgs...)
if e != nil { if e != nil {
return return
@ -124,24 +123,34 @@ func (db *Database) request(request *ViewsRequest) (resultRows []*RequestResultR
} }
} }
func (request *ViewsRequest) buildStatement(filters string) (statement string) { func (request *ViewsRequest) buildStatement() (statement string, parameters []sql.NamedArg) {
filters, parameters := request.buildFilter()
if len(filters) > 0 { if len(filters) > 0 {
filters = " where " + filters + " " filters = " where " + filters + " "
} else { } else {
filters = " " filters = " "
} }
orderrow := "first"
order := "ASC"
if strings.ToLower(request.orderrow) == "second" {
orderrow = "second"
}
if strings.ToUpper(request.order) == "DESC" {
order = "DESC"
}
orderstatement := " ORDER BY " + orderrow + " " + order
switch request.view { switch request.view {
case PAGES: case PAGES:
statement = "SELECT url as first, count(*) as second from views" + filters + "group by url;" statement = "SELECT url as first, count(*) as second from views" + filters + "group by first" + orderstatement + ";"
return return
case REFERRERS: case REFERRERS:
statement = "SELECT ref as first, count(*) as second from views" + filters + "group by ref;" statement = "SELECT ref as first, count(*) as second from views" + filters + "group by first" + orderstatement + ";"
return return
case USERAGENTS: case USERAGENTS:
statement = "SELECT useragent as first, count(*) as second from views" + filters + "group by useragent;" statement = "SELECT useragent as first, count(*) as second from views" + filters + "group by first" + orderstatement + ";"
return return
case USERAGENTNAMES: case USERAGENTNAMES:
statement = "SELECT substr(useragent, 1, pos-1) as first, COUNT(*) from (SELECT *, instr(useragent,' ') AS pos FROM views)" + filters + "group by first;" 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 + ";"
return return
case HOURS, DAYS, WEEKS, MONTHS: case HOURS, DAYS, WEEKS, MONTHS:
format := "" format := ""
@ -155,7 +164,7 @@ func (request *ViewsRequest) buildStatement(filters string) (statement string) {
case MONTHS: case MONTHS:
format = "%Y-%m" format = "%Y-%m"
} }
statement = "SELECT strftime('" + format + "', time, 'localtime') as first, count(*) as second from views" + filters + "group by first;" statement = "SELECT strftime('" + format + "', time, 'localtime') as first, count(*) as second from views" + filters + "group by first" + orderstatement + ";"
} }
return return
} }

14
main.go
View File

@ -125,12 +125,14 @@ func requestStats(w http.ResponseWriter, r *http.Request) {
view = MONTHS view = MONTHS
} }
result, e := app.db.request(&ViewsRequest{ result, e := app.db.request(&ViewsRequest{
view: view, view: view,
from: queries.Get("from"), from: queries.Get("from"),
to: queries.Get("to"), to: queries.Get("to"),
url: queries.Get("url"), url: queries.Get("url"),
ref: queries.Get("ref"), ref: queries.Get("ref"),
ua: queries.Get("ua"), ua: queries.Get("ua"),
orderrow: queries.Get("orderrow"),
order: queries.Get("order"),
}) })
if e != nil { if e != nil {
fmt.Println("Database request failed:", e) fmt.Println("Database request failed:", e)