From 28cf642ccb87c6e7612aa2bcbe183c3dc5894a8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Villablanca=20V=C3=A1squez?= Date: Tue, 11 Jun 2019 15:06:40 -0400 Subject: [PATCH] Fix #10973. AnalyticsUserCountsWithPostsByDay is sync now (#11012) * Fix #10975. AnalyticsUserCountsWithPostsByDay is sync now * revert modifications to go.mod and go.sum * removed unnecessary else sentence * Querys identation --- app/analytics.go | 6 +-- store/sqlstore/post_store.go | 73 ++++++++++++++---------------- store/store.go | 2 +- store/storetest/mocks/PostStore.go | 19 ++++++-- store/storetest/post_store.go | 8 ++-- 5 files changed, 55 insertions(+), 53 deletions(-) diff --git a/app/analytics.go b/app/analytics.go index 94140700dd..1c21278fac 100644 --- a/app/analytics.go +++ b/app/analytics.go @@ -171,11 +171,7 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo return rows, nil } - r := <-a.Srv.Store.Post().AnalyticsUserCountsWithPostsByDay(teamId) - if r.Err != nil { - return nil, r.Err - } - return r.Data.(model.AnalyticsRows), nil + return a.Srv.Store.Post().AnalyticsUserCountsWithPostsByDay(teamId) } else if name == "extra_counts" { var rows model.AnalyticsRows = make([]*model.AnalyticsRow, 6) rows[0] = &model.AnalyticsRow{Name: "file_post_count", Value: 0} diff --git a/store/sqlstore/post_store.go b/store/sqlstore/post_store.go index 1f1b5ff0ab..ca2bf19a96 100644 --- a/store/sqlstore/post_store.go +++ b/store/sqlstore/post_store.go @@ -952,12 +952,28 @@ func (s *SqlPostStore) Search(teamId string, userId string, params *model.Search }) } -func (s *SqlPostStore) AnalyticsUserCountsWithPostsByDay(teamId string) store.StoreChannel { - return store.Do(func(result *store.StoreResult) { - query := - `SELECT DISTINCT - DATE(FROM_UNIXTIME(Posts.CreateAt / 1000)) AS Name, - COUNT(DISTINCT Posts.UserId) AS Value +func (s *SqlPostStore) AnalyticsUserCountsWithPostsByDay(teamId string) (model.AnalyticsRows, *model.AppError) { + query := + `SELECT DISTINCT + DATE(FROM_UNIXTIME(Posts.CreateAt / 1000)) AS Name, + COUNT(DISTINCT Posts.UserId) AS Value + FROM Posts` + + if len(teamId) > 0 { + query += " INNER JOIN Channels ON Posts.ChannelId = Channels.Id AND Channels.TeamId = :TeamId AND" + } else { + query += " WHERE" + } + + query += ` Posts.CreateAt >= :StartTime AND Posts.CreateAt <= :EndTime + GROUP BY DATE(FROM_UNIXTIME(Posts.CreateAt / 1000)) + ORDER BY Name DESC + LIMIT 30` + + if s.DriverName() == model.DATABASE_DRIVER_POSTGRES { + query = + `SELECT + TO_CHAR(DATE(TO_TIMESTAMP(Posts.CreateAt / 1000)), 'YYYY-MM-DD') AS Name, COUNT(DISTINCT Posts.UserId) AS Value FROM Posts` if len(teamId) > 0 { @@ -967,42 +983,23 @@ func (s *SqlPostStore) AnalyticsUserCountsWithPostsByDay(teamId string) store.St } query += ` Posts.CreateAt >= :StartTime AND Posts.CreateAt <= :EndTime - GROUP BY DATE(FROM_UNIXTIME(Posts.CreateAt / 1000)) + GROUP BY DATE(TO_TIMESTAMP(Posts.CreateAt / 1000)) ORDER BY Name DESC LIMIT 30` + } - if s.DriverName() == model.DATABASE_DRIVER_POSTGRES { - query = - `SELECT - TO_CHAR(DATE(TO_TIMESTAMP(Posts.CreateAt / 1000)), 'YYYY-MM-DD') AS Name, COUNT(DISTINCT Posts.UserId) AS Value - FROM Posts` + end := utils.MillisFromTime(utils.EndOfDay(utils.Yesterday())) + start := utils.MillisFromTime(utils.StartOfDay(utils.Yesterday().AddDate(0, 0, -31))) - if len(teamId) > 0 { - query += " INNER JOIN Channels ON Posts.ChannelId = Channels.Id AND Channels.TeamId = :TeamId AND" - } else { - query += " WHERE" - } - - query += ` Posts.CreateAt >= :StartTime AND Posts.CreateAt <= :EndTime - GROUP BY DATE(TO_TIMESTAMP(Posts.CreateAt / 1000)) - ORDER BY Name DESC - LIMIT 30` - } - - end := utils.MillisFromTime(utils.EndOfDay(utils.Yesterday())) - start := utils.MillisFromTime(utils.StartOfDay(utils.Yesterday().AddDate(0, 0, -31))) - - var rows model.AnalyticsRows - _, err := s.GetReplica().Select( - &rows, - query, - map[string]interface{}{"TeamId": teamId, "StartTime": start, "EndTime": end}) - if err != nil { - result.Err = model.NewAppError("SqlPostStore.AnalyticsUserCountsWithPostsByDay", "store.sql_post.analytics_user_counts_posts_by_day.app_error", nil, err.Error(), http.StatusInternalServerError) - } else { - result.Data = rows - } - }) + var rows model.AnalyticsRows + _, err := s.GetReplica().Select( + &rows, + query, + map[string]interface{}{"TeamId": teamId, "StartTime": start, "EndTime": end}) + if err != nil { + return nil, model.NewAppError("SqlPostStore.AnalyticsUserCountsWithPostsByDay", "store.sql_post.analytics_user_counts_posts_by_day.app_error", nil, err.Error(), http.StatusInternalServerError) + } + return rows, nil } func (s *SqlPostStore) AnalyticsPostCountsByDay(teamId string) store.StoreChannel { diff --git a/store/store.go b/store/store.go index f46ae0e6c3..2fdca77c2d 100644 --- a/store/store.go +++ b/store/store.go @@ -226,7 +226,7 @@ type PostStore interface { GetPostsSince(channelId string, time int64, allowFromCache bool) StoreChannel GetEtag(channelId string, allowFromCache bool) string Search(teamId string, userId string, params *model.SearchParams) StoreChannel - AnalyticsUserCountsWithPostsByDay(teamId string) StoreChannel + AnalyticsUserCountsWithPostsByDay(teamId string) (model.AnalyticsRows, *model.AppError) AnalyticsPostCountsByDay(teamId string) StoreChannel AnalyticsPostCount(teamId string, mustHaveFile bool, mustHaveHashtag bool) StoreChannel ClearCaches() diff --git a/store/storetest/mocks/PostStore.go b/store/storetest/mocks/PostStore.go index 1556fafeb6..112a0d1807 100644 --- a/store/storetest/mocks/PostStore.go +++ b/store/storetest/mocks/PostStore.go @@ -46,19 +46,28 @@ func (_m *PostStore) AnalyticsPostCountsByDay(teamId string) store.StoreChannel } // AnalyticsUserCountsWithPostsByDay provides a mock function with given fields: teamId -func (_m *PostStore) AnalyticsUserCountsWithPostsByDay(teamId string) store.StoreChannel { +func (_m *PostStore) AnalyticsUserCountsWithPostsByDay(teamId string) (model.AnalyticsRows, *model.AppError) { ret := _m.Called(teamId) - var r0 store.StoreChannel - if rf, ok := ret.Get(0).(func(string) store.StoreChannel); ok { + var r0 model.AnalyticsRows + if rf, ok := ret.Get(0).(func(string) model.AnalyticsRows); ok { r0 = rf(teamId) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(store.StoreChannel) + r0 = ret.Get(0).(model.AnalyticsRows) } } - return r0 + var r1 *model.AppError + if rf, ok := ret.Get(1).(func(string) *model.AppError); ok { + r1 = rf(teamId) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*model.AppError) + } + } + + return r0, r1 } // ClearCaches provides a mock function with given fields: diff --git a/store/storetest/post_store.go b/store/storetest/post_store.go index 403b9039f3..aeb0435c3e 100644 --- a/store/storetest/post_store.go +++ b/store/storetest/post_store.go @@ -1226,15 +1226,15 @@ func testUserCountsWithPostsByDay(t *testing.T, ss store.Store) { o2a.Message = "zz" + model.NewId() + "b" _ = store.Must(ss.Post().Save(o2a)).(*model.Post) - if r1 := <-ss.Post().AnalyticsUserCountsWithPostsByDay(t1.Id); r1.Err != nil { - t.Fatal(r1.Err) + if r1, err := ss.Post().AnalyticsUserCountsWithPostsByDay(t1.Id); err != nil { + t.Fatal(err) } else { - row1 := r1.Data.(model.AnalyticsRows)[0] + row1 := r1[0] if row1.Value != 2 { t.Fatal("wrong value") } - row2 := r1.Data.(model.AnalyticsRows)[1] + row2 := r1[1] if row2.Value != 1 { t.Fatal("wrong value") }