[MM-24089] Remove use of Gorp in ChannelStore.GetAllChannelMembersForUser (#14663)

* Remove use of Gorp in ChannelStore.GetAllChannelMembersForUser

In order to improve performance, we're removing gorp calls in the
most used queries in the platform and this is one of them
Этот коммит содержится в:
Mario de Frutos Dieguez
2020-07-09 09:13:17 +02:00
коммит произвёл GitHub
родитель 7910e237b9
Коммит 4df6019f61
2 изменённых файлов: 60 добавлений и 27 удалений

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

@@ -1933,41 +1933,65 @@ func (s SqlChannelStore) GetAllChannelMembersForUser(userId string, allowFromCac
s.metrics.IncrementMemCacheMissCounter("All Channel Members for User")
}
var deletedClause string
if !includeDeleted {
deletedClause = "Channels.DeleteAt = 0 AND"
failure := func(err error) *model.AppError {
// TODO: This error key would go away once this store method is migrated to return plain errors
return model.NewAppError(
"SqlChannelStore.GetAllChannelMembersForUser",
"app.channel.get_channels.get.app_error",
nil,
"userId="+userId+", err="+err.Error(),
http.StatusInternalServerError,
)
}
var data allChannelMembers
_, err := s.GetReplica().Select(&data, `
SELECT
ChannelMembers.ChannelId, ChannelMembers.Roles,
ChannelMembers.SchemeGuest, ChannelMembers.SchemeUser, ChannelMembers.SchemeAdmin,
query := s.getQueryBuilder().
Select(`
ChannelMembers.ChannelId, ChannelMembers.Roles, ChannelMembers.SchemeGuest,
ChannelMembers.SchemeUser, ChannelMembers.SchemeAdmin,
TeamScheme.DefaultChannelGuestRole TeamSchemeDefaultGuestRole,
TeamScheme.DefaultChannelUserRole TeamSchemeDefaultUserRole,
TeamScheme.DefaultChannelAdminRole TeamSchemeDefaultAdminRole,
ChannelScheme.DefaultChannelGuestRole ChannelSchemeDefaultGuestRole,
ChannelScheme.DefaultChannelUserRole ChannelSchemeDefaultUserRole,
ChannelScheme.DefaultChannelAdminRole ChannelSchemeDefaultAdminRole
FROM
ChannelMembers
INNER JOIN
Channels ON ChannelMembers.ChannelId = Channels.Id
LEFT JOIN
Schemes ChannelScheme ON Channels.SchemeId = ChannelScheme.Id
LEFT JOIN
Teams ON Channels.TeamId = Teams.Id
LEFT JOIN
Schemes TeamScheme ON Teams.SchemeId = TeamScheme.Id
WHERE
`+deletedClause+`
ChannelMembers.UserId = :UserId`, map[string]interface{}{"UserId": userId})
`).
From("ChannelMembers").
Join("Channels ON ChannelMembers.ChannelId = Channels.Id").
LeftJoin("Schemes ChannelScheme ON Channels.SchemeId = ChannelScheme.Id").
LeftJoin("Teams ON Channels.TeamId = Teams.Id").
LeftJoin("Schemes TeamScheme ON Teams.SchemeId = TeamScheme.Id").
Where(sq.Eq{"ChannelMembers.UserId": userId})
if !includeDeleted {
query = query.Where(sq.Eq{"Channels.DeleteAt": 0})
}
queryString, args, err := query.ToSql()
if err != nil {
// TODO: This error key would go away once this store method is migrated to return plain errors
return nil, model.NewAppError("SqlChannelStore.GetAllChannelMembersForUser", "app.channel.get_channels.get.app_error", nil, "userId="+userId+", err="+err.Error(), http.StatusInternalServerError)
return nil, failure(err)
}
rows, err := s.GetReplica().Db.Query(queryString, args...)
if err != nil {
return nil, failure(err)
}
var data allChannelMembers
defer rows.Close()
for rows.Next() {
var cm allChannelMember
err = rows.Scan(
&cm.ChannelId, &cm.Roles, &cm.SchemeGuest, &cm.SchemeUser,
&cm.SchemeAdmin, &cm.TeamSchemeDefaultGuestRole, &cm.TeamSchemeDefaultUserRole,
&cm.TeamSchemeDefaultAdminRole, &cm.ChannelSchemeDefaultGuestRole,
&cm.ChannelSchemeDefaultUserRole, &cm.ChannelSchemeDefaultAdminRole,
)
if err != nil {
return nil, failure(err)
}
data = append(data, cm)
}
if err = rows.Err(); err != nil {
return nil, failure(err)
}
ids := data.ToMapStringString()
if allowFromCache {

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

@@ -3152,17 +3152,26 @@ func testChannelStoreGetChannels(t *testing.T, ss store.Store) {
require.Nil(t, nErr)
require.Equal(t, o1.Id, (*list)[0].Id, "missing channel")
ids, _ := ss.Channel().GetAllChannelMembersForUser(m1.UserId, false, false)
ids, err := ss.Channel().GetAllChannelMembersForUser(m1.UserId, false, false)
require.Nil(t, err)
_, ok := ids[o1.Id]
require.True(t, ok, "missing channel")
ids2, _ := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, false)
ids2, err := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, false)
require.Nil(t, err)
_, ok = ids2[o1.Id]
require.True(t, ok, "missing channel")
ids3, _ := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, false)
ids3, err := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, false)
require.Nil(t, err)
_, ok = ids3[o1.Id]
require.True(t, ok, "missing channel")
ids4, err := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, true)
require.Nil(t, err)
_, ok = ids4[o1.Id]
require.True(t, ok, "missing channel")
require.True(
t,
ss.Channel().IsUserInChannelUseCache(m1.UserId, o1.Id),