91 lines
3.1 KiB
SQL
91 lines
3.1 KiB
SQL
-- 0017_dialog_folders: archive folder, custom dialog filters, and durable folder updates.
|
|
|
|
ALTER TABLE dialogs
|
|
ADD COLUMN IF NOT EXISTS folder_id INT NOT NULL DEFAULT 0;
|
|
|
|
ALTER TABLE dialogs
|
|
DROP CONSTRAINT IF EXISTS dialogs_folder_id_check;
|
|
|
|
ALTER TABLE dialogs
|
|
ADD CONSTRAINT dialogs_folder_id_check CHECK (folder_id >= 0);
|
|
|
|
CREATE INDEX IF NOT EXISTS dialogs_user_folder_top_message_idx
|
|
ON dialogs (user_id, folder_id, pinned DESC, top_message_date DESC, top_message_id DESC, peer_id DESC);
|
|
|
|
CREATE TABLE IF NOT EXISTS dialog_filters (
|
|
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
filter_id INT NOT NULL,
|
|
is_chatlist BOOLEAN NOT NULL DEFAULT false,
|
|
filter JSONB NOT NULL,
|
|
order_value INT NOT NULL DEFAULT 0,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
PRIMARY KEY (user_id, filter_id),
|
|
CONSTRAINT dialog_filters_id_check CHECK (filter_id >= 2),
|
|
CONSTRAINT dialog_filters_filter_object_check CHECK (jsonb_typeof(filter) = 'object')
|
|
) PARTITION BY HASH (user_id);
|
|
|
|
CREATE INDEX IF NOT EXISTS dialog_filters_user_order_idx
|
|
ON dialog_filters (user_id, order_value, filter_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS dialog_filter_settings (
|
|
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
tags_enabled BOOLEAN NOT NULL DEFAULT false,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
PRIMARY KEY (user_id)
|
|
) PARTITION BY HASH (user_id);
|
|
|
|
DO $$
|
|
DECLARE
|
|
i int;
|
|
BEGIN
|
|
FOR i IN 0..63 LOOP
|
|
EXECUTE format(
|
|
'CREATE TABLE IF NOT EXISTS dialog_filters_p%s PARTITION OF dialog_filters FOR VALUES WITH (MODULUS 64, REMAINDER %s)',
|
|
lpad(i::text, 2, '0'),
|
|
i
|
|
);
|
|
EXECUTE format(
|
|
'CREATE TABLE IF NOT EXISTS dialog_filter_settings_p%s PARTITION OF dialog_filter_settings FOR VALUES WITH (MODULUS 64, REMAINDER %s)',
|
|
lpad(i::text, 2, '0'),
|
|
i
|
|
);
|
|
END LOOP;
|
|
END $$;
|
|
|
|
ALTER TABLE user_update_events
|
|
ADD COLUMN IF NOT EXISTS dialog_filter JSONB NOT NULL DEFAULT '{}'::jsonb;
|
|
|
|
ALTER TABLE user_update_events
|
|
ADD COLUMN IF NOT EXISTS filter_order JSONB NOT NULL DEFAULT '[]'::jsonb;
|
|
|
|
ALTER TABLE user_update_events
|
|
ADD COLUMN IF NOT EXISTS folder_peers JSONB NOT NULL DEFAULT '[]'::jsonb;
|
|
|
|
ALTER TABLE user_update_events
|
|
ADD COLUMN IF NOT EXISTS filter_id INT NOT NULL DEFAULT 0;
|
|
|
|
ALTER TABLE user_update_events
|
|
ADD COLUMN IF NOT EXISTS tags_enabled BOOLEAN NOT NULL DEFAULT false;
|
|
|
|
ALTER TABLE user_update_events
|
|
DROP CONSTRAINT IF EXISTS user_update_events_type_check;
|
|
|
|
ALTER TABLE user_update_events
|
|
ADD CONSTRAINT user_update_events_type_check CHECK (
|
|
event_type IN (
|
|
'new_message',
|
|
'read_history_inbox',
|
|
'contacts_reset',
|
|
'dialog_pinned',
|
|
'pinned_dialogs',
|
|
'dialog_unread_mark',
|
|
'peer_settings',
|
|
'delete_messages',
|
|
'dialog_filter',
|
|
'dialog_filter_order',
|
|
'dialog_filters',
|
|
'folder_peers',
|
|
'noop'
|
|
)
|
|
);
|