Fix user autocomplete with special characters (#4373)
Этот коммит содержится в:
коммит произвёл
Christopher Speller
родитель
60a92f0a27
Коммит
4887c9228c
@@ -1196,15 +1196,36 @@ func (us SqlUserStore) SearchInChannel(channelId string, term string, searchType
|
|||||||
func (us SqlUserStore) performSearch(searchQuery string, term string, searchType string, parameters map[string]interface{}) StoreResult {
|
func (us SqlUserStore) performSearch(searchQuery string, term string, searchType string, parameters map[string]interface{}) StoreResult {
|
||||||
result := StoreResult{}
|
result := StoreResult{}
|
||||||
|
|
||||||
|
// these chars have special meaning and can be treated as spaces
|
||||||
|
for _, c := range specialSearchChar {
|
||||||
|
term = strings.Replace(term, c, " ", -1)
|
||||||
|
}
|
||||||
|
|
||||||
if term == "" {
|
if term == "" {
|
||||||
searchQuery = strings.Replace(searchQuery, "SEARCH_CLAUSE", "", 1)
|
searchQuery = strings.Replace(searchQuery, "SEARCH_CLAUSE", "", 1)
|
||||||
} else if utils.Cfg.SqlSettings.DriverName == model.DATABASE_DRIVER_POSTGRES {
|
} else if utils.Cfg.SqlSettings.DriverName == model.DATABASE_DRIVER_POSTGRES {
|
||||||
term = term + ":*"
|
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, " ")
|
||||||
|
|
||||||
searchType = convertMySQLFullTextColumnsToPostgres(searchType)
|
searchType = convertMySQLFullTextColumnsToPostgres(searchType)
|
||||||
searchClause := fmt.Sprintf("AND (%s) @@ to_tsquery(:Term)", searchType)
|
searchClause := fmt.Sprintf("AND (%s) @@ to_tsquery(:Term)", searchType)
|
||||||
searchQuery = strings.Replace(searchQuery, "SEARCH_CLAUSE", searchClause, 1)
|
searchQuery = strings.Replace(searchQuery, "SEARCH_CLAUSE", searchClause, 1)
|
||||||
} else if utils.Cfg.SqlSettings.DriverName == model.DATABASE_DRIVER_MYSQL {
|
} else if utils.Cfg.SqlSettings.DriverName == model.DATABASE_DRIVER_MYSQL {
|
||||||
term = term + "*"
|
splitTerm := strings.Fields(term)
|
||||||
|
for i, t := range strings.Fields(term) {
|
||||||
|
splitTerm[i] = "+" + t + "*"
|
||||||
|
}
|
||||||
|
|
||||||
|
term = strings.Join(splitTerm, " ")
|
||||||
|
|
||||||
searchClause := fmt.Sprintf("AND MATCH(%s) AGAINST (:Term IN BOOLEAN MODE)", searchType)
|
searchClause := fmt.Sprintf("AND MATCH(%s) AGAINST (:Term IN BOOLEAN MODE)", searchType)
|
||||||
searchQuery = strings.Replace(searchQuery, "SEARCH_CLAUSE", searchClause, 1)
|
searchQuery = strings.Replace(searchQuery, "SEARCH_CLAUSE", searchClause, 1)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -937,8 +937,14 @@ func TestUserStoreSearch(t *testing.T) {
|
|||||||
u1.Email = model.NewId()
|
u1.Email = model.NewId()
|
||||||
Must(store.User().Save(u1))
|
Must(store.User().Save(u1))
|
||||||
|
|
||||||
|
u2 := &model.User{}
|
||||||
|
u2.Username = "jim-bobby" + model.NewId()
|
||||||
|
u2.Email = model.NewId()
|
||||||
|
Must(store.User().Save(u2))
|
||||||
|
|
||||||
tid := model.NewId()
|
tid := model.NewId()
|
||||||
Must(store.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}))
|
Must(store.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}))
|
||||||
|
Must(store.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u2.Id}))
|
||||||
|
|
||||||
if r1 := <-store.User().Search(tid, "jimb", USER_SEARCH_TYPE_USERNAME); r1.Err != nil {
|
if r1 := <-store.User().Search(tid, "jimb", USER_SEARCH_TYPE_USERNAME); r1.Err != nil {
|
||||||
t.Fatal(r1.Err)
|
t.Fatal(r1.Err)
|
||||||
@@ -974,6 +980,24 @@ func TestUserStoreSearch(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if r1 := <-store.User().Search("", "jim-bobb", USER_SEARCH_TYPE_USERNAME); r1.Err != nil {
|
||||||
|
t.Fatal(r1.Err)
|
||||||
|
} else {
|
||||||
|
profiles := r1.Data.([]*model.User)
|
||||||
|
found := false
|
||||||
|
for _, profile := range profiles {
|
||||||
|
t.Log(profile.Username)
|
||||||
|
if profile.Id == u2.Id {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !found {
|
||||||
|
t.Fatal("should have found user")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if r1 := <-store.User().Search(tid, "", USER_SEARCH_TYPE_USERNAME); r1.Err != nil {
|
if r1 := <-store.User().Search(tid, "", USER_SEARCH_TYPE_USERNAME); r1.Err != nil {
|
||||||
t.Fatal(r1.Err)
|
t.Fatal(r1.Err)
|
||||||
}
|
}
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user