-- refresh-all-views.sql -- Materialized View Refresh Script with Validation and Error Handling -- -- Usage: -- psql -U postgres -d cia_dev -f service.data.impl/src/main/resources/refresh-all-views.sql -- -- Description: -- Refreshes all materialized views in correct dependency order with: -- - Validation that all views exist before attempting refresh -- - Error handling to continue on individual failures -- - Timing information for each view refresh -- - Progress logging and summary report \set ON_ERROR_STOP off \timing on \echo '=======================================' \echo 'Materialized View Refresh Script' \echo 'Started at:' `date` \echo '=======================================' -- =========================================================================== -- PHASE 1: VALIDATION - Check that all views exist -- =========================================================================== \echo '' \echo '--- VALIDATION PHASE ---' \echo 'Checking that all materialized views exist...' DO $$ DECLARE v_views TEXT[] := ARRAY[ 'view_worldbank_indicator_data_country_summary', 'view_riksdagen_politician_document', 'view_riksdagen_org_document_daily_summary', 'view_riksdagen_document_type_daily_summary', 'view_riksdagen_committee_decisions', 'view_riksdagen_vote_data_ballot_summary', 'view_riksdagen_vote_data_ballot_summary_daily', 'view_riksdagen_committee_ballot_decision_summary', 'view_riksdagen_vote_data_ballot_party_summary', 'view_riksdagen_vote_data_ballot_party_summary_daily', 'view_riksdagen_vote_data_ballot_party_summary_monthly', 'view_riksdagen_vote_data_ballot_party_summary_weekly', 'view_riksdagen_vote_data_ballot_party_summary_annual', 'view_riksdagen_vote_data_ballot_summary_annual', 'view_riksdagen_vote_data_ballot_summary_monthly', 'view_riksdagen_vote_data_ballot_summary_weekly', 'view_riksdagen_vote_data_ballot_politician_summary', 'view_riksdagen_vote_data_ballot_politician_summary_daily', 'view_riksdagen_vote_data_ballot_politician_summary_annual', 'view_riksdagen_vote_data_ballot_politician_summary_monthly', 'view_riksdagen_vote_data_ballot_politician_summary_weekly', 'view_riksdagen_committee_ballot_decision_party_summary', 'view_riksdagen_committee_ballot_decision_politician_summary', 'view_riksdagen_committee_decision_type_org_summary', 'view_riksdagen_committee_decision_type_summary', 'view_riksdagen_party_document_daily_summary', 'view_riksdagen_politician_document_daily_summary', 'view_riksdagen_politician_document_summary' ]; v_view TEXT; v_exists BOOLEAN; v_missing INT := 0; BEGIN FOREACH v_view IN ARRAY v_views LOOP SELECT EXISTS ( SELECT 1 FROM pg_matviews WHERE schemaname = 'public' AND matviewname = v_view ) INTO v_exists; IF NOT v_exists THEN RAISE WARNING 'Materialized view does not exist: %', v_view; v_missing := v_missing + 1; ELSE RAISE NOTICE '✓ View exists: %', v_view; END IF; END LOOP; IF v_missing > 0 THEN RAISE EXCEPTION 'Validation failed: % materialized views missing', v_missing; ELSE RAISE NOTICE 'Validation passed: All % views exist', array_length(v_views, 1); END IF; END $$; -- =========================================================================== -- PHASE 2: REFRESH - Refresh materialized views with error handling -- =========================================================================== \echo '' \echo '--- REFRESH PHASE ---' \echo 'Refreshing materialized views in dependency order...' \echo '' DO $$ DECLARE v_views TEXT[] := ARRAY[ -- TIER 1: Base materialized views (no dependencies on other materialized views) 'view_worldbank_indicator_data_country_summary', 'view_riksdagen_politician_document', 'view_riksdagen_org_document_daily_summary', 'view_riksdagen_document_type_daily_summary', 'view_riksdagen_committee_decisions', 'view_riksdagen_vote_data_ballot_summary', 'view_riksdagen_committee_ballot_decision_summary', 'view_riksdagen_vote_data_ballot_party_summary', 'view_riksdagen_vote_data_ballot_politician_summary', -- TIER 2: Daily/summary views that depend on base materialized views 'view_riksdagen_vote_data_ballot_summary_daily', 'view_riksdagen_vote_data_ballot_summary_weekly', 'view_riksdagen_vote_data_ballot_summary_monthly', 'view_riksdagen_vote_data_ballot_summary_annual', 'view_riksdagen_vote_data_ballot_party_summary_daily', 'view_riksdagen_vote_data_ballot_party_summary_weekly', 'view_riksdagen_vote_data_ballot_party_summary_monthly', 'view_riksdagen_vote_data_ballot_party_summary_annual', 'view_riksdagen_vote_data_ballot_politician_summary_daily', 'view_riksdagen_vote_data_ballot_politician_summary_weekly', 'view_riksdagen_vote_data_ballot_politician_summary_monthly', 'view_riksdagen_vote_data_ballot_politician_summary_annual', 'view_riksdagen_committee_ballot_decision_party_summary', 'view_riksdagen_committee_ballot_decision_politician_summary', 'view_riksdagen_committee_decision_type_org_summary', 'view_riksdagen_committee_decision_type_summary', 'view_riksdagen_party_document_daily_summary', 'view_riksdagen_politician_document_daily_summary', 'view_riksdagen_politician_document_summary' ]; v_view TEXT; v_success INT := 0; v_failed INT := 0; v_start TIMESTAMP; v_duration INTERVAL; BEGIN FOREACH v_view IN ARRAY v_views LOOP BEGIN v_start := clock_timestamp(); RAISE NOTICE 'Refreshing: %...', v_view; EXECUTE format('REFRESH MATERIALIZED VIEW %I', v_view); v_duration := clock_timestamp() - v_start; RAISE NOTICE '✓ Refreshed % in %', v_view, v_duration; v_success := v_success + 1; EXCEPTION WHEN OTHERS THEN RAISE WARNING '✗ Failed to refresh %: %', v_view, SQLERRM; v_failed := v_failed + 1; END; END LOOP; RAISE NOTICE ''; RAISE NOTICE '==========================================='; RAISE NOTICE '--- REFRESH SUMMARY ---'; RAISE NOTICE '==========================================='; RAISE NOTICE 'Total views: %', array_length(v_views, 1); RAISE NOTICE 'Successful: %', v_success; RAISE NOTICE 'Failed: %', v_failed; RAISE NOTICE '==========================================='; IF v_failed > 0 THEN RAISE WARNING 'Some view refreshes failed. Check logs above for details.'; END IF; END $$; \echo '' \echo '=======================================' \echo 'Refresh script completed' \echo 'Finished at:' `date` \echo '======================================='