fix: uniq by hash, instead of transaction

pull/2062/head
zachdaniel 6 years ago
parent 32472a016c
commit 77e8f457e0
  1. 1
      CHANGELOG.md
  2. 2
      apps/explorer/lib/explorer/chain.ex
  3. 60
      apps/explorer/lib/explorer/chain/token_transfer.ex

@ -46,6 +46,7 @@
- [#2008](https://github.com/poanetwork/blockscout/pull/2008) - add new function clause for xDai network beneficiaries
- [#2009](https://github.com/poanetwork/blockscout/pull/2009) - addresses page improvements
- [#2027](https://github.com/poanetwork/blockscout/pull/2027) - fix: `BlocksTransactionsMismatch` ignoring blocks without transactions
- [#2062](https://github.com/poanetwork/blockscout/pull/2062) - fix: uniq by hash, instead of transaction
### Chore

@ -266,7 +266,7 @@ defmodule Explorer.Chain do
queries
|> Stream.flat_map(&Repo.all/1)
|> Stream.uniq()
|> Stream.uniq_by(& &1.hash)
|> Stream.concat(rewards_list)
|> Enum.sort_by(fn item ->
case item do

@ -204,59 +204,17 @@ defmodule Explorer.Chain.TokenTransfer do
transaction_hashes_from_token_transfers_sql(address_bytes, paging_options)
end
defp transaction_hashes_from_token_transfers_sql(address_bytes, %PagingOptions{key: nil, page_size: page_size}) do
{:ok, %Postgrex.Result{rows: transaction_hashes_from_token_transfers}} =
Repo.query(
"""
SELECT transaction_hash
FROM
(
SELECT transaction_hash
FROM token_transfers
WHERE from_address_hash = $1
UNION
SELECT transaction_hash
FROM token_transfers
WHERE to_address_hash = $1
) as token_transfers_transaction_hashes
LIMIT $2
""",
[address_bytes, page_size]
)
List.flatten(transaction_hashes_from_token_transfers)
end
defp transaction_hashes_from_token_transfers_sql(address_bytes, %PagingOptions{
key: {block_number, _index},
page_size: page_size
}) do
{:ok, %Postgrex.Result{rows: transaction_hashes_from_token_transfers}} =
Repo.query(
"""
SELECT transaction_hash
FROM
(
SELECT transaction_hash
FROM token_transfers
WHERE from_address_hash = $1
AND block_number < $2
UNION
SELECT transaction_hash
FROM token_transfers
WHERE to_address_hash = $1
AND block_number < $2
) as token_transfers_transaction_hashes
LIMIT $3
""",
[address_bytes, block_number, page_size]
defp transaction_hashes_from_token_transfers_sql(address_bytes, %PagingOptions{page_size: page_size} = paging_options) do
query =
from(token_transfer in TokenTransfer,
where: token_transfer.to_address_hash == ^address_bytes or token_transfer.from_address_hash == ^address_bytes,
select: type(token_transfer.transaction_hash, :binary),
limit: ^page_size
)
List.flatten(transaction_hashes_from_token_transfers)
query
|> page_transaction_hashes_from_token_transfers(paging_options)
|> Repo.all()
end
defp page_transaction_hashes_from_token_transfers(query, %PagingOptions{key: nil}), do: query

Loading…
Cancel
Save