-
Notifications
You must be signed in to change notification settings - Fork 0
/
schema.sql
202 lines (187 loc) · 5.38 KB
/
schema.sql
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
create table user_profile(
user_id text not null primary key
, user_name text not null
-- created_at integer not null default (unixepoch('subsec')*1000) -- TODO
, is_admin integer not null default false
) strict;
create table post(
id integer primary key autoincrement -- rowid
, parent_id integer
, author_id text not null
, content text not null
, created_at integer not null default (unixepoch('subsec')*1000)
, deleted_at integer default null
, is_private integer not null default false
, constraint post_parent_id_fkey foreign key (parent_id) references post(id) on delete no action on update no action
, constraint post_author_id_fkey foreign key (author_id) references user_profile(user_id) on delete no action on update no action
) strict;
create table lineage(
ancestor_id integer
, descendant_id integer not null
, separation integer not null
, primary key(ancestor_id, descendant_id)
) strict;
create index lineage_ancestor_id on lineage(ancestor_id);
create index lineage_descendant_id on lineage(descendant_id);
create trigger after_insert_post after insert on post when new.parent_id is not null
begin
-- Insert a lineage record for parent
insert into lineage(ancestor_id, descendant_id, separation)
values(new.parent_id, new.id, 1) on conflict do nothing;
-- Insert a lineage record for all ancestors of this parent
insert into lineage
select
ancestor_id
, new.id as descendant_id
, 1 + separation as separation
from lineage ancestor
where ancestor.descendant_id = new.parent_id;
end;
create table vote_event(
vote_event_id integer not null primary key autoincrement
, user_id text not null references user_profile(user_id)
, post_id integer not null
, vote integer not null
, vote_event_time integer not null default (unixepoch('subsec')*1000)
, parent_id integer
) strict;
create index vote_event_user_id_post_id_idx on vote_event(user_id, post_id);
create table vote (
user_id text references user_profile(user_id)
, post_id integer not null
, vote integer not null
, latest_vote_event_id integer not null
, vote_event_time integer not null
, primary key(user_id, post_id)
) strict;
create trigger after_insert_on_vote_event after insert on vote_event
begin
insert into vote(
user_id
, post_id
, vote
, latest_vote_event_id
, vote_event_time
) values (
new.user_id
, new.post_id
, new.vote
, new.vote_event_id
, new.vote_event_time
) on conflict(user_id, post_id) do update set
vote = new.vote
, latest_vote_event_id = new.vote_event_id
, vote_event_time = new.vote_event_time;
end;
create table effect_event(
vote_event_id integer not null
, vote_event_time integer not null
, post_id integer not null
, comment_id integer not null
, p real not null
, p_count integer not null
, p_size integer not null
, q real not null
, q_count integer not null
, q_size integer not null
, r real not null
, weight real not null default 0
, primary key(vote_event_id, post_id, comment_id)
) strict;
create table effect(
vote_event_id integer not null
, vote_event_time integer not null
, post_id integer not null
, comment_id integer not null
, p real not null
, p_count integer not null
, p_size integer not null
, q real not null
, q_count integer not null
, q_size integer not null
, r real not null
, weight real not null default 0
, primary key(post_id, comment_id)
) strict;
create trigger after_insert_effect_event after insert on effect_event
begin
insert or replace into effect
values (
new.vote_event_id
, new.vote_event_time
, new.post_id
, new.comment_id
, new.p
, new.p_count
, new.p_size
, new.q
, new.q_count
, new.q_size
, new.r
, new.weight
);
end;
create table score_event(
vote_event_id integer not null
, vote_event_time integer not null
, post_id integer not null
, o real not null
, o_count integer not null
, o_size integer not null
, p real not null
, score real not null
, primary key(vote_event_id, post_id)
) strict;
create table score(
vote_event_id integer not null
, vote_event_time integer not null
, post_id integer not null
, o real not null
, o_count integer not null
, o_size integer not null
, p real not null
, score real not null
, primary key(post_id)
) strict;
create trigger after_insert_on_score_event after insert on score_event
begin
insert or replace into score
values(
new.vote_event_id
, new.vote_event_time
, new.post_id
, new.o
, new.o_count
, new.o_size
, new.p
, new.score
);
end;
create view score_with_default as
select
post.id as post_id
, ifnull(o,0.5) o
, ifnull(o_count,0) o_count
, ifnull(o_size,0) o_size
, ifnull(score.p, 0.5) p
, ifnull(score,0) score
from post
left join score
on post.id = score.post_id;
create view effect_with_default as
select
ancestor_id as post_id
, descendant_id as comment_id
, s.p
, coalesce(effect.p_count, s.o_count, 0) p_count
, coalesce(effect.p_size, s.o_count, 0) p_size
, coalesce(effect.q, s.o, 0.5) q
, coalesce(effect.q_count, s.o_count, 0.5) q_count
, coalesce(effect.q_size, s.o_size, 0.5) q_size
, coalesce(effect.r, s.o, 0.5) r
from score_with_default s
join lineage
on ancestor_id = s.post_id
left join effect
on effect.comment_id = ancestor_id
and effect.post_id = descendant_id;