From ff0c3eabfe8602a833e75efdfb0cb28afd0ac866 Mon Sep 17 00:00:00 2001 From: Meutel Date: Mon, 31 Jul 2017 19:37:52 +0200 Subject: [PATCH] sort/order in queries --- bouquins/bouquins.go | 2 +- bouquins/db.go | 57 ++++++++++++++++++++++++++++++++++++-------- main.go | 4 +++- 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/bouquins/bouquins.go b/bouquins/bouquins.go index 05237a5..e01d561 100644 --- a/bouquins/bouquins.go +++ b/bouquins/bouquins.go @@ -146,7 +146,7 @@ func (app *Bouquins) IndexPage(res http.ResponseWriter, req *http.Request) { log.Print(err) } model := NewIndexModel("", count) - model.Books, err = app.BooksAdv(0, 0) + model.Books, err = app.BooksAdv(0, 0, "", "") if err != nil { log.Print(err) } diff --git a/bouquins/db.go b/bouquins/db.go index 0328d13..41e3409 100644 --- a/bouquins/db.go +++ b/bouquins/db.go @@ -2,6 +2,7 @@ package bouquins import ( "database/sql" + "log" ) const ( @@ -51,8 +52,44 @@ const ( STMT_BOOKS_AUTHORS_TITLE_DESC = STMT_BOOKS_AUTHORS0 + "ORDER BY books.sort DESC" + STMT_PAGE + ")" DEF_LIM = 10 + + BOOKS QueryType = 0 + BOOKS_TAGS QueryType = 1 + BOOKS_AUTHORS QueryType = 2 ) +var QUERIES = map[Query]string{ + Query{BOOKS, true, true}: STMT_BOOKS_TITLE_DESC, + Query{BOOKS, true, false}: STMT_BOOKS_TITLE_ASC, + Query{BOOKS, false, true}: STMT_BOOKS_ID_DESC, + Query{BOOKS, false, false}: STMT_BOOKS_ID_ASC, + + Query{BOOKS_TAGS, true, true}: STMT_BOOKS_TAGS_TITLE_DESC, + Query{BOOKS_TAGS, true, false}: STMT_BOOKS_TAGS_TITLE_ASC, + Query{BOOKS_TAGS, false, true}: STMT_BOOKS_TAGS_ID_DESC, + Query{BOOKS_TAGS, false, false}: STMT_BOOKS_TAGS_ID_ASC, + + Query{BOOKS_AUTHORS, true, true}: STMT_BOOKS_AUTHORS_TITLE_DESC, + Query{BOOKS_AUTHORS, true, false}: STMT_BOOKS_AUTHORS_TITLE_ASC, + Query{BOOKS_AUTHORS, false, true}: STMT_BOOKS_AUTHORS_ID_DESC, + Query{BOOKS_AUTHORS, false, false}: STMT_BOOKS_AUTHORS_ID_ASC, +} + +type QueryType uint +type Query struct { + Type QueryType + Title bool + Desc bool +} + +// PREPARED STATEMENTS // +func (app *Bouquins) ps(qt QueryType, sort, order string) (*sql.Stmt, error) { + //TODO cache + query := QUERIES[Query{qt, sort == "title", order == "desc"}] + log.Println(query) + return app.DB.Prepare(query) +} + // MERGE SUB QUERIES // func assignAuthorsTagsBooks(books []*BookAdv, authors map[int64][]*Author, tags map[int64][]string) { for _, b := range books { @@ -63,9 +100,9 @@ func assignAuthorsTagsBooks(books []*BookAdv, authors map[int64][]*Author, tags // SUB QUERIES // -func (app *Bouquins) queryBooks(limit, offset int) ([]*BookAdv, error) { +func (app *Bouquins) queryBooks(limit, offset int, sort, order string) ([]*BookAdv, error) { books := make([]*BookAdv, 0, limit) - stmt, err := app.DB.Prepare(STMT_BOOKS_ID_ASC) + stmt, err := app.ps(BOOKS, sort, order) if err != nil { return nil, err } @@ -94,9 +131,9 @@ func (app *Bouquins) queryBooks(limit, offset int) ([]*BookAdv, error) { return books, nil } -func (app *Bouquins) queryBooksAuthors(limit, offset int) (map[int64][]*Author, error) { +func (app *Bouquins) queryBooksAuthors(limit, offset int, sort, order string) (map[int64][]*Author, error) { authors := make(map[int64][]*Author) - stmt, err := app.DB.Prepare(STMT_BOOKS_AUTHORS_ID_ASC) + stmt, err := app.ps(BOOKS_AUTHORS, sort, order) if err != nil { return nil, err } @@ -122,9 +159,9 @@ func (app *Bouquins) queryBooksAuthors(limit, offset int) (map[int64][]*Author, return authors, nil } -func (app *Bouquins) queryBooksTags(limit, offset int) (map[int64][]string, error) { +func (app *Bouquins) queryBooksTags(limit, offset int, sort, order string) (map[int64][]string, error) { tags := make(map[int64][]string) - stmt, err := app.DB.Prepare(STMT_BOOKS_TAGS_ID_ASC) + stmt, err := app.ps(BOOKS_TAGS, sort, order) if err != nil { return nil, err } @@ -160,19 +197,19 @@ func (app *Bouquins) BookCount() (int64, error) { return count, err } -func (app *Bouquins) BooksAdv(limit int, offset int) ([]*BookAdv, error) { +func (app *Bouquins) BooksAdv(limit, offset int, sort, order string) ([]*BookAdv, error) { if limit == 0 { limit = DEF_LIM } - books, err := app.queryBooks(limit, offset) + books, err := app.queryBooks(limit, offset, sort, order) if err != nil { return nil, err } - authors, err := app.queryBooksAuthors(limit, offset) + authors, err := app.queryBooksAuthors(limit, offset, sort, order) if err != nil { return nil, err } - tags, err := app.queryBooksTags(limit, offset) + tags, err := app.queryBooksTags(limit, offset, sort, order) if err != nil { return nil, err } diff --git a/main.go b/main.go index 52d9e20..c9d28c3 100644 --- a/main.go +++ b/main.go @@ -2,11 +2,12 @@ package main import ( "database/sql" - _ "github.com/mattn/go-sqlite3" "html/template" "log" "net/http" + _ "github.com/mattn/go-sqlite3" + "meutel.net/meutel/go-bouquins/bouquins" ) @@ -23,6 +24,7 @@ const ( var db *sql.DB func init() { + log.SetFlags(log.LstdFlags | log.Lshortfile) tpl, err := template.ParseGlob("templates/*.html") if err != nil { log.Fatalln(err)