Inline ThreadStore.MarkAllAsUnreadByTeam (#20958)
* Add teamId to Threads table * Get rid of multiple teamId reads * Fix failed test * Inline ThreadStore.MarkAllAsUnreadByTeam The query to `MarkAllAsUnreadByTeam` first fetched all thread memberships, then fed just the ids back to a second query to ensure all are marked as unread. Optimize this by simply doing a single `UPDATE` query with the necessary joins. Co-authored-by: iomodo <wineson@gmail.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
597bf9fcad
Коммит
5a0a3e6d13
@@ -549,27 +549,28 @@ func (s *SqlThreadStore) MarkAllAsRead(userId string, threadIds []string) error
|
||||
// MarkAllAsReadByTeam marks all threads for the given user in the given team as read from the
|
||||
// current time.
|
||||
func (s *SqlThreadStore) MarkAllAsReadByTeam(userId, teamId string) error {
|
||||
memberships, err := s.GetMembershipsForUser(userId, teamId)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
membershipIds := []string{}
|
||||
for _, m := range memberships {
|
||||
membershipIds = append(membershipIds, m.PostId)
|
||||
}
|
||||
timestamp := model.GetMillis()
|
||||
query := s.getQueryBuilder().
|
||||
Update("ThreadMemberships").
|
||||
Where(sq.Eq{"PostId": membershipIds}).
|
||||
Where(sq.Eq{"UserId": userId}).
|
||||
|
||||
var query sq.UpdateBuilder
|
||||
if s.DriverName() == model.DatabaseDriverPostgres {
|
||||
query = s.getQueryBuilder().Update("ThreadMemberships").From("Threads")
|
||||
} else {
|
||||
query = s.getQueryBuilder().Update("ThreadMemberships", "Threads")
|
||||
}
|
||||
|
||||
query = query.
|
||||
Where("Threads.PostId = ThreadMemberships.PostId").
|
||||
Where(sq.Eq{"ThreadMemberships.UserId": userId}).
|
||||
Where(sq.Or{sq.Eq{"Threads.TeamId": teamId}, sq.Eq{"Threads.TeamId": ""}}).
|
||||
Set("LastViewed", timestamp).
|
||||
Set("UnreadMentions", 0).
|
||||
Set("LastUpdated", model.GetMillis())
|
||||
Set("LastUpdated", timestamp)
|
||||
|
||||
_, err = s.GetMasterX().ExecBuilder(query)
|
||||
_, err := s.GetMasterX().ExecBuilder(query)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "failed to update thread read state for user id=%s", userId)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user