status-go/services/wallet/activity/recipients.sql

115 lines
2.7 KiB
SQL

-- Query to retrive all recipients for selected addresses and networks
WITH filter_conditions AS (
SELECT
? AS filterAllAddresses,
? AS includeAllNetworks,
? AS pendingStatus
),
filter_addresses(address) AS (
VALUES
%s
),
filter_networks(network_id) AS (
VALUES
%s
),
pending_network_ids AS (
SELECT
multi_transaction_id
FROM
pending_transactions,
filter_conditions
WHERE
pending_transactions.multi_transaction_id != 0
AND pending_transactions.status = pendingStatus
AND pending_transactions.network_id IN filter_networks
GROUP BY
pending_transactions.multi_transaction_id
),
tr_network_ids AS (
SELECT
multi_transaction_id
FROM
transfers
WHERE
transfers.loaded == 1
AND transfers.multi_transaction_id != 0
AND network_id IN filter_networks
GROUP BY
transfers.multi_transaction_id
)
SELECT
to_address,
MIN(timestamp) AS min_timestamp
FROM (
SELECT
transfers.tx_to_address as to_address,
MIN(transfers.timestamp) AS timestamp
FROM
transfers, filter_conditions
WHERE
transfers.multi_transaction_id = 0 AND transfers.tx_to_address NOT NULL
AND (filterAllAddresses OR transfers.address IN filter_addresses)
AND (includeAllNetworks OR transfers.network_id IN filter_networks)
GROUP BY
transfers.tx_to_address
UNION
SELECT
pending_transactions.to_address AS to_address,
MIN(pending_transactions.timestamp) AS timestamp
FROM
pending_transactions, filter_conditions
WHERE
pending_transactions.multi_transaction_id = 0 AND pending_transactions.to_address NOT NULL
AND (filterAllAddresses OR pending_transactions.from_address IN filter_addresses)
AND (includeAllNetworks OR pending_transactions.network_id IN filter_networks)
GROUP BY
pending_transactions.to_address
UNION
SELECT
multi_transactions.to_address AS to_address,
MIN(multi_transactions.timestamp) AS timestamp
FROM
multi_transactions, filter_conditions
WHERE
(filterAllAddresses OR multi_transactions.from_address IN filter_addresses)
AND (
includeAllNetworks
OR (multi_transactions.from_network_id IN filter_networks)
OR (multi_transactions.to_network_id IN filter_networks)
OR (
COALESCE(multi_transactions.from_network_id, 0) = 0
AND COALESCE(multi_transactions.to_network_id, 0) = 0
AND (
EXISTS (
SELECT
1
FROM
tr_network_ids
WHERE
multi_transactions.id = tr_network_ids.multi_transaction_id
)
OR EXISTS (
SELECT
1
FROM
pending_network_ids
WHERE
multi_transactions.id = pending_network_ids.multi_transaction_id
)
)
)
)
GROUP BY
multi_transactions.to_address
) AS combined_result
GROUP BY
to_address
ORDER BY
min_timestamp DESC
LIMIT ? OFFSET ?;