diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml index 631adda7cd8..e3edd8d3824 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml @@ -251,4 +251,5 @@ + diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0233_backfill_repayment_start_date_type_on_loan.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0233_backfill_repayment_start_date_type_on_loan.xml new file mode 100644 index 00000000000..4913d7b8afc --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0233_backfill_repayment_start_date_type_on_loan.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + DROP PROCEDURE IF EXISTS backfill_repayment_start_date_type_on_loan; + + CREATE PROCEDURE backfill_repayment_start_date_type_on_loan() + BEGIN + DECLARE v_rows_updated INT DEFAULT 1; + + WHILE v_rows_updated > 0 DO + UPDATE m_loan l + INNER JOIN ( + SELECT l2.id, lp2.repayment_start_date_type_enum + FROM m_loan l2 + INNER JOIN m_product_loan lp2 ON lp2.id = l2.product_id + WHERE l2.repayment_start_date_type_enum IS NULL + AND lp2.repayment_start_date_type_enum IS NOT NULL + ORDER BY l2.id + LIMIT 10000 + ) batch ON batch.id = l.id + SET l.repayment_start_date_type_enum = batch.repayment_start_date_type_enum; + + SET v_rows_updated = ROW_COUNT(); + COMMIT; + END WHILE; + END; + + CALL backfill_repayment_start_date_type_on_loan(); + DROP PROCEDURE backfill_repayment_start_date_type_on_loan; + + + + + + + + + + + + + DO $$ + DECLARE + v_rows_updated INTEGER; + v_batch_count INTEGER := 0; + v_total_updated BIGINT := 0; + v_start_time TIMESTAMP := NOW(); + v_duration NUMERIC; + BEGIN + RAISE NOTICE 'Starting repaymentStartDateType backfill at % with batch size: 10000', v_start_time; + + LOOP + WITH batch AS ( + SELECT l.id, lp.repayment_start_date_type_enum + FROM m_loan l + INNER JOIN m_product_loan lp ON lp.id = l.product_id + WHERE l.repayment_start_date_type_enum IS NULL + AND lp.repayment_start_date_type_enum IS NOT NULL + ORDER BY l.id + LIMIT 10000 + FOR UPDATE OF l SKIP LOCKED + ) + UPDATE m_loan + SET repayment_start_date_type_enum = batch.repayment_start_date_type_enum + FROM batch + WHERE m_loan.id = batch.id; + + GET DIAGNOSTICS v_rows_updated = ROW_COUNT; + v_batch_count := v_batch_count + 1; + v_total_updated := v_total_updated + v_rows_updated; + + RAISE NOTICE 'Batch %: Updated % rows. Total updated: %', v_batch_count, v_rows_updated, v_total_updated; + + EXIT WHEN v_rows_updated = 0; + COMMIT; + END LOOP; + + v_duration := EXTRACT(EPOCH FROM (NOW() - v_start_time)); + RAISE NOTICE 'Completed repaymentStartDateType backfill at %. Total rows updated: %. Duration: % seconds', + NOW(), v_total_updated, v_duration; + END $$; + + +