Skip to content

Commit

Permalink
Ele 700 add default values to time bucket (#346)
Browse files Browse the repository at this point in the history
* added default to time_bucket

* default time_bucket and validation

* default time_bucket and validation

* fix

* fix

* added e2e

* added e2e

* remove debug

* format

* PR fixes
  • Loading branch information
Maayan-s authored May 14, 2023
1 parent 15b3e2d commit 133ed73
Show file tree
Hide file tree
Showing 18 changed files with 196 additions and 27 deletions.
20 changes: 20 additions & 0 deletions integration_tests/macros/e2e_tests/test_config_levels.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{% test config_levels(model, expected_config, time_bucket) %}
{%- if execute and flags.WHICH in ['test', 'build'] %}
{%- set unexpected_config = [] %}
{%- set model_relation = dbt.load_relation(model) %}
{% set model_graph_node = elementary.get_model_graph_node(model_relation) %}

{%- set time_bucket = elementary.get_time_bucket(time_bucket, model_graph_node) %}
{%- if time_bucket != expected_config.get('time_bucket') %}
{%- set unexpected_message = ('got config: {0}, expected config: {1}').format(time_bucket, expected_config.get('time_bucket') ) %}
{%- do unexpected_config.append(unexpected_message) -%}
{%- endif %}

{%- if unexpected_config | length > 0 %}
{%- do exceptions.raise_compiler_error('Failure config_levels: ' ~ unexpected_config) -%}
{%- else %}
{#- test must run an sql query -#}
{{ elementary.no_results_query() }}
{%- endif %}
{%- endif %}
{%- endtest %}
18 changes: 18 additions & 0 deletions integration_tests/macros/e2e_tests/validate_config_levels.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{% macro validate_config_levels() %}
{% set alerts_relation = ref('test_alerts_union') %}

{% set config_levels_validation_query %}
with error_tests as (
select
table_name, alert_description,
{{ elementary.contains('tags', 'config_levels') }} as is_config_levels_tag
from {{ alerts_relation }}
where status = 'error'
)
select table_name, alert_description
from error_tests
where is_config_levels_tag = true
{% endset %}
{% set results = elementary.agate_to_dicts(run_query(config_levels_validation_query)) | unique | list %}
{{ assert_lists_contain_same_items(results, []) }}
{% endmacro %}
24 changes: 24 additions & 0 deletions integration_tests/macros/unit_tests/test_get_time_bucket.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{% macro test_get_time_bucket() %}

{%- set default_config = elementary.get_default_time_bucket() %}

{%- set config = {'period': 'day', 'count': 5} %}
{%- set result = elementary.get_time_bucket(config) %}
{{ assert_value(result.period, "day") }}
{{ assert_value(result.count, 5) }}

{%- set config = {'period': 'week'} %}
{%- set result = elementary.get_time_bucket(config) %}
{{ assert_value(result.period, "week") }}
{{ assert_value(result.count, default_config.count) }}

{%- set config = {'count': 3} %}
{%- set result = elementary.get_time_bucket(config) %}
{{ assert_value(result.count, 3) }}
{{ assert_value(result.period, default_config.period) }}

{%- set result = elementary.get_time_bucket() %}
{{ assert_value(result.count, default_config.count) }}
{{ assert_value(result.period, default_config.period) }}

{% endmacro %}
1 change: 1 addition & 0 deletions integration_tests/models/config_levels_project.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
select 1 as one
1 change: 1 addition & 0 deletions integration_tests/models/config_levels_test_and_model.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
select 1 as one
36 changes: 36 additions & 0 deletions integration_tests/models/schema.yml
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,42 @@ models:
tags: ["ephemeral_model", "error_test"]


- name: config_levels_test_and_model
tags: ["config_levels"]
config:
elementary:
time_bucket:
period: day
count: 3
tests:
- config_levels:
tags: ["config_levels"]
alias: 'test_level_config'
time_bucket:
period: hour
count: 4
expected_config:
time_bucket:
period: hour
count: 4
- config_levels:
tags: ["config_levels"]
alias: 'model_level_config'
expected_config:
time_bucket:
period: day
count: 3
- name: config_levels_project
tags: ["config_levels"]
tests:
- config_levels:
tags: ["config_levels"]
alias: 'project_level_config'
expected_config:
time_bucket:
period: day
count: 1

sources:
- name: training
schema: test_seeds
Expand Down
11 changes: 11 additions & 0 deletions integration_tests/run_e2e_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,16 @@ def e2e_tests(
]
test_results.extend(results)

if "config_levels" in test_types:
dbt_runner.test(select="tag:config_levels")
results = [
TestResult(type="config_levels", message=msg)
for msg in dbt_runner.run_operation(
macro_name="validate_config_levels", should_log=False
)
]
test_results.extend(results)

if "artifacts" in test_types:
results = [
TestResult(type="artifacts", message=msg)
Expand Down Expand Up @@ -402,6 +412,7 @@ def main(target, e2e_type, generate_data, clear_tests):
"backfill_days",
"schema",
"regular",
"config_levels",
"artifacts",
"error_test",
"error_model",
Expand Down

This file was deleted.

17 changes: 14 additions & 3 deletions macros/edr/system/system_utils/get_test_argument.sql
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
{% macro get_test_argument(argument_name, value=none) %}
{% macro get_test_argument(argument_name, value, model_graph_node) %}
{% if value %}
{{ return(value) }}
{% else %}
{%- endif %}
{%- if model_graph_node %}
{% set elementary_config = elementary.get_elementary_config_from_node(model_graph_node) %}
{% if elementary_config and elementary_config is mapping %}
{%- set model_config_value = elementary_config.get(argument_name) %}
{%- if model_config_value %}
{{ return(model_config_value) }}
{%- endif %}
{% endif %}
{% endif %}
{%- if elementary.get_config_var(argument_name) %}
{{ return(elementary.get_config_var(argument_name)) }}
{% endif %}
{% endmacro %}
{{ return(none) }}
{% endmacro %}
5 changes: 1 addition & 4 deletions macros/edr/tests/test_all_columns_anomalies.sql
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@
{{ exceptions.raise_compiler_error("The test is not supported for ephemeral models, model name: {}".format(model.identifier)) }}
{%- endif %}

{% if not time_bucket %}
{% set time_bucket = elementary.get_default_time_bucket() %}
{% endif %}

{%- set test_table_name = elementary.get_elementary_test_table_name() %}
{{- elementary.debug_log('collecting metrics for test: ' ~ test_table_name) }}
{#- creates temp relation for test metrics -#}
Expand All @@ -30,6 +26,7 @@

{% set model_graph_node = elementary.get_model_graph_node(model_relation) %}
{% set timestamp_column = elementary.get_timestamp_column(timestamp_column, model_graph_node) %}
{%- set time_bucket = elementary.get_time_bucket(time_bucket, model_graph_node) %}

{% do elementary.validate_seasonality_parameter(seasonality=seasonality, time_bucket=time_bucket, timestamp_column=timestamp_column) %}
{% set days_back = elementary.get_days_back(seasonality=seasonality) %}
Expand Down
5 changes: 1 addition & 4 deletions macros/edr/tests/test_column_anomalies.sql
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@
{{ exceptions.raise_compiler_error("The test is not supported for ephemeral models, model name: {}".format(model.identifier)) }}
{%- endif %}

{% if not time_bucket %}
{% set time_bucket = elementary.get_default_time_bucket() %}
{% endif %}

{% set test_table_name = elementary.get_elementary_test_table_name() %}
{{ elementary.debug_log('collecting metrics for test: ' ~ test_table_name) }}
{#- creates temp relation for test metrics -#}
Expand All @@ -28,6 +24,7 @@

{% set model_graph_node = elementary.get_model_graph_node(model_relation) %}
{% set timestamp_column = elementary.get_timestamp_column(timestamp_column, model_graph_node) %}
{%- set time_bucket = elementary.get_time_bucket(time_bucket, model_graph_node) %}

{% do elementary.validate_seasonality_parameter(seasonality=seasonality, time_bucket=time_bucket, timestamp_column=timestamp_column) %}
{% set days_back = elementary.get_days_back(seasonality=seasonality) %}
Expand Down
66 changes: 66 additions & 0 deletions macros/edr/tests/test_configuration/get_time_bucket.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
{% macro get_daily_time_bucket() %}
{% do return({"period": "day", "count": 1}) %}
{% endmacro %}

{% macro get_default_time_bucket() %}
{% do return(elementary.get_daily_time_bucket()) %}
{% endmacro %}

{% macro get_time_bucket(time_bucket, model_graph_node) %}
{%- set configured_time_bucket = elementary.get_test_argument('time_bucket', time_bucket, model_graph_node) %}
{%- do elementary.validate_time_bucket(configured_time_bucket) %}
{%- set default_time_bucket = elementary.get_default_time_bucket() %}

{%- if not configured_time_bucket %}
{{ return(default_time_bucket) }}
{%- else %}
{%- set time_bucket = default_time_bucket.copy() %}
{%- do time_bucket.update(configured_time_bucket) %}
{{ return(time_bucket) }}
{%- endif %}
{% endmacro %}


{% macro validate_time_bucket(time_bucket) %}
{% if time_bucket %}
{%- if time_bucket is not mapping %}
{% do exceptions.raise_compiler_error(
"
Invalid time_bucket format. Expected format:
time_bucket:
count: int
period: string
") %}
{%- endif %}
{%- if time_bucket is mapping %}
{%- set invalid_keys = [] %}
{%- set valid_keys = ['period', 'count'] %}
{%- for key, value in time_bucket.items() %}
{%- if key not in valid_keys %}
{%- do invalid_keys.append(key) -%}
{%- endif %}
{%- endfor %}
{%- if invalid_keys | length > 0 %}
{% do exceptions.raise_compiler_error(
("
Found invalid keys in time_bucket: {0}.
Supported keys: {1}.
Expected format:
time_bucket:
count: int
period: string
").format(invalid_keys, valid_keys)) %}
{%- endif %}
{%- endif %}

{% if time_bucket.count and time_bucket.count is not integer %}
{% do exceptions.raise_compiler_error("time_bucket.count expects valid integer, got: {} (If it's an integer, try to remove quotes)".format(time_bucket.count)) %}
{% endif %}
{% set supported_periods = ['hour','day','week','month'] %}
{% if time_bucket.period and time_bucket.period not in supported_periods %}
{% do exceptions.raise_compiler_error("time_bucket.period value should be one of {0}, got: {1}".format(supported_periods, time_bucket.period)) %}
{% endif %}
{% endif %}
{% endmacro %}
4 changes: 1 addition & 3 deletions macros/edr/tests/test_dimension_anomalies.sql
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@
{% if not dimensions %}
{{ exceptions.raise_compiler_error('Dimension anomalies test must get "dimensions" as a parameter!') }}
{% endif %}
{% if not time_bucket %}
{% set time_bucket = elementary.get_default_time_bucket() %}
{% endif %}

{% set test_table_name = elementary.get_elementary_test_table_name() %}
{{ elementary.debug_log('collecting metrics for test: ' ~ test_table_name) }}
Expand All @@ -30,6 +27,7 @@

{% set model_graph_node = elementary.get_model_graph_node(model_relation) %}
{% set timestamp_column = elementary.get_timestamp_column(timestamp_column, model_graph_node) %}
{%- set time_bucket = elementary.get_time_bucket(time_bucket, model_graph_node) %}

{% do elementary.validate_seasonality_parameter(seasonality=seasonality, time_bucket=time_bucket, timestamp_column=timestamp_column) %}
{% set days_back = elementary.get_days_back(seasonality=seasonality) %}
Expand Down
8 changes: 2 additions & 6 deletions macros/edr/tests/test_table_anomalies.sql
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,6 @@
{{ exceptions.raise_compiler_error("The test is not supported for ephemeral models, model name: {}".format(model.identifier)) }}
{%- endif %}

{% if not time_bucket %}
{% set time_bucket = elementary.get_default_time_bucket() %}
{% endif %}

{% set test_table_name = elementary.get_elementary_test_table_name() %}
{{ elementary.debug_log('collecting metrics for test: ' ~ test_table_name) }}
{#- creates temp relation for test metrics -#}
Expand All @@ -28,8 +24,8 @@
{% endif %}

{% set model_graph_node = elementary.get_model_graph_node(model_relation) %}
{% set timestamp_column = elementary.get_timestamp_column(timestamp_column, model_graph_node) %}

{%- set timestamp_column = elementary.get_timestamp_column(timestamp_column, model_graph_node) %}
{%- set time_bucket = elementary.get_time_bucket(time_bucket, model_graph_node) %}

{% do elementary.validate_seasonality_parameter(seasonality=seasonality, time_bucket=time_bucket, timestamp_column=timestamp_column) %}
{% set days_back = elementary.get_days_back(seasonality=seasonality) %}
Expand Down

0 comments on commit 133ed73

Please sign in to comment.