diff --git a/app/analytics.go b/app/analytics.go index 1c21278fac..d26b24ba65 100644 --- a/app/analytics.go +++ b/app/analytics.go @@ -160,11 +160,7 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo return rows, nil } - r := <-a.Srv.Store.Post().AnalyticsPostCountsByDay(teamId) - if r.Err != nil { - return nil, r.Err - } - return r.Data.(model.AnalyticsRows), nil + return a.Srv.Store.Post().AnalyticsPostCountsByDay(teamId) } else if name == "user_counts_with_posts_day" { if skipIntensiveQueries { rows := model.AnalyticsRows{&model.AnalyticsRow{Name: "", Value: -1}} diff --git a/store/sqlstore/post_store.go b/store/sqlstore/post_store.go index ca2bf19a96..0f355098aa 100644 --- a/store/sqlstore/post_store.go +++ b/store/sqlstore/post_store.go @@ -1002,59 +1002,56 @@ func (s *SqlPostStore) AnalyticsUserCountsWithPostsByDay(teamId string) (model.A return rows, nil } -func (s *SqlPostStore) AnalyticsPostCountsByDay(teamId string) store.StoreChannel { - return store.Do(func(result *store.StoreResult) { - query := +func (s *SqlPostStore) AnalyticsPostCountsByDay(teamId string) (model.AnalyticsRows, *model.AppError) { + query := + `SELECT + DATE(FROM_UNIXTIME(Posts.CreateAt / 1000)) AS Name, + COUNT(Posts.Id) 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 <= :EndTime + AND Posts.CreateAt >= :StartTime + GROUP BY DATE(FROM_UNIXTIME(Posts.CreateAt / 1000)) + ORDER BY Name DESC + LIMIT 30` + + if s.DriverName() == model.DATABASE_DRIVER_POSTGRES { + query = `SELECT - DATE(FROM_UNIXTIME(Posts.CreateAt / 1000)) AS Name, - COUNT(Posts.Id) AS Value - FROM Posts` + TO_CHAR(DATE(TO_TIMESTAMP(Posts.CreateAt / 1000)), 'YYYY-MM-DD') AS Name, Count(Posts.Id) AS Value + FROM Posts` if len(teamId) > 0 { - query += " INNER JOIN Channels ON Posts.ChannelId = Channels.Id AND Channels.TeamId = :TeamId AND" + query += " INNER JOIN Channels ON Posts.ChannelId = Channels.Id AND Channels.TeamId = :TeamId AND" } else { query += " WHERE" } query += ` Posts.CreateAt <= :EndTime AND Posts.CreateAt >= :StartTime - 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(Posts.Id) 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 <= :EndTime - AND Posts.CreateAt >= :StartTime - 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.AnalyticsPostCountsByDay", "store.sql_post.analytics_posts_count_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.AnalyticsPostCountsByDay", "store.sql_post.analytics_posts_count_by_day.app_error", nil, err.Error(), http.StatusInternalServerError) + } + return rows, nil } func (s *SqlPostStore) AnalyticsPostCount(teamId string, mustHaveFile bool, mustHaveHashtag bool) store.StoreChannel { diff --git a/store/store.go b/store/store.go index 2fdca77c2d..fc4f35666b 100644 --- a/store/store.go +++ b/store/store.go @@ -227,7 +227,7 @@ type PostStore interface { GetEtag(channelId string, allowFromCache bool) string Search(teamId string, userId string, params *model.SearchParams) StoreChannel AnalyticsUserCountsWithPostsByDay(teamId string) (model.AnalyticsRows, *model.AppError) - AnalyticsPostCountsByDay(teamId string) StoreChannel + AnalyticsPostCountsByDay(teamId string) (model.AnalyticsRows, *model.AppError) AnalyticsPostCount(teamId string, mustHaveFile bool, mustHaveHashtag bool) StoreChannel ClearCaches() InvalidateLastPostTimeCache(channelId string) diff --git a/store/storetest/mocks/PostStore.go b/store/storetest/mocks/PostStore.go index 112a0d1807..f5627d16be 100644 --- a/store/storetest/mocks/PostStore.go +++ b/store/storetest/mocks/PostStore.go @@ -30,19 +30,28 @@ func (_m *PostStore) AnalyticsPostCount(teamId string, mustHaveFile bool, mustHa } // AnalyticsPostCountsByDay provides a mock function with given fields: teamId -func (_m *PostStore) AnalyticsPostCountsByDay(teamId string) store.StoreChannel { +func (_m *PostStore) AnalyticsPostCountsByDay(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 } // AnalyticsUserCountsWithPostsByDay provides a mock function with given fields: teamId diff --git a/store/storetest/post_store.go b/store/storetest/post_store.go index aeb0435c3e..e217dbb568 100644 --- a/store/storetest/post_store.go +++ b/store/storetest/post_store.go @@ -1288,15 +1288,15 @@ func testPostCountsByDay(t *testing.T, ss store.Store) { time.Sleep(1 * time.Second) - if r1 := <-ss.Post().AnalyticsPostCountsByDay(t1.Id); r1.Err != nil { - t.Fatal(r1.Err) + if r1, err := ss.Post().AnalyticsPostCountsByDay(t1.Id); err != nil { + t.Fatal(err) } else { - row1 := r1.Data.(model.AnalyticsRows)[0] + row1 := r1[0] if row1.Value != 2 { t.Fatal(row1) } - row2 := r1.Data.(model.AnalyticsRows)[1] + row2 := r1[1] if row2.Value != 2 { t.Fatal("wrong value") }