[AI assisted]: Improve system console statistics performance (#29899)
```release-note NONE ``` Co-authored-by: Matthew Birtch <mattbirtch@gmail.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
6046a304b2
Коммит
ae9e6174e5
@@ -4148,18 +4148,34 @@ func testChannelStoreGetMoreChannels(t *testing.T, rctx request.CTX, ss store.St
|
||||
count, err := ss.Channel().AnalyticsTypeCount(teamID, model.ChannelTypeOpen)
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, 4, count)
|
||||
|
||||
counts, err := ss.Channel().AnalyticsCountAll(teamID)
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, 4, counts[model.ChannelTypeOpen])
|
||||
})
|
||||
|
||||
t.Run("verify analytics for private channels", func(t *testing.T) {
|
||||
count, err := ss.Channel().AnalyticsTypeCount(teamID, model.ChannelTypePrivate)
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, 2, count)
|
||||
|
||||
counts, err := ss.Channel().AnalyticsCountAll(teamID)
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, 2, counts[model.ChannelTypePrivate])
|
||||
})
|
||||
|
||||
t.Run("verify analytics for all channels", func(t *testing.T) {
|
||||
count, err := ss.Channel().AnalyticsTypeCount(teamID, "")
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, 6, count)
|
||||
|
||||
counts, err := ss.Channel().AnalyticsCountAll(teamID)
|
||||
require.NoError(t, err)
|
||||
total := int64(0)
|
||||
for _, count := range counts {
|
||||
total += count
|
||||
}
|
||||
require.EqualValues(t, 6, total)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -4338,12 +4354,20 @@ func testChannelStoreGetPublicChannelsForTeam(t *testing.T, rctx request.CTX, ss
|
||||
count, err := ss.Channel().AnalyticsTypeCount(teamID, model.ChannelTypeOpen)
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, 3, count)
|
||||
|
||||
counts, err := ss.Channel().AnalyticsCountAll(teamID)
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, 3, counts[model.ChannelTypeOpen])
|
||||
})
|
||||
|
||||
t.Run("verify analytics for private channels", func(t *testing.T) {
|
||||
count, err := ss.Channel().AnalyticsTypeCount(teamID, model.ChannelTypePrivate)
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, 1, count)
|
||||
|
||||
counts, err := ss.Channel().AnalyticsCountAll(teamID)
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, 1, counts[model.ChannelTypePrivate])
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -815,12 +815,15 @@ func testFileInfoStoreCountAll(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NoError(t, ss.FileInfo().RefreshFileStats())
|
||||
count, err := ss.FileInfo().CountAll()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, int64(3), count)
|
||||
|
||||
_, err = ss.FileInfo().DeleteForPost(rctx, f1.PostId)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NoError(t, ss.FileInfo().RefreshFileStats())
|
||||
count, err = ss.FileInfo().CountAll()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, int64(2), count)
|
||||
@@ -830,6 +833,7 @@ func testFileInfoGetStorageUsage(t *testing.T, rctx request.CTX, ss store.Store)
|
||||
_, err := ss.FileInfo().PermanentDeleteBatch(rctx, model.GetMillis(), 100000)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NoError(t, ss.FileInfo().RefreshFileStats())
|
||||
usage, err := ss.FileInfo().GetStorageUsage(false, false)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, int64(0), usage)
|
||||
@@ -857,12 +861,14 @@ func testFileInfoGetStorageUsage(t *testing.T, rctx request.CTX, ss store.Store)
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NoError(t, ss.FileInfo().RefreshFileStats())
|
||||
usage, err = ss.FileInfo().GetStorageUsage(false, false)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, int64(30), usage)
|
||||
|
||||
_, err = ss.FileInfo().DeleteForPost(rctx, f1.PostId)
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, ss.FileInfo().RefreshFileStats())
|
||||
usage, err = ss.FileInfo().GetStorageUsage(false, false)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, int64(20), usage)
|
||||
|
||||
@@ -20,6 +20,36 @@ type ChannelStore struct {
|
||||
mock.Mock
|
||||
}
|
||||
|
||||
// AnalyticsCountAll provides a mock function with given fields: teamID
|
||||
func (_m *ChannelStore) AnalyticsCountAll(teamID string) (map[model.ChannelType]int64, error) {
|
||||
ret := _m.Called(teamID)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for AnalyticsCountAll")
|
||||
}
|
||||
|
||||
var r0 map[model.ChannelType]int64
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string) (map[model.ChannelType]int64, error)); ok {
|
||||
return rf(teamID)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string) map[model.ChannelType]int64); ok {
|
||||
r0 = rf(teamID)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(map[model.ChannelType]int64)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string) error); ok {
|
||||
r1 = rf(teamID)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// AnalyticsDeletedTypeCount provides a mock function with given fields: teamID, channelType
|
||||
func (_m *ChannelStore) AnalyticsDeletedTypeCount(teamID string, channelType model.ChannelType) (int64, error) {
|
||||
ret := _m.Called(teamID, channelType)
|
||||
|
||||
@@ -505,6 +505,24 @@ func (_m *FileInfoStore) PermanentDeleteForPost(rctx request.CTX, postID string)
|
||||
return r0
|
||||
}
|
||||
|
||||
// RefreshFileStats provides a mock function with given fields:
|
||||
func (_m *FileInfoStore) RefreshFileStats() error {
|
||||
ret := _m.Called()
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for RefreshFileStats")
|
||||
}
|
||||
|
||||
var r0 error
|
||||
if rf, ok := ret.Get(0).(func() error); ok {
|
||||
r0 = rf()
|
||||
} else {
|
||||
r0 = ret.Error(0)
|
||||
}
|
||||
|
||||
return r0
|
||||
}
|
||||
|
||||
// RestoreForPostByIds provides a mock function with given fields: rctx, postId, fileIDs
|
||||
func (_m *FileInfoStore) RestoreForPostByIds(rctx request.CTX, postId string, fileIDs []string) error {
|
||||
ret := _m.Called(rctx, postId, fileIDs)
|
||||
|
||||
@@ -48,6 +48,34 @@ func (_m *PostStore) AnalyticsPostCount(options *model.PostCountOptions) (int64,
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// AnalyticsPostCountByTeam provides a mock function with given fields: teamID
|
||||
func (_m *PostStore) AnalyticsPostCountByTeam(teamID string) (int64, error) {
|
||||
ret := _m.Called(teamID)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for AnalyticsPostCountByTeam")
|
||||
}
|
||||
|
||||
var r0 int64
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string) (int64, error)); ok {
|
||||
return rf(teamID)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string) int64); ok {
|
||||
r0 = rf(teamID)
|
||||
} else {
|
||||
r0 = ret.Get(0).(int64)
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string) error); ok {
|
||||
r1 = rf(teamID)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// AnalyticsPostCountsByDay provides a mock function with given fields: options
|
||||
func (_m *PostStore) AnalyticsPostCountsByDay(options *model.AnalyticsPostCountsOptions) (model.AnalyticsRows, error) {
|
||||
ret := _m.Called(options)
|
||||
@@ -1163,6 +1191,24 @@ func (_m *PostStore) PermanentDeleteByUser(rctx request.CTX, userID string) erro
|
||||
return r0
|
||||
}
|
||||
|
||||
// RefreshPostStats provides a mock function with given fields:
|
||||
func (_m *PostStore) RefreshPostStats() error {
|
||||
ret := _m.Called()
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for RefreshPostStats")
|
||||
}
|
||||
|
||||
var r0 error
|
||||
if rf, ok := ret.Get(0).(func() error); ok {
|
||||
r0 = rf()
|
||||
} else {
|
||||
r0 = ret.Error(0)
|
||||
}
|
||||
|
||||
return r0
|
||||
}
|
||||
|
||||
// Save provides a mock function with given fields: rctx, post
|
||||
func (_m *PostStore) Save(rctx request.CTX, post *model.Post) (*model.Post, error) {
|
||||
ret := _m.Called(rctx, post)
|
||||
|
||||
@@ -2895,6 +2895,8 @@ func testPostCountsByDay(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
_, nErr = ss.Post().Save(rctx, b1a)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
require.NoError(t, ss.Post().RefreshPostStats())
|
||||
|
||||
time.Sleep(1 * time.Second)
|
||||
|
||||
// summary of posts
|
||||
@@ -2907,6 +2909,8 @@ func testPostCountsByDay(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, float64(3), r1[0].Value)
|
||||
assert.Equal(t, float64(3), r1[1].Value)
|
||||
assert.Equal(t, utils.Yesterday().Format("2006-01-02"), r1[0].Name)
|
||||
assert.Equal(t, utils.Yesterday().Add(-48*time.Hour).Format("2006-01-02"), r1[1].Name)
|
||||
|
||||
// last 31 days, bots only
|
||||
postCountsOptions = &model.AnalyticsPostCountsOptions{TeamId: t1.Id, BotsOnly: true, YesterdayOnly: false}
|
||||
@@ -2914,18 +2918,22 @@ func testPostCountsByDay(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, float64(1), r1[0].Value)
|
||||
assert.Equal(t, float64(1), r1[1].Value)
|
||||
assert.Equal(t, utils.Yesterday().Format("2006-01-02"), r1[0].Name)
|
||||
assert.Equal(t, utils.Yesterday().Add(-48*time.Hour).Format("2006-01-02"), r1[1].Name)
|
||||
|
||||
// yesterday only, all users (including bots)
|
||||
postCountsOptions = &model.AnalyticsPostCountsOptions{TeamId: t1.Id, BotsOnly: false, YesterdayOnly: true}
|
||||
r1, err = ss.Post().AnalyticsPostCountsByDay(postCountsOptions)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, float64(3), r1[0].Value)
|
||||
assert.Equal(t, utils.Yesterday().Format("2006-01-02"), r1[0].Name)
|
||||
|
||||
// yesterday only, bots only
|
||||
postCountsOptions = &model.AnalyticsPostCountsOptions{TeamId: t1.Id, BotsOnly: true, YesterdayOnly: true}
|
||||
r1, err = ss.Post().AnalyticsPostCountsByDay(postCountsOptions)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, float64(1), r1[0].Value)
|
||||
assert.Equal(t, utils.Yesterday().Format("2006-01-02"), r1[0].Name)
|
||||
}
|
||||
|
||||
func testPostCounts(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
@@ -3029,6 +3037,8 @@ func testPostCounts(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
_, nErr = ss.Post().Save(rctx, p7)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
require.NoError(t, ss.Post().RefreshPostStats())
|
||||
|
||||
// total across all teams
|
||||
c, err := ss.Post().AnalyticsPostCount(&model.PostCountOptions{})
|
||||
require.NoError(t, err)
|
||||
@@ -3039,6 +3049,10 @@ func testPostCounts(t *testing.T, rctx request.CTX, ss store.Store) {
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, int64(7), c)
|
||||
|
||||
c, err = ss.Post().AnalyticsPostCountByTeam(t1.Id)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, int64(7), c)
|
||||
|
||||
// with files
|
||||
c, err = ss.Post().AnalyticsPostCount(&model.PostCountOptions{TeamId: t1.Id, MustHaveFile: true})
|
||||
require.NoError(t, err)
|
||||
|
||||
Ссылка в новой задаче
Block a user