[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
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
7910e237b9
Коммит
4df6019f61
@@ -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),
|
||||
|
||||
Ссылка в новой задаче
Block a user