/
search.go
87 lines (70 loc) 路 2.19 KB
/
search.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package cli
import (
"github.com/arelate/vangogh_local_data"
"github.com/boggydigital/nod"
"golang.org/x/exp/maps"
"net/url"
"strings"
)
func SearchHandler(u *url.URL) error {
query := make(map[string][]string)
for _, prop := range vangogh_local_data.ReduxProperties() {
if values := vangogh_local_data.ValuesFromUrl(u, prop); len(values) > 0 {
query[prop] = values
}
}
return Search(query)
}
// Search using provided property: values query
func Search(query map[string][]string) error {
sa := nod.Begin("searching...")
defer sa.End()
//prepare a list of all properties to load redux for and
//always start with a `title` property since it is printed for all matched item
//(even if the match is for another property)
propSet := map[string]bool{vangogh_local_data.TitleProperty: true}
for qp := range query {
propSet[qp] = true
}
rdx, err := vangogh_local_data.NewReduxReader(maps.Keys(propSet)...)
if err != nil {
return sa.EndWithError(err)
}
results := rdx.Match(query)
//expand query properties for use in printInfo filter
//since it's not aware of collapsed/expanded properties concept
propertyFilter := make(map[string][]string, 0)
for prop, terms := range query {
lowerCaseTerms := make([]string, 0, len(terms))
for _, t := range terms {
lowerCaseTerms = append(lowerCaseTerms, strings.ToLower(t))
}
//if vangogh_local_data.IsPropertyAggregate(prop) {
// for _, ep := range vangogh_local_data.DetailAggregateProperty(prop) {
// propertyFilter[ep] = lowerCaseTerms
// }
//} else {
propertyFilter[prop] = lowerCaseTerms
//}
}
if len(results) == 0 {
sa.EndWithResult("no products found")
return nil
}
//similarly for propertyFilter (see comment above) - expand all properties to display
//expandedPropsMap := vangogh_local_data.DetailAllAggregateProperties(maps.Keys(propSet)...)
//expandedProps := make([]string, 0, len(expandedPropsMap))
//for p := range expandedPropsMap {
// expandedProps = append(expandedProps, p)
//}
itp, err := vangogh_local_data.PropertyListsFromIdSet(
results,
propertyFilter,
maps.Keys(propSet),
rdx)
if err != nil {
return sa.EndWithError(err)
}
sa.EndWithSummary("found products:", itp)
return nil
}