Skip to content

Commit 750608f

Browse files
authored
Merge pull request #8 from TechArtists/multiple-project-source
Multiple project source
2 parents a60f78c + 8a003c0 commit 750608f

10 files changed

Lines changed: 96 additions & 96 deletions

README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
This library works by default for one Firebase/Google Cloud Project:
2-
32
# "TA:SOURCES":
43
# - {project_id: google_cloud_project_id,
54
# analytics_dataset_id: schema_id,
@@ -10,11 +9,11 @@ This library works by default for one Firebase/Google Cloud Project:
109
Adding more project_ids and multiple dataset_ids for specific datasets is also possible.
1110
A few additional steps are required for multiple sources to be added as sources.
1211

13-
1) TA:SOURCES_READY must be set to false (default).
12+
1) TA:SOURCES_MULTIPLE_PROJECTS_GENERATED must be set to false (default).
1413
2) add projects and datasets to the TA:SOURCES variable in your dbt project
1514
3) run the following command to generate sources for all projects:
16-
dbt run-operation -q generate_firebase_sources > models/firebase_sources.yml
17-
4) change TA:SOURCES_READY to true
15+
dbt run-operation -q generate_sources_multiple_projects > models/firebase_sources_multiple_projects.yml
16+
4) change TA:SOURCES_MULTIPLE_PROJECTS_GENERATED to true
1817
# "TA:SOURCES":
1918
# - {project_id: google_cloud_project_id,
2019
# analytics_dataset_id: schema_id,

dbt_project.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ seeds:
3333
vars:
3434
ta_firebase:
3535
"TA:DONT_CARE": "MAKE_YAML_WORK" # optional
36-
"TA:SOURCES_READY" : false
36+
"TA:SOURCES_MULTIPLE_PROJECTS_GENERATED" : false
3737
# "TA:SOURCES":
3838
# - {project_id: watermark-maker,
3939
# analytics_dataset_id: analytics_150733022,

macros/custom_parameters.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616

1717
{# Array of tuples [
1818
(key_name, ta_type, rollup_type, extract_transformation, metric_rollup_transformation, struct_field_name, event_name_filter, null_dimension_event_name_filter, bigquery_type, how_to_extract_from_unnest)]
19-
('ta_view_name', 'STRING', 'dimension', 'STRING', 'ta_ui_view_shown', 'LOWER(value.string_value)', 'ta_view_name_string')
19+
('ta_view_name', 'STRING', 'dimension', 'STRING', 'ta_ui_view_show', 'LOWER(value.string_value)', 'ta_view_name_string')
2020
#}
2121
{% macro get_event_parameter_tuples_all() -%}
22-
{# ta_ui_view_shown & ta_ui_button_tapped #}
23-
{%- set uiEventNameFilters = ["ta_ui_view_shown", "ta_ui_button_tapped", "ui_view_shown", "ui_button_tapped"] -%}
22+
{# ta_ui_view_show & ta_ui_button_tapped #}
23+
{%- set uiEventNameFilters = ["ta_ui_view_show", "ta_ui_button_tapped", "ui_view_show", "ui_button_tapped"] -%}
2424
{%- set builtin_parameters = [
2525
{"key_name":"view_name", "data_type":"STRING", "rollup_type":"dimension", "event_name_filter": uiEventNameFilters, "extract_transformation": "LOWER(TRIM(##))"}
2626
,{"key_name":"view_type", "data_type":"STRING", "rollup_type":"alsoForceNullDimension", "force_null_dimension_event_name_filter": uiEventNameFilters, "extract_transformation": "LOWER(TRIM(##))"}

macros/generate_sources.sql

Lines changed: 0 additions & 69 deletions
This file was deleted.
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
{% macro generate_sources_multiple_projects(
2+
var_name='TA:SOURCES',
3+
source_prefix='firebase',
4+
indent=2,
5+
include_comments=true
6+
) %}
7+
{% set sp = ' ' * indent %}
8+
{% set nl = '\n' %}
9+
{% set out = [] %}
10+
11+
{% set projects = var(var_name, []) %}
12+
{% if projects is string %}{% set projects = fromjson(projects) %}{% endif %}
13+
14+
{% do out.append('version: 2') %}
15+
{% do out.append('') %}
16+
{% do out.append('sources:') %}
17+
18+
{% for p in projects %}
19+
{% set pid = (p.get('project_id') or '') | trim %}
20+
{% set events_table = (p.get('events_table') or 'events_*') | trim %}
21+
{% set intraday_table = (p.get('intraday_table') or 'events_intraday_*') | trim %}
22+
{% set cds = (p.get('crashlytics_dataset_id') or '') | trim %}
23+
{% set crash_table = (p.get('crashlytics_table') or 'com_labpixies_flood_floodit_*') | trim %}
24+
25+
{# accept either analytics_dataset_ids (list) or analytics_dataset_id (string) #}
26+
{% set ads_raw = p.get('analytics_dataset_ids') if p.get('analytics_dataset_ids') is not none else p.get('analytics_dataset_id') %}
27+
{% if ads_raw is string %}
28+
{% set ads_list = [ads_raw | trim] %}
29+
{% elif ads_raw is iterable %}
30+
{% set ads_list = ads_raw %}
31+
{% else %}
32+
{% set ads_list = [] %}
33+
{% endif %}
34+
35+
{% for ads in ads_list %}
36+
{% set ds = ads | trim %}
37+
{% if ds != '' %}
38+
{% if include_comments %}
39+
{% do out.append(sp ~ "# Analytics for " ~ pid ~ " (" ~ ds ~ ")") %}
40+
{% endif %}
41+
{% do out.append(sp ~ "- name: " ~ source_prefix ~ "_analytics__" ~ pid ~ "__" ~ ds) %}
42+
{% do out.append(sp ~ " database: " ~ pid) %}
43+
{% do out.append(sp ~ " schema: " ~ ds) %}
44+
{% do out.append(sp ~ " tables:") %}
45+
{% do out.append(sp ~ " - name: events") %}
46+
{% do out.append(sp ~ " identifier: " ~ events_table) %}
47+
{% do out.append(sp ~ " - name: events_intraday") %}
48+
{% do out.append(sp ~ " identifier: " ~ intraday_table) %}
49+
{% do out.append('') %}
50+
{% endif %}
51+
{% endfor %}
52+
53+
{% if cds != '' %}
54+
{% if include_comments %}
55+
{% do out.append(sp ~ "# Crashlytics for " ~ pid) %}
56+
{% endif %}
57+
{% do out.append(sp ~ "- name: " ~ source_prefix ~ "_crashlytics__" ~ pid) %}
58+
{% do out.append(sp ~ " database: " ~ pid) %}
59+
{% do out.append(sp ~ " schema: " ~ cds) %}
60+
{% do out.append(sp ~ " tables:") %}
61+
{% do out.append(sp ~ " - name: events") %}
62+
{% do out.append(sp ~ " identifier: " ~ crash_table) %}
63+
{% do out.append('') %}
64+
{% endif %}
65+
{% endfor %}
66+
67+
{% set result = out | join(nl) | trim %}
68+
{{ print(result) }}
69+
{{ return(result) }}
70+
{% endmacro %}

models/analytics/fb_analytics_events_raw.sql

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"granularity": "day"
88
},
99
incremental_strategy = 'insert_overwrite',
10+
lookback = 4
1011
require_partition_filter = true,
1112
cluster_by = ["event_name", "platform", "app_id"]
1213
) }}
@@ -67,26 +68,26 @@ SELECT
6768
FROM
6869
(
6970
{%- set projects = var('TA:SOURCES', []) -%}
70-
{%- set ready = var('TA:SOURCES_READY', false) -%}
71+
{%- set ready = var('TA:SOURCES_MULTIPLE_PROJECTS_GENERATED', false) -%}
7172

7273
{%- set first = (projects[0] if projects and (projects[0] is mapping) else {}) -%}
73-
{%- set pid0 = first.get('project_id', 'fallback_project') -%}
74+
{%- set pid0 = first.get('project_id', 'single_project') -%}
7475
{%- set ads_raw0 = first.get('analytics_dataset_ids') if first.get('analytics_dataset_ids') is not none else first.get('analytics_dataset_id') -%}
7576
{%- if ads_raw0 is string -%}
7677
{%- set ds0 = ads_raw0 -%}
7778
{%- elif ads_raw0 is iterable and (ads_raw0 | length) > 0 -%}
7879
{%- set ds0 = ads_raw0[0] -%}
7980
{%- else -%}
80-
{%- set ds0 = 'fallback_dataset' -%}
81+
{%- set ds0 = 'single_project_dataset' -%}
8182
{%- endif -%}
8283

8384
{%- if not ready -%}
84-
-- FALLBACK: use the single parse-safe source until generated sources are ready
85+
-- use the single project source if generated sources are not ready
8586
SELECT
8687
'{{ pid0 }}' as project_id,
8788
'{{ ds0 }}' as dataset_id,
8889
*
89-
FROM {{ source('firebase_analytics__fallback', 'events') }}
90+
FROM {{ source('firebase_analytics__single_project', 'events') }}
9091
WHERE {{ ta_firebase.analyticsTableSuffixFilter() }}
9192
AND {{ ta_firebase.analyticsDateFilterFor('DATE(TIMESTAMP_MICROS(event_timestamp))') }}
9293
{%- else -%}

models/crashlytics/docs/fb_crashlytics_events_raw.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ models:
99
- name: crashlytics_user_pseudo_id
1010
description: "`installation_uuid` from Firebase Crashlytics"
1111
- name: firebase_analytics_user_pseudo_id
12-
description: "`fb_user_pseudo_id` custom key set in Firebase Crashlytics (by the Overbase SDK)"
12+
description: "`fb_user_pseudo_id` custom key set in Firebase Crashlytics (by the TA SDK)"
1313
- name: user_id
14-
description: "`app_user_id` custom key set in Firebase Crashlytics (by the Overbase SDK)"
14+
description: "`app_user_id` custom key set in Firebase Crashlytics (by the TA SDK)"
1515
- name: app_id
1616
description: "iOS: bundle_identifier, Android: package_name"
1717
- name: reverse_app_id
18-
description: "iOS: bundle_identifier, Android: package_name in reversed format. So 'com.overbase.myapp' becomes 'myapp.overbase.com'"
18+
description: "iOS: bundle_identifier, Android: package_name in reversed format. So 'com.ta.myapp' becomes 'myapp.ta.com'"
1919
- name: event_id
2020
description: ""
2121
- name: platform

models/crashlytics/fb_crashlytics_events_raw.sql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@
1414
-- https://firebase.google.com/docs/crashlytics/bigquery-export#without_stack_traces
1515

1616
{% set projects = var('TA:SOURCES', []) %}
17-
{% set ready = var('TA:SOURCES_READY', false) %}
17+
{% set ready = var('TA:SOURCES_MULTIPLE_PROJECTS_GENERATED', false) %}
1818

1919
{% set first = projects[0] if projects and (projects[0] is mapping) else {} %}
20-
{% set pid0 = first.get('project_id', 'fallback_project') %}
21-
{% set ds0 = first.get('crashlytics_dataset_id', 'fallback_crashlytics_dataset') %}
20+
{% set pid0 = first.get('project_id', 'single_project') %}
21+
{% set ds0 = first.get('crashlytics_dataset_id', 'single_project_crashlytics_dataset') %}
2222

2323
{%- set ns = namespace(first=true) -%}
2424

@@ -93,7 +93,7 @@
9393
) AS unity_metadata
9494
, COUNT(1) OVER (PARTITION BY installation_uuid, event_id, variant_id) as duplicates_cnt
9595
96-
FROM {{ source('firebase_crashlytics__fallback', 'events') }}
96+
FROM {{ source('firebase_crashlytics__single_project', 'events') }}
9797
WHERE {{ ta_firebase.crashlyticsTSFilterFor("event_timestamp") }}
9898
QUALIFY ROW_NUMBER() OVER (PARTITION BY crashlytics_user_pseudo_id, event_id, variant_id ORDER BY received_ts) = 1
9999
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ version: 2
22

33
sources:
44
# Firebase Analytics (safe default)
5-
- name: "firebase_analytics__fallback"
5+
- name: "firebase_analytics__single_project"
66
database: "{{ var('TA:SOURCES','ta')[0]['project_id'] }}"
77
schema: "{{ var('TA:SOURCES','firebase_analytics_raw_test')[0]['analytics_dataset_id'] }}"
88
tables:
99
- name: events
1010
identifier: "{{ var('TA:SOURCES','events_*')[0]['events_table'] }}"
1111

1212
# Firebase Crashlytics (safe default)
13-
- name: firebase_crashlytics__fallback
13+
- name: "firebase_crashlytics__single_project"
1414
database: "{{ var('TA:SOURCES','ta')[0]['project_id'] }}"
15-
schema: "{{ var('TA:SOURCES', 'firebase_crashlytics__fallback')[0]['crashlytics_dataset_id'] }}"
15+
schema: "{{ var('TA:SOURCES', 'firebase_crashlytics__single_project')[0]['crashlytics_dataset_id'] }}"
1616
tables:
1717
- name: events
1818
identifier: "{{ var('TA:SOURCES','com_app_*')[0]['crashlytics_table'] }}"

tests/events_raw_incremental.sql

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,15 @@ WITH stg AS (
1313

1414
src AS (
1515
{%- set projects = var('TA:SOURCES', []) -%}
16-
{%- set ready = var('TA:SOURCES_READY', false) -%}
16+
{%- set ready = var('TA:SOURCES_MULTIPLE_PROJECTS_GENERATED', false) -%}
1717
{%- set ns = namespace(first=true) -%}
1818

1919
{%- if not ready -%}
2020
SELECT
2121
DATE(TIMESTAMP_MICROS(event_timestamp)) AS event_date,
2222
COUNT(*) AS cnt,
23-
-- use first project's id if available; otherwise literal 'fallback'
24-
{{ (projects[0]['project_id'] if projects and (projects[0] is mapping) and projects[0].get('project_id') else 'fallback') | tojson }} AS project_id
25-
FROM {{ source('firebase_analytics__fallback', 'events') }}
23+
{{ (projects[0]['project_id'] if projects and (projects[0] is mapping) and projects[0].get('project_id') else 'single_project') | tojson }} AS project_id
24+
FROM {{ source('firebase_analytics__single_project', 'events') }}
2625
WHERE {{ ta_firebase.analyticsTestTableSuffixFilter(extend=3) }}
2726
AND {{ ta_firebase.analyticsTestDateFilter('DATE(TIMESTAMP_MICROS(event_timestamp))', extend=2) }}
2827
AND DATE(TIMESTAMP_MICROS(event_timestamp)) <= CURRENT_DATE() - 5

0 commit comments

Comments
 (0)