[MM-36711] nested sql query for reply_count in getSingle post method of post_sto… (#17845)
* nested sql query for reply_count in getSingle post method of post_store.go * added tests for replyCount in GetSingle api * updated the post object message field in GetSingle unit test to use model.NewRandomString
Этот коммит содержится в:
@@ -598,13 +598,19 @@ func (s *SqlPostStore) Get(ctx context.Context, id string, skipFetchThreads, col
|
|||||||
|
|
||||||
func (s *SqlPostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error) {
|
func (s *SqlPostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error) {
|
||||||
query := s.getQueryBuilder().
|
query := s.getQueryBuilder().
|
||||||
Select("*").
|
Select("p.*").
|
||||||
|
From("Posts p").
|
||||||
|
Where(sq.Eq{"p.Id": id})
|
||||||
|
|
||||||
|
replyCountSubQuery := s.getQueryBuilder().
|
||||||
|
Select("COUNT(Posts.Id)").
|
||||||
From("Posts").
|
From("Posts").
|
||||||
Where(sq.Eq{"Id": id})
|
Where(sq.Expr("Posts.RootId = (CASE WHEN p.RootId = '' THEN p.Id ELSE p.RootId END) AND Posts.DeleteAt = 0"))
|
||||||
|
|
||||||
if !inclDeleted {
|
if !inclDeleted {
|
||||||
query = query.Where(sq.Eq{"DeleteAt": 0})
|
query = query.Where(sq.Eq{"p.DeleteAt": 0})
|
||||||
}
|
}
|
||||||
|
query = query.Column(sq.Alias(replyCountSubQuery, "ReplyCount"))
|
||||||
|
|
||||||
queryString, args, err := query.ToSql()
|
queryString, args, err := query.ToSql()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -471,12 +471,34 @@ func testPostStoreGetSingle(t *testing.T, ss store.Store) {
|
|||||||
o2, err = ss.Post().Save(o2)
|
o2, err = ss.Post().Save(o2)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
o3 := &model.Post{}
|
||||||
|
o3.ChannelId = o1.ChannelId
|
||||||
|
o3.UserId = o1.UserId
|
||||||
|
o3.Message = model.NewRandomString(10)
|
||||||
|
o3.RootId = o1.Id
|
||||||
|
|
||||||
|
o4 := &model.Post{}
|
||||||
|
o4.ChannelId = o1.ChannelId
|
||||||
|
o4.UserId = o1.UserId
|
||||||
|
o4.Message = model.NewRandomString(10)
|
||||||
|
o4.RootId = o1.Id
|
||||||
|
|
||||||
|
o3, err = ss.Post().Save(o3)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
o4, err = ss.Post().Save(o4)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = ss.Post().Delete(o2.Id, model.GetMillis(), o2.UserId)
|
err = ss.Post().Delete(o2.Id, model.GetMillis(), o2.UserId)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = ss.Post().Delete(o4.Id, model.GetMillis(), o4.UserId)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
post, err := ss.Post().GetSingle(o1.Id, false)
|
post, err := ss.Post().GetSingle(o1.Id, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, post.CreateAt, o1.CreateAt, "invalid returned post")
|
require.Equal(t, post.CreateAt, o1.CreateAt, "invalid returned post")
|
||||||
|
require.Equal(t, int64(1), post.ReplyCount, "wrong replyCount computed")
|
||||||
|
|
||||||
post, err = ss.Post().GetSingle(o2.Id, false)
|
post, err = ss.Post().GetSingle(o2.Id, false)
|
||||||
require.Error(t, err, "should not return deleted post")
|
require.Error(t, err, "should not return deleted post")
|
||||||
@@ -485,6 +507,7 @@ func testPostStoreGetSingle(t *testing.T, ss store.Store) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, post.CreateAt, o2.CreateAt, "invalid returned post")
|
require.Equal(t, post.CreateAt, o2.CreateAt, "invalid returned post")
|
||||||
require.NotZero(t, post.DeleteAt, "DeleteAt should be non-zero")
|
require.NotZero(t, post.DeleteAt, "DeleteAt should be non-zero")
|
||||||
|
require.Zero(t, post.ReplyCount, "Post without replies should return zero ReplyCount")
|
||||||
|
|
||||||
_, err = ss.Post().GetSingle("123", false)
|
_, err = ss.Post().GetSingle("123", false)
|
||||||
require.Error(t, err, "Missing id should have failed")
|
require.Error(t, err, "Missing id should have failed")
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user