summaryrefslogtreecommitdiff
path: root/synapse/storage/data_stores/main/schema/delta/56/stats_separated.sql
blob: bbdde121e8967f12cfb607618793ca529179c8cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/* Copyright 2018 New Vector Ltd
 * Copyright 2019 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.
 */


----- First clean up from previous versions of room stats.

-- First remove old stats stuff
DROP TABLE IF EXISTS room_stats;
DROP TABLE IF EXISTS room_state;
DROP TABLE IF EXISTS room_stats_state;
DROP TABLE IF EXISTS user_stats;
DROP TABLE IF EXISTS room_stats_earliest_tokens;
DROP TABLE IF EXISTS _temp_populate_stats_position;
DROP TABLE IF EXISTS _temp_populate_stats_rooms;
DROP TABLE IF EXISTS stats_stream_pos;

-- Unschedule old background updates if they're still scheduled
DELETE FROM background_updates WHERE update_name IN (
    'populate_stats_createtables',
    'populate_stats_process_rooms',
    'populate_stats_process_users',
    'populate_stats_cleanup'
);

-- this relies on current_state_events.membership having been populated, so add
-- a dependency on current_state_events_membership.
INSERT INTO background_updates (update_name, progress_json, depends_on) VALUES
    ('populate_stats_process_rooms', '{}', 'current_state_events_membership');

-- this also relies on current_state_events.membership having been populated, but
-- we get that as a side-effect of depending on populate_stats_process_rooms.
INSERT INTO background_updates (update_name, progress_json, depends_on) VALUES
    ('populate_stats_process_users', '{}', 'populate_stats_process_rooms');

----- Create tables for our version of room stats.

-- single-row table to track position of incremental updates
DROP TABLE IF EXISTS stats_incremental_position;
CREATE TABLE stats_incremental_position (
    Lock CHAR(1) NOT NULL DEFAULT 'X' UNIQUE,  -- Makes sure this table only has one row.
    stream_id  BIGINT NOT NULL,
    CHECK (Lock='X')
);

-- insert a null row and make sure it is the only one.
INSERT INTO stats_incremental_position (
    stream_id
) SELECT COALESCE(MAX(stream_ordering), 0) from events;

-- represents PRESENT room statistics for a room
-- only holds absolute fields
DROP TABLE IF EXISTS room_stats_current;
CREATE TABLE room_stats_current (
    room_id TEXT NOT NULL PRIMARY KEY,

    -- These are absolute counts
    current_state_events INT NOT NULL,
    joined_members INT NOT NULL,
    invited_members INT NOT NULL,
    left_members INT NOT NULL,
    banned_members INT NOT NULL,

    local_users_in_room INT NOT NULL,

    -- The maximum delta stream position that this row takes into account.
    completed_delta_stream_id BIGINT NOT NULL
);


-- represents HISTORICAL room statistics for a room
DROP TABLE IF EXISTS room_stats_historical;
CREATE TABLE room_stats_historical (
    room_id TEXT NOT NULL,
    -- These stats cover the time from (end_ts - bucket_size)...end_ts (in ms).
    -- Note that end_ts is quantised.
    end_ts BIGINT NOT NULL,
    bucket_size BIGINT NOT NULL,

    -- These stats are absolute counts
    current_state_events BIGINT NOT NULL,
    joined_members BIGINT NOT NULL,
    invited_members BIGINT NOT NULL,
    left_members BIGINT NOT NULL,
    banned_members BIGINT NOT NULL,
    local_users_in_room BIGINT NOT NULL,

    -- These stats are per time slice
    total_events BIGINT NOT NULL,
    total_event_bytes BIGINT NOT NULL,

    PRIMARY KEY (room_id, end_ts)
);

-- We use this index to speed up deletion of ancient room stats.
CREATE INDEX room_stats_historical_end_ts ON room_stats_historical (end_ts);

-- represents PRESENT statistics for a user
-- only holds absolute fields
DROP TABLE IF EXISTS user_stats_current;
CREATE TABLE user_stats_current (
    user_id TEXT NOT NULL PRIMARY KEY,

    joined_rooms BIGINT NOT NULL,

    -- The maximum delta stream position that this row takes into account.
    completed_delta_stream_id BIGINT NOT NULL
);

-- represents HISTORICAL statistics for a user
DROP TABLE IF EXISTS user_stats_historical;
CREATE TABLE user_stats_historical (
    user_id TEXT NOT NULL,
    end_ts BIGINT NOT NULL,
    bucket_size BIGINT NOT NULL,

    joined_rooms BIGINT NOT NULL,

    invites_sent BIGINT NOT NULL,
    rooms_created BIGINT NOT NULL,
    total_events BIGINT NOT NULL,
    total_event_bytes BIGINT NOT NULL,

    PRIMARY KEY (user_id, end_ts)
);

-- We use this index to speed up deletion of ancient user stats.
CREATE INDEX user_stats_historical_end_ts ON user_stats_historical (end_ts);


CREATE TABLE room_stats_state (
    room_id TEXT NOT NULL,
    name TEXT,
    canonical_alias TEXT,
    join_rules TEXT,
    history_visibility TEXT,
    encryption TEXT,
    avatar TEXT,
    guest_access TEXT,
    is_federatable BOOLEAN,
    topic TEXT
);

CREATE UNIQUE INDEX room_stats_state_room ON room_stats_state(room_id);