|
1 | 1 | namespace :migration do |
2 | 2 | desc "Usage: RAILS_ENV=production bundle exec rake migration:fill_account_book_block_number_and_tx_index[0,1000000]" |
3 | 3 | task :fill_account_book_block_number_and_tx_index, %i[start_block end_block] => :environment do |_, args| |
4 | | - ActiveRecord::Base.connection.execute("SET statement_timeout = 0") |
5 | 4 | $missed_tx_ids = [] |
6 | 5 | (args[:start_block].to_i..args[:end_block].to_i).to_a.each do |block_number| |
7 | 6 | puts block_number |
8 | 7 | attrs = Set.new |
9 | | - CkbTransaction.joins(:block).includes(:inputs, :outputs).where(block: { number: block_number }).where(is_cellbase: false).each do |tx| |
| 8 | + CkbTransaction.joins(:block).includes(:inputs, :outputs).where(block: { number: block_number }).each do |tx| |
10 | 9 | outputs = tx.outputs.pluck(:address_id, :capacity).group_by { |item| item[0] }. |
11 | 10 | transform_values { |values| values.sum { |v| v[1] } } |
12 | 11 | inputs = tx.inputs.pluck(:address_id, :capacity).group_by { |item| item[0] }. |
13 | 12 | transform_values { |values| values.sum { |v| v[1] } } |
14 | 13 | address_ids = (outputs.keys + inputs.keys).uniq |
15 | | - exists = ensure_all_data_exists(address_ids, tx.id) |
16 | | - if exists |
17 | | - address_ids.each do |address_id| |
18 | | - income = (outputs[address_id] || 0) - (inputs[address_id] || 0) |
19 | | - attrs << { address_id:, ckb_transaction_id: tx.id, income:, block_number: tx.block_number, tx_index: tx.tx_index } |
| 14 | + if address_ids.present? |
| 15 | + if ensure_all_data_exists(address_ids, tx.id) |
| 16 | + address_ids.each do |address_id| |
| 17 | + income = (outputs[address_id] || 0) - (inputs[address_id] || 0) |
| 18 | + attrs << { address_id:, ckb_transaction_id: tx.id, income:, block_number: tx.block_number, tx_index: tx.tx_index } |
| 19 | + end |
| 20 | + else |
| 21 | + $missed_tx_ids << tx.id |
20 | 22 | end |
21 | | - else |
22 | | - $missed_tx_ids << tx.id |
23 | 23 | end |
24 | 24 | end |
25 | 25 | AccountBook.upsert_all(attrs.to_a, unique_by: %i[address_id ckb_transaction_id]) if attrs.present? |
|
0 commit comments