From e0ee73ef9963ab398bcc6011795ad23e8e003147 Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 31 Jan 2018 08:26:40 -0600 Subject: ABC-79: Optimize channel autocomplete query (#8163) * optimize channel autocomplete query * move to new autocomplete endpoint --- store/storetest/channel_store.go | 197 +++++++++++++------------- store/storetest/mocks/ChannelStore.go | 16 +++ store/storetest/mocks/UserAccessTokenStore.go | 28 ++-- 3 files changed, 125 insertions(+), 116 deletions(-) (limited to 'store/storetest') diff --git a/store/storetest/channel_store.go b/store/storetest/channel_store.go index 12781bdad..121b40a01 100644 --- a/store/storetest/channel_store.go +++ b/store/storetest/channel_store.go @@ -1940,116 +1940,109 @@ func testChannelStoreSearchInTeam(t *testing.T, ss store.Store) { o11.Type = model.CHANNEL_OPEN store.Must(ss.Channel().Save(&o11, -1)) - if result := <-ss.Channel().SearchInTeam(o1.TeamId, "ChannelA"); result.Err != nil { - t.Fatal(result.Err) - } else { - channels := result.Data.(*model.ChannelList) - if len(*channels) != 2 { - t.Fatal("wrong length") - } - } - - if result := <-ss.Channel().SearchInTeam(o1.TeamId, ""); result.Err != nil { - t.Fatal(result.Err) - } else { - channels := result.Data.(*model.ChannelList) - if len(*channels) == 0 { - t.Fatal("should not be empty") - } - } - - if result := <-ss.Channel().SearchInTeam(o1.TeamId, "blargh"); result.Err != nil { - t.Fatal(result.Err) - } else { - channels := result.Data.(*model.ChannelList) - if len(*channels) != 0 { - t.Fatal("should be empty") - } - } - - if result := <-ss.Channel().SearchInTeam(o1.TeamId, "off-"); result.Err != nil { - t.Fatal(result.Err) - } else { - channels := result.Data.(*model.ChannelList) - if len(*channels) != 2 { - t.Fatal("should return 2 channels, not including private channel") - } - - if (*channels)[0].Name != o7.Name { - t.Fatal("wrong channel returned") - } - - if (*channels)[1].Name != o6.Name { - t.Fatal("wrong channel returned") - } - } - - if result := <-ss.Channel().SearchInTeam(o1.TeamId, "off-topic"); result.Err != nil { - t.Fatal(result.Err) - } else { - channels := result.Data.(*model.ChannelList) - if len(*channels) != 1 { - t.Fatal("should return 1 channel") - } - - if (*channels)[0].Name != o6.Name { - t.Fatal("wrong channel returned") - } - } + for name, search := range map[string]func(teamId string, term string) store.StoreChannel{ + "AutocompleteInTeam": ss.Channel().AutocompleteInTeam, + "SearchInTeam": ss.Channel().SearchInTeam, + } { + t.Run(name, func(t *testing.T) { + if result := <-search(o1.TeamId, "ChannelA"); result.Err != nil { + t.Fatal(result.Err) + } else { + channels := result.Data.(*model.ChannelList) + if len(*channels) != 2 { + t.Fatal("wrong length") + } + } - /* - // Disabling this check as it will fail on PostgreSQL as we have "liberalised" channel matching to deal with - // Full-Text Stemming Limitations. - if result := <-ss.Channel().SearchMore(m1. - if result := <-ss.Channel().SearchInTeam(o1.TeamId, "off-topics"); result.Err != nil { - t.Fatal(result.Err) - } else { - channels := result.Data.(*model.ChannelList) - if len(*channels) != 0 { - t.Fatal("should be empty") + if result := <-search(o1.TeamId, ""); result.Err != nil { + t.Fatal(result.Err) + } else { + channels := result.Data.(*model.ChannelList) + if len(*channels) == 0 { + t.Fatal("should not be empty") + } } - } - */ - if result := <-ss.Channel().SearchInTeam(o1.TeamId, "town square"); result.Err != nil { - t.Fatal(result.Err) - } else { - channels := result.Data.(*model.ChannelList) - if len(*channels) != 1 { - t.Fatal("should return 1 channel") - } + if result := <-search(o1.TeamId, "blargh"); result.Err != nil { + t.Fatal(result.Err) + } else { + channels := result.Data.(*model.ChannelList) + if len(*channels) != 0 { + t.Fatal("should be empty") + } + } - if (*channels)[0].Name != o9.Name { - t.Fatal("wrong channel returned") - } - } + if result := <-search(o1.TeamId, "off-"); result.Err != nil { + t.Fatal(result.Err) + } else { + channels := result.Data.(*model.ChannelList) + if len(*channels) != 2 { + t.Fatal("should return 2 channels, not including private channel") + } + + if (*channels)[0].Name != o7.Name { + t.Fatal("wrong channel returned") + } + + if (*channels)[1].Name != o6.Name { + t.Fatal("wrong channel returned") + } + } - if result := <-ss.Channel().SearchInTeam(o1.TeamId, "the"); result.Err != nil { - t.Fatal(result.Err) - } else { - channels := result.Data.(*model.ChannelList) - t.Log(channels.ToJson()) - if len(*channels) != 1 { - t.Fatal("should return 1 channel") - } + if result := <-search(o1.TeamId, "off-topic"); result.Err != nil { + t.Fatal(result.Err) + } else { + channels := result.Data.(*model.ChannelList) + if len(*channels) != 1 { + t.Fatal("should return 1 channel") + } + + if (*channels)[0].Name != o6.Name { + t.Fatal("wrong channel returned") + } + } - if (*channels)[0].Name != o10.Name { - t.Fatal("wrong channel returned") - } - } + if result := <-search(o1.TeamId, "town square"); result.Err != nil { + t.Fatal(result.Err) + } else { + channels := result.Data.(*model.ChannelList) + if len(*channels) != 1 { + t.Fatal("should return 1 channel") + } + + if (*channels)[0].Name != o9.Name { + t.Fatal("wrong channel returned") + } + } - if result := <-ss.Channel().SearchInTeam(o1.TeamId, "Mobile"); result.Err != nil { - t.Fatal(result.Err) - } else { - channels := result.Data.(*model.ChannelList) - t.Log(channels.ToJson()) - if len(*channels) != 1 { - t.Fatal("should return 1 channel") - } + if result := <-search(o1.TeamId, "the"); result.Err != nil { + t.Fatal(result.Err) + } else { + channels := result.Data.(*model.ChannelList) + t.Log(channels.ToJson()) + if len(*channels) != 1 { + t.Fatal("should return 1 channel") + } + + if (*channels)[0].Name != o10.Name { + t.Fatal("wrong channel returned") + } + } - if (*channels)[0].Name != o11.Name { - t.Fatal("wrong channel returned") - } + if result := <-search(o1.TeamId, "Mobile"); result.Err != nil { + t.Fatal(result.Err) + } else { + channels := result.Data.(*model.ChannelList) + t.Log(channels.ToJson()) + if len(*channels) != 1 { + t.Fatal("should return 1 channel") + } + + if (*channels)[0].Name != o11.Name { + t.Fatal("wrong channel returned") + } + } + }) } } diff --git a/store/storetest/mocks/ChannelStore.go b/store/storetest/mocks/ChannelStore.go index c878d602b..5379c2fb4 100644 --- a/store/storetest/mocks/ChannelStore.go +++ b/store/storetest/mocks/ChannelStore.go @@ -45,6 +45,22 @@ func (_m *ChannelStore) AnalyticsTypeCount(teamId string, channelType string) st return r0 } +// AutocompleteInTeam provides a mock function with given fields: teamId, term +func (_m *ChannelStore) AutocompleteInTeam(teamId string, term string) store.StoreChannel { + ret := _m.Called(teamId, term) + + var r0 store.StoreChannel + if rf, ok := ret.Get(0).(func(string, string) store.StoreChannel); ok { + r0 = rf(teamId, term) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(store.StoreChannel) + } + } + + return r0 +} + // CreateDirectChannel provides a mock function with given fields: userId, otherUserId func (_m *ChannelStore) CreateDirectChannel(userId string, otherUserId string) store.StoreChannel { ret := _m.Called(userId, otherUserId) diff --git a/store/storetest/mocks/UserAccessTokenStore.go b/store/storetest/mocks/UserAccessTokenStore.go index b989fa1cc..c5ef0fefe 100644 --- a/store/storetest/mocks/UserAccessTokenStore.go +++ b/store/storetest/mocks/UserAccessTokenStore.go @@ -61,13 +61,13 @@ func (_m *UserAccessTokenStore) Get(tokenId string) store.StoreChannel { return r0 } -// GetAll provides a mock function with given fields: -func (_m *UserAccessTokenStore) GetAll(page int, perPage int) store.StoreChannel { - ret := _m.Called(page, perPage) +// GetAll provides a mock function with given fields: offset, limit +func (_m *UserAccessTokenStore) GetAll(offset int, limit int) store.StoreChannel { + ret := _m.Called(offset, limit) var r0 store.StoreChannel if rf, ok := ret.Get(0).(func(int, int) store.StoreChannel); ok { - r0 = rf(page, perPage) + r0 = rf(offset, limit) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(store.StoreChannel) @@ -109,13 +109,13 @@ func (_m *UserAccessTokenStore) GetByUser(userId string, page int, perPage int) return r0 } -// Search provides a mock function with given fields: -func (_m *UserAccessTokenStore) Search(term string) store.StoreChannel { - ret := _m.Called(term) +// Save provides a mock function with given fields: token +func (_m *UserAccessTokenStore) Save(token *model.UserAccessToken) store.StoreChannel { + ret := _m.Called(token) var r0 store.StoreChannel - if rf, ok := ret.Get(0).(func(string) store.StoreChannel); ok { - r0 = rf(term) + if rf, ok := ret.Get(0).(func(*model.UserAccessToken) store.StoreChannel); ok { + r0 = rf(token) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(store.StoreChannel) @@ -125,13 +125,13 @@ func (_m *UserAccessTokenStore) Search(term string) store.StoreChannel { return r0 } -// Save provides a mock function with given fields: token -func (_m *UserAccessTokenStore) Save(token *model.UserAccessToken) store.StoreChannel { - ret := _m.Called(token) +// Search provides a mock function with given fields: term +func (_m *UserAccessTokenStore) Search(term string) store.StoreChannel { + ret := _m.Called(term) var r0 store.StoreChannel - if rf, ok := ret.Get(0).(func(*model.UserAccessToken) store.StoreChannel); ok { - r0 = rf(token) + if rf, ok := ret.Get(0).(func(string) store.StoreChannel); ok { + r0 = rf(term) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(store.StoreChannel) -- cgit v1.2.3-1-g7c22