MM-46911: P1 - Fix MySQL query to filter bots out of TopDM (#20965)

Automatic Merge
Этот коммит содержится в:
Shivashis Padhi
2022-09-09 21:04:00 +05:30
коммит произвёл GitHub
родитель 78251a3ff1
Коммит 8b328386c5
3 изменённых файлов: 36 добавлений и 12 удалений

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

@@ -897,7 +897,6 @@ func TestGetTopInactiveChannelsForTeamSince(t *testing.T) {
} }
func TestGetTopDMsForUserSince(t *testing.T) { func TestGetTopDMsForUserSince(t *testing.T) {
t.Skip("MM-46911")
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
@@ -933,6 +932,7 @@ func TestGetTopDMsForUserSince(t *testing.T) {
Username: GenerateTestUsername(), Username: GenerateTestUsername(),
DisplayName: "a bot", DisplayName: "a bot",
Description: "bot", Description: "bot",
UserId: model.NewId(),
} }
createdBot, resp, err := th.Client.CreateBot(bot) createdBot, resp, err := th.Client.CreateBot(bot)

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

@@ -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) { func (s *SqlPostStore) GetTopDMsForUserSince(userID string, since int64, offset int, limit int) (*model.TopDMList, error) {
var botsFilterExpr, stringSplitKeyword string var botsFilterExpr string
if s.DriverName() == model.DatabaseDriverPostgres {
stringSplitKeyword = "split_part"
} else if s.DriverName() == model.DatabaseDriverMysql {
stringSplitKeyword = "SUBSTRING_INDEX"
}
/* /*
Channel.Name is of the format userId1__userId2. Channel.Name is of the format userId1__userId2.
Using this, self dms, and bot dms can be filtered. Using this, self dms, and bot dms can be filtered.
*/ */
botsFilterExpr = fmt.Sprintf(` if s.DriverName() == model.DatabaseDriverPostgres {
%s(Channels.Name, '__', 1) NOT IN (SELECT UserId FROM Bots) botsFilterExpr = `SPLIT_PART(Channels.Name, '__', 1) NOT IN (SELECT UserId FROM Bots)
AND %s(Channels.Name, '__', 2) NOT IN (SELECT UserId FROM Bots) AND SPLIT_PART(Channels.Name, '__', 2) NOT IN (SELECT UserId FROM Bots)
`, stringSplitKeyword, stringSplitKeyword) `
} 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"). channelSelector := s.getQueryBuilder().Select("Id", "TotalMsgCount").From("Channels").Join("ChannelMembers as cm on cm.ChannelId = Channels.Id").
Where(sq.And{ Where(sq.And{
sq.Expr("Channels.Type = 'D'"), sq.Expr("Channels.Type = 'D'"),

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

@@ -4067,6 +4067,8 @@ func testGetTopDMsForUserSince(t *testing.T, ss store.Store, s SqlStore) {
u2 := model.User{Email: MakeEmail(), Username: model.NewId()} u2 := model.User{Email: MakeEmail(), Username: model.NewId()}
u3 := model.User{Email: MakeEmail(), Username: model.NewId()} u3 := model.User{Email: MakeEmail(), Username: model.NewId()}
u4 := 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) _, err := ss.User().Save(&user)
require.NoError(t, err) require.NoError(t, err)
_, err = ss.User().Save(&u1) _, err = ss.User().Save(&u1)
@@ -4077,6 +4079,17 @@ func testGetTopDMsForUserSince(t *testing.T, ss store.Store, s SqlStore) {
require.NoError(t, err) require.NoError(t, err)
_, err = ss.User().Save(&u4) _, err = ss.User().Save(&u4)
require.NoError(t, err) 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 // user direct messages
chUser1, nErr := ss.Channel().CreateDirectChannel(&u1, &user) chUser1, nErr := ss.Channel().CreateDirectChannel(&u1, &user)
require.NoError(t, nErr) 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) chUser3User4, nErr := ss.Channel().CreateDirectChannel(&u3, &u4)
require.NoError(t, nErr) 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 // sample post data
// for u1 // for u1
_, err = ss.Post().Save(&model.Post{ _, err = ss.Post().Save(&model.Post{