summaryrefslogtreecommitdiffstats
path: root/model/search_params.go
diff options
context:
space:
mode:
authorhmhealey <harrisonmhealey@gmail.com>2015-10-23 17:28:02 -0400
committerhmhealey <harrisonmhealey@gmail.com>2015-10-23 17:28:02 -0400
commit2383d5dd37d5ebf28c2576fd495a8a7f02f78901 (patch)
tree17e3b5953fc0f1392ec477948609a0d1ecc134fb /model/search_params.go
parent2ccf80d91d9f9236e15a674c7d2d61261538c9b9 (diff)
downloadchat-2383d5dd37d5ebf28c2576fd495a8a7f02f78901.tar.gz
chat-2383d5dd37d5ebf28c2576fd495a8a7f02f78901.tar.bz2
chat-2383d5dd37d5ebf28c2576fd495a8a7f02f78901.zip
Changed post searching to allow searching by multiple users/channels
Diffstat (limited to 'model/search_params.go')
-rw-r--r--model/search_params.go95
1 files changed, 58 insertions, 37 deletions
diff --git a/model/search_params.go b/model/search_params.go
index 7eeeed10f..6b665f5a0 100644
--- a/model/search_params.go
+++ b/model/search_params.go
@@ -31,9 +31,9 @@ func splitWords(text string) []string {
return words
}
-func parseSearchFlags(input []string) ([]string, map[string]string) {
+func parseSearchFlags(input []string) ([]string, [][2]string) {
words := []string{}
- flags := make(map[string]string)
+ flags := [][2]string{}
skipNextWord := false
for i, word := range input {
@@ -52,10 +52,10 @@ func parseSearchFlags(input []string) ([]string, map[string]string) {
// check for case insensitive equality
if strings.EqualFold(flag, searchFlag) {
if value != "" {
- flags[searchFlag] = value
+ flags = append(flags, [2]string{searchFlag, value})
isFlag = true
} else if i < len(input)-1 {
- flags[searchFlag] = input[i+1]
+ flags = append(flags, [2]string{searchFlag, input[i+1]})
skipNextWord = true
isFlag = true
}
@@ -75,56 +75,77 @@ func parseSearchFlags(input []string) ([]string, map[string]string) {
return words, flags
}
-func ParseSearchParams(text string) (*SearchParams, *SearchParams) {
+func ParseSearchParams(text string) []*SearchParams {
words, flags := parseSearchFlags(splitWords(text))
- hashtagTerms := []string{}
- plainTerms := []string{}
+ hashtagTermList := []string{}
+ plainTermList := []string{}
for _, word := range words {
if validHashtag.MatchString(word) {
- hashtagTerms = append(hashtagTerms, word)
+ hashtagTermList = append(hashtagTermList, word)
} else {
- plainTerms = append(plainTerms, word)
+ plainTermList = append(plainTermList, word)
}
}
- inChannel := flags["channel"]
- if inChannel == "" {
- inChannel = flags["in"]
- }
+ hashtagTerms := strings.Join(hashtagTermList, " ")
+ plainTerms := strings.Join(plainTermList, " ")
+
+ inChannels := []string{}
+ fromUsers := []string{}
- fromUser := flags["from"]
+ for _, flagPair := range flags {
+ flag := flagPair[0]
+ value := flagPair[1]
- var plainParams *SearchParams
- if len(plainTerms) > 0 {
- plainParams = &SearchParams{
- Terms: strings.Join(plainTerms, " "),
- IsHashtag: false,
- InChannel: inChannel,
- FromUser: fromUser,
+ if flag == "in" || flag == "channel" {
+ inChannels = append(inChannels, value)
+ } else if flag == "from" {
+ fromUsers = append(fromUsers, value)
}
}
- var hashtagParams *SearchParams
- if len(hashtagTerms) > 0 {
- hashtagParams = &SearchParams{
- Terms: strings.Join(hashtagTerms, " "),
- IsHashtag: true,
- InChannel: inChannel,
- FromUser: fromUser,
- }
+ if len(inChannels) == 0 {
+ inChannels = append(inChannels, "")
+ }
+ if len(fromUsers) == 0 {
+ fromUsers = append(fromUsers, "")
}
- // special case for when no terms are specified but we still have a filter
- if plainParams == nil && hashtagParams == nil && (inChannel != "" || fromUser != "") {
- plainParams = &SearchParams{
- Terms: "",
- IsHashtag: false,
- InChannel: inChannel,
- FromUser: fromUser,
+ paramsList := []*SearchParams{}
+
+ for _, inChannel := range inChannels {
+ for _, fromUser := range fromUsers {
+ if len(plainTerms) > 0 {
+ paramsList = append(paramsList, &SearchParams{
+ Terms: plainTerms,
+ IsHashtag: false,
+ InChannel: inChannel,
+ FromUser: fromUser,
+ })
+ }
+
+ if len(hashtagTerms) > 0 {
+ paramsList = append(paramsList, &SearchParams{
+ Terms: hashtagTerms,
+ IsHashtag: true,
+ InChannel: inChannel,
+ FromUser: fromUser,
+ })
+ }
+
+ // special case for when no terms are specified but we still have a filter
+ if len(plainTerms) == 0 && len(hashtagTerms) == 0 {
+ paramsList = append(paramsList, &SearchParams{
+ Terms: "",
+ IsHashtag: true,
+ InChannel: inChannel,
+ FromUser: fromUser,
+ })
+ }
}
}
- return plainParams, hashtagParams
+ return paramsList
}