lemmy/migrations/2023-08-23-182533_scaled_rank/down.sql
Dull Bananas d71cfaa503 stuff
2024-05-22 20:34:35 +00:00

102 lines
2.7 KiB
PL/PgSQL

DROP FUNCTION scaled_rank;
ALTER TABLE community_aggregates
ALTER COLUMN hot_rank TYPE integer,
ALTER COLUMN hot_rank SET DEFAULT 1728;
ALTER TABLE comment_aggregates
ALTER COLUMN hot_rank TYPE integer,
ALTER COLUMN hot_rank SET DEFAULT 1728;
ALTER TABLE post_aggregates
ALTER COLUMN hot_rank TYPE integer,
ALTER COLUMN hot_rank SET DEFAULT 1728,
ALTER COLUMN hot_rank_active TYPE integer,
ALTER COLUMN hot_rank_active SET DEFAULT 1728;
-- Change back to integer version
DROP FUNCTION hot_rank (numeric, published timestamp with time zone);
CREATE OR REPLACE FUNCTION hot_rank (score numeric, published timestamp with time zone)
RETURNS integer
AS $$
DECLARE
hours_diff numeric := EXTRACT(EPOCH FROM (now() - published)) / 3600;
BEGIN
IF (hours_diff > 0) THEN
RETURN floor(10000 * log(greatest (1, score + 3)) / power((hours_diff + 2), 1.8))::integer;
ELSE
-- if the post is from the future, set hot score to 0. otherwise you can game the post to
-- always be on top even with only 1 vote by setting it to the future
RETURN 0;
END IF;
END;
$$
LANGUAGE plpgsql
IMMUTABLE PARALLEL SAFE;
ALTER TABLE post_aggregates
DROP COLUMN scaled_rank;
-- The following code is necessary because postgres can't remove
-- a single enum value.
ALTER TABLE local_user
ALTER default_sort_type DROP DEFAULT;
UPDATE
local_user
SET
default_sort_type = 'Hot'
WHERE
default_sort_type = 'Scaled';
-- rename the old enum
ALTER TYPE sort_type_enum RENAME TO sort_type_enum__;
-- create the new enum
CREATE TYPE sort_type_enum AS ENUM (
'Active',
'Hot',
'New',
'Old',
'TopDay',
'TopWeek',
'TopMonth',
'TopYear',
'TopAll',
'MostComments',
'NewComments',
'TopHour',
'TopSixHour',
'TopTwelveHour',
'TopThreeMonths',
'TopSixMonths',
'TopNineMonths'
);
-- alter all your enum columns
ALTER TABLE local_user
ALTER COLUMN default_sort_type TYPE sort_type_enum
USING default_sort_type::text::sort_type_enum;
ALTER TABLE local_user
ALTER default_sort_type SET DEFAULT 'Active';
-- drop the old enum
DROP TYPE sort_type_enum__;
-- Remove int to float conversions that were automatically added to index filters
DROP INDEX idx_comment_aggregates_nonzero_hotrank, idx_community_aggregates_nonzero_hotrank, idx_post_aggregates_nonzero_hotrank;
CREATE INDEX idx_community_aggregates_nonzero_hotrank ON community_aggregates (published)
WHERE
hot_rank != 0;
CREATE INDEX idx_comment_aggregates_nonzero_hotrank ON comment_aggregates (published)
WHERE
hot_rank != 0;
CREATE INDEX idx_post_aggregates_nonzero_hotrank ON post_aggregates (published DESC)
WHERE
hot_rank != 0 OR hot_rank_active != 0;