Fix #10972. AnalyticsPostCountsByDay is sync now (#11013)

* Fix #10972. AnalyticsPostCountsByDay is sync now

* Revert go.mod and go.sum modifications

* Fix identation in querys

* Fix unnecessary else
Этот коммит содержится в:
Rodrigo Villablanca Vásquez
2019-06-11 15:24:53 -04:00
коммит произвёл Jesús Espino
родитель 803ce61ef8
Коммит b757e7d129
5 изменённых файлов: 57 добавлений и 55 удалений

Просмотреть файл

@@ -160,11 +160,7 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo
return rows, nil return rows, nil
} }
r := <-a.Srv.Store.Post().AnalyticsPostCountsByDay(teamId) return a.Srv.Store.Post().AnalyticsPostCountsByDay(teamId)
if r.Err != nil {
return nil, r.Err
}
return r.Data.(model.AnalyticsRows), nil
} else if name == "user_counts_with_posts_day" { } else if name == "user_counts_with_posts_day" {
if skipIntensiveQueries { if skipIntensiveQueries {
rows := model.AnalyticsRows{&model.AnalyticsRow{Name: "", Value: -1}} rows := model.AnalyticsRows{&model.AnalyticsRow{Name: "", Value: -1}}

Просмотреть файл

@@ -1002,59 +1002,56 @@ func (s *SqlPostStore) AnalyticsUserCountsWithPostsByDay(teamId string) (model.A
return rows, nil return rows, nil
} }
func (s *SqlPostStore) AnalyticsPostCountsByDay(teamId string) store.StoreChannel { func (s *SqlPostStore) AnalyticsPostCountsByDay(teamId string) (model.AnalyticsRows, *model.AppError) {
return store.Do(func(result *store.StoreResult) { query :=
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 `SELECT
DATE(FROM_UNIXTIME(Posts.CreateAt / 1000)) AS Name, TO_CHAR(DATE(TO_TIMESTAMP(Posts.CreateAt / 1000)), 'YYYY-MM-DD') AS Name, Count(Posts.Id) AS Value
COUNT(Posts.Id) AS Value FROM Posts`
FROM Posts`
if len(teamId) > 0 { 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 { } else {
query += " WHERE" query += " WHERE"
} }
query += ` Posts.CreateAt <= :EndTime query += ` Posts.CreateAt <= :EndTime
AND Posts.CreateAt >= :StartTime AND Posts.CreateAt >= :StartTime
GROUP BY DATE(FROM_UNIXTIME(Posts.CreateAt / 1000)) GROUP BY DATE(TO_TIMESTAMP(Posts.CreateAt / 1000))
ORDER BY Name DESC ORDER BY Name DESC
LIMIT 30` LIMIT 30`
}
if s.DriverName() == model.DATABASE_DRIVER_POSTGRES { end := utils.MillisFromTime(utils.EndOfDay(utils.Yesterday()))
query = start := utils.MillisFromTime(utils.StartOfDay(utils.Yesterday().AddDate(0, 0, -31)))
`SELECT
TO_CHAR(DATE(TO_TIMESTAMP(Posts.CreateAt / 1000)), 'YYYY-MM-DD') AS Name, Count(Posts.Id) AS Value
FROM Posts`
if len(teamId) > 0 { var rows model.AnalyticsRows
query += " INNER JOIN Channels ON Posts.ChannelId = Channels.Id AND Channels.TeamId = :TeamId AND" _, err := s.GetReplica().Select(
} else { &rows,
query += " WHERE" query,
} map[string]interface{}{"TeamId": teamId, "StartTime": start, "EndTime": end})
if err != nil {
query += ` Posts.CreateAt <= :EndTime return nil, model.NewAppError("SqlPostStore.AnalyticsPostCountsByDay", "store.sql_post.analytics_posts_count_by_day.app_error", nil, err.Error(), http.StatusInternalServerError)
AND Posts.CreateAt >= :StartTime }
GROUP BY DATE(TO_TIMESTAMP(Posts.CreateAt / 1000)) return rows, nil
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
}
})
} }
func (s *SqlPostStore) AnalyticsPostCount(teamId string, mustHaveFile bool, mustHaveHashtag bool) store.StoreChannel { func (s *SqlPostStore) AnalyticsPostCount(teamId string, mustHaveFile bool, mustHaveHashtag bool) store.StoreChannel {

Просмотреть файл

@@ -227,7 +227,7 @@ type PostStore interface {
GetEtag(channelId string, allowFromCache bool) string GetEtag(channelId string, allowFromCache bool) string
Search(teamId string, userId string, params *model.SearchParams) StoreChannel Search(teamId string, userId string, params *model.SearchParams) StoreChannel
AnalyticsUserCountsWithPostsByDay(teamId string) (model.AnalyticsRows, *model.AppError) 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 AnalyticsPostCount(teamId string, mustHaveFile bool, mustHaveHashtag bool) StoreChannel
ClearCaches() ClearCaches()
InvalidateLastPostTimeCache(channelId string) InvalidateLastPostTimeCache(channelId string)

Просмотреть файл

@@ -30,19 +30,28 @@ func (_m *PostStore) AnalyticsPostCount(teamId string, mustHaveFile bool, mustHa
} }
// AnalyticsPostCountsByDay provides a mock function with given fields: teamId // 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) ret := _m.Called(teamId)
var r0 store.StoreChannel var r0 model.AnalyticsRows
if rf, ok := ret.Get(0).(func(string) store.StoreChannel); ok { if rf, ok := ret.Get(0).(func(string) model.AnalyticsRows); ok {
r0 = rf(teamId) r0 = rf(teamId)
} else { } else {
if ret.Get(0) != nil { 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 // AnalyticsUserCountsWithPostsByDay provides a mock function with given fields: teamId

Просмотреть файл

@@ -1288,15 +1288,15 @@ func testPostCountsByDay(t *testing.T, ss store.Store) {
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
if r1 := <-ss.Post().AnalyticsPostCountsByDay(t1.Id); r1.Err != nil { if r1, err := ss.Post().AnalyticsPostCountsByDay(t1.Id); err != nil {
t.Fatal(r1.Err) t.Fatal(err)
} else { } else {
row1 := r1.Data.(model.AnalyticsRows)[0] row1 := r1[0]
if row1.Value != 2 { if row1.Value != 2 {
t.Fatal(row1) t.Fatal(row1)
} }
row2 := r1.Data.(model.AnalyticsRows)[1] row2 := r1[1]
if row2.Value != 2 { if row2.Value != 2 {
t.Fatal("wrong value") t.Fatal("wrong value")
} }