PLT-4935 Fix searching for full email (#4947)

* Fix searching for full email

* Fix unit test
Этот коммит содержится в:
Joram Wilander
2017-01-03 17:11:44 -05:00
коммит произвёл Harrison Healey
родитель 3ae8e9789e
Коммит 3df8f33437
2 изменённых файлов: 58 добавлений и 10 удалений

Просмотреть файл

@@ -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)

Просмотреть файл

@@ -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)