This repository has been archived on 2025-03-01. You can view files and clone it, but cannot push or open issues or pull requests.
trantor/search.go

88 lines
1.9 KiB
Go
Raw Normal View History

2012-07-30 23:23:38 +02:00
package main
import (
2014-06-29 19:41:29 -05:00
"git.gitorious.org/trantor/trantor.git/database"
2012-07-30 23:23:38 +02:00
"labix.org/v2/mgo/bson"
"net/http"
2012-08-15 15:12:59 +02:00
"strconv"
2012-07-30 23:23:38 +02:00
"strings"
)
func buildQuery(q string) bson.M {
2014-06-29 22:49:50 -05:00
var keywords []string
query := bson.M{"active": true}
2012-07-30 23:23:38 +02:00
words := strings.Split(q, " ")
2012-08-15 15:39:52 +02:00
for _, w := range words {
tag := strings.SplitN(w, ":", 2)
if len(tag) > 1 {
query[tag[0]] = bson.RegEx{tag[1], "i"}
} else {
2014-06-29 22:49:50 -05:00
toks := tokens(w)
keywords = append(keywords, toks...)
2012-08-15 15:39:52 +02:00
}
2012-07-30 23:23:38 +02:00
}
2014-06-29 22:49:50 -05:00
if len(keywords) > 0 {
query["keywords"] = bson.M{"$all": keywords}
2012-08-15 15:39:52 +02:00
}
return query
2012-07-30 23:23:38 +02:00
}
type searchData struct {
S Status
Found int
2014-06-29 19:41:29 -05:00
Books []database.Book
ItemsPage int
Page int
Next string
Prev string
2012-07-30 23:23:38 +02:00
}
func searchHandler(h handler) {
err := h.r.ParseForm()
if err != nil {
http.Error(h.w, err.Error(), http.StatusInternalServerError)
return
}
req := strings.Join(h.r.Form["q"], " ")
page := 0
if len(h.r.Form["p"]) != 0 {
page, err = strconv.Atoi(h.r.Form["p"][0])
2012-08-15 13:58:16 +02:00
if err != nil {
page = 0
2012-07-30 23:59:55 +02:00
}
}
items_page := itemsPage(h.r)
res, num, _ := h.db.GetBooks(buildQuery(req), items_page, page*items_page)
2012-07-30 23:59:55 +02:00
var data searchData
data.S = GetStatus(h)
data.S.Search = req
data.Books = res
data.ItemsPage = items_page
data.Found = num
data.Page = page + 1
if num > (page+1)*items_page {
data.Next = "/search/?q=" + req + "&p=" + strconv.Itoa(page+1) + "&num=" + strconv.Itoa(items_page)
}
if page > 0 {
data.Prev = "/search/?q=" + req + "&p=" + strconv.Itoa(page-1) + "&num=" + strconv.Itoa(items_page)
2012-07-30 23:59:55 +02:00
}
2013-08-31 00:38:32 +02:00
format := h.r.Form["fmt"]
2013-08-31 00:38:32 +02:00
if (len(format) > 0) && (format[0] == "rss") {
loadTxtTemplate(h.w, "search_rss.xml", data)
2013-08-31 00:38:32 +02:00
} else {
loadTemplate(h.w, "search", data)
2013-08-31 00:38:32 +02:00
}
2012-07-30 23:23:38 +02:00
}
func itemsPage(r *http.Request) int {
if len(r.Form["num"]) > 0 {
items_page, err := strconv.Atoi(r.Form["num"][0])
if err == nil {
return items_page
}
}
return SEARCH_ITEMS_PAGE
}