Add support for quotes in search strings

* Closes: #33
This commit is contained in:
Las Zenow 2017-09-20 19:53:33 +00:00
parent b338cb3393
commit 26894f1438

View file

@ -171,15 +171,18 @@ type columnq struct {
}
func buildQuery(query string) (textQuery string, columnQuerys []columnq, trigramQuerys []columnq) {
words := strings.Split(query, " ")
for _, w := range words {
if w == "" {
tokens := extractTokens(query)
for _, token := range tokens {
if token == "" {
continue
}
tag := strings.SplitN(w, ":", 2)
if len(tag) > 1 && tag[1] != "" {
value := strings.Replace(tag[1], "%", "\\%", 0)
tag := strings.SplitN(token, ":", 2)
value := ""
if len(tag) > 1 {
value = strings.Replace(tag[1], "%", "\\%", 0)
value = strings.Replace(value, "_", "\\_", 0)
}
switch tag[0] {
case "lang":
columnQuerys = append(columnQuerys, columnq{"lang", value})
@ -198,22 +201,37 @@ func buildQuery(query string) (textQuery string, columnQuerys []columnq, trigram
case "tag":
trigramQuerys = append(trigramQuerys, columnq{"text(tags)", value})
default:
if len(textQuery) != 0 {
textQuery += " | "
}
textQuery += w
}
} else {
if len(textQuery) != 0 {
lastChar := textQuery[len(textQuery)-1:]
if w != "&" && w != "|" && lastChar != "&" && lastChar != "|" {
if token[:1] != "&" && token[:1] != "|" && lastChar != "&" && lastChar != "|" {
textQuery += " | "
} else {
textQuery += " "
}
}
textQuery += w
textQuery += strings.Join(strings.Fields(token), " <-> ")
}
}
return
}
func extractTokens(query string) []string {
tokens := []string{}
quoted := strings.Split(query, "\"")
for i, s := range quoted {
if i%2 == 0 {
tokens = append(tokens, strings.Fields(s)...)
} else {
// quoted string
if len(tokens) > 0 {
lastToken := tokens[len(tokens)-1]
if len(lastToken) > 0 && lastToken[len(lastToken)-1] == ':' {
tokens[len(tokens)-1] += s
continue
}
}
tokens = append(tokens, s)
}
}
return tokens
}