[MM-26541] Parse channel member counts using LIKE instead of using JSON (#14941)
* MM-26541 parse channel member counts using like instead of using JSON as mysql versions do not support json extract * Use a constant for default timezone * Update wording and comments Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
eabae5437b
Коммит
31200fc657
@@ -2064,27 +2064,45 @@ func (s SqlChannelStore) GetMemberCountsByGroup(channelID string, includeTimezon
|
|||||||
selectStr := "GroupMembers.GroupId, COUNT(ChannelMembers.UserId) AS ChannelMemberCount"
|
selectStr := "GroupMembers.GroupId, COUNT(ChannelMembers.UserId) AS ChannelMemberCount"
|
||||||
|
|
||||||
if includeTimezones {
|
if includeTimezones {
|
||||||
distinctTimezones := `
|
// Length of default timezone (len {"automaticTimezone":"","manualTimezone":"","useAutomaticTimezone":"true"})
|
||||||
DISTINCT(
|
defaultTimezoneLength := `74`
|
||||||
CASE WHEN JSON_EXTRACT(Timezone, '$.useAutomaticTimezone') = 'true' AND LENGTH(Timezone) > 74
|
|
||||||
THEN JSON_EXTRACT(Timezone, '$.automaticTimezone')
|
// Beginning and end of the value for the automatic and manual timezones respectively
|
||||||
WHEN LENGTH(Timezone) > 74
|
autoTimezone := `LOCATE(':', Users.Timezone) + 2`
|
||||||
THEN JSON_EXTRACT(Timezone, '$.manualTimezone')
|
autoTimezoneEnd := `LOCATE(',', Users.Timezone) - LOCATE(':', Users.Timezone) - 3`
|
||||||
END
|
manualTimezone := `LOCATE(',', Users.Timezone) + 19`
|
||||||
)
|
manualTimezoneEnd := `LOCATE('useAutomaticTimezone', Users.Timezone) - 22 - LOCATE(',', Users.Timezone)`
|
||||||
`
|
|
||||||
if s.DriverName() == model.DATABASE_DRIVER_POSTGRES {
|
if s.DriverName() == model.DATABASE_DRIVER_POSTGRES {
|
||||||
distinctTimezones = `
|
autoTimezone = `POSITION(':' IN Users.Timezone) + 2`
|
||||||
DISTINCT(
|
autoTimezoneEnd = `POSITION(',' IN Users.Timezone) - POSITION(':' IN Users.Timezone) - 3`
|
||||||
CASE WHEN Timezone::json->>'useAutomaticTimezone' = 'true' AND LENGTH(Timezone) > 74
|
manualTimezone = `POSITION(',' IN Users.Timezone) + 19`
|
||||||
THEN Timezone::json->>'automaticTimezone'
|
manualTimezoneEnd = `POSITION('useAutomaticTimezone' IN Users.Timezone) - 22 - POSITION(',' IN Users.Timezone)`
|
||||||
WHEN LENGTH(Timezone) > 74
|
}
|
||||||
THEN Timezone::json->>'manualTimezone'
|
|
||||||
|
selectStr = `
|
||||||
|
GroupMembers.GroupId,
|
||||||
|
COUNT(ChannelMembers.UserId) AS ChannelMemberCount,
|
||||||
|
COUNT(DISTINCT
|
||||||
|
(
|
||||||
|
CASE WHEN Timezone like '%"useAutomaticTimezone":"true"}' AND LENGTH(Timezone) > ` + defaultTimezoneLength + `
|
||||||
|
THEN
|
||||||
|
SUBSTRING(
|
||||||
|
Timezone
|
||||||
|
FROM ` + autoTimezone + `
|
||||||
|
FOR ` + autoTimezoneEnd + `
|
||||||
|
)
|
||||||
|
WHEN Timezone like '%"useAutomaticTimezone":"false"}' AND LENGTH(Timezone) > ` + defaultTimezoneLength + `
|
||||||
|
THEN
|
||||||
|
SUBSTRING(
|
||||||
|
Timezone
|
||||||
|
FROM ` + manualTimezone + `
|
||||||
|
FOR ` + manualTimezoneEnd + `
|
||||||
|
)
|
||||||
END
|
END
|
||||||
)
|
)
|
||||||
`
|
) AS ChannelMemberTimezonesCount
|
||||||
}
|
`
|
||||||
selectStr = `GroupMembers.GroupId, COUNT(ChannelMembers.UserId) AS ChannelMemberCount, COUNT(` + distinctTimezones + `) AS ChannelMemberTimezonesCount`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
query := s.getQueryBuilder().
|
query := s.getQueryBuilder().
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user