From bd8e0474582d1e19fdcc5bdc2cc047f1d83c8e6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Villablanca=20V=C3=A1squez?= Date: Fri, 14 Jun 2019 11:52:17 -0400 Subject: [PATCH] Migrate POST.AnalyticsPostCount to Sync by default (#11179) * Migrate POST.AnalyticsPostCount to Sync by default * Fix: Query identation --- app/analytics.go | 23 ++++++++++++-- app/diagnostics.go | 4 +-- app/import_functions_test.go | 20 ++++++------ app/import_test.go | 6 ++-- store/sqlstore/post_store.go | 49 +++++++++++++++--------------- store/store.go | 2 +- store/storetest/mocks/PostStore.go | 19 ++++++++---- store/storetest/post_store.go | 6 ++-- 8 files changed, 74 insertions(+), 55 deletions(-) diff --git a/app/analytics.go b/app/analytics.go index 8c4fd083b5..1a2620dbbe 100644 --- a/app/analytics.go +++ b/app/analytics.go @@ -59,7 +59,12 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo var postChan store.StoreChannel if !skipIntensiveQueries { - postChan = a.Srv.Store.Post().AnalyticsPostCount(teamId, false, false) + postChan = make(chan store.StoreResult, 1) + go func() { + count, err := a.Srv.Store.Post().AnalyticsPostCount(teamId, false, false) + postChan <- store.StoreResult{Data: count, Err: err} + close(postChan) + }() } dailyActiveChan := a.Srv.Store.User().AnalyticsActiveCount(DAY_MILLISECONDS) @@ -212,9 +217,21 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo var fileChan store.StoreChannel var hashtagChan store.StoreChannel + if !skipIntensiveQueries { - fileChan = a.Srv.Store.Post().AnalyticsPostCount(teamId, true, false) - hashtagChan = a.Srv.Store.Post().AnalyticsPostCount(teamId, false, true) + fileChan = make(chan store.StoreResult, 1) + go func() { + count, err := a.Srv.Store.Post().AnalyticsPostCount(teamId, true, false) + fileChan <- store.StoreResult{Data: count, Err: err} + close(fileChan) + }() + + hashtagChan = make(chan store.StoreResult, 1) + go func() { + count, err := a.Srv.Store.Post().AnalyticsPostCount(teamId, false, true) + hashtagChan <- store.StoreResult{Data: count, Err: err} + close(hashtagChan) + }() } if fileChan == nil { diff --git a/app/diagnostics.go b/app/diagnostics.go index f35a5e642a..e694364503 100644 --- a/app/diagnostics.go +++ b/app/diagnostics.go @@ -191,9 +191,7 @@ func (a *App) trackActivity() { deletedPrivateChannelCount = dpccr.Data.(int64) } - if pcr := <-a.Srv.Store.Post().AnalyticsPostCount("", false, false); pcr.Err == nil { - postsCount = pcr.Data.(int64) - } + postsCount, _ = a.Srv.Store.Post().AnalyticsPostCount("", false, false) slashCommandsCount, _ = a.Srv.Store.Command().AnalyticsCommandCount("") diff --git a/app/import_functions_test.go b/app/import_functions_test.go index fe271d7175..cffa5cccdc 100644 --- a/app/import_functions_test.go +++ b/app/import_functions_test.go @@ -1799,11 +1799,9 @@ func TestImportImportPost(t *testing.T) { } // Count the number of posts in the testing team. - var initialPostCount int64 - if result := <-th.App.Srv.Store.Post().AnalyticsPostCount(team.Id, false, false); result.Err != nil { - t.Fatal(result.Err) - } else { - initialPostCount = result.Data.(int64) + initialPostCount, err := th.App.Srv.Store.Post().AnalyticsPostCount(team.Id, false, false) + if err != nil { + t.Fatal(err) } // Try adding an invalid post in dry run mode. @@ -2368,9 +2366,9 @@ func TestImportImportDirectPost(t *testing.T) { directChannel = channel // Get the number of posts in the system. - result := <-th.App.Srv.Store.Post().AnalyticsPostCount("", false, false) - require.Nil(t, result.Err) - initialPostCount := result.Data.(int64) + result, err := th.App.Srv.Store.Post().AnalyticsPostCount("", false, false) + require.Nil(t, err) + initialPostCount := result // Try adding an invalid post in dry run mode. data := &DirectPostImportData{ @@ -2534,9 +2532,9 @@ func TestImportImportDirectPost(t *testing.T) { groupChannel = channel // Get the number of posts in the system. - result = <-th.App.Srv.Store.Post().AnalyticsPostCount("", false, false) - require.Nil(t, result.Err) - initialPostCount = result.Data.(int64) + result, err = th.App.Srv.Store.Post().AnalyticsPostCount("", false, false) + require.Nil(t, err) + initialPostCount = result // Try adding an invalid post in dry run mode. data = &DirectPostImportData{ diff --git a/app/import_test.go b/app/import_test.go index ff47916d2a..c654ee6196 100644 --- a/app/import_test.go +++ b/app/import_test.go @@ -81,10 +81,10 @@ func checkNoError(t *testing.T, err *model.AppError) { } func AssertAllPostsCount(t *testing.T, a *App, initialCount int64, change int64, teamName string) { - if result := <-a.Srv.Store.Post().AnalyticsPostCount(teamName, false, false); result.Err != nil { - t.Fatal(result.Err) + if result, err := a.Srv.Store.Post().AnalyticsPostCount(teamName, false, false); err != nil { + t.Fatal(err) } else { - if initialCount+change != result.Data.(int64) { + if initialCount+change != result { debug.PrintStack() t.Fatalf("Did not find the expected number of posts.") } diff --git a/store/sqlstore/post_store.go b/store/sqlstore/post_store.go index a206f9e5bc..82e12061f3 100644 --- a/store/sqlstore/post_store.go +++ b/store/sqlstore/post_store.go @@ -1043,35 +1043,34 @@ func (s *SqlPostStore) AnalyticsPostCountsByDay(teamId string) (model.AnalyticsR return rows, nil } -func (s *SqlPostStore) AnalyticsPostCount(teamId string, mustHaveFile bool, mustHaveHashtag bool) store.StoreChannel { - return store.Do(func(result *store.StoreResult) { - query := - `SELECT - COUNT(Posts.Id) AS Value - FROM - Posts, - Channels - WHERE - Posts.ChannelId = Channels.Id` +func (s *SqlPostStore) AnalyticsPostCount(teamId string, mustHaveFile bool, mustHaveHashtag bool) (int64, *model.AppError) { + query := + `SELECT + COUNT(Posts.Id) AS Value + FROM + Posts, + Channels + WHERE + Posts.ChannelId = Channels.Id` - if len(teamId) > 0 { - query += " AND Channels.TeamId = :TeamId" - } + if len(teamId) > 0 { + query += " AND Channels.TeamId = :TeamId" + } - if mustHaveFile { - query += " AND (Posts.FileIds != '[]' OR Posts.Filenames != '[]')" - } + if mustHaveFile { + query += " AND (Posts.FileIds != '[]' OR Posts.Filenames != '[]')" + } - if mustHaveHashtag { - query += " AND Posts.Hashtags != ''" - } + if mustHaveHashtag { + query += " AND Posts.Hashtags != ''" + } - if v, err := s.GetReplica().SelectInt(query, map[string]interface{}{"TeamId": teamId}); err != nil { - result.Err = model.NewAppError("SqlPostStore.AnalyticsPostCount", "store.sql_post.analytics_posts_count.app_error", nil, err.Error(), http.StatusInternalServerError) - } else { - result.Data = v - } - }) + v, err := s.GetReplica().SelectInt(query, map[string]interface{}{"TeamId": teamId}) + if err != nil { + return 0, model.NewAppError("SqlPostStore.AnalyticsPostCount", "store.sql_post.analytics_posts_count.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + return v, nil } func (s *SqlPostStore) GetPostsCreatedAt(channelId string, time int64) ([]*model.Post, *model.AppError) { diff --git a/store/store.go b/store/store.go index ee19a81b12..98af39e625 100644 --- a/store/store.go +++ b/store/store.go @@ -228,7 +228,7 @@ type PostStore interface { Search(teamId string, userId string, params *model.SearchParams) StoreChannel AnalyticsUserCountsWithPostsByDay(teamId string) (model.AnalyticsRows, *model.AppError) AnalyticsPostCountsByDay(teamId string) (model.AnalyticsRows, *model.AppError) - AnalyticsPostCount(teamId string, mustHaveFile bool, mustHaveHashtag bool) StoreChannel + AnalyticsPostCount(teamId string, mustHaveFile bool, mustHaveHashtag bool) (int64, *model.AppError) ClearCaches() InvalidateLastPostTimeCache(channelId string) GetPostsCreatedAt(channelId string, time int64) ([]*model.Post, *model.AppError) diff --git a/store/storetest/mocks/PostStore.go b/store/storetest/mocks/PostStore.go index 6d77dbcaf5..cdf8902daf 100644 --- a/store/storetest/mocks/PostStore.go +++ b/store/storetest/mocks/PostStore.go @@ -14,19 +14,26 @@ type PostStore struct { } // AnalyticsPostCount provides a mock function with given fields: teamId, mustHaveFile, mustHaveHashtag -func (_m *PostStore) AnalyticsPostCount(teamId string, mustHaveFile bool, mustHaveHashtag bool) store.StoreChannel { +func (_m *PostStore) AnalyticsPostCount(teamId string, mustHaveFile bool, mustHaveHashtag bool) (int64, *model.AppError) { ret := _m.Called(teamId, mustHaveFile, mustHaveHashtag) - var r0 store.StoreChannel - if rf, ok := ret.Get(0).(func(string, bool, bool) store.StoreChannel); ok { + var r0 int64 + if rf, ok := ret.Get(0).(func(string, bool, bool) int64); ok { r0 = rf(teamId, mustHaveFile, mustHaveHashtag) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(store.StoreChannel) + r0 = ret.Get(0).(int64) + } + + var r1 *model.AppError + if rf, ok := ret.Get(1).(func(string, bool, bool) *model.AppError); ok { + r1 = rf(teamId, mustHaveFile, mustHaveHashtag) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*model.AppError) } } - return r0 + return r0, r1 } // AnalyticsPostCountsByDay provides a mock function with given fields: teamId diff --git a/store/storetest/post_store.go b/store/storetest/post_store.go index de1ba034e7..0bf088709d 100644 --- a/store/storetest/post_store.go +++ b/store/storetest/post_store.go @@ -1368,10 +1368,10 @@ func testPostCountsByDay(t *testing.T, ss store.Store) { } } - if r1 := <-ss.Post().AnalyticsPostCount(t1.Id, false, false); r1.Err != nil { - t.Fatal(r1.Err) + if r1, err := ss.Post().AnalyticsPostCount(t1.Id, false, false); err != nil { + t.Fatal(err) } else { - if r1.Data.(int64) != 4 { + if r1 != 4 { t.Fatal("wrong value") } }