diff --git a/.github/workflows/dbt_run_atlas.yml b/.github/workflows/dbt_run_atlas.yml new file mode 100644 index 00000000..d4949d6d --- /dev/null +++ b/.github/workflows/dbt_run_atlas.yml @@ -0,0 +1,34 @@ +name: dbt_run_atlas +run-name: dbt_run_atlas + +on: + workflow_dispatch: + schedule: + # Runs once per day at 0 UTC + - cron: "0 0 * * *" + +env: + USE_VARS: "${{ vars.USE_VARS }}" + DBT_PROFILES_DIR: "${{ vars.DBT_PROFILES_DIR }}" + DBT_VERSION: "${{ vars.DBT_VERSION }}" + ACCOUNT: "${{ vars.ACCOUNT }}" + ROLE: "${{ vars.ROLE }}" + USER: "${{ vars.USER }}" + PASSWORD: "${{ secrets.PASSWORD }}" + REGION: "${{ vars.REGION }}" + DATABASE: "${{ vars.DATABASE }}" + WAREHOUSE: "${{ vars.WAREHOUSE }}" + SCHEMA: "${{ vars.SCHEMA }}" + +concurrency: + group: ${{ github.workflow }} + +jobs: + called_workflow_template: + uses: FlipsideCrypto/analytics-workflow-templates/.github/workflows/dbt_run_template.yml@main + with: + dbt_command: > + dbt run -s tag:atlas + environment: workflow_prod + warehouse: ${{ vars.WAREHOUSE }} + secrets: inherit diff --git a/models/descriptions/active_day.md b/models/descriptions/active_day.md new file mode 100644 index 00000000..959ab0ab --- /dev/null +++ b/models/descriptions/active_day.md @@ -0,0 +1,5 @@ +{% docs active_day %} + +Date of activity. + +{% enddocs %} diff --git a/models/descriptions/id.md b/models/descriptions/id.md new file mode 100644 index 00000000..38c401ab --- /dev/null +++ b/models/descriptions/id.md @@ -0,0 +1,5 @@ +{% docs id %} + +A unique identifier for the record. + +{% enddocs %} diff --git a/models/descriptions/inserted_timestamp.md b/models/descriptions/inserted_timestamp.md new file mode 100644 index 00000000..94447a47 --- /dev/null +++ b/models/descriptions/inserted_timestamp.md @@ -0,0 +1,5 @@ +{% docs inserted_timestamp %} + +The timestamp at which the record was initially created and inserted into this table. + +{% enddocs %} diff --git a/models/descriptions/invocation_id.md b/models/descriptions/invocation_id.md new file mode 100644 index 00000000..64a03b7c --- /dev/null +++ b/models/descriptions/invocation_id.md @@ -0,0 +1,5 @@ +{% docs invocation_id %} + +A job ID to identify the run that last modified a record. + +{% enddocs %} diff --git a/models/descriptions/maa.md b/models/descriptions/maa.md new file mode 100644 index 00000000..965c4025 --- /dev/null +++ b/models/descriptions/maa.md @@ -0,0 +1,5 @@ +{% docs maa %} + +Monthly Active Accounts (wallets), as determined by transaction signers. + +{% enddocs %} diff --git a/models/descriptions/modified_timestamp.md b/models/descriptions/modified_timestamp.md new file mode 100644 index 00000000..abda32e3 --- /dev/null +++ b/models/descriptions/modified_timestamp.md @@ -0,0 +1,5 @@ +{% docs modified_timestamp %} + +The timestamp at which this record was last modified by an internal process. + +{% enddocs %} diff --git a/models/gold/atlas/atlas__fact_maas.sql b/models/gold/atlas/atlas__fact_maas.sql new file mode 100644 index 00000000..cc21a818 --- /dev/null +++ b/models/gold/atlas/atlas__fact_maas.sql @@ -0,0 +1,13 @@ +{{ config( + materialized = 'view', + tags = ['atlas'] +) }} + +SELECT + atlas_maa_id AS fact_maas_id, + day, + maa, + inserted_timestamp, + modified_timestamp +FROM + {{ ref('silver__atlas_maa') }} diff --git a/models/gold/atlas/atlas__fact_maas.yml b/models/gold/atlas/atlas__fact_maas.yml new file mode 100644 index 00000000..abdf8e02 --- /dev/null +++ b/models/gold/atlas/atlas__fact_maas.yml @@ -0,0 +1,34 @@ +version: 2 + +models: + - name: atlas__fact_maas + description: |- + Monthly Active Accounts (wallets) on Aurora, calculated over a rolling 30 day window. An active account, here, is defined as the signing of at least one transaction. + + columns: + - name: fact_maas_id + description: "{{ doc('id') }}" + tests: + - not_null + - unique + + - name: day + description: "{{ doc('active_day') }}" + tests: + - not_null + - unique + + - name: maa + description: "{{ doc('maa')}}" + tests: + - not_null + + - name: inserted_timestamp + description: "{{ doc('inserted_timestamp') }}" + tests: + - not_null + + - name: modified_timestamp + description: "{{ doc('modified_timestamp') }}" + tests: + - not_null diff --git a/models/gold/core__fact_blocks.sql b/models/gold/core/core__fact_blocks.sql similarity index 100% rename from models/gold/core__fact_blocks.sql rename to models/gold/core/core__fact_blocks.sql diff --git a/models/gold/core__fact_blocks.yml b/models/gold/core/core__fact_blocks.yml similarity index 100% rename from models/gold/core__fact_blocks.yml rename to models/gold/core/core__fact_blocks.yml diff --git a/models/gold/core__fact_logs.sql b/models/gold/core/core__fact_logs.sql similarity index 100% rename from models/gold/core__fact_logs.sql rename to models/gold/core/core__fact_logs.sql diff --git a/models/gold/core__fact_logs.yml b/models/gold/core/core__fact_logs.yml similarity index 100% rename from models/gold/core__fact_logs.yml rename to models/gold/core/core__fact_logs.yml diff --git a/models/gold/core__fact_receipts.sql b/models/gold/core/core__fact_receipts.sql similarity index 100% rename from models/gold/core__fact_receipts.sql rename to models/gold/core/core__fact_receipts.sql diff --git a/models/gold/core__fact_receipts.yml b/models/gold/core/core__fact_receipts.yml similarity index 100% rename from models/gold/core__fact_receipts.yml rename to models/gold/core/core__fact_receipts.yml diff --git a/models/gold/core__fact_transactions.sql b/models/gold/core/core__fact_transactions.sql similarity index 100% rename from models/gold/core__fact_transactions.sql rename to models/gold/core/core__fact_transactions.sql diff --git a/models/gold/core__fact_transactions.yml b/models/gold/core/core__fact_transactions.yml similarity index 100% rename from models/gold/core__fact_transactions.yml rename to models/gold/core/core__fact_transactions.yml diff --git a/models/silver/atlas/silver__atlas_maa.sql b/models/silver/atlas/silver__atlas_maa.sql new file mode 100644 index 00000000..36d1ae69 --- /dev/null +++ b/models/silver/atlas/silver__atlas_maa.sql @@ -0,0 +1,79 @@ +{{ config( + materialized = 'incremental', + incremental_stratege = 'merge', + merge_exclude_columns = ["inserted_timestamp"], + unique_key = 'day', + tags = ['atlas'] +) }} + +WITH dates AS ( + + SELECT + date_day AS DAY + FROM + {{ source( + 'crosschain', + 'dim_dates' + ) }} + +{% if is_incremental() %} +WHERE + date_day > ( + SELECT + MAX(DAY) + FROM + {{ this }} + ) + AND date_day < SYSDATE() :: DATE +{% else %} +WHERE + date_day BETWEEN '2020-07-22' + AND SYSDATE() :: DATE +{% endif %} +), +txns AS ( + SELECT + block_timestamp :: DATE AS active_day, + from_address + FROM + {{ ref('silver__transactions') }} + +{% if is_incremental() %} +WHERE + block_timestamp :: DATE >= ( + SELECT + MAX(DAY) + FROM + {{ this }} + ) - INTERVAL '30 days' +{% endif %} +), +FINAL AS ( + SELECT + DAY, + COUNT( + DISTINCT from_address + ) AS maa + FROM + dates d + LEFT JOIN txns t + ON t.active_day < d.day + AND t.active_day >= d.day - INTERVAL '30 day' + WHERE + DAY != CURRENT_DATE() + GROUP BY + 1 + ORDER BY + 1 DESC +) +SELECT + {{ dbt_utils.generate_surrogate_key( + ['day'] + ) }} AS atlas_maa_id, + DAY, + maa, + SYSDATE() AS inserted_timestamp, + SYSDATE() AS modified_timestamp, + '{{ invocation_id }}' AS invocation_id +FROM + FINAL diff --git a/models/silver/atlas/silver__atlas_maa.yml b/models/silver/atlas/silver__atlas_maa.yml new file mode 100644 index 00000000..644dc2e1 --- /dev/null +++ b/models/silver/atlas/silver__atlas_maa.yml @@ -0,0 +1,39 @@ +version: 2 + +models: + - name: silver__atlas_maa + description: |- + Monthly Active Accounts (wallets) on Aurora, calculated over a rolling 30 day window. An active account, here, is defined as the signing of at least one transaction. + + columns: + - name: atlas_maa_id + description: "{{ doc('id') }}" + tests: + - not_null + - unique + + - name: day + description: "{{ doc('active_day') }}" + tests: + - not_null + - unique + + - name: maa + description: "{{ doc('maa')}}" + tests: + - not_null + + - name: inserted_timestamp + description: "{{ doc('inserted_timestamp') }}" + tests: + - not_null + + - name: modified_timestamp + description: "{{ doc('modified_timestamp') }}" + tests: + - not_null + + - name: invocation_id + description: "{{ doc('invocation_id') }}" + tests: + - not_null