sklad: implement search

This commit is contained in:
Přemysl Eric Janouch 2019-04-14 20:29:18 +02:00
parent 3d98454543
commit 4dade55387
Signed by: p
GPG Key ID: A0420B94F92B9493
3 changed files with 92 additions and 9 deletions

View File

@ -5,6 +5,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"os" "os"
"strings"
"time" "time"
) )
@ -27,10 +28,19 @@ func (c *Container) Id() ContainerId {
} }
func (c *Container) Children() []*Container { func (c *Container) Children() []*Container {
// TODO: Sort this by Id, or maybe even return a map[string]*Container. // TODO: Sort this by Id, or maybe even return a map[string]*Container,
// text/template would sort that automatically.
return indexChildren[c.Id()] return indexChildren[c.Id()]
} }
func (c *Container) Path() (result []ContainerId) {
for c != nil && c.Parent != "" {
c = indexContainer[c.Parent]
result = append(result, c.Id())
}
return
}
type Database struct { type Database struct {
Password string // password for web users Password string // password for web users
Prefix string // prefix for all container IDs Prefix string // prefix for all container IDs
@ -52,9 +62,41 @@ var (
// TODO: Some functions to add, remove and change things in the database. // TODO: Some functions to add, remove and change things in the database.
// Indexes must be kept valid, just like any invariants. // Indexes must be kept valid, just like any invariants.
// TODO: A function for fulltext search in series (1. Prefix, 2. Description). func dbSearchSeries(query string) (result []*Series) {
query = strings.ToLower(query)
added := map[string]bool{}
for _, s := range db.Series {
if query == strings.ToLower(s.Prefix) {
result = append(result, s)
added[s.Prefix] = true
}
}
for _, s := range db.Series {
if strings.Contains(
strings.ToLower(s.Description), query) && !added[s.Prefix] {
result = append(result, s)
}
}
return
}
// TODO: A function for fulltext search in containers (1. Id, 2. Description). func dbSearchContainers(query string) (result []*Container) {
query = strings.ToLower(query)
added := map[ContainerId]bool{}
for id, c := range indexContainer {
if query == strings.ToLower(string(id)) {
result = append(result, c)
added[id] = true
}
}
for id, c := range indexContainer {
if strings.Contains(
strings.ToLower(c.Description), query) && !added[id] {
result = append(result, c)
}
}
return
}
func dbCommit() error { func dbCommit() error {
// Write a timestamp. // Write a timestamp.

View File

@ -157,12 +157,15 @@ func handleSearch(w http.ResponseWriter, r *http.Request) {
} }
query := r.FormValue("q") query := r.FormValue("q")
_ = query params := struct {
Query string
// TODO: Query the database for exact matches and fulltext. Series []*Series
// - Will want to show the full path from the root "" container. Containers []*Container
}{
params := struct{}{} Query: query,
Series: dbSearchSeries(query),
Containers: dbSearchContainers(query),
}
executeTemplate("search.tmpl", w, &params) executeTemplate("search.tmpl", w, &params)
} }

38
sklad/search.tmpl Normal file
View File

@ -0,0 +1,38 @@
{{ define "Title" }}„{{ .Query }}“ — Vyhledávání{{ end }}
{{ define "Content" }}
<h2>Vyhledávání: &bdquo;{{ .Query }}&ldquo;<h2>
<h3>Řady</h3>
{{ range .Series }}
<section>
<header>
<h3><a href="/series?prefix={{ .Prefix }}">{{ .Prefix }}</a></h3>
<p>{{ .Description }}
</header>
</section>
{{ else }}
<p>Neodpovídají žádné řady.
{{ end }}
<h3>Obaly</h3>
{{ range .Containers }}
<section>
<header>
<h3><a href="/?id={{ .Id }}">{{ .Id }}</a>
{{ range .Path }}
<small>&laquo; <a href="/?id={{ . }}">{{ . }}</a></small>
{{ end }}
</h3>
</header>
{{ if .Description }}
<p>{{ .Description }}
{{ end }}
</section>
{{ else }}
<p>Neodpovídají žádné obaly.
{{ end }}
{{ end }}