From 3df8f334379f1977b3122fb78d0c742309e91a3b Mon Sep 17 00:00:00 2001 From: Joram Wilander Date: Tue, 3 Jan 2017 17:11:44 -0500 Subject: PLT-4935 Fix searching for full email (#4947) * Fix searching for full email * Fix unit test --- store/sql_user_store.go | 46 +++++++++++++++++++++++++++++++++++--------- store/sql_user_store_test.go | 22 ++++++++++++++++++++- 2 files changed, 58 insertions(+), 10 deletions(-) (limited to 'store') 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) -- cgit v1.2.3-1-g7c22