MM-30300: Add coalesce to get null content as empty string on FileInfo store (#16216)

* MM-30300: Add coalesce to get null content as empty string on FileInfo store

* Making explicit the fields get from the FileInfo table

* Addressing PR review comments
Этот коммит содержится в:
Jesús Espino
2020-11-06 12:49:15 +01:00
коммит произвёл GitHub
родитель d2ec53f1e9
Коммит b08b51d52d

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

@@ -18,6 +18,7 @@ import (
type SqlFileInfoStore struct { type SqlFileInfoStore struct {
SqlStore SqlStore
metrics einterfaces.MetricsInterface metrics einterfaces.MetricsInterface
queryFields []string
} }
func (fs SqlFileInfoStore) ClearCaches() { func (fs SqlFileInfoStore) ClearCaches() {
@@ -29,6 +30,27 @@ func newSqlFileInfoStore(sqlStore SqlStore, metrics einterfaces.MetricsInterface
metrics: metrics, metrics: metrics,
} }
s.queryFields = []string{
"FileInfo.Id",
"FileInfo.CreatorId",
"FileInfo.PostId",
"FileInfo.CreateAt",
"FileInfo.UpdateAt",
"FileInfo.DeleteAt",
"FileInfo.Path",
"FileInfo.ThumbnailPath",
"FileInfo.PreviewPath",
"FileInfo.Name",
"FileInfo.Extension",
"FileInfo.Size",
"FileInfo.MimeType",
"FileInfo.Width",
"FileInfo.Height",
"FileInfo.HasPreviewImage",
"FileInfo.MiniPreview",
"Coalesce(FileInfo.Content, '') AS Content",
}
for _, db := range sqlStore.GetAllConns() { for _, db := range sqlStore.GetAllConns() {
table := db.AddTableWithName(model.FileInfo{}, "FileInfo").SetKeys(false, "Id") table := db.AddTableWithName(model.FileInfo{}, "FileInfo").SetKeys(false, "Id")
table.ColMap("Id").SetMaxSize(26) table.ColMap("Id").SetMaxSize(26)
@@ -86,14 +108,18 @@ func (fs SqlFileInfoStore) Upsert(info *model.FileInfo) (*model.FileInfo, error)
func (fs SqlFileInfoStore) Get(id string) (*model.FileInfo, error) { func (fs SqlFileInfoStore) Get(id string) (*model.FileInfo, error) {
info := &model.FileInfo{} info := &model.FileInfo{}
if err := fs.GetReplica().SelectOne(info, query := fs.getQueryBuilder().
`SELECT Select(fs.queryFields...).
* From("FileInfo").
FROM Where(sq.Eq{"Id": id}).
FileInfo Where(sq.Eq{"DeleteAt": 0})
WHERE
Id = :Id queryString, args, err := query.ToSql()
AND DeleteAt = 0`, map[string]interface{}{"Id": id}); err != nil { if err != nil {
return nil, errors.Wrap(err, "file_info_tosql")
}
if err := fs.GetReplica().SelectOne(info, queryString, args...); err != nil {
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
return nil, store.NewErrNotFound("FileInfo", id) return nil, store.NewErrNotFound("FileInfo", id)
} }
@@ -117,7 +143,7 @@ func (fs SqlFileInfoStore) GetWithOptions(page, perPage int, opt *model.GetFileI
} }
query := fs.getQueryBuilder(). query := fs.getQueryBuilder().
Select("FileInfo.*"). Select(fs.queryFields...).
From("FileInfo") From("FileInfo")
if len(opt.ChannelIds) > 0 { if len(opt.ChannelIds) > 0 {
@@ -172,15 +198,19 @@ func (fs SqlFileInfoStore) GetWithOptions(page, perPage int, opt *model.GetFileI
func (fs SqlFileInfoStore) GetByPath(path string) (*model.FileInfo, error) { func (fs SqlFileInfoStore) GetByPath(path string) (*model.FileInfo, error) {
info := &model.FileInfo{} info := &model.FileInfo{}
if err := fs.GetReplica().SelectOne(info, query := fs.getQueryBuilder().
`SELECT Select(fs.queryFields...).
* From("FileInfo").
FROM Where(sq.Eq{"Path": path}).
FileInfo Where(sq.Eq{"DeleteAt": 0}).
WHERE Limit(1)
Path = :Path
AND DeleteAt = 0 queryString, args, err := query.ToSql()
LIMIT 1`, map[string]interface{}{"Path": path}); err != nil { if err != nil {
return nil, errors.Wrap(err, "file_info_tosql")
}
if err := fs.GetReplica().SelectOne(info, queryString, args...); err != nil {
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
return nil, store.NewErrNotFound("FileInfo", fmt.Sprintf("path=%s", path)) return nil, store.NewErrNotFound("FileInfo", fmt.Sprintf("path=%s", path))
} }
@@ -203,7 +233,7 @@ func (fs SqlFileInfoStore) GetForPost(postId string, readFromMaster, includeDele
} }
query := fs.getQueryBuilder(). query := fs.getQueryBuilder().
Select("*"). Select(fs.queryFields...).
From("FileInfo"). From("FileInfo").
Where(sq.Eq{"PostId": postId}). Where(sq.Eq{"PostId": postId}).
OrderBy("CreateAt") OrderBy("CreateAt")
@@ -228,16 +258,19 @@ func (fs SqlFileInfoStore) GetForUser(userId string) ([]*model.FileInfo, error)
dbmap := fs.GetReplica() dbmap := fs.GetReplica()
if _, err := dbmap.Select(&infos, query := fs.getQueryBuilder().
`SELECT Select(fs.queryFields...).
* From("FileInfo").
FROM Where(sq.Eq{"CreatorId": userId}).
FileInfo Where(sq.Eq{"DeleteAt": 0}).
WHERE OrderBy("CreateAt")
CreatorId = :CreatorId
AND DeleteAt = 0 queryString, args, err := query.ToSql()
ORDER BY if err != nil {
CreateAt`, map[string]interface{}{"CreatorId": userId}); err != nil { return nil, errors.Wrap(err, "file_info_tosql")
}
if _, err := dbmap.Select(&infos, queryString, args...); err != nil {
return nil, errors.Wrapf(err, "failed to find FileInfos with creatorId=%s", userId) return nil, errors.Wrapf(err, "failed to find FileInfos with creatorId=%s", userId)
} }
return infos, nil return infos, nil