All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m31s
61 lines
2.6 KiB
SQL
61 lines
2.6 KiB
SQL
-- Migration: Add group_name field to wishlist_items and tasks tables
|
||
-- Date: 2026-02-XX
|
||
--
|
||
-- This migration:
|
||
-- 1. Adds group_name field to wishlist_items (replacing project_id)
|
||
-- 2. Migrates existing data from project_id to group_name
|
||
-- 3. Removes project_id column from wishlist_items
|
||
-- 4. Adds group_name field to tasks
|
||
-- 5. Creates materialized view for group suggestions
|
||
|
||
-- Step 1: Add group_name to wishlist_items
|
||
ALTER TABLE wishlist_items
|
||
ADD COLUMN group_name VARCHAR(255);
|
||
|
||
-- Step 2: Migrate existing data from project_id to group_name
|
||
UPDATE wishlist_items wi
|
||
SET group_name = p.name
|
||
FROM projects p
|
||
WHERE wi.project_id = p.id AND wi.project_id IS NOT NULL;
|
||
|
||
-- Step 3: Remove project_id column and its index
|
||
DROP INDEX IF EXISTS idx_wishlist_items_project_id;
|
||
ALTER TABLE wishlist_items
|
||
DROP COLUMN project_id;
|
||
|
||
-- Step 4: Add group_name to tasks
|
||
ALTER TABLE tasks
|
||
ADD COLUMN group_name VARCHAR(255);
|
||
|
||
-- Step 5: Create indexes on group_name
|
||
CREATE INDEX idx_wishlist_items_group_name ON wishlist_items(group_name) WHERE group_name IS NOT NULL;
|
||
CREATE INDEX idx_tasks_group_name ON tasks(group_name) WHERE group_name IS NOT NULL;
|
||
|
||
-- Step 6: Create materialized view for group suggestions
|
||
CREATE MATERIALIZED VIEW user_group_suggestions_mv AS
|
||
SELECT DISTINCT user_id, group_name FROM (
|
||
-- Желания пользователя (собственные)
|
||
SELECT wi.user_id, wi.group_name FROM wishlist_items wi
|
||
WHERE wi.deleted = FALSE AND wi.group_name IS NOT NULL AND wi.group_name != ''
|
||
UNION
|
||
-- Желания с досок, на которых пользователь участник
|
||
SELECT wbm.user_id, wi.group_name FROM wishlist_items wi
|
||
JOIN wishlist_board_members wbm ON wi.board_id = wbm.board_id
|
||
WHERE wi.deleted = FALSE AND wi.group_name IS NOT NULL AND wi.group_name != ''
|
||
UNION
|
||
-- Задачи пользователя
|
||
SELECT t.user_id, t.group_name FROM tasks t
|
||
WHERE t.deleted = FALSE AND t.group_name IS NOT NULL AND t.group_name != ''
|
||
UNION
|
||
-- Имена проектов пользователя
|
||
SELECT p.user_id, p.name FROM projects p
|
||
WHERE p.deleted = FALSE
|
||
) sub;
|
||
|
||
-- Step 7: Create unique index for CONCURRENT refresh
|
||
CREATE UNIQUE INDEX idx_user_group_suggestions_mv_user_group ON user_group_suggestions_mv(user_id, group_name);
|
||
|
||
COMMENT ON COLUMN wishlist_items.group_name IS 'Group name for wishlist item (free text, replaces project_id)';
|
||
COMMENT ON COLUMN tasks.group_name IS 'Group name for task (free text)';
|
||
COMMENT ON MATERIALIZED VIEW user_group_suggestions_mv IS 'Materialized view for group name suggestions per user';
|