diff --git a/db/process_savings.sql b/db/process_savings.sql index b66207cbd0067af39ad65a2344bcf19a7d346742..ea3cc57853ecf3ec6edc05c11d2e1b061d4b94d2 100644 --- a/db/process_savings.sql +++ b/db/process_savings.sql @@ -13,7 +13,7 @@ DECLARE __insert_transfer_requests INT; __upsert_transfers INT; BEGIN -WITH process_block_range_data_b AS MATERIALIZED +WITH process_block_range_data_b AS ( SELECT ov.body_binary::jsonb AS body, @@ -60,6 +60,7 @@ convert_parameters AS ( FROM get_impacted_bal gi order by source_op ), +--------------------------------------------------------------------------------------- -- views for specific operation types cancel_and_fill_transfers AS ( SELECT @@ -96,13 +97,11 @@ income_transfers AS ( request_id, op_type_id, source_op, - source_op_block, - FALSE AS delete_transfer_id_from_table, - FALSE AS insert_transfer_id_to_table + source_op_block FROM convert_parameters WHERE op_type_id IN (32,55) ), - +--------------------------------------------------------------------------------------- -- find if transfer from savings happened in same batch of blocks as cancel or fill join_canceled_transfers_in_query AS ( SELECT @@ -117,23 +116,25 @@ join_canceled_transfers_in_query AS ( (SELECT tf.source_op FROM transfers_from tf WHERE tf.account_id = cpo.account_id AND tf.request_id = cpo.request_id AND tf.source_op < cpo.source_op ORDER BY tf.source_op DESC LIMIT 1) AS last_transfer_id FROM cancel_and_fill_transfers cpo ), -prepare_canceled_transfers_in_query AS ( +prepare_canceled_transfers_in_query AS MATERIALIZED ( SELECT jct.account_id, (CASE WHEN jct.op_type_id = 34 THEN tf.nai ELSE jct.nai END) AS nai, - (CASE WHEN jct.op_type_id = 34 THEN tf.balance ELSE jct.balance END) AS balance, + (CASE WHEN jct.op_type_id = 34 THEN (- tf.balance) ELSE jct.balance END) AS balance, jct.savings_withdraw_request, jct.request_id, jct.op_type_id, jct.source_op, jct.source_op_block, jct.last_transfer_id, +-- if transfer wasn't found in join_canceled_transfers_in_query, it has to be removed from transfer_saving_id table (CASE WHEN jct.last_transfer_id IS NULL THEN TRUE ELSE FALSE END) AS delete_transfer_id_from_table, FALSE AS insert_transfer_id_to_table FROM join_canceled_transfers_in_query jct LEFT JOIN transfers_from tf ON tf.source_op = jct.last_transfer_id ), --- 1/2 cancels +---------------------------------------- +-- 1/2 cancels (found in same batch of blocks as transfers - request_id doesn't require removing from transfer_saving_id table) canceled_transfers_in_query AS ( SELECT account_id, @@ -150,8 +151,7 @@ canceled_transfers_in_query AS ( FROM prepare_canceled_transfers_in_query WHERE NOT delete_transfer_id_from_table ), - --- if transfer wasn't found in above query, it has to be removed from transfer_saving_id table +---------------------------------------- prepare_canceled_transfers_already_inserted AS ( SELECT account_id, @@ -167,12 +167,12 @@ prepare_canceled_transfers_already_inserted AS ( FROM prepare_canceled_transfers_in_query WHERE delete_transfer_id_from_table ), --- 2/2 cancels +-- 2/2 cancels (transfer happened in diffrent batch of blocks - request_id must be removed from transfer_saving_id table) canceled_transfers_already_inserted AS ( SELECT pct.account_id, (CASE WHEN pct.op_type_id = 34 THEN tsi.nai ELSE pct.nai END) AS nai, - (CASE WHEN pct.op_type_id = 34 THEN tsi.balance ELSE pct.balance END) AS balance, + (CASE WHEN pct.op_type_id = 34 THEN (- tsi.balance) ELSE pct.balance END) AS balance, pct.savings_withdraw_request, pct.request_id, pct.op_type_id, @@ -183,6 +183,8 @@ canceled_transfers_already_inserted AS ( FROM prepare_canceled_transfers_already_inserted pct JOIN transfer_saving_id tsi ON tsi.request_id = pct.request_id AND tsi.account = pct.account_id ), +---------------------------------------- +--------------------------------------------------------------------------------------- transfers_from_canceled_in_query AS ( SELECT cp.account_id, @@ -194,12 +196,15 @@ transfers_from_canceled_in_query AS ( cp.source_op, cp.source_op_block, FALSE AS delete_transfer_id_from_table, +-- if transfer was cancelled in the same batch of block it doen't require to be inserted into transfer_saving_id table (NOT EXISTS (SELECT 1 FROM canceled_transfers_in_query cti WHERE cti.last_transfer_id = cp.source_op)) AS insert_transfer_id_to_table FROM transfers_from cp ), - +--------------------------------------------------------------------------------------- -- union all transfer operations union_operations AS ( + +-- transfers from savings SELECT account_id, nai, @@ -215,6 +220,7 @@ union_operations AS ( UNION ALL +-- transfers to savings SELECT account_id, nai, @@ -224,12 +230,14 @@ union_operations AS ( op_type_id, source_op, source_op_block, - delete_transfer_id_from_table, - insert_transfer_id_to_table - FROM canceled_transfers_in_query + FALSE AS delete_transfer_id_from_table, + FALSE AS insert_transfer_id_to_table + FROM income_transfers UNION ALL +--------------------------------------------------------------------------------------- +-- cancel / filled transfers SELECT account_id, nai, @@ -241,7 +249,7 @@ union_operations AS ( source_op_block, delete_transfer_id_from_table, insert_transfer_id_to_table - FROM canceled_transfers_already_inserted + FROM canceled_transfers_in_query UNION ALL @@ -256,7 +264,8 @@ union_operations AS ( source_op_block, delete_transfer_id_from_table, insert_transfer_id_to_table - FROM income_transfers + FROM canceled_transfers_already_inserted +--------------------------------------------------------------------------------------- ), sum_all_transfers AS ( SELECT @@ -269,7 +278,7 @@ sum_all_transfers AS ( FROM union_operations uo GROUP BY uo.account_id, uo.nai ), - +--------------------------------------------------------------------------------------- delete_all_canceled_or_filled_transfers AS ( DELETE FROM transfer_saving_id tsi USING union_operations uo