MM-62158: group store no select star, part3 (#30927)
* migrate getGroupsAssociatedToChannelsByTeam * migrate GetGroups * migrate teamMembersMinusGroupMembersQuery * migrate channelMembersMinusGroupMembersQuery
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
6de3379994
Коммит
92db356484
@@ -1340,9 +1340,8 @@ func (s *SqlGroupStore) groupsBySyncableBaseQuery(st model.GroupSyncableType, t
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *SqlGroupStore) getGroupsAssociatedToChannelsByTeam(teamID string, opts model.GroupSearchOpts) sq.SelectBuilder {
|
func (s *SqlGroupStore) getGroupsAssociatedToChannelsByTeam(teamID string, opts model.GroupSearchOpts) sq.SelectBuilder {
|
||||||
query := s.getQueryBuilder().
|
query := s.userGroupsSelectQuery.
|
||||||
Select("gc.ChannelId, UserGroups.*, gc.SchemeAdmin AS SyncableSchemeAdmin").
|
Columns("gc.ChannelId", "gc.SchemeAdmin AS SyncableSchemeAdmin").
|
||||||
From("UserGroups").
|
|
||||||
LeftJoin(`
|
LeftJoin(`
|
||||||
(SELECT
|
(SELECT
|
||||||
GroupChannels.GroupId, GroupChannels.ChannelId, GroupChannels.DeleteAt, GroupChannels.SchemeAdmin
|
GroupChannels.GroupId, GroupChannels.ChannelId, GroupChannels.DeleteAt, GroupChannels.SchemeAdmin
|
||||||
@@ -1358,9 +1357,8 @@ func (s *SqlGroupStore) getGroupsAssociatedToChannelsByTeam(teamID string, opts
|
|||||||
OrderBy("UserGroups.DisplayName")
|
OrderBy("UserGroups.DisplayName")
|
||||||
|
|
||||||
if opts.IncludeMemberCount {
|
if opts.IncludeMemberCount {
|
||||||
query = s.getQueryBuilder().
|
query = s.userGroupsSelectQuery.
|
||||||
Select("gc.ChannelId, UserGroups.*, coalesce(Members.MemberCount, 0) AS MemberCount, gc.SchemeAdmin AS SyncableSchemeAdmin").
|
Columns("gc.ChannelId", "coalesce(Members.MemberCount, 0) AS MemberCount", "gc.SchemeAdmin AS SyncableSchemeAdmin").
|
||||||
From("UserGroups").
|
|
||||||
LeftJoin(`
|
LeftJoin(`
|
||||||
(SELECT
|
(SELECT
|
||||||
GroupChannels.ChannelId, GroupChannels.DeleteAt, GroupChannels.GroupId, GroupChannels.SchemeAdmin
|
GroupChannels.ChannelId, GroupChannels.DeleteAt, GroupChannels.GroupId, GroupChannels.SchemeAdmin
|
||||||
@@ -1457,21 +1455,19 @@ func (s *SqlGroupStore) GetGroupsAssociatedToChannelsByTeam(teamId string, opts
|
|||||||
func (s *SqlGroupStore) GetGroups(page, perPage int, opts model.GroupSearchOpts, viewRestrictions *model.ViewUsersRestrictions) ([]*model.Group, error) {
|
func (s *SqlGroupStore) GetGroups(page, perPage int, opts model.GroupSearchOpts, viewRestrictions *model.ViewUsersRestrictions) ([]*model.Group, error) {
|
||||||
groupsVar := groups{}
|
groupsVar := groups{}
|
||||||
|
|
||||||
selectQuery := []string{"g.*"}
|
groupsQuery := s.userGroupsSelectQuery
|
||||||
|
|
||||||
if opts.IncludeMemberCount {
|
if opts.IncludeMemberCount {
|
||||||
selectQuery = append(selectQuery, "coalesce(Members.MemberCount, 0) AS MemberCount")
|
groupsQuery = groupsQuery.Column("coalesce(Members.MemberCount, 0) AS MemberCount")
|
||||||
}
|
}
|
||||||
|
|
||||||
if opts.IncludeChannelMemberCount != "" {
|
if opts.IncludeChannelMemberCount != "" {
|
||||||
selectQuery = append(selectQuery, "coalesce(ChannelMembers.ChannelMemberCount, 0) AS ChannelMemberCount")
|
groupsQuery = groupsQuery.Column("coalesce(ChannelMembers.ChannelMemberCount, 0) AS ChannelMemberCount")
|
||||||
if opts.IncludeTimezones {
|
if opts.IncludeTimezones {
|
||||||
selectQuery = append(selectQuery, "coalesce(ChannelMembers.ChannelMemberTimezonesCount, 0) AS ChannelMemberTimezonesCount")
|
groupsQuery = groupsQuery.Column("coalesce(ChannelMembers.ChannelMemberTimezonesCount, 0) AS ChannelMemberTimezonesCount")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
groupsQuery := s.getQueryBuilder().Select(strings.Join(selectQuery, ", "))
|
|
||||||
|
|
||||||
if opts.IncludeMemberCount {
|
if opts.IncludeMemberCount {
|
||||||
countQuery := s.getQueryBuilder().
|
countQuery := s.getQueryBuilder().
|
||||||
Select("GroupMembers.GroupId, COUNT(DISTINCT Users.Id) AS MemberCount").
|
Select("GroupMembers.GroupId, COUNT(DISTINCT Users.Id) AS MemberCount").
|
||||||
@@ -1488,7 +1484,7 @@ func (s *SqlGroupStore) GetGroups(page, perPage int, opts model.GroupSearchOpts,
|
|||||||
return nil, errors.Wrap(err, "get_groups_tosql")
|
return nil, errors.Wrap(err, "get_groups_tosql")
|
||||||
}
|
}
|
||||||
groupsQuery = groupsQuery.
|
groupsQuery = groupsQuery.
|
||||||
LeftJoin("("+countString+") AS Members ON Members.GroupId = g.Id", params...)
|
LeftJoin("("+countString+") AS Members ON Members.GroupId = UserGroups.Id", params...)
|
||||||
}
|
}
|
||||||
|
|
||||||
if opts.IncludeChannelMemberCount != "" {
|
if opts.IncludeChannelMemberCount != "" {
|
||||||
@@ -1521,36 +1517,33 @@ func (s *SqlGroupStore) GetGroups(page, perPage int, opts model.GroupSearchOpts,
|
|||||||
}
|
}
|
||||||
|
|
||||||
groupsQuery = groupsQuery.
|
groupsQuery = groupsQuery.
|
||||||
LeftJoin("(SELECT "+selectStr+" FROM ChannelMembers LEFT JOIN GroupMembers ON GroupMembers.UserId = ChannelMembers.UserId AND GroupMembers.DeleteAt = 0 "+joinStr+" WHERE ChannelMembers.ChannelId = ? GROUP BY GroupId) AS ChannelMembers ON ChannelMembers.GroupId = g.Id", opts.IncludeChannelMemberCount)
|
LeftJoin("(SELECT "+selectStr+" FROM ChannelMembers LEFT JOIN GroupMembers ON GroupMembers.UserId = ChannelMembers.UserId AND GroupMembers.DeleteAt = 0 "+joinStr+" WHERE ChannelMembers.ChannelId = ? GROUP BY GroupId) AS ChannelMembers ON ChannelMembers.GroupId = UserGroups.Id", opts.IncludeChannelMemberCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
if opts.FilterHasMember != "" {
|
if opts.FilterHasMember != "" {
|
||||||
groupsQuery = groupsQuery.
|
groupsQuery = groupsQuery.
|
||||||
LeftJoin("GroupMembers ON GroupMembers.GroupId = g.Id").
|
LeftJoin("GroupMembers ON GroupMembers.GroupId = UserGroups.Id").
|
||||||
Where("GroupMembers.UserId = ?", opts.FilterHasMember).
|
Where("GroupMembers.UserId = ?", opts.FilterHasMember).
|
||||||
Where("GroupMembers.DeleteAt = 0")
|
Where("GroupMembers.DeleteAt = 0")
|
||||||
}
|
}
|
||||||
|
|
||||||
groupsQuery = groupsQuery.
|
|
||||||
From("UserGroups g")
|
|
||||||
|
|
||||||
if opts.Since > 0 {
|
if opts.Since > 0 {
|
||||||
groupsQuery = groupsQuery.Where(sq.Gt{
|
groupsQuery = groupsQuery.Where(sq.Gt{
|
||||||
"g.UpdateAt": opts.Since,
|
"UserGroups.UpdateAt": opts.Since,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if opts.FilterArchived {
|
if opts.FilterArchived {
|
||||||
groupsQuery = groupsQuery.Where("g.DeleteAt > 0")
|
groupsQuery = groupsQuery.Where("UserGroups.DeleteAt > 0")
|
||||||
} else if !opts.IncludeArchived && opts.Since <= 0 {
|
} else if !opts.IncludeArchived && opts.Since <= 0 {
|
||||||
// Mobile needs to return archived groups when the since parameter is set, will need to keep this for backwards compatibility
|
// Mobile needs to return archived groups when the since parameter is set, will need to keep this for backwards compatibility
|
||||||
groupsQuery = groupsQuery.Where("g.DeleteAt = 0")
|
groupsQuery = groupsQuery.Where("UserGroups.DeleteAt = 0")
|
||||||
}
|
}
|
||||||
|
|
||||||
if opts.IncludeArchived {
|
if opts.IncludeArchived {
|
||||||
groupsQuery = groupsQuery.OrderBy("CASE WHEN g.DeleteAt = 0 THEN g.DisplayName end, CASE WHEN g.DeleteAt != 0 THEN g.DisplayName END")
|
groupsQuery = groupsQuery.OrderBy("CASE WHEN UserGroups.DeleteAt = 0 THEN UserGroups.DisplayName end, CASE WHEN UserGroups.DeleteAt != 0 THEN UserGroups.DisplayName END")
|
||||||
} else {
|
} else {
|
||||||
groupsQuery = groupsQuery.OrderBy("g.DisplayName")
|
groupsQuery = groupsQuery.OrderBy("UserGroups.DisplayName")
|
||||||
}
|
}
|
||||||
|
|
||||||
if perPage != 0 {
|
if perPage != 0 {
|
||||||
@@ -1560,7 +1553,7 @@ func (s *SqlGroupStore) GetGroups(page, perPage int, opts model.GroupSearchOpts,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if opts.FilterAllowReference {
|
if opts.FilterAllowReference {
|
||||||
groupsQuery = groupsQuery.Where("g.AllowReference = true")
|
groupsQuery = groupsQuery.Where("UserGroups.AllowReference = true")
|
||||||
}
|
}
|
||||||
|
|
||||||
if opts.Q != "" {
|
if opts.Q != "" {
|
||||||
@@ -1569,12 +1562,12 @@ func (s *SqlGroupStore) GetGroups(page, perPage int, opts model.GroupSearchOpts,
|
|||||||
if s.DriverName() == model.DatabaseDriverMysql {
|
if s.DriverName() == model.DatabaseDriverMysql {
|
||||||
operatorKeyword = "LIKE"
|
operatorKeyword = "LIKE"
|
||||||
}
|
}
|
||||||
groupsQuery = groupsQuery.Where(fmt.Sprintf("(g.Name %[1]s ? OR g.DisplayName %[1]s ?)", operatorKeyword), pattern, pattern)
|
groupsQuery = groupsQuery.Where(fmt.Sprintf("(UserGroups.Name %[1]s ? OR UserGroups.DisplayName %[1]s ?)", operatorKeyword), pattern, pattern)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(opts.NotAssociatedToTeam) == 26 {
|
if len(opts.NotAssociatedToTeam) == 26 {
|
||||||
groupsQuery = groupsQuery.Where(`
|
groupsQuery = groupsQuery.Where(`
|
||||||
g.Id NOT IN (
|
UserGroups.Id NOT IN (
|
||||||
SELECT
|
SELECT
|
||||||
Id
|
Id
|
||||||
FROM
|
FROM
|
||||||
@@ -1590,7 +1583,7 @@ func (s *SqlGroupStore) GetGroups(page, perPage int, opts model.GroupSearchOpts,
|
|||||||
|
|
||||||
if len(opts.NotAssociatedToChannel) == 26 {
|
if len(opts.NotAssociatedToChannel) == 26 {
|
||||||
groupsQuery = groupsQuery.Where(`
|
groupsQuery = groupsQuery.Where(`
|
||||||
g.Id NOT IN (
|
UserGroups.Id NOT IN (
|
||||||
SELECT
|
SELECT
|
||||||
Id
|
Id
|
||||||
FROM
|
FROM
|
||||||
@@ -1615,7 +1608,7 @@ func (s *SqlGroupStore) GetGroups(page, perPage int, opts model.GroupSearchOpts,
|
|||||||
JOIN Channels ON Channels.TeamId = Teams.Id
|
JOIN Channels ON Channels.TeamId = Teams.Id
|
||||||
WHERE
|
WHERE
|
||||||
Channels.Id = ?
|
Channels.Id = ?
|
||||||
) THEN g.Id IN (
|
) THEN UserGroups.Id IN (
|
||||||
SELECT
|
SELECT
|
||||||
GroupId
|
GroupId
|
||||||
FROM
|
FROM
|
||||||
@@ -1637,27 +1630,22 @@ func (s *SqlGroupStore) GetGroups(page, perPage int, opts model.GroupSearchOpts,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if opts.Source != "" {
|
if opts.Source != "" {
|
||||||
groupsQuery = groupsQuery.Where("g.Source = ?", opts.Source)
|
groupsQuery = groupsQuery.Where("UserGroups.Source = ?", opts.Source)
|
||||||
} else if opts.OnlySyncableSources {
|
} else if opts.OnlySyncableSources {
|
||||||
sources := model.GetSyncableGroupSources()
|
sources := model.GetSyncableGroupSources()
|
||||||
sourcePrefixes := model.GetSyncableGroupSourcePrefixes()
|
sourcePrefixes := model.GetSyncableGroupSourcePrefixes()
|
||||||
|
|
||||||
orClauses := sq.Or{}
|
orClauses := sq.Or{}
|
||||||
if len(sources) > 0 {
|
if len(sources) > 0 {
|
||||||
orClauses = append(orClauses, sq.Eq{"g.Source": sources})
|
orClauses = append(orClauses, sq.Eq{"UserGroups.Source": sources})
|
||||||
}
|
}
|
||||||
for _, prefix := range sourcePrefixes {
|
for _, prefix := range sourcePrefixes {
|
||||||
orClauses = append(orClauses, sq.Like{"g.Source": string(prefix) + "%"})
|
orClauses = append(orClauses, sq.Like{"UserGroups.Source": string(prefix) + "%"})
|
||||||
}
|
}
|
||||||
groupsQuery = groupsQuery.Where(orClauses)
|
groupsQuery = groupsQuery.Where(orClauses)
|
||||||
}
|
}
|
||||||
|
|
||||||
queryString, args, err := groupsQuery.ToSql()
|
if err := s.GetReplica().SelectBuilder(&groupsVar, groupsQuery); err != nil {
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "get_groups_tosql")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = s.GetReplica().Select(&groupsVar, queryString, args...); err != nil {
|
|
||||||
return nil, errors.Wrap(err, "failed to find Groups")
|
return nil, errors.Wrap(err, "failed to find Groups")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1665,16 +1653,21 @@ func (s *SqlGroupStore) GetGroups(page, perPage int, opts model.GroupSearchOpts,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *SqlGroupStore) teamMembersMinusGroupMembersQuery(teamID string, groupIDs []string, isCount bool) sq.SelectBuilder {
|
func (s *SqlGroupStore) teamMembersMinusGroupMembersQuery(teamID string, groupIDs []string, isCount bool) sq.SelectBuilder {
|
||||||
var selectStr string
|
var builder sq.SelectBuilder
|
||||||
|
|
||||||
if isCount {
|
if isCount {
|
||||||
selectStr = "count(DISTINCT Users.Id)"
|
builder = s.getQueryBuilder().Select("count(DISTINCT Users.Id)")
|
||||||
} else {
|
} else {
|
||||||
tmpl := "Users.*, coalesce(TeamMembers.SchemeGuest, false) SchemeGuest, TeamMembers.SchemeAdmin, TeamMembers.SchemeUser, %s AS GroupIDs"
|
builder = s.getQueryBuilder().Select().
|
||||||
|
Columns(getUsersColumns()...).
|
||||||
|
Column("coalesce(TeamMembers.SchemeGuest, false) SchemeGuest").
|
||||||
|
Column("TeamMembers.SchemeAdmin").
|
||||||
|
Column("TeamMembers.SchemeUser")
|
||||||
|
|
||||||
if s.DriverName() == model.DatabaseDriverMysql {
|
if s.DriverName() == model.DatabaseDriverMysql {
|
||||||
selectStr = fmt.Sprintf(tmpl, "group_concat(UserGroups.Id)")
|
builder = builder.Column("group_concat(UserGroups.Id) AS GroupIDs")
|
||||||
} else {
|
} else {
|
||||||
selectStr = fmt.Sprintf(tmpl, "string_agg(UserGroups.Id, ',')")
|
builder = builder.Column("string_agg(UserGroups.Id, ',') AS GroupIDs")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1686,7 +1679,7 @@ func (s *SqlGroupStore) teamMembersMinusGroupMembersQuery(teamID string, groupID
|
|||||||
|
|
||||||
query, _ := subQuery.MustSql()
|
query, _ := subQuery.MustSql()
|
||||||
|
|
||||||
builder := s.getQueryBuilder().Select(selectStr).
|
builder = builder.
|
||||||
From("TeamMembers").
|
From("TeamMembers").
|
||||||
Join("Teams ON Teams.Id = TeamMembers.TeamId").
|
Join("Teams ON Teams.Id = TeamMembers.TeamId").
|
||||||
Join("Users ON Users.Id = TeamMembers.UserId").
|
Join("Users ON Users.Id = TeamMembers.UserId").
|
||||||
@@ -1738,16 +1731,22 @@ func (s *SqlGroupStore) CountTeamMembersMinusGroupMembers(teamID string, groupID
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *SqlGroupStore) channelMembersMinusGroupMembersQuery(channelID string, groupIDs []string, isCount bool) sq.SelectBuilder {
|
func (s *SqlGroupStore) channelMembersMinusGroupMembersQuery(channelID string, groupIDs []string, isCount bool) sq.SelectBuilder {
|
||||||
var selectStr string
|
builder := s.getQueryBuilder().Select()
|
||||||
|
|
||||||
if isCount {
|
if isCount {
|
||||||
selectStr = "count(DISTINCT Users.Id)"
|
builder = builder.Column("count(DISTINCT Users.Id)")
|
||||||
} else {
|
} else {
|
||||||
tmpl := "Users.*, coalesce(ChannelMembers.SchemeGuest, false) SchemeGuest, ChannelMembers.SchemeAdmin, ChannelMembers.SchemeUser, %s AS GroupIDs"
|
builder = builder.Columns(getUsersColumns()...)
|
||||||
|
builder = builder.Columns(
|
||||||
|
"COALESCE(ChannelMembers.SchemeGuest, FALSE) SchemeGuest",
|
||||||
|
"ChannelMembers.SchemeAdmin",
|
||||||
|
"ChannelMembers.SchemeUser",
|
||||||
|
)
|
||||||
|
|
||||||
if s.DriverName() == model.DatabaseDriverMysql {
|
if s.DriverName() == model.DatabaseDriverMysql {
|
||||||
selectStr = fmt.Sprintf(tmpl, "group_concat(UserGroups.Id)")
|
builder = builder.Column("group_concat(UserGroups.Id) AS GroupIDs")
|
||||||
} else {
|
} else {
|
||||||
selectStr = fmt.Sprintf(tmpl, "string_agg(UserGroups.Id, ',')")
|
builder = builder.Column("string_agg(UserGroups.Id, ',') AS GroupIDs")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1759,7 +1758,7 @@ func (s *SqlGroupStore) channelMembersMinusGroupMembersQuery(channelID string, g
|
|||||||
|
|
||||||
query, _ := subQuery.MustSql()
|
query, _ := subQuery.MustSql()
|
||||||
|
|
||||||
builder := s.getQueryBuilder().Select(selectStr).
|
builder = builder.
|
||||||
From("ChannelMembers").
|
From("ChannelMembers").
|
||||||
Join("Channels ON Channels.Id = ChannelMembers.ChannelId").
|
Join("Channels ON Channels.Id = ChannelMembers.ChannelId").
|
||||||
Join("Users ON Users.Id = ChannelMembers.UserId").
|
Join("Users ON Users.Id = ChannelMembers.UserId").
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user