do not update fetched_coin_balance with nil

Currently, we update `fetched_coin_balance` field of an address
to nil if changes have `fetched_coin_balance_block_number` bigger than
current value in the DB.
pull/2696/head
Ayrat Badykov 5 years ago
parent 088fd5f560
commit 0952b2a828
No known key found for this signature in database
GPG Key ID: B44668E265E9396F
  1. 6
      apps/explorer/lib/explorer/chain/import/runner/addresses.ex
  2. 69
      apps/explorer/test/explorer/chain/import/runner/addresses_test.exs
  3. 5
      apps/explorer/test/explorer/chain/import/runner/blocks_test.exs

@ -104,13 +104,15 @@ defmodule Explorer.Chain.Import.Runner.Addresses do
fetched_coin_balance:
fragment(
"""
CASE WHEN EXCLUDED.fetched_coin_balance_block_number IS NOT NULL AND
(? IS NULL OR
CASE WHEN EXCLUDED.fetched_coin_balance_block_number IS NOT NULL
AND EXCLUDED.fetched_coin_balance IS NOT NULL AND
(? IS NULL OR ? IS NULL OR
EXCLUDED.fetched_coin_balance_block_number >= ?) THEN
EXCLUDED.fetched_coin_balance
ELSE ?
END
""",
address.fetched_coin_balance,
address.fetched_coin_balance_block_number,
address.fetched_coin_balance_block_number,
address.fetched_coin_balance

@ -0,0 +1,69 @@
defmodule Explorer.Chain.Import.Runner.AddressesTest do
use Explorer.DataCase
alias Ecto.Multi
alias Explorer.Chain.{Address, Wei}
alias Explorer.Chain.Import.Runner.Addresses
alias Explorer.Repo
describe "run/1" do
test "does not update fetched_coin_balance if original value is not nil but new value is nil" do
block_number = 5
original_address = insert(:address, fetched_coin_balance: 5, fetched_coin_balance_block_number: block_number)
new_params = %{
fetched_coin_balance: nil,
fetched_coin_balance_block_number: block_number,
hash: to_string(original_address.hash)
}
changeset = Address.balance_changeset(%Address{}, new_params)
wei = original_address.fetched_coin_balance
assert {:ok,
%{
addresses: [
%Address{
fetched_coin_balance: ^wei,
fetched_coin_balance_block_number: 5
}
]
}} = run([changeset.changes])
end
test "updates fetched_coin_balance if original value is nil and new value is not nil" do
block_number = 5
original_address = insert(:address, fetched_coin_balance: nil, fetched_coin_balance_block_number: block_number)
new_params = %{
fetched_coin_balance: 5,
fetched_coin_balance_block_number: block_number,
hash: to_string(original_address.hash)
}
changeset = Address.balance_changeset(%Address{}, new_params)
wei = %Wei{value: Decimal.new(new_params.fetched_coin_balance)}
assert {:ok,
%{
addresses: [
%Address{
fetched_coin_balance: ^wei,
fetched_coin_balance_block_number: 5
}
]
}} = run([changeset.changes])
end
end
defp run(changes) do
timestamp = DateTime.utc_now()
options = %{timestamps: %{inserted_at: timestamp, updated_at: timestamp}}
Multi.new()
|> Addresses.run(changes, options)
|> Repo.transaction()
end
end

@ -7,9 +7,8 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do
alias Ecto.Multi
alias Explorer.Chain.Import.Runner.{Blocks, Transactions}
alias Explorer.Chain.{Address, Block, Log, Transaction, TokenTransfer}
alias Explorer.Chain
alias Explorer.Repo
alias Explorer.Chain.{Address, Block, Log, TokenTransfer, Transaction}
alias Explorer.{Chain, Repo}
describe "run/1" do
setup do

Loading…
Cancel
Save