mirror of
https://github.com/muety/wakapi.git
synced 2023-08-10 21:12:56 +03:00
fix: duration aggregation for heartbeats with identical timestamps (resolve #340)
This commit is contained in:
parent
e7e5254673
commit
a3acdc7041
9
scripts/aggregate_durations.sql
Normal file
9
scripts/aggregate_durations.sql
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
SELECT project, language, editor, operating_system, machine, branch, SUM(GREATEST(1, diff)) as 'sum'
|
||||||
|
FROM (
|
||||||
|
SELECT project, language, editor, operating_system, machine, branch, TIME_TO_SEC(LEAST(TIMEDIFF(time, LAG(time) over w), '00:02:00')) as 'diff'
|
||||||
|
FROM heartbeats
|
||||||
|
WHERE user_id = 'n1try'
|
||||||
|
WINDOW w AS (ORDER BY time)
|
||||||
|
) s2
|
||||||
|
WHERE diff IS NOT NULL
|
||||||
|
GROUP BY project, language, editor, operating_system, machine, branch;
|
13
scripts/count_duplicates_by_user.sql
Normal file
13
scripts/count_duplicates_by_user.sql
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
SELECT s2.user_id, sum(c) as count, total, (sum(c) / total) as ratio
|
||||||
|
FROM (
|
||||||
|
SELECT time,
|
||||||
|
user_id,
|
||||||
|
entity,
|
||||||
|
COUNT(time) as c
|
||||||
|
FROM heartbeats
|
||||||
|
GROUP BY time, user_id, entity
|
||||||
|
HAVING COUNT(time) > 1
|
||||||
|
) s2
|
||||||
|
LEFT JOIN (SELECT user_id, count(id) AS total FROM heartbeats GROUP BY user_id) s3 ON s2.user_id = s3.user_id
|
||||||
|
GROUP BY user_id
|
||||||
|
ORDER BY count DESC;
|
@ -80,8 +80,12 @@ func (srv *DurationService) Get(from, to time.Time, user *models.User, filters *
|
|||||||
|
|
||||||
for _, list := range mapping {
|
for _, list := range mapping {
|
||||||
for _, d := range list {
|
for _, d := range list {
|
||||||
|
// will only happen if two heartbeats with different hashes (e.g. different project) have the same timestamp
|
||||||
|
// that, in turn, will most likely only happen for mysql, where `time` column's precision was set to second for a while
|
||||||
|
// assume that two non-identical heartbeats with identical time are sub-second apart from each other, so round up to expectancy value
|
||||||
|
// also see https://github.com/muety/wakapi/issues/340
|
||||||
if d.Duration == 0 {
|
if d.Duration == 0 {
|
||||||
d.Duration = HeartbeatDiffThreshold
|
d.Duration = 500 * time.Millisecond
|
||||||
}
|
}
|
||||||
durations = append(durations, d)
|
durations = append(durations, d)
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,17 @@ func (suite *DurationServiceTestSuite) SetupSuite() {
|
|||||||
Machine: TestMachine1,
|
Machine: TestMachine1,
|
||||||
Time: models.CustomTime(suite.TestStartTime.Add(30 * time.Second)), // 0:30
|
Time: models.CustomTime(suite.TestStartTime.Add(30 * time.Second)), // 0:30
|
||||||
},
|
},
|
||||||
|
// duplicate of previous one
|
||||||
|
{
|
||||||
|
ID: rand.Uint64(),
|
||||||
|
UserID: TestUserId,
|
||||||
|
Project: TestProject1,
|
||||||
|
Language: TestLanguageGo,
|
||||||
|
Editor: TestEditorGoland,
|
||||||
|
OperatingSystem: TestOsLinux,
|
||||||
|
Machine: TestMachine1,
|
||||||
|
Time: models.CustomTime(suite.TestStartTime.Add(30 * time.Second)), // 0:30
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ID: rand.Uint64(),
|
ID: rand.Uint64(),
|
||||||
UserID: TestUserId,
|
UserID: TestUserId,
|
||||||
|
Loading…
Reference in New Issue
Block a user