Skip to content

Commit 89f0a11

Browse files
committed
Provide basic durability against multiple deletions
1 parent 63128a3 commit 89f0a11

File tree

3 files changed

+24
-10
lines changed

3 files changed

+24
-10
lines changed

coderd/database/migrations/testdata/fixtures/000283_user_status_changes.up.sql

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ INSERT INTO
1010
rbac_roles,
1111
login_type,
1212
avatar_url,
13-
deleted,
1413
last_seen_at,
1514
quiet_hours_schedule,
1615
theme_preference,
@@ -30,7 +29,6 @@ INSERT INTO
3029
'{}',
3130
'password',
3231
'',
33-
false,
3432
'2024-01-01 00:00:00',
3533
'',
3634
'',

coderd/database/queries.sql.go

Lines changed: 12 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/insights.sql

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -818,9 +818,13 @@ latest_status_before_range AS (
818818
usc.new_status,
819819
usc.changed_at
820820
FROM user_status_changes usc
821-
LEFT JOIN user_deleted ud ON usc.user_id = ud.user_id
821+
LEFT JOIN LATERAL (
822+
SELECT COUNT(*) > 0 AS deleted
823+
FROM user_deleted ud
824+
WHERE ud.user_id = usc.user_id AND ud.changed_at < usc.changed_at
825+
) AS ud ON usc.user_id = ud.user_id
822826
WHERE usc.changed_at < @start_time::timestamptz
823-
AND (ud.user_id IS NULL OR ud.deleted_at > @start_time::timestamptz)
827+
AND NOT ud.deleted
824828
ORDER BY usc.user_id, usc.changed_at DESC
825829
),
826830
-- status_changes_during_range defines the status of each user during the start_time and end_time.
@@ -833,10 +837,14 @@ status_changes_during_range AS (
833837
usc.new_status,
834838
usc.changed_at
835839
FROM user_status_changes usc
836-
LEFT JOIN user_deleted ud ON usc.user_id = ud.user_id
840+
LEFT JOIN LATERAL (
841+
SELECT COUNT(*) > 0 AS deleted
842+
FROM user_deleted ud
843+
WHERE ud.user_id = usc.user_id AND ud.changed_at < usc.changed_at
844+
) AS ud ON usc.user_id = ud.user_id
837845
WHERE usc.changed_at >= @start_time::timestamptz
838846
AND usc.changed_at <= @end_time::timestamptz
839-
AND (ud.user_id IS NULL OR usc.changed_at < ud.deleted_at)
847+
AND NOT deleted
840848
),
841849
-- relevant_status_changes defines the status of each user at any point in time.
842850
-- It includes the status of each user before the start_time, and the status of each user during the start_time and end_time.

0 commit comments

Comments
 (0)