From a59d3a9fa6269f737ce616d5afa01ec91baf5a54 Mon Sep 17 00:00:00 2001 From: source-punk <65635122+source-punk@users.noreply.github.com> Date: Fri, 16 Jul 2021 20:00:23 +0530 Subject: [PATCH] =?UTF-8?q?[MM-36711]=20nested=20sql=20query=20for=20reply?= =?UTF-8?q?=5Fcount=20in=20getSingle=20post=20method=20of=20post=5Fsto?= =?UTF-8?q?=E2=80=A6=20(#17845)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 --- store/sqlstore/post_store.go | 12 +++++++++--- store/storetest/post_store.go | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/store/sqlstore/post_store.go b/store/sqlstore/post_store.go index b9b45efa77..9d4333b712 100644 --- a/store/sqlstore/post_store.go +++ b/store/sqlstore/post_store.go @@ -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) { query := s.getQueryBuilder(). - Select("*"). + Select("p.*"). + From("Posts p"). + Where(sq.Eq{"p.Id": id}) + + replyCountSubQuery := s.getQueryBuilder(). + Select("COUNT(Posts.Id)"). 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 { - 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() if err != nil { diff --git a/store/storetest/post_store.go b/store/storetest/post_store.go index 20b383cdfb..1516234b88 100644 --- a/store/storetest/post_store.go +++ b/store/storetest/post_store.go @@ -471,12 +471,34 @@ func testPostStoreGetSingle(t *testing.T, ss store.Store) { o2, err = ss.Post().Save(o2) 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) 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) require.NoError(t, err) 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) 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.Equal(t, post.CreateAt, o2.CreateAt, "invalid returned post") 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) require.Error(t, err, "Missing id should have failed")