sklad: implement search
This commit is contained in:
parent
3d98454543
commit
4dade55387
48
sklad/db.go
48
sklad/db.go
|
@ -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.
|
||||||
|
|
|
@ -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, ¶ms)
|
executeTemplate("search.tmpl", w, ¶ms)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
{{ define "Title" }}„{{ .Query }}“ — Vyhledávání{{ end }}
|
||||||
|
{{ define "Content" }}
|
||||||
|
|
||||||
|
<h2>Vyhledávání: „{{ .Query }}“<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>« <a href="/?id={{ . }}">{{ . }}</a></small>
|
||||||
|
{{ end }}
|
||||||
|
</h3>
|
||||||
|
</header>
|
||||||
|
{{ if .Description }}
|
||||||
|
<p>{{ .Description }}
|
||||||
|
{{ end }}
|
||||||
|
</section>
|
||||||
|
{{ else }}
|
||||||
|
<p>Neodpovídají žádné obaly.
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ end }}
|
Loading…
Reference in New Issue