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