From 8b328386c59324106ed25fb8ea5b94fff6b47206 Mon Sep 17 00:00:00 2001 From: Shivashis Padhi Date: Fri, 9 Sep 2022 21:04:00 +0530 Subject: [PATCH] MM-46911: P1 - Fix MySQL query to filter bots out of TopDM (#20965) Automatic Merge --- api4/insights_test.go | 2 +- store/sqlstore/post_store.go | 22 +++++++++++----------- store/storetest/post_store.go | 24 ++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/api4/insights_test.go b/api4/insights_test.go index b0d8993779..dd1637a4a1 100644 --- a/api4/insights_test.go +++ b/api4/insights_test.go @@ -897,7 +897,6 @@ func TestGetTopInactiveChannelsForTeamSince(t *testing.T) { } func TestGetTopDMsForUserSince(t *testing.T) { - t.Skip("MM-46911") th := Setup(t).InitBasic() defer th.TearDown() @@ -933,6 +932,7 @@ func TestGetTopDMsForUserSince(t *testing.T) { Username: GenerateTestUsername(), DisplayName: "a bot", Description: "bot", + UserId: model.NewId(), } createdBot, resp, err := th.Client.CreateBot(bot) diff --git a/store/sqlstore/post_store.go b/store/sqlstore/post_store.go index a8c8faf04b..2f3fd2b6b9 100644 --- a/store/sqlstore/post_store.go +++ b/store/sqlstore/post_store.go @@ -2999,21 +2999,21 @@ func (s *SqlPostStore) updateThreadsFromPosts(transaction *sqlxTxWrapper, posts } func (s *SqlPostStore) GetTopDMsForUserSince(userID string, since int64, offset int, limit int) (*model.TopDMList, error) { - var botsFilterExpr, stringSplitKeyword string - if s.DriverName() == model.DatabaseDriverPostgres { - stringSplitKeyword = "split_part" - } else if s.DriverName() == model.DatabaseDriverMysql { - stringSplitKeyword = "SUBSTRING_INDEX" - } - + var botsFilterExpr string /* Channel.Name is of the format userId1__userId2. Using this, self dms, and bot dms can be filtered. */ - botsFilterExpr = fmt.Sprintf(` - %s(Channels.Name, '__', 1) NOT IN (SELECT UserId FROM Bots) - AND %s(Channels.Name, '__', 2) NOT IN (SELECT UserId FROM Bots) - `, stringSplitKeyword, stringSplitKeyword) + if s.DriverName() == model.DatabaseDriverPostgres { + botsFilterExpr = `SPLIT_PART(Channels.Name, '__', 1) NOT IN (SELECT UserId FROM Bots) + AND SPLIT_PART(Channels.Name, '__', 2) NOT IN (SELECT UserId FROM Bots) + ` + } else if s.DriverName() == model.DatabaseDriverMysql { + botsFilterExpr = `SUBSTRING_INDEX(Channels.Name, '__', 1) NOT IN (SELECT UserId FROM Bots) + AND SUBSTRING_INDEX(Channels.Name, '__', -1) NOT IN (SELECT UserId FROM Bots) + ` + } + channelSelector := s.getQueryBuilder().Select("Id", "TotalMsgCount").From("Channels").Join("ChannelMembers as cm on cm.ChannelId = Channels.Id"). Where(sq.And{ sq.Expr("Channels.Type = 'D'"), diff --git a/store/storetest/post_store.go b/store/storetest/post_store.go index b2214d83c8..41b8c138d3 100644 --- a/store/storetest/post_store.go +++ b/store/storetest/post_store.go @@ -4067,6 +4067,8 @@ func testGetTopDMsForUserSince(t *testing.T, ss store.Store, s SqlStore) { u2 := model.User{Email: MakeEmail(), Username: model.NewId()} u3 := model.User{Email: MakeEmail(), Username: model.NewId()} u4 := model.User{Email: MakeEmail(), Username: model.NewId()} + u5 := model.User{Email: MakeEmail(), Username: model.NewId()} + _, err := ss.User().Save(&user) require.NoError(t, err) _, err = ss.User().Save(&u1) @@ -4077,6 +4079,17 @@ func testGetTopDMsForUserSince(t *testing.T, ss store.Store, s SqlStore) { require.NoError(t, err) _, err = ss.User().Save(&u4) require.NoError(t, err) + _, err = ss.User().Save(&u5) + require.NoError(t, err) + bot := &model.Bot{ + Username: "bot_user", + Description: "bot", + OwnerId: model.NewId(), + UserId: u5.Id, + } + + savedBot, nErr := ss.Bot().Save(bot) + require.NoError(t, nErr) // user direct messages chUser1, nErr := ss.Channel().CreateDirectChannel(&u1, &user) require.NoError(t, nErr) @@ -4088,6 +4101,17 @@ func testGetTopDMsForUserSince(t *testing.T, ss store.Store, s SqlStore) { chUser3User4, nErr := ss.Channel().CreateDirectChannel(&u3, &u4) require.NoError(t, nErr) + // bot direct message - should be ignored by top DMs + botUser, err := ss.User().Get(context.Background(), savedBot.UserId) + require.NoError(t, err) + chBot, nErr := ss.Channel().CreateDirectChannel(&user, botUser) + require.NoError(t, nErr) + _, err = ss.Post().Save(&model.Post{ + ChannelId: chBot.Id, + UserId: botUser.Id, + }) + require.NoError(t, err) + // sample post data // for u1 _, err = ss.Post().Save(&model.Post{