Restructure DB in preparation for follower/subscriber implementation

- Remove user.is{follower,subscriber}, replacing with tables follows and 
subscriptions
- Update vote_score_vw to reflect new structure
- Add db upgrade script
master
Dessa Simpson 2021-02-22 23:54:47 -07:00
parent 60defb7ea6
commit dbe7e4c52d
6 changed files with 75 additions and 10 deletions

View File

@ -2,7 +2,5 @@ CREATE TABLE users (
userId int NOT NULL, userId int NOT NULL,
displayName varchar NOT NULL, displayName varchar NOT NULL,
imageUrl varchar, imageUrl varchar,
isFollower boolean NOT NULL DEFAULT FALSE,
isSubscriber boolean NOT NULL DEFAULT FALSE,
PRIMARY KEY (userId) PRIMARY KEY (userId)
); );

4
db/50-follows.sql Normal file
View File

@ -0,0 +1,4 @@
CREATE TABLE follows (
userid integer,
PRIMARY KEY (userid)
)

4
db/50-subscriptions.sql Normal file
View File

@ -0,0 +1,4 @@
CREATE TABLE subscriptions (
userid integer,
PRIMARY KEY (userid)
)

View File

@ -40,11 +40,11 @@ CREATE OR REPLACE VIEW vote_score_vw AS
COUNT(votes.requesturl) AS count, COUNT(votes.requesturl) AS count,
COALESCE( COALESCE(
SUM(CASE SUM(CASE
WHEN users.isfollower = FALSE AND users.issubscriber = FALSE WHEN follows.userid IS NULL AND subscriptions.userid IS NULL
THEN votepoints.normaluservotepoints THEN votepoints.normaluservotepoints
WHEN users.isfollower = TRUE AND users.issubscriber = FALSE WHEN follows.userid IS NOT NULL AND subscriptions.userid IS NULL
THEN votepoints.followervotepoints THEN votepoints.followervotepoints
WHEN users.issubscriber = TRUE WHEN subscriptions.userid IS NOT NULL
THEN votepoints.subscribervotepoints THEN votepoints.subscribervotepoints
END), 0 END), 0
) AS votescore ) AS votescore
@ -52,6 +52,8 @@ CREATE OR REPLACE VIEW vote_score_vw AS
LEFT JOIN votes ON votes.requesturl = requests.url LEFT JOIN votes ON votes.requesturl = requests.url
LEFT JOIN users on votes.userid = users.userid LEFT JOIN users on votes.userid = users.userid
LEFT JOIN bans ON users.userid = bans.userid LEFT JOIN bans ON users.userid = bans.userid
LEFT JOIN follows ON users.userid = follows.userid
LEFT JOIN subscriptions ON users.userid = subscriptions.userid
CROSS JOIN votepoints CROSS JOIN votepoints
WHERE bans.userid IS NULL WHERE bans.userid IS NULL
GROUP BY url; GROUP BY url;

View File

@ -1,8 +1,16 @@
INSERT INTO users (userid,displayName,isFollower,isSubscriber) VALUES INSERT INTO users (userid,displayName) VALUES
(001,'TestUser',false,false), (001,'TestUser'),
(002,'TestFollower',true,false), (002,'TestFollower'),
(003,'TestSubscriber',true,true), (003,'TestSubscriber'),
(004,'TestSubNonFollower',false,true); (004,'TestSubNonFollower');
INSERT INTO follows (userid) VALUES
(002),
(003);
INSERT INTO subscriptions (userid) VALUES
(003),
(004);
CALL add_request('https://www.youtube.com/watch?v=dQw4w9WgXcQ',001); CALL add_request('https://www.youtube.com/watch?v=dQw4w9WgXcQ',001);
CALL add_request('https://www.youtube.com/watch?v=C5oeWHngDS4',002); CALL add_request('https://www.youtube.com/watch?v=C5oeWHngDS4',002);

49
db/upgrade/v0.4-0.5.sql Normal file
View File

@ -0,0 +1,49 @@
BEGIN;
--UPDATE version SET minor = 5;
CREATE OR REPLACE PROCEDURE update_vote_points(normaluser int, follower int, subscriber int)
LANGUAGE SQL
AS $$
UPDATE config SET normaluservotepoints = normaluser,
followervotepoints = follower, subscribervotepoints = subscriber;
CALL update_scores();
$$;
CREATE TABLE follows (
userid integer,
PRIMARY KEY (userid)
);
CREATE TABLE subscriptions (
userid integer,
PRIMARY KEY (userid)
);
CREATE OR REPLACE VIEW vote_score_vw AS
WITH votepoints AS (SELECT normaluservotepoints, followervotepoints, subscribervotepoints FROM config)
SELECT requests.url AS url,
COUNT(votes.requesturl) AS count,
COALESCE(
SUM(CASE
WHEN follows.userid IS NULL AND subscriptions.userid IS NULL
THEN votepoints.normaluservotepoints
WHEN follows.userid IS NOT NULL AND subscriptions.userid IS NULL
THEN votepoints.followervotepoints
WHEN subscriptions.userid IS NOT NULL
THEN votepoints.subscribervotepoints
END), 0
) AS votescore
FROM requests
LEFT JOIN votes ON votes.requesturl = requests.url
LEFT JOIN users on votes.userid = users.userid
LEFT JOIN bans ON users.userid = bans.userid
LEFT JOIN follows ON users.userid = follows.userid
LEFT JOIN subscriptions ON users.userid = subscriptions.userid
CROSS JOIN votepoints
WHERE bans.userid IS NULL
GROUP BY url;
ALTER TABLE users DROP COLUMN isfollower, DROP COLUMN issubscriber;
COMMIT;