diff --git a/internal/db/migrations/140_drop_deadline_rules.up.sql b/internal/db/migrations/140_drop_deadline_rules.up.sql index 8950e89..8fb51be 100644 --- a/internal/db/migrations/140_drop_deadline_rules.up.sql +++ b/internal/db/migrations/140_drop_deadline_rules.up.sql @@ -109,11 +109,21 @@ ALTER TABLE paliad.deadlines ALTER TABLE paliad.deadlines DROP COLUMN IF EXISTS rule_id; +-- --------------------------------------------------------------- +-- 6a. Drop the deadline_search materialized view, which has a +-- direct dependency on paliad.deadline_rules (mig 077). We +-- recreate it after the DROP, re-pointed at deadline_rules_unified +-- so reads keep working. All 11 indexes are recreated alongside. +-- --------------------------------------------------------------- + +DROP MATERIALIZED VIEW IF EXISTS paliad.deadline_search; + -- --------------------------------------------------------------- -- 6. DROP TABLE paliad.deadline_rules. Now that: -- - dependent FKs are re-pointed to sequencing_rules, -- - the audit trigger is dropped, -- - deadlines.rule_id is gone, +-- - the deadline_search matview is gone, -- nothing references the table anymore. The self-FKs -- (deadline_rules.parent_id, .draft_of) drop with the table. -- --------------------------------------------------------------- @@ -332,3 +342,94 @@ BEGIN RAISE NOTICE '[mig 140] OK — deadline_rules dropped, snapshot=% rows, view=% rows, INSTEAD OF triggers active', v_snapshot_count, v_view_count; END $$; + +-- --------------------------------------------------------------- +-- 8. Recreate paliad.deadline_search materialized view against +-- deadline_rules_unified (same column shape — sr.id is the new +-- dr.id, etc.). Definition mirrors mig 077; only the FROM table +-- name changes. All 11 indexes restored. +-- --------------------------------------------------------------- + +CREATE MATERIALIZED VIEW paliad.deadline_search AS + SELECT 'rule'::text AS kind, + ('r:'::text || (dr.id)::text) AS row_key, + dc.id AS concept_id, + dc.slug AS concept_slug, + dc.name_de AS concept_name_de, + dc.name_en AS concept_name_en, + dc.description AS concept_description, + dc.aliases AS concept_aliases, + dc.party AS concept_party, + dc.category AS concept_category, + dc.sort_order AS concept_sort_order, + dr.id AS rule_id, + NULL::bigint AS trigger_event_id, + pt.code AS proceeding_code, + pt.name AS proceeding_name_de, + pt.name_en AS proceeding_name_en, + pt.jurisdiction, + pt.display_order AS proceeding_display_order, + dr.submission_code AS rule_local_code, + dr.name AS rule_name_de, + dr.name_en AS rule_name_en, + dr.legal_source, + dr.rule_code, + dr.duration_value, + dr.duration_unit, + dr.timing, + COALESCE(dr.primary_party, dc.party) AS effective_party + FROM paliad.deadline_rules_unified dr + JOIN paliad.proceeding_types pt ON pt.id = dr.proceeding_type_id + JOIN paliad.deadline_concepts dc ON dc.id = dr.concept_id + WHERE dr.is_active AND pt.is_active AND pt.category = 'fristenrechner'::text +UNION ALL + SELECT 'trigger'::text AS kind, + ('t:'::text || (te.id)::text) AS row_key, + dc.id AS concept_id, + dc.slug AS concept_slug, + dc.name_de AS concept_name_de, + dc.name_en AS concept_name_en, + dc.description AS concept_description, + dc.aliases AS concept_aliases, + dc.party AS concept_party, + dc.category AS concept_category, + dc.sort_order AS concept_sort_order, + NULL::uuid AS rule_id, + te.id AS trigger_event_id, + NULL::text AS proceeding_code, + NULL::text AS proceeding_name_de, + NULL::text AS proceeding_name_en, + 'cross-cutting'::text AS jurisdiction, + 9999 AS proceeding_display_order, + te.code AS rule_local_code, + te.name_de AS rule_name_de, + te.name AS rule_name_en, + dr_trig.legal_source, + NULL::text AS rule_code, + NULL::integer AS duration_value, + NULL::text AS duration_unit, + NULL::text AS timing, + dc.party AS effective_party + FROM paliad.trigger_events te + JOIN paliad.deadline_concepts dc ON dc.slug = te.concept_id + LEFT JOIN paliad.deadline_rules_unified dr_trig + ON dr_trig.trigger_event_id = te.id + AND dr_trig.proceeding_type_id IS NULL + AND dr_trig.is_active + AND dr_trig.lifecycle_state = 'published'::text + WHERE te.is_active +WITH NO DATA; + +CREATE UNIQUE INDEX deadline_search_row_key ON paliad.deadline_search (row_key); +CREATE INDEX deadline_search_concept_id ON paliad.deadline_search (concept_id); +CREATE INDEX deadline_search_proc_code ON paliad.deadline_search (proceeding_code); +CREATE INDEX deadline_search_legal_source ON paliad.deadline_search (legal_source); +CREATE INDEX deadline_search_effective_party ON paliad.deadline_search (effective_party); +CREATE INDEX deadline_search_legal_source_trgm ON paliad.deadline_search USING gin (legal_source gin_trgm_ops); +CREATE INDEX deadline_search_concept_de_trgm ON paliad.deadline_search USING gin (concept_name_de gin_trgm_ops); +CREATE INDEX deadline_search_concept_en_trgm ON paliad.deadline_search USING gin (concept_name_en gin_trgm_ops); +CREATE INDEX deadline_search_rule_de_trgm ON paliad.deadline_search USING gin (rule_name_de gin_trgm_ops); +CREATE INDEX deadline_search_rule_en_trgm ON paliad.deadline_search USING gin (rule_name_en gin_trgm_ops); +CREATE INDEX deadline_search_rule_code_trgm ON paliad.deadline_search USING gin (rule_code gin_trgm_ops); + +REFRESH MATERIALIZED VIEW paliad.deadline_search;