diff --git a/metadata/tables.yaml b/metadata/tables.yaml index 4b3a0c4..5484da7 100644 --- a/metadata/tables.yaml +++ b/metadata/tables.yaml @@ -255,9 +255,6 @@ - name: modelcatalog_configuration using: foreign_key_constraint_on: modelcatalog_configuration_id - - name: modelcatalog_setup - using: - foreign_key_constraint_on: modelcatalog_setup_id array_relationships: - name: data_bindings using: @@ -297,7 +294,6 @@ - execution_engine - model_id - modelcatalog_configuration_id - - modelcatalog_setup_id - start_time - end_time - run_progress @@ -311,7 +307,6 @@ - execution_engine - model_id - modelcatalog_configuration_id - - modelcatalog_setup_id - start_time - end_time - run_progress @@ -326,7 +321,6 @@ - execution_engine - model_id - modelcatalog_configuration_id - - modelcatalog_setup_id - start_time - end_time - run_progress @@ -341,7 +335,6 @@ - execution_engine - model_id - modelcatalog_configuration_id - - modelcatalog_setup_id - run_id - status - end_time @@ -535,154 +528,6 @@ - description filter: {} allow_aggregations: true -- table: - name: model - schema: public - array_relationships: - - name: inputs - using: - foreign_key_constraint_on: - column: model_id - table: - name: model_input - schema: public - - name: outputs - using: - foreign_key_constraint_on: - column: model_id - table: - name: model_output - schema: public - - name: parameters - using: - foreign_key_constraint_on: - column: model_id - table: - name: model_parameter - schema: public - insert_permissions: - - role: user - permission: - check: {} - columns: - - id - - name - - description - - category - - type - - model_version - - model_name - - region_name - - dimensionality - - parameter_assignment - - parameter_assignment_details - - calibration_target_variable - - spatial_grid_type - - spatial_grid_resolution - - usage_notes - - code_url - - output_time_interval - - model_configuration - - software_image - - user_id - select_permissions: - - role: anonymous - permission: - columns: - - id - - name - - description - - category - - type - - model_version - - model_name - - region_name - - dimensionality - - parameter_assignment - - parameter_assignment_details - - calibration_target_variable - - spatial_grid_type - - spatial_grid_resolution - - usage_notes - - code_url - - output_time_interval - - model_configuration - - software_image - - user_id - filter: {} - allow_aggregations: true - - role: user - permission: - columns: - - calibration_target_variable - - category - - code_url - - description - - dimensionality - - id - - model_configuration - - model_name - - model_version - - name - - output_time_interval - - parameter_assignment - - parameter_assignment_details - - region_name - - software_image - - spatial_grid_resolution - - spatial_grid_type - - type - - usage_notes - - user_id - filter: {} - update_permissions: - - role: user - permission: - columns: - - name - filter: {} - check: null -- table: - name: model_input - schema: public - object_relationships: - - name: model - using: - foreign_key_constraint_on: model_id - - name: model_io - using: - foreign_key_constraint_on: model_io_id - insert_permissions: - - role: user - permission: - check: {} - columns: - - model_id - - model_io_id - - position - select_permissions: - - role: anonymous - permission: - columns: - - model_id - - model_io_id - - position - filter: {} - allow_aggregations: true - - role: user - permission: - columns: - - position - - model_id - - model_io_id - filter: {} - update_permissions: - - role: user - permission: - columns: - - model_id - filter: {} - check: null - table: name: model_input_fixed_binding schema: public @@ -750,20 +595,7 @@ table: name: model_input_fixed_binding schema: public - - name: model_inputs - using: - foreign_key_constraint_on: - column: model_io_id - table: - name: model_input - schema: public - - name: model_outputs - using: - foreign_key_constraint_on: - column: model_io_id - table: - name: model_output - schema: public + - name: thread_model_ios using: foreign_key_constraint_on: @@ -850,118 +682,6 @@ - variable_id filter: {} check: null -- table: - name: model_output - schema: public - object_relationships: - - name: model - using: - foreign_key_constraint_on: model_id - - name: model_io - using: - foreign_key_constraint_on: model_io_id - insert_permissions: - - role: user - permission: - check: {} - columns: - - model_id - - model_io_id - - position - select_permissions: - - role: anonymous - permission: - columns: - - model_id - - model_io_id - - position - filter: {} - allow_aggregations: true - - role: user - permission: - columns: - - position - - model_id - - model_io_id - filter: {} - update_permissions: - - role: user - permission: - columns: - - model_id - filter: {} - check: null -- table: - name: model_parameter - schema: public - object_relationships: - - name: model - using: - foreign_key_constraint_on: model_id - insert_permissions: - - role: user - permission: - check: {} - columns: - - id - - name - - description - - default - - fixed_value - - unit - - min - - max - - accepted_values - - type - - adjustment_variable - - model_id - - position - - datatype - select_permissions: - - role: anonymous - permission: - columns: - - id - - name - - description - - default - - fixed_value - - unit - - min - - max - - accepted_values - - type - - adjustment_variable - - model_id - - position - - datatype - filter: {} - allow_aggregations: true - - role: user - permission: - columns: - - position - - accepted_values - - adjustment_variable - - datatype - - default - - description - - fixed_value - - id - - max - - min - - model_id - - name - - type - - unit - filter: {} - update_permissions: - - role: user - permission: - columns: - - model_id - filter: {} - check: null - table: name: problem_statement schema: public @@ -1978,9 +1698,6 @@ - name: modelcatalog_configuration using: foreign_key_constraint_on: modelcatalog_configuration_id - - name: modelcatalog_setup - using: - foreign_key_constraint_on: modelcatalog_setup_id - name: thread using: foreign_key_constraint_on: thread_id @@ -2036,7 +1753,6 @@ columns: - model_id - modelcatalog_configuration_id - - modelcatalog_setup_id - thread_id - id select_permissions: @@ -2047,7 +1763,6 @@ - thread_id - model_id - modelcatalog_configuration_id - - modelcatalog_setup_id filter: {} allow_aggregations: true - role: user @@ -2055,7 +1770,6 @@ columns: - model_id - modelcatalog_configuration_id - - modelcatalog_setup_id - thread_id - id filter: @@ -2082,7 +1796,6 @@ columns: - model_id - modelcatalog_configuration_id - - modelcatalog_setup_id - thread_id - id filter: @@ -2970,7 +2683,7 @@ foreign_key_constraint_on: column: software_version_id table: - name: modelcatalog_model_configuration + name: modelcatalog_configuration schema: public - name: categories using: @@ -3076,16 +2789,26 @@ permission: filter: {} - table: - name: modelcatalog_model_configuration + name: modelcatalog_configuration schema: public object_relationships: - name: software_version using: foreign_key_constraint_on: software_version_id + - name: parent_configuration + using: + foreign_key_constraint_on: model_configuration_id - name: author using: foreign_key_constraint_on: author_id array_relationships: + - name: child_configurations + using: + foreign_key_constraint_on: + column: model_configuration_id + table: + name: modelcatalog_configuration + schema: public - name: executions using: foreign_key_constraint_on: @@ -3100,13 +2823,6 @@ table: name: thread_model schema: public - - name: setups - using: - foreign_key_constraint_on: - column: model_configuration_id - table: - name: modelcatalog_model_configuration_setup - schema: public - name: inputs using: foreign_key_constraint_on: @@ -3128,6 +2844,20 @@ table: name: modelcatalog_configuration_parameter schema: public + - name: authors + using: + foreign_key_constraint_on: + column: configuration_id + table: + name: modelcatalog_configuration_author + schema: public + - name: categories + using: + foreign_key_constraint_on: + column: configuration_id + table: + name: modelcatalog_configuration_category + schema: public - name: causal_diagrams using: foreign_key_constraint_on: @@ -3149,19 +2879,19 @@ table: name: modelcatalog_configuration_region schema: public - - name: authors + - name: calibrated_variables using: foreign_key_constraint_on: column: configuration_id table: - name: modelcatalog_configuration_author + name: modelcatalog_configuration_calibrated_variable schema: public - - name: categories + - name: calibration_targets using: foreign_key_constraint_on: - column: model_configuration_id + column: configuration_id table: - name: modelcatalog_modelconfiguration_category + name: modelcatalog_configuration_calibration_target schema: public insert_permissions: - role: user @@ -3170,6 +2900,7 @@ columns: &id003 - id - software_version_id + - model_configuration_id - label - description - keywords @@ -3178,6 +2909,11 @@ - has_implementation_script_location - has_software_image - has_model_result_table + - has_region + - calibration_interval + - calibration_method + - parameter_assignment_method + - valid_until - author_id select_permissions: - role: anonymous @@ -3185,6 +2921,7 @@ columns: - id - software_version_id + - model_configuration_id - label - description - keywords @@ -3193,6 +2930,11 @@ - has_implementation_script_location - has_software_image - has_model_result_table + - has_region + - calibration_interval + - calibration_method + - parameter_assignment_method + - valid_until - author_id filter: {} - role: user @@ -3210,144 +2952,20 @@ permission: filter: {} - table: - name: modelcatalog_model_configuration_setup + name: modelcatalog_dataset_specification schema: public - object_relationships: - - name: model_configuration - using: - foreign_key_constraint_on: model_configuration_id - - name: author - using: - foreign_key_constraint_on: author_id array_relationships: - - name: executions + - name: model_ios using: foreign_key_constraint_on: - column: modelcatalog_setup_id + column: modelcatalog_dataset_specification_id table: - name: execution + name: model_io schema: public - - name: thread_models + - name: configuration_inputs using: foreign_key_constraint_on: - column: modelcatalog_setup_id - table: - name: thread_model - schema: public - - name: inputs - using: - foreign_key_constraint_on: - column: setup_id - table: - name: modelcatalog_setup_input - schema: public - - name: outputs - using: - foreign_key_constraint_on: - column: setup_id - table: - name: modelcatalog_setup_output - schema: public - - name: parameters - using: - foreign_key_constraint_on: - column: setup_id - table: - name: modelcatalog_setup_parameter - schema: public - - name: authors - using: - foreign_key_constraint_on: - column: setup_id - table: - name: modelcatalog_setup_author - schema: public - - name: calibrated_variables - using: - foreign_key_constraint_on: - column: setup_id - table: - name: modelcatalog_setup_calibrated_variable - schema: public - - name: calibration_targets - using: - foreign_key_constraint_on: - column: setup_id - table: - name: modelcatalog_setup_calibration_target - schema: public - - name: categories - using: - foreign_key_constraint_on: - column: model_configuration_setup_id - table: - name: modelcatalog_modelconfigurationsetup_category - schema: public - insert_permissions: - - role: user - permission: - check: {} - columns: &id004 - - id - - model_configuration_id - - label - - description - - has_component_location - - has_implementation_script_location - - has_software_image - - has_region - - author_id - - calibration_interval - - calibration_method - - parameter_assignment_method - - valid_until - select_permissions: - - role: anonymous - permission: - columns: - - id - - model_configuration_id - - label - - description - - has_component_location - - has_implementation_script_location - - has_software_image - - has_region - - author_id - - calibration_interval - - calibration_method - - parameter_assignment_method - - valid_until - filter: {} - - role: user - permission: - columns: *id004 - filter: {} - update_permissions: - - role: user - permission: - columns: *id004 - filter: {} - check: null - delete_permissions: - - role: user - permission: - filter: {} -- table: - name: modelcatalog_dataset_specification - schema: public - array_relationships: - - name: model_ios - using: - foreign_key_constraint_on: - column: modelcatalog_dataset_specification_id - table: - name: model_io - schema: public - - name: configuration_inputs - using: - foreign_key_constraint_on: - column: input_id + column: input_id table: name: modelcatalog_configuration_input schema: public @@ -3358,20 +2976,6 @@ table: name: modelcatalog_configuration_output schema: public - - name: setup_inputs - using: - foreign_key_constraint_on: - column: input_id - table: - name: modelcatalog_setup_input - schema: public - - name: setup_outputs - using: - foreign_key_constraint_on: - column: output_id - table: - name: modelcatalog_setup_output - schema: public - name: presentations using: foreign_key_constraint_on: @@ -3440,13 +3044,6 @@ table: name: modelcatalog_configuration_parameter schema: public - - name: setup_parameters - using: - foreign_key_constraint_on: - column: parameter_id - table: - name: modelcatalog_setup_parameter - schema: public - name: interventions using: foreign_key_constraint_on: @@ -3603,102 +3200,6 @@ - role: user permission: filter: {} -- table: - name: modelcatalog_setup_input - schema: public - object_relationships: - - name: setup - using: - foreign_key_constraint_on: setup_id - - name: input - using: - foreign_key_constraint_on: input_id - insert_permissions: - - role: user - permission: - check: {} - columns: &id010 - - setup_id - - input_id - select_permissions: - - role: anonymous - permission: - columns: - - setup_id - - input_id - filter: {} - - role: user - permission: - columns: *id010 - filter: {} - delete_permissions: - - role: user - permission: - filter: {} -- table: - name: modelcatalog_setup_output - schema: public - object_relationships: - - name: setup - using: - foreign_key_constraint_on: setup_id - - name: output - using: - foreign_key_constraint_on: output_id - insert_permissions: - - role: user - permission: - check: {} - columns: &id011 - - setup_id - - output_id - select_permissions: - - role: anonymous - permission: - columns: - - setup_id - - output_id - filter: {} - - role: user - permission: - columns: *id011 - filter: {} - delete_permissions: - - role: user - permission: - filter: {} -- table: - name: modelcatalog_setup_parameter - schema: public - object_relationships: - - name: setup - using: - foreign_key_constraint_on: setup_id - - name: parameter - using: - foreign_key_constraint_on: parameter_id - insert_permissions: - - role: user - permission: - check: {} - columns: &id012 - - setup_id - - parameter_id - select_permissions: - - role: anonymous - permission: - columns: - - setup_id - - parameter_id - filter: {} - - role: user - permission: - columns: *id012 - filter: {} - delete_permissions: - - role: user - permission: - filter: {} - table: name: modelcatalog_person schema: public @@ -3722,14 +3223,7 @@ foreign_key_constraint_on: column: author_id table: - name: modelcatalog_model_configuration - schema: public - - name: authored_setups - using: - foreign_key_constraint_on: - column: author_id - table: - name: modelcatalog_model_configuration_setup + name: modelcatalog_configuration schema: public - name: software_authors using: @@ -3752,13 +3246,6 @@ table: name: modelcatalog_configuration_author schema: public - - name: setup_authors - using: - foreign_key_constraint_on: - column: person_id - table: - name: modelcatalog_setup_author - schema: public insert_permissions: - role: user permission: @@ -3823,14 +3310,7 @@ foreign_key_constraint_on: column: category_id table: - name: modelcatalog_modelconfiguration_category - schema: public - - name: configuration_setup_items - using: - foreign_key_constraint_on: - column: category_id - table: - name: modelcatalog_modelconfigurationsetup_category + name: modelcatalog_configuration_category schema: public insert_permissions: - role: user @@ -4192,14 +3672,14 @@ foreign_key_constraint_on: column: variable_id table: - name: modelcatalog_setup_calibrated_variable + name: modelcatalog_configuration_calibrated_variable schema: public - name: calibration_target_in using: foreign_key_constraint_on: column: variable_id table: - name: modelcatalog_setup_calibration_target + name: modelcatalog_configuration_calibration_target schema: public object_relationships: - name: standard_variable @@ -4627,44 +4107,12 @@ permission: filter: {} - table: - name: modelcatalog_setup_author - schema: public - object_relationships: - - name: setup - using: - foreign_key_constraint_on: setup_id - - name: person - using: - foreign_key_constraint_on: person_id - insert_permissions: - - role: user - permission: - check: {} - columns: &id032 - - setup_id - - person_id - select_permissions: - - role: anonymous - permission: - columns: - - setup_id - - person_id - filter: {} - - role: user - permission: - columns: *id032 - filter: {} - delete_permissions: - - role: user - permission: - filter: {} -- table: - name: modelcatalog_setup_calibrated_variable + name: modelcatalog_configuration_calibrated_variable schema: public object_relationships: - - name: setup + - name: configuration using: - foreign_key_constraint_on: setup_id + foreign_key_constraint_on: configuration_id - name: variable using: foreign_key_constraint_on: variable_id @@ -4672,31 +4120,31 @@ - role: user permission: check: {} - columns: &id033 - - setup_id + columns: &id032 + - configuration_id - variable_id select_permissions: - role: anonymous permission: columns: - - setup_id + - configuration_id - variable_id filter: {} - role: user permission: - columns: *id033 + columns: *id032 filter: {} delete_permissions: - role: user permission: filter: {} - table: - name: modelcatalog_setup_calibration_target + name: modelcatalog_configuration_calibration_target schema: public object_relationships: - - name: setup + - name: configuration using: - foreign_key_constraint_on: setup_id + foreign_key_constraint_on: configuration_id - name: variable using: foreign_key_constraint_on: variable_id @@ -4704,19 +4152,19 @@ - role: user permission: check: {} - columns: &id034 - - setup_id + columns: &id033 + - configuration_id - variable_id select_permissions: - role: anonymous permission: columns: - - setup_id + - configuration_id - variable_id filter: {} - role: user permission: - columns: *id034 + columns: *id033 filter: {} delete_permissions: - role: user @@ -4914,12 +4362,12 @@ permission: filter: {} - table: - name: modelcatalog_modelconfiguration_category + name: modelcatalog_configuration_category schema: public object_relationships: - - name: model_configuration + - name: configuration using: - foreign_key_constraint_on: model_configuration_id + foreign_key_constraint_on: configuration_id - name: category using: foreign_key_constraint_on: category_id @@ -4928,13 +4376,13 @@ permission: check: {} columns: &id041 - - model_configuration_id + - configuration_id - category_id select_permissions: - role: anonymous permission: columns: - - model_configuration_id + - configuration_id - category_id filter: {} - role: user @@ -4945,38 +4393,6 @@ - role: user permission: filter: {} -- table: - name: modelcatalog_modelconfigurationsetup_category - schema: public - object_relationships: - - name: model_configuration_setup - using: - foreign_key_constraint_on: model_configuration_setup_id - - name: category - using: - foreign_key_constraint_on: category_id - insert_permissions: - - role: user - permission: - check: {} - columns: &id042 - - model_configuration_setup_id - - category_id - select_permissions: - - role: anonymous - permission: - columns: - - model_configuration_setup_id - - category_id - filter: {} - - role: user - permission: - columns: *id042 - filter: {} - delete_permissions: - - role: user - permission: - filter: {} - table: name: modelcatalog_dataset_specification_presentation schema: public diff --git a/migrations/1771200010000_merge_configuration_tables/down.sql b/migrations/1771200010000_merge_configuration_tables/down.sql new file mode 100644 index 0000000..16a4b30 --- /dev/null +++ b/migrations/1771200010000_merge_configuration_tables/down.sql @@ -0,0 +1,82 @@ +BEGIN; + +-- ============================================================================ +-- Reverse migration: Recreate the two original tables and copy data back, +-- then drop modelcatalog_configuration. +-- ============================================================================ + +-- STEP 1: Recreate modelcatalog_model_configuration +CREATE TABLE modelcatalog_model_configuration ( + id TEXT PRIMARY KEY, + software_version_id TEXT REFERENCES modelcatalog_software_version(id) ON DELETE CASCADE, + label TEXT NOT NULL, + description TEXT, + keywords TEXT, + usage_notes TEXT, + has_component_location TEXT, + has_implementation_script_location TEXT, + has_software_image TEXT, + has_model_result_table TEXT, + author_id TEXT REFERENCES modelcatalog_person(id) ON DELETE SET NULL +); + +-- STEP 2: Recreate modelcatalog_model_configuration_setup +CREATE TABLE modelcatalog_model_configuration_setup ( + id TEXT PRIMARY KEY, + model_configuration_id TEXT REFERENCES modelcatalog_model_configuration(id) ON DELETE CASCADE, + label TEXT NOT NULL, + description TEXT, + has_component_location TEXT, + has_implementation_script_location TEXT, + has_software_image TEXT, + has_region TEXT, + author_id TEXT REFERENCES modelcatalog_person(id) ON DELETE SET NULL, + calibration_interval TEXT, + calibration_method TEXT, + parameter_assignment_method TEXT, + valid_until TEXT +); + +-- STEP 3: Copy Configuration rows back (model_configuration_id IS NULL) +INSERT INTO modelcatalog_model_configuration ( + id, software_version_id, label, description, keywords, usage_notes, + has_component_location, has_implementation_script_location, + has_software_image, has_model_result_table, author_id +) +SELECT + id, software_version_id, label, description, keywords, usage_notes, + has_component_location, has_implementation_script_location, + has_software_image, has_model_result_table, author_id +FROM modelcatalog_configuration +WHERE model_configuration_id IS NULL; + +-- STEP 4: Copy Setup rows back (model_configuration_id IS NOT NULL) +INSERT INTO modelcatalog_model_configuration_setup ( + id, model_configuration_id, label, description, + has_component_location, has_implementation_script_location, + has_software_image, has_region, author_id, + calibration_interval, calibration_method, + parameter_assignment_method, valid_until +) +SELECT + id, model_configuration_id, label, description, + has_component_location, has_implementation_script_location, + has_software_image, has_region, author_id, + calibration_interval, calibration_method, + parameter_assignment_method, valid_until +FROM modelcatalog_configuration +WHERE model_configuration_id IS NOT NULL; + +-- STEP 5: Drop unified table and indexes +DROP INDEX IF EXISTS idx_mc_config_sv; +DROP INDEX IF EXISTS idx_mc_config_parent; +DROP INDEX IF EXISTS idx_mc_config_author; +DROP TABLE modelcatalog_configuration; + +-- STEP 6: Recreate original indexes +CREATE INDEX idx_mc_cfg_version ON modelcatalog_model_configuration(software_version_id); +CREATE INDEX idx_mc_setup_config ON modelcatalog_model_configuration_setup(model_configuration_id); +CREATE INDEX idx_mc_config_author ON modelcatalog_model_configuration(author_id); +CREATE INDEX idx_mc_setup_author ON modelcatalog_model_configuration_setup(author_id); + +COMMIT; diff --git a/migrations/1771200010000_merge_configuration_tables/up.sql b/migrations/1771200010000_merge_configuration_tables/up.sql new file mode 100644 index 0000000..a7c7bbe --- /dev/null +++ b/migrations/1771200010000_merge_configuration_tables/up.sql @@ -0,0 +1,112 @@ +BEGIN; + +-- ============================================================================ +-- Migration: Merge modelcatalog_model_configuration and +-- modelcatalog_model_configuration_setup into a single modelcatalog_configuration +-- table. Configuration rows have model_configuration_id IS NULL; Setup rows +-- have model_configuration_id populated (self-FK pointing to their parent +-- Configuration). +-- ============================================================================ + +-- STEP 1: Create the unified modelcatalog_configuration table +-- Column set is a superset of both old tables. +-- model_configuration_id is the self-FK that distinguishes Setup rows (non-NULL) +-- from Configuration rows (NULL). +CREATE TABLE modelcatalog_configuration ( + id TEXT PRIMARY KEY, + software_version_id TEXT REFERENCES modelcatalog_software_version(id) ON DELETE CASCADE, + model_configuration_id TEXT REFERENCES modelcatalog_configuration(id) ON DELETE CASCADE, + label TEXT NOT NULL, + description TEXT, + keywords TEXT, + usage_notes TEXT, + has_component_location TEXT, + has_implementation_script_location TEXT, + has_software_image TEXT, + has_model_result_table TEXT, + has_region TEXT, + calibration_interval TEXT, + calibration_method TEXT, + parameter_assignment_method TEXT, + valid_until TEXT, + author_id TEXT REFERENCES modelcatalog_person(id) ON DELETE SET NULL +); + +-- STEP 2: Insert Configuration rows (model_configuration_id = NULL) +-- Columns present in modelcatalog_model_configuration: +-- id, software_version_id, label, description, keywords, usage_notes, +-- has_component_location, has_implementation_script_location, has_software_image, +-- has_model_result_table, author_id +INSERT INTO modelcatalog_configuration ( + id, + software_version_id, + model_configuration_id, + label, + description, + keywords, + usage_notes, + has_component_location, + has_implementation_script_location, + has_software_image, + has_model_result_table, + author_id +) +SELECT + id, + software_version_id, + NULL, + label, + description, + keywords, + usage_notes, + has_component_location, + has_implementation_script_location, + has_software_image, + has_model_result_table, + author_id +FROM modelcatalog_model_configuration; + +-- STEP 3: Insert Setup rows (model_configuration_id = non-NULL self-FK) +-- Columns present in modelcatalog_model_configuration_setup: +-- id, model_configuration_id, label, description, has_component_location, +-- has_implementation_script_location, has_software_image, has_region, +-- author_id, calibration_interval, calibration_method, +-- parameter_assignment_method, valid_until +INSERT INTO modelcatalog_configuration ( + id, + model_configuration_id, + label, + description, + has_component_location, + has_implementation_script_location, + has_software_image, + has_region, + author_id, + calibration_interval, + calibration_method, + parameter_assignment_method, + valid_until +) +SELECT + id, + model_configuration_id, + label, + description, + has_component_location, + has_implementation_script_location, + has_software_image, + has_region, + author_id, + calibration_interval, + calibration_method, + parameter_assignment_method, + valid_until +FROM modelcatalog_model_configuration_setup; + +-- STEP 4: Create indexes on FK columns +-- Use unique names to avoid collision with existing indexes on old tables +CREATE INDEX idx_mc_configuration_sv ON modelcatalog_configuration(software_version_id); +CREATE INDEX idx_mc_configuration_parent ON modelcatalog_configuration(model_configuration_id); +CREATE INDEX idx_mc_configuration_author ON modelcatalog_configuration(author_id); + +COMMIT; diff --git a/migrations/1771200011000_merge_junction_tables/down.sql b/migrations/1771200011000_merge_junction_tables/down.sql new file mode 100644 index 0000000..72a664b --- /dev/null +++ b/migrations/1771200011000_merge_junction_tables/down.sql @@ -0,0 +1,210 @@ +BEGIN; + +-- ============================================================================ +-- Reverse migration: Restore setup-side junction tables, re-FK configuration-side +-- junctions back to modelcatalog_model_configuration, and recreate old entity tables. +-- NOTE: This down migration assumes migration 1771200010000_merge_configuration_tables/down.sql +-- has already been run to restore modelcatalog_model_configuration and +-- modelcatalog_model_configuration_setup tables. +-- ============================================================================ + +-- SECTION 5 (reverse): Recreate old entity tables if not already done by 10000 down +-- (These tables would have been recreated by migration 10000 down.sql) + +-- SECTION 4 (reverse): Rename configuration_* back to setup_* + +-- 4b. modelcatalog_configuration_calibration_target -> modelcatalog_setup_calibration_target +ALTER TABLE modelcatalog_configuration_calibration_target + DROP CONSTRAINT modelcatalog_configuration_calibration_target_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_calibration_target + ADD CONSTRAINT modelcatalog_setup_calibration_target_setup_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_model_configuration_setup(id) ON DELETE CASCADE; + +ALTER TABLE modelcatalog_configuration_calibration_target + RENAME COLUMN configuration_id TO setup_id; + +ALTER TABLE modelcatalog_configuration_calibration_target + RENAME TO modelcatalog_setup_calibration_target; + +-- 4a. modelcatalog_configuration_calibrated_variable -> modelcatalog_setup_calibrated_variable +ALTER TABLE modelcatalog_configuration_calibrated_variable + DROP CONSTRAINT modelcatalog_configuration_calibrated_variable_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_calibrated_variable + ADD CONSTRAINT modelcatalog_setup_calibrated_variable_setup_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_model_configuration_setup(id) ON DELETE CASCADE; + +ALTER TABLE modelcatalog_configuration_calibrated_variable + RENAME COLUMN configuration_id TO setup_id; + +ALTER TABLE modelcatalog_configuration_calibrated_variable + RENAME TO modelcatalog_setup_calibrated_variable; + +-- SECTION 3 (reverse): Re-FK configuration-only junctions back to modelcatalog_model_configuration + +ALTER TABLE modelcatalog_configuration_region + DROP CONSTRAINT modelcatalog_configuration_region_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_region + ADD CONSTRAINT modelcatalog_configuration_region_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_model_configuration(id) ON DELETE CASCADE; + +ALTER TABLE modelcatalog_configuration_time_interval + DROP CONSTRAINT modelcatalog_configuration_time_interval_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_time_interval + ADD CONSTRAINT modelcatalog_configuration_time_interval_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_model_configuration(id) ON DELETE CASCADE; + +ALTER TABLE modelcatalog_configuration_causal_diagram + DROP CONSTRAINT modelcatalog_configuration_causal_diagram_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_causal_diagram + ADD CONSTRAINT modelcatalog_configuration_causal_diagram_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_model_configuration(id) ON DELETE CASCADE; + +-- SECTION 2 (reverse): Restore category junctions + +CREATE TABLE modelcatalog_modelconfiguration_category ( + model_configuration_id TEXT NOT NULL REFERENCES modelcatalog_model_configuration(id) ON DELETE CASCADE, + category_id TEXT NOT NULL REFERENCES modelcatalog_model_category(id) ON DELETE CASCADE, + PRIMARY KEY (model_configuration_id, category_id) +); + +CREATE TABLE modelcatalog_modelconfigurationsetup_category ( + model_configuration_setup_id TEXT NOT NULL REFERENCES modelcatalog_model_configuration_setup(id) ON DELETE CASCADE, + category_id TEXT NOT NULL REFERENCES modelcatalog_model_category(id) ON DELETE CASCADE, + PRIMARY KEY (model_configuration_setup_id, category_id) +); + +-- Restore from merged table (config rows have NULL model_configuration_id, setup rows do not) +INSERT INTO modelcatalog_modelconfiguration_category (model_configuration_id, category_id) +SELECT mc.id, cc.category_id +FROM modelcatalog_configuration_category cc +JOIN modelcatalog_configuration mc ON mc.id = cc.configuration_id +WHERE mc.model_configuration_id IS NULL +ON CONFLICT DO NOTHING; + +INSERT INTO modelcatalog_modelconfigurationsetup_category (model_configuration_setup_id, category_id) +SELECT mc.id, cc.category_id +FROM modelcatalog_configuration_category cc +JOIN modelcatalog_configuration mc ON mc.id = cc.configuration_id +WHERE mc.model_configuration_id IS NOT NULL +ON CONFLICT DO NOTHING; + +DROP INDEX IF EXISTS idx_mc_config_cat_cfg; +DROP INDEX IF EXISTS idx_mc_config_cat_cat; +DROP TABLE modelcatalog_configuration_category; + +-- SECTION 1 (reverse): Restore setup-side junctions and re-FK configuration-side back + +-- 1d. Restore modelcatalog_setup_author +CREATE TABLE modelcatalog_setup_author ( + setup_id TEXT REFERENCES modelcatalog_model_configuration_setup(id) ON DELETE CASCADE, + person_id TEXT REFERENCES modelcatalog_person(id) ON DELETE CASCADE, + PRIMARY KEY (setup_id, person_id) +); + +INSERT INTO modelcatalog_setup_author (setup_id, person_id) +SELECT ca.configuration_id, ca.person_id +FROM modelcatalog_configuration_author ca +JOIN modelcatalog_configuration mc ON mc.id = ca.configuration_id +WHERE mc.model_configuration_id IS NOT NULL +ON CONFLICT DO NOTHING; + +ALTER TABLE modelcatalog_configuration_author + DROP CONSTRAINT modelcatalog_configuration_author_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_author + ADD CONSTRAINT modelcatalog_configuration_author_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_model_configuration(id) ON DELETE CASCADE; + +DELETE FROM modelcatalog_configuration_author ca +WHERE EXISTS ( + SELECT 1 FROM modelcatalog_configuration mc + WHERE mc.id = ca.configuration_id AND mc.model_configuration_id IS NOT NULL +); + +-- 1c. Restore modelcatalog_setup_parameter +CREATE TABLE modelcatalog_setup_parameter ( + setup_id TEXT REFERENCES modelcatalog_model_configuration_setup(id) ON DELETE CASCADE, + parameter_id TEXT REFERENCES modelcatalog_parameter(id) ON DELETE CASCADE, + PRIMARY KEY (setup_id, parameter_id) +); + +INSERT INTO modelcatalog_setup_parameter (setup_id, parameter_id) +SELECT cp.configuration_id, cp.parameter_id +FROM modelcatalog_configuration_parameter cp +JOIN modelcatalog_configuration mc ON mc.id = cp.configuration_id +WHERE mc.model_configuration_id IS NOT NULL +ON CONFLICT DO NOTHING; + +ALTER TABLE modelcatalog_configuration_parameter + DROP CONSTRAINT modelcatalog_configuration_parameter_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_parameter + ADD CONSTRAINT modelcatalog_configuration_parameter_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_model_configuration(id) ON DELETE CASCADE; + +DELETE FROM modelcatalog_configuration_parameter cp +WHERE EXISTS ( + SELECT 1 FROM modelcatalog_configuration mc + WHERE mc.id = cp.configuration_id AND mc.model_configuration_id IS NOT NULL +); + +-- 1b. Restore modelcatalog_setup_output +CREATE TABLE modelcatalog_setup_output ( + setup_id TEXT REFERENCES modelcatalog_model_configuration_setup(id) ON DELETE CASCADE, + output_id TEXT REFERENCES modelcatalog_dataset_specification(id) ON DELETE CASCADE, + PRIMARY KEY (setup_id, output_id) +); + +INSERT INTO modelcatalog_setup_output (setup_id, output_id) +SELECT co.configuration_id, co.output_id +FROM modelcatalog_configuration_output co +JOIN modelcatalog_configuration mc ON mc.id = co.configuration_id +WHERE mc.model_configuration_id IS NOT NULL +ON CONFLICT DO NOTHING; + +ALTER TABLE modelcatalog_configuration_output + DROP CONSTRAINT modelcatalog_configuration_output_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_output + ADD CONSTRAINT modelcatalog_configuration_output_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_model_configuration(id) ON DELETE CASCADE; + +DELETE FROM modelcatalog_configuration_output co +WHERE EXISTS ( + SELECT 1 FROM modelcatalog_configuration mc + WHERE mc.id = co.configuration_id AND mc.model_configuration_id IS NOT NULL +); + +-- 1a. Restore modelcatalog_setup_input +CREATE TABLE modelcatalog_setup_input ( + setup_id TEXT REFERENCES modelcatalog_model_configuration_setup(id) ON DELETE CASCADE, + input_id TEXT REFERENCES modelcatalog_dataset_specification(id) ON DELETE CASCADE, + PRIMARY KEY (setup_id, input_id) +); + +INSERT INTO modelcatalog_setup_input (setup_id, input_id) +SELECT ci.configuration_id, ci.input_id +FROM modelcatalog_configuration_input ci +JOIN modelcatalog_configuration mc ON mc.id = ci.configuration_id +WHERE mc.model_configuration_id IS NOT NULL +ON CONFLICT DO NOTHING; + +ALTER TABLE modelcatalog_configuration_input + DROP CONSTRAINT modelcatalog_configuration_input_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_input + ADD CONSTRAINT modelcatalog_configuration_input_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_model_configuration(id) ON DELETE CASCADE; + +DELETE FROM modelcatalog_configuration_input ci +WHERE EXISTS ( + SELECT 1 FROM modelcatalog_configuration mc + WHERE mc.id = ci.configuration_id AND mc.model_configuration_id IS NOT NULL +); + +COMMIT; diff --git a/migrations/1771200011000_merge_junction_tables/up.sql b/migrations/1771200011000_merge_junction_tables/up.sql new file mode 100644 index 0000000..31b5dbb --- /dev/null +++ b/migrations/1771200011000_merge_junction_tables/up.sql @@ -0,0 +1,200 @@ +BEGIN; + +-- ============================================================================ +-- Migration: Consolidate all junction tables to reference modelcatalog_configuration +-- instead of the old modelcatalog_model_configuration / +-- modelcatalog_model_configuration_setup tables. Merge setup-side junctions +-- into the corresponding configuration-side junctions, rename setup-only +-- junctions, and drop all old entity tables and their junctions. +-- ============================================================================ + +-- ============================================================================ +-- SECTION 1: Overlapping junctions — re-FK + merge setup rows + drop setup table +-- ============================================================================ + +-- 1a. modelcatalog_configuration_input +-- Old FK: configuration_id -> modelcatalog_model_configuration(id) +-- New FK: configuration_id -> modelcatalog_configuration(id) + +ALTER TABLE modelcatalog_configuration_input + DROP CONSTRAINT modelcatalog_configuration_input_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_input + ADD CONSTRAINT modelcatalog_configuration_input_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_configuration(id) ON DELETE CASCADE; + +INSERT INTO modelcatalog_configuration_input (configuration_id, input_id) +SELECT setup_id, input_id FROM modelcatalog_setup_input +ON CONFLICT DO NOTHING; + +DROP TABLE modelcatalog_setup_input; + +-- 1b. modelcatalog_configuration_output +-- Old FK: configuration_id -> modelcatalog_model_configuration(id) +-- New FK: configuration_id -> modelcatalog_configuration(id) + +ALTER TABLE modelcatalog_configuration_output + DROP CONSTRAINT modelcatalog_configuration_output_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_output + ADD CONSTRAINT modelcatalog_configuration_output_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_configuration(id) ON DELETE CASCADE; + +INSERT INTO modelcatalog_configuration_output (configuration_id, output_id) +SELECT setup_id, output_id FROM modelcatalog_setup_output +ON CONFLICT DO NOTHING; + +DROP TABLE modelcatalog_setup_output; + +-- 1c. modelcatalog_configuration_parameter +-- Old FK: configuration_id -> modelcatalog_model_configuration(id) +-- New FK: configuration_id -> modelcatalog_configuration(id) + +ALTER TABLE modelcatalog_configuration_parameter + DROP CONSTRAINT modelcatalog_configuration_parameter_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_parameter + ADD CONSTRAINT modelcatalog_configuration_parameter_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_configuration(id) ON DELETE CASCADE; + +INSERT INTO modelcatalog_configuration_parameter (configuration_id, parameter_id) +SELECT setup_id, parameter_id FROM modelcatalog_setup_parameter +ON CONFLICT DO NOTHING; + +DROP TABLE modelcatalog_setup_parameter; + +-- 1d. modelcatalog_configuration_author +-- Old FK: configuration_id -> modelcatalog_model_configuration(id) +-- New FK: configuration_id -> modelcatalog_configuration(id) + +ALTER TABLE modelcatalog_configuration_author + DROP CONSTRAINT modelcatalog_configuration_author_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_author + ADD CONSTRAINT modelcatalog_configuration_author_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_configuration(id) ON DELETE CASCADE; + +INSERT INTO modelcatalog_configuration_author (configuration_id, person_id) +SELECT setup_id, person_id FROM modelcatalog_setup_author +ON CONFLICT DO NOTHING; + +DROP TABLE modelcatalog_setup_author; + +-- ============================================================================ +-- SECTION 2: Category junctions — create merged table, migrate data, drop old tables +-- ============================================================================ + +-- The old tables used non-standard FK column names: +-- modelcatalog_modelconfiguration_category: model_configuration_id -> modelcatalog_model_configuration +-- modelcatalog_modelconfigurationsetup_category: model_configuration_setup_id -> modelcatalog_model_configuration_setup +-- New table uses standard: configuration_id -> modelcatalog_configuration + +CREATE TABLE modelcatalog_configuration_category ( + configuration_id TEXT REFERENCES modelcatalog_configuration(id) ON DELETE CASCADE, + category_id TEXT REFERENCES modelcatalog_model_category(id) ON DELETE CASCADE, + PRIMARY KEY (configuration_id, category_id) +); + +INSERT INTO modelcatalog_configuration_category (configuration_id, category_id) +SELECT model_configuration_id, category_id +FROM modelcatalog_modelconfiguration_category +ON CONFLICT DO NOTHING; + +INSERT INTO modelcatalog_configuration_category (configuration_id, category_id) +SELECT model_configuration_setup_id, category_id +FROM modelcatalog_modelconfigurationsetup_category +ON CONFLICT DO NOTHING; + +DROP TABLE modelcatalog_modelconfiguration_category; +DROP TABLE modelcatalog_modelconfigurationsetup_category; + +CREATE INDEX idx_mc_config_cat_cfg ON modelcatalog_configuration_category(configuration_id); +CREATE INDEX idx_mc_config_cat_cat ON modelcatalog_configuration_category(category_id); + +-- ============================================================================ +-- SECTION 3: Configuration-only junctions — re-FK to modelcatalog_configuration +-- ============================================================================ + +-- 3a. modelcatalog_configuration_causal_diagram +-- Old FK: configuration_id -> modelcatalog_model_configuration(id) +-- New FK: configuration_id -> modelcatalog_configuration(id) + +ALTER TABLE modelcatalog_configuration_causal_diagram + DROP CONSTRAINT modelcatalog_configuration_causal_diagram_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_causal_diagram + ADD CONSTRAINT modelcatalog_configuration_causal_diagram_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_configuration(id) ON DELETE CASCADE; + +-- 3b. modelcatalog_configuration_time_interval +-- Old FK: configuration_id -> modelcatalog_model_configuration(id) +-- New FK: configuration_id -> modelcatalog_configuration(id) + +ALTER TABLE modelcatalog_configuration_time_interval + DROP CONSTRAINT modelcatalog_configuration_time_interval_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_time_interval + ADD CONSTRAINT modelcatalog_configuration_time_interval_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_configuration(id) ON DELETE CASCADE; + +-- 3c. modelcatalog_configuration_region +-- Old FK: configuration_id -> modelcatalog_model_configuration(id) +-- New FK: configuration_id -> modelcatalog_configuration(id) + +ALTER TABLE modelcatalog_configuration_region + DROP CONSTRAINT modelcatalog_configuration_region_configuration_id_fkey; + +ALTER TABLE modelcatalog_configuration_region + ADD CONSTRAINT modelcatalog_configuration_region_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_configuration(id) ON DELETE CASCADE; + +-- ============================================================================ +-- SECTION 4: Setup-only junctions — rename to configuration_* and re-FK +-- ============================================================================ + +-- 4a. modelcatalog_setup_calibrated_variable -> modelcatalog_configuration_calibrated_variable +ALTER TABLE modelcatalog_setup_calibrated_variable + RENAME TO modelcatalog_configuration_calibrated_variable; + +ALTER TABLE modelcatalog_configuration_calibrated_variable + RENAME COLUMN setup_id TO configuration_id; + +ALTER TABLE modelcatalog_configuration_calibrated_variable + DROP CONSTRAINT modelcatalog_setup_calibrated_variable_setup_id_fkey; + +ALTER TABLE modelcatalog_configuration_calibrated_variable + ADD CONSTRAINT modelcatalog_configuration_calibrated_variable_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_configuration(id) ON DELETE CASCADE; + +-- 4b. modelcatalog_setup_calibration_target -> modelcatalog_configuration_calibration_target +ALTER TABLE modelcatalog_setup_calibration_target + RENAME TO modelcatalog_configuration_calibration_target; + +ALTER TABLE modelcatalog_configuration_calibration_target + RENAME COLUMN setup_id TO configuration_id; + +ALTER TABLE modelcatalog_configuration_calibration_target + DROP CONSTRAINT modelcatalog_setup_calibration_target_setup_id_fkey; + +ALTER TABLE modelcatalog_configuration_calibration_target + ADD CONSTRAINT modelcatalog_configuration_calibration_target_configuration_id_fkey + FOREIGN KEY (configuration_id) REFERENCES modelcatalog_configuration(id) ON DELETE CASCADE; + +-- ============================================================================ +-- SECTION 5: Drop old entity tables (data already migrated in migration 10000) +-- ============================================================================ + +-- Drop FK constraints from execution and thread_model that reference the old tables +-- (these will be re-added pointing to modelcatalog_configuration in migration 12000) +ALTER TABLE execution DROP CONSTRAINT IF EXISTS execution_modelcatalog_setup_id_fkey; +ALTER TABLE execution DROP CONSTRAINT IF EXISTS execution_modelcatalog_configuration_id_fkey; +ALTER TABLE thread_model DROP CONSTRAINT IF EXISTS thread_model_modelcatalog_setup_id_fkey; +ALTER TABLE thread_model DROP CONSTRAINT IF EXISTS thread_model_modelcatalog_configuration_id_fkey; + +-- Drop modelcatalog_model_configuration_setup first +DROP TABLE modelcatalog_model_configuration_setup; + +-- Drop modelcatalog_model_configuration (setup table gone, no remaining dependents) +DROP TABLE modelcatalog_model_configuration; + +COMMIT; diff --git a/migrations/1771200012000_thread_model_migration/down.sql b/migrations/1771200012000_thread_model_migration/down.sql new file mode 100644 index 0000000..7d0de84 --- /dev/null +++ b/migrations/1771200012000_thread_model_migration/down.sql @@ -0,0 +1,4 @@ +-- Irreversible: data migration cannot be undone without backup. +-- The public.model table and its dependents (model_input, model_output, model_parameter) +-- have been dropped, and modelcatalog_setup_id columns have been removed from +-- thread_model and execution. These changes require a database restore to reverse. diff --git a/migrations/1771200012000_thread_model_migration/up.sql b/migrations/1771200012000_thread_model_migration/up.sql new file mode 100644 index 0000000..0eec8da --- /dev/null +++ b/migrations/1771200012000_thread_model_migration/up.sql @@ -0,0 +1,109 @@ +BEGIN; + +-- ============================================================================ +-- Migration: Backfill thread_model.modelcatalog_configuration_id and +-- execution.modelcatalog_configuration_id, consolidate modelcatalog_setup_id +-- into modelcatalog_configuration_id, add proper FK constraints to the unified +-- table, drop the modelcatalog_setup_id columns, and drop the old public.model +-- table and its dependents. +-- ============================================================================ + +-- ============================================================================ +-- SECTION 1: Drop stale FK constraints on thread_model and execution +-- The FK constraints added by migration 1771200000000 referenced the old tables +-- (modelcatalog_model_configuration and modelcatalog_model_configuration_setup) +-- which no longer exist after migration 1771200011000. If those FKs were not +-- automatically dropped via CASCADE, drop them explicitly here. +-- ============================================================================ + +-- Drop FK constraints that reference dropped tables (if they still exist) +ALTER TABLE thread_model + DROP CONSTRAINT IF EXISTS thread_model_modelcatalog_configuration_id_fkey; + +ALTER TABLE thread_model + DROP CONSTRAINT IF EXISTS thread_model_modelcatalog_setup_id_fkey; + +ALTER TABLE execution + DROP CONSTRAINT IF EXISTS execution_modelcatalog_configuration_id_fkey; + +ALTER TABLE execution + DROP CONSTRAINT IF EXISTS execution_modelcatalog_setup_id_fkey; + +-- ============================================================================ +-- SECTION 2: Backfill thread_model.modelcatalog_configuration_id from public.model +-- public.model.model_configuration column contains the modelcatalog URI that +-- maps to modelcatalog_configuration.id (previously modelcatalog_model_configuration.id) +-- ============================================================================ + +UPDATE thread_model tm +SET modelcatalog_configuration_id = m.model_configuration +FROM public.model m +WHERE m.id = tm.model_id + AND tm.modelcatalog_configuration_id IS NULL + AND tm.model_id IS NOT NULL; + +-- ============================================================================ +-- SECTION 3: Backfill execution.modelcatalog_configuration_id from public.model +-- ============================================================================ + +UPDATE execution e +SET modelcatalog_configuration_id = m.model_configuration +FROM public.model m +WHERE m.id = e.model_id + AND e.modelcatalog_configuration_id IS NULL + AND e.model_id IS NOT NULL; + +-- ============================================================================ +-- SECTION 4: Merge modelcatalog_setup_id into modelcatalog_configuration_id +-- Both config and setup rows now live in modelcatalog_configuration, so any +-- row that was linked via modelcatalog_setup_id should move to +-- modelcatalog_configuration_id. +-- ============================================================================ + +UPDATE thread_model +SET modelcatalog_configuration_id = modelcatalog_setup_id +WHERE modelcatalog_configuration_id IS NULL + AND modelcatalog_setup_id IS NOT NULL; + +UPDATE execution +SET modelcatalog_configuration_id = modelcatalog_setup_id +WHERE modelcatalog_configuration_id IS NULL + AND modelcatalog_setup_id IS NOT NULL; + +-- ============================================================================ +-- SECTION 5: Add FK constraints to modelcatalog_configuration (unified table) +-- ============================================================================ + +ALTER TABLE thread_model + ADD CONSTRAINT thread_model_mc_config_fk + FOREIGN KEY (modelcatalog_configuration_id) + REFERENCES modelcatalog_configuration(id) ON DELETE SET NULL; + +ALTER TABLE execution + ADD CONSTRAINT execution_mc_config_fk + FOREIGN KEY (modelcatalog_configuration_id) + REFERENCES modelcatalog_configuration(id) ON DELETE SET NULL; + +-- ============================================================================ +-- SECTION 6: Drop modelcatalog_setup_id columns (no longer needed) +-- ============================================================================ + +ALTER TABLE thread_model DROP COLUMN IF EXISTS modelcatalog_setup_id; +ALTER TABLE execution DROP COLUMN IF EXISTS modelcatalog_setup_id; + +-- Drop the now-orphaned indexes on setup_id (if they exist) +DROP INDEX IF EXISTS idx_thread_model_mc_setup; +DROP INDEX IF EXISTS idx_execution_mc_setup; + +-- ============================================================================ +-- SECTION 7: Drop public.model and its dependents +-- Dependent tables: model_input, model_output, model_parameter +-- model_io should NOT be dropped — thread_model_io still references it. +-- ============================================================================ + +DROP TABLE IF EXISTS model_input; +DROP TABLE IF EXISTS model_output; +DROP TABLE IF EXISTS model_parameter; +DROP TABLE public.model; + +COMMIT;