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

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

@@ -3152,17 +3152,26 @@ func testChannelStoreGetChannels(t *testing.T, ss store.Store) {
require.Nil(t, nErr) require.Nil(t, nErr)
require.Equal(t, o1.Id, (*list)[0].Id, "missing channel") 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] _, ok := ids[o1.Id]
require.True(t, ok, "missing channel") 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] _, ok = ids2[o1.Id]
require.True(t, ok, "missing channel") 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] _, ok = ids3[o1.Id]
require.True(t, ok, "missing channel") 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( require.True(
t, t,
ss.Channel().IsUserInChannelUseCache(m1.UserId, o1.Id), ss.Channel().IsUserInChannelUseCache(m1.UserId, o1.Id),