[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>
Этот коммит содержится в:
Farhan Munshi
2020-07-08 10:56:47 -04:00
коммит произвёл 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().