refactor to put fav_id on FaUserPostFav

This commit is contained in:
Dylan Knutson
2025-07-11 03:34:39 +00:00
parent acc2f9a240
commit c37e3c1024
30 changed files with 1110 additions and 893 deletions

View File

@@ -0,0 +1,61 @@
# typed: strict
class AddTypeToDomainUserPostFavs < ActiveRecord::Migration[7.2]
extend T::Sig
sig { void }
def change
mirai_tablespace!
create_enum(
"domain_user_post_fav_type",
%w[Domain::UserPostFav Domain::UserPostFav::FaUserPostFav],
)
change_table :domain_user_post_favs do |t|
t.enum :type,
null: false,
enum_type: "domain_user_post_fav_type",
default: "Domain::UserPostFav"
t.jsonb :json_attributes, default: {}
end
[
["fav_id", "integer", { unique: true }],
%w[inferred_time integer],
%w[explicit_time integer],
].each do |column_name, column_type, options|
add_json_index(
"domain_user_post_favs",
column_name,
column_type,
{ where: "type = 'Domain::UserPostFav::FaUserPostFav'" }.merge(
options || {},
),
)
end
up_only { execute <<-SQL }
UPDATE domain_user_post_favs
SET type = 'Domain::UserPostFav::FaUserPostFav'
FROM domain_posts
WHERE domain_posts.id = domain_user_post_favs.post_id
AND domain_posts.type = 'Domain::Post::FaPost'
SQL
# backfill values from domain_fa_fav_id_and_dates
up_only { execute <<-SQL }
UPDATE domain_user_post_favs
SET json_attributes =
domain_user_post_favs.json_attributes
|| jsonb_build_object('fav_id', domain_fa_fav_id_and_dates.fav_fa_id)
|| jsonb_build_object('explicit_time', EXTRACT(EPOCH FROM domain_fa_fav_id_and_dates.date)::integer)
FROM domain_fa_fav_id_and_dates
JOIN domain_posts ON (domain_posts.json_attributes->>'fa_id')::integer = domain_fa_fav_id_and_dates.post_fa_id
WHERE domain_posts.type = 'Domain::Post::FaPost'
AND domain_user_post_favs.post_id = domain_posts.id
AND domain_fa_fav_id_and_dates.user_id = domain_user_post_favs.user_id
AND domain_user_post_favs.type = 'Domain::UserPostFav::FaUserPostFav'
SQL
end
end

View File

@@ -152,6 +152,16 @@ CREATE TYPE public.domain_post_type AS ENUM (
);
--
-- Name: domain_user_post_fav_type; Type: TYPE; Schema: public; Owner: -
--
CREATE TYPE public.domain_user_post_fav_type AS ENUM (
'Domain::UserPostFav',
'Domain::UserPostFav::FaUserPostFav'
);
--
-- Name: domain_user_type; Type: TYPE; Schema: public; Owner: -
--
@@ -3154,7 +3164,9 @@ CREATE TABLE public.domain_user_post_fav_user_factors (
CREATE TABLE public.domain_user_post_favs (
user_id bigint NOT NULL,
post_id bigint NOT NULL,
removed boolean DEFAULT false NOT NULL
removed boolean DEFAULT false NOT NULL,
type public.domain_user_post_fav_type DEFAULT 'Domain::UserPostFav'::public.domain_user_post_fav_type NOT NULL,
json_attributes jsonb DEFAULT '{}'::jsonb
);
@@ -5963,6 +5975,27 @@ CREATE UNIQUE INDEX idx_domain_post_groups_on_sofurry_id ON public.domain_post_g
CREATE UNIQUE INDEX idx_domain_posts_on_sofurry_id ON public.domain_posts USING btree ((((json_attributes ->> 'sofurry_id'::text))::integer)) WHERE (type = 'Domain::Post::SofurryPost'::public.domain_post_type);
--
-- Name: idx_domain_user_post_favs_on_explicit_time; Type: INDEX; Schema: public; Owner: -; Tablespace: mirai
--
CREATE INDEX idx_domain_user_post_favs_on_explicit_time ON public.domain_user_post_favs USING btree ((((json_attributes ->> 'explicit_time'::text))::integer)) WHERE (type = 'Domain::UserPostFav::FaUserPostFav'::public.domain_user_post_fav_type);
--
-- Name: idx_domain_user_post_favs_on_fav_id; Type: INDEX; Schema: public; Owner: -; Tablespace: mirai
--
CREATE UNIQUE INDEX idx_domain_user_post_favs_on_fav_id ON public.domain_user_post_favs USING btree ((((json_attributes ->> 'fav_id'::text))::integer)) WHERE (type = 'Domain::UserPostFav::FaUserPostFav'::public.domain_user_post_fav_type);
--
-- Name: idx_domain_user_post_favs_on_inferred_time; Type: INDEX; Schema: public; Owner: -; Tablespace: mirai
--
CREATE INDEX idx_domain_user_post_favs_on_inferred_time ON public.domain_user_post_favs USING btree ((((json_attributes ->> 'inferred_time'::text))::integer)) WHERE (type = 'Domain::UserPostFav::FaUserPostFav'::public.domain_user_post_fav_type);
--
-- Name: idx_domain_users_e621_on_name_lower; Type: INDEX; Schema: public; Owner: -; Tablespace: mirai
--
@@ -9240,6 +9273,7 @@ ALTER TABLE ONLY public.domain_twitter_tweets
SET search_path TO "$user", public;
INSERT INTO "schema_migrations" (version) VALUES
('20250711014944'),
('20250710204708'),
('20250709235107'),
('20250628000003'),