mirror of https://github.com/watcha-fr/synapse
Track notification counts per thread (implement MSC3773). (#13776)
When retrieving counts of notifications segment the results based on the thread ID, but choose whether to return them as individual threads or as a single summed field by letting the client opt-in via a sync flag. The summarization code is also updated to be per thread, instead of per room.1.103.0-whithout-watcha
parent
94017e867d
commit
b4ec4f5e71
@ -0,0 +1 @@ |
|||||||
|
Experimental support for thread-specific notifications ([MSC3773](https://github.com/matrix-org/matrix-spec-proposals/pull/3773)). |
@ -0,0 +1,29 @@ |
|||||||
|
/* Copyright 2022 The Matrix.org Foundation C.I.C |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
-- Forces the background updates from 06thread_notifications.sql to run in the |
||||||
|
-- foreground as code will now require those to be "done". |
||||||
|
|
||||||
|
DELETE FROM background_updates WHERE update_name = 'event_push_backfill_thread_id'; |
||||||
|
|
||||||
|
-- Overwrite any null thread_id columns. |
||||||
|
UPDATE event_push_actions_staging SET thread_id = 'main' WHERE thread_id IS NULL; |
||||||
|
UPDATE event_push_actions SET thread_id = 'main' WHERE thread_id IS NULL; |
||||||
|
UPDATE event_push_summary SET thread_id = 'main' WHERE thread_id IS NULL; |
||||||
|
|
||||||
|
-- Do not run the event_push_summary_unique_index job if it is pending; the |
||||||
|
-- thread_id field will be made required. |
||||||
|
DELETE FROM background_updates WHERE update_name = 'event_push_summary_unique_index'; |
||||||
|
DROP INDEX IF EXISTS event_push_summary_unique_index; |
@ -0,0 +1,19 @@ |
|||||||
|
/* Copyright 2022 The Matrix.org Foundation C.I.C |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
-- The columns can now be made non-nullable. |
||||||
|
ALTER TABLE event_push_actions_staging ALTER COLUMN thread_id SET NOT NULL; |
||||||
|
ALTER TABLE event_push_actions ALTER COLUMN thread_id SET NOT NULL; |
||||||
|
ALTER TABLE event_push_summary ALTER COLUMN thread_id SET NOT NULL; |
@ -0,0 +1,101 @@ |
|||||||
|
/* Copyright 2022 The Matrix.org Foundation C.I.C |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
-- SQLite doesn't support modifying columns to an existing table, so it must |
||||||
|
-- be recreated. |
||||||
|
|
||||||
|
-- Create the new tables. |
||||||
|
CREATE TABLE event_push_actions_staging_new ( |
||||||
|
event_id TEXT NOT NULL, |
||||||
|
user_id TEXT NOT NULL, |
||||||
|
actions TEXT NOT NULL, |
||||||
|
notif SMALLINT NOT NULL, |
||||||
|
highlight SMALLINT NOT NULL, |
||||||
|
unread SMALLINT, |
||||||
|
thread_id TEXT NOT NULL, |
||||||
|
inserted_ts BIGINT |
||||||
|
); |
||||||
|
|
||||||
|
CREATE TABLE event_push_actions_new ( |
||||||
|
room_id TEXT NOT NULL, |
||||||
|
event_id TEXT NOT NULL, |
||||||
|
user_id TEXT NOT NULL, |
||||||
|
profile_tag VARCHAR(32), |
||||||
|
actions TEXT NOT NULL, |
||||||
|
topological_ordering BIGINT, |
||||||
|
stream_ordering BIGINT, |
||||||
|
notif SMALLINT, |
||||||
|
highlight SMALLINT, |
||||||
|
unread SMALLINT, |
||||||
|
thread_id TEXT NOT NULL, |
||||||
|
CONSTRAINT event_id_user_id_profile_tag_uniqueness UNIQUE (room_id, event_id, user_id, profile_tag) |
||||||
|
); |
||||||
|
|
||||||
|
CREATE TABLE event_push_summary_new ( |
||||||
|
user_id TEXT NOT NULL, |
||||||
|
room_id TEXT NOT NULL, |
||||||
|
notif_count BIGINT NOT NULL, |
||||||
|
stream_ordering BIGINT NOT NULL, |
||||||
|
unread_count BIGINT, |
||||||
|
last_receipt_stream_ordering BIGINT, |
||||||
|
thread_id TEXT NOT NULL |
||||||
|
); |
||||||
|
|
||||||
|
-- Swap the indexes. |
||||||
|
DROP INDEX IF EXISTS event_push_actions_staging_id; |
||||||
|
CREATE INDEX event_push_actions_staging_id ON event_push_actions_staging_new(event_id); |
||||||
|
|
||||||
|
DROP INDEX IF EXISTS event_push_actions_room_id_user_id; |
||||||
|
DROP INDEX IF EXISTS event_push_actions_rm_tokens; |
||||||
|
DROP INDEX IF EXISTS event_push_actions_stream_ordering; |
||||||
|
DROP INDEX IF EXISTS event_push_actions_u_highlight; |
||||||
|
DROP INDEX IF EXISTS event_push_actions_highlights_index; |
||||||
|
CREATE INDEX event_push_actions_room_id_user_id on event_push_actions_new(room_id, user_id); |
||||||
|
CREATE INDEX event_push_actions_rm_tokens on event_push_actions_new( user_id, room_id, topological_ordering, stream_ordering ); |
||||||
|
CREATE INDEX event_push_actions_stream_ordering on event_push_actions_new( stream_ordering, user_id ); |
||||||
|
CREATE INDEX event_push_actions_u_highlight ON event_push_actions_new (user_id, stream_ordering); |
||||||
|
CREATE INDEX event_push_actions_highlights_index ON event_push_actions_new (user_id, room_id, topological_ordering, stream_ordering); |
||||||
|
|
||||||
|
-- Copy the data. |
||||||
|
INSERT INTO event_push_actions_staging_new (event_id, user_id, actions, notif, highlight, unread, thread_id, inserted_ts) |
||||||
|
SELECT event_id, user_id, actions, notif, highlight, unread, thread_id, inserted_ts |
||||||
|
FROM event_push_actions_staging; |
||||||
|
|
||||||
|
INSERT INTO event_push_actions_new (room_id, event_id, user_id, profile_tag, actions, topological_ordering, stream_ordering, notif, highlight, unread, thread_id) |
||||||
|
SELECT room_id, event_id, user_id, profile_tag, actions, topological_ordering, stream_ordering, notif, highlight, unread, thread_id |
||||||
|
FROM event_push_actions; |
||||||
|
|
||||||
|
INSERT INTO event_push_summary_new (user_id, room_id, notif_count, stream_ordering, unread_count, last_receipt_stream_ordering, thread_id) |
||||||
|
SELECT user_id, room_id, notif_count, stream_ordering, unread_count, last_receipt_stream_ordering, thread_id |
||||||
|
FROM event_push_summary; |
||||||
|
|
||||||
|
-- Drop the old tables. |
||||||
|
DROP TABLE event_push_actions_staging; |
||||||
|
DROP TABLE event_push_actions; |
||||||
|
DROP TABLE event_push_summary; |
||||||
|
|
||||||
|
-- Rename the tables. |
||||||
|
ALTER TABLE event_push_actions_staging_new RENAME TO event_push_actions_staging; |
||||||
|
ALTER TABLE event_push_actions_new RENAME TO event_push_actions; |
||||||
|
ALTER TABLE event_push_summary_new RENAME TO event_push_summary; |
||||||
|
|
||||||
|
-- Re-run background updates from 72/02event_push_actions_index.sql and |
||||||
|
-- 72/06thread_notifications.sql. |
||||||
|
INSERT INTO background_updates (ordering, update_name, progress_json) VALUES |
||||||
|
(7307, 'event_push_summary_unique_index2', '{}') |
||||||
|
ON CONFLICT (update_name) DO NOTHING; |
||||||
|
INSERT INTO background_updates (ordering, update_name, progress_json) VALUES |
||||||
|
(7307, 'event_push_actions_stream_highlight_index', '{}') |
||||||
|
ON CONFLICT (update_name) DO NOTHING; |
Loading…
Reference in new issue