From 8a0d0bfa257afaa84a50620f9c85b35df753d569 Mon Sep 17 00:00:00 2001 From: JoramWilander Date: Tue, 6 Oct 2015 12:38:42 -0400 Subject: Parse special characters out of search strings and replace with spaces. --- store/sql_post_store.go | 19 +++++++++++++++---- store/sql_post_store_test.go | 26 ++++++++++++++++++-------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/store/sql_post_store.go b/store/sql_post_store.go index 668f45fbb..8d62eaad0 100644 --- a/store/sql_post_store.go +++ b/store/sql_post_store.go @@ -396,6 +396,17 @@ func (s SqlPostStore) getParentsPosts(channelId string, offset int, limit int) S return storeChannel } +var specialSearchChar = []string{ + "<", + ">", + "+", + "-", + "(", + ")", + "~", + "@", +} + func (s SqlPostStore) Search(teamId string, userId string, terms string, isHashtagSearch bool) StoreChannel { storeChannel := make(StoreChannel) @@ -411,10 +422,10 @@ func (s SqlPostStore) Search(teamId string, userId string, terms string, isHasht } } - // @ has a speical meaning in INNODB FULLTEXT indexes and - // is reserved for calc'ing distances so you - // cannot escape it so we replace it. - terms = strings.Replace(terms, "@", " ", -1) + // these chars have speical meaning and can be treated as spaces + for _, c := range specialSearchChar { + terms = strings.Replace(terms, c, " ", -1) + } var posts []*model.Post diff --git a/store/sql_post_store_test.go b/store/sql_post_store_test.go index 6a6364dc8..62d7b0100 100644 --- a/store/sql_post_store_test.go +++ b/store/sql_post_store_test.go @@ -516,7 +516,7 @@ func TestPostStoreSearch(t *testing.T) { o4.ChannelId = c1.Id o4.UserId = model.NewId() o4.Hashtags = "#hashtag" - o4.Message = "message" + o4.Message = "(message)blargh" o4 = (<-store.Post().Save(o4)).Data.(*model.Post) o5 := &model.Post{} @@ -527,37 +527,37 @@ func TestPostStoreSearch(t *testing.T) { r1 := (<-store.Post().Search(teamId, userId, "corey", false)).Data.(*model.PostList) if len(r1.Order) != 1 && r1.Order[0] != o1.Id { - t.Fatal("returned wrong serach result") + t.Fatal("returned wrong search result") } r3 := (<-store.Post().Search(teamId, userId, "new", false)).Data.(*model.PostList) if len(r3.Order) != 2 && r3.Order[0] != o1.Id { - t.Fatal("returned wrong serach result") + t.Fatal("returned wrong search result") } r4 := (<-store.Post().Search(teamId, userId, "john", false)).Data.(*model.PostList) if len(r4.Order) != 1 && r4.Order[0] != o2.Id { - t.Fatal("returned wrong serach result") + t.Fatal("returned wrong search result") } r5 := (<-store.Post().Search(teamId, userId, "matter*", false)).Data.(*model.PostList) if len(r5.Order) != 1 && r5.Order[0] != o1.Id { - t.Fatal("returned wrong serach result") + t.Fatal("returned wrong search result") } r6 := (<-store.Post().Search(teamId, userId, "#hashtag", true)).Data.(*model.PostList) if len(r6.Order) != 1 && r6.Order[0] != o4.Id { - t.Fatal("returned wrong serach result") + t.Fatal("returned wrong search result") } r7 := (<-store.Post().Search(teamId, userId, "#secret", true)).Data.(*model.PostList) if len(r7.Order) != 1 && r7.Order[0] != o5.Id { - t.Fatal("returned wrong serach result") + t.Fatal("returned wrong search result") } r8 := (<-store.Post().Search(teamId, userId, "@thisshouldmatchnothing", true)).Data.(*model.PostList) if len(r8.Order) != 0 { - t.Fatal("returned wrong serach result") + t.Fatal("returned wrong search result") } r9 := (<-store.Post().Search(teamId, userId, "mattermost jersey", false)).Data.(*model.PostList) @@ -569,4 +569,14 @@ func TestPostStoreSearch(t *testing.T) { if len(r10.Order) != 2 { t.Fatal("returned wrong search result") } + + r11 := (<-store.Post().Search(teamId, userId, "message blargh", false)).Data.(*model.PostList) + if len(r11.Order) != 1 { + t.Fatal("returned wrong search result") + } + + r12 := (<-store.Post().Search(teamId, userId, "blargh>", false)).Data.(*model.PostList) + if len(r12.Order) != 1 { + t.Fatal("returned wrong search result") + } } -- cgit v1.2.3-1-g7c22