-- ── Thread metadata ─────────────────────────────────────────────────────────── -- Conformance: thread lookups filter by community before event matching. CREATE TABLE thread_metadata ( community_id UUID NOT NULL REFERENCES communities(id), event_created_at TIMESTAMPTZ NOT NULL, event_id BYTEA NOT NULL, channel_id UUID NOT NULL, parent_event_id BYTEA, parent_event_created_at TIMESTAMPTZ, root_event_id BYTEA, root_event_created_at TIMESTAMPTZ, depth INT NOT NULL DEFAULT 0, reply_count INT NOT NULL DEFAULT 0, descendant_count INT NOT NULL DEFAULT 0, last_reply_at TIMESTAMPTZ, broadcast BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY (community_id, event_created_at, event_id), FOREIGN KEY (community_id, channel_id) REFERENCES channels (community_id, id) ); CREATE INDEX idx_thread_metadata_parent ON thread_metadata (community_id, parent_event_id); CREATE INDEX idx_thread_metadata_root ON thread_metadata (community_id, root_event_id); CREATE INDEX idx_thread_metadata_window ON thread_metadata (community_id, root_event_id, event_created_at DESC, event_id ASC); CREATE INDEX idx_thread_metadata_channel_depth ON thread_metadata (community_id, channel_id, depth, event_created_at); CREATE INDEX idx_thread_metadata_event_id ON thread_metadata (community_id, event_id);