mirror of
https://github.com/djdevin/recflare.git
synced 2026-10-25 23:18:51 -07:00
[api] fix a relationship index
This commit is contained in:
@@ -0,0 +1,32 @@
|
|||||||
|
-- Restore the UNIQUE pair index on `relationship`.
|
||||||
|
--
|
||||||
|
-- Generated from packages/domain/src/relationships-db.ts (SCHEMA_DDL) — keep in sync.
|
||||||
|
-- Migration 0001 declared `idx_relationship` and 0030 counts on it staying ("it is the
|
||||||
|
-- pair constraint"), but the deployed table did not have it: an audit of sqlite_master
|
||||||
|
-- against every worker's migrations found it and the two `room_instance` unique indexes
|
||||||
|
-- (rooms 0022) missing, with every other declared index present. Every relationship
|
||||||
|
-- write is select-then-insert (`upsertPair`, `setRelationshipFlag`), so this index is the
|
||||||
|
-- only thing that stops a replayed or concurrent request from filing a pair twice —
|
||||||
|
-- which shows up as a doubled friend entry, with `findPair` reading whichever twin the
|
||||||
|
-- planner returns.
|
||||||
|
--
|
||||||
|
-- A UNIQUE index refuses to build over duplicates, so any are merged first: the oldest
|
||||||
|
-- row of each (requester_id, target_id) group survives, carrying the MAX of every field
|
||||||
|
-- across the group — for the flags that is an OR, and for `relationship_type` it is the
|
||||||
|
-- furthest-along state (3 Friend > 2 Received > 1 Sent > 0 None). Then the rest go. Both
|
||||||
|
-- statements are no-ops on a table with no duplicates.
|
||||||
|
|
||||||
|
UPDATE relationship SET
|
||||||
|
relationship_type = (SELECT MAX(r.relationship_type) FROM relationship r WHERE r.requester_id = relationship.requester_id AND r.target_id = relationship.target_id),
|
||||||
|
requester_favorited = (SELECT MAX(r.requester_favorited) FROM relationship r WHERE r.requester_id = relationship.requester_id AND r.target_id = relationship.target_id),
|
||||||
|
requester_ignored = (SELECT MAX(r.requester_ignored) FROM relationship r WHERE r.requester_id = relationship.requester_id AND r.target_id = relationship.target_id),
|
||||||
|
requester_muted = (SELECT MAX(r.requester_muted) FROM relationship r WHERE r.requester_id = relationship.requester_id AND r.target_id = relationship.target_id),
|
||||||
|
target_favorited = (SELECT MAX(r.target_favorited) FROM relationship r WHERE r.requester_id = relationship.requester_id AND r.target_id = relationship.target_id),
|
||||||
|
target_ignored = (SELECT MAX(r.target_ignored) FROM relationship r WHERE r.requester_id = relationship.requester_id AND r.target_id = relationship.target_id),
|
||||||
|
target_muted = (SELECT MAX(r.target_muted) FROM relationship r WHERE r.requester_id = relationship.requester_id AND r.target_id = relationship.target_id)
|
||||||
|
WHERE id IN (SELECT MIN(id) FROM relationship GROUP BY requester_id, target_id HAVING COUNT(*) > 1);
|
||||||
|
|
||||||
|
DELETE FROM relationship
|
||||||
|
WHERE id NOT IN (SELECT MIN(id) FROM relationship GROUP BY requester_id, target_id);
|
||||||
|
|
||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_relationship ON relationship (requester_id, target_id);
|
||||||
Reference in New Issue
Block a user