From 8f22af7f7a52cfafa29f6262ebc87112260c3cbd Mon Sep 17 00:00:00 2001 From: desmond-hui <97470747+desmond-hui@users.noreply.github.com> Date: Tue, 14 Jun 2022 11:53:01 -0700 Subject: [PATCH] use python to get signers from accts (#56) --- macros/create_udfs.sql | 3 ++ macros/python/udfs.sql | 17 ++++++++ models/silver/silver__transactions.sql | 55 +++----------------------- 3 files changed, 25 insertions(+), 50 deletions(-) create mode 100644 macros/python/udfs.sql diff --git a/macros/create_udfs.sql b/macros/create_udfs.sql index 725cbcce..5385f79b 100644 --- a/macros/create_udfs.sql +++ b/macros/create_udfs.sql @@ -1,6 +1,9 @@ {% macro create_udfs() %} {% set sql %} {{ udf_bulk_get_decoded_instructions_data() }}; + {{ create_udf_ordered_signers( + schema = "silver" + ) }} {% endset %} {% do run_query(sql) %} {% endmacro %} diff --git a/macros/python/udfs.sql b/macros/python/udfs.sql new file mode 100644 index 00000000..c698cc2e --- /dev/null +++ b/macros/python/udfs.sql @@ -0,0 +1,17 @@ +{% macro create_udf_ordered_signers(schema) %} +create or replace function {{ schema }}.udf_ordered_signers(accts array) +returns array +language python +runtime_version = '3.8' +handler = 'ordered_signers' +as +$$ +def ordered_signers(accts) -> list: + signers = [] + for v in accts: + if v["signer"]: + signers.append(v["pubkey"]) + + return signers +$$; +{% endmacro %} diff --git a/models/silver/silver__transactions.sql b/models/silver/silver__transactions.sql index 184bcda2..6e01fdd1 100644 --- a/models/silver/silver__transactions.sql +++ b/models/silver/silver__transactions.sql @@ -41,59 +41,13 @@ WITH base AS ( {% if is_incremental() %} AND ingested_at :: DATE >= CURRENT_DATE - 2 {% endif %} -), -trans_tmp AS ( - SELECT - block_timestamp, - block_id, - b.tx_id, - recent_block_hash, - fee, - succeeded, - account_keys, - pre_balances, - post_balances, - pre_token_balances, - post_token_balances, - instructions, - inner_instructions, - log_messages, - ingested_at - FROM - base b - qualify(ROW_NUMBER() over(PARTITION BY b.block_id, b.tx_id - ORDER BY - b.ingested_at DESC)) = 1 -), -signers_flattened AS ( - SELECT - b.tx_id, - A.index AS signer_index, - A.value :pubkey :: STRING AS acct - FROM - trans_tmp b, - TABLE(FLATTEN(b.account_keys)) A - WHERE - A.value :signer = TRUE -), -signers_arr AS ( - SELECT - tx_id, - ARRAY_AGG(acct) within GROUP ( - ORDER BY - signer_index - ) AS signers - FROM - signers_flattened - GROUP BY - 1 ) SELECT block_timestamp, block_id, b.tx_id, recent_block_hash, - s.signers AS signers, + silver.udf_ordered_signers(account_keys) as signers, fee, succeeded, account_keys, @@ -106,6 +60,7 @@ SELECT log_messages, ingested_at FROM - trans_tmp b - LEFT OUTER JOIN signers_arr s - ON b.tx_id = s.tx_id + base b + qualify(ROW_NUMBER() over(PARTITION BY b.block_id, b.tx_id +ORDER BY + b.ingested_at DESC)) = 1 \ No newline at end of file