adopt forked squirrel supporting from UPDATE FROM (#19896)

Fork https://github.com/Masterminds/squirrel as https://github.com/lieut-data/squirrel with the following changes:
* https://github.com/Masterminds/squirrel/pull/256 supporting FROM clause to update builder (Postgres)
* Extension of above to support multiple FROM in UPDATE (Postgres)
* Support for multiple tables in UPDATE (MySQL)

This PR then leverages those changes to simplify a query that previously had to be coded by hand and duplicate for each of MySQL and Postgres.
Этот коммит содержится в:
Jesse Hallam
2022-04-04 09:30:59 -03:00
коммит произвёл GitHub
родитель 3f5eb5f6f7
Коммит 7b5ac343f0
7 изменённых файлов: 64 добавлений и 36 удалений

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

@@ -571,36 +571,28 @@ func (s *SqlThreadStore) MarkAllAsReadByChannels(userID string, channelIDs []str
now := model.GetMillis()
// TODO: Fork squirrel to include https://github.com/Masterminds/squirrel/pull/256 and
// support FROM in an UPDATE query.
channelIDsSql, channelIDsArgs := constructArrayArgs(channelIDs)
var query string
var query sq.UpdateBuilder
if s.DriverName() == model.DatabaseDriverPostgres {
query = `
UPDATE ThreadMemberships
SET LastViewed = ?, UnreadMentions = ?, LastUpdated = ?
FROM Threads
WHERE ThreadMemberships.UserId = ?
AND Threads.PostId = ThreadMemberships.PostId
AND Threads.ChannelID IN ` + channelIDsSql + `
AND Threads.LastReplyAt > ThreadMemberships.LastViewed
`
query = s.getQueryBuilder().Update("ThreadMemberships").From("Threads")
} else {
query = `
UPDATE ThreadMemberships, Threads
SET ThreadMemberships.LastViewed = ?, ThreadMemberships.UnreadMentions = ?, ThreadMemberships.LastUpdated = ?
WHERE ThreadMemberships.UserId = ?
AND Threads.PostId = ThreadMemberships.PostId
AND Threads.ChannelID IN ` + channelIDsSql + `
AND Threads.LastReplyAt > ThreadMemberships.LastViewed
`
query = s.getQueryBuilder().Update("ThreadMemberships", "Threads")
}
args := []interface{}{now, 0, now, userID}
args = append(args, channelIDsArgs...)
query = query.Set("LastViewed", now).
Set("UnreadMentions", 0).
Set("LastUpdated", now).
Where(sq.Eq{"ThreadMemberships.UserId": userID}).
Where(sq.Expr("Threads.PostId = ThreadMemberships.PostId")).
Where(sq.Eq{"Threads.ChannelId": channelIDs}).
Where(sq.Expr("Threads.LastReplyAt > ThreadMemberships.LastViewed"))
if _, err := s.GetMasterX().Exec(query, args...); err != nil {
sql, args, err := query.ToSql()
if err != nil {
return errors.Wrapf(err, "failed to build query to mark all as read by %d channels for user id=%s", len(channelIDs), userID)
}
if _, err := s.GetMasterX().Exec(sql, args...); err != nil {
return errors.Wrapf(err, "failed to mark all threads as read by channels for user id=%s", userID)
}