summaryrefslogtreecommitdiffstats
path: root/store
diff options
context:
space:
mode:
authorJoram Wilander <jwawilander@gmail.com>2017-01-03 17:11:44 -0500
committerHarrison Healey <harrisonmhealey@gmail.com>2017-01-03 17:11:44 -0500
commit3df8f334379f1977b3122fb78d0c742309e91a3b (patch)
tree2b4fa764242f5d35c1f1262e2b7c1d8869ab009a /store
parent3ae8e9789e8c4408f1ec8fef195210e339ea17a4 (diff)
downloadchat-3df8f334379f1977b3122fb78d0c742309e91a3b.tar.gz
chat-3df8f334379f1977b3122fb78d0c742309e91a3b.tar.bz2
chat-3df8f334379f1977b3122fb78d0c742309e91a3b.zip
PLT-4935 Fix searching for full email (#4947)
* Fix searching for full email * Fix unit test
Diffstat (limited to 'store')
-rw-r--r--store/sql_user_store.go46
-rw-r--r--store/sql_user_store_test.go22
2 files changed, 58 insertions, 10 deletions
diff --git a/store/sql_user_store.go b/store/sql_user_store.go
index 2ce1e6eab..533757479 100644
--- a/store/sql_user_store.go
+++ b/store/sql_user_store.go
@@ -1291,15 +1291,35 @@ var specialUserSearchChar = []string{
"(",
")",
"~",
- "@",
":",
"*",
"\"",
+ "!",
+ "@",
+}
+
+var postgresSearchChar = []string{
+ "(",
+ ")",
+ ":",
+ "!",
}
func (us SqlUserStore) performSearch(searchQuery string, term string, options map[string]bool, parameters map[string]interface{}) StoreResult {
result := StoreResult{}
+ // Special handling for emails
+ originalTerm := term
+ postgresUseOriginalTerm := false
+ if strings.Contains(term, "@") && strings.Contains(term, ".") {
+ if utils.Cfg.SqlSettings.DriverName == model.DATABASE_DRIVER_POSTGRES {
+ postgresUseOriginalTerm = true
+ } else if utils.Cfg.SqlSettings.DriverName == model.DATABASE_DRIVER_MYSQL {
+ lastIndex := strings.LastIndex(term, ".")
+ term = term[0:lastIndex]
+ }
+ }
+
// these chars have special meaning and can be treated as spaces
for _, c := range specialUserSearchChar {
term = strings.Replace(term, c, " ", -1)
@@ -1323,16 +1343,24 @@ func (us SqlUserStore) performSearch(searchQuery string, term string, options ma
if term == "" {
searchQuery = strings.Replace(searchQuery, "SEARCH_CLAUSE", "", 1)
} else if utils.Cfg.SqlSettings.DriverName == model.DATABASE_DRIVER_POSTGRES {
- splitTerm := strings.Fields(term)
- for i, t := range strings.Fields(term) {
- if i == len(splitTerm)-1 {
- splitTerm[i] = t + ":*"
- } else {
- splitTerm[i] = t + ":* &"
+ if postgresUseOriginalTerm {
+ term = originalTerm
+ // these chars will break the query and must be removed
+ for _, c := range postgresSearchChar {
+ term = strings.Replace(term, c, "", -1)
+ }
+ } else {
+ splitTerm := strings.Fields(term)
+ for i, t := range strings.Fields(term) {
+ if i == len(splitTerm)-1 {
+ splitTerm[i] = t + ":*"
+ } else {
+ splitTerm[i] = t + ":* &"
+ }
}
- }
- term = strings.Join(splitTerm, " ")
+ term = strings.Join(splitTerm, " ")
+ }
searchType = convertMySQLFullTextColumnsToPostgres(searchType)
searchClause := fmt.Sprintf("AND (%s) @@ to_tsquery('simple', :Term)", searchType)
diff --git a/store/sql_user_store_test.go b/store/sql_user_store_test.go
index 765a164e3..fb04e95c9 100644
--- a/store/sql_user_store_test.go
+++ b/store/sql_user_store_test.go
@@ -986,7 +986,7 @@ func TestUserStoreSearch(t *testing.T) {
u1.FirstName = "Tim"
u1.LastName = "Bill"
u1.Nickname = "Rob"
- u1.Email = "harold" + model.NewId()
+ u1.Email = "harold" + model.NewId() + "@simulator.amazonses.com"
Must(store.User().Save(u1))
u2 := &model.User{}
@@ -1033,6 +1033,26 @@ func TestUserStoreSearch(t *testing.T) {
}
}
+ searchOptions[USER_SEARCH_OPTION_NAMES_ONLY] = false
+
+ if r1 := <-store.User().Search(tid, u1.Email, searchOptions); r1.Err != nil {
+ t.Fatal(r1.Err)
+ } else {
+ profiles := r1.Data.([]*model.User)
+ found1 := false
+ for _, profile := range profiles {
+ if profile.Id == u1.Id {
+ found1 = true
+ }
+ }
+
+ if !found1 {
+ t.Fatal("should have found user")
+ }
+ }
+
+ searchOptions[USER_SEARCH_OPTION_NAMES_ONLY] = true
+
// * should be treated as a space
if r1 := <-store.User().Search(tid, "jimb*", searchOptions); r1.Err != nil {
t.Fatal(r1.Err)