From a5229ef52f6d58fc3095890dca3d5e830ca3f0f7 Mon Sep 17 00:00:00 2001 From: Halyna Romanyshyn <30292604+halyna1995@users.noreply.github.com> Date: Tue, 28 Jul 2026 18:00:43 +0200 Subject: [PATCH 1/5] Complete Week 13 dbt Databricks task --- .env.example | 6 + .gitignore | 1 + task-2/.user.yml | 1 + task-2/README.md | 53 + task-2/WRITEUP.md | 47 + .../dbt_utils/.circleci/config.yml | 104 ++ .../dbt_packages/dbt_utils/.github/CODEOWNERS | 1 + .../.github/ISSUE_TEMPLATE/bug_report.md | 60 + .../ISSUE_TEMPLATE/dbt_minor_release.md | 29 + .../.github/ISSUE_TEMPLATE/feature_request.md | 25 + .../ISSUE_TEMPLATE/utils_minor_release.md | 38 + .../.github/pull_request_template.md | 23 + .../dbt_utils/.github/workflows/ci.yml | 46 + .../workflows/create-table-of-contents.yml | 30 + .../dbt_utils/.github/workflows/stale.yml | 30 + .../.github/workflows/triage-labels.yml | 31 + task-2/dbt_packages/dbt_utils/.gitignore | 21 + task-2/dbt_packages/dbt_utils/CHANGELOG.md | 644 +++++++ task-2/dbt_packages/dbt_utils/CONTRIBUTING.md | 89 + task-2/dbt_packages/dbt_utils/LICENSE | 201 +++ task-2/dbt_packages/dbt_utils/Makefile | 25 + task-2/dbt_packages/dbt_utils/README.md | 1498 +++++++++++++++++ task-2/dbt_packages/dbt_utils/RELEASE.md | 26 + task-2/dbt_packages/dbt_utils/dbt_project.yml | 11 + .../dbt_utils/dev-requirements.txt | 10 + .../dbt_packages/dbt_utils/docker-compose.yml | 7 + .../dbt_utils/docs/decisions/README.md | 4 + ...0000-documenting-architecture-decisions.md | 60 + .../adr-0001-decision-record-format.md | 38 + .../adr-0002-cross-database-utils.md | 87 + .../dbt_utils/integration_tests/.gitignore | 7 + .../dbt_utils/integration_tests/README.md | 120 ++ .../dbt_utils/integration_tests/data/.gitkeep | 0 .../data/datetime/data_date_spine.csv | 10 + .../data/etc/data_people.csv | 101 ++ .../data/geo/data_haversine_km.csv | 2 + .../data/geo/data_haversine_mi.csv | 2 + .../data_cardinality_equality_a.csv | 4 + .../data_cardinality_equality_b.csv | 4 + .../schema_tests/data_not_null_proportion.csv | 11 + .../schema_tests/data_test_accepted_range.csv | 3 + .../schema_tests/data_test_at_least_one.csv | 3 + .../schema_tests/data_test_equal_rowcount.csv | 4 + .../schema_tests/data_test_equality_a.csv | 4 + .../schema_tests/data_test_equality_b.csv | 4 + .../data_test_equality_floats_a.csv | 11 + .../data_test_equality_floats_b.csv | 11 + .../data_test_equality_floats_columns_a.csv | 11 + .../data_test_equality_floats_columns_b.csv | 11 + .../data_test_expression_is_true.csv | 4 + .../data_test_fewer_rows_than_table_1.csv | 4 + .../data_test_fewer_rows_than_table_2.csv | 5 + ...test_mutually_exclusive_ranges_no_gaps.csv | 4 + ...st_mutually_exclusive_ranges_with_gaps.csv | 5 + ...exclusive_ranges_with_gaps_zero_length.csv | 8 + .../data_test_not_accepted_values.csv | 5 + .../schema_tests/data_test_not_constant.csv | 4 + .../data_test_relationships_where_table_1.csv | 4 + .../data_test_relationships_where_table_2.csv | 4 + .../data_test_sequential_timestamps.csv | 5 + .../data_test_sequential_values.csv | 6 + .../data_unique_combination_of_columns.csv | 7 + .../data/schema_tests/schema.yml | 21 + .../data/sql/data_deduplicate.csv | 4 + .../data/sql/data_deduplicate_expected.csv | 2 + .../data/sql/data_events_20180101.csv | 3 + .../data/sql/data_events_20180102.csv | 3 + .../data/sql/data_events_20180103.csv | 3 + .../sql/data_filtered_columns_in_relation.csv | 4 + ..._filtered_columns_in_relation_expected.csv | 2 + .../data/sql/data_generate_series.csv | 11 + .../data/sql/data_generate_surrogate_key.csv | 5 + .../data/sql/data_get_column_values.csv | 12 + .../sql/data_get_column_values_dropped.csv | 12 + .../data/sql/data_get_column_values_where.csv | 12 + .../data_get_column_values_where_expected.csv | 5 + .../sql/data_get_query_results_as_dict.csv | 4 + .../data/sql/data_get_single_value.csv | 2 + .../data/sql/data_nullcheck_table.csv | 4 + .../integration_tests/data/sql/data_pivot.csv | 5 + .../data/sql/data_pivot_expected.csv | 3 + .../sql/data_pivot_expected_apostrophe.csv | 3 + .../data/sql/data_safe_add.csv | 5 + .../data/sql/data_safe_divide.csv | 9 + ...ta_safe_divide_denominator_expressions.csv | 7 + ...data_safe_divide_numerator_expressions.csv | 7 + .../data/sql/data_safe_subtract.csv | 5 + .../integration_tests/data/sql/data_star.csv | 4 + .../data/sql/data_star_aggregate.csv | 5 + .../data/sql/data_star_aggregate_expected.csv | 4 + .../data/sql/data_star_expected.csv | 4 + .../sql/data_star_prefix_suffix_expected.csv | 4 + .../data/sql/data_star_quote_identifiers.csv | 2 + .../data/sql/data_union_events_expected.csv | 7 + .../data/sql/data_union_exclude_expected.csv | 6 + .../data/sql/data_union_expected.csv | 6 + .../data/sql/data_union_table_1.csv | 4 + .../data/sql/data_union_table_2.csv | 3 + .../data/sql/data_unpivot.csv | 4 + .../data/sql/data_unpivot_bool.csv | 4 + .../data/sql/data_unpivot_bool_expected.csv | 10 + .../data/sql/data_unpivot_expected.csv | 7 + .../data_unpivot_original_api_expected.csv | 10 + .../data/sql/data_unpivot_quote.csv | 4 + .../data/sql/data_unpivot_quote_expected.csv | 7 + .../data/sql/data_width_bucket.csv | 9 + .../data/web/data_url_host.csv | 7 + .../data/web/data_url_path.csv | 5 + .../integration_tests/data/web/data_urls.csv | 3 + .../integration_tests/dbt_project.yml | 81 + .../integration_tests/macros/.gitkeep | 0 .../macros/assert_equal_values.sql | 32 + .../integration_tests/macros/limit_zero.sql | 11 + .../integration_tests/macros/tests.sql | 12 + .../models/datetime/schema.yml | 7 + .../models/datetime/test_date_spine.sql | 26 + .../generic_tests/equality_less_columns.sql | 9 + .../generic_tests/recency_time_excluded.sql | 12 + .../generic_tests/recency_time_included.sql | 4 + .../models/generic_tests/schema.yml | 263 +++ .../test_equal_column_subset.sql | 9 + .../generic_tests/test_equal_rowcount.sql | 9 + .../generic_tests/test_fewer_rows_than.sql | 9 + .../integration_tests/models/geo/schema.yml | 13 + .../models/geo/test_haversine_distance_km.sql | 23 + .../models/geo/test_haversine_distance_mi.sql | 39 + .../integration_tests/models/sql/schema.yml | 277 +++ .../models/sql/test_deduplicate.sql | 21 + .../models/sql/test_generate_series.sql | 15 + .../sql/test_generate_surrogate_key.sql | 14 + .../models/sql/test_get_column_values.sql | 29 + .../sql/test_get_column_values_where.sql | 6 + .../test_get_filtered_columns_in_relation.sql | 16 + .../sql/test_get_relations_by_pattern.sql | 18 + ...test_get_relations_by_prefix_and_union.sql | 6 + .../models/sql/test_get_single_value.sql | 42 + .../sql/test_get_single_value_default.sql | 28 + .../models/sql/test_groupby.sql | 24 + .../sql/test_not_empty_string_failing.sql | 41 + .../sql/test_not_empty_string_passing.sql | 33 + .../models/sql/test_nullcheck_table.sql | 41 + .../models/sql/test_pivot.sql | 17 + .../models/sql/test_pivot_apostrophe.sql | 17 + .../models/sql/test_safe_add.sql | 12 + .../models/sql/test_safe_divide.sql | 38 + .../models/sql/test_safe_subtract.sql | 12 + .../models/sql/test_star.sql | 13 + .../models/sql/test_star_aggregate.sql | 16 + .../models/sql/test_star_no_columns.sql | 11 + .../models/sql/test_star_prefix_suffix.sql | 13 + .../sql/test_star_quote_identifiers.sql | 9 + .../models/sql/test_star_unquote_aliases.sql | 27 + .../models/sql/test_star_uppercase.sql | 13 + .../models/sql/test_union.sql | 8 + .../models/sql/test_union_base.sql | 5 + .../sql/test_union_exclude_base_lowercase.sql | 8 + .../sql/test_union_exclude_base_uppercase.sql | 8 + .../sql/test_union_exclude_lowercase.sql | 4 + .../sql/test_union_exclude_uppercase.sql | 4 + .../sql/test_union_no_source_column.sql | 6 + .../models/sql/test_union_where.sql | 5 + .../models/sql/test_union_where_base.sql | 4 + .../models/sql/test_unpivot.sql | 33 + .../models/sql/test_unpivot_bool.sql | 32 + .../models/sql/test_unpivot_quote.sql | 10 + .../models/sql/test_width_bucket.sql | 12 + .../integration_tests/models/web/schema.yml | 20 + .../models/web/test_url_host.sql | 12 + .../models/web/test_url_path.sql | 12 + .../models/web/test_urls.sql | 20 + .../dbt_utils/integration_tests/packages.yml | 3 + ...et_query_results_as_dict_objects_equal.sql | 81 + .../expect_table_columns_to_match_set.sql | 54 + .../assert_pretty_output_msg_is_string.sql | 7 + .../assert_pretty_time_is_string.sql | 7 + .../tests/jinja_helpers/test_slugify.sql | 13 + .../test_get_column_values_use_default.sql | 33 + .../test_get_single_value_multiple_rows.sql | 18 + .../macros/generic_tests/accepted_range.sql | 33 + .../macros/generic_tests/at_least_one.sql | 48 + .../generic_tests/cardinality_equality.sql | 53 + .../macros/generic_tests/equal_rowcount.sql | 76 + .../macros/generic_tests/equality.sql | 166 ++ .../generic_tests/expression_is_true.sql | 18 + .../macros/generic_tests/fewer_rows_than.sql | 80 + .../mutually_exclusive_ranges.sql | 97 ++ .../generic_tests/not_accepted_values.sql | 37 + .../macros/generic_tests/not_constant.sql | 27 + .../macros/generic_tests/not_empty_string.sql | 39 + .../generic_tests/not_null_proportion.sql | 34 + .../macros/generic_tests/recency.sql | 46 + .../generic_tests/relationships_where.sql | 51 + .../generic_tests/sequential_values.sql | 42 + .../unique_combination_of_columns.sql | 37 + .../macros/jinja_helpers/_is_ephemeral.sql | 16 + .../macros/jinja_helpers/_is_relation.sql | 5 + .../macros/jinja_helpers/log_info.sql | 7 + .../jinja_helpers/pretty_log_format.sql | 7 + .../macros/jinja_helpers/pretty_time.sql | 7 + .../macros/jinja_helpers/slugify.sql | 18 + .../dbt_utils/macros/sql/date_spine.sql | 75 + .../dbt_utils/macros/sql/deduplicate.sql | 110 ++ .../dbt_utils/macros/sql/generate_series.sql | 53 + .../macros/sql/generate_surrogate_key.sql | 29 + .../macros/sql/get_column_values.sql | 65 + .../sql/get_filtered_columns_in_relation.sql | 25 + .../macros/sql/get_query_results_as_dict.sql | 26 + .../macros/sql/get_relations_by_pattern.sql | 32 + .../macros/sql/get_relations_by_prefix.sql | 32 + .../dbt_utils/macros/sql/get_single_value.sql | 33 + .../macros/sql/get_table_types_sql.sql | 32 + .../macros/sql/get_tables_by_pattern_sql.sql | 96 ++ .../macros/sql/get_tables_by_prefix_sql.sql | 14 + .../dbt_utils/macros/sql/groupby.sql | 11 + .../macros/sql/haversine_distance.sql | 51 + .../dbt_utils/macros/sql/nullcheck.sql | 21 + .../dbt_utils/macros/sql/nullcheck_table.sql | 14 + .../dbt_utils/macros/sql/pivot.sql | 86 + .../dbt_utils/macros/sql/safe_add.sql | 28 + .../dbt_utils/macros/sql/safe_divide.sql | 7 + .../dbt_utils/macros/sql/safe_subtract.sql | 28 + .../dbt_utils/macros/sql/star.sql | 51 + .../dbt_utils/macros/sql/surrogate_key.sql | 20 + .../dbt_utils/macros/sql/union.sql | 134 ++ .../dbt_utils/macros/sql/unpivot.sql | 67 + .../dbt_utils/macros/sql/width_bucket.sql | 34 + .../dbt_utils/macros/web/get_url_host.sql | 27 + .../macros/web/get_url_parameter.sql | 13 + .../dbt_utils/macros/web/get_url_path.sql | 34 + task-2/dbt_packages/dbt_utils/pytest.ini | 8 + .../dbt_utils/run_functional_test.sh | 3 + task-2/dbt_packages/dbt_utils/run_test.sh | 17 + .../dbt_utils/supported_adapters.env | 1 + task-2/dbt_packages/dbt_utils/tox.ini | 85 + task-2/dbt_project.yml | 22 + task-2/models/marts/_fct_trips.yml | 19 + task-2/models/marts/fct_trips.sql | 36 + task-2/models/staging/_sources.yml | 12 + task-2/models/staging/_stg_trips.yml | 47 + task-2/models/staging/_stg_zones.yml | 13 + task-2/models/staging/stg_trips.sql | 63 + task-2/models/staging/stg_zones.sql | 6 + task-2/package-lock.yml | 5 + task-2/packages.yml | 3 + task-2/profiles.yml.example | 11 + task-2/pyproject.toml | 8 + task-2/screenshots/delta_history.png | Bin 0 -> 98262 bytes .../from remote system.sql/sql/inline_query | 1 + .../not_null_fct_trips_pickup_datetime.sql | 11 + .../not_null_fct_trips_trip_id.sql | 11 + .../unique_fct_trips_trip_id.sql | 14 + .../nyc_taxi/models/marts/fct_trips.sql | 29 + .../nyc_taxi/models/staging/stg_trips.sql | 57 + .../nyc_taxi/models/staging/stg_zones.sql | 6 + task-2/target/graph.gpickle | Bin 0 -> 23914 bytes task-2/target/graph_summary.json | 1 + task-2/target/manifest.json | 1 + task-2/target/osi_document.json | 1 + task-2/target/partial_parse.msgpack | Bin 0 -> 1063841 bytes .../not_null_fct_trips_pickup_datetime.sql | 25 + .../not_null_fct_trips_trip_id.sql | 25 + .../unique_fct_trips_trip_id.sql | 28 + .../run/nyc_taxi/models/marts/fct_trips.sql | 28 + .../run/nyc_taxi/models/staging/stg_trips.sql | 60 + .../run/nyc_taxi/models/staging/stg_zones.sql | 13 + task-2/target/run_results.json | 1 + task-2/target/semantic_manifest.json | 1 + .../tests/assert_fare_amount_non_negative.sql | 5 + task-2/tests/assert_pickup_before_dropoff.sql | 8 + 269 files changed, 8570 insertions(+) create mode 100644 .env.example create mode 100644 task-2/.user.yml create mode 100644 task-2/README.md create mode 100644 task-2/WRITEUP.md create mode 100644 task-2/dbt_packages/dbt_utils/.circleci/config.yml create mode 100644 task-2/dbt_packages/dbt_utils/.github/CODEOWNERS create mode 100644 task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/dbt_minor_release.md create mode 100644 task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/utils_minor_release.md create mode 100644 task-2/dbt_packages/dbt_utils/.github/pull_request_template.md create mode 100644 task-2/dbt_packages/dbt_utils/.github/workflows/ci.yml create mode 100644 task-2/dbt_packages/dbt_utils/.github/workflows/create-table-of-contents.yml create mode 100644 task-2/dbt_packages/dbt_utils/.github/workflows/stale.yml create mode 100644 task-2/dbt_packages/dbt_utils/.github/workflows/triage-labels.yml create mode 100644 task-2/dbt_packages/dbt_utils/.gitignore create mode 100644 task-2/dbt_packages/dbt_utils/CHANGELOG.md create mode 100644 task-2/dbt_packages/dbt_utils/CONTRIBUTING.md create mode 100644 task-2/dbt_packages/dbt_utils/LICENSE create mode 100644 task-2/dbt_packages/dbt_utils/Makefile create mode 100644 task-2/dbt_packages/dbt_utils/README.md create mode 100644 task-2/dbt_packages/dbt_utils/RELEASE.md create mode 100644 task-2/dbt_packages/dbt_utils/dbt_project.yml create mode 100644 task-2/dbt_packages/dbt_utils/dev-requirements.txt create mode 100644 task-2/dbt_packages/dbt_utils/docker-compose.yml create mode 100644 task-2/dbt_packages/dbt_utils/docs/decisions/README.md create mode 100644 task-2/dbt_packages/dbt_utils/docs/decisions/adr-0000-documenting-architecture-decisions.md create mode 100644 task-2/dbt_packages/dbt_utils/docs/decisions/adr-0001-decision-record-format.md create mode 100644 task-2/dbt_packages/dbt_utils/docs/decisions/adr-0002-cross-database-utils.md create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/.gitignore create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/README.md create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/.gitkeep create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/datetime/data_date_spine.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/etc/data_people.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/geo/data_haversine_km.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/geo/data_haversine_mi.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_cardinality_equality_a.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_cardinality_equality_b.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_not_null_proportion.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_accepted_range.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_at_least_one.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equal_rowcount.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_a.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_b.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_a.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_b.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_columns_a.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_columns_b.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_expression_is_true.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_fewer_rows_than_table_1.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_fewer_rows_than_table_2.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_no_gaps.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_with_gaps.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_with_gaps_zero_length.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_not_accepted_values.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_not_constant.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_relationships_where_table_1.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_relationships_where_table_2.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_sequential_timestamps.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_sequential_values.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_unique_combination_of_columns.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/schema.yml create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_deduplicate.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_deduplicate_expected.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180101.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180102.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180103.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_filtered_columns_in_relation.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_filtered_columns_in_relation_expected.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_generate_series.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_generate_surrogate_key.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_dropped.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_where.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_where_expected.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_query_results_as_dict.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_single_value.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_nullcheck_table.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot_expected.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot_expected_apostrophe.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_add.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide_denominator_expressions.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide_numerator_expressions.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_subtract.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_aggregate.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_aggregate_expected.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_expected.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_prefix_suffix_expected.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_quote_identifiers.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_events_expected.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_exclude_expected.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_expected.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_table_1.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_table_2.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_bool.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_bool_expected.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_expected.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_original_api_expected.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_quote.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_quote_expected.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_width_bucket.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/web/data_url_host.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/web/data_url_path.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/data/web/data_urls.csv create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/dbt_project.yml create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/macros/.gitkeep create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/macros/assert_equal_values.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/macros/limit_zero.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/macros/tests.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/datetime/schema.yml create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/datetime/test_date_spine.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/equality_less_columns.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/recency_time_excluded.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/recency_time_included.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/schema.yml create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_equal_column_subset.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_equal_rowcount.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_fewer_rows_than.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/geo/schema.yml create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/geo/test_haversine_distance_km.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/geo/test_haversine_distance_mi.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/schema.yml create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_deduplicate.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_generate_series.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_generate_surrogate_key.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_column_values.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_column_values_where.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_filtered_columns_in_relation.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_relations_by_pattern.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_relations_by_prefix_and_union.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_single_value.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_single_value_default.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_groupby.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_not_empty_string_failing.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_not_empty_string_passing.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_nullcheck_table.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_pivot.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_pivot_apostrophe.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_add.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_divide.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_subtract.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_aggregate.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_no_columns.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_prefix_suffix.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_quote_identifiers.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_unquote_aliases.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_uppercase.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_base.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_base_lowercase.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_base_uppercase.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_lowercase.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_uppercase.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_no_source_column.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_where.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_where_base.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot_bool.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot_quote.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_width_bucket.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/web/schema.yml create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/web/test_url_host.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/web/test_url_path.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/models/web/test_urls.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/packages.yml create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/tests/assert_get_query_results_as_dict_objects_equal.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/tests/generic/expect_table_columns_to_match_set.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/assert_pretty_output_msg_is_string.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/assert_pretty_time_is_string.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/test_slugify.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/tests/sql/test_get_column_values_use_default.sql create mode 100644 task-2/dbt_packages/dbt_utils/integration_tests/tests/sql/test_get_single_value_multiple_rows.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/accepted_range.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/at_least_one.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/cardinality_equality.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/equal_rowcount.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/equality.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/expression_is_true.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/fewer_rows_than.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/mutually_exclusive_ranges.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/not_accepted_values.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/not_constant.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/not_empty_string.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/not_null_proportion.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/recency.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/relationships_where.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/sequential_values.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/generic_tests/unique_combination_of_columns.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/jinja_helpers/_is_ephemeral.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/jinja_helpers/_is_relation.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/jinja_helpers/log_info.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/jinja_helpers/pretty_log_format.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/jinja_helpers/pretty_time.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/jinja_helpers/slugify.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/date_spine.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/deduplicate.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/generate_series.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/generate_surrogate_key.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/get_column_values.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/get_filtered_columns_in_relation.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/get_query_results_as_dict.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/get_relations_by_pattern.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/get_relations_by_prefix.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/get_single_value.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/get_table_types_sql.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/get_tables_by_pattern_sql.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/get_tables_by_prefix_sql.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/groupby.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/haversine_distance.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/nullcheck.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/nullcheck_table.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/pivot.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/safe_add.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/safe_divide.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/safe_subtract.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/star.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/surrogate_key.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/union.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/unpivot.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/sql/width_bucket.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/web/get_url_host.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/web/get_url_parameter.sql create mode 100644 task-2/dbt_packages/dbt_utils/macros/web/get_url_path.sql create mode 100644 task-2/dbt_packages/dbt_utils/pytest.ini create mode 100644 task-2/dbt_packages/dbt_utils/run_functional_test.sh create mode 100644 task-2/dbt_packages/dbt_utils/run_test.sh create mode 100644 task-2/dbt_packages/dbt_utils/supported_adapters.env create mode 100644 task-2/dbt_packages/dbt_utils/tox.ini create mode 100644 task-2/dbt_project.yml create mode 100644 task-2/models/marts/_fct_trips.yml create mode 100644 task-2/models/marts/fct_trips.sql create mode 100644 task-2/models/staging/_sources.yml create mode 100644 task-2/models/staging/_stg_trips.yml create mode 100644 task-2/models/staging/_stg_zones.yml create mode 100644 task-2/models/staging/stg_trips.sql create mode 100644 task-2/models/staging/stg_zones.sql create mode 100644 task-2/package-lock.yml create mode 100644 task-2/packages.yml create mode 100644 task-2/profiles.yml.example create mode 100644 task-2/pyproject.toml create mode 100644 task-2/screenshots/delta_history.png create mode 100644 task-2/target/compiled/nyc_taxi/from remote system.sql/sql/inline_query create mode 100644 task-2/target/compiled/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_pickup_datetime.sql create mode 100644 task-2/target/compiled/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_trip_id.sql create mode 100644 task-2/target/compiled/nyc_taxi/models/marts/_fct_trips.yml/unique_fct_trips_trip_id.sql create mode 100644 task-2/target/compiled/nyc_taxi/models/marts/fct_trips.sql create mode 100644 task-2/target/compiled/nyc_taxi/models/staging/stg_trips.sql create mode 100644 task-2/target/compiled/nyc_taxi/models/staging/stg_zones.sql create mode 100644 task-2/target/graph.gpickle create mode 100644 task-2/target/graph_summary.json create mode 100644 task-2/target/manifest.json create mode 100644 task-2/target/osi_document.json create mode 100644 task-2/target/partial_parse.msgpack create mode 100644 task-2/target/run/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_pickup_datetime.sql create mode 100644 task-2/target/run/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_trip_id.sql create mode 100644 task-2/target/run/nyc_taxi/models/marts/_fct_trips.yml/unique_fct_trips_trip_id.sql create mode 100644 task-2/target/run/nyc_taxi/models/marts/fct_trips.sql create mode 100644 task-2/target/run/nyc_taxi/models/staging/stg_trips.sql create mode 100644 task-2/target/run/nyc_taxi/models/staging/stg_zones.sql create mode 100644 task-2/target/run_results.json create mode 100644 task-2/target/semantic_manifest.json create mode 100644 task-2/tests/assert_fare_amount_non_negative.sql create mode 100644 task-2/tests/assert_pickup_before_dropoff.sql diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..65d4e7f --- /dev/null +++ b/.env.example @@ -0,0 +1,6 @@ +# Copy this file to .env and insert your own values locally. +# Never commit .env or a real Databricks token. +DATABRICKS_HOST=adb-xxxx.azuredatabricks.net +DATABRICKS_HTTP_PATH=/sql/1.0/warehouses/xxxxxxxxxxxxxxxx +DATABRICKS_TOKEN=replace_with_your_personal_token +DBT_SCHEMA=dev_your_name diff --git a/.gitignore b/.gitignore index 2b76d7c..59eb5de 100644 --- a/.gitignore +++ b/.gitignore @@ -156,3 +156,4 @@ dist vite.config.js.timestamp-* vite.config.ts.timestamp-* +profiles.yml diff --git a/task-2/.user.yml b/task-2/.user.yml new file mode 100644 index 0000000..c861053 --- /dev/null +++ b/task-2/.user.yml @@ -0,0 +1 @@ +id: 1ce21849-8a79-4b99-9849-2bb21da385b3 diff --git a/task-2/README.md b/task-2/README.md new file mode 100644 index 0000000..748cb5d --- /dev/null +++ b/task-2/README.md @@ -0,0 +1,53 @@ +# Task 2 — dbt on Databricks + +## 1. Create local secret files + +```bash +cp profiles.yml.example profiles.yml +cp ../.env.example ../.env +``` + +Fill `../.env` with your own values. Never commit `.env`, `profiles.yml`, or a token. + +## 2. Load the environment in Git Bash + +```bash +export MSYS2_ENV_CONV_EXCL='DATABRICKS_HTTP_PATH' +set -a +source ../.env +set +a +``` + +## 3. Install and verify + +```bash +uv sync +uv run dbt deps +uv run dbt debug +uv run dbt show --inline "select session_user() as dbt_identity" +``` + +The identity must be your own Databricks user, not the teacher's account. + +## 4. Create dependencies once + +```bash +uv run dbt run --select +fct_trips +``` + +## 5. Required timed runs + +```bash +uv run dbt build --select fct_trips --full-refresh +uv run dbt build --select fct_trips +``` + +Copy the real times to `WRITEUP.md`. + +## 6. Verify Delta history + +```sql +DESCRIBE HISTORY hyf.dev_halyna.fct_trips; +``` + +Save the result or screenshot and reference it in `WRITEUP.md`. diff --git a/task-2/WRITEUP.md b/task-2/WRITEUP.md new file mode 100644 index 0000000..6b6b7d3 --- /dev/null +++ b/task-2/WRITEUP.md @@ -0,0 +1,47 @@ +# Task 2 — dbt on Databricks and incremental models + +## Connection check + +- Target catalog: `hyf` +- Target schema: `dev_halyna` +- SQL warehouse: `hyf-dbt-warehouse` +- `dbt debug`: PASS + +## Build timings + +| Run | Command | Real wall-clock time | +|---|---|---:| +| Initial full build | `dbt build --select fct_trips --full-refresh` | 2m8.436s | +| Incremental rerun | `dbt build --select fct_trips` | 1m54.189s | + +The incremental rerun was modestly faster because `is_incremental()` returned +true after the target Delta table already existed. The filter using `{{ this }}` +read the maximum existing `pickup_datetime` from the current `fct_trips` table +and processed only rows with a strictly newer timestamp instead of rebuilding +the complete trip history. + +The incremental boundary uses `>` rather than `>=`. This prevents rows at the +existing maximum timestamp from being processed repeatedly and avoids duplicate +boundary records. + +The measured difference was relatively small because the total wall-clock time +also includes dbt startup, SQL warehouse execution, Delta `MERGE`, and data +tests. However, the Delta table history confirms that the second run used the +incremental `MERGE` strategy rather than performing another full table rebuild. + +## Delta history proof + + The following command was executed in Databricks SQL Editor: + +```sql +DESCRIBE HISTORY hyf.dev_halyna.fct_trips; +``` + +The Delta history shows: + +CREATE OR REPLACE TABLE AS SELECT for the full-refresh builds; +MERGE for the incremental reruns. + +Evidence: + +- Suggested screenshot path: `screenshots/delta_history.png`. diff --git a/task-2/dbt_packages/dbt_utils/.circleci/config.yml b/task-2/dbt_packages/dbt_utils/.circleci/config.yml new file mode 100644 index 0000000..d36dfc4 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/.circleci/config.yml @@ -0,0 +1,104 @@ + +version: 2.1 + +jobs: + + integration-postgres: + docker: + - image: cimg/python:3.13.7 + - image: cimg/postgres:17.5 + environment: + POSTGRES_USER: root + environment: + POSTGRES_HOST: localhost + POSTGRES_USER: root + DBT_ENV_SECRET_POSTGRES_PASS: '' + POSTGRES_PORT: 5432 + POSTGRES_DATABASE: circle_test + POSTGRES_SCHEMA: dbt_utils_integration_tests_postgres + + steps: + - checkout + - run: pip install --pre dbt-postgres -r dev-requirements.txt + - run: + name: "Run OG Tests - Postgres" + command: ./run_test.sh postgres + - store_artifacts: + path: integration_tests/logs + - store_artifacts: + path: integration_tests/target + + # The resource_class feature allows configuring CPU and RAM resources for each job. Different resource classes are available for different executors. https://circleci.com/docs/2.0/configuration-reference/#resourceclass + resource_class: large + + integration-redshift: + docker: + - image: cimg/python:3.13.7 + steps: + - checkout + - run: pip install --pre dbt-redshift -r dev-requirements.txt + - run: + name: "Run OG Tests - Redshift" + command: ./run_test.sh redshift + - store_artifacts: + path: integration_tests/logs + - store_artifacts: + path: integration_tests/target + # The resource_class feature allows configuring CPU and RAM resources for each job. Different resource classes are available for different executors. https://circleci.com/docs/2.0/configuration-reference/#resourceclass + resource_class: large + + integration-snowflake: + docker: + - image: cimg/python:3.13.7 + steps: + - checkout + - run: pip install --pre dbt-snowflake -r dev-requirements.txt + - run: + name: "Run OG Tests - Snowflake" + command: ./run_test.sh snowflake + - store_artifacts: + path: integration_tests/logs + - store_artifacts: + path: integration_tests/target + # The resource_class feature allows configuring CPU and RAM resources for each job. Different resource classes are available for different executors. https://circleci.com/docs/2.0/configuration-reference/#resourceclass + resource_class: large + + integration-bigquery: + environment: + BIGQUERY_SERVICE_KEY_PATH: "/home/circleci/bigquery-service-key.json" + docker: + - image: cimg/python:3.13.7 + steps: + - checkout + - run: pip install --pre dbt-bigquery -r dev-requirements.txt + - run: + name: Setup Environment Variables + command: echo 'export BIGQUERY_KEYFILE_JSON="$BIGQUERY_SERVICE_ACCOUNT_JSON"' >> "$BASH_ENV" + - run: + name: "Run OG Tests - BigQuery" + command: ./run_test.sh bigquery + - store_artifacts: + path: integration_tests/logs + - store_artifacts: + path: integration_tests/target + # The resource_class feature allows configuring CPU and RAM resources for each job. Different resource classes are available for different executors. https://circleci.com/docs/2.0/configuration-reference/#resourceclass + resource_class: large + +workflows: + version: 2 + test-all: + jobs: + - integration-postgres: + context: profile-postgres + - integration-redshift: + context: profile-redshift + requires: + - integration-postgres + - integration-snowflake: + context: profile-snowflake + requires: + - integration-postgres + - integration-bigquery: + context: profile-bigquery + requires: + - integration-postgres diff --git a/task-2/dbt_packages/dbt_utils/.github/CODEOWNERS b/task-2/dbt_packages/dbt_utils/.github/CODEOWNERS new file mode 100644 index 0000000..6d5d911 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/.github/CODEOWNERS @@ -0,0 +1 @@ +* @dbt-labs/dbt-package-owners diff --git a/task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/bug_report.md b/task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..dba969e --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,60 @@ +--- +name: Bug report +about: Report a bug or an issue you've found with this package +title: '' +labels: bug, triage +assignees: '' + +--- + +### Describe the bug + + +### Steps to reproduce + + +### Expected results + + +### Actual results + + +### Screenshots and log output + + +### System information +**The contents of your `packages.yml` file:** + +**Which database are you using dbt with?** +- [ ] postgres +- [ ] redshift +- [ ] bigquery +- [ ] snowflake +- [ ] other (specify: ____________) + + +**The output of `dbt --version`:** +``` + +``` + + +### Additional context + + +### Are you interested in contributing the fix? + diff --git a/task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/dbt_minor_release.md b/task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/dbt_minor_release.md new file mode 100644 index 0000000..334a4b3 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/dbt_minor_release.md @@ -0,0 +1,29 @@ +--- +name: dbt Minor Release Follow-Up +about: A checklist of tasks to complete after a minor release is made to dbt +title: 'dbt Minor Release Follow up for dbt v0.x.0' +labels: +assignees: '' +--- + + + +First, check if this is a breaking change +- [ ] Increase the upper bound of the `require-dbt-version` config in the `dbt_project.yml` +- [ ] Increase the upper bound of the dbt version in `run_test.sh` +- [ ] Create a PR against the `main` branch to see if tests pass + +If test pass, this is _not_ a breaking change. You should: +- [ ] Merge into `main` +- [ ] Create a patch release + +If tests fail, this _is_ a breaking change. You'll need to create a minor release: +- [ ] Change the PR base to be against the next `dev` branch. +- [ ] Increase the lower bound to the current dbt minor version in both the `dbt_project.yml` and `run_test.sh` files +- [ ] Fix any errors +- [ ] Merge `dev` into `main` +- [ ] Create a minor release +- [ ] Once the release is available on hub, [create a new issue](https://github.com/dbt-labs/dbt-utils/issues/new/choose) using the "dbt-utils Minor Release Checklist" template diff --git a/task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/feature_request.md b/task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..7f88355 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,25 @@ +--- +name: Feature request +about: Suggest an idea for this package +title: '' +labels: enhancement, triage +assignees: '' + +--- + +### Describe the feature +A clear and concise description of what you want to happen. + +### Describe alternatives you've considered +A clear and concise description of any alternative solutions or features you've considered. + +### Additional context +Is this feature database-specific? Which database(s) is/are relevant? Please include any other relevant context here. + +### Who will this benefit? +What kind of use case will this feature be useful for? Please be specific and provide examples, this will help us prioritize properly. + +### Are you interested in contributing this feature? + diff --git a/task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/utils_minor_release.md b/task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/utils_minor_release.md new file mode 100644 index 0000000..4de914e --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/utils_minor_release.md @@ -0,0 +1,38 @@ +--- +name: dbt-utils Minor Release Follow-up +about: A checklist of tasks to complete after making a dbt-utils minor release +title: 'dbt Minor Release Follow up for dbt-utils v0.x.0' +labels: +assignees: '' +--- + + + +## Process for each dependent package +First, check if this is a breaking change +- [ ] Increase the upper bound of the `dbt-utils` `version:` config in the `packages.yml` of the dependent package. +- [ ] Push to a new branch to see if tests pass, or test locally. + +If this is _not_ a breaking change: +- [ ] Create a patch release + +If this _is_ a breaking change: +- [ ] Fix any breaking changes +- [ ] Increase the lower bound to the current dbt-utils minor version +- [ ] Create a minor release for the package + +## Checklist of dependent packages +| Package | PR | Release | +|------------------------------------------------------------------------------|--------|-------------| +| [audit-helper](https://github.com/dbt-labs/dbt-audit-helper) | [PR]() | [Release]() | +| [codegen](https://github.com/dbt-labs/dbt-codegen) | [PR]() | [Release]() | +| [redshift](https://github.com/dbt-labs/redshift) | [PR]() | [Release]() | +| [event-logging](https://github.com/dbt-labs/dbt-event-logging) | [PR]() | [Release]() | +| [snowplow](https://github.com/dbt-labs/snowplow) | [PR]() | [Release]() | +| [external-tables](https://github.com/dbt-labs/dbt-external-tables) | [PR]() | [Release]() | +| [segment](https://github.com/dbt-labs/segment) | [PR]() | [Release]() | +| [facebook-ads](https://github.com/dbt-labs/facebook-ads) | [PR]() | [Release]() | +| [stitch-utils](https://github.com/dbt-labs/stitch-utils) | [PR]() | [Release]() | diff --git a/task-2/dbt_packages/dbt_utils/.github/pull_request_template.md b/task-2/dbt_packages/dbt_utils/.github/pull_request_template.md new file mode 100644 index 0000000..db9bbcc --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/.github/pull_request_template.md @@ -0,0 +1,23 @@ +resolves # + +### Problem + + + +### Solution + + + +## Checklist +- [ ] This code is associated with an [issue](https://github.com/dbt-labs/dbt-utils/issues) which has been triaged and [accepted for development](https://docs.getdbt.com/docs/contributing/oss-expectations#pull-requests). +- [ ] I have read [the contributing guide](https://github.com/dbt-labs/dbt-utils/blob/main/CONTRIBUTING.md) and understand what's expected of me +- [ ] I have run this code in development and it appears to resolve the stated issue +- [ ] This PR includes tests, or tests are not required/relevant for this PR +- [ ] I have updated the README.md (if applicable) diff --git a/task-2/dbt_packages/dbt_utils/.github/workflows/ci.yml b/task-2/dbt_packages/dbt_utils/.github/workflows/ci.yml new file mode 100644 index 0000000..1ca32ef --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/.github/workflows/ci.yml @@ -0,0 +1,46 @@ +# **what?** +# Run tests for dbt-utils against supported adapters + +# **why?** +# To ensure that dbt-utils works as expected with all supported adapters + +# **when?** +# On every PR, and every push to main and when manually triggered + +name: Package Integration Tests + +# Automatic triggers temporarily disabled while investigating https://github.com/dbt-labs/dbt-utils/issues/1105 +# TODO: uncomment the push and pull_request_target triggers to re-enable integration tests once the root cause is fixed +on: + # push: + # branches: + # - main + # pull_request_target: + workflow_dispatch: + + +jobs: + run-tests: + uses: dbt-labs/dbt-package-testing/.github/workflows/run_tox.yml@v1 + with: + # no need to pass postgres vars in. We can just use the defaults in the local container + # redshift + REDSHIFT_HOST: ${{ vars.REDSHIFT_HOST }} + REDSHIFT_USER: ${{ vars.REDSHIFT_USER }} + REDSHIFT_DATABASE: ${{ vars.REDSHIFT_DATABASE }} + REDSHIFT_SCHEMA: "dbt_utils_integration_tests_redshift_${{ github.run_number }}" + REDSHIFT_PORT: 5439 + # bigquery + BIGQUERY_PROJECT: ${{ vars.BIGQUERY_PROJECT }} + BIGQUERY_SCHEMA: "dbt_utils_integration_tests_bigquery_${{ github.run_number }}" + # snowflake + SNOWFLAKE_USER: ${{ vars.SNOWFLAKE_USER }} + SNOWFLAKE_ROLE: ${{ vars.SNOWFLAKE_ROLE }} + SNOWFLAKE_DATABASE: ${{ vars.SNOWFLAKE_DATABASE }} + SNOWFLAKE_WAREHOUSE: ${{ vars.SNOWFLAKE_WAREHOUSE }} + SNOWFLAKE_SCHEMA: "dbt_utils_integration_tests_snowflake_${{ github.run_number }}" + secrets: + DBT_ENV_SECRET_REDSHIFT_PASS: ${{ secrets.REDSHIFT_PASS }} + BIGQUERY_KEYFILE_JSON: ${{ secrets.BIGQUERY_KEYFILE_JSON }} + SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }} + DBT_ENV_SECRET_SNOWFLAKE_PASS: ${{ secrets.SNOWFLAKE_PASS }} diff --git a/task-2/dbt_packages/dbt_utils/.github/workflows/create-table-of-contents.yml b/task-2/dbt_packages/dbt_utils/.github/workflows/create-table-of-contents.yml new file mode 100644 index 0000000..8ba101d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/.github/workflows/create-table-of-contents.yml @@ -0,0 +1,30 @@ +# This is a basic workflow to help you get started with Actions + +name: Update table of contents + +# Controls when the workflow will run + +# Never! +on: [] + +# Disabled by Doug Beatty on 2024-04-25 to fix CI +# https://github.com/dbt-labs/dbt-utils/issues/885 +# on: +# push: +# branches: [main] +# paths: ['README.md'] + +jobs: + build: + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # actions/checkout@v3 + - run: | + curl https://raw.githubusercontent.com/ekalinin/github-markdown-toc/master/gh-md-toc -o gh-md-toc + chmod a+x gh-md-toc + ./gh-md-toc --insert --no-backup README.md + rm ./gh-md-toc + - uses: stefanzweifel/git-auto-commit-action@3ea6ae190baf489ba007f7c92608f33ce20ef04a # stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Auto update table of contents diff --git a/task-2/dbt_packages/dbt_utils/.github/workflows/stale.yml b/task-2/dbt_packages/dbt_utils/.github/workflows/stale.yml new file mode 100644 index 0000000..75a14dd --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/.github/workflows/stale.yml @@ -0,0 +1,30 @@ +# **what?** +# For issues that have been open for awhile without activity, label +# them as stale with a warning that they will be closed out. If +# anyone comments to keep the issue open, it will automatically +# remove the stale label and keep it open. + +# Stale label rules: +# awaiting_response, more_information_needed -> 90 days +# good_first_issue, help_wanted -> 360 days (a year) +# tech_debt -> 720 (2 years) +# all else defaults -> 180 days (6 months) + +# **why?** +# To keep the repo in a clean state from issues that aren't relevant anymore + +# **when?** +# Once a day + +name: "Close stale issues and PRs" +on: + schedule: + - cron: "30 1 * * *" + +permissions: + issues: write + pull-requests: write + +jobs: + stale: + uses: dbt-labs/actions/.github/workflows/stale-bot-matrix.yml@main diff --git a/task-2/dbt_packages/dbt_utils/.github/workflows/triage-labels.yml b/task-2/dbt_packages/dbt_utils/.github/workflows/triage-labels.yml new file mode 100644 index 0000000..0f88157 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/.github/workflows/triage-labels.yml @@ -0,0 +1,31 @@ +# **what?** +# When we triage issues, we sometimes need more information from the issue creator. In +# those cases we remove the `triage` label and add the `awaiting_response` label. Once we +# receive a response in the form of a comment, we want the `awaiting_response` label removed +# in favor of the `triage` label so we are aware that the issue needs action. + +# **why?** +# To help with out team triage issue tracking + +# **when?** +# This will run when a comment is added to an issue and that issue has the `awaiting_response` label. + +name: Update Triage Label + +on: issue_comment + +defaults: + run: + shell: bash + +permissions: + issues: write + +jobs: + triage_label: + if: contains(github.event.issue.labels.*.name, 'awaiting_response') + uses: dbt-labs/actions/.github/workflows/swap-labels.yml@main + with: + add_label: "triage" + remove_label: "awaiting_response" + secrets: inherit diff --git a/task-2/dbt_packages/dbt_utils/.gitignore b/task-2/dbt_packages/dbt_utils/.gitignore new file mode 100644 index 0000000..8eead12 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/.gitignore @@ -0,0 +1,21 @@ + +target/ +dbt_modules/ +dbt_packages/ +logs/ +venv/ +__pycache__ +.tox/ +/.pytest_cache/ + + +# Ignore all directories that start with 'env-' and can have any name after +env*/ + +# Do not ignore .env files in any directory and do not ignore .env directories +!.env +!*/.env/ + +# But explicitly ignore test.env files +test.env +dbt_internal_packages/ diff --git a/task-2/dbt_packages/dbt_utils/CHANGELOG.md b/task-2/dbt_packages/dbt_utils/CHANGELOG.md new file mode 100644 index 0000000..f341e23 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/CHANGELOG.md @@ -0,0 +1,644 @@ +# Unreleased +**Full Changelog**: https://github.com/dbt-labs/dbt-utils/compare/1.4.1...main + +# dbt utils v1.4.1 + +## What's Changed +* Pass recency tests when using the `--empty` flag by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/1102 +* fix/star-rename-casing by @fivetran-joemarkiewicz in https://github.com/dbt-labs/dbt-utils/pull/1107 +* fix(star): match `rename` keys to column names case-insensitively by @nnqtruong in https://github.com/dbt-labs/dbt-utils/pull/1097 + +## New Contributors +* @nnqtruong made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/1097 + +**Full Changelog**: https://github.com/dbt-labs/dbt-utils/compare/1.4.0...1.4.1 + +# dbt utils v1.4.0 + +## What's Changed +* fix(recency): handle empty tables returning NULL by @dinaatmiro in https://github.com/dbt-labs/dbt-utils/pull/1065 +* ci: pin dbt-core install to 1.latest branch by @tauhid621 in https://github.com/dbt-labs/dbt-utils/pull/1091 +* feature/star-unquote-alias-rename by @fivetran-joemarkiewicz in https://github.com/dbt-labs/dbt-utils/pull/1094 + +## New Contributors +* @dinaatmiro made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/1065 +* @tauhid621 made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/1091 + +**Full Changelog**: https://github.com/dbt-labs/dbt-utils/compare/1.3.3...1.4.0 + +# dbt utils v1.3.3 + +* fix: Render relations to avoid including time filters in source_column_name by @harshvardhan-j in https://github.com/dbt-labs/dbt-utils/pull/1061 +* Output '*' in union_relations when no columns are found in compile mode by @martinshjung in https://github.com/dbt-labs/dbt-utils/pull/832 + +## New Contributors +* @harshvardhan-j made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/1061 +* @martinshjung made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/832 + +**Full Changelog**: https://github.com/dbt-labs/dbt-utils/compare/1.3.2...1.3.3 + +# dbt utils v1.3.0 + +## What's Changed + +### New features + +* Add `quote_identifiers` parameter to `unpivot` to handle case-sensitive column names by @error418 in https://github.com/dbt-labs/dbt-utils/pull/792 + +### Fixes + +* Slugify handle empty strings by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/912 +* Update `not_null_proportion` data test to use cross-database `type_numeric()` macro by @henriblancke in https://github.com/dbt-labs/dbt-utils/pull/800 +* Fix `at_least_one` test when `group_by_columns` is configured by @katieclaiborne-duet in https://github.com/dbt-labs/dbt-utils/pull/922 + +### Documentation + +* Remove "I have added an entry to CHANGELOG.md" from the PR template by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/903 +* Add a PR checklist item for "I have read the contributing guide..." as a catch-all by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/905 +* Simplify the PR checklist in relation to testing by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/907 +* Remove the PR checklist items related to the type of change by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/909 +* Align the PR description with dbt-core, dbt-adapters, etc. by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/911 +* Contributors shouldn't edit the `CHANGELOG.md` directly anymore by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/916 +* Contributing guide instructions for allowing commits from maintainers by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/917 +* Link to tests that support `group_by_columns` by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/931 +* Expand description for the `at_least_one` data test by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/933 +* Update release instructions by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/942 + +### Under the hood + +* Move profiles config to project flags by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/926 +* Delete the old unused logo file by @anks2024 in https://github.com/dbt-labs/dbt-utils/pull/936 +* Add tox by @emmyoop in https://github.com/dbt-labs/dbt-utils/pull/919 + +## New Contributors + +* @henriblancke made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/800 +* @katieclaiborne-duet made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/922 +* @anks2024 made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/936 +* @error418 made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/792 +* @emmyoop made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/919 + +**Full Changelog**: https://github.com/dbt-labs/dbt-utils/compare/1.2.0...1.3.0 + +## 1.2.1 + +## Fixes +- Fix Jinja list append pattern for dbt-fusion compatibility in `unique_combination_of_columns` test (#1043) +- Update `require-dbt-version` upper bound to `<3.0.0` to support dbt 2.x + +**Full Changelog**: https://github.com/dbt-labs/dbt-utils/compare/1.2.0...1.2.1 + +# dbt utils v1.2.0 + +## What's Changed + +### New features +- Add option to ignore columns in equality test by @brunocostalopes in https://github.com/dbt-labs/dbt-utils/pull/765 +- The `equality` test now accepts an additional argument, `precision` to aide in comparing floating point numbers by @rlh1994 in https://github.com/dbt-labs/dbt-utils/pull/765 + +### Fixes + +* `deduplicate` macro for Databricks now uses the `QUALIFY` clause, which fixes `NULL` columns issues from the default natural join logic by @graciegoheen in https://github.com/dbt-labs/dbt-utils/pull/786 +* Use QUALIFY clause in `deduplicate` macro for Redshift by @yauhen-sobaleu in https://github.com/dbt-labs/dbt-utils/pull/811 +* get redshift external tables by @brendan-cook-87 in https://github.com/dbt-labs/dbt-utils/pull/753 +* Equality test will now raise an error when the second model has less columns than the first by @rlh1994 in https://github.com/dbt-labs/dbt-utils/pull/765 + +### Documentation + +* Update documentation for `get_column_values()` to specify that the `order_by` argument must be expressed as an aggregate function by @bakerbryce in https://github.com/dbt-labs/dbt-utils/pull/872 +* Set the correct language identifier in code blocks within the documentation by @yamotech in https://github.com/dbt-labs/dbt-utils/pull/876 +* Fix typo of `not_null_proportion` in README.md by @PChambino in https://github.com/dbt-labs/dbt-utils/pull/853 +* Fix failing example for `dbt_utils.deduplicate()` in README.md by @pruoff in https://github.com/dbt-labs/dbt-utils/pull/856 +* Link to Haversine Distance article on Wikipedia by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/889 + +### Under the hood + +* GitHub Action to close issues as stale as-needed by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/813 +* GitHub Action to add/remove triage labels as-needed by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/812 +* Instructions for the release process by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/821 +* Update dev-requirements for new pip syntax by @gwenwindflower in https://github.com/dbt-labs/dbt-utils/pull/870 +* Disable auto-generation of table of contents (TOC) by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/887 +* Update tests: -> data_tests: by @graciegoheen in https://github.com/dbt-labs/dbt-utils/pull/893 + +## New Contributors +* @yauhen-sobaleu made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/811 +* @brendan-cook-87 made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/753 +* @gwenwindflower made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/870 +* @brunocostalopes made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/765 +* @rlh1994 made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/765 +* @yamotech made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/876 +* @PChambino made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/853 +* @pruoff made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/856 + +**Full Changelog**: https://github.com/dbt-labs/dbt-utils/compare/1.1.1...1.2.0 + +## 1.1.2 + +## Fixes +- Fix Jinja list append pattern for dbt-fusion compatibility in `unique_combination_of_columns` test (#1043) +- Update `require-dbt-version` upper bound to `<3.0.0` to support dbt 2.x + +**Full Changelog**: https://github.com/dbt-labs/dbt-utils/compare/1.1.1...1.1.2 + +# dbt utils v1.1.1 +## New features +* Improve the performance of the `at_least_one` test by pruning early. This is especially helpful when running against external tables. By @joshuahuntley in https://github.com/dbt-labs/dbt-utils/pull/775 +## Fixes +* Fix legacy links in README by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/796 + +# dbt utils v1.1.0 +## What's Changed +### New functionality +* Safe subtract by @dchess in https://github.com/dbt-labs/dbt-utils/pull/748 +* Add Databricks handler for get_table_types_sql.sql by @Harmuth94 in https://github.com/dbt-labs/dbt-utils/pull/769 + +### Documentation +* Typo fix by @AndrewLane in https://github.com/dbt-labs/dbt-utils/pull/738 +* Removed remark about Dbt 0.9.6 as utils 1.0.0 is now the the default by @ilanbenb in https://github.com/dbt-labs/dbt-utils/pull/740 +* Fix link in README by @b-per in https://github.com/dbt-labs/dbt-utils/pull/743 +* Update README.md about use `where` with `accepted_range` tests by @eitsupi in https://github.com/dbt-labs/dbt-utils/pull/739 +* doc: clarify that `union_relations()` uses `union all` by @owenprough-sift in https://github.com/dbt-labs/dbt-utils/pull/760 +* Automatically generate TOC for utils readme by @joellabes in https://github.com/dbt-labs/dbt-utils/pull/486 + +### Behind the scenes +* Use CircleCI contexts for environment variables by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/754 +* fix: #755 - add whitespace control to generate_surrogate_key macro by @akv-akv in https://github.com/dbt-labs/dbt-utils/pull/756 +* Fix CI by @joellabes in https://github.com/dbt-labs/dbt-utils/pull/771 + +## New Contributors +* @AndrewLane made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/738 +* @ilanbenb made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/740 +* @eitsupi made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/739 +* @owenprough-sift made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/760 +* @akv-akv made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/756 +* @dchess made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/748 +* @Harmuth94 made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/769 + +## 1.0.1 + +## Fixes +- Fix Jinja list append pattern for dbt-fusion compatibility in `unique_combination_of_columns` test (#1043) +- Update `require-dbt-version` upper bound to `<3.0.0` to support dbt 2.x + +**Full Changelog**: https://github.com/dbt-labs/dbt-utils/compare/1.0.0...1.0.1 + +# dbt utils v1.0.0 + +## Migration Guide +The full migration guide is at https://docs.getdbt.com/guides/migration/versions/upgrading-to-dbt-utils-v1.0 + +## New features +- New macro `get_single_value` ([#696](https://github.com/dbt-labs/dbt-utils/pull/696)) +- New macro safe_divide() — Returns null when the denominator is 0, instead of throwing a divide-by-zero error. +- Add `not_empty_string` generic test that asserts column values are not an empty string. ([#632](https://github.com/dbt-labs/dbt-utils/issues/632), [#634](https://github.com/dbt-labs/dbt-utils/pull/634)) + +## Enhancements +- Implemented an optional `group_by_columns` argument across many of the generic testing macros to test for properties that only pertain to group-level or are can be more rigorously conducted at the group level. Property available in `recency`, `at_least_one`, `equal_row_count`, `fewer_rows_than`, `not_constant`, `not_null_proportion`, and `sequential` tests [#633](https://github.com/dbt-labs/dbt-utils/pull/633) +- With the addition of an on-by-default quote_identifiers flag in the star() macro, you can now disable quoting if necessary. ([#706](https://github.com/dbt-labs/dbt-utils/pull/706)) + +## Fixes +- `union()` now includes/excludes columns case-insensitively +- The `expression_is_true test` doesn’t output * unless storing failures, a cost improvement for BigQuery ([#683](https://github.com/dbt-labs/dbt-utils/issues/683), [#686](https://github.com/dbt-labs/dbt-utils/pull/686)) +- Updated the `slugify` macro to prepend "_" to column names beginning with a number since most databases do not allow names to begin with numbers. + +## Under the hood +- Remove deprecated table argument from `unpivot` ([#671](https://github.com/dbt-labs/dbt-utils/pull/671)) +- Delete the deprecated identifier macro ([#672](https://github.com/dbt-labs/dbt-utils/pull/672)) +- Handle deprecations in deduplicate macro ([#673](https://github.com/dbt-labs/dbt-utils/pull/673)) +- Fully remove varargs usage in `surrogate_key` and `safe_add` ([#674](https://github.com/dbt-labs/dbt-utils/pull/674)) +- Remove obsolete condition argument from `expression_is_true` ([#699](https://github.com/dbt-labs/dbt-utils/pull/699)) +- Explicitly stating the namespace for cross-db macros so that the dispatch logic works correctly by restoring the dbt. prefix for all migrated cross-db macros ([#701](https://github.com/dbt-labs/dbt-utils/pull/701)) + +## Contributors: +- [@CR-Lough] (https://github.com/CR-Lough) (#706) (#696) +- [@fivetran-catfritz](https://github.com/fivetran-catfritz) +- [@crowemi](https://github.com/crowemi) +- [@SimonQuvang](https://github.com/SimonQuvang) (#701) +- [@christineberger](https://github.com/christineberger) (#624) +- [@epapineau](https://github.com/epapineau) (#634) +- [@courentin](https://github.com/courentin) (#651) +- [@zachoj10](https://github.com/zachoj10) (#692) +- [@miles170](https://github.com/miles170) +- [@emilyriederer](https://github.com/emilyriederer) +# 0.9.5 +## Fixes +- Stop showing cross-db deprecation warnings for macros who have already been migrated ([#725](https://github.com/dbt-labs/dbt-utils/pull/725)) + +## 0.9.7 + +## Fixes +- Fix Jinja list append pattern for dbt-fusion compatibility in `unique_combination_of_columns` test (#1043) +- Update `require-dbt-version` upper bound to `<3.0.0` to support dbt 2.x + +**Full Changelog**: https://github.com/dbt-labs/dbt-utils/compare/0.9.6...0.9.7 + +## 0.9.3 and 0.9.4 +Rolled back due to accidental incompatibilities +# dbt-utils 0.9.2 +## What's Changed +* Remove unnecessary generated new lines in `star` by @courentin in https://github.com/dbt-labs/dbt-utils/pull/651 +* fix: Actually suppress `union_relations` source_column_name when passing `none` by @kmclaugh in https://github.com/dbt-labs/dbt-utils/pull/661 +* Make `mutually_exclusive_ranges`' test deterministic by adding `upper_bound_column` to `order by` clause by @sfc-gh-ancoleman in https://github.com/dbt-labs/dbt-utils/pull/660 +* update union_relations to use core string literal macro by @dave-connors-3 in https://github.com/dbt-labs/dbt-utils/pull/665 +* Add where clause example to get_column_values documentation by @arsenkhy in https://github.com/dbt-labs/dbt-utils/pull/623 + +## New Contributors +* @courentin made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/651 +* @kmclaugh made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/661 +* @sfc-gh-ancoleman made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/660 +* @dave-connors-3 made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/665 +* @arsenkhy made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/623 + +# dbt-utils 0.9.1 +## Fixes +- Remove cross-db dbt_utils references by @clausherther in #650 + + +# dbt-utils 0.9.0 +## Changed functionality +* 🚨 (Almost all) cross-db macros are now implemented in dbt Core instead of dbt-utils. A backwards-compatibility layer remains for now and will be removed in dbt utils 1.0 later this year. Completed by @dbeatty10 and @jtcohen6 in https://github.com/dbt-labs/dbt-utils/pull/597, https://github.com/dbt-labs/dbt-utils/pull/586 and https://github.com/dbt-labs/dbt-utils/pull/615 + * See #487 for further discussion on the backstory + * If you are a package maintainer with a dependency on these macros, prepare for their removal by switching to `{{ dbt.some_macro() }}`. Refer to [#package-ecosystem in the Community Slack](https://getdbt.slack.com/archives/CU4MRJ7QB/p1658467817852129) for further assistance +* Feature: Add option to remove the `source_column_name` on the `union_relations` macro by @christineberger in https://github.com/dbt-labs/dbt-utils/pull/624 + +## Fixes +* Use adapter.quote() instead of hardcoded BQ quoting for get_table_types_sql by @alla-bongard in https://github.com/dbt-labs/dbt-utils/pull/636 + +## Documentation +* standardize yml indentation under the 'models:' line on the README by @leoebfolsom in https://github.com/dbt-labs/dbt-utils/pull/613 +* Use MADR 3.0.0 for formatting decision records by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/614 +* Docs cleanup by @dbeatty10 in https://github.com/dbt-labs/dbt-utils/pull/620 +* Add not_accepted_values to README ToC by @david-beallor in https://github.com/dbt-labs/dbt-utils/pull/646 + +# New Contributors +* @leoebfolsom made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/613 +* @christineberger made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/624 +* @alla-bongard made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/636 +* @david-beallor made their first contribution in https://github.com/dbt-labs/dbt-utils/pull/646 +# dbt-utils v0.8.6 + +## New features +- New macros `array_append` and `array_construct` ([#595](https://github.com/dbt-labs/dbt-utils/pull/595)) + +## Fixes +- Use `*` in `star` macro if no columns (for SQLFluff) ([#605](https://github.com/dbt-labs/dbt-utils/issues/605), [#561](https://github.com/dbt-labs/dbt-utils/pull/561)) +- Only raise error within `union_relations` for `build`/`run` sub-commands ([#606](https://github.com/dbt-labs/dbt-utils/issues/606), [#607](https://github.com/dbt-labs/dbt-utils/pull/607)) + +## Quality of life +- Add slugify to list of Jinja Helpers ([#602](https://github.com/dbt-labs/dbt-utils/pull/602)) + +## Under the hood +- Fix `make test` for running integration tests locally ([#344](https://github.com/dbt-labs/dbt-utils/issues/344), [#564](https://github.com/dbt-labs/dbt-utils/issues/564), [#591](https://github.com/dbt-labs/dbt-utils/pull/591)) + +## Contributors: +- [@swanjson](https://github.com/swanjson) (#561) +- [@dataders](https://github.com/dataders) (#561) +- [@epapineau](https://github.com/epapineau) (#583) +- [@graciegoheen](https://github.com/graciegoheen) (#595) +- [@jeremyyeo](https://github.com/jeremyyeo) (#606) + +# dbt-utils v0.8.5 +## 🚨 deduplicate ([#542](https://github.com/dbt-labs/dbt-utils/pull/542), [#548](https://github.com/dbt-labs/dbt-utils/pull/548)) + +The call signature of `deduplicate` has changed. The previous call signature is marked as deprecated and will be removed in the next minor version. + +- The `group_by` argument is now deprecated and replaced by `partition_by`. +- The `order_by` argument is now required. +- The `relation_alias` argument has been removed as the macro now supports `relation` as a string directly. If you were using `relation_alias` to point to a CTE previously then you can now pass the alias directly to `relation`. + +Before: +```sql +{% macro deduplicate(relation, group_by, order_by=none, relation_alias=none) -%} +... +{% endmacro %} +``` + +After: +```sql +{% macro deduplicate(relation, partition_by, order_by) -%} +... +{% endmacro %} +``` + +## New features +- Add an optional `where` clause parameter to `get_column_values()` to filter values returned ([#511](https://github.com/dbt-labs/dbt-utils/issues/511), [#583](https://github.com/dbt-labs/dbt-utils/pull/583)) +- Add `where` parameter to `union_relations` macro ([#554](https://github.com/dbt-labs/dbt-utils/pull/554)) +- Add Postgres specific implementation of `deduplicate()` ([#548](https://github.com/dbt-labs/dbt-utils/pull/548)) +- Add Snowflake specific implementation of `deduplicate()` ([#543](https://github.com/dbt-labs/dbt-utils/issues/543), [#548](https://github.com/dbt-labs/dbt-utils/pull/548)) + +## Fixes +- Fix `union_relations` `source_column_name` none option. +- Enable a negative part_number for `split_part()` ([#557](https://github.com/dbt-labs/dbt-utils/issues/557), [#559](https://github.com/dbt-labs/dbt-utils/pull/559)) +- Make `exclude` case insensitive for `union_relations()` ([#578](https://github.com/dbt-labs/dbt-utils/issues/557), [#587](https://github.com/dbt-labs/dbt-utils/issues/587)) + +## Quality of life +- Documentation about listagg macro ([#544](https://github.com/dbt-labs/dbt-utils/issues/544), [#560](https://github.com/dbt-labs/dbt-utils/pull/560)) +- Fix links to macro section in table of contents ([#555](https://github.com/dbt-labs/dbt-utils/pull/555)) +- Use the ADR (Architectural Design Record) pattern for documenting significant decisions ([#573](https://github.com/dbt-labs/dbt-utils/pull/573)) +- Contributing guide ([#574](https://github.com/dbt-labs/dbt-utils/pull/574)) +- Add better documentation for `deduplicate()` ([#542](https://github.com/dbt-labs/dbt-utils/pull/542), [#548](https://github.com/dbt-labs/dbt-utils/pull/548)) + +## Under the hood +- Fail integration tests appropriately ([#540](https://github.com/dbt-labs/dbt-utils/issues/540), [#545](https://github.com/dbt-labs/dbt-utils/pull/545)) +- Upgrade CircleCI postgres convenience image ([#584](https://github.com/dbt-labs/dbt-utils/issues/584), [#585](https://github.com/dbt-labs/dbt-utils/pull/585)) +- Run test for `deduplicate` ([#579](https://github.com/dbt-labs/dbt-utils/issues/579), [#580](https://github.com/dbt-labs/dbt-utils/pull/580)) +- Reduce warnings when executing integration tests ([#558](https://github.com/dbt-labs/dbt-utils/issues/558), [#581](https://github.com/dbt-labs/dbt-utils/pull/581)) +- Framework for functional testing using `pytest` ([#588](https://github.com/dbt-labs/dbt-utils/pull/588)) + +## Contributors: +- [@graciegoheen](https://github.com/graciegoheen) (#560) +- [@judahrand](https://github.com/judahrand) (#548) +- [@clausherther](https://github.com/clausherther) (#555) +- [@LewisDavies](https://github.com/LewisDavies) (#554) +- [@epapineau](https://github.com/epapineau) (#583) +- [@b-per](https://github.com/b-per) (#559) +- [@dbeatty10](https://github.com/dbeatty10), [@jeremyyeo](https://github.com/jeremyyeo) (#587) + +# dbt-utils v0.8.4 +## Fixes +- Change from quotes to backticks for BQ ([#536](https://github.com/dbt-labs/dbt-utils/issues/536), [#537](https://github.com/dbt-labs/dbt-utils/pull/537)) + +# dbt-utils v0.8.3 +## New features +- A macro for deduplicating data, `deduplicate()` ([#335](https://github.com/dbt-labs/dbt-utils/issues/335), [#512](https://github.com/dbt-labs/dbt-utils/pull/512)) +- A cross-database implementation of `listagg()` ([#530](https://github.com/dbt-labs/dbt-utils/pull/530)) +- A new macro to get the columns in a relation as a list, `get_filtered_columns_in_relation()`. This is similar to the `star()` macro, but creates a Jinja list instead of a comma-separated string. ([#516](https://github.com/dbt-labs/dbt-utils/pull/516)) + +## Fixes +- `get_column_values()` once more raises an error when the model doesn't exist and there is no default provided ([#531](https://github.com/dbt-labs/dbt-utils/issues/531), [#533](https://github.com/dbt-labs/dbt-utils/pull/533)) +- `get_column_values()` raises an error when used with an ephemeral model, instead of getting stuck in a compilation loop ([#358](https://github.com/dbt-labs/dbt-utils/issues/358), [#518](https://github.com/dbt-labs/dbt-utils/pull/518)) +- BigQuery materialized views work correctly with `get_relations_by_pattern()` ([#525](https://github.com/dbt-labs/dbt-utils/pull/525)) + +## Quality of life +- Updated references to 'schema test' in project file structure and documentation ([#485](https://github.com/dbt-labs/dbt-utils/issues/485), [#521](https://github.com/dbt-labs/dbt-utils/pull/521)) +- `date_trunc()` and `datediff()` default macros now have whitespace control to assist with linting and readability [#529](https://github.com/dbt-labs/dbt-utils/pull/529) +- `star()` no longer raises an error during SQLFluff linting ([#506](https://github.com/dbt-labs/dbt-utils/issues/506), [#532](https://github.com/dbt-labs/dbt-utils/pull/532)) + +## Contributors: +- [@judahrand](https://github.com/judahrand) (#512) +- [@b-moynihan](https://github.com/b-moynihan) (#521) +- [@sunriselong](https://github.com/sunriselong) (#529) +- [@jpmmcneill](https://github.com/jpmmcneill) (#533) +- [@KamranAMalik](https://github.com/KamranAMalik) (#532) +- [@graciegoheen](https://github.com/graciegoheen) (#530) +- [@luisleon90](https://github.com/luisleon90) (#525) +- [@epapineau](https://github.com/epapineau) (#518) +- [@patkearns10](https://github.com/patkearns10) (#516) + +# dbt-utils v0.8.2 +## Fixes +- Fix union_relations error from [#473](https://github.com/dbt-labs/dbt-utils/pull/473) when no include/exclude parameters are provided ([#505](https://github.com/dbt-labs/dbt-utils/issues/505), [#509](https://github.com/dbt-labs/dbt-utils/pull/509)) + +# dbt-utils v0.8.1 +## New features +- A cross-database implementation of `any_value()` ([#497](https://github.com/dbt-labs/dbt-utils/issues/497), [#501](https://github.com/dbt-labs/dbt-utils/pull/501)) +- A cross-database implementation of `bool_or()` ([#504](https://github.com/dbt-labs/dbt-utils/pull/504)) + +## Under the hood +- also ignore `dbt_packages/` directory [#463](https://github.com/dbt-labs/dbt-utils/pull/463) +- Remove block comments to make date_spine macro compatible with the Athena connector ([#462](https://github.com/dbt-labs/dbt-utils/pull/462)) + +## Fixes +- `type_timestamp` macro now explicitly casts postgres and redshift warehouse timestamp data types as `timestamp without time zone`, to be consistent with Snowflake behaviour (`timestamp_ntz`). +- `union_relations` macro will now raise an exception if the use of `include` or `exclude` results in no columns ([#473](https://github.com/dbt-labs/dbt-utils/pull/473), [#266](https://github.com/dbt-labs/dbt-utils/issues/266)). +- `get_relations_by_pattern()` works with foreign data wrappers on Postgres again. ([#357](https://github.com/dbt-labs/dbt-utils/issues/357), [#476](https://github.com/dbt-labs/dbt-utils/pull/476)) +- `star()` will only alias columns if a prefix/suffix is provided, to allow the unmodified output to still be used in `group by` clauses etc. [#468](https://github.com/dbt-labs/dbt-utils/pull/468) +- The `sequential_values` test is now compatible with quoted columns [#479](https://github.com/dbt-labs/dbt-utils/pull/479) +- `pivot()` escapes values containing apostrophes [#503](https://github.com/dbt-labs/dbt-utils/pull/503) + +## Contributors: +- [grahamwetzler](https://github.com/grahamwetzler) (#473) +- [Aesthet](https://github.com/Aesthet) (#476) +- [Kamitenshi](https://github.com/Kamitenshi) (#462) +- [nickperrott](https://github.com/nickperrott) (#468) +- [jelstongreen](https://github.com/jelstongreen) (#468) +- [armandduijn](https://github.com/armandduijn) (#479) +- [mdutoo](https://github.com/mdutoo) (#503) + +# dbt-utils v0.8.0 +## 🚨 Breaking changes +- dbt ONE POINT OH is here! This version of dbt-utils requires _any_ version (minor and patch) of v1, which means far less need for compatibility releases in the future. +- The partition column in the `mutually_exclusive_ranges` test is now always called `partition_by_col`. This enables compatibility with `--store-failures` when multiple columns are concatenated together. If you have models built on top of the failures table, update them to reflect the new column name. ([#423](https://github.com/dbt-labs/dbt-utils/issues/423), [#430](https://github.com/dbt-labs/dbt-utils/pull/430)) + +## Contributors: +- [codigo-ergo-sum](https://github.com/codigo-ergo-sum) (#430) + +# dbt-utils 0.7.5 +🚨 This is a compatibility release in preparation for `dbt-core` v1.0.0 (🎉). Projects using dbt-utils 0.7.4 with dbt-core v1.0.0 can expect to see a deprecation warning. This will be resolved in dbt_utils v0.8.0. + +## Fixes +- Regression in `get_column_values()` where the default would not be respected if the model didn't exist. ([#444](https://github.com/dbt-labs/dbt-utils/issues/444), [#448](https://github.com/dbt-labs/dbt-utils/pull/448)) + +## Under the hood +- get_url_host() macro now correctly handles URLs beginning with android-app:// (#426) + +## Contributors: +- [foundinblank](https://github.com/foundinblank) + +# dbt-utils v0.7.4 +## Fixes +- `get_column_values()` now works correctly with mixed-quoting styles on Snowflake ([#424](https://github.com/dbt-labs/dbt-utils/issues/424), [#440](https://github.com/dbt-labs/dbt-utils/pull/440)) +- Remove extra semicolon in `insert_by_period` materialization that was causing errors ([#439](https://github.com/dbt-labs/dbt-utils/pull/439)) +- Swap `limit 0` out for `{{ limit_zero() }}` on the `slugify()` tests to allow for compatibility with [tsql-utils](https://github.com/dbt-msft/tsql-utils) ([#437](https://github.com/dbt-labs/dbt-utils/pull/437)) + +## Contributors: +- [sean-rose](https://github.com/sean-rose) +- [@swanderz](https://github.com/swanderz) + + +# dbt-utils v0.7.4b1 +:rotating_light:🚨 We have renamed the `master` branch to `main`. If you have a local version of `dbt-utils`, you will need to update to the new branch. See the [GitHub docs](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/renaming-a-branch#updating-a-local-clone-after-a-branch-name-changes) for more details. + +## Under the hood +- Bump `require-dbt-version` to have an upper bound of `'<=1.0.0'`. +- Url link fixes within the README for `not_constant`, `dateadd`, `datediff` and updated the header `Logger` to `Jinja Helpers`. ([#431](https://github.com/dbt-labs/dbt-utils/pull/431)) +- Fully qualified a `cte_name.*` in the `equality` test to avoid an Exasol error ([#420](https://github.com/dbt-labs/dbt-utils/pull/420)) +- `get_url_host()` macro now correctly handles URLs beginning with `android-app://` ([#426](https://github.com/dbt-labs/dbt-utils/pull/426)) + +## Contributors: +- [joemarkiewicz](https://github.com/fivetran-joemarkiewicz) +- [TimoKruth](https://github.com/TimoKruth) +- [foundinblank](https://github.com/foundinblank) + +# dbt-utils v0.7.3 + +## Under the hood + +- Fix bug introduced in 0.7.2 in dbt_utils.star which could cause the except argument to drop columns that were not explicitly specified ([#418](https://github.com/dbt-labs/dbt-utils/pull/418)) +- Remove deprecated argument from not_null_proportion ([#416](https://github.com/dbt-labs/dbt-utils/pull/416)) +- Change final select statement in not_null_proportion to avoid false positive failures ([#416](https://github.com/dbt-labs/dbt-utils/pull/416)) + +# dbt-utils v0.7.2 + +## Features + +- Add `not_null_proportion` generic test that allows the user to specify the minimum (`at_least`) tolerated proportion (e.g., `0.95`) of non-null values ([#411](https://github.com/dbt-labs/dbt-utils/pull/411)) + + +## Under the hood +- Allow user to provide any case type when defining the `exclude` argument in `dbt_utils.star()` ([#403](https://github.com/dbt-labs/dbt-utils/pull/403)) +- Log whole row instead of just column name in 'accepted_range' generic test to allow better visibility into failures ([#413](https://github.com/dbt-labs/dbt-utils/pull/413)) +- Use column name to group in 'get_column_values ' to allow better cross db functionality ([#407](https://github.com/dbt-labs/dbt-utils/pull/407)) + +# dbt-utils v0.7.1 + +## Under the hood + +- Declare compatibility with dbt v0.21.0, which has no breaking changes for this package ([#398](https://github.com/dbt-labs/dbt-utils/pull/398)) + + +# dbt-utils v0.7.0 +## Breaking changes + +### 🚨 New dbt version + +dbt v0.20.0 or greater is required for this release. If you are not ready to upgrade, consider using a previous release of this package. + +In accordance with the version upgrade, this package release includes breaking changes to: +- Generic (schema) tests +- `dispatch` functionality + +### 🚨 get_column_values +The order of (optional) arguments has changed in the `get_column_values` macro. + +Before: +```sql +{% macro get_column_values(table, column, order_by='count(*) desc', max_records=none, default=none) -%} +... +{% endmacro %} +``` + +After: +```sql +{% macro get_column_values(table, column, max_records=none, default=none) -%} +... +{% endmacro %} +``` +If you were relying on the position to match up your optional arguments, this may be a breaking change — in general, we recommend that you explicitly declare any optional arguments (if not all of your arguments!) +```sql +-- before: This works on previous version of dbt-utils, but on 0.7.0, the `50` would be passed through as the `order_by` argument +{% set payment_methods = dbt_utils.get_column_values( + ref('stg_payments'), + 'payment_method', + 50 +) %} + +-- after +{% set payment_methods = dbt_utils.get_column_values( + ref('stg_payments'), + 'payment_method', + max_records=50 +) %} +``` + +## Features +* Add new argument, `order_by`, to `get_column_values` (code originally in [#289](https://github.com/dbt-labs/dbt-utils/pull/289/) from [@clausherther](https://github.com/clausherther), merged via [#349](https://github.com/dbt-labs/dbt-utils/pull/349/)) +* Add `slugify` macro, and use it in the pivot macro. :rotating_light: This macro uses the `re` module, which is only available in dbt v0.19.0+. As a result, this feature introduces a breaking change. ([#314](https://github.com/dbt-labs/dbt-utils/pull/314)) +* Add `not_null_proportion` generic test that allows the user to specify the minimum (`at_least`) tolerated proportion (e.g., `0.95`) of non-null values + +## Under the hood +* Update the default implementation of concat macro to use `||` operator ([#373](https://github.com/dbt-labs/dbt-utils/pull/314) from [@ChristopheDuong](https://github.com/ChristopheDuong)). Note this may be a breaking change for adapters that support `concat()` but not `||`, such as Apache Spark. +- Use `power()` instead of `pow()` in `generate_series()` and `haversine_distance()` as they are synonyms in most SQL dialects, but some dialects only have `power()` ([#354](https://github.com/dbt-labs/dbt-utils/pull/354) from [@swanderz](https://github.com/swanderz)) +- Make `get_column_values` return the default value passed as a parameter instead of an empty string before compilation ([#304](https://github.com/dbt-labs/dbt-utils/pull/386) from [@jmriego](https://github.com/jmriego) + +# dbt-utils v0.6.6 + +## Fixes + +- make `sequential_values` generic test use `dbt_utils.type_timestamp()` to allow for compatibility with db's without timestamp data type. [#376](https://github.com/dbt-labs/dbt-utils/pull/376) from [@swanderz](https://github.com/swanderz) + +# dbt-utils v0.6.5 +## Features +* Add new `accepted_range` test ([#276](https://github.com/dbt-labs/dbt-utils/pull/276) [@joellabes](https://github.com/joellabes)) +* Make `expression_is_true` work as a column test (code originally in [#226](https://github.com/dbt-labs/dbt-utils/pull/226/) from [@elliottohara](https://github.com/elliottohara), merged via [#313](https://github.com/dbt-labs/dbt-utils/pull/313/)) +* Add new generic test, `not_accepted_values` ([#284](https://github.com/dbt-labs/dbt-utils/pull/284) [@JavierMonton](https://github.com/JavierMonton)) +* Support a new argument, `zero_length_range_allowed` in the `mutually_exclusive_ranges` test ([#307](https://github.com/dbt-labs/dbt-utils/pull/307) [@zemekeneng](https://github.com/zemekeneng)) +* Add new generic test, `sequential_values` ([#318](https://github.com/dbt-labs/dbt-utils/pull/318), inspired by [@hundredwatt](https://github.com/hundredwatt)) +* Support `quarter` in the `postgres__last_day` macro ([#333](https://github.com/dbt-labs/dbt-utils/pull/333/files) [@seunghanhong](https://github.com/seunghanhong)) +* Add new argument, `unit`, to `haversine_distance` ([#340](https://github.com/dbt-labs/dbt-utils/pull/340) [@bastienboutonnet](https://github.com/bastienboutonnet)) +* Add new generic test, `fewer_rows_than` (code originally in [#221](https://github.com/dbt-labs/dbt-utils/pull/230/) from [@dmarts](https://github.com/dmarts), merged via [#343](https://github.com/dbt-labs/dbt-utils/pull/343/)) + +## Fixes +* Handle booleans gracefully in the unpivot macro ([#305](https://github.com/dbt-labs/dbt-utils/pull/305) [@avishalom](https://github.com/avishalom)) +* Fix a bug in `get_relation_by_prefix` that happens with Snowflake external tables. Now the macro will retrieve tables that match the prefix which are external tables ([#351](https://github.com/dbt-labs/dbt-utils/pull/351)) +* Fix `cardinality_equality` test when the two tables' column names differed ([#334](https://github.com/dbt-labs/dbt-utils/pull/334) [@joellabes](https://github.com/joellabes)) + +## Under the hood +* Fix Markdown formatting for hub rendering ([#336](https://github.com/dbt-labs/dbt-utils/issues/350) [@coapacetic](https://github.com/coapacetic)) +* Reorder readme and improve docs + +# dbt-utils v0.6.4 + +### Fixes +- Fix `insert_by_period` to support `dbt v0.19.0`, with backwards compatibility for earlier versions ([#319](https://github.com/dbt-labs/dbt-utils/pull/319), [#320](https://github.com/dbt-labs/dbt-utils/pull/320)) + +### Under the hood +- Speed up CI via threads, workflows ([#315](https://github.com/dbt-labs/dbt-utils/pull/315), [#316](https://github.com/dbt-labs/dbt-utils/pull/316)) +- Fix `equality` test when used with ephemeral models + explicit column set ([#321](https://github.com/dbt-labs/dbt-utils/pull/321)) +- Fix `get_query_results_as_dict` integration test with consistent ordering ([#322](https://github.com/dbt-labs/dbt-utils/pull/322)) +- All macros are now properly dispatched, making it possible for non-core adapters to implement a shim package for dbt-utils ([#312](https://github.com/dbt-labs/dbt-utils/pull/312)) Thanks [@chaerinlee1](https://github.com/chaerinlee1) and [@swanderz](https://github.com/swanderz) +- Small, non-breaking changes to accomodate TSQL (can't group by column number references, no real TRUE/FALSE values, aggregation CTEs need named columns) ([#310](https://github.com/dbt-labs/dbt-utils/pull/310)) Thanks [@swanderz](https://github.com/swanderz) +- Make `get_relations_by_pattern` and `get_relations_by_prefix` more powerful by returning `relation.type` ([#323](https://github.com/dbt-labs/dbt-utils/pull/323)) + +# dbt-utils v0.6.3 + +- Bump `require-dbt-version` to `[">=0.18.0", "<0.20.0"]` to support dbt v0.19.0 ([#308](https://github.com/dbt-labs/dbt-utils/pull/308), [#309](https://github.com/dbt-labs/dbt-utils/pull/309)) + +# dbt-utils v0.6.2 + +## Fixes +- Fix the logic in `get_tables_by_pattern_sql` to ensure non-default arguments are respected ([#279](https://github.com/dbt-labs/dbt-utils/pull/279)) + + +# dbt-utils v0.6.1 + +## Fixes +- Fix the logic in `get_tables_by_pattern_sql` for matching a schema pattern on BigQuery ([#275](https://github.com/dbt-labs/dbt-utils/pull/275/)) + +# dbt-utils v0.6.0 + +## Breaking changes +- :rotating_light: dbt v0.18.0 or greater is required for this release. If you are not ready to upgrade, consider using a previous release of this package +- :rotating_light: The `get_tables_by_prefix`, `union_tables` and `get_tables_by_pattern` macros have been removed + +## Migration instructions +- Upgrade your dbt project to v0.18.0 using [these instructions](https://discourse.getdbt.com/t/prerelease-v0-18-0-marian-anderson/1545). +- Upgrade your `packages.yml` file to use version `0.6.0` of this package. Run `dbt clean` and `dbt deps`. +- If your project uses the `get_tables_by_prefix` macro, replace it with `get_relations_by_prefix`. All arguments have retained the same name. +- If your project uses the `union_tables` macro, replace it with `union_relations`. While the order of arguments has stayed consistent, the `tables` argument has been renamed to `relations`. Further, the default value for the `source_column_name` argument has changed from `'_dbt_source_table'` to `'_dbt_source_relation'` — you may want to explicitly define this argument to avoid breaking changes. + +```sql +-- before: +{{ dbt_utils.union_tables( + tables=[ref('my_model'), source('my_source', 'my_table')], + exclude=["_loaded_at"] +) }} + +-- after: +{{ dbt_utils.union_relations( + relations=[ref('my_model'), source('my_source', 'my_table')], + exclude=["_loaded_at"], + source_column_name='_dbt_source_table' +) }} +``` +- If your project uses the `get_tables_by_pattern` macro, replace it with `get_tables_by_pattern_sql` — all arguments are consistent. + +## Features + +* Switch usage of `adapter_macro` to `adapter.dispatch`, and define `dbt_utils_dispatch_list`, +enabling users of community-supported database plugins to add or override macro implementations +specific to their database ([#267](https://github.com/dbt-labs/dbt-utils/pull/267)) +* Use `add_ephemeral_prefix` instead of hard-coding a string literal, to support +database adapters that use different prefixes ([#267](https://github.com/dbt-labs/dbt-utils/pull/267)) +* Implement a quote_columns argument in the unique_combination_of_columns generic test ([#270](https://github.com/dbt-labs/dbt-utils/pull/270) [@JoshuaHuntley](https://github.com/JoshuaHuntley)) + +## Quality of life +* Remove deprecated macros `get_tables_by_prefix` and `union_tables` ([#268](https://github.com/dbt-labs/dbt-utils/pull/268)) +* Remove `get_tables_by_pattern` macro, which is equivalent to the `get_tables_by_pattern_sql` macro (the latter has a more logical name) ([#268](https://github.com/dbt-labs/dbt-utils/pull/268)) + +# dbt-utils v0.5.1 + +## Quality of life +* Improve release process, and fix tests ([#251](https://github.com/dbt-labs/dbt-utils/pull/251)) +* Make deprecation warnings more useful ([#258](https://github.com/dbt-labs/dbt-utils/pull/258) [@tayloramurphy](https://github.com/tayloramurphy)) +* Add more docs for `date_spine` ([#265](https://github.com/dbt-labs/dbt-utils/pull/265) [@calvingiles](https://github.com/calvingiles)) diff --git a/task-2/dbt_packages/dbt_utils/CONTRIBUTING.md b/task-2/dbt_packages/dbt_utils/CONTRIBUTING.md new file mode 100644 index 0000000..f5c5e19 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/CONTRIBUTING.md @@ -0,0 +1,89 @@ +# Contributing to `dbt-utils` + +`dbt-utils` is open source software. It is what it is today because community members have opened issues, provided feedback, and [contributed to the knowledge loop](https://www.getdbt.com/dbt-labs/values/). Whether you are a seasoned open source contributor or a first-time committer, we welcome and encourage you to contribute code, documentation, ideas, or problem statements to this project. + +Remember: all PRs (apart from cosmetic fixes like typos) should be [associated with an issue](https://docs.getdbt.com/docs/contributing/oss-expectations#pull-requests). + +1. [About this document](#about-this-document) +1. [Getting the code](#getting-the-code) +1. [Setting up an environment](#setting-up-an-environment) +1. [Implementation guidelines](#implementation-guidelines) +1. [Testing dbt-utils](#testing) +1. [Adding CHANGELOG Entry](#adding-changelog-entry) +1. [Submitting a Pull Request](#submitting-a-pull-request) + +Enable greater collaboration by selecting ["Allow edits from maintainers"](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork#enabling-repository-maintainer-permissions-on-existing-pull-requests) which will allow commits on your PR branch. + +## About this document + +There are many ways to contribute to the ongoing development of `dbt-utils`, such as by participating in discussions and issues. We encourage you to first read our higher-level document: ["Expectations for Open Source Contributors"](https://docs.getdbt.com/docs/contributing/oss-expectations). + +The rest of this document serves as a more granular guide for contributing code changes to `dbt-utils` (this repository). It is not intended as a guide for using `dbt-utils`, and some pieces assume a level of familiarity with Python development (virtualenvs, `pip`, etc). Specific code snippets in this guide assume you are using macOS or Linux and are comfortable with the command line. + +### Notes + +- **CLA:** Please note that anyone contributing code to `dbt-utils` must sign the [Contributor License Agreement](https://docs.getdbt.com/docs/contributor-license-agreements). If you are unable to sign the CLA, the `dbt-utils` maintainers will unfortunately be unable to merge any of your Pull Requests. We welcome you to participate in discussions, open issues, and comment on existing ones. +- **Branches:** All pull requests from community contributors should target the `main` branch (default). If the change is needed as a patch for a version of `dbt-utils` that has already been released (or is already a release candidate), a maintainer will backport the changes in your PR to the relevant branch. + +## Getting the code + +### Installing git + +You will need `git` in order to download and modify the `dbt-utils` source code. On macOS, the best way to download git is to just install [Xcode](https://developer.apple.com/support/xcode/). + +### External contributors + +If you are not a member of the `dbt-labs` GitHub organization, you can contribute to `dbt-utils` by forking the `dbt-utils` repository. For a detailed overview on forking, check out the [GitHub docs on forking](https://help.github.com/en/articles/fork-a-repo). In short, you will need to: + +1. Fork the `dbt-utils` repository +2. Clone your fork locally +3. Check out a new branch for your proposed changes +4. Push changes to your fork +5. Open a pull request against `dbt-labs/dbt-utils` from your forked repository + +### dbt Labs contributors + +If you are a member of the `dbt-labs` GitHub organization, you will have push access to the `dbt-utils` repo. Rather than forking `dbt-utils` to make your changes, just clone the repository, check out a new branch, and push directly to that branch. + +## Setting up an environment + +There are some tools that will be helpful to you in developing locally. While this is the list relevant for `dbt-utils` development, many of these tools are used commonly across open-source python projects. + +### Tools + +These are the tools used in `dbt-utils` development and testing: +- [`make`](https://users.cs.duke.edu/~ola/courses/programming/Makefiles/Makefiles.html) to run multiple setup or test steps in combination. Don't worry too much, nobody _really_ understands how `make` works, and our Makefile aims to be super simple. +- [CircleCI](https://circleci.com/) for automating tests and checks, once a PR is pushed to the `dbt-utils` repository + +A deep understanding of these tools in not required to effectively contribute to `dbt-utils`, but we recommend checking out the attached documentation if you're interested in learning more about each one. + +## Implementation guidelines + +Ensure that changes will work on "non-core" adapters by: +- dispatching any new macro(s) so non-core adapters can also use them (e.g. [the `star()` source](https://github.com/dbt-labs/dbt-utils/blob/main/macros/sql/star.sql)) +- using the `limit_zero()` macro in place of the literal string: `limit 0` +- using [`type_*` macros](https://docs.getdbt.com/reference/dbt-jinja-functions/cross-database-macros#data-type-functions) instead of explicit datatypes (e.g. [`type_timestamp()`](https://docs.getdbt.com/reference/dbt-jinja-functions/cross-database-macros#type_timestamp) instead of `TIMESTAMP` + +## Testing + +Once you're able to manually test that your code change is working as expected, it's important to run existing automated tests, as well as adding some new ones. These tests will ensure that: +- Your code changes do not unexpectedly break other established functionality +- Your code changes can handle all known edge cases +- The functionality you're adding will _keep_ working in the future + +See here for details for running existing integration tests and adding new ones: +- [integration_tests/README.md](integration_tests/README.md) + +## Adding CHANGELOG Entry + +We use [automatically generated release notes](https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes) to generate `CHANGELOG` entries. **Note:** Do not edit the `CHANGELOG.md` directly. Your modifications will be lost. + +You don't need to worry about which `dbt-utils` version your change will go into. Just create the changelog entry at the top of CHANGELOG.md and open your PR against the `main` branch. All merged changes will be included in the next minor version of `dbt-utils`. The maintainers _may_ choose to "backport" specific changes in order to patch older minor versions. In that case, a maintainer will take care of that backport after merging your PR, before releasing the new version of `dbt-utils`. + +## Submitting a Pull Request + +A `dbt-utils` maintainer will review your PR. They may suggest code revision for style or clarity, or request that you add unit or integration test(s). These are good things! We believe that, with a little bit of help, anyone can contribute high-quality code. + +Automated tests run via CircleCI. If you're a first-time contributor, all tests (including code checks and unit tests) will require a maintainer to approve. Changes in the `dbt-utils` repository trigger integration tests. + +Once all tests are passing and your PR has been approved, a `dbt-utils` maintainer will merge your changes into the active development branch. And that's it! Happy developing :tada: diff --git a/task-2/dbt_packages/dbt_utils/LICENSE b/task-2/dbt_packages/dbt_utils/LICENSE new file mode 100644 index 0000000..d807259 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 dbt Labs, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/task-2/dbt_packages/dbt_utils/Makefile b/task-2/dbt_packages/dbt_utils/Makefile new file mode 100644 index 0000000..7481cf6 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/Makefile @@ -0,0 +1,25 @@ +.DEFAULT_GOAL:=help + +.PHONY: test +test: ## Run the integration tests. + @\ + tox -e dbt_integration_$(target) + +.PHONY: dev +dev: ## Installs dbt-* packages in develop mode along with development dependencies. + @\ + echo "Install dbt-$(target)..."; \ + pip install --upgrade pip setuptools; \ + pip install --pre "dbt-$(target)" -r dev-requirements.txt; + +.PHONY: setup-db +setup-db: ## Setup Postgres database with docker-compose for system testing. + @\ + docker-compose up --detach postgres + +.PHONY: help +help: ## Show this help message. + @echo 'usage: make [target]' + @echo + @echo 'targets:' + @grep -E '^[8+a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/task-2/dbt_packages/dbt_utils/README.md b/task-2/dbt_packages/dbt_utils/README.md new file mode 100644 index 0000000..e4572e0 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/README.md @@ -0,0 +1,1498 @@ +This [dbt](https://github.com/dbt-labs/dbt) package contains macros that can be (re)used across dbt projects. + +## Installation Instructions + +Check [dbt Hub](https://hub.getdbt.com/dbt-labs/dbt_utils/latest/) for the latest installation instructions, or [read the docs](https://docs.getdbt.com/docs/package-management) for more information on installing packages. + +---- + + + +- [Installation Instructions](#installation-instructions) +- [Generic Tests](#generic-tests) + - [equal\_rowcount (source)](#equal_rowcount-source) + - [fewer\_rows\_than (source)](#fewer_rows_than-source) + - [equality (source)](#equality-source) + - [expression\_is\_true (source)](#expression_is_true-source) + - [recency (source)](#recency-source) + - [at\_least\_one (source)](#at_least_one-source) + - [not\_constant (source)](#not_constant-source) + - [not\_empty\_string (source)](#not_empty_string-source) + - [cardinality\_equality (source)](#cardinality_equality-source) + - [not\_null\_proportion (source)](#not_null_proportion-source) + - [not\_accepted\_values (source)](#not_accepted_values-source) + - [relationships\_where (source)](#relationships_where-source) + - [mutually\_exclusive\_ranges (source)](#mutually_exclusive_ranges-source) + - [sequential\_values (source)](#sequential_values-source) + - [unique\_combination\_of\_columns (source)](#unique_combination_of_columns-source) + - [accepted\_range (source)](#accepted_range-source) + - [Grouping in tests](#grouping-in-tests) +- [Macros](#macros) +- [Introspective macros](#introspective-macros) + - [get\_column\_values (source)](#get_column_values-source) + - [get\_filtered\_columns\_in\_relation (source)](#get_filtered_columns_in_relation-source) + - [get\_relations\_by\_pattern (source)](#get_relations_by_pattern-source) + - [get\_relations\_by\_prefix (source)](#get_relations_by_prefix-source) + - [get\_query\_results\_as\_dict (source)](#get_query_results_as_dict-source) + - [get\_single\_value (source)](#get_single_value-source) +- [SQL generators](#sql-generators) + - [date\_spine (source)](#date_spine-source) + - [deduplicate (source)](#deduplicate-source) + - [haversine\_distance (source)](#haversine_distance-source) + - [group\_by (source)](#group_by-source) + - [star (source)](#star-source) + - [union\_relations (source)](#union_relations-source) + - [generate\_series (source)](#generate_series-source) + - [generate\_surrogate\_key (source)](#generate_surrogate_key-source) + - [safe\_add (source)](#safe_add-source) + - [safe\_divide (source)](#safe_divide-source) + - [safe\_subtract (source)](#safe_subtract-source) + - [pivot (source)](#pivot-source) + - [unpivot (source)](#unpivot-source) + - [width\_bucket (source)](#width_bucket-source) +- [Web macros](#web-macros) + - [get\_url\_parameter (source)](#get_url_parameter-source) + - [get\_url\_host (source)](#get_url_host-source) + - [get\_url\_path (source)](#get_url_path-source) +- [Cross-database macros](#cross-database-macros) +- [Jinja Helpers](#jinja-helpers) + - [pretty\_time (source)](#pretty_time-source) + - [pretty\_log\_format (source)](#pretty_log_format-source) + - [log\_info (source)](#log_info-source) + - [slugify (source)](#slugify-source) +- [Materializations](#materializations) + - [insert\_by\_period](#insert_by_period) +- [Reporting bugs and contributing code](#reporting-bugs-and-contributing-code) +- [Dispatch macros](#dispatch-macros) +- [Getting started with dbt](#getting-started-with-dbt) +- [Code of Conduct](#code-of-conduct) + + + + + +---- + +## Generic Tests + +> [!NOTE] +> The recommended approach going forward is to nest all test arguments under `arguments:` if you use dbt Core 1.10.6 or higher. ([see information](https://docs.getdbt.com/reference/global-configs/behavior-changes#generic-test-arguments-property) on the `require_generic_test_arguments_property` flag). +> +> - If you use dbt Core < 1.10.6, remove the `arguments:` key from the examples below and list the actual test arguments directly under the test +> - If you use dbt Core >= 1.10.6 you can set the test arguments under `arguments:` like in the examples, or at the top level +> - If you use Fusion, the `arguments:` key must be used + +### equal_rowcount ([source](macros/generic_tests/equal_rowcount.sql)) + +Asserts that two relations have the same number of rows. + +**Usage:** + +```yaml +version: 2 + +models: + - name: model_name + tests: + - dbt_utils.equal_rowcount: + arguments: + compare_model: ref('other_table_name') + +``` + +This test supports the `group_by_columns` parameter; see [Grouping in tests](#grouping-in-tests) for details. + +### fewer_rows_than ([source](macros/generic_tests/fewer_rows_than.sql)) + +Asserts that the respective model has fewer rows than the model being compared. + +Usage: + +```yaml +version: 2 + +models: + - name: model_name + tests: + - dbt_utils.fewer_rows_than: + arguments: + compare_model: ref('other_table_name') +``` + +This test supports the `group_by_columns` parameter; see [Grouping in tests](#grouping-in-tests) for details. + +### equality ([source](macros/generic_tests/equality.sql)) + +Asserts the equality of two relations. Optionally specify a subset of columns to compare or exclude, and a precision to compare numeric columns on. + +**Usage:** + +```yaml +version: 2 + +models: + # compare the entire table + - name: model_name + tests: + - dbt_utils.equality: + arguments: + compare_model: ref('other_table_name') + + # only compare some of the columns + - name: model_name_compare_columns + tests: + - dbt_utils.equality: + arguments: + compare_model: ref('other_table_name') + compare_columns: + - first_column + - second_column + precision: 4 + + # compare all columns except the ones on the ignore list + - name: model_name_exclude_columns + tests: + - dbt_utils.equality: + arguments: + compare_model: ref('other_table_name') + exclude_columns: + - third_column +``` + +### expression_is_true ([source](macros/generic_tests/expression_is_true.sql)) + +Asserts that a valid SQL expression is true for all records. This is useful when checking integrity across columns. +Examples: + +- Verify an outcome based on the application of basic algebraic operations between columns. +- Verify the length of a column. +- Verify the truth value of a column. + +**Usage:** + +```yaml +version: 2 + +models: + - name: model_name + tests: + - dbt_utils.expression_is_true: + arguments: + expression: "col_a + col_b = total" +``` + +The macro accepts an optional argument `where` that allows for asserting +the `expression` on a subset of all records. + +**Usage:** + +```yaml +version: 2 + +models: + - name: model_name + tests: + - dbt_utils.expression_is_true: + arguments: + expression: "col_a + col_b = total" + config: + where: "created_at > '2018-12-31'" +``` + +```yaml +version: 2 +models: + - name: model_name + columns: + - name: col_a + tests: + - dbt_utils.expression_is_true: + arguments: + expression: '>= 1' + - name: col_b + tests: + - dbt_utils.expression_is_true: + arguments: + expression: '= 1' + config: + where: col_a = 1 +``` + +### recency ([source](macros/generic_tests/recency.sql)) + +Asserts that a timestamp column in the reference model contains data that is at least as recent as the defined date interval. + +**Usage:** + +```yaml +version: 2 + +models: + - name: model_name + tests: + - dbt_utils.recency: + arguments: + datepart: day + field: created_at + interval: 1 +``` +This test supports the `group_by_columns` parameter; see [Grouping in tests](#grouping-in-tests) for details. + +### at_least_one ([source](macros/generic_tests/at_least_one.sql)) + +Asserts that a column has at least one value that is not `null`. + +**Usage:** + +```yaml +version: 2 + +models: + - name: model_name + columns: + - name: col_name + tests: + - dbt_utils.at_least_one +``` + +This test supports the `group_by_columns` parameter; see [Grouping in tests](#grouping-in-tests) for details. + +### not_constant ([source](macros/generic_tests/not_constant.sql)) + +Asserts that a column does not have the same value in all rows. + +**Usage:** + +```yaml +version: 2 + +models: + - name: model_name + columns: + - name: column_name + tests: + - dbt_utils.not_constant +``` + +This test supports the `group_by_columns` parameter; see [Grouping in tests](#grouping-in-tests) for details. + +### not_empty_string ([source](macros/generic_tests/not_empty_string.sql)) +Asserts that a column does not have any values equal to `''`. + +**Usage:** +```yaml +version: 2 + +models: + - name: model_name + columns: + - name: column_name + tests: + - dbt_utils.not_empty_string +``` + +The macro accepts an optional argument `trim_whitespace` that controls whether whitespace should be trimmed from the column when evaluating. The default is `true`. + +**Usage:** +```yaml +version: 2 + +models: + - name: model_name + columns: + - name: column_name + tests: + - dbt_utils.not_empty_string: + arguments: + trim_whitespace: false + +``` + +### cardinality_equality ([source](macros/generic_tests/cardinality_equality.sql)) + +Asserts that values in a given column have exactly the same cardinality as values from a different column in a different model. + +**Usage:** + +```yaml +version: 2 + +models: + - name: model_name + columns: + - name: from_column + tests: + - dbt_utils.cardinality_equality: + arguments: + field: other_column_name + to: ref('other_model_name') +``` + + +### not_null_proportion ([source](macros/generic_tests/not_null_proportion.sql)) + +Asserts that the proportion of non-null values present in a column is between a specified range [`at_least`, `at_most`] where `at_most` is an optional argument (default: `1.0`). + +**Usage:** + +```yaml +version: 2 + +models: + - name: my_model + columns: + - name: id + tests: + - dbt_utils.not_null_proportion: + arguments: + at_least: 0.95 +``` + +This test supports the `group_by_columns` parameter; see [Grouping in tests](#grouping-in-tests) for details. + +### not_accepted_values ([source](macros/generic_tests/not_accepted_values.sql)) + +Asserts that there are no rows that match the given values. + +Usage: + +```yaml +version: 2 + +models: + - name: my_model + columns: + - name: city + tests: + - dbt_utils.not_accepted_values: + arguments: + values: ['Barcelona', 'New York'] +``` + +### relationships_where ([source](macros/generic_tests/relationships_where.sql)) + +Asserts the referential integrity between two relations (same as the core relationships assertions) with an added predicate to filter out some rows from the test. This is useful to exclude records such as test entities, rows created in the last X minutes/hours to account for temporary gaps due to ETL limitations, etc. + +**Usage:** + +```yaml +version: 2 + +models: + - name: model_name + columns: + - name: id + tests: + - dbt_utils.relationships_where: + arguments: + to: ref('other_model_name') + field: client_id + from_condition: id <> '4ca448b8-24bf-4b88-96c6-b1609499c38b' + to_condition: created_date >= '2020-01-01' +``` + +### mutually_exclusive_ranges ([source](macros/generic_tests/mutually_exclusive_ranges.sql)) + +Asserts that for a given lower_bound_column and upper_bound_column, +the ranges between the lower and upper bounds do not overlap with the ranges +of another row. + +**Usage:** + +```yaml +version: 2 + +models: + # test that age ranges do not overlap + - name: age_brackets + tests: + - dbt_utils.mutually_exclusive_ranges: + arguments: + lower_bound_column: min_age + upper_bound_column: max_age + gaps: not_allowed + + # test that each customer can only have one subscription at a time + - name: subscriptions + tests: + - dbt_utils.mutually_exclusive_ranges: + arguments: + lower_bound_column: started_at + upper_bound_column: ended_at + partition_by: customer_id + gaps: required + + # test that each customer can have subscriptions that start and end on the same date + - name: subscriptions + tests: + - dbt_utils.mutually_exclusive_ranges: + arguments: + lower_bound_column: started_at + upper_bound_column: ended_at + partition_by: customer_id + zero_length_range_allowed: true +``` + +**Args:** + +- `lower_bound_column` (required): The name of the column that represents the +lower value of the range. Must be not null. +- `upper_bound_column` (required): The name of the column that represents the +upper value of the range. Must be not null. +- `partition_by` (optional): If a subset of records should be mutually exclusive +(e.g. all periods for a single subscription_id are mutually exclusive), use this +argument to indicate which column to partition by. `default=none` +- `gaps` (optional): Whether there can be gaps are allowed between ranges. +`default='allowed', one_of=['not_allowed', 'allowed', 'required']` +- `zero_length_range_allowed` (optional): Whether ranges can start and end on the same date. +`default=False` + +**Note:** Both `lower_bound_column` and `upper_bound_column` should be not null. +If this is not the case in your data source, consider passing a coalesce function +to the `lower_` and `upper_bound_column` arguments, like so: + +```yaml +version: 2 + +models: + - name: subscriptions + tests: + - dbt_utils.mutually_exclusive_ranges: + arguments: + lower_bound_column: coalesce(started_at, '1900-01-01') + upper_bound_column: coalesce(ended_at, '2099-12-31') + partition_by: customer_id + gaps: allowed +``` + +
+Additional `gaps` and `zero_length_range_allowed` examples + **Understanding the `gaps` argument:** + + Here are a number of examples for each allowed `gaps` argument. + +- `gaps: not_allowed`: The upper bound of one record must be the lower bound of + the next record. + + | lower_bound | upper_bound | + |-------------|-------------| + | 0 | 1 | + | 1 | 2 | + | 2 | 3 | + +- `gaps: allowed` (default): There may be a gap between the upper bound of one + record and the lower bound of the next record. + + | lower_bound | upper_bound | + |-------------|-------------| + | 0 | 1 | + | 2 | 3 | + | 3 | 4 | + +- `gaps: required`: There must be a gap between the upper bound of one record and + the lower bound of the next record (common for date ranges). + + | lower_bound | upper_bound | + |-------------|-------------| + | 0 | 1 | + | 2 | 3 | + | 4 | 5 | + + **Understanding the `zero_length_range_allowed` argument:** + Here are a number of examples for each allowed `zero_length_range_allowed` argument. + +- `zero_length_range_allowed: false`: (default) The upper bound of each record must be greater than its lower bound. + + | lower_bound | upper_bound | + |-------------|-------------| + | 0 | 1 | + | 1 | 2 | + | 2 | 3 | + +- `zero_length_range_allowed: true`: The upper bound of each record can be greater than or equal to its lower bound. + + | lower_bound | upper_bound | + |-------------|-------------| + | 0 | 1 | + | 2 | 2 | + | 3 | 4 | + +
+ +### sequential_values ([source](macros/generic_tests/sequential_values.sql)) + +This test confirms that a column contains sequential values. It can be used +for both numeric values, and datetime values, as follows: + +```yaml +version: 2 + +seeds: + - name: util_even_numbers + columns: + - name: i + tests: + - dbt_utils.sequential_values: + arguments: + interval: 2 + + + - name: util_hours + columns: + - name: date_hour + tests: + - dbt_utils.sequential_values: + arguments: + interval: 1 + datepart: 'hour' +``` + +**Args:** + +- `interval` (default=1): The gap between two sequential values +- `datepart` (default=None): Used when the gaps are a unit of time. If omitted, the test will check for a numeric gap. + +This test supports the `group_by_columns` parameter; see [Grouping in tests](#grouping-in-tests) for details. + +### unique_combination_of_columns ([source](macros/generic_tests/unique_combination_of_columns.sql)) + +Asserts that the combination of columns is unique. For example, the +combination of month and product is unique, however neither column is unique +in isolation. + +We generally recommend testing this uniqueness condition by either: + +- generating a [surrogate_key](#generate_surrogate_key-source) for your model and testing +the uniqueness of said key, OR +- passing the `unique` test a concatenation of the columns: + ```yaml + models: + - name: revenue_by_product_by_month + tests: + - unique: + column_name: "month || '-' || product" + ``` + +However, these approaches can become non-perfomant on large data sets, in which +case we recommend using this test instead. + +**Usage:** + +```yaml +- name: revenue_by_product_by_month + tests: + - dbt_utils.unique_combination_of_columns: + arguments: + combination_of_columns: + - month + - product +``` + +An optional `quote_columns` argument (`default=false`) can also be used if a column name needs to be quoted. + +```yaml +- name: revenue_by_product_by_month + tests: + - dbt_utils.unique_combination_of_columns: + arguments: + combination_of_columns: + - month + - group + quote_columns: true + +``` + +### accepted_range ([source](macros/generic_tests/accepted_range.sql)) + +Asserts that a column's values fall inside an expected range. Any combination of `min_value` and `max_value` is allowed, and the range can be inclusive or exclusive. Provide [a `where` argument](https://docs.getdbt.com/reference/resource-configs/where) to filter to specific records only. + +In addition to comparisons to a scalar value, you can also compare to another column's values. Any data type that supports the `>` or `<` operators can be compared, so you could also run tests like checking that all order dates are in the past. + +**Usage:** + +```yaml +version: 2 + +models: + - name: model_name + columns: + - name: user_id + tests: + - dbt_utils.accepted_range: + arguments: + min_value: 0 + inclusive: false + + - name: account_created_at + tests: + - dbt_utils.accepted_range: + arguments: + max_value: "getdate()" + #inclusive is true by default + + - name: num_returned_orders + tests: + - dbt_utils.accepted_range: + arguments: + min_value: 0 + max_value: "num_orders" + + - name: num_web_sessions + tests: + - dbt_utils.accepted_range: + arguments: + min_value: 0 + inclusive: false + config: + where: "num_orders > 0" +``` + +---- + +### Grouping in tests + +Certain tests support the optional `group_by_columns` argument to provide more granularity in performing tests. This can be useful when: + +- Some data checks can only be expressed within a group (e.g. ID values should be unique within a group but can be repeated between groups) +- Some data checks are more precise when done by group (e.g. not only should table rowcounts be equal but the counts within each group should be equal) + +This feature is currently available for the following data tests: + +- [equal_rowcount](#equal_rowcount-source) +- [fewer_rows_than](#fewer_rows_than-source) +- [recency](#recency-source) +- [at_least_one](#at_least_one-source) +- [not_constant](#not_constant-source) +- [sequential_values](#sequential_values-source) +- [not_null_proportion](#not_null_proportion-source) + +To use this feature, the names of grouping variables can be passed as a list. For example, to test for at least one valid value by group, the `group_by_columns` argument could be used as follows: + +```yaml + - name: data_test_at_least_one + columns: + - name: field + tests: + - dbt_utils.at_least_one: + arguments: + group_by_columns: ['customer_segment'] +``` + +## Macros + +## Introspective macros + +These macros run a query and return the results of the query as objects. They are typically abstractions over the [statement blocks](https://docs.getdbt.com/reference/dbt-jinja-functions/statement-blocks) in dbt. + +### get_column_values ([source](macros/sql/get_column_values.sql)) + +This macro returns the unique values for a column in a given [relation](https://docs.getdbt.com/docs/writing-code-in-dbt/class-reference/#relation) as an array. + +**Args:** + +- `table` (required): a [Relation](https://docs.getdbt.com/reference/dbt-classes#relation) (a `ref` or `source`) that contains the list of columns you wish to select from +- `column` (required): The name of the column you wish to find the column values of +- `where` (optional, default=`none`): A where clause to filter the column values by. +- `order_by` (optional, default=`'count(*) desc'`): How the results should be ordered. Must be an aggregate function, i.e. count(*), max(sort_order). The default is to order by `count(*) desc`, i.e. decreasing frequency. Setting this as `'my_column'` will sort alphabetically, while `'min(created_at)'` will sort by when the value was first observed. +- `max_records` (optional, default=`none`): The maximum number of column values you want to return +- `default` (optional, default=`[]`): The results this macro should return if the relation has not yet been created (and therefore has no column values). + +**Usage:** + +```sql +-- Returns a list of the payment_methods in the stg_payments model_ +{% set payment_methods = dbt_utils.get_column_values(table=ref('stg_payments'), column='payment_method') %} + +{% for payment_method in payment_methods %} + ... +{% endfor %} + +... +``` + +```sql +-- Returns the list sorted alphabetically +{% set payment_methods = dbt_utils.get_column_values( + table=ref('stg_payments'), + where="payment_method = 'bank_transfer'", + column='payment_method', + order_by='payment_method' +) %} +``` + +```sql +-- Returns the list sorted my most recently observed +{% set payment_methods = dbt_utils.get_column_values( + table=ref('stg_payments'), + column='payment_method', + order_by='max(created_at) desc', + max_records=50, + default=['bank_transfer', 'coupon', 'credit_card'] +%} +... +``` + +### get_filtered_columns_in_relation ([source](macros/sql/get_filtered_columns_in_relation.sql)) + +This macro returns an iterable Jinja list of columns for a given [relation](https://docs.getdbt.com/docs/writing-code-in-dbt/class-reference/#relation), (i.e. not from a CTE) + +- optionally exclude columns +- the input values are not case-sensitive (input uppercase or lowercase and it will work!) + +> Note: The native [`adapter.get_columns_in_relation` macro](https://docs.getdbt.com/reference/dbt-jinja-functions/adapter#get_columns_in_relation) allows you +to pull column names in a non-filtered fashion, also bringing along with it other (potentially unwanted) information, such as dtype, char_size, numeric_precision, etc. + +**Args:** + +- `from` (required): a [Relation](https://docs.getdbt.com/reference/dbt-classes#relation) (a `ref` or `source`) that contains the list of columns you wish to select from +- `except` (optional, default=`[]`): The name of the columns you wish to exclude. (case-insensitive) + +**Usage:** + +```sql +-- Returns a list of the columns from a relation, so you can then iterate in a for loop +{% set column_names = dbt_utils.get_filtered_columns_in_relation(from=ref('your_model'), except=["field_1", "field_2"]) %} +... +{% for column_name in column_names %} + max({{ column_name }}) ... as max_'{{ column_name }}', +{% endfor %} +... +``` + +### get_relations_by_pattern ([source](macros/sql/get_relations_by_pattern.sql)) + +Returns a list of [Relations](https://docs.getdbt.com/docs/writing-code-in-dbt/class-reference/#relation) +that match a given schema- or table-name pattern. + +This macro is particularly handy when paired with `union_relations`. + +**Usage:** + +```sql +-- Returns a list of relations that match schema_pattern%.table +{% set relations = dbt_utils.get_relations_by_pattern('schema_pattern%', 'table_pattern') %} + +-- Returns a list of relations that match schema_pattern.table_pattern% +{% set relations = dbt_utils.get_relations_by_pattern('schema_pattern', 'table_pattern%') %} + +-- Returns a list of relations as above, excluding any that end in `deprecated` +{% set relations = dbt_utils.get_relations_by_pattern('schema_pattern', 'table_pattern%', '%deprecated') %} + +-- Example using the union_relations macro +{% set event_relations = dbt_utils.get_relations_by_pattern('venue%', 'clicks') %} +{{ dbt_utils.union_relations(relations = event_relations) }} +``` + +**Args:** + +- `schema_pattern` (required): The schema pattern to inspect for relations. +- `table_pattern` (required): The name of the table/view (case insensitive). +- `exclude` (optional): Exclude any relations that match this table pattern. +- `database` (optional, default = `target.database`): The database to inspect +for relations. + +**Examples:** +Generate drop statements for all Relations that match a naming pattern: + +```sql +{% set relations_to_drop = dbt_utils.get_relations_by_pattern( + schema_pattern='public', + table_pattern='dbt\_%' +) %} + +{% set sql_to_execute = [] %} + +{{ log('Statements to run:', info=True) }} + +{% for relation in relations_to_drop %} + {% set drop_command -%} + -- drop {{ relation.type }} {{ relation }} cascade; + {%- endset %} + {% do log(drop_command, info=True) %} + {% do sql_to_execute.append(drop_command) %} +{% endfor %} +``` + +### get_relations_by_prefix ([source](macros/sql/get_relations_by_prefix.sql)) + +> This macro will soon be deprecated in favor of the more flexible `get_relations_by_pattern` macro (above) + +Returns a list of [Relations](https://docs.getdbt.com/docs/writing-code-in-dbt/class-reference/#relation) +that match a given prefix, with an optional exclusion pattern. It's particularly +handy paired with `union_relations`. + +**Usage:** + +```sql +-- Returns a list of relations that match schema.prefix% +{% set relations = dbt_utils.get_relations_by_prefix('my_schema', 'my_prefix') %} + +-- Returns a list of relations as above, excluding any that end in `deprecated` +{% set relations = dbt_utils.get_relations_by_prefix('my_schema', 'my_prefix', '%deprecated') %} + +-- Example using the union_relations macro +{% set event_relations = dbt_utils.get_relations_by_prefix('events', 'event_') %} +{{ dbt_utils.union_relations(relations = event_relations) }} +``` + +**Args:** + +- `schema` (required): The schema to inspect for relations. +- `prefix` (required): The prefix of the table/view (case insensitive) +- `exclude` (optional): Exclude any relations that match this pattern. +- `database` (optional, default = `target.database`): The database to inspect +for relations. + +### get_query_results_as_dict ([source](macros/sql/get_query_results_as_dict.sql)) + +This macro returns a dictionary from a sql query, so that you don't need to interact with the Agate library to operate on the result + +**Usage:** + +```sql +{% set sql_statement %} + select city, state from {{ ref('users') }} +{% endset %} + +{%- set places = dbt_utils.get_query_results_as_dict(sql_statement) -%} + +select + + {% for city in places['CITY'] | unique -%} + sum(case when city = '{{ city }}' then 1 else 0 end) as users_in_{{ dbt_utils.slugify(city) }}, + {% endfor %} + + {% for state in places['STATE'] | unique -%} + sum(case when state = '{{ state }}' then 1 else 0 end) as users_in_{{ state }}, + {% endfor %} + + count(*) as total_total + +from {{ ref('users') }} +``` + +### get_single_value ([source](macros/sql/get_single_value.sql)) + +This macro returns a single value from a sql query, so that you don't need to interact with the Agate library to operate on the result + +**Usage:** + +```sql +{% set sql_statement %} + select max(created_at) from {{ ref('processed_orders') }} +{% endset %} + +{%- set newest_processed_order = dbt_utils.get_single_value(sql_statement, default="'2020-01-01'") -%} + +select + + *, + last_order_at > '{{ newest_processed_order }}' as has_unprocessed_order + +from {{ ref('users') }} +``` + +## SQL generators + +These macros generate SQL (either a complete query, or a part of a query). They often implement patterns that should be easy in SQL, but for some reason are much harder than they need to be. + +### date_spine ([source](macros/sql/date_spine.sql)) + +This macro returns the sql required to build a date spine. The spine will include the `start_date` (if it is aligned to the `datepart`), but it will not include the `end_date`. + +**Usage:** + +```sql +{{ dbt_utils.date_spine( + datepart="day", + start_date="cast('2019-01-01' as date)", + end_date="cast('2020-01-01' as date)" + ) +}} +``` + +### deduplicate ([source](macros/sql/deduplicate.sql)) + +This macro returns the sql required to remove duplicate rows from a model, source, or CTE. + +**Args:** + +- `relation` (required): a [Relation](https://docs.getdbt.com/reference/dbt-classes#relation) (a `ref` or `source`) or string which identifies the model to deduplicate. +- `partition_by` (required): column names (or expressions) to use to identify a set/window of rows out of which to select one as the deduplicated row. +- `order_by` (required): column names (or expressions) that determine the priority order of which row should be chosen if there are duplicates (comma-separated string). *NB.* if this order by clause results in ties then which row is returned may be nondeterministic across runs. + +**Usage:** + +```sql +{{ dbt_utils.deduplicate( + relation=source('my_source', 'my_table'), + partition_by='user_id, cast(timestamp as day)', + order_by="timestamp desc", + ) +}} +``` + +```sql +{{ dbt_utils.deduplicate( + relation=ref('my_model'), + partition_by='user_id', + order_by='effective_date desc, effective_sequence desc', + ) +}} +``` + +```sql +with my_cte as ( + select * + from {{ source('my_source', 'my_table') }} + where user_id = 1 +), +deduplicated_cte as ( + {{ dbt_utils.deduplicate( + relation='my_cte', + partition_by='user_id, cast(timestamp as date)', + order_by='timestamp desc', + ) + }} +) +select * from deduplicated_cte +``` + +### haversine_distance ([source](macros/sql/haversine_distance.sql)) + +This macro calculates the [haversine distance](https://en.wikipedia.org/wiki/Haversine_formula) between a pair of x/y coordinates. + +Optionally takes a `unit` string argument ('km' or 'mi') which defaults to miles (imperial system). + +**Usage:** + +```sql +{{ dbt_utils.haversine_distance(48.864716, 2.349014, 52.379189, 4.899431) }} + +{{ dbt_utils.haversine_distance( + lat1=48.864716, + lon1=2.349014, + lat2=52.379189, + lon2=4.899431, + unit='km' +) }} +``` + +**Args:** + +- `lat1` (required): latitude of first location +- `lon1` (required): longitude of first location +- `lat2` (required): latitude of second location +- `lon3` (required): longitude of second location +- `unit` (optional, default=`'mi'`): one of `mi` (miles) or `km` (kilometers) + +### group_by ([source](macros/sql/groupby.sql)) + +This macro builds a group by statement for fields 1...N + +**Usage:** + +```sql +{{ dbt_utils.group_by(n=3) }} +``` + +Would compile to: + +```sql +group by 1,2,3 +``` + +### star ([source](macros/sql/star.sql)) + +This macro generates a comma-separated list of all fields that exist in the `from` relation, excluding any fields +listed in the `except` argument. The construction is identical to `select * from {{ref('my_model')}}`, replacing star (`*`) with +the star macro. +This macro also has an optional `relation_alias` argument that will prefix all generated fields with an alias (`relation_alias`.`field_name`). +The macro also has optional `prefix` and `suffix` arguments. When one or both are provided, they will be concatenated onto each field's alias +in the output (`prefix` ~ `field_name` ~ `suffix`). NB: This prevents the output from being used in any context other than a select statement. +This macro also has an optional `quote_identifiers` argument that will encase the selected columns and their aliases in double quotes. + +**Args:** + +- `from` (required): a [Relation](https://docs.getdbt.com/reference/dbt-classes#relation) (a `ref` or `source`) that contains the list of columns you wish to select from +- `except` (optional, default=`[]`): The name of the columns you wish to exclude. (case-insensitive) +- `relation_alias` (optional, default=`''`): will prefix all generated fields with an alias (`relation_alias`.`field_name`). +- `prefix` (optional, default=`''`): will prefix the output `field_name` (`field_name as prefix_field_name`). +- `suffix` (optional, default=`''`): will suffix the output `field_name` (`field_name as field_name_suffix`). +- `quote_identifiers` (optional, default=`True`): will encase selected columns and aliases in double quotes (`"field_name" as "field_name"`). +- `unquote_aliases` (optional, default=`False`): when `quote_identifiers=True`, renders aliases without quotes (`"field_name" as field_name`). Useful when reading from case-sensitive sources (e.g. Polaris/Iceberg catalogs) while producing unquoted aliases for downstream models that follow default case-folding rules. +- `rename` (optional, default=`{}`): a dictionary mapping column names to custom alias names. Keys are matched to column names case-insensitively (the same way `except` is), so a key works regardless of how the warehouse folds identifier case. The alias is always rendered unquoted. Takes precedence over `unquote_aliases` and `prefix`/`suffix` for the matched column. Useful for renaming reserved-word columns that cannot safely use an unquoted alias (e.g. `rename={"comment": "ticket_comment"}`). + +**Usage:** + +```sql +select + {{ dbt_utils.star(ref('my_model')) }} +from {{ ref('my_model') }} + +``` + +```sql +select + {{ dbt_utils.star(from=ref('my_model'), quote_identifiers=False) }} +from {{ ref('my_model') }} + +``` + +```sql +select +{{ dbt_utils.star(from=ref('my_model'), except=["exclude_field_1", "exclude_field_2"]) }} +from {{ ref('my_model') }} + +``` + +```sql +select +{{ dbt_utils.star(from=ref('my_model'), except=["exclude_field_1", "exclude_field_2"], prefix="max_") }} +from {{ ref('my_model') }} + +``` + +```sql +-- Produces: "id" as id, "description" as description, "comment" as ticket_comment +select +{{ dbt_utils.star( + from=source('my_source', 'my_table'), + quote_identifiers=true, + unquote_aliases=true, + rename={"comment": "ticket_comment"} +) }} +from {{ source('my_source', 'my_table') }} + +``` + +### union_relations ([source](macros/sql/union.sql)) + +This macro combines via `union all` an array of [Relations](https://docs.getdbt.com/docs/writing-code-in-dbt/class-reference/#relation), +even when columns have differing orders in each Relation, and/or some columns are +missing from some relations. Any columns exclusive to a subset of these +relations will be filled with `null` where not present. A new column +(`_dbt_source_relation`) is also added to indicate the source for each record. + +**Usage:** + +```sql +{{ dbt_utils.union_relations( + relations=[ref('my_model'), source('my_source', 'my_table')], + exclude=["_loaded_at"] +) }} +``` + +**Args:** + +- `relations` (required): An array of [Relations](https://docs.getdbt.com/docs/writing-code-in-dbt/class-reference/#relation). +- `exclude` (optional): A list of column names that should be excluded from +the final query. +- `include` (optional): A list of column names that should be included in the +final query. Note the `include` and `exclude` arguments are mutually exclusive. +- `column_override` (optional): A dictionary of explicit column type overrides, +e.g. `{"some_field": "varchar(100)"}`.`` +- `source_column_name` (optional, `default="_dbt_source_relation"`): The name of +the column that records the source of this row. Pass `None` to omit this column from the results. +- `where` (optional): Filter conditions to include in the `where` clause. + +### generate_series ([source](macros/sql/generate_series.sql)) + +This macro implements a cross-database mechanism to generate an arbitrarily long list of numbers. Specify the maximum number you'd like in your list and it will create a 1-indexed SQL result set. + +**Usage:** + +```sql +{{ dbt_utils.generate_series(upper_bound=1000) }} +``` + +### generate_surrogate_key ([source](macros/sql/generate_surrogate_key.sql)) + +This macro implements a cross-database way to generate a hashed surrogate key using the fields specified. + +**Usage:** + +```sql +{{ dbt_utils.generate_surrogate_key(['field_a', 'field_b'[,...]]) }} +``` + +A precursor to this macro, `surrogate_key()`, treated nulls and blanks strings the same. If you need to enable this incorrect behaviour for backward compatibility reasons, add the following variable to your `dbt_project.yml`: + +```yaml +#dbt_project.yml +vars: + surrogate_key_treat_nulls_as_empty_strings: true #turn on legacy behaviour +``` + +### safe_add ([source](macros/sql/safe_add.sql)) + +This macro implements a cross-database way to sum nullable fields using the fields specified. + +**Usage:** + +```sql +{{ dbt_utils.safe_add(['field_a', 'field_b', ...]) }} +``` + +### safe_divide ([source](macros/sql/safe_divide.sql)) + +This macro performs division but returns null if the denominator is 0. + +**Args:** + +- `numerator` (required): The number or SQL expression you want to divide. +- `denominator` (required): The number or SQL expression you want to divide by. + +**Usage:** + +```sql +{{ dbt_utils.safe_divide('numerator', 'denominator') }} +``` + +### safe_subtract ([source](macros/sql/safe_subtract.sql)) + +This macro implements a cross-database way to take the difference of nullable fields using the fields specified. + +**Usage:** + +```sql +{{ dbt_utils.safe_subtract(['field_a', 'field_b', ...]) }} +``` + +### pivot ([source](macros/sql/pivot.sql)) + +This macro pivots values from rows to columns. + +**Usage:** + +```sql +{{ dbt_utils.pivot(, ) }} +``` + +**Examples:** + + Input: orders + + | size | color | + |------|-------| + | S | red | + | S | blue | + | S | red | + | M | red | + + select + size, + {{ dbt_utils.pivot( + 'color', + dbt_utils.get_column_values(ref('orders'), 'color') + ) }} + from {{ ref('orders') }} + group by size + + Output: + + | size | red | blue | + |------|-----|------| + | S | 2 | 1 | + | M | 1 | 0 | + + Input: orders + + | size | color | quantity | + |------|-------|----------| + | S | red | 1 | + | S | blue | 2 | + | S | red | 4 | + | M | red | 8 | + + select + size, + {{ dbt_utils.pivot( + 'color', + dbt_utils.get_column_values(ref('orders'), 'color'), + agg='sum', + then_value='quantity', + prefix='pre_', + suffix='_post' + ) }} + from {{ ref('orders') }} + group by size + + Output: + + | size | pre_red_post | pre_blue_post | + |------|--------------|---------------| + | S | 5 | 2 | + | M | 8 | 0 | + + +**Args:** + +- `column`: Column name, required +- `values`: List of row values to turn into columns, required +- `alias`: Whether to create column aliases, default is True +- `agg`: SQL aggregation function, default is sum +- `cmp`: SQL value comparison, default is = +- `prefix`: Column alias prefix, default is blank +- `suffix`: Column alias postfix, default is blank +- `then_value`: Value to use if comparison succeeds, default is 1 +- `else_value`: Value to use if comparison fails, default is 0 +- `quote_identifiers`: Whether to surround column aliases with double quotes, default is true + +### unpivot ([source](macros/sql/unpivot.sql)) + +This macro "un-pivots" a table from wide format to long format. Functionality is similar to pandas [melt](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.melt.html) function. +Boolean values are replaced with the strings 'true'|'false' + +**Usage:** + +```sql +{{ dbt_utils.unpivot( + relation=ref('table_name'), + cast_to='datatype', + exclude=[], + remove=[], + field_name=, + value_name= +) }} +``` + +**Usage:** + + Input: orders + + | date | size | color | status | + |------------|------|-------|------------| + | 2017-01-01 | S | red | complete | + | 2017-03-01 | S | red | processing | + + {{ dbt_utils.unpivot(ref('orders'), cast_to='varchar', exclude=['date','status']) }} + + Output: + + | date | status | field_name | value | + |------------|------------|------------|-------| + | 2017-01-01 | complete | size | S | + | 2017-01-01 | complete | color | red | + | 2017-03-01 | processing | size | S | + | 2017-03-01 | processing | color | red | + +**Args:** + +- `relation`: The [Relation](https://docs.getdbt.com/docs/writing-code-in-dbt/class-reference/#relation) to unpivot. +- `cast_to`: The data type to cast the unpivoted values to, default is varchar +- `exclude`: A list of columns to exclude from the unpivot operation but keep in the resulting table. +- `remove`: A list of columns to remove from the resulting table. +- `field_name`: column name in the resulting table for field +- `value_name`: column name in the resulting table for value +- `quote_identifiers` (optional, default=`False`): will encase selected columns and aliases in quotes according to your adapter's implementation of `adapter.quote` (e.g. `"field_name" as "field_name"`). + +### width_bucket ([source](macros/sql/width_bucket.sql)) + +This macro is modeled after the `width_bucket` function natively available in Snowflake. + +From the original Snowflake [documentation](https://docs.snowflake.net/manuals/sql-reference/functions/width_bucket.html): + +Constructs equi-width histograms, in which the histogram range is divided into intervals of identical size, and returns the bucket number into which the value of an expression falls, after it has been evaluated. The function returns an integer value or null (if any input is null). +Notes: + +**Args:** + +- `expr`: The expression for which the histogram is created. This expression must evaluate to a numeric value or to a value that can be implicitly converted to a numeric value. + +- `min_value` and `max_value`: The low and high end points of the acceptable range for the expression. The end points must also evaluate to numeric values and not be equal. + +- `num_buckets`: The desired number of buckets; must be a positive integer value. A value from the expression is assigned to each bucket, and the function then returns the corresponding bucket number. + +When an expression falls outside the range, the function returns: + +- `0` if the expression is less than min_value. +- `num_buckets + 1` if the expression is greater than or equal to max_value. + +**Usage:** + +```sql +{{ dbt_utils.width_bucket(expr, min_value, max_value, num_buckets) }} +``` + +## Web macros + +### get_url_parameter ([source](macros/web/get_url_parameter.sql)) + +This macro extracts a url parameter from a column containing a url. + +**Usage:** + +```sql +{{ dbt_utils.get_url_parameter(field='page_url', url_parameter='utm_source') }} +``` + +### get_url_host ([source](macros/web/get_url_host.sql)) + +This macro extracts a hostname from a column containing a url. + +**Usage:** + +```sql +{{ dbt_utils.get_url_host(field='page_url') }} +``` + +### get_url_path ([source](macros/web/get_url_path.sql)) + +This macro extracts a page path from a column containing a url. + +**Usage:** + +```sql +{{ dbt_utils.get_url_path(field='page_url') }} +``` + +---- + +## Cross-database macros + +These macros were removed from `dbt_utils` version 1.0, as they have been implemented in dbt Core instead. See [https://docs.getdbt.com/reference/dbt-jinja-functions/cross-database-macros](https://docs.getdbt.com/reference/dbt-jinja-functions/cross-database-macros). + +--- + +## Jinja Helpers + +### pretty_time ([source](macros/jinja_helpers/pretty_time.sql)) + +This macro returns a string of the current timestamp, optionally taking a datestring format. + +```sql +{#- This will return a string like '14:50:34' -#} +{{ dbt_utils.pretty_time() }} + +{#- This will return a string like '2019-05-02 14:50:34' -#} +{{ dbt_utils.pretty_time(format='%Y-%m-%d %H:%M:%S') }} +``` + +### pretty_log_format ([source](macros/jinja_helpers/pretty_log_format.sql)) + +This macro formats the input in a way that will print nicely to the command line when you `log` it. + +```sql +{#- This will return a string like: +"11:07:31 + my pretty message" +-#} + +{{ dbt_utils.pretty_log_format("my pretty message") }} +``` + +### log_info ([source](macros/jinja_helpers/log_info.sql)) + +This macro logs a formatted message (with a timestamp) to the command line. + +```sql +{{ dbt_utils.log_info("my pretty message") }} +``` + +```shell +11:07:28 | 1 of 1 START table model analytics.fct_orders........................ [RUN] +11:07:31 + my pretty message +``` + +### slugify ([source](macros/jinja_helpers/slugify.sql)) + +This macro is useful for transforming Jinja strings into "slugs", and can be useful when using a Jinja object as a column name, especially when that Jinja object is not hardcoded. + +For this example, let's pretend that we have payment methods in our payments table like `['venmo App', 'ca$h-money', '1337pay']`, which we can't use as a column name due to the spaces and special characters. This macro does its best to strip those out in a sensible way: `['venmo_app', +'cah_money', '_1337pay']`. + +```sql +{%- set payment_methods = dbt_utils.get_column_values( + table=ref('raw_payments'), + column='payment_method' +) -%} + +select +order_id, +{%- for payment_method in payment_methods %} +sum(case when payment_method = '{{ payment_method }}' then amount end) + as {{ dbt_utils.slugify(payment_method) }}_amount, + +{% endfor %} +... +``` + +```sql +select +order_id, + +sum(case when payment_method = 'Venmo App' then amount end) + as venmo_app_amount, + +sum(case when payment_method = 'ca$h money' then amount end) + as cah_money_amount, + +sum(case when payment_method = '1337pay' then amount end) + as _1337pay_amount, +... +``` +--- +## Materializations + +### insert_by_period +In dbt_utils v1.0, this materialization moved to the [experimental features repository](https://github.com/dbt-labs/dbt-labs-experimental-features/tree/main/insert_by_period). + +---- + +## Reporting bugs and contributing code + +- Want to report a bug or request a feature? Let us know by opening [an issue](https://github.com/dbt-labs/dbt-utils/issues/new) +- Want to help us build dbt-utils? Check out the [Contributing Guide](https://github.com/dbt-labs/dbt-utils/blob/main/CONTRIBUTING.md) + - **TL;DR** Open a Pull Request with 1) your changes, 2) updated documentation for the `README.md` file, and 3) a working integration test. Keep in mind that [most PRs require an approved issue first](https://docs.getdbt.com/community/resources/oss-expectations#pull-requests). + +---- + +## Dispatch macros + +**Note:** This is primarily relevant to: + +- Users and maintainers of community-supported [adapter plugins](https://docs.getdbt.com/docs/available-adapters) +- Users who wish to override a low-lying `dbt_utils` macro with a custom implementation, and have that implementation used by other `dbt_utils` macros + +If you use Postgres, Redshift, Snowflake, or BigQuery, this likely does not apply to you. + +[`adapter.dispatch()`](https://docs.getdbt.com/reference/dbt-jinja-functions/adapter#dispatch) provides a reliable way to define different implementations of the same macro across different databases. + +In `dbt_project.yml`, you can define a project-level `dispatch` config that enables an "override" setting for all dispatched macros. When dbt searches for implementations of a macro in the `dbt_utils` namespace, it will search through your list of packages instead of just looking in the `dbt_utils` package. + +Set the config in `dbt_project.yml`: + +```yaml +dispatch: + - macro_namespace: dbt_utils + search_order: + - first_package_to_search # likely the name of your root project + - second_package_to_search # could be a "shim" package, such as spark_utils + - dbt_utils # always include dbt_utils as the last place to search +``` + +If overriding a dispatched macro with a custom implementation in your own project's `macros/` directory, you must name your custom macro with a prefix: either `default__` (note the two underscores), or the name of your adapter followed by two underscores. For example, if you're running on Postgres and wish to override the behavior of `dbt_utils.safe_add` (such that other macros will use your version instead), you can do this by defining a macro called either `default__safe_add` or `postgres__safe_add`. + +Let's say we have the config defined above, and we're running on Spark. When dbt goes to dispatch `dbt_utils.safe_add`, it will search for macros the following in order: + +``` +first_package_to_search.spark__safe_add +first_package_to_search.default__safe_add +second_package_to_search.spark__safe_add +second_package_to_search.default__safe_add +dbt_utils.spark__safe_add +dbt_utils.default__safe_add +``` + +---- + +## Getting started with dbt + +- [What is dbt](https://docs.getdbt.com/docs/introduction)? +- Read the [dbt viewpoint](https://docs.getdbt.com/docs/about/viewpoint) +- [Installation](https://docs.getdbt.com/docs/get-started/getting-started/overview) +- Join the [chat](https://www.getdbt.com/community/) on Slack for live questions and support. + +## Code of Conduct + +Everyone interacting in the dbt project's codebases, issue trackers, chat rooms, and mailing lists is expected to follow the [PyPA Code of Conduct](https://www.pypa.io/en/latest/code-of-conduct/). diff --git a/task-2/dbt_packages/dbt_utils/RELEASE.md b/task-2/dbt_packages/dbt_utils/RELEASE.md new file mode 100644 index 0000000..459c104 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/RELEASE.md @@ -0,0 +1,26 @@ +# dbt-utils releases + +## When do we release? +There's a few scenarios that might prompt a release: + +| Scenario | Release type | +|--------------------------------------------|--------------| +| Breaking changes to existing macros | major | +| New functionality | minor | +| Fixes to existing macros | patch | + +## Release process + +1. Begin a new release by clicking [here](https://github.com/dbt-labs/dbt-utils/releases/new) +1. Click "Choose a tag", then paste your version number (with no "v" in the name), then click "Create new tag: x.y.z. on publish" + - The “Release title” will be identical to the tag name +1. Click the "Generate release notes" button +1. Copy and paste the generated release notes into [`CHANGELOG.md`](https://github.com/dbt-labs/dbt-utils/blob/main/CHANGELOG.md?plain=1), reformat to match previous entries, commit, and merge into the `main` branch ([example](https://github.com/dbt-labs/dbt-utils/pull/901)) +1. Click the "Publish release" button + - This will automatically create an "Assets" section containing: + - Source code (zip) + - Source code (tar.gz) + +## Post-release + +1. Delete the automatic Zapier post ([example of one intentionally not deleted](https://getdbt.slack.com/archives/CU4MRJ7QB/p1646272037304639)) and replace it with a custom post in the `#package-ecosystem` channel in “The Community Slack” using the content from the tagged release notes (but replace GitHub handles with Slack handles) ([example](https://getdbt.slack.com/archives/CU4MRJ7QB/p1649372590957309)) diff --git a/task-2/dbt_packages/dbt_utils/dbt_project.yml b/task-2/dbt_packages/dbt_utils/dbt_project.yml new file mode 100644 index 0000000..ae73005 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/dbt_project.yml @@ -0,0 +1,11 @@ +name: 'dbt_utils' +version: '0.1.0' + +require-dbt-version: [">=1.3.0", "<3.0.0"] + +config-version: 2 + +target-path: "target" +clean-targets: ["target", "dbt_modules", "dbt_packages"] +macro-paths: ["macros"] +log-path: "logs" diff --git a/task-2/dbt_packages/dbt_utils/dev-requirements.txt b/task-2/dbt_packages/dbt_utils/dev-requirements.txt new file mode 100644 index 0000000..357e7b6 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/dev-requirements.txt @@ -0,0 +1,10 @@ +pytest +pytest-dotenv +dbt-core@git+https://github.com/dbt-labs/dbt-core.git@1.latest#subdirectory=core +dbt-tests-adapter@git+https://github.com/dbt-labs/dbt-adapters.git#subdirectory=dbt-tests-adapter +dbt-postgres@git+https://github.com/dbt-labs/dbt-adapters.git#subdirectory=dbt-postgres +dbt-redshift@git+https://github.com/dbt-labs/dbt-adapters.git#subdirectory=dbt-redshift +dbt-snowflake@git+https://github.com/dbt-labs/dbt-adapters.git#subdirectory=dbt-snowflake +dbt-bigquery@git+https://github.com/dbt-labs/dbt-adapters.git#subdirectory=dbt-bigquery +pytest-xdist +tox>=3.13 diff --git a/task-2/dbt_packages/dbt_utils/docker-compose.yml b/task-2/dbt_packages/dbt_utils/docker-compose.yml new file mode 100644 index 0000000..fc4bcdf --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/docker-compose.yml @@ -0,0 +1,7 @@ +services: + postgres: + image: cimg/postgres:17.5 + environment: + - POSTGRES_USER=root + ports: + - "5432:5432" diff --git a/task-2/dbt_packages/dbt_utils/docs/decisions/README.md b/task-2/dbt_packages/dbt_utils/docs/decisions/README.md new file mode 100644 index 0000000..6819fe2 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/docs/decisions/README.md @@ -0,0 +1,4 @@ +## ADRs + +For any architectural/engineering decisions we make, we will create an [ADR (Architectural Decision Record)](https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions) to keep track of what decision we made and why. This allows us to refer back to decisions in the future and see if the reasons we made a choice still holds true. This also allows for others to more easily understand the code. ADRs will follow this process (or its replacement): +- [adr-0000-documenting-architecture-decisions.md](adr-0000-documenting-architecture-decisions.md) diff --git a/task-2/dbt_packages/dbt_utils/docs/decisions/adr-0000-documenting-architecture-decisions.md b/task-2/dbt_packages/dbt_utils/docs/decisions/adr-0000-documenting-architecture-decisions.md new file mode 100644 index 0000000..036e814 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/docs/decisions/adr-0000-documenting-architecture-decisions.md @@ -0,0 +1,60 @@ +Source: https://www.cognitect.com/blog/2011/11/15/documenting-architecture-decisions + +# DOCUMENTING ARCHITECTURE DECISIONS +Michael Nygard - November 15, 2011 + +## CONTEXT +Architecture for agile projects has to be described and defined differently. Not all decisions will be made at once, nor will all of them be done when the project begins. + +Agile methods are not opposed to documentation, only to valueless documentation. Documents that assist the team itself can have value, but only if they are kept up to date. Large documents are never kept up to date. Small, modular documents have at least a chance at being updated. + +Nobody ever reads large documents, either. Most developers have been on at least one project where the specification document was larger (in bytes) than the total source code size. Those documents are too large to open, read, or update. Bite sized pieces are easier for for all stakeholders to consume. + +One of the hardest things to track during the life of a project is the motivation behind certain decisions. A new person coming on to a project may be perplexed, baffled, delighted, or infuriated by some past decision. Without understanding the rationale or consequences, this person has only two choices: + +1. **Blindly accept the decision.** +This response may be OK, if the decision is still valid. It may not be good, however, if the context has changed and the decision should really be revisited. If the project accumulates too many decisions accepted without understanding, then the development team becomes afraid to change anything and the project collapses under its own weight. + +2. **Blindly change it.** +Again, this may be OK if the decision needs to be reversed. On the other hand, changing the decision without understanding its motivation or consequences could mean damaging the project's overall value without realizing it. (E.g., the decision supported a non-functional requirement that hasn't been tested yet.) + +It's better to avoid either blind acceptance or blind reversal. + +## DECISION +We will keep a collection of records for "architecturally significant" decisions: those that affect the structure, non-functional characteristics, dependencies, interfaces, or construction techniques. + +An architecture decision record is a short text file in a format similar to an Alexandrian pattern. (Though the decisions themselves are not necessarily patterns, they share the characteristic balancing of forces.) Each record describes a set of forces and a single decision in response to those forces. Note that the decision is the central piece here, so specific forces may appear in multiple ADRs. + +We will keep ADRs in the project repository under doc/arch/adr-NNN.md + +We should use a lightweight text formatting language like Markdown or Textile. + +ADRs will be numbered sequentially and monotonically. Numbers will not be reused. + +If a decision is reversed, we will keep the old one around, but mark it as superseded. (It's still relevant to know that it was the decision, but is no longer the decision.) + +We will use a format with just a few parts, so each document is easy to digest. The format has just a few parts. + +**Title** These documents have names that are short noun phrases. For example, "ADR 1: Deployment on Ruby on Rails 3.0.10" or "ADR 9: LDAP for Multitenant Integration" + +**Context** This section describes the forces at play, including technological, political, social, and project local. These forces are probably in tension, and should be called out as such. The language in this section is value-neutral. It is simply describing facts. + +**Decision** This section describes our response to these forces. It is stated in full sentences, with active voice. "We will …" + +**Status** A decision may be "proposed" if the project stakeholders haven't agreed with it yet, or "accepted" once it is agreed. If a later ADR changes or reverses a decision, it may be marked as "deprecated" or "superseded" with a reference to its replacement. + +**Consequences** This section describes the resulting context, after applying the decision. All consequences should be listed here, not just the "positive" ones. A particular decision may have positive, negative, and neutral consequences, but all of them affect the team and project in the future. + +The whole document should be one or two pages long. We will write each ADR as if it is a conversation with a future developer. This requires good writing style, with full sentences organized into paragraphs. Bullets are acceptable only for visual style, not as an excuse for writing sentence fragments. (Bullets kill people, even PowerPoint bullets.) + +## STATUS +Superseded by [ADR-0001](adr-0001-decision-record-format.md). + +## CONSEQUENCES +One ADR describes one significant decision for a specific project. It should be something that has an effect on how the rest of the project will run. + +The consequences of one ADR are very likely to become the context for subsequent ADRs. This is also similar to Alexander's idea of a pattern language: the large-scale responses create spaces for the smaller scale to fit into. + +Developers and project stakeholders can see the ADRs, even as the team composition changes over time. + +The motivation behind previous decisions is visible for everyone, present and future. Nobody is left scratching their heads to understand, "What were they thinking?" and the time to change old decisions will be clear from changes in the project's context. diff --git a/task-2/dbt_packages/dbt_utils/docs/decisions/adr-0001-decision-record-format.md b/task-2/dbt_packages/dbt_utils/docs/decisions/adr-0001-decision-record-format.md new file mode 100644 index 0000000..da2f612 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/docs/decisions/adr-0001-decision-record-format.md @@ -0,0 +1,38 @@ +# FORMAT AND STRUCTURE OF DECISION RECORDS + +## CONTEXT +We previousy decicded to record any decisions made in this project using Nygard's architecture decision record (ADR) format. Should we continue with this format or adopt an alternative? + +There are multiple options for formatting: +* [MADR 3.0.0-beta.2](https://github.com/adr/madr/blob/3.0.0-beta.2/template/adr-template.md) – Markdown Any Decision Records +* [Michael Nygard's template](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions) – What we are using currently +* [Sustainable Architectural Decisions](https://www.infoq.com/articles/sustainable-architectural-design-decisions) – The Y-Statements +* Other templates listed at + +If we choose to adopt a new format, we'll need to also choose whether to re-format previous decisions. The two main options are: +1. Keep the original formatting +1. Re-format all previous records according to MADR + +Keeping the original formatting would have the benefit of not altering Nygard's original post, which was adopted as-is for its elegant self-describing nature. It would have the downside of inconsistent formatting though. + +Re-formatting would resolve consistency at the cost of altering Nygard's original work. + +## DECISION +Chosen option: "MADR 3.0.0-beta.2", because + +* MADR is a matured version of the original ADR proposal that represents the state-of-the-art for ADR. +* MADR has ongoing development and is maintained similar to a software project. +* MADR explicitly uses Markdown, which is easy to read and write. +* MADR 3.0 (optionally) contains structured elements in a YAML block for machine-readability. + +* MADR allows for structured capturing of any decision. +* The MADR project is active and continues to iterate with new versions. +* The MADR project itself is maintained like sofware with specifications and new versions. + +Choosen option: "keep original formatting", because it feels special and deserves to be celebrated, even if there is slight inconsistency of formatting as a result. This decision is easily reversible in the future, if need be. + +## STATUS +Accepted. + +## CONSEQUENCES +New decisions will follow the MADR 3.0.0-beta.2 format, and we will update this decision and following decisions once MADR 3.0.0 is officially released. However, previous decisions may retain the original Nygard format. All decision records will be renamed according to MADR conventions including moving from `doc/arch` to `docs/decisions`. diff --git a/task-2/dbt_packages/dbt_utils/docs/decisions/adr-0002-cross-database-utils.md b/task-2/dbt_packages/dbt_utils/docs/decisions/adr-0002-cross-database-utils.md new file mode 100644 index 0000000..db8b9d0 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/docs/decisions/adr-0002-cross-database-utils.md @@ -0,0 +1,87 @@ +--- +status: accepted +date: 2022-03-01 +deciders: Joel Labes and Jeremy Cohen +consulted: dbt community +informed: dbt community +--- +# The future of `dbt_utils` - break it into more logical chunks + +## Context and Problem Statement + +`dbt_utils` is the most-used package in the [dbt Hub]() by a wide margin and it is installed in 1/3 of weekly active projects (as-of early 2022). The functionality with this package can be categorized into different use cases (each having their own rate of iteration): +- Cross-database macros serve as a foundation to enable compatibility in other packages +- Macros to abstract away complex work +- Useful tests which aren't built into dbt Core +- A catchall for experiments + +The `dbt_utils` package is doing a lot, and it could be split up into more logical chunks. If we pull out each category into a stand-alone package, they can each do their own thing without interfering with one another. + +How would this affect users, package maintainers, and adapter maintainers? + +## Considered Options + +For each category of functionality, there are four main options for its future home: +* stay in `dbt_utils` +* move to its own stand-alone package or another existing repository (e.g. [dbt-expectations](https://github.com/calogica/dbt-expectations) in the case of tests, and [dbt-labs-experimental-features](https://github.com/dbt-labs/dbt-labs-experimental-features) in the case of experiments) +* move to definition in Core, implementation in adapters +* complete abandonment / deprecation + +Since there are four categories and 4 possibilities for destinations, that gives 4^4 = 256 unique options. Rather than enumerate all of them, we'll restrict discussion to a shorter list: + +* Migrate cross-db functions from `dbt_utils` to definition in Core, implementation in adapters +* Split `dbt_utils` into multiple stand-alone packages +* Keep `dbt_utils` as-is + +## Decision Outcome + +Chosen option: "Migrate cross-db functions from `dbt_utils` to definition in Core, implementation in adapters", because +that was the consensus that emerged from the discussion in [dbt-utils #487](https://github.com/dbt-labs/dbt-utils/discussions/487). + +Passthroughs will be left behind for migrated macros (so that calls to `dbt_utils.hash` don't suddenly start failing). New cross-database macros can be added in minor and major releases for dbt Core (but not patch releases). End users will retain the ability to use `dispatch` to shim/extend packages to adapters that don't yet support a particular macro. + +Additional decisions: +- Keep tests and non-cross-database macros together in `dbt_utils` +- Move experiments to a separate repo (i.e., the `load_by_period` macro) + +## Validation + +Each moved macro will be validated by leaving a definition in `dbt_utils` and dispatching it to `dbt-core`. Independent continuous integration (CI) testing will exist within `dbt-core`, adapters, and `dbt_utils` using the [new pytest framework](https://docs.getdbt.com/docs/contributing/testing-a-new-adapter). + +## Pros and Cons of the Options + +### Definition in Core, implementation in adapters + +* Good, because common, reusable functionality that differs across databases will work "out of the box" +* Good, because functionality can subjected to more [rigorous testing](https://docs.getdbt.com/docs/contributing/testing-a-new-adapter) +* Good, because we hope that many package vendors could drop their dependencies on `dbt_utils` altogether, which makes version resolution easier +* Good, because it's more convenient to reference the macro as `dateadd` instead of `dbt_utils.dateadd` (and `dbt.dateadd` is preserved as an option for those that appreciate an explicit namespace) +* Good, because overriding global macros is more simple than overriding package macros +* Good, because changes to macros are more clearly tied to `dbt-core` versions, rather than needing to worry about breaking changes in the matrix of `dbt-core` + `dbt_utils` minor versions +* Good, because it establishes a precedent and pathway for battle-testing and maturing functionality before being promoted to Core +* Neutral, because new cross-database macros will need to wait for the next minor (or major version) of `dbt-core` -- patch versions aren't an option + * End users can use `dispatch` or the macro can be added to a release of `dbt_utils` until it is promoted to `dbt-core` +* Bad, because **higher barrier to contribution** + * to contribute to `dbt_utils` today, you just need to be a fairly skilled user of dbt. Even the integration tests are "just" a dbt project. To contribute to `dbt-core` or adapter plugins, you need to also know enough to set up a local development environment, to feel comfortable writing/updating Pythonic integration tests. +* Bad, because unknown **maturity** + * adding these macros into `dbt-core` "locks" them in. Changes to any macros may result in uglier code due to our commitment to backwards compatibility (e.g. addition of new arguments) +* Bad, because less **macro discoverability** + * Arguably, the macros in `dbt-core` are less discoverable than the ones in `dbt_utils`. This can be mitigated somewhat via significant manual effort over at [docs.getdbt.com](https://docs.getdbt.com/) +* Bad, because less opportunity to **teach users about macros/packages** + * The fact that so many projects install `dbt_utils` feels like a good thing — in the process, users are prompted to learn about packages (an essential dbt feature), explore other available packages, and realize that anything written in `dbt_utils` is something they fully have the power to write themselves, in their own projects. (That's not the case for most code in `dbt-core` + adapter plugins). In particular, users can write their own generic tests. We want to empower users to realize that they can write their own and not feel constrained by what's available out of the box. + +### Split `dbt_utils` into multiple stand-alone packages + +* Good, because all the tests could be in one package, which would make the purpose of each package more clear and logically separated. +* Bad, because it is easier to install a single package and then discover more functionality within it. It is non-trivial to search the whole hub for more packages which is a higher barrier than looking within a single `dbt_utils` package curated by dbt Labs. + +### Keep `dbt_utils` as-is + +* Good, because we wouldn't have to do anything. +* Good, because the user only has to install one package and gets a ton of functionality. +* Bad, because it feels like the `dbt_utils` package is trying to do too much. +* Bad, because each category of macros can't target their own users and dictate their own rate of iteration. + +## More Information + +The initial public discussion is in [dbt-utils #487](https://github.com/dbt-labs/dbt-utils/discussions/487), and [dbt-core #4813](https://github.com/dbt-labs/dbt-core/issues/4813) captures the main story. diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/.gitignore b/task-2/dbt_packages/dbt_utils/integration_tests/.gitignore new file mode 100644 index 0000000..0f2c470 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/.gitignore @@ -0,0 +1,7 @@ +target/ +dbt_modules/ +logs/ +.env/ +profiles.yml +package-lock.yml +dbt_internal_packages/ diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/README.md b/task-2/dbt_packages/dbt_utils/integration_tests/README.md new file mode 100644 index 0000000..db685a5 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/README.md @@ -0,0 +1,120 @@ +### Overview +1. Prerequisites +1. Configure credentials +1. Setup Postgres (optional) +1. Setup virtual environment +1. Installation for development +1. Run the integration tests +1. Run tests +1. Creating a new integration test + +### Prerequisites +- python3 +- Docker + +### Configure credentials +Edit the env file for your TARGET in `integration_tests/.env/[TARGET].env`. These will be used for your profiles.yml. + +Load the environment variables: +```shell +set -a; source integration_tests/.env/[TARGET].env; set +a +``` + +or more specific: +```shell +set -a; source integration_tests/.env/postgres.env; set +a +``` + +#### Setup Postgres (optional) + +Docker and `docker-compose` are both used in testing. Specific instructions for your OS can be found [here](https://docs.docker.com/get-docker/). + +Postgres offers the easiest way to test most `dbt-utils` functionality today. Its tests are the fastest to run, and the easiest to set up. To run the Postgres integration tests, you'll have to do one extra step of setting up the test database: + +```shell +make setup-db +``` +or, alternatively: +```shell +docker-compose up --detach postgres +``` + +### Setup virtual environment + +We strongly recommend using virtual environments when developing code in `dbt-utils`. We recommend creating this virtualenv +in the root of the `dbt-utils` repository. To create a new virtualenv, run: +```shell +python3 -m venv env +source env/bin/activate +``` + +This will create and activate a new Python virtual environment. + +### Installation for development + +First make sure that you set up your virtual environment as described above. Also ensure you have the latest version of pip installed with `pip install --upgrade pip`. Next, install `dbt-core` (and its dependencies) with: + +```shell +make dev target=[postgres|redshift|...] +# or +pip install --pre dbt-[postgres|redshift|...] -r dev-requirements.txt +``` + +or more specific: + +```shell +make dev target=postgres +# or +pip install --pre dbt-postgres -r dev-requirements.txt +``` + +### Run the integration tests + +To run all the integration tests on your local machine like they will get run in the CI (using CircleCI): + +```shell +make test target=postgres +``` + +or, to run tests for a single model: +```shell +make test target=[postgres|redshift|...] +``` + +or more specific: + +```shell +make test target=postgres +``` + +Where possible, targets are being run in docker containers (this works for Postgres or in the future Spark for example). For managed services like Snowflake, BigQuery and Redshift this is not possible, hence your own configuration for these services has to be provided in the appropriate env files in `integration_tests/.env/[TARGET].env` + +### Creating a new integration test + +#### Add your integration test +This directory contains an example dbt project which tests the macros in the `dbt-utils` package. An integration test typically involves making 1) a new seed file 2) a new model file 3) a generic test to assert anticipated behaviour. + +For an example integration tests, check out the tests for the `get_url_parameter` macro: + +1. [Macro definition](https://github.com/dbt-labs/dbt-utils/blob/main/macros/web/get_url_parameter.sql) +2. [Seed file with fake data](https://github.com/dbt-labs/dbt-utils/blob/main/integration_tests/data/web/data_urls.csv) +3. [Model to test the macro](https://github.com/dbt-labs/dbt-utils/blob/main/integration_tests/models/web/test_urls.sql) +4. [A generic test to assert the macro works as expected](https://github.com/dbt-labs/dbt-utils/blob/main/integration_tests/models/web/schema.yml) + +Once you've added all of these files, you should be able to run: + +Assuming you are in the `integration_tests` folder, +```shell +dbt deps --target {your_target} +dbt seed --target {your_target} +dbt run --target {your_target} --model {your_model_name} +dbt test --target {your_target} --model {your_model_name} +``` + +Alternatively: +```shell +dbt deps --target {your_target} +dbt build --target {your_target} --select +{your_model_name} +``` + +If the tests all pass, then you're good to go! All tests will be run automatically when you create a PR against this repo. \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/.gitkeep b/task-2/dbt_packages/dbt_utils/integration_tests/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/datetime/data_date_spine.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/datetime/data_date_spine.csv new file mode 100644 index 0000000..e5819c8 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/datetime/data_date_spine.csv @@ -0,0 +1,10 @@ +date_day +2018-01-01 +2018-01-02 +2018-01-03 +2018-01-04 +2018-01-05 +2018-01-06 +2018-01-07 +2018-01-08 +2018-01-09 \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/etc/data_people.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/etc/data_people.csv new file mode 100644 index 0000000..9027383 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/etc/data_people.csv @@ -0,0 +1,101 @@ +id,first_name,last_name,email,ip_address,created_at,is_active +1,Dame,Cluley,dcluley0@nih.gov,155.86.204.241,2017-02-07 09:48:26,false +2,Guy,Wittering,gwittering1@reddit.com,221.174.176.36,2017-08-08 00:37:53,false +3,Klement,Bucke,kbucke2@dedecms.com,167.94.85.199,2016-09-05 23:43:19,true +4,Roselia,Dallander,rdallander3@adobe.com,135.10.21.248,2016-08-11 00:00:11,false +5,Arly,Terzza,aterzza4@va.gov,219.66.192.10,2017-03-23 22:11:42,true +6,Arron,Siehard,asiehard5@ibm.com,116.211.108.88,2017-07-07 23:11:50,true +7,Debera,Petrazzi,dpetrazzi6@addthis.com,18.167.49.108,2017-11-12 04:34:50,false +8,Timi,Agget,tagget7@home.pl,170.171.78.217,2016-03-14 02:04:33,true +9,Ines,Brixey,ibrixey8@biblegateway.com,251.141.4.42,2017-10-01 16:41:21,false +10,Karlen,Eggleton,keggleton9@amazon.co.jp,100.179.149.224,2016-04-15 10:05:00,true +11,Hamish,Winfield,hwinfielda@squarespace.com,5.34.205.16,2017-12-29 22:44:52,true +12,Stanton,Tiron,stironb@rambler.ru,171.5.190.125,2017-01-20 23:31:15,true +13,Tyne,Elner,telnerc@jiathis.com,165.155.112.184,2017-06-12 23:42:54,false +14,Lita,Kitley,lkitleyd@gmpg.org,138.131.8.94,2018-01-25 15:03:51,false +15,Alan,Morsley,amorsleye@dell.com,5.81.121.91,2016-03-18 19:37:49,true +16,Erinn,Stokoe,estokoef@walmart.com,244.57.254.248,2017-02-23 22:51:09,true +17,Dela,Oxley,doxleyg@state.gov,163.86.24.94,2017-04-12 20:19:20,true +18,Daryle,Reeve,dreeveh@1und1.de,175.30.172.20,2017-07-09 20:46:10,false +19,Micah,Smitham,msmithami@techcrunch.com,164.75.157.186,2016-02-25 16:17:57,true +20,Bernice,Van der Velde,bvanderveldej@i2i.jp,141.99.132.98,2017-07-28 23:31:24,false +21,Odo,Janacek,ojanacekk@redcross.org,50.195.72.49,2017-05-01 05:59:30,false +22,Lyndsey,Exter,lexterl@scribd.com,244.5.43.160,2017-02-13 11:32:04,false +23,Correy,Brash,cbrashm@loc.gov,233.67.52.95,2018-02-27 05:26:29,false +24,Lyle,Josilevich,ljosilevichn@rambler.ru,99.16.127.176,2016-08-06 03:37:03,false +25,Skip,Castiello,scastielloo@rambler.ru,118.174.3.50,2016-06-07 23:32:19,true +26,Philbert,Daltry,pdaltryp@tamu.edu,181.93.127.23,2016-08-16 12:52:52,true +27,Addie,Sikora,asikoraq@theatlantic.com,120.33.67.44,2016-09-01 12:45:37,true +28,Sibyl,Songist,ssongistr@noaa.gov,151.85.172.142,2016-02-11 01:14:50,false +29,Eyde,Dankersley,edankersleys@illinois.edu,147.170.154.132,2017-08-09 18:14:00,false +30,Dion,Pessler,dpesslert@reverbnation.com,51.92.202.203,2017-01-30 02:05:47,true +31,Rodd,Huntly,rhuntlyu@google.ru,82.198.158.0,2016-04-22 06:44:15,false +32,Inness,Cartmer,icartmerv@tripod.com,44.147.127.200,2017-03-11 12:03:56,false +33,Blakeley,Figgins,bfigginsw@ebay.co.uk,116.54.91.30,2016-05-28 14:25:49,true +34,Yancey,Leeburne,yleeburnex@people.com.cn,8.44.104.205,2016-08-09 03:15:02,false +35,Gustavus,Kemp,gkempy@sourceforge.net,101.126.34.176,2018-02-02 12:15:57,true +36,Annabela,Ardron,aardronz@slideshare.net,135.255.20.212,2017-10-29 03:13:03,true +37,Allister,Janota,ajanota10@yahoo.com,41.139.90.112,2016-09-19 04:21:50,true +38,Yoko,McBryde,ymcbryde11@weather.com,124.17.222.132,2016-08-21 14:32:04,false +39,Aprilette,Colebeck,acolebeck12@elegantthemes.com,14.62.14.45,2017-04-04 04:47:31,true +40,Oralia,Marklew,omarklew13@cnet.com,108.161.10.231,2017-12-29 23:15:15,true +41,Vi,Bryde,vbryde14@harvard.edu,20.91.132.215,2017-12-01 21:02:36,false +42,Koren,Emmanueli,kemmanueli15@fotki.com,151.86.146.63,2016-11-10 22:36:05,true +43,Corrie,Pendry,cpendry16@technorati.com,78.110.104.252,2017-11-22 07:57:23,true +44,Berton,Jakovijevic,bjakovijevic17@themeforest.net,243.201.191.244,2017-12-22 20:30:37,false +45,Ahmad,Lawerence,alawerence18@bluehost.com,234.146.69.92,2017-07-07 17:37:17,true +46,Walther,Mardee,wmardee19@sciencedirect.com,86.10.226.173,2016-06-23 09:20:51,false +47,Raynor,Reignolds,rreignolds1a@github.com,192.159.109.53,2016-04-19 13:32:00,false +48,Dom,Brodhead,dbrodhead1b@ed.gov,13.193.83.80,2016-09-24 03:16:43,false +49,Patton,Marrett,pmarrett1c@sourceforge.net,73.142.143.198,2016-06-02 19:20:48,true +50,Murielle,Reina,mreina1d@washington.edu,88.67.241.169,2017-10-01 01:56:52,true +51,Markos,Zylberdik,mzylberdik1e@ask.com,169.62.233.37,2017-03-23 19:40:19,true +52,Dorisa,Gosalvez,dgosalvez1f@mit.edu,10.111.156.111,2016-02-24 12:37:30,true +53,Amata,Moar,amoar1g@tinypic.com,214.241.229.183,2016-05-22 05:04:06,true +54,Graehme,Finnigan,gfinnigan1h@trellian.com,229.14.230.4,2016-12-27 00:49:18,true +55,Tanya,Sheers,tsheers1i@house.gov,43.212.37.134,2018-02-04 05:17:30,true +56,Germain,Beavers,gbeavers1j@hexun.com,91.219.240.74,2017-01-26 23:03:39,false +57,Emmye,Cerie,ecerie1k@independent.co.uk,58.183.233.79,2017-04-30 14:13:31,true +58,Reese,Glaisner,rglaisner1l@dropbox.com,63.181.9.68,2016-07-29 05:49:41,true +59,Christie,Phlippsen,cphlippsen1m@ucoz.ru,236.91.248.168,2017-07-07 12:37:10,false +60,Anthia,Tolland,atolland1n@hibu.com,124.60.13.101,2016-02-06 14:38:37,true +61,Annamarie,Pipworth,apipworth1o@ftc.gov,53.219.191.107,2017-06-13 08:29:04,true +62,Price,O'Gready,pogready1p@theatlantic.com,131.188.180.57,2016-09-28 08:44:38,false +63,Sergei,Cicero,scicero1q@telegraph.co.uk,100.97.16.84,2017-10-02 15:58:45,false +64,Dolorita,Lilion,dlilion1r@vimeo.com,150.43.252.51,2017-09-06 12:39:46,true +65,Perrine,Peetermann,ppeetermann1s@fema.gov,93.27.202.229,2017-07-08 08:49:37,false +66,Frieda,Gemelli,fgemelli1t@altervista.org,20.21.177.102,2016-04-18 05:58:59,false +67,Webster,Tully,wtully1u@nba.com,61.55.62.136,2016-02-18 11:01:23,true +68,Clara,Dadd,cdadd1v@rakuten.co.jp,67.84.203.36,2017-06-10 22:20:50,false +69,Gardener,Clarkin,gclarkin1w@bbc.co.uk,211.175.17.92,2017-11-27 23:33:42,true +70,Doll,Celez,dcelez1x@imdb.com,65.124.34.165,2017-01-03 06:40:44,true +71,Willy,Remnant,wremnant1y@nasa.gov,183.190.219.35,2017-05-27 11:05:47,false +72,Felicle,Scoterbosh,fscoterbosh1z@macromedia.com,12.103.23.230,2017-05-04 05:22:27,true +73,Egan,Ryland,eryland20@t.co,227.35.15.147,2016-06-09 11:50:39,true +74,Donny,Clissold,dclissold21@yellowpages.com,210.51.117.212,2016-03-08 22:48:18,true +75,Gwyneth,Brash,gbrash22@vistaprint.com,30.243.157.153,2016-01-23 17:11:17,true +76,Mervin,Woolis,mwoolis23@elegantthemes.com,52.171.162.135,2017-06-17 15:36:58,false +77,Alicea,Mewton,amewton24@com.com,236.53.172.152,2017-12-21 10:35:45,true +78,Whittaker,Biaggiotti,wbiaggiotti25@patch.com,85.219.77.207,2017-12-27 09:25:13,true +79,Teddie,Matevushev,tmatevushev26@nsw.gov.au,121.24.14.214,2017-12-09 16:30:35,false +80,Mal,Mc Gee,mmcgee27@eventbrite.com,85.138.92.81,2016-01-14 03:02:43,true +81,Teressa,Lourenco,tlourenco28@zdnet.com,33.2.78.199,2016-03-17 02:29:47,false +82,Willabella,Danelutti,wdanelutti29@ted.com,221.78.224.255,2016-03-06 14:34:53,true +83,Samaria,Hessle,shessle2a@surveymonkey.com,216.8.59.131,2017-03-30 11:02:45,true +84,Ruperto,Staite,rstaite2b@wikispaces.com,79.47.189.125,2017-08-23 22:09:19,true +85,Ashlee,Scotsbrook,ascotsbrook2c@trellian.com,91.104.127.195,2017-10-02 15:01:49,false +86,Godfry,Lawson,glawson2d@seesaa.net,241.54.44.84,2016-04-03 04:42:19,false +87,Rose,Lathleiffure,rlathleiffure2e@instagram.com,21.172.211.218,2016-05-11 04:37:44,true +88,Ricky,Helwig,rhelwig2f@sciencedirect.com,130.213.100.214,2017-12-02 11:58:19,true +89,Hersh,Castleman,hcastleman2g@mediafire.com,196.170.63.20,2016-11-06 15:18:34,false +90,Upton,Midghall,umidghall2h@wordpress.org,29.108.156.94,2017-03-24 03:48:22,true +91,Devi,Lowmass,dlowmass2i@parallels.com,243.189.157.74,2016-07-31 13:35:43,true +92,Cherry,Goldstein,cgoldstein2j@delicious.com,21.78.25.159,2016-06-02 22:19:13,true +93,Alfy,Yakubovics,ayakubovics2k@bigcartel.com,29.28.179.184,2016-10-13 08:03:28,true +94,Ambrosi,Martinyuk,amartinyuk2l@163.com,1.42.244.146,2016-01-24 23:02:40,false +95,Daniel,Duly,dduly2m@engadget.com,74.32.138.66,2017-03-26 09:02:19,false +96,Hazlett,Oakton,hoakton2n@booking.com,248.196.158.127,2016-11-01 10:55:45,true +97,Vivienne,Millery,vmillery2o@nyu.edu,99.21.99.255,2016-04-19 15:25:08,true +98,Glynda,Kupper,gkupper2p@yahoo.co.jp,89.13.224.249,2016-04-05 07:01:28,false +99,Pavlov,MacDwyer,pmacdwyer2q@netvibes.com,147.162.14.191,2018-02-10 06:57:45,true +100,Fonzie,Filip,ffilip2r@tripadvisor.com,244.178.118.180,2016-11-18 00:09:42,false diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/geo/data_haversine_km.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/geo/data_haversine_km.csv new file mode 100644 index 0000000..636442f --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/geo/data_haversine_km.csv @@ -0,0 +1,2 @@ +lat_1,lon_1,lat_2,lon_2,output +48.864716,2.349014,52.379189,4.899431,430 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/geo/data_haversine_mi.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/geo/data_haversine_mi.csv new file mode 100644 index 0000000..cc4757f --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/geo/data_haversine_mi.csv @@ -0,0 +1,2 @@ +lat_1,lon_1,lat_2,lon_2,output +48.864716,2.349014,52.379189,4.899431,267 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_cardinality_equality_a.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_cardinality_equality_a.csv new file mode 100644 index 0000000..ad9cdeb --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_cardinality_equality_a.csv @@ -0,0 +1,4 @@ +same_name +1 +2 +3 \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_cardinality_equality_b.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_cardinality_equality_b.csv new file mode 100644 index 0000000..dfca57d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_cardinality_equality_b.csv @@ -0,0 +1,4 @@ +same_name,different_name +1,2 +2,3 +3,1 \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_not_null_proportion.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_not_null_proportion.csv new file mode 100644 index 0000000..b28bb8a --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_not_null_proportion.csv @@ -0,0 +1,11 @@ +point_5,point_9 +1,1 +,2 +,3 +4,4 +5,5 +6,6 +,7 +,8 +, +10,10 \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_accepted_range.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_accepted_range.csv new file mode 100644 index 0000000..38b90a5 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_accepted_range.csv @@ -0,0 +1,3 @@ +id +-1 +11 \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_at_least_one.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_at_least_one.csv new file mode 100644 index 0000000..1a78cde --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_at_least_one.csv @@ -0,0 +1,3 @@ +field,value +a,1 +b, diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equal_rowcount.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equal_rowcount.csv new file mode 100644 index 0000000..25b5f50 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equal_rowcount.csv @@ -0,0 +1,4 @@ +field +1 +1 +2 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_a.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_a.csv new file mode 100644 index 0000000..35fa4ee --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_a.csv @@ -0,0 +1,4 @@ +col_a,col_b,col_c +1,1,3 +1,2,1 +2,3,3 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_b.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_b.csv new file mode 100644 index 0000000..c9fda32 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_b.csv @@ -0,0 +1,4 @@ +col_a,col_b,col_c +1,1,2 +1,2,2 +2,3,2 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_a.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_a.csv new file mode 100644 index 0000000..8524196 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_a.csv @@ -0,0 +1,11 @@ +id,float_number +05ac09c4-f947-45a8-8c14-88f430f8b294,62.3888186 +cfae9054-940b-42a1-84d4-052daae6194f,81.2511656 +6029501d-c274-49f2-a69d-4c75a3d9931d,23.3959675 +c653e520-df81-4a5f-b44b-bb1b4c1b7846,72.2100841 +59caed0d-53d6-473c-a88c-3726c7693f05,68.6029434 +b441f6a0-ce7f-4ad9-b96b-b41d73a94ae7,72.7861425 +26491840-bfd4-4496-9ca9-ad9220a2de47,35.3662223 +b4f233ce-a494-4bb6-9cf2-73bb6854e58a,89.1524680 +11c979b7-2661-4375-8143-7c9b54b90627,19.5755431 +a8057f73-312e-48e6-b344-f4a510a2c4a8,22.9237047 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_b.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_b.csv new file mode 100644 index 0000000..0306a9a --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_b.csv @@ -0,0 +1,11 @@ +id,float_number +05ac09c4-f947-45a8-8c14-88f430f8b294,62.3888187 +cfae9054-940b-42a1-84d4-052daae6194f,81.2511657 +6029501d-c274-49f2-a69d-4c75a3d9931d,23.3959676 +c653e520-df81-4a5f-b44b-bb1b4c1b7846,72.2100842 +59caed0d-53d6-473c-a88c-3726c7693f05,68.6029435 +b441f6a0-ce7f-4ad9-b96b-b41d73a94ae7,72.7861426 +26491840-bfd4-4496-9ca9-ad9220a2de47,35.3662224 +b4f233ce-a494-4bb6-9cf2-73bb6854e58a,89.1524681 +11c979b7-2661-4375-8143-7c9b54b90627,19.5755432 +a8057f73-312e-48e6-b344-f4a510a2c4a8,22.9237048 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_columns_a.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_columns_a.csv new file mode 100644 index 0000000..77beeae --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_columns_a.csv @@ -0,0 +1,11 @@ +id,float_number,to_ignore +05ac09c4-f947-45a8-8c14-88f430f8b294,62.3888186,a +cfae9054-940b-42a1-84d4-052daae6194f,81.2511656,a +6029501d-c274-49f2-a69d-4c75a3d9931d,23.3959675,a +c653e520-df81-4a5f-b44b-bb1b4c1b7846,72.2100841,a +59caed0d-53d6-473c-a88c-3726c7693f05,68.6029434,a +b441f6a0-ce7f-4ad9-b96b-b41d73a94ae7,72.7861425,a +26491840-bfd4-4496-9ca9-ad9220a2de47,35.3662223,a +b4f233ce-a494-4bb6-9cf2-73bb6854e58a,89.1524680,a +11c979b7-2661-4375-8143-7c9b54b90627,19.5755431,a +a8057f73-312e-48e6-b344-f4a510a2c4a8,22.9237047,a diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_columns_b.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_columns_b.csv new file mode 100644 index 0000000..e26305d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_columns_b.csv @@ -0,0 +1,11 @@ +id,float_number,to_ignore +05ac09c4-f947-45a8-8c14-88f430f8b294,62.3888186,b +cfae9054-940b-42a1-84d4-052daae6194f,81.2511656,b +6029501d-c274-49f2-a69d-4c75a3d9931d,23.3959675,b +c653e520-df81-4a5f-b44b-bb1b4c1b7846,72.2100841,b +59caed0d-53d6-473c-a88c-3726c7693f05,68.6029434,b +b441f6a0-ce7f-4ad9-b96b-b41d73a94ae7,72.7861425,b +26491840-bfd4-4496-9ca9-ad9220a2de47,35.3662223,b +b4f233ce-a494-4bb6-9cf2-73bb6854e58a,89.1524680,b +11c979b7-2661-4375-8143-7c9b54b90627,19.5755431,b +a8057f73-312e-48e6-b344-f4a510a2c4a8,22.9237047,b diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_expression_is_true.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_expression_is_true.csv new file mode 100644 index 0000000..eeab2b7 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_expression_is_true.csv @@ -0,0 +1,4 @@ +col_a,col_b +0,1 +1,0 +0.5,0.5 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_fewer_rows_than_table_1.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_fewer_rows_than_table_1.csv new file mode 100644 index 0000000..0fc969a --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_fewer_rows_than_table_1.csv @@ -0,0 +1,4 @@ +col_a,field +1,1 +1,2 +1,3 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_fewer_rows_than_table_2.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_fewer_rows_than_table_2.csv new file mode 100644 index 0000000..5f9bf69 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_fewer_rows_than_table_2.csv @@ -0,0 +1,5 @@ +col_a,field +1,1 +1,2 +1,3 +1,4 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_no_gaps.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_no_gaps.csv new file mode 100644 index 0000000..72dc14e --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_no_gaps.csv @@ -0,0 +1,4 @@ +lower_bound,upper_bound +0,1 +1,2 +2,4 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_with_gaps.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_with_gaps.csv new file mode 100644 index 0000000..9b7adb0 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_with_gaps.csv @@ -0,0 +1,5 @@ +subscription_id,valid_from,valid_to +1,2019-01-01,2019-02-01 +1,2019-03-03,2019-04-01 +2,2019-05-06,2019-07-02 +2,2019-07-03, diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_with_gaps_zero_length.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_with_gaps_zero_length.csv new file mode 100644 index 0000000..c59227d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_with_gaps_zero_length.csv @@ -0,0 +1,8 @@ +subscription_id,valid_from,valid_to +3,2020-05-06,2020-05-07 +3,2020-05-08,2020-05-10 +3,2020-05-08,2020-05-08 +3,2020-05-12,2020-05-15 +4,2020-06-06,2020-06-07 +4,2020-06-08,2020-06-08 +4,2020-06-09,2020-06-10 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_not_accepted_values.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_not_accepted_values.csv new file mode 100644 index 0000000..85b190f --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_not_accepted_values.csv @@ -0,0 +1,5 @@ +id,city +1,Barcelona +2,London +3,Paris +4,New York diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_not_constant.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_not_constant.csv new file mode 100644 index 0000000..53af68d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_not_constant.csv @@ -0,0 +1,4 @@ +col_a,field +1,1 +1,1 +1,2 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_relationships_where_table_1.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_relationships_where_table_1.csv new file mode 100644 index 0000000..7a8faf7 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_relationships_where_table_1.csv @@ -0,0 +1,4 @@ +id +1 +2 +3 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_relationships_where_table_2.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_relationships_where_table_2.csv new file mode 100644 index 0000000..6090791 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_relationships_where_table_2.csv @@ -0,0 +1,4 @@ +id +1 +2 +4 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_sequential_timestamps.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_sequential_timestamps.csv new file mode 100644 index 0000000..e15c83c --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_sequential_timestamps.csv @@ -0,0 +1,5 @@ +my_timestamp +2021-01-01 00:00 +2021-01-01 01:00 +2021-01-01 02:00 +2021-01-01 03:00 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_sequential_values.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_sequential_values.csv new file mode 100644 index 0000000..9cbd053 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_sequential_values.csv @@ -0,0 +1,6 @@ +col_a,my_even_sequence +1,2 +1,4 +1,6 +2,8 +2,10 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_unique_combination_of_columns.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_unique_combination_of_columns.csv new file mode 100644 index 0000000..09d64b5 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_unique_combination_of_columns.csv @@ -0,0 +1,7 @@ +month,product,revenue +2019-01-01,jaffle,500 +2019-01-01,lamington,100 +2019-01-01,pavlova,600 +2019-02-01,jaffle,300 +2019-02-01,lamington,300 +2019-02-01,pavlova,400 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/schema.yml b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/schema.yml new file mode 100644 index 0000000..7b57a91 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/schema_tests/schema.yml @@ -0,0 +1,21 @@ +version: 2 + +seeds: + - name: data_test_sequential_values + columns: + - name: my_even_sequence + data_tests: + - dbt_utils.sequential_values: + interval: 2 + - dbt_utils.sequential_values: + interval: 2 + group_by_columns: ['col_a'] + + + - name: data_test_sequential_timestamps + columns: + - name: my_timestamp + data_tests: + - dbt_utils.sequential_values: + interval: 1 + datepart: 'hour' diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_deduplicate.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_deduplicate.csv new file mode 100644 index 0000000..7e06170 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_deduplicate.csv @@ -0,0 +1,4 @@ +user_id,event,version +1,play,1 +1,play,2 +2,pause,1 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_deduplicate_expected.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_deduplicate_expected.csv new file mode 100644 index 0000000..de5e204 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_deduplicate_expected.csv @@ -0,0 +1,2 @@ +user_id,event,version +1,play,2 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180101.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180101.csv new file mode 100644 index 0000000..5570828 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180101.csv @@ -0,0 +1,3 @@ +user_id,event +1,play +2,pause diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180102.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180102.csv new file mode 100644 index 0000000..aaa69a3 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180102.csv @@ -0,0 +1,3 @@ +user_id,event +3,play +4,pause diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180103.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180103.csv new file mode 100644 index 0000000..4379e0d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180103.csv @@ -0,0 +1,3 @@ +user_id,event +5,play +6,pause diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_filtered_columns_in_relation.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_filtered_columns_in_relation.csv new file mode 100644 index 0000000..9d96143 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_filtered_columns_in_relation.csv @@ -0,0 +1,4 @@ +field_1,field_2,field_3 +a,b,c +d,e,f +g,h,i \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_filtered_columns_in_relation_expected.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_filtered_columns_in_relation_expected.csv new file mode 100644 index 0000000..77ea056 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_filtered_columns_in_relation_expected.csv @@ -0,0 +1,2 @@ +field_2,field_3 +h,i \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_generate_series.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_generate_series.csv new file mode 100644 index 0000000..1964c4a --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_generate_series.csv @@ -0,0 +1,11 @@ +generated_number +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_generate_surrogate_key.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_generate_surrogate_key.csv new file mode 100644 index 0000000..27a188f --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_generate_surrogate_key.csv @@ -0,0 +1,5 @@ +column_1,column_2,column_3,expected_column_1_only,expected_all_columns +a,b,c,0cc175b9c0f1b6a831c399e269772661,7b193b3d33184464106f41ddf733783b +a,,c,0cc175b9c0f1b6a831c399e269772661,4f32a73dc87b7bbb7a654d8898d58c7e +,,c,f14cc5cdce0420f4a5a6b6d9d7b85f39,d9c538b129f1a3ad6ecfe55345c32a05 +,,,f14cc5cdce0420f4a5a6b6d9d7b85f39,2fa5491950d66d153d23cfbcfea4e164 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values.csv new file mode 100644 index 0000000..5651149 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values.csv @@ -0,0 +1,12 @@ +field +a +b +c +d +e +f +g +g +g +g +g diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_dropped.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_dropped.csv new file mode 100644 index 0000000..5651149 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_dropped.csv @@ -0,0 +1,12 @@ +field +a +b +c +d +e +f +g +g +g +g +g diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_where.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_where.csv new file mode 100644 index 0000000..0295f55 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_where.csv @@ -0,0 +1,12 @@ +field,condition +a,left +b,right +c,left +d,right +e,left +f,right +g,left +g,right +g,left +g,right +g,left \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_where_expected.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_where_expected.csv new file mode 100644 index 0000000..e821706 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_where_expected.csv @@ -0,0 +1,5 @@ +field +a +c +e +g \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_query_results_as_dict.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_query_results_as_dict.csv new file mode 100644 index 0000000..c44b43b --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_query_results_as_dict.csv @@ -0,0 +1,4 @@ +col_1,col_2,col_3 +1,a,True +2,b,False +3,c, diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_single_value.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_single_value.csv new file mode 100644 index 0000000..985b020 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_single_value.csv @@ -0,0 +1,2 @@ +date_value,float_value,int_value,string_value +2017-01-01 00:00:00,3.3,19,string_a \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_nullcheck_table.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_nullcheck_table.csv new file mode 100644 index 0000000..3b6cdd7 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_nullcheck_table.csv @@ -0,0 +1,4 @@ +field_1,field_2,field_3 +a,'',1 +'',b,2 +'','',3 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot.csv new file mode 100644 index 0000000..4725599 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot.csv @@ -0,0 +1,5 @@ +size,color +S,red +S,blue +S,blue's +M,red \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot_expected.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot_expected.csv new file mode 100644 index 0000000..a7702c7 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot_expected.csv @@ -0,0 +1,3 @@ +size,red,blue +S,1,1 +M,1,0 \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot_expected_apostrophe.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot_expected_apostrophe.csv new file mode 100644 index 0000000..1f403a2 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot_expected_apostrophe.csv @@ -0,0 +1,3 @@ +size,red,blue,blues +S,1,1,1 +M,1,0,0 \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_add.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_add.csv new file mode 100644 index 0000000..26e314e --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_add.csv @@ -0,0 +1,5 @@ +field_1,field_2,field_3,expected +1,2,3,6 +1,,3,4 +,,2,2 +,,,0 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide.csv new file mode 100644 index 0000000..aec2ee1 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide.csv @@ -0,0 +1,9 @@ +numerator,denominator,output +6,0, +10,5,2 +,, +,0, +17,, +0,, +,9, +0,5,0 \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide_denominator_expressions.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide_denominator_expressions.csv new file mode 100644 index 0000000..3e647de --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide_denominator_expressions.csv @@ -0,0 +1,7 @@ +numerator,denominator_1,denominator_2,output +,0,4, +6,3,2,1 +0,2,6,0 +0,,8, +5,,2, +4,0,4, \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide_numerator_expressions.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide_numerator_expressions.csv new file mode 100644 index 0000000..2673d9b --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide_numerator_expressions.csv @@ -0,0 +1,7 @@ +numerator_1,numerator_2,denominator,output +0,5,9,0 +2,3,0, +0,0,0, +3,4,, +,6,14, +2,5,2,5 \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_subtract.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_subtract.csv new file mode 100644 index 0000000..1d5652a --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_subtract.csv @@ -0,0 +1,5 @@ +field_1,field_2,field_3,expected +3,2,1,0 +4,,3,1 +,,2,-2 +,,,0 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star.csv new file mode 100644 index 0000000..7415076 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star.csv @@ -0,0 +1,4 @@ +field_1,field_2,field_3 +a,b,c +d,e,f +g,h,i diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_aggregate.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_aggregate.csv new file mode 100644 index 0000000..19d4744 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_aggregate.csv @@ -0,0 +1,5 @@ +group_field_1,group_field_2,value_field +a,b,1 +a,b,2 +c,d,3 +c,e,4 \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_aggregate_expected.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_aggregate_expected.csv new file mode 100644 index 0000000..d705638 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_aggregate_expected.csv @@ -0,0 +1,4 @@ +group_field_1,group_field_2,value_field_sum +a,b,3 +c,d,3 +c,e,4 \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_expected.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_expected.csv new file mode 100644 index 0000000..f5aa3ee --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_expected.csv @@ -0,0 +1,4 @@ +field_1,field_2 +a,b +d,e +g,h diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_prefix_suffix_expected.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_prefix_suffix_expected.csv new file mode 100644 index 0000000..fd34199 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_prefix_suffix_expected.csv @@ -0,0 +1,4 @@ +prefix_field_1_suffix,prefix_field_2_suffix,prefix_field_3_suffix +a,b,c +d,e,f +g,h,i diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_quote_identifiers.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_quote_identifiers.csv new file mode 100644 index 0000000..085ffb9 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_quote_identifiers.csv @@ -0,0 +1,2 @@ +column_one +a diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_events_expected.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_events_expected.csv new file mode 100644 index 0000000..86303b2 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_events_expected.csv @@ -0,0 +1,7 @@ +user_id,event +1,play +2,pause +3,play +4,pause +5,play +6,pause diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_exclude_expected.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_exclude_expected.csv new file mode 100644 index 0000000..3283e5c --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_exclude_expected.csv @@ -0,0 +1,6 @@ +id,favorite_color,favorite_number +1,,pi +2,,e +3,,4 +1,"green",7 +2,"pink",13 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_expected.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_expected.csv new file mode 100644 index 0000000..6c7d8f6 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_expected.csv @@ -0,0 +1,6 @@ +id,name,favorite_color,favorite_number +1,"drew",,pi +2,"bob",,e +3,"alice",,4 +1,,"green",7 +2,,"pink",13 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_table_1.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_table_1.csv new file mode 100644 index 0000000..d8270ee --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_table_1.csv @@ -0,0 +1,4 @@ +id,name,favorite_number +1,drew,pi +2,bob,e +3,alice,4 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_table_2.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_table_2.csv new file mode 100644 index 0000000..1ce620b --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_table_2.csv @@ -0,0 +1,3 @@ +id,favorite_color,favorite_number +1,green,7 +2,pink,13 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot.csv new file mode 100644 index 0000000..273ec56 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot.csv @@ -0,0 +1,4 @@ +customer_id,created_at,status,segment,name +123,2017-01-01,active,tier 1,name 1 +234,2017-02-01,active,tier 3,name 3 +567,2017-03-01,churned,tier 2,name 2 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_bool.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_bool.csv new file mode 100644 index 0000000..5127779 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_bool.csv @@ -0,0 +1,4 @@ +customer_id,created_at,status,segment,is_updated +123,2017-01-01,active,tier 1,TRUE +234,2017-02-01,active,tier 3,FALSE +567,2017-03-01,churned,tier 2, diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_bool_expected.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_bool_expected.csv new file mode 100644 index 0000000..4e688a6 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_bool_expected.csv @@ -0,0 +1,10 @@ +customer_id,created_at,prop,val +123,2017-01-01,segment,tier 1 +123,2017-01-01,status,active +123,2017-01-01,is_updated,true +234,2017-02-01,segment,tier 3 +234,2017-02-01,status,active +234,2017-02-01,is_updated,false +567,2017-03-01,status,churned +567,2017-03-01,is_updated, +567,2017-03-01,segment,tier 2 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_expected.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_expected.csv new file mode 100644 index 0000000..e2c92fb --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_expected.csv @@ -0,0 +1,7 @@ +customer_id,created_at,prop,val +123,"2017-01-01","segment","tier 1" +123,"2017-01-01","status","active" +234,"2017-02-01","segment","tier 3" +234,"2017-02-01","status","active" +567,"2017-03-01","status","churned" +567,"2017-03-01","segment","tier 2" diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_original_api_expected.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_original_api_expected.csv new file mode 100644 index 0000000..a2add2c --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_original_api_expected.csv @@ -0,0 +1,10 @@ +customer_id,created_at,field_name,value +123,2017-01-01,status,active +123,2017-01-01,segment,tier 1 +234,2017-02-01,status,active +234,2017-02-01,segment,tier 3 +567,2017-03-01,status,churned +567,2017-03-01,segment,tier 2 +123,2017-01-01,name,name 1 +234,2017-02-01,name,name 3 +567,2017-03-01,name,name 2 \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_quote.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_quote.csv new file mode 100644 index 0000000..a5138d9 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_quote.csv @@ -0,0 +1,4 @@ +Customer_Id,Created_At,sTaTuS,SEGMENT,Name +123,2017-01-01,active,tier 1,name 1 +234,2017-02-01,active,tier 3,name 3 +567,2017-03-01,churned,tier 2,name 2 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_quote_expected.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_quote_expected.csv new file mode 100644 index 0000000..0704f1f --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_quote_expected.csv @@ -0,0 +1,7 @@ +Customer_Id,Created_At,Prop,Val +123,"2017-01-01","SEGMENT","tier 1" +123,"2017-01-01","sTaTuS","active" +234,"2017-02-01","SEGMENT","tier 3" +234,"2017-02-01","sTaTuS","active" +567,"2017-03-01","sTaTuS","churned" +567,"2017-03-01","SEGMENT","tier 2" diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_width_bucket.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_width_bucket.csv new file mode 100644 index 0000000..6a8906d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/sql/data_width_bucket.csv @@ -0,0 +1,9 @@ +date_col,amount,num_buckets,min_value,max_value,bucket +2012-08-01,190000.00,4,200000.0,600000.0,0 +2013-08-01,290000.00,4,200000.0,600000.0,1 +2014-02-01,320000.00,4,200000.0,600000.0,2 +2015-04-01,399999.99,4,200000.0,600000.0,2 +2016-04-01,400000.00,4,200000.0,600000.0,3 +2017-04-01,470000.00,4,200000.0,600000.0,3 +2018-04-01,510000.00,4,200000.0,600000.0,4 +2019-04-01,610000.00,4,200000.0,600000.0,5 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/web/data_url_host.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/web/data_url_host.csv new file mode 100644 index 0000000..2350bb7 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/web/data_url_host.csv @@ -0,0 +1,7 @@ +original_url,parsed_url +www.google.co.uk?utm_source=google&utm_medium=cpc&utm_campaign=spring-summer,www.google.co.uk +http://witanddelight.com/2018/01/tips-tricks-how-run-half-marathon-first-time/,witanddelight.com +https://www.nytimes.com/2018/01/01/blog,www.nytimes.com +android-app://m.facebook.com/,m.facebook.com +docs.nytimes.com/2021/01/01/index.js?utm_source=google,docs.nytimes.com +https://m.facebook.com/,m.facebook.com \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/web/data_url_path.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/web/data_url_path.csv new file mode 100644 index 0000000..e21d8dd --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/web/data_url_path.csv @@ -0,0 +1,5 @@ +original_url,parsed_path +www.google.co.uk?utm_source=google&utm_medium=cpc&utm_campaign=spring-summer, +http://witanddelight.com/2018/01/tips-tricks-how-run-half-marathon-first-time/,2018/01/tips-tricks-how-run-half-marathon-first-time/ +https://www.nytimes.com/2018/01/01/blog,2018/01/01/blog +http://witanddelight.com/2018/01/tips-tricks-how-run-half-marathon-first-time/?utm_source=google&utm_medium=cpc&utm_campaign=spring-summer,2018/01/tips-tricks-how-run-half-marathon-first-time/ \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/data/web/data_urls.csv b/task-2/dbt_packages/dbt_utils/integration_tests/data/web/data_urls.csv new file mode 100644 index 0000000..a98bd19 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/data/web/data_urls.csv @@ -0,0 +1,3 @@ +url,medium,source +http://drewbanin.com/milky?utm_medium=organic,organic, +http://drewbanin.com/milky?utm_medium=organic&utm_source=github,organic,github diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/dbt_project.yml b/task-2/dbt_packages/dbt_utils/integration_tests/dbt_project.yml new file mode 100644 index 0000000..8df3cdb --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/dbt_project.yml @@ -0,0 +1,81 @@ + +name: 'dbt_utils_integration_tests' +version: '1.0' + +profile: 'integration_tests' + +# require-dbt-version: inherit this from dbt-utils + +config-version: 2 + +model-paths: ["models"] +analysis-paths: ["analysis"] +test-paths: ["tests"] +seed-paths: ["data"] +macro-paths: ["macros"] + +target-path: "target" # directory which will store compiled SQL files +clean-targets: # directories to be removed by `dbt clean` + - "target" + - "dbt_modules" + - "dbt_packages" + +flags: + send_anonymous_usage_stats: False + use_colors: True + +dispatch: + - macro_namespace: 'dbt_utils' + search_order: ['dbt_utils_integration_tests', 'dbt_utils'] + +seeds: + + +quote_columns: false + dbt_utils_integration_tests: + + sql: + data_events_20180103: + +schema: events + + data_get_column_values_dropped: + # this.incorporate() to hardcode the node's type as otherwise dbt doesn't know it yet + +post-hook: "{% do adapter.drop_relation(this.incorporate(type='table')) %}" + + data_get_single_value: + +column_types: + date_value: timestamp + float_value: float + int_value: integer + + data_width_bucket: + +column_types: + num_buckets: integer + min_value: float + max_value: float + + data_unpivot_quote: + +quote_columns: true + + data_unpivot_quote_expected: + +quote_columns: true + + schema_tests: + data_test_sequential_timestamps: + +column_types: + my_timestamp: timestamp + + data_test_equality_floats_a: + +column_types: + float_number: float + + data_test_equality_floats_columns_a: + +column_types: + float_number: float + + data_test_equality_floats_b: + +column_types: + float_number: float + + data_test_equality_floats_columns_b: + +column_types: + float_number: float diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/macros/.gitkeep b/task-2/dbt_packages/dbt_utils/integration_tests/macros/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/macros/assert_equal_values.sql b/task-2/dbt_packages/dbt_utils/integration_tests/macros/assert_equal_values.sql new file mode 100644 index 0000000..d4f0261 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/macros/assert_equal_values.sql @@ -0,0 +1,32 @@ +{% macro assert_equal_values(actual_object, expected_object) %} +{% if not execute %} + + {# pass #} + +{% elif actual_object != expected_object %} + + {% set msg %} + Expected did not match actual + + ----------- + Actual: + ----------- + --->{{ actual_object }}<--- + + ----------- + Expected: + ----------- + --->{{ expected_object }}<--- + + {% endset %} + + {{ log(msg, info=True) }} + + select 'fail' + +{% else %} + + select 'ok' {{ limit_zero() }} + +{% endif %} +{% endmacro %} \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/macros/limit_zero.sql b/task-2/dbt_packages/dbt_utils/integration_tests/macros/limit_zero.sql new file mode 100644 index 0000000..697849d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/macros/limit_zero.sql @@ -0,0 +1,11 @@ +{% macro my_custom_macro() %} + whatever +{% endmacro %} + +{% macro limit_zero() %} + {{ return(adapter.dispatch('limit_zero', 'dbt_utils')()) }} +{% endmacro %} + +{% macro default__limit_zero() %} + {{ return('limit 0') }} +{% endmacro %} \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/macros/tests.sql b/task-2/dbt_packages/dbt_utils/integration_tests/macros/tests.sql new file mode 100644 index 0000000..046fab3 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/macros/tests.sql @@ -0,0 +1,12 @@ + +{% test assert_equal(model, actual, expected) %} +select * from {{ model }} where {{ actual }} != {{ expected }} + +{% endtest %} + + +{% test not_empty_string(model, column_name) %} + +select * from {{ model }} where {{ column_name }} = '' + +{% endtest %} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/datetime/schema.yml b/task-2/dbt_packages/dbt_utils/integration_tests/models/datetime/schema.yml new file mode 100644 index 0000000..82e813f --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/datetime/schema.yml @@ -0,0 +1,7 @@ +version: 2 + +models: + - name: test_date_spine + data_tests: + - dbt_utils.equality: + compare_model: ref('data_date_spine') diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/datetime/test_date_spine.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/datetime/test_date_spine.sql new file mode 100644 index 0000000..fa4ae52 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/datetime/test_date_spine.sql @@ -0,0 +1,26 @@ + +-- snowflake doesn't like this as a view because the `generate_series` +-- call creates a CTE called `unioned`, as does the `equality` generic test. +-- Ideally, Snowflake would be smart enough to know that these CTE names are +-- different, as they live in different relations. TODO: use a less common cte name + +{{ config(materialized='table') }} + +with date_spine as ( + + {% if target.type == 'postgres' %} + {{ dbt_utils.date_spine("day", "'2018-01-01'::date", "'2018-01-10'::date") }} + + {% elif target.type == 'bigquery' %} + select cast(date_day as date) as date_day + from ({{ dbt_utils.date_spine("day", "'2018-01-01'", "'2018-01-10'") }}) + + {% else %} + {{ dbt_utils.date_spine("day", "'2018-01-01'", "'2018-01-10'") }} + {% endif %} + +) + +select date_day +from date_spine + diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/equality_less_columns.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/equality_less_columns.sql new file mode 100644 index 0000000..415bf94 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/equality_less_columns.sql @@ -0,0 +1,9 @@ +with data as ( + + select * from {{ ref('data_test_equality_b') }} + +) + +select + col_a, col_b +from data diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/recency_time_excluded.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/recency_time_excluded.sql new file mode 100644 index 0000000..1c18e80 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/recency_time_excluded.sql @@ -0,0 +1,12 @@ +with yesterday_time as ( +select + 1 as col1, + 2 as col2, + {{ dbt.dateadd('day', -1, dbt.current_timestamp()) }} as created_at +) + +select + col1, + col2, + {{ dbt.date_trunc('day', 'created_at') }} as created_at +from yesterday_time \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/recency_time_included.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/recency_time_included.sql new file mode 100644 index 0000000..93fe1db --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/recency_time_included.sql @@ -0,0 +1,4 @@ +select + 1 as col1, + 2 as col2, + cast({{ dbt.dateadd('hour', -23, dbt.current_timestamp()) }} as {{ dbt.type_timestamp() }}) as created_at diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/schema.yml b/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/schema.yml new file mode 100644 index 0000000..b12e3c7 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/schema.yml @@ -0,0 +1,263 @@ +version: 2 + +seeds: + - name: data_test_not_constant + columns: + - name: field + data_tests: + - dbt_utils.not_constant + - dbt_utils.not_constant: + group_by_columns: ['col_a'] + + - name: data_test_at_least_one + columns: + - name: field + data_tests: + - dbt_utils.at_least_one + - name: value + data_tests: + - dbt_utils.at_least_one: + group_by_columns: ['field'] + error_if: "<1" + warn_if: "<0" + + - name: data_test_expression_is_true + data_tests: + - dbt_utils.expression_is_true: + expression: col_a + col_b = 1 + - dbt_utils.expression_is_true: + expression: col_a = 0.5 + config: + where: col_b = 0.5 + columns: + - name: col_a + data_tests: + - dbt_utils.expression_is_true: + expression: + col_b = 1 + - name: col_b + data_tests: + - dbt_utils.expression_is_true: + expression: = 0.5 + config: + where: col_a = 0.5 + + - name: data_people + columns: + - name: is_active + data_tests: + - dbt_utils.cardinality_equality: + field: is_active + to: ref('data_people') + + - name: data_test_not_accepted_values + columns: + - name: city + data_tests: + - dbt_utils.not_accepted_values: + values: ['Madrid', 'Berlin'] + + - name: data_test_relationships_where_table_2 + columns: + - name: id + data_tests: + - dbt_utils.relationships_where: + to: ref('data_test_relationships_where_table_1') + field: id + from_condition: id <> 4 + + - name: data_test_mutually_exclusive_ranges_no_gaps + data_tests: + - dbt_utils.mutually_exclusive_ranges: + lower_bound_column: lower_bound + upper_bound_column: upper_bound + gaps: not_allowed + + - name: data_test_mutually_exclusive_ranges_with_gaps + data_tests: + - dbt_utils.mutually_exclusive_ranges: + lower_bound_column: valid_from + upper_bound_column: coalesce(valid_to, '2099-01-01') + partition_by: subscription_id + gaps: allowed + + - dbt_utils.mutually_exclusive_ranges: + lower_bound_column: valid_from + upper_bound_column: coalesce(valid_to, '2099-01-01') + partition_by: subscription_id + gaps: required + + - name: data_test_mutually_exclusive_ranges_with_gaps_zero_length + data_tests: + - dbt_utils.mutually_exclusive_ranges: + lower_bound_column: valid_from + upper_bound_column: valid_to + partition_by: subscription_id + zero_length_range_allowed: true + + - name: data_unique_combination_of_columns + data_tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: + - month + - product + + - name: data_cardinality_equality_a + columns: + - name: same_name + data_tests: + - dbt_utils.cardinality_equality: + to: ref('data_cardinality_equality_b') + field: same_name + - dbt_utils.cardinality_equality: + to: ref('data_cardinality_equality_b') + field: different_name + + - name: data_test_accepted_range + columns: + - name: id + data_tests: + - dbt_utils.accepted_range: + min_value: -1 + max_value: 11 + inclusive: true + + - dbt_utils.accepted_range: + min_value: -2 + max_value: 11.1 + inclusive: false + + - dbt_utils.accepted_range: + min_value: 0 + inclusive: true + where: "id <> -1" + + - name: data_not_null_proportion + columns: + - name: point_5 + data_tests: + - dbt_utils.not_null_proportion: + at_least: 0.5 + at_most: 0.5 + - dbt_utils.not_null_proportion: + at_least: 0 + group_by_columns: ['point_9'] + - name: point_9 + data_tests: + - dbt_utils.not_null_proportion: + at_least: 0.9 + + - name: data_test_equality_a + data_tests: + - dbt_utils.equality: + compare_model: ref('data_test_equality_a') + - dbt_utils.equality: + compare_model: ref('data_test_equality_b') + error_if: "<1" #sneaky way to ensure that the test is returning failing rows + warn_if: "<0" + - dbt_utils.equality: + compare_model: ref('data_test_equality_b') + compare_columns: + - col_a + - col_b + - dbt_utils.equality: + compare_model: ref('data_test_equality_b') + exclude_columns: + - col_c + + - name: data_test_equality_floats_a + data_tests: + # test precision only + - dbt_utils.equality: + compare_model: ref('data_test_equality_floats_b') + precision: 4 + - dbt_utils.equality: + compare_model: ref('data_test_equality_floats_b') + precision: 8 + error_if: "<1" #sneaky way to ensure that the test is returning failing rows + warn_if: "<0" + + - name: data_test_equality_floats_columns_a + data_tests: + # Positive assertion tests + - dbt_utils.equality: + compare_model: ref('data_test_equality_floats_columns_b') + compare_columns: + - id + - float_number + precision: 4 + - dbt_utils.equality: + compare_model: ref('data_test_equality_floats_columns_b') + exclude_columns: + - to_ignore + precision: 4 + # all columns should fail even with rounding + - dbt_utils.equality: + compare_model: ref('data_test_equality_floats_columns_b') + precision: 4 + error_if: "<1" #sneaky way to ensure that the test is returning failing rows + warn_if: "<0" + +models: + - name: recency_time_included + data_tests: + - dbt_utils.recency: + datepart: day + field: created_at + interval: 1 + - dbt_utils.recency: + datepart: day + field: created_at + interval: 1 + group_by_columns: ['col1'] + - dbt_utils.recency: + datepart: day + field: created_at + interval: 1 + group_by_columns: ['col1', 'col2'] + + - name: recency_time_excluded + data_tests: + - dbt_utils.recency: + datepart: day + field: created_at + interval: 1 + ignore_time_component: true + - dbt_utils.recency: + datepart: day + field: created_at + interval: 1 + ignore_time_component: false + error_if: "<1" #sneaky way to ensure that the test is returning failing rows + warn_if: "<0" + + - name: test_equal_rowcount + data_tests: + - dbt_utils.equal_rowcount: + compare_model: ref('test_equal_rowcount') + - dbt_utils.equal_rowcount: + compare_model: ref('test_equal_rowcount') + group_by_columns: ['field'] + + - name: test_equal_column_subset + data_tests: + - dbt_utils.equality: + compare_model: ref('data_people') + compare_columns: + - first_name + - last_name + - email + + - name: test_fewer_rows_than + data_tests: + - dbt_utils.fewer_rows_than: + compare_model: ref('data_test_fewer_rows_than_table_2') + - dbt_utils.fewer_rows_than: + compare_model: ref('data_test_fewer_rows_than_table_2') + group_by_columns: ['col_a'] + + - name: equality_less_columns + data_tests: + - dbt_utils.equality: + compare_model: ref('data_test_equality_a') + exclude_columns: + - col_c diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_equal_column_subset.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_equal_column_subset.sql new file mode 100644 index 0000000..b426bb6 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_equal_column_subset.sql @@ -0,0 +1,9 @@ +{{ config(materialized='ephemeral') }} + +select + + first_name, + last_name, + email + +from {{ ref('data_people') }} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_equal_rowcount.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_equal_rowcount.sql new file mode 100644 index 0000000..01b1a54 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_equal_rowcount.sql @@ -0,0 +1,9 @@ +with data as ( + + select * from {{ ref('data_test_equal_rowcount') }} + +) + +select + field +from data \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_fewer_rows_than.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_fewer_rows_than.sql new file mode 100644 index 0000000..de47bee --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_fewer_rows_than.sql @@ -0,0 +1,9 @@ +with data as ( + + select * from {{ ref('data_test_fewer_rows_than_table_1') }} + +) + +select + col_a, field +from data \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/geo/schema.yml b/task-2/dbt_packages/dbt_utils/integration_tests/models/geo/schema.yml new file mode 100644 index 0000000..31cc6a7 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/geo/schema.yml @@ -0,0 +1,13 @@ +version: 2 + +models: + - name: test_haversine_distance_km + data_tests: + - assert_equal: + actual: actual + expected: expected + - name: test_haversine_distance_mi + data_tests: + - assert_equal: + actual: actual + expected: expected diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/geo/test_haversine_distance_km.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/geo/test_haversine_distance_km.sql new file mode 100644 index 0000000..6a38292 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/geo/test_haversine_distance_km.sql @@ -0,0 +1,23 @@ +with data as ( + select * from {{ ref('data_haversine_km') }} +), +final as ( + select + output as expected, + cast( + {{ + dbt_utils.haversine_distance( + lat1='lat_1', + lon1='lon_1', + lat2='lat_2', + lon2='lon_2', + unit='km' + ) + }} as {{ type_numeric() }} + ) as actual + from data +) +select + expected, + round(actual,0) as actual +from final diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/geo/test_haversine_distance_mi.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/geo/test_haversine_distance_mi.sql new file mode 100644 index 0000000..9d6bc64 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/geo/test_haversine_distance_mi.sql @@ -0,0 +1,39 @@ +with data as ( + select * from {{ ref('data_haversine_mi') }} +), +final as ( + select + output as expected, + cast( + {{ + dbt_utils.haversine_distance( + lat1='lat_1', + lon1='lon_1', + lat2='lat_2', + lon2='lon_2', + unit='mi' + ) + }} as {{ type_numeric() }} + ) as actual + from data + + union all + + select + output as expected, + cast( + {{ + dbt_utils.haversine_distance( + lat1='lat_1', + lon1='lon_1', + lat2='lat_2', + lon2='lon_2', + ) + }} as {{ type_numeric() }} + ) as actual + from data +) +select + expected, + round(actual,0) as actual +from final diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/schema.yml b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/schema.yml new file mode 100644 index 0000000..39a5f34 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/schema.yml @@ -0,0 +1,277 @@ +version: 2 + +models: + - name: test_get_single_value + data_tests: + - assert_equal: + actual: date_actual + expected: date_expected + - assert_equal: + actual: float_actual + expected: float_expected + - assert_equal: + actual: int_actual + expected: int_expected + - assert_equal: + actual: string_actual + expected: string_expected + + - name: test_get_single_value_default + data_tests: + - assert_equal: + actual: date_actual + expected: date_expected + - assert_equal: + actual: float_actual + expected: float_expected + - assert_equal: + actual: int_actual + expected: int_expected + - assert_equal: + actual: string_actual + expected: string_expected + + - name: test_generate_series + data_tests: + - dbt_utils.equality: + compare_model: ref('data_generate_series') + + - name: test_get_column_values + columns: + - name: count_a + data_tests: + - accepted_values: + values: + - '1' + + - name: count_b + data_tests: + - accepted_values: + values: + - '1' + + - name: count_c + data_tests: + - accepted_values: + values: + - '1' + + - name: count_d + data_tests: + - accepted_values: + values: + - '1' + + - name: count_e + data_tests: + - accepted_values: + values: + - '1' + + - name: count_f + data_tests: + - accepted_values: + values: + - '1' + + - name: count_g + data_tests: + - accepted_values: + values: + - '5' + + - name: test_get_column_values_where + data_tests: + - dbt_utils.equality: + compare_model: ref('data_get_column_values_where_expected') + + - name: test_get_filtered_columns_in_relation + data_tests: + - dbt_utils.equality: + compare_model: ref('data_filtered_columns_in_relation_expected') + + - name: test_get_relations_by_prefix_and_union + columns: + - name: event + data_tests: + - not_null + - name: user_id + data_tests: + - dbt_utils.at_least_one + - not_null + - unique + + - name: test_nullcheck_table + columns: + - name: field_1 + data_tests: + - not_empty_string + + - name: field_2 + data_tests: + - not_empty_string + + - name: field_3 + data_tests: + - not_empty_string + + - name: test_safe_add + data_tests: + - assert_equal: + actual: actual + expected: expected + + - name: test_safe_subtract + data_tests: + - assert_equal: + actual: actual + expected: expected + + - name: test_safe_divide + data_tests: + - assert_equal: + actual: actual + expected: expected + + - name: test_pivot + data_tests: + - dbt_utils.equality: + compare_model: ref('data_pivot_expected') + + - name: test_pivot_apostrophe + data_tests: + - dbt_utils.equality: + compare_model: ref('data_pivot_expected_apostrophe') + + - name: test_unpivot_original_api + data_tests: + - dbt_utils.equality: + compare_model: ref('data_unpivot_original_api_expected') + + - name: test_unpivot + data_tests: + - dbt_utils.equality: + compare_model: ref('data_unpivot_expected') + + - name: test_unpivot_bool + data_tests: + - dbt_utils.equality: + compare_model: ref('data_unpivot_bool_expected') + + - name: test_unpivot_quote + data_tests: + - dbt_utils.equality: + compare_model: ref('data_unpivot_quote_expected') + + - name: test_star + data_tests: + - dbt_utils.equality: + compare_model: ref('data_star_expected') + + - name: test_star_quote_identifiers + data_tests: + - assert_equal: + actual: actual + expected: expected + + - name: test_star_prefix_suffix + data_tests: + - dbt_utils.equality: + compare_model: ref('data_star_prefix_suffix_expected') + + - name: test_star_aggregate + data_tests: + - dbt_utils.equality: + compare_model: ref('data_star_aggregate_expected') + + - name: test_star_uppercase + data_tests: + - dbt_utils.equality: + compare_model: ref('data_star_expected') + + - name: test_star_unquote_aliases + data_tests: + - assert_equal: + actual: actual + expected: expected + + - name: test_star_no_columns + columns: + - name: canary_column #If the no-columns state isn't hit, this table won't be queryable because there will be a missing comma + data_tests: + - not_null + + - name: test_generate_surrogate_key + data_tests: + - assert_equal: + actual: actual_column_1_only + expected: expected_column_1_only + - assert_equal: + actual: actual_all_columns_list + expected: expected_all_columns + + - name: test_union + data_tests: + - dbt_utils.equality: + compare_model: ref('data_union_expected') + + - name: test_union_where + columns: + - name: id + data_tests: + - dbt_utils.expression_is_true: + expression: "= 1" + - name: favorite_number + data_tests: + - dbt_utils.not_constant + + - name: test_union_no_source_column + data_tests: + - expect_table_columns_to_match_set: + column_list: ["id", "name", "favorite_color", "favorite_number"] + + - name: test_union_exclude_lowercase + data_tests: + - dbt_utils.equality: + compare_model: ref('data_union_exclude_expected') + + - name: test_union_exclude_uppercase + data_tests: + - dbt_utils.equality: + compare_model: ref('data_union_exclude_expected') + + - name: test_get_relations_by_pattern + data_tests: + - dbt_utils.equality: + compare_model: ref('data_union_events_expected') + + - name: test_deduplicate + data_tests: + - dbt_utils.equality: + compare_model: ref('data_deduplicate_expected') + + - name: test_not_empty_string_failing + columns: + - name: string_trim_whitespace_true + data_tests: + - dbt_utils.not_empty_string: + config: + severity: error + error_if: "<1" + warn_if: "<0" + + - name: test_not_empty_string_passing + columns: + - name: string_trim_whitespace_true + data_tests: + - dbt_utils.not_empty_string + - name: string_trim_whitespace_false + data_tests: + - dbt_utils.not_empty_string: + trim_whitespace: false + + - name: test_width_bucket + data_tests: + - assert_equal: + actual: actual + expected: expected diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_deduplicate.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_deduplicate.sql new file mode 100644 index 0000000..226555b --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_deduplicate.sql @@ -0,0 +1,21 @@ +with + +source as ( + select * + from {{ ref('data_deduplicate') }} + where user_id = 1 +), + +deduped as ( + + {{ + dbt_utils.deduplicate( + 'source', + partition_by='user_id', + order_by='version desc', + ) | indent + }} + +) + +select * from deduped diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_generate_series.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_generate_series.sql new file mode 100644 index 0000000..11370b7 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_generate_series.sql @@ -0,0 +1,15 @@ + +-- snowflake doesn't like this as a view because the `generate_series` +-- call creates a CTE called `unioned`, as does the `equality` generic test. +-- Ideally, Snowflake would be smart enough to know that these CTE names are +-- different, as they live in different relations. TODO: use a less common cte name + +{{ config(materialized='table') }} + +with data as ( + + {{ dbt_utils.generate_series(10) }} + +) + +select generated_number from data diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_generate_surrogate_key.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_generate_surrogate_key.sql new file mode 100644 index 0000000..4babe73 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_generate_surrogate_key.sql @@ -0,0 +1,14 @@ + +with data as ( + + select * from {{ ref('data_generate_surrogate_key') }} + +) + +select + {{ dbt_utils.generate_surrogate_key(['column_1']) }} as actual_column_1_only, + expected_column_1_only, + {{ dbt_utils.generate_surrogate_key(['column_1', 'column_2', 'column_3']) }} as actual_all_columns_list, + expected_all_columns + +from data diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_column_values.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_column_values.sql new file mode 100644 index 0000000..fcfa1d8 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_column_values.sql @@ -0,0 +1,29 @@ + +{% set column_values = dbt_utils.get_column_values(ref('data_get_column_values'), 'field', default=[], order_by="field") %} + + +{% if target.type == 'snowflake' %} + +select + {% for val in column_values -%} + + sum(case when field = '{{ val }}' then 1 else 0 end) as count_{{ val }} + {%- if not loop.last %},{% endif -%} + + {%- endfor %} + +from {{ ref('data_get_column_values') }} + +{% else %} + +select + {% for val in column_values -%} + + {{ safe_cast("sum(case when field = '" ~ val ~ "' then 1 else 0 end)", type_string()) }} as count_{{ val }} + {%- if not loop.last %},{% endif -%} + + {%- endfor %} + +from {{ ref('data_get_column_values') }} + +{% endif %} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_column_values_where.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_column_values_where.sql new file mode 100644 index 0000000..5eab9c9 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_column_values_where.sql @@ -0,0 +1,6 @@ +{% set column_values = dbt_utils.get_column_values(ref('data_get_column_values_where'), 'field', where="condition = 'left'") %} + +-- Create a relation using the values +{% for val in column_values -%} +select {{ string_literal(val) }} as field {% if not loop.last %}union all{% endif %} +{% endfor %} \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_filtered_columns_in_relation.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_filtered_columns_in_relation.sql new file mode 100644 index 0000000..7b3ca72 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_filtered_columns_in_relation.sql @@ -0,0 +1,16 @@ +{% set exclude_field = 'field_1' %} +{% set column_names = dbt_utils.get_filtered_columns_in_relation(from= ref('data_filtered_columns_in_relation'), except=[exclude_field]) %} + +with data as ( + + select + + {% for column_name in column_names %} + max({{ column_name }}) as {{ column_name }} {% if not loop.last %},{% endif %} + {% endfor %} + + from {{ ref('data_filtered_columns_in_relation') }} + +) + +select * from data diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_relations_by_pattern.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_relations_by_pattern.sql new file mode 100644 index 0000000..799bca5 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_relations_by_pattern.sql @@ -0,0 +1,18 @@ +{{ config(materialized = 'table') }} + +-- depends_on: {{ ref('data_events_20180101') }}, {{ ref('data_events_20180102') }}, {{ ref('data_events_20180103') }} + +{% set relations = dbt_utils.get_relations_by_pattern(target.schema ~ '%', 'data_events_%') %} + +with unioned as ( + + {{ dbt_utils.union_relations(relations) }} + +) + +select + + user_id, + event + +from unioned diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_relations_by_prefix_and_union.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_relations_by_prefix_and_union.sql new file mode 100644 index 0000000..936bf62 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_relations_by_prefix_and_union.sql @@ -0,0 +1,6 @@ +{{ config(materialized = 'table') }} + +-- depends_on: {{ ref('data_events_20180101') }}, {{ ref('data_events_20180102') }}, {{ ref('data_events_20180103') }} + +{% set relations = dbt_utils.get_relations_by_prefix(target.schema, 'data_events_') %} +{{ dbt_utils.union_relations(relations) }} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_single_value.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_single_value.sql new file mode 100644 index 0000000..90d3aff --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_single_value.sql @@ -0,0 +1,42 @@ +{# + Dear future reader, + Before you go restructuring the delicate web of casts and quotes below, a warning: + I once thought as you are thinking. Proceed with caution. +#} + +{% set date_statement %} + select date_value from {{ ref('data_get_single_value') }} +{% endset %} + +{% set float_statement %} + select float_value from {{ ref('data_get_single_value') }} +{% endset %} + +{% set int_statement %} + select int_value from {{ ref('data_get_single_value') }} +{% endset %} + +{% set string_statement %} + select string_value from {{ ref('data_get_single_value') }} +{% endset %} + +with default_data as ( + + select + cast(date_value as {{ dbt.type_timestamp() }}) as date_expected, + cast({{ dbt.string_literal(dbt_utils.get_single_value(date_statement)) }} as {{ dbt.type_timestamp() }}) as date_actual, + + float_value as float_expected, + {{ dbt_utils.get_single_value(float_statement) }} as float_actual, + + int_value as int_expected, + {{ dbt_utils.get_single_value(int_statement) }} as int_actual, + + string_value as string_expected, + cast({{ dbt.string_literal(dbt_utils.get_single_value(string_statement)) }} as {{ dbt.type_string() }}) as string_actual + + from {{ ref('data_get_single_value') }} +) + +select * +from default_data \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_single_value_default.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_single_value_default.sql new file mode 100644 index 0000000..7b04902 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_single_value_default.sql @@ -0,0 +1,28 @@ +{# + Dear future reader, + Before you go restructuring the delicate web of casts and quotes below, a warning: + I once thought as you are thinking. Proceed with caution. +#} + +{% set false_statement = 'select 1 as id ' ~ limit_zero() %} + +with default_data as ( + + select + cast({{ dbt.string_literal('2022-01-01') }} as {{ dbt.type_timestamp() }}) as date_expected, + cast({{ dbt.string_literal(dbt_utils.get_single_value(false_statement, '2022-01-01')) }} as {{ dbt.type_timestamp() }}) as date_actual, + + 1.23456 as float_expected, + {{ dbt_utils.get_single_value(false_statement, 1.23456) }} as float_actual, + + 123456 as int_expected, + {{ dbt_utils.get_single_value(false_statement, 123456) }} as int_actual, + + cast({{ dbt.string_literal('fallback') }} as {{ dbt.type_string() }}) as string_expected, + cast({{ dbt.string_literal(dbt_utils.get_single_value(false_statement, 'fallback')) }} as {{ dbt.type_string() }}) as string_actual + + from {{ ref('data_get_single_value') }} +) + +select * +from default_data \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_groupby.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_groupby.sql new file mode 100644 index 0000000..fe790e9 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_groupby.sql @@ -0,0 +1,24 @@ +with test_data as ( + + select + + {{ safe_cast("'a'", type_string() )}} as column_1, + {{ safe_cast("'b'", type_string() )}} as column_2 + +), + +grouped as ( + + select + *, + count(*) as total + + from test_data + {{ dbt_utils.group_by(2) }} + +) + +select * from grouped + + + diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_not_empty_string_failing.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_not_empty_string_failing.sql new file mode 100644 index 0000000..2870f9c --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_not_empty_string_failing.sql @@ -0,0 +1,41 @@ +-- dbt seed casts '' as NULL, so we need to select empty strings to enable testing + +with blank_data as ( + + select + 1 as id, + 'not an empty string' as string_trim_whitespace_true + + union all + + select + 2 as id, + 'also not an empty string' as string_trim_whitespace_true + + union all + + select + 3 as id, + 'string with trailing whitespace ' as string_trim_whitespace_true + + union all + + select + 4 as id, + ' ' as string_trim_whitespace_true + + union all + + select + 5 as id, + '' as string_trim_whitespace_true + + union all + + select + 6 as id, + null as string_trim_whitespace_true + +) + +select * from blank_data \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_not_empty_string_passing.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_not_empty_string_passing.sql new file mode 100644 index 0000000..6578041 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_not_empty_string_passing.sql @@ -0,0 +1,33 @@ +-- dbt seed casts '' as NULL, so we need to select empty strings to enable testing + +with blank_data as ( + + select + 1 as id, + 'not an empty string' as string_trim_whitespace_true, + 'not an empty string' as string_trim_whitespace_false + + union all + + select + 2 as id, + 'also not an empty string' as string_trim_whitespace_true, + 'also not an empty string' as string_trim_whitespace_false + + union all + + select + 3 as id, + 'string with trailing whitespace ' as string_trim_whitespace_true, + ' ' as string_trim_whitespace_false -- This will cause a failure when trim_whitespace = true + + union all + + select + 6 as id, + null as string_trim_whitespace_true, + null as string_trim_whitespace_false + +) + +select * from blank_data \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_nullcheck_table.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_nullcheck_table.sql new file mode 100644 index 0000000..807b0f3 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_nullcheck_table.sql @@ -0,0 +1,41 @@ +{{ config( materialized = "table" ) }} + +-- TO DO: remove if-statement + +{% set tbl = ref('data_nullcheck_table') %} + + +with nulled as ( + + {{ dbt_utils.nullcheck_table(tbl) }} + +) + +{% if target.type == 'snowflake' %} + +select + field_1::varchar as field_1, + field_2::varchar as field_2, + field_3::varchar as field_3 + +from nulled + +{% else %} + +select + + {{ safe_cast('field_1', + type_string() + )}} as field_1, + + {{ safe_cast('field_2', + type_string() + )}} as field_2, + + {{ safe_cast('field_3', + type_string() + )}} as field_3 + +from nulled + +{% endif %} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_pivot.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_pivot.sql new file mode 100644 index 0000000..a63e6e3 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_pivot.sql @@ -0,0 +1,17 @@ + +-- TODO: How do we make this work nicely on Snowflake too? + +{% if target.type == 'snowflake' %} + {% set column_values = ['RED', 'BLUE'] %} + {% set cmp = 'ilike' %} +{% else %} + {% set column_values = ['red', 'blue'] %} + {% set cmp = '=' %} +{% endif %} + +select + size, + {{ dbt_utils.pivot('color', column_values, cmp=cmp) }} + +from {{ ref('data_pivot') }} +group by size diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_pivot_apostrophe.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_pivot_apostrophe.sql new file mode 100644 index 0000000..792f468 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_pivot_apostrophe.sql @@ -0,0 +1,17 @@ + +-- TODO: How do we make this work nicely on Snowflake too? + +{% if target.type == 'snowflake' %} + {% set column_values = ['RED', 'BLUE', "BLUE'S"] %} + {% set cmp = 'ilike' %} +{% else %} + {% set column_values = ['red', 'blue', "blue's"] %} + {% set cmp = '=' %} +{% endif %} + +select + size, + {{ dbt_utils.pivot('color', column_values, cmp=cmp, quote_identifiers=False) }} + +from {{ ref('data_pivot') }} +group by size diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_add.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_add.sql new file mode 100644 index 0000000..10f487b --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_add.sql @@ -0,0 +1,12 @@ + +with data as ( + + select * from {{ ref('data_safe_add') }} + +) + +select + {{ dbt_utils.safe_add(['field_1', 'field_2', 'field_3']) }} as actual, + expected + +from data diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_divide.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_divide.sql new file mode 100644 index 0000000..3462478 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_divide.sql @@ -0,0 +1,38 @@ + +with data_safe_divide as ( + + select * from {{ ref('data_safe_divide') }} + +), + +data_safe_divide_numerator_expressions as ( + + select * from {{ ref('data_safe_divide_numerator_expressions') }} +), + +data_safe_divide_denominator_expressions as ( + + select * from {{ ref('data_safe_divide_denominator_expressions') }} +) + +select + {{ dbt_utils.safe_divide('numerator', 'denominator') }} as actual, + output as expected + +from data_safe_divide + +union all + +select + {{ dbt_utils.safe_divide('numerator_1 * numerator_2', 'denominator') }} as actual, + output as expected + +from data_safe_divide_numerator_expressions + +union all + +select + {{ dbt_utils.safe_divide('numerator', 'denominator_1 * denominator_2') }} as actual, + output as expected + +from data_safe_divide_denominator_expressions \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_subtract.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_subtract.sql new file mode 100644 index 0000000..0ce816d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_subtract.sql @@ -0,0 +1,12 @@ + +with data as ( + + select * from {{ ref('data_safe_subtract') }} + +) + +select + {{ dbt_utils.safe_subtract(['field_1', 'field_2', 'field_3']) }} as actual, + expected + +from data diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star.sql new file mode 100644 index 0000000..2092e16 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star.sql @@ -0,0 +1,13 @@ +{% set exclude_field = 'field_3' %} + + +with data as ( + + select + {{ dbt_utils.star(from=ref('data_star'), except=[exclude_field]) }} + + from {{ ref('data_star') }} + +) + +select * from data diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_aggregate.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_aggregate.sql new file mode 100644 index 0000000..9dcd7c2 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_aggregate.sql @@ -0,0 +1,16 @@ +/*This test checks that column aliases aren't applied unless there's a prefix/suffix necessary, to ensure that GROUP BYs keep working*/ + +{% set selected_columns = dbt_utils.star(from=ref('data_star_aggregate'), except=['value_field']) %} + +with data as ( + + select + {{ selected_columns }}, + sum(value_field) as value_field_sum + + from {{ ref('data_star_aggregate') }} + group by {{ selected_columns }} + +) + +select * from data diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_no_columns.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_no_columns.sql new file mode 100644 index 0000000..ff5a5de --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_no_columns.sql @@ -0,0 +1,11 @@ +with data as ( + + select + {{ dbt_utils.star(from=ref('data_star'), except=['field_1', 'field_2', 'field_3']) }} + -- if star() returns `*` or a list of columns, this query will fail because there's no comma between the columns + 1 as canary_column + from {{ ref('data_star') }} + +) + +select * from data diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_prefix_suffix.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_prefix_suffix.sql new file mode 100644 index 0000000..ae1c64f --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_prefix_suffix.sql @@ -0,0 +1,13 @@ +{% set prefix_with = 'prefix_' if target.type != 'snowflake' else 'PREFIX_' %} +{% set suffix_with = '_suffix' if target.type != 'snowflake' else '_SUFFIX' %} + +with data as ( + + select + {{ dbt_utils.star(from=ref('data_star'), prefix=prefix_with, suffix=suffix_with) }} + + from {{ ref('data_star') }} + +) + +select * from data \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_quote_identifiers.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_quote_identifiers.sql new file mode 100644 index 0000000..180d5bc --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_quote_identifiers.sql @@ -0,0 +1,9 @@ +select + {{ dbt.string_literal(adapter.quote("column_one")) | lower }} as expected, + {{ dbt.string_literal(dbt_utils.star(from=ref('data_star_quote_identifiers'), quote_identifiers=True)) | trim | lower }} as actual + +union all + +select + {{ dbt.string_literal("column_one") | lower }} as expected, + {{ dbt.string_literal(dbt_utils.star(from=ref('data_star_quote_identifiers'), quote_identifiers=False)) | trim | lower }} as actual \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_unquote_aliases.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_unquote_aliases.sql new file mode 100644 index 0000000..3a02482 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_unquote_aliases.sql @@ -0,0 +1,27 @@ +{% set quoted_col = adapter.quote("column_one") %} + + +select + {{ dbt.string_literal(quoted_col ~ " as column_one") | lower }} as expected, + {{ dbt.string_literal(dbt_utils.star(from=ref('data_star_quote_identifiers'), quote_identifiers=True, unquote_aliases=True)) | trim | lower }} as actual + +union all + +select + {{ dbt.string_literal(quoted_col ~ " as renamed_col") | lower }} as expected, + {{ dbt.string_literal(dbt_utils.star(from=ref('data_star_quote_identifiers'), quote_identifiers=True, unquote_aliases=True, rename={"column_one": "renamed_col"})) | trim | lower }} as actual + +union all + +select + {{ dbt.string_literal(quoted_col ~ " as renamed_col") | lower }} as expected, + {{ dbt.string_literal(dbt_utils.star(from=ref('data_star_quote_identifiers'), quote_identifiers=True, rename={"column_one": "renamed_col"})) | trim | lower }} as actual + +union all + +-- `rename` keys should match column names case-insensitively, the same way `except` does. +-- Warehouses that fold unquoted identifiers (e.g. Snowflake -> COLUMN_ONE) must still +-- match a rename key supplied in a different case. +select + {{ dbt.string_literal(quoted_col ~ " as renamed_col") | lower }} as expected, + {{ dbt.string_literal(dbt_utils.star(from=ref('data_star_quote_identifiers'), quote_identifiers=True, rename={"COLUMN_ONE": "renamed_col"})) | trim | lower }} as actual diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_uppercase.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_uppercase.sql new file mode 100644 index 0000000..6179e69 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_uppercase.sql @@ -0,0 +1,13 @@ +{% set exclude_field = 'FIELD_3' %} + + +with data as ( + + select + {{ dbt_utils.star(from=ref('data_star'), except=[exclude_field]) }} + + from {{ ref('data_star') }} + +) + +select * from data diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union.sql new file mode 100644 index 0000000..8d675ed --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union.sql @@ -0,0 +1,8 @@ + +select + id, + name, + favorite_color, + favorite_number + +from {{ ref('test_union_base') }} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_base.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_base.sql new file mode 100644 index 0000000..a51bd2b --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_base.sql @@ -0,0 +1,5 @@ + +{{ dbt_utils.union_relations([ + ref('data_union_table_1'), + ref('data_union_table_2')] +) }} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_base_lowercase.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_base_lowercase.sql new file mode 100644 index 0000000..dc005a8 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_base_lowercase.sql @@ -0,0 +1,8 @@ + +{{ dbt_utils.union_relations( + relations=[ + ref('data_union_table_1'), + ref('data_union_table_2'), + ], + exclude=['name'] +) }} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_base_uppercase.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_base_uppercase.sql new file mode 100644 index 0000000..af3dc3f --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_base_uppercase.sql @@ -0,0 +1,8 @@ + +{{ dbt_utils.union_relations( + relations=[ + ref('data_union_table_1'), + ref('data_union_table_2'), + ], + exclude=['NAME'] +) }} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_lowercase.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_lowercase.sql new file mode 100644 index 0000000..95efc06 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_lowercase.sql @@ -0,0 +1,4 @@ +select + {{ dbt_utils.star(ref("test_union_exclude_base_lowercase"), except=["_dbt_source_relation"]) }} + +from {{ ref("test_union_exclude_base_lowercase") }} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_uppercase.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_uppercase.sql new file mode 100644 index 0000000..3e0ab4f --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_uppercase.sql @@ -0,0 +1,4 @@ +select + {{ dbt_utils.star(ref("test_union_exclude_base_uppercase"), except=["_DBT_SOURCE_RELATION"]) }} + +from {{ ref("test_union_exclude_base_uppercase") }} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_no_source_column.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_no_source_column.sql new file mode 100644 index 0000000..660bdfe --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_no_source_column.sql @@ -0,0 +1,6 @@ +{{ dbt_utils.union_relations([ + ref('data_union_table_1'), + ref('data_union_table_2') + ], + source_column_name = none +) }} \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_where.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_where.sql new file mode 100644 index 0000000..a5986d4 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_where.sql @@ -0,0 +1,5 @@ +select + id, + favorite_number +from + {{ ref('test_union_where_base') }} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_where_base.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_where_base.sql new file mode 100644 index 0000000..177db51 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_where_base.sql @@ -0,0 +1,4 @@ +{{ dbt_utils.union_relations( + [ref('data_union_table_1'), ref('data_union_table_2')], + where="id = 1" +) }} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot.sql new file mode 100644 index 0000000..17ea1e9 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot.sql @@ -0,0 +1,33 @@ + +-- snowflake messes with these tests pretty badly since the +-- output of the macro considers the casing of the source +-- table columns. Using some hacks here to get this to work, +-- but we should consider lowercasing the unpivot macro output +-- at some point in the future for consistency + +{% if target.name == 'snowflake' %} + {% set exclude = ['CUSTOMER_ID', 'CREATED_AT'] %} +{% else %} + {% set exclude = ['customer_id', 'created_at'] %} +{% endif %} + + +select + customer_id, + created_at, + case + when '{{ target.name }}' = 'snowflake' then lower(prop) + else prop + end as prop, + val + +from ( + {{ dbt_utils.unpivot( + relation=ref('data_unpivot'), + cast_to=type_string(), + exclude=exclude, + remove=['name'], + field_name='prop', + value_name='val' + ) }} +) as sbq diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot_bool.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot_bool.sql new file mode 100644 index 0000000..00c39df --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot_bool.sql @@ -0,0 +1,32 @@ + +-- snowflake messes with these tests pretty badly since the +-- output of the macro considers the casing of the source +-- table columns. Using some hacks here to get this to work, +-- but we should consider lowercasing the unpivot macro output +-- at some point in the future for consistency + +{% if target.name == 'snowflake' %} + {% set exclude = ['CUSTOMER_ID', 'CREATED_AT'] %} +{% else %} + {% set exclude = ['customer_id', 'created_at'] %} +{% endif %} + + +select + customer_id, + created_at, + case + when '{{ target.name }}' = 'snowflake' then lower(prop) + else prop + end as prop, + val + +from ( + {{ dbt_utils.unpivot( + relation=ref('data_unpivot_bool'), + cast_to=type_string(), + exclude=exclude, + field_name='prop', + value_name='val' + ) }} +) as sbq diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot_quote.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot_quote.sql new file mode 100644 index 0000000..feaac6a --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot_quote.sql @@ -0,0 +1,10 @@ + + {{ dbt_utils.unpivot( + relation=ref('data_unpivot_quote'), + cast_to=type_string(), + exclude=['Customer_Id', 'Created_At'], + remove=['Name'], + field_name='Prop', + value_name='Val', + quote_identifiers=True, + ) }} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_width_bucket.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_width_bucket.sql new file mode 100644 index 0000000..dc2b860 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/sql/test_width_bucket.sql @@ -0,0 +1,12 @@ + +with data as ( + + select * from {{ ref('data_width_bucket') }} + +) + +select + {{ dbt_utils.width_bucket('amount', 'min_value', 'max_value', 'num_buckets') }} as actual, + bucket as expected + +from data diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/web/schema.yml b/task-2/dbt_packages/dbt_utils/integration_tests/models/web/schema.yml new file mode 100644 index 0000000..7f02b31 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/web/schema.yml @@ -0,0 +1,20 @@ +version: 2 + +models: + - name: test_urls + data_tests: + - assert_equal: + actual: actual + expected: expected + + - name: test_url_host + data_tests: + - assert_equal: + actual: actual + expected: expected + + - name: test_url_path + data_tests: + - assert_equal: + actual: actual + expected: expected \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/web/test_url_host.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/web/test_url_host.sql new file mode 100644 index 0000000..06a9f69 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/web/test_url_host.sql @@ -0,0 +1,12 @@ +with data as ( + + select * from {{ref('data_url_host')}} + +) + +select + + {{ dbt_utils.get_url_host('original_url') }} as actual, + parsed_url as expected + +from data \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/web/test_url_path.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/web/test_url_path.sql new file mode 100644 index 0000000..c03e554 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/web/test_url_path.sql @@ -0,0 +1,12 @@ +with data as ( + + select * from {{ref('data_url_path')}} + +) + +select + + coalesce({{ dbt_utils.get_url_path('original_url') }}, '') as actual, + coalesce(parsed_path, '') as expected + +from data \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/models/web/test_urls.sql b/task-2/dbt_packages/dbt_utils/integration_tests/models/web/test_urls.sql new file mode 100644 index 0000000..60353db --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/models/web/test_urls.sql @@ -0,0 +1,20 @@ + +with data as ( + + select * from {{ ref('data_urls') }} + +) + +select + {{ dbt_utils.get_url_parameter('url', 'utm_medium') }} as actual, + medium as expected + +from data + +union all + +select + {{ dbt_utils.get_url_parameter('url', 'utm_source') }} as actual, + source as expected + +from data diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/packages.yml b/task-2/dbt_packages/dbt_utils/integration_tests/packages.yml new file mode 100644 index 0000000..7468ac5 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/packages.yml @@ -0,0 +1,3 @@ + +packages: + - local: ../ diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/tests/assert_get_query_results_as_dict_objects_equal.sql b/task-2/dbt_packages/dbt_utils/integration_tests/tests/assert_get_query_results_as_dict_objects_equal.sql new file mode 100644 index 0000000..55d5400 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/tests/assert_get_query_results_as_dict_objects_equal.sql @@ -0,0 +1,81 @@ +-- depends_on: {{ ref('data_get_query_results_as_dict') }} + +{% set expected_dictionary={ + 'col_1': [1, 2, 3], + 'col_2': ['a', 'b', 'c'], + 'col_3': [True, False, none] +} %} + +{#- Handle snowflake casing silliness -#} +{% if target.type == 'snowflake' %} +{% set expected_dictionary={ + 'COL_1': [1, 2, 3], + 'COL_2': ['a', 'b', 'c'], + 'COL_3': [True, False, none] +} %} +{% endif %} + + +{% set actual_dictionary=dbt_utils.get_query_results_as_dict( + "select * from " ~ ref('data_get_query_results_as_dict') ~ " order by 1" +) %} +{#- +For reasons that remain unclear, Jinja won't return True for actual_dictionary == expected_dictionary. +Instead, we'll manually check that the values of these dictionaries are equivalent. +-#} + +{% set ns = namespace( + pass=True, + err_msg = "" +) %} +{% if execute %} +{#- Check that the dictionaries have the same keys -#} +{% set expected_keys=expected_dictionary.keys() | list | sort %} +{% set actual_keys=actual_dictionary.keys() | list | sort %} + +{% if expected_keys != actual_keys %} + {% set ns.pass=False %} + {% set ns.err_msg %} + The two dictionaries have different keys: + expected_dictionary has keys: {{ expected_keys }} + actual_dictionary has keys: {{ actual_keys }} + {% endset %} + +{% else %} + +{% for key, value in expected_dictionary.items() %} + {% set expected_length=expected_dictionary[key] | length %} + {% set actual_length=actual_dictionary[key] | length %} + + {% if expected_length != actual_length %} + {% set ns.pass=False %} + {% set ns.err_msg %} + The {{ key }} column has different lengths: + expected_dictionary[{{ key }}] has length {{ expected_length }} + actual_dictionary[{{ key }}] has length {{ actual_length }} + {% endset %} + + {% else %} + + {% for i in range(value | length) %} + {% set expected_value=expected_dictionary[key][i] %} + {% set actual_value=actual_dictionary[key][i] %} + {% if expected_value != actual_value %} + {% set ns.pass=False %} + {% set ns.err_msg %} + The {{ key }} column has differing values: + expected_dictionary[{{ key }}][{{ i }}] == {{ expected_value }} + actual_dictionary[{{ key }}][{{ i }}] == {{ actual_value }} + {% endset %} + + {% endif %} + {% endfor %} + {% endif %} + +{% endfor %} + +{% endif %} + +{{ log(ns.err_msg, info=True) }} +select 1 as col_name {% if ns.pass %} {{ limit_zero() }} {% endif %} +{% endif %} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/tests/generic/expect_table_columns_to_match_set.sql b/task-2/dbt_packages/dbt_utils/integration_tests/tests/generic/expect_table_columns_to_match_set.sql new file mode 100644 index 0000000..5074ae0 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/tests/generic/expect_table_columns_to_match_set.sql @@ -0,0 +1,54 @@ +{# + This macro is copied and slightly edited from the dbt_expectations package. + At the time of this addition, dbt_expectations couldn't be added because + integration_tests is installing dbt_utils from local without a hard-coded + path. dbt is not able to resolve duplicate dependencies of dbt_utils + due to this. +#} + +{%- test expect_table_columns_to_match_set(model, column_list, transform="upper") -%} +{%- if execute -%} + {%- set column_list = column_list | map(transform) | list -%} + + {# Replaces dbt_expectations._get_column_list() #} + {%- set relation_column_names = adapter.get_columns_in_relation(model) + | map(attribute="name") + | map(transform) + | list + -%} + + {# Replaces dbt_expectations._list_intersect() #} + {%- set matching_columns = [] -%} + {%- for itm in column_list -%} + {%- if itm in relation_column_names -%} + {%- do matching_columns.append(itm) -%} + {%- endif -%} + {%- endfor -%} + + with relation_columns as ( + + {% for col_name in relation_column_names %} + select cast('{{ col_name }}' as {{ type_string() }}) as relation_column + {% if not loop.last %}union all{% endif %} + {% endfor %} + ), + input_columns as ( + + {% for col_name in column_list %} + select cast('{{ col_name }}' as {{ type_string() }}) as input_column + {% if not loop.last %}union all{% endif %} + {% endfor %} + ) + select * + from + relation_columns r + full outer join + input_columns i on r.relation_column = i.input_column + where + -- catch any column in input list that is not in the list of table columns + -- or any table column that is not in the input list + r.relation_column is null or + i.input_column is null + +{%- endif -%} +{%- endtest -%} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/assert_pretty_output_msg_is_string.sql b/task-2/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/assert_pretty_output_msg_is_string.sql new file mode 100644 index 0000000..fea3359 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/assert_pretty_output_msg_is_string.sql @@ -0,0 +1,7 @@ +{% if dbt_utils.pretty_log_format() is string %} + {# Return 0 rows for the test to pass #} + select 1 as col_name {{ limit_zero() }} +{% else %} + {# Return >0 rows for the test to fail #} + select 1 +{% endif %} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/assert_pretty_time_is_string.sql b/task-2/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/assert_pretty_time_is_string.sql new file mode 100644 index 0000000..a6347ab --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/assert_pretty_time_is_string.sql @@ -0,0 +1,7 @@ +{% if dbt_utils.pretty_time() is string %} + {# Return 0 rows for the test to pass #} + select 1 as col_name {{ limit_zero() }} +{% else %} + {# Return >0 rows for the test to fail #} + select 1 +{% endif %} diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/test_slugify.sql b/task-2/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/test_slugify.sql new file mode 100644 index 0000000..e607af0 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/test_slugify.sql @@ -0,0 +1,13 @@ +with comparisons as ( + select '{{ dbt_utils.slugify("") }}' as output, '' as expected + union all + select '{{ dbt_utils.slugify(None) }}' as output, '' as expected + union all + select '{{ dbt_utils.slugify("!Hell0 world-hi") }}' as output, 'hell0_world_hi' as expected + union all + select '{{ dbt_utils.slugify("0Hell0 world-hi") }}' as output, '_0hell0_world_hi' as expected +) + +select * +from comparisons +where output != expected diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/tests/sql/test_get_column_values_use_default.sql b/task-2/dbt_packages/dbt_utils/integration_tests/tests/sql/test_get_column_values_use_default.sql new file mode 100644 index 0000000..3b7aeb7 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/tests/sql/test_get_column_values_use_default.sql @@ -0,0 +1,33 @@ + +{# +This keeps succeeding locally and failing in CI. Disabling it to get everything else out, but it should still be tested. +https://github.com/dbt-labs/dbt-utils/issues/788 +#} + +{{ config(enabled = false)}} + +{% set column_values = dbt_utils.get_column_values(ref('data_get_column_values_dropped'), 'field', default=['y', 'z'], order_by="field") %} + +with expected as ( + select {{ safe_cast("'y'", type_string()) }} as expected_column_value union all + select {{ safe_cast("'z'", type_string()) }} as expected_column_value +), + +actual as ( + + {% for val in column_values %} + select {{ safe_cast("'" ~ val ~ "'", type_string()) }} as actual_column_value + {% if not loop.last %} + union all + {% endif %} + {% endfor %} +), + +failures as ( + select * from actual + where actual.actual_column_value not in ( + select expected.expected_column_value from expected + ) +) + +select * from failures diff --git a/task-2/dbt_packages/dbt_utils/integration_tests/tests/sql/test_get_single_value_multiple_rows.sql b/task-2/dbt_packages/dbt_utils/integration_tests/tests/sql/test_get_single_value_multiple_rows.sql new file mode 100644 index 0000000..fc4c927 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/integration_tests/tests/sql/test_get_single_value_multiple_rows.sql @@ -0,0 +1,18 @@ +{% set query %} +with input as ( + select 1 as id, 4 as di + union all + select 2 as id, 5 as di + union all + select 3 as id, 6 as di +) +{% endset %} + +with comparisons as ( + select {{ dbt_utils.get_single_value(query ~ " select min(id) from input") }} as output, 1 as expected + union all + select {{ dbt_utils.get_single_value(query ~ " select max(di) from input") }} as output, 6 as expected +) +select * +from comparisons +where output != expected \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/accepted_range.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/accepted_range.sql new file mode 100644 index 0000000..49ab00d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/accepted_range.sql @@ -0,0 +1,33 @@ +{% test accepted_range(model, column_name, min_value=none, max_value=none, inclusive=true) %} + {{ return(adapter.dispatch('test_accepted_range', 'dbt_utils')(model, column_name, min_value, max_value, inclusive)) }} +{% endtest %} + +{% macro default__test_accepted_range(model, column_name, min_value=none, max_value=none, inclusive=true) %} + +with meet_condition as( + select * + from {{ model }} +), + +validation_errors as ( + select * + from meet_condition + where + -- never true, defaults to an empty result set. Exists to ensure any combo of the `or` clauses below succeeds + 1 = 2 + + {%- if min_value is not none %} + -- records with a value >= min_value are permitted. The `not` flips this to find records that don't meet the rule. + or not {{ column_name }} > {{- "=" if inclusive }} {{ min_value }} + {%- endif %} + + {%- if max_value is not none %} + -- records with a value <= max_value are permitted. The `not` flips this to find records that don't meet the rule. + or not {{ column_name }} < {{- "=" if inclusive }} {{ max_value }} + {%- endif %} +) + +select * +from validation_errors + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/at_least_one.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/at_least_one.sql new file mode 100644 index 0000000..aeba2e9 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/at_least_one.sql @@ -0,0 +1,48 @@ +{% test at_least_one(model, column_name, group_by_columns = []) %} + {{ return(adapter.dispatch('test_at_least_one', 'dbt_utils')(model, column_name, group_by_columns)) }} +{% endtest %} + +{% macro default__test_at_least_one(model, column_name, group_by_columns) %} + +{% set pruned_cols = [column_name] %} + +{% if group_by_columns|length() > 0 %} + + {% set select_gb_cols = group_by_columns|join(' ,') + ', ' %} + {% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %} + {% set pruned_cols = group_by_columns %} + + {% if column_name not in pruned_cols %} + {% do pruned_cols.append(column_name) %} + {% endif %} + +{% endif %} + +{% set select_pruned_cols = pruned_cols|join(' ,') %} + +select * +from ( + with pruned_rows as ( + select + {{ select_pruned_cols }} + from {{ model }} + {% if group_by_columns|length() == 0 %} + where {{ column_name }} is not null + limit 1 + {% endif %} + ) + select + {# In TSQL, subquery aggregate columns need aliases #} + {# thus: a filler col name, 'filler_column' #} + {{select_gb_cols}} + count({{ column_name }}) as filler_column + + from pruned_rows + + {{groupby_gb_cols}} + + having count({{ column_name }}) = 0 + +) validation_errors + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/cardinality_equality.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/cardinality_equality.sql new file mode 100644 index 0000000..824f0e5 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/cardinality_equality.sql @@ -0,0 +1,53 @@ +{% test cardinality_equality(model, column_name, to, field) %} + {{ return(adapter.dispatch('test_cardinality_equality', 'dbt_utils')(model, column_name, to, field)) }} +{% endtest %} + +{% macro default__test_cardinality_equality(model, column_name, to, field) %} + +{# T-SQL does not let you use numbers as aliases for columns #} +{# Thus, no "GROUP BY 1" #} + +with table_a as ( +select + {{ column_name }}, + count(*) as num_rows +from {{ model }} +group by {{ column_name }} +), + +table_b as ( +select + {{ field }}, + count(*) as num_rows +from {{ to }} +group by {{ field }} +), + +except_a as ( + select * + from table_a + {{ dbt.except() }} + select * + from table_b +), + +except_b as ( + select * + from table_b + {{ dbt.except() }} + select * + from table_a +), + +unioned as ( + select * + from except_a + union all + select * + from except_b +) + +select * +from unioned + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/equal_rowcount.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/equal_rowcount.sql new file mode 100644 index 0000000..600eae2 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/equal_rowcount.sql @@ -0,0 +1,76 @@ +{% test equal_rowcount(model, compare_model, group_by_columns = []) %} + {{ return(adapter.dispatch('test_equal_rowcount', 'dbt_utils')(model, compare_model, group_by_columns)) }} +{% endtest %} + +{% macro default__test_equal_rowcount(model, compare_model, group_by_columns) %} + +{#-- Needs to be set at parse time, before we return '' below --#} +{{ config(fail_calc = 'sum(coalesce(diff_count, 0))') }} + +{#-- Prevent querying of db in parsing mode. This works because this macro does not create any new refs. #} +{%- if not execute -%} + {{ return('') }} +{% endif %} + +{% if group_by_columns|length() > 0 %} + {% set select_gb_cols = group_by_columns|join(', ') + ', ' %} + {% set join_gb_cols %} + {% for c in group_by_columns %} + and a.{{c}} = b.{{c}} + {% endfor %} + {% endset %} + {% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %} +{% endif %} + +{#-- We must add a fake join key in case additional grouping variables are not provided --#} +{#-- Redshift does not allow for dynamically created join conditions (e.g. full join on 1 = 1 --#} +{#-- The same logic is used in fewer_rows_than. In case of changes, maintain consistent logic --#} +{% set group_by_columns = ['id_dbtutils_test_equal_rowcount'] + group_by_columns %} +{% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %} + +with a as ( + + select + {{select_gb_cols}} + 1 as id_dbtutils_test_equal_rowcount, + count(*) as count_a + from {{ model }} + {{groupby_gb_cols}} + + +), +b as ( + + select + {{select_gb_cols}} + 1 as id_dbtutils_test_equal_rowcount, + count(*) as count_b + from {{ compare_model }} + {{groupby_gb_cols}} + +), +final as ( + + select + + {% for c in group_by_columns -%} + a.{{c}} as {{c}}_a, + b.{{c}} as {{c}}_b, + {% endfor %} + + count_a, + count_b, + abs(count_a - count_b) as diff_count + + from a + full join b + on + a.id_dbtutils_test_equal_rowcount = b.id_dbtutils_test_equal_rowcount + {{join_gb_cols}} + + +) + +select * from final + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/equality.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/equality.sql new file mode 100644 index 0000000..d7d7197 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/equality.sql @@ -0,0 +1,166 @@ +{% test equality(model, compare_model, compare_columns=None, exclude_columns=None, precision = None) %} + {{ return(adapter.dispatch('test_equality', 'dbt_utils')(model, compare_model, compare_columns, exclude_columns, precision)) }} +{% endtest %} + +{% macro default__test_equality(model, compare_model, compare_columns=None, exclude_columns=None, precision = None) %} + +{%- if compare_columns and exclude_columns -%} + {{ exceptions.raise_compiler_error("Both a compare and an ignore list were provided to the `equality` macro. Only one is allowed") }} +{%- endif -%} + +{% set set_diff %} + count(*) + coalesce(abs( + sum(case when which_diff = 'a_minus_b' then 1 else 0 end) - + sum(case when which_diff = 'b_minus_a' then 1 else 0 end) + ), 0) +{% endset %} + +{#-- Needs to be set at parse time, before we return '' below --#} +{{ config(fail_calc = set_diff) }} + +{#-- Prevent querying of db in parsing mode. This works because this macro does not create any new refs. #} +{%- if not execute -%} + {{ return('') }} +{% endif %} + + + +-- setup +{%- do dbt_utils._is_relation(model, 'test_equality') -%} + +{# Ensure there are no extra columns in the compare_model vs model #} +{%- if not compare_columns -%} + {%- do dbt_utils._is_ephemeral(model, 'test_equality') -%} + {%- do dbt_utils._is_ephemeral(compare_model, 'test_equality') -%} + + {%- set model_columns = adapter.get_columns_in_relation(model) -%} + {%- set compare_model_columns = adapter.get_columns_in_relation(compare_model) -%} + + + {%- if exclude_columns -%} + {#-- Lower case ignore columns for easier comparison --#} + {%- set exclude_columns = exclude_columns | map("lower") | list %} + + {# Filter out the excluded columns #} + {%- set include_columns = [] %} + {%- set include_model_columns = [] %} + {%- for column in model_columns -%} + {%- if column.name | lower not in exclude_columns -%} + {% do include_columns.append(column) %} + {%- endif %} + {%- endfor %} + {%- for column in compare_model_columns -%} + {%- if column.name | lower not in exclude_columns -%} + {% do include_model_columns.append(column) %} + {%- endif %} + {%- endfor %} + + {%- set compare_columns_set = set(include_columns | map(attribute='quoted') | map("lower")) %} + {%- set compare_model_columns_set = set(include_model_columns | map(attribute='quoted') | map("lower")) %} + {%- else -%} + {%- set compare_columns_set = set(model_columns | map(attribute='quoted') | map("lower")) %} + {%- set compare_model_columns_set = set(compare_model_columns | map(attribute='quoted') | map("lower")) %} + {%- endif -%} + + {% if compare_columns_set != compare_model_columns_set %} + {{ exceptions.raise_compiler_error(compare_model ~" has less columns than " ~ model ~ ", please ensure they have the same columns or use the `compare_columns` or `exclude_columns` arguments to subset them.") }} + {% endif %} + + +{% endif %} + +{%- if not precision -%} + {%- if not compare_columns -%} + {# + You cannot get the columns in an ephemeral model (due to not existing in the information schema), + so if the user does not provide an explicit list of columns we must error in the case it is ephemeral + #} + {%- do dbt_utils._is_ephemeral(model, 'test_equality') -%} + {%- set compare_columns = adapter.get_columns_in_relation(model)-%} + + {%- if exclude_columns -%} + {#-- Lower case ignore columns for easier comparison --#} + {%- set exclude_columns = exclude_columns | map("lower") | list %} + + {# Filter out the excluded columns #} + {%- set include_columns = [] %} + {%- for column in compare_columns -%} + {%- if column.name | lower not in exclude_columns -%} + {% do include_columns.append(column) %} + {%- endif %} + {%- endfor %} + + {%- set compare_columns = include_columns | map(attribute='quoted') %} + {%- else -%} {# Compare columns provided #} + {%- set compare_columns = compare_columns | map(attribute='quoted') %} + {%- endif -%} + {%- endif -%} + + {% set compare_cols_csv = compare_columns | join(', ') %} + +{% else %} {# Precision required #} + {#- + If rounding is required, we need to get the types, so it cannot be ephemeral even if they provide column names + -#} + {%- do dbt_utils._is_ephemeral(model, 'test_equality') -%} + {%- set columns = adapter.get_columns_in_relation(model) -%} + + {% set columns_list = [] %} + {%- for col in columns -%} + {%- if ( + (col.name|lower in compare_columns|map('lower') or not compare_columns) and + (col.name|lower not in exclude_columns|map('lower') or not exclude_columns) + ) -%} + {# Databricks double type is not picked up by any number type checks in dbt #} + {%- if col.is_float() or col.is_numeric() or col.data_type == 'double' -%} + {# Cast is required due to postgres not having round for a double precision number #} + {%- do columns_list.append('round(cast(' ~ col.quoted ~ ' as ' ~ dbt.type_numeric() ~ '),' ~ precision ~ ') as ' ~ col.quoted) -%} + {%- else -%} {# Non-numeric type #} + {%- do columns_list.append(col.quoted) -%} + {%- endif -%} + {% endif %} + {%- endfor -%} + + {% set compare_cols_csv = columns_list | join(', ') %} + +{% endif %} + +with a as ( + + select * from {{ model }} + +), + +b as ( + + select * from {{ compare_model }} + +), + +a_minus_b as ( + + select {{compare_cols_csv}} from a + {{ dbt.except() }} + select {{compare_cols_csv}} from b + +), + +b_minus_a as ( + + select {{compare_cols_csv}} from b + {{ dbt.except() }} + select {{compare_cols_csv}} from a + +), + +unioned as ( + + select 'a_minus_b' as which_diff, a_minus_b.* from a_minus_b + union all + select 'b_minus_a' as which_diff, b_minus_a.* from b_minus_a + +) + +select * from unioned + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/expression_is_true.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/expression_is_true.sql new file mode 100644 index 0000000..2c72b8a --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/expression_is_true.sql @@ -0,0 +1,18 @@ +{% test expression_is_true(model, expression, column_name=None) %} + {{ return(adapter.dispatch('test_expression_is_true', 'dbt_utils')(model, expression, column_name)) }} +{% endtest %} + +{% macro default__test_expression_is_true(model, expression, column_name) %} + +{% set column_list = '*' if should_store_failures() else "1" %} + +select + {{ column_list }} +from {{ model }} +{% if column_name is none %} +where not({{ expression }}) +{%- else %} +where not({{ column_name }} {{ expression }}) +{%- endif %} + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/fewer_rows_than.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/fewer_rows_than.sql new file mode 100644 index 0000000..0be69e2 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/fewer_rows_than.sql @@ -0,0 +1,80 @@ +{% test fewer_rows_than(model, compare_model, group_by_columns = []) %} + {{ return(adapter.dispatch('test_fewer_rows_than', 'dbt_utils')(model, compare_model, group_by_columns)) }} +{% endtest %} + +{% macro default__test_fewer_rows_than(model, compare_model, group_by_columns) %} + +{{ config(fail_calc = 'sum(coalesce(row_count_delta, 0))') }} + +{% if group_by_columns|length() > 0 %} + {% set select_gb_cols = group_by_columns|join(' ,') + ', ' %} + {% set join_gb_cols %} + {% for c in group_by_columns %} + and a.{{c}} = b.{{c}} + {% endfor %} + {% endset %} + {% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %} +{% endif %} + +{#-- We must add a fake join key in case additional grouping variables are not provided --#} +{#-- Redshift does not allow for dynamically created join conditions (e.g. full join on 1 = 1 --#} +{#-- The same logic is used in equal_rowcount. In case of changes, maintain consistent logic --#} +{% set group_by_columns = ['id_dbtutils_test_fewer_rows_than'] + group_by_columns %} +{% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %} + + +with a as ( + + select + {{select_gb_cols}} + 1 as id_dbtutils_test_fewer_rows_than, + count(*) as count_our_model + from {{ model }} + {{ groupby_gb_cols }} + +), +b as ( + + select + {{select_gb_cols}} + 1 as id_dbtutils_test_fewer_rows_than, + count(*) as count_comparison_model + from {{ compare_model }} + {{ groupby_gb_cols }} + +), +counts as ( + + select + + {% for c in group_by_columns -%} + a.{{c}} as {{c}}_a, + b.{{c}} as {{c}}_b, + {% endfor %} + + count_our_model, + count_comparison_model + from a + full join b on + a.id_dbtutils_test_fewer_rows_than = b.id_dbtutils_test_fewer_rows_than + {{ join_gb_cols }} + +), +final as ( + + select *, + case + -- fail the test if we have more rows than the reference model and return the row count delta + when count_our_model > count_comparison_model then (count_our_model - count_comparison_model) + -- fail the test if they are the same number + when count_our_model = count_comparison_model then 1 + -- pass the test if the delta is positive (i.e. return the number 0) + else 0 + end as row_count_delta + from counts + +) + +select * from final + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/mutually_exclusive_ranges.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/mutually_exclusive_ranges.sql new file mode 100644 index 0000000..041788d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/mutually_exclusive_ranges.sql @@ -0,0 +1,97 @@ +{% test mutually_exclusive_ranges(model, lower_bound_column, upper_bound_column, partition_by=None, gaps='allowed', zero_length_range_allowed=False) %} + {{ return(adapter.dispatch('test_mutually_exclusive_ranges', 'dbt_utils')(model, lower_bound_column, upper_bound_column, partition_by, gaps, zero_length_range_allowed)) }} +{% endtest %} + +{% macro default__test_mutually_exclusive_ranges(model, lower_bound_column, upper_bound_column, partition_by=None, gaps='allowed', zero_length_range_allowed=False) %} +{% if gaps == 'not_allowed' %} + {% set allow_gaps_operator='=' %} + {% set allow_gaps_operator_in_words='equal_to' %} +{% elif gaps == 'allowed' %} + {% set allow_gaps_operator='<=' %} + {% set allow_gaps_operator_in_words='less_than_or_equal_to' %} +{% elif gaps == 'required' %} + {% set allow_gaps_operator='<' %} + {% set allow_gaps_operator_in_words='less_than' %} +{% else %} + {{ exceptions.raise_compiler_error( + "`gaps` argument for mutually_exclusive_ranges test must be one of ['not_allowed', 'allowed', 'required'] Got: '" ~ gaps ~"'.'" + ) }} +{% endif %} +{% if not zero_length_range_allowed %} + {% set allow_zero_length_operator='<' %} + {% set allow_zero_length_operator_in_words='less_than' %} +{% elif zero_length_range_allowed %} + {% set allow_zero_length_operator='<=' %} + {% set allow_zero_length_operator_in_words='less_than_or_equal_to' %} +{% else %} + {{ exceptions.raise_compiler_error( + "`zero_length_range_allowed` argument for mutually_exclusive_ranges test must be one of [true, false] Got: '" ~ zero_length_range_allowed ~"'.'" + ) }} +{% endif %} + +{% set partition_clause="partition by " ~ partition_by if partition_by else '' %} + +with window_functions as ( + + select + {% if partition_by %} + {{ partition_by }} as partition_by_col, + {% endif %} + {{ lower_bound_column }} as lower_bound, + {{ upper_bound_column }} as upper_bound, + + lead({{ lower_bound_column }}) over ( + {{ partition_clause }} + order by {{ lower_bound_column }}, {{ upper_bound_column }} + ) as next_lower_bound, + + row_number() over ( + {{ partition_clause }} + order by {{ lower_bound_column }} desc, {{ upper_bound_column }} desc + ) = 1 as is_last_record + + from {{ model }} + +), + +calc as ( + -- We want to return records where one of our assumptions fails, so we'll use + -- the `not` function with `and` statements so we can write our assumptions more cleanly + select + *, + + -- For each record: lower_bound should be < upper_bound. + -- Coalesce it to return an error on the null case (implicit assumption + -- these columns are not_null) + coalesce( + lower_bound {{ allow_zero_length_operator }} upper_bound, + false + ) as lower_bound_{{ allow_zero_length_operator_in_words }}_upper_bound, + + -- For each record: upper_bound {{ allow_gaps_operator }} the next lower_bound. + -- Coalesce it to handle null cases for the last record. + coalesce( + upper_bound {{ allow_gaps_operator }} next_lower_bound, + is_last_record, + false + ) as upper_bound_{{ allow_gaps_operator_in_words }}_next_lower_bound + + from window_functions + +), + +validation_errors as ( + + select + * + from calc + + where not( + -- THE FOLLOWING SHOULD BE TRUE -- + lower_bound_{{ allow_zero_length_operator_in_words }}_upper_bound + and upper_bound_{{ allow_gaps_operator_in_words }}_next_lower_bound + ) +) + +select * from validation_errors +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/not_accepted_values.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/not_accepted_values.sql new file mode 100644 index 0000000..ab24188 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/not_accepted_values.sql @@ -0,0 +1,37 @@ +{% test not_accepted_values(model, column_name, values, quote=True) %} + {{ return(adapter.dispatch('test_not_accepted_values', 'dbt_utils')(model, column_name, values, quote)) }} +{% endtest %} + +{% macro default__test_not_accepted_values(model, column_name, values, quote=True) %} +with all_values as ( + + select distinct + {{ column_name }} as value_field + + from {{ model }} + +), + +validation_errors as ( + + select + value_field + + from all_values + where value_field in ( + {% for value in values -%} + {% if quote -%} + '{{ value }}' + {%- else -%} + {{ value }} + {%- endif -%} + {%- if not loop.last -%},{%- endif %} + {%- endfor %} + ) + +) + +select * +from validation_errors + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/not_constant.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/not_constant.sql new file mode 100644 index 0000000..c3a976b --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/not_constant.sql @@ -0,0 +1,27 @@ + +{% test not_constant(model, column_name, group_by_columns = []) %} + {{ return(adapter.dispatch('test_not_constant', 'dbt_utils')(model, column_name, group_by_columns)) }} +{% endtest %} + +{% macro default__test_not_constant(model, column_name, group_by_columns) %} + +{% if group_by_columns|length() > 0 %} + {% set select_gb_cols = group_by_columns|join(' ,') + ', ' %} + {% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %} +{% endif %} + + +select + {# In TSQL, subquery aggregate columns need aliases #} + {# thus: a filler col name, 'filler_column' #} + {{select_gb_cols}} + count(distinct {{ column_name }}) as filler_column + +from {{ model }} + + {{groupby_gb_cols}} + +having count(distinct {{ column_name }}) = 1 + + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/not_empty_string.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/not_empty_string.sql new file mode 100644 index 0000000..cfaa998 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/not_empty_string.sql @@ -0,0 +1,39 @@ +{% test not_empty_string(model, column_name, trim_whitespace=true) %} + + {{ return(adapter.dispatch('test_not_empty_string', 'dbt_utils')(model, column_name, trim_whitespace)) }} + +{% endtest %} + +{% macro default__test_not_empty_string(model, column_name, trim_whitespace=true) %} + + with + + all_values as ( + + select + + + {% if trim_whitespace == true -%} + + trim({{ column_name }}) as {{ column_name }} + + {%- else -%} + + {{ column_name }} + + {%- endif %} + + from {{ model }} + + ), + + errors as ( + + select * from all_values + where {{ column_name }} = '' + + ) + + select * from errors + +{% endmacro %} \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/not_null_proportion.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/not_null_proportion.sql new file mode 100644 index 0000000..a0a4fa7 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/not_null_proportion.sql @@ -0,0 +1,34 @@ +{% macro test_not_null_proportion(model, group_by_columns = []) %} + {{ return(adapter.dispatch('test_not_null_proportion', 'dbt_utils')(model, group_by_columns, **kwargs)) }} +{% endmacro %} + +{% macro default__test_not_null_proportion(model, group_by_columns) %} + +{% set column_name = kwargs.get('column_name', kwargs.get('arg')) %} +{% set at_least = kwargs.get('at_least', kwargs.get('arg')) %} +{% set at_most = kwargs.get('at_most', kwargs.get('arg', 1)) %} + +{% if group_by_columns|length() > 0 %} + {% set select_gb_cols = group_by_columns|join(' ,') + ', ' %} + {% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %} +{% endif %} + +with validation as ( + select + {{select_gb_cols}} + sum(case when {{ column_name }} is null then 0 else 1 end) / cast(count(*) as {{ dbt.type_numeric() }}) as not_null_proportion + from {{ model }} + {{groupby_gb_cols}} +), +validation_errors as ( + select + {{select_gb_cols}} + not_null_proportion + from validation + where not_null_proportion < {{ at_least }} or not_null_proportion > {{ at_most }} +) +select + * +from validation_errors + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/recency.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/recency.sql new file mode 100644 index 0000000..e9137f6 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/recency.sql @@ -0,0 +1,46 @@ +{% test recency(model, field, datepart, interval, ignore_time_component=False, group_by_columns = []) %} + {{ return(adapter.dispatch('test_recency', 'dbt_utils')(model, field, datepart, interval, ignore_time_component, group_by_columns)) }} +{% endtest %} + +{% macro default__test_recency(model, field, datepart, interval, ignore_time_component, group_by_columns) %} + +{% set empty_invocation = flags.EMPTY is defined and flags.EMPTY %} + +{% set threshold = 'cast(' ~ dbt.dateadd(datepart, interval * -1, dbt.current_timestamp()) ~ ' as ' ~ ('date' if ignore_time_component else dbt.type_timestamp()) ~ ')' %} + +{% if group_by_columns|length() > 0 %} + {% set select_gb_cols = group_by_columns|join(' ,') + ', ' %} + {% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %} +{% endif %} + + +with recency as ( + + select + + {{ select_gb_cols }} + {% if ignore_time_component %} + cast(max({{ field }}) as date) as most_recent + {%- else %} + max({{ field }}) as most_recent + {%- endif %} + + from {{ model }} + + {{ groupby_gb_cols }} + +) + +select + + {{ select_gb_cols }} + most_recent, + {{ threshold }} as threshold + +from recency +where most_recent < {{ threshold }} +{%- if not empty_invocation %} + or most_recent is null +{%- endif %} + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/relationships_where.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/relationships_where.sql new file mode 100644 index 0000000..c35a380 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/relationships_where.sql @@ -0,0 +1,51 @@ +{% test relationships_where(model, column_name, to, field, from_condition="1=1", to_condition="1=1") %} + {{ return(adapter.dispatch('test_relationships_where', 'dbt_utils')(model, column_name, to, field, from_condition, to_condition)) }} +{% endtest %} + +{% macro default__test_relationships_where(model, column_name, to, field, from_condition="1=1", to_condition="1=1") %} + +{# T-SQL has no boolean data type so we use 1=1 which returns TRUE #} +{# ref https://stackoverflow.com/a/7170753/3842610 #} + +with left_table as ( + + select + {{column_name}} as id + + from {{model}} + + where {{column_name}} is not null + and {{from_condition}} + +), + +right_table as ( + + select + {{field}} as id + + from {{to}} + + where {{field}} is not null + and {{to_condition}} + +), + +exceptions as ( + + select + left_table.id, + right_table.id as right_id + + from left_table + + left join right_table + on left_table.id = right_table.id + + where right_table.id is null + +) + +select * from exceptions + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/sequential_values.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/sequential_values.sql new file mode 100644 index 0000000..736ccbd --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/sequential_values.sql @@ -0,0 +1,42 @@ +{% test sequential_values(model, column_name, interval=1, datepart=None, group_by_columns = []) %} + + {{ return(adapter.dispatch('test_sequential_values', 'dbt_utils')(model, column_name, interval, datepart, group_by_columns)) }} + +{% endtest %} + +{% macro default__test_sequential_values(model, column_name, interval=1, datepart=None, group_by_columns = []) %} + +{% set previous_column_name = "previous_" ~ dbt_utils.slugify(column_name) %} + +{% if group_by_columns|length() > 0 %} + {% set select_gb_cols = group_by_columns|join(',') + ', ' %} + {% set partition_gb_cols = 'partition by ' + group_by_columns|join(',') %} +{% endif %} + +with windowed as ( + + select + {{ select_gb_cols }} + {{ column_name }}, + lag({{ column_name }}) over ( + {{partition_gb_cols}} + order by {{ column_name }} + ) as {{ previous_column_name }} + from {{ model }} +), + +validation_errors as ( + select + * + from windowed + {% if datepart %} + where not(cast({{ column_name }} as {{ dbt.type_timestamp() }})= cast({{ dbt.dateadd(datepart, interval, previous_column_name) }} as {{ dbt.type_timestamp() }})) + {% else %} + where not({{ column_name }} = {{ previous_column_name }} + {{ interval }}) + {% endif %} +) + +select * +from validation_errors + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/generic_tests/unique_combination_of_columns.sql b/task-2/dbt_packages/dbt_utils/macros/generic_tests/unique_combination_of_columns.sql new file mode 100644 index 0000000..1a01156 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/generic_tests/unique_combination_of_columns.sql @@ -0,0 +1,37 @@ +{% test unique_combination_of_columns(model, combination_of_columns, quote_columns=false) %} + {{ return(adapter.dispatch('test_unique_combination_of_columns', 'dbt_utils')(model, combination_of_columns, quote_columns)) }} +{% endtest %} + +{% macro default__test_unique_combination_of_columns(model, combination_of_columns, quote_columns=false) %} + +{% if not quote_columns %} + {%- set column_list=combination_of_columns %} +{% elif quote_columns %} + {%- set column_list=[] %} + {% for column in combination_of_columns -%} + {% do column_list.append( adapter.quote(column) ) %} + {%- endfor %} +{% else %} + {{ exceptions.raise_compiler_error( + "`quote_columns` argument for unique_combination_of_columns test must be one of [True, False] Got: '" ~ quote ~"'.'" + ) }} +{% endif %} + +{%- set columns_csv=column_list | join(', ') %} + + +with validation_errors as ( + + select + {{ columns_csv }} + from {{ model }} + group by {{ columns_csv }} + having count(*) > 1 + +) + +select * +from validation_errors + + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/_is_ephemeral.sql b/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/_is_ephemeral.sql new file mode 100644 index 0000000..34c70db --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/_is_ephemeral.sql @@ -0,0 +1,16 @@ +{% macro _is_ephemeral(obj, macro) %} + {%- if obj.is_cte -%} + {% set ephemeral_prefix = api.Relation.add_ephemeral_prefix('') %} + {% if obj.name.startswith(ephemeral_prefix) %} + {% set model_name = obj.name[(ephemeral_prefix|length):] %} + {% else %} + {% set model_name = obj.name %} + {%- endif -%} + {% set error_message %} +The `{{ macro }}` macro cannot be used with ephemeral models, as it relies on the information schema. + +`{{ model_name }}` is an ephemeral model. Consider making it a view or table instead. + {% endset %} + {%- do exceptions.raise_compiler_error(error_message) -%} + {%- endif -%} +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/_is_relation.sql b/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/_is_relation.sql new file mode 100644 index 0000000..bee6db9 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/_is_relation.sql @@ -0,0 +1,5 @@ +{% macro _is_relation(obj, macro) %} + {%- if not (obj is mapping and obj.get('metadata', {}).get('type', '').endswith('Relation')) -%} + {%- do exceptions.raise_compiler_error("Macro " ~ macro ~ " expected a Relation but received the value: " ~ obj) -%} + {%- endif -%} +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/log_info.sql b/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/log_info.sql new file mode 100644 index 0000000..52b4b4a --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/log_info.sql @@ -0,0 +1,7 @@ +{% macro log_info(message) %} + {{ return(adapter.dispatch('log_info', 'dbt_utils')(message)) }} +{% endmacro %} + +{% macro default__log_info(message) %} + {{ log(dbt_utils.pretty_log_format(message), info=True) }} +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/pretty_log_format.sql b/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/pretty_log_format.sql new file mode 100644 index 0000000..fe580d1 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/pretty_log_format.sql @@ -0,0 +1,7 @@ +{% macro pretty_log_format(message) %} + {{ return(adapter.dispatch('pretty_log_format', 'dbt_utils')(message)) }} +{% endmacro %} + +{% macro default__pretty_log_format(message) %} + {{ return( dbt_utils.pretty_time() ~ ' + ' ~ message) }} +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/pretty_time.sql b/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/pretty_time.sql new file mode 100644 index 0000000..bad37ef --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/pretty_time.sql @@ -0,0 +1,7 @@ +{% macro pretty_time(format='%H:%M:%S') %} + {{ return(adapter.dispatch('pretty_time', 'dbt_utils')(format)) }} +{% endmacro %} + +{% macro default__pretty_time(format='%H:%M:%S') %} + {{ return(modules.datetime.datetime.now().strftime(format)) }} +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/slugify.sql b/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/slugify.sql new file mode 100644 index 0000000..f4c52c2 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/jinja_helpers/slugify.sql @@ -0,0 +1,18 @@ +{% macro slugify(string) %} + +{% if not string %} +{{ return('') }} +{% endif %} + +{#- Lower case the string -#} +{% set string = string | lower %} +{#- Replace spaces and dashes with underscores -#} +{% set string = modules.re.sub('[ -]+', '_', string) %} +{#- Only take letters, numbers, and underscores -#} +{% set string = modules.re.sub('[^a-z0-9_]+', '', string) %} +{#- Prepends "_" if string begins with a number -#} +{% set string = modules.re.sub('^[0-9]', '_' + string[0], string) %} + +{{ return(string) }} + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/date_spine.sql b/task-2/dbt_packages/dbt_utils/macros/sql/date_spine.sql new file mode 100644 index 0000000..71eabdf --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/date_spine.sql @@ -0,0 +1,75 @@ +{% macro get_intervals_between(start_date, end_date, datepart) -%} + {{ return(adapter.dispatch('get_intervals_between', 'dbt_utils')(start_date, end_date, datepart)) }} +{%- endmacro %} + +{% macro default__get_intervals_between(start_date, end_date, datepart) -%} + {%- call statement('get_intervals_between', fetch_result=True) %} + + select {{ dbt.datediff(start_date, end_date, datepart) }} + + {%- endcall -%} + + {%- set value_list = load_result('get_intervals_between') -%} + + {%- if value_list and value_list['data'] -%} + {%- set values = value_list['data'] | map(attribute=0) | list %} + {{ return(values[0]) }} + {%- else -%} + {{ return(1) }} + {%- endif -%} + +{%- endmacro %} + + + + +{% macro date_spine(datepart, start_date, end_date) %} + {{ return(adapter.dispatch('date_spine', 'dbt_utils')(datepart, start_date, end_date)) }} +{%- endmacro %} + +{% macro default__date_spine(datepart, start_date, end_date) %} + + +{# call as follows: + +date_spine( + "day", + "to_date('01/01/2016', 'mm/dd/yyyy')", + "dbt.dateadd(week, 1, current_date)" +) #} + + +with rawdata as ( + + {{dbt_utils.generate_series( + dbt_utils.get_intervals_between(start_date, end_date, datepart) + )}} + +), + +all_periods as ( + + select ( + {{ + dbt.dateadd( + datepart, + "row_number() over (order by generated_number) - 1", + start_date + ) + }} + ) as date_{{datepart}} + from rawdata + +), + +filtered as ( + + select * + from all_periods + where date_{{datepart}} <= {{ end_date }} + +) + +select * from filtered + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/deduplicate.sql b/task-2/dbt_packages/dbt_utils/macros/sql/deduplicate.sql new file mode 100644 index 0000000..3e75579 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/deduplicate.sql @@ -0,0 +1,110 @@ +{%- macro deduplicate(relation, partition_by, order_by) -%} + {{ return(adapter.dispatch('deduplicate', 'dbt_utils')(relation, partition_by, order_by)) }} +{% endmacro %} + +{%- macro default__deduplicate(relation, partition_by, order_by) -%} + + with row_numbered as ( + select + _inner.*, + row_number() over ( + partition by {{ partition_by }} + order by {{ order_by }} + ) as rn + from {{ relation }} as _inner + ) + + select + distinct data.* + from {{ relation }} as data + {# + -- Not all DBs will support natural joins but the ones that do include: + -- Oracle, MySQL, SQLite, Redshift, Teradata, Materialize, Databricks + -- Apache Spark, SingleStore, Vertica + -- Those that do not appear to support natural joins include: + -- SQLServer, Trino, Presto, Rockset, Athena + #} + natural join row_numbered + where row_numbered.rn = 1 + +{%- endmacro -%} + +-- Redshift has the `QUALIFY` syntax: +-- https://docs.aws.amazon.com/redshift/latest/dg/r_QUALIFY_clause.html +{% macro redshift__deduplicate(relation, partition_by, order_by) -%} + + select * + from {{ relation }} as tt + qualify + row_number() over ( + partition by {{ partition_by }} + order by {{ order_by }} + ) = 1 + +{% endmacro %} + +{# +-- Postgres has the `DISTINCT ON` syntax: +-- https://www.postgresql.org/docs/current/sql-select.html#SQL-DISTINCT +#} +{%- macro postgres__deduplicate(relation, partition_by, order_by) -%} + + select + distinct on ({{ partition_by }}) * + from {{ relation }} + order by {{ partition_by }}{{ ',' ~ order_by }} + +{%- endmacro -%} + +{# +-- Snowflake has the `QUALIFY` syntax: +-- https://docs.snowflake.com/en/sql-reference/constructs/qualify.html +#} +{%- macro snowflake__deduplicate(relation, partition_by, order_by) -%} + + select * + from {{ relation }} + qualify + row_number() over ( + partition by {{ partition_by }} + order by {{ order_by }} + ) = 1 + +{%- endmacro -%} + +{# +-- Databricks also has the `QUALIFY` syntax: +-- https://docs.databricks.com/sql/language-manual/sql-ref-syntax-qry-select-qualify.html +#} +{%- macro databricks__deduplicate(relation, partition_by, order_by) -%} + + select * + from {{ relation }} + qualify + row_number() over ( + partition by {{ partition_by }} + order by {{ order_by }} + ) = 1 + +{%- endmacro -%} + +{# +-- It is more performant to deduplicate using `array_agg` with a limit +-- clause in BigQuery: +-- https://github.com/dbt-labs/dbt-utils/issues/335#issuecomment-788157572 +#} +{%- macro bigquery__deduplicate(relation, partition_by, order_by) -%} + + select unique.* + from ( + select + array_agg ( + original + order by {{ order_by }} + limit 1 + )[offset(0)] unique + from {{ relation }} original + group by {{ partition_by }} + ) + +{%- endmacro -%} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/generate_series.sql b/task-2/dbt_packages/dbt_utils/macros/sql/generate_series.sql new file mode 100644 index 0000000..efcbd8a --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/generate_series.sql @@ -0,0 +1,53 @@ +{% macro get_powers_of_two(upper_bound) %} + {{ return(adapter.dispatch('get_powers_of_two', 'dbt_utils')(upper_bound)) }} +{% endmacro %} + +{% macro default__get_powers_of_two(upper_bound) %} + + {% if upper_bound <= 0 %} + {{ exceptions.raise_compiler_error("upper bound must be positive") }} + {% endif %} + + {% for _ in range(1, 100) %} + {% if upper_bound <= 2 ** loop.index %}{{ return(loop.index) }}{% endif %} + {% endfor %} + +{% endmacro %} + + +{% macro generate_series(upper_bound) %} + {{ return(adapter.dispatch('generate_series', 'dbt_utils')(upper_bound)) }} +{% endmacro %} + +{% macro default__generate_series(upper_bound) %} + + {% set n = dbt_utils.get_powers_of_two(upper_bound) %} + + with p as ( + select 0 as generated_number union all select 1 + ), unioned as ( + + select + + {% for i in range(n) %} + p{{i}}.generated_number * power(2, {{i}}) + {% if not loop.last %} + {% endif %} + {% endfor %} + + 1 + as generated_number + + from + + {% for i in range(n) %} + p as p{{i}} + {% if not loop.last %} cross join {% endif %} + {% endfor %} + + ) + + select * + from unioned + where generated_number <= {{upper_bound}} + order by generated_number + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/generate_surrogate_key.sql b/task-2/dbt_packages/dbt_utils/macros/sql/generate_surrogate_key.sql new file mode 100644 index 0000000..cc91e66 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/generate_surrogate_key.sql @@ -0,0 +1,29 @@ +{%- macro generate_surrogate_key(field_list) -%} + {{ return(adapter.dispatch('generate_surrogate_key', 'dbt_utils')(field_list)) }} +{% endmacro %} + +{%- macro default__generate_surrogate_key(field_list) -%} + +{%- if var('surrogate_key_treat_nulls_as_empty_strings', False) -%} + {%- set default_null_value = "" -%} +{%- else -%} + {%- set default_null_value = '_dbt_utils_surrogate_key_null_' -%} +{%- endif -%} + +{%- set fields = [] -%} + +{%- for field in field_list -%} + + {%- do fields.append( + "coalesce(cast(" ~ field ~ " as " ~ dbt.type_string() ~ "), '" ~ default_null_value ~"')" + ) -%} + + {%- if not loop.last %} + {%- do fields.append("'-'") -%} + {%- endif -%} + +{%- endfor -%} + +{{ dbt.hash(dbt.concat(fields)) }} + +{%- endmacro -%} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/get_column_values.sql b/task-2/dbt_packages/dbt_utils/macros/sql/get_column_values.sql new file mode 100644 index 0000000..d1dcf5d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/get_column_values.sql @@ -0,0 +1,65 @@ +{% macro get_column_values(table, column, order_by='count(*) desc', max_records=none, default=none, where=none) -%} + {{ return(adapter.dispatch('get_column_values', 'dbt_utils')(table, column, order_by, max_records, default, where)) }} +{% endmacro %} + +{% macro default__get_column_values(table, column, order_by='count(*) desc', max_records=none, default=none, where=none) -%} + {#-- Prevent querying of db in parsing mode. This works because this macro does not create any new refs. #} + {%- if not execute -%} + {% set default = [] if not default %} + {{ return(default) }} + {% endif %} + + {%- do dbt_utils._is_ephemeral(table, 'get_column_values') -%} + + {# Not all relations are tables. Renaming for internal clarity without breaking functionality for anyone using named arguments #} + {# TODO: Change the method signature in a future 0.x.0 release #} + {%- set target_relation = table -%} + + {# adapter.load_relation is a convenience wrapper to avoid building a Relation when we already have one #} + {% set relation_exists = (load_relation(target_relation)) is not none %} + + {%- call statement('get_column_values', fetch_result=true) %} + + {%- if not relation_exists and default is none -%} + + {{ exceptions.raise_compiler_error("In get_column_values(): relation " ~ target_relation ~ " does not exist and no default value was provided.") }} + + {%- elif not relation_exists and default is not none -%} + + {{ log("Relation " ~ target_relation ~ " does not exist. Returning the default value: " ~ default) }} + + {{ return(default) }} + + {%- else -%} + + + select + {{ column }} as value + + from {{ target_relation }} + + {% if where is not none %} + where {{ where }} + {% endif %} + + group by {{ column }} + order by {{ order_by }} + + {% if max_records is not none %} + limit {{ max_records }} + {% endif %} + + {% endif %} + + {%- endcall -%} + + {%- set value_list = load_result('get_column_values') -%} + + {%- if value_list and value_list['data'] -%} + {%- set values = value_list['data'] | map(attribute=0) | list %} + {{ return(values) }} + {%- else -%} + {{ return(default) }} + {%- endif -%} + +{%- endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/get_filtered_columns_in_relation.sql b/task-2/dbt_packages/dbt_utils/macros/sql/get_filtered_columns_in_relation.sql new file mode 100644 index 0000000..b15d3ca --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/get_filtered_columns_in_relation.sql @@ -0,0 +1,25 @@ +{% macro get_filtered_columns_in_relation(from, except=[]) -%} + {{ return(adapter.dispatch('get_filtered_columns_in_relation', 'dbt_utils')(from, except)) }} +{% endmacro %} + +{% macro default__get_filtered_columns_in_relation(from, except=[]) -%} + {%- do dbt_utils._is_relation(from, 'get_filtered_columns_in_relation') -%} + {%- do dbt_utils._is_ephemeral(from, 'get_filtered_columns_in_relation') -%} + + {# -- Prevent querying of db in parsing mode. This works because this macro does not create any new refs. #} + {%- if not execute -%} + {{ return([]) }} + {% endif %} + + {%- set include_cols = [] %} + {%- set cols = adapter.get_columns_in_relation(from) -%} + {%- set except = except | map("lower") | list %} + {%- for col in cols -%} + {%- if col.column|lower not in except -%} + {% do include_cols.append(col.column) %} + {%- endif %} + {%- endfor %} + + {{ return(include_cols) }} + +{%- endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/get_query_results_as_dict.sql b/task-2/dbt_packages/dbt_utils/macros/sql/get_query_results_as_dict.sql new file mode 100644 index 0000000..6548f2d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/get_query_results_as_dict.sql @@ -0,0 +1,26 @@ +{% macro get_query_results_as_dict(query) %} + {{ return(adapter.dispatch('get_query_results_as_dict', 'dbt_utils')(query)) }} +{% endmacro %} + +{% macro default__get_query_results_as_dict(query) %} + +{# This macro returns a dictionary of the form {column_name: (tuple_of_results)} #} + + {%- call statement('get_query_results', fetch_result=True,auto_begin=false) -%} + + {{ query }} + + {%- endcall -%} + + {% set sql_results={} %} + + {%- if execute -%} + {% set sql_results_table = load_result('get_query_results').table.columns %} + {% for column_name, column in sql_results_table.items() %} + {% do sql_results.update({column_name: column.values()}) %} + {% endfor %} + {%- endif -%} + + {{ return(sql_results) }} + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/get_relations_by_pattern.sql b/task-2/dbt_packages/dbt_utils/macros/sql/get_relations_by_pattern.sql new file mode 100644 index 0000000..9325a88 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/get_relations_by_pattern.sql @@ -0,0 +1,32 @@ +{% macro get_relations_by_pattern(schema_pattern, table_pattern, exclude='', database=target.database) %} + {{ return(adapter.dispatch('get_relations_by_pattern', 'dbt_utils')(schema_pattern, table_pattern, exclude, database)) }} +{% endmacro %} + +{% macro default__get_relations_by_pattern(schema_pattern, table_pattern, exclude='', database=target.database) %} + + {%- call statement('get_tables', fetch_result=True) %} + + {{ dbt_utils.get_tables_by_pattern_sql(schema_pattern, table_pattern, exclude, database) }} + + {%- endcall -%} + + {%- set table_list = load_result('get_tables') -%} + + {%- if table_list and table_list['table'] -%} + {%- set tbl_relations = [] -%} + {%- for row in table_list['table'] -%} + {%- set tbl_relation = api.Relation.create( + database=database, + schema=row.table_schema, + identifier=row.table_name, + type=row.table_type + ) -%} + {%- do tbl_relations.append(tbl_relation) -%} + {%- endfor -%} + + {{ return(tbl_relations) }} + {%- else -%} + {{ return([]) }} + {%- endif -%} + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/get_relations_by_prefix.sql b/task-2/dbt_packages/dbt_utils/macros/sql/get_relations_by_prefix.sql new file mode 100644 index 0000000..b6733c4 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/get_relations_by_prefix.sql @@ -0,0 +1,32 @@ +{% macro get_relations_by_prefix(schema, prefix, exclude='', database=target.database) %} + {{ return(adapter.dispatch('get_relations_by_prefix', 'dbt_utils')(schema, prefix, exclude, database)) }} +{% endmacro %} + +{% macro default__get_relations_by_prefix(schema, prefix, exclude='', database=target.database) %} + + {%- call statement('get_tables', fetch_result=True) %} + + {{ dbt_utils.get_tables_by_prefix_sql(schema, prefix, exclude, database) }} + + {%- endcall -%} + + {%- set table_list = load_result('get_tables') -%} + + {%- if table_list and table_list['table'] -%} + {%- set tbl_relations = [] -%} + {%- for row in table_list['table'] -%} + {%- set tbl_relation = api.Relation.create( + database=database, + schema=row.table_schema, + identifier=row.table_name, + type=row.table_type + ) -%} + {%- do tbl_relations.append(tbl_relation) -%} + {%- endfor -%} + + {{ return(tbl_relations) }} + {%- else -%} + {{ return([]) }} + {%- endif -%} + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/get_single_value.sql b/task-2/dbt_packages/dbt_utils/macros/sql/get_single_value.sql new file mode 100644 index 0000000..479a45f --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/get_single_value.sql @@ -0,0 +1,33 @@ +{% macro get_single_value(query, default=none) %} + {{ return(adapter.dispatch('get_single_value', 'dbt_utils')(query, default)) }} +{% endmacro %} + +{% macro default__get_single_value(query, default) %} + +{# This macro returns the (0, 0) record in a query, i.e. the first row of the first column #} + + {%- call statement('get_query_result', fetch_result=True, auto_begin=false) -%} + + {{ query }} + + {%- endcall -%} + + {%- if execute -%} + + {% set r = load_result('get_query_result').table.columns[0].values() %} + {% if r | length == 0 %} + {% do print('Query `' ~ query ~ '` returned no rows. Using the default value: ' ~ default) %} + {% set sql_result = default %} + {% else %} + {% set sql_result = r[0] %} + {% endif %} + + {%- else -%} + + {% set sql_result = default %} + + {%- endif -%} + + {% do return(sql_result) %} + +{% endmacro %} \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/get_table_types_sql.sql b/task-2/dbt_packages/dbt_utils/macros/sql/get_table_types_sql.sql new file mode 100644 index 0000000..8a88c45 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/get_table_types_sql.sql @@ -0,0 +1,32 @@ +{%- macro get_table_types_sql() -%} + {{ return(adapter.dispatch('get_table_types_sql', 'dbt_utils')()) }} +{%- endmacro -%} + +{% macro default__get_table_types_sql() %} + case table_type + when 'BASE TABLE' then 'table' + when 'EXTERNAL TABLE' then 'external' + when 'MATERIALIZED VIEW' then 'materializedview' + else lower(table_type) + end as {{ adapter.quote('table_type') }} +{% endmacro %} + + +{% macro postgres__get_table_types_sql() %} + case table_type + when 'BASE TABLE' then 'table' + when 'FOREIGN' then 'external' + when 'MATERIALIZED VIEW' then 'materializedview' + else lower(table_type) + end as {{ adapter.quote('table_type') }} +{% endmacro %} + + +{% macro databricks__get_table_types_sql() %} + case table_type + when 'MANAGED' then 'table' + when 'BASE TABLE' then 'table' + when 'MATERIALIZED VIEW' then 'materializedview' + else lower(table_type) + end as {{ adapter.quote('table_type') }} +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/get_tables_by_pattern_sql.sql b/task-2/dbt_packages/dbt_utils/macros/sql/get_tables_by_pattern_sql.sql new file mode 100644 index 0000000..03f9662 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/get_tables_by_pattern_sql.sql @@ -0,0 +1,96 @@ +{% macro get_tables_by_pattern_sql(schema_pattern, table_pattern, exclude='', database=target.database) %} + {{ return(adapter.dispatch('get_tables_by_pattern_sql', 'dbt_utils') + (schema_pattern, table_pattern, exclude, database)) }} +{% endmacro %} + +{% macro default__get_tables_by_pattern_sql(schema_pattern, table_pattern, exclude='', database=target.database) %} + + select distinct + table_schema as {{ adapter.quote('table_schema') }}, + table_name as {{ adapter.quote('table_name') }}, + {{ dbt_utils.get_table_types_sql() }} + from {{ database }}.information_schema.tables + where table_schema ilike '{{ schema_pattern }}' + and table_name ilike '{{ table_pattern }}' + and table_name not ilike '{{ exclude }}' + +{% endmacro %} + +{% macro redshift__get_tables_by_pattern_sql(schema_pattern, table_pattern, exclude='', database=target.database) %} + + {% set sql %} + select distinct + table_schema as {{ adapter.quote('table_schema') }}, + table_name as {{ adapter.quote('table_name') }}, + {{ dbt_utils.get_table_types_sql() }} + from "{{ database }}"."information_schema"."tables" + where table_schema ilike '{{ schema_pattern }}' + and table_name ilike '{{ table_pattern }}' + and table_name not ilike '{{ exclude }}' + union all + select distinct + schemaname as {{ adapter.quote('table_schema') }}, + tablename as {{ adapter.quote('table_name') }}, + 'external' as {{ adapter.quote('table_type') }} + from svv_external_tables + where redshift_database_name = '{{ database }}' + and schemaname ilike '{{ schema_pattern }}' + and table_name ilike '{{ table_pattern }}' + and table_name not ilike '{{ exclude }}' + {% endset %} + + {{ return(sql) }} +{% endmacro %} + + +{% macro bigquery__get_tables_by_pattern_sql(schema_pattern, table_pattern, exclude='', database=target.database) %} + + {% if '%' in schema_pattern %} + {% set schemata=dbt_utils._bigquery__get_matching_schemata(schema_pattern, database) %} + {% else %} + {% set schemata=[schema_pattern] %} + {% endif %} + + {% set sql %} + {% for schema in schemata %} + select distinct + table_schema, + table_name, + {{ dbt_utils.get_table_types_sql() }} + + from {{ adapter.quote(database) }}.{{ schema }}.INFORMATION_SCHEMA.TABLES + where lower(table_name) like lower ('{{ table_pattern }}') + and lower(table_name) not like lower ('{{ exclude }}') + + {% if not loop.last %} union all {% endif %} + + {% endfor %} + {% endset %} + + {{ return(sql) }} + +{% endmacro %} + + +{% macro _bigquery__get_matching_schemata(schema_pattern, database) %} + {% if execute %} + + {% set sql %} + select schema_name from {{ adapter.quote(database) }}.INFORMATION_SCHEMA.SCHEMATA + where lower(schema_name) like lower('{{ schema_pattern }}') + {% endset %} + + {% set results=run_query(sql) %} + + {% set schemata=results.columns['schema_name'].values() %} + + {{ return(schemata) }} + + {% else %} + + {{ return([]) }} + + {% endif %} + + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/get_tables_by_prefix_sql.sql b/task-2/dbt_packages/dbt_utils/macros/sql/get_tables_by_prefix_sql.sql new file mode 100644 index 0000000..f8fdfba --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/get_tables_by_prefix_sql.sql @@ -0,0 +1,14 @@ +{% macro get_tables_by_prefix_sql(schema, prefix, exclude='', database=target.database) %} + {{ return(adapter.dispatch('get_tables_by_prefix_sql', 'dbt_utils')(schema, prefix, exclude, database)) }} +{% endmacro %} + +{% macro default__get_tables_by_prefix_sql(schema, prefix, exclude='', database=target.database) %} + + {{ dbt_utils.get_tables_by_pattern_sql( + schema_pattern = schema, + table_pattern = prefix ~ '%', + exclude = exclude, + database = database + ) }} + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/groupby.sql b/task-2/dbt_packages/dbt_utils/macros/sql/groupby.sql new file mode 100644 index 0000000..68a68cf --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/groupby.sql @@ -0,0 +1,11 @@ +{%- macro group_by(n) -%} + {{ return(adapter.dispatch('group_by', 'dbt_utils')(n)) }} +{% endmacro %} + +{%- macro default__group_by(n) -%} + + group by {% for i in range(1, n + 1) -%} + {{ i }}{{ ',' if not loop.last }} + {%- endfor -%} + +{%- endmacro -%} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/haversine_distance.sql b/task-2/dbt_packages/dbt_utils/macros/sql/haversine_distance.sql new file mode 100644 index 0000000..70f276e --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/haversine_distance.sql @@ -0,0 +1,51 @@ +{# +This calculates the distance between two sets of latitude and longitude. +The formula is from the following blog post: +http://daynebatten.com/2015/09/latitude-longitude-distance-sql/ + +The arguments should be float type. +#} + +{% macro degrees_to_radians(degrees) -%} + acos(-1) * {{degrees}} / 180 +{%- endmacro %} + +{% macro haversine_distance(lat1, lon1, lat2, lon2, unit='mi') -%} + {{ return(adapter.dispatch('haversine_distance', 'dbt_utils')(lat1,lon1,lat2,lon2,unit)) }} +{% endmacro %} + +{% macro default__haversine_distance(lat1, lon1, lat2, lon2, unit='mi') -%} +{%- if unit == 'mi' %} + {% set conversion_rate = 1 %} +{% elif unit == 'km' %} + {% set conversion_rate = 1.60934 %} +{% else %} + {{ exceptions.raise_compiler_error("unit input must be one of 'mi' or 'km'. Got " ~ unit) }} +{% endif %} + + 2 * 3961 * asin(sqrt(power((sin(radians(({{ lat2 }} - {{ lat1 }}) / 2))), 2) + + cos(radians({{lat1}})) * cos(radians({{lat2}})) * + power((sin(radians(({{ lon2 }} - {{ lon1 }}) / 2))), 2))) * {{ conversion_rate }} + +{%- endmacro %} + + + +{% macro bigquery__haversine_distance(lat1, lon1, lat2, lon2, unit='mi') -%} +{% set radians_lat1 = dbt_utils.degrees_to_radians(lat1) %} +{% set radians_lat2 = dbt_utils.degrees_to_radians(lat2) %} +{% set radians_lon1 = dbt_utils.degrees_to_radians(lon1) %} +{% set radians_lon2 = dbt_utils.degrees_to_radians(lon2) %} +{%- if unit == 'mi' %} + {% set conversion_rate = 1 %} +{% elif unit == 'km' %} + {% set conversion_rate = 1.60934 %} +{% else %} + {{ exceptions.raise_compiler_error("unit input must be one of 'mi' or 'km'. Got " ~ unit) }} +{% endif %} + 2 * 3961 * asin(sqrt(power(sin(({{ radians_lat2 }} - {{ radians_lat1 }}) / 2), 2) + + cos({{ radians_lat1 }}) * cos({{ radians_lat2 }}) * + power(sin(({{ radians_lon2 }} - {{ radians_lon1 }}) / 2), 2))) * {{ conversion_rate }} + +{%- endmacro %} + diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/nullcheck.sql b/task-2/dbt_packages/dbt_utils/macros/sql/nullcheck.sql new file mode 100644 index 0000000..509d24f --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/nullcheck.sql @@ -0,0 +1,21 @@ +{% macro nullcheck(cols) %} + {{ return(adapter.dispatch('nullcheck', 'dbt_utils')(cols)) }} +{% endmacro %} + +{% macro default__nullcheck(cols) %} +{%- for col in cols %} + + {% if col.is_string() -%} + + nullif({{col.name}},'') as {{col.name}} + + {%- else -%} + + {{col.name}} + + {%- endif -%} + +{%- if not loop.last -%} , {%- endif -%} + +{%- endfor -%} +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/nullcheck_table.sql b/task-2/dbt_packages/dbt_utils/macros/sql/nullcheck_table.sql new file mode 100644 index 0000000..c9ab583 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/nullcheck_table.sql @@ -0,0 +1,14 @@ +{% macro nullcheck_table(relation) %} + {{ return(adapter.dispatch('nullcheck_table', 'dbt_utils')(relation)) }} +{% endmacro %} + +{% macro default__nullcheck_table(relation) %} + + {%- do dbt_utils._is_relation(relation, 'nullcheck_table') -%} + {%- do dbt_utils._is_ephemeral(relation, 'nullcheck_table') -%} + {% set cols = adapter.get_columns_in_relation(relation) %} + + select {{ dbt_utils.nullcheck(cols) }} + from {{relation}} + +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/pivot.sql b/task-2/dbt_packages/dbt_utils/macros/sql/pivot.sql new file mode 100644 index 0000000..3eabc72 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/pivot.sql @@ -0,0 +1,86 @@ +{# +Pivot values from rows to columns. + +Example: + + Input: `public.test` + + | size | color | + |------+-------| + | S | red | + | S | blue | + | S | red | + | M | red | + + select + size, + {{ dbt_utils.pivot('color', dbt_utils.get_column_values('public.test', + 'color')) }} + from public.test + group by size + + Output: + + | size | red | blue | + |------+-----+------| + | S | 2 | 1 | + | M | 1 | 0 | + +Arguments: + column: Column name, required + values: List of row values to turn into columns, required + alias: Whether to create column aliases, default is True + agg: SQL aggregation function, default is sum + cmp: SQL value comparison, default is = + prefix: Column alias prefix, default is blank + suffix: Column alias postfix, default is blank + then_value: Value to use if comparison succeeds, default is 1 + else_value: Value to use if comparison fails, default is 0 + quote_identifiers: Whether to surround column aliases with double quotes, default is true + distinct: Whether to use distinct in the aggregation, default is False +#} + +{% macro pivot(column, + values, + alias=True, + agg='sum', + cmp='=', + prefix='', + suffix='', + then_value=1, + else_value=0, + quote_identifiers=True, + distinct=False) %} + {{ return(adapter.dispatch('pivot', 'dbt_utils')(column, values, alias, agg, cmp, prefix, suffix, then_value, else_value, quote_identifiers, distinct)) }} +{% endmacro %} + +{% macro default__pivot(column, + values, + alias=True, + agg='sum', + cmp='=', + prefix='', + suffix='', + then_value=1, + else_value=0, + quote_identifiers=True, + distinct=False) %} + {% for value in values %} + {{ agg }}( + {% if distinct %} distinct {% endif %} + case + when {{ column }} {{ cmp }} '{{ dbt.escape_single_quotes(value) }}' + then {{ then_value }} + else {{ else_value }} + end + ) + {% if alias %} + {% if quote_identifiers %} + as {{ adapter.quote(prefix ~ value ~ suffix) }} + {% else %} + as {{ dbt_utils.slugify(prefix ~ value ~ suffix) }} + {% endif %} + {% endif %} + {% if not loop.last %},{% endif %} + {% endfor %} +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/safe_add.sql b/task-2/dbt_packages/dbt_utils/macros/sql/safe_add.sql new file mode 100644 index 0000000..a67cd29 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/safe_add.sql @@ -0,0 +1,28 @@ +{%- macro safe_add(field_list) -%} + {{ return(adapter.dispatch('safe_add', 'dbt_utils')(field_list)) }} +{% endmacro %} + +{%- macro default__safe_add(field_list) -%} + +{%- if field_list is not iterable or field_list is string or field_list is mapping -%} + +{%- set error_message = ' +Warning: the `safe_add` macro now takes a single list argument instead of \ +string arguments. The {}.{} model triggered this warning. \ +'.format(model.package_name, model.name) -%} + +{%- do exceptions.warn(error_message) -%} + +{%- endif -%} + +{% set fields = [] %} + +{%- for field in field_list -%} + + {% do fields.append("coalesce(" ~ field ~ ", 0)") %} + +{%- endfor -%} + +{{ fields|join(' +\n ') }} + +{%- endmacro -%} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/safe_divide.sql b/task-2/dbt_packages/dbt_utils/macros/sql/safe_divide.sql new file mode 100644 index 0000000..791f72c --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/safe_divide.sql @@ -0,0 +1,7 @@ +{% macro safe_divide(numerator, denominator) -%} + {{ return(adapter.dispatch('safe_divide', 'dbt_utils')(numerator, denominator)) }} +{%- endmacro %} + +{% macro default__safe_divide(numerator, denominator) %} + ( {{ numerator }} ) / nullif( ( {{ denominator }} ), 0) +{% endmacro %} \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/safe_subtract.sql b/task-2/dbt_packages/dbt_utils/macros/sql/safe_subtract.sql new file mode 100644 index 0000000..378424c --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/safe_subtract.sql @@ -0,0 +1,28 @@ +{%- macro safe_subtract(field_list) -%} + {{ return(adapter.dispatch('safe_subtract', 'dbt_utils')(field_list)) }} +{% endmacro %} + +{%- macro default__safe_subtract(field_list) -%} + +{%- if field_list is not iterable or field_list is string or field_list is mapping -%} + +{%- set error_message = ' +Warning: the `safe_subtract` macro takes a single list argument instead of \ +string arguments. The {}.{} model triggered this warning. \ +'.format(model.package_name, model.name) -%} + +{%- do exceptions.raise_compiler_error(error_message) -%} + +{%- endif -%} + +{% set fields = [] %} + +{%- for field in field_list -%} + + {% do fields.append("coalesce(" ~ field ~ ", 0)") %} + +{%- endfor -%} + +{{ fields|join(' -\n ') }} + +{%- endmacro -%} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/star.sql b/task-2/dbt_packages/dbt_utils/macros/sql/star.sql new file mode 100644 index 0000000..9640b61 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/star.sql @@ -0,0 +1,51 @@ +{% macro star(from, relation_alias=False, except=[], prefix='', suffix='', quote_identifiers=True, unquote_aliases=False, rename={}) -%} + {{ return(adapter.dispatch('star', 'dbt_utils')(from, relation_alias, except, prefix, suffix, quote_identifiers, unquote_aliases, rename)) }} +{% endmacro %} + +{% macro default__star(from, relation_alias=False, except=[], prefix='', suffix='', quote_identifiers=True, unquote_aliases=False, rename={}) -%} + {%- do dbt_utils._is_relation(from, 'star') -%} + {%- do dbt_utils._is_ephemeral(from, 'star') -%} + + {#-- Prevent querying of db in parsing mode. This works because this macro does not create any new refs. #} + {%- if not execute -%} + {% do return('*') %} + {%- endif -%} + + {% set cols = dbt_utils.get_filtered_columns_in_relation(from, except) %} + + {%- set rename_lower = {} -%} + {%- for key, val in rename.items() -%} + {%- do rename_lower.update({key.lower(): val}) -%} + {%- endfor -%} + + {%- if cols|length <= 0 -%} + {% if flags.WHICH == 'compile' %} + {% set response %} +* +/* No columns were returned. Maybe the relation doesn't exist yet +or all columns were excluded. This star is only output during +dbt compile, and exists to keep SQLFluff happy. */ + {% endset %} + {% do return(response) %} + {% else %} + {% do return("/* no columns returned from star() macro */") %} + {% endif %} + {%- else -%} + {%- for col in cols %} + {%- if relation_alias %}{{ relation_alias }}.{% else %}{%- endif -%} + {%- if quote_identifiers -%} + {{ adapter.quote(col)|trim }} + {%- if col.lower() in rename_lower %} as {{ rename_lower[col.lower()] }} + {%- elif unquote_aliases %} as {{ (prefix ~ col ~ suffix)|trim }} + {%- elif prefix!='' or suffix!='' %} as {{ adapter.quote(prefix ~ col ~ suffix)|trim }} + {%- endif -%} + {%- else -%} + {{ col|trim }} + {%- if col.lower() in rename_lower %} as {{ rename_lower[col.lower()] }} + {%- elif prefix!='' or suffix!='' %} as {{ (prefix ~ col ~ suffix)|trim }} + {%- endif -%} + {%- endif -%} + {%- if not loop.last %},{{ '\n ' }}{%- endif -%} + {%- endfor -%} + {% endif %} +{%- endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/surrogate_key.sql b/task-2/dbt_packages/dbt_utils/macros/sql/surrogate_key.sql new file mode 100644 index 0000000..98e968a --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/surrogate_key.sql @@ -0,0 +1,20 @@ +{%- macro surrogate_key(field_list) -%} + {% set frustrating_jinja_feature = varargs %} + {{ return(adapter.dispatch('surrogate_key', 'dbt_utils')(field_list, *varargs)) }} +{% endmacro %} + +{%- macro default__surrogate_key(field_list) -%} + +{%- set error_message = ' +Warning: `dbt_utils.surrogate_key` has been replaced by \ +`dbt_utils.generate_surrogate_key`. The new macro treats null values \ +differently to empty strings. To restore the behaviour of the original \ +macro, add a global variable in dbt_project.yml called \ +`surrogate_key_treat_nulls_as_empty_strings` to your \ +dbt_project.yml file with a value of True. \ +The {}.{} model triggered this warning. \ +'.format(model.package_name, model.name) -%} + +{%- do exceptions.raise_compiler_error(error_message) -%} + +{%- endmacro -%} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/union.sql b/task-2/dbt_packages/dbt_utils/macros/sql/union.sql new file mode 100644 index 0000000..9e2909d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/union.sql @@ -0,0 +1,134 @@ +{%- macro union_relations(relations, column_override=none, include=[], exclude=[], source_column_name='_dbt_source_relation', where=none) -%} + {{ return(adapter.dispatch('union_relations', 'dbt_utils')(relations, column_override, include, exclude, source_column_name, where)) }} +{% endmacro %} + +{%- macro default__union_relations(relations, column_override=none, include=[], exclude=[], source_column_name='_dbt_source_relation', where=none) -%} + + {%- if exclude and include -%} + {{ exceptions.raise_compiler_error("Both an exclude and include list were provided to the `union` macro. Only one is allowed") }} + {%- endif -%} + + {#-- Prevent querying of db in parsing mode. This works because this macro does not create any new refs. -#} + {%- if not execute %} + {{ return('') }} + {% endif -%} + + {%- set column_override = column_override if column_override is not none else {} -%} + + {%- set relation_columns = {} -%} + {%- set column_superset = {} -%} + {%- set all_excludes = [] -%} + {%- set all_includes = [] -%} + + {%- if exclude -%} + {%- for exc in exclude -%} + {%- do all_excludes.append(exc | lower) -%} + {%- endfor -%} + {%- endif -%} + + {%- if include -%} + {%- for inc in include -%} + {%- do all_includes.append(inc | lower) -%} + {%- endfor -%} + {%- endif -%} + + {%- for relation in relations -%} + + {%- do relation_columns.update({relation: []}) -%} + + {%- do dbt_utils._is_relation(relation, 'union_relations') -%} + {%- do dbt_utils._is_ephemeral(relation, 'union_relations') -%} + {%- set cols = adapter.get_columns_in_relation(relation) -%} + {%- for col in cols -%} + + {#- If an exclude list was provided and the column is in the list, do nothing -#} + {%- if exclude and col.column | lower in all_excludes -%} + + {#- If an include list was provided and the column is not in the list, do nothing -#} + {%- elif include and col.column | lower not in all_includes -%} + + {#- Otherwise add the column to the column superset -#} + {%- else -%} + + {#- update the list of columns in this relation -#} + {%- do relation_columns[relation].append(col.column) -%} + + {%- if col.column in column_superset -%} + + {%- set stored = column_superset[col.column] -%} + {%- if col.is_string() and stored.is_string() and col.string_size() > stored.string_size() -%} + + {%- do column_superset.update({col.column: col}) -%} + + {%- endif %} + + {%- else -%} + + {%- do column_superset.update({col.column: col}) -%} + + {%- endif -%} + + {%- endif -%} + + {%- endfor -%} + {%- endfor -%} + + {%- set ordered_column_names = column_superset.keys() -%} + {%- set dbt_command = flags.WHICH -%} + + + {% if dbt_command in ['run', 'build'] %} + {% if (include | length > 0 or exclude | length > 0) and not column_superset.keys() %} + {%- set relations_string -%} + {%- for relation in relations -%} + {{ relation.name }} + {%- if not loop.last %}, {% endif -%} + {%- endfor -%} + {%- endset -%} + + {%- set error_message -%} + There were no columns found to union for relations {{ relations_string }} + {%- endset -%} + + {{ exceptions.raise_compiler_error(error_message) }} + {%- endif -%} + {%- endif -%} + + {%- for relation in relations %} + + ( + select + + {%- if source_column_name is not none %} + cast({{ dbt.string_literal(relation.render()) }} as {{ dbt.type_string() }}) as {{ source_column_name }}, + {%- endif %} + + /* No columns from any of the relations. + This star is only output during dbt compile, and exists to keep SQLFluff happy. */ + {% if dbt_command == 'compile' and ordered_column_names|length == 0 %} + * + {% endif %} + + {% for col_name in ordered_column_names -%} + + {%- set col = column_superset[col_name] %} + {%- set col_type = column_override.get(col.column, col.data_type) %} + {%- set col_name = adapter.quote(col_name) if col_name in relation_columns[relation] else 'null' %} + cast({{ col_name }} as {{ col_type }}) as {{ col.quoted }} {% if not loop.last %},{% endif -%} + + {%- endfor %} + + from {{ relation }} + + {% if where -%} + where {{ where }} + {%- endif %} + ) + + {% if not loop.last -%} + union all + {% endif -%} + + {%- endfor -%} + +{%- endmacro -%} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/unpivot.sql b/task-2/dbt_packages/dbt_utils/macros/sql/unpivot.sql new file mode 100644 index 0000000..c82b45e --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/unpivot.sql @@ -0,0 +1,67 @@ +{# +Pivot values from columns to rows. Similar to pandas DataFrame melt() function. + +Example Usage: {{ unpivot(relation=ref('users'), cast_to='integer', exclude=['id','created_at']) }} + +Arguments: + relation: Relation object, required. + cast_to: The datatype to cast all unpivoted columns to. Default is varchar. + exclude: A list of columns to keep but exclude from the unpivot operation. Default is none. + remove: A list of columns to remove from the resulting table. Default is none. + field_name: Destination table column name for the source table column names. + value_name: Destination table column name for the pivoted values +#} + +{% macro unpivot(relation=none, cast_to='varchar', exclude=none, remove=none, field_name='field_name', value_name='value', quote_identifiers=False) -%} + {{ return(adapter.dispatch('unpivot', 'dbt_utils')(relation, cast_to, exclude, remove, field_name, value_name, quote_identifiers)) }} +{% endmacro %} + +{% macro default__unpivot(relation=none, cast_to='varchar', exclude=none, remove=none, field_name='field_name', value_name='value', quote_identifiers=False) -%} + + {% if not relation %} + {{ exceptions.raise_compiler_error("Error: argument `relation` is required for `unpivot` macro.") }} + {% endif %} + + {%- set exclude = exclude if exclude is not none else [] %} + {%- set remove = remove if remove is not none else [] %} + + {%- set include_cols = [] %} + + {%- set table_columns = {} %} + + {%- do table_columns.update({relation: []}) %} + + {%- do dbt_utils._is_relation(relation, 'unpivot') -%} + {%- do dbt_utils._is_ephemeral(relation, 'unpivot') -%} + {%- set cols = adapter.get_columns_in_relation(relation) %} + + {%- for col in cols -%} + {%- if col.column.lower() not in remove|map('lower') and col.column.lower() not in exclude|map('lower') -%} + {% do include_cols.append(col) %} + {%- endif %} + {%- endfor %} + + + {%- for col in include_cols -%} + {%- set current_col_name = adapter.quote(col.column) if quote_identifiers else col.column -%} + select + {%- for exclude_col in exclude %} + {{ adapter.quote(exclude_col) if quote_identifiers else exclude_col }}, + {%- endfor %} + + cast('{{ col.column }}' as {{ dbt.type_string() }}) as {{ adapter.quote(field_name) if quote_identifiers else field_name }}, + cast( {% if col.data_type == 'boolean' %} + {{ dbt.cast_bool_to_text(current_col_name) }} + {% else %} + {{ current_col_name }} + {% endif %} + as {{ cast_to }}) as {{ adapter.quote(value_name) if quote_identifiers else value_name }} + + from {{ relation }} + + {% if not loop.last -%} + union all + {% endif -%} + {%- endfor -%} + +{%- endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/sql/width_bucket.sql b/task-2/dbt_packages/dbt_utils/macros/sql/width_bucket.sql new file mode 100644 index 0000000..fb7fc23 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/sql/width_bucket.sql @@ -0,0 +1,34 @@ +{% macro width_bucket(expr, min_value, max_value, num_buckets) %} + {{ return(adapter.dispatch('width_bucket', 'dbt_utils') (expr, min_value, max_value, num_buckets)) }} +{% endmacro %} + + +{% macro default__width_bucket(expr, min_value, max_value, num_buckets) -%} + + {% set bin_size -%} + (( {{ max_value }} - {{ min_value }} ) / {{ num_buckets }} ) + {%- endset %} + ( + -- to break ties when the amount is eaxtly at the bucket egde + case + when + mod( + {{ dbt.safe_cast(expr, dbt.type_numeric() ) }}, + {{ dbt.safe_cast(bin_size, dbt.type_numeric() ) }} + ) = 0 + then 1 + else 0 + end + ) + + -- Anything over max_value goes the N+1 bucket + least( + ceil( + ({{ expr }} - {{ min_value }})/{{ bin_size }} + ), + {{ num_buckets }} + 1 + ) +{%- endmacro %} + +{% macro snowflake__width_bucket(expr, min_value, max_value, num_buckets) %} + width_bucket({{ expr }}, {{ min_value }}, {{ max_value }}, {{ num_buckets }} ) +{% endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/web/get_url_host.sql b/task-2/dbt_packages/dbt_utils/macros/web/get_url_host.sql new file mode 100644 index 0000000..ddd0197 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/web/get_url_host.sql @@ -0,0 +1,27 @@ +{% macro get_url_host(field) -%} + {{ return(adapter.dispatch('get_url_host', 'dbt_utils')(field)) }} +{% endmacro %} + +{% macro default__get_url_host(field) -%} + +{%- set parsed = + dbt.split_part( + dbt.split_part( + dbt.replace( + dbt.replace( + dbt.replace(field, "'android-app://'", "''" + ), "'http://'", "''" + ), "'https://'", "''" + ), "'/'", 1 + ), "'?'", 1 + ) + +-%} + + + {{ dbt.safe_cast( + parsed, + dbt.type_string() + )}} + +{%- endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/web/get_url_parameter.sql b/task-2/dbt_packages/dbt_utils/macros/web/get_url_parameter.sql new file mode 100644 index 0000000..8147b41 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/web/get_url_parameter.sql @@ -0,0 +1,13 @@ +{% macro get_url_parameter(field, url_parameter) -%} + {{ return(adapter.dispatch('get_url_parameter', 'dbt_utils')(field, url_parameter)) }} +{% endmacro %} + +{% macro default__get_url_parameter(field, url_parameter) -%} + +{%- set formatted_url_parameter = "'" + url_parameter + "='" -%} + +{%- set split = dbt.split_part(dbt.split_part(field, formatted_url_parameter, 2), "'&'", 1) -%} + +nullif({{ split }},'') + +{%- endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/macros/web/get_url_path.sql b/task-2/dbt_packages/dbt_utils/macros/web/get_url_path.sql new file mode 100644 index 0000000..b59401d --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/macros/web/get_url_path.sql @@ -0,0 +1,34 @@ +{% macro get_url_path(field) -%} + {{ return(adapter.dispatch('get_url_path', 'dbt_utils')(field)) }} +{% endmacro %} + +{% macro default__get_url_path(field) -%} + + {%- set stripped_url = + dbt.replace( + dbt.replace(field, "'http://'", "''"), "'https://'", "''") + -%} + + {%- set first_slash_pos -%} + coalesce( + nullif({{ dbt.position("'/'", stripped_url) }}, 0), + {{ dbt.position("'?'", stripped_url) }} - 1 + ) + {%- endset -%} + + {%- set parsed_path = + dbt.split_part( + dbt.right( + stripped_url, + dbt.length(stripped_url) ~ "-" ~ first_slash_pos + ), + "'?'", 1 + ) + -%} + + {{ dbt.safe_cast( + parsed_path, + dbt.type_string() + )}} + +{%- endmacro %} diff --git a/task-2/dbt_packages/dbt_utils/pytest.ini b/task-2/dbt_packages/dbt_utils/pytest.ini new file mode 100644 index 0000000..a81f2a6 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/pytest.ini @@ -0,0 +1,8 @@ +[pytest] +filterwarnings = + ignore:.*'soft_unicode' has been renamed to 'soft_str'*:DeprecationWarning + ignore:unclosed file .*:ResourceWarning +env_files = + test.env +testpaths = + tests/functional \ No newline at end of file diff --git a/task-2/dbt_packages/dbt_utils/run_functional_test.sh b/task-2/dbt_packages/dbt_utils/run_functional_test.sh new file mode 100644 index 0000000..172d5ae --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/run_functional_test.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +python3 -m pytest tests/functional -n4 --profile $1 diff --git a/task-2/dbt_packages/dbt_utils/run_test.sh b/task-2/dbt_packages/dbt_utils/run_test.sh new file mode 100644 index 0000000..95ef9a3 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/run_test.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# Show location of local install of dbt +echo $(which dbt) + +# Show version and installed adapters +dbt --version + +# Set the profile +cd integration_tests +export DBT_PROFILES_DIR=. + +# Show the location of the profiles directory and test the connection +dbt debug --target $1 + +dbt deps --target $1 || exit 1 +dbt build --target $1 --full-refresh || exit 1 diff --git a/task-2/dbt_packages/dbt_utils/supported_adapters.env b/task-2/dbt_packages/dbt_utils/supported_adapters.env new file mode 100644 index 0000000..3acc8a8 --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/supported_adapters.env @@ -0,0 +1 @@ +SUPPORTED_ADAPTERS=postgres,snowflake,redshift,bigquery diff --git a/task-2/dbt_packages/dbt_utils/tox.ini b/task-2/dbt_packages/dbt_utils/tox.ini new file mode 100644 index 0000000..7dfa61e --- /dev/null +++ b/task-2/dbt_packages/dbt_utils/tox.ini @@ -0,0 +1,85 @@ +[tox] +skipsdist = True +envlist = lint_all, testenv + +[testenv] +passenv = + # postgres env vars + POSTGRES_HOST + POSTGRES_USER + DBT_ENV_SECRET_POSTGRES_PASS + POSTGRES_PORT + POSTGRES_DATABASE + POSTGRES_SCHEMA + # snowflake env vars + SNOWFLAKE_ACCOUNT + SNOWFLAKE_USER + DBT_ENV_SECRET_SNOWFLAKE_PASS + SNOWFLAKE_ROLE + SNOWFLAKE_DATABASE + SNOWFLAKE_WAREHOUSE + SNOWFLAKE_SCHEMA + # redshift + REDSHIFT_HOST + REDSHIFT_USER + DBT_ENV_SECRET_REDSHIFT_PASS + REDSHIFT_DATABASE + REDSHIFT_SCHEMA + REDSHIFT_PORT + # bigquery + BIGQUERY_PROJECT + BIGQUERY_KEYFILE_JSON + BIGQUERY_SCHEMA + +# Snowflake integration tests for centralized dbt testing +# run dbt commands directly, assumes dbt is already installed in environment +[testenv:dbt_integration_snowflake] +changedir = integration_tests +allowlist_externals = + dbt +skip_install = true +commands = + dbt --version + dbt debug --target snowflake + dbt deps --target snowflake + dbt build --target snowflake --full-refresh + + +# Postgres integration tests for centralized dbt testing +# run dbt commands directly, assumes dbt is already installed in environment +[testenv:dbt_integration_postgres] +changedir = integration_tests +allowlist_externals = + dbt +skip_install = true +commands = + dbt --version + dbt debug --target postgres + dbt deps --target postgres + dbt build --target postgres --full-refresh + +# BigQuery integration tests for centralized dbt testing +# run dbt commands directly, assumes dbt is already installed in environment +[testenv:dbt_integration_bigquery] +changedir = integration_tests +allowlist_externals = + dbt +skip_install = true +commands = + dbt --version + dbt debug --target bigquery + dbt deps --target bigquery + dbt build --target bigquery --full-refresh + +# redshift integration tests for centralized dbt testing +# run dbt commands directly, assumes dbt is already installed in environment +[testenv:dbt_integration_redshift] +changedir = integration_tests +allowlist_externals = + dbt +skip_install = true +commands = + dbt --version + dbt debug --target redshift + dbt deps --target redshift + dbt build --target redshift --full-refresh diff --git a/task-2/dbt_project.yml b/task-2/dbt_project.yml new file mode 100644 index 0000000..198d9c9 --- /dev/null +++ b/task-2/dbt_project.yml @@ -0,0 +1,22 @@ +name: "nyc_taxi" +version: "1.0.0" +config-version: 2 +profile: "nyc_taxi" + +model-paths: ["models"] +test-paths: ["tests"] +macro-paths: ["macros"] +seed-paths: ["seeds"] +snapshot-paths: ["snapshots"] +analysis-paths: ["analyses"] + +clean-targets: + - "target" + - "dbt_packages" + +models: + nyc_taxi: + staging: + +materialized: view + marts: + +materialized: table diff --git a/task-2/models/marts/_fct_trips.yml b/task-2/models/marts/_fct_trips.yml new file mode 100644 index 0000000..41e29b5 --- /dev/null +++ b/task-2/models/marts/_fct_trips.yml @@ -0,0 +1,19 @@ +version: 2 + +models: + - name: fct_trips + description: Incremental NYC yellow taxi mart enriched with pickup and dropoff zones. + columns: + - name: trip_id + description: Surrogate key used by the Delta merge strategy. + data_tests: + - not_null + - unique + - name: pickup_datetime + description: Time when the trip started. + data_tests: + - not_null + - name: pickup_borough + description: Borough of the pickup zone. + - name: dropoff_borough + description: Borough of the dropoff zone. diff --git a/task-2/models/marts/fct_trips.sql b/task-2/models/marts/fct_trips.sql new file mode 100644 index 0000000..5adeb22 --- /dev/null +++ b/task-2/models/marts/fct_trips.sql @@ -0,0 +1,36 @@ +{{ + config( + materialized='incremental', + incremental_strategy='merge', + unique_key='trip_id' + ) +}} + +select + t.trip_id, + t.pickup_datetime, + t.dropoff_datetime, + t.fare_amount, + t.tip_amount, + t.trip_distance, + t.total_amount, + t.trip_duration_minutes, + t.tip_pct, + t.fare_per_mile, + t.payment_type_label, + pz.borough as pickup_borough, + pz.zone as pickup_zone, + dz.borough as dropoff_borough, + dz.zone as dropoff_zone +from {{ ref('stg_trips') }} t +left join {{ ref('stg_zones') }} pz + on t.pickup_location_id = pz.location_id +left join {{ ref('stg_zones') }} dz + on t.dropoff_location_id = dz.location_id + +{% if is_incremental() %} + where t.pickup_datetime > ( + select max(pickup_datetime) + from {{ this }} + ) +{% endif %} diff --git a/task-2/models/staging/_sources.yml b/task-2/models/staging/_sources.yml new file mode 100644 index 0000000..2eb23ab --- /dev/null +++ b/task-2/models/staging/_sources.yml @@ -0,0 +1,12 @@ +version: 2 + +sources: + - name: nyc_taxi + description: Raw NYC yellow taxi data in Databricks Unity Catalog. + database: hyf + schema: nyc_yellow + tables: + - name: raw_trips + description: Yellow taxi trips for 2023-2025, approximately 128 million rows. + - name: raw_zones + description: Lookup table mapping taxi location IDs to boroughs and zones. diff --git a/task-2/models/staging/_stg_trips.yml b/task-2/models/staging/_stg_trips.yml new file mode 100644 index 0000000..42e33b7 --- /dev/null +++ b/task-2/models/staging/_stg_trips.yml @@ -0,0 +1,47 @@ +version: 2 + +models: + - name: stg_trips + description: Cleaned yellow taxi trips with one row per generated trip_id. + data_tests: + - dbt_utils.unique_combination_of_columns: + arguments: + combination_of_columns: + - pickup_datetime + - dropoff_datetime + - pickup_location_id + - fare_amount + config: + severity: warn + columns: + - name: trip_id + description: Surrogate key generated from stable trip fields. + data_tests: + - not_null + - unique + + - name: pickup_datetime + description: Time when the trip started. + data_tests: + - not_null + + - name: pickup_location_id + description: TLC zone ID where the trip started. + data_tests: + - not_null + - relationships: + arguments: + to: ref('stg_zones') + field: location_id + config: + severity: warn + + - name: payment_type + description: TLC payment code. The large dataset also contains code 0. + data_tests: + - not_null: + config: + severity: warn + - accepted_values: + arguments: + values: [0, 1, 2, 3, 4, 5, 6] diff --git a/task-2/models/staging/_stg_zones.yml b/task-2/models/staging/_stg_zones.yml new file mode 100644 index 0000000..47156ad --- /dev/null +++ b/task-2/models/staging/_stg_zones.yml @@ -0,0 +1,13 @@ +version: 2 + +models: + - name: stg_zones + description: One row per TLC taxi zone. + columns: + - name: location_id + description: TLC taxi-zone identifier. + data_tests: + - unique + - not_null + - name: borough + description: NYC borough name. diff --git a/task-2/models/staging/stg_trips.sql b/task-2/models/staging/stg_trips.sql new file mode 100644 index 0000000..908d302 --- /dev/null +++ b/task-2/models/staging/stg_trips.sql @@ -0,0 +1,63 @@ +{{ config(materialized='view') }} + +{% set payment_types = { + 0: 'Flex Fare / unknown', + 1: 'Credit card', + 2: 'Cash', + 3: 'No charge', + 4: 'Dispute', + 5: 'Unknown', + 6: 'Voided trip' +} %} + +with base as ( + select + {{ dbt_utils.generate_surrogate_key([ + 'vendor_id', + 'pickup_datetime', + 'dropoff_datetime', + 'pickup_location_id', + 'dropoff_location_id', + 'fare_amount', + 'trip_distance', + 'total_amount', + 'passenger_count' + ]) }} as trip_id, + pickup_datetime, + dropoff_datetime, + pickup_location_id, + dropoff_location_id, + fare_amount, + tip_amount, + trip_distance, + total_amount, + payment_type, + case + when fare_amount > 0 then round(tip_amount / fare_amount, 4) + else null + end as tip_pct, + case + when trip_distance > 0 then round(fare_amount / trip_distance, 4) + else null + end as fare_per_mile, + case payment_type + {% for code, label in payment_types.items() %} + when {{ code }} then '{{ label }}' + {% endfor %} + else 'Other' + end as payment_type_label, + round( + (unix_timestamp(dropoff_datetime) - unix_timestamp(pickup_datetime)) / 60.0, + 2 + ) as trip_duration_minutes + from {{ source('nyc_taxi', 'raw_trips') }} + where pickup_location_id is not null + and fare_amount >= 0 +) + +select * +from base +qualify row_number() over ( + partition by trip_id + order by pickup_datetime +) = 1 diff --git a/task-2/models/staging/stg_zones.sql b/task-2/models/staging/stg_zones.sql new file mode 100644 index 0000000..1e98897 --- /dev/null +++ b/task-2/models/staging/stg_zones.sql @@ -0,0 +1,6 @@ +select + location_id, + borough, + zone, + service_zone +from {{ source('nyc_taxi', 'raw_zones') }} diff --git a/task-2/package-lock.yml b/task-2/package-lock.yml new file mode 100644 index 0000000..f683b32 --- /dev/null +++ b/task-2/package-lock.yml @@ -0,0 +1,5 @@ +packages: + - name: dbt_utils + package: dbt-labs/dbt_utils + version: 1.4.1 +sha1_hash: e6424ba9e5a22487e47f023803aa4f0411946808 diff --git a/task-2/packages.yml b/task-2/packages.yml new file mode 100644 index 0000000..b26b1ff --- /dev/null +++ b/task-2/packages.yml @@ -0,0 +1,3 @@ +packages: + - package: dbt-labs/dbt_utils + version: [">=1.1.0", "<2.0.0"] diff --git a/task-2/profiles.yml.example b/task-2/profiles.yml.example new file mode 100644 index 0000000..ae13575 --- /dev/null +++ b/task-2/profiles.yml.example @@ -0,0 +1,11 @@ +nyc_taxi: + target: databricks + outputs: + databricks: + type: databricks + catalog: hyf + schema: "{{ env_var('DBT_SCHEMA') }}" + host: "{{ env_var('DATABRICKS_HOST') }}" + http_path: "{{ env_var('DATABRICKS_HTTP_PATH') }}" + token: "{{ env_var('DATABRICKS_TOKEN') }}" + threads: 4 diff --git a/task-2/pyproject.toml b/task-2/pyproject.toml new file mode 100644 index 0000000..2892a22 --- /dev/null +++ b/task-2/pyproject.toml @@ -0,0 +1,8 @@ +[project] +name = "week-13-dbt-databricks" +version = "0.1.0" +description = "HYF Week 13 dbt project for Databricks" +requires-python = ">=3.11,<3.14" +dependencies = [ + "dbt-databricks>=1.10,<1.11", +] diff --git a/task-2/screenshots/delta_history.png b/task-2/screenshots/delta_history.png new file mode 100644 index 0000000000000000000000000000000000000000..279ddee3ba6cb5fb44647299599716eefa0e7026 GIT binary patch literal 98262 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�v)oO4LV*s_L4-gN- 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 My85}Sb4q9e0NFR_g#Z8m literal 0 HcmV?d00001 diff --git a/task-2/target/compiled/nyc_taxi/from remote system.sql/sql/inline_query b/task-2/target/compiled/nyc_taxi/from remote system.sql/sql/inline_query new file mode 100644 index 0000000..e27b3f3 --- /dev/null +++ b/task-2/target/compiled/nyc_taxi/from remote system.sql/sql/inline_query @@ -0,0 +1 @@ +select session_user() as dbt_identity \ No newline at end of file diff --git a/task-2/target/compiled/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_pickup_datetime.sql b/task-2/target/compiled/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_pickup_datetime.sql new file mode 100644 index 0000000..c1c30c4 --- /dev/null +++ b/task-2/target/compiled/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_pickup_datetime.sql @@ -0,0 +1,11 @@ + + + + + + +select pickup_datetime +from `hyf`.`dev_halyna`.`fct_trips` +where pickup_datetime is null + + diff --git a/task-2/target/compiled/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_trip_id.sql b/task-2/target/compiled/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_trip_id.sql new file mode 100644 index 0000000..3a7634e --- /dev/null +++ b/task-2/target/compiled/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_trip_id.sql @@ -0,0 +1,11 @@ + + + + + + +select trip_id +from `hyf`.`dev_halyna`.`fct_trips` +where trip_id is null + + diff --git a/task-2/target/compiled/nyc_taxi/models/marts/_fct_trips.yml/unique_fct_trips_trip_id.sql b/task-2/target/compiled/nyc_taxi/models/marts/_fct_trips.yml/unique_fct_trips_trip_id.sql new file mode 100644 index 0000000..4805eb8 --- /dev/null +++ b/task-2/target/compiled/nyc_taxi/models/marts/_fct_trips.yml/unique_fct_trips_trip_id.sql @@ -0,0 +1,14 @@ + + + + +select + trip_id as unique_field, + count(*) as n_records + +from `hyf`.`dev_halyna`.`fct_trips` +where trip_id is not null +group by trip_id +having count(*) > 1 + + diff --git a/task-2/target/compiled/nyc_taxi/models/marts/fct_trips.sql b/task-2/target/compiled/nyc_taxi/models/marts/fct_trips.sql new file mode 100644 index 0000000..73394dd --- /dev/null +++ b/task-2/target/compiled/nyc_taxi/models/marts/fct_trips.sql @@ -0,0 +1,29 @@ + + +select + t.trip_id, + t.pickup_datetime, + t.dropoff_datetime, + t.fare_amount, + t.tip_amount, + t.trip_distance, + t.total_amount, + t.trip_duration_minutes, + t.tip_pct, + t.fare_per_mile, + t.payment_type_label, + pz.borough as pickup_borough, + pz.zone as pickup_zone, + dz.borough as dropoff_borough, + dz.zone as dropoff_zone +from `hyf`.`dev_halyna`.`stg_trips` t +left join `hyf`.`dev_halyna`.`stg_zones` pz + on t.pickup_location_id = pz.location_id +left join `hyf`.`dev_halyna`.`stg_zones` dz + on t.dropoff_location_id = dz.location_id + + + where t.pickup_datetime > ( + select max(pickup_datetime) + from `hyf`.`dev_halyna`.`fct_trips` + ) diff --git a/task-2/target/compiled/nyc_taxi/models/staging/stg_trips.sql b/task-2/target/compiled/nyc_taxi/models/staging/stg_trips.sql new file mode 100644 index 0000000..3436a0f --- /dev/null +++ b/task-2/target/compiled/nyc_taxi/models/staging/stg_trips.sql @@ -0,0 +1,57 @@ + + + + +with base as ( + select + md5(cast(concat(coalesce(cast(vendor_id as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(pickup_datetime as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(dropoff_datetime as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(pickup_location_id as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(dropoff_location_id as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(fare_amount as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(trip_distance as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(total_amount as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(passenger_count as string), '_dbt_utils_surrogate_key_null_')) as string)) as trip_id, + pickup_datetime, + dropoff_datetime, + pickup_location_id, + dropoff_location_id, + fare_amount, + tip_amount, + trip_distance, + total_amount, + payment_type, + case + when fare_amount > 0 then round(tip_amount / fare_amount, 4) + else null + end as tip_pct, + case + when trip_distance > 0 then round(fare_amount / trip_distance, 4) + else null + end as fare_per_mile, + case payment_type + + when 0 then 'Flex Fare / unknown' + + when 1 then 'Credit card' + + when 2 then 'Cash' + + when 3 then 'No charge' + + when 4 then 'Dispute' + + when 5 then 'Unknown' + + when 6 then 'Voided trip' + + else 'Other' + end as payment_type_label, + round( + (unix_timestamp(dropoff_datetime) - unix_timestamp(pickup_datetime)) / 60.0, + 2 + ) as trip_duration_minutes + from `hyf`.`nyc_yellow`.`raw_trips` + where pickup_location_id is not null + and fare_amount >= 0 +) + +select * +from base +qualify row_number() over ( + partition by trip_id + order by pickup_datetime +) = 1 \ No newline at end of file diff --git a/task-2/target/compiled/nyc_taxi/models/staging/stg_zones.sql b/task-2/target/compiled/nyc_taxi/models/staging/stg_zones.sql new file mode 100644 index 0000000..603f3d6 --- /dev/null +++ b/task-2/target/compiled/nyc_taxi/models/staging/stg_zones.sql @@ -0,0 +1,6 @@ +select + location_id, + borough, + zone, + service_zone +from `hyf`.`nyc_yellow`.`raw_zones` \ No newline at end of file diff --git a/task-2/target/graph.gpickle b/task-2/target/graph.gpickle new file mode 100644 index 0000000000000000000000000000000000000000..f386a34981b767c7b33223e345c9e46c739812d7 GIT binary patch literal 23914 zcmds9TdW<|S$2|hj(yIF>o{qe*m2UqiGB7l_V(=i-btK>*v+L54mc@lMXd4cnKfr- zy!XuZTx=g(M=89JNP~phsZc9~%0=9v6huKFBm@tRY!g5mCH58u z_m5=dio8K2R%c%<0<PYV!=+3WL@~ z`MPl7i)RI*euQ%bLdnxpTgTCbu z3)DeWiK}>k>PVGj4=jKT)bK*UCBZy9o8g7D6|lpBjI$Ei+Y^_;jxSd)r{)VUiQQfX zy(3%s^N<{h#ARug$U`&cuzr6?t@r>$ z16{7S+M)hV@O-D$=!tT>NouuDL+N#uPOslp)kaI~^%bq#CvvCRYSsI4OHq4GrJ-~* zv0d-T-*!Rowgn?pJk)!zk67T~6;R1L!781lNYJAxC zX9>7Y|+l?*(d zLsH>l^AMgBm?fh%Gjju@zER0p*E($j%fx!}bi)PR(DZfe8^}I%e+;|{xMYaK5Ep$| zD8kYc`AM(B5?uFQWe(KYjW;C~=k(l9r+=ytzsQpGufoIa{ z^wnNh?lxPp*zWhmcB9@`+G4%a?euyrQSH~19;s`j$O$1dEL=0l^-u?1r+*bp<`*x8 z`q$w9XivWc|Nllp!Sr9%e@*{&Ncs)Pj-p#(g1!YTJt9G8&JKud0UhC&`#4uFBR%MB zV8JYa3llboMUZl;LNu8WWMT19(Z9{Kkjyc}W--fn(yA0fFcY}e!Da-y5{3miUBis0 zANpUjPUcQ)9*oe=xs!<6l;yzCo_yogvy}P4stmaldKMsZbTBZm*~k=ZC8aSS>MxrH zJ@v4ss31gMl~jc{pr?ThY@hDQxWp6Wfoo$}_JAk4w3HxD)n zC)~wC(vujZ8`GNa|I5?*dzp;?%Dklu%oNkWHj<`cfqDB2Us^(v5mSsTyFmM=!G^ke z95=5(7a{_(6G0H47S>)IkQ>5_5b}l7f^S{1?CVyjZ*8FD!Y30 z+JM&!pi&*x9HliO?VRC`Aks%EElBx%rtvnU{FDt_Uko2>D_aVY;EHlXPg8jlPg51JrDXWnCSA{Q z5&*3c(Iw$lr*Em1R1N?HSMH?HOsNev1Y6fcu>8RwX&%fB%@$ioNG+BummxE_ycAr= zAV#L>?1IonvUEBYC*u&30bnlhGu#|T2YM2mC(v!&%jT8qRt=8~-IOq5HT*|aOMQ|` zC>chru0aB8W@{@oL@dsjAa)iJPfWyrRI_WZ!K658jYzq?ApB|o>#+&UjHUvMrW+D2 z^ua?9N0rzvV{2X)PJ!3U6v-iBeH|vCEmpFgd!#sf{_m%=QS@VaYCWt{DoE zFeTX?8Rze4SJdBa$9vFP;S}#Nn@?a(P4o#_i-AS>Dcl`T&uEZdIdCkQZj`}^I~+U` z*t9mTu|4I~2^>yYyoA)1?zBs?55yW*>Ytw08l3MeV4cG8&XZGW#@=HcYrAjGRQizl zk7cf8s*vbbrWPvO0Z^K9yA9_-orc`&G+G@+Y_=6rYiqquy(tr|qjnoT(y5E2*HK8P z-B#zc)C13qjw6xPmN%szH2(?BHFpXQjEn-bv{HSuFu6n-7`h@6n@Y3O?6t*47Yx4H)@rR*yIYg{jb@{(_1mqE*lyMc=_;D0bm33E zqsa<^lhaO3-X<8#{{ZC$3uxz|`5r!}=5PKd&7+oYelLBVX!Cr7$#%y-{OPw40NFeU zNZEwj!SAKp88JrBtf6etR>m~slngAF* z9E~MsQS>+h_O_RF3pAW!WX4t;-xddCtgIuLxp{@*5K9z(-CHv zDp*yza?{@mPJos-h$qqT3EPH!dXcO`BW%*g8Z7!j!M^VYHS8=6Y|$BPQZfNsuit4Z z{kAOkw+FUI$F(>PYDdOZm=$POCjo7|I0&=xxpy(hzA@lHb}9xL)8a=2v4?XIW1Vjw zU^#O(HMH&`m`okh$D`IXA)mo!DH6pTvZP!OI{?fxS-`}wOdY4nQ&8D^!>rJ`cfl#6pBh;S-a(LJuKN`HH!B zFLd6oUg4lK7s{6me^%gZm-3|@+-cbCj`AgPa-bPU`I52)%GXpi*wdA3EoFNVDCJ3G z+a3p`l=6+OIyMEep&%nG#aZ(pQcltHaP#qMCF zD)hC3i1pl<^;R;<7<}9gXjN{iwYJ)9c52(h-?3!fG^zP<5L}A;|o+K?!53HqX zix62AHTZ6BdzgJ`P6CWW^|RyJueZdm+Jr;fZoN*_9?_azwcTqsNWar*k-9iL(EnsI z(C0QnbOqg=4rgMd-c`G^pHj^6D6hgF&+SSt$>&_}zx&(hq~_T&93#%Nx!b{);|=1B z8BEzHhC0!wUdh4bQ9QUjdXj#8dFE)QG0q1}gUHd+gC6d~7K$!=ggTqgL8-V)YFuV6w)@N|9 zXT!(4$-N6Ym^HW)vdDglAbUY*2Qi|XjS*$Ui2LNBN@~q!ui0;k?d|#gPfuxhoKJsp zO1;@#_YWq!?x_NzOP*S2KD=y>&Xf0@$vubwm_(djr;e`XhL&W`x{!o=;yT@4Jq!LAyZkEgg3 zmq9-G;BUAUTsw9Mxhb3C7slKPNpU&bosdfKM2;Bb#F&*DObGvFdoNkw&cQ<*$jhA# z{n`G4C5CVOeBu0_^Y@&;_xye57tSx9Um`p3AwQq>A;~vuQgnYqv4?&5c`FZpZo}5# zLoNFIN*p)L9g|D({mJB~E2PpTBzGgU+NsNJwNV%4*7j(F_i;!&&TE~WER58s*Xz9+ zQRSXOh*pQ2!ZQ4?rZyS`?i6finR#Wh=lXcGf-dhfyHvrHrRnaQzbjU#yB*;b5HAuVVfXkZ`k5(lWa@%8>8sS8O~qvSx^`zgwGz~mU=@8d zhOW0%u*A>KKY(TKVx<9h8|T@NPn@x2)f#-NJao{n?g}Rg!2^Yx%jKW9t#W|_PJSof zluX7Kp8^KU_<55HKT-uhDt4H8>m8=KsoXBEExfD7$fQ|xUoVDYEq zg;vJ}7X0uNe=f3Il<23@N^hsoF5-*J-<%vZCX0sNeR7Grm$82M@25D%I=5qXs@z#m z|8{cB&N?XLpP8=$i}aIK9FOQIKfR$+e$<}nWd@+pW@DfMpgLJV#ajkr?6}@+!lzQA z+URZ%QrVkZR0jTdVjQTlN8g2N6PJ;+bPTKSOor7o@eo+k%G|xs`oW0}4q9_OTBj`e3KpT?Qo zAh~QHk+g-fO!`7H8%-gZjjoW)22n_6qc0>gZ4{E3b_&T%GlgWPseG~zKbGzKiV~Vf zKo#%;KlI5ymx7tc8OI70I;ZAw)EG{MS;r?-x!J)doL=)8e8L$vpT{RullcNZp=Qi; z_=L(ZU&JRIzxgsg;gHSG;S-M1d=;N?VCDsU!m*e?flnyDc@dss1JjqyC*akMj6;9j z6zD6n1SatsO^K`z&DgBa6gJ=bP4g&yWd;ndPtsRr$ng3UeT}S^R$r$nkpa_`6Er2V zWt#G%G$k@?nsSn+usM%(c?y!4E*tRV$97MPS84GG0yO0`O=0uRMkdmf2n2Lanly#Y fGHbboDSq&v1RrLzpHYWzeBl!#Ndjp5{p$Y$kK26s literal 0 HcmV?d00001 diff --git a/task-2/target/graph_summary.json b/task-2/target/graph_summary.json new file mode 100644 index 0000000..6435a5a --- /dev/null +++ b/task-2/target/graph_summary.json @@ -0,0 +1 @@ +{"_invocation_id": "fa05f49b-4995-4d36-8502-c3a094c8bbdb", "linked": {"0": {"name": "source.nyc_taxi.nyc_taxi.raw_trips", "type": "source", "succ": [3]}, "1": {"name": "source.nyc_taxi.nyc_taxi.raw_zones", "type": "source", "succ": [4]}, "2": {"name": "model.nyc_taxi.fct_trips", "type": "model", "succ": [7, 8, 9]}, "3": {"name": "model.nyc_taxi.stg_trips", "type": "model", "succ": [2, 5, 6, 10, 11, 12, 13, 14, 15, 16, 17]}, "4": {"name": "model.nyc_taxi.stg_zones", "type": "model", "succ": [2, 14, 18, 19]}, "5": {"name": "test.nyc_taxi.assert_fare_amount_non_negative", "type": "test"}, "6": {"name": "test.nyc_taxi.assert_pickup_before_dropoff", "type": "test"}, "7": {"name": "test.nyc_taxi.not_null_fct_trips_trip_id.df65bf8c1d", "type": "test"}, "8": {"name": "test.nyc_taxi.unique_fct_trips_trip_id.9b74cb6aab", "type": "test"}, "9": {"name": "test.nyc_taxi.not_null_fct_trips_pickup_datetime.3c78164d83", "type": "test"}, "10": {"name": "test.nyc_taxi.not_null_stg_trips_trip_id.159f524fc2", "type": "test"}, "11": {"name": "test.nyc_taxi.unique_stg_trips_trip_id.748f5076fb", "type": "test"}, "12": {"name": "test.nyc_taxi.not_null_stg_trips_pickup_datetime.4df9e7a15c", "type": "test"}, "13": {"name": "test.nyc_taxi.not_null_stg_trips_pickup_location_id.a4d16d4471", "type": "test"}, "14": {"name": "test.nyc_taxi.relationships_stg_trips_pickup_location_id__location_id__ref_stg_zones_.5eead0f98c", "type": "test"}, "15": {"name": "test.nyc_taxi.not_null_stg_trips_payment_type.e14494b406", "type": "test"}, "16": {"name": "test.nyc_taxi.accepted_values_stg_trips_payment_type__0__1__2__3__4__5__6.0972e03b73", "type": "test"}, "17": {"name": "test.nyc_taxi.dbt_utils_unique_combination_of_columns_stg_trips_pickup_datetime__dropoff_datetime__pickup_location_id__fare_amount.72a6d320a5", "type": "test"}, "18": {"name": "test.nyc_taxi.unique_stg_zones_location_id.3578c2f409", "type": "test"}, "19": {"name": "test.nyc_taxi.not_null_stg_zones_location_id.244b100d38", "type": "test"}}, "with_test_edges": {"0": {"name": "source.nyc_taxi.nyc_taxi.raw_trips", "type": "source", "succ": [3]}, "1": {"name": "source.nyc_taxi.nyc_taxi.raw_zones", "type": "source", "succ": [4]}, "2": {"name": "model.nyc_taxi.fct_trips", "type": "model", "succ": [7, 8, 9]}, "3": {"name": "model.nyc_taxi.stg_trips", "type": "model", "succ": [2, 5, 6, 10, 11, 12, 13, 14, 15, 16, 17]}, "4": {"name": "model.nyc_taxi.stg_zones", "type": "model", "succ": [2, 14, 18, 19]}, "5": {"name": "test.nyc_taxi.assert_fare_amount_non_negative", "type": "test", "succ": [2]}, "6": {"name": "test.nyc_taxi.assert_pickup_before_dropoff", "type": "test", "succ": [2]}, "7": {"name": "test.nyc_taxi.not_null_fct_trips_trip_id.df65bf8c1d", "type": "test"}, "8": {"name": "test.nyc_taxi.unique_fct_trips_trip_id.9b74cb6aab", "type": "test"}, "9": {"name": "test.nyc_taxi.not_null_fct_trips_pickup_datetime.3c78164d83", "type": "test"}, "10": {"name": "test.nyc_taxi.not_null_stg_trips_trip_id.159f524fc2", "type": "test", "succ": [2]}, "11": {"name": "test.nyc_taxi.unique_stg_trips_trip_id.748f5076fb", "type": "test", "succ": [2]}, "12": {"name": "test.nyc_taxi.not_null_stg_trips_pickup_datetime.4df9e7a15c", "type": "test", "succ": [2]}, "13": {"name": "test.nyc_taxi.not_null_stg_trips_pickup_location_id.a4d16d4471", "type": "test", "succ": [2]}, "14": {"name": "test.nyc_taxi.relationships_stg_trips_pickup_location_id__location_id__ref_stg_zones_.5eead0f98c", "type": "test", "succ": [2]}, "15": {"name": "test.nyc_taxi.not_null_stg_trips_payment_type.e14494b406", "type": "test", "succ": [2]}, "16": {"name": "test.nyc_taxi.accepted_values_stg_trips_payment_type__0__1__2__3__4__5__6.0972e03b73", "type": "test", "succ": [2]}, "17": {"name": "test.nyc_taxi.dbt_utils_unique_combination_of_columns_stg_trips_pickup_datetime__dropoff_datetime__pickup_location_id__fare_amount.72a6d320a5", "type": "test", "succ": [2]}, "18": {"name": "test.nyc_taxi.unique_stg_zones_location_id.3578c2f409", "type": "test", "succ": [2]}, "19": {"name": "test.nyc_taxi.not_null_stg_zones_location_id.244b100d38", "type": "test", "succ": [2]}}} \ No newline at end of file diff --git a/task-2/target/manifest.json b/task-2/target/manifest.json new file mode 100644 index 0000000..9fa6d8c --- /dev/null +++ b/task-2/target/manifest.json @@ -0,0 +1 @@ +{"metadata": {"dbt_schema_version": "https://schemas.getdbt.com/dbt/manifest/v12.json", "dbt_version": "1.12.0", "generated_at": "2026-07-28T15:43:13.539151Z", "invocation_id": "fa05f49b-4995-4d36-8502-c3a094c8bbdb", "invocation_started_at": "2026-07-28T14:55:00.136054+00:00", "env": {}, "project_name": "nyc_taxi", "project_id": "e8d8e268588c6e4fea6fbefacd0b064b", "user_id": "1ce21849-8a79-4b99-9849-2bb21da385b3", "send_anonymous_usage_stats": true, "adapter_type": "databricks", "quoting": {"database": true, "schema": true, "identifier": true, "column": null}, "run_started_at": "2026-07-28T14:55:00.136054+00:00"}, "nodes": {"model.nyc_taxi.fct_trips": {"database": "hyf", "schema": "dev_halyna", "name": "fct_trips", "resource_type": "model", "package_name": "nyc_taxi", "path": "marts\\fct_trips.sql", "original_file_path": "models\\marts\\fct_trips.sql", "unique_id": "model.nyc_taxi.fct_trips", "fqn": ["nyc_taxi", "marts", "fct_trips"], "alias": "fct_trips", "checksum": {"name": "sha256", "checksum": "75390a64e1173c98c79b8dd3509bcf8bea74552ba5cd94c3c7f0627bf0d77c93"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "incremental", "incremental_strategy": "merge", "batch_size": null, "lookback": 1, "begin": null, "persist_docs": {}, "post-hook": [], "pre-hook": [], "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": "trip_id", "on_schema_change": "ignore", "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false, "alias_types": true}, "event_time": null, "concurrent_batches": null, "access": "protected", "freshness": null, "on_error": null, "latest_version_pointer": {"enabled": null, "alias": null}}, "tags": [], "description": "Incremental NYC yellow taxi mart enriched with pickup and dropoff zones.", "columns": {"trip_id": {"name": "trip_id", "description": "Surrogate key used by the Delta merge strategy.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "config": {"meta": {}, "tags": []}, "tags": [], "granularity": null, "dimension": null, "entity": null, "doc_blocks": []}, "pickup_datetime": {"name": "pickup_datetime", "description": "Time when the trip started.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "config": {"meta": {}, "tags": []}, "tags": [], "granularity": null, "dimension": null, "entity": null, "doc_blocks": []}, "pickup_borough": {"name": "pickup_borough", "description": "Borough of the pickup zone.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "config": {"meta": {}, "tags": []}, "tags": [], "granularity": null, "dimension": null, "entity": null, "doc_blocks": []}, "dropoff_borough": {"name": "dropoff_borough", "description": "Borough of the dropoff zone.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "config": {"meta": {}, "tags": []}, "tags": [], "granularity": null, "dimension": null, "entity": null, "doc_blocks": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "nyc_taxi://models\\marts\\_fct_trips.yml", "build_path": "target\\run\\nyc_taxi\\models\\marts\\fct_trips.sql", "unrendered_config": {"materialized": "incremental", "incremental_strategy": "merge", "unique_key": "trip_id"}, "created_at": 1785250507.55865, "relation_name": "`hyf`.`dev_halyna`.`fct_trips`", "raw_code": "{{\n config(\n materialized='incremental',\n incremental_strategy='merge',\n unique_key='trip_id'\n )\n}}\n\nselect\n t.trip_id,\n t.pickup_datetime,\n t.dropoff_datetime,\n t.fare_amount,\n t.tip_amount,\n t.trip_distance,\n t.total_amount,\n t.trip_duration_minutes,\n t.tip_pct,\n t.fare_per_mile,\n t.payment_type_label,\n pz.borough as pickup_borough,\n pz.zone as pickup_zone,\n dz.borough as dropoff_borough,\n dz.zone as dropoff_zone\nfrom {{ ref('stg_trips') }} t\nleft join {{ ref('stg_zones') }} pz\n on t.pickup_location_id = pz.location_id\nleft join {{ ref('stg_zones') }} dz\n on t.dropoff_location_id = dz.location_id\n\n{% if is_incremental() %}\n where t.pickup_datetime > (\n select max(pickup_datetime)\n from {{ this }}\n )\n{% endif %}", "doc_blocks": [], "language": "sql", "refs": [{"name": "stg_trips", "package": null, "version": null}, {"name": "stg_zones", "package": null, "version": null}, {"name": "stg_zones", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt.is_incremental"], "nodes": ["model.nyc_taxi.stg_trips", "model.nyc_taxi.stg_zones"]}, "compiled_path": "target\\compiled\\nyc_taxi\\models\\marts\\fct_trips.sql", "compiled": true, "compiled_code": "\n\nselect\n t.trip_id,\n t.pickup_datetime,\n t.dropoff_datetime,\n t.fare_amount,\n t.tip_amount,\n t.trip_distance,\n t.total_amount,\n t.trip_duration_minutes,\n t.tip_pct,\n t.fare_per_mile,\n t.payment_type_label,\n pz.borough as pickup_borough,\n pz.zone as pickup_zone,\n dz.borough as dropoff_borough,\n dz.zone as dropoff_zone\nfrom `hyf`.`dev_halyna`.`stg_trips` t\nleft join `hyf`.`dev_halyna`.`stg_zones` pz\n on t.pickup_location_id = pz.location_id\nleft join `hyf`.`dev_halyna`.`stg_zones` dz\n on t.dropoff_location_id = dz.location_id\n\n\n where t.pickup_datetime > (\n select max(pickup_datetime)\n from `hyf`.`dev_halyna`.`fct_trips`\n )\n", "extra_ctes_injected": true, "extra_ctes": [], "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null, "primary_key": ["trip_id"], "time_spine": null}, "model.nyc_taxi.stg_trips": {"database": "hyf", "schema": "dev_halyna", "name": "stg_trips", "resource_type": "model", "package_name": "nyc_taxi", "path": "staging\\stg_trips.sql", "original_file_path": "models\\staging\\stg_trips.sql", "unique_id": "model.nyc_taxi.stg_trips", "fqn": ["nyc_taxi", "staging", "stg_trips"], "alias": "stg_trips", "checksum": {"name": "sha256", "checksum": "e5cfc99b90faa87db35c90fe57bd98a845a06bb0632bc6027879950db1c9e2fe"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "view", "incremental_strategy": null, "batch_size": null, "lookback": 1, "begin": null, "persist_docs": {}, "post-hook": [], "pre-hook": [], "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false, "alias_types": true}, "event_time": null, "concurrent_batches": null, "access": "protected", "freshness": null, "on_error": null, "latest_version_pointer": {"enabled": null, "alias": null}}, "tags": [], "description": "Cleaned yellow taxi trips with one row per generated trip_id.", "columns": {"trip_id": {"name": "trip_id", "description": "Surrogate key generated from stable trip fields.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "config": {"meta": {}, "tags": []}, "tags": [], "granularity": null, "dimension": null, "entity": null, "doc_blocks": []}, "pickup_datetime": {"name": "pickup_datetime", "description": "Time when the trip started.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "config": {"meta": {}, "tags": []}, "tags": [], "granularity": null, "dimension": null, "entity": null, "doc_blocks": []}, "pickup_location_id": {"name": "pickup_location_id", "description": "TLC zone ID where the trip started.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "config": {"meta": {}, "tags": []}, "tags": [], "granularity": null, "dimension": null, "entity": null, "doc_blocks": []}, "payment_type": {"name": "payment_type", "description": "TLC payment code. The large dataset also contains code 0.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "config": {"meta": {}, "tags": []}, "tags": [], "granularity": null, "dimension": null, "entity": null, "doc_blocks": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "nyc_taxi://models\\staging\\_stg_trips.yml", "build_path": null, "unrendered_config": {"materialized": "view"}, "created_at": 1785250507.8259416, "relation_name": "`hyf`.`dev_halyna`.`stg_trips`", "raw_code": "{{ config(materialized='view') }}\n\n{% set payment_types = {\n 0: 'Flex Fare / unknown',\n 1: 'Credit card',\n 2: 'Cash',\n 3: 'No charge',\n 4: 'Dispute',\n 5: 'Unknown',\n 6: 'Voided trip'\n} %}\n\nwith base as (\n select\n {{ dbt_utils.generate_surrogate_key([\n 'vendor_id',\n 'pickup_datetime',\n 'dropoff_datetime',\n 'pickup_location_id',\n 'dropoff_location_id',\n 'fare_amount',\n 'trip_distance',\n 'total_amount',\n 'passenger_count'\n ]) }} as trip_id,\n pickup_datetime,\n dropoff_datetime,\n pickup_location_id,\n dropoff_location_id,\n fare_amount,\n tip_amount,\n trip_distance,\n total_amount,\n payment_type,\n case\n when fare_amount > 0 then round(tip_amount / fare_amount, 4)\n else null\n end as tip_pct,\n case\n when trip_distance > 0 then round(fare_amount / trip_distance, 4)\n else null\n end as fare_per_mile,\n case payment_type\n {% for code, label in payment_types.items() %}\n when {{ code }} then '{{ label }}'\n {% endfor %}\n else 'Other'\n end as payment_type_label,\n round(\n (unix_timestamp(dropoff_datetime) - unix_timestamp(pickup_datetime)) / 60.0,\n 2\n ) as trip_duration_minutes\n from {{ source('nyc_taxi', 'raw_trips') }}\n where pickup_location_id is not null\n and fare_amount >= 0\n)\n\nselect *\nfrom base\nqualify row_number() over (\n partition by trip_id\n order by pickup_datetime\n) = 1", "doc_blocks": [], "language": "sql", "refs": [], "sources": [["nyc_taxi", "raw_trips"]], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt_utils.generate_surrogate_key"], "nodes": ["source.nyc_taxi.nyc_taxi.raw_trips"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null, "primary_key": ["pickup_datetime", "pickup_location_id", "trip_id"], "time_spine": null}, "model.nyc_taxi.stg_zones": {"database": "hyf", "schema": "dev_halyna", "name": "stg_zones", "resource_type": "model", "package_name": "nyc_taxi", "path": "staging\\stg_zones.sql", "original_file_path": "models\\staging\\stg_zones.sql", "unique_id": "model.nyc_taxi.stg_zones", "fqn": ["nyc_taxi", "staging", "stg_zones"], "alias": "stg_zones", "checksum": {"name": "sha256", "checksum": "dde8a50a99fd102bad6cf656cc3c6c50284ad67a70babe7bd85194a29e9e6f6b"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "view", "incremental_strategy": null, "batch_size": null, "lookback": 1, "begin": null, "persist_docs": {}, "post-hook": [], "pre-hook": [], "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false, "alias_types": true}, "event_time": null, "concurrent_batches": null, "access": "protected", "freshness": null, "on_error": null, "latest_version_pointer": {"enabled": null, "alias": null}}, "tags": [], "description": "One row per TLC taxi zone.", "columns": {"location_id": {"name": "location_id", "description": "TLC taxi-zone identifier.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "config": {"meta": {}, "tags": []}, "tags": [], "granularity": null, "dimension": null, "entity": null, "doc_blocks": []}, "borough": {"name": "borough", "description": "NYC borough name.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "config": {"meta": {}, "tags": []}, "tags": [], "granularity": null, "dimension": null, "entity": null, "doc_blocks": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "nyc_taxi://models\\staging\\_stg_zones.yml", "build_path": null, "unrendered_config": {"materialized": "view"}, "created_at": 1785250507.902806, "relation_name": "`hyf`.`dev_halyna`.`stg_zones`", "raw_code": "select\n location_id,\n borough,\n zone,\n service_zone\nfrom {{ source('nyc_taxi', 'raw_zones') }}", "doc_blocks": [], "language": "sql", "refs": [], "sources": [["nyc_taxi", "raw_zones"]], "metrics": [], "functions": [], "depends_on": {"macros": [], "nodes": ["source.nyc_taxi.nyc_taxi.raw_zones"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null, "primary_key": ["location_id"], "time_spine": null}, "test.nyc_taxi.assert_fare_amount_non_negative": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "assert_fare_amount_non_negative", "resource_type": "test", "package_name": "nyc_taxi", "path": "assert_fare_amount_non_negative.sql", "original_file_path": "tests\\assert_fare_amount_non_negative.sql", "unique_id": "test.nyc_taxi.assert_fare_amount_non_negative", "fqn": ["nyc_taxi", "assert_fare_amount_non_negative"], "alias": "assert_fare_amount_non_negative", "checksum": {"name": "sha256", "checksum": "c4a6673c73a97357c046ce16f9724aef7d839e720e97ce766d257385b10d20e9"}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {}, "created_at": 1785250507.2638383, "relation_name": null, "raw_code": "select\n pickup_datetime,\n fare_amount\nfrom {{ ref('stg_trips') }}\nwhere fare_amount < 0", "doc_blocks": [], "language": "sql", "refs": [{"name": "stg_trips", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": [], "nodes": ["model.nyc_taxi.stg_trips"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}}, "test.nyc_taxi.assert_pickup_before_dropoff": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "assert_pickup_before_dropoff", "resource_type": "test", "package_name": "nyc_taxi", "path": "assert_pickup_before_dropoff.sql", "original_file_path": "tests\\assert_pickup_before_dropoff.sql", "unique_id": "test.nyc_taxi.assert_pickup_before_dropoff", "fqn": ["nyc_taxi", "assert_pickup_before_dropoff"], "alias": "assert_pickup_before_dropoff", "checksum": {"name": "sha256", "checksum": "80e04c4749603897c46f155681ab3438fb6570641ee8cffc8e8c27face45571a"}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "warn", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"severity": "warn"}, "created_at": 1785250507.2768366, "relation_name": null, "raw_code": "{{ config(severity='warn') }}\n\nselect\n pickup_datetime,\n dropoff_datetime,\n pickup_location_id\nfrom {{ ref('stg_trips') }}\nwhere pickup_datetime > dropoff_datetime", "doc_blocks": [], "language": "sql", "refs": [{"name": "stg_trips", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": [], "nodes": ["model.nyc_taxi.stg_trips"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}}, "test.nyc_taxi.not_null_fct_trips_trip_id.df65bf8c1d": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "not_null_fct_trips_trip_id", "resource_type": "test", "package_name": "nyc_taxi", "path": "not_null_fct_trips_trip_id.sql", "original_file_path": "models\\marts\\_fct_trips.yml", "unique_id": "test.nyc_taxi.not_null_fct_trips_trip_id.df65bf8c1d", "fqn": ["nyc_taxi", "marts", "not_null_fct_trips_trip_id"], "alias": "not_null_fct_trips_trip_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": "target\\run\\nyc_taxi\\models\\marts\\_fct_trips.yml\\not_null_fct_trips_trip_id.sql", "unrendered_config": {}, "created_at": 1785250507.678678, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "doc_blocks": [], "language": "sql", "refs": [{"name": "fct_trips", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt.test_not_null", "macro.dbt.get_where_subquery", "macro.dbt.get_limit_subquery_sql", "macro.dbt.should_store_failures", "macro.dbt.statement"], "nodes": ["model.nyc_taxi.fct_trips"]}, "compiled_path": "target\\compiled\\nyc_taxi\\models\\marts\\_fct_trips.yml\\not_null_fct_trips_trip_id.sql", "compiled": true, "compiled_code": "\n \n \n\n\n\nselect trip_id\nfrom `hyf`.`dev_halyna`.`fct_trips`\nwhere trip_id is null\n\n\n", "extra_ctes_injected": true, "extra_ctes": [], "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "trip_id", "file_key_name": "models.fct_trips", "attached_node": "model.nyc_taxi.fct_trips", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "trip_id", "model": "{{ get_where_subquery(ref('fct_trips')) }}"}, "namespace": null}}, "test.nyc_taxi.unique_fct_trips_trip_id.9b74cb6aab": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "unique_fct_trips_trip_id", "resource_type": "test", "package_name": "nyc_taxi", "path": "unique_fct_trips_trip_id.sql", "original_file_path": "models\\marts\\_fct_trips.yml", "unique_id": "test.nyc_taxi.unique_fct_trips_trip_id.9b74cb6aab", "fqn": ["nyc_taxi", "marts", "unique_fct_trips_trip_id"], "alias": "unique_fct_trips_trip_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": "target\\run\\nyc_taxi\\models\\marts\\_fct_trips.yml\\unique_fct_trips_trip_id.sql", "unrendered_config": {}, "created_at": 1785250507.6816664, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "doc_blocks": [], "language": "sql", "refs": [{"name": "fct_trips", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt.test_unique", "macro.dbt.get_where_subquery", "macro.dbt.get_limit_subquery_sql", "macro.dbt.should_store_failures", "macro.dbt.statement"], "nodes": ["model.nyc_taxi.fct_trips"]}, "compiled_path": "target\\compiled\\nyc_taxi\\models\\marts\\_fct_trips.yml\\unique_fct_trips_trip_id.sql", "compiled": true, "compiled_code": "\n \n \n\nselect\n trip_id as unique_field,\n count(*) as n_records\n\nfrom `hyf`.`dev_halyna`.`fct_trips`\nwhere trip_id is not null\ngroup by trip_id\nhaving count(*) > 1\n\n\n", "extra_ctes_injected": true, "extra_ctes": [], "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "trip_id", "file_key_name": "models.fct_trips", "attached_node": "model.nyc_taxi.fct_trips", "test_metadata": {"name": "unique", "kwargs": {"column_name": "trip_id", "model": "{{ get_where_subquery(ref('fct_trips')) }}"}, "namespace": null}}, "test.nyc_taxi.not_null_fct_trips_pickup_datetime.3c78164d83": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "not_null_fct_trips_pickup_datetime", "resource_type": "test", "package_name": "nyc_taxi", "path": "not_null_fct_trips_pickup_datetime.sql", "original_file_path": "models\\marts\\_fct_trips.yml", "unique_id": "test.nyc_taxi.not_null_fct_trips_pickup_datetime.3c78164d83", "fqn": ["nyc_taxi", "marts", "not_null_fct_trips_pickup_datetime"], "alias": "not_null_fct_trips_pickup_datetime", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": "target\\run\\nyc_taxi\\models\\marts\\_fct_trips.yml\\not_null_fct_trips_pickup_datetime.sql", "unrendered_config": {}, "created_at": 1785250507.685718, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "doc_blocks": [], "language": "sql", "refs": [{"name": "fct_trips", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt.test_not_null", "macro.dbt.get_where_subquery", "macro.dbt.get_limit_subquery_sql", "macro.dbt.should_store_failures", "macro.dbt.statement"], "nodes": ["model.nyc_taxi.fct_trips"]}, "compiled_path": "target\\compiled\\nyc_taxi\\models\\marts\\_fct_trips.yml\\not_null_fct_trips_pickup_datetime.sql", "compiled": true, "compiled_code": "\n \n \n\n\n\nselect pickup_datetime\nfrom `hyf`.`dev_halyna`.`fct_trips`\nwhere pickup_datetime is null\n\n\n", "extra_ctes_injected": true, "extra_ctes": [], "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "pickup_datetime", "file_key_name": "models.fct_trips", "attached_node": "model.nyc_taxi.fct_trips", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "pickup_datetime", "model": "{{ get_where_subquery(ref('fct_trips')) }}"}, "namespace": null}}, "test.nyc_taxi.not_null_stg_trips_trip_id.159f524fc2": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "not_null_stg_trips_trip_id", "resource_type": "test", "package_name": "nyc_taxi", "path": "not_null_stg_trips_trip_id.sql", "original_file_path": "models\\staging\\_stg_trips.yml", "unique_id": "test.nyc_taxi.not_null_stg_trips_trip_id.159f524fc2", "fqn": ["nyc_taxi", "staging", "not_null_stg_trips_trip_id"], "alias": "not_null_stg_trips_trip_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {}, "created_at": 1785250507.8269482, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "doc_blocks": [], "language": "sql", "refs": [{"name": "stg_trips", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.nyc_taxi.stg_trips"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "trip_id", "file_key_name": "models.stg_trips", "attached_node": "model.nyc_taxi.stg_trips", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "trip_id", "model": "{{ get_where_subquery(ref('stg_trips')) }}"}, "namespace": null}}, "test.nyc_taxi.unique_stg_trips_trip_id.748f5076fb": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "unique_stg_trips_trip_id", "resource_type": "test", "package_name": "nyc_taxi", "path": "unique_stg_trips_trip_id.sql", "original_file_path": "models\\staging\\_stg_trips.yml", "unique_id": "test.nyc_taxi.unique_stg_trips_trip_id.748f5076fb", "fqn": ["nyc_taxi", "staging", "unique_stg_trips_trip_id"], "alias": "unique_stg_trips_trip_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {}, "created_at": 1785250507.8309581, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "doc_blocks": [], "language": "sql", "refs": [{"name": "stg_trips", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.nyc_taxi.stg_trips"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "trip_id", "file_key_name": "models.stg_trips", "attached_node": "model.nyc_taxi.stg_trips", "test_metadata": {"name": "unique", "kwargs": {"column_name": "trip_id", "model": "{{ get_where_subquery(ref('stg_trips')) }}"}, "namespace": null}}, "test.nyc_taxi.not_null_stg_trips_pickup_datetime.4df9e7a15c": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "not_null_stg_trips_pickup_datetime", "resource_type": "test", "package_name": "nyc_taxi", "path": "not_null_stg_trips_pickup_datetime.sql", "original_file_path": "models\\staging\\_stg_trips.yml", "unique_id": "test.nyc_taxi.not_null_stg_trips_pickup_datetime.4df9e7a15c", "fqn": ["nyc_taxi", "staging", "not_null_stg_trips_pickup_datetime"], "alias": "not_null_stg_trips_pickup_datetime", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {}, "created_at": 1785250507.834957, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "doc_blocks": [], "language": "sql", "refs": [{"name": "stg_trips", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.nyc_taxi.stg_trips"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "pickup_datetime", "file_key_name": "models.stg_trips", "attached_node": "model.nyc_taxi.stg_trips", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "pickup_datetime", "model": "{{ get_where_subquery(ref('stg_trips')) }}"}, "namespace": null}}, "test.nyc_taxi.not_null_stg_trips_pickup_location_id.a4d16d4471": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "not_null_stg_trips_pickup_location_id", "resource_type": "test", "package_name": "nyc_taxi", "path": "not_null_stg_trips_pickup_location_id.sql", "original_file_path": "models\\staging\\_stg_trips.yml", "unique_id": "test.nyc_taxi.not_null_stg_trips_pickup_location_id.a4d16d4471", "fqn": ["nyc_taxi", "staging", "not_null_stg_trips_pickup_location_id"], "alias": "not_null_stg_trips_pickup_location_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {}, "created_at": 1785250507.837952, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "doc_blocks": [], "language": "sql", "refs": [{"name": "stg_trips", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.nyc_taxi.stg_trips"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "pickup_location_id", "file_key_name": "models.stg_trips", "attached_node": "model.nyc_taxi.stg_trips", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "pickup_location_id", "model": "{{ get_where_subquery(ref('stg_trips')) }}"}, "namespace": null}}, "test.nyc_taxi.relationships_stg_trips_pickup_location_id__location_id__ref_stg_zones_.5eead0f98c": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "relationships_stg_trips_pickup_location_id__location_id__ref_stg_zones_", "resource_type": "test", "package_name": "nyc_taxi", "path": "relationships_stg_trips_2508d47ce822ed9ef48d6963eb775e20.sql", "original_file_path": "models\\staging\\_stg_trips.yml", "unique_id": "test.nyc_taxi.relationships_stg_trips_pickup_location_id__location_id__ref_stg_zones_.5eead0f98c", "fqn": ["nyc_taxi", "staging", "relationships_stg_trips_pickup_location_id__location_id__ref_stg_zones_"], "alias": "relationships_stg_trips_2508d47ce822ed9ef48d6963eb775e20", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": "relationships_stg_trips_2508d47ce822ed9ef48d6963eb775e20", "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "warn", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"severity": "warn", "alias": "relationships_stg_trips_2508d47ce822ed9ef48d6963eb775e20"}, "created_at": 1785250507.8419592, "relation_name": null, "raw_code": "{{ test_relationships(**_dbt_generic_test_kwargs) }}{{ config(severity=\"warn\",alias=\"relationships_stg_trips_2508d47ce822ed9ef48d6963eb775e20\") }}", "doc_blocks": [], "language": "sql", "refs": [{"name": "stg_zones", "package": null, "version": null}, {"name": "stg_trips", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt.test_relationships", "macro.dbt.get_where_subquery"], "nodes": ["model.nyc_taxi.stg_zones", "model.nyc_taxi.stg_trips"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "pickup_location_id", "file_key_name": "models.stg_trips", "attached_node": "model.nyc_taxi.stg_trips", "test_metadata": {"name": "relationships", "kwargs": {"column_name": "pickup_location_id", "to": "ref('stg_zones')", "field": "location_id", "model": "{{ get_where_subquery(ref('stg_trips')) }}"}, "namespace": null}}, "test.nyc_taxi.not_null_stg_trips_payment_type.e14494b406": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "not_null_stg_trips_payment_type", "resource_type": "test", "package_name": "nyc_taxi", "path": "not_null_stg_trips_payment_type.sql", "original_file_path": "models\\staging\\_stg_trips.yml", "unique_id": "test.nyc_taxi.not_null_stg_trips_payment_type.e14494b406", "fqn": ["nyc_taxi", "staging", "not_null_stg_trips_payment_type"], "alias": "not_null_stg_trips_payment_type", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "warn", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"severity": "warn"}, "created_at": 1785250507.8704934, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}{{ config(severity=\"warn\") }}", "doc_blocks": [], "language": "sql", "refs": [{"name": "stg_trips", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.nyc_taxi.stg_trips"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "payment_type", "file_key_name": "models.stg_trips", "attached_node": "model.nyc_taxi.stg_trips", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "payment_type", "model": "{{ get_where_subquery(ref('stg_trips')) }}"}, "namespace": null}}, "test.nyc_taxi.accepted_values_stg_trips_payment_type__0__1__2__3__4__5__6.0972e03b73": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "accepted_values_stg_trips_payment_type__0__1__2__3__4__5__6", "resource_type": "test", "package_name": "nyc_taxi", "path": "accepted_values_stg_trips_payment_type__0__1__2__3__4__5__6.sql", "original_file_path": "models\\staging\\_stg_trips.yml", "unique_id": "test.nyc_taxi.accepted_values_stg_trips_payment_type__0__1__2__3__4__5__6.0972e03b73", "fqn": ["nyc_taxi", "staging", "accepted_values_stg_trips_payment_type__0__1__2__3__4__5__6"], "alias": "accepted_values_stg_trips_payment_type__0__1__2__3__4__5__6", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {}, "created_at": 1785250507.8744972, "relation_name": null, "raw_code": "{{ test_accepted_values(**_dbt_generic_test_kwargs) }}", "doc_blocks": [], "language": "sql", "refs": [{"name": "stg_trips", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt.test_accepted_values", "macro.dbt.get_where_subquery"], "nodes": ["model.nyc_taxi.stg_trips"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "payment_type", "file_key_name": "models.stg_trips", "attached_node": "model.nyc_taxi.stg_trips", "test_metadata": {"name": "accepted_values", "kwargs": {"column_name": "payment_type", "values": [0, 1, 2, 3, 4, 5, 6], "model": "{{ get_where_subquery(ref('stg_trips')) }}"}, "namespace": null}}, "test.nyc_taxi.dbt_utils_unique_combination_of_columns_stg_trips_pickup_datetime__dropoff_datetime__pickup_location_id__fare_amount.72a6d320a5": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "dbt_utils_unique_combination_of_columns_stg_trips_pickup_datetime__dropoff_datetime__pickup_location_id__fare_amount", "resource_type": "test", "package_name": "nyc_taxi", "path": "dbt_utils_unique_combination_o_322291eda9ceef2720a0a01d33e4d820.sql", "original_file_path": "models\\staging\\_stg_trips.yml", "unique_id": "test.nyc_taxi.dbt_utils_unique_combination_of_columns_stg_trips_pickup_datetime__dropoff_datetime__pickup_location_id__fare_amount.72a6d320a5", "fqn": ["nyc_taxi", "staging", "dbt_utils_unique_combination_of_columns_stg_trips_pickup_datetime__dropoff_datetime__pickup_location_id__fare_amount"], "alias": "dbt_utils_unique_combination_o_322291eda9ceef2720a0a01d33e4d820", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": "dbt_utils_unique_combination_o_322291eda9ceef2720a0a01d33e4d820", "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "warn", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"severity": "warn", "alias": "dbt_utils_unique_combination_o_322291eda9ceef2720a0a01d33e4d820"}, "created_at": 1785250507.8865514, "relation_name": null, "raw_code": "{{ dbt_utils.test_unique_combination_of_columns(**_dbt_generic_test_kwargs) }}{{ config(severity=\"warn\",alias=\"dbt_utils_unique_combination_o_322291eda9ceef2720a0a01d33e4d820\") }}", "doc_blocks": [], "language": "sql", "refs": [{"name": "stg_trips", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt_utils.test_unique_combination_of_columns", "macro.dbt.get_where_subquery"], "nodes": ["model.nyc_taxi.stg_trips"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": null, "file_key_name": "models.stg_trips", "attached_node": "model.nyc_taxi.stg_trips", "test_metadata": {"name": "unique_combination_of_columns", "kwargs": {"combination_of_columns": ["pickup_datetime", "dropoff_datetime", "pickup_location_id", "fare_amount"], "model": "{{ get_where_subquery(ref('stg_trips')) }}"}, "namespace": "dbt_utils"}}, "test.nyc_taxi.unique_stg_zones_location_id.3578c2f409": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "unique_stg_zones_location_id", "resource_type": "test", "package_name": "nyc_taxi", "path": "unique_stg_zones_location_id.sql", "original_file_path": "models\\staging\\_stg_zones.yml", "unique_id": "test.nyc_taxi.unique_stg_zones_location_id.3578c2f409", "fqn": ["nyc_taxi", "staging", "unique_stg_zones_location_id"], "alias": "unique_stg_zones_location_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {}, "created_at": 1785250507.904796, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "doc_blocks": [], "language": "sql", "refs": [{"name": "stg_zones", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.nyc_taxi.stg_zones"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "location_id", "file_key_name": "models.stg_zones", "attached_node": "model.nyc_taxi.stg_zones", "test_metadata": {"name": "unique", "kwargs": {"column_name": "location_id", "model": "{{ get_where_subquery(ref('stg_zones')) }}"}, "namespace": null}}, "test.nyc_taxi.not_null_stg_zones_location_id.244b100d38": {"database": "hyf", "schema": "dev_halyna_dbt_test__audit", "name": "not_null_stg_zones_location_id", "resource_type": "test", "package_name": "nyc_taxi", "path": "not_null_stg_zones_location_id.sql", "original_file_path": "models\\staging\\_stg_zones.yml", "unique_id": "test.nyc_taxi.not_null_stg_zones_location_id.244b100d38", "fqn": ["nyc_taxi", "staging", "not_null_stg_zones_location_id"], "alias": "not_null_stg_zones_location_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "static_analysis": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": null, "sql_header": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {}, "created_at": 1785250507.908838, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "doc_blocks": [], "language": "sql", "refs": [{"name": "stg_zones", "package": null, "version": null}], "sources": [], "metrics": [], "functions": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.nyc_taxi.stg_zones"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "location_id", "file_key_name": "models.stg_zones", "attached_node": "model.nyc_taxi.stg_zones", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "location_id", "model": "{{ get_where_subquery(ref('stg_zones')) }}"}, "namespace": null}}}, "sources": {"source.nyc_taxi.nyc_taxi.raw_trips": {"database": "hyf", "schema": "nyc_yellow", "name": "raw_trips", "resource_type": "source", "package_name": "nyc_taxi", "path": "models\\staging\\_sources.yml", "original_file_path": "models\\staging\\_sources.yml", "unique_id": "source.nyc_taxi.nyc_taxi.raw_trips", "fqn": ["nyc_taxi", "staging", "nyc_taxi", "raw_trips"], "source_name": "nyc_taxi", "source_description": "Raw NYC yellow taxi data in Databricks Unity Catalog.", "loader": "", "identifier": "raw_trips", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "loaded_at_query": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "Yellow taxi trips for 2023-2025, approximately 128 million rows.", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true, "event_time": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "loaded_at_field": null, "loaded_at_query": null, "meta": {}, "tags": [], "static_analysis": null}, "patch_path": null, "unrendered_config": {"loaded_at_field": null, "loaded_at_query": null, "meta": {}, "tags": []}, "relation_name": "`hyf`.`nyc_yellow`.`raw_trips`", "created_at": 1785250507.9393299, "unrendered_database": "hyf", "unrendered_schema": "nyc_yellow", "doc_blocks": []}, "source.nyc_taxi.nyc_taxi.raw_zones": {"database": "hyf", "schema": "nyc_yellow", "name": "raw_zones", "resource_type": "source", "package_name": "nyc_taxi", "path": "models\\staging\\_sources.yml", "original_file_path": "models\\staging\\_sources.yml", "unique_id": "source.nyc_taxi.nyc_taxi.raw_zones", "fqn": ["nyc_taxi", "staging", "nyc_taxi", "raw_zones"], "source_name": "nyc_taxi", "source_description": "Raw NYC yellow taxi data in Databricks Unity Catalog.", "loader": "", "identifier": "raw_zones", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "loaded_at_query": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "Lookup table mapping taxi location IDs to boroughs and zones.", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true, "event_time": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "loaded_at_field": null, "loaded_at_query": null, "meta": {}, "tags": [], "static_analysis": null}, "patch_path": null, "unrendered_config": {"loaded_at_field": null, "loaded_at_query": null, "meta": {}, "tags": []}, "relation_name": "`hyf`.`nyc_yellow`.`raw_zones`", "created_at": 1785250507.9423273, "unrendered_database": "hyf", "unrendered_schema": "nyc_yellow", "doc_blocks": []}}, "macros": {"macro.dbt_databricks.databricks__get_catalog": {"name": "databricks__get_catalog", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\catalog.sql", "original_file_path": "macros\\adapters\\catalog.sql", "unique_id": "macro.dbt_databricks.databricks__get_catalog", "macro_sql": "{% macro databricks__get_catalog(information_schema, schemas) -%}\n {% set query %}\nWITH tables AS (\n {{ databricks__get_catalog_tables_sql(information_schema) }}\n {{ databricks__get_catalog_schemas_where_clause_sql(information_schema.database, schemas) }}\n),\ncolumns AS (\n {{ databricks__get_catalog_columns_sql(information_schema) }}\n {{ databricks__get_catalog_schemas_where_clause_sql(information_schema.database, schemas) }}\n)\n{{ databricks__get_catalog_results_sql() }}\n {%- endset -%}\n\n {{ return(run_query_as(query, 'get_catalog')) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_catalog_tables_sql", "macro.dbt_databricks.databricks__get_catalog_schemas_where_clause_sql", "macro.dbt_databricks.databricks__get_catalog_columns_sql", "macro.dbt_databricks.databricks__get_catalog_results_sql", "macro.dbt_databricks.run_query_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "information_schema", "type": null, "description": ""}, {"name": "schemas", "type": null, "description": ""}], "created_at": 1785250504.733668, "supported_languages": null}, "macro.dbt_databricks.databricks__get_catalog_relations": {"name": "databricks__get_catalog_relations", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\catalog.sql", "original_file_path": "macros\\adapters\\catalog.sql", "unique_id": "macro.dbt_databricks.databricks__get_catalog_relations", "macro_sql": "{% macro databricks__get_catalog_relations(information_schema, relations) -%}\n {% set query %}\nWITH tables AS (\n {{ databricks__get_catalog_tables_sql(information_schema) }}\n {{ databricks__get_catalog_relations_where_clause_sql(information_schema.database, relations) }}\n),\ncolumns AS (\n {{ databricks__get_catalog_columns_sql(information_schema) }}\n {{ databricks__get_catalog_relations_where_clause_sql(information_schema.database, relations) }}\n)\n{{ databricks__get_catalog_results_sql() }}\n {%- endset -%}\n\n {{ return(run_query_as(query, 'get_catalog_relations')) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_catalog_tables_sql", "macro.dbt_databricks.databricks__get_catalog_relations_where_clause_sql", "macro.dbt_databricks.databricks__get_catalog_columns_sql", "macro.dbt_databricks.databricks__get_catalog_results_sql", "macro.dbt_databricks.run_query_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "information_schema", "type": null, "description": ""}, {"name": "relations", "type": null, "description": ""}], "created_at": 1785250504.734664, "supported_languages": null}, "macro.dbt_databricks.databricks__get_catalog_tables_sql": {"name": "databricks__get_catalog_tables_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\catalog.sql", "original_file_path": "macros\\adapters\\catalog.sql", "unique_id": "macro.dbt_databricks.databricks__get_catalog_tables_sql", "macro_sql": "{% macro databricks__get_catalog_tables_sql(information_schema) -%}\nSELECT\n table_catalog AS table_database,\n table_schema,\n table_name,\n lower(table_type) AS table_type,\n comment AS table_comment,\n table_owner,\n 'Last Modified' AS `stats:last_modified:label`,\n last_altered AS `stats:last_modified:value`,\n 'The timestamp for last update/change' AS `stats:last_modified:description`,\n (last_altered IS NOT NULL AND table_type NOT ILIKE '%VIEW%') AS `stats:last_modified:include`\nFROM `system`.`information_schema`.`tables`\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "information_schema", "type": null, "description": ""}], "created_at": 1785250504.734664, "supported_languages": null}, "macro.dbt_databricks.databricks__get_catalog_columns_sql": {"name": "databricks__get_catalog_columns_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\catalog.sql", "original_file_path": "macros\\adapters\\catalog.sql", "unique_id": "macro.dbt_databricks.databricks__get_catalog_columns_sql", "macro_sql": "{% macro databricks__get_catalog_columns_sql(information_schema) -%}\nSELECT\n table_catalog AS table_database,\n table_schema,\n table_name,\n column_name,\n ordinal_position AS column_index,\n lower(full_data_type) AS column_type,\n comment AS column_comment\nFROM `system`.`information_schema`.`columns`\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "information_schema", "type": null, "description": ""}], "created_at": 1785250504.7356677, "supported_languages": null}, "macro.dbt_databricks.databricks__get_catalog_results_sql": {"name": "databricks__get_catalog_results_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\catalog.sql", "original_file_path": "macros\\adapters\\catalog.sql", "unique_id": "macro.dbt_databricks.databricks__get_catalog_results_sql", "macro_sql": "{% macro databricks__get_catalog_results_sql() -%}\nSELECT *\nFROM tables\nJOIN columns USING (table_database, table_schema, table_name)\nORDER BY column_index\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250504.7356677, "supported_languages": null}, "macro.dbt_databricks.databricks__get_catalog_schemas_where_clause_sql": {"name": "databricks__get_catalog_schemas_where_clause_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\catalog.sql", "original_file_path": "macros\\adapters\\catalog.sql", "unique_id": "macro.dbt_databricks.databricks__get_catalog_schemas_where_clause_sql", "macro_sql": "{% macro databricks__get_catalog_schemas_where_clause_sql(catalog, schemas) -%}\nWHERE table_catalog = '{{ catalog|lower }}' AND (\n {%- for relation in schemas -%}\n table_schema = '{{ relation[1]|lower }}'{%- if not loop.last %} OR {% endif -%}\n {%- endfor -%})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "catalog", "type": null, "description": ""}, {"name": "schemas", "type": null, "description": ""}], "created_at": 1785250504.7356677, "supported_languages": null}, "macro.dbt_databricks.databricks__get_catalog_relations_where_clause_sql": {"name": "databricks__get_catalog_relations_where_clause_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\catalog.sql", "original_file_path": "macros\\adapters\\catalog.sql", "unique_id": "macro.dbt_databricks.databricks__get_catalog_relations_where_clause_sql", "macro_sql": "{% macro databricks__get_catalog_relations_where_clause_sql(catalog, relations) -%}\nWHERE table_catalog = '{{ catalog|lower }}' AND (\n {%- for relation in relations -%}\n {%- if relation.schema and relation.identifier %}\n (\n table_schema = '{{ relation.schema|lower }}'\n AND table_name = '{{ relation.identifier|lower }}'\n )\n {%- elif relation.schema %}\n (\n table_schema = '{{ relation.schema|lower }}'\n )\n {% else %}\n {% do exceptions.raise_compiler_error(\n '`get_catalog_relations` requires a list of relations, each with a schema'\n ) %}\n {% endif %}\n {%- if not loop.last %} OR {% endif -%}\n {%- endfor -%}\n)\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "catalog", "type": null, "description": ""}, {"name": "relations", "type": null, "description": ""}], "created_at": 1785250504.737661, "supported_languages": null}, "macro.dbt_databricks.get_columns_comments": {"name": "get_columns_comments", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt_databricks.get_columns_comments", "macro_sql": "{% macro get_columns_comments(relation) -%}\n {{ return(run_query_as(get_columns_comments_sql(relation), 'get_columns_comments')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.run_query_as", "macro.dbt_databricks.get_columns_comments_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.7386642, "supported_languages": null}, "macro.dbt_databricks.get_columns_comments_sql": {"name": "get_columns_comments_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt_databricks.get_columns_comments_sql", "macro_sql": "{% macro get_columns_comments_sql(relation) %}\nDESCRIBE TABLE {{ relation.render() }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.7386642, "supported_languages": null}, "macro.dbt_databricks.get_columns_comments_as_json": {"name": "get_columns_comments_as_json", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt_databricks.get_columns_comments_as_json", "macro_sql": "{% macro get_columns_comments_as_json(relation) -%}\n {{ return(run_query_as(get_columns_comments_as_json_sql(relation), 'get_columns_comments_as_json')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.run_query_as", "macro.dbt_databricks.get_columns_comments_as_json_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.7386642, "supported_languages": null}, "macro.dbt_databricks.get_columns_comments_as_json_sql": {"name": "get_columns_comments_as_json_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt_databricks.get_columns_comments_as_json_sql", "macro_sql": "{% macro get_columns_comments_as_json_sql(relation) %}\n DESCRIBE TABLE EXTENDED {{ relation.render() }} AS JSON\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.7396648, "supported_languages": null}, "macro.dbt_databricks.get_columns_comments_via_information_schema": {"name": "get_columns_comments_via_information_schema", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt_databricks.get_columns_comments_via_information_schema", "macro_sql": "{% macro get_columns_comments_via_information_schema(relation) -%}\n {{ run_query_as(repair_table_sql(relation), 'repair_table', fetch_result=False) }}\n {{ return(run_query_as(get_columns_comments_via_information_schema_sql(relation), 'get_columns_comments_via_information_schema')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.run_query_as", "macro.dbt_databricks.repair_table_sql", "macro.dbt_databricks.get_columns_comments_via_information_schema_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.7396648, "supported_languages": null}, "macro.dbt_databricks.repair_table_sql": {"name": "repair_table_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt_databricks.repair_table_sql", "macro_sql": "{% macro repair_table_sql(relation) %}\nREPAIR TABLE {{ relation.render() }} SYNC METADATA\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.7396648, "supported_languages": null}, "macro.dbt_databricks.get_columns_comments_via_information_schema_sql": {"name": "get_columns_comments_via_information_schema_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt_databricks.get_columns_comments_via_information_schema_sql", "macro_sql": "{% macro get_columns_comments_via_information_schema_sql(relation) %}\nSELECT\n column_name,\n full_data_type,\n comment\nFROM `system`.`information_schema`.`columns`\nWHERE\n table_catalog = '{{ relation.database|lower }}' and\n table_schema = '{{ relation.schema|lower }}' and \n table_name = '{{ relation.identifier|lower }}'\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.740664, "supported_languages": null}, "macro.dbt_databricks.databricks__alter_relation_add_remove_columns": {"name": "databricks__alter_relation_add_remove_columns", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt_databricks.databricks__alter_relation_add_remove_columns", "macro_sql": "{% macro databricks__alter_relation_add_remove_columns(relation, add_columns, remove_columns) %}\n {% if remove_columns %}\n {{ run_query_as(drop_columns_sql(relation, remove_columns), 'alter_relation_remove_columns', fetch_result=False) }}\n {% endif %}\n\n {% if add_columns %}\n {{ run_query_as(add_columns_sql(relation, add_columns), 'alter_relation_add_columns', fetch_result=False) }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.run_query_as", "macro.dbt_databricks.drop_columns_sql", "macro.dbt_databricks.add_columns_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "add_columns", "type": null, "description": ""}, {"name": "remove_columns", "type": null, "description": ""}], "created_at": 1785250504.741663, "supported_languages": null}, "macro.dbt_databricks.drop_columns_sql": {"name": "drop_columns_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt_databricks.drop_columns_sql", "macro_sql": "{% macro drop_columns_sql(relation, remove_columns) %}\nALTER TABLE {{ relation.render() }} DROP COLUMNS ({{ api.Column.format_remove_column_list(remove_columns) }})\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "remove_columns", "type": null, "description": ""}], "created_at": 1785250504.741663, "supported_languages": null}, "macro.dbt_databricks.add_columns_sql": {"name": "add_columns_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt_databricks.add_columns_sql", "macro_sql": "{% macro add_columns_sql(relation, add_columns) %}\nALTER TABLE {{ relation.render() }} ADD COLUMNS ({{ api.Column.format_add_column_list(add_columns) }})\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "add_columns", "type": null, "description": ""}], "created_at": 1785250504.741663, "supported_languages": null}, "macro.dbt_databricks.databricks_copy_into": {"name": "databricks_copy_into", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\copy_into.sql", "original_file_path": "macros\\adapters\\copy_into.sql", "unique_id": "macro.dbt_databricks.databricks_copy_into", "macro_sql": "{% macro databricks_copy_into(\n target_table,\n source,\n file_format,\n expression_list=none,\n source_credential=none,\n source_encryption=none,\n validate=none,\n files=none,\n pattern=none,\n format_options=none,\n copy_options=none) -%}\n\n {% set target_relation_exists, target_relation = get_or_create_relation(\n database=target.database,\n schema=target.schema,\n identifier=target_table,\n type='table') -%}\n\n {%- set source_clause -%}\n {%- if expression_list -%}\n ( select {{ expression_list }} from '{{ source }}' )\n {%- else -%}\n '{{ source }}'\n {%- endif -%}\n {%- if source_credential or source_encryption %}\n WITH (\n {%- if source_credential %}\n credential (\n {%- for name in source_credential -%}\n '{{ name }}' = '{{ source_credential[name] }}' {%- if not loop.last %}, {% endif -%}\n {%- endfor -%}\n )\n {%- endif %}\n {%- if source_encryption %}\n encryption (\n {%- for name in source_encryption -%}\n '{{ name }}' = '{{ source_encryption[name] }}' {%- if not loop.last %}, {% endif -%}\n {%- endfor -%}\n )\n {%- endif %}\n )\n {%- endif -%}\n {%- endset -%}\n\n {% set query %}\n copy into {{ target_relation }}\n from {{ source_clause }}\n fileformat = {{ file_format }}\n {% if validate -%} validate {{ validate }} {%- endif %}\n {% if files and pattern %}\n {{ exceptions.raise_compiler_error(\"You can only specify one of 'files' or 'pattern'\") }}\n {% endif %}\n {% if files -%}\n files = (\n {%- for file in files -%}\n '{{ file }}' {%- if not loop.last %}, {% endif -%}\n {%- endfor -%}\n )\n {%- endif %}\n {% if pattern -%}\n pattern = '{{ pattern }}'\n {%- endif %}\n {% if format_options -%}\n format_options (\n {%- for key in format_options -%}\n '{{ key }}' = '{{ format_options[key] }}' {%- if not loop.last %}, {% endif -%}\n {%- endfor -%}\n )\n {%- endif %}\n {% if copy_options -%}\n copy_options (\n {%- for key in copy_options -%}\n '{{ key }}' = '{{ copy_options[key] }}' {%- if not loop.last %}, {% endif -%}\n {%- endfor -%}\n )\n {%- endif %}\n {% endset %}\n\n {{ run_query_as(query, 'copy_into', fetch_result=False) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_or_create_relation", "macro.dbt_databricks.run_query_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_table", "type": null, "description": ""}, {"name": "source", "type": null, "description": ""}, {"name": "file_format", "type": null, "description": ""}, {"name": "expression_list", "type": null, "description": ""}, {"name": "source_credential", "type": null, "description": ""}, {"name": "source_encryption", "type": null, "description": ""}, {"name": "validate", "type": null, "description": ""}, {"name": "files", "type": null, "description": ""}, {"name": "pattern", "type": null, "description": ""}, {"name": "format_options", "type": null, "description": ""}, {"name": "copy_options", "type": null, "description": ""}], "created_at": 1785250504.7476614, "supported_languages": null}, "macro.dbt_databricks.current_catalog": {"name": "current_catalog", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\databricks_catalog.sql", "original_file_path": "macros\\adapters\\databricks_catalog.sql", "unique_id": "macro.dbt_databricks.current_catalog", "macro_sql": "{% macro current_catalog() -%}\n {{ return(adapter.dispatch('current_catalog', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__current_catalog"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250504.7486727, "supported_languages": null}, "macro.dbt_databricks.databricks__current_catalog": {"name": "databricks__current_catalog", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\databricks_catalog.sql", "original_file_path": "macros\\adapters\\databricks_catalog.sql", "unique_id": "macro.dbt_databricks.databricks__current_catalog", "macro_sql": "{% macro databricks__current_catalog() -%}\n {{ return(run_query_as(current_catalog_sql(), 'current_catalog')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.run_query_as", "macro.dbt_databricks.current_catalog_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250504.7486727, "supported_languages": null}, "macro.dbt_databricks.current_catalog_sql": {"name": "current_catalog_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\databricks_catalog.sql", "original_file_path": "macros\\adapters\\databricks_catalog.sql", "unique_id": "macro.dbt_databricks.current_catalog_sql", "macro_sql": "{% macro current_catalog_sql() %}\nSELECT current_catalog()\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250504.7486727, "supported_languages": null}, "macro.dbt_databricks.use_catalog": {"name": "use_catalog", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\databricks_catalog.sql", "original_file_path": "macros\\adapters\\databricks_catalog.sql", "unique_id": "macro.dbt_databricks.use_catalog", "macro_sql": "{% macro use_catalog(catalog) -%}\n {{ adapter.dispatch('use_catalog', 'dbt')(catalog) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__use_catalog"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "catalog", "type": null, "description": ""}], "created_at": 1785250504.7486727, "supported_languages": null}, "macro.dbt_databricks.databricks__use_catalog": {"name": "databricks__use_catalog", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\databricks_catalog.sql", "original_file_path": "macros\\adapters\\databricks_catalog.sql", "unique_id": "macro.dbt_databricks.databricks__use_catalog", "macro_sql": "{% macro databricks__use_catalog(catalog) -%}\n {{ run_query_as(use_catalog_sql(catalog), 'use_catalog', fetch_result=False) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.run_query_as", "macro.dbt_databricks.use_catalog_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "catalog", "type": null, "description": ""}], "created_at": 1785250504.7496657, "supported_languages": null}, "macro.dbt_databricks.use_catalog_sql": {"name": "use_catalog_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\databricks_catalog.sql", "original_file_path": "macros\\adapters\\databricks_catalog.sql", "unique_id": "macro.dbt_databricks.use_catalog_sql", "macro_sql": "{% macro use_catalog_sql(catalog) %}\nUSE CATALOG {{ adapter.quote(catalog)|lower }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "catalog", "type": null, "description": ""}], "created_at": 1785250504.7496657, "supported_languages": null}, "macro.dbt_databricks.databricks__list_relations_without_caching": {"name": "databricks__list_relations_without_caching", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.databricks__list_relations_without_caching", "macro_sql": "{% macro databricks__list_relations_without_caching(schema_relation) %}\n {{ return(adapter.get_relations_without_caching(schema_relation)) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_relation", "type": null, "description": ""}], "created_at": 1785250504.7516632, "supported_languages": null}, "macro.dbt_databricks.show_table_extended": {"name": "show_table_extended", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.show_table_extended", "macro_sql": "{% macro show_table_extended(schema_relation) %}\n {{ return(adapter.dispatch('show_table_extended', 'dbt')(schema_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__show_table_extended"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_relation", "type": null, "description": ""}], "created_at": 1785250504.7516632, "supported_languages": null}, "macro.dbt_databricks.databricks__show_table_extended": {"name": "databricks__show_table_extended", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.databricks__show_table_extended", "macro_sql": "{% macro databricks__show_table_extended(schema_relation) %}\n {{ return(run_query_as(show_table_extended_sql(schema_relation), 'show_table_extended')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.run_query_as", "macro.dbt_databricks.show_table_extended_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_relation", "type": null, "description": ""}], "created_at": 1785250504.7516632, "supported_languages": null}, "macro.dbt_databricks.show_table_extended_sql": {"name": "show_table_extended_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.show_table_extended_sql", "macro_sql": "{% macro show_table_extended_sql(schema_relation) %}\nSHOW TABLE EXTENDED IN {{ schema_relation.without_identifier()|lower }} LIKE '{{ schema_relation.identifier|lower }}'\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_relation", "type": null, "description": ""}], "created_at": 1785250504.7526722, "supported_languages": null}, "macro.dbt_databricks.show_tables": {"name": "show_tables", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.show_tables", "macro_sql": "{% macro show_tables(relation) %}\n {{ return(adapter.dispatch('show_tables', 'dbt')(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__show_tables"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.7526722, "supported_languages": null}, "macro.dbt_databricks.databricks__show_tables": {"name": "databricks__show_tables", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.databricks__show_tables", "macro_sql": "{% macro databricks__show_tables(relation) %}\n {{ return(run_query_as(show_tables_sql(relation), 'show_tables')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.run_query_as", "macro.dbt_databricks.show_tables_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.7526722, "supported_languages": null}, "macro.dbt_databricks.show_tables_sql": {"name": "show_tables_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.show_tables_sql", "macro_sql": "{% macro show_tables_sql(relation) %}\nSHOW TABLES IN {{ relation.render() }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.753663, "supported_languages": null}, "macro.dbt_databricks.show_views": {"name": "show_views", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.show_views", "macro_sql": "{% macro show_views(relation) %}\n {{ return(adapter.dispatch('show_views', 'dbt')(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__show_views"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.753663, "supported_languages": null}, "macro.dbt_databricks.databricks__show_views": {"name": "databricks__show_views", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.databricks__show_views", "macro_sql": "{% macro databricks__show_views(relation) %}\n {{ return(run_query_as(show_views_sql(relation), 'show_views')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.run_query_as", "macro.dbt_databricks.show_views_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.753663, "supported_languages": null}, "macro.dbt_databricks.show_views_sql": {"name": "show_views_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.show_views_sql", "macro_sql": "{% macro show_views_sql(relation) %}\nSHOW VIEWS IN {{ relation.render() }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.7546725, "supported_languages": null}, "macro.dbt_databricks.databricks__get_relation_last_modified": {"name": "databricks__get_relation_last_modified", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.databricks__get_relation_last_modified", "macro_sql": "{% macro databricks__get_relation_last_modified(information_schema, relations) -%}\n {% call statement('last_modified', fetch_result=True) %}\n {{ get_relation_last_modified_sql(information_schema, relations) }}\n {% endcall %}\n {{ return(load_result('last_modified')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_databricks.get_relation_last_modified_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "information_schema", "type": null, "description": ""}, {"name": "relations", "type": null, "description": ""}], "created_at": 1785250504.7546725, "supported_languages": null}, "macro.dbt_databricks.get_relation_last_modified_sql": {"name": "get_relation_last_modified_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.get_relation_last_modified_sql", "macro_sql": "{% macro get_relation_last_modified_sql(information_schema, relations) %}\n {% if information_schema.is_hive_metastore() %}\n {%- for relation in relations -%}\nSELECT\n '{{ relation.schema }}' AS schema,\n '{{ relation.identifier }}' AS identifier,\n max(timestamp) AS last_modified,\n {{ current_timestamp() }} AS snapshotted_at\n FROM (DESCRIBE HISTORY {{ relation.schema|lower }}.{{ relation.identifier|lower }})\n {% if not loop.last %}\nUNION ALL\n {% endif %}\n {%- endfor -%}\n {% else %}\nSELECT\n table_schema AS schema,\n table_name AS identifier,\n last_altered AS last_modified,\n {{ current_timestamp() }} AS snapshotted_at\nFROM `system`.`information_schema`.`tables`\nWHERE table_catalog = '{{ information_schema.database|lower }}'\n AND (\n {%- for relation in relations -%}\n (table_schema = '{{ relation.schema|lower }}' AND\n table_name = '{{ relation.identifier|lower }}'){%- if not loop.last %} OR {% endif -%}\n {%- endfor -%}\n )\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "information_schema", "type": null, "description": ""}, {"name": "relations", "type": null, "description": ""}], "created_at": 1785250504.7566612, "supported_languages": null}, "macro.dbt_databricks.get_view_description": {"name": "get_view_description", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.get_view_description", "macro_sql": "{% macro get_view_description(relation) %}\n {{ return(run_query_as(get_view_description_sql(relation), 'get_view_description')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.run_query_as", "macro.dbt_databricks.get_view_description_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.7566612, "supported_languages": null}, "macro.dbt_databricks.get_view_description_sql": {"name": "get_view_description_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.get_view_description_sql", "macro_sql": "{% macro get_view_description_sql(relation) %}\nSELECT *\nFROM `system`.`information_schema`.`views`\nWHERE table_catalog = '{{ relation.database|lower }}'\n AND table_schema = '{{ relation.schema|lower }}'\n AND table_name = '{{ relation.identifier|lower }}'\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.7576635, "supported_languages": null}, "macro.dbt_databricks.get_uc_tables": {"name": "get_uc_tables", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.get_uc_tables", "macro_sql": "{% macro get_uc_tables(relation) %}\n {{ return(run_query_as(get_uc_tables_sql(relation), 'get_uc_tables')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.run_query_as", "macro.dbt_databricks.get_uc_tables_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.758034, "supported_languages": null}, "macro.dbt_databricks.get_uc_tables_sql": {"name": "get_uc_tables_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt_databricks.get_uc_tables_sql", "macro_sql": "{% macro get_uc_tables_sql(relation) %}\nSELECT\n table_name,\n if(table_type IN ('EXTERNAL', 'MANAGED', 'MANAGED_SHALLOW_CLONE', 'EXTERNAL_SHALLOW_CLONE'), 'table', lower(table_type)) AS table_type,\n lower(data_source_format) AS file_format,\n table_owner,\n if(\n table_type IN (\n 'EXTERNAL',\n 'MANAGED',\n 'MANAGED_SHALLOW_CLONE',\n 'EXTERNAL_SHALLOW_CLONE'\n ),\n lower(table_type),\n NULL\n ) AS databricks_table_type\nFROM `system`.`information_schema`.`tables`\nWHERE table_catalog = '{{ relation.database|lower }}' \n AND table_schema = '{{ relation.schema|lower }}'\n {%- if relation.identifier %}\n AND table_name = '{{ relation.identifier|lower }}'\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.7590754, "supported_languages": null}, "macro.dbt_databricks.databricks__alter_column_comment": {"name": "databricks__alter_column_comment", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\persist_docs.sql", "original_file_path": "macros\\adapters\\persist_docs.sql", "unique_id": "macro.dbt_databricks.databricks__alter_column_comment", "macro_sql": "{% macro databricks__alter_column_comment(relation, column_dict) %}\n {% set file_format = config.get('file_format', default='delta') %}\n {% if file_format in ['delta', 'hudi'] %}\n {% for column in column_dict.values() %}\n {% set comment = column['description'] %}\n {% set escaped_comment = comment | replace('\\'', '\\\\\\'') %}\n {% set column_path = relation.render() ~ '.' ~ api.Column.get_name(column) %}\n {{ run_query_as(comment_on_column_sql(column_path, escaped_comment), 'alter_column_comment', fetch_result=False) }}\n {% endfor %}\n {% else %}\n {{ log('WARNING - requested to update column comments, but file format ' ~ file_format ~ ' does not support that.') }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.run_query_as", "macro.dbt_databricks.comment_on_column_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column_dict", "type": null, "description": ""}], "created_at": 1785250504.7610679, "supported_languages": null}, "macro.dbt_databricks.comment_on_column_sql": {"name": "comment_on_column_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\persist_docs.sql", "original_file_path": "macros\\adapters\\persist_docs.sql", "unique_id": "macro.dbt_databricks.comment_on_column_sql", "macro_sql": "{% macro comment_on_column_sql(column_path, escaped_comment) %}\nCOMMENT ON COLUMN {{ column_path }} IS '{{ escaped_comment }}'\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "column_path", "type": null, "description": ""}, {"name": "escaped_comment", "type": null, "description": ""}], "created_at": 1785250504.7620678, "supported_languages": null}, "macro.dbt_databricks.databricks__persist_docs": {"name": "databricks__persist_docs", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\persist_docs.sql", "original_file_path": "macros\\adapters\\persist_docs.sql", "unique_id": "macro.dbt_databricks.databricks__persist_docs", "macro_sql": "{% macro databricks__persist_docs(relation, model, for_relation, for_columns) -%}\n {%- if for_relation and config.persist_relation_docs() and model.description %}\n {{ run_query_as(alter_relation_comment_sql(relation, model.description), 'alter_relation_comment', fetch_result=False) }}\n {% endif %}\n {% if for_columns and config.persist_column_docs() and model.columns %}\n {%- set existing_columns = adapter.get_columns_in_relation(relation) -%}\n {%- set columns_to_persist_docs = adapter.get_persist_doc_columns(existing_columns, model.columns) -%}\n {{ alter_column_comment(relation, columns_to_persist_docs) }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.run_query_as", "macro.dbt_databricks.alter_relation_comment_sql", "macro.dbt.alter_column_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "model", "type": null, "description": ""}, {"name": "for_relation", "type": null, "description": ""}, {"name": "for_columns", "type": null, "description": ""}], "created_at": 1785250504.7630677, "supported_languages": null}, "macro.dbt_databricks.alter_relation_comment_sql": {"name": "alter_relation_comment_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\persist_docs.sql", "original_file_path": "macros\\adapters\\persist_docs.sql", "unique_id": "macro.dbt_databricks.alter_relation_comment_sql", "macro_sql": "{% macro alter_relation_comment_sql(relation, description) %}\nCOMMENT ON {{ relation.type.upper() }} {{ relation.render() }} IS '{{ description | replace(\"'\", \"\\\\'\") }}'\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "description", "type": null, "description": ""}], "created_at": 1785250504.7630677, "supported_languages": null}, "macro.dbt_databricks.alter_column_comments": {"name": "alter_column_comments", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\persist_docs.sql", "original_file_path": "macros\\adapters\\persist_docs.sql", "unique_id": "macro.dbt_databricks.alter_column_comments", "macro_sql": "{% macro alter_column_comments(relation, column_dict) %}\n {% for column, comment in column_dict.items() %}\n {{ log('Updating comment for column ' ~ column ~ ' with comment ' ~ comment) }}\n {% set escaped_comment = comment | replace('\\'', '\\\\\\'') %}\n {% set column_path = relation.render() ~ '.' ~ column %}\n {{ run_query_as(comment_on_column_sql(column_path, escaped_comment), 'main', fetch_result=False) }}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.run_query_as", "macro.dbt_databricks.comment_on_column_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column_dict", "type": null, "description": ""}], "created_at": 1785250504.7640676, "supported_languages": null}, "macro.dbt_databricks.databricks__py_write_table": {"name": "databricks__py_write_table", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\python.sql", "original_file_path": "macros\\adapters\\python.sql", "unique_id": "macro.dbt_databricks.databricks__py_write_table", "macro_sql": "{% macro databricks__py_write_table(compiled_code, target_relation) %}\n{{ compiled_code }}\n# --- Autogenerated dbt materialization code. --- #\ndbt = dbtObj(spark.table)\ndf = model(dbt, spark)\n\nimport pyspark\n\n{{ py_try_import('pyspark.sql.connect.dataframe', 'newer_pyspark_available') }}\n{{ py_try_import('pandas', 'pandas_available') }}\n{{ py_try_import('pyspark.pandas', 'pyspark_pandas_api_available') }}\n{{ py_try_import('databricks.koalas', 'koalas_available') }}\n\n# preferentially convert pandas DataFrames to pandas-on-Spark or Koalas DataFrames first\n# since they know how to convert pandas DataFrames better than `spark.createDataFrame(df)`\n# and converting from pandas-on-Spark to Spark DataFrame has no overhead\n\nif pandas_available and isinstance(df, pandas.core.frame.DataFrame):\n if pyspark_pandas_api_available:\n df = pyspark.pandas.frame.DataFrame(df)\n elif koalas_available:\n df = databricks.koalas.frame.DataFrame(df)\n\n# convert to pyspark.sql.dataframe.DataFrame\nif isinstance(df, pyspark.sql.dataframe.DataFrame):\n pass # since it is already a Spark DataFrame\nelif newer_pyspark_available and isinstance(df, pyspark.sql.connect.dataframe.DataFrame):\n pass # since it is already a Spark DataFrame\nelif pyspark_pandas_api_available and isinstance(df, pyspark.pandas.frame.DataFrame):\n df = df.to_spark()\nelif koalas_available and isinstance(df, databricks.koalas.frame.DataFrame):\n df = df.to_spark()\nelif pandas_available and isinstance(df, pandas.core.frame.DataFrame):\n df = spark.createDataFrame(df)\nelse:\n msg = f\"{type(df)} is not a supported type for dbt Python materialization\"\n raise Exception(msg)\n\nwriter = (\n df.write\n .mode(\"overwrite\")\n .option(\"overwriteSchema\", \"true\")\n{{ py_get_writer_options()|indent(8, True) }}\n)\n\nwriter.saveAsTable(\"{{ target_relation }}\")\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.py_try_import", "macro.dbt_databricks.py_get_writer_options"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "compiled_code", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250504.7670674, "supported_languages": null}, "macro.dbt_databricks.py_get_writer_options": {"name": "py_get_writer_options", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\python.sql", "original_file_path": "macros\\adapters\\python.sql", "unique_id": "macro.dbt_databricks.py_get_writer_options", "macro_sql": "\n\n{%- macro py_get_writer_options() -%}\n{%- set location_root = config.get('location_root', validator=validation.any[basestring]) -%}\n{%- set file_format = config.get('file_format', validator=validation.any[basestring])|default('delta', true) -%}\n{%- set partition_by = config.get('partition_by', validator=validation.any[list, basestring]) -%}\n{%- set liquid_clustered_by = config.get('liquid_clustered_by', validator=validation.any[list, basestring]) -%}\n{%- set clustered_by = config.get('clustered_by', validator=validation.any[list, basestring]) -%}\n{%- set buckets = config.get('buckets', validator=validation.any[int]) -%}\n.format(\"{{ file_format }}\")\n{%- if location_root is not none %}\n{%- set model_path = adapter.compute_external_path(config, model, is_incremental()) %}\n.option(\"path\", \"{{ model_path }}\")\n{%- endif -%}\n{%- if partition_by is not none -%}\n {%- if partition_by is string -%}\n {%- set partition_by = [partition_by] -%}\n {%- endif %}\n.partitionBy({{ partition_by }})\n{%- endif -%}\n{%- if liquid_clustered_by and not is_incremental() -%}\n {%- if liquid_clustered_by is string -%}\n {%- set liquid_clustered_by = [liquid_clustered_by] -%}\n {%- endif %}\n.clusterBy({{ liquid_clustered_by }})\n{%- endif -%}\n{%- if (clustered_by is not none) and (buckets is not none) -%}\n {%- if clustered_by is string -%}\n {%- set clustered_by = [clustered_by] -%}\n {%- endif %}\n.bucketBy({{ buckets }}, {{ clustered_by }})\n{%- endif -%}\n{% endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.is_incremental"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250504.7700667, "supported_languages": null}, "macro.dbt_databricks.py_try_import": {"name": "py_try_import", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\python.sql", "original_file_path": "macros\\adapters\\python.sql", "unique_id": "macro.dbt_databricks.py_try_import", "macro_sql": "{% macro py_try_import(library, var_name) -%}\n# make sure {{ library }} exists before using it\ntry:\n import {{ library }}\n {{ var_name }} = True\nexcept ImportError:\n {{ var_name }} = False\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "library", "type": null, "description": ""}, {"name": "var_name", "type": null, "description": ""}], "created_at": 1785250504.7700667, "supported_languages": null}, "macro.dbt_databricks.create_python_intermediate_table": {"name": "create_python_intermediate_table", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\python.sql", "original_file_path": "macros\\adapters\\python.sql", "unique_id": "macro.dbt_databricks.create_python_intermediate_table", "macro_sql": "{% macro create_python_intermediate_table(relation, compiled_code) %}\n{{ compiled_code }}\n\n{%- set location_root = config.get('location_root', validator=validation.any[basestring]) -%}\n{%- set file_format = config.get('file_format', validator=validation.any[basestring])|default('delta', true) -%}\n\n# --- Autogenerated dbt materialization code. --- #\ndbt = dbtObj(spark.table)\ndf = model(dbt, spark)\n\nimport pyspark\n\n{{ py_try_import('pyspark.sql.connect.dataframe', 'newer_pyspark_available') }}\n{{ py_try_import('pandas', 'pandas_available') }}\n{{ py_try_import('pyspark.pandas', 'pyspark_pandas_api_available') }}\n{{ py_try_import('databricks.koalas', 'koalas_available') }}\n\n# preferentially convert pandas DataFrames to pandas-on-Spark or Koalas DataFrames first\n# since they know how to convert pandas DataFrames better than `spark.createDataFrame(df)`\n# and converting from pandas-on-Spark to Spark DataFrame has no overhead\n\nif pandas_available and isinstance(df, pandas.core.frame.DataFrame):\n if pyspark_pandas_api_available:\n df = pyspark.pandas.frame.DataFrame(df)\n elif koalas_available:\n df = databricks.koalas.frame.DataFrame(df)\n\n# convert to pyspark.sql.dataframe.DataFrame\nif isinstance(df, pyspark.sql.dataframe.DataFrame):\n pass # since it is already a Spark DataFrame\nelif newer_pyspark_available and isinstance(df, pyspark.sql.connect.dataframe.DataFrame):\n pass # since it is already a Spark DataFrame\nelif pyspark_pandas_api_available and isinstance(df, pyspark.pandas.frame.DataFrame):\n df = df.to_spark()\nelif koalas_available and isinstance(df, databricks.koalas.frame.DataFrame):\n df = df.to_spark()\nelif pandas_available and isinstance(df, pandas.core.frame.DataFrame):\n df = spark.createDataFrame(df)\nelse:\n msg = f\"{type(df)} is not a supported type for dbt Python materialization\"\n raise Exception(msg)\n\nwriter = (\n df.write\n .mode(\"overwrite\")\n .option(\"overwriteSchema\", \"true\")\n .format(\"{{ file_format }}\")\n{%- if location_root is not none -%}\n{%- set model_path = adapter.compute_external_path(config, model, True) %}\n .option(\"path\", \"{{ model_path }}\")\n{%- endif -%}\n)\n\nwriter.saveAsTable(\"{{ relation.render() }}\")\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.py_try_import"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "compiled_code", "type": null, "description": ""}], "created_at": 1785250504.772071, "supported_languages": null}, "macro.dbt_databricks.make_staging_relation": {"name": "make_staging_relation", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt_databricks.make_staging_relation", "macro_sql": "{% macro make_staging_relation(base_relation, suffix='__dbt_stg', type='table') %}\n {% set unique_tmp_table_suffix = config.get('unique_tmp_table_suffix', False) | as_bool %}\n {% if unique_tmp_table_suffix %}\n {% set suffix = adapter.generate_unique_temporary_table_suffix(suffix) %}\n {% endif %}\n {% set stg_identifier = base_relation.identifier ~ suffix %}\n {% set stg_relation = api.Relation.create(database=base_relation.database, schema=base_relation.schema, identifier=stg_identifier, type=type) %}\n {% do return(stg_relation) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "base_relation", "type": null, "description": ""}, {"name": "suffix", "type": null, "description": ""}, {"name": "type", "type": null, "description": ""}], "created_at": 1785250504.775067, "supported_languages": null}, "macro.dbt_databricks.databricks__make_intermediate_relation": {"name": "databricks__make_intermediate_relation", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt_databricks.databricks__make_intermediate_relation", "macro_sql": "{% macro databricks__make_intermediate_relation(base_relation, suffix) %}\n {{ return(databricks__make_temp_relation(base_relation, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__make_temp_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "base_relation", "type": null, "description": ""}, {"name": "suffix", "type": null, "description": ""}], "created_at": 1785250504.775067, "supported_languages": null}, "macro.dbt_databricks.databricks__make_temp_relation": {"name": "databricks__make_temp_relation", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt_databricks.databricks__make_temp_relation", "macro_sql": "{% macro databricks__make_temp_relation(base_relation, suffix='__dbt_tmp') %}\n {% set unique_tmp_table_suffix = config.get('unique_tmp_table_suffix', False) | as_bool %}\n\n {% if unique_tmp_table_suffix %}\n {% set suffix = adapter.generate_unique_temporary_table_suffix() %}\n {% endif %}\n \n {% if suffix == '__dbt_tmp' and model.batch %}\n {% set suffix = suffix ~ '_' ~ model.batch.id %}\n {% endif %}\n\n {% set tmp_identifier = base_relation.identifier ~ suffix %}\n {% set language = model['language'] %}\n {%- if language == 'sql' -%}\n {% set temporary = not base_relation.is_hive_metastore() %}\n {% set tmp_relation = api.Relation.create(identifier=tmp_identifier, type='view', temporary=temporary) %}\n {%- else -%}\n {% set tmp_relation = api.Relation.create(database=base_relation.database, schema=base_relation.schema, identifier=tmp_identifier, type='table') %}\n {%- endif -%}\n {% do return(tmp_relation) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "base_relation", "type": null, "description": ""}, {"name": "suffix", "type": null, "description": ""}], "created_at": 1785250504.7770648, "supported_languages": null}, "macro.dbt_databricks.databricks__get_or_create_relation": {"name": "databricks__get_or_create_relation", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt_databricks.databricks__get_or_create_relation", "macro_sql": "{% macro databricks__get_or_create_relation(database, schema, identifier, type, needs_information=False) %}\n {%- set target_relation = adapter.get_relation(\n database=database,\n schema=schema,\n identifier=identifier,\n needs_information=needs_information) %}\n\n {% if target_relation %}\n {% do return([true, target_relation]) %}\n {% endif %}\n\n {%- set new_relation = api.Relation.create(\n database=database,\n schema=schema,\n identifier=identifier,\n type=type,\n temporary=False\n ) -%}\n {% do return([false, new_relation]) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "database", "type": null, "description": ""}, {"name": "schema", "type": null, "description": ""}, {"name": "identifier", "type": null, "description": ""}, {"name": "type", "type": null, "description": ""}, {"name": "needs_information", "type": null, "description": ""}], "created_at": 1785250504.7780678, "supported_languages": null}, "macro.dbt_databricks.get_column_and_constraints_sql": {"name": "get_column_and_constraints_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt_databricks.get_column_and_constraints_sql", "macro_sql": "{% macro get_column_and_constraints_sql(relation, columns) %}\n (\n {% for column in columns %}\n {{ column.render_for_create() }}{% if not loop.last or relation.create_constraints %},{% endif %}\n {% endfor %}\n {% if relation.create_constraints %}\n {{ relation.render_constraints_for_create() }}\n {% endif %}\n )\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "columns", "type": null, "description": ""}], "created_at": 1785250504.7790673, "supported_languages": null}, "macro.dbt_databricks.load_relation_with_metadata": {"name": "load_relation_with_metadata", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt_databricks.load_relation_with_metadata", "macro_sql": "{% macro load_relation_with_metadata(relation) %}\n {% do return(adapter.get_relation(\n database=relation.database,\n schema=relation.schema,\n identifier=relation.identifier,\n needs_information=True\n )) -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.7800756, "supported_languages": null}, "macro.dbt_databricks.statement_with_staging_table": {"name": "statement_with_staging_table", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\etc\\statement.sql", "original_file_path": "macros\\etc\\statement.sql", "unique_id": "macro.dbt_databricks.statement_with_staging_table", "macro_sql": "{% macro statement_with_staging_table(name=None, staging_table=None, fetch_result=False, auto_begin=True) -%}\n {%- if execute: -%}\n {%- set sql = caller() -%}\n\n {%- if name == 'main' -%}\n {{ log('Writing runtime SQL for node \"{}\"'.format(model['unique_id'])) }}\n {{ write(sql) }}\n {%- endif -%}\n\n {%- set res, table = adapter.execute(sql, auto_begin=auto_begin, fetch=fetch_result, staging_table=staging_table) -%}\n {%- if name is not none -%}\n {{ store_result(name, response=res, agate_table=table) }}\n {%- endif -%}\n\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "name", "type": null, "description": ""}, {"name": "staging_table", "type": null, "description": ""}, {"name": "fetch_result", "type": null, "description": ""}, {"name": "auto_begin", "type": null, "description": ""}], "created_at": 1785250504.7820754, "supported_languages": null}, "macro.dbt_databricks.execute_multiple_statements": {"name": "execute_multiple_statements", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\etc\\statement.sql", "original_file_path": "macros\\etc\\statement.sql", "unique_id": "macro.dbt_databricks.execute_multiple_statements", "macro_sql": "{% macro execute_multiple_statements(statements) %}\n {%- if statements is string %}\n {% call statement(name=\"main\") %}\n {{ statements }}\n {% endcall %}\n {%- else %}\n {%- for sql in statements %}\n {% call statement(name=\"main\") %}\n {{ sql }}\n {% endcall %}\n {% endfor %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "statements", "type": null, "description": ""}], "created_at": 1785250504.7830753, "supported_languages": null}, "macro.dbt_databricks.run_query_as": {"name": "run_query_as", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\etc\\statement.sql", "original_file_path": "macros\\etc\\statement.sql", "unique_id": "macro.dbt_databricks.run_query_as", "macro_sql": "{% macro run_query_as(sql, name, fetch_result=True) %}\n {% call statement(name, fetch_result, auto_begin=False) %}\n {{ sql }}\n {% endcall %}\n\n {% if fetch_result %}\n {{ return(load_result(name).table) }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}, {"name": "name", "type": null, "description": ""}, {"name": "fetch_result", "type": null, "description": ""}], "created_at": 1785250504.7830753, "supported_languages": null}, "macro.dbt_databricks.databricks__generate_database_name": {"name": "databricks__generate_database_name", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\get_custom_name\\get_custom_database.sql", "original_file_path": "macros\\get_custom_name\\get_custom_database.sql", "unique_id": "macro.dbt_databricks.databricks__generate_database_name", "macro_sql": "{% macro databricks__generate_database_name(custom_database_name=none, node=none) -%}\n {%- set default_database = target.database -%}\n {%- if custom_database_name is none -%}\n {{ return(default_database) }}\n {%- else -%}\n {{ return(custom_database_name) }}\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "custom_database_name", "type": null, "description": ""}, {"name": "node", "type": null, "description": ""}], "created_at": 1785250504.7840757, "supported_languages": null}, "macro.dbt_databricks.run_pre_hooks": {"name": "run_pre_hooks", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\hooks.sql", "original_file_path": "macros\\materializations\\hooks.sql", "unique_id": "macro.dbt_databricks.run_pre_hooks", "macro_sql": "{% macro run_pre_hooks() %}\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_hooks"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250504.7850754, "supported_languages": null}, "macro.dbt_databricks.run_post_hooks": {"name": "run_post_hooks", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\hooks.sql", "original_file_path": "macros\\materializations\\hooks.sql", "unique_id": "macro.dbt_databricks.run_post_hooks", "macro_sql": "{% macro run_post_hooks() %}\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_hooks"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250504.7850754, "supported_languages": null}, "macro.dbt_databricks.materialization_materialized_view_databricks": {"name": "materialization_materialized_view_databricks", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\materialized_view.sql", "original_file_path": "macros\\materializations\\materialized_view.sql", "unique_id": "macro.dbt_databricks.materialization_materialized_view_databricks", "macro_sql": "{% materialization materialized_view, adapter = 'databricks' %}\n {% set existing_relation = load_cached_relation(this) %}\n {% set target_relation = this.incorporate(type=this.MaterializedView) %}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n {% set build_sql = materialized_view_get_build_sql(existing_relation, target_relation) %}\n\n {% if build_sql == '' %}\n {{ execute_no_op(target_relation) }}\n {% else %}\n {{ materialized_view_execute_build_sql(build_sql, existing_relation, target_relation, post_hooks) }}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.run_hooks", "macro.dbt_databricks.materialized_view_get_build_sql", "macro.dbt_databricks.execute_no_op", "macro.dbt_databricks.materialized_view_execute_build_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250504.7880769, "supported_languages": ["sql"]}, "macro.dbt_databricks.materialized_view_get_build_sql": {"name": "materialized_view_get_build_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\materialized_view.sql", "original_file_path": "macros\\materializations\\materialized_view.sql", "unique_id": "macro.dbt_databricks.materialized_view_get_build_sql", "macro_sql": "{% macro materialized_view_get_build_sql(existing_relation, target_relation) %}\n {% set sql = adapter.clean_sql(sql) %}\n\n {% set full_refresh_mode = should_full_refresh() %}\n\n -- determine the scenario we're in: create, full_refresh, alter, refresh data\n {% if existing_relation is none %}\n {% set build_sql = get_create_materialized_view_as_sql(target_relation, sql) %}\n {% elif full_refresh_mode or not existing_relation.is_materialized_view %}\n {% set build_sql = get_replace_sql(existing_relation, target_relation, sql) %}\n {% else %}\n\n -- get config options\n {% set on_configuration_change = config.get('on_configuration_change') %}\n {% set configuration_changes = get_configuration_changes(existing_relation) %}\n\n {% if configuration_changes is none %}\n {% set build_sql = refresh_materialized_view(target_relation) %}\n\n {% elif on_configuration_change == 'apply' %}\n {% set build_sql = get_alter_materialized_view_as_sql(target_relation, configuration_changes, sql, existing_relation, None, None) %}\n {% elif on_configuration_change == 'continue' %}\n {% set build_sql = \"\" %}\n {{ exceptions.warn(\"Configuration changes were identified and `on_configuration_change` was set to `continue` for `\" ~ target_relation ~ \"`\") }}\n {% elif on_configuration_change == 'fail' %}\n {{ exceptions.raise_fail_fast_error(\"Configuration changes were identified and `on_configuration_change` was set to `fail` for `\" ~ target_relation ~ \"`\") }}\n\n {% else %}\n -- this only happens if the user provides a value other than `apply`, 'skip', 'fail'\n {{ exceptions.raise_compiler_error(\"Unexpected configuration scenario\") }}\n\n {% endif %}\n\n {% endif %}\n\n {% do return(build_sql) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.should_full_refresh", "macro.dbt.get_create_materialized_view_as_sql", "macro.dbt_databricks.get_replace_sql", "macro.dbt_databricks.get_configuration_changes", "macro.dbt.refresh_materialized_view", "macro.dbt_databricks.get_alter_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250504.7910779, "supported_languages": null}, "macro.dbt_databricks.materialized_view_execute_build_sql": {"name": "materialized_view_execute_build_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\materialized_view.sql", "original_file_path": "macros\\materializations\\materialized_view.sql", "unique_id": "macro.dbt_databricks.materialized_view_execute_build_sql", "macro_sql": "{% macro materialized_view_execute_build_sql(build_sql, existing_relation, target_relation, post_hooks) %}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n {% set grant_config = config.get('grants') %}\n\n {{ execute_multiple_statements(build_sql) }}\n\n {% set column_tags = adapter.get_column_tags_from_model(config.model) %}\n {% if column_tags %}\n {{ apply_column_tags(target_relation, column_tags) }}\n {% endif %}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_hooks", "macro.dbt_databricks.execute_multiple_statements", "macro.dbt_databricks.apply_column_tags", "macro.dbt.should_revoke", "macro.dbt.apply_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "build_sql", "type": null, "description": ""}, {"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "post_hooks", "type": null, "description": ""}], "created_at": 1785250504.7920837, "supported_languages": null}, "macro.dbt_databricks.materialization_snapshot_databricks": {"name": "materialization_snapshot_databricks", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\snapshot.sql", "original_file_path": "macros\\materializations\\snapshot.sql", "unique_id": "macro.dbt_databricks.materialization_snapshot_databricks", "macro_sql": "{% materialization snapshot, adapter='databricks' %}\n {%- set target_table = model.get('alias', model.get('name')) -%}\n {% set sql = adapter.clean_sql(sql) %}\n {%- set strategy_name = config.get('strategy') -%}\n {%- set unique_key = config.get('unique_key') %}\n {%- set file_format = config.get('file_format', 'delta') -%}\n {%- set grant_config = config.get('grants') -%}\n\n {% set target_relation_exists, target_relation = databricks__get_or_create_relation(\n database=model.database,\n schema=model.schema,\n identifier=target_table,\n type='table',\n needs_information=True) -%}\n\n {%- if file_format not in ['delta', 'hudi'] -%}\n {% set invalid_format_msg -%}\n Invalid file format: {{ file_format }}\n Snapshot functionality requires file_format be set to 'delta' or 'hudi'\n {%- endset %}\n {% do exceptions.raise_compiler_error(invalid_format_msg) %}\n {% endif %}\n\n {%- if target_relation_exists -%}\n {%- if not target_relation.is_delta and not target_relation.is_hudi -%}\n {% set invalid_format_msg -%}\n The existing table {{ model.schema }}.{{ target_table }} is in another format than 'delta' or 'hudi'\n {%- endset %}\n {% do exceptions.raise_compiler_error(invalid_format_msg) %}\n {% endif %}\n {% endif %}\n\n {%- if not target_relation.is_table -%}\n {% do exceptions.relation_wrong_type(target_relation, 'table') %}\n {%- endif -%}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n {% set strategy_macro = strategy_dispatch(strategy_name) %}\n {% set strategy = strategy_macro(model, \"snapshotted_data\", \"source_data\", model['config'], target_relation_exists) %}\n\n {% if not target_relation_exists %}\n\n {% set build_sql = build_snapshot_table(strategy, adapter.clean_sql(model['compiled_code'])) %}\n {% set build_or_select_sql = build_sql %}\n {% set final_sql = create_table_as(False, target_relation, build_sql) %}\n\n {% else %}\n\n {% set columns = config.get(\"snapshot_table_column_names\") or get_snapshot_table_column_names() %}\n\n {{ adapter.assert_valid_snapshot_target_given_strategy(target_relation, columns, strategy) }}\n\n {% set build_or_select_sql = snapshot_staging_table(strategy, sql, target_relation) %}\n {% set staging_table = build_snapshot_staging_table(strategy, sql, target_relation) %}\n\n -- this may no-op if the database does not require column expansion\n {% do adapter.expand_target_column_types(from_relation=staging_table,\n to_relation=target_relation) %}\n\n {% set remove_columns = ['dbt_change_type', 'DBT_CHANGE_TYPE', 'dbt_unique_key', 'DBT_UNIQUE_KEY'] %}\n {% if unique_key | is_list %}\n {% for key in strategy.unique_key %}\n {{ remove_columns.append('dbt_unique_key_' + loop.index|string) }}\n {{ remove_columns.append('DBT_UNIQUE_KEY_' + loop.index|string) }}\n {% endfor %}\n {% endif %}\n\n {% set missing_columns = adapter.get_missing_columns(staging_table, target_relation)\n | rejectattr('name', 'in', remove_columns)\n | list %}\n\n {% do create_columns(target_relation, missing_columns) %}\n\n {% set source_columns = adapter.get_columns_in_relation(staging_table)\n | rejectattr('name', 'in', remove_columns)\n | list %}\n\n {% set quoted_source_columns = [] %}\n {% for column in source_columns %}\n {% do quoted_source_columns.append(adapter.quote(column.name)) %}\n {% endfor %}\n\n {% set final_sql = snapshot_merge_sql(\n target = target_relation,\n source = staging_table,\n insert_cols = quoted_source_columns\n )\n %}\n\n {% endif %}\n\n\n {{ check_time_data_types(build_or_select_sql) }}\n\n {% call statement('main') %}\n {{ final_sql }}\n {% endcall %}\n\n {% set should_revoke = should_revoke(target_relation_exists, full_refresh_mode=False) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {% if not target_relation_exists %}\n {% do create_indexes(target_relation) %}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n {{ adapter.commit() }}\n\n {% if staging_table is defined %}\n {% do post_snapshot(staging_table) %}\n {% endif %}\n\n {% do persist_constraints(target_relation, model) %}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_or_create_relation", "macro.dbt.run_hooks", "macro.dbt.strategy_dispatch", "macro.dbt.build_snapshot_table", "macro.dbt.create_table_as", "macro.dbt.get_snapshot_table_column_names", "macro.dbt.snapshot_staging_table", "macro.dbt.build_snapshot_staging_table", "macro.dbt.create_columns", "macro.dbt.snapshot_merge_sql", "macro.dbt.check_time_data_types", "macro.dbt.statement", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs", "macro.dbt.create_indexes", "macro.dbt.post_snapshot", "macro.dbt_databricks.persist_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250504.8025928, "supported_languages": ["sql"]}, "macro.dbt_databricks.materialization_streaming_table_databricks": {"name": "materialization_streaming_table_databricks", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\streaming_table.sql", "original_file_path": "macros\\materializations\\streaming_table.sql", "unique_id": "macro.dbt_databricks.materialization_streaming_table_databricks", "macro_sql": "{% materialization streaming_table, adapter='databricks' %}\n {% set existing_relation = load_cached_relation(this) %}\n {% set target_relation = this.incorporate(type=this.StreamingTable) %}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n{% set build_sql = streaming_table_get_build_sql(existing_relation, target_relation) %}\n\n {% if build_sql == '' %}\n {{ execute_no_op(target_relation) }}\n {% else %}\n {{ streaming_table_execute_build_sql(build_sql, existing_relation, target_relation, post_hooks) }}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.run_hooks", "macro.dbt_databricks.streaming_table_get_build_sql", "macro.dbt_databricks.execute_no_op", "macro.dbt_databricks.streaming_table_execute_build_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250504.8055913, "supported_languages": ["sql"]}, "macro.dbt_databricks.streaming_table_get_build_sql": {"name": "streaming_table_get_build_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\streaming_table.sql", "original_file_path": "macros\\materializations\\streaming_table.sql", "unique_id": "macro.dbt_databricks.streaming_table_get_build_sql", "macro_sql": "{% macro streaming_table_get_build_sql(existing_relation, target_relation) %}\n {% set sql = adapter.clean_sql(sql) %}\n\n {% set full_refresh_mode = should_full_refresh() %}\n\n -- determine the scenario we're in: create, full_refresh, alter, refresh data\n {% if existing_relation is none %}\n {% set build_sql = get_create_streaming_table_as_sql(target_relation, sql) %}\n {% elif full_refresh_mode or not existing_relation.is_streaming_table %}\n {% set build_sql = get_replace_sql(existing_relation, target_relation, sql) %}\n {% else %}\n\n -- get config options\n {% set on_configuration_change = config.get('on_configuration_change') %}\n {% set configuration_changes = get_configuration_changes(existing_relation) %}\n {% if configuration_changes is none %}\n {% set build_sql = refresh_streaming_table(target_relation, sql) %}\n\n {% elif on_configuration_change == 'apply' %}\n {% set build_sql = get_alter_streaming_table_as_sql(target_relation, configuration_changes, sql, existing_relation, None, None) %}\n {% elif on_configuration_change == 'continue' %}\n {% set build_sql = \"\" %}\n {{ exceptions.warn(\"Configuration changes were identified and `on_configuration_change` was set to `continue` for `\" ~ target_relation ~ \"`\") }}\n {% elif on_configuration_change == 'fail' %}\n {{ exceptions.raise_fail_fast_error(\"Configuration changes were identified and `on_configuration_change` was set to `fail` for `\" ~ target_relation ~ \"`\") }}\n\n {% else %}\n -- this only happens if the user provides a value other than `apply`, 'skip', 'fail'\n {{ exceptions.raise_compiler_error(\"Unexpected configuration scenario\") }}\n\n {% endif %}\n\n {% endif %}\n\n {% do return(build_sql) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.should_full_refresh", "macro.dbt_databricks.get_create_streaming_table_as_sql", "macro.dbt_databricks.get_replace_sql", "macro.dbt_databricks.get_configuration_changes", "macro.dbt_databricks.refresh_streaming_table", "macro.dbt_databricks.get_alter_streaming_table_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250504.8075972, "supported_languages": null}, "macro.dbt_databricks.streaming_table_execute_build_sql": {"name": "streaming_table_execute_build_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\streaming_table.sql", "original_file_path": "macros\\materializations\\streaming_table.sql", "unique_id": "macro.dbt_databricks.streaming_table_execute_build_sql", "macro_sql": "{% macro streaming_table_execute_build_sql(build_sql, existing_relation, target_relation, post_hooks) %}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n {% set grant_config = config.get('grants') %}\n\n {{ execute_multiple_statements(build_sql) }}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% set column_tags = adapter.get_column_tags_from_model(config.model) %}\n {% if column_tags and column_tags.set_column_tags %}\n {{ apply_column_tags(target_relation, column_tags) }}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_hooks", "macro.dbt_databricks.execute_multiple_statements", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt_databricks.apply_column_tags"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "build_sql", "type": null, "description": ""}, {"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "post_hooks", "type": null, "description": ""}], "created_at": 1785250504.8095942, "supported_languages": null}, "macro.dbt_databricks.materialization_table_databricks": {"name": "materialization_table_databricks", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\table.sql", "original_file_path": "macros\\materializations\\table.sql", "unique_id": "macro.dbt_databricks.materialization_table_databricks", "macro_sql": "{% materialization table, adapter = 'databricks', supported_languages=['sql', 'python'] %}\n {{ log(\"MATERIALIZING TABLE\") }}\n {%- set language = model['language'] -%}\n {%- set identifier = model['alias'] -%}\n {%- set grant_config = config.get('grants') -%}\n {%- set tblproperties = config.get('tblproperties') -%}\n {%- set tags = config.get('databricks_tags') -%}\n {%- set safe_create = config.get('use_safer_relation_operations', False) %}\n {% set existing_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier, needs_information=True) %}\n {% set target_relation = this.incorporate(type='table') %}\n {% set compiled_code = adapter.clean_sql(compiled_code) %}\n\n {% if adapter.behavior.use_materialization_v2 %}\n {% set intermediate_relation = make_intermediate_relation(target_relation) %}\n {% set staging_relation = make_staging_relation(target_relation) %}\n\n {{ run_pre_hooks() }}\n \n {% call statement('main', language=language) %}\n {{ get_create_intermediate_table(intermediate_relation, compiled_code, language) }}\n {% endcall %}\n {% if not existing_relation %}\n {{ create_table_at(target_relation, intermediate_relation, compiled_code) }}\n {% else %}\n {% if safe_create and existing_relation.can_be_renamed %}\n {{ safe_relation_replace(existing_relation, staging_relation, intermediate_relation, compiled_code) }}\n {% else %}\n {% if existing_relation and (existing_relation.type != 'table' or not (existing_relation.can_be_replaced and config.get('file_format', default='delta') == 'delta')) -%}\n {{ adapter.drop_relation(existing_relation) }}\n {%- endif %}\n {{ create_table_at(target_relation, intermediate_relation, compiled_code) }}\n {% endif %}\n {% endif %}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {{ apply_grants(target_relation, grant_config, should_revoke) }}\n\n {% if language == 'python' %}\n {{ drop_relation_if_exists(intermediate_relation) }}\n {% endif %}\n \n {{ run_post_hooks() }}\n {% else %}\n {{ run_hooks(pre_hooks) }}\n -- setup: if the target relation already exists, drop it\n -- in case if the existing and future table is delta, we want to do a\n -- create or replace table instead of dropping, so we don't have the table unavailable\n {% if existing_relation and (existing_relation.type != 'table' or not (existing_relation.can_be_replaced and config.get('file_format', default='delta') == 'delta')) -%}\n {{ adapter.drop_relation(existing_relation) }}\n {%- endif %}\n\n -- build model\n\n {%- call statement('main', language=language) -%}\n {{ create_table_as(False, target_relation, compiled_code, language) }}\n {%- endcall -%}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke) %}\n {% if language==\"python\" %}\n {% do apply_tblproperties(target_relation, tblproperties) %}\n {% endif %}\n {%- do apply_tags(target_relation, tags) -%}\n\n {% do persist_docs(target_relation, model, for_relation=language=='python') %}\n\n {% do persist_constraints(target_relation, model) %}\n\n {% do optimize(target_relation) %}\n\n {{ run_hooks(post_hooks) }}\n\n {% endif %}\n {{ return({'relations': [target_relation]})}}\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.make_intermediate_relation", "macro.dbt_databricks.make_staging_relation", "macro.dbt_databricks.run_pre_hooks", "macro.dbt.statement", "macro.dbt_databricks.get_create_intermediate_table", "macro.dbt_databricks.create_table_at", "macro.dbt_databricks.safe_relation_replace", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.drop_relation_if_exists", "macro.dbt_databricks.run_post_hooks", "macro.dbt.run_hooks", "macro.dbt.create_table_as", "macro.dbt_databricks.apply_tblproperties", "macro.dbt_databricks.apply_tags", "macro.dbt.persist_docs", "macro.dbt_databricks.persist_constraints", "macro.dbt_databricks.optimize"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250504.8175883, "supported_languages": ["sql", "python"]}, "macro.dbt_databricks.materialization_view_databricks": {"name": "materialization_view_databricks", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\view.sql", "original_file_path": "macros\\materializations\\view.sql", "unique_id": "macro.dbt_databricks.materialization_view_databricks", "macro_sql": "{% materialization view, adapter='databricks' -%}\n {{ log(\"MATERIALIZING VIEW\") }}\n {%- set existing_relation = load_relation_with_metadata(this) -%}\n {%- set target_relation = this.incorporate(type='view') -%}\n {% set grant_config = config.get('grants') %}\n {% set tags = config.get('databricks_tags') %}\n {% set sql = adapter.clean_sql(sql) %}\n\n {% if adapter.behavior.use_materialization_v2 %}\n {{ run_pre_hooks() }}\n {% if existing_relation %}\n {% if relation_should_be_altered(existing_relation) %}\n {% set configuration_changes = get_configuration_changes(existing_relation) %}\n {% if configuration_changes and configuration_changes.changes %}\n {% if configuration_changes.requires_full_refresh %}\n {{ log('Using replace_with_view') }}\n {{ replace_with_view(existing_relation, target_relation) }}\n {% else %}\n {{ log('Using alter_view') }}\n {{ log(configuration_changes.changes) }}\n {{ alter_view(target_relation, configuration_changes.changes) }}\n {% endif %}\n {% else %}\n {{ execute_no_op(target_relation) }}\n {% endif %}\n {% else %}\n {{ replace_with_view(existing_relation, target_relation) }}\n {% endif %}\n {% else %}\n {% call statement('main') -%}\n {{ get_create_view_as_sql(target_relation, sql) }}\n {%- endcall %}\n {{ apply_tags(target_relation, tags) }}\n {% set column_tags = adapter.get_column_tags_from_model(config.model) %}\n {% if column_tags and column_tags.set_column_tags %}\n {{ apply_column_tags(target_relation, column_tags) }}\n {% endif %}\n {% endif %}\n {% set should_revoke = should_revoke(exists_as_view, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=True) %}\n\n {{ run_post_hooks() }}\n\n {% else %}\n {{ run_hooks(pre_hooks) }}\n\n -- If there's a table with the same name and we weren't told to full refresh,\n -- that's an error. If we were told to full refresh, drop it. This behavior differs\n -- for Snowflake and BigQuery, so multiple dispatch is used.\n {%- if existing_relation is not none and not existing_relation.is_view -%}\n {{ handle_existing_table(should_full_refresh(), existing_relation) }}\n {%- endif -%}\n\n -- build model\n {% call statement('main') -%}\n {{ get_create_view_as_sql(target_relation, sql) }}\n {%- endcall %}\n\n {% set should_revoke = should_revoke(exists_as_view, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=True) %}\n\n {%- do apply_tags(target_relation, tags) -%}\n\n {% set column_tags = adapter.get_column_tags_from_model(config.model) %}\n {% if column_tags and column_tags.set_column_tags %}\n {{ apply_column_tags(target_relation, column_tags) }}\n {% endif %}\n\n {{ run_hooks(post_hooks) }}\n {% endif %}\n\n {{ return({'relations': [target_relation]}) }}\n\n{%- endmaterialization %}", "depends_on": {"macros": ["macro.dbt_databricks.load_relation_with_metadata", "macro.dbt_databricks.run_pre_hooks", "macro.dbt_databricks.relation_should_be_altered", "macro.dbt_databricks.get_configuration_changes", "macro.dbt_databricks.replace_with_view", "macro.dbt_databricks.alter_view", "macro.dbt_databricks.execute_no_op", "macro.dbt.statement", "macro.dbt.get_create_view_as_sql", "macro.dbt_databricks.apply_tags", "macro.dbt_databricks.apply_column_tags", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt_databricks.run_post_hooks", "macro.dbt.run_hooks", "macro.dbt.handle_existing_table", "macro.dbt.should_full_refresh"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250504.823633, "supported_languages": ["sql"]}, "macro.dbt_databricks.replace_with_view": {"name": "replace_with_view", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\view.sql", "original_file_path": "macros\\materializations\\view.sql", "unique_id": "macro.dbt_databricks.replace_with_view", "macro_sql": "{% macro replace_with_view(existing_relation, target_relation) %}\n {% set sql = adapter.clean_sql(sql) %}\n {% set tags = config.get('databricks_tags') %}\n {{ execute_multiple_statements(get_replace_sql(existing_relation, target_relation, sql)) }}\n {%- do apply_tags(target_relation, tags) -%}\n \n {% set column_tags = adapter.get_column_tags_from_model(config.model) %}\n {% if column_tags and column_tags.set_column_tags %}\n {{ apply_column_tags(target_relation, column_tags) }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.execute_multiple_statements", "macro.dbt_databricks.get_replace_sql", "macro.dbt_databricks.apply_tags", "macro.dbt_databricks.apply_column_tags"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250504.8246324, "supported_languages": null}, "macro.dbt_databricks.relation_should_be_altered": {"name": "relation_should_be_altered", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\view.sql", "original_file_path": "macros\\materializations\\view.sql", "unique_id": "macro.dbt_databricks.relation_should_be_altered", "macro_sql": "{% macro relation_should_be_altered(existing_relation) %}\n {% set update_via_alter = config.get('view_update_via_alter', False) | as_bool %}\n {% if existing_relation.is_view and update_via_alter %}\n {% if existing_relation.is_hive_metastore() %}\n {{ exceptions.raise_compiler_error(\"Cannot update a view in the Hive metastore via ALTER VIEW. Please set `view_update_via_alter: false` in your model configuration.\") }}\n {% endif %}\n {{ return(True) }}\n {% endif %}\n {{ return(False) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}], "created_at": 1785250504.8256912, "supported_languages": null}, "macro.dbt_databricks.databricks__can_clone_table": {"name": "databricks__can_clone_table", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\clone\\clone.sql", "original_file_path": "macros\\materializations\\clone\\clone.sql", "unique_id": "macro.dbt_databricks.databricks__can_clone_table", "macro_sql": "{% macro databricks__can_clone_table() %}\n {{ return(True) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250504.8266783, "supported_languages": null}, "macro.dbt_databricks.materialization_clone_databricks": {"name": "materialization_clone_databricks", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\clone\\clone.sql", "original_file_path": "macros\\materializations\\clone\\clone.sql", "unique_id": "macro.dbt_databricks.materialization_clone_databricks", "macro_sql": "\n\n\n{%- materialization clone, adapter='databricks' -%}\n\n {%- set relations = {'relations': []} -%}\n\n {%- if not defer_relation -%}\n -- nothing to do\n {{ log(\"No relation found in state manifest for \" ~ model.unique_id, info=True) }}\n {{ return(relations) }}\n {%- endif -%}\n\n {%- set existing_relation = load_cached_relation(this) -%}\n\n {%- if existing_relation and not flags.FULL_REFRESH -%}\n -- noop!\n {{ log(\"Relation \" ~ existing_relation ~ \" already exists\", info=True) }}\n {{ return(relations) }}\n {%- endif -%}\n\n {%- set other_existing_relation = load_cached_relation(defer_relation) -%}\n {%- set file_format = config.get('file_format', validator=validation.any[basestring]) -%}\n\n -- If this is a database that can do zero-copy cloning of tables, and the other relation is a table, then this will be a table\n -- Otherwise, this will be a view\n\n {% set can_clone_table = can_clone_table() %}\n\n {%- if other_existing_relation and other_existing_relation.type == 'table' and can_clone_table -%}\n\n {%- set target_relation = this.incorporate(type='table') -%}\n {% if existing_relation is not none and not existing_relation.is_table %}\n {{ log(\"Dropping relation \" ~ existing_relation ~ \" because it is of type \" ~ existing_relation.type) }}\n {{ drop_relation_if_exists(existing_relation) }}\n {% endif %}\n\n -- as a general rule, data platforms that can clone tables can also do atomic 'create or replace'\n {% if other_existing_relation.is_external_table %}\n {% call statement('main') %}\n {{ create_or_replace_clone_external(target_relation, defer_relation) }}\n {% endcall %}\n {% else %}\n {% call statement('main') %}\n {{ create_or_replace_clone(target_relation, defer_relation) }}\n {% endcall %}\n {% endif %}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n {% do persist_docs(target_relation, model) %}\n\n {{ return({'relations': [target_relation]}) }}\n\n {%- else -%}\n\n {%- set target_relation = this.incorporate(type='view') -%}\n\n -- reuse the view materialization\n -- TODO: support actual dispatch for materialization macros\n -- Tracking ticket: https://github.com/dbt-labs/dbt-core/issues/7799\n {% set search_name = \"materialization_view_\" ~ adapter.type() %}\n {% if not search_name in context %}\n {% set search_name = \"materialization_view_default\" %}\n {% endif %}\n {% set materialization_macro = context[search_name] %}\n {% set relations = materialization_macro() %}\n {{ return(relations) }}\n {% endif %}\n\n{%- endmaterialization -%}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.can_clone_table", "macro.dbt.drop_relation_if_exists", "macro.dbt.statement", "macro.dbt_databricks.create_or_replace_clone_external", "macro.dbt.create_or_replace_clone", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250504.8316855, "supported_languages": ["sql"]}, "macro.dbt_databricks.databricks__create_or_replace_clone": {"name": "databricks__create_or_replace_clone", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\clone\\strategies.sql", "original_file_path": "macros\\materializations\\clone\\strategies.sql", "unique_id": "macro.dbt_databricks.databricks__create_or_replace_clone", "macro_sql": "{% macro databricks__create_or_replace_clone(this_relation, defer_relation) %}\n create or replace\n table {{ this_relation.render() }}\n shallow clone {{ defer_relation.render() }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "this_relation", "type": null, "description": ""}, {"name": "defer_relation", "type": null, "description": ""}], "created_at": 1785250504.8326821, "supported_languages": null}, "macro.dbt_databricks.create_or_replace_clone_external": {"name": "create_or_replace_clone_external", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\clone\\strategies.sql", "original_file_path": "macros\\materializations\\clone\\strategies.sql", "unique_id": "macro.dbt_databricks.create_or_replace_clone_external", "macro_sql": "{% macro create_or_replace_clone_external(this_relation, defer_relation) %}\n\n {%- set catalog_relation = adapter.build_catalog_relation(config.model) -%}\n\n create or replace\n table {{ this_relation.render() }}\n shallow clone {{ defer_relation.render() }}\n {{ location_clause(catalog_relation) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.location_clause"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "this_relation", "type": null, "description": ""}, {"name": "defer_relation", "type": null, "description": ""}], "created_at": 1785250504.8326821, "supported_languages": null}, "macro.dbt_databricks.materialization_incremental_databricks": {"name": "materialization_incremental_databricks", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\incremental.sql", "original_file_path": "macros\\materializations\\incremental\\incremental.sql", "unique_id": "macro.dbt_databricks.materialization_incremental_databricks", "macro_sql": "{% materialization incremental, adapter='databricks', supported_languages=['sql', 'python'] -%}\n {{ log(\"MATERIALIZING INCREMENTAL\") }}\n\n {%- set catalog_relation = adapter.build_catalog_relation(config.model) -%}\n\n {% set existing_relation = load_relation_with_metadata(this) %}\n {% set target_relation = this.incorporate(type='table') %}\n {% set incremental_strategy = get_incremental_strategy(catalog_relation.file_format) %}\n {% set grant_config = config.get('grants') %}\n {% set full_refresh = should_full_refresh() %}\n {% set partition_by = config.get('partition_by') %}\n {% set language = model['language'] %}\n {% set on_schema_change = incremental_validate_on_schema_change(config.get('on_schema_change'), default='ignore') %}\n {% set is_delta = (catalog_relation.file_format == 'delta' and existing_relation.is_delta) %}\n {% set compiled_code = adapter.clean_sql(model['compiled_code']) %}\n\n {% if adapter.behavior.use_materialization_v2 %}\n {{ log(\"USING V2 MATERIALIZATION\") }}\n {#-- Set vars --#}\n {% set safe_create = config.get('use_safer_relation_operations', False) | as_bool %}\n {{ log(\"Safe create: \" ~ safe_create) }}\n {% set should_replace = existing_relation.is_dlt or existing_relation.is_view or full_refresh %}\n {% set is_replaceable = existing_relation.can_be_replaced and is_delta and config.get(\"location_root\") %}\n\n {% set intermediate_relation = make_intermediate_relation(target_relation) %}\n {% set staging_relation = make_staging_relation(target_relation) %}\n\n {{ run_pre_hooks() }}\n\n {% call statement('main', language=language) %}\n {{ get_create_intermediate_table(intermediate_relation, compiled_code, language) }}\n {% endcall %}\n\n {#-- Incremental run logic --#}\n {%- if existing_relation is none -%}\n {{ log(\"No existing relation found\") }}\n {{ create_table_at(target_relation, intermediate_relation, compiled_code) }}\n {%- elif should_replace -%}\n {{ log(\"Existing relation found that requires replacement\") }}\n {% if safe_create and existing_relation.can_be_renamed %}\n {{ log(\"Safe create enabled and relation can be renamed\") }}\n {{ safe_relation_replace(existing_relation, staging_relation, intermediate_relation, compiled_code) }}\n {% else %}\n {#-- Relation must be dropped & recreated --#}\n {% if not is_replaceable %} {#-- If Delta, we will `create or replace` below, so no need to drop --#}\n {{ log(\"Dropping existing relation, as it is not replaceable\") }}\n {% do adapter.drop_relation(existing_relation) %}\n {% endif %}\n {{ log(\"Replacing target relation\") }}\n {{ create_table_at(target_relation, intermediate_relation, compiled_code) }}\n {% endif %}\n {%- else -%}\n {{ log(\"Existing relation found, proceeding with incremental work\")}}\n {#-- Set Overwrite Mode to DYNAMIC for subsequent incremental operations --#}\n {%- if incremental_strategy == 'insert_overwrite' and partition_by -%}\n {{ set_overwrite_mode('DYNAMIC') }}\n {%- endif -%}\n {#-- Relation must be merged --#}\n {%- do process_schema_changes(on_schema_change, intermediate_relation, existing_relation) -%}\n {{ process_config_changes(target_relation) }}\n {% set build_sql = get_build_sql(incremental_strategy, target_relation, intermediate_relation) %}\n {%- if language == 'sql' -%}\n {%- call statement('main') -%}\n {{ build_sql }}\n {%- endcall -%}\n {%- elif language == 'python' -%}\n {%- call statement_with_staging_table('main', intermediate_relation) -%}\n {{ build_sql }}\n {%- endcall -%}\n {%- endif -%}\n {%- endif -%}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode) %}\n {% do apply_grants(target_relation, grant_config, should_revoke) %}\n {% do optimize(target_relation) %}\n\n {% if language == 'python' %}\n {{ drop_relation_if_exists(intermediate_relation) }}\n {% endif %}\n\n {{ run_post_hooks() }}\n\n {% else %}\n {%- set tblproperties = config.get('tblproperties') -%}\n {%- set tags = config.get('databricks_tags') -%}\n {% set temp_relation = make_temp_relation(target_relation) %}\n {% set incremental_predicates = config.get('predicates') or config.get('incremental_predicates') %}\n {%- set unique_key = config.get('unique_key') -%}\n\n {#-- Run pre-hooks --#}\n {{ run_hooks(pre_hooks) }}\n {#-- Incremental run logic --#}\n {%- if existing_relation is none -%}\n {#-- Relation must be created --#}\n {%- call statement('main', language=language) -%}\n {{ create_table_as(False, target_relation, compiled_code, language) }}\n {%- endcall -%}\n {% do persist_constraints(target_relation, model) %}\n {% do apply_tags(target_relation, tags) %}\n {%- if language == 'python' -%}\n {%- do apply_tblproperties(target_relation, tblproperties) %}\n {%- endif -%}\n\n {% do persist_docs(target_relation, model, for_relation=language=='python') %}\n {%- elif existing_relation.is_view or existing_relation.is_materialized_view or existing_relation.is_streaming_table or should_full_refresh() -%}\n {#-- Relation must be dropped & recreated --#}\n {% if not is_delta %} {#-- If Delta, we will `create or replace` below, so no need to drop --#}\n {% do adapter.drop_relation(existing_relation) %}\n {% endif %}\n {%- call statement('main', language=language) -%}\n {{ create_table_as(False, target_relation, compiled_code, language) }}\n {%- endcall -%}\n\n {% if not existing_relation.is_view %}\n {% do persist_constraints(target_relation, model) %}\n {% endif %}\n {% do apply_tags(target_relation, tags) %}\n {% do persist_docs(target_relation, model, for_relation=language=='python') %}\n {%- else -%}\n {#-- Set Overwrite Mode to DYNAMIC for subsequent incremental operations --#}\n {%- if incremental_strategy == 'insert_overwrite' and partition_by -%}\n {{ set_overwrite_mode('DYNAMIC') }}\n {%- endif -%}\n {#-- Relation must be merged --#}\n {%- set _existing_config = adapter.get_relation_config(existing_relation) -%}\n {%- set model_config = adapter.get_config_from_model(config.model) -%}\n {%- set _configuration_changes = model_config.get_changeset(_existing_config) -%}\n {%- call statement('create_temp_relation', language=language) -%}\n {{ create_table_as(True, temp_relation, compiled_code, language) }}\n {%- endcall -%}\n {%- do process_schema_changes(on_schema_change, temp_relation, existing_relation) -%}\n {%- set strategy_sql_macro_func = adapter.get_incremental_strategy_macro(context, incremental_strategy) -%}\n {%- set strategy_arg_dict = ({\n 'target_relation': target_relation,\n 'temp_relation': temp_relation,\n 'unique_key': unique_key,\n 'dest_columns': none,\n 'incremental_predicates': incremental_predicates}) -%}\n {%- set build_sql = strategy_sql_macro_func(strategy_arg_dict) -%}\n {%- if language == 'sql' -%}\n {%- call statement('main') -%}\n {{ build_sql }}\n {%- endcall -%}\n {%- elif language == 'python' -%}\n {%- call statement_with_staging_table('main', temp_relation) -%}\n {{ build_sql }}\n {%- endcall -%}\n {#--\n This is yucky.\n See note in dbt-spark/dbt/include/spark/macros/adapters.sql\n re: python models and temporary views.\n\n Also, why does not either drop_relation or adapter.drop_relation work here?!\n --#}\n {%- endif -%}\n {% if _configuration_changes is not none %}\n {% set tags = _configuration_changes.changes.get(\"tags\", None) %}\n {% set tblproperties = _configuration_changes.changes.get(\"tblproperties\", None) %}\n {% set liquid_clustering = _configuration_changes.changes.get(\"liquid_clustering\") %}\n {% if tags is not none %}\n {% do apply_tags(target_relation, tags.set_tags) %}\n {%- endif -%}\n {% if tblproperties is not none %}\n {% do apply_tblproperties(target_relation, tblproperties.tblproperties) %}\n {%- endif -%}\n {% if liquid_clustering is not none %}\n {% do apply_liquid_clustered_cols(target_relation, liquid_clustering) %}\n {% endif %}\n {%- endif -%}\n {% do persist_docs(target_relation, model, for_relation=True) %}\n {%- endif -%}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode) %}\n {% do apply_grants(target_relation, grant_config, should_revoke) %}\n {% do optimize(target_relation) %}\n\n {{ run_hooks(post_hooks) }}\n {%- endif -%}\n\n {%- if incremental_strategy == 'insert_overwrite' and not full_refresh -%}\n {{ set_overwrite_mode('STATIC') }}\n {%- endif -%}\n\n {{ return({'relations': [target_relation]}) }}\n\n{%- endmaterialization %}", "depends_on": {"macros": ["macro.dbt_databricks.load_relation_with_metadata", "macro.dbt_databricks.get_incremental_strategy", "macro.dbt.should_full_refresh", "macro.dbt.incremental_validate_on_schema_change", "macro.dbt.make_intermediate_relation", "macro.dbt_databricks.make_staging_relation", "macro.dbt_databricks.run_pre_hooks", "macro.dbt.statement", "macro.dbt_databricks.get_create_intermediate_table", "macro.dbt_databricks.create_table_at", "macro.dbt_databricks.safe_relation_replace", "macro.dbt_databricks.set_overwrite_mode", "macro.dbt.process_schema_changes", "macro.dbt_databricks.process_config_changes", "macro.dbt_databricks.get_build_sql", "macro.dbt_databricks.statement_with_staging_table", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt_databricks.optimize", "macro.dbt.drop_relation_if_exists", "macro.dbt_databricks.run_post_hooks", "macro.dbt.make_temp_relation", "macro.dbt.run_hooks", "macro.dbt.create_table_as", "macro.dbt_databricks.persist_constraints", "macro.dbt_databricks.apply_tags", "macro.dbt_databricks.apply_tblproperties", "macro.dbt.persist_docs", "macro.dbt_databricks.apply_liquid_clustered_cols"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250504.8512533, "supported_languages": ["sql", "python"]}, "macro.dbt_databricks.set_overwrite_mode": {"name": "set_overwrite_mode", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\incremental.sql", "original_file_path": "macros\\materializations\\incremental\\incremental.sql", "unique_id": "macro.dbt_databricks.set_overwrite_mode", "macro_sql": "{% macro set_overwrite_mode(value) %}\n {% if adapter.is_cluster() %}\n {%- call statement('Setting partitionOverwriteMode: ' ~ value) -%}\n set spark.sql.sources.partitionOverwriteMode = {{ value }}\n {%- endcall -%}\n {% else %}\n {{ exceptions.warn(\"INSERT OVERWRITE is only properly supported on all-purpose clusters. On SQL Warehouses, this strategy would be equivalent to using the table materialization.\") }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "value", "type": null, "description": ""}], "created_at": 1785250504.8522792, "supported_languages": null}, "macro.dbt_databricks.get_build_sql": {"name": "get_build_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\incremental.sql", "original_file_path": "macros\\materializations\\incremental\\incremental.sql", "unique_id": "macro.dbt_databricks.get_build_sql", "macro_sql": "{% macro get_build_sql(incremental_strategy, target_relation, intermediate_relation) %}\n {%- set unique_key = config.get('unique_key') -%}\n {%- set incremental_predicates = config.get('predicates') or config.get('incremental_predicates') -%}\n {%- set strategy_sql_macro_func = adapter.get_incremental_strategy_macro(context, incremental_strategy) -%}\n {%- set strategy_arg_dict = ({\n 'target_relation': target_relation,\n 'temp_relation': intermediate_relation,\n 'unique_key': unique_key,\n 'dest_columns': none,\n 'incremental_predicates': incremental_predicates}) -%}\n {{ strategy_sql_macro_func(strategy_arg_dict) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "incremental_strategy", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "intermediate_relation", "type": null, "description": ""}], "created_at": 1785250504.8532658, "supported_languages": null}, "macro.dbt_databricks.process_config_changes": {"name": "process_config_changes", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\incremental.sql", "original_file_path": "macros\\materializations\\incremental\\incremental.sql", "unique_id": "macro.dbt_databricks.process_config_changes", "macro_sql": "{% macro process_config_changes(target_relation) %}\n {% set apply_config_changes = config.get('incremental_apply_config_changes', True) | as_bool %}\n {% if apply_config_changes %}\n {%- set existing_config = adapter.get_relation_config(target_relation) -%}\n {%- set model_config = adapter.get_config_from_model(config.model) -%}\n {%- set configuration_changes = model_config.get_changeset(existing_config) -%}\n {{ apply_config_changeset(target_relation, model, configuration_changes) }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.apply_config_changeset"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250504.8542528, "supported_languages": null}, "macro.dbt_databricks.get_incremental_strategy": {"name": "get_incremental_strategy", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_databricks.get_incremental_strategy", "macro_sql": "{% macro get_incremental_strategy(file_format) %}\n {% set raw_strategy = config.get('incremental_strategy') or 'merge' %}\n {% do return(dbt_databricks_validate_get_incremental_strategy(raw_strategy, file_format)) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.dbt_databricks_validate_get_incremental_strategy"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "file_format", "type": null, "description": ""}], "created_at": 1785250504.857272, "supported_languages": null}, "macro.dbt_databricks.databricks__get_incremental_default_sql": {"name": "databricks__get_incremental_default_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_databricks.databricks__get_incremental_default_sql", "macro_sql": "{% macro databricks__get_incremental_default_sql(arg_dict) %}\n {{ return(get_incremental_merge_sql(arg_dict)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_incremental_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250504.8582797, "supported_languages": null}, "macro.dbt_databricks.databricks__get_incremental_append_sql": {"name": "databricks__get_incremental_append_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_databricks.databricks__get_incremental_append_sql", "macro_sql": "{% macro databricks__get_incremental_append_sql(arg_dict) %}\n {% do return(get_insert_into_sql(arg_dict[\"temp_relation\"], arg_dict[\"target_relation\"])) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.get_insert_into_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250504.8582797, "supported_languages": null}, "macro.dbt_databricks.databricks__get_incremental_replace_where_sql": {"name": "databricks__get_incremental_replace_where_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_databricks.databricks__get_incremental_replace_where_sql", "macro_sql": "{% macro databricks__get_incremental_replace_where_sql(arg_dict) %}\n {% do return(get_replace_where_sql(arg_dict)) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.get_replace_where_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250504.8592787, "supported_languages": null}, "macro.dbt_databricks.get_incremental_replace_where_sql": {"name": "get_incremental_replace_where_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_databricks.get_incremental_replace_where_sql", "macro_sql": "{% macro get_incremental_replace_where_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_replace_where_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_incremental_replace_where_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250504.8592787, "supported_languages": null}, "macro.dbt_databricks.databricks__get_insert_overwrite_merge_sql": {"name": "databricks__get_insert_overwrite_merge_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_databricks.databricks__get_insert_overwrite_merge_sql", "macro_sql": "{% macro databricks__get_insert_overwrite_merge_sql(target, source, dest_columns, predicates, include_sql_header) %}\n {{ return(get_insert_overwrite_sql(source, target)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.get_insert_overwrite_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target", "type": null, "description": ""}, {"name": "source", "type": null, "description": ""}, {"name": "dest_columns", "type": null, "description": ""}, {"name": "predicates", "type": null, "description": ""}, {"name": "include_sql_header", "type": null, "description": ""}], "created_at": 1785250504.8592787, "supported_languages": null}, "macro.dbt_databricks.get_insert_overwrite_sql": {"name": "get_insert_overwrite_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_databricks.get_insert_overwrite_sql", "macro_sql": "{% macro get_insert_overwrite_sql(source_relation, target_relation) %}\n {%- set dest_columns = adapter.get_columns_in_relation(target_relation) | map(attribute='quoted') | list -%}\n {%- set source_columns = adapter.get_columns_in_relation(source_relation) | map(attribute='quoted') | list -%}\n {%- set common_columns = [] -%}\n {%- for dest_col in dest_columns -%}\n {%- if dest_col in source_columns -%}\n {%- do common_columns.append(dest_col) -%}\n {%- else -%}\n {%- do common_columns.append('DEFAULT') -%}\n {%- endif -%}\n {%- endfor -%}\n {%- set dest_cols_csv = dest_columns | join(', ') -%}\n {%- set source_cols_csv = common_columns | join(', ') -%}\n insert overwrite table {{ target_relation }}\n {{ partition_cols(label=\"partition\") }}\n select {{source_cols_csv}} from {{ source_relation }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.partition_cols"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250504.8612795, "supported_languages": null}, "macro.dbt_databricks.get_replace_where_sql": {"name": "get_replace_where_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_databricks.get_replace_where_sql", "macro_sql": "{% macro get_replace_where_sql(args_dict) -%}\n {%- set predicates = args_dict['incremental_predicates'] -%}\n {%- set target_relation = args_dict['target_relation'] -%}\n {%- set temp_relation = args_dict['temp_relation'] -%}\nINSERT INTO {{ target_relation.render() }}\n{% if predicates %}\n {% if predicates is sequence and predicates is not string %}\nREPLACE WHERE {{ predicates | join(' and ') }}\n {% else %}\nREPLACE WHERE {{ predicates }}\n {% endif %}\n{% endif %}\nTABLE {{ temp_relation.render() }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "args_dict", "type": null, "description": ""}], "created_at": 1785250504.8622756, "supported_languages": null}, "macro.dbt_databricks.get_insert_into_sql": {"name": "get_insert_into_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_databricks.get_insert_into_sql", "macro_sql": "{% macro get_insert_into_sql(source_relation, target_relation) %}\n {%- set source_columns = adapter.get_columns_in_relation(source_relation) | map(attribute=\"quoted\") | list -%}\n {%- set dest_columns = adapter.get_columns_in_relation(target_relation) | map(attribute=\"quoted\") | list -%}\n {{ insert_into_sql_impl(target_relation, dest_columns, source_relation, source_columns) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.insert_into_sql_impl"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250504.8632874, "supported_languages": null}, "macro.dbt_databricks.insert_into_sql_impl": {"name": "insert_into_sql_impl", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_databricks.insert_into_sql_impl", "macro_sql": "{% macro insert_into_sql_impl(target_relation, dest_columns, source_relation, source_columns) %}\n {%- set common_columns = [] -%}\n {%- for dest_col in dest_columns -%}\n {%- if dest_col in source_columns -%}\n {%- do common_columns.append(dest_col) -%}\n {%- else -%}\n {%- do common_columns.append('DEFAULT') -%}\n {%- endif -%}\n {%- endfor -%}\n {%- set dest_cols_csv = dest_columns | join(', ') -%}\n {%- set source_cols_csv = common_columns | join(', ') -%}\ninsert into table {{ target_relation }} ({{ dest_cols_csv }})\nselect {{source_cols_csv}} from {{ source_relation }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}, {"name": "dest_columns", "type": null, "description": ""}, {"name": "source_relation", "type": null, "description": ""}, {"name": "source_columns", "type": null, "description": ""}], "created_at": 1785250504.8652797, "supported_languages": null}, "macro.dbt_databricks.databricks__get_merge_sql": {"name": "databricks__get_merge_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_databricks.databricks__get_merge_sql", "macro_sql": "{% macro databricks__get_merge_sql(target, source, unique_key, dest_columns, incremental_predicates) %}\n {# need dest_columns for merge_exclude_columns, default to use \"*\" #}\n\n {%- set target_alias = config.get('target_alias', 'DBT_INTERNAL_DEST') -%}\n {%- set source_alias = config.get('source_alias', 'DBT_INTERNAL_SOURCE') -%}\n\n {%- set predicates = [] if incremental_predicates is none else [] + incremental_predicates -%}\n {%- set dest_columns = adapter.get_columns_in_relation(target) -%}\n {%- set source_columns = (adapter.get_columns_in_relation(source) | map(attribute='quoted') | list)-%}\n {%- set merge_update_columns = config.get('merge_update_columns') -%}\n {%- set merge_exclude_columns = config.get('merge_exclude_columns') -%}\n {%- set merge_with_schema_evolution = (config.get('merge_with_schema_evolution') | lower == 'true') -%}\n {%- set on_schema_change = incremental_validate_on_schema_change(config.get('on_schema_change'), default='ignore') -%}\n {%- set update_columns = get_merge_update_columns(merge_update_columns, merge_exclude_columns, dest_columns) -%}\n {%- set skip_matched_step = (config.get('skip_matched_step') | lower == 'true') -%}\n {%- set skip_not_matched_step = (config.get('skip_not_matched_step') | lower == 'true') -%}\n\n {%- set matched_condition = config.get('matched_condition') -%}\n {%- set not_matched_condition = config.get('not_matched_condition') -%}\n\n {%- set not_matched_by_source_action = config.get('not_matched_by_source_action') -%}\n {%- set not_matched_by_source_condition = config.get('not_matched_by_source_condition') -%}\n\n {%- set not_matched_by_source_action_trimmed = not_matched_by_source_action | lower | trim(' \\n\\t') %}\n {%- set not_matched_by_source_action_is_set = (\n not_matched_by_source_action_trimmed == 'delete'\n or not_matched_by_source_action_trimmed.startswith('update')\n )\n %}\n \n \n {% if unique_key %}\n {% if unique_key is sequence and unique_key is not mapping and unique_key is not string %}\n {% for key in unique_key %}\n {% set this_key_match %}\n {{ source_alias }}.{{ key }} <=> {{ target_alias }}.{{ key }}\n {% endset %}\n {% do predicates.append(this_key_match) %}\n {% endfor %}\n {% else %}\n {% set unique_key_match %}\n {{ source_alias }}.{{ unique_key }} <=> {{ target_alias }}.{{ unique_key }}\n {% endset %}\n {% do predicates.append(unique_key_match) %}\n {% endif %}\n {% else %}\n {% do predicates.append('FALSE') %}\n {% endif %}\n\n merge\n {%- if merge_with_schema_evolution %}\n with schema evolution\n {%- endif %}\n into\n {{ target }} as {{ target_alias }}\n using\n {{ source }} as {{ source_alias }}\n on\n {{ predicates | join('\\n and ') }}\n {%- if not skip_matched_step %}\n when matched\n {%- if matched_condition %}\n and ({{ matched_condition }})\n {%- endif %}\n then update set\n {{ get_merge_update_set(update_columns, on_schema_change, source_columns, source_alias) }}\n {%- endif %}\n {%- if not skip_not_matched_step %}\n when not matched\n {%- if not_matched_condition %}\n and ({{ not_matched_condition }})\n {%- endif %}\n then insert\n {{ get_merge_insert(on_schema_change, source_columns, source_alias) }}\n {%- endif %}\n {%- if not_matched_by_source_action_is_set %}\n when not matched by source\n {%- if not_matched_by_source_condition %}\n and ({{ not_matched_by_source_condition }})\n {%- endif %}\n then {{ not_matched_by_source_action }}\n {%- endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.incremental_validate_on_schema_change", "macro.dbt.get_merge_update_columns", "macro.dbt_databricks.get_merge_update_set", "macro.dbt_databricks.get_merge_insert"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target", "type": null, "description": ""}, {"name": "source", "type": null, "description": ""}, {"name": "unique_key", "type": null, "description": ""}, {"name": "dest_columns", "type": null, "description": ""}, {"name": "incremental_predicates", "type": null, "description": ""}], "created_at": 1785250504.8712528, "supported_languages": null}, "macro.dbt_databricks.get_merge_update_set": {"name": "get_merge_update_set", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_databricks.get_merge_update_set", "macro_sql": "{% macro get_merge_update_set(update_columns, on_schema_change, source_columns, source_alias='DBT_INTERNAL_SOURCE') %}\n {%- if update_columns -%}\n {%- for column_name in update_columns -%}\n {{ column_name }} = {{ source_alias }}.{{ column_name }}{%- if not loop.last %}, {% endif -%}\n {%- endfor %}\n {%- elif on_schema_change == 'ignore' -%}\n *\n {%- else -%}\n {%- for column in source_columns -%}\n {{ column }} = {{ source_alias }}.{{ column }}{%- if not loop.last %}, {% endif -%}\n {%- endfor %}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "update_columns", "type": null, "description": ""}, {"name": "on_schema_change", "type": null, "description": ""}, {"name": "source_columns", "type": null, "description": ""}, {"name": "source_alias", "type": null, "description": ""}], "created_at": 1785250504.8722854, "supported_languages": null}, "macro.dbt_databricks.get_merge_insert": {"name": "get_merge_insert", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_databricks.get_merge_insert", "macro_sql": "{% macro get_merge_insert(on_schema_change, source_columns, source_alias='DBT_INTERNAL_SOURCE') %}\n {%- if on_schema_change == 'ignore' -%}\n *\n {%- else -%}\n ({{ source_columns | join(\", \") }}) VALUES (\n {%- for column in source_columns -%}\n {{ source_alias }}.{{ column }}{%- if not loop.last %}, {% endif -%}\n {%- endfor %})\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "on_schema_change", "type": null, "description": ""}, {"name": "source_columns", "type": null, "description": ""}, {"name": "source_alias", "type": null, "description": ""}], "created_at": 1785250504.873276, "supported_languages": null}, "macro.dbt_databricks.databricks__get_incremental_microbatch_sql": {"name": "databricks__get_incremental_microbatch_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_databricks.databricks__get_incremental_microbatch_sql", "macro_sql": "{% macro databricks__get_incremental_microbatch_sql(arg_dict) %}\n {%- set incremental_predicates = [] if arg_dict.get('incremental_predicates') is none else arg_dict.get('incremental_predicates') -%}\n {%- set event_time = model.config.event_time -%}\n {%- set start_time = config.get(\"__dbt_internal_microbatch_event_time_start\") -%}\n {%- set end_time = config.get(\"__dbt_internal_microbatch_event_time_end\") -%}\n {%- if start_time -%}\n {%- do incremental_predicates.append(\"cast(\" ~ event_time ~ \" as TIMESTAMP) >= '\" ~ start_time ~ \"'\") -%}\n {%- endif -%}\n {%- if end_time -%}\n {%- do incremental_predicates.append(\"cast(\" ~ event_time ~ \" as TIMESTAMP) < '\" ~ end_time ~ \"'\") -%}\n {%- endif -%}\n {%- do arg_dict.update({'incremental_predicates': incremental_predicates}) -%}\n {{ return(get_replace_where_sql(arg_dict)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.get_replace_where_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250504.8752708, "supported_languages": null}, "macro.dbt_databricks.dbt_databricks_validate_get_file_format": {"name": "dbt_databricks_validate_get_file_format", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\validate.sql", "original_file_path": "macros\\materializations\\incremental\\validate.sql", "unique_id": "macro.dbt_databricks.dbt_databricks_validate_get_file_format", "macro_sql": "{% macro dbt_databricks_validate_get_file_format(raw_file_format) %}\n {#-- Validate the file format #}\n\n {% set accepted_formats = ['text', 'csv', 'json', 'jdbc', 'parquet', 'orc', 'hive', 'delta', 'libsvm', 'hudi'] %}\n\n {% set invalid_file_format_msg -%}\n Invalid file format provided: {{ raw_file_format }}\n Expected one of: {{ accepted_formats | join(', ') }}\n {%- endset %}\n\n {% if raw_file_format not in accepted_formats %}\n {% do exceptions.raise_compiler_error(invalid_file_format_msg) %}\n {% endif %}\n\n {% do return(raw_file_format) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "raw_file_format", "type": null, "description": ""}], "created_at": 1785250504.8772724, "supported_languages": null}, "macro.dbt_databricks.dbt_databricks_validate_get_incremental_strategy": {"name": "dbt_databricks_validate_get_incremental_strategy", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\incremental\\validate.sql", "original_file_path": "macros\\materializations\\incremental\\validate.sql", "unique_id": "macro.dbt_databricks.dbt_databricks_validate_get_incremental_strategy", "macro_sql": "{% macro dbt_databricks_validate_get_incremental_strategy(raw_strategy, file_format) %}\n {#-- Validate the incremental strategy #}\n\n {% set invalid_delta_only_msg -%}\n Invalid incremental strategy provided: {{ raw_strategy }}\n You can only choose this strategy when file_format is set to 'delta'\n {%- endset %}\n\n {% set invalid_insert_overwrite_endpoint_msg -%}\n Invalid incremental strategy provided: {{ raw_strategy }}\n You cannot use this strategy when connecting via warehouse\n Use the 'merge' or 'replace_where' strategy instead\n {%- endset %}\n\n {% if raw_strategy not in adapter.valid_incremental_strategies() %}\n {{ log(\"WARNING - You are using an unsupported incremental strategy: \" ~ raw_strategy) }}\n {{ log(\"You can ignore this warning if you are using a custom incremental strategy\") }}\n {%-else %}\n {% if raw_strategy == 'merge' and file_format not in ['delta', 'hudi'] %}\n {% do exceptions.raise_compiler_error(invalid_delta_only_msg) %}\n {% endif %}\n {% if raw_strategy in ('replace_where', 'microbatch') and file_format not in ['delta'] %}\n {% do exceptions.raise_compiler_error(invalid_delta_only_msg) %}\n {% endif %}\n {% endif %}\n\n {% do return(raw_strategy) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "raw_strategy", "type": null, "description": ""}, {"name": "file_format", "type": null, "description": ""}], "created_at": 1785250504.8792715, "supported_languages": null}, "macro.dbt_databricks.databricks__get_binding_char": {"name": "databricks__get_binding_char", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt_databricks.databricks__get_binding_char", "macro_sql": "{% macro databricks__get_binding_char() %}\n {{ return('%s') }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250504.8813224, "supported_languages": null}, "macro.dbt_databricks.databricks__load_csv_rows": {"name": "databricks__load_csv_rows", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt_databricks.databricks__load_csv_rows", "macro_sql": "{% macro databricks__load_csv_rows(model, agate_table) %}\n\n {% set batch_size = get_batch_size() %}\n {% set column_override = model['config'].get('column_types', {}) %}\n {% set must_cast = model['config'].get('file_format', 'delta') == 'parquet' %}\n\n {% set statements = [] %}\n\n {% for chunk in agate_table.rows | batch(batch_size) %}\n {% set bindings = [] %}\n\n {% for row in chunk %}\n {% do bindings.extend(row) %}\n {% endfor %}\n\n {% set sql %}\n insert {% if loop.index0 == 0 -%} overwrite {% else -%} into {% endif -%} {{ this.render() }} values\n {% for row in chunk -%}\n ({%- for col_name in agate_table.column_names -%}\n {%- if must_cast -%}\n {%- set inferred_type = adapter.convert_type(agate_table, loop.index0) -%}\n {%- set type = column_override.get(col_name, inferred_type) -%}\n cast({{ get_binding_char() }} as {{type}})\n {%- else -%}\n {{ get_binding_char() }}\n {%- endif -%}\n {%- if not loop.last%},{%- endif %}\n {%- endfor -%})\n {%- if not loop.last%},{%- endif %}\n {%- endfor %}\n {% endset %}\n\n {% do adapter.add_query(sql, bindings=bindings, abridge_sql_log=True, close_cursor=True) %}\n\n {% if loop.index0 == 0 %}\n {% do statements.append(sql) %}\n {% endif %}\n {% endfor %}\n\n {# Return SQL so we can render it out into the compiled files #}\n {{ return(statements[0]) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_batch_size", "macro.dbt.get_binding_char"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "agate_table", "type": null, "description": ""}], "created_at": 1785250504.8843026, "supported_languages": null}, "macro.dbt_databricks.databricks__reset_csv_table": {"name": "databricks__reset_csv_table", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt_databricks.databricks__reset_csv_table", "macro_sql": "{% macro databricks__reset_csv_table(model, full_refresh, old_relation, agate_table) %}\n {% if old_relation %}\n {% if old_relation.is_delta and config.get('file_format', default='delta') == 'delta' %}\n {% set sql = create_or_replace_csv_table(model, agate_table, True) %}\n {% else %}\n {{ adapter.drop_relation(old_relation) }}\n {% set sql = create_csv_table(model, agate_table) %}\n {% endif %}\n {% else %}\n {% set sql = create_csv_table(model, agate_table) %}\n {% endif %}\n {{ return(sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.create_or_replace_csv_table", "macro.dbt.create_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "full_refresh", "type": null, "description": ""}, {"name": "old_relation", "type": null, "description": ""}, {"name": "agate_table", "type": null, "description": ""}], "created_at": 1785250504.8863206, "supported_languages": null}, "macro.dbt_databricks.create_or_replace_csv_table": {"name": "create_or_replace_csv_table", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt_databricks.create_or_replace_csv_table", "macro_sql": "{% macro create_or_replace_csv_table(model, agate_table, replace=False) %}\n\n {%- set catalog_relation = adapter.build_catalog_relation(config.model) -%}\n\n {%- set column_override = model['config'].get('column_types', {}) -%}\n {%- set quote_seed_column = model['config'].get('quote_columns', None) -%}\n {%- set column_comment = config.persist_column_docs() and model.columns %}\n {%- set identifier = model['alias'] -%}\n {%- set relation = api.Relation.create(database=database, schema=schema, identifier=identifier, type='table') -%}\n {%- set replace_clause = \"\" -%}\n {%- if replace -%}\n {%- set replace_clause = \"or replace\" -%}\n {%- endif -%}\n\n {% set sql %}\n create {{replace_clause}} table {{ this.render() }} (\n {%- for col_name in agate_table.column_names -%}\n {%- set inferred_type = adapter.convert_type(agate_table, loop.index0) -%}\n {%- set type = column_override.get(col_name, inferred_type) -%}\n {%- set column_name = (col_name | string) -%}\n {%- set column_comment_clause = \"\" -%}\n {%- if column_comment and col_name in model.columns.keys() -%} \n {%- set comment = model.columns[col_name]['description'] | replace(\"'\", \"\\\\'\") -%}\n {%- if comment and comment != \"\" -%}\n {%- set column_comment_clause = \"comment '\" ~ comment ~ \"'\" -%}\n {%- endif -%}\n {%- endif -%}\n {{ adapter.quote_seed_column(column_name, quote_seed_column) }} {{ type }} {{ column_comment_clause }}{%- if not loop.last -%}, {%- endif -%}\n {%- endfor -%}\n )\n {{ file_format_clause(catalog_relation) }}\n {{ partition_cols(label=\"partitioned by\") }}\n {{ clustered_cols(label=\"clustered by\") }}\n {{ location_clause(catalog_relation) }}\n {{ comment_clause() }}\n {{ tblproperties_clause() }}\n {% endset %}\n\n {% call statement('_') -%}\n {{ sql }}\n {%- endcall %}\n\n {{ return(sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.file_format_clause", "macro.dbt_spark.partition_cols", "macro.dbt_spark.clustered_cols", "macro.dbt_databricks.location_clause", "macro.dbt_spark.comment_clause", "macro.dbt_databricks.tblproperties_clause", "macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "agate_table", "type": null, "description": ""}, {"name": "replace", "type": null, "description": ""}], "created_at": 1785250504.890209, "supported_languages": null}, "macro.dbt_databricks.databricks__create_csv_table": {"name": "databricks__create_csv_table", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt_databricks.databricks__create_csv_table", "macro_sql": "{% macro databricks__create_csv_table(model, agate_table) %}\n {{ return(create_or_replace_csv_table(model, agate_table)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.create_or_replace_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "agate_table", "type": null, "description": ""}], "created_at": 1785250504.890209, "supported_languages": null}, "macro.dbt_databricks.log_seed_operation": {"name": "log_seed_operation", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt_databricks.log_seed_operation", "macro_sql": "{% macro log_seed_operation(agate_table, full_refresh_mode, create_table_sql, sql) %}\n {% set code = 'CREATE' if full_refresh_mode else 'INSERT' %}\n {% set rows_affected = (agate_table.rows | length) %}\n\n {% call noop_statement('main', code ~ ' ' ~ rows_affected, code, rows_affected) %}\n {{ get_csv_sql(create_table_sql, sql) }};\n {% endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.noop_statement", "macro.dbt.get_csv_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "agate_table", "type": null, "description": ""}, {"name": "full_refresh_mode", "type": null, "description": ""}, {"name": "create_table_sql", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250504.8912206, "supported_languages": null}, "macro.dbt_databricks.materialization_seed_databricks": {"name": "materialization_seed_databricks", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\seeds\\seeds.sql", "original_file_path": "macros\\materializations\\seeds\\seeds.sql", "unique_id": "macro.dbt_databricks.materialization_seed_databricks", "macro_sql": "{% materialization seed, adapter='databricks' %}\n {% set target_relation = this.incorporate(type='table') %}\n\n {% if adapter.behavior.use_materialization_v2 %}\n {{ create_seed_v2(target_relation) }}\n {% else %}\n {{ create_seed_v1(target_relation) }}\n {% endif %}\n\n {{ return({'relations': [target_relation]}) }}\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt_databricks.create_seed_v2", "macro.dbt_databricks.create_seed_v1"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250504.8932116, "supported_languages": ["sql"]}, "macro.dbt_databricks.create_seed_v2": {"name": "create_seed_v2", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\seeds\\seeds.sql", "original_file_path": "macros\\materializations\\seeds\\seeds.sql", "unique_id": "macro.dbt_databricks.create_seed_v2", "macro_sql": "{% macro create_seed_v2(target_relation) %}\n {%- set identifier = model['alias'] -%}\n {%- set full_refresh_mode = (should_full_refresh()) -%}\n\n {%- set old_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier, needs_information=True) -%}\n\n {%- set exists_as_table = (old_relation is not none and old_relation.is_table) -%}\n {%- set exists_as_view = (old_relation is not none and (old_relation.is_view or old_relation.is_materialized_view)) -%}\n {%- set exists_as_streaming_table = (old_relation is not none and old_relation.is_streaming_table) -%}\n\n {%- set grant_config = config.get('grants') -%}\n {%- set agate_table = load_agate_table() -%}\n -- grab current tables grants config for comparision later on\n\n {%- do store_result('agate_table', response='OK', agate_table=agate_table) -%}\n\n {{ run_pre_hooks() }}\n\n -- build model\n {% set create_table_sql = \"\" %}\n {% if exists_as_view %}\n {{ exceptions.raise_compiler_error(\"Cannot seed to '{}', it is a view or a materialized view\".format(old_relation)) }}\n {% elif exists_as_streaming_table %}\n {{ exceptions.raise_compiler_error(\"Cannot seed to '{}', it is a streaming table\".format(old_relation)) }}\n {% elif exists_as_table %}\n {% set create_table_sql = reset_csv_table(model, full_refresh_mode, old_relation, agate_table) %}\n {% else %}\n {% set create_table_sql = create_csv_table(model, agate_table) %}\n {% endif %}\n\n {% set sql = load_csv_rows(model, agate_table) %}\n\n {{ log_seed_operation(agate_table, full_refresh_mode, create_table_sql, sql) }}\n\n {% set should_revoke = should_revoke(old_relation, full_refresh_mode) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n -- No need to persist docs, already handled in seed create\n\n {{ run_post_hooks() }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.should_full_refresh", "macro.dbt_databricks.run_pre_hooks", "macro.dbt.reset_csv_table", "macro.dbt.create_csv_table", "macro.dbt.load_csv_rows", "macro.dbt_databricks.log_seed_operation", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt_databricks.run_post_hooks"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250504.896817, "supported_languages": null}, "macro.dbt_databricks.create_seed_v1": {"name": "create_seed_v1", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\materializations\\seeds\\seeds.sql", "original_file_path": "macros\\materializations\\seeds\\seeds.sql", "unique_id": "macro.dbt_databricks.create_seed_v1", "macro_sql": "{% macro create_seed_v1(target_relation) %}\n {%- set identifier = model['alias'] -%}\n {%- set full_refresh_mode = (should_full_refresh()) -%}\n\n {%- set old_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier, needs_information=True) -%}\n\n {%- set exists_as_table = (old_relation is not none and old_relation.is_table) -%}\n {%- set exists_as_view = (old_relation is not none and (old_relation.is_view or old_relation.is_materialized_view)) -%}\n {%- set exists_as_streaming_table = (old_relation is not none and old_relation.is_streaming_table) -%}\n\n {%- set grant_config = config.get('grants') -%}\n {%- set agate_table = load_agate_table() -%}\n -- grab current tables grants config for comparision later on\n\n {%- do store_result('agate_table', response='OK', agate_table=agate_table) -%}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n -- build model\n {% set create_table_sql = \"\" %}\n {% if exists_as_view %}\n {{ exceptions.raise_compiler_error(\"Cannot seed to '{}', it is a view or a materialized view\".format(old_relation)) }}\n {% elif exists_as_streaming_table %}\n {{ exceptions.raise_compiler_error(\"Cannot seed to '{}', it is a streaming table\".format(old_relation)) }}\n {% elif exists_as_table %}\n {% set create_table_sql = reset_csv_table(model, full_refresh_mode, old_relation, agate_table) %}\n {% else %}\n {% set create_table_sql = create_csv_table(model, agate_table) %}\n {% endif %}\n\n {% set code = 'CREATE' if full_refresh_mode else 'INSERT' %}\n {% set rows_affected = (agate_table.rows | length) %}\n {% set sql = load_csv_rows(model, agate_table) %}\n\n {% call noop_statement('main', code ~ ' ' ~ rows_affected, code, rows_affected) %}\n {{ get_csv_sql(create_table_sql, sql) }};\n {% endcall %}\n\n {% set should_revoke = should_revoke(old_relation, full_refresh_mode) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n -- No need to persist docs, already handled in seed create\n\n {% if full_refresh_mode or not exists_as_table %}\n {% do create_indexes(target_relation) %}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n -- `COMMIT` happens here\n {{ adapter.commit() }}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.should_full_refresh", "macro.dbt.run_hooks", "macro.dbt.reset_csv_table", "macro.dbt.create_csv_table", "macro.dbt.load_csv_rows", "macro.dbt.noop_statement", "macro.dbt.get_csv_sql", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.create_indexes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250504.9018278, "supported_languages": null}, "macro.dbt_databricks.databricks__comment_clause": {"name": "databricks__comment_clause", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\comment.sql", "original_file_path": "macros\\relations\\comment.sql", "unique_id": "macro.dbt_databricks.databricks__comment_clause", "macro_sql": "{% macro databricks__comment_clause() %}\n {%- set raw_persist_docs = config.get('persist_docs', {}) -%}\n {%- if raw_persist_docs is mapping -%}\n {%- set raw_relation = raw_persist_docs.get('relation', false) -%}\n {%- if raw_relation and model.description -%}\n comment '{{ model.description | replace(\"'\", \"\\\\'\") }}'\n {%- endif -%}\n {%- elif raw_persist_docs -%}\n {{ exceptions.raise_compiler_error(\"Invalid value provided for 'persist_docs'. Expected dict but got value: \" ~ raw_persist_docs) }}\n {% endif %}\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250504.9037993, "supported_languages": null}, "macro.dbt_databricks.get_configuration_changes": {"name": "get_configuration_changes", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\config.sql", "original_file_path": "macros\\relations\\config.sql", "unique_id": "macro.dbt_databricks.get_configuration_changes", "macro_sql": "{%- macro get_configuration_changes(existing_relation) -%}\n {%- set existing_config = adapter.get_relation_config(existing_relation) -%}\n {%- set model_config = adapter.get_config_from_model(config.model) -%}\n {%- set configuration_changes = model_config.get_changeset(existing_config) -%}\n {% do return(configuration_changes) %}\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}], "created_at": 1785250504.9048073, "supported_languages": null}, "macro.dbt_databricks.persist_constraints": {"name": "persist_constraints", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\constraints.sql", "original_file_path": "macros\\relations\\constraints.sql", "unique_id": "macro.dbt_databricks.persist_constraints", "macro_sql": "{% macro persist_constraints(relation, model) %}\n {{ return(adapter.dispatch('persist_constraints', 'dbt')(relation, model)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__persist_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "model", "type": null, "description": ""}], "created_at": 1785250504.9098144, "supported_languages": null}, "macro.dbt_databricks.databricks__persist_constraints": {"name": "databricks__persist_constraints", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\constraints.sql", "original_file_path": "macros\\relations\\constraints.sql", "unique_id": "macro.dbt_databricks.databricks__persist_constraints", "macro_sql": "{% macro databricks__persist_constraints(relation, model) %}\n {%- set contract_config = config.get('contract') -%}\n {% set has_model_contract = contract_config and contract_config.enforced %}\n {% set has_databricks_constraints = config.get('persist_constraints', False) %}\n\n {% if (has_model_contract or has_databricks_constraints) %}\n {% if config.get('file_format', 'delta') != 'delta' %}\n {# Constraints are only supported for delta tables #}\n {{ exceptions.warn(\"Constraints not supported for file format: \" ~ config.get('file_format')) }}\n {% elif relation.is_view %}\n {# Constraints are not supported for views. This point in the code should not have been reached. #}\n {{ exceptions.raise_compiler_error(\"Constraints not supported for views.\") }}\n {% elif is_incremental() %}\n {# Constraints are not applied for incremental updates. This point in the code should not have been reached #}\n {{ exceptions.raise_compiler_error(\"Constraints are not applied for incremental updates. Full refresh is required to update constraints.\") }}\n {% else %}\n {% do alter_column_set_constraints(relation, model) %}\n {% do alter_table_add_constraints(relation, model) %}\n {% endif %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.is_incremental", "macro.dbt_databricks.alter_column_set_constraints", "macro.dbt_databricks.alter_table_add_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "model", "type": null, "description": ""}], "created_at": 1785250504.9118118, "supported_languages": null}, "macro.dbt_databricks.apply_alter_constraints": {"name": "apply_alter_constraints", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\constraints.sql", "original_file_path": "macros\\relations\\constraints.sql", "unique_id": "macro.dbt_databricks.apply_alter_constraints", "macro_sql": "{% macro apply_alter_constraints(relation) %}\n {%- for constraint in relation.alter_constraints -%}\n {% call statement('add constraint') %}\n ALTER TABLE {{ relation.render() }} ADD {{ constraint.render() }}\n {% endcall %}\n {%- endfor -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9118118, "supported_languages": null}, "macro.dbt_databricks.alter_table_add_constraints": {"name": "alter_table_add_constraints", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\constraints.sql", "original_file_path": "macros\\relations\\constraints.sql", "unique_id": "macro.dbt_databricks.alter_table_add_constraints", "macro_sql": "{% macro alter_table_add_constraints(relation, constraints) %}\n {{ return(adapter.dispatch('alter_table_add_constraints', 'dbt')(relation, constraints)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__alter_table_add_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "constraints", "type": null, "description": ""}], "created_at": 1785250504.9128177, "supported_languages": null}, "macro.dbt_databricks.databricks__alter_table_add_constraints": {"name": "databricks__alter_table_add_constraints", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\constraints.sql", "original_file_path": "macros\\relations\\constraints.sql", "unique_id": "macro.dbt_databricks.databricks__alter_table_add_constraints", "macro_sql": "{% macro databricks__alter_table_add_constraints(relation, model) %}\n {% set constraints = get_model_constraints(model) %}\n {% set statements = get_constraints_sql(relation, constraints, model) %}\n {% for stmt in statements %}\n {% call statement() %}\n {{ stmt }}\n {% endcall %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.get_model_constraints", "macro.dbt_databricks.get_constraints_sql", "macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "model", "type": null, "description": ""}], "created_at": 1785250504.9128177, "supported_languages": null}, "macro.dbt_databricks.get_model_constraints": {"name": "get_model_constraints", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\constraints.sql", "original_file_path": "macros\\relations\\constraints.sql", "unique_id": "macro.dbt_databricks.get_model_constraints", "macro_sql": "{% macro get_model_constraints(model) %}\n {% set constraints = model.get('constraints', []) %}\n {% if config.get('persist_constraints', False) and model.get('meta', {}).get('constraints') is sequence %}\n {# Databricks constraints implementation. Constraints are in the meta property. #}\n {% set db_constraints = model.get('meta', {}).get('constraints', []) %}\n {% set constraints = databricks_constraints_to_dbt(db_constraints) %}\n {% endif %}\n {{ return(constraints) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks_constraints_to_dbt"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}], "created_at": 1785250504.9148066, "supported_languages": null}, "macro.dbt_databricks.get_column_constraints": {"name": "get_column_constraints", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\constraints.sql", "original_file_path": "macros\\relations\\constraints.sql", "unique_id": "macro.dbt_databricks.get_column_constraints", "macro_sql": "{% macro get_column_constraints(column) %}\n {% set constraints = column.get('constraints', []) %}\n {% if config.get('persist_constraints', False) and column.get('meta', {}).get('constraint') %}\n {# Databricks constraints implementation. Constraint is in the meta property. #}\n {% set db_constraints = [column.get('meta', {}).get('constraint')] %}\n {% set constraints = databricks_constraints_to_dbt(db_constraints, column) %}\n {% endif %}\n {{ return(constraints) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks_constraints_to_dbt"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "column", "type": null, "description": ""}], "created_at": 1785250504.915813, "supported_languages": null}, "macro.dbt_databricks.alter_column_set_constraints": {"name": "alter_column_set_constraints", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\constraints.sql", "original_file_path": "macros\\relations\\constraints.sql", "unique_id": "macro.dbt_databricks.alter_column_set_constraints", "macro_sql": "{% macro alter_column_set_constraints(relation, column_dict) %}\n {{ return(adapter.dispatch('alter_column_set_constraints', 'dbt')(relation, column_dict)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__alter_column_set_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column_dict", "type": null, "description": ""}], "created_at": 1785250504.915813, "supported_languages": null}, "macro.dbt_databricks.databricks__alter_column_set_constraints": {"name": "databricks__alter_column_set_constraints", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\constraints.sql", "original_file_path": "macros\\relations\\constraints.sql", "unique_id": "macro.dbt_databricks.databricks__alter_column_set_constraints", "macro_sql": "{% macro databricks__alter_column_set_constraints(relation, model) %}\n {% set column_dict = model.columns %}\n {% for column_name in column_dict %}\n {% set column = column_dict[column_name] %}\n {% set constraints = get_column_constraints(column) %}\n {% set statements = get_constraints_sql(relation, constraints, model, column) %}\n {% for stmt in statements %}\n {% call statement() %}\n {{ stmt }}\n {% endcall %}\n {% endfor %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.get_column_constraints", "macro.dbt_databricks.get_constraints_sql", "macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "model", "type": null, "description": ""}], "created_at": 1785250504.9178252, "supported_languages": null}, "macro.dbt_databricks.get_constraints_sql": {"name": "get_constraints_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\constraints.sql", "original_file_path": "macros\\relations\\constraints.sql", "unique_id": "macro.dbt_databricks.get_constraints_sql", "macro_sql": "{% macro get_constraints_sql(relation, constraints, model, column={}) %}\n {% set statements = [] %}\n -- Hack so that not null constraints will be applied before other constraints\n {% for constraint in constraints|selectattr('type', 'eq', 'not_null') %}\n {% if constraint %}\n {% set constraint_statements = get_constraint_sql(relation, constraint, model, column) %}\n {% for statement in constraint_statements %}\n {% if statement %}\n {% do statements.append(statement) %}\n {% endif %}\n {% endfor %}\n {% endif %}\n {% endfor %}\n {% for constraint in constraints|rejectattr('type', 'eq', 'not_null') %}\n {% if constraint %}\n {% set constraint_statements = get_constraint_sql(relation, constraint, model, column) %}\n {% for statement in constraint_statements %}\n {% if statement %}\n {% do statements.append(statement) %}\n {% endif %}\n {% endfor %}\n {% endif %}\n {% endfor %}\n\n {{ return(statements) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.get_constraint_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "constraints", "type": null, "description": ""}, {"name": "model", "type": null, "description": ""}, {"name": "column", "type": null, "description": ""}], "created_at": 1785250504.9198213, "supported_languages": null}, "macro.dbt_databricks.get_constraint_sql": {"name": "get_constraint_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\constraints.sql", "original_file_path": "macros\\relations\\constraints.sql", "unique_id": "macro.dbt_databricks.get_constraint_sql", "macro_sql": "{% macro get_constraint_sql(relation, constraint, model, column={}) %}\n {% set statements = [] %}\n {% set type = constraint.get('type', '') %}\n\n {% if type == 'check' %}\n {% set expression = constraint.get('expression', '') %}\n {% if not expression %}\n {{ exceptions.raise_compiler_error('Invalid check constraint expression') }}\n {% endif %}\n\n {% set name = constraint.get('name') %}\n {% if not name %}\n {% if local_md5 %}\n {{ exceptions.warn(\"Constraint of type \" ~ type ~ \" with no `name` provided. Generating hash instead for relation \" ~ relation.identifier) }}\n {%- set name = local_md5 (relation.identifier ~ \";\" ~ column.get('name', '') ~ \";\" ~ expression ~ \";\") -%}\n {% else %}\n {{ exceptions.raise_compiler_error(\"Constraint of type \" ~ type ~ \" with no `name` provided, and no md5 utility.\") }}\n {% endif %}\n {% endif %}\n {% set stmt = \"alter table \" ~ relation.render() ~ \" add constraint \" ~ name ~ \" check (\" ~ expression ~ \");\" %}\n {% do statements.append(stmt) %}\n {% elif type == 'not_null' %}\n {% set column_names = constraint.get('columns', []) %}\n {% if column and not column_names %}\n {% set column_names = [column['name']] %}\n {% endif %}\n {% for column_name in column_names %}\n {% set column = model.get('columns', {}).get(column_name) %}\n {% if column %}\n {% set quoted_name = api.Column.get_name(column) %}\n {% set stmt = \"alter table \" ~ relation.render() ~ \" change column \" ~ quoted_name ~ \" set not null \" ~ (constraint.expression or \"\") ~ \";\" %}\n {% do statements.append(stmt) %}\n {% else %}\n {{ exceptions.warn('not_null constraint on invalid column: ' ~ column_name) }}\n {% endif %}\n {% endfor %}\n {% elif type == 'primary_key' %}\n {% if constraint.get('warn_unenforced') %}\n {{ exceptions.warn(\"unenforced constraint type: \" ~ type)}}\n {% endif %}\n {% set column_names = constraint.get('columns', []) %}\n {% if column and not column_names %}\n {% set column_names = [column['name']] %}\n {% endif %}\n {% set quoted_names = [] %}\n {% for column_name in column_names %}\n {% set column = model.get('columns', {}).get(column_name) %}\n {% if not column %}\n {{ exceptions.warn('Invalid primary key column: ' ~ column_name) }}\n {% else %}\n {% set quoted_name = api.Column.get_name(column) %}\n {% do quoted_names.append(quoted_name) %}\n {% endif %}\n {% endfor %}\n\n {% set joined_names = quoted_names|join(\", \") %}\n\n {% set name = constraint.get('name') %}\n {% if not name %}\n {% if local_md5 %}\n {{ exceptions.warn(\"Constraint of type \" ~ type ~ \" with no `name` provided. Generating hash instead for relation \" ~ relation.identifier) }}\n {%- set name = local_md5(\"primary_key;\" ~ relation.identifier ~ \";\" ~ column_names ~ \";\") -%}\n {% else %}\n {{ exceptions.raise_compiler_error(\"Constraint of type \" ~ type ~ \" with no `name` provided, and no md5 utility.\") }}\n {% endif %}\n {% endif %}\n {% set stmt = \"alter table \" ~ relation.render() ~ \" add constraint \" ~ name ~ \" primary key(\" ~ joined_names ~ \");\" %}\n {% do statements.append(stmt) %}\n {% elif type == 'foreign_key' %}\n\n {% if constraint.get('warn_unenforced') %}\n {{ exceptions.warn(\"unenforced constraint type: \" ~ constraint.type)}}\n {% endif %}\n\n {% set name = constraint.get('name') %}\n \n {% if constraint.get('expression') %}\n\n {% if not name %}\n {% if local_md5 %}\n {{ exceptions.warn(\"Constraint of type \" ~ type ~ \" with no `name` provided. Generating hash instead for relation \" ~ relation.identifier) }}\n {%- set name = local_md5(\"foreign_key;\" ~ relation.identifier ~ \";\" ~ constraint.get('expression') ~ \";\") -%}\n {% else %}\n {{ exceptions.raise_compiler_error(\"Constraint of type \" ~ type ~ \" with no `name` provided, and no md5 utility.\") }}\n {% endif %} \n {% endif %}\n\n {% set stmt = \"alter table \" ~ relation.render() ~ \" add constraint \" ~ name ~ \" foreign key\" ~ constraint.get('expression') %}\n {% else %}\n {% set column_names = constraint.get('columns', []) %}\n {% if column and not column_names %}\n {% set column_names = [column['name']] %}\n {% endif %}\n {% set quoted_names = [] %}\n {% for column_name in column_names %}\n {% set column = model.get('columns', {}).get(column_name) %}\n {% if not column %}\n {{ exceptions.warn('Invalid foreign key column: ' ~ column_name) }}\n {% else %}\n {% set quoted_name = api.Column.get_name(column) %}\n {% do quoted_names.append(quoted_name) %}\n {% endif %}\n {% endfor %}\n\n {% set joined_names = quoted_names|join(\", \") %}\n\n {% set parent = constraint.get('to') %}\n {% if not parent %}\n {{ exceptions.raise_compiler_error('No parent table defined for foreign key: ' ~ expression) }}\n {% endif %}\n {% if not \".\" in parent %}\n {% set parent = relation.schema ~ \".\" ~ parent%}\n {% endif %}\n\n {% if not name %}\n {% if local_md5 %}\n {{ exceptions.warn(\"Constraint of type \" ~ type ~ \" with no `name` provided. Generating hash instead for relation \" ~ relation.identifier) }}\n {%- set name = local_md5(\"foreign_key;\" ~ relation.identifier ~ \";\" ~ column_names ~ \";\" ~ parent ~ \";\") -%}\n {% else %}\n {{ exceptions.raise_compiler_error(\"Constraint of type \" ~ type ~ \" with no `name` provided, and no md5 utility.\") }}\n {% endif %} \n {% endif %}\n\n {% set stmt = \"alter table \" ~ relation.render() ~ \" add constraint \" ~ name ~ \" foreign key(\" ~ joined_names ~ \") references \" ~ parent %}\n {% set parent_columns = constraint.get('to_columns') %}\n {% if parent_columns %}\n {% set stmt = stmt ~ \"(\" ~ parent_columns|join(\", \") ~ \")\"%}\n {% endif %}\n {% endif %}\n {% set stmt = stmt ~ \";\" %}\n {% do statements.append(stmt) %}\n {% elif type == 'custom' %}\n {% set expression = constraint.get('expression', '') %}\n {% if not expression %}\n {{ exceptions.raise_compiler_error('Missing custom constraint expression') }}\n {% endif %}\n\n {% set name = constraint.get('name') %}\n {% set expression = constraint.get('expression') %}\n {% if not name %}\n {% if local_md5 %}\n {{ exceptions.warn(\"Constraint of type \" ~ type ~ \" with no `name` provided. Generating hash instead for relation \" ~ relation.identifier) }}\n {%- set name = local_md5 (relation.identifier ~ \";\" ~ expression ~ \";\") -%}\n {% else %}\n {{ exceptions.raise_compiler_error(\"Constraint of type \" ~ type ~ \" with no `name` provided, and no md5 utility.\") }}\n {% endif %}\n {% endif %}\n {% set stmt = \"alter table \" ~ relation.render() ~ \" add constraint \" ~ name ~ \" \" ~ expression ~ \";\" %}\n {% do statements.append(stmt) %}\n {% elif constraint.get('warn_unsupported') %}\n {{ exceptions.warn(\"unsupported constraint type: \" ~ constraint.type)}}\n {% endif %}\n\n {{ return(statements) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "constraint", "type": null, "description": ""}, {"name": "model", "type": null, "description": ""}, {"name": "column", "type": null, "description": ""}], "created_at": 1785250504.9367979, "supported_languages": null}, "macro.dbt_databricks.databricks_constraints_to_dbt": {"name": "databricks_constraints_to_dbt", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\constraints.sql", "original_file_path": "macros\\relations\\constraints.sql", "unique_id": "macro.dbt_databricks.databricks_constraints_to_dbt", "macro_sql": "{% macro databricks_constraints_to_dbt(constraints, column) %}\n {# convert constraints defined using the original databricks format #}\n {% set dbt_constraints = [] %}\n {% for constraint in constraints %}\n {% if constraint.get and constraint.get('type') %}\n {# already in model contract format #}\n {% do dbt_constraints.append(constraint) %}\n {% else %}\n {% if column %}\n {% if constraint == \"not_null\" %}\n {% do dbt_constraints.append({\"type\": \"not_null\", \"columns\": [column.get('name')]}) %}\n {% else %}\n {{ exceptions.raise_compiler_error('Invalid constraint for column ' ~ column.get('name', \"\") ~ '. Only `not_null` is supported.') }}\n {% endif %}\n {% else %}\n {% set name = constraint['name'] %}\n {% if not name %}\n {{ exceptions.raise_compiler_error('Invalid check constraint name') }}\n {% endif %}\n {% set condition = constraint['condition'] %}\n {% if not condition %}\n {{ exceptions.raise_compiler_error('Invalid check constraint condition') }}\n {% endif %}\n {% do dbt_constraints.append({\"name\": name, \"type\": \"check\", \"expression\": condition}) %}\n {% endif %}\n {% endif %}\n {% endfor %}\n\n {{ return(dbt_constraints) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "constraints", "type": null, "description": ""}, {"name": "column", "type": null, "description": ""}], "created_at": 1785250504.9398127, "supported_languages": null}, "macro.dbt_databricks.databricks__get_create_sql": {"name": "databricks__get_create_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\create.sql", "original_file_path": "macros\\relations\\create.sql", "unique_id": "macro.dbt_databricks.databricks__get_create_sql", "macro_sql": "{%- macro databricks__get_create_sql(relation, sql) -%}\n {%- if relation.is_view -%}\n {{ get_create_view_as_sql(relation, sql) }}\n\n {%- elif relation.is_table -%}\n {{ get_create_table_as_sql(False, relation, sql) }}\n\n {%- elif relation.is_materialized_view -%}\n {{ get_create_materialized_view_as_sql(relation, sql) }}\n\n {%- elif relation.is_streaming_table -%}\n {{ get_create_streaming_table_as_sql(relation, sql) }}\n\n {%- else -%}\n {{- exceptions.raise_compiler_error(\"`get_create_sql` has not been implemented for: \" ~ relation.type ) -}}\n\n {%- endif -%}\n\n{%- endmacro -%}", "depends_on": {"macros": ["macro.dbt.get_create_view_as_sql", "macro.dbt.get_create_table_as_sql", "macro.dbt.get_create_materialized_view_as_sql", "macro.dbt_databricks.get_create_streaming_table_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250504.9408214, "supported_languages": null}, "macro.dbt_databricks.create_backup": {"name": "create_backup", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\create_backup.sql", "original_file_path": "macros\\relations\\create_backup.sql", "unique_id": "macro.dbt_databricks.create_backup", "macro_sql": "{%- macro create_backup(relation) -%}\n -- get the standard backup name\n {% set backup_relation = make_backup_relation(relation, relation.type) %}\n\n -- drop any pre-existing backup\n {{ drop_relation_if_exists(backup_relation) }}\n\n {{ adapter.rename_relation(relation, backup_relation) }}\n{%- endmacro -%}", "depends_on": {"macros": ["macro.dbt.make_backup_relation", "macro.dbt.drop_relation_if_exists"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9418204, "supported_languages": null}, "macro.dbt_databricks.databricks__get_create_intermediate_sql": {"name": "databricks__get_create_intermediate_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\create_intermediate.sql", "original_file_path": "macros\\relations\\create_intermediate.sql", "unique_id": "macro.dbt_databricks.databricks__get_create_intermediate_sql", "macro_sql": "{%- macro databricks__get_create_intermediate_sql(relation, sql) -%}\n {% set intermediate_relation = make_intermediate_relation(relation) %}\n\n -- drop any pre-existing intermediate\n {{ drop_relation(intermediate_relation) }}\n\n {{ return(get_create_sql(intermediate_relation, sql)) }}\n\n{%- endmacro -%}", "depends_on": {"macros": ["macro.dbt.make_intermediate_relation", "macro.dbt.drop_relation", "macro.dbt.get_create_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250504.9428213, "supported_languages": null}, "macro.dbt_databricks.databricks__get_drop_sql": {"name": "databricks__get_drop_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\drop.sql", "original_file_path": "macros\\relations\\drop.sql", "unique_id": "macro.dbt_databricks.databricks__get_drop_sql", "macro_sql": "{% macro databricks__get_drop_sql(relation) -%}\n {%- if relation.is_materialized_view -%}\n {{ drop_materialized_view(relation) }}\n {%- elif relation.is_streaming_table-%}\n {{ drop_streaming_table(relation) }}\n {%- elif relation.is_view -%}\n {{ drop_view(relation) }}\n {%- else -%}\n {{ drop_table(relation) }}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.drop_materialized_view", "macro.dbt_databricks.drop_streaming_table", "macro.dbt.drop_view", "macro.dbt.drop_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9438202, "supported_languages": null}, "macro.dbt_databricks.databricks__drop_relation": {"name": "databricks__drop_relation", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\drop.sql", "original_file_path": "macros\\relations\\drop.sql", "unique_id": "macro.dbt_databricks.databricks__drop_relation", "macro_sql": "{% macro databricks__drop_relation(relation) -%}\n {% call statement('drop_relation', auto_begin=False) -%}\n {{ get_drop_sql(relation) }}\n {%- endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.get_drop_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9438202, "supported_languages": null}, "macro.dbt_databricks.execute_no_op": {"name": "execute_no_op", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\execute.sql", "original_file_path": "macros\\relations\\execute.sql", "unique_id": "macro.dbt_databricks.execute_no_op", "macro_sql": "{% macro execute_no_op(target_relation) %}\n {% do store_raw_result(\n name=\"main\",\n message=\"skip \" ~ target_relation,\n code=\"skip\",\n rows_affected=\"-1\"\n ) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250504.9448266, "supported_languages": null}, "macro.dbt_databricks.file_format_clause": {"name": "file_format_clause", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\file_format.sql", "original_file_path": "macros\\relations\\file_format.sql", "unique_id": "macro.dbt_databricks.file_format_clause", "macro_sql": "{% macro file_format_clause(catalog_relation=none) %}\n {#--\n Moving forward, this macro should require a `catalog_relation`, which is covered by the first condition.\n However, there could be existing macros that is still passing no arguments, including user macros.\n Hence, we need to support the old code still, which is covered by the second condition.\n --#}\n {% if catalog_relation is not none %}\n {%- set file_format = catalog_relation.file_format -%}\n {% else %}\n {%- set file_format = config.get('file_format', default='delta') -%}\n {% endif %}\n using {{ file_format }}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "catalog_relation", "type": null, "description": ""}], "created_at": 1785250504.9457998, "supported_languages": null}, "macro.dbt_databricks.get_file_format": {"name": "get_file_format", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\file_format.sql", "original_file_path": "macros\\relations\\file_format.sql", "unique_id": "macro.dbt_databricks.get_file_format", "macro_sql": "{% macro get_file_format(catalog_relation=none) %}\n {#-\n Moving forward, this macro should require a `catalog_relation`, which is covered by the first condition.\n However, there could be existing macros that is still passing no arguments, including user macros.\n Hence, we need to support the old code still, which is covered by the second condition.\n -#}\n {% if catalog_relation is not none %}\n {%- set raw_file_format = catalog_relation.file_format -%}\n {% else %}\n {%- set raw_file_format = config.get('file_format', default='delta') -%}\n {% endif %}\n {% do return(dbt_databricks_validate_get_file_format(raw_file_format)) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.dbt_databricks_validate_get_file_format"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "catalog_relation", "type": null, "description": ""}], "created_at": 1785250504.9467783, "supported_languages": null}, "macro.dbt_databricks.liquid_clustered_cols": {"name": "liquid_clustered_cols", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\liquid_clustering.sql", "original_file_path": "macros\\relations\\liquid_clustering.sql", "unique_id": "macro.dbt_databricks.liquid_clustered_cols", "macro_sql": "{% macro liquid_clustered_cols() -%}\n {%- set cols = config.get('liquid_clustered_by', validator=validation.any[list, basestring]) -%}\n {%- set auto_cluster = config.get('auto_liquid_cluster', validator=validation.any[boolean]) -%}\n {%- if cols is not none %}\n {%- if cols is string -%}\n {%- set cols = [cols] -%}\n {%- endif -%}\n CLUSTER BY ({{ cols | join(', ') }})\n {%- elif auto_cluster -%}\n CLUSTER BY AUTO\n {%- endif %}\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250504.948798, "supported_languages": null}, "macro.dbt_databricks.apply_liquid_clustered_cols": {"name": "apply_liquid_clustered_cols", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\liquid_clustering.sql", "original_file_path": "macros\\relations\\liquid_clustering.sql", "unique_id": "macro.dbt_databricks.apply_liquid_clustered_cols", "macro_sql": "{% macro apply_liquid_clustered_cols(target_relation, liquid_clustering) -%}\n {%- set cols = liquid_clustering.cluster_by -%}\n {%- set auto_cluster = liquid_clustering.auto_cluster -%}\n {%- if cols and cols != [] %}\n {%- call statement('set_cluster_by_columns') -%}\n ALTER {{ target_relation.type }} {{ target_relation.render() }} CLUSTER BY ({{ cols | join(', ') }})\n {%- endcall -%}\n {%- elif auto_cluster -%}\n {%- call statement('set_cluster_by_auto') -%}\n ALTER {{ target_relation.type }} {{ target_relation.render() }} CLUSTER BY AUTO\n {%- endcall -%}\n {% else %}\n {%- call statement('unset_cluster_by') -%}\n ALTER {{ target_relation.type }} {{ target_relation.render() }} CLUSTER BY NONE\n {%- endcall -%}\n {%- endif %}\n{%- endmacro -%}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}, {"name": "liquid_clustering", "type": null, "description": ""}], "created_at": 1785250504.9498143, "supported_languages": null}, "macro.dbt_databricks.location_clause": {"name": "location_clause", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\location.sql", "original_file_path": "macros\\relations\\location.sql", "unique_id": "macro.dbt_databricks.location_clause", "macro_sql": "{% macro location_clause(relation) %}\n {#--\n Moving forward, `relation` should be a `CatalogRelation`, which is covered by the first condition.\n However, there could be existing macros that are still passing in a `BaseRelation`, including user macros.\n Hence, we need to support the old code still, which is covered by the second condition.\n --#}\n {%- if relation.catalog_type is not none -%}\n\n {%- if relation.location is not none -%}\n location '{{ relation.location }}{% if is_incremental() %}_tmp{% endif %}'\n {%- endif -%}\n\n {%- else -%}\n\n {%- set location_root = config.get('location_root', validator=validation.any[basestring]) -%}\n {%- set file_format = config.get('file_format', default='delta') -%}\n {%- set identifier = model['alias'] -%}\n {%- if location_root is not none %}\n {%- set model_path = adapter.compute_external_path(config, model, is_incremental()) %}\n location '{{ model_path }}'\n {%- elif (not relation.is_hive_metastore()) and file_format != 'delta' -%}\n {{ exceptions.raise_compiler_error(\n 'Incompatible configuration: `location_root` must be set when using a non-delta file format with Unity Catalog'\n ) }}\n {%- endif %}\n\n {%- endif %}\n{%- endmacro -%}", "depends_on": {"macros": ["macro.dbt.is_incremental"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.951812, "supported_languages": null}, "macro.dbt_databricks.optimize": {"name": "optimize", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\optimize.sql", "original_file_path": "macros\\relations\\optimize.sql", "unique_id": "macro.dbt_databricks.optimize", "macro_sql": "{% macro optimize(relation) %}\n {{ return(adapter.dispatch('optimize', 'dbt')(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__optimize"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.953805, "supported_languages": null}, "macro.dbt_databricks.databricks__optimize": {"name": "databricks__optimize", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\optimize.sql", "original_file_path": "macros\\relations\\optimize.sql", "unique_id": "macro.dbt_databricks.databricks__optimize", "macro_sql": "\n\n{%- macro databricks__optimize(relation) -%}\n {%- if var('DATABRICKS_SKIP_OPTIMIZE', 'false')|lower != 'true' and\n var('databricks_skip_optimize', 'false')|lower != 'true' and\n config.get('file_format', 'delta') == 'delta' -%}\n {%- if (config.get('zorder', False) or config.get('liquid_clustered_by', False)) or config.get('auto_liquid_cluster', False) -%}\n {%- call statement('run_optimize_stmt') -%}\n {{ get_optimize_sql(relation) }}\n {%- endcall -%}\n {%- endif -%}\n {%- endif -%}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_databricks.get_optimize_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9548037, "supported_languages": null}, "macro.dbt_databricks.get_optimize_sql": {"name": "get_optimize_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\optimize.sql", "original_file_path": "macros\\relations\\optimize.sql", "unique_id": "macro.dbt_databricks.get_optimize_sql", "macro_sql": "{%- macro get_optimize_sql(relation) %}\n optimize {{ relation.render() }}\n {%- if config.get('zorder', False) and config.get('file_format', 'delta') == 'delta' %}\n {%- if config.get('liquid_clustered_by', False) or config.get('auto_liquid_cluster', False) %}\n {{ exceptions.warn(\"Both zorder and liquid_clustering are set but they are incompatible. zorder will be ignored.\") }}\n {%- else %}\n {%- set zorder = config.get('zorder', none) %}\n {# TODO: predicates here? WHERE ... #}\n {%- if zorder is sequence and zorder is not string %}\n zorder by (\n {%- for col in zorder %}\n {{ col }}{% if not loop.last %}, {% endif %}\n {%- endfor %}\n )\n {%- else %}\n zorder by ({{zorder}})\n {%- endif %}\n {%- endif %}\n {%- endif %}\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9568198, "supported_languages": null}, "macro.dbt_databricks.get_replace_sql": {"name": "get_replace_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\replace.sql", "original_file_path": "macros\\relations\\replace.sql", "unique_id": "macro.dbt_databricks.get_replace_sql", "macro_sql": "{% macro get_replace_sql(existing_relation, target_relation, sql) %}\n {{- log('Applying REPLACE to: ' ~ existing_relation) -}}\n {% do return(adapter.dispatch('get_replace_sql', 'dbt')(existing_relation, target_relation, sql)) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_replace_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250504.9578125, "supported_languages": null}, "macro.dbt_databricks.databricks__get_replace_sql": {"name": "databricks__get_replace_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\replace.sql", "original_file_path": "macros\\relations\\replace.sql", "unique_id": "macro.dbt_databricks.databricks__get_replace_sql", "macro_sql": "{% macro databricks__get_replace_sql(existing_relation, target_relation, sql) %}\n {# /* if safe_relation_replace, prefer renaming */ #}\n {% if target_relation.type == \"table\" %}\n {{ exceptions.raise_not_implemented('get_replace_sql not implemented for target of table') }}\n {% endif %}\n\n {% set safe_replace = config.get('use_safer_relation_operations', False) | as_bool %}\n {% set file_format = config.get('file_format', default='delta') %}\n {% set is_replaceable = existing_relation.type == target_relation.type and existing_relation.can_be_replaced and file_format == \"delta\" %}\n\n {% if not safe_replace %}\n {# Prioritize 'create or replace' for speed #}\n {% if is_replaceable and existing_relation.is_view %}\n {{ return(get_replace_view_sql(target_relation, sql)) }}\n {% elif is_replaceable and existing_relation.is_table %}\n {{ return(get_replace_table_sql(target_relation, sql)) }}\n {% endif %}\n {% endif %}\n\n {# If safe_replace, then we know that anything that would have been caught above is instead caught here #}\n {% if target_relation.can_be_renamed and existing_relation.can_be_renamed %}\n {{ return(safely_replace(existing_relation, target_relation, sql)) }}\n {% elif target_relation.can_be_renamed %}\n {{ return(stage_then_replace(existing_relation, target_relation, sql)) }}\n {% elif existing_relation.can_be_renamed %}\n {{ return(backup_and_create_in_place(existing_relation, target_relation, sql)) }}\n {% else %}\n {{ return(drop_and_create(existing_relation, target_relation, sql)) }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_replace_view_sql", "macro.dbt.get_replace_table_sql", "macro.dbt_databricks.safely_replace", "macro.dbt_databricks.stage_then_replace", "macro.dbt_databricks.backup_and_create_in_place", "macro.dbt_databricks.drop_and_create"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250504.9608195, "supported_languages": null}, "macro.dbt_databricks.safely_replace": {"name": "safely_replace", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\replace.sql", "original_file_path": "macros\\relations\\replace.sql", "unique_id": "macro.dbt_databricks.safely_replace", "macro_sql": "{% macro safely_replace(existing_relation, target_relation, sql) %}\n {{ log('Using safely_replace') }}\n {% set staging_relation = make_staging_relation(target_relation, type='view') %}\n {{ drop_relation_if_exists(staging_relation) }}\n {% call statement(name=\"main\") %}\n {{ get_create_sql(staging_relation, sql) }}\n {% endcall %}\n {{ create_backup(existing_relation) }}\n {{ return([\n get_rename_sql(staging_relation, existing_relation.render()),\n get_drop_backup_sql(existing_relation)\n ]) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.make_staging_relation", "macro.dbt.drop_relation_if_exists", "macro.dbt.statement", "macro.dbt.get_create_sql", "macro.dbt_databricks.create_backup", "macro.dbt.get_rename_sql", "macro.dbt.get_drop_backup_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250504.962806, "supported_languages": null}, "macro.dbt_databricks.stage_then_replace": {"name": "stage_then_replace", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\replace.sql", "original_file_path": "macros\\relations\\replace.sql", "unique_id": "macro.dbt_databricks.stage_then_replace", "macro_sql": "{% macro stage_then_replace(existing_relation, target_relation, sql) %}\n {{ log('Using stage_then_replace') }}\n {% set staging_relation = make_staging_relation(target_relation, type='view') %}\n {{ drop_relation_if_exists(staging_relation) }}\n {% call statement(name=\"main\") %}\n {{ get_create_sql(staging_relation, sql) }}\n {% endcall %}\n\n {{ return([\n get_drop_sql(existing_relation),\n get_rename_sql(staging_relation, existing_relation.render()),\n ]) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.make_staging_relation", "macro.dbt.drop_relation_if_exists", "macro.dbt.statement", "macro.dbt.get_create_sql", "macro.dbt.get_drop_sql", "macro.dbt.get_rename_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250504.963817, "supported_languages": null}, "macro.dbt_databricks.backup_and_create_in_place": {"name": "backup_and_create_in_place", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\replace.sql", "original_file_path": "macros\\relations\\replace.sql", "unique_id": "macro.dbt_databricks.backup_and_create_in_place", "macro_sql": "{% macro backup_and_create_in_place(existing_relation, target_relation, sql) %}\n {{ log('Using backup_and_create_in_place') }}\n {{ create_backup(existing_relation) }}\n {{ return([\n get_create_sql(target_relation, sql),\n get_drop_backup_sql(existing_relation)\n ]) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.create_backup", "macro.dbt.get_create_sql", "macro.dbt.get_drop_backup_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250504.963817, "supported_languages": null}, "macro.dbt_databricks.drop_and_create": {"name": "drop_and_create", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\replace.sql", "original_file_path": "macros\\relations\\replace.sql", "unique_id": "macro.dbt_databricks.drop_and_create", "macro_sql": "{% macro drop_and_create(existing_relation, target_relation, sql) %}\n {{ log('Using drop_and_create') }}\n {{ return([\n get_drop_sql(existing_relation),\n get_create_sql(target_relation, sql)\n ]) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_drop_sql", "macro.dbt.get_create_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250504.9648259, "supported_languages": null}, "macro.dbt_databricks.fetch_tags": {"name": "fetch_tags", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\tags.sql", "original_file_path": "macros\\relations\\tags.sql", "unique_id": "macro.dbt_databricks.fetch_tags", "macro_sql": "{% macro fetch_tags(relation) -%}\n {% if relation.is_hive_metastore() %}\n {{ exceptions.raise_compiler_error(\"Tags are only supported for Unity Catalog\") }}\n {%- endif %}\n {% call statement('list_tags', fetch_result=True) -%}\n {{ fetch_tags_sql(relation) }}\n {% endcall %}\n {% do return(load_result('list_tags').table) %}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_databricks.fetch_tags_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9658167, "supported_languages": null}, "macro.dbt_databricks.fetch_tags_sql": {"name": "fetch_tags_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\tags.sql", "original_file_path": "macros\\relations\\tags.sql", "unique_id": "macro.dbt_databricks.fetch_tags_sql", "macro_sql": "{% macro fetch_tags_sql(relation) -%}\n SELECT tag_name, tag_value\n FROM `system`.`information_schema`.`table_tags`\n WHERE catalog_name = '{{ relation.database|lower }}' \n AND schema_name = '{{ relation.schema|lower }}'\n AND table_name = '{{ relation.identifier|lower }}'\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9668293, "supported_languages": null}, "macro.dbt_databricks.apply_tags": {"name": "apply_tags", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\tags.sql", "original_file_path": "macros\\relations\\tags.sql", "unique_id": "macro.dbt_databricks.apply_tags", "macro_sql": "{% macro apply_tags(relation, set_tags) -%}\n {{ log(\"Applying tags to relation \" ~ set_tags) }}\n {%- if set_tags and relation.is_hive_metastore() -%}\n {{ exceptions.raise_compiler_error(\"Tags are only supported for Unity Catalog\") }}\n {%- endif -%}\n {%- if set_tags %}\n {%- call statement('main') -%}\n {{ alter_set_tags(relation, set_tags) }}\n {%- endcall -%}\n {%- endif %}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_databricks.alter_set_tags"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "set_tags", "type": null, "description": ""}], "created_at": 1785250504.9678175, "supported_languages": null}, "macro.dbt_databricks.alter_set_tags": {"name": "alter_set_tags", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\tags.sql", "original_file_path": "macros\\relations\\tags.sql", "unique_id": "macro.dbt_databricks.alter_set_tags", "macro_sql": "{% macro alter_set_tags(relation, tags) -%}\n ALTER {{ relation.type }} {{ relation.render() }} SET TAGS (\n {% for tag in tags -%}\n '{{ tag }}' = '{{ tags[tag] }}' {%- if not loop.last %}, {% endif -%}\n {%- endfor %}\n )\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "tags", "type": null, "description": ""}], "created_at": 1785250504.9678175, "supported_languages": null}, "macro.dbt_databricks.tblproperties_clause": {"name": "tblproperties_clause", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\tblproperties.sql", "original_file_path": "macros\\relations\\tblproperties.sql", "unique_id": "macro.dbt_databricks.tblproperties_clause", "macro_sql": "{% macro tblproperties_clause() -%}\n {{ return(adapter.dispatch('tblproperties_clause', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_databricks.databricks__tblproperties_clause"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250504.9688187, "supported_languages": null}, "macro.dbt_databricks.databricks__tblproperties_clause": {"name": "databricks__tblproperties_clause", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\tblproperties.sql", "original_file_path": "macros\\relations\\tblproperties.sql", "unique_id": "macro.dbt_databricks.databricks__tblproperties_clause", "macro_sql": "{% macro databricks__tblproperties_clause(tblproperties=None) -%}\n {%- set tblproperties = adapter.update_tblproperties_for_iceberg(config, tblproperties) -%}\n {%- if tblproperties != {} %}\n tblproperties (\n {%- for prop in tblproperties -%}\n '{{ prop }}' = '{{ tblproperties[prop] }}' {% if not loop.last %}, {% endif %}\n {%- endfor %}\n )\n {%- endif %}\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "tblproperties", "type": null, "description": ""}], "created_at": 1785250504.9698193, "supported_languages": null}, "macro.dbt_databricks.apply_tblproperties": {"name": "apply_tblproperties", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\tblproperties.sql", "original_file_path": "macros\\relations\\tblproperties.sql", "unique_id": "macro.dbt_databricks.apply_tblproperties", "macro_sql": "{% macro apply_tblproperties(relation, tblproperties) -%}\n {% set tblproperty_statment = databricks__tblproperties_clause(tblproperties) %}\n {% if tblproperty_statment %}\n {%- call statement('main') -%}\n ALTER {{ relation.type }} {{ relation.render() }} SET {{ tblproperty_statment}}\n {%- endcall -%}\n {% endif %}\n{%- endmacro -%}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__tblproperties_clause", "macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "tblproperties", "type": null, "description": ""}], "created_at": 1785250504.9708068, "supported_languages": null}, "macro.dbt_databricks.fetch_column_masks": {"name": "fetch_column_masks", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\column_mask.sql", "original_file_path": "macros\\relations\\components\\column_mask.sql", "unique_id": "macro.dbt_databricks.fetch_column_masks", "macro_sql": "{% macro fetch_column_masks(relation) -%}\n {% if relation.is_hive_metastore() %}\n {{ exceptions.raise_compiler_error(\"Column masks are not supported for Hive Metastore\") }}\n {%- endif %}\n {% call statement('list_column_masks', fetch_result=True) -%}\n {{ fetch_column_masks_sql(relation) }}\n {% endcall %}\n {% do return(load_result('list_column_masks').table) %}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_databricks.fetch_column_masks_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9728181, "supported_languages": null}, "macro.dbt_databricks.fetch_column_masks_sql": {"name": "fetch_column_masks_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\column_mask.sql", "original_file_path": "macros\\relations\\components\\column_mask.sql", "unique_id": "macro.dbt_databricks.fetch_column_masks_sql", "macro_sql": "{% macro fetch_column_masks_sql(relation) -%}\n SELECT \n column_name,\n mask_name,\n using_columns\n FROM `system`.`information_schema`.`column_masks`\n WHERE table_catalog = '{{ relation.database|lower }}'\n AND table_schema = '{{ relation.schema|lower }}'\n AND table_name = '{{ relation.identifier|lower }}';\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9728181, "supported_languages": null}, "macro.dbt_databricks.apply_column_masks": {"name": "apply_column_masks", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\column_mask.sql", "original_file_path": "macros\\relations\\components\\column_mask.sql", "unique_id": "macro.dbt_databricks.apply_column_masks", "macro_sql": "{% macro apply_column_masks(relation, column_masks) -%}\n {% if relation.is_hive_metastore() %}\n {{ exceptions.raise_compiler_error(\"Column masks are not supported for Hive Metastore\") }}\n {%- endif %}\n {{ log(\"Applying column masks to relation \" ~ relation) }}\n {%- if column_masks.unset_column_masks %}\n {%- for column in column_masks.unset_column_masks -%}\n {%- call statement('main') -%}\n {{ alter_drop_column_mask(relation, column) }}\n {%- endcall -%}\n {%- endfor -%}\n {%- endif %}\n {%- if column_masks.set_column_masks %}\n {%- for column, mask in column_masks.set_column_masks.items() -%}\n {%- call statement('main') -%}\n {{ alter_set_column_mask(relation, column, mask) }}\n {%- endcall -%}\n {%- endfor -%}\n {%- endif %}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_databricks.alter_drop_column_mask", "macro.dbt_databricks.alter_set_column_mask"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column_masks", "type": null, "description": ""}], "created_at": 1785250504.9748147, "supported_languages": null}, "macro.dbt_databricks.alter_drop_column_mask": {"name": "alter_drop_column_mask", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\column_mask.sql", "original_file_path": "macros\\relations\\components\\column_mask.sql", "unique_id": "macro.dbt_databricks.alter_drop_column_mask", "macro_sql": "{% macro alter_drop_column_mask(relation, column) -%}\n ALTER {{ relation.type }} {{ relation.render() }}\n ALTER COLUMN `{{ column }}`\n DROP MASK;\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column", "type": null, "description": ""}], "created_at": 1785250504.9748147, "supported_languages": null}, "macro.dbt_databricks.alter_set_column_mask": {"name": "alter_set_column_mask", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\column_mask.sql", "original_file_path": "macros\\relations\\components\\column_mask.sql", "unique_id": "macro.dbt_databricks.alter_set_column_mask", "macro_sql": "{% macro alter_set_column_mask(relation, column, mask) -%}\n ALTER {{ relation.type }} {{ relation.render() }}\n ALTER COLUMN `{{ column }}`\n SET MASK {{ mask.function }}\n {%- if mask.using_columns %}\n USING COLUMNS ({{ mask.using_columns }})\n {%- endif %};\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column", "type": null, "description": ""}, {"name": "mask", "type": null, "description": ""}], "created_at": 1785250504.9758255, "supported_languages": null}, "macro.dbt_databricks.column_mask_exists": {"name": "column_mask_exists", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\column_mask.sql", "original_file_path": "macros\\relations\\components\\column_mask.sql", "unique_id": "macro.dbt_databricks.column_mask_exists", "macro_sql": "{% macro column_mask_exists() %}\n {% for column_name, column in model.columns.items() %}\n {% if column is mapping and column.get('column_mask') %}\n {{ return(true) }}\n {% endif %}\n {% endfor %}\n {{ return(false) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250504.9758255, "supported_languages": null}, "macro.dbt_databricks.fetch_column_tags": {"name": "fetch_column_tags", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\column_tags.sql", "original_file_path": "macros\\relations\\components\\column_tags.sql", "unique_id": "macro.dbt_databricks.fetch_column_tags", "macro_sql": "{% macro fetch_column_tags(relation) -%}\n {% if relation.is_hive_metastore() %}\n {{ exceptions.raise_compiler_error(\"Column tags are only supported for Unity Catalog\") }}\n {%- endif %}\n {% call statement('list_column_tags', fetch_result=True) -%}\n {{ fetch_column_tags_sql(relation) }}\n {% endcall %}\n {% do return(load_result('list_column_tags').table) %}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_databricks.fetch_column_tags_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9787817, "supported_languages": null}, "macro.dbt_databricks.fetch_column_tags_sql": {"name": "fetch_column_tags_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\column_tags.sql", "original_file_path": "macros\\relations\\components\\column_tags.sql", "unique_id": "macro.dbt_databricks.fetch_column_tags_sql", "macro_sql": "{% macro fetch_column_tags_sql(relation) -%}\n SELECT \n column_name,\n tag_name,\n tag_value\n FROM `system`.`information_schema`.`column_tags`\n WHERE catalog_name = '{{ relation.database|lower }}'\n AND schema_name = '{{ relation.schema|lower }}'\n AND table_name = '{{ relation.identifier|lower }}';\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9787817, "supported_languages": null}, "macro.dbt_databricks.apply_column_tags": {"name": "apply_column_tags", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\column_tags.sql", "original_file_path": "macros\\relations\\components\\column_tags.sql", "unique_id": "macro.dbt_databricks.apply_column_tags", "macro_sql": "{% macro apply_column_tags(relation, column_tags) -%}\n {% if relation.is_hive_metastore() %}\n {{ exceptions.raise_compiler_error(\"Column tags are only supported for Unity Catalog\") }}\n {%- endif %}\n {{ log(\"Applying column tags to relation \" ~ relation) }}\n {%- if column_tags.set_column_tags %}\n {%- for column, tags in column_tags.set_column_tags.items() -%}\n {%- call statement('main') -%}\n {{ alter_set_column_tags(relation, column, tags) }}\n {%- endcall -%}\n {%- endfor -%}\n {%- endif %}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_databricks.alter_set_column_tags"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column_tags", "type": null, "description": ""}], "created_at": 1785250504.9797835, "supported_languages": null}, "macro.dbt_databricks.alter_set_column_tags": {"name": "alter_set_column_tags", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\column_tags.sql", "original_file_path": "macros\\relations\\components\\column_tags.sql", "unique_id": "macro.dbt_databricks.alter_set_column_tags", "macro_sql": "{% macro alter_set_column_tags(relation, column, tags) -%}\n {# ALTER VIEW does not support setting column tags, but ALTER TABLE works for views #}\n {%- if relation.type == 'view' -%}\n ALTER TABLE {{ relation.render() }}\n {%- else -%}\n ALTER {{ relation.type | replace('_', ' ') }} {{ relation.render() }}\n {%- endif -%}\n ALTER COLUMN `{{ column }}`\n SET TAGS (\n {%- for tag_name, tag_value in tags.items() -%}\n '{{ tag_name }}' = '{{ tag_value }}'{%- if not loop.last %}, {% endif -%}\n {%- endfor -%}\n )\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column", "type": null, "description": ""}, {"name": "tags", "type": null, "description": ""}], "created_at": 1785250504.9817946, "supported_languages": null}, "macro.dbt_databricks.column_tags_exist": {"name": "column_tags_exist", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\column_tags.sql", "original_file_path": "macros\\relations\\components\\column_tags.sql", "unique_id": "macro.dbt_databricks.column_tags_exist", "macro_sql": "{% macro column_tags_exist() %}\n {% for column_name, column in model.columns.items() %}\n {% if column is mapping and column.get('databricks_tags') %}\n {{ return(true) }}\n {% endif %}\n {% endfor %}\n {{ return(false) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250504.9817946, "supported_languages": null}, "macro.dbt_databricks.get_create_sql_comment": {"name": "get_create_sql_comment", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\comment.sql", "original_file_path": "macros\\relations\\components\\comment.sql", "unique_id": "macro.dbt_databricks.get_create_sql_comment", "macro_sql": "{%- macro get_create_sql_comment(comment) -%}\n{% if comment is string -%}\n COMMENT '{{ comment }}'\n{%- endif -%}\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "comment", "type": null, "description": ""}], "created_at": 1785250504.9828014, "supported_languages": null}, "macro.dbt_databricks.fetch_non_null_constraint_columns": {"name": "fetch_non_null_constraint_columns", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\constraints.sql", "original_file_path": "macros\\relations\\components\\constraints.sql", "unique_id": "macro.dbt_databricks.fetch_non_null_constraint_columns", "macro_sql": "{% macro fetch_non_null_constraint_columns(relation) -%}\n {% if relation.is_hive_metastore() %}\n {{ exceptions.raise_compiler_error(\"Incremental application of constraints is not supported for Hive Metastore\") }}\n {%- endif %}\n {% call statement('list_non_null_constraint_columns', fetch_result=True) -%}\n {{ fetch_non_null_constraint_columns_sql(relation) }}\n {% endcall %}\n {% do return(load_result('list_non_null_constraint_columns').table) %}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_databricks.fetch_non_null_constraint_columns_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9847946, "supported_languages": null}, "macro.dbt_databricks.fetch_non_null_constraint_columns_sql": {"name": "fetch_non_null_constraint_columns_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\constraints.sql", "original_file_path": "macros\\relations\\components\\constraints.sql", "unique_id": "macro.dbt_databricks.fetch_non_null_constraint_columns_sql", "macro_sql": "{% macro fetch_non_null_constraint_columns_sql(relation) -%}\n SELECT column_name\n FROM `{{ relation.database|lower }}`.`information_schema`.`columns`\n WHERE table_catalog = '{{ relation.database|lower }}' \n AND table_schema = '{{ relation.schema|lower }}'\n AND table_name = '{{ relation.identifier|lower }}'\n AND is_nullable = 'NO';\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9857967, "supported_languages": null}, "macro.dbt_databricks.fetch_primary_key_constraints": {"name": "fetch_primary_key_constraints", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\constraints.sql", "original_file_path": "macros\\relations\\components\\constraints.sql", "unique_id": "macro.dbt_databricks.fetch_primary_key_constraints", "macro_sql": "{% macro fetch_primary_key_constraints(relation) -%}\n {% if relation.is_hive_metastore() %}\n {{ exceptions.raise_compiler_error(\"Incremental application of constraints is not supported for Hive Metastore\") }}\n {%- endif %}\n {% call statement('list_primary_key_constraints', fetch_result=True) -%}\n {{ fetch_primary_key_constraints_sql(relation) }}\n {% endcall %}\n {% do return(load_result('list_primary_key_constraints').table) %}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_databricks.fetch_primary_key_constraints_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9868002, "supported_languages": null}, "macro.dbt_databricks.fetch_primary_key_constraints_sql": {"name": "fetch_primary_key_constraints_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\constraints.sql", "original_file_path": "macros\\relations\\components\\constraints.sql", "unique_id": "macro.dbt_databricks.fetch_primary_key_constraints_sql", "macro_sql": "{% macro fetch_primary_key_constraints_sql(relation) -%}\n SELECT kcu.constraint_name, kcu.column_name\n FROM `{{ relation.database|lower }}`.information_schema.key_column_usage kcu\n WHERE kcu.table_catalog = '{{ relation.database|lower }}' \n AND kcu.table_schema = '{{ relation.schema|lower }}'\n AND kcu.table_name = '{{ relation.identifier|lower }}' \n AND kcu.constraint_name = (\n SELECT constraint_name\n FROM `{{ relation.database|lower }}`.information_schema.table_constraints\n WHERE table_catalog = '{{ relation.database|lower }}'\n AND table_schema = '{{ relation.schema|lower }}'\n AND table_name = '{{ relation.identifier|lower }}' \n AND constraint_type = 'PRIMARY KEY'\n )\n ORDER BY kcu.ordinal_position;\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.987795, "supported_languages": null}, "macro.dbt_databricks.fetch_foreign_key_constraints": {"name": "fetch_foreign_key_constraints", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\constraints.sql", "original_file_path": "macros\\relations\\components\\constraints.sql", "unique_id": "macro.dbt_databricks.fetch_foreign_key_constraints", "macro_sql": "{% macro fetch_foreign_key_constraints(relation) -%}\n {% if relation.is_hive_metastore() %}\n {{ exceptions.raise_compiler_error(\"Incremental application of constraints is not supported for Hive Metastore\") }}\n {%- endif %}\n {% call statement('list_foreign_key_constraints', fetch_result=True) -%}\n {{ fetch_foreign_key_constraints_sql(relation) }}\n {% endcall %}\n {% do return(load_result('list_foreign_key_constraints').table) %}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_databricks.fetch_foreign_key_constraints_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.987795, "supported_languages": null}, "macro.dbt_databricks.fetch_foreign_key_constraints_sql": {"name": "fetch_foreign_key_constraints_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\constraints.sql", "original_file_path": "macros\\relations\\components\\constraints.sql", "unique_id": "macro.dbt_databricks.fetch_foreign_key_constraints_sql", "macro_sql": "{% macro fetch_foreign_key_constraints_sql(relation) -%}\n SELECT\n kcu.constraint_name,\n kcu.column_name AS from_column,\n ukcu.table_catalog AS to_catalog,\n ukcu.table_schema AS to_schema,\n ukcu.table_name AS to_table,\n ukcu.column_name AS to_column\n FROM `{{ relation.database|lower }}`.information_schema.key_column_usage kcu\n JOIN `{{ relation.database|lower }}`.information_schema.referential_constraints rc\n ON kcu.constraint_name = rc.constraint_name\n JOIN `{{ relation.database|lower }}`.information_schema.key_column_usage ukcu\n ON rc.unique_constraint_name = ukcu.constraint_name\n AND kcu.ordinal_position = ukcu.ordinal_position\n WHERE kcu.table_catalog = '{{ relation.database|lower }}'\n AND kcu.table_schema = '{{ relation.schema|lower }}'\n AND kcu.table_name = '{{ relation.identifier|lower }}'\n AND kcu.constraint_name IN (\n SELECT constraint_name\n FROM `{{ relation.database|lower }}`.information_schema.table_constraints\n WHERE table_catalog = '{{ relation.database|lower }}'\n AND table_schema = '{{ relation.schema|lower }}'\n AND table_name = '{{ relation.identifier|lower }}'\n AND constraint_type = 'FOREIGN KEY'\n )\n ORDER BY kcu.ordinal_position;\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250504.9888008, "supported_languages": null}, "macro.dbt_databricks.apply_constraints": {"name": "apply_constraints", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\constraints.sql", "original_file_path": "macros\\relations\\components\\constraints.sql", "unique_id": "macro.dbt_databricks.apply_constraints", "macro_sql": "{% macro apply_constraints(relation, constraints) -%}\n {{ log(\"Applying constraints to relation \" ~ constraints) }}\n {%- if constraints and relation.is_hive_metastore() -%}\n {{ exceptions.raise_compiler_error(\"Constraints are only supported for Unity Catalog\") }}\n {%- endif -%}\n {# Order matters here because key constraints depend on non-null constraints #} \n {%- if constraints.unset_constraints %}\n {%- for constraint in constraints.unset_constraints -%}\n {%- call statement('main') -%}\n {{ alter_unset_constraint(relation, constraint) }}\n {%- endcall -%}\n {%- endfor -%}\n {%- endif %}\n {%- if constraints.unset_non_nulls %}\n {%- for column in constraints.unset_non_nulls -%}\n {%- call statement('main') -%}\n {{ alter_unset_non_null_constraint(relation, column) }}\n {%- endcall -%}\n {%- endfor -%}\n {%- endif %}\n {%- if constraints.set_non_nulls %}\n {%- for column in constraints.set_non_nulls -%}\n {%- call statement('main') -%}\n {{ alter_set_non_null_constraint(relation, column) }}\n {%- endcall -%}\n {%- endfor -%}\n {%- endif %}\n {%- if constraints.set_constraints %}\n {%- for constraint in constraints.set_constraints -%}\n {%- call statement('main') -%}\n {{ alter_set_constraint(relation, constraint) }}\n {%- endcall -%}\n {%- endfor -%}\n {%- endif %}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_databricks.alter_unset_constraint", "macro.dbt_databricks.alter_unset_non_null_constraint", "macro.dbt_databricks.alter_set_non_null_constraint", "macro.dbt_databricks.alter_set_constraint"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "constraints", "type": null, "description": ""}], "created_at": 1785250504.9917953, "supported_languages": null}, "macro.dbt_databricks.alter_set_non_null_constraint": {"name": "alter_set_non_null_constraint", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\constraints.sql", "original_file_path": "macros\\relations\\components\\constraints.sql", "unique_id": "macro.dbt_databricks.alter_set_non_null_constraint", "macro_sql": "{% macro alter_set_non_null_constraint(relation, column) -%}\n ALTER {{ relation.type }} {{ relation.render() }} ALTER COLUMN {{ column }} SET NOT NULL;\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column", "type": null, "description": ""}], "created_at": 1785250504.9917953, "supported_languages": null}, "macro.dbt_databricks.alter_unset_non_null_constraint": {"name": "alter_unset_non_null_constraint", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\constraints.sql", "original_file_path": "macros\\relations\\components\\constraints.sql", "unique_id": "macro.dbt_databricks.alter_unset_non_null_constraint", "macro_sql": "{% macro alter_unset_non_null_constraint(relation, column) -%}\n ALTER {{ relation.type }} {{ relation.render() }} ALTER COLUMN {{ column }} DROP NOT NULL;\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column", "type": null, "description": ""}], "created_at": 1785250504.9927998, "supported_languages": null}, "macro.dbt_databricks.alter_set_constraint": {"name": "alter_set_constraint", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\constraints.sql", "original_file_path": "macros\\relations\\components\\constraints.sql", "unique_id": "macro.dbt_databricks.alter_set_constraint", "macro_sql": "{% macro alter_set_constraint(relation, constraint) -%}\n ALTER {{ relation.type }} {{ relation.render() }} ADD {{ constraint.render() }};\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "constraint", "type": null, "description": ""}], "created_at": 1785250504.9927998, "supported_languages": null}, "macro.dbt_databricks.alter_unset_constraint": {"name": "alter_unset_constraint", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\constraints.sql", "original_file_path": "macros\\relations\\components\\constraints.sql", "unique_id": "macro.dbt_databricks.alter_unset_constraint", "macro_sql": "{% macro alter_unset_constraint(relation, constraint) -%}\n {% set constraint_type = constraint.type %}\n {% if constraint_type == 'primary_key' %}\n {# Need to only add CASCADE to PK constraints because dropping check constraints break when adding CASCADE #}\n ALTER {{ relation.type }} {{ relation.render() }} DROP CONSTRAINT {{ constraint.name }} CASCADE;\n {% else %}\n ALTER {{ relation.type }} {{ relation.render() }} DROP CONSTRAINT IF EXISTS {{ constraint.name }};\n {% endif %}\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "constraint", "type": null, "description": ""}], "created_at": 1785250504.9937985, "supported_languages": null}, "macro.dbt_databricks.get_create_sql_partition_by": {"name": "get_create_sql_partition_by", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\partitioning.sql", "original_file_path": "macros\\relations\\components\\partitioning.sql", "unique_id": "macro.dbt_databricks.get_create_sql_partition_by", "macro_sql": "{% macro get_create_sql_partition_by(partition_by) -%}\n{%- if partition_by -%}\n PARTITIONED BY ({%- for col in partition_by -%}{{ col }}{% if not loop.last %}, {% endif %}{%- endfor %})\n{%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "partition_by", "type": null, "description": ""}], "created_at": 1785250504.9947987, "supported_languages": null}, "macro.dbt_databricks.alter_query": {"name": "alter_query", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\query.sql", "original_file_path": "macros\\relations\\components\\query.sql", "unique_id": "macro.dbt_databricks.alter_query", "macro_sql": "{% macro alter_query(target_relation, query) %}\n {{ log(\"Altering query\") }}\n {% if query %}\n {% call statement('main') %}\n {{- get_alter_query_sql(target_relation, query) }}\n {% endcall %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_databricks.get_alter_query_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}, {"name": "query", "type": null, "description": ""}], "created_at": 1785250504.9953089, "supported_languages": null}, "macro.dbt_databricks.get_alter_query_sql": {"name": "get_alter_query_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\query.sql", "original_file_path": "macros\\relations\\components\\query.sql", "unique_id": "macro.dbt_databricks.get_alter_query_sql", "macro_sql": "{% macro get_alter_query_sql(target_relation, query) -%}\n ALTER {{ target_relation.type|upper }} {{ target_relation.render() }} AS (\n {{ query }}\n )\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}, {"name": "query", "type": null, "description": ""}], "created_at": 1785250504.996323, "supported_languages": null}, "macro.dbt_databricks.get_create_sql_refresh_schedule": {"name": "get_create_sql_refresh_schedule", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\refresh_schedule.sql", "original_file_path": "macros\\relations\\components\\refresh_schedule.sql", "unique_id": "macro.dbt_databricks.get_create_sql_refresh_schedule", "macro_sql": "{% macro get_create_sql_refresh_schedule(cron, time_zone_value) %}\n {%- if cron -%}\n SCHEDULE CRON '{{ cron }}'{%- if time_zone_value %} AT TIME ZONE '{{ time_zone_value }}'{%- endif -%}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "cron", "type": null, "description": ""}, {"name": "time_zone_value", "type": null, "description": ""}], "created_at": 1785250504.996323, "supported_languages": null}, "macro.dbt_databricks.get_alter_sql_refresh_schedule": {"name": "get_alter_sql_refresh_schedule", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\refresh_schedule.sql", "original_file_path": "macros\\relations\\components\\refresh_schedule.sql", "unique_id": "macro.dbt_databricks.get_alter_sql_refresh_schedule", "macro_sql": "{% macro get_alter_sql_refresh_schedule(cron, time_zone_value, is_altered) %}\n {%- if cron -%}\n {%- if is_altered -%}\n ALTER SCHEDULE CRON '{{ cron }}'{%- if time_zone_value %} AT TIME ZONE '{{ time_zone_value }}'{%- endif -%}\n {%- else -%}\n ADD SCHEDULE CRON '{{ cron }}'{%- if time_zone_value %} AT TIME ZONE '{{ time_zone_value }}'{%- endif -%}\n {%- endif -%}\n {%- else -%}\n DROP SCHEDULE\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "cron", "type": null, "description": ""}, {"name": "time_zone_value", "type": null, "description": ""}, {"name": "is_altered", "type": null, "description": ""}], "created_at": 1785250504.9973226, "supported_languages": null}, "macro.dbt_databricks.get_create_sql_tblproperties": {"name": "get_create_sql_tblproperties", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\components\\tblproperties.sql", "original_file_path": "macros\\relations\\components\\tblproperties.sql", "unique_id": "macro.dbt_databricks.get_create_sql_tblproperties", "macro_sql": "{% macro get_create_sql_tblproperties(tblproperties) %}\n {{ databricks__tblproperties_clause(tblproperties)}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__tblproperties_clause"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "tblproperties", "type": null, "description": ""}], "created_at": 1785250504.9983246, "supported_languages": null}, "macro.dbt_databricks.get_alter_materialized_view_as_sql": {"name": "get_alter_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\materialized_view\\alter.sql", "original_file_path": "macros\\relations\\materialized_view\\alter.sql", "unique_id": "macro.dbt_databricks.get_alter_materialized_view_as_sql", "macro_sql": "{% macro get_alter_materialized_view_as_sql(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n) %}\n {{- log('Applying ALTER to: ' ~ relation) -}}\n {%- do return(adapter.dispatch('get_alter_materialized_view_as_sql', 'dbt')(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n )) -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_alter_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "configuration_changes", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}, {"name": "existing_relation", "type": null, "description": ""}, {"name": "backup_relation", "type": null, "description": ""}, {"name": "intermediate_relation", "type": null, "description": ""}], "created_at": 1785250504.9993227, "supported_languages": null}, "macro.dbt_databricks.databricks__get_alter_materialized_view_as_sql": {"name": "databricks__get_alter_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\materialized_view\\alter.sql", "original_file_path": "macros\\relations\\materialized_view\\alter.sql", "unique_id": "macro.dbt_databricks.databricks__get_alter_materialized_view_as_sql", "macro_sql": "{% macro databricks__get_alter_materialized_view_as_sql(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n) %}\n -- apply a full refresh immediately if needed\n {% if configuration_changes.requires_full_refresh %}\n {% do return(get_replace_sql(existing_relation, relation, sql)) %}\n\n -- otherwise apply individual changes as needed\n {% else %}\n {% do return(get_alter_mv_internal(relation, configuration_changes)) %}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.get_replace_sql", "macro.dbt_databricks.get_alter_mv_internal"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "configuration_changes", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}, {"name": "existing_relation", "type": null, "description": ""}, {"name": "backup_relation", "type": null, "description": ""}, {"name": "intermediate_relation", "type": null, "description": ""}], "created_at": 1785250504.9993227, "supported_languages": null}, "macro.dbt_databricks.get_alter_mv_internal": {"name": "get_alter_mv_internal", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\materialized_view\\alter.sql", "original_file_path": "macros\\relations\\materialized_view\\alter.sql", "unique_id": "macro.dbt_databricks.get_alter_mv_internal", "macro_sql": "{% macro get_alter_mv_internal(relation, configuration_changes) %}\n {%- set refresh = configuration_changes.changes[\"refresh\"] -%}\n -- Currently only schedule can be altered\n ALTER MATERIALIZED VIEW {{ relation.render() }}\n {{ get_alter_sql_refresh_schedule(refresh.cron, refresh.time_zone_value, refresh.is_altered) -}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.get_alter_sql_refresh_schedule"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "configuration_changes", "type": null, "description": ""}], "created_at": 1785250505.0003254, "supported_languages": null}, "macro.dbt_databricks.databricks__get_create_materialized_view_as_sql": {"name": "databricks__get_create_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\materialized_view\\create.sql", "original_file_path": "macros\\relations\\materialized_view\\create.sql", "unique_id": "macro.dbt_databricks.databricks__get_create_materialized_view_as_sql", "macro_sql": "{% macro databricks__get_create_materialized_view_as_sql(relation, sql) -%}\n {# Column masks are supported in DBSQL, but not yet wired up to the adapter. Return a helpful error until supported. #}\n {% if column_mask_exists() %}\n {% do exceptions.raise_compiler_error(\"Column masks are not yet supported for materialized views.\") %}\n {% endif %}\n {%- set materialized_view = adapter.get_config_from_model(config.model) -%}\n {%- set partition_by = materialized_view.config[\"partition_by\"].partition_by -%}\n {%- set tblproperties = materialized_view.config[\"tblproperties\"].tblproperties -%}\n {%- set comment = materialized_view.config[\"comment\"].comment -%}\n {%- set refresh = materialized_view.config[\"refresh\"] -%}\n\n {#\n TODO: When DESCRIBE QUERY EXTENDED is supported, this implementation should be simplified\n to use that instead. For now, we work around this limitation by writing results to a\n temporary view and using DESCRIBE TABLE EXTENDED on the temporary view.\n #}\n {%- set temp_relation = make_temp_relation(relation) -%}\n {% call statement('create_temp_view') -%}\n {%- set sql_with_limit = sql.rstrip('; \\n\\t') ~ ' LIMIT 10' -%}\n {{ create_temporary_view(temp_relation, sql_with_limit) }}\n {%- endcall %}\n\n {%- set columns = adapter.get_columns_in_relation(temp_relation) -%}\n {%- set model_columns = model.get('columns', {}) -%}\n {%- set model_constraints = model.get('constraints', []) -%}\n {%- set columns_and_constraints = adapter.parse_columns_and_constraints(columns, model_columns, model_constraints) -%}\n {%- set target_relation = relation.enrich(columns_and_constraints[1]) -%}\n\n create materialized view {{ target_relation.render() }}\n {{ get_column_and_constraints_sql(target_relation, columns_and_constraints[0]) }}\n {{ get_create_sql_partition_by(partition_by) }}\n {{ get_create_sql_comment(comment) }}\n {{ get_create_sql_tblproperties(tblproperties) }}\n {{ get_create_sql_refresh_schedule(refresh.cron, refresh.time_zone_value) }}\n as\n {{ sql }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.column_mask_exists", "macro.dbt.make_temp_relation", "macro.dbt.statement", "macro.dbt_spark.create_temporary_view", "macro.dbt_databricks.get_column_and_constraints_sql", "macro.dbt_databricks.get_create_sql_partition_by", "macro.dbt_databricks.get_create_sql_comment", "macro.dbt_databricks.get_create_sql_tblproperties", "macro.dbt_databricks.get_create_sql_refresh_schedule"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.0043209, "supported_languages": null}, "macro.dbt_databricks.databricks__drop_materialized_view": {"name": "databricks__drop_materialized_view", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\materialized_view\\drop.sql", "original_file_path": "macros\\relations\\materialized_view\\drop.sql", "unique_id": "macro.dbt_databricks.databricks__drop_materialized_view", "macro_sql": "{% macro databricks__drop_materialized_view(relation) -%}\n drop materialized view if exists {{ relation.render() }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.0043209, "supported_languages": null}, "macro.dbt_databricks.databricks__refresh_materialized_view": {"name": "databricks__refresh_materialized_view", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\materialized_view\\refresh.sql", "original_file_path": "macros\\relations\\materialized_view\\refresh.sql", "unique_id": "macro.dbt_databricks.databricks__refresh_materialized_view", "macro_sql": "{% macro databricks__refresh_materialized_view(relation) -%}\n refresh materialized view {{ relation.render() }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.0053253, "supported_languages": null}, "macro.dbt_databricks.get_alter_streaming_table_as_sql": {"name": "get_alter_streaming_table_as_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\streaming_table\\alter.sql", "original_file_path": "macros\\relations\\streaming_table\\alter.sql", "unique_id": "macro.dbt_databricks.get_alter_streaming_table_as_sql", "macro_sql": "{% macro get_alter_streaming_table_as_sql(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n) %}\n {{- log('Applying ALTER to: ' ~ relation) -}}\n {%- do return(adapter.dispatch('get_alter_streaming_table_as_sql', 'dbt')(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n )) -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_alter_streaming_table_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "configuration_changes", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}, {"name": "existing_relation", "type": null, "description": ""}, {"name": "backup_relation", "type": null, "description": ""}, {"name": "intermediate_relation", "type": null, "description": ""}], "created_at": 1785250505.0063217, "supported_languages": null}, "macro.dbt_databricks.databricks__get_alter_streaming_table_as_sql": {"name": "databricks__get_alter_streaming_table_as_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\streaming_table\\alter.sql", "original_file_path": "macros\\relations\\streaming_table\\alter.sql", "unique_id": "macro.dbt_databricks.databricks__get_alter_streaming_table_as_sql", "macro_sql": "{% macro databricks__get_alter_streaming_table_as_sql(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n) %}\n -- apply a full refresh immediately if needed\n {% if configuration_changes.requires_full_refresh %}\n {% do return(get_replace_sql(existing_relation, relation, sql)) %}\n\n -- otherwise apply individual changes as needed\n {% else %}\n {%- set alter_statement = get_alter_st_internal(relation, configuration_changes) -%}\n {%- set create_statement = get_create_st_internal(relation, configuration_changes, sql) -%}\n {%- set return_statements = [] -%}\n {%- if create_statement -%}\n {{ return_statements.append(create_statement) }}\n {%- endif -%}\n {%- if alter_statement -%}\n {{ return_statements.append(alter_statement) }}\n {%- endif -%}\n {% do return(return_statements) %}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.get_replace_sql", "macro.dbt_databricks.get_alter_st_internal", "macro.dbt_databricks.get_create_st_internal"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "configuration_changes", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}, {"name": "existing_relation", "type": null, "description": ""}, {"name": "backup_relation", "type": null, "description": ""}, {"name": "intermediate_relation", "type": null, "description": ""}], "created_at": 1785250505.0073216, "supported_languages": null}, "macro.dbt_databricks.get_create_st_internal": {"name": "get_create_st_internal", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\streaming_table\\alter.sql", "original_file_path": "macros\\relations\\streaming_table\\alter.sql", "unique_id": "macro.dbt_databricks.get_create_st_internal", "macro_sql": "{% macro get_create_st_internal(relation, configuration_changes, sql) %}\n {%- set partition_by = configuration_changes.changes[\"partition_by\"].partition_by -%}\n {%- set tblproperties = configuration_changes.changes[\"tblproperties\"].tblproperties -%}\n {%- set comment = configuration_changes.changes[\"comment\"].comment -%}\n CREATE OR REFRESH STREAMING TABLE {{ relation.render() }}\n {% if partition_by -%}\n {{ get_create_sql_partition_by(partition_by) }}\n {%- endif %}\n {% if comment -%}\n {{ get_create_sql_comment(comment) }}\n {%- endif %}\n {% if tblproperties -%}\n {{ get_create_sql_tblproperties(tblproperties) }}\n {%- endif %}\n AS {{ sql }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.get_create_sql_partition_by", "macro.dbt_databricks.get_create_sql_comment", "macro.dbt_databricks.get_create_sql_tblproperties"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "configuration_changes", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.00932, "supported_languages": null}, "macro.dbt_databricks.get_alter_st_internal": {"name": "get_alter_st_internal", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\streaming_table\\alter.sql", "original_file_path": "macros\\relations\\streaming_table\\alter.sql", "unique_id": "macro.dbt_databricks.get_alter_st_internal", "macro_sql": "{% macro get_alter_st_internal(relation, configuration_changes) %}\n {%- set refresh = configuration_changes.changes[\"refresh\"] -%}\n {%- if refresh and refresh.cron -%}\n ALTER STREAMING TABLE {{ relation.render() }}\n {{ get_alter_sql_refresh_schedule(refresh.cron, refresh.time_zone_value, False) -}}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.get_alter_sql_refresh_schedule"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "configuration_changes", "type": null, "description": ""}], "created_at": 1785250505.010325, "supported_languages": null}, "macro.dbt_databricks.get_create_streaming_table_as_sql": {"name": "get_create_streaming_table_as_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\streaming_table\\create.sql", "original_file_path": "macros\\relations\\streaming_table\\create.sql", "unique_id": "macro.dbt_databricks.get_create_streaming_table_as_sql", "macro_sql": "{% macro get_create_streaming_table_as_sql(relation, sql) -%}\n {{ adapter.dispatch('get_create_streaming_table_as_sql', 'dbt')(relation, sql) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_create_streaming_table_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.011321, "supported_languages": null}, "macro.dbt_databricks.databricks__get_create_streaming_table_as_sql": {"name": "databricks__get_create_streaming_table_as_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\streaming_table\\create.sql", "original_file_path": "macros\\relations\\streaming_table\\create.sql", "unique_id": "macro.dbt_databricks.databricks__get_create_streaming_table_as_sql", "macro_sql": "{% macro databricks__get_create_streaming_table_as_sql(relation, sql) -%}\n {%- set streaming_table = adapter.get_config_from_model(config.model) -%}\n {%- set partition_by = streaming_table.config[\"partition_by\"].partition_by -%}\n {%- set tblproperties = streaming_table.config[\"tblproperties\"].tblproperties -%}\n {%- set comment = streaming_table.config[\"comment\"].comment -%}\n {%- set refresh = streaming_table.config[\"refresh\"] -%}\n\n {%- set analysis_sql = sql | replace('STREAM ', '') | replace('stream ', '') -%}\n\n {#\n TODO: When DESCRIBE QUERY EXTENDED is supported, this implementation should be simplified\n to use that instead. For now, we work around this limitation by writing results to a\n temporary view and using DESCRIBE TABLE EXTENDED on the temporary view.\n #}\n {%- set temp_relation = make_temp_relation(relation) -%}\n {% call statement('create_temp_view') -%}\n {%- set sql_with_limit = analysis_sql.rstrip('; \\n\\t') ~ ' LIMIT 10' -%}\n {{ create_temporary_view(temp_relation, sql_with_limit) }}\n {%- endcall %}\n\n {%- set columns = adapter.get_columns_in_relation(temp_relation) -%}\n {%- set model_columns = model.get('columns', {}) -%}\n {%- set columns_and_constraints = adapter.parse_columns_and_constraints(columns, model_columns, []) -%}\n\n {#-- We don't enrich the relation with model constraints because they are not supported for streaming tables --#}\n CREATE STREAMING TABLE {{ relation.render() }}\n {{ get_column_and_constraints_sql(relation, columns_and_constraints[0]) }}\n {{ get_create_sql_partition_by(partition_by) }}\n {{ get_create_sql_comment(comment) }}\n {{ get_create_sql_tblproperties(tblproperties) }}\n {{ get_create_sql_refresh_schedule(refresh.cron, refresh.time_zone_value) }}\n AS {{ sql }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.make_temp_relation", "macro.dbt.statement", "macro.dbt_spark.create_temporary_view", "macro.dbt_databricks.get_column_and_constraints_sql", "macro.dbt_databricks.get_create_sql_partition_by", "macro.dbt_databricks.get_create_sql_comment", "macro.dbt_databricks.get_create_sql_tblproperties", "macro.dbt_databricks.get_create_sql_refresh_schedule"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.0133204, "supported_languages": null}, "macro.dbt_databricks.drop_streaming_table": {"name": "drop_streaming_table", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\streaming_table\\drop.sql", "original_file_path": "macros\\relations\\streaming_table\\drop.sql", "unique_id": "macro.dbt_databricks.drop_streaming_table", "macro_sql": "{% macro drop_streaming_table(relation) -%}\n {{ return(adapter.dispatch('drop_streaming_table', 'dbt')(relation)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.default__drop_streaming_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.014325, "supported_languages": null}, "macro.dbt_databricks.default__drop_streaming_table": {"name": "default__drop_streaming_table", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\streaming_table\\drop.sql", "original_file_path": "macros\\relations\\streaming_table\\drop.sql", "unique_id": "macro.dbt_databricks.default__drop_streaming_table", "macro_sql": "{% macro default__drop_streaming_table(relation) -%}\n drop table if exists {{ relation.render() }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.014325, "supported_languages": null}, "macro.dbt_databricks.refresh_streaming_table": {"name": "refresh_streaming_table", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\streaming_table\\refresh.sql", "original_file_path": "macros\\relations\\streaming_table\\refresh.sql", "unique_id": "macro.dbt_databricks.refresh_streaming_table", "macro_sql": "{% macro refresh_streaming_table(relation, sql) -%}\n {{ adapter.dispatch('refresh_streaming_table', 'dbt')(relation, sql) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__refresh_streaming_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.0153215, "supported_languages": null}, "macro.dbt_databricks.databricks__refresh_streaming_table": {"name": "databricks__refresh_streaming_table", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\streaming_table\\refresh.sql", "original_file_path": "macros\\relations\\streaming_table\\refresh.sql", "unique_id": "macro.dbt_databricks.databricks__refresh_streaming_table", "macro_sql": "{% macro databricks__refresh_streaming_table(relation, sql) -%}\n create or refresh streaming table {{ relation.render() }}\n as\n {{ sql }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.0153215, "supported_languages": null}, "macro.dbt_databricks.apply_config_changeset": {"name": "apply_config_changeset", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\table\\alter.sql", "original_file_path": "macros\\relations\\table\\alter.sql", "unique_id": "macro.dbt_databricks.apply_config_changeset", "macro_sql": "{% macro apply_config_changeset(target_relation, model, configuration_changes) %}\n {{ log(\"Applying configuration changes to relation \" ~ target_relation) }}\n {% if configuration_changes %}\n {% set comment = configuration_changes.changes.get(\"comment\") %}\n {% set column_comments = configuration_changes.changes.get(\"column_comments\") %}\n {% set column_tags = configuration_changes.changes.get(\"column_tags\") %}\n {% set tags = configuration_changes.changes.get(\"tags\") %}\n {% set tblproperties = configuration_changes.changes.get(\"tblproperties\") %}\n {% set liquid_clustering = configuration_changes.changes.get(\"liquid_clustering\")%}\n {% set constraints = configuration_changes.changes.get(\"constraints\") %}\n {% set column_masks = configuration_changes.changes.get(\"column_masks\") %}\n {% if tags is not none %}\n {% do apply_tags(target_relation, tags.set_tags) %}\n {%- endif -%}\n {% if tblproperties is not none %}\n {% do apply_tblproperties(target_relation, tblproperties.tblproperties) %}\n {%- endif -%}\n {% if liquid_clustering is not none %}\n {% do apply_liquid_clustered_cols(target_relation, liquid_clustering) %}\n {%- endif -%}\n {% if comment %}\n {{ run_query_as(alter_relation_comment_sql(target_relation, comment.comment), 'alter_relation_comment', fetch_result=False) }}\n {% endif %}\n {% if column_comments %}\n {{ alter_column_comments(target_relation, column_comments.comments) }}\n {% endif %}\n {% if column_tags %}\n {{ apply_column_tags(target_relation, column_tags) }}\n {% endif %}\n {% if constraints %}\n {{ apply_constraints(target_relation, constraints) }}\n {% endif %}\n {% if column_masks %}\n {{ apply_column_masks(target_relation, column_masks) }}\n {% endif %}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.apply_tags", "macro.dbt_databricks.apply_tblproperties", "macro.dbt_databricks.apply_liquid_clustered_cols", "macro.dbt_databricks.run_query_as", "macro.dbt_databricks.alter_relation_comment_sql", "macro.dbt_databricks.alter_column_comments", "macro.dbt_databricks.apply_column_tags", "macro.dbt_databricks.apply_constraints", "macro.dbt_databricks.apply_column_masks"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}, {"name": "model", "type": null, "description": ""}, {"name": "configuration_changes", "type": null, "description": ""}], "created_at": 1785250505.0193212, "supported_languages": null}, "macro.dbt_databricks.create_table_at": {"name": "create_table_at", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\table\\create.sql", "original_file_path": "macros\\relations\\table\\create.sql", "unique_id": "macro.dbt_databricks.create_table_at", "macro_sql": "{% macro create_table_at(relation, intermediate_relation, compiled_code) %}\n {% set tags = config.get('databricks_tags') %}\n {% set model_columns = model.get('columns', []) %}\n {% set existing_columns = adapter.get_columns_in_relation(intermediate_relation) %}\n {% set model_constraints = model.get('constraints', []) %}\n {% set columns_and_constraints = adapter.parse_columns_and_constraints(existing_columns, model_columns, model_constraints) %}\n {% set target_relation = relation.enrich(columns_and_constraints[1]) %}\n \n {% call statement('main') %}\n {{ get_create_table_sql(target_relation, columns_and_constraints[0], compiled_code) }}\n {% endcall %}\n\n {{ apply_alter_constraints(target_relation) }}\n {{ apply_tags(target_relation, tags) }}\n {% set column_tags = adapter.get_column_tags_from_model(config.model) %}\n {% if column_tags and column_tags.set_column_tags %}\n {{ apply_column_tags(target_relation, column_tags) }}\n {% endif %}\n\n {% call statement('merge into target') %}\n insert into {{ target_relation }} select * from {{ intermediate_relation }}\n {% endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_databricks.get_create_table_sql", "macro.dbt_databricks.apply_alter_constraints", "macro.dbt_databricks.apply_tags", "macro.dbt_databricks.apply_column_tags"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "intermediate_relation", "type": null, "description": ""}, {"name": "compiled_code", "type": null, "description": ""}], "created_at": 1785250505.0233207, "supported_languages": null}, "macro.dbt_databricks.get_create_table_sql": {"name": "get_create_table_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\table\\create.sql", "original_file_path": "macros\\relations\\table\\create.sql", "unique_id": "macro.dbt_databricks.get_create_table_sql", "macro_sql": "{% macro get_create_table_sql(target_relation, columns, compiled_code) %}\n\n {%- set catalog_relation = adapter.build_catalog_relation(config.model) -%}\n\n {%- set contract = config.get('contract') -%}\n {%- set contract_enforced = contract and contract.enforced -%}\n {%- if contract_enforced -%}\n {{ get_assert_columns_equivalent(compiled_code) }}\n {%- endif -%}\n\n {%- if catalog_relation.file_format == 'delta' %}\n create or replace table {{ target_relation.render() }}\n {% else %}\n create table {{ target_relation.render() }}\n {% endif -%}\n {{ get_column_and_constraints_sql(target_relation, columns) }}\n {{ file_format_clause(catalog_relation) }}\n {{ databricks__options_clause(catalog_relation) }}\n {{ partition_cols(label=\"partitioned by\") }}\n {{ liquid_clustered_cols() }}\n {{ clustered_cols(label=\"clustered by\") }}\n {{ location_clause(catalog_relation) }}\n {{ comment_clause() }}\n {{ tblproperties_clause() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_assert_columns_equivalent", "macro.dbt_databricks.get_column_and_constraints_sql", "macro.dbt_databricks.file_format_clause", "macro.dbt_databricks.databricks__options_clause", "macro.dbt_spark.partition_cols", "macro.dbt_databricks.liquid_clustered_cols", "macro.dbt_spark.clustered_cols", "macro.dbt_databricks.location_clause", "macro.dbt_spark.comment_clause", "macro.dbt_databricks.tblproperties_clause"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}, {"name": "columns", "type": null, "description": ""}, {"name": "compiled_code", "type": null, "description": ""}], "created_at": 1785250505.0253232, "supported_languages": null}, "macro.dbt_databricks.databricks__create_table_as": {"name": "databricks__create_table_as", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\table\\create.sql", "original_file_path": "macros\\relations\\table\\create.sql", "unique_id": "macro.dbt_databricks.databricks__create_table_as", "macro_sql": "{% macro databricks__create_table_as(temporary, relation, compiled_code, language='sql') -%}\n\n {%- set catalog_relation = adapter.build_catalog_relation(config.model) -%}\n\n {%- if language == 'sql' -%}\n {%- if temporary -%}\n {{ create_temporary_view(relation, compiled_code) }}\n {%- else -%}\n {% if catalog_relation.file_format == 'delta' %}\n create or replace table {{ relation.render() }}\n {% else %}\n create table {{ relation.render() }}\n {% endif %}\n {%- set contract_config = config.get('contract') -%}\n {% if contract_config and contract_config.enforced %}\n {{ get_assert_columns_equivalent(compiled_code) }}\n {%- set compiled_code = get_select_subquery(compiled_code) %}\n {% endif %}\n {{ file_format_clause(catalog_relation) }}\n {{ databricks__options_clause(catalog_relation) }}\n {{ partition_cols(label=\"partitioned by\") }}\n {{ liquid_clustered_cols() }}\n {{ clustered_cols(label=\"clustered by\") }}\n {{ location_clause(catalog_relation) }}\n {{ comment_clause() }}\n {{ tblproperties_clause() }}\n as\n {{ compiled_code }}\n {%- endif -%}\n {%- elif language == 'python' -%}\n {#--\n N.B. Python models _can_ write to temp views HOWEVER they use a different session\n and have already expired by the time they need to be used (I.E. in merges for incremental models)\n\n TODO: Deep dive into spark sessions to see if we can reuse a single session for an entire\n dbt invocation.\n --#}\n {{ databricks__py_write_table(compiled_code=compiled_code, target_relation=relation) }}\n {%- endif -%}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_spark.create_temporary_view", "macro.dbt.get_assert_columns_equivalent", "macro.dbt.get_select_subquery", "macro.dbt_databricks.file_format_clause", "macro.dbt_databricks.databricks__options_clause", "macro.dbt_spark.partition_cols", "macro.dbt_databricks.liquid_clustered_cols", "macro.dbt_spark.clustered_cols", "macro.dbt_databricks.location_clause", "macro.dbt_spark.comment_clause", "macro.dbt_databricks.tblproperties_clause", "macro.dbt_databricks.databricks__py_write_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "temporary", "type": null, "description": ""}, {"name": "relation", "type": null, "description": ""}, {"name": "compiled_code", "type": null, "description": ""}, {"name": "language", "type": null, "description": ""}], "created_at": 1785250505.0283277, "supported_languages": null}, "macro.dbt_databricks.databricks__options_clause": {"name": "databricks__options_clause", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\table\\create.sql", "original_file_path": "macros\\relations\\table\\create.sql", "unique_id": "macro.dbt_databricks.databricks__options_clause", "macro_sql": "{% macro databricks__options_clause(catalog_relation=none) -%}\n {#-\n Moving forward, this macro should require a `catalog_relation`, which is covered by the first condition.\n However, there could be existing macros that is still passing no arguments, including user macros.\n Hence, we need to support the old code still, which is covered by the second condition.\n Additionally, since this rolls up to `options_clause` in `dbt-spark`, which does not have any arguments,\n all calls to `options_clause` will take the second path. This macro needs to be called directly\n via `databricks__options_clause`.\n -#}\n {%- if catalog_relation is not none -%}\n {%- set file_format = catalog_relation.file_format -%}\n {%- else -%}\n {%- set file_format = config.get('file_format', default='delta') -%}\n {%- endif -%}\n\n {%- set options = config.get('options') -%}\n {%- if file_format == 'hudi' -%}\n {%- set unique_key = config.get('unique_key') -%}\n {%- if unique_key is not none and options is none -%}\n {%- set options = {'primaryKey': config.get('unique_key')} -%}\n {%- elif unique_key is not none and options is not none and 'primaryKey' not in options -%}\n {%- set _ = options.update({'primaryKey': config.get('unique_key')}) -%}\n {%- elif options is not none and 'primaryKey' in options and options['primaryKey'] != unique_key -%}\n {{ exceptions.raise_compiler_error(\"unique_key and options('primaryKey') should be the same column(s).\") }}\n {%- endif %}\n {%- endif %}\n\n {%- if options is not none %}\n options (\n {%- for option in options -%}\n {{ option }} \"{{ options[option] }}\" {% if not loop.last %}, {% endif %}\n {%- endfor %}\n )\n {%- endif %}\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "catalog_relation", "type": null, "description": ""}], "created_at": 1785250505.0303273, "supported_languages": null}, "macro.dbt_databricks.get_create_intermediate_table": {"name": "get_create_intermediate_table", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\table\\create.sql", "original_file_path": "macros\\relations\\table\\create.sql", "unique_id": "macro.dbt_databricks.get_create_intermediate_table", "macro_sql": "{% macro get_create_intermediate_table(relation, compiled_code, language) %}\n {%- if language == 'sql' -%}\n {{ create_temporary_view(relation, compiled_code) }}\n {%- else -%}\n {{ create_python_intermediate_table(relation, compiled_code) }}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.create_temporary_view", "macro.dbt_databricks.create_python_intermediate_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "compiled_code", "type": null, "description": ""}, {"name": "language", "type": null, "description": ""}], "created_at": 1785250505.0313232, "supported_languages": null}, "macro.dbt_databricks.databricks__drop_table": {"name": "databricks__drop_table", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\table\\drop.sql", "original_file_path": "macros\\relations\\table\\drop.sql", "unique_id": "macro.dbt_databricks.databricks__drop_table", "macro_sql": "{% macro databricks__drop_table(relation) -%}\n drop table if exists {{ relation.render() }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.0313232, "supported_languages": null}, "macro.dbt_databricks.databricks__get_rename_table_sql": {"name": "databricks__get_rename_table_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\table\\rename.sql", "original_file_path": "macros\\relations\\table\\rename.sql", "unique_id": "macro.dbt_databricks.databricks__get_rename_table_sql", "macro_sql": "{% macro databricks__get_rename_table_sql(relation, new_name) %}\n ALTER TABLE {{ relation.render() }} RENAME TO `{{ new_name }}`\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "new_name", "type": null, "description": ""}], "created_at": 1785250505.0323274, "supported_languages": null}, "macro.dbt_databricks.safe_relation_replace": {"name": "safe_relation_replace", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\table\\replace.sql", "original_file_path": "macros\\relations\\table\\replace.sql", "unique_id": "macro.dbt_databricks.safe_relation_replace", "macro_sql": "{% macro safe_relation_replace(existing_relation, staging_relation, intermediate_relation, compiled_code) %}\n \n {{ create_table_at(staging_relation, intermediate_relation, compiled_code) }}\n\n {{ create_backup(existing_relation) }}\n\n {{ adapter.rename_relation(staging_relation, existing_relation) }}\n\n {% call statement('main') %}\n {{ get_drop_backup_sql(existing_relation) }}\n {% endcall %}\n \n {{ adapter.cache_dropped(make_backup_relation(existing_relation, existing_relation.type)) }}\n\n {{ drop_relation_if_exists(intermediate_relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.create_table_at", "macro.dbt_databricks.create_backup", "macro.dbt.statement", "macro.dbt.get_drop_backup_sql", "macro.dbt.make_backup_relation", "macro.dbt.drop_relation_if_exists"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "staging_relation", "type": null, "description": ""}, {"name": "intermediate_relation", "type": null, "description": ""}, {"name": "compiled_code", "type": null, "description": ""}], "created_at": 1785250505.0333235, "supported_languages": null}, "macro.dbt_databricks.alter_view": {"name": "alter_view", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\view\\alter.sql", "original_file_path": "macros\\relations\\view\\alter.sql", "unique_id": "macro.dbt_databricks.alter_view", "macro_sql": "{% macro alter_view(target_relation, changes) %}\n {{ log(\"Updating view via ALTER\") }}\n {{ adapter.dispatch('alter_view', 'dbt')(target_relation, changes) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__alter_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}, {"name": "changes", "type": null, "description": ""}], "created_at": 1785250505.0343263, "supported_languages": null}, "macro.dbt_databricks.databricks__alter_view": {"name": "databricks__alter_view", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\view\\alter.sql", "original_file_path": "macros\\relations\\view\\alter.sql", "unique_id": "macro.dbt_databricks.databricks__alter_view", "macro_sql": "{% macro databricks__alter_view(target_relation, changes) %}\n {% set tags = changes.get(\"tags\") %}\n {% set tblproperties = changes.get(\"tblproperties\") %}\n {% set query = changes.get(\"query\") %}\n {% set column_comments = changes.get(\"column_comments\") %}\n {% if tags %}\n {{ apply_tags(target_relation, tags.set_tags) }}\n {% endif %}\n {% if tblproperties %}\n {{ apply_tblproperties(target_relation, tblproperties.tblproperties) }}\n {% endif %}\n {% if query %}\n {{ alter_query(target_relation, query.query) }}\n {% endif %}\n {% if column_comments %}\n {{ alter_column_comments(target_relation, column_comments.comments) }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.apply_tags", "macro.dbt_databricks.apply_tblproperties", "macro.dbt_databricks.alter_query", "macro.dbt_databricks.alter_column_comments"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}, {"name": "changes", "type": null, "description": ""}], "created_at": 1785250505.0353231, "supported_languages": null}, "macro.dbt_databricks.databricks__create_view_as": {"name": "databricks__create_view_as", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\view\\create.sql", "original_file_path": "macros\\relations\\view\\create.sql", "unique_id": "macro.dbt_databricks.databricks__create_view_as", "macro_sql": "{% macro databricks__create_view_as(relation, sql) %}\n {% if column_mask_exists() %}\n {% do exceptions.raise_compiler_error(\"Column masks are not supported for views.\") %}\n {% endif %}\n {{ log(\"Creating view \" ~ relation) }}\n create or replace view {{ relation.render() }}\n {%- if config.persist_column_docs() -%}\n {%- set model_columns = model.columns -%}\n {%- set query_columns = get_columns_in_query(sql) -%}\n {%- if query_columns %}\n (\n {{ get_persist_docs_column_list(model_columns, query_columns) }}\n )\n {%- endif -%}\n {%- endif %}\n {{ comment_clause() }}\n {%- set contract_config = config.get('contract') -%}\n {%- if contract_config and contract_config.enforced %}\n {{ get_assert_columns_equivalent(sql) }}\n {%- endif -%}\n {{ tblproperties_clause() }}\n as (\n {{ sql }}\n )\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.column_mask_exists", "macro.dbt.get_columns_in_query", "macro.dbt_databricks.get_persist_docs_column_list", "macro.dbt_spark.comment_clause", "macro.dbt.get_assert_columns_equivalent", "macro.dbt_databricks.tblproperties_clause"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.0383215, "supported_languages": null}, "macro.dbt_databricks.get_column_comment_sql": {"name": "get_column_comment_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\view\\create.sql", "original_file_path": "macros\\relations\\view\\create.sql", "unique_id": "macro.dbt_databricks.get_column_comment_sql", "macro_sql": "{% macro get_column_comment_sql(column_name, column_dict) -%}\n {%- if column_name in column_dict and column_dict[column_name][\"description\"] -%}\n {%- set escaped_description = column_dict[column_name][\"description\"] | replace(\"'\", \"\\\\'\") -%}\n {%- set column_comment_clause = \"comment '\" ~ escaped_description ~ \"'\" -%}\n {{ adapter.quote(column_name) }} {{ column_comment_clause }}\n {%- else -%}\n {{ adapter.quote(column_name) }}\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "column_name", "type": null, "description": ""}, {"name": "column_dict", "type": null, "description": ""}], "created_at": 1785250505.0393229, "supported_languages": null}, "macro.dbt_databricks.get_persist_docs_column_list": {"name": "get_persist_docs_column_list", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\view\\create.sql", "original_file_path": "macros\\relations\\view\\create.sql", "unique_id": "macro.dbt_databricks.get_persist_docs_column_list", "macro_sql": "{% macro get_persist_docs_column_list(model_columns, query_columns) -%}\n {%- for column_name in query_columns -%}\n {{ get_column_comment_sql(column_name, model_columns) }}{{\",\\n\\t\" if not loop.last else \"\" }}\n {%- endfor -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.get_column_comment_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model_columns", "type": null, "description": ""}, {"name": "query_columns", "type": null, "description": ""}], "created_at": 1785250505.0393229, "supported_languages": null}, "macro.dbt_databricks.databricks__drop_view": {"name": "databricks__drop_view", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\view\\drop.sql", "original_file_path": "macros\\relations\\view\\drop.sql", "unique_id": "macro.dbt_databricks.databricks__drop_view", "macro_sql": "{% macro databricks__drop_view(relation) -%}\n DROP VIEW IF EXISTS {{ relation.render() }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.040326, "supported_languages": null}, "macro.dbt_databricks.databricks__get_rename_view_sql": {"name": "databricks__get_rename_view_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\view\\rename.sql", "original_file_path": "macros\\relations\\view\\rename.sql", "unique_id": "macro.dbt_databricks.databricks__get_rename_view_sql", "macro_sql": "{% macro databricks__get_rename_view_sql(relation, new_name) %}\n ALTER VIEW {{ relation.render() }} RENAME TO {{ new_name }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "new_name", "type": null, "description": ""}], "created_at": 1785250505.040326, "supported_languages": null}, "macro.dbt_databricks.databricks__get_replace_view_sql": {"name": "databricks__get_replace_view_sql", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\relations\\view\\replace.sql", "original_file_path": "macros\\relations\\view\\replace.sql", "unique_id": "macro.dbt_databricks.databricks__get_replace_view_sql", "macro_sql": "{% macro databricks__get_replace_view_sql(target_relation, sql) %}\n {{ create_view_as(target_relation, sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.create_view_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.0413215, "supported_languages": null}, "macro.dbt_databricks.databricks__dateadd": {"name": "databricks__dateadd", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\utils\\dateadd.sql", "original_file_path": "macros\\utils\\dateadd.sql", "unique_id": "macro.dbt_databricks.databricks__dateadd", "macro_sql": "{% macro databricks__dateadd(datepart, interval, from_date_or_timestamp) %}\n {%- if adapter.compare_dbr_version(10, 4) >= 0 -%}\n timestampadd({{datepart}}, {{interval}}, {{from_date_or_timestamp}})\n {%- else -%}\n {{ spark__dateadd(datepart, interval, from_date_or_timestamp) }}\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__dateadd"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "datepart", "type": null, "description": ""}, {"name": "interval", "type": null, "description": ""}, {"name": "from_date_or_timestamp", "type": null, "description": ""}], "created_at": 1785250505.0423243, "supported_languages": null}, "macro.dbt_databricks.databricks__datediff": {"name": "databricks__datediff", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\utils\\datediff.sql", "original_file_path": "macros\\utils\\datediff.sql", "unique_id": "macro.dbt_databricks.databricks__datediff", "macro_sql": "{% macro databricks__datediff(first_date, second_date, datepart) %}\n {%- if adapter.compare_dbr_version(10, 4) >= 0 -%}\n timestampdiff({{datepart}}, {{date_trunc(datepart, first_date)}}, {{date_trunc(datepart, second_date)}})\n {%- else -%}\n {{ spark__datediff(first_date, second_date, datepart) }}\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.date_trunc", "macro.dbt_spark.spark__datediff"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "first_date", "type": null, "description": ""}, {"name": "second_date", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}], "created_at": 1785250505.0423243, "supported_languages": null}, "macro.dbt_databricks.databricks__split_part": {"name": "databricks__split_part", "resource_type": "macro", "package_name": "dbt_databricks", "path": "macros\\utils\\split_part.sql", "original_file_path": "macros\\utils\\split_part.sql", "unique_id": "macro.dbt_databricks.databricks__split_part", "macro_sql": "{% macro databricks__split_part(string_text, delimiter_text, part_number) %}\n\n {% set delimiter_expr %}\n\n -- escape if starts with a special character\n case when regexp_extract({{ delimiter_text }}, '([^A-Za-z0-9])(.*)', 1) != '_'\n then concat('\\\\', {{ delimiter_text }})\n else {{ delimiter_text }} end\n\n {% endset %}\n\n {% if part_number >= 0 %}\n\n {% set split_part_expr %}\n\n get(split(\n {{ string_text }},\n {{ delimiter_expr }}\n ), {{ part_number - 1 if part_number > 0 else part_number }})\n\n {% endset %}\n\n {% else %}\n\n {% set split_part_expr %}\n\n get(split(\n {{ string_text }},\n {{ delimiter_expr }}\n ), \n length({{ string_text }})\n - length(\n replace({{ string_text }}, {{ delimiter_text }}, '')\n ) + 1 + {{ part_number }}\n )\n\n {% endset %}\n\n {% endif %}\n\n {{ return(split_part_expr) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "string_text", "type": null, "description": ""}, {"name": "delimiter_text", "type": null, "description": ""}, {"name": "part_number", "type": null, "description": ""}], "created_at": 1785250505.0443249, "supported_languages": null}, "macro.dbt_spark.tblproperties_clause": {"name": "tblproperties_clause", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.tblproperties_clause", "macro_sql": "{% macro tblproperties_clause() %}\n {{ return(adapter.dispatch('tblproperties_clause', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_databricks.databricks__tblproperties_clause"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.0503218, "supported_languages": null}, "macro.dbt_spark.spark__tblproperties_clause": {"name": "spark__tblproperties_clause", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__tblproperties_clause", "macro_sql": "{% macro spark__tblproperties_clause() -%}\n {%- set tblproperties = config.get('tblproperties') -%}\n {%- if tblproperties is not none %}\n tblproperties (\n {%- for prop in tblproperties -%}\n '{{ prop }}' = '{{ tblproperties[prop] }}' {% if not loop.last %}, {% endif %}\n {%- endfor %}\n )\n {%- endif %}\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.0513206, "supported_languages": null}, "macro.dbt_spark.file_format_clause": {"name": "file_format_clause", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.file_format_clause", "macro_sql": "{% macro file_format_clause() %}\n {{ return(adapter.dispatch('file_format_clause', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_spark.spark__file_format_clause"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.0513206, "supported_languages": null}, "macro.dbt_spark.spark__file_format_clause": {"name": "spark__file_format_clause", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__file_format_clause", "macro_sql": "{% macro spark__file_format_clause() %}\n {%- set file_format = config.get('file_format', validator=validation.any[basestring]) -%}\n {%- if file_format is not none %}\n using {{ file_format }}\n {%- endif %}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.0523279, "supported_languages": null}, "macro.dbt_spark.location_clause": {"name": "location_clause", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.location_clause", "macro_sql": "{% macro location_clause() %}\n {{ return(adapter.dispatch('location_clause', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_spark.spark__location_clause"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.0523279, "supported_languages": null}, "macro.dbt_spark.spark__location_clause": {"name": "spark__location_clause", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__location_clause", "macro_sql": "{% macro spark__location_clause() %}\n {%- set location_root = config.get('location_root', validator=validation.any[basestring]) -%}\n {%- set identifier = model['alias'] -%}\n {%- if location_root is not none %}\n location '{{ location_root }}/{{ identifier }}'\n {%- endif %}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.0533254, "supported_languages": null}, "macro.dbt_spark.options_clause": {"name": "options_clause", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.options_clause", "macro_sql": "{% macro options_clause() -%}\n {{ return(adapter.dispatch('options_clause', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_databricks.databricks__options_clause"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.0533254, "supported_languages": null}, "macro.dbt_spark.spark__options_clause": {"name": "spark__options_clause", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__options_clause", "macro_sql": "{% macro spark__options_clause() -%}\n {%- set options = config.get('options') -%}\n {%- if config.get('file_format') == 'hudi' -%}\n {%- set unique_key = config.get('unique_key') -%}\n {%- if unique_key is not none and options is none -%}\n {%- set options = {'primaryKey': config.get('unique_key')} -%}\n {%- elif unique_key is not none and options is not none and 'primaryKey' not in options -%}\n {%- set _ = options.update({'primaryKey': config.get('unique_key')}) -%}\n {%- elif options is not none and 'primaryKey' in options and options['primaryKey'] != unique_key -%}\n {{ exceptions.raise_compiler_error(\"unique_key and options('primaryKey') should be the same column(s).\") }}\n {%- endif %}\n {%- endif %}\n\n {%- if options is not none %}\n options (\n {%- for option in options -%}\n {{ option }} \"{{ options[option] }}\" {% if not loop.last %}, {% endif %}\n {%- endfor %}\n )\n {%- endif %}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.0553236, "supported_languages": null}, "macro.dbt_spark.comment_clause": {"name": "comment_clause", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.comment_clause", "macro_sql": "{% macro comment_clause() %}\n {{ return(adapter.dispatch('comment_clause', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_databricks.databricks__comment_clause"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.056325, "supported_languages": null}, "macro.dbt_spark.spark__comment_clause": {"name": "spark__comment_clause", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__comment_clause", "macro_sql": "{% macro spark__comment_clause() %}\n {%- set raw_persist_docs = config.get('persist_docs', {}) -%}\n\n {%- if raw_persist_docs is mapping -%}\n {%- set raw_relation = raw_persist_docs.get('relation', false) -%}\n {%- if raw_relation -%}\n comment '{{ model.description | replace(\"'\", \"\\\\'\") }}'\n {% endif %}\n {%- elif raw_persist_docs -%}\n {{ exceptions.raise_compiler_error(\"Invalid value provided for 'persist_docs'. Expected dict but got value: \" ~ raw_persist_docs) }}\n {% endif %}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.057322, "supported_languages": null}, "macro.dbt_spark.partition_cols": {"name": "partition_cols", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.partition_cols", "macro_sql": "{% macro partition_cols(label, required=false) %}\n {{ return(adapter.dispatch('partition_cols', 'dbt')(label, required)) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_spark.spark__partition_cols"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "label", "type": null, "description": ""}, {"name": "required", "type": null, "description": ""}], "created_at": 1785250505.0583253, "supported_languages": null}, "macro.dbt_spark.spark__partition_cols": {"name": "spark__partition_cols", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__partition_cols", "macro_sql": "{% macro spark__partition_cols(label, required=false) %}\n {%- set cols = config.get('partition_by', validator=validation.any[list, basestring]) -%}\n {%- if cols is not none %}\n {%- if cols is string -%}\n {%- set cols = [cols] -%}\n {%- endif -%}\n {{ label }} (\n {%- for item in cols -%}\n {{ item }}\n {%- if not loop.last -%},{%- endif -%}\n {%- endfor -%}\n )\n {%- endif %}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "label", "type": null, "description": ""}, {"name": "required", "type": null, "description": ""}], "created_at": 1785250505.059323, "supported_languages": null}, "macro.dbt_spark.clustered_cols": {"name": "clustered_cols", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.clustered_cols", "macro_sql": "{% macro clustered_cols(label, required=false) %}\n {{ return(adapter.dispatch('clustered_cols', 'dbt')(label, required)) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_spark.spark__clustered_cols"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "label", "type": null, "description": ""}, {"name": "required", "type": null, "description": ""}], "created_at": 1785250505.059323, "supported_languages": null}, "macro.dbt_spark.spark__clustered_cols": {"name": "spark__clustered_cols", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__clustered_cols", "macro_sql": "{% macro spark__clustered_cols(label, required=false) %}\n {%- set cols = config.get('clustered_by', validator=validation.any[list, basestring]) -%}\n {%- set buckets = config.get('buckets', validator=validation.any[int]) -%}\n {%- if (cols is not none) and (buckets is not none) %}\n {%- if cols is string -%}\n {%- set cols = [cols] -%}\n {%- endif -%}\n {{ label }} (\n {%- for item in cols -%}\n {{ item }}\n {%- if not loop.last -%},{%- endif -%}\n {%- endfor -%}\n ) into {{ buckets }} buckets\n {%- endif %}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "label", "type": null, "description": ""}, {"name": "required", "type": null, "description": ""}], "created_at": 1785250505.0613225, "supported_languages": null}, "macro.dbt_spark.fetch_tbl_properties": {"name": "fetch_tbl_properties", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.fetch_tbl_properties", "macro_sql": "{% macro fetch_tbl_properties(relation) -%}\n {% call statement('list_properties', fetch_result=True) -%}\n SHOW TBLPROPERTIES {{ relation }}\n {% endcall %}\n {% do return(load_result('list_properties').table) %}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.0613225, "supported_languages": null}, "macro.dbt_spark.create_temporary_view": {"name": "create_temporary_view", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.create_temporary_view", "macro_sql": "{% macro create_temporary_view(relation, compiled_code) -%}\n {{ return(adapter.dispatch('create_temporary_view', 'dbt')(relation, compiled_code)) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_spark.spark__create_temporary_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "compiled_code", "type": null, "description": ""}], "created_at": 1785250505.062329, "supported_languages": null}, "macro.dbt_spark.spark__create_temporary_view": {"name": "spark__create_temporary_view", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__create_temporary_view", "macro_sql": "{% macro spark__create_temporary_view(relation, compiled_code) -%}\n create or replace temporary view {{ relation }} as\n {{ compiled_code }}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "compiled_code", "type": null, "description": ""}], "created_at": 1785250505.062329, "supported_languages": null}, "macro.dbt_spark.spark__create_table_as": {"name": "spark__create_table_as", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__create_table_as", "macro_sql": "{%- macro spark__create_table_as(temporary, relation, compiled_code, language='sql') -%}\n {%- if language == 'sql' -%}\n {%- if temporary -%}\n {{ create_temporary_view(relation, compiled_code) }}\n {%- else -%}\n {% if config.get('file_format', validator=validation.any[basestring]) in ['delta', 'iceberg'] %}\n create or replace table {{ relation }}\n {% else %}\n create table {{ relation }}\n {% endif %}\n {%- set contract_config = config.get('contract') -%}\n {%- if contract_config.enforced -%}\n {{ get_assert_columns_equivalent(compiled_code) }}\n {%- set compiled_code = get_select_subquery(compiled_code) %}\n {% endif %}\n {{ file_format_clause() }}\n {{ options_clause() }}\n {{ tblproperties_clause() }}\n {{ partition_cols(label=\"partitioned by\") }}\n {{ clustered_cols(label=\"clustered by\") }}\n {{ location_clause() }}\n {{ comment_clause() }}\n\n as\n {{ compiled_code }}\n {%- endif -%}\n {%- elif language == 'python' -%}\n {#--\n N.B. Python models _can_ write to temp views HOWEVER they use a different session\n and have already expired by the time they need to be used (I.E. in merges for incremental models)\n\n TODO: Deep dive into spark sessions to see if we can reuse a single session for an entire\n dbt invocation.\n --#}\n {{ py_write_table(compiled_code=compiled_code, target_relation=relation) }}\n {%- endif -%}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": ["macro.dbt_spark.create_temporary_view", "macro.dbt.get_assert_columns_equivalent", "macro.dbt.get_select_subquery", "macro.dbt_spark.file_format_clause", "macro.dbt_spark.options_clause", "macro.dbt_spark.tblproperties_clause", "macro.dbt_spark.partition_cols", "macro.dbt_spark.clustered_cols", "macro.dbt_spark.location_clause", "macro.dbt_spark.comment_clause", "macro.dbt_spark.py_write_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "temporary", "type": null, "description": ""}, {"name": "relation", "type": null, "description": ""}, {"name": "compiled_code", "type": null, "description": ""}, {"name": "language", "type": null, "description": ""}], "created_at": 1785250505.0643218, "supported_languages": null}, "macro.dbt_spark.persist_constraints": {"name": "persist_constraints", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.persist_constraints", "macro_sql": "{% macro persist_constraints(relation, model) %}\n {{ return(adapter.dispatch('persist_constraints', 'dbt')(relation, model)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__persist_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "model", "type": null, "description": ""}], "created_at": 1785250505.0653236, "supported_languages": null}, "macro.dbt_spark.spark__persist_constraints": {"name": "spark__persist_constraints", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__persist_constraints", "macro_sql": "{% macro spark__persist_constraints(relation, model) %}\n {%- set contract_config = config.get('contract') -%}\n {% if contract_config.enforced and config.get('file_format', 'delta') == 'delta' %}\n {% do alter_table_add_constraints(relation, model.constraints) %}\n {% do alter_column_set_constraints(relation, model.columns) %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.alter_table_add_constraints", "macro.dbt_spark.alter_column_set_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "model", "type": null, "description": ""}], "created_at": 1785250505.0653236, "supported_languages": null}, "macro.dbt_spark.alter_table_add_constraints": {"name": "alter_table_add_constraints", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.alter_table_add_constraints", "macro_sql": "{% macro alter_table_add_constraints(relation, constraints) %}\n {{ return(adapter.dispatch('alter_table_add_constraints', 'dbt')(relation, constraints)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__alter_table_add_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "constraints", "type": null, "description": ""}], "created_at": 1785250505.0663269, "supported_languages": null}, "macro.dbt_spark.spark__alter_table_add_constraints": {"name": "spark__alter_table_add_constraints", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__alter_table_add_constraints", "macro_sql": "{% macro spark__alter_table_add_constraints(relation, constraints) %}\n {% for constraint in constraints %}\n {% if constraint.type == 'check' and not is_incremental() %}\n {%- set constraint_hash = local_md5(column_name ~ \";\" ~ constraint.expression ~ \";\" ~ loop.index) -%}\n {% call statement() %}\n alter table {{ relation }} add constraint {{ constraint.name if constraint.name else constraint_hash }} check ({{ constraint.expression }});\n {% endcall %}\n {% endif %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.is_incremental", "macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "constraints", "type": null, "description": ""}], "created_at": 1785250505.0673234, "supported_languages": null}, "macro.dbt_spark.alter_column_set_constraints": {"name": "alter_column_set_constraints", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.alter_column_set_constraints", "macro_sql": "{% macro alter_column_set_constraints(relation, column_dict) %}\n {{ return(adapter.dispatch('alter_column_set_constraints', 'dbt')(relation, column_dict)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__alter_column_set_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column_dict", "type": null, "description": ""}], "created_at": 1785250505.0673234, "supported_languages": null}, "macro.dbt_spark.spark__alter_column_set_constraints": {"name": "spark__alter_column_set_constraints", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__alter_column_set_constraints", "macro_sql": "{% macro spark__alter_column_set_constraints(relation, column_dict) %}\n {% for column_name in column_dict %}\n {% set constraints = column_dict[column_name]['constraints'] %}\n {% for constraint in constraints %}\n {% if constraint.type != 'not_null' %}\n {{ exceptions.warn('Invalid constraint for column ' ~ column_name ~ '. Only `not_null` is supported.') }}\n {% else %}\n {% set quoted_name = adapter.quote(column_name) if column_dict[column_name]['quote'] else column_name %}\n {% call statement() %}\n alter table {{ relation }} change column {{ quoted_name }} set not null {{ constraint.expression or \"\" }};\n {% endcall %}\n {% endif %}\n {% endfor %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column_dict", "type": null, "description": ""}], "created_at": 1785250505.0693235, "supported_languages": null}, "macro.dbt_spark.get_column_comment_sql": {"name": "get_column_comment_sql", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.get_column_comment_sql", "macro_sql": "{% macro get_column_comment_sql(column_name, column_dict) -%}\n {% if column_name in column_dict and column_dict[column_name][\"description\"] -%}\n {% set escaped_description = column_dict[column_name][\"description\"] | replace(\"'\", \"\\\\'\") %}\n {% set column_comment_clause = \"comment '\" ~ escaped_description ~ \"'\" %}\n {%- endif -%}\n {{ adapter.quote(column_name) }} {{ column_comment_clause }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "column_name", "type": null, "description": ""}, {"name": "column_dict", "type": null, "description": ""}], "created_at": 1785250505.0703244, "supported_languages": null}, "macro.dbt_spark.get_persist_docs_column_list": {"name": "get_persist_docs_column_list", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.get_persist_docs_column_list", "macro_sql": "{% macro get_persist_docs_column_list(model_columns, query_columns) %}\n {% for column_name in query_columns %}\n {{ get_column_comment_sql(column_name, model_columns) }}\n {{- \", \" if not loop.last else \"\" }}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.get_column_comment_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model_columns", "type": null, "description": ""}, {"name": "query_columns", "type": null, "description": ""}], "created_at": 1785250505.0713248, "supported_languages": null}, "macro.dbt_spark.spark__create_view_as": {"name": "spark__create_view_as", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__create_view_as", "macro_sql": "{% macro spark__create_view_as(relation, sql) -%}\n create or replace view {{ relation }}\n {% if config.persist_column_docs() -%}\n {% set model_columns = model.columns %}\n {% set query_columns = get_columns_in_query(sql) %}\n (\n {{ get_persist_docs_column_list(model_columns, query_columns) }}\n )\n {% endif %}\n {{ comment_clause() }}\n {%- set contract_config = config.get('contract') -%}\n {%- if contract_config.enforced -%}\n {{ get_assert_columns_equivalent(sql) }}\n {%- endif %}\n as\n {{ sql }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_columns_in_query", "macro.dbt_spark.get_persist_docs_column_list", "macro.dbt_spark.comment_clause", "macro.dbt.get_assert_columns_equivalent"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.0723236, "supported_languages": null}, "macro.dbt_spark.spark__create_schema": {"name": "spark__create_schema", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__create_schema", "macro_sql": "{% macro spark__create_schema(relation) -%}\n {%- call statement('create_schema') -%}\n create schema if not exists {{relation}}\n {% endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.0723236, "supported_languages": null}, "macro.dbt_spark.spark__drop_schema": {"name": "spark__drop_schema", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__drop_schema", "macro_sql": "{% macro spark__drop_schema(relation) -%}\n {%- call statement('drop_schema') -%}\n drop schema if exists {{ relation }} cascade\n {%- endcall -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.0733228, "supported_languages": null}, "macro.dbt_spark.get_columns_in_relation_raw": {"name": "get_columns_in_relation_raw", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.get_columns_in_relation_raw", "macro_sql": "{% macro get_columns_in_relation_raw(relation) -%}\n {{ return(adapter.dispatch('get_columns_in_relation_raw', 'dbt')(relation)) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_spark.spark__get_columns_in_relation_raw"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.0733228, "supported_languages": null}, "macro.dbt_spark.spark__get_columns_in_relation_raw": {"name": "spark__get_columns_in_relation_raw", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__get_columns_in_relation_raw", "macro_sql": "{% macro spark__get_columns_in_relation_raw(relation) -%}\n {% call statement('get_columns_in_relation_raw', fetch_result=True) %}\n describe extended {{ relation }}\n {% endcall %}\n {% do return(load_result('get_columns_in_relation_raw').table) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.0743287, "supported_languages": null}, "macro.dbt_spark.spark__get_columns_in_relation": {"name": "spark__get_columns_in_relation", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__get_columns_in_relation", "macro_sql": "{% macro spark__get_columns_in_relation(relation) -%}\n {% call statement('get_columns_in_relation', fetch_result=True) %}\n describe extended {{ relation.include(schema=(schema is not none)) }}\n {% endcall %}\n {% do return(load_result('get_columns_in_relation').table) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.0743287, "supported_languages": null}, "macro.dbt_spark.spark__list_relations_without_caching": {"name": "spark__list_relations_without_caching", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__list_relations_without_caching", "macro_sql": "{% macro spark__list_relations_without_caching(relation) %}\n {% call statement('list_relations_without_caching', fetch_result=True) -%}\n show table extended in {{ relation.schema }} like '*'\n {% endcall %}\n\n {% do return(load_result('list_relations_without_caching').table) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.0753236, "supported_languages": null}, "macro.dbt_spark.list_relations_show_tables_without_caching": {"name": "list_relations_show_tables_without_caching", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.list_relations_show_tables_without_caching", "macro_sql": "{% macro list_relations_show_tables_without_caching(schema_relation) %}\n {#-- Spark with iceberg tables don't work with show table extended for #}\n {#-- V2 iceberg tables #}\n {#-- https://issues.apache.org/jira/browse/SPARK-33393 #}\n {% call statement('list_relations_without_caching_show_tables', fetch_result=True) -%}\n show tables in {{ schema_relation.schema }} like '*'\n {% endcall %}\n\n {% do return(load_result('list_relations_without_caching_show_tables').table) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_relation", "type": null, "description": ""}], "created_at": 1785250505.0763438, "supported_languages": null}, "macro.dbt_spark.describe_table_extended_without_caching": {"name": "describe_table_extended_without_caching", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.describe_table_extended_without_caching", "macro_sql": "{% macro describe_table_extended_without_caching(table_name) %}\n {#-- Spark with iceberg tables don't work with show table extended for #}\n {#-- V2 iceberg tables #}\n {#-- https://issues.apache.org/jira/browse/SPARK-33393 #}\n {% call statement('describe_table_extended_without_caching', fetch_result=True) -%}\n describe extended {{ table_name }}\n {% endcall %}\n {% do return(load_result('describe_table_extended_without_caching').table) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "table_name", "type": null, "description": ""}], "created_at": 1785250505.0763438, "supported_languages": null}, "macro.dbt_spark.spark__list_schemas": {"name": "spark__list_schemas", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__list_schemas", "macro_sql": "{% macro spark__list_schemas(database) -%}\n {% call statement('list_schemas', fetch_result=True, auto_begin=False) %}\n show databases\n {% endcall %}\n {{ return(load_result('list_schemas').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "database", "type": null, "description": ""}], "created_at": 1785250505.0773385, "supported_languages": null}, "macro.dbt_spark.spark__rename_relation": {"name": "spark__rename_relation", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__rename_relation", "macro_sql": "{% macro spark__rename_relation(from_relation, to_relation) -%}\n {% call statement('rename_relation') -%}\n {% if not from_relation.type %}\n {% do exceptions.raise_database_error(\"Cannot rename a relation with a blank type: \" ~ from_relation.identifier) %}\n {% elif from_relation.type in ('table') %}\n alter table {{ from_relation }} rename to {{ to_relation }}\n {% elif from_relation.type == 'view' %}\n alter view {{ from_relation }} rename to {{ to_relation }}\n {% else %}\n {% do exceptions.raise_database_error(\"Unknown type '\" ~ from_relation.type ~ \"' for relation: \" ~ from_relation.identifier) %}\n {% endif %}\n {%- endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "from_relation", "type": null, "description": ""}, {"name": "to_relation", "type": null, "description": ""}], "created_at": 1785250505.0783436, "supported_languages": null}, "macro.dbt_spark.spark__drop_relation": {"name": "spark__drop_relation", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__drop_relation", "macro_sql": "{% macro spark__drop_relation(relation) -%}\n {% call statement('drop_relation', auto_begin=False) -%}\n drop {{ relation.type }} if exists {{ relation }}\n {%- endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.0783436, "supported_languages": null}, "macro.dbt_spark.spark__generate_database_name": {"name": "spark__generate_database_name", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__generate_database_name", "macro_sql": "{% macro spark__generate_database_name(custom_database_name=none, node=none) -%}\n {% do return(None) %}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "custom_database_name", "type": null, "description": ""}, {"name": "node", "type": null, "description": ""}], "created_at": 1785250505.079339, "supported_languages": null}, "macro.dbt_spark.spark__persist_docs": {"name": "spark__persist_docs", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__persist_docs", "macro_sql": "{% macro spark__persist_docs(relation, model, for_relation, for_columns) -%}\n {% if for_columns and config.persist_column_docs() and model.columns %}\n {% set existing_columns = adapter.get_columns_in_relation(relation) | map(attribute=\"name\") | list %}\n {% set filtered_columns = validate_doc_columns(relation, model.columns, existing_columns) %}\n {% do alter_column_comment(relation, filtered_columns) %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.validate_doc_columns", "macro.dbt.alter_column_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "model", "type": null, "description": ""}, {"name": "for_relation", "type": null, "description": ""}, {"name": "for_columns", "type": null, "description": ""}], "created_at": 1785250505.0803452, "supported_languages": null}, "macro.dbt_spark.spark__alter_column_comment": {"name": "spark__alter_column_comment", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__alter_column_comment", "macro_sql": "{% macro spark__alter_column_comment(relation, column_dict) %}\n {% if config.get('file_format', validator=validation.any[basestring]) in ['delta', 'hudi', 'iceberg'] %}\n {% for column_name in column_dict %}\n {% set comment = column_dict[column_name]['description'] %}\n {% set escaped_comment = comment | replace('\\'', '\\\\\\'') %}\n {% set comment_query %}\n {% if relation.is_iceberg %}\n alter table {{ relation }} alter column\n {{ adapter.quote(column_name) if column_dict[column_name]['quote'] else column_name }}\n comment '{{ escaped_comment }}';\n {% else %}\n alter table {{ relation }} change column\n {{ adapter.quote(column_name) if column_dict[column_name]['quote'] else column_name }}\n comment '{{ escaped_comment }}';\n {% endif %}\n {% endset %}\n {% do run_query(comment_query) %}\n {% endfor %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column_dict", "type": null, "description": ""}], "created_at": 1785250505.0823424, "supported_languages": null}, "macro.dbt_spark.spark__make_temp_relation": {"name": "spark__make_temp_relation", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__make_temp_relation", "macro_sql": "{% macro spark__make_temp_relation(base_relation, suffix) %}\n {% set tmp_identifier = base_relation.identifier ~ suffix %}\n {% set tmp_relation = base_relation.incorporate(path = {\n \"identifier\": tmp_identifier\n }) -%}\n\n {%- set tmp_relation = tmp_relation.include(database=false, schema=false) -%}\n {% do return(tmp_relation) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "base_relation", "type": null, "description": ""}, {"name": "suffix", "type": null, "description": ""}], "created_at": 1785250505.0833423, "supported_languages": null}, "macro.dbt_spark.spark__alter_column_type": {"name": "spark__alter_column_type", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__alter_column_type", "macro_sql": "{% macro spark__alter_column_type(relation, column_name, new_column_type) -%}\n {% call statement('alter_column_type') %}\n alter table {{ relation }} alter column {{ column_name }} type {{ new_column_type }};\n {% endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "new_column_type", "type": null, "description": ""}], "created_at": 1785250505.0833423, "supported_languages": null}, "macro.dbt_spark.spark__alter_relation_add_remove_columns": {"name": "spark__alter_relation_add_remove_columns", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\adapters.sql", "original_file_path": "macros\\adapters.sql", "unique_id": "macro.dbt_spark.spark__alter_relation_add_remove_columns", "macro_sql": "{% macro spark__alter_relation_add_remove_columns(relation, add_columns, remove_columns) %}\n\n {% if remove_columns %}\n {% if relation.is_delta %}\n {% set platform_name = 'Delta Lake' %}\n {% elif relation.is_iceberg %}\n {% set platform_name = 'Iceberg' %}\n {% else %}\n {% set platform_name = 'Apache Spark' %}\n {% endif %}\n {{ exceptions.raise_compiler_error(platform_name + ' does not support dropping columns from tables') }}\n {% endif %}\n\n {% if add_columns is none %}\n {% set add_columns = [] %}\n {% endif %}\n\n {% set sql -%}\n\n alter {{ relation.type }} {{ relation }}\n\n {% if add_columns %} add columns {% endif %}\n {% for column in add_columns %}\n {{ column.quoted }} {{ column.data_type }}{{ ',' if not loop.last }}\n {% endfor %}\n\n {%- endset -%}\n\n {% do run_query(sql) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "add_columns", "type": null, "description": ""}, {"name": "remove_columns", "type": null, "description": ""}], "created_at": 1785250505.0853388, "supported_languages": null}, "macro.dbt_spark.spark__copy_grants": {"name": "spark__copy_grants", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\apply_grants.sql", "original_file_path": "macros\\apply_grants.sql", "unique_id": "macro.dbt_spark.spark__copy_grants", "macro_sql": "{% macro spark__copy_grants() %}\n\n {% if config.materialized == 'view' %}\n {#-- Spark views don't copy grants when they're replaced --#}\n {{ return(False) }}\n\n {% else %}\n {#-- This depends on how we're replacing the table, which depends on its file format\n -- Just play it safe by assuming that grants have been copied over, and need to be checked / possibly revoked\n -- We can make this more efficient in the future\n #}\n {{ return(True) }}\n\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.0863457, "supported_languages": null}, "macro.dbt_spark.spark__get_grant_sql": {"name": "spark__get_grant_sql", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\apply_grants.sql", "original_file_path": "macros\\apply_grants.sql", "unique_id": "macro.dbt_spark.spark__get_grant_sql", "macro_sql": "\n\n\n{%- macro spark__get_grant_sql(relation, privilege, grantees) -%}\n grant {{ privilege }} on {{ relation }} to {{ adapter.quote(grantees[0]) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "privilege", "type": null, "description": ""}, {"name": "grantees", "type": null, "description": ""}], "created_at": 1785250505.0873375, "supported_languages": null}, "macro.dbt_spark.spark__get_revoke_sql": {"name": "spark__get_revoke_sql", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\apply_grants.sql", "original_file_path": "macros\\apply_grants.sql", "unique_id": "macro.dbt_spark.spark__get_revoke_sql", "macro_sql": "\n\n\n{%- macro spark__get_revoke_sql(relation, privilege, grantees) -%}\n revoke {{ privilege }} on {{ relation }} from {{ adapter.quote(grantees[0]) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "privilege", "type": null, "description": ""}, {"name": "grantees", "type": null, "description": ""}], "created_at": 1785250505.0873375, "supported_languages": null}, "macro.dbt_spark.spark__support_multiple_grantees_per_dcl_statement": {"name": "spark__support_multiple_grantees_per_dcl_statement", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\apply_grants.sql", "original_file_path": "macros\\apply_grants.sql", "unique_id": "macro.dbt_spark.spark__support_multiple_grantees_per_dcl_statement", "macro_sql": "\n\n\n{%- macro spark__support_multiple_grantees_per_dcl_statement() -%}\n {{ return(False) }}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.0873375, "supported_languages": null}, "macro.dbt_spark.spark__call_dcl_statements": {"name": "spark__call_dcl_statements", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\apply_grants.sql", "original_file_path": "macros\\apply_grants.sql", "unique_id": "macro.dbt_spark.spark__call_dcl_statements", "macro_sql": "{% macro spark__call_dcl_statements(dcl_statement_list) %}\n {% for dcl_statement in dcl_statement_list %}\n {% call statement('grant_or_revoke') %}\n {{ dcl_statement }}\n {% endcall %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "dcl_statement_list", "type": null, "description": ""}], "created_at": 1785250505.0883448, "supported_languages": null}, "macro.dbt_spark.spark__can_clone_table": {"name": "spark__can_clone_table", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\clone.sql", "original_file_path": "macros\\materializations\\clone.sql", "unique_id": "macro.dbt_spark.spark__can_clone_table", "macro_sql": "{% macro spark__can_clone_table() %}\n {{ return(True) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.0893352, "supported_languages": null}, "macro.dbt_spark.spark__create_or_replace_clone": {"name": "spark__create_or_replace_clone", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\clone.sql", "original_file_path": "macros\\materializations\\clone.sql", "unique_id": "macro.dbt_spark.spark__create_or_replace_clone", "macro_sql": "{% macro spark__create_or_replace_clone(this_relation, defer_relation) %}\n create or replace table {{ this_relation }} shallow clone {{ defer_relation }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "this_relation", "type": null, "description": ""}, {"name": "defer_relation", "type": null, "description": ""}], "created_at": 1785250505.0898438, "supported_languages": null}, "macro.dbt_spark.materialization_clone_spark": {"name": "materialization_clone_spark", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\clone.sql", "original_file_path": "macros\\materializations\\clone.sql", "unique_id": "macro.dbt_spark.materialization_clone_spark", "macro_sql": "\n\n{%- materialization clone, adapter='spark' -%}\n\n {%- set relations = {'relations': []} -%}\n\n {%- if not defer_relation -%}\n -- nothing to do\n {{ log(\"No relation found in state manifest for \" ~ model.unique_id, info=True) }}\n {{ return(relations) }}\n {%- endif -%}\n\n {%- set existing_relation = load_cached_relation(this) -%}\n\n {%- if existing_relation and not flags.FULL_REFRESH -%}\n -- noop!\n {{ log(\"Relation \" ~ existing_relation ~ \" already exists\", info=True) }}\n {{ return(relations) }}\n {%- endif -%}\n\n {%- set other_existing_relation = load_cached_relation(defer_relation) -%}\n {%- set file_format = config.get('file_format', validator=validation.any[basestring]) -%}\n\n -- If this is a database that can do zero-copy cloning of tables, and the other relation is a table, then this will be a table\n -- Otherwise, this will be a view\n\n {% set can_clone_table = can_clone_table() %}\n\n {%- if file_format != 'delta' -%}\n {% set invalid_format_msg -%}\n Invalid file format: {{ file_format }}\n shallow clone requires file_format be set to 'delta'\n {%- endset %}\n {% do exceptions.raise_compiler_error(invalid_format_msg) %}\n {%- elif other_existing_relation and other_existing_relation.type == 'table' and can_clone_table -%}\n\n {%- set target_relation = this.incorporate(type='table') -%}\n {% if existing_relation is not none and not existing_relation.is_table %}\n {{ log(\"Dropping relation \" ~ existing_relation ~ \" because it is of type \" ~ existing_relation.type) }}\n {{ drop_relation_if_exists(existing_relation) }}\n {% endif %}\n\n -- as a general rule, data platforms that can clone tables can also do atomic 'create or replace'\n {% call statement('main') %}\n {{ create_or_replace_clone(target_relation, defer_relation) }}\n {% endcall %}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n {% do persist_docs(target_relation, model) %}\n\n {{ return({'relations': [target_relation]}) }}\n\n {%- else -%}\n\n {%- set target_relation = this.incorporate(type='view') -%}\n\n -- reuse the view materialization\n -- TODO: support actual dispatch for materialization macros\n -- Tracking ticket: https://github.com/dbt-labs/dbt-core/issues/7799\n {% set search_name = \"materialization_view_\" ~ adapter.type() %}\n {% if not search_name in context %}\n {% set search_name = \"materialization_view_default\" %}\n {% endif %}\n {% set materialization_macro = context[search_name] %}\n {% set relations = materialization_macro() %}\n {{ return(relations) }}\n {% endif %}\n\n{%- endmaterialization -%}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.can_clone_table", "macro.dbt.drop_relation_if_exists", "macro.dbt.statement", "macro.dbt.create_or_replace_clone", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.0938818, "supported_languages": ["sql"]}, "macro.dbt_spark.spark__get_binding_char": {"name": "spark__get_binding_char", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\seed.sql", "original_file_path": "macros\\materializations\\seed.sql", "unique_id": "macro.dbt_spark.spark__get_binding_char", "macro_sql": "{% macro spark__get_binding_char() %}\n {{ return('?' if target.method == 'odbc' else '%s') }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.0954041, "supported_languages": null}, "macro.dbt_spark.spark__reset_csv_table": {"name": "spark__reset_csv_table", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\seed.sql", "original_file_path": "macros\\materializations\\seed.sql", "unique_id": "macro.dbt_spark.spark__reset_csv_table", "macro_sql": "{% macro spark__reset_csv_table(model, full_refresh, old_relation, agate_table) %}\n {% if old_relation %}\n {{ adapter.drop_relation(old_relation) }}\n {% endif %}\n {% set sql = create_csv_table(model, agate_table) %}\n {{ return(sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.create_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "full_refresh", "type": null, "description": ""}, {"name": "old_relation", "type": null, "description": ""}, {"name": "agate_table", "type": null, "description": ""}], "created_at": 1785250505.0964274, "supported_languages": null}, "macro.dbt_spark.spark__load_csv_rows": {"name": "spark__load_csv_rows", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\seed.sql", "original_file_path": "macros\\materializations\\seed.sql", "unique_id": "macro.dbt_spark.spark__load_csv_rows", "macro_sql": "{% macro spark__load_csv_rows(model, agate_table) %}\n\n {% set batch_size = get_batch_size() %}\n {% set column_override = model['config'].get('column_types', {}) %}\n\n {% set statements = [] %}\n\n {% for chunk in agate_table.rows | batch(batch_size) %}\n {% set bindings = [] %}\n\n {% for row in chunk %}\n {% do bindings.extend(row) %}\n {% endfor %}\n\n {% set sql %}\n insert into {{ this.render() }} values\n {% for row in chunk -%}\n ({%- for col_name in agate_table.column_names -%}\n {%- set inferred_type = adapter.convert_type(agate_table, loop.index0) -%}\n {%- set type = column_override.get(col_name, inferred_type) -%}\n cast({{ get_binding_char() }} as {{type}})\n {%- if not loop.last%},{%- endif %}\n {%- endfor -%})\n {%- if not loop.last%},{%- endif %}\n {%- endfor %}\n {% endset %}\n\n {% do adapter.add_query(sql, bindings=bindings, abridge_sql_log=True) %}\n\n {% if loop.index0 == 0 %}\n {% do statements.append(sql) %}\n {% endif %}\n {% endfor %}\n\n {# Return SQL so we can render it out into the compiled files #}\n {{ return(statements[0]) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_batch_size", "macro.dbt.get_binding_char"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "agate_table", "type": null, "description": ""}], "created_at": 1785250505.099417, "supported_languages": null}, "macro.dbt_spark.spark__create_csv_table": {"name": "spark__create_csv_table", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\seed.sql", "original_file_path": "macros\\materializations\\seed.sql", "unique_id": "macro.dbt_spark.spark__create_csv_table", "macro_sql": "{% macro spark__create_csv_table(model, agate_table) %}\n {%- set column_override = model['config'].get('column_types', {}) -%}\n {%- set quote_seed_column = model['config'].get('quote_columns', None) -%}\n\n {% set sql %}\n create table {{ this.render() }} (\n {%- for col_name in agate_table.column_names -%}\n {%- set inferred_type = adapter.convert_type(agate_table, loop.index0) -%}\n {%- set type = column_override.get(col_name, inferred_type) -%}\n {%- set column_name = (col_name | string) -%}\n {{ adapter.quote_seed_column(column_name, quote_seed_column) }} {{ type }} {%- if not loop.last -%}, {%- endif -%}\n {%- endfor -%}\n )\n {{ file_format_clause() }}\n {{ partition_cols(label=\"partitioned by\") }}\n {{ clustered_cols(label=\"clustered by\") }}\n {{ location_clause() }}\n {{ comment_clause() }}\n {% endset %}\n\n {% call statement('_') -%}\n {{ sql }}\n {%- endcall %}\n\n {{ return(sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.file_format_clause", "macro.dbt_spark.partition_cols", "macro.dbt_spark.clustered_cols", "macro.dbt_spark.location_clause", "macro.dbt_spark.comment_clause", "macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "agate_table", "type": null, "description": ""}], "created_at": 1785250505.1014204, "supported_languages": null}, "macro.dbt_spark.spark__snapshot_hash_arguments": {"name": "spark__snapshot_hash_arguments", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\snapshot.sql", "original_file_path": "macros\\materializations\\snapshot.sql", "unique_id": "macro.dbt_spark.spark__snapshot_hash_arguments", "macro_sql": "{% macro spark__snapshot_hash_arguments(args) -%}\n md5({%- for arg in args -%}\n coalesce(cast({{ arg }} as string ), '')\n {% if not loop.last %} || '|' || {% endif %}\n {%- endfor -%})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "args", "type": null, "description": ""}], "created_at": 1785250505.104418, "supported_languages": null}, "macro.dbt_spark.spark__snapshot_string_as_time": {"name": "spark__snapshot_string_as_time", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\snapshot.sql", "original_file_path": "macros\\materializations\\snapshot.sql", "unique_id": "macro.dbt_spark.spark__snapshot_string_as_time", "macro_sql": "{% macro spark__snapshot_string_as_time(timestamp) -%}\n {%- set result = \"to_timestamp('\" ~ timestamp ~ \"')\" -%}\n {{ return(result) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "timestamp", "type": null, "description": ""}], "created_at": 1785250505.1054168, "supported_languages": null}, "macro.dbt_spark.spark__snapshot_merge_sql": {"name": "spark__snapshot_merge_sql", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\snapshot.sql", "original_file_path": "macros\\materializations\\snapshot.sql", "unique_id": "macro.dbt_spark.spark__snapshot_merge_sql", "macro_sql": "{% macro spark__snapshot_merge_sql(target, source, insert_cols) -%}\n {%- set columns = config.get(\"snapshot_table_column_names\") or get_snapshot_table_column_names() -%}\n\n merge into {{ target }} as DBT_INTERNAL_DEST\n {% if target.is_iceberg %}\n {# create view only supports a name (no catalog, or schema) #}\n using {{ source.identifier }} as DBT_INTERNAL_SOURCE\n {% else %}\n using {{ source }} as DBT_INTERNAL_SOURCE\n {% endif %}\n on DBT_INTERNAL_SOURCE.{{ columns.dbt_scd_id }} = DBT_INTERNAL_DEST.{{ columns.dbt_scd_id }}\n when matched\n {% if config.get(\"dbt_valid_to_current\") %}\n and ( DBT_INTERNAL_DEST.{{ columns.dbt_valid_to }} = {{ config.get('dbt_valid_to_current') }} or\n DBT_INTERNAL_DEST.{{ columns.dbt_valid_to }} is null )\n {% else %}\n and DBT_INTERNAL_DEST.{{ columns.dbt_valid_to }} is null\n {% endif %}\n and DBT_INTERNAL_SOURCE.dbt_change_type in ('update', 'delete')\n then update\n set {{ columns.dbt_valid_to }} = DBT_INTERNAL_SOURCE.{{ columns.dbt_valid_to }}\n\n when not matched\n and DBT_INTERNAL_SOURCE.dbt_change_type = 'insert'\n then insert *\n ;\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_snapshot_table_column_names"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target", "type": null, "description": ""}, {"name": "source", "type": null, "description": ""}, {"name": "insert_cols", "type": null, "description": ""}], "created_at": 1785250505.1064236, "supported_languages": null}, "macro.dbt_spark.spark_build_snapshot_staging_table": {"name": "spark_build_snapshot_staging_table", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\snapshot.sql", "original_file_path": "macros\\materializations\\snapshot.sql", "unique_id": "macro.dbt_spark.spark_build_snapshot_staging_table", "macro_sql": "{% macro spark_build_snapshot_staging_table(strategy, sql, target_relation) %}\n {% set tmp_identifier = target_relation.identifier ~ '__dbt_tmp' %}\n\n {% if target_relation.is_iceberg %}\n {# iceberg catalog does not support create view, but regular spark does. We removed the catalog and schema #}\n {%- set tmp_relation = api.Relation.create(identifier=tmp_identifier,\n schema=none,\n database=none,\n type='view') -%}\n {% else %}\n {%- set tmp_relation = api.Relation.create(identifier=tmp_identifier,\n schema=target_relation.schema,\n database=none,\n type='view') -%}\n {% endif %}\n\n {% set select = snapshot_staging_table(strategy, sql, target_relation) %}\n\n {# needs to be a non-temp view so that its columns can be ascertained via `describe` #}\n {% call statement('build_snapshot_staging_relation') %}\n {{ create_view_as(tmp_relation, select) }}\n {% endcall %}\n\n {% do return(tmp_relation) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.snapshot_staging_table", "macro.dbt.statement", "macro.dbt.create_view_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "strategy", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.1084228, "supported_languages": null}, "macro.dbt_spark.spark__post_snapshot": {"name": "spark__post_snapshot", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\snapshot.sql", "original_file_path": "macros\\materializations\\snapshot.sql", "unique_id": "macro.dbt_spark.spark__post_snapshot", "macro_sql": "{% macro spark__post_snapshot(staging_relation) %}\n {% do adapter.drop_relation(staging_relation) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "staging_relation", "type": null, "description": ""}], "created_at": 1785250505.1084228, "supported_languages": null}, "macro.dbt_spark.spark__create_columns": {"name": "spark__create_columns", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\snapshot.sql", "original_file_path": "macros\\materializations\\snapshot.sql", "unique_id": "macro.dbt_spark.spark__create_columns", "macro_sql": "{% macro spark__create_columns(relation, columns) %}\n {% if columns|length > 0 %}\n {% call statement() %}\n alter table {{ relation }} add columns (\n {% for column in columns %}\n `{{ column.name }}` {{ column.data_type }} {{- ',' if not loop.last -}}\n {% endfor %}\n );\n {% endcall %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "columns", "type": null, "description": ""}], "created_at": 1785250505.1094234, "supported_languages": null}, "macro.dbt_spark.materialization_snapshot_spark": {"name": "materialization_snapshot_spark", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\snapshot.sql", "original_file_path": "macros\\materializations\\snapshot.sql", "unique_id": "macro.dbt_spark.materialization_snapshot_spark", "macro_sql": "{% materialization snapshot, adapter='spark' %}\n\n {%- set target_table = model.get('alias', model.get('name')) -%}\n\n {%- set strategy_name = config.get('strategy') -%}\n {%- set unique_key = config.get('unique_key') %}\n {%- set file_format = config.get('file_format') or 'parquet' -%}\n {%- set grant_config = config.get('grants') -%}\n\n {% set target_relation_exists, target_relation = get_or_create_relation(\n database=none,\n schema=model.schema,\n identifier=target_table,\n type='table') -%}\n\n {%- if file_format not in ['delta', 'iceberg', 'hudi'] -%}\n {% set invalid_format_msg -%}\n Invalid file format: {{ file_format }}\n Snapshot functionality requires file_format be set to 'delta' or 'iceberg' or 'hudi'\n {%- endset %}\n {% do exceptions.raise_compiler_error(invalid_format_msg) %}\n {% endif %}\n\n {%- if target_relation_exists -%}\n {%- if not target_relation.is_delta and not target_relation.is_iceberg and not target_relation.is_hudi -%}\n {% set invalid_format_msg -%}\n The existing table {{ model.schema }}.{{ target_table }} is in another format than 'delta' or 'iceberg' or 'hudi'\n {%- endset %}\n {% do exceptions.raise_compiler_error(invalid_format_msg) %}\n {% endif %}\n {% endif %}\n\n {% if not adapter.check_schema_exists(model.database, model.schema) %}\n {% do create_schema(model.schema) %}\n {% endif %}\n\n {%- if not target_relation.is_table -%}\n {% do exceptions.relation_wrong_type(target_relation, 'table') %}\n {%- endif -%}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n {% set strategy_macro = strategy_dispatch(strategy_name) %}\n {% set strategy = strategy_macro(model, \"snapshotted_data\", \"source_data\", model['config'], target_relation_exists) %}\n\n {% if not target_relation_exists %}\n\n {% set build_sql = build_snapshot_table(strategy, model['compiled_code']) %}\n {% set final_sql = create_table_as(False, target_relation, build_sql) %}\n\n {% else %}\n\n {% set columns = config.get(\"snapshot_table_column_names\") or get_snapshot_table_column_names() %}\n\n {{ adapter.valid_snapshot_target(target_relation, columns) }}\n\n {% set staging_table = spark_build_snapshot_staging_table(strategy, sql, target_relation) %}\n\n -- this may no-op if the database does not require column expansion\n {% do adapter.expand_target_column_types(from_relation=staging_table,\n to_relation=target_relation) %}\n\n {% set missing_columns = adapter.get_missing_columns(staging_table, target_relation)\n | rejectattr('name', 'equalto', 'dbt_change_type')\n | rejectattr('name', 'equalto', 'DBT_CHANGE_TYPE')\n | rejectattr('name', 'equalto', 'dbt_unique_key')\n | rejectattr('name', 'equalto', 'DBT_UNIQUE_KEY')\n | list %}\n\n {% do create_columns(target_relation, missing_columns) %}\n\n {% set source_columns = adapter.get_columns_in_relation(staging_table)\n | rejectattr('name', 'equalto', 'dbt_change_type')\n | rejectattr('name', 'equalto', 'DBT_CHANGE_TYPE')\n | rejectattr('name', 'equalto', 'dbt_unique_key')\n | rejectattr('name', 'equalto', 'DBT_UNIQUE_KEY')\n | list %}\n\n {% set quoted_source_columns = [] %}\n {% for column in source_columns %}\n {% do quoted_source_columns.append(adapter.quote(column.name)) %}\n {% endfor %}\n\n {% set final_sql = snapshot_merge_sql(\n target = target_relation,\n source = staging_table,\n insert_cols = quoted_source_columns\n )\n %}\n\n {% endif %}\n\n {% call statement('main') %}\n {{ final_sql }}\n {% endcall %}\n\n {% set should_revoke = should_revoke(target_relation_exists, full_refresh_mode) %}\n {% do apply_grants(target_relation, grant_config, should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n {{ adapter.commit() }}\n\n {% if staging_table is defined %}\n {% do post_snapshot(staging_table) %}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.get_or_create_relation", "macro.dbt.create_schema", "macro.dbt.run_hooks", "macro.dbt.strategy_dispatch", "macro.dbt.build_snapshot_table", "macro.dbt.create_table_as", "macro.dbt.get_snapshot_table_column_names", "macro.dbt_spark.spark_build_snapshot_staging_table", "macro.dbt.create_columns", "macro.dbt.snapshot_merge_sql", "macro.dbt.statement", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs", "macro.dbt.post_snapshot"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.117418, "supported_languages": ["sql"]}, "macro.dbt_spark.materialization_table_spark": {"name": "materialization_table_spark", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\table.sql", "original_file_path": "macros\\materializations\\table.sql", "unique_id": "macro.dbt_spark.materialization_table_spark", "macro_sql": "{% materialization table, adapter = 'spark', supported_languages=['sql', 'python'] %}\n {%- set language = model['language'] -%}\n {%- set identifier = model['alias'] -%}\n {%- set grant_config = config.get('grants') -%}\n\n {%- set old_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier) -%}\n {%- set target_relation = api.Relation.create(identifier=identifier,\n schema=schema,\n database=database,\n type='table') -%}\n\n {{ run_hooks(pre_hooks) }}\n\n -- setup: if the target relation already exists, drop it\n -- in case if the existing and future table is delta or iceberg, we want to do a\n -- create or replace table instead of dropping, so we don't have the table unavailable\n {% if old_relation is not none %}\n {% set is_delta = (old_relation.is_delta and config.get('file_format', validator=validation.any[basestring]) == 'delta') %}\n {% set is_iceberg = (old_relation.is_iceberg and config.get('file_format', validator=validation.any[basestring]) == 'iceberg') %}\n {% set old_relation_type = old_relation.type %}\n {% else %}\n {% set is_delta = false %}\n {% set is_iceberg = false %}\n {% set old_relation_type = target_relation.type %}\n {% endif %}\n\n {% if not is_delta and not is_iceberg %}\n {% set existing_relation = target_relation %}\n {{ adapter.drop_relation(existing_relation.incorporate(type=old_relation_type)) }}\n {% endif %}\n\n -- build model\n {%- call statement('main', language=language) -%}\n {{ create_table_as(False, target_relation, compiled_code, language) }}\n {%- endcall -%}\n\n {% set should_revoke = should_revoke(old_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {% do persist_constraints(target_relation, model) %}\n\n {{ run_hooks(post_hooks) }}\n\n {{ return({'relations': [target_relation]})}}\n\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.run_hooks", "macro.dbt.statement", "macro.dbt.create_table_as", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs", "macro.dbt_spark.persist_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.122421, "supported_languages": ["sql", "python"]}, "macro.dbt_spark.py_write_table": {"name": "py_write_table", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\table.sql", "original_file_path": "macros\\materializations\\table.sql", "unique_id": "macro.dbt_spark.py_write_table", "macro_sql": "{% macro py_write_table(compiled_code, target_relation) %}\n{{ compiled_code }}\n# --- Autogenerated dbt materialization code. --- #\ndbt = dbtObj(spark.table)\ndf = model(dbt, spark)\n\n# make sure pyspark exists in the namepace, for 7.3.x-scala2.12 it does not exist\nimport pyspark\n# make sure pandas exists before using it\ntry:\n import pandas\n pandas_available = True\nexcept ImportError:\n pandas_available = False\n\n# make sure pyspark.pandas exists before using it\ntry:\n import pyspark.pandas\n pyspark_pandas_api_available = True\nexcept ImportError:\n pyspark_pandas_api_available = False\n\n# make sure databricks.koalas exists before using it\ntry:\n import databricks.koalas\n koalas_available = True\nexcept ImportError:\n koalas_available = False\n\n# preferentially convert pandas DataFrames to pandas-on-Spark or Koalas DataFrames first\n# since they know how to convert pandas DataFrames better than `spark.createDataFrame(df)`\n# and converting from pandas-on-Spark to Spark DataFrame has no overhead\nif pyspark_pandas_api_available and pandas_available and isinstance(df, pandas.core.frame.DataFrame):\n df = pyspark.pandas.frame.DataFrame(df)\nelif koalas_available and pandas_available and isinstance(df, pandas.core.frame.DataFrame):\n df = databricks.koalas.frame.DataFrame(df)\n\n# convert to pyspark.sql.dataframe.DataFrame\nif isinstance(df, pyspark.sql.dataframe.DataFrame):\n pass # since it is already a Spark DataFrame\nelif pyspark_pandas_api_available and isinstance(df, pyspark.pandas.frame.DataFrame):\n df = df.to_spark()\nelif koalas_available and isinstance(df, databricks.koalas.frame.DataFrame):\n df = df.to_spark()\nelif pandas_available and isinstance(df, pandas.core.frame.DataFrame):\n df = spark.createDataFrame(df)\nelse:\n msg = f\"{type(df)} is not a supported type for dbt Python materialization\"\n raise Exception(msg)\n\ndf.write.mode(\"overwrite\").format(\"{{ config.get('file_format', 'delta') }}\").option(\"overwriteSchema\", \"true\").saveAsTable(\"{{ target_relation }}\")\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "compiled_code", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.1234224, "supported_languages": null}, "macro.dbt_spark.py_script_comment": {"name": "py_script_comment", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\table.sql", "original_file_path": "macros\\materializations\\table.sql", "unique_id": "macro.dbt_spark.py_script_comment", "macro_sql": "{%macro py_script_comment()%}\n# how to execute python model in notebook\n# dbt = dbtObj(spark.table)\n# df = model(dbt, spark)\n{%endmacro%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.1234224, "supported_languages": null}, "macro.dbt_spark.materialization_view_spark": {"name": "materialization_view_spark", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\view.sql", "original_file_path": "macros\\materializations\\view.sql", "unique_id": "macro.dbt_spark.materialization_view_spark", "macro_sql": "{% materialization view, adapter='spark' -%}\n {{ return(create_or_replace_view()) }}\n{%- endmaterialization %}", "depends_on": {"macros": ["macro.dbt.create_or_replace_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.1234224, "supported_languages": ["sql"]}, "macro.dbt_spark.spark__get_merge_update_columns": {"name": "spark__get_merge_update_columns", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\incremental\\column_helpers.sql", "original_file_path": "macros\\materializations\\incremental\\column_helpers.sql", "unique_id": "macro.dbt_spark.spark__get_merge_update_columns", "macro_sql": "{% macro spark__get_merge_update_columns(merge_update_columns, merge_exclude_columns, dest_columns) %}\n {%- set default_cols = None -%}\n\n {%- if merge_update_columns and merge_exclude_columns -%}\n {{ exceptions.raise_compiler_error(\n 'Model cannot specify merge_update_columns and merge_exclude_columns. Please update model to use only one config'\n )}}\n {%- elif merge_update_columns -%}\n {%- set update_columns = merge_update_columns -%}\n {%- elif merge_exclude_columns -%}\n {%- set update_columns = [] -%}\n {%- for column in dest_columns -%}\n {% if column.column | lower not in merge_exclude_columns | map(\"lower\") | list %}\n {%- do update_columns.append(column.quoted) -%}\n {% endif %}\n {%- endfor -%}\n {%- else -%}\n {%- set update_columns = default_cols -%}\n {%- endif -%}\n\n {{ return(update_columns) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "merge_update_columns", "type": null, "description": ""}, {"name": "merge_exclude_columns", "type": null, "description": ""}, {"name": "dest_columns", "type": null, "description": ""}], "created_at": 1785250505.1254215, "supported_languages": null}, "macro.dbt_spark.materialization_incremental_spark": {"name": "materialization_incremental_spark", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\incremental\\incremental.sql", "original_file_path": "macros\\materializations\\incremental\\incremental.sql", "unique_id": "macro.dbt_spark.materialization_incremental_spark", "macro_sql": "{% materialization incremental, adapter='spark', supported_languages=['sql', 'python'] -%}\n {#-- Validate early so we don't run SQL if the file_format + strategy combo is invalid --#}\n {%- set raw_file_format = config.get('file_format', default='parquet') -%}\n {%- set raw_strategy = config.get('incremental_strategy') or 'append' -%}\n {%- set grant_config = config.get('grants') -%}\n\n {%- set file_format = dbt_spark_validate_get_file_format(raw_file_format) -%}\n {%- set strategy = dbt_spark_validate_get_incremental_strategy(raw_strategy, file_format) -%}\n\n {#-- Set vars --#}\n\n {%- set unique_key = config.get('unique_key', none) -%}\n {%- set partition_by = config.get('partition_by', none) -%}\n {%- set language = model['language'] -%}\n {%- set on_schema_change = incremental_validate_on_schema_change(config.get('on_schema_change'), default='ignore') -%}\n {%- set incremental_predicates = config.get('predicates', none) or config.get('incremental_predicates', none) -%}\n {%- set target_relation = this -%}\n {%- set existing_relation = load_relation(this) -%}\n {% set tmp_relation = this.incorporate(path = {\"identifier\": this.identifier ~ '__dbt_tmp'}) -%}\n\n {#-- for SQL model we will create temp view that doesn't have database and schema --#}\n {%- if language == 'sql'-%}\n {%- set tmp_relation = tmp_relation.include(database=false, schema=false) -%}\n {%- endif -%}\n\n {#-- Set Overwrite Mode --#}\n {%- if strategy in ['insert_overwrite', 'microbatch'] and partition_by -%}\n {%- call statement() -%}\n set spark.sql.sources.partitionOverwriteMode = DYNAMIC\n {%- endcall -%}\n {%- endif -%}\n\n {#-- Run pre-hooks --#}\n {{ run_hooks(pre_hooks) }}\n\n {#-- Incremental run logic --#}\n {%- if existing_relation is none -%}\n {#-- Relation must be created --#}\n {%- call statement('main', language=language) -%}\n {{ create_table_as(False, target_relation, compiled_code, language) }}\n {%- endcall -%}\n {% do persist_constraints(target_relation, model) %}\n {%- elif existing_relation.is_view or should_full_refresh() -%}\n {#-- Relation must be dropped & recreated --#}\n {% set is_delta = (file_format == 'delta' and existing_relation.is_delta) %}\n {% if not is_delta %} {#-- If Delta, we will `create or replace` below, so no need to drop --#}\n {% do adapter.drop_relation(existing_relation) %}\n {% endif %}\n {%- call statement('main', language=language) -%}\n {{ create_table_as(False, target_relation, compiled_code, language) }}\n {%- endcall -%}\n {% do persist_constraints(target_relation, model) %}\n {%- else -%}\n {#-- Relation must be merged --#}\n {%- call statement('create_tmp_relation', language=language) -%}\n {{ create_table_as(True, tmp_relation, compiled_code, language) }}\n {%- endcall -%}\n {%- do process_schema_changes(on_schema_change, tmp_relation, existing_relation) -%}\n {%- call statement('main') -%}\n {{ dbt_spark_get_incremental_sql(strategy, tmp_relation, target_relation, existing_relation, unique_key, incremental_predicates) }}\n {%- endcall -%}\n {%- if language == 'python' -%}\n {#--\n This is yucky.\n See note in dbt-spark/dbt/include/spark/macros/adapters.sql\n re: python models and temporary views.\n\n Also, why do neither drop_relation or adapter.drop_relation work here?!\n --#}\n {% call statement('drop_relation') -%}\n drop table if exists {{ tmp_relation }}\n {%- endcall %}\n {%- endif -%}\n {%- endif -%}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode) %}\n {% do apply_grants(target_relation, grant_config, should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {{ run_hooks(post_hooks) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{%- endmaterialization %}", "depends_on": {"macros": ["macro.dbt_spark.dbt_spark_validate_get_file_format", "macro.dbt_spark.dbt_spark_validate_get_incremental_strategy", "macro.dbt.incremental_validate_on_schema_change", "macro.dbt.load_relation", "macro.dbt.statement", "macro.dbt.run_hooks", "macro.dbt.create_table_as", "macro.dbt_spark.persist_constraints", "macro.dbt.should_full_refresh", "macro.dbt.process_schema_changes", "macro.dbt_spark.dbt_spark_get_incremental_sql", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.132422, "supported_languages": ["sql", "python"]}, "macro.dbt_spark.get_insert_overwrite_sql": {"name": "get_insert_overwrite_sql", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_spark.get_insert_overwrite_sql", "macro_sql": "{% macro get_insert_overwrite_sql(source_relation, target_relation, existing_relation) %}\n\n {%- set dest_columns = adapter.get_columns_in_relation(target_relation) -%}\n {%- set dest_cols_csv = dest_columns | map(attribute='quoted') | join(', ') -%}\n {% if existing_relation.is_iceberg %}\n {# removed table from statement for iceberg #}\n insert overwrite {{ target_relation }}\n {# removed partition_cols for iceberg as well #}\n {% else %}\n insert overwrite table {{ target_relation }}\n {{ partition_cols(label=\"partition\") }}\n {% endif %}\n select {{dest_cols_csv}} from {{ source_relation }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.partition_cols"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "existing_relation", "type": null, "description": ""}], "created_at": 1785250505.1354206, "supported_languages": null}, "macro.dbt_spark.get_insert_into_sql": {"name": "get_insert_into_sql", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_spark.get_insert_into_sql", "macro_sql": "{% macro get_insert_into_sql(source_relation, target_relation) %}\n\n {%- set dest_columns = adapter.get_columns_in_relation(target_relation) -%}\n {%- set dest_cols_csv = dest_columns | map(attribute='quoted') | join(', ') -%}\n insert into table {{ target_relation }}\n select {{dest_cols_csv}} from {{ source_relation }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.1354206, "supported_languages": null}, "macro.dbt_spark.spark__get_merge_sql": {"name": "spark__get_merge_sql", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_spark.spark__get_merge_sql", "macro_sql": "{% macro spark__get_merge_sql(target, source, unique_key, dest_columns, incremental_predicates) %}\n {# need dest_columns for merge_exclude_columns, default to use \"*\" #}\n {%- set predicates = [] if incremental_predicates is none else [] + incremental_predicates -%}\n {%- set dest_columns = adapter.get_columns_in_relation(target) -%}\n {%- set merge_update_columns = config.get('merge_update_columns') -%}\n {%- set merge_exclude_columns = config.get('merge_exclude_columns') -%}\n {%- set update_columns = get_merge_update_columns(merge_update_columns, merge_exclude_columns, dest_columns) -%}\n\n {% if unique_key %}\n {% if unique_key is sequence and unique_key is not mapping and unique_key is not string %}\n {% for key in unique_key %}\n {% set this_key_match %}\n DBT_INTERNAL_SOURCE.{{ key }} = DBT_INTERNAL_DEST.{{ key }}\n {% endset %}\n {% do predicates.append(this_key_match) %}\n {% endfor %}\n {% else %}\n {% set unique_key_match %}\n DBT_INTERNAL_SOURCE.{{ unique_key }} = DBT_INTERNAL_DEST.{{ unique_key }}\n {% endset %}\n {% do predicates.append(unique_key_match) %}\n {% endif %}\n {% else %}\n {% do predicates.append('FALSE') %}\n {% endif %}\n\n {{ sql_header if sql_header is not none }}\n\n merge into {{ target }} as DBT_INTERNAL_DEST\n using {{ source }} as DBT_INTERNAL_SOURCE\n on {{ predicates | join(' and ') }}\n\n when matched then update set\n {% if update_columns -%}{%- for column_name in update_columns %}\n {{ column_name }} = DBT_INTERNAL_SOURCE.{{ column_name }}\n {%- if not loop.last %}, {%- endif %}\n {%- endfor %}\n {%- else %} * {% endif %}\n\n when not matched then insert *\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_merge_update_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target", "type": null, "description": ""}, {"name": "source", "type": null, "description": ""}, {"name": "unique_key", "type": null, "description": ""}, {"name": "dest_columns", "type": null, "description": ""}, {"name": "incremental_predicates", "type": null, "description": ""}], "created_at": 1785250505.1394181, "supported_languages": null}, "macro.dbt_spark.dbt_spark_get_incremental_sql": {"name": "dbt_spark_get_incremental_sql", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\incremental\\strategies.sql", "unique_id": "macro.dbt_spark.dbt_spark_get_incremental_sql", "macro_sql": "{% macro dbt_spark_get_incremental_sql(strategy, source, target, existing, unique_key, incremental_predicates) %}\n {%- if strategy == 'append' -%}\n {#-- insert new records into existing table, without updating or overwriting #}\n {{ get_insert_into_sql(source, target) }}\n {%- elif strategy == 'insert_overwrite' -%}\n {#-- insert statements don't like CTEs, so support them via a temp view #}\n {{ get_insert_overwrite_sql(source, target, existing) }}\n {%- elif strategy == 'microbatch' -%}\n {#-- microbatch wraps insert_overwrite, and requires a partition_by config #}\n {% set missing_partition_key_microbatch_msg -%}\n dbt-spark 'microbatch' incremental strategy requires a `partition_by` config.\n Ensure you are using a `partition_by` column that is of grain {{ config.get('batch_size') }}.\n {%- endset %}\n\n {%- if not config.get('partition_by') -%}\n {{ exceptions.raise_compiler_error(missing_partition_key_microbatch_msg) }}\n {%- endif -%}\n {{ get_insert_overwrite_sql(source, target, existing) }}\n {%- elif strategy == 'merge' -%}\n {#-- merge all columns for datasources which implement MERGE INTO (e.g. databricks, iceberg) - schema changes are handled for us #}\n {{ get_merge_sql(target, source, unique_key, dest_columns=none, incremental_predicates=incremental_predicates) }}\n {%- else -%}\n {% set no_sql_for_strategy_msg -%}\n No known SQL for the incremental strategy provided: {{ strategy }}\n {%- endset %}\n {%- do exceptions.raise_compiler_error(no_sql_for_strategy_msg) -%}\n {%- endif -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.get_insert_into_sql", "macro.dbt_spark.get_insert_overwrite_sql", "macro.dbt.get_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "strategy", "type": null, "description": ""}, {"name": "source", "type": null, "description": ""}, {"name": "target", "type": null, "description": ""}, {"name": "existing", "type": null, "description": ""}, {"name": "unique_key", "type": null, "description": ""}, {"name": "incremental_predicates", "type": null, "description": ""}], "created_at": 1785250505.141419, "supported_languages": null}, "macro.dbt_spark.dbt_spark_validate_get_file_format": {"name": "dbt_spark_validate_get_file_format", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\incremental\\validate.sql", "original_file_path": "macros\\materializations\\incremental\\validate.sql", "unique_id": "macro.dbt_spark.dbt_spark_validate_get_file_format", "macro_sql": "{% macro dbt_spark_validate_get_file_format(raw_file_format) %}\n {#-- Validate the file format #}\n\n {% set accepted_formats = ['text', 'csv', 'json', 'jdbc', 'parquet', 'orc', 'hive', 'delta', 'iceberg', 'libsvm', 'hudi'] %}\n\n {% set invalid_file_format_msg -%}\n Invalid file format provided: {{ raw_file_format }}\n Expected one of: {{ accepted_formats | join(', ') }}\n {%- endset %}\n\n {% if raw_file_format not in accepted_formats %}\n {% do exceptions.raise_compiler_error(invalid_file_format_msg) %}\n {% endif %}\n\n {% do return(raw_file_format) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "raw_file_format", "type": null, "description": ""}], "created_at": 1785250505.1434195, "supported_languages": null}, "macro.dbt_spark.dbt_spark_validate_get_incremental_strategy": {"name": "dbt_spark_validate_get_incremental_strategy", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\materializations\\incremental\\validate.sql", "original_file_path": "macros\\materializations\\incremental\\validate.sql", "unique_id": "macro.dbt_spark.dbt_spark_validate_get_incremental_strategy", "macro_sql": "{% macro dbt_spark_validate_get_incremental_strategy(raw_strategy, file_format) %}\n {#-- Validate the incremental strategy #}\n\n {% set invalid_strategy_msg -%}\n Invalid incremental strategy provided: {{ raw_strategy }}\n Expected one of: 'append', 'merge', 'insert_overwrite', 'microbatch'\n {%- endset %}\n\n {% set invalid_merge_msg -%}\n Invalid incremental strategy provided: {{ raw_strategy }}\n You can only choose this strategy when file_format is set to 'delta' or 'iceberg' or 'hudi'\n {%- endset %}\n\n {% set invalid_insert_overwrite_endpoint_msg -%}\n Invalid incremental strategy provided: {{ raw_strategy }}\n You cannot use this strategy when connecting via endpoint\n Use the 'append' or 'merge' strategy instead\n {%- endset %}\n\n {% if raw_strategy not in ['append', 'merge', 'insert_overwrite', 'microbatch'] %}\n {% do exceptions.raise_compiler_error(invalid_strategy_msg) %}\n {%-else %}\n {% if raw_strategy == 'merge' and file_format not in ['delta', 'iceberg', 'hudi'] %}\n {% do exceptions.raise_compiler_error(invalid_merge_msg) %}\n {% endif %}\n {% if raw_strategy in ['insert_overwrite', 'microbatch'] and target.endpoint %}\n {% do exceptions.raise_compiler_error(invalid_insert_overwrite_endpoint_msg) %}\n {% endif %}\n {% endif %}\n\n {% do return(raw_strategy) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "raw_strategy", "type": null, "description": ""}, {"name": "file_format", "type": null, "description": ""}], "created_at": 1785250505.1444223, "supported_languages": null}, "macro.dbt_spark.spark__any_value": {"name": "spark__any_value", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\any_value.sql", "original_file_path": "macros\\utils\\any_value.sql", "unique_id": "macro.dbt_spark.spark__any_value", "macro_sql": "{% macro spark__any_value(expression) -%}\n {#-- return any value (non-deterministic) --#}\n first({{ expression }})\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expression", "type": null, "description": ""}], "created_at": 1785250505.145422, "supported_languages": null}, "macro.dbt_spark.spark__array_append": {"name": "spark__array_append", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\array_append.sql", "original_file_path": "macros\\utils\\array_append.sql", "unique_id": "macro.dbt_spark.spark__array_append", "macro_sql": "{% macro spark__array_append(array, new_element) -%}\n {{ array_concat(array, array_construct([new_element])) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.array_concat", "macro.dbt.array_construct"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "array", "type": null, "description": ""}, {"name": "new_element", "type": null, "description": ""}], "created_at": 1785250505.145422, "supported_languages": null}, "macro.dbt_spark.spark__array_concat": {"name": "spark__array_concat", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\array_concat.sql", "original_file_path": "macros\\utils\\array_concat.sql", "unique_id": "macro.dbt_spark.spark__array_concat", "macro_sql": "{% macro spark__array_concat(array_1, array_2) -%}\n concat({{ array_1 }}, {{ array_2 }})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "array_1", "type": null, "description": ""}, {"name": "array_2", "type": null, "description": ""}], "created_at": 1785250505.1464274, "supported_languages": null}, "macro.dbt_spark.spark__array_construct": {"name": "spark__array_construct", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\array_construct.sql", "original_file_path": "macros\\utils\\array_construct.sql", "unique_id": "macro.dbt_spark.spark__array_construct", "macro_sql": "{% macro spark__array_construct(inputs, data_type) -%}\n array( {{ inputs|join(' , ') }} )\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "inputs", "type": null, "description": ""}, {"name": "data_type", "type": null, "description": ""}], "created_at": 1785250505.1464274, "supported_languages": null}, "macro.dbt_spark.assert_not_null": {"name": "assert_not_null", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\assert_not_null.sql", "original_file_path": "macros\\utils\\assert_not_null.sql", "unique_id": "macro.dbt_spark.assert_not_null", "macro_sql": "{% macro assert_not_null(function, arg) -%}\n {{ return(adapter.dispatch('assert_not_null', 'dbt')(function, arg)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__assert_not_null"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "function", "type": null, "description": ""}, {"name": "arg", "type": null, "description": ""}], "created_at": 1785250505.14742, "supported_languages": null}, "macro.dbt_spark.spark__assert_not_null": {"name": "spark__assert_not_null", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\assert_not_null.sql", "original_file_path": "macros\\utils\\assert_not_null.sql", "unique_id": "macro.dbt_spark.spark__assert_not_null", "macro_sql": "{% macro spark__assert_not_null(function, arg) %}\n\n coalesce({{function}}({{arg}}), nvl2({{function}}({{arg}}), assert_true({{function}}({{arg}}) is not null), null))\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "function", "type": null, "description": ""}, {"name": "arg", "type": null, "description": ""}], "created_at": 1785250505.14742, "supported_languages": null}, "macro.dbt_spark.spark__bool_or": {"name": "spark__bool_or", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\bool_or.sql", "original_file_path": "macros\\utils\\bool_or.sql", "unique_id": "macro.dbt_spark.spark__bool_or", "macro_sql": "{% macro spark__bool_or(expression) -%}\n\n max({{ expression }})\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expression", "type": null, "description": ""}], "created_at": 1785250505.14742, "supported_languages": null}, "macro.dbt_spark.spark__concat": {"name": "spark__concat", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\concat.sql", "original_file_path": "macros\\utils\\concat.sql", "unique_id": "macro.dbt_spark.spark__concat", "macro_sql": "{% macro spark__concat(fields) -%}\n concat({{ fields|join(', ') }})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "fields", "type": null, "description": ""}], "created_at": 1785250505.1484265, "supported_languages": null}, "macro.dbt_spark.spark__date": {"name": "spark__date", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\date.sql", "original_file_path": "macros\\utils\\date.sql", "unique_id": "macro.dbt_spark.spark__date", "macro_sql": "{% macro spark__date(year, month, day) -%}\n {%- set dt = modules.datetime.date(year, month, day) -%}\n {%- set iso_8601_formatted_date = dt.strftime('%Y-%m-%d') -%}\n to_date('{{ iso_8601_formatted_date }}', 'yyyy-MM-dd')\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "year", "type": null, "description": ""}, {"name": "month", "type": null, "description": ""}, {"name": "day", "type": null, "description": ""}], "created_at": 1785250505.1494262, "supported_languages": null}, "macro.dbt_spark.spark__dateadd": {"name": "spark__dateadd", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\dateadd.sql", "original_file_path": "macros\\utils\\dateadd.sql", "unique_id": "macro.dbt_spark.spark__dateadd", "macro_sql": "{% macro spark__dateadd(datepart, interval, from_date_or_timestamp) %}\n\n {%- set clock_component -%}\n {# make sure the dates + timestamps are real, otherwise raise an error asap #}\n to_unix_timestamp({{ assert_not_null('to_timestamp', from_date_or_timestamp) }})\n - to_unix_timestamp({{ assert_not_null('date', from_date_or_timestamp) }})\n {%- endset -%}\n\n {%- if datepart in ['day', 'week'] -%}\n\n {%- set multiplier = 7 if datepart == 'week' else 1 -%}\n\n to_timestamp(\n to_unix_timestamp(\n date_add(\n {{ assert_not_null('date', from_date_or_timestamp) }},\n cast({{interval}} * {{multiplier}} as int)\n )\n ) + {{clock_component}}\n )\n\n {%- elif datepart in ['month', 'quarter', 'year'] -%}\n\n {%- set multiplier -%}\n {%- if datepart == 'month' -%} 1\n {%- elif datepart == 'quarter' -%} 3\n {%- elif datepart == 'year' -%} 12\n {%- endif -%}\n {%- endset -%}\n\n to_timestamp(\n to_unix_timestamp(\n add_months(\n {{ assert_not_null('date', from_date_or_timestamp) }},\n cast({{interval}} * {{multiplier}} as int)\n )\n ) + {{clock_component}}\n )\n\n {%- elif datepart in ('hour', 'minute', 'second', 'millisecond', 'microsecond') -%}\n\n {%- set multiplier -%}\n {%- if datepart == 'hour' -%} 3600\n {%- elif datepart == 'minute' -%} 60\n {%- elif datepart == 'second' -%} 1\n {%- elif datepart == 'millisecond' -%} (1/1000000)\n {%- elif datepart == 'microsecond' -%} (1/1000000)\n {%- endif -%}\n {%- endset -%}\n\n to_timestamp(\n {{ assert_not_null('to_unix_timestamp', from_date_or_timestamp) }}\n + cast({{interval}} * {{multiplier}} as int)\n )\n\n {%- else -%}\n\n {{ exceptions.raise_compiler_error(\"macro dateadd not implemented for datepart ~ '\" ~ datepart ~ \"' ~ on Spark\") }}\n\n {%- endif -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.assert_not_null"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "datepart", "type": null, "description": ""}, {"name": "interval", "type": null, "description": ""}, {"name": "from_date_or_timestamp", "type": null, "description": ""}], "created_at": 1785250505.1534162, "supported_languages": null}, "macro.dbt_spark.spark__datediff": {"name": "spark__datediff", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\datediff.sql", "original_file_path": "macros\\utils\\datediff.sql", "unique_id": "macro.dbt_spark.spark__datediff", "macro_sql": "{% macro spark__datediff(first_date, second_date, datepart) %}\n\n {%- if datepart in ['day', 'week', 'month', 'quarter', 'year'] -%}\n\n {# make sure the dates are real, otherwise raise an error asap #}\n {% set first_date = assert_not_null('date', first_date) %}\n {% set second_date = assert_not_null('date', second_date) %}\n\n {%- endif -%}\n\n {%- if datepart == 'day' -%}\n\n datediff({{second_date}}, {{first_date}})\n\n {%- elif datepart == 'week' -%}\n\n case when {{first_date}} < {{second_date}}\n then floor(datediff({{second_date}}, {{first_date}})/7)\n else ceil(datediff({{second_date}}, {{first_date}})/7)\n end\n\n -- did we cross a week boundary (Sunday)?\n + case\n when {{first_date}} < {{second_date}} and dayofweek({{second_date}}) < dayofweek({{first_date}}) then 1\n when {{first_date}} > {{second_date}} and dayofweek({{second_date}}) > dayofweek({{first_date}}) then -1\n else 0 end\n\n {%- elif datepart == 'month' -%}\n\n case when {{first_date}} < {{second_date}}\n then floor(months_between(date({{second_date}}), date({{first_date}})))\n else ceil(months_between(date({{second_date}}), date({{first_date}})))\n end\n\n -- did we cross a month boundary?\n + case\n when {{first_date}} < {{second_date}} and dayofmonth({{second_date}}) < dayofmonth({{first_date}}) then 1\n when {{first_date}} > {{second_date}} and dayofmonth({{second_date}}) > dayofmonth({{first_date}}) then -1\n else 0 end\n\n {%- elif datepart == 'quarter' -%}\n\n case when {{first_date}} < {{second_date}}\n then floor(months_between(date({{second_date}}), date({{first_date}}))/3)\n else ceil(months_between(date({{second_date}}), date({{first_date}}))/3)\n end\n\n -- did we cross a quarter boundary?\n + case\n when {{first_date}} < {{second_date}} and (\n (dayofyear({{second_date}}) - (quarter({{second_date}}) * 365/4))\n < (dayofyear({{first_date}}) - (quarter({{first_date}}) * 365/4))\n ) then 1\n when {{first_date}} > {{second_date}} and (\n (dayofyear({{second_date}}) - (quarter({{second_date}}) * 365/4))\n > (dayofyear({{first_date}}) - (quarter({{first_date}}) * 365/4))\n ) then -1\n else 0 end\n\n {%- elif datepart == 'year' -%}\n\n year({{second_date}}) - year({{first_date}})\n\n {%- elif datepart in ('hour', 'minute', 'second', 'millisecond', 'microsecond') -%}\n\n {%- set divisor -%}\n {%- if datepart == 'hour' -%} 3600\n {%- elif datepart == 'minute' -%} 60\n {%- elif datepart == 'second' -%} 1\n {%- elif datepart == 'millisecond' -%} (1/1000)\n {%- elif datepart == 'microsecond' -%} (1/1000000)\n {%- endif -%}\n {%- endset -%}\n\n case when {{first_date}} < {{second_date}}\n then ceil((\n {# make sure the timestamps are real, otherwise raise an error asap #}\n {{ assert_not_null('to_unix_timestamp', assert_not_null('to_timestamp', second_date)) }}\n - {{ assert_not_null('to_unix_timestamp', assert_not_null('to_timestamp', first_date)) }}\n ) / {{divisor}})\n else floor((\n {{ assert_not_null('to_unix_timestamp', assert_not_null('to_timestamp', second_date)) }}\n - {{ assert_not_null('to_unix_timestamp', assert_not_null('to_timestamp', first_date)) }}\n ) / {{divisor}})\n end\n\n {% if datepart == 'millisecond' %}\n + cast(date_format({{second_date}}, 'SSS') as int)\n - cast(date_format({{first_date}}, 'SSS') as int)\n {% endif %}\n\n {% if datepart == 'microsecond' %}\n {% set capture_str = '[0-9]{4}-[0-9]{2}-[0-9]{2}.[0-9]{2}:[0-9]{2}:[0-9]{2}.([0-9]{6})' %}\n -- Spark doesn't really support microseconds, so this is a massive hack!\n -- It will only work if the timestamp-string is of the format\n -- 'yyyy-MM-dd-HH mm.ss.SSSSSS'\n + cast(regexp_extract({{second_date}}, '{{capture_str}}', 1) as int)\n - cast(regexp_extract({{first_date}}, '{{capture_str}}', 1) as int)\n {% endif %}\n\n {%- else -%}\n\n {{ exceptions.raise_compiler_error(\"macro datediff not implemented for datepart ~ '\" ~ datepart ~ \"' ~ on Spark\") }}\n\n {%- endif -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.assert_not_null"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "first_date", "type": null, "description": ""}, {"name": "second_date", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}], "created_at": 1785250505.1604197, "supported_languages": null}, "macro.dbt_spark.spark__escape_single_quotes": {"name": "spark__escape_single_quotes", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\escape_single_quotes.sql", "original_file_path": "macros\\utils\\escape_single_quotes.sql", "unique_id": "macro.dbt_spark.spark__escape_single_quotes", "macro_sql": "{% macro spark__escape_single_quotes(expression) -%}\n{{ expression | replace(\"'\",\"\\\\'\") }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expression", "type": null, "description": ""}], "created_at": 1785250505.1604197, "supported_languages": null}, "macro.dbt_spark.spark__listagg": {"name": "spark__listagg", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\listagg.sql", "original_file_path": "macros\\utils\\listagg.sql", "unique_id": "macro.dbt_spark.spark__listagg", "macro_sql": "{% macro spark__listagg(measure, delimiter_text, order_by_clause, limit_num) -%}\n\n {% if order_by_clause %}\n {{ exceptions.warn(\"order_by_clause is not supported for listagg on Spark/Databricks\") }}\n {% endif %}\n\n {% set collect_list %} collect_list({{ measure }}) {% endset %}\n\n {% set limited %} slice({{ collect_list }}, 1, {{ limit_num }}) {% endset %}\n\n {% set collected = limited if limit_num else collect_list %}\n\n {% set final %} array_join({{ collected }}, {{ delimiter_text }}) {% endset %}\n\n {% do return(final) %}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "measure", "type": null, "description": ""}, {"name": "delimiter_text", "type": null, "description": ""}, {"name": "order_by_clause", "type": null, "description": ""}, {"name": "limit_num", "type": null, "description": ""}], "created_at": 1785250505.1624177, "supported_languages": null}, "macro.dbt_spark.spark__safe_cast": {"name": "spark__safe_cast", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\safe_cast.sql", "original_file_path": "macros\\utils\\safe_cast.sql", "unique_id": "macro.dbt_spark.spark__safe_cast", "macro_sql": "{% macro spark__safe_cast(field, type) %}\n{%- set field_clean = field.strip('\"').strip(\"'\") if (cast_from_string_unsupported_for(type) and field is string) else field -%}\ncast({{field_clean}} as {{type}})\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.cast_from_string_unsupported_for"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}, {"name": "type", "type": null, "description": ""}], "created_at": 1785250505.1634243, "supported_languages": null}, "macro.dbt_spark.cast_from_string_unsupported_for": {"name": "cast_from_string_unsupported_for", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\safe_cast.sql", "original_file_path": "macros\\utils\\safe_cast.sql", "unique_id": "macro.dbt_spark.cast_from_string_unsupported_for", "macro_sql": "{% macro cast_from_string_unsupported_for(type) %}\n {{ return(type.lower().startswith('struct') or type.lower().startswith('array') or type.lower().startswith('map')) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "type", "type": null, "description": ""}], "created_at": 1785250505.1634243, "supported_languages": null}, "macro.dbt_spark.spark__split_part": {"name": "spark__split_part", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\split_part.sql", "original_file_path": "macros\\utils\\split_part.sql", "unique_id": "macro.dbt_spark.spark__split_part", "macro_sql": "{% macro spark__split_part(string_text, delimiter_text, part_number) %}\n\n {% set delimiter_expr %}\n\n -- escape if starts with a special character\n case when regexp_extract({{ delimiter_text }}, '([^A-Za-z0-9])(.*)', 1) != '_'\n then concat('\\\\', {{ delimiter_text }})\n else {{ delimiter_text }} end\n\n {% endset %}\n\n {% if part_number >= 0 %}\n\n {% set split_part_expr %}\n\n split(\n {{ string_text }},\n {{ delimiter_expr }}\n )[({{ part_number - 1 if part_number > 0 else part_number }})]\n\n {% endset %}\n\n {% else %}\n\n {% set split_part_expr %}\n\n split(\n {{ string_text }},\n {{ delimiter_expr }}\n )[(\n length({{ string_text }})\n - length(\n replace({{ string_text }}, {{ delimiter_text }}, '')\n ) + 1 + {{ part_number }}\n )]\n\n {% endset %}\n\n {% endif %}\n\n {{ return(split_part_expr) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "string_text", "type": null, "description": ""}, {"name": "delimiter_text", "type": null, "description": ""}, {"name": "part_number", "type": null, "description": ""}], "created_at": 1785250505.1654227, "supported_languages": null}, "macro.dbt_spark.spark__current_timestamp": {"name": "spark__current_timestamp", "resource_type": "macro", "package_name": "dbt_spark", "path": "macros\\utils\\timestamps.sql", "original_file_path": "macros\\utils\\timestamps.sql", "unique_id": "macro.dbt_spark.spark__current_timestamp", "macro_sql": "{% macro spark__current_timestamp() -%}\n current_timestamp()\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.1654227, "supported_languages": null}, "macro.dbt.copy_grants": {"name": "copy_grants", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.copy_grants", "macro_sql": "{% macro copy_grants() %}\n {{ return(adapter.dispatch('copy_grants', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__copy_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.1674154, "supported_languages": null}, "macro.dbt.default__copy_grants": {"name": "default__copy_grants", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.default__copy_grants", "macro_sql": "{% macro default__copy_grants() %}\n {{ return(True) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.16842, "supported_languages": null}, "macro.dbt.support_multiple_grantees_per_dcl_statement": {"name": "support_multiple_grantees_per_dcl_statement", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.support_multiple_grantees_per_dcl_statement", "macro_sql": "{% macro support_multiple_grantees_per_dcl_statement() %}\n {{ return(adapter.dispatch('support_multiple_grantees_per_dcl_statement', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__support_multiple_grantees_per_dcl_statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.16842, "supported_languages": null}, "macro.dbt.default__support_multiple_grantees_per_dcl_statement": {"name": "default__support_multiple_grantees_per_dcl_statement", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.default__support_multiple_grantees_per_dcl_statement", "macro_sql": "\n\n{%- macro default__support_multiple_grantees_per_dcl_statement() -%}\n {{ return(True) }}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.16842, "supported_languages": null}, "macro.dbt.should_revoke": {"name": "should_revoke", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.should_revoke", "macro_sql": "{% macro should_revoke(existing_relation, full_refresh_mode=True) %}\n\n {% if not existing_relation %}\n {#-- The table doesn't already exist, so no grants to copy over --#}\n {{ return(False) }}\n {% elif full_refresh_mode %}\n {#-- The object is being REPLACED -- whether grants are copied over depends on the value of user config --#}\n {{ return(copy_grants()) }}\n {% else %}\n {#-- The table is being merged/upserted/inserted -- grants will be carried over --#}\n {{ return(True) }}\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.copy_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "full_refresh_mode", "type": null, "description": ""}], "created_at": 1785250505.1694221, "supported_languages": null}, "macro.dbt.get_show_grant_sql": {"name": "get_show_grant_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.get_show_grant_sql", "macro_sql": "{% macro get_show_grant_sql(relation) %}\n {{ return(adapter.dispatch(\"get_show_grant_sql\", \"dbt\")(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_show_grant_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.1694221, "supported_languages": null}, "macro.dbt.default__get_show_grant_sql": {"name": "default__get_show_grant_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.default__get_show_grant_sql", "macro_sql": "{% macro default__get_show_grant_sql(relation) %}\n show grants on {{ relation.render() }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.1704185, "supported_languages": null}, "macro.dbt.get_grant_sql": {"name": "get_grant_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.get_grant_sql", "macro_sql": "{% macro get_grant_sql(relation, privilege, grantees) %}\n {{ return(adapter.dispatch('get_grant_sql', 'dbt')(relation, privilege, grantees)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__get_grant_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "privilege", "type": null, "description": ""}, {"name": "grantees", "type": null, "description": ""}], "created_at": 1785250505.1704185, "supported_languages": null}, "macro.dbt.default__get_grant_sql": {"name": "default__get_grant_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.default__get_grant_sql", "macro_sql": "\n\n{%- macro default__get_grant_sql(relation, privilege, grantees) -%}\n grant {{ privilege }} on {{ relation.render() }} to {{ grantees | join(', ') }}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "privilege", "type": null, "description": ""}, {"name": "grantees", "type": null, "description": ""}], "created_at": 1785250505.171423, "supported_languages": null}, "macro.dbt.get_revoke_sql": {"name": "get_revoke_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.get_revoke_sql", "macro_sql": "{% macro get_revoke_sql(relation, privilege, grantees) %}\n {{ return(adapter.dispatch('get_revoke_sql', 'dbt')(relation, privilege, grantees)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__get_revoke_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "privilege", "type": null, "description": ""}, {"name": "grantees", "type": null, "description": ""}], "created_at": 1785250505.171423, "supported_languages": null}, "macro.dbt.default__get_revoke_sql": {"name": "default__get_revoke_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.default__get_revoke_sql", "macro_sql": "\n\n{%- macro default__get_revoke_sql(relation, privilege, grantees) -%}\n {%- set quoted_grantees = [] -%}\n {%- for grantee in grantees -%}\n {%- do quoted_grantees.append(adapter.quote(grantee)) -%}\n {%- endfor -%}\n revoke {{ privilege }} on {{ relation.render() }} from {{ quoted_grantees | join(', ') }}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "privilege", "type": null, "description": ""}, {"name": "grantees", "type": null, "description": ""}], "created_at": 1785250505.1724226, "supported_languages": null}, "macro.dbt.get_dcl_statement_list": {"name": "get_dcl_statement_list", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.get_dcl_statement_list", "macro_sql": "{% macro get_dcl_statement_list(relation, grant_config, get_dcl_macro) %}\n {{ return(adapter.dispatch('get_dcl_statement_list', 'dbt')(relation, grant_config, get_dcl_macro)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_dcl_statement_list"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "grant_config", "type": null, "description": ""}, {"name": "get_dcl_macro", "type": null, "description": ""}], "created_at": 1785250505.1724226, "supported_languages": null}, "macro.dbt.default__get_dcl_statement_list": {"name": "default__get_dcl_statement_list", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.default__get_dcl_statement_list", "macro_sql": "\n\n{%- macro default__get_dcl_statement_list(relation, grant_config, get_dcl_macro) -%}\n {#\n -- Unpack grant_config into specific privileges and the set of users who need them granted/revoked.\n -- Depending on whether this database supports multiple grantees per statement, pass in the list of\n -- all grantees per privilege, or (if not) template one statement per privilege-grantee pair.\n -- `get_dcl_macro` will be either `get_grant_sql` or `get_revoke_sql`\n #}\n {%- set dcl_statements = [] -%}\n {%- for privilege, grantees in grant_config.items() %}\n {%- if support_multiple_grantees_per_dcl_statement() and grantees -%}\n {%- set dcl = get_dcl_macro(relation, privilege, grantees) -%}\n {%- do dcl_statements.append(dcl) -%}\n {%- else -%}\n {%- for grantee in grantees -%}\n {% set dcl = get_dcl_macro(relation, privilege, [grantee]) %}\n {%- do dcl_statements.append(dcl) -%}\n {% endfor -%}\n {%- endif -%}\n {%- endfor -%}\n {{ return(dcl_statements) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.support_multiple_grantees_per_dcl_statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "grant_config", "type": null, "description": ""}, {"name": "get_dcl_macro", "type": null, "description": ""}], "created_at": 1785250505.1744168, "supported_languages": null}, "macro.dbt.call_dcl_statements": {"name": "call_dcl_statements", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.call_dcl_statements", "macro_sql": "{% macro call_dcl_statements(dcl_statement_list) %}\n {{ return(adapter.dispatch(\"call_dcl_statements\", \"dbt\")(dcl_statement_list)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__call_dcl_statements"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "dcl_statement_list", "type": null, "description": ""}], "created_at": 1785250505.1744168, "supported_languages": null}, "macro.dbt.default__call_dcl_statements": {"name": "default__call_dcl_statements", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.default__call_dcl_statements", "macro_sql": "{% macro default__call_dcl_statements(dcl_statement_list) %}\n {#\n -- By default, supply all grant + revoke statements in a single semicolon-separated block,\n -- so that they're all processed together.\n\n -- Some databases do not support this. Those adapters will need to override this macro\n -- to run each statement individually.\n #}\n {% call statement('grants') %}\n {% for dcl_statement in dcl_statement_list %}\n {{ dcl_statement }};\n {% endfor %}\n {% endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "dcl_statement_list", "type": null, "description": ""}], "created_at": 1785250505.175425, "supported_languages": null}, "macro.dbt.apply_grants": {"name": "apply_grants", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.apply_grants", "macro_sql": "{% macro apply_grants(relation, grant_config, should_revoke) %}\n {{ return(adapter.dispatch(\"apply_grants\", \"dbt\")(relation, grant_config, should_revoke)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__apply_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "grant_config", "type": null, "description": ""}, {"name": "should_revoke", "type": null, "description": ""}], "created_at": 1785250505.1764185, "supported_languages": null}, "macro.dbt.default__apply_grants": {"name": "default__apply_grants", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\apply_grants.sql", "original_file_path": "macros\\adapters\\apply_grants.sql", "unique_id": "macro.dbt.default__apply_grants", "macro_sql": "{% macro default__apply_grants(relation, grant_config, should_revoke=True) %}\n {#-- If grant_config is {} or None, this is a no-op --#}\n {% if grant_config %}\n {% if should_revoke %}\n {#-- We think previous grants may have carried over --#}\n {#-- Show current grants and calculate diffs --#}\n {% set current_grants_table = run_query(get_show_grant_sql(relation)) %}\n {% set current_grants_dict = adapter.standardize_grants_dict(current_grants_table) %}\n {% set needs_granting = diff_of_two_dicts(grant_config, current_grants_dict) %}\n {% set needs_revoking = diff_of_two_dicts(current_grants_dict, grant_config) %}\n {% if not (needs_granting or needs_revoking) %}\n {{ log('On ' ~ relation.render() ~': All grants are in place, no revocation or granting needed.')}}\n {% endif %}\n {% else %}\n {#-- We don't think there's any chance of previous grants having carried over. --#}\n {#-- Jump straight to granting what the user has configured. --#}\n {% set needs_revoking = {} %}\n {% set needs_granting = grant_config %}\n {% endif %}\n {% if needs_granting or needs_revoking %}\n {% set revoke_statement_list = get_dcl_statement_list(relation, needs_revoking, get_revoke_sql) %}\n {% set grant_statement_list = get_dcl_statement_list(relation, needs_granting, get_grant_sql) %}\n {% set dcl_statement_list = revoke_statement_list + grant_statement_list %}\n {% if dcl_statement_list %}\n {{ call_dcl_statements(dcl_statement_list) }}\n {% endif %}\n {% endif %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query", "macro.dbt.get_show_grant_sql", "macro.dbt.get_dcl_statement_list", "macro.dbt.call_dcl_statements"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "grant_config", "type": null, "description": ""}, {"name": "should_revoke", "type": null, "description": ""}], "created_at": 1785250505.1784153, "supported_languages": null}, "macro.dbt.get_columns_in_relation": {"name": "get_columns_in_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.get_columns_in_relation", "macro_sql": "{% macro get_columns_in_relation(relation) -%}\n {{ return(adapter.dispatch('get_columns_in_relation', 'dbt')(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__get_columns_in_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.1804328, "supported_languages": null}, "macro.dbt.default__get_columns_in_relation": {"name": "default__get_columns_in_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.default__get_columns_in_relation", "macro_sql": "{% macro default__get_columns_in_relation(relation) -%}\n {{ exceptions.raise_not_implemented(\n 'get_columns_in_relation macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.1804328, "supported_languages": null}, "macro.dbt.sql_convert_columns_in_relation": {"name": "sql_convert_columns_in_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.sql_convert_columns_in_relation", "macro_sql": "{% macro sql_convert_columns_in_relation(table) -%}\n {% set columns = [] %}\n {% for row in table %}\n {% do columns.append(api.Column(*row)) %}\n {% endfor %}\n {{ return(columns) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "table", "type": null, "description": ""}], "created_at": 1785250505.1814442, "supported_languages": null}, "macro.dbt.get_list_of_column_names": {"name": "get_list_of_column_names", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.get_list_of_column_names", "macro_sql": "\n\n{%- macro get_list_of_column_names(columns) -%}\n {% set col_names = [] %}\n {% for col in columns %}\n {% do col_names.append(col.name) %}\n {% endfor %}\n {{ return(col_names) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "columns", "type": null, "description": ""}], "created_at": 1785250505.1824384, "supported_languages": null}, "macro.dbt.get_empty_subquery_sql": {"name": "get_empty_subquery_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.get_empty_subquery_sql", "macro_sql": "{% macro get_empty_subquery_sql(select_sql, select_sql_header=none) -%}\n {{ return(adapter.dispatch('get_empty_subquery_sql', 'dbt')(select_sql, select_sql_header)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_empty_subquery_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "select_sql", "type": null, "description": ""}, {"name": "select_sql_header", "type": null, "description": ""}], "created_at": 1785250505.1824384, "supported_languages": null}, "macro.dbt.default__get_empty_subquery_sql": {"name": "default__get_empty_subquery_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.default__get_empty_subquery_sql", "macro_sql": "{% macro default__get_empty_subquery_sql(select_sql, select_sql_header=none) %}\n {%- if select_sql_header is not none -%}\n {{ select_sql_header }}\n {%- endif -%}\n select * from (\n {{ select_sql }}\n ) as __dbt_sbq\n where false\n limit 0\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "select_sql", "type": null, "description": ""}, {"name": "select_sql_header", "type": null, "description": ""}], "created_at": 1785250505.1834452, "supported_languages": null}, "macro.dbt.get_empty_schema_sql": {"name": "get_empty_schema_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.get_empty_schema_sql", "macro_sql": "{% macro get_empty_schema_sql(columns) -%}\n {{ return(adapter.dispatch('get_empty_schema_sql', 'dbt')(columns)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_empty_schema_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "columns", "type": null, "description": ""}], "created_at": 1785250505.1834452, "supported_languages": null}, "macro.dbt.default__get_empty_schema_sql": {"name": "default__get_empty_schema_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.default__get_empty_schema_sql", "macro_sql": "{% macro default__get_empty_schema_sql(columns) %}\n {%- set col_err = [] -%}\n {%- set col_naked_numeric = [] -%}\n select\n {% for i in columns %}\n {%- set col = columns[i] -%}\n {%- if col['data_type'] is not defined -%}\n {%- do col_err.append(col['name']) -%}\n {#-- If this column's type is just 'numeric' then it is missing precision/scale, raise a warning --#}\n {%- elif col['data_type'].strip().lower() in ('numeric', 'decimal', 'number') -%}\n {%- do col_naked_numeric.append(col['name']) -%}\n {%- endif -%}\n {% set col_name = adapter.quote(col['name']) if col.get('quote') else col['name'] %}\n {{ cast('null', col['data_type']) }} as {{ col_name }}{{ \", \" if not loop.last }}\n {%- endfor -%}\n {%- if (col_err | length) > 0 -%}\n {{ exceptions.column_type_missing(column_names=col_err) }}\n {%- elif (col_naked_numeric | length) > 0 -%}\n {{ exceptions.warn(\"Detected columns with numeric type and unspecified precision/scale, this can lead to unintended rounding: \" ~ col_naked_numeric ~ \"`\") }}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.cast"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "columns", "type": null, "description": ""}], "created_at": 1785250505.185442, "supported_languages": null}, "macro.dbt.get_column_schema_from_query": {"name": "get_column_schema_from_query", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.get_column_schema_from_query", "macro_sql": "{% macro get_column_schema_from_query(select_sql, select_sql_header=none) -%}\n {% set columns = [] %}\n {# -- Using an 'empty subquery' here to get the same schema as the given select_sql statement, without necessitating a data scan.#}\n {% set sql = get_empty_subquery_sql(select_sql, select_sql_header) %}\n {% set column_schema = adapter.get_column_schema_from_query(sql) %}\n {{ return(column_schema) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_empty_subquery_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "select_sql", "type": null, "description": ""}, {"name": "select_sql_header", "type": null, "description": ""}], "created_at": 1785250505.1864388, "supported_languages": null}, "macro.dbt.get_columns_in_query": {"name": "get_columns_in_query", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.get_columns_in_query", "macro_sql": "{% macro get_columns_in_query(select_sql) -%}\n {{ return(adapter.dispatch('get_columns_in_query', 'dbt')(select_sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_columns_in_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "select_sql", "type": null, "description": ""}], "created_at": 1785250505.1874394, "supported_languages": null}, "macro.dbt.default__get_columns_in_query": {"name": "default__get_columns_in_query", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.default__get_columns_in_query", "macro_sql": "{% macro default__get_columns_in_query(select_sql) %}\n {% call statement('get_columns_in_query', fetch_result=True, auto_begin=False) -%}\n {{ get_empty_subquery_sql(select_sql) }}\n {% endcall %}\n {{ return(load_result('get_columns_in_query').table.columns | map(attribute='name') | list) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.get_empty_subquery_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "select_sql", "type": null, "description": ""}], "created_at": 1785250505.1874394, "supported_languages": null}, "macro.dbt.alter_column_type": {"name": "alter_column_type", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.alter_column_type", "macro_sql": "{% macro alter_column_type(relation, column_name, new_column_type) -%}\n {{ return(adapter.dispatch('alter_column_type', 'dbt')(relation, column_name, new_column_type)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__alter_column_type"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "new_column_type", "type": null, "description": ""}], "created_at": 1785250505.1884367, "supported_languages": null}, "macro.dbt.default__alter_column_type": {"name": "default__alter_column_type", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.default__alter_column_type", "macro_sql": "{% macro default__alter_column_type(relation, column_name, new_column_type) -%}\n {#\n 1. Create a new column (w/ temp name and correct type)\n 2. Copy data over to it\n 3. Drop the existing column (cascade!)\n 4. Rename the new column to existing column\n #}\n {%- set tmp_column = column_name + \"__dbt_alter\" -%}\n\n {% call statement('alter_column_type') %}\n alter table {{ relation.render() }} add column {{ adapter.quote(tmp_column) }} {{ new_column_type }};\n update {{ relation.render() }} set {{ adapter.quote(tmp_column) }} = {{ adapter.quote(column_name) }};\n alter table {{ relation.render() }} drop column {{ adapter.quote(column_name) }} cascade;\n alter table {{ relation.render() }} rename column {{ adapter.quote(tmp_column) }} to {{ adapter.quote(column_name) }}\n {% endcall %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "new_column_type", "type": null, "description": ""}], "created_at": 1785250505.1894417, "supported_languages": null}, "macro.dbt.alter_relation_add_remove_columns": {"name": "alter_relation_add_remove_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.alter_relation_add_remove_columns", "macro_sql": "{% macro alter_relation_add_remove_columns(relation, add_columns = none, remove_columns = none) -%}\n {{ return(adapter.dispatch('alter_relation_add_remove_columns', 'dbt')(relation, add_columns, remove_columns)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__alter_relation_add_remove_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "add_columns", "type": null, "description": ""}, {"name": "remove_columns", "type": null, "description": ""}], "created_at": 1785250505.19044, "supported_languages": null}, "macro.dbt.default__alter_relation_add_remove_columns": {"name": "default__alter_relation_add_remove_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\columns.sql", "original_file_path": "macros\\adapters\\columns.sql", "unique_id": "macro.dbt.default__alter_relation_add_remove_columns", "macro_sql": "{% macro default__alter_relation_add_remove_columns(relation, add_columns, remove_columns) %}\n\n {% if add_columns is none %}\n {% set add_columns = [] %}\n {% endif %}\n {% if remove_columns is none %}\n {% set remove_columns = [] %}\n {% endif %}\n\n {% set sql -%}\n\n alter {{ relation.type }} {{ relation.render() }}\n\n {% for column in add_columns %}\n add column {{ column.quoted }} {{ column.expanded_data_type }}{{ ',' if not loop.last }}\n {% endfor %}{{ ',' if add_columns and remove_columns }}\n\n {% for column in remove_columns %}\n drop column {{ column.quoted }}{{ ',' if not loop.last }}\n {% endfor %}\n\n {%- endset -%}\n\n {% do run_query(sql) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "add_columns", "type": null, "description": ""}, {"name": "remove_columns", "type": null, "description": ""}], "created_at": 1785250505.1914427, "supported_languages": null}, "macro.dbt.collect_freshness": {"name": "collect_freshness", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\freshness.sql", "original_file_path": "macros\\adapters\\freshness.sql", "unique_id": "macro.dbt.collect_freshness", "macro_sql": "{% macro collect_freshness(source, loaded_at_field, filter) %}\n {{ return(adapter.dispatch('collect_freshness', 'dbt')(source, loaded_at_field, filter))}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__collect_freshness"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source", "type": null, "description": ""}, {"name": "loaded_at_field", "type": null, "description": ""}, {"name": "filter", "type": null, "description": ""}], "created_at": 1785250505.1924388, "supported_languages": null}, "macro.dbt.default__collect_freshness": {"name": "default__collect_freshness", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\freshness.sql", "original_file_path": "macros\\adapters\\freshness.sql", "unique_id": "macro.dbt.default__collect_freshness", "macro_sql": "{% macro default__collect_freshness(source, loaded_at_field, filter) %}\n {% call statement('collect_freshness', fetch_result=True, auto_begin=False) -%}\n select\n max({{ loaded_at_field }}) as max_loaded_at,\n {{ current_timestamp() }} as snapshotted_at\n from {{ source }}\n {% if filter %}\n where {{ filter }}\n {% endif %}\n {% endcall %}\n {{ return(load_result('collect_freshness')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source", "type": null, "description": ""}, {"name": "loaded_at_field", "type": null, "description": ""}, {"name": "filter", "type": null, "description": ""}], "created_at": 1785250505.193442, "supported_languages": null}, "macro.dbt.collect_freshness_custom_sql": {"name": "collect_freshness_custom_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\freshness.sql", "original_file_path": "macros\\adapters\\freshness.sql", "unique_id": "macro.dbt.collect_freshness_custom_sql", "macro_sql": "{% macro collect_freshness_custom_sql(source, loaded_at_query) %}\n {{ return(adapter.dispatch('collect_freshness_custom_sql', 'dbt')(source, loaded_at_query))}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__collect_freshness_custom_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source", "type": null, "description": ""}, {"name": "loaded_at_query", "type": null, "description": ""}], "created_at": 1785250505.193442, "supported_languages": null}, "macro.dbt.default__collect_freshness_custom_sql": {"name": "default__collect_freshness_custom_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\freshness.sql", "original_file_path": "macros\\adapters\\freshness.sql", "unique_id": "macro.dbt.default__collect_freshness_custom_sql", "macro_sql": "{% macro default__collect_freshness_custom_sql(source, loaded_at_query) %}\n {% call statement('collect_freshness_custom_sql', fetch_result=True, auto_begin=False) -%}\n with source_query as (\n {{ loaded_at_query }}\n )\n select\n (select * from source_query) as max_loaded_at,\n {{ current_timestamp() }} as snapshotted_at\n {% endcall %}\n {{ return(load_result('collect_freshness_custom_sql')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source", "type": null, "description": ""}, {"name": "loaded_at_query", "type": null, "description": ""}], "created_at": 1785250505.1949697, "supported_languages": null}, "macro.dbt.get_create_index_sql": {"name": "get_create_index_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\indexes.sql", "original_file_path": "macros\\adapters\\indexes.sql", "unique_id": "macro.dbt.get_create_index_sql", "macro_sql": "{% macro get_create_index_sql(relation, index_dict) -%}\n {{ return(adapter.dispatch('get_create_index_sql', 'dbt')(relation, index_dict)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_create_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "index_dict", "type": null, "description": ""}], "created_at": 1785250505.1959891, "supported_languages": null}, "macro.dbt.default__get_create_index_sql": {"name": "default__get_create_index_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\indexes.sql", "original_file_path": "macros\\adapters\\indexes.sql", "unique_id": "macro.dbt.default__get_create_index_sql", "macro_sql": "{% macro default__get_create_index_sql(relation, index_dict) -%}\n {% do return(None) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "index_dict", "type": null, "description": ""}], "created_at": 1785250505.1959891, "supported_languages": null}, "macro.dbt.create_indexes": {"name": "create_indexes", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\indexes.sql", "original_file_path": "macros\\adapters\\indexes.sql", "unique_id": "macro.dbt.create_indexes", "macro_sql": "{% macro create_indexes(relation) -%}\n {{ adapter.dispatch('create_indexes', 'dbt')(relation) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__create_indexes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.196993, "supported_languages": null}, "macro.dbt.default__create_indexes": {"name": "default__create_indexes", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\indexes.sql", "original_file_path": "macros\\adapters\\indexes.sql", "unique_id": "macro.dbt.default__create_indexes", "macro_sql": "{% macro default__create_indexes(relation) -%}\n {%- set _indexes = config.get('indexes', default=[]) -%}\n\n {% for _index_dict in _indexes %}\n {% set create_index_sql = get_create_index_sql(relation, _index_dict) %}\n {% if create_index_sql %}\n {% do run_query(create_index_sql) %}\n {% endif %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_create_index_sql", "macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.1979895, "supported_languages": null}, "macro.dbt.get_drop_index_sql": {"name": "get_drop_index_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\indexes.sql", "original_file_path": "macros\\adapters\\indexes.sql", "unique_id": "macro.dbt.get_drop_index_sql", "macro_sql": "{% macro get_drop_index_sql(relation, index_name) -%}\n {{ adapter.dispatch('get_drop_index_sql', 'dbt')(relation, index_name) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_drop_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "index_name", "type": null, "description": ""}], "created_at": 1785250505.1979895, "supported_languages": null}, "macro.dbt.default__get_drop_index_sql": {"name": "default__get_drop_index_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\indexes.sql", "original_file_path": "macros\\adapters\\indexes.sql", "unique_id": "macro.dbt.default__get_drop_index_sql", "macro_sql": "{% macro default__get_drop_index_sql(relation, index_name) -%}\n {{ exceptions.raise_compiler_error(\"`get_drop_index_sql has not been implemented for this adapter.\") }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "index_name", "type": null, "description": ""}], "created_at": 1785250505.1979895, "supported_languages": null}, "macro.dbt.get_show_indexes_sql": {"name": "get_show_indexes_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\indexes.sql", "original_file_path": "macros\\adapters\\indexes.sql", "unique_id": "macro.dbt.get_show_indexes_sql", "macro_sql": "{% macro get_show_indexes_sql(relation) -%}\n {{ adapter.dispatch('get_show_indexes_sql', 'dbt')(relation) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_show_indexes_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.1989942, "supported_languages": null}, "macro.dbt.default__get_show_indexes_sql": {"name": "default__get_show_indexes_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\indexes.sql", "original_file_path": "macros\\adapters\\indexes.sql", "unique_id": "macro.dbt.default__get_show_indexes_sql", "macro_sql": "{% macro default__get_show_indexes_sql(relation) -%}\n {{ exceptions.raise_compiler_error(\"`get_show_indexes_sql has not been implemented for this adapter.\") }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.1989942, "supported_languages": null}, "macro.dbt.get_catalog_relations": {"name": "get_catalog_relations", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.get_catalog_relations", "macro_sql": "{% macro get_catalog_relations(information_schema, relations) -%}\n {{ return(adapter.dispatch('get_catalog_relations', 'dbt')(information_schema, relations)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_catalog_relations"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "information_schema", "type": null, "description": ""}, {"name": "relations", "type": null, "description": ""}], "created_at": 1785250505.200989, "supported_languages": null}, "macro.dbt.default__get_catalog_relations": {"name": "default__get_catalog_relations", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.default__get_catalog_relations", "macro_sql": "{% macro default__get_catalog_relations(information_schema, relations) -%}\n {% set typename = adapter.type() %}\n {% set msg -%}\n get_catalog_relations not implemented for {{ typename }}\n {%- endset %}\n\n {{ exceptions.raise_compiler_error(msg) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "information_schema", "type": null, "description": ""}, {"name": "relations", "type": null, "description": ""}], "created_at": 1785250505.200989, "supported_languages": null}, "macro.dbt.get_catalog": {"name": "get_catalog", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.get_catalog", "macro_sql": "{% macro get_catalog(information_schema, schemas) -%}\n {{ return(adapter.dispatch('get_catalog', 'dbt')(information_schema, schemas)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_catalog"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "information_schema", "type": null, "description": ""}, {"name": "schemas", "type": null, "description": ""}], "created_at": 1785250505.2019897, "supported_languages": null}, "macro.dbt.default__get_catalog": {"name": "default__get_catalog", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.default__get_catalog", "macro_sql": "{% macro default__get_catalog(information_schema, schemas) -%}\n\n {% set typename = adapter.type() %}\n {% set msg -%}\n get_catalog not implemented for {{ typename }}\n {%- endset %}\n\n {{ exceptions.raise_compiler_error(msg) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "information_schema", "type": null, "description": ""}, {"name": "schemas", "type": null, "description": ""}], "created_at": 1785250505.2019897, "supported_languages": null}, "macro.dbt.information_schema_name": {"name": "information_schema_name", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.information_schema_name", "macro_sql": "{% macro information_schema_name(database) %}\n {{ return(adapter.dispatch('information_schema_name', 'dbt')(database)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__information_schema_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "database", "type": null, "description": ""}], "created_at": 1785250505.202994, "supported_languages": null}, "macro.dbt.default__information_schema_name": {"name": "default__information_schema_name", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.default__information_schema_name", "macro_sql": "{% macro default__information_schema_name(database) -%}\n {%- if database -%}\n {{ database }}.INFORMATION_SCHEMA\n {%- else -%}\n INFORMATION_SCHEMA\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "database", "type": null, "description": ""}], "created_at": 1785250505.202994, "supported_languages": null}, "macro.dbt.list_schemas": {"name": "list_schemas", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.list_schemas", "macro_sql": "{% macro list_schemas(database) -%}\n {{ return(adapter.dispatch('list_schemas', 'dbt')(database)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__list_schemas"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "database", "type": null, "description": ""}], "created_at": 1785250505.202994, "supported_languages": null}, "macro.dbt.default__list_schemas": {"name": "default__list_schemas", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.default__list_schemas", "macro_sql": "{% macro default__list_schemas(database) -%}\n {% set sql %}\n select distinct schema_name\n from {{ information_schema_name(database) }}.SCHEMATA\n where catalog_name ilike '{{ database }}'\n {% endset %}\n {{ return(run_query(sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.information_schema_name", "macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "database", "type": null, "description": ""}], "created_at": 1785250505.2039883, "supported_languages": null}, "macro.dbt.check_schema_exists": {"name": "check_schema_exists", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.check_schema_exists", "macro_sql": "{% macro check_schema_exists(information_schema, schema) -%}\n {{ return(adapter.dispatch('check_schema_exists', 'dbt')(information_schema, schema)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__check_schema_exists"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "information_schema", "type": null, "description": ""}, {"name": "schema", "type": null, "description": ""}], "created_at": 1785250505.2039883, "supported_languages": null}, "macro.dbt.default__check_schema_exists": {"name": "default__check_schema_exists", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.default__check_schema_exists", "macro_sql": "{% macro default__check_schema_exists(information_schema, schema) -%}\n {% set sql -%}\n select count(*)\n from {{ information_schema.replace(information_schema_view='SCHEMATA') }}\n where catalog_name='{{ information_schema.database }}'\n and schema_name='{{ schema }}'\n {%- endset %}\n {{ return(run_query(sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.replace", "macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "information_schema", "type": null, "description": ""}, {"name": "schema", "type": null, "description": ""}], "created_at": 1785250505.2049942, "supported_languages": null}, "macro.dbt.list_relations_without_caching": {"name": "list_relations_without_caching", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.list_relations_without_caching", "macro_sql": "{% macro list_relations_without_caching(schema_relation) %}\n {{ return(adapter.dispatch('list_relations_without_caching', 'dbt')(schema_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__list_relations_without_caching"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_relation", "type": null, "description": ""}], "created_at": 1785250505.2049942, "supported_languages": null}, "macro.dbt.default__list_relations_without_caching": {"name": "default__list_relations_without_caching", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.default__list_relations_without_caching", "macro_sql": "{% macro default__list_relations_without_caching(schema_relation) %}\n {{ exceptions.raise_not_implemented(\n 'list_relations_without_caching macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_relation", "type": null, "description": ""}], "created_at": 1785250505.2059884, "supported_languages": null}, "macro.dbt.list_function_relations_without_caching": {"name": "list_function_relations_without_caching", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.list_function_relations_without_caching", "macro_sql": "{% macro list_function_relations_without_caching(schema_relation) %}\n {{ return(adapter.dispatch('list_function_relations_without_caching', 'dbt')(schema_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__list_function_relations_without_caching"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_relation", "type": null, "description": ""}], "created_at": 1785250505.2069952, "supported_languages": null}, "macro.dbt.default__list_function_relations_without_caching": {"name": "default__list_function_relations_without_caching", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.default__list_function_relations_without_caching", "macro_sql": "{% macro default__list_function_relations_without_caching(schema_relation) %}\n {{ exceptions.raise_not_implemented(\n 'list_function_relations_without_caching macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_relation", "type": null, "description": ""}], "created_at": 1785250505.2069952, "supported_languages": null}, "macro.dbt.get_catalog_for_single_relation": {"name": "get_catalog_for_single_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.get_catalog_for_single_relation", "macro_sql": "{% macro get_catalog_for_single_relation(relation) %}\n {{ return(adapter.dispatch('get_catalog_for_single_relation', 'dbt')(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_catalog_for_single_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.2069952, "supported_languages": null}, "macro.dbt.default__get_catalog_for_single_relation": {"name": "default__get_catalog_for_single_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.default__get_catalog_for_single_relation", "macro_sql": "{% macro default__get_catalog_for_single_relation(relation) %}\n {{ exceptions.raise_not_implemented(\n 'get_catalog_for_single_relation macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.2079895, "supported_languages": null}, "macro.dbt.get_relations": {"name": "get_relations", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.get_relations", "macro_sql": "{% macro get_relations() %}\n {{ return(adapter.dispatch('get_relations', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_relations"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2079895, "supported_languages": null}, "macro.dbt.default__get_relations": {"name": "default__get_relations", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.default__get_relations", "macro_sql": "{% macro default__get_relations() %}\n {{ exceptions.raise_not_implemented(\n 'get_relations macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2079895, "supported_languages": null}, "macro.dbt.get_relation_last_modified": {"name": "get_relation_last_modified", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.get_relation_last_modified", "macro_sql": "{% macro get_relation_last_modified(information_schema, relations) %}\n {{ return(adapter.dispatch('get_relation_last_modified', 'dbt')(information_schema, relations)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_relation_last_modified"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "information_schema", "type": null, "description": ""}, {"name": "relations", "type": null, "description": ""}], "created_at": 1785250505.2089953, "supported_languages": null}, "macro.dbt.default__get_relation_last_modified": {"name": "default__get_relation_last_modified", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\metadata.sql", "original_file_path": "macros\\adapters\\metadata.sql", "unique_id": "macro.dbt.default__get_relation_last_modified", "macro_sql": "{% macro default__get_relation_last_modified(information_schema, relations) %}\n {{ exceptions.raise_not_implemented(\n 'get_relation_last_modified macro not implemented for adapter ' + adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "information_schema", "type": null, "description": ""}, {"name": "relations", "type": null, "description": ""}], "created_at": 1785250505.2089953, "supported_languages": null}, "macro.dbt.alter_column_comment": {"name": "alter_column_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\persist_docs.sql", "original_file_path": "macros\\adapters\\persist_docs.sql", "unique_id": "macro.dbt.alter_column_comment", "macro_sql": "{% macro alter_column_comment(relation, column_dict) -%}\n {{ return(adapter.dispatch('alter_column_comment', 'dbt')(relation, column_dict)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__alter_column_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column_dict", "type": null, "description": ""}], "created_at": 1785250505.2109916, "supported_languages": null}, "macro.dbt.default__alter_column_comment": {"name": "default__alter_column_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\persist_docs.sql", "original_file_path": "macros\\adapters\\persist_docs.sql", "unique_id": "macro.dbt.default__alter_column_comment", "macro_sql": "{% macro default__alter_column_comment(relation, column_dict) -%}\n {{ exceptions.raise_not_implemented(\n 'alter_column_comment macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column_dict", "type": null, "description": ""}], "created_at": 1785250505.2109916, "supported_languages": null}, "macro.dbt.alter_relation_comment": {"name": "alter_relation_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\persist_docs.sql", "original_file_path": "macros\\adapters\\persist_docs.sql", "unique_id": "macro.dbt.alter_relation_comment", "macro_sql": "{% macro alter_relation_comment(relation, relation_comment) -%}\n {{ return(adapter.dispatch('alter_relation_comment', 'dbt')(relation, relation_comment)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__alter_relation_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "relation_comment", "type": null, "description": ""}], "created_at": 1785250505.2109916, "supported_languages": null}, "macro.dbt.default__alter_relation_comment": {"name": "default__alter_relation_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\persist_docs.sql", "original_file_path": "macros\\adapters\\persist_docs.sql", "unique_id": "macro.dbt.default__alter_relation_comment", "macro_sql": "{% macro default__alter_relation_comment(relation, relation_comment) -%}\n {{ exceptions.raise_not_implemented(\n 'alter_relation_comment macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "relation_comment", "type": null, "description": ""}], "created_at": 1785250505.211988, "supported_languages": null}, "macro.dbt.persist_docs": {"name": "persist_docs", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\persist_docs.sql", "original_file_path": "macros\\adapters\\persist_docs.sql", "unique_id": "macro.dbt.persist_docs", "macro_sql": "{% macro persist_docs(relation, model, for_relation=true, for_columns=true) -%}\n {{ return(adapter.dispatch('persist_docs', 'dbt')(relation, model, for_relation, for_columns)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "model", "type": null, "description": ""}, {"name": "for_relation", "type": null, "description": ""}, {"name": "for_columns", "type": null, "description": ""}], "created_at": 1785250505.211988, "supported_languages": null}, "macro.dbt.validate_doc_columns": {"name": "validate_doc_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\persist_docs.sql", "original_file_path": "macros\\adapters\\persist_docs.sql", "unique_id": "macro.dbt.validate_doc_columns", "macro_sql": "{% macro validate_doc_columns(relation, column_dict, existing_column_names) %}\n {% set existing_lower = existing_column_names | map(\"lower\") | list %}\n {% set missing = [] %}\n {% set filtered = {} %}\n {% for col_name in column_dict %}\n {% set is_quoted = column_dict[col_name]['quote'] %}\n {% if is_quoted %}\n {% set present = col_name in existing_column_names %}\n {% else %}\n {% set present = col_name | lower in existing_lower %}\n {% endif %}\n {% if present %}\n {% do filtered.update({col_name: column_dict[col_name]}) %}\n {% else %}\n {% do missing.append(col_name) %}\n {% endif %}\n {% endfor %}\n {% if missing | length > 0 %}\n {{ exceptions.warn(\"In relation \" ~ relation.render() ~ \": The following columns are specified in the schema but are not present in the database: \" ~ missing | join(\", \")) }}\n {% endif %}\n {{ return(filtered) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "column_dict", "type": null, "description": ""}, {"name": "existing_column_names", "type": null, "description": ""}], "created_at": 1785250505.2139876, "supported_languages": null}, "macro.dbt.default__persist_docs": {"name": "default__persist_docs", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\persist_docs.sql", "original_file_path": "macros\\adapters\\persist_docs.sql", "unique_id": "macro.dbt.default__persist_docs", "macro_sql": "{% macro default__persist_docs(relation, model, for_relation, for_columns) -%}\n {% if for_relation and config.persist_relation_docs() and model.description %}\n {% do run_query(alter_relation_comment(relation, model.description)) %}\n {% endif %}\n\n {% if for_columns and config.persist_column_docs() and model.columns %}\n {% set existing_columns = adapter.get_columns_in_relation(relation) | map(attribute=\"name\") | list %}\n {% set filtered_columns = validate_doc_columns(relation, model.columns, existing_columns) %}\n {% set alter_comment_sql = alter_column_comment(relation, filtered_columns) %}\n {% if alter_comment_sql and alter_comment_sql | trim | length > 0 %}\n {% do run_query(alter_comment_sql) %}\n {% endif %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query", "macro.dbt.alter_relation_comment", "macro.dbt.validate_doc_columns", "macro.dbt.alter_column_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "model", "type": null, "description": ""}, {"name": "for_relation", "type": null, "description": ""}, {"name": "for_columns", "type": null, "description": ""}], "created_at": 1785250505.2159877, "supported_languages": null}, "macro.dbt.make_intermediate_relation": {"name": "make_intermediate_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt.make_intermediate_relation", "macro_sql": "{% macro make_intermediate_relation(base_relation, suffix='__dbt_tmp') %}\n {{ return(adapter.dispatch('make_intermediate_relation', 'dbt')(base_relation, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__make_intermediate_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "base_relation", "type": null, "description": ""}, {"name": "suffix", "type": null, "description": ""}], "created_at": 1785250505.2179875, "supported_languages": null}, "macro.dbt.default__make_intermediate_relation": {"name": "default__make_intermediate_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt.default__make_intermediate_relation", "macro_sql": "{% macro default__make_intermediate_relation(base_relation, suffix) %}\n {{ return(default__make_temp_relation(base_relation, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__make_temp_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "base_relation", "type": null, "description": ""}, {"name": "suffix", "type": null, "description": ""}], "created_at": 1785250505.2179875, "supported_languages": null}, "macro.dbt.make_temp_relation": {"name": "make_temp_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt.make_temp_relation", "macro_sql": "{% macro make_temp_relation(base_relation, suffix='__dbt_tmp') %}\n {#-- This ensures microbatch batches get unique temp relations to avoid clobbering --#}\n {% if suffix == '__dbt_tmp' and model.batch %}\n {% set suffix = suffix ~ '_' ~ model.batch.id %}\n {% endif %}\n\n {{ return(adapter.dispatch('make_temp_relation', 'dbt')(base_relation, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__make_temp_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "base_relation", "type": null, "description": ""}, {"name": "suffix", "type": null, "description": ""}], "created_at": 1785250505.218998, "supported_languages": null}, "macro.dbt.default__make_temp_relation": {"name": "default__make_temp_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt.default__make_temp_relation", "macro_sql": "{% macro default__make_temp_relation(base_relation, suffix) %}\n {%- set temp_identifier = base_relation.identifier ~ suffix -%}\n {%- set temp_relation = base_relation.incorporate(\n path={\"identifier\": temp_identifier}) -%}\n\n {{ return(temp_relation) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "base_relation", "type": null, "description": ""}, {"name": "suffix", "type": null, "description": ""}], "created_at": 1785250505.218998, "supported_languages": null}, "macro.dbt.make_backup_relation": {"name": "make_backup_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt.make_backup_relation", "macro_sql": "{% macro make_backup_relation(base_relation, backup_relation_type, suffix='__dbt_backup') %}\n {{ return(adapter.dispatch('make_backup_relation', 'dbt')(base_relation, backup_relation_type, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__make_backup_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "base_relation", "type": null, "description": ""}, {"name": "backup_relation_type", "type": null, "description": ""}, {"name": "suffix", "type": null, "description": ""}], "created_at": 1785250505.2199895, "supported_languages": null}, "macro.dbt.default__make_backup_relation": {"name": "default__make_backup_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt.default__make_backup_relation", "macro_sql": "{% macro default__make_backup_relation(base_relation, backup_relation_type, suffix) %}\n {%- set backup_identifier = base_relation.identifier ~ suffix -%}\n {%- set backup_relation = base_relation.incorporate(\n path={\"identifier\": backup_identifier},\n type=backup_relation_type\n ) -%}\n {{ return(backup_relation) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "base_relation", "type": null, "description": ""}, {"name": "backup_relation_type", "type": null, "description": ""}, {"name": "suffix", "type": null, "description": ""}], "created_at": 1785250505.2209947, "supported_languages": null}, "macro.dbt.truncate_relation": {"name": "truncate_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt.truncate_relation", "macro_sql": "{% macro truncate_relation(relation) -%}\n {{ return(adapter.dispatch('truncate_relation', 'dbt')(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__truncate_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.2209947, "supported_languages": null}, "macro.dbt.default__truncate_relation": {"name": "default__truncate_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt.default__truncate_relation", "macro_sql": "{% macro default__truncate_relation(relation) -%}\n {% call statement('truncate_relation') -%}\n truncate table {{ relation.render() }}\n {%- endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.2219892, "supported_languages": null}, "macro.dbt.get_or_create_relation": {"name": "get_or_create_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt.get_or_create_relation", "macro_sql": "{% macro get_or_create_relation(database, schema, identifier, type) -%}\n {{ return(adapter.dispatch('get_or_create_relation', 'dbt')(database, schema, identifier, type)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_or_create_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "database", "type": null, "description": ""}, {"name": "schema", "type": null, "description": ""}, {"name": "identifier", "type": null, "description": ""}, {"name": "type", "type": null, "description": ""}], "created_at": 1785250505.2219892, "supported_languages": null}, "macro.dbt.default__get_or_create_relation": {"name": "default__get_or_create_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt.default__get_or_create_relation", "macro_sql": "{% macro default__get_or_create_relation(database, schema, identifier, type) %}\n {%- set target_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier) %}\n\n {% if target_relation %}\n {% do return([true, target_relation]) %}\n {% endif %}\n\n {%- set new_relation = api.Relation.create(\n database=database,\n schema=schema,\n identifier=identifier,\n type=type\n ) -%}\n {% do return([false, new_relation]) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "database", "type": null, "description": ""}, {"name": "schema", "type": null, "description": ""}, {"name": "identifier", "type": null, "description": ""}, {"name": "type", "type": null, "description": ""}], "created_at": 1785250505.2229958, "supported_languages": null}, "macro.dbt.load_cached_relation": {"name": "load_cached_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt.load_cached_relation", "macro_sql": "{% macro load_cached_relation(relation) %}\n {% do return(adapter.get_relation(\n database=relation.database,\n schema=relation.schema,\n identifier=relation.identifier\n )) -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.2239907, "supported_languages": null}, "macro.dbt.load_relation": {"name": "load_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\relation.sql", "original_file_path": "macros\\adapters\\relation.sql", "unique_id": "macro.dbt.load_relation", "macro_sql": "{% macro load_relation(relation) %}\n {{ return(load_cached_relation(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.2239907, "supported_languages": null}, "macro.dbt.is_core_v2": {"name": "is_core_v2", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\runtime.sql", "original_file_path": "macros\\adapters\\runtime.sql", "unique_id": "macro.dbt.is_core_v2", "macro_sql": "{% macro is_core_v2() -%}\n {%- set major_version = (dbt_version.split('.') | first) | int -%}\n {{ return(major_version == 2) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2249959, "supported_languages": null}, "macro.dbt.create_schema": {"name": "create_schema", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\schema.sql", "original_file_path": "macros\\adapters\\schema.sql", "unique_id": "macro.dbt.create_schema", "macro_sql": "{% macro create_schema(relation) -%}\n {{ adapter.dispatch('create_schema', 'dbt')(relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__create_schema"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.2249959, "supported_languages": null}, "macro.dbt.default__create_schema": {"name": "default__create_schema", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\schema.sql", "original_file_path": "macros\\adapters\\schema.sql", "unique_id": "macro.dbt.default__create_schema", "macro_sql": "{% macro default__create_schema(relation) -%}\n {%- call statement('create_schema') -%}\n create schema if not exists {{ relation.without_identifier() }}\n {% endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.2259932, "supported_languages": null}, "macro.dbt.drop_schema": {"name": "drop_schema", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\schema.sql", "original_file_path": "macros\\adapters\\schema.sql", "unique_id": "macro.dbt.drop_schema", "macro_sql": "{% macro drop_schema(relation) -%}\n {{ adapter.dispatch('drop_schema', 'dbt')(relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__drop_schema"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.2259932, "supported_languages": null}, "macro.dbt.default__drop_schema": {"name": "default__drop_schema", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\schema.sql", "original_file_path": "macros\\adapters\\schema.sql", "unique_id": "macro.dbt.default__drop_schema", "macro_sql": "{% macro default__drop_schema(relation) -%}\n {%- call statement('drop_schema') -%}\n drop schema if exists {{ relation.without_identifier() }} cascade\n {% endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.2269964, "supported_languages": null}, "macro.dbt.get_show_sql": {"name": "get_show_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\show.sql", "original_file_path": "macros\\adapters\\show.sql", "unique_id": "macro.dbt.get_show_sql", "macro_sql": "{% macro get_show_sql(compiled_code, sql_header, limit) -%}\n {%- if sql_header is not none -%}\n {{ sql_header }}\n {%- endif %}\n {{ get_limit_subquery_sql(compiled_code, limit) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_limit_subquery_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "compiled_code", "type": null, "description": ""}, {"name": "sql_header", "type": null, "description": ""}, {"name": "limit", "type": null, "description": ""}], "created_at": 1785250505.2269964, "supported_languages": null}, "macro.dbt.get_limit_subquery_sql": {"name": "get_limit_subquery_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\show.sql", "original_file_path": "macros\\adapters\\show.sql", "unique_id": "macro.dbt.get_limit_subquery_sql", "macro_sql": "\n{%- macro get_limit_subquery_sql(sql, limit) -%}\n {{ adapter.dispatch('get_limit_sql', 'dbt')(sql, limit) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__get_limit_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}, {"name": "limit", "type": null, "description": ""}], "created_at": 1785250505.2279987, "supported_languages": null}, "macro.dbt.default__get_limit_sql": {"name": "default__get_limit_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\show.sql", "original_file_path": "macros\\adapters\\show.sql", "unique_id": "macro.dbt.default__get_limit_sql", "macro_sql": "{% macro default__get_limit_sql(sql, limit) %}\n {{ sql }}\n {% if limit is not none %}\n limit {{ limit }}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}, {"name": "limit", "type": null, "description": ""}], "created_at": 1785250505.2279987, "supported_languages": null}, "macro.dbt.current_timestamp": {"name": "current_timestamp", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\timestamps.sql", "original_file_path": "macros\\adapters\\timestamps.sql", "unique_id": "macro.dbt.current_timestamp", "macro_sql": "{%- macro current_timestamp() -%}\n {{ adapter.dispatch('current_timestamp', 'dbt')() }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_spark.spark__current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2289927, "supported_languages": null}, "macro.dbt.default__current_timestamp": {"name": "default__current_timestamp", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\timestamps.sql", "original_file_path": "macros\\adapters\\timestamps.sql", "unique_id": "macro.dbt.default__current_timestamp", "macro_sql": "{% macro default__current_timestamp() -%}\n {{ exceptions.raise_not_implemented(\n 'current_timestamp macro not implemented for adapter ' + adapter.type()) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2289927, "supported_languages": null}, "macro.dbt.snapshot_get_time": {"name": "snapshot_get_time", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\timestamps.sql", "original_file_path": "macros\\adapters\\timestamps.sql", "unique_id": "macro.dbt.snapshot_get_time", "macro_sql": "\n\n{%- macro snapshot_get_time() -%}\n {{ adapter.dispatch('snapshot_get_time', 'dbt')() }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__snapshot_get_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2299972, "supported_languages": null}, "macro.dbt.default__snapshot_get_time": {"name": "default__snapshot_get_time", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\timestamps.sql", "original_file_path": "macros\\adapters\\timestamps.sql", "unique_id": "macro.dbt.default__snapshot_get_time", "macro_sql": "{% macro default__snapshot_get_time() %}\n {{ current_timestamp() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2299972, "supported_languages": null}, "macro.dbt.get_snapshot_get_time_data_type": {"name": "get_snapshot_get_time_data_type", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\timestamps.sql", "original_file_path": "macros\\adapters\\timestamps.sql", "unique_id": "macro.dbt.get_snapshot_get_time_data_type", "macro_sql": "{% macro get_snapshot_get_time_data_type() %}\n {% set snapshot_time = adapter.dispatch('snapshot_get_time', 'dbt')() %}\n {% set time_data_type_sql = 'select ' ~ snapshot_time ~ ' as dbt_snapshot_time' %}\n {% set snapshot_time_column_schema = get_column_schema_from_query(time_data_type_sql) %}\n {% set time_data_type = snapshot_time_column_schema[0].dtype %}\n {{ return(time_data_type or none) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.snapshot_get_time", "macro.dbt.default__snapshot_get_time", "macro.dbt.get_column_schema_from_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.23099, "supported_languages": null}, "macro.dbt.current_timestamp_backcompat": {"name": "current_timestamp_backcompat", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\timestamps.sql", "original_file_path": "macros\\adapters\\timestamps.sql", "unique_id": "macro.dbt.current_timestamp_backcompat", "macro_sql": "{% macro current_timestamp_backcompat() %}\n {{ return(adapter.dispatch('current_timestamp_backcompat', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__current_timestamp_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.23099, "supported_languages": null}, "macro.dbt.default__current_timestamp_backcompat": {"name": "default__current_timestamp_backcompat", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\timestamps.sql", "original_file_path": "macros\\adapters\\timestamps.sql", "unique_id": "macro.dbt.default__current_timestamp_backcompat", "macro_sql": "{% macro default__current_timestamp_backcompat() %}\n current_timestamp::timestamp\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.23099, "supported_languages": null}, "macro.dbt.current_timestamp_in_utc_backcompat": {"name": "current_timestamp_in_utc_backcompat", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\timestamps.sql", "original_file_path": "macros\\adapters\\timestamps.sql", "unique_id": "macro.dbt.current_timestamp_in_utc_backcompat", "macro_sql": "{% macro current_timestamp_in_utc_backcompat() %}\n {{ return(adapter.dispatch('current_timestamp_in_utc_backcompat', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__current_timestamp_in_utc_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2319968, "supported_languages": null}, "macro.dbt.default__current_timestamp_in_utc_backcompat": {"name": "default__current_timestamp_in_utc_backcompat", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\timestamps.sql", "original_file_path": "macros\\adapters\\timestamps.sql", "unique_id": "macro.dbt.default__current_timestamp_in_utc_backcompat", "macro_sql": "{% macro default__current_timestamp_in_utc_backcompat() %}\n {{ return(adapter.dispatch('current_timestamp_backcompat', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.current_timestamp_backcompat", "macro.dbt.default__current_timestamp_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2319968, "supported_languages": null}, "macro.dbt.validate_sql": {"name": "validate_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\validate_sql.sql", "original_file_path": "macros\\adapters\\validate_sql.sql", "unique_id": "macro.dbt.validate_sql", "macro_sql": "{% macro validate_sql(sql) -%}\n {{ return(adapter.dispatch('validate_sql', 'dbt')(sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__validate_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.2329907, "supported_languages": null}, "macro.dbt.default__validate_sql": {"name": "default__validate_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\adapters\\validate_sql.sql", "original_file_path": "macros\\adapters\\validate_sql.sql", "unique_id": "macro.dbt.default__validate_sql", "macro_sql": "{% macro default__validate_sql(sql) -%}\n {% call statement('validate_sql') -%}\n explain {{ sql }}\n {% endcall %}\n {{ return(load_result('validate_sql')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.2329907, "supported_languages": null}, "macro.dbt.convert_datetime": {"name": "convert_datetime", "resource_type": "macro", "package_name": "dbt", "path": "macros\\etc\\datetime.sql", "original_file_path": "macros\\etc\\datetime.sql", "unique_id": "macro.dbt.convert_datetime", "macro_sql": "{% macro convert_datetime(date_str, date_fmt) %}\n\n {% set error_msg -%}\n The provided partition date '{{ date_str }}' does not match the expected format '{{ date_fmt }}'\n {%- endset %}\n\n {% set res = try_or_compiler_error(error_msg, modules.datetime.datetime.strptime, date_str.strip(), date_fmt) %}\n {{ return(res) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "date_str", "type": null, "description": ""}, {"name": "date_fmt", "type": null, "description": ""}], "created_at": 1785250505.2349892, "supported_languages": null}, "macro.dbt.dates_in_range": {"name": "dates_in_range", "resource_type": "macro", "package_name": "dbt", "path": "macros\\etc\\datetime.sql", "original_file_path": "macros\\etc\\datetime.sql", "unique_id": "macro.dbt.dates_in_range", "macro_sql": "{% macro dates_in_range(start_date_str, end_date_str=none, in_fmt=\"%Y%m%d\", out_fmt=\"%Y%m%d\") %}\n {% set end_date_str = start_date_str if end_date_str is none else end_date_str %}\n\n {% set start_date = convert_datetime(start_date_str, in_fmt) %}\n {% set end_date = convert_datetime(end_date_str, in_fmt) %}\n\n {% set day_count = (end_date - start_date).days %}\n {% if day_count < 0 %}\n {% set msg -%}\n Partition start date is after the end date ({{ start_date }}, {{ end_date }})\n {%- endset %}\n\n {{ exceptions.raise_compiler_error(msg, model) }}\n {% endif %}\n\n {% set date_list = [] %}\n {% for i in range(0, day_count + 1) %}\n {% set the_date = (modules.datetime.timedelta(days=i) + start_date) %}\n {% if not out_fmt %}\n {% set _ = date_list.append(the_date) %}\n {% else %}\n {% set _ = date_list.append(the_date.strftime(out_fmt)) %}\n {% endif %}\n {% endfor %}\n\n {{ return(date_list) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.convert_datetime"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "start_date_str", "type": null, "description": ""}, {"name": "end_date_str", "type": null, "description": ""}, {"name": "in_fmt", "type": null, "description": ""}, {"name": "out_fmt", "type": null, "description": ""}], "created_at": 1785250505.2369897, "supported_languages": null}, "macro.dbt.partition_range": {"name": "partition_range", "resource_type": "macro", "package_name": "dbt", "path": "macros\\etc\\datetime.sql", "original_file_path": "macros\\etc\\datetime.sql", "unique_id": "macro.dbt.partition_range", "macro_sql": "{% macro partition_range(raw_partition_date, date_fmt='%Y%m%d') %}\n {% set partition_range = (raw_partition_date | string).split(\",\") %}\n\n {% if (partition_range | length) == 1 %}\n {% set start_date = partition_range[0] %}\n {% set end_date = none %}\n {% elif (partition_range | length) == 2 %}\n {% set start_date = partition_range[0] %}\n {% set end_date = partition_range[1] %}\n {% else %}\n {{ exceptions.raise_compiler_error(\"Invalid partition time. Expected format: {Start Date}[,{End Date}]. Got: \" ~ raw_partition_date) }}\n {% endif %}\n\n {{ return(dates_in_range(start_date, end_date, in_fmt=date_fmt)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.dates_in_range"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "raw_partition_date", "type": null, "description": ""}, {"name": "date_fmt", "type": null, "description": ""}], "created_at": 1785250505.2389874, "supported_languages": null}, "macro.dbt.py_current_timestring": {"name": "py_current_timestring", "resource_type": "macro", "package_name": "dbt", "path": "macros\\etc\\datetime.sql", "original_file_path": "macros\\etc\\datetime.sql", "unique_id": "macro.dbt.py_current_timestring", "macro_sql": "{% macro py_current_timestring() %}\n {% set dt = modules.datetime.datetime.now() %}\n {% do return(dt.strftime(\"%Y%m%d%H%M%S%f\")) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.239997, "supported_languages": null}, "macro.dbt.statement": {"name": "statement", "resource_type": "macro", "package_name": "dbt", "path": "macros\\etc\\statement.sql", "original_file_path": "macros\\etc\\statement.sql", "unique_id": "macro.dbt.statement", "macro_sql": "\n{%- macro statement(name=None, fetch_result=False, auto_begin=True, language='sql') -%}\n {%- if execute: -%}\n {%- set compiled_code = caller() -%}\n\n {%- if name == 'main' -%}\n {{ log('Writing runtime {} for node \"{}\"'.format(language, model['unique_id'])) }}\n {{ write(compiled_code) }}\n {%- endif -%}\n {%- if language == 'sql'-%}\n {%- set res, table = adapter.execute(compiled_code, auto_begin=auto_begin, fetch=fetch_result) -%}\n {%- elif language == 'python' -%}\n {%- set res = submit_python_job(model, compiled_code) -%}\n {#-- TODO: What should table be for python models? --#}\n {%- set table = None -%}\n {%- else -%}\n {% do exceptions.raise_compiler_error(\"statement macro didn't get supported language\") %}\n {%- endif -%}\n\n {%- if name is not none -%}\n {{ store_result(name, response=res, agate_table=table) }}\n {%- endif -%}\n\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "name", "type": null, "description": ""}, {"name": "fetch_result", "type": null, "description": ""}, {"name": "auto_begin", "type": null, "description": ""}, {"name": "language", "type": null, "description": ""}], "created_at": 1785250505.2419944, "supported_languages": null}, "macro.dbt.noop_statement": {"name": "noop_statement", "resource_type": "macro", "package_name": "dbt", "path": "macros\\etc\\statement.sql", "original_file_path": "macros\\etc\\statement.sql", "unique_id": "macro.dbt.noop_statement", "macro_sql": "{% macro noop_statement(name=None, message=None, code=None, rows_affected=None, res=None) -%}\n {%- set sql = caller() -%}\n\n {%- if name == 'main' -%}\n {{ log('Writing runtime SQL for node \"{}\"'.format(model['unique_id'])) }}\n {{ write(sql) }}\n {%- endif -%}\n\n {%- if name is not none -%}\n {{ store_raw_result(name, message=message, code=code, rows_affected=rows_affected, agate_table=res) }}\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "name", "type": null, "description": ""}, {"name": "message", "type": null, "description": ""}, {"name": "code", "type": null, "description": ""}, {"name": "rows_affected", "type": null, "description": ""}, {"name": "res", "type": null, "description": ""}], "created_at": 1785250505.2429922, "supported_languages": null}, "macro.dbt.run_query": {"name": "run_query", "resource_type": "macro", "package_name": "dbt", "path": "macros\\etc\\statement.sql", "original_file_path": "macros\\etc\\statement.sql", "unique_id": "macro.dbt.run_query", "macro_sql": "{% macro run_query(sql) %}\n {% call statement(\"run_query_statement\", fetch_result=true, auto_begin=false) %}\n {{ sql }}\n {% endcall %}\n\n {% do return(load_result(\"run_query_statement\").table) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.243997, "supported_languages": null}, "macro.dbt.default__test_accepted_values": {"name": "default__test_accepted_values", "resource_type": "macro", "package_name": "dbt", "path": "macros\\generic_test_sql\\accepted_values.sql", "original_file_path": "macros\\generic_test_sql\\accepted_values.sql", "unique_id": "macro.dbt.default__test_accepted_values", "macro_sql": "{% macro default__test_accepted_values(model, column_name, values, quote=True) %}\n\nwith all_values as (\n\n select\n {{ column_name }} as value_field,\n count(*) as n_records\n\n from {{ model }}\n group by {{ column_name }}\n\n)\n\nselect *\nfrom all_values\nwhere value_field not in (\n {% for value in values -%}\n {% if quote -%}\n '{{ value }}'\n {%- else -%}\n {{ value }}\n {%- endif -%}\n {%- if not loop.last -%},{%- endif %}\n {%- endfor %}\n)\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "values", "type": null, "description": ""}, {"name": "quote", "type": null, "description": ""}], "created_at": 1785250505.244991, "supported_languages": null}, "macro.dbt.default__test_not_null": {"name": "default__test_not_null", "resource_type": "macro", "package_name": "dbt", "path": "macros\\generic_test_sql\\not_null.sql", "original_file_path": "macros\\generic_test_sql\\not_null.sql", "unique_id": "macro.dbt.default__test_not_null", "macro_sql": "{% macro default__test_not_null(model, column_name) %}\n\n{% set column_list = '*' if should_store_failures() else column_name %}\n\nselect {{ column_list }}\nfrom {{ model }}\nwhere {{ column_name }} is null\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.should_store_failures"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}], "created_at": 1785250505.2459962, "supported_languages": null}, "macro.dbt.default__test_relationships": {"name": "default__test_relationships", "resource_type": "macro", "package_name": "dbt", "path": "macros\\generic_test_sql\\relationships.sql", "original_file_path": "macros\\generic_test_sql\\relationships.sql", "unique_id": "macro.dbt.default__test_relationships", "macro_sql": "{% macro default__test_relationships(model, column_name, to, field) %}\n\nwith child as (\n select {{ column_name }} as from_field\n from {{ model }}\n where {{ column_name }} is not null\n),\n\nparent as (\n select {{ field }} as to_field\n from {{ to }}\n)\n\nselect\n from_field\n\nfrom child\nleft join parent\n on child.from_field = parent.to_field\n\nwhere parent.to_field is null\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "to", "type": null, "description": ""}, {"name": "field", "type": null, "description": ""}], "created_at": 1785250505.246991, "supported_languages": null}, "macro.dbt.default__test_unique": {"name": "default__test_unique", "resource_type": "macro", "package_name": "dbt", "path": "macros\\generic_test_sql\\unique.sql", "original_file_path": "macros\\generic_test_sql\\unique.sql", "unique_id": "macro.dbt.default__test_unique", "macro_sql": "{% macro default__test_unique(model, column_name) %}\n\nselect\n {{ column_name }} as unique_field,\n count(*) as n_records\n\nfrom {{ model }}\nwhere {{ column_name }} is not null\ngroup by {{ column_name }}\nhaving count(*) > 1\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}], "created_at": 1785250505.246991, "supported_languages": null}, "macro.dbt.generate_alias_name": {"name": "generate_alias_name", "resource_type": "macro", "package_name": "dbt", "path": "macros\\get_custom_name\\get_custom_alias.sql", "original_file_path": "macros\\get_custom_name\\get_custom_alias.sql", "unique_id": "macro.dbt.generate_alias_name", "macro_sql": "{% macro generate_alias_name(custom_alias_name=none, node=none) -%}\n {% do return(adapter.dispatch('generate_alias_name', 'dbt')(custom_alias_name, node)) %}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__generate_alias_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "custom_alias_name", "type": null, "description": ""}, {"name": "node", "type": null, "description": ""}], "created_at": 1785250505.2479913, "supported_languages": null}, "macro.dbt.default__generate_alias_name": {"name": "default__generate_alias_name", "resource_type": "macro", "package_name": "dbt", "path": "macros\\get_custom_name\\get_custom_alias.sql", "original_file_path": "macros\\get_custom_name\\get_custom_alias.sql", "unique_id": "macro.dbt.default__generate_alias_name", "macro_sql": "{% macro default__generate_alias_name(custom_alias_name=none, node=none) -%}\n\n {%- if custom_alias_name -%}\n\n {{ custom_alias_name | trim }}\n\n {%- elif node.version -%}\n\n {{ return(node.name ~ \"_v\" ~ (node.version | replace(\".\", \"_\"))) }}\n\n {%- else -%}\n\n {{ node.name }}\n\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "custom_alias_name", "type": null, "description": ""}, {"name": "node", "type": null, "description": ""}], "created_at": 1785250505.2489958, "supported_languages": null}, "macro.dbt.generate_database_name": {"name": "generate_database_name", "resource_type": "macro", "package_name": "dbt", "path": "macros\\get_custom_name\\get_custom_database.sql", "original_file_path": "macros\\get_custom_name\\get_custom_database.sql", "unique_id": "macro.dbt.generate_database_name", "macro_sql": "{% macro generate_database_name(custom_database_name=none, node=none) -%}\n {% do return(adapter.dispatch('generate_database_name', 'dbt')(custom_database_name, node)) %}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__generate_database_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "custom_database_name", "type": null, "description": ""}, {"name": "node", "type": null, "description": ""}], "created_at": 1785250505.2499952, "supported_languages": null}, "macro.dbt.default__generate_database_name": {"name": "default__generate_database_name", "resource_type": "macro", "package_name": "dbt", "path": "macros\\get_custom_name\\get_custom_database.sql", "original_file_path": "macros\\get_custom_name\\get_custom_database.sql", "unique_id": "macro.dbt.default__generate_database_name", "macro_sql": "{% macro default__generate_database_name(custom_database_name=none, node=none) -%}\n {%- set default_database = target.database -%}\n {%- if node is not none and node|attr('database') -%}\n {%- set catalog_relation = adapter.build_catalog_relation(node) -%}\n {%- if catalog_relation and catalog_relation|attr('catalog_database') -%}\n {{ return(catalog_relation.catalog_database) }}\n {%- endif -%}\n {%- endif -%}\n {%- if custom_database_name is none -%}\n\n {{ default_database }}\n\n {%- else -%}\n\n {{ custom_database_name }}\n\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "custom_database_name", "type": null, "description": ""}, {"name": "node", "type": null, "description": ""}], "created_at": 1785250505.2509887, "supported_languages": null}, "macro.dbt.generate_schema_name": {"name": "generate_schema_name", "resource_type": "macro", "package_name": "dbt", "path": "macros\\get_custom_name\\get_custom_schema.sql", "original_file_path": "macros\\get_custom_name\\get_custom_schema.sql", "unique_id": "macro.dbt.generate_schema_name", "macro_sql": "{% macro generate_schema_name(custom_schema_name=none, node=none) -%}\n {{ return(adapter.dispatch('generate_schema_name', 'dbt')(custom_schema_name, node)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__generate_schema_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "custom_schema_name", "type": null, "description": ""}, {"name": "node", "type": null, "description": ""}], "created_at": 1785250505.2519906, "supported_languages": null}, "macro.dbt.default__generate_schema_name": {"name": "default__generate_schema_name", "resource_type": "macro", "package_name": "dbt", "path": "macros\\get_custom_name\\get_custom_schema.sql", "original_file_path": "macros\\get_custom_name\\get_custom_schema.sql", "unique_id": "macro.dbt.default__generate_schema_name", "macro_sql": "{% macro default__generate_schema_name(custom_schema_name, node) -%}\n\n {%- set default_schema = target.schema -%}\n {%- if custom_schema_name is none -%}\n\n {{ default_schema }}\n\n {%- else -%}\n\n {{ default_schema }}_{{ custom_schema_name | trim }}\n\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "custom_schema_name", "type": null, "description": ""}, {"name": "node", "type": null, "description": ""}], "created_at": 1785250505.2519906, "supported_languages": null}, "macro.dbt.generate_schema_name_for_env": {"name": "generate_schema_name_for_env", "resource_type": "macro", "package_name": "dbt", "path": "macros\\get_custom_name\\get_custom_schema.sql", "original_file_path": "macros\\get_custom_name\\get_custom_schema.sql", "unique_id": "macro.dbt.generate_schema_name_for_env", "macro_sql": "{% macro generate_schema_name_for_env(custom_schema_name, node) -%}\n\n {%- set default_schema = target.schema -%}\n {%- if target.name == 'prod' and custom_schema_name is not none -%}\n\n {{ custom_schema_name | trim }}\n\n {%- else -%}\n\n {{ default_schema }}\n\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "custom_schema_name", "type": null, "description": ""}, {"name": "node", "type": null, "description": ""}], "created_at": 1785250505.2529917, "supported_languages": null}, "macro.dbt.generate_latest_version_pointer_alias": {"name": "generate_latest_version_pointer_alias", "resource_type": "macro", "package_name": "dbt", "path": "macros\\get_custom_name\\get_latest_version_pointer_alias.sql", "original_file_path": "macros\\get_custom_name\\get_latest_version_pointer_alias.sql", "unique_id": "macro.dbt.generate_latest_version_pointer_alias", "macro_sql": "{% macro generate_latest_version_pointer_alias(custom_alias_name=none, node=none) -%}\n {% do return(adapter.dispatch('generate_latest_version_pointer_alias', 'dbt')(custom_alias_name, node)) %}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__generate_latest_version_pointer_alias"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "custom_alias_name", "type": null, "description": ""}, {"name": "node", "type": null, "description": ""}], "created_at": 1785250505.2539895, "supported_languages": null}, "macro.dbt.default__generate_latest_version_pointer_alias": {"name": "default__generate_latest_version_pointer_alias", "resource_type": "macro", "package_name": "dbt", "path": "macros\\get_custom_name\\get_latest_version_pointer_alias.sql", "original_file_path": "macros\\get_custom_name\\get_latest_version_pointer_alias.sql", "unique_id": "macro.dbt.default__generate_latest_version_pointer_alias", "macro_sql": "{% macro default__generate_latest_version_pointer_alias(custom_alias_name=none, node=none) -%}\n {%- if custom_alias_name -%}\n {{ custom_alias_name | trim }}\n {%- else -%}\n {{ node.name }}\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "custom_alias_name", "type": null, "description": ""}, {"name": "node", "type": null, "description": ""}], "created_at": 1785250505.2539895, "supported_languages": null}, "macro.dbt.set_sql_header": {"name": "set_sql_header", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\configs.sql", "original_file_path": "macros\\materializations\\configs.sql", "unique_id": "macro.dbt.set_sql_header", "macro_sql": "{% macro set_sql_header(config) -%}\n {{ config.set('sql_header', caller()) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "config", "type": null, "description": ""}], "created_at": 1785250505.2549908, "supported_languages": null}, "macro.dbt.should_full_refresh": {"name": "should_full_refresh", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\configs.sql", "original_file_path": "macros\\materializations\\configs.sql", "unique_id": "macro.dbt.should_full_refresh", "macro_sql": "{% macro should_full_refresh() %}\n {% set config_full_refresh = config.get('full_refresh') %}\n {% if config_full_refresh is none %}\n {% set config_full_refresh = flags.FULL_REFRESH %}\n {% endif %}\n {% do return(config_full_refresh) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2559986, "supported_languages": null}, "macro.dbt.should_store_failures": {"name": "should_store_failures", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\configs.sql", "original_file_path": "macros\\materializations\\configs.sql", "unique_id": "macro.dbt.should_store_failures", "macro_sql": "{% macro should_store_failures() %}\n {% set config_store_failures = config.get('store_failures') %}\n {% if config_store_failures is none %}\n {% set config_store_failures = flags.STORE_FAILURES %}\n {% endif %}\n {% do return(config_store_failures) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2569897, "supported_languages": null}, "macro.dbt.run_hooks": {"name": "run_hooks", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\hooks.sql", "original_file_path": "macros\\materializations\\hooks.sql", "unique_id": "macro.dbt.run_hooks", "macro_sql": "{% macro run_hooks(hooks, inside_transaction=True) %}\n {% for hook in hooks | selectattr('transaction', 'equalto', inside_transaction) %}\n {% if not inside_transaction and loop.first %}\n {% call statement(auto_begin=inside_transaction) %}\n commit;\n {% endcall %}\n {% endif %}\n {% set rendered = render(hook.get('sql')) | trim %}\n {% if (rendered | length) > 0 %}\n {% call statement(auto_begin=inside_transaction) %}\n {{ rendered }}\n {% endcall %}\n {% endif %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "hooks", "type": null, "description": ""}, {"name": "inside_transaction", "type": null, "description": ""}], "created_at": 1785250505.257998, "supported_languages": null}, "macro.dbt.make_hook_config": {"name": "make_hook_config", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\hooks.sql", "original_file_path": "macros\\materializations\\hooks.sql", "unique_id": "macro.dbt.make_hook_config", "macro_sql": "{% macro make_hook_config(sql, inside_transaction) %}\n {{ tojson({\"sql\": sql, \"transaction\": inside_transaction}) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}, {"name": "inside_transaction", "type": null, "description": ""}], "created_at": 1785250505.2589898, "supported_languages": null}, "macro.dbt.before_begin": {"name": "before_begin", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\hooks.sql", "original_file_path": "macros\\materializations\\hooks.sql", "unique_id": "macro.dbt.before_begin", "macro_sql": "{% macro before_begin(sql) %}\n {{ make_hook_config(sql, inside_transaction=False) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.make_hook_config"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.2589898, "supported_languages": null}, "macro.dbt.in_transaction": {"name": "in_transaction", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\hooks.sql", "original_file_path": "macros\\materializations\\hooks.sql", "unique_id": "macro.dbt.in_transaction", "macro_sql": "{% macro in_transaction(sql) %}\n {{ make_hook_config(sql, inside_transaction=True) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.make_hook_config"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.2589898, "supported_languages": null}, "macro.dbt.after_commit": {"name": "after_commit", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\hooks.sql", "original_file_path": "macros\\materializations\\hooks.sql", "unique_id": "macro.dbt.after_commit", "macro_sql": "{% macro after_commit(sql) %}\n {{ make_hook_config(sql, inside_transaction=False) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.make_hook_config"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.2599995, "supported_languages": null}, "macro.dbt.get_aggregate_function_create_replace_signature": {"name": "get_aggregate_function_create_replace_signature", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\aggregate.sql", "original_file_path": "macros\\materializations\\functions\\aggregate.sql", "unique_id": "macro.dbt.get_aggregate_function_create_replace_signature", "macro_sql": "{% macro get_aggregate_function_create_replace_signature(target_relation) %}\n {{ return(adapter.dispatch('get_aggregate_function_create_replace_signature', 'dbt')(target_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_aggregate_function_create_replace_signature"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.260989, "supported_languages": null}, "macro.dbt.default__get_aggregate_function_create_replace_signature": {"name": "default__get_aggregate_function_create_replace_signature", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\aggregate.sql", "original_file_path": "macros\\materializations\\functions\\aggregate.sql", "unique_id": "macro.dbt.default__get_aggregate_function_create_replace_signature", "macro_sql": "{% macro default__get_aggregate_function_create_replace_signature(target_relation) %}\n CREATE OR REPLACE AGGREGATE FUNCTION {{ target_relation.render() }} ({{ get_formatted_aggregate_function_args()}})\n RETURNS {{ model.returns.data_type }}\n {{ get_function_language_specifier() }}\n {{ get_aggregate_function_volatility_specifier() }}\n {% if model.get('language') == 'python' %}\n {{ get_function_python_options() }}\n {% endif %}\n AS\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_formatted_aggregate_function_args", "macro.dbt.get_function_language_specifier", "macro.dbt.get_aggregate_function_volatility_specifier", "macro.dbt.get_function_python_options"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.2619996, "supported_languages": null}, "macro.dbt.get_formatted_aggregate_function_args": {"name": "get_formatted_aggregate_function_args", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\aggregate.sql", "original_file_path": "macros\\materializations\\functions\\aggregate.sql", "unique_id": "macro.dbt.get_formatted_aggregate_function_args", "macro_sql": "{% macro get_formatted_aggregate_function_args() %}\n {{ return(adapter.dispatch('get_formatted_aggregate_function_args', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_formatted_aggregate_function_args"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2619996, "supported_languages": null}, "macro.dbt.default__get_formatted_aggregate_function_args": {"name": "default__get_formatted_aggregate_function_args", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\aggregate.sql", "original_file_path": "macros\\materializations\\functions\\aggregate.sql", "unique_id": "macro.dbt.default__get_formatted_aggregate_function_args", "macro_sql": "{% macro default__get_formatted_aggregate_function_args() %}\n {# conveniently we can reuse the sql scalar function args #}\n {{ formatted_scalar_function_args_sql() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.formatted_scalar_function_args_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2619996, "supported_languages": null}, "macro.dbt.get_function_language_specifier": {"name": "get_function_language_specifier", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\aggregate.sql", "original_file_path": "macros\\materializations\\functions\\aggregate.sql", "unique_id": "macro.dbt.get_function_language_specifier", "macro_sql": "{% macro get_function_language_specifier() %}\n {{ return(adapter.dispatch('get_function_language_specifier', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_function_language_specifier"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2629926, "supported_languages": null}, "macro.dbt.default__get_function_language_specifier": {"name": "default__get_function_language_specifier", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\aggregate.sql", "original_file_path": "macros\\materializations\\functions\\aggregate.sql", "unique_id": "macro.dbt.default__get_function_language_specifier", "macro_sql": "{% macro default__get_function_language_specifier() %}\n {% set language = model.get('language') %}\n {% if language == 'sql' %}\n {# generally you dont need to specify the language for sql functions #}\n {% elif language == 'python' %}\n LANGUAGE PYTHON\n {% elif language == 'javascript' %}\n LANGUAGE js\n {% else %}\n {{ 'LANGUAGE ' ~ language.upper() }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2639909, "supported_languages": null}, "macro.dbt.get_aggregate_function_volatility_specifier": {"name": "get_aggregate_function_volatility_specifier", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\aggregate.sql", "original_file_path": "macros\\materializations\\functions\\aggregate.sql", "unique_id": "macro.dbt.get_aggregate_function_volatility_specifier", "macro_sql": "{% macro get_aggregate_function_volatility_specifier() %}\n {{ return(adapter.dispatch('get_aggregate_function_volatility_specifier', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_aggregate_function_volatility_specifier"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2639909, "supported_languages": null}, "macro.dbt.default__get_aggregate_function_volatility_specifier": {"name": "default__get_aggregate_function_volatility_specifier", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\aggregate.sql", "original_file_path": "macros\\materializations\\functions\\aggregate.sql", "unique_id": "macro.dbt.default__get_aggregate_function_volatility_specifier", "macro_sql": "{% macro default__get_aggregate_function_volatility_specifier() %}\n {{ scalar_function_volatility_sql() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.scalar_function_volatility_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2639909, "supported_languages": null}, "macro.dbt.get_function_python_options": {"name": "get_function_python_options", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\aggregate.sql", "original_file_path": "macros\\materializations\\functions\\aggregate.sql", "unique_id": "macro.dbt.get_function_python_options", "macro_sql": "{% macro get_function_python_options() %}\n {{ return(adapter.dispatch('get_function_python_options', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_function_python_options"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2649941, "supported_languages": null}, "macro.dbt.default__get_function_python_options": {"name": "default__get_function_python_options", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\aggregate.sql", "original_file_path": "macros\\materializations\\functions\\aggregate.sql", "unique_id": "macro.dbt.default__get_function_python_options", "macro_sql": "{% macro default__get_function_python_options() %}\n RUNTIME_VERSION = '{{ model.config.get('runtime_version') }}'\n HANDLER = '{{ model.config.get('entry_point') }}'\n {% set packages = model.config.get('packages', []) %}\n {% if packages %}\n PACKAGES = ('{{ packages | join(\"','\") }}')\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2649941, "supported_languages": null}, "macro.dbt.materialization_function_default": {"name": "materialization_function_default", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\function.sql", "original_file_path": "macros\\materializations\\functions\\function.sql", "unique_id": "macro.dbt.materialization_function_default", "macro_sql": "{% materialization function, default, supported_languages=['sql', 'python', 'javascript'] %}\n {% set existing_relation = load_cached_relation(this) %}\n {% set target_relation = this.incorporate(type=this.Function) %}\n\n {{ run_hooks(pre_hooks) }}\n\n {% set function_config = this.get_function_config(model) %}\n {% set macro_name = this.get_function_macro_name(function_config) %}\n\n {# Doing this aliasing of adapter.dispatch is a hacky way to disable the static analysis of actually calling adapter.dispatch #}\n {# This is necessary because the static analysis breaks being able to dynamically pass a macro_name #}\n {% set _dispatch = adapter.dispatch %}\n\n {% set build_sql = _dispatch(macro_name, 'dbt')(target_relation) %}\n {{ function_execute_build_sql(build_sql, existing_relation, target_relation) }}\n {{ run_hooks(post_hooks) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.run_hooks", "macro.dbt.function_execute_build_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.2669961, "supported_languages": ["sql", "python", "javascript"]}, "macro.dbt.function_execute_build_sql": {"name": "function_execute_build_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\helpers.sql", "original_file_path": "macros\\materializations\\functions\\helpers.sql", "unique_id": "macro.dbt.function_execute_build_sql", "macro_sql": "{% macro function_execute_build_sql(build_sql, existing_relation, target_relation) %}\n {{ return(adapter.dispatch('function_execute_build_sql', 'dbt')(build_sql, existing_relation, target_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__function_execute_build_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "build_sql", "type": null, "description": ""}, {"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.267993, "supported_languages": null}, "macro.dbt.default__function_execute_build_sql": {"name": "default__function_execute_build_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\helpers.sql", "original_file_path": "macros\\materializations\\functions\\helpers.sql", "unique_id": "macro.dbt.default__function_execute_build_sql", "macro_sql": "{% macro default__function_execute_build_sql(build_sql, existing_relation, target_relation) %}\n\n {% set grant_config = config.get('grants') %}\n\n {% call statement(name=\"main\") %}\n {{ build_sql }}\n {% endcall %}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {{ adapter.commit() }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "build_sql", "type": null, "description": ""}, {"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.268998, "supported_languages": null}, "macro.dbt.scalar_function_sql": {"name": "scalar_function_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.scalar_function_sql", "macro_sql": "{% macro scalar_function_sql(target_relation) %}\n {{ return(adapter.dispatch('scalar_function_sql', 'dbt')(target_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__scalar_function_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.2709877, "supported_languages": null}, "macro.dbt.default__scalar_function_sql": {"name": "default__scalar_function_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.default__scalar_function_sql", "macro_sql": "{% macro default__scalar_function_sql(target_relation) %}\n {{ scalar_function_create_replace_signature_sql(target_relation) }}\n {{ scalar_function_body_sql() }};\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.scalar_function_create_replace_signature_sql", "macro.dbt.scalar_function_body_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.2709877, "supported_languages": null}, "macro.dbt.scalar_function_create_replace_signature_sql": {"name": "scalar_function_create_replace_signature_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.scalar_function_create_replace_signature_sql", "macro_sql": "{% macro scalar_function_create_replace_signature_sql(target_relation) %}\n {{ return(adapter.dispatch('scalar_function_create_replace_signature_sql', 'dbt')(target_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__scalar_function_create_replace_signature_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.2719922, "supported_languages": null}, "macro.dbt.default__scalar_function_create_replace_signature_sql": {"name": "default__scalar_function_create_replace_signature_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.default__scalar_function_create_replace_signature_sql", "macro_sql": "{% macro default__scalar_function_create_replace_signature_sql(target_relation) %}\n CREATE OR REPLACE FUNCTION {{ target_relation.render() }} ({{ formatted_scalar_function_args_sql()}})\n RETURNS {{ model.returns.data_type }}\n {{ scalar_function_volatility_sql() }}\n AS\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.formatted_scalar_function_args_sql", "macro.dbt.scalar_function_volatility_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.2719922, "supported_languages": null}, "macro.dbt.formatted_scalar_function_args_sql": {"name": "formatted_scalar_function_args_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.formatted_scalar_function_args_sql", "macro_sql": "{% macro formatted_scalar_function_args_sql() %}\n {{ return(adapter.dispatch('formatted_scalar_function_args_sql', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__formatted_scalar_function_args_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2729893, "supported_languages": null}, "macro.dbt.formatted_scalar_function_args_javascript": {"name": "formatted_scalar_function_args_javascript", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.formatted_scalar_function_args_javascript", "macro_sql": "{% macro formatted_scalar_function_args_javascript() %}\n {{ return(adapter.dispatch('formatted_scalar_function_args_javascript', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__formatted_scalar_function_args_javascript"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2729893, "supported_languages": null}, "macro.dbt.default__formatted_scalar_function_args_sql": {"name": "default__formatted_scalar_function_args_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.default__formatted_scalar_function_args_sql", "macro_sql": "{% macro default__formatted_scalar_function_args_sql() %}\n {% set args = [] %}\n {% for arg in model.arguments -%}\n {%- do args.append(arg.name ~ ' ' ~ arg.data_type) -%}\n {%- endfor %}\n {{ args | join(', ') }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.273995, "supported_languages": null}, "macro.dbt.default__formatted_scalar_function_args_javascript": {"name": "default__formatted_scalar_function_args_javascript", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.default__formatted_scalar_function_args_javascript", "macro_sql": "{% macro default__formatted_scalar_function_args_javascript() %}\n {% set msg = \"formatted_scalar_function_args_javascript not implemented for adapter \" ~ adapter.type() %}\n {% do exceptions.raise_compiler_error(msg) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.273995, "supported_languages": null}, "macro.dbt.scalar_function_body_sql": {"name": "scalar_function_body_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.scalar_function_body_sql", "macro_sql": "{% macro scalar_function_body_sql() %}\n {{ return(adapter.dispatch('scalar_function_body_sql', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__scalar_function_body_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2749958, "supported_languages": null}, "macro.dbt.default__scalar_function_body_sql": {"name": "default__scalar_function_body_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.default__scalar_function_body_sql", "macro_sql": "{% macro default__scalar_function_body_sql() %}\n $$\n {{ model.compiled_code }}\n $$ LANGUAGE SQL\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2749958, "supported_languages": null}, "macro.dbt.scalar_function_volatility_sql": {"name": "scalar_function_volatility_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.scalar_function_volatility_sql", "macro_sql": "{% macro scalar_function_volatility_sql() %}\n {{ return(adapter.dispatch('scalar_function_volatility_sql', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__scalar_function_volatility_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2749958, "supported_languages": null}, "macro.dbt.scalar_function_volatility_javascript": {"name": "scalar_function_volatility_javascript", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.scalar_function_volatility_javascript", "macro_sql": "{% macro scalar_function_volatility_javascript() %}\n {{ return(adapter.dispatch('scalar_function_volatility_javascript', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__scalar_function_volatility_javascript"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2759988, "supported_languages": null}, "macro.dbt.default__scalar_function_volatility_javascript": {"name": "default__scalar_function_volatility_javascript", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.default__scalar_function_volatility_javascript", "macro_sql": "{% macro default__scalar_function_volatility_javascript() %}\n {% set volatility = model.config.get('volatility') %}\n {% if volatility != none %}\n {% set msg = \"Volatility is not supported by \" ~ adapter.type() ~ \" in javascript UDF and will be ignored\" %}\n {% do exceptions.warn(msg) %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2759988, "supported_languages": null}, "macro.dbt.default__scalar_function_volatility_sql": {"name": "default__scalar_function_volatility_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.default__scalar_function_volatility_sql", "macro_sql": "{% macro default__scalar_function_volatility_sql() %}\n {% set volatility = model.config.get('volatility') %}\n {% if volatility == 'deterministic' %}\n IMMUTABLE\n {% elif volatility == 'stable' %}\n STABLE\n {% elif volatility == 'non-deterministic' %}\n VOLATILE\n {% elif volatility != none %}\n {# This shouldn't happen unless a new volatility is invented #}\n {% do unsupported_volatility_warning(volatility) %}\n {% endif %}\n {# If no volatility is set, don't add anything and let the data warehouse default it #}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.unsupported_volatility_warning"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.27699, "supported_languages": null}, "macro.dbt.unsupported_volatility_warning": {"name": "unsupported_volatility_warning", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.unsupported_volatility_warning", "macro_sql": "{% macro unsupported_volatility_warning(volatility) %}\n {{ return(adapter.dispatch('unsupported_volatility_warning', 'dbt')(volatility)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__unsupported_volatility_warning"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "volatility", "type": null, "description": ""}], "created_at": 1785250505.2779968, "supported_languages": null}, "macro.dbt.default__unsupported_volatility_warning": {"name": "default__unsupported_volatility_warning", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\functions\\scalar.sql", "original_file_path": "macros\\materializations\\functions\\scalar.sql", "unique_id": "macro.dbt.default__unsupported_volatility_warning", "macro_sql": "{% macro default__unsupported_volatility_warning(volatility) %}\n {% set msg = \"Found `\" ~ volatility ~ \"` volatility specified on function `\" ~ model.name ~ \"`. This volatility is not supported by \" ~ adapter.type() ~ \", and will be ignored\" %}\n {% do exceptions.warn(msg) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "volatility", "type": null, "description": ""}], "created_at": 1785250505.2779968, "supported_languages": null}, "macro.dbt.materialization_materialized_view_default": {"name": "materialization_materialized_view_default", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\materialized_view.sql", "original_file_path": "macros\\materializations\\models\\materialized_view.sql", "unique_id": "macro.dbt.materialization_materialized_view_default", "macro_sql": "{% materialization materialized_view, default %}\n {% set existing_relation = load_cached_relation(this) %}\n {% set target_relation = this.incorporate(type=this.MaterializedView) %}\n {% set intermediate_relation = make_intermediate_relation(target_relation) %}\n {% set backup_relation_type = target_relation.MaterializedView if existing_relation is none else existing_relation.type %}\n {% set backup_relation = make_backup_relation(target_relation, backup_relation_type) %}\n\n {{ materialized_view_setup(backup_relation, intermediate_relation, pre_hooks) }}\n\n {% set build_sql = materialized_view_get_build_sql(existing_relation, target_relation, backup_relation, intermediate_relation) %}\n\n {% if build_sql == '' %}\n {{ materialized_view_execute_no_op(target_relation) }}\n {% else %}\n {{ materialized_view_execute_build_sql(build_sql, existing_relation, target_relation, post_hooks) }}\n {% endif %}\n\n {{ materialized_view_teardown(backup_relation, intermediate_relation, post_hooks) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.make_intermediate_relation", "macro.dbt.make_backup_relation", "macro.dbt.materialized_view_setup", "macro.dbt.materialized_view_get_build_sql", "macro.dbt.materialized_view_execute_no_op", "macro.dbt.materialized_view_execute_build_sql", "macro.dbt.materialized_view_teardown"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.2809937, "supported_languages": ["sql"]}, "macro.dbt.materialized_view_setup": {"name": "materialized_view_setup", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\materialized_view.sql", "original_file_path": "macros\\materializations\\models\\materialized_view.sql", "unique_id": "macro.dbt.materialized_view_setup", "macro_sql": "{% macro materialized_view_setup(backup_relation, intermediate_relation, pre_hooks) %}\n\n -- backup_relation and intermediate_relation should not already exist in the database\n -- it's possible these exist because of a previous run that exited unexpectedly\n {% set preexisting_backup_relation = load_cached_relation(backup_relation) %}\n {% set preexisting_intermediate_relation = load_cached_relation(intermediate_relation) %}\n\n -- drop the temp relations if they exist already in the database\n {{ drop_relation_if_exists(preexisting_backup_relation) }}\n {{ drop_relation_if_exists(preexisting_intermediate_relation) }}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.drop_relation_if_exists", "macro.dbt.run_hooks"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "backup_relation", "type": null, "description": ""}, {"name": "intermediate_relation", "type": null, "description": ""}, {"name": "pre_hooks", "type": null, "description": ""}], "created_at": 1785250505.2820055, "supported_languages": null}, "macro.dbt.materialized_view_teardown": {"name": "materialized_view_teardown", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\materialized_view.sql", "original_file_path": "macros\\materializations\\models\\materialized_view.sql", "unique_id": "macro.dbt.materialized_view_teardown", "macro_sql": "{% macro materialized_view_teardown(backup_relation, intermediate_relation, post_hooks) %}\n\n -- drop the temp relations if they exist to leave the database clean for the next run\n {{ drop_relation_if_exists(backup_relation) }}\n {{ drop_relation_if_exists(intermediate_relation) }}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.drop_relation_if_exists", "macro.dbt.run_hooks"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "backup_relation", "type": null, "description": ""}, {"name": "intermediate_relation", "type": null, "description": ""}, {"name": "post_hooks", "type": null, "description": ""}], "created_at": 1785250505.2829986, "supported_languages": null}, "macro.dbt.materialized_view_get_build_sql": {"name": "materialized_view_get_build_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\materialized_view.sql", "original_file_path": "macros\\materializations\\models\\materialized_view.sql", "unique_id": "macro.dbt.materialized_view_get_build_sql", "macro_sql": "{% macro materialized_view_get_build_sql(existing_relation, target_relation, backup_relation, intermediate_relation) %}\n\n {% set full_refresh_mode = should_full_refresh() %}\n\n -- determine the scenario we're in: create, full_refresh, alter, refresh data\n {% if existing_relation is none %}\n {% set build_sql = get_create_materialized_view_as_sql(target_relation, sql) %}\n {% elif full_refresh_mode or not existing_relation.is_materialized_view %}\n {% set build_sql = get_replace_sql(existing_relation, target_relation, sql) %}\n {% else %}\n\n -- get config options\n {% set on_configuration_change = config.get('on_configuration_change') %}\n {% set configuration_changes = get_materialized_view_configuration_changes(existing_relation, config) %}\n\n {% if configuration_changes is none %}\n {% set build_sql = refresh_materialized_view(target_relation) %}\n\n {% elif on_configuration_change == 'apply' %}\n {% set build_sql = get_alter_materialized_view_as_sql(target_relation, configuration_changes, sql, existing_relation, backup_relation, intermediate_relation) %}\n {% elif on_configuration_change == 'continue' %}\n {% set build_sql = '' %}\n {{ exceptions.warn(\"Configuration changes were identified and `on_configuration_change` was set to `continue` for `\" ~ target_relation.render() ~ \"`\") }}\n {% elif on_configuration_change == 'fail' %}\n {{ exceptions.raise_fail_fast_error(\"Configuration changes were identified and `on_configuration_change` was set to `fail` for `\" ~ target_relation.render() ~ \"`\") }}\n\n {% else %}\n -- this only happens if the user provides a value other than `apply`, 'skip', 'fail'\n {{ exceptions.raise_compiler_error(\"Unexpected configuration scenario\") }}\n\n {% endif %}\n\n {% endif %}\n\n {% do return(build_sql) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.should_full_refresh", "macro.dbt.get_create_materialized_view_as_sql", "macro.dbt.get_replace_sql", "macro.dbt.get_materialized_view_configuration_changes", "macro.dbt.refresh_materialized_view", "macro.dbt.get_alter_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "backup_relation", "type": null, "description": ""}, {"name": "intermediate_relation", "type": null, "description": ""}], "created_at": 1785250505.2860053, "supported_languages": null}, "macro.dbt.materialized_view_execute_no_op": {"name": "materialized_view_execute_no_op", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\materialized_view.sql", "original_file_path": "macros\\materializations\\models\\materialized_view.sql", "unique_id": "macro.dbt.materialized_view_execute_no_op", "macro_sql": "{% macro materialized_view_execute_no_op(target_relation) %}\n {% do store_raw_result(\n name=\"main\",\n message=\"skip \" ~ target_relation,\n code=\"skip\",\n rows_affected=\"-1\"\n ) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.2860053, "supported_languages": null}, "macro.dbt.materialized_view_execute_build_sql": {"name": "materialized_view_execute_build_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\materialized_view.sql", "original_file_path": "macros\\materializations\\models\\materialized_view.sql", "unique_id": "macro.dbt.materialized_view_execute_build_sql", "macro_sql": "{% macro materialized_view_execute_build_sql(build_sql, existing_relation, target_relation, post_hooks) %}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n {% set grant_config = config.get('grants') %}\n\n {% call statement(name=\"main\") %}\n {{ build_sql }}\n {% endcall %}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n {{ adapter.commit() }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_hooks", "macro.dbt.statement", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "build_sql", "type": null, "description": ""}, {"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "post_hooks", "type": null, "description": ""}], "created_at": 1785250505.287997, "supported_languages": null}, "macro.dbt.materialization_table_default": {"name": "materialization_table_default", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\table.sql", "original_file_path": "macros\\materializations\\models\\table.sql", "unique_id": "macro.dbt.materialization_table_default", "macro_sql": "{% materialization table, default %}\n\n {%- set existing_relation = load_cached_relation(this) -%}\n {%- set target_relation = this.incorporate(type='table') %}\n {%- set intermediate_relation = make_intermediate_relation(target_relation) -%}\n -- the intermediate_relation should not already exist in the database; get_relation\n -- will return None in that case. Otherwise, we get a relation that we can drop\n -- later, before we try to use this name for the current operation\n {%- set preexisting_intermediate_relation = load_cached_relation(intermediate_relation) -%}\n /*\n See ../view/view.sql for more information about this relation.\n */\n {%- set backup_relation_type = 'table' if existing_relation is none else existing_relation.type -%}\n {%- set backup_relation = make_backup_relation(target_relation, backup_relation_type) -%}\n -- as above, the backup_relation should not already exist\n {%- set preexisting_backup_relation = load_cached_relation(backup_relation) -%}\n -- grab current tables grants config for comparision later on\n {% set grant_config = config.get('grants') %}\n\n -- drop the temp relations if they exist already in the database\n {{ drop_relation_if_exists(preexisting_intermediate_relation) }}\n {{ drop_relation_if_exists(preexisting_backup_relation) }}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n -- build model\n {% call statement('main') -%}\n {{ get_create_table_as_sql(False, intermediate_relation, sql) }}\n {%- endcall %}\n\n {% do create_indexes(intermediate_relation) %}\n\n -- cleanup\n {% if existing_relation is not none %}\n /* Do the equivalent of rename_if_exists. 'existing_relation' could have been dropped\n since the variable was first set. */\n {% set existing_relation = load_cached_relation(existing_relation) %}\n {% if existing_relation is not none %}\n {{ adapter.rename_relation(existing_relation, backup_relation) }}\n {% endif %}\n {% endif %}\n\n {{ adapter.rename_relation(intermediate_relation, target_relation) }}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n -- `COMMIT` happens here\n {{ adapter.commit() }}\n\n -- finally, drop the existing/backup relation after the commit\n {{ drop_relation_if_exists(backup_relation) }}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.make_intermediate_relation", "macro.dbt.make_backup_relation", "macro.dbt.drop_relation_if_exists", "macro.dbt.run_hooks", "macro.dbt.statement", "macro.dbt.get_create_table_as_sql", "macro.dbt.create_indexes", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.2920005, "supported_languages": ["sql"]}, "macro.dbt.materialization_view_default": {"name": "materialization_view_default", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\view.sql", "original_file_path": "macros\\materializations\\models\\view.sql", "unique_id": "macro.dbt.materialization_view_default", "macro_sql": "{%- materialization view, default -%}\n\n {%- set existing_relation = load_cached_relation(this) -%}\n {%- set target_relation = this.incorporate(type='view') -%}\n {%- set intermediate_relation = make_intermediate_relation(target_relation) -%}\n\n -- the intermediate_relation should not already exist in the database; get_relation\n -- will return None in that case. Otherwise, we get a relation that we can drop\n -- later, before we try to use this name for the current operation\n {%- set preexisting_intermediate_relation = load_cached_relation(intermediate_relation) -%}\n /*\n This relation (probably) doesn't exist yet. If it does exist, it's a leftover from\n a previous run, and we're going to try to drop it immediately. At the end of this\n materialization, we're going to rename the \"existing_relation\" to this identifier,\n and then we're going to drop it. In order to make sure we run the correct one of:\n - drop view ...\n - drop table ...\n\n We need to set the type of this relation to be the type of the existing_relation, if it exists,\n or else \"view\" as a sane default if it does not. Note that if the existing_relation does not\n exist, then there is nothing to move out of the way and subsequentally drop. In that case,\n this relation will be effectively unused.\n */\n {%- set backup_relation_type = 'view' if existing_relation is none else existing_relation.type -%}\n {%- set backup_relation = make_backup_relation(target_relation, backup_relation_type) -%}\n -- as above, the backup_relation should not already exist\n {%- set preexisting_backup_relation = load_cached_relation(backup_relation) -%}\n -- grab current tables grants config for comparision later on\n {% set grant_config = config.get('grants') %}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n -- drop the temp relations if they exist already in the database\n {{ drop_relation_if_exists(preexisting_intermediate_relation) }}\n {{ drop_relation_if_exists(preexisting_backup_relation) }}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n -- build model\n {% call statement('main') -%}\n {{ get_create_view_as_sql(intermediate_relation, sql) }}\n {%- endcall %}\n\n -- cleanup\n -- move the existing view out of the way\n {% if existing_relation is not none %}\n /* Do the equivalent of rename_if_exists. 'existing_relation' could have been dropped\n since the variable was first set. */\n {% set existing_relation = load_cached_relation(existing_relation) %}\n {% if existing_relation is not none %}\n {{ adapter.rename_relation(existing_relation, backup_relation) }}\n {% endif %}\n {% endif %}\n {{ adapter.rename_relation(intermediate_relation, target_relation) }}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n {{ adapter.commit() }}\n\n {{ drop_relation_if_exists(backup_relation) }}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{%- endmaterialization -%}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.make_intermediate_relation", "macro.dbt.make_backup_relation", "macro.dbt.run_hooks", "macro.dbt.drop_relation_if_exists", "macro.dbt.statement", "macro.dbt.get_create_view_as_sql", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.2965217, "supported_languages": ["sql"]}, "macro.dbt.can_clone_table": {"name": "can_clone_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\clone\\can_clone_table.sql", "original_file_path": "macros\\materializations\\models\\clone\\can_clone_table.sql", "unique_id": "macro.dbt.can_clone_table", "macro_sql": "{% macro can_clone_table() %}\n {{ return(adapter.dispatch('can_clone_table', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__can_clone_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.2965217, "supported_languages": null}, "macro.dbt.default__can_clone_table": {"name": "default__can_clone_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\clone\\can_clone_table.sql", "original_file_path": "macros\\materializations\\models\\clone\\can_clone_table.sql", "unique_id": "macro.dbt.default__can_clone_table", "macro_sql": "{% macro default__can_clone_table() %}\n {{ return(False) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.297534, "supported_languages": null}, "macro.dbt.materialization_clone_default": {"name": "materialization_clone_default", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\clone\\clone.sql", "original_file_path": "macros\\materializations\\models\\clone\\clone.sql", "unique_id": "macro.dbt.materialization_clone_default", "macro_sql": "{%- materialization clone, default -%}\n\n {%- set relations = {'relations': []} -%}\n\n {%- if not defer_relation -%}\n -- nothing to do\n {{ log(\"No relation found in state manifest for \" ~ model.unique_id, info=True) }}\n {{ return(relations) }}\n {%- endif -%}\n\n {%- set existing_relation = load_cached_relation(this) -%}\n\n {%- if existing_relation and not flags.FULL_REFRESH -%}\n -- noop!\n {{ log(\"Relation \" ~ existing_relation ~ \" already exists\", info=True) }}\n {{ return(relations) }}\n {%- endif -%}\n\n {%- set other_existing_relation = load_cached_relation(defer_relation) -%}\n\n -- If this is a database that can do zero-copy cloning of tables, and the other relation is a table, then this will be a table\n -- Otherwise, this will be a view\n\n {% set can_clone_table = can_clone_table() %}\n {%- set grant_config = config.get('grants') -%}\n\n {%- if other_existing_relation and other_existing_relation.type == 'table' and can_clone_table -%}\n\n {%- set target_relation = this.incorporate(type='table') -%}\n {% if existing_relation is not none and not existing_relation.is_table %}\n {{ log(\"Dropping relation \" ~ existing_relation.render() ~ \" because it is of type \" ~ existing_relation.type) }}\n {{ drop_relation_if_exists(existing_relation) }}\n {% endif %}\n\n -- as a general rule, data platforms that can clone tables can also do atomic 'create or replace'\n {% if target_relation.database == defer_relation.database and\n target_relation.schema == defer_relation.schema and\n target_relation.identifier == defer_relation.identifier %}\n {{ log(\"Target relation and defer relation are the same, skipping clone for relation: \" ~ target_relation.render()) }}\n {% else %}\n {% call statement('main') %}\n {{ create_or_replace_clone(target_relation, defer_relation) }}\n {% endcall %}\n {% endif %}\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n {% do persist_docs(target_relation, model) %}\n\n {{ return({'relations': [target_relation]}) }}\n\n {%- else -%}\n\n {%- set target_relation = this.incorporate(type='view') -%}\n\n -- reuse the view materialization\n -- TODO: support actual dispatch for materialization macros\n -- Tracking ticket: https://github.com/dbt-labs/dbt-core/issues/7799\n {% set search_name = \"materialization_view_\" ~ adapter.type() %}\n {% if not search_name in context %}\n {% set search_name = \"materialization_view_default\" %}\n {% endif %}\n {% set materialization_macro = context[search_name] %}\n {% set relations = materialization_macro() %}\n {{ return(relations) }}\n\n {%- endif -%}\n\n{%- endmaterialization -%}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.can_clone_table", "macro.dbt.drop_relation_if_exists", "macro.dbt.statement", "macro.dbt.create_or_replace_clone", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.3025227, "supported_languages": ["sql"]}, "macro.dbt.create_or_replace_clone": {"name": "create_or_replace_clone", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\clone\\create_or_replace_clone.sql", "original_file_path": "macros\\materializations\\models\\clone\\create_or_replace_clone.sql", "unique_id": "macro.dbt.create_or_replace_clone", "macro_sql": "{% macro create_or_replace_clone(this_relation, defer_relation) %}\n {{ return(adapter.dispatch('create_or_replace_clone', 'dbt')(this_relation, defer_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__create_or_replace_clone"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "this_relation", "type": null, "description": ""}, {"name": "defer_relation", "type": null, "description": ""}], "created_at": 1785250505.303537, "supported_languages": null}, "macro.dbt.default__create_or_replace_clone": {"name": "default__create_or_replace_clone", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\clone\\create_or_replace_clone.sql", "original_file_path": "macros\\materializations\\models\\clone\\create_or_replace_clone.sql", "unique_id": "macro.dbt.default__create_or_replace_clone", "macro_sql": "{% macro default__create_or_replace_clone(this_relation, defer_relation) %}\n create or replace table {{ this_relation.render() }} clone {{ defer_relation.render() }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "this_relation", "type": null, "description": ""}, {"name": "defer_relation", "type": null, "description": ""}], "created_at": 1785250505.303537, "supported_languages": null}, "macro.dbt.get_quoted_csv": {"name": "get_quoted_csv", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\column_helpers.sql", "original_file_path": "macros\\materializations\\models\\incremental\\column_helpers.sql", "unique_id": "macro.dbt.get_quoted_csv", "macro_sql": "{% macro get_quoted_csv(column_names) %}\n\n {% set quoted = [] %}\n {% for col in column_names -%}\n {%- do quoted.append(adapter.quote(col)) -%}\n {%- endfor %}\n\n {%- set dest_cols_csv = quoted | join(', ') -%}\n {{ return(dest_cols_csv) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "column_names", "type": null, "description": ""}], "created_at": 1785250505.305528, "supported_languages": null}, "macro.dbt.diff_columns": {"name": "diff_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\column_helpers.sql", "original_file_path": "macros\\materializations\\models\\incremental\\column_helpers.sql", "unique_id": "macro.dbt.diff_columns", "macro_sql": "{% macro diff_columns(source_columns, target_columns) %}\n\n {% set result = [] %}\n {% set source_names = source_columns | map(attribute = 'column') | list %}\n {% set target_names = target_columns | map(attribute = 'column') | list %}\n\n {# --check whether the name attribute exists in the target - this does not perform a data type check #}\n {% for sc in source_columns %}\n {% if sc.name not in target_names %}\n {{ result.append(sc) }}\n {% endif %}\n {% endfor %}\n\n {{ return(result) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source_columns", "type": null, "description": ""}, {"name": "target_columns", "type": null, "description": ""}], "created_at": 1785250505.3065248, "supported_languages": null}, "macro.dbt.diff_column_data_types": {"name": "diff_column_data_types", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\column_helpers.sql", "original_file_path": "macros\\materializations\\models\\incremental\\column_helpers.sql", "unique_id": "macro.dbt.diff_column_data_types", "macro_sql": "{% macro diff_column_data_types(source_columns, target_columns) %}\n {{ return(adapter.dispatch('diff_column_data_types', 'dbt')(source_columns, target_columns)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__diff_column_data_types"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source_columns", "type": null, "description": ""}, {"name": "target_columns", "type": null, "description": ""}], "created_at": 1785250505.3065248, "supported_languages": null}, "macro.dbt.default__diff_column_data_types": {"name": "default__diff_column_data_types", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\column_helpers.sql", "original_file_path": "macros\\materializations\\models\\incremental\\column_helpers.sql", "unique_id": "macro.dbt.default__diff_column_data_types", "macro_sql": "{% macro default__diff_column_data_types(source_columns, target_columns) %}\n {% set result = [] %}\n {% for sc in source_columns %}\n {% set tc = target_columns | selectattr(\"name\", \"equalto\", sc.name) | list | first %}\n {% if tc %}\n {% if sc.expanded_data_type != tc.expanded_data_type and not sc.can_expand_to(other_column=tc) %}\n {{ result.append( { 'column_name': tc.name, 'new_type': sc.expanded_data_type } ) }}\n {% endif %}\n {% endif %}\n {% endfor %}\n\n {{ return(result) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source_columns", "type": null, "description": ""}, {"name": "target_columns", "type": null, "description": ""}], "created_at": 1785250505.308523, "supported_languages": null}, "macro.dbt.get_merge_update_columns": {"name": "get_merge_update_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\column_helpers.sql", "original_file_path": "macros\\materializations\\models\\incremental\\column_helpers.sql", "unique_id": "macro.dbt.get_merge_update_columns", "macro_sql": "{% macro get_merge_update_columns(merge_update_columns, merge_exclude_columns, dest_columns) %}\n {{ return(adapter.dispatch('get_merge_update_columns', 'dbt')(merge_update_columns, merge_exclude_columns, dest_columns)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__get_merge_update_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "merge_update_columns", "type": null, "description": ""}, {"name": "merge_exclude_columns", "type": null, "description": ""}, {"name": "dest_columns", "type": null, "description": ""}], "created_at": 1785250505.308523, "supported_languages": null}, "macro.dbt.default__get_merge_update_columns": {"name": "default__get_merge_update_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\column_helpers.sql", "original_file_path": "macros\\materializations\\models\\incremental\\column_helpers.sql", "unique_id": "macro.dbt.default__get_merge_update_columns", "macro_sql": "{% macro default__get_merge_update_columns(merge_update_columns, merge_exclude_columns, dest_columns) %}\n {%- set default_cols = dest_columns | map(attribute=\"quoted\") | list -%}\n\n {%- if merge_update_columns and merge_exclude_columns -%}\n {{ exceptions.raise_compiler_error(\n 'Model cannot specify merge_update_columns and merge_exclude_columns. Please update model to use only one config'\n )}}\n {%- elif merge_update_columns -%}\n {%- set update_columns = merge_update_columns -%}\n {%- elif merge_exclude_columns -%}\n {%- set update_columns = [] -%}\n {%- for column in dest_columns -%}\n {% if column.column | lower not in merge_exclude_columns | map(\"lower\") | list %}\n {%- do update_columns.append(column.quoted) -%}\n {% endif %}\n {%- endfor -%}\n {%- else -%}\n {%- set update_columns = default_cols -%}\n {%- endif -%}\n\n {{ return(update_columns) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "merge_update_columns", "type": null, "description": ""}, {"name": "merge_exclude_columns", "type": null, "description": ""}, {"name": "dest_columns", "type": null, "description": ""}], "created_at": 1785250505.310523, "supported_languages": null}, "macro.dbt.materialization_incremental_default": {"name": "materialization_incremental_default", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\incremental.sql", "original_file_path": "macros\\materializations\\models\\incremental\\incremental.sql", "unique_id": "macro.dbt.materialization_incremental_default", "macro_sql": "{% materialization incremental, default -%}\n\n -- relations\n {%- set existing_relation = load_cached_relation(this) -%}\n {%- set target_relation = this.incorporate(type='table') -%}\n {%- set temp_relation = make_temp_relation(target_relation)-%}\n {%- set intermediate_relation = make_intermediate_relation(target_relation)-%}\n {%- set backup_relation_type = 'table' if existing_relation is none else existing_relation.type -%}\n {%- set backup_relation = make_backup_relation(target_relation, backup_relation_type) -%}\n\n -- configs\n {%- set unique_key = config.get('unique_key') -%}\n {%- set full_refresh_mode = (should_full_refresh() or existing_relation.is_view) -%}\n {%- set on_schema_change = incremental_validate_on_schema_change(config.get('on_schema_change'), default='ignore') -%}\n\n -- the temp_ and backup_ relations should not already exist in the database; get_relation\n -- will return None in that case. Otherwise, we get a relation that we can drop\n -- later, before we try to use this name for the current operation. This has to happen before\n -- BEGIN, in a separate transaction\n {%- set preexisting_intermediate_relation = load_cached_relation(intermediate_relation)-%}\n {%- set preexisting_backup_relation = load_cached_relation(backup_relation) -%}\n -- grab current tables grants config for comparision later on\n {% set grant_config = config.get('grants') %}\n {{ drop_relation_if_exists(preexisting_intermediate_relation) }}\n {{ drop_relation_if_exists(preexisting_backup_relation) }}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n {% set to_drop = [] %}\n\n {% set incremental_strategy = config.get('incremental_strategy') or 'default' %}\n {% set strategy_sql_macro_func = adapter.get_incremental_strategy_macro(context, incremental_strategy) %}\n\n {% if existing_relation is none %}\n {% set build_sql = get_create_table_as_sql(False, target_relation, sql) %}\n {% set relation_for_indexes = target_relation %}\n {% elif full_refresh_mode %}\n {% set build_sql = get_create_table_as_sql(False, intermediate_relation, sql) %}\n {% set relation_for_indexes = intermediate_relation %}\n {% set need_swap = true %}\n {% else %}\n {% do run_query(get_create_table_as_sql(True, temp_relation, sql)) %}\n {% set relation_for_indexes = temp_relation %}\n {% set contract_config = config.get('contract') %}\n {% if not contract_config or not contract_config.enforced %}\n {% do adapter.expand_target_column_types(\n from_relation=temp_relation,\n to_relation=target_relation) %}\n {% endif %}\n {#-- Process schema changes. Returns dict of changes if successful. Use source columns for upserting/merging --#}\n {% set dest_columns = process_schema_changes(on_schema_change, temp_relation, existing_relation) %}\n {% if not dest_columns %}\n {% set dest_columns = adapter.get_columns_in_relation(existing_relation) %}\n {% endif %}\n\n {#-- Get the incremental_strategy, the macro to use for the strategy, and build the sql --#}\n {% set incremental_predicates = config.get('predicates', none) or config.get('incremental_predicates', none) %}\n {% set strategy_arg_dict = ({'target_relation': target_relation, 'temp_relation': temp_relation, 'unique_key': unique_key, 'dest_columns': dest_columns, 'incremental_predicates': incremental_predicates }) %}\n {% set build_sql = strategy_sql_macro_func(strategy_arg_dict) %}\n\n {% endif %}\n\n {% call statement(\"main\") %}\n {{ build_sql }}\n {% endcall %}\n\n {% if existing_relation is none or existing_relation.is_view or should_full_refresh() %}\n {% do create_indexes(relation_for_indexes) %}\n {% endif %}\n\n {% if need_swap %}\n {% do adapter.rename_relation(target_relation, backup_relation) %}\n {% do adapter.rename_relation(intermediate_relation, target_relation) %}\n {% do to_drop.append(backup_relation) %}\n {% endif %}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n -- `COMMIT` happens here\n {% do adapter.commit() %}\n\n {% for rel in to_drop %}\n {% do adapter.drop_relation(rel) %}\n {% endfor %}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{%- endmaterialization %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.make_temp_relation", "macro.dbt.make_intermediate_relation", "macro.dbt.make_backup_relation", "macro.dbt.should_full_refresh", "macro.dbt.incremental_validate_on_schema_change", "macro.dbt.drop_relation_if_exists", "macro.dbt.run_hooks", "macro.dbt.get_create_table_as_sql", "macro.dbt.run_query", "macro.dbt.process_schema_changes", "macro.dbt.statement", "macro.dbt.create_indexes", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.319528, "supported_languages": ["sql"]}, "macro.dbt.is_incremental": {"name": "is_incremental", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\is_incremental.sql", "original_file_path": "macros\\materializations\\models\\incremental\\is_incremental.sql", "unique_id": "macro.dbt.is_incremental", "macro_sql": "{% macro is_incremental() %}\n {#-- do not run introspective queries in parsing #}\n {% if not execute %}\n {{ return(False) }}\n {% else %}\n {% set relation = adapter.get_relation(this.database, this.schema, this.table) %}\n {{ return(relation is not none\n and relation.type == 'table'\n and model.config.materialized == 'incremental'\n and not should_full_refresh()) }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.should_full_refresh"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.3205247, "supported_languages": null}, "macro.dbt.get_merge_sql": {"name": "get_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\merge.sql", "original_file_path": "macros\\materializations\\models\\incremental\\merge.sql", "unique_id": "macro.dbt.get_merge_sql", "macro_sql": "{% macro get_merge_sql(target, source, unique_key, dest_columns, incremental_predicates=none) -%}\n -- back compat for old kwarg name\n {% set incremental_predicates = kwargs.get('predicates', incremental_predicates) %}\n {{ adapter.dispatch('get_merge_sql', 'dbt')(target, source, unique_key, dest_columns, incremental_predicates) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target", "type": null, "description": ""}, {"name": "source", "type": null, "description": ""}, {"name": "unique_key", "type": null, "description": ""}, {"name": "dest_columns", "type": null, "description": ""}, {"name": "incremental_predicates", "type": null, "description": ""}], "created_at": 1785250505.3225203, "supported_languages": null}, "macro.dbt.get_merge_unique_key_match": {"name": "get_merge_unique_key_match", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\merge.sql", "original_file_path": "macros\\materializations\\models\\incremental\\merge.sql", "unique_id": "macro.dbt.get_merge_unique_key_match", "macro_sql": "{% macro get_merge_unique_key_match(source_unique_key, target_unique_key) %}\n {{ return(adapter.dispatch('get_merge_unique_key_match', 'dbt')(source_unique_key, target_unique_key)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_merge_unique_key_match"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source_unique_key", "type": null, "description": ""}, {"name": "target_unique_key", "type": null, "description": ""}], "created_at": 1785250505.323533, "supported_languages": null}, "macro.dbt.default__get_merge_unique_key_match": {"name": "default__get_merge_unique_key_match", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\merge.sql", "original_file_path": "macros\\materializations\\models\\incremental\\merge.sql", "unique_id": "macro.dbt.default__get_merge_unique_key_match", "macro_sql": "{% macro default__get_merge_unique_key_match(source_unique_key, target_unique_key) -%}\n {{ return(equals(source_unique_key, target_unique_key) | trim) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.equals"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source_unique_key", "type": null, "description": ""}, {"name": "target_unique_key", "type": null, "description": ""}], "created_at": 1785250505.323533, "supported_languages": null}, "macro.dbt.default__get_merge_sql": {"name": "default__get_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\merge.sql", "original_file_path": "macros\\materializations\\models\\incremental\\merge.sql", "unique_id": "macro.dbt.default__get_merge_sql", "macro_sql": "{% macro default__get_merge_sql(target, source, unique_key, dest_columns, incremental_predicates=none) -%}\n {%- set predicates = [] if incremental_predicates is none else [] + incremental_predicates -%}\n {%- set dest_cols_csv = get_quoted_csv(dest_columns | map(attribute=\"name\")) -%}\n {%- set merge_update_columns = config.get('merge_update_columns') -%}\n {%- set merge_exclude_columns = config.get('merge_exclude_columns') -%}\n {%- set update_columns = get_merge_update_columns(merge_update_columns, merge_exclude_columns, dest_columns) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {% if unique_key %}\n {% if unique_key is sequence and unique_key is not mapping and unique_key is not string %}\n {% for key in unique_key %}\n {% set this_key_match %}\n DBT_INTERNAL_SOURCE.{{ key }} = DBT_INTERNAL_DEST.{{ key }}\n {% endset %}\n {% do predicates.append(this_key_match) %}\n {% endfor %}\n {% else %}\n {% set source_unique_key = (\"DBT_INTERNAL_SOURCE.\" ~ unique_key) | trim %}\n {% set target_unique_key = (\"DBT_INTERNAL_DEST.\" ~ unique_key) | trim %}\n {% set unique_key_match = get_merge_unique_key_match(source_unique_key, target_unique_key) %}\n {% do predicates.append(unique_key_match) %}\n {% endif %}\n {% else %}\n {% do predicates.append('FALSE') %}\n {% endif %}\n\n {{ sql_header if sql_header is not none }}\n\n merge into {{ target }} as DBT_INTERNAL_DEST\n using {{ source }} as DBT_INTERNAL_SOURCE\n on {{\"(\" ~ predicates | join(\") and (\") ~ \")\"}}\n\n {% if unique_key %}\n when matched then update set\n {% for column_name in update_columns -%}\n {{ column_name }} = DBT_INTERNAL_SOURCE.{{ column_name }}\n {%- if not loop.last %}, {%- endif %}\n {%- endfor %}\n {% endif %}\n\n when not matched then insert\n ({{ dest_cols_csv }})\n values\n ({{ dest_cols_csv }})\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_quoted_csv", "macro.dbt.get_merge_update_columns", "macro.dbt.get_merge_unique_key_match"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target", "type": null, "description": ""}, {"name": "source", "type": null, "description": ""}, {"name": "unique_key", "type": null, "description": ""}, {"name": "dest_columns", "type": null, "description": ""}, {"name": "incremental_predicates", "type": null, "description": ""}], "created_at": 1785250505.3275473, "supported_languages": null}, "macro.dbt.get_delete_insert_merge_sql": {"name": "get_delete_insert_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\merge.sql", "original_file_path": "macros\\materializations\\models\\incremental\\merge.sql", "unique_id": "macro.dbt.get_delete_insert_merge_sql", "macro_sql": "{% macro get_delete_insert_merge_sql(target, source, unique_key, dest_columns, incremental_predicates) -%}\n {{ adapter.dispatch('get_delete_insert_merge_sql', 'dbt')(target, source, unique_key, dest_columns, incremental_predicates) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_delete_insert_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target", "type": null, "description": ""}, {"name": "source", "type": null, "description": ""}, {"name": "unique_key", "type": null, "description": ""}, {"name": "dest_columns", "type": null, "description": ""}, {"name": "incremental_predicates", "type": null, "description": ""}], "created_at": 1785250505.3275473, "supported_languages": null}, "macro.dbt.default__get_delete_insert_merge_sql": {"name": "default__get_delete_insert_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\merge.sql", "original_file_path": "macros\\materializations\\models\\incremental\\merge.sql", "unique_id": "macro.dbt.default__get_delete_insert_merge_sql", "macro_sql": "{% macro default__get_delete_insert_merge_sql(target, source, unique_key, dest_columns, incremental_predicates) -%}\n\n {%- set dest_cols_csv = get_quoted_csv(dest_columns | map(attribute=\"name\")) -%}\n\n {% if unique_key %}\n {% if unique_key is string %}\n {% set unique_key = [unique_key] %}\n {% endif %}\n\n {%- set unique_key_str = unique_key|join(', ') -%}\n\n delete from {{ target }} as DBT_INTERNAL_DEST\n where ({{ unique_key_str }}) in (\n select distinct {{ unique_key_str }}\n from {{ source }} as DBT_INTERNAL_SOURCE\n )\n {%- if incremental_predicates %}\n {% for predicate in incremental_predicates %}\n and {{ predicate }}\n {% endfor %}\n {%- endif -%};\n\n {% endif %}\n\n insert into {{ target }} ({{ dest_cols_csv }})\n (\n select {{ dest_cols_csv }}\n from {{ source }}\n )\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_quoted_csv"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target", "type": null, "description": ""}, {"name": "source", "type": null, "description": ""}, {"name": "unique_key", "type": null, "description": ""}, {"name": "dest_columns", "type": null, "description": ""}, {"name": "incremental_predicates", "type": null, "description": ""}], "created_at": 1785250505.3295488, "supported_languages": null}, "macro.dbt.get_insert_overwrite_merge_sql": {"name": "get_insert_overwrite_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\merge.sql", "original_file_path": "macros\\materializations\\models\\incremental\\merge.sql", "unique_id": "macro.dbt.get_insert_overwrite_merge_sql", "macro_sql": "{% macro get_insert_overwrite_merge_sql(target, source, dest_columns, predicates, include_sql_header=false) -%}\n {{ adapter.dispatch('get_insert_overwrite_merge_sql', 'dbt')(target, source, dest_columns, predicates, include_sql_header) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_insert_overwrite_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target", "type": null, "description": ""}, {"name": "source", "type": null, "description": ""}, {"name": "dest_columns", "type": null, "description": ""}, {"name": "predicates", "type": null, "description": ""}, {"name": "include_sql_header", "type": null, "description": ""}], "created_at": 1785250505.3305454, "supported_languages": null}, "macro.dbt.default__get_insert_overwrite_merge_sql": {"name": "default__get_insert_overwrite_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\merge.sql", "original_file_path": "macros\\materializations\\models\\incremental\\merge.sql", "unique_id": "macro.dbt.default__get_insert_overwrite_merge_sql", "macro_sql": "{% macro default__get_insert_overwrite_merge_sql(target, source, dest_columns, predicates, include_sql_header) -%}\n {#-- The only time include_sql_header is True: --#}\n {#-- BigQuery + insert_overwrite strategy + \"static\" partitions config --#}\n {#-- We should consider including the sql header at the materialization level instead --#}\n\n {%- set predicates = [] if predicates is none else [] + predicates -%}\n {%- set dest_cols_csv = get_quoted_csv(dest_columns | map(attribute=\"name\")) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {{ sql_header if sql_header is not none and include_sql_header }}\n\n merge into {{ target }} as DBT_INTERNAL_DEST\n using {{ source }} as DBT_INTERNAL_SOURCE\n on FALSE\n\n when not matched by source\n {% if predicates %} and {{ predicates | join(' and ') }} {% endif %}\n then delete\n\n when not matched then insert\n ({{ dest_cols_csv }})\n values\n ({{ dest_cols_csv }})\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_quoted_csv"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target", "type": null, "description": ""}, {"name": "source", "type": null, "description": ""}, {"name": "dest_columns", "type": null, "description": ""}, {"name": "predicates", "type": null, "description": ""}, {"name": "include_sql_header", "type": null, "description": ""}], "created_at": 1785250505.3315487, "supported_languages": null}, "macro.dbt.incremental_validate_on_schema_change": {"name": "incremental_validate_on_schema_change", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\on_schema_change.sql", "original_file_path": "macros\\materializations\\models\\incremental\\on_schema_change.sql", "unique_id": "macro.dbt.incremental_validate_on_schema_change", "macro_sql": "{% macro incremental_validate_on_schema_change(on_schema_change, default='ignore') %}\n\n {% if on_schema_change not in ['sync_all_columns', 'append_new_columns', 'fail', 'ignore'] %}\n\n {% set log_message = 'Invalid value for on_schema_change (%s) specified. Setting default value of %s.' % (on_schema_change, default) %}\n {% do log(log_message) %}\n\n {{ return(default) }}\n\n {% else %}\n\n {{ return(on_schema_change) }}\n\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "on_schema_change", "type": null, "description": ""}, {"name": "default", "type": null, "description": ""}], "created_at": 1785250505.3335435, "supported_languages": null}, "macro.dbt.check_for_schema_changes": {"name": "check_for_schema_changes", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\on_schema_change.sql", "original_file_path": "macros\\materializations\\models\\incremental\\on_schema_change.sql", "unique_id": "macro.dbt.check_for_schema_changes", "macro_sql": "{% macro check_for_schema_changes(source_relation, target_relation) %}\n {{ return(adapter.dispatch('check_for_schema_changes', 'dbt')(source_relation, target_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__check_for_schema_changes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.334546, "supported_languages": null}, "macro.dbt.default__check_for_schema_changes": {"name": "default__check_for_schema_changes", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\on_schema_change.sql", "original_file_path": "macros\\materializations\\models\\incremental\\on_schema_change.sql", "unique_id": "macro.dbt.default__check_for_schema_changes", "macro_sql": "{% macro default__check_for_schema_changes(source_relation, target_relation) %}\n\n {% set schema_changed = False %}\n\n {%- set source_columns = adapter.get_columns_in_relation(source_relation) -%}\n {%- set target_columns = adapter.get_columns_in_relation(target_relation) -%}\n {%- set source_not_in_target = diff_columns(source_columns, target_columns) -%}\n {%- set target_not_in_source = diff_columns(target_columns, source_columns) -%}\n\n {% set new_target_types = diff_column_data_types(source_columns, target_columns) %}\n\n {% if source_not_in_target != [] %}\n {% set schema_changed = True %}\n {% elif target_not_in_source != [] or new_target_types != [] %}\n {% set schema_changed = True %}\n {% elif new_target_types != [] %}\n {% set schema_changed = True %}\n {% endif %}\n\n {% set changes_dict = {\n 'schema_changed': schema_changed,\n 'source_not_in_target': source_not_in_target,\n 'target_not_in_source': target_not_in_source,\n 'source_columns': source_columns,\n 'target_columns': target_columns,\n 'new_target_types': new_target_types\n } %}\n\n {% set msg %}\n In {{ target_relation }}:\n Schema changed: {{ schema_changed }}\n Source columns not in target: {{ source_not_in_target }}\n Target columns not in source: {{ target_not_in_source }}\n New column types: {{ new_target_types }}\n {% endset %}\n\n {% do log(msg) %}\n\n {{ return(changes_dict) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.diff_columns", "macro.dbt.diff_column_data_types"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "source_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.3365471, "supported_languages": null}, "macro.dbt.sync_column_schemas": {"name": "sync_column_schemas", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\on_schema_change.sql", "original_file_path": "macros\\materializations\\models\\incremental\\on_schema_change.sql", "unique_id": "macro.dbt.sync_column_schemas", "macro_sql": "{% macro sync_column_schemas(on_schema_change, target_relation, schema_changes_dict) %}\n {{ return(adapter.dispatch('sync_column_schemas', 'dbt')(on_schema_change, target_relation, schema_changes_dict)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__sync_column_schemas"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "on_schema_change", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "schema_changes_dict", "type": null, "description": ""}], "created_at": 1785250505.3375463, "supported_languages": null}, "macro.dbt.default__sync_column_schemas": {"name": "default__sync_column_schemas", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\on_schema_change.sql", "original_file_path": "macros\\materializations\\models\\incremental\\on_schema_change.sql", "unique_id": "macro.dbt.default__sync_column_schemas", "macro_sql": "{% macro default__sync_column_schemas(on_schema_change, target_relation, schema_changes_dict) %}\n\n {%- set add_to_target_arr = schema_changes_dict['source_not_in_target'] -%}\n {%- set remove_from_target_arr = schema_changes_dict['target_not_in_source'] -%}\n {%- set new_target_types = schema_changes_dict['new_target_types'] -%}\n\n {%- if on_schema_change == 'append_new_columns'-%}\n {%- if add_to_target_arr | length > 0 -%}\n {%- do alter_relation_add_remove_columns(target_relation, add_to_target_arr, none) -%}\n {%- endif -%}\n\n {% elif on_schema_change == 'sync_all_columns' %}\n\n {% if add_to_target_arr | length > 0 or remove_from_target_arr | length > 0 %}\n {%- do alter_relation_add_remove_columns(target_relation, add_to_target_arr, remove_from_target_arr) -%}\n {% endif %}\n\n {% if new_target_types != [] %}\n {% for ntt in new_target_types %}\n {% set column_name = ntt['column_name'] %}\n {% set new_type = ntt['new_type'] %}\n {% do alter_column_type(target_relation, column_name, new_type) %}\n {% endfor %}\n {% endif %}\n\n {% endif %}\n\n {% set schema_change_message %}\n In {{ target_relation }}:\n Schema change approach: {{ on_schema_change }}\n Columns added: {{ add_to_target_arr }}\n Columns removed: {{ remove_from_target_arr }}\n Data types changed: {{ new_target_types }}\n {% endset %}\n\n {% do log(schema_change_message) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.alter_relation_add_remove_columns", "macro.dbt.alter_column_type"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "on_schema_change", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "schema_changes_dict", "type": null, "description": ""}], "created_at": 1785250505.3395479, "supported_languages": null}, "macro.dbt.process_schema_changes": {"name": "process_schema_changes", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\on_schema_change.sql", "original_file_path": "macros\\materializations\\models\\incremental\\on_schema_change.sql", "unique_id": "macro.dbt.process_schema_changes", "macro_sql": "{% macro process_schema_changes(on_schema_change, source_relation, target_relation) %}\n {{ return(adapter.dispatch('process_schema_changes', 'dbt')(on_schema_change, source_relation, target_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__process_schema_changes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "on_schema_change", "type": null, "description": ""}, {"name": "source_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.3395479, "supported_languages": null}, "macro.dbt.default__process_schema_changes": {"name": "default__process_schema_changes", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\on_schema_change.sql", "original_file_path": "macros\\materializations\\models\\incremental\\on_schema_change.sql", "unique_id": "macro.dbt.default__process_schema_changes", "macro_sql": "{% macro default__process_schema_changes(on_schema_change, source_relation, target_relation) %}\n\n {% if on_schema_change == 'ignore' %}\n\n {{ return({}) }}\n\n {% else %}\n\n {% set schema_changes_dict = check_for_schema_changes(source_relation, target_relation) %}\n\n {% if schema_changes_dict['schema_changed'] %}\n\n {% if on_schema_change == 'fail' %}\n\n {% set fail_msg %}\n The source and target schemas on this incremental model are out of sync!\n They can be reconciled in several ways:\n - set the `on_schema_change` config to either append_new_columns or sync_all_columns, depending on your situation.\n - Re-run the incremental model with `full_refresh: True` to update the target schema.\n - update the schema manually and re-run the process.\n\n Additional troubleshooting context:\n Source columns not in target: {{ schema_changes_dict['source_not_in_target'] }}\n Target columns not in source: {{ schema_changes_dict['target_not_in_source'] }}\n New column types: {{ schema_changes_dict['new_target_types'] }}\n {% endset %}\n\n {% do exceptions.raise_compiler_error(fail_msg) %}\n\n {# -- unless we ignore, run the sync operation per the config #}\n {% else %}\n\n {% do sync_column_schemas(on_schema_change, target_relation, schema_changes_dict) %}\n\n {% endif %}\n\n {% endif %}\n\n {{ return(schema_changes_dict['source_columns']) }}\n\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.check_for_schema_changes", "macro.dbt.sync_column_schemas"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "on_schema_change", "type": null, "description": ""}, {"name": "source_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.3420875, "supported_languages": null}, "macro.dbt.get_incremental_append_sql": {"name": "get_incremental_append_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\models\\incremental\\strategies.sql", "unique_id": "macro.dbt.get_incremental_append_sql", "macro_sql": "{% macro get_incremental_append_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_append_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_incremental_append_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250505.3440878, "supported_languages": null}, "macro.dbt.default__get_incremental_append_sql": {"name": "default__get_incremental_append_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\models\\incremental\\strategies.sql", "unique_id": "macro.dbt.default__get_incremental_append_sql", "macro_sql": "{% macro default__get_incremental_append_sql(arg_dict) %}\n\n {% do return(get_insert_into_sql(arg_dict[\"target_relation\"], arg_dict[\"temp_relation\"], arg_dict[\"dest_columns\"])) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_insert_into_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250505.3440878, "supported_languages": null}, "macro.dbt.get_incremental_delete_insert_sql": {"name": "get_incremental_delete_insert_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\models\\incremental\\strategies.sql", "unique_id": "macro.dbt.get_incremental_delete_insert_sql", "macro_sql": "{% macro get_incremental_delete_insert_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_delete_insert_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_incremental_delete_insert_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250505.3440878, "supported_languages": null}, "macro.dbt.default__get_incremental_delete_insert_sql": {"name": "default__get_incremental_delete_insert_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\models\\incremental\\strategies.sql", "unique_id": "macro.dbt.default__get_incremental_delete_insert_sql", "macro_sql": "{% macro default__get_incremental_delete_insert_sql(arg_dict) %}\n\n {% do return(get_delete_insert_merge_sql(arg_dict[\"target_relation\"], arg_dict[\"temp_relation\"], arg_dict[\"unique_key\"], arg_dict[\"dest_columns\"], arg_dict[\"incremental_predicates\"])) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_delete_insert_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250505.3450925, "supported_languages": null}, "macro.dbt.get_incremental_merge_sql": {"name": "get_incremental_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\models\\incremental\\strategies.sql", "unique_id": "macro.dbt.get_incremental_merge_sql", "macro_sql": "{% macro get_incremental_merge_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_merge_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_incremental_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250505.346095, "supported_languages": null}, "macro.dbt.default__get_incremental_merge_sql": {"name": "default__get_incremental_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\models\\incremental\\strategies.sql", "unique_id": "macro.dbt.default__get_incremental_merge_sql", "macro_sql": "{% macro default__get_incremental_merge_sql(arg_dict) %}\n\n {% do return(get_merge_sql(arg_dict[\"target_relation\"], arg_dict[\"temp_relation\"], arg_dict[\"unique_key\"], arg_dict[\"dest_columns\"], arg_dict[\"incremental_predicates\"])) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250505.346095, "supported_languages": null}, "macro.dbt.get_incremental_insert_overwrite_sql": {"name": "get_incremental_insert_overwrite_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\models\\incremental\\strategies.sql", "unique_id": "macro.dbt.get_incremental_insert_overwrite_sql", "macro_sql": "{% macro get_incremental_insert_overwrite_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_insert_overwrite_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_incremental_insert_overwrite_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250505.34709, "supported_languages": null}, "macro.dbt.default__get_incremental_insert_overwrite_sql": {"name": "default__get_incremental_insert_overwrite_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\models\\incremental\\strategies.sql", "unique_id": "macro.dbt.default__get_incremental_insert_overwrite_sql", "macro_sql": "{% macro default__get_incremental_insert_overwrite_sql(arg_dict) %}\n\n {% do return(get_insert_overwrite_merge_sql(arg_dict[\"target_relation\"], arg_dict[\"temp_relation\"], arg_dict[\"dest_columns\"], arg_dict[\"incremental_predicates\"])) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_insert_overwrite_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250505.34709, "supported_languages": null}, "macro.dbt.get_incremental_default_sql": {"name": "get_incremental_default_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\models\\incremental\\strategies.sql", "unique_id": "macro.dbt.get_incremental_default_sql", "macro_sql": "{% macro get_incremental_default_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_default_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_incremental_default_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250505.3480947, "supported_languages": null}, "macro.dbt.default__get_incremental_default_sql": {"name": "default__get_incremental_default_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\models\\incremental\\strategies.sql", "unique_id": "macro.dbt.default__get_incremental_default_sql", "macro_sql": "{% macro default__get_incremental_default_sql(arg_dict) %}\n\n {% do return(get_incremental_append_sql(arg_dict)) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_incremental_append_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250505.3480947, "supported_languages": null}, "macro.dbt.get_incremental_microbatch_sql": {"name": "get_incremental_microbatch_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\models\\incremental\\strategies.sql", "unique_id": "macro.dbt.get_incremental_microbatch_sql", "macro_sql": "{% macro get_incremental_microbatch_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_microbatch_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_incremental_microbatch_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250505.3480947, "supported_languages": null}, "macro.dbt.default__get_incremental_microbatch_sql": {"name": "default__get_incremental_microbatch_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\models\\incremental\\strategies.sql", "unique_id": "macro.dbt.default__get_incremental_microbatch_sql", "macro_sql": "{% macro default__get_incremental_microbatch_sql(arg_dict) %}\n\n {{ exceptions.raise_not_implemented('microbatch materialization strategy not implemented for adapter ' + adapter.type()) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "arg_dict", "type": null, "description": ""}], "created_at": 1785250505.3490868, "supported_languages": null}, "macro.dbt.get_insert_into_sql": {"name": "get_insert_into_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\models\\incremental\\strategies.sql", "original_file_path": "macros\\materializations\\models\\incremental\\strategies.sql", "unique_id": "macro.dbt.get_insert_into_sql", "macro_sql": "{% macro get_insert_into_sql(target_relation, temp_relation, dest_columns) %}\n\n {%- set dest_cols_csv = get_quoted_csv(dest_columns | map(attribute=\"name\")) -%}\n\n insert into {{ target_relation }} ({{ dest_cols_csv }})\n (\n select {{ dest_cols_csv }}\n from {{ temp_relation }}\n )\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_quoted_csv"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target_relation", "type": null, "description": ""}, {"name": "temp_relation", "type": null, "description": ""}, {"name": "dest_columns", "type": null, "description": ""}], "created_at": 1785250505.3490868, "supported_languages": null}, "macro.dbt.create_csv_table": {"name": "create_csv_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt.create_csv_table", "macro_sql": "{% macro create_csv_table(model, agate_table) -%}\n {{ adapter.dispatch('create_csv_table', 'dbt')(model, agate_table) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__create_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "agate_table", "type": null, "description": ""}], "created_at": 1785250505.351083, "supported_languages": null}, "macro.dbt.default__create_csv_table": {"name": "default__create_csv_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt.default__create_csv_table", "macro_sql": "{% macro default__create_csv_table(model, agate_table) %}\n {%- set column_override = model['config'].get('column_types', {}) -%}\n {%- set quote_seed_column = model['config'].get('quote_columns', None) -%}\n\n {% set sql %}\n create table {{ this.render() }} (\n {%- for col_name in agate_table.column_names -%}\n {%- set inferred_type = adapter.convert_type(agate_table, loop.index0) -%}\n {%- set type = column_override.get(col_name, inferred_type) -%}\n {%- set column_name = (col_name | string) -%}\n {{ adapter.quote_seed_column(column_name, quote_seed_column) }} {{ type }} {%- if not loop.last -%}, {%- endif -%}\n {%- endfor -%}\n )\n {% endset %}\n\n {% call statement('_') -%}\n {{ sql }}\n {%- endcall %}\n\n {{ return(sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "agate_table", "type": null, "description": ""}], "created_at": 1785250505.3530855, "supported_languages": null}, "macro.dbt.reset_csv_table": {"name": "reset_csv_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt.reset_csv_table", "macro_sql": "{% macro reset_csv_table(model, full_refresh, old_relation, agate_table) -%}\n {{ adapter.dispatch('reset_csv_table', 'dbt')(model, full_refresh, old_relation, agate_table) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__reset_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "full_refresh", "type": null, "description": ""}, {"name": "old_relation", "type": null, "description": ""}, {"name": "agate_table", "type": null, "description": ""}], "created_at": 1785250505.3540897, "supported_languages": null}, "macro.dbt.default__reset_csv_table": {"name": "default__reset_csv_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt.default__reset_csv_table", "macro_sql": "{% macro default__reset_csv_table(model, full_refresh, old_relation, agate_table) %}\n {% set sql = \"\" %}\n {% if full_refresh %}\n {{ adapter.drop_relation(old_relation) }}\n {% set sql = create_csv_table(model, agate_table) %}\n {% else %}\n {{ adapter.truncate_relation(old_relation) }}\n {% set sql = \"truncate table \" ~ old_relation.render() %}\n {% endif %}\n\n {{ return(sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.create_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "full_refresh", "type": null, "description": ""}, {"name": "old_relation", "type": null, "description": ""}, {"name": "agate_table", "type": null, "description": ""}], "created_at": 1785250505.3550873, "supported_languages": null}, "macro.dbt.get_csv_sql": {"name": "get_csv_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt.get_csv_sql", "macro_sql": "{% macro get_csv_sql(create_or_truncate_sql, insert_sql) %}\n {{ adapter.dispatch('get_csv_sql', 'dbt')(create_or_truncate_sql, insert_sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_csv_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "create_or_truncate_sql", "type": null, "description": ""}, {"name": "insert_sql", "type": null, "description": ""}], "created_at": 1785250505.3550873, "supported_languages": null}, "macro.dbt.default__get_csv_sql": {"name": "default__get_csv_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt.default__get_csv_sql", "macro_sql": "{% macro default__get_csv_sql(create_or_truncate_sql, insert_sql) %}\n {{ create_or_truncate_sql }};\n -- dbt seed --\n {{ insert_sql }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "create_or_truncate_sql", "type": null, "description": ""}, {"name": "insert_sql", "type": null, "description": ""}], "created_at": 1785250505.3550873, "supported_languages": null}, "macro.dbt.get_binding_char": {"name": "get_binding_char", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt.get_binding_char", "macro_sql": "{% macro get_binding_char() -%}\n {{ adapter.dispatch('get_binding_char', 'dbt')() }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_binding_char"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.3560967, "supported_languages": null}, "macro.dbt.default__get_binding_char": {"name": "default__get_binding_char", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt.default__get_binding_char", "macro_sql": "{% macro default__get_binding_char() %}\n {{ return('%s') }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.3560967, "supported_languages": null}, "macro.dbt.get_batch_size": {"name": "get_batch_size", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt.get_batch_size", "macro_sql": "{% macro get_batch_size() -%}\n {{ return(adapter.dispatch('get_batch_size', 'dbt')()) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_batch_size"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.3560967, "supported_languages": null}, "macro.dbt.default__get_batch_size": {"name": "default__get_batch_size", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt.default__get_batch_size", "macro_sql": "{% macro default__get_batch_size() %}\n {{ return(10000) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.3560967, "supported_languages": null}, "macro.dbt.get_seed_column_quoted_csv": {"name": "get_seed_column_quoted_csv", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt.get_seed_column_quoted_csv", "macro_sql": "{% macro get_seed_column_quoted_csv(model, column_names) %}\n {%- set quote_seed_column = model['config'].get('quote_columns', None) -%}\n {% set quoted = [] %}\n {% for col in column_names -%}\n {%- do quoted.append(adapter.quote_seed_column(col, quote_seed_column)) -%}\n {%- endfor %}\n\n {%- set dest_cols_csv = quoted | join(', ') -%}\n {{ return(dest_cols_csv) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_names", "type": null, "description": ""}], "created_at": 1785250505.358094, "supported_languages": null}, "macro.dbt.load_csv_rows": {"name": "load_csv_rows", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt.load_csv_rows", "macro_sql": "{% macro load_csv_rows(model, agate_table) -%}\n {{ adapter.dispatch('load_csv_rows', 'dbt')(model, agate_table) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__load_csv_rows"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "agate_table", "type": null, "description": ""}], "created_at": 1785250505.358094, "supported_languages": null}, "macro.dbt.default__load_csv_rows": {"name": "default__load_csv_rows", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\seeds\\helpers.sql", "original_file_path": "macros\\materializations\\seeds\\helpers.sql", "unique_id": "macro.dbt.default__load_csv_rows", "macro_sql": "{% macro default__load_csv_rows(model, agate_table) %}\n\n {% set batch_size = get_batch_size() %}\n\n {% set cols_sql = get_seed_column_quoted_csv(model, agate_table.column_names) %}\n {% set bindings = [] %}\n\n {% set statements = [] %}\n\n {% for chunk in agate_table.rows | batch(batch_size) %}\n {% set bindings = [] %}\n\n {% for row in chunk %}\n {% do bindings.extend(row) %}\n {% endfor %}\n\n {% set sql %}\n insert into {{ this.render() }} ({{ cols_sql }}) values\n {% for row in chunk -%}\n ({%- for column in agate_table.column_names -%}\n {{ get_binding_char() }}\n {%- if not loop.last%},{%- endif %}\n {%- endfor -%})\n {%- if not loop.last%},{%- endif %}\n {%- endfor %}\n {% endset %}\n\n {% do adapter.add_query(sql, bindings=bindings, abridge_sql_log=True) %}\n\n {% if loop.index0 == 0 %}\n {% do statements.append(sql) %}\n {% endif %}\n {% endfor %}\n\n {# Return SQL so we can render it out into the compiled files #}\n {{ return(statements[0]) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_batch_size", "macro.dbt.get_seed_column_quoted_csv", "macro.dbt.get_binding_char"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "agate_table", "type": null, "description": ""}], "created_at": 1785250505.361087, "supported_languages": null}, "macro.dbt.materialization_seed_default": {"name": "materialization_seed_default", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\seeds\\seed.sql", "original_file_path": "macros\\materializations\\seeds\\seed.sql", "unique_id": "macro.dbt.materialization_seed_default", "macro_sql": "{% materialization seed, default %}\n\n {%- set identifier = model['alias'] -%}\n {%- set full_refresh_mode = (should_full_refresh()) -%}\n\n {%- set old_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier) -%}\n\n {%- set exists_as_table = (old_relation is not none and old_relation.is_table) -%}\n {%- set exists_as_view = (old_relation is not none and old_relation.is_view) -%}\n\n {%- set grant_config = config.get('grants') -%}\n {%- set agate_table = load_agate_table() -%}\n -- grab current tables grants config for comparison later on\n\n {%- do store_result('agate_table', response='OK', agate_table=agate_table) -%}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n -- build model\n {% set create_table_sql = \"\" %}\n {% if exists_as_view %}\n {{ exceptions.raise_compiler_error(\"Cannot seed to '{}', it is a view\".format(old_relation.render())) }}\n {% elif exists_as_table %}\n {% set create_table_sql = reset_csv_table(model, full_refresh_mode, old_relation, agate_table) %}\n {% else %}\n {% set create_table_sql = create_csv_table(model, agate_table) %}\n {% endif %}\n\n {% set code = 'CREATE' if full_refresh_mode else 'INSERT' %}\n {% set rows_affected = (agate_table.rows | length) %}\n {% set sql = \"\" %}\n {% if rows_affected > 0 %}\n {% set sql = load_csv_rows(model, agate_table) %}\n {% endif %}\n\n {% call noop_statement('main', code ~ ' ' ~ rows_affected, code, rows_affected) %}\n {{ get_csv_sql(create_table_sql, sql) }};\n {% endcall %}\n\n {% set target_relation = this.incorporate(type='table') %}\n\n {% set should_revoke = should_revoke(old_relation, full_refresh_mode) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {% if full_refresh_mode or not exists_as_table %}\n {% do create_indexes(target_relation) %}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n -- `COMMIT` happens here\n {{ adapter.commit() }}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.should_full_refresh", "macro.dbt.run_hooks", "macro.dbt.reset_csv_table", "macro.dbt.create_csv_table", "macro.dbt.load_csv_rows", "macro.dbt.noop_statement", "macro.dbt.get_csv_sql", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs", "macro.dbt.create_indexes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.3660922, "supported_languages": ["sql"]}, "macro.dbt.create_columns": {"name": "create_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.create_columns", "macro_sql": "{% macro create_columns(relation, columns) %}\n {{ adapter.dispatch('create_columns', 'dbt')(relation, columns) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__create_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "columns", "type": null, "description": ""}], "created_at": 1785250505.3700848, "supported_languages": null}, "macro.dbt.default__create_columns": {"name": "default__create_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.default__create_columns", "macro_sql": "{% macro default__create_columns(relation, columns) %}\n {% for column in columns %}\n {% call statement() %}\n alter table {{ relation.render() }} add column {{ adapter.quote(column.name) }} {{ column.expanded_data_type }};\n {% endcall %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "columns", "type": null, "description": ""}], "created_at": 1785250505.3710902, "supported_languages": null}, "macro.dbt.post_snapshot": {"name": "post_snapshot", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.post_snapshot", "macro_sql": "{% macro post_snapshot(staging_relation) %}\n {{ adapter.dispatch('post_snapshot', 'dbt')(staging_relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__post_snapshot"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "staging_relation", "type": null, "description": ""}], "created_at": 1785250505.3720887, "supported_languages": null}, "macro.dbt.default__post_snapshot": {"name": "default__post_snapshot", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.default__post_snapshot", "macro_sql": "{% macro default__post_snapshot(staging_relation) %}\n {# no-op #}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "staging_relation", "type": null, "description": ""}], "created_at": 1785250505.3720887, "supported_languages": null}, "macro.dbt.get_true_sql": {"name": "get_true_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.get_true_sql", "macro_sql": "{% macro get_true_sql() %}\n {{ adapter.dispatch('get_true_sql', 'dbt')() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_true_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.3720887, "supported_languages": null}, "macro.dbt.default__get_true_sql": {"name": "default__get_true_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.default__get_true_sql", "macro_sql": "{% macro default__get_true_sql() %}\n {{ return('TRUE') }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.3720887, "supported_languages": null}, "macro.dbt.snapshot_staging_table": {"name": "snapshot_staging_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.snapshot_staging_table", "macro_sql": "{% macro snapshot_staging_table(strategy, source_sql, target_relation) -%}\n {{ adapter.dispatch('snapshot_staging_table', 'dbt')(strategy, source_sql, target_relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__snapshot_staging_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "strategy", "type": null, "description": ""}, {"name": "source_sql", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.373086, "supported_languages": null}, "macro.dbt.get_snapshot_table_column_names": {"name": "get_snapshot_table_column_names", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.get_snapshot_table_column_names", "macro_sql": "{% macro get_snapshot_table_column_names() %}\n {{ return({'dbt_valid_to': 'dbt_valid_to', 'dbt_valid_from': 'dbt_valid_from', 'dbt_scd_id': 'dbt_scd_id', 'dbt_updated_at': 'dbt_updated_at', 'dbt_is_deleted': 'dbt_is_deleted'}) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.373086, "supported_languages": null}, "macro.dbt.default__snapshot_staging_table": {"name": "default__snapshot_staging_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.default__snapshot_staging_table", "macro_sql": "{% macro default__snapshot_staging_table(strategy, source_sql, target_relation) -%}\n {% set columns = config.get('snapshot_table_column_names') or get_snapshot_table_column_names() %}\n {% if strategy.hard_deletes == 'new_record' %}\n {% set new_scd_id = snapshot_hash_arguments([columns.dbt_scd_id, snapshot_get_time()]) %}\n {% endif %}\n with snapshot_query as (\n\n {{ source_sql }}\n\n ),\n\n snapshotted_data as (\n\n select *, {{ unique_key_fields(strategy.unique_key) }}\n from {{ target_relation }}\n where\n {% if config.get('dbt_valid_to_current') %}\n\t\t{% set source_unique_key = columns.dbt_valid_to | trim %}\n\t\t{% set target_unique_key = config.get('dbt_valid_to_current') | trim %}\n\n\t\t{# The exact equals semantics between NULL values depends on the current behavior flag set. Also, update records if the source field is null #}\n ( {{ equals(source_unique_key, target_unique_key) }} or {{ source_unique_key }} is null )\n {% else %}\n {{ columns.dbt_valid_to }} is null\n {% endif %}\n\n ),\n\n insertions_source_data as (\n\n select *, {{ unique_key_fields(strategy.unique_key) }},\n {{ strategy.updated_at }} as {{ columns.dbt_updated_at }},\n {{ strategy.updated_at }} as {{ columns.dbt_valid_from }},\n {{ get_dbt_valid_to_current(strategy, columns) }},\n {{ strategy.scd_id }} as {{ columns.dbt_scd_id }}\n\n from snapshot_query\n ),\n\n updates_source_data as (\n\n select *, {{ unique_key_fields(strategy.unique_key) }},\n {{ strategy.updated_at }} as {{ columns.dbt_updated_at }},\n {{ strategy.updated_at }} as {{ columns.dbt_valid_from }},\n {{ strategy.updated_at }} as {{ columns.dbt_valid_to }}\n\n from snapshot_query\n ),\n\n {%- if strategy.hard_deletes == 'invalidate' or strategy.hard_deletes == 'new_record' %}\n\n deletes_source_data as (\n\n select *, {{ unique_key_fields(strategy.unique_key) }}\n from snapshot_query\n ),\n {% endif %}\n\n insertions as (\n\n select\n 'insert' as dbt_change_type,\n source_data.*\n {%- if strategy.hard_deletes == 'new_record' -%}\n ,'False' as {{ columns.dbt_is_deleted }}\n {%- endif %}\n\n from insertions_source_data as source_data\n left outer join snapshotted_data\n on {{ unique_key_join_on(strategy.unique_key, \"snapshotted_data\", \"source_data\") }}\n where {{ unique_key_is_null(strategy.unique_key, \"snapshotted_data\") }}\n or ({{ unique_key_is_not_null(strategy.unique_key, \"snapshotted_data\") }} and (\n {{ strategy.row_changed }} {%- if strategy.hard_deletes == 'new_record' -%} or snapshotted_data.{{ columns.dbt_is_deleted }} = 'True' {% endif %}\n )\n\n )\n\n ),\n\n updates as (\n\n select\n 'update' as dbt_change_type,\n source_data.*,\n snapshotted_data.{{ columns.dbt_scd_id }}\n {%- if strategy.hard_deletes == 'new_record' -%}\n , snapshotted_data.{{ columns.dbt_is_deleted }}\n {%- endif %}\n\n from updates_source_data as source_data\n join snapshotted_data\n on {{ unique_key_join_on(strategy.unique_key, \"snapshotted_data\", \"source_data\") }}\n where (\n {{ strategy.row_changed }} {%- if strategy.hard_deletes == 'new_record' -%} or snapshotted_data.{{ columns.dbt_is_deleted }} = 'True' {% endif %}\n )\n )\n\n {%- if strategy.hard_deletes == 'invalidate' or strategy.hard_deletes == 'new_record' %}\n ,\n deletes as (\n\n select\n 'delete' as dbt_change_type,\n source_data.*,\n {{ snapshot_get_time() }} as {{ columns.dbt_valid_from }},\n {{ snapshot_get_time() }} as {{ columns.dbt_updated_at }},\n {{ snapshot_get_time() }} as {{ columns.dbt_valid_to }},\n snapshotted_data.{{ columns.dbt_scd_id }}\n {%- if strategy.hard_deletes == 'new_record' -%}\n , snapshotted_data.{{ columns.dbt_is_deleted }}\n {%- endif %}\n from snapshotted_data\n left join deletes_source_data as source_data\n on {{ unique_key_join_on(strategy.unique_key, \"snapshotted_data\", \"source_data\") }}\n where {{ unique_key_is_null(strategy.unique_key, \"source_data\") }}\n\n {%- if strategy.hard_deletes == 'new_record' %}\n and not (\n --avoid updating the record's valid_to if the latest entry is marked as deleted\n snapshotted_data.{{ columns.dbt_is_deleted }} = 'True'\n and\n {% if config.get('dbt_valid_to_current') -%}\n snapshotted_data.{{ columns.dbt_valid_to }} = {{ config.get('dbt_valid_to_current') }}\n {%- else -%}\n snapshotted_data.{{ columns.dbt_valid_to }} is null\n {%- endif %}\n )\n {%- endif %}\n )\n {%- endif %}\n\n {%- if strategy.hard_deletes == 'new_record' %}\n {% set snapshotted_cols = get_list_of_column_names(get_columns_in_relation(target_relation)) %}\n {% set source_col_names = get_columns_in_query(source_sql) %}\n ,\n deletion_records as (\n\n select\n 'insert' as dbt_change_type,\n {%- for col_name in source_col_names -%}\n {%- if col_name in snapshotted_cols -%}\n snapshotted_data.{{ adapter.quote(col_name) }},\n {%- else -%}\n source_data.{{ adapter.quote(col_name) }},\n {%- endif -%}\n {% endfor -%}\n {%- if strategy.unique_key | is_list -%}\n {%- for key in strategy.unique_key -%}\n snapshotted_data.{{ key }} as dbt_unique_key_{{ loop.index }},\n {% endfor -%}\n {%- else -%}\n snapshotted_data.dbt_unique_key as dbt_unique_key,\n {% endif -%}\n {{ snapshot_get_time() }} as {{ columns.dbt_valid_from }},\n {{ snapshot_get_time() }} as {{ columns.dbt_updated_at }},\n snapshotted_data.{{ columns.dbt_valid_to }} as {{ columns.dbt_valid_to }},\n {{ new_scd_id }} as {{ columns.dbt_scd_id }},\n 'True' as {{ columns.dbt_is_deleted }}\n from snapshotted_data\n left join deletes_source_data as source_data\n on {{ unique_key_join_on(strategy.unique_key, \"snapshotted_data\", \"source_data\") }}\n where {{ unique_key_is_null(strategy.unique_key, \"source_data\") }}\n and not (\n --avoid inserting a new record if the latest one is marked as deleted\n snapshotted_data.{{ columns.dbt_is_deleted }} = 'True'\n and\n {% if config.get('dbt_valid_to_current') -%}\n snapshotted_data.{{ columns.dbt_valid_to }} = {{ config.get('dbt_valid_to_current') }}\n {%- else -%}\n snapshotted_data.{{ columns.dbt_valid_to }} is null\n {%- endif %}\n )\n\n )\n {%- endif %}\n\n select * from insertions\n union all\n select * from updates\n {%- if strategy.hard_deletes == 'invalidate' or strategy.hard_deletes == 'new_record' %}\n union all\n select * from deletes\n {%- endif %}\n {%- if strategy.hard_deletes == 'new_record' %}\n union all\n select * from deletion_records\n {%- endif %}\n\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_snapshot_table_column_names", "macro.dbt.snapshot_hash_arguments", "macro.dbt.snapshot_get_time", "macro.dbt.unique_key_fields", "macro.dbt.equals", "macro.dbt.get_dbt_valid_to_current", "macro.dbt.unique_key_join_on", "macro.dbt.unique_key_is_null", "macro.dbt.unique_key_is_not_null", "macro.dbt.get_list_of_column_names", "macro.dbt.get_columns_in_relation", "macro.dbt.get_columns_in_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "strategy", "type": null, "description": ""}, {"name": "source_sql", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.3831084, "supported_languages": null}, "macro.dbt.build_snapshot_table": {"name": "build_snapshot_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.build_snapshot_table", "macro_sql": "{% macro build_snapshot_table(strategy, sql) -%}\n {{ adapter.dispatch('build_snapshot_table', 'dbt')(strategy, sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__build_snapshot_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "strategy", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.3831084, "supported_languages": null}, "macro.dbt.default__build_snapshot_table": {"name": "default__build_snapshot_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.default__build_snapshot_table", "macro_sql": "{% macro default__build_snapshot_table(strategy, sql) %}\n {% set columns = config.get('snapshot_table_column_names') or get_snapshot_table_column_names() %}\n\n select *,\n {{ strategy.scd_id }} as {{ columns.dbt_scd_id }},\n {{ strategy.updated_at }} as {{ columns.dbt_updated_at }},\n {{ strategy.updated_at }} as {{ columns.dbt_valid_from }},\n {{ get_dbt_valid_to_current(strategy, columns) }}\n {%- if strategy.hard_deletes == 'new_record' -%}\n , 'False' as {{ columns.dbt_is_deleted }}\n {% endif -%}\n from (\n {{ sql }}\n ) sbq\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_snapshot_table_column_names", "macro.dbt.get_dbt_valid_to_current"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "strategy", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.3841174, "supported_languages": null}, "macro.dbt.build_snapshot_staging_table": {"name": "build_snapshot_staging_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.build_snapshot_staging_table", "macro_sql": "{% macro build_snapshot_staging_table(strategy, sql, target_relation) %}\n {% set temp_relation = make_temp_relation(target_relation) %}\n\n {% set select = snapshot_staging_table(strategy, sql, target_relation) %}\n\n {% call statement('build_snapshot_staging_relation') %}\n {{ create_table_as(True, temp_relation, select) }}\n {% endcall %}\n\n {% do return(temp_relation) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.make_temp_relation", "macro.dbt.snapshot_staging_table", "macro.dbt.statement", "macro.dbt.create_table_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "strategy", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}], "created_at": 1785250505.3851087, "supported_languages": null}, "macro.dbt.get_updated_at_column_data_type": {"name": "get_updated_at_column_data_type", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.get_updated_at_column_data_type", "macro_sql": "{% macro get_updated_at_column_data_type(snapshot_sql) %}\n {% set snapshot_sql_column_schema = get_column_schema_from_query(snapshot_sql) %}\n {% set dbt_updated_at_data_type = null %}\n {% set ns = namespace() -%} {#-- handle for-loop scoping with a namespace --#}\n {% set ns.dbt_updated_at_data_type = null -%}\n {% for column in snapshot_sql_column_schema %}\n {% if ((column.column == 'dbt_updated_at') or (column.column == 'DBT_UPDATED_AT')) %}\n {% set ns.dbt_updated_at_data_type = column.dtype %}\n {% endif %}\n {% endfor %}\n {{ return(ns.dbt_updated_at_data_type or none) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_column_schema_from_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "snapshot_sql", "type": null, "description": ""}], "created_at": 1785250505.3871095, "supported_languages": null}, "macro.dbt.check_time_data_types": {"name": "check_time_data_types", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.check_time_data_types", "macro_sql": "{% macro check_time_data_types(sql) %}\n {% set dbt_updated_at_data_type = get_updated_at_column_data_type(sql) %}\n {% set snapshot_get_time_data_type = get_snapshot_get_time_data_type() %}\n {% if snapshot_get_time_data_type is not none and dbt_updated_at_data_type is not none and snapshot_get_time_data_type != dbt_updated_at_data_type %}\n {% if exceptions.warn_snapshot_timestamp_data_types %}\n {{ exceptions.warn_snapshot_timestamp_data_types(snapshot_get_time_data_type, dbt_updated_at_data_type) }}\n {% endif %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_updated_at_column_data_type", "macro.dbt.get_snapshot_get_time_data_type"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.3881187, "supported_languages": null}, "macro.dbt.get_dbt_valid_to_current": {"name": "get_dbt_valid_to_current", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.get_dbt_valid_to_current", "macro_sql": "{% macro get_dbt_valid_to_current(strategy, columns) %}\n {% set dbt_valid_to_current = config.get('dbt_valid_to_current') or \"null\" %}\n coalesce(nullif({{ strategy.updated_at }}, {{ strategy.updated_at }}), {{dbt_valid_to_current}})\n as {{ columns.dbt_valid_to }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "strategy", "type": null, "description": ""}, {"name": "columns", "type": null, "description": ""}], "created_at": 1785250505.3881187, "supported_languages": null}, "macro.dbt.unique_key_fields": {"name": "unique_key_fields", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.unique_key_fields", "macro_sql": "{% macro unique_key_fields(unique_key) %}\n {% if unique_key | is_list %}\n {% for key in unique_key %}\n {{ key }} as dbt_unique_key_{{ loop.index }}\n {%- if not loop.last %} , {%- endif %}\n {% endfor %}\n {% else %}\n {{ unique_key }} as dbt_unique_key\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "unique_key", "type": null, "description": ""}], "created_at": 1785250505.3891103, "supported_languages": null}, "macro.dbt.unique_key_join_on": {"name": "unique_key_join_on", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.unique_key_join_on", "macro_sql": "{% macro unique_key_join_on(unique_key, identifier, from_identifier) %}\n {% if unique_key | is_list %}\n {% for key in unique_key %}\n\t {% set source_unique_key = (identifier ~ \".dbt_unique_key_\" ~ loop.index) | trim %}\n\t {% set target_unique_key = (from_identifier ~ \".dbt_unique_key_\" ~ loop.index) | trim %}\n\t {{ equals(source_unique_key, target_unique_key) }}\n {%- if not loop.last %} and {%- endif %}\n {% endfor %}\n {% else %}\n {{ identifier }}.dbt_unique_key = {{ from_identifier }}.dbt_unique_key\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.equals"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "unique_key", "type": null, "description": ""}, {"name": "identifier", "type": null, "description": ""}, {"name": "from_identifier", "type": null, "description": ""}], "created_at": 1785250505.3901186, "supported_languages": null}, "macro.dbt.unique_key_is_null": {"name": "unique_key_is_null", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.unique_key_is_null", "macro_sql": "{% macro unique_key_is_null(unique_key, identifier) %}\n {% if unique_key | is_list %}\n {{ identifier }}.dbt_unique_key_1 is null\n {% else %}\n {{ identifier }}.dbt_unique_key is null\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "unique_key", "type": null, "description": ""}, {"name": "identifier", "type": null, "description": ""}], "created_at": 1785250505.3911092, "supported_languages": null}, "macro.dbt.unique_key_is_not_null": {"name": "unique_key_is_not_null", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\helpers.sql", "original_file_path": "macros\\materializations\\snapshots\\helpers.sql", "unique_id": "macro.dbt.unique_key_is_not_null", "macro_sql": "{% macro unique_key_is_not_null(unique_key, identifier) %}\n {% if unique_key | is_list %}\n {{ identifier }}.dbt_unique_key_1 is not null\n {% else %}\n {{ identifier }}.dbt_unique_key is not null\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "unique_key", "type": null, "description": ""}, {"name": "identifier", "type": null, "description": ""}], "created_at": 1785250505.3911092, "supported_languages": null}, "macro.dbt.materialization_snapshot_default": {"name": "materialization_snapshot_default", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\snapshot.sql", "original_file_path": "macros\\materializations\\snapshots\\snapshot.sql", "unique_id": "macro.dbt.materialization_snapshot_default", "macro_sql": "{% materialization snapshot, default %}\n\n {%- set target_table = model.get('alias', model.get('name')) -%}\n\n {%- set strategy_name = config.get('strategy') -%}\n {%- set unique_key = config.get('unique_key') %}\n -- grab current tables grants config for comparision later on\n {%- set grant_config = config.get('grants') -%}\n\n {% set target_relation_exists, target_relation = get_or_create_relation(\n database=model.database,\n schema=model.schema,\n identifier=target_table,\n type='table') -%}\n\n {%- if not target_relation.is_table -%}\n {% do exceptions.relation_wrong_type(target_relation, 'table') %}\n {%- endif -%}\n\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n {% set strategy_macro = strategy_dispatch(strategy_name) %}\n {# The model['config'] parameter below is no longer used, but passing anyway for compatibility #}\n {# It was a dictionary of config, instead of the config object from the context #}\n {% set strategy = strategy_macro(model, \"snapshotted_data\", \"source_data\", model['config'], target_relation_exists) %}\n\n {% if not target_relation_exists %}\n\n {% set build_sql = build_snapshot_table(strategy, model['compiled_code']) %}\n {% set build_or_select_sql = build_sql %}\n {% set final_sql = create_table_as(False, target_relation, build_sql) %}\n\n {% else %}\n\n {% set columns = config.get(\"snapshot_table_column_names\") or get_snapshot_table_column_names() %}\n\n {{ adapter.assert_valid_snapshot_target_given_strategy(target_relation, columns, strategy) }}\n\n {% set build_or_select_sql = snapshot_staging_table(strategy, sql, target_relation) %}\n {% set staging_table = build_snapshot_staging_table(strategy, sql, target_relation) %}\n\n -- this may no-op if the database does not require column expansion\n {% do adapter.expand_target_column_types(from_relation=staging_table,\n to_relation=target_relation) %}\n\n {% set remove_columns = ['dbt_change_type', 'DBT_CHANGE_TYPE', 'dbt_unique_key', 'DBT_UNIQUE_KEY'] %}\n {% if unique_key | is_list %}\n {% for key in strategy.unique_key %}\n {{ remove_columns.append('dbt_unique_key_' + loop.index|string) }}\n {{ remove_columns.append('DBT_UNIQUE_KEY_' + loop.index|string) }}\n {% endfor %}\n {% endif %}\n\n {% set missing_columns = adapter.get_missing_columns(staging_table, target_relation)\n | rejectattr('name', 'in', remove_columns)\n | list %}\n\n {% do create_columns(target_relation, missing_columns) %}\n\n {% set source_columns = adapter.get_columns_in_relation(staging_table)\n | rejectattr('name', 'in', remove_columns)\n | list %}\n\n {% set quoted_source_columns = [] %}\n {% for column in source_columns %}\n {% do quoted_source_columns.append(adapter.quote(column.name)) %}\n {% endfor %}\n\n {% set final_sql = snapshot_merge_sql(\n target = target_relation,\n source = staging_table,\n insert_cols = quoted_source_columns\n )\n %}\n\n {% endif %}\n\n\n {{ check_time_data_types(build_or_select_sql) }}\n\n {% call statement('main') %}\n {{ final_sql }}\n {% endcall %}\n\n {% set should_revoke = should_revoke(target_relation_exists, full_refresh_mode=False) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {% if not target_relation_exists %}\n {% do create_indexes(target_relation) %}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n {{ adapter.commit() }}\n\n {% if staging_table is defined %}\n {% do post_snapshot(staging_table) %}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.get_or_create_relation", "macro.dbt.run_hooks", "macro.dbt.strategy_dispatch", "macro.dbt.build_snapshot_table", "macro.dbt.create_table_as", "macro.dbt.get_snapshot_table_column_names", "macro.dbt.snapshot_staging_table", "macro.dbt.build_snapshot_staging_table", "macro.dbt.create_columns", "macro.dbt.snapshot_merge_sql", "macro.dbt.check_time_data_types", "macro.dbt.statement", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs", "macro.dbt.create_indexes", "macro.dbt.post_snapshot"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.3996394, "supported_languages": ["sql"]}, "macro.dbt.snapshot_merge_sql": {"name": "snapshot_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\snapshot_merge.sql", "original_file_path": "macros\\materializations\\snapshots\\snapshot_merge.sql", "unique_id": "macro.dbt.snapshot_merge_sql", "macro_sql": "{% macro snapshot_merge_sql(target, source, insert_cols) -%}\n {{ adapter.dispatch('snapshot_merge_sql', 'dbt')(target, source, insert_cols) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__snapshot_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target", "type": null, "description": ""}, {"name": "source", "type": null, "description": ""}, {"name": "insert_cols", "type": null, "description": ""}], "created_at": 1785250505.400637, "supported_languages": null}, "macro.dbt.default__snapshot_merge_sql": {"name": "default__snapshot_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\snapshot_merge.sql", "original_file_path": "macros\\materializations\\snapshots\\snapshot_merge.sql", "unique_id": "macro.dbt.default__snapshot_merge_sql", "macro_sql": "{% macro default__snapshot_merge_sql(target, source, insert_cols) -%}\n {%- set insert_cols_csv = insert_cols | join(', ') -%}\n\n {%- set columns = config.get(\"snapshot_table_column_names\") or get_snapshot_table_column_names() -%}\n\n merge into {{ target.render() }} as DBT_INTERNAL_DEST\n using {{ source }} as DBT_INTERNAL_SOURCE\n on DBT_INTERNAL_SOURCE.{{ columns.dbt_scd_id }} = DBT_INTERNAL_DEST.{{ columns.dbt_scd_id }}\n\n when matched\n {% if config.get(\"dbt_valid_to_current\") %}\n\t{% set source_unique_key = (\"DBT_INTERNAL_DEST.\" ~ columns.dbt_valid_to) | trim %}\n\t{% set target_unique_key = config.get('dbt_valid_to_current') | trim %}\n\tand ({{ equals(source_unique_key, target_unique_key) }} or {{ source_unique_key }} is null)\n\n {% else %}\n and DBT_INTERNAL_DEST.{{ columns.dbt_valid_to }} is null\n {% endif %}\n and DBT_INTERNAL_SOURCE.dbt_change_type in ('update', 'delete')\n then update\n set {{ columns.dbt_valid_to }} = DBT_INTERNAL_SOURCE.{{ columns.dbt_valid_to }}\n\n when not matched\n and DBT_INTERNAL_SOURCE.dbt_change_type = 'insert'\n then insert ({{ insert_cols_csv }})\n values ({{ insert_cols_csv }})\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_snapshot_table_column_names", "macro.dbt.equals"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "target", "type": null, "description": ""}, {"name": "source", "type": null, "description": ""}, {"name": "insert_cols", "type": null, "description": ""}], "created_at": 1785250505.4026322, "supported_languages": null}, "macro.dbt.strategy_dispatch": {"name": "strategy_dispatch", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\strategies.sql", "original_file_path": "macros\\materializations\\snapshots\\strategies.sql", "unique_id": "macro.dbt.strategy_dispatch", "macro_sql": "{% macro strategy_dispatch(name) -%}\n{% set original_name = name %}\n {% if '.' in name %}\n {% set package_name, name = name.split(\".\", 1) %}\n {% else %}\n {% set package_name = none %}\n {% endif %}\n\n {% if package_name is none %}\n {% set package_context = context %}\n {% elif package_name in context %}\n {% set package_context = context[package_name] %}\n {% else %}\n {% set error_msg %}\n Could not find package '{{package_name}}', called with '{{original_name}}'\n {% endset %}\n {{ exceptions.raise_compiler_error(error_msg | trim) }}\n {% endif %}\n\n {%- set search_name = 'snapshot_' ~ name ~ '_strategy' -%}\n\n {% if search_name not in package_context %}\n {% set error_msg %}\n The specified strategy macro '{{name}}' was not found in package '{{ package_name }}'\n {% endset %}\n {{ exceptions.raise_compiler_error(error_msg | trim) }}\n {% endif %}\n {{ return(package_context[search_name]) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "name", "type": null, "description": ""}], "created_at": 1785250505.4066327, "supported_languages": null}, "macro.dbt.snapshot_hash_arguments": {"name": "snapshot_hash_arguments", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\strategies.sql", "original_file_path": "macros\\materializations\\snapshots\\strategies.sql", "unique_id": "macro.dbt.snapshot_hash_arguments", "macro_sql": "{% macro snapshot_hash_arguments(args) -%}\n {{ adapter.dispatch('snapshot_hash_arguments', 'dbt')(args) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__snapshot_hash_arguments"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "args", "type": null, "description": ""}], "created_at": 1785250505.4076393, "supported_languages": null}, "macro.dbt.default__snapshot_hash_arguments": {"name": "default__snapshot_hash_arguments", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\strategies.sql", "original_file_path": "macros\\materializations\\snapshots\\strategies.sql", "unique_id": "macro.dbt.default__snapshot_hash_arguments", "macro_sql": "{% macro default__snapshot_hash_arguments(args) -%}\n md5({%- for arg in args -%}\n coalesce(cast({{ arg }} as varchar ), '')\n {% if not loop.last %} || '|' || {% endif %}\n {%- endfor -%})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "args", "type": null, "description": ""}], "created_at": 1785250505.4076393, "supported_languages": null}, "macro.dbt.snapshot_timestamp_strategy": {"name": "snapshot_timestamp_strategy", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\strategies.sql", "original_file_path": "macros\\materializations\\snapshots\\strategies.sql", "unique_id": "macro.dbt.snapshot_timestamp_strategy", "macro_sql": "{% macro snapshot_timestamp_strategy(node, snapshotted_rel, current_rel, model_config, target_exists) %}\n {# The model_config parameter is no longer used, but is passed in anyway for compatibility. #}\n {% set primary_key = config.get('unique_key') %}\n {% set updated_at = config.get('updated_at') %}\n {% set hard_deletes = adapter.get_hard_deletes_behavior(config) %}\n {% set invalidate_hard_deletes = hard_deletes == 'invalidate' %}\n {% set columns = config.get(\"snapshot_table_column_names\") or get_snapshot_table_column_names() %}\n\n {#/*\n The snapshot relation might not have an {{ updated_at }} value if the\n snapshot strategy is changed from `check` to `timestamp`. We\n should use a dbt-created column for the comparison in the snapshot\n table instead of assuming that the user-supplied {{ updated_at }}\n will be present in the historical data.\n\n See https://github.com/dbt-labs/dbt-core/issues/2350\n */ #}\n {% set row_changed_expr -%}\n ({{ snapshotted_rel }}.{{ columns.dbt_valid_from }} < {{ current_rel }}.{{ updated_at }})\n {%- endset %}\n\n {% set scd_args = api.Relation.scd_args(primary_key, updated_at) %}\n {% set scd_id_expr = snapshot_hash_arguments(scd_args) %}\n\n {% do return({\n \"unique_key\": primary_key,\n \"updated_at\": updated_at,\n \"row_changed\": row_changed_expr,\n \"scd_id\": scd_id_expr,\n \"invalidate_hard_deletes\": invalidate_hard_deletes,\n \"hard_deletes\": hard_deletes\n }) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_snapshot_table_column_names", "macro.dbt.snapshot_hash_arguments"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "node", "type": null, "description": ""}, {"name": "snapshotted_rel", "type": null, "description": ""}, {"name": "current_rel", "type": null, "description": ""}, {"name": "model_config", "type": null, "description": ""}, {"name": "target_exists", "type": null, "description": ""}], "created_at": 1785250505.4096353, "supported_languages": null}, "macro.dbt.snapshot_string_as_time": {"name": "snapshot_string_as_time", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\strategies.sql", "original_file_path": "macros\\materializations\\snapshots\\strategies.sql", "unique_id": "macro.dbt.snapshot_string_as_time", "macro_sql": "{% macro snapshot_string_as_time(timestamp) -%}\n {{ adapter.dispatch('snapshot_string_as_time', 'dbt')(timestamp) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__snapshot_string_as_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "timestamp", "type": null, "description": ""}], "created_at": 1785250505.410636, "supported_languages": null}, "macro.dbt.default__snapshot_string_as_time": {"name": "default__snapshot_string_as_time", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\strategies.sql", "original_file_path": "macros\\materializations\\snapshots\\strategies.sql", "unique_id": "macro.dbt.default__snapshot_string_as_time", "macro_sql": "{% macro default__snapshot_string_as_time(timestamp) %}\n {% do exceptions.raise_not_implemented(\n 'snapshot_string_as_time macro not implemented for adapter '+adapter.type()\n ) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "timestamp", "type": null, "description": ""}], "created_at": 1785250505.410636, "supported_languages": null}, "macro.dbt.snapshot_check_all_get_existing_columns": {"name": "snapshot_check_all_get_existing_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\strategies.sql", "original_file_path": "macros\\materializations\\snapshots\\strategies.sql", "unique_id": "macro.dbt.snapshot_check_all_get_existing_columns", "macro_sql": "{% macro snapshot_check_all_get_existing_columns(node, target_exists, check_cols_config) -%}\n {%- if not target_exists -%}\n {#-- no table yet -> return whatever the query does --#}\n {{ return((false, query_columns)) }}\n {%- endif -%}\n\n {#-- handle any schema changes --#}\n {%- set target_relation = adapter.get_relation(database=node.database, schema=node.schema, identifier=node.alias) -%}\n\n {% if check_cols_config == 'all' %}\n {%- set query_columns = get_columns_in_query(node['compiled_code']) -%}\n\n {% elif check_cols_config is iterable and (check_cols_config | length) > 0 %}\n {#-- query for proper casing/quoting, to support comparison below --#}\n {%- set select_check_cols_from_target -%}\n {#-- N.B. The whitespace below is necessary to avoid edge case issue with comments --#}\n {#-- See: https://github.com/dbt-labs/dbt-core/issues/6781 --#}\n select {{ check_cols_config | join(', ') }} from (\n {{ node['compiled_code'] }}\n ) subq\n {%- endset -%}\n {% set query_columns = get_columns_in_query(select_check_cols_from_target) %}\n\n {% else %}\n {% do exceptions.raise_compiler_error(\"Invalid value for 'check_cols': \" ~ check_cols_config) %}\n {% endif %}\n\n {%- set existing_cols = adapter.get_columns_in_relation(target_relation) | map(attribute = 'name') | list -%}\n {%- set ns = namespace() -%} {#-- handle for-loop scoping with a namespace --#}\n {%- set ns.column_added = false -%}\n\n {%- set intersection = [] -%}\n {%- for col in query_columns -%}\n {%- if col in existing_cols -%}\n {%- do intersection.append(adapter.quote(col)) -%}\n {%- else -%}\n {% set ns.column_added = true %}\n {%- endif -%}\n {%- endfor -%}\n {{ return((ns.column_added, intersection)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_columns_in_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "node", "type": null, "description": ""}, {"name": "target_exists", "type": null, "description": ""}, {"name": "check_cols_config", "type": null, "description": ""}], "created_at": 1785250505.4136329, "supported_languages": null}, "macro.dbt.snapshot_check_strategy": {"name": "snapshot_check_strategy", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\snapshots\\strategies.sql", "original_file_path": "macros\\materializations\\snapshots\\strategies.sql", "unique_id": "macro.dbt.snapshot_check_strategy", "macro_sql": "{% macro snapshot_check_strategy(node, snapshotted_rel, current_rel, model_config, target_exists) %}\n {# The model_config parameter is no longer used, but is passed in anyway for compatibility. #}\n {% set check_cols_config = config.get('check_cols') %}\n {% set primary_key = config.get('unique_key') %}\n {% set hard_deletes = adapter.get_hard_deletes_behavior(config) %}\n {% set invalidate_hard_deletes = hard_deletes == 'invalidate' %}\n {% set updated_at = config.get('updated_at') or snapshot_get_time() %}\n\n {% set column_added = false %}\n\n {% set column_added, check_cols = snapshot_check_all_get_existing_columns(node, target_exists, check_cols_config) %}\n\n {%- set row_changed_expr -%}\n (\n {%- if column_added -%}\n {{ get_true_sql() }}\n {%- else -%}\n {%- for col in check_cols -%}\n {{ snapshotted_rel }}.{{ col }} != {{ current_rel }}.{{ col }}\n or\n (\n (({{ snapshotted_rel }}.{{ col }} is null) and not ({{ current_rel }}.{{ col }} is null))\n or\n ((not {{ snapshotted_rel }}.{{ col }} is null) and ({{ current_rel }}.{{ col }} is null))\n )\n {%- if not loop.last %} or {% endif -%}\n {%- endfor -%}\n {%- endif -%}\n )\n {%- endset %}\n\n {% set scd_args = api.Relation.scd_args(primary_key, updated_at) %}\n {% set scd_id_expr = snapshot_hash_arguments(scd_args) %}\n\n {% do return({\n \"unique_key\": primary_key,\n \"updated_at\": updated_at,\n \"row_changed\": row_changed_expr,\n \"scd_id\": scd_id_expr,\n \"invalidate_hard_deletes\": invalidate_hard_deletes,\n \"hard_deletes\": hard_deletes\n }) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.snapshot_get_time", "macro.dbt.snapshot_check_all_get_existing_columns", "macro.dbt.get_true_sql", "macro.dbt.snapshot_hash_arguments"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "node", "type": null, "description": ""}, {"name": "snapshotted_rel", "type": null, "description": ""}, {"name": "current_rel", "type": null, "description": ""}, {"name": "model_config", "type": null, "description": ""}, {"name": "target_exists", "type": null, "description": ""}], "created_at": 1785250505.4166298, "supported_languages": null}, "macro.dbt.get_test_sql": {"name": "get_test_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\tests\\helpers.sql", "original_file_path": "macros\\materializations\\tests\\helpers.sql", "unique_id": "macro.dbt.get_test_sql", "macro_sql": "{% macro get_test_sql(main_sql, fail_calc, warn_if, error_if, limit) -%}\n {{ adapter.dispatch('get_test_sql', 'dbt')(main_sql, fail_calc, warn_if, error_if, limit) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_test_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "main_sql", "type": null, "description": ""}, {"name": "fail_calc", "type": null, "description": ""}, {"name": "warn_if", "type": null, "description": ""}, {"name": "error_if", "type": null, "description": ""}, {"name": "limit", "type": null, "description": ""}], "created_at": 1785250505.417639, "supported_languages": null}, "macro.dbt.default__get_test_sql": {"name": "default__get_test_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\tests\\helpers.sql", "original_file_path": "macros\\materializations\\tests\\helpers.sql", "unique_id": "macro.dbt.default__get_test_sql", "macro_sql": "{% macro default__get_test_sql(main_sql, fail_calc, warn_if, error_if, limit) -%}\n select\n {{ fail_calc }} as failures,\n {{ fail_calc }} {{ warn_if }} as should_warn,\n {{ fail_calc }} {{ error_if }} as should_error\n from (\n {{ main_sql }}\n {{ \"limit \" ~ limit if limit != none }}\n ) dbt_internal_test\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "main_sql", "type": null, "description": ""}, {"name": "fail_calc", "type": null, "description": ""}, {"name": "warn_if", "type": null, "description": ""}, {"name": "error_if", "type": null, "description": ""}, {"name": "limit", "type": null, "description": ""}], "created_at": 1785250505.4186378, "supported_languages": null}, "macro.dbt.get_unit_test_sql": {"name": "get_unit_test_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\tests\\helpers.sql", "original_file_path": "macros\\materializations\\tests\\helpers.sql", "unique_id": "macro.dbt.get_unit_test_sql", "macro_sql": "{% macro get_unit_test_sql(main_sql, expected_fixture_sql, expected_column_names) -%}\n {{ adapter.dispatch('get_unit_test_sql', 'dbt')(main_sql, expected_fixture_sql, expected_column_names) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_unit_test_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "main_sql", "type": null, "description": ""}, {"name": "expected_fixture_sql", "type": null, "description": ""}, {"name": "expected_column_names", "type": null, "description": ""}], "created_at": 1785250505.4186378, "supported_languages": null}, "macro.dbt.default__get_unit_test_sql": {"name": "default__get_unit_test_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\tests\\helpers.sql", "original_file_path": "macros\\materializations\\tests\\helpers.sql", "unique_id": "macro.dbt.default__get_unit_test_sql", "macro_sql": "{% macro default__get_unit_test_sql(main_sql, expected_fixture_sql, expected_column_names) -%}\n-- Build actual result given inputs\nwith dbt_internal_unit_test_actual as (\n select\n {% for expected_column_name in expected_column_names %}{{expected_column_name}}{% if not loop.last -%},{% endif %}{%- endfor -%}, {{ dbt.string_literal(\"actual\") }} as {{ adapter.quote(\"actual_or_expected\") }}\n from (\n {{ main_sql }}\n ) _dbt_internal_unit_test_actual\n),\n-- Build expected result\ndbt_internal_unit_test_expected as (\n select\n {% for expected_column_name in expected_column_names %}{{expected_column_name}}{% if not loop.last -%}, {% endif %}{%- endfor -%}, {{ dbt.string_literal(\"expected\") }} as {{ adapter.quote(\"actual_or_expected\") }}\n from (\n {{ expected_fixture_sql }}\n ) _dbt_internal_unit_test_expected\n)\n-- Union actual and expected results\nselect * from dbt_internal_unit_test_actual\nunion all\nselect * from dbt_internal_unit_test_expected\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.string_literal"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "main_sql", "type": null, "description": ""}, {"name": "expected_fixture_sql", "type": null, "description": ""}, {"name": "expected_column_names", "type": null, "description": ""}], "created_at": 1785250505.4196393, "supported_languages": null}, "macro.dbt.materialization_test_default": {"name": "materialization_test_default", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\tests\\test.sql", "original_file_path": "macros\\materializations\\tests\\test.sql", "unique_id": "macro.dbt.materialization_test_default", "macro_sql": "{%- materialization test, default -%}\n\n {% set relations = [] %}\n {% set limit = config.get('limit') %}\n {% set sql_header = config.get('sql_header') if flags.REQUIRE_SQL_HEADER_IN_TEST_CONFIGS else none %}\n\n {% set sql_with_limit %}\n {{ get_limit_subquery_sql(sql, limit) }}\n {% endset %}\n\n {% if should_store_failures() %}\n\n {% set identifier = model['alias'] %}\n {% set old_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier) %}\n\n {% set store_failures_as = config.get('store_failures_as') %}\n -- if `--store-failures` is invoked via command line and `store_failures_as` is not set,\n -- config.get('store_failures_as', 'table') returns None, not 'table'\n {% if store_failures_as == none %}{% set store_failures_as = 'table' %}{% endif %}\n {% if store_failures_as not in ['table', 'view'] %}\n {{ exceptions.raise_compiler_error(\n \"'\" ~ store_failures_as ~ \"' is not a valid value for `store_failures_as`. \"\n \"Accepted values are: ['ephemeral', 'table', 'view']\"\n ) }}\n {% endif %}\n\n {% set target_relation = api.Relation.create(\n identifier=identifier, schema=schema, database=database, type=store_failures_as) -%} %}\n\n {% if old_relation %}\n {% do adapter.drop_relation(old_relation) %}\n {% endif %}\n\n {% call statement(auto_begin=True) %}\n {% if sql_header %}{{ sql_header }}{% endif %}\n {{ get_create_sql(target_relation, sql_with_limit) }}\n {% endcall %}\n\n {% do relations.append(target_relation) %}\n\n {# Since the test failures have already been saved to the database, reuse that result rather than querying again #}\n {% set main_sql %}\n select *\n from {{ target_relation }}\n {% endset %}\n\n {{ adapter.commit() }}\n\n {% else %}\n\n {% set main_sql = sql_with_limit %}\n\n {% endif %}\n\n {% set fail_calc = config.get('fail_calc') %}\n {% set warn_if = config.get('warn_if') %}\n {% set error_if = config.get('error_if') %}\n\n {% call statement('main', fetch_result=True) -%}\n\n {% if sql_header %}{{ sql_header }}{% endif %}\n {# The limit has already been included above, and we do not want to duplicate it again. We also want to be safe for macro overrides treating `limit` as a required parameter. #}\n {{ get_test_sql(main_sql, fail_calc, warn_if, error_if, limit=none)}}\n\n {%- endcall %}\n\n {{ return({'relations': relations}) }}\n\n{%- endmaterialization -%}", "depends_on": {"macros": ["macro.dbt.get_limit_subquery_sql", "macro.dbt.should_store_failures", "macro.dbt.statement", "macro.dbt.get_create_sql", "macro.dbt.get_test_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.4256377, "supported_languages": ["sql"]}, "macro.dbt.materialization_unit_default": {"name": "materialization_unit_default", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\tests\\unit.sql", "original_file_path": "macros\\materializations\\tests\\unit.sql", "unique_id": "macro.dbt.materialization_unit_default", "macro_sql": "{%- materialization unit, default -%}\n\n {% set relations = [] %}\n {% set sql_header = config.get('sql_header') if flags.REQUIRE_SQL_HEADER_IN_TEST_CONFIGS else none %}\n\n {% set expected_rows = config.get('expected_rows') %}\n {% set expected_sql = config.get('expected_sql') %}\n {% set tested_expected_column_names = expected_rows[0].keys() if (expected_rows | length ) > 0 else get_columns_in_query(sql) %}\n\n {%- set target_relation = this.incorporate(type='table') -%}\n {%- set temp_relation = make_temp_relation(target_relation)-%}\n {% do run_query(get_create_table_as_sql(True, temp_relation, get_empty_subquery_sql(sql))) %}\n {%- set columns_in_relation = adapter.get_columns_in_relation(temp_relation) -%}\n {%- set column_name_to_data_types = {} -%}\n {%- set column_name_to_quoted = {} -%}\n {%- for column in columns_in_relation -%}\n {%- do column_name_to_data_types.update({column.name|lower: column.data_type}) -%}\n {%- do column_name_to_quoted.update({column.name|lower: column.quoted}) -%}\n {%- endfor -%}\n\n {%- set expected_column_names_quoted = [] -%}\n {%- for column_name in tested_expected_column_names -%}\n {%- do expected_column_names_quoted.append(column_name_to_quoted[column_name|lower]) -%}\n {%- endfor -%}\n\n {% if not expected_sql %}\n {% set expected_sql = get_expected_sql(expected_rows, column_name_to_data_types, column_name_to_quoted) %}\n {% endif %}\n {% set unit_test_sql = get_unit_test_sql(sql, expected_sql, expected_column_names_quoted) %}\n\n {% call statement('main', fetch_result=True) -%}\n\n {% if sql_header %}{{ sql_header }}{% endif %}\n {{ unit_test_sql }}\n\n {%- endcall %}\n\n {% do adapter.drop_relation(temp_relation) %}\n\n {{ return({'relations': relations}) }}\n\n{%- endmaterialization -%}", "depends_on": {"macros": ["macro.dbt.get_columns_in_query", "macro.dbt.make_temp_relation", "macro.dbt.run_query", "macro.dbt.get_create_table_as_sql", "macro.dbt.get_empty_subquery_sql", "macro.dbt.get_expected_sql", "macro.dbt.get_unit_test_sql", "macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "supported_languages", "type": null, "description": ""}], "created_at": 1785250505.429632, "supported_languages": ["sql"]}, "macro.dbt.get_where_subquery": {"name": "get_where_subquery", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\tests\\where_subquery.sql", "original_file_path": "macros\\materializations\\tests\\where_subquery.sql", "unique_id": "macro.dbt.get_where_subquery", "macro_sql": "{% macro get_where_subquery(relation) -%}\n {% do return(adapter.dispatch('get_where_subquery', 'dbt')(relation)) %}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_where_subquery"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.430631, "supported_languages": null}, "macro.dbt.default__get_where_subquery": {"name": "default__get_where_subquery", "resource_type": "macro", "package_name": "dbt", "path": "macros\\materializations\\tests\\where_subquery.sql", "original_file_path": "macros\\materializations\\tests\\where_subquery.sql", "unique_id": "macro.dbt.default__get_where_subquery", "macro_sql": "{% macro default__get_where_subquery(relation) -%}\n {% set where = config.get('where', '') %}\n {% if where %}\n {%- set filtered -%}\n (select * from {{ relation }} where {{ where }}) dbt_subquery\n {%- endset -%}\n {% do return(filtered) %}\n {%- else -%}\n {% do return(relation) %}\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.431631, "supported_languages": null}, "macro.dbt.resolve_model_name": {"name": "resolve_model_name", "resource_type": "macro", "package_name": "dbt", "path": "macros\\python_model\\python.sql", "original_file_path": "macros\\python_model\\python.sql", "unique_id": "macro.dbt.resolve_model_name", "macro_sql": "{% macro resolve_model_name(input_model_name) %}\n {{ return(adapter.dispatch('resolve_model_name', 'dbt')(input_model_name)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__resolve_model_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "input_model_name", "type": null, "description": ""}], "created_at": 1785250505.4336298, "supported_languages": null}, "macro.dbt.default__resolve_model_name": {"name": "default__resolve_model_name", "resource_type": "macro", "package_name": "dbt", "path": "macros\\python_model\\python.sql", "original_file_path": "macros\\python_model\\python.sql", "unique_id": "macro.dbt.default__resolve_model_name", "macro_sql": "\n\n{%- macro default__resolve_model_name(input_model_name) -%}\n {{ input_model_name | string | replace('\"', '\\\"') }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "input_model_name", "type": null, "description": ""}], "created_at": 1785250505.4336298, "supported_languages": null}, "macro.dbt.build_ref_function": {"name": "build_ref_function", "resource_type": "macro", "package_name": "dbt", "path": "macros\\python_model\\python.sql", "original_file_path": "macros\\python_model\\python.sql", "unique_id": "macro.dbt.build_ref_function", "macro_sql": "{% macro build_ref_function(model) %}\n\n {%- set ref_dict = {} -%}\n {%- for _ref in model.refs -%}\n {% set _ref_args = [_ref.get('package'), _ref['name']] if _ref.get('package') else [_ref['name'],] %}\n {%- set resolved = ref(*_ref_args, v=_ref.get('version')) -%}\n\n {#\n We want to get the string of the returned relation by calling .render() in order to skip sample/empty\n mode rendering logic. However, people override the default ref macro, and often return a string instead\n of a relation (like the ref macro does by default). Thus, to make sure we dont blow things up, we have\n to ensure the resolved relation has a .render() method.\n #}\n {%- if resolved.render is defined and resolved.render is callable -%}\n {%- set resolved = resolved.render() -%}\n {%- endif -%}\n\n {%- if _ref.get('version') -%}\n {% do _ref_args.extend([\"v\" ~ _ref['version']]) %}\n {%- endif -%}\n {%- do ref_dict.update({_ref_args | join('.'): resolve_model_name(resolved)}) -%}\n {%- endfor -%}\n\ndef ref(*args, **kwargs):\n refs = {{ ref_dict | tojson }}\n key = '.'.join(args)\n version = kwargs.get(\"v\") or kwargs.get(\"version\")\n if version:\n key += f\".v{version}\"\n dbt_load_df_function = kwargs.get(\"dbt_load_df_function\")\n return dbt_load_df_function(refs[key])\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.resolve_model_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}], "created_at": 1785250505.435632, "supported_languages": null}, "macro.dbt.build_source_function": {"name": "build_source_function", "resource_type": "macro", "package_name": "dbt", "path": "macros\\python_model\\python.sql", "original_file_path": "macros\\python_model\\python.sql", "unique_id": "macro.dbt.build_source_function", "macro_sql": "{% macro build_source_function(model) %}\n\n {%- set source_dict = {} -%}\n {%- for _source in model.sources -%}\n {%- set resolved = source(*_source) -%}\n {%- do source_dict.update({_source | join('.'): resolve_model_name(resolved)}) -%}\n {%- endfor -%}\n\ndef source(*args, dbt_load_df_function):\n sources = {{ source_dict | tojson }}\n key = '.'.join(args)\n return dbt_load_df_function(sources[key])\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.resolve_model_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}], "created_at": 1785250505.4376268, "supported_languages": null}, "macro.dbt.build_config_dict": {"name": "build_config_dict", "resource_type": "macro", "package_name": "dbt", "path": "macros\\python_model\\python.sql", "original_file_path": "macros\\python_model\\python.sql", "unique_id": "macro.dbt.build_config_dict", "macro_sql": "{% macro build_config_dict(model) %}\n {%- set config_dict = {} -%}\n {% set config_dbt_used = zip(model.config.config_keys_used, model.config.config_keys_defaults) | list %}\n {%- for key, default in config_dbt_used -%}\n {# weird type testing with enum, would be much easier to write this logic in Python! #}\n {%- if key == \"language\" -%}\n {%- set value = \"python\" -%}\n {%- endif -%}\n {%- set value = model.config.get(key, default) -%}\n {%- do config_dict.update({key: value}) -%}\n {%- endfor -%}\n {# Handle dbt.config.meta_get() calls - use separate dict to avoid overwriting native configs #}\n {%- set meta_dict = {} -%}\n {%- if model.config.meta_keys_used -%}\n {% set meta_dbt_used = zip(model.config.meta_keys_used, model.config.meta_keys_defaults) | list %}\n {%- for key, default in meta_dbt_used -%}\n {%- if model.config.meta and key in model.config.meta -%}\n {%- set value = model.config.meta[key] -%}\n {%- else -%}\n {%- set value = default -%}\n {%- endif -%}\n {%- do meta_dict.update({key: value}) -%}\n {%- endfor -%}\n {%- endif -%}\nconfig_dict = {{ config_dict }}\nmeta_dict = {{ meta_dict }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}], "created_at": 1785250505.439632, "supported_languages": null}, "macro.dbt.py_script_postfix": {"name": "py_script_postfix", "resource_type": "macro", "package_name": "dbt", "path": "macros\\python_model\\python.sql", "original_file_path": "macros\\python_model\\python.sql", "unique_id": "macro.dbt.py_script_postfix", "macro_sql": "{% macro py_script_postfix(model) %}\n# This part is user provided model code\n# you will need to copy the next section to run the code\n# COMMAND ----------\n# this part is dbt logic for get ref work, do not modify\n\n{{ build_ref_function(model ) }}\n{{ build_source_function(model ) }}\n{{ build_config_dict(model) }}\n\nclass config:\n def __init__(self, *args, **kwargs):\n pass\n\n @staticmethod\n def get(key, default=None):\n return config_dict.get(key, default)\n\n @staticmethod\n def meta_get(key, default=None):\n return meta_dict.get(key, default)\n\nclass this:\n \"\"\"dbt.this() or dbt.this.identifier\"\"\"\n database = \"{{ this.database }}\"\n schema = \"{{ this.schema }}\"\n identifier = \"{{ this.identifier }}\"\n {% set this_relation_name = resolve_model_name(this) %}\n def __repr__(self):\n return '{{ this_relation_name }}'\n\n\nclass dbtObj:\n def __init__(self, load_df_function) -> None:\n self.source = lambda *args: source(*args, dbt_load_df_function=load_df_function)\n self.ref = lambda *args, **kwargs: ref(*args, **kwargs, dbt_load_df_function=load_df_function)\n self.config = config\n self.this = this()\n self.is_incremental = {{ is_incremental() }}\n\n# COMMAND ----------\n{{py_script_comment()}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.build_ref_function", "macro.dbt.build_source_function", "macro.dbt.build_config_dict", "macro.dbt.resolve_model_name", "macro.dbt.is_incremental", "macro.dbt.py_script_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}], "created_at": 1785250505.4406333, "supported_languages": null}, "macro.dbt.py_script_comment": {"name": "py_script_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros\\python_model\\python.sql", "original_file_path": "macros\\python_model\\python.sql", "unique_id": "macro.dbt.py_script_comment", "macro_sql": "{%macro py_script_comment()%}\n{%endmacro%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.4406333, "supported_languages": null}, "macro.dbt.get_create_sql": {"name": "get_create_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\create.sql", "original_file_path": "macros\\relations\\create.sql", "unique_id": "macro.dbt.get_create_sql", "macro_sql": "{%- macro get_create_sql(relation, sql) -%}\n {{- log('Applying CREATE to: ' ~ relation) -}}\n {{- adapter.dispatch('get_create_sql', 'dbt')(relation, sql) -}}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_create_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4416375, "supported_languages": null}, "macro.dbt.default__get_create_sql": {"name": "default__get_create_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\create.sql", "original_file_path": "macros\\relations\\create.sql", "unique_id": "macro.dbt.default__get_create_sql", "macro_sql": "{%- macro default__get_create_sql(relation, sql) -%}\n\n {%- if relation.is_view -%}\n {{ get_create_view_as_sql(relation, sql) }}\n\n {%- elif relation.is_table -%}\n {{ get_create_table_as_sql(False, relation, sql) }}\n\n {%- elif relation.is_materialized_view -%}\n {{ get_create_materialized_view_as_sql(relation, sql) }}\n\n {%- else -%}\n {{- exceptions.raise_compiler_error(\"`get_create_sql` has not been implemented for: \" ~ relation.type ) -}}\n\n {%- endif -%}\n\n{%- endmacro -%}", "depends_on": {"macros": ["macro.dbt.get_create_view_as_sql", "macro.dbt.get_create_table_as_sql", "macro.dbt.get_create_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.442635, "supported_languages": null}, "macro.dbt.get_create_backup_sql": {"name": "get_create_backup_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\create_backup.sql", "original_file_path": "macros\\relations\\create_backup.sql", "unique_id": "macro.dbt.get_create_backup_sql", "macro_sql": "{%- macro get_create_backup_sql(relation) -%}\n {{- log('Applying CREATE BACKUP to: ' ~ relation) -}}\n {{- adapter.dispatch('get_create_backup_sql', 'dbt')(relation) -}}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": ["macro.dbt.default__get_create_backup_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.443638, "supported_languages": null}, "macro.dbt.default__get_create_backup_sql": {"name": "default__get_create_backup_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\create_backup.sql", "original_file_path": "macros\\relations\\create_backup.sql", "unique_id": "macro.dbt.default__get_create_backup_sql", "macro_sql": "{%- macro default__get_create_backup_sql(relation) -%}\n\n -- get the standard backup name\n {% set backup_relation = make_backup_relation(relation, relation.type) %}\n\n -- drop any pre-existing backup\n {{ get_drop_sql(backup_relation) }};\n\n {{ get_rename_sql(relation, backup_relation.identifier) }}\n\n{%- endmacro -%}", "depends_on": {"macros": ["macro.dbt.make_backup_relation", "macro.dbt.get_drop_sql", "macro.dbt.get_rename_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.443638, "supported_languages": null}, "macro.dbt.get_create_intermediate_sql": {"name": "get_create_intermediate_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\create_intermediate.sql", "original_file_path": "macros\\relations\\create_intermediate.sql", "unique_id": "macro.dbt.get_create_intermediate_sql", "macro_sql": "{%- macro get_create_intermediate_sql(relation, sql) -%}\n {{- log('Applying CREATE INTERMEDIATE to: ' ~ relation) -}}\n {{- adapter.dispatch('get_create_intermediate_sql', 'dbt')(relation, sql) -}}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_create_intermediate_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4446378, "supported_languages": null}, "macro.dbt.default__get_create_intermediate_sql": {"name": "default__get_create_intermediate_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\create_intermediate.sql", "original_file_path": "macros\\relations\\create_intermediate.sql", "unique_id": "macro.dbt.default__get_create_intermediate_sql", "macro_sql": "{%- macro default__get_create_intermediate_sql(relation, sql) -%}\n\n -- get the standard intermediate name\n {% set intermediate_relation = make_intermediate_relation(relation) %}\n\n -- drop any pre-existing intermediate\n {{ get_drop_sql(intermediate_relation) }};\n\n {{ get_create_sql(intermediate_relation, sql) }}\n\n{%- endmacro -%}", "depends_on": {"macros": ["macro.dbt.make_intermediate_relation", "macro.dbt.get_drop_sql", "macro.dbt.get_create_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4446378, "supported_languages": null}, "macro.dbt.get_drop_sql": {"name": "get_drop_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\drop.sql", "original_file_path": "macros\\relations\\drop.sql", "unique_id": "macro.dbt.get_drop_sql", "macro_sql": "{%- macro get_drop_sql(relation) -%}\n {{- log('Applying DROP to: ' ~ relation) -}}\n {{- adapter.dispatch('get_drop_sql', 'dbt')(relation) -}}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_drop_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.4456363, "supported_languages": null}, "macro.dbt.default__get_drop_sql": {"name": "default__get_drop_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\drop.sql", "original_file_path": "macros\\relations\\drop.sql", "unique_id": "macro.dbt.default__get_drop_sql", "macro_sql": "{%- macro default__get_drop_sql(relation) -%}\n\n {%- if relation.is_view -%}\n {{ drop_view(relation) }}\n\n {%- elif relation.is_table -%}\n {{ drop_table(relation) }}\n\n {%- elif relation.is_materialized_view -%}\n {{ drop_materialized_view(relation) }}\n\n {%- else -%}\n drop {{ relation.type }} if exists {{ relation.render() }} cascade\n\n {%- endif -%}\n\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": ["macro.dbt.drop_view", "macro.dbt.drop_table", "macro.dbt.drop_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.446638, "supported_languages": null}, "macro.dbt.drop_relation": {"name": "drop_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\drop.sql", "original_file_path": "macros\\relations\\drop.sql", "unique_id": "macro.dbt.drop_relation", "macro_sql": "{% macro drop_relation(relation) -%}\n {{ return(adapter.dispatch('drop_relation', 'dbt')(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__drop_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.4476357, "supported_languages": null}, "macro.dbt.default__drop_relation": {"name": "default__drop_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\drop.sql", "original_file_path": "macros\\relations\\drop.sql", "unique_id": "macro.dbt.default__drop_relation", "macro_sql": "{% macro default__drop_relation(relation) -%}\n {% call statement('drop_relation', auto_begin=False) -%}\n {{ get_drop_sql(relation) }}\n {%- endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.get_drop_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.4476357, "supported_languages": null}, "macro.dbt.drop_relation_if_exists": {"name": "drop_relation_if_exists", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\drop.sql", "original_file_path": "macros\\relations\\drop.sql", "unique_id": "macro.dbt.drop_relation_if_exists", "macro_sql": "{% macro drop_relation_if_exists(relation) %}\n {% if relation is not none %}\n {{ adapter.drop_relation(relation) }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.4476357, "supported_languages": null}, "macro.dbt.get_drop_backup_sql": {"name": "get_drop_backup_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\drop_backup.sql", "original_file_path": "macros\\relations\\drop_backup.sql", "unique_id": "macro.dbt.get_drop_backup_sql", "macro_sql": "{%- macro get_drop_backup_sql(relation) -%}\n {{- log('Applying DROP BACKUP to: ' ~ relation) -}}\n {{- adapter.dispatch('get_drop_backup_sql', 'dbt')(relation) -}}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": ["macro.dbt.default__get_drop_backup_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.4496388, "supported_languages": null}, "macro.dbt.default__get_drop_backup_sql": {"name": "default__get_drop_backup_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\drop_backup.sql", "original_file_path": "macros\\relations\\drop_backup.sql", "unique_id": "macro.dbt.default__get_drop_backup_sql", "macro_sql": "{%- macro default__get_drop_backup_sql(relation) -%}\n\n -- get the standard backup name\n {% set backup_relation = make_backup_relation(relation, relation.type) %}\n\n {{ get_drop_sql(backup_relation) }}\n\n{%- endmacro -%}", "depends_on": {"macros": ["macro.dbt.make_backup_relation", "macro.dbt.get_drop_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.4496388, "supported_languages": null}, "macro.dbt.get_rename_sql": {"name": "get_rename_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\rename.sql", "original_file_path": "macros\\relations\\rename.sql", "unique_id": "macro.dbt.get_rename_sql", "macro_sql": "{%- macro get_rename_sql(relation, new_name) -%}\n {{- log('Applying RENAME to: ' ~ relation) -}}\n {{- adapter.dispatch('get_rename_sql', 'dbt')(relation, new_name) -}}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": ["macro.dbt.default__get_rename_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "new_name", "type": null, "description": ""}], "created_at": 1785250505.4506328, "supported_languages": null}, "macro.dbt.default__get_rename_sql": {"name": "default__get_rename_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\rename.sql", "original_file_path": "macros\\relations\\rename.sql", "unique_id": "macro.dbt.default__get_rename_sql", "macro_sql": "{%- macro default__get_rename_sql(relation, new_name) -%}\n\n {%- if relation.is_view -%}\n {{ get_rename_view_sql(relation, new_name) }}\n\n {%- elif relation.is_table -%}\n {{ get_rename_table_sql(relation, new_name) }}\n\n {%- elif relation.is_materialized_view -%}\n {{ get_rename_materialized_view_sql(relation, new_name) }}\n\n {%- else -%}\n {{- exceptions.raise_compiler_error(\"`get_rename_sql` has not been implemented for: \" ~ relation.type ) -}}\n\n {%- endif -%}\n\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": ["macro.dbt.get_rename_view_sql", "macro.dbt.get_rename_table_sql", "macro.dbt.get_rename_materialized_view_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "new_name", "type": null, "description": ""}], "created_at": 1785250505.45164, "supported_languages": null}, "macro.dbt.rename_relation": {"name": "rename_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\rename.sql", "original_file_path": "macros\\relations\\rename.sql", "unique_id": "macro.dbt.rename_relation", "macro_sql": "{% macro rename_relation(from_relation, to_relation) -%}\n {{ return(adapter.dispatch('rename_relation', 'dbt')(from_relation, to_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__rename_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "from_relation", "type": null, "description": ""}, {"name": "to_relation", "type": null, "description": ""}], "created_at": 1785250505.45164, "supported_languages": null}, "macro.dbt.default__rename_relation": {"name": "default__rename_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\rename.sql", "original_file_path": "macros\\relations\\rename.sql", "unique_id": "macro.dbt.default__rename_relation", "macro_sql": "{% macro default__rename_relation(from_relation, to_relation) -%}\n {% set target_name = adapter.quote_as_configured(to_relation.identifier, 'identifier') %}\n {% call statement('rename_relation') -%}\n alter table {{ from_relation.render() }} rename to {{ target_name }}\n {%- endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "from_relation", "type": null, "description": ""}, {"name": "to_relation", "type": null, "description": ""}], "created_at": 1785250505.4526308, "supported_languages": null}, "macro.dbt.get_rename_intermediate_sql": {"name": "get_rename_intermediate_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\rename_intermediate.sql", "original_file_path": "macros\\relations\\rename_intermediate.sql", "unique_id": "macro.dbt.get_rename_intermediate_sql", "macro_sql": "{%- macro get_rename_intermediate_sql(relation) -%}\n {{- log('Applying RENAME INTERMEDIATE to: ' ~ relation) -}}\n {{- adapter.dispatch('get_rename_intermediate_sql', 'dbt')(relation) -}}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": ["macro.dbt.default__get_rename_intermediate_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.4536357, "supported_languages": null}, "macro.dbt.default__get_rename_intermediate_sql": {"name": "default__get_rename_intermediate_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\rename_intermediate.sql", "original_file_path": "macros\\relations\\rename_intermediate.sql", "unique_id": "macro.dbt.default__get_rename_intermediate_sql", "macro_sql": "{%- macro default__get_rename_intermediate_sql(relation) -%}\n\n -- get the standard intermediate name\n {% set intermediate_relation = make_intermediate_relation(relation) %}\n\n {{ get_rename_sql(intermediate_relation, relation.identifier) }}\n\n{%- endmacro -%}", "depends_on": {"macros": ["macro.dbt.make_intermediate_relation", "macro.dbt.get_rename_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.4536357, "supported_languages": null}, "macro.dbt.get_replace_sql": {"name": "get_replace_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\replace.sql", "original_file_path": "macros\\relations\\replace.sql", "unique_id": "macro.dbt.get_replace_sql", "macro_sql": "{% macro get_replace_sql(existing_relation, target_relation, sql) %}\n {{- log('Applying REPLACE to: ' ~ existing_relation) -}}\n {{- adapter.dispatch('get_replace_sql', 'dbt')(existing_relation, target_relation, sql) -}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_replace_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4546304, "supported_languages": null}, "macro.dbt.default__get_replace_sql": {"name": "default__get_replace_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\replace.sql", "original_file_path": "macros\\relations\\replace.sql", "unique_id": "macro.dbt.default__get_replace_sql", "macro_sql": "{% macro default__get_replace_sql(existing_relation, target_relation, sql) %}\n\n {# /* use a create or replace statement if possible */ #}\n\n {% set is_replaceable = existing_relation.type == target_relation.type and existing_relation.can_be_replaced %}\n\n {% if is_replaceable and existing_relation.is_view %}\n {{ get_replace_view_sql(target_relation, sql) }}\n\n {% elif is_replaceable and existing_relation.is_table %}\n {{ get_replace_table_sql(target_relation, sql) }}\n\n {% elif is_replaceable and existing_relation.is_materialized_view %}\n {{ get_replace_materialized_view_sql(target_relation, sql) }}\n\n {# /* a create or replace statement is not possible, so try to stage and/or backup to be safe */ #}\n\n {# /* create target_relation as an intermediate relation, then swap it out with the existing one using a backup */ #}\n {%- elif target_relation.can_be_renamed and existing_relation.can_be_renamed -%}\n {{ get_create_intermediate_sql(target_relation, sql) }};\n {{ get_create_backup_sql(existing_relation) }};\n {{ get_rename_intermediate_sql(target_relation) }};\n {{ get_drop_backup_sql(existing_relation) }}\n\n {# /* create target_relation as an intermediate relation, then swap it out with the existing one without using a backup */ #}\n {%- elif target_relation.can_be_renamed -%}\n {{ get_create_intermediate_sql(target_relation, sql) }};\n {{ get_drop_sql(existing_relation) }};\n {{ get_rename_intermediate_sql(target_relation) }}\n\n {# /* create target_relation in place by first backing up the existing relation */ #}\n {%- elif existing_relation.can_be_renamed -%}\n {{ get_create_backup_sql(existing_relation) }};\n {{ get_create_sql(target_relation, sql) }};\n {{ get_drop_backup_sql(existing_relation) }}\n\n {# /* no renaming is allowed, so just drop and create */ #}\n {%- else -%}\n {{ get_drop_sql(existing_relation) }};\n {{ get_create_sql(target_relation, sql) }}\n\n {%- endif -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_replace_view_sql", "macro.dbt.get_replace_table_sql", "macro.dbt.get_replace_materialized_view_sql", "macro.dbt.get_create_intermediate_sql", "macro.dbt.get_create_backup_sql", "macro.dbt.get_rename_intermediate_sql", "macro.dbt.get_drop_backup_sql", "macro.dbt.get_drop_sql", "macro.dbt.get_create_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "target_relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4576342, "supported_languages": null}, "macro.dbt.drop_schema_named": {"name": "drop_schema_named", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\schema.sql", "original_file_path": "macros\\relations\\schema.sql", "unique_id": "macro.dbt.drop_schema_named", "macro_sql": "{% macro drop_schema_named(schema_name) %}\n {{ return(adapter.dispatch('drop_schema_named', 'dbt') (schema_name)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__drop_schema_named"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_name", "type": null, "description": ""}], "created_at": 1785250505.4576342, "supported_languages": null}, "macro.dbt.default__drop_schema_named": {"name": "default__drop_schema_named", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\schema.sql", "original_file_path": "macros\\relations\\schema.sql", "unique_id": "macro.dbt.default__drop_schema_named", "macro_sql": "{% macro default__drop_schema_named(schema_name) %}\n {% set schema_relation = api.Relation.create(schema=schema_name) %}\n {{ adapter.drop_schema(schema_relation) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_name", "type": null, "description": ""}], "created_at": 1785250505.4586315, "supported_languages": null}, "macro.dbt.get_table_columns_and_constraints": {"name": "get_table_columns_and_constraints", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\column\\columns_spec_ddl.sql", "original_file_path": "macros\\relations\\column\\columns_spec_ddl.sql", "unique_id": "macro.dbt.get_table_columns_and_constraints", "macro_sql": "{%- macro get_table_columns_and_constraints() -%}\n {{ adapter.dispatch('get_table_columns_and_constraints', 'dbt')() }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__get_table_columns_and_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.459637, "supported_languages": null}, "macro.dbt.default__get_table_columns_and_constraints": {"name": "default__get_table_columns_and_constraints", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\column\\columns_spec_ddl.sql", "original_file_path": "macros\\relations\\column\\columns_spec_ddl.sql", "unique_id": "macro.dbt.default__get_table_columns_and_constraints", "macro_sql": "{% macro default__get_table_columns_and_constraints() -%}\n {{ return(table_columns_and_constraints()) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.table_columns_and_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.4606318, "supported_languages": null}, "macro.dbt.table_columns_and_constraints": {"name": "table_columns_and_constraints", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\column\\columns_spec_ddl.sql", "original_file_path": "macros\\relations\\column\\columns_spec_ddl.sql", "unique_id": "macro.dbt.table_columns_and_constraints", "macro_sql": "{% macro table_columns_and_constraints() %}\n {# loop through user_provided_columns to create DDL with data types and constraints #}\n {%- set raw_column_constraints = adapter.render_raw_columns_constraints(raw_columns=model['columns']) -%}\n {%- set raw_model_constraints = adapter.render_raw_model_constraints(raw_constraints=model['constraints']) -%}\n (\n {% for c in raw_column_constraints -%}\n {{ c }}{{ \",\" if not loop.last or raw_model_constraints }}\n {% endfor %}\n {% for c in raw_model_constraints -%}\n {{ c }}{{ \",\" if not loop.last }}\n {% endfor -%}\n )\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.461638, "supported_languages": null}, "macro.dbt.get_assert_columns_equivalent": {"name": "get_assert_columns_equivalent", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\column\\columns_spec_ddl.sql", "original_file_path": "macros\\relations\\column\\columns_spec_ddl.sql", "unique_id": "macro.dbt.get_assert_columns_equivalent", "macro_sql": "\n\n{%- macro get_assert_columns_equivalent(sql) -%}\n {{ adapter.dispatch('get_assert_columns_equivalent', 'dbt')(sql) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__get_assert_columns_equivalent"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.461638, "supported_languages": null}, "macro.dbt.default__get_assert_columns_equivalent": {"name": "default__get_assert_columns_equivalent", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\column\\columns_spec_ddl.sql", "original_file_path": "macros\\relations\\column\\columns_spec_ddl.sql", "unique_id": "macro.dbt.default__get_assert_columns_equivalent", "macro_sql": "{% macro default__get_assert_columns_equivalent(sql) -%}\n {{ return(assert_columns_equivalent(sql)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.assert_columns_equivalent"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.461638, "supported_languages": null}, "macro.dbt.assert_columns_equivalent": {"name": "assert_columns_equivalent", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\column\\columns_spec_ddl.sql", "original_file_path": "macros\\relations\\column\\columns_spec_ddl.sql", "unique_id": "macro.dbt.assert_columns_equivalent", "macro_sql": "{% macro assert_columns_equivalent(sql) %}\n\n {#-- First ensure the user has defined 'columns' in yaml specification --#}\n {%- set user_defined_columns = model['columns'] -%}\n {%- if not user_defined_columns -%}\n {{ exceptions.raise_contract_error([], []) }}\n {%- endif -%}\n\n {#-- Obtain the column schema provided by sql file. #}\n {%- set sql_file_provided_columns = get_column_schema_from_query(sql, config.get('sql_header', none)) -%}\n {#--Obtain the column schema provided by the schema file by generating an 'empty schema' query from the model's columns. #}\n {%- set schema_file_provided_columns = get_column_schema_from_query(get_empty_schema_sql(user_defined_columns)) -%}\n\n {#-- create dictionaries with name and formatted data type and strings for exception #}\n {%- set sql_columns = format_columns(sql_file_provided_columns) -%}\n {%- set yaml_columns = format_columns(schema_file_provided_columns) -%}\n\n {%- if sql_columns|length != yaml_columns|length -%}\n {%- do exceptions.raise_contract_error(yaml_columns, sql_columns) -%}\n {%- endif -%}\n\n {%- for sql_col in sql_columns -%}\n {%- set yaml_col = [] -%}\n {%- for this_col in yaml_columns -%}\n {%- if this_col['name'] == sql_col['name'] -%}\n {%- do yaml_col.append(this_col) -%}\n {%- break -%}\n {%- endif -%}\n {%- endfor -%}\n {%- if not yaml_col -%}\n {#-- Column with name not found in yaml #}\n {%- do exceptions.raise_contract_error(yaml_columns, sql_columns) -%}\n {%- endif -%}\n {%- if sql_col['formatted'] != yaml_col[0]['formatted'] -%}\n {#-- Column data types don't match #}\n {%- do exceptions.raise_contract_error(yaml_columns, sql_columns) -%}\n {%- endif -%}\n {%- endfor -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_column_schema_from_query", "macro.dbt.get_empty_schema_sql", "macro.dbt.format_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4646304, "supported_languages": null}, "macro.dbt.format_columns": {"name": "format_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\column\\columns_spec_ddl.sql", "original_file_path": "macros\\relations\\column\\columns_spec_ddl.sql", "unique_id": "macro.dbt.format_columns", "macro_sql": "{% macro format_columns(columns) %}\n {% set formatted_columns = [] %}\n {% for column in columns %}\n {%- set formatted_column = adapter.dispatch('format_column', 'dbt')(column) -%}\n {%- do formatted_columns.append(formatted_column) -%}\n {% endfor %}\n {{ return(formatted_columns) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__format_column"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "columns", "type": null, "description": ""}], "created_at": 1785250505.4656384, "supported_languages": null}, "macro.dbt.default__format_column": {"name": "default__format_column", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\column\\columns_spec_ddl.sql", "original_file_path": "macros\\relations\\column\\columns_spec_ddl.sql", "unique_id": "macro.dbt.default__format_column", "macro_sql": "{% macro default__format_column(column) -%}\n {% set data_type = column.dtype %}\n {% set formatted = column.column.lower() ~ \" \" ~ data_type %}\n {{ return({'name': column.name, 'data_type': data_type, 'formatted': formatted}) }}\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "column", "type": null, "description": ""}], "created_at": 1785250505.466631, "supported_languages": null}, "macro.dbt.get_alter_materialized_view_as_sql": {"name": "get_alter_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\materialized_view\\alter.sql", "original_file_path": "macros\\relations\\materialized_view\\alter.sql", "unique_id": "macro.dbt.get_alter_materialized_view_as_sql", "macro_sql": "{% macro get_alter_materialized_view_as_sql(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n) %}\n {{- log('Applying ALTER to: ' ~ relation) -}}\n {{- adapter.dispatch('get_alter_materialized_view_as_sql', 'dbt')(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n ) -}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_alter_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "configuration_changes", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}, {"name": "existing_relation", "type": null, "description": ""}, {"name": "backup_relation", "type": null, "description": ""}, {"name": "intermediate_relation", "type": null, "description": ""}], "created_at": 1785250505.4676402, "supported_languages": null}, "macro.dbt.default__get_alter_materialized_view_as_sql": {"name": "default__get_alter_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\materialized_view\\alter.sql", "original_file_path": "macros\\relations\\materialized_view\\alter.sql", "unique_id": "macro.dbt.default__get_alter_materialized_view_as_sql", "macro_sql": "{% macro default__get_alter_materialized_view_as_sql(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n) %}\n {{ exceptions.raise_compiler_error(\"Materialized views have not been implemented for this adapter.\") }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "configuration_changes", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}, {"name": "existing_relation", "type": null, "description": ""}, {"name": "backup_relation", "type": null, "description": ""}, {"name": "intermediate_relation", "type": null, "description": ""}], "created_at": 1785250505.4676402, "supported_languages": null}, "macro.dbt.get_materialized_view_configuration_changes": {"name": "get_materialized_view_configuration_changes", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\materialized_view\\alter.sql", "original_file_path": "macros\\relations\\materialized_view\\alter.sql", "unique_id": "macro.dbt.get_materialized_view_configuration_changes", "macro_sql": "{% macro get_materialized_view_configuration_changes(existing_relation, new_config) %}\n /* {#\n It's recommended that configuration changes be formatted as follows:\n {\"\": [{\"action\": \"\", \"context\": ...}]}\n\n For example:\n {\n \"indexes\": [\n {\"action\": \"drop\", \"context\": \"index_abc\"},\n {\"action\": \"create\", \"context\": {\"columns\": [\"column_1\", \"column_2\"], \"type\": \"hash\", \"unique\": True}},\n ],\n }\n\n Either way, `get_materialized_view_configuration_changes` needs to align with `get_alter_materialized_view_as_sql`.\n #} */\n {{- log('Determining configuration changes on: ' ~ existing_relation) -}}\n {%- do return(adapter.dispatch('get_materialized_view_configuration_changes', 'dbt')(existing_relation, new_config)) -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_materialized_view_configuration_changes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "new_config", "type": null, "description": ""}], "created_at": 1785250505.468632, "supported_languages": null}, "macro.dbt.default__get_materialized_view_configuration_changes": {"name": "default__get_materialized_view_configuration_changes", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\materialized_view\\alter.sql", "original_file_path": "macros\\relations\\materialized_view\\alter.sql", "unique_id": "macro.dbt.default__get_materialized_view_configuration_changes", "macro_sql": "{% macro default__get_materialized_view_configuration_changes(existing_relation, new_config) %}\n {{ exceptions.raise_compiler_error(\"Materialized views have not been implemented for this adapter.\") }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "existing_relation", "type": null, "description": ""}, {"name": "new_config", "type": null, "description": ""}], "created_at": 1785250505.4696302, "supported_languages": null}, "macro.dbt.get_create_materialized_view_as_sql": {"name": "get_create_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\materialized_view\\create.sql", "original_file_path": "macros\\relations\\materialized_view\\create.sql", "unique_id": "macro.dbt.get_create_materialized_view_as_sql", "macro_sql": "{% macro get_create_materialized_view_as_sql(relation, sql) -%}\n {{- adapter.dispatch('get_create_materialized_view_as_sql', 'dbt')(relation, sql) -}}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_create_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4696302, "supported_languages": null}, "macro.dbt.default__get_create_materialized_view_as_sql": {"name": "default__get_create_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\materialized_view\\create.sql", "original_file_path": "macros\\relations\\materialized_view\\create.sql", "unique_id": "macro.dbt.default__get_create_materialized_view_as_sql", "macro_sql": "{% macro default__get_create_materialized_view_as_sql(relation, sql) -%}\n {{ exceptions.raise_compiler_error(\n \"`get_create_materialized_view_as_sql` has not been implemented for this adapter.\"\n ) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.470631, "supported_languages": null}, "macro.dbt.drop_materialized_view": {"name": "drop_materialized_view", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\materialized_view\\drop.sql", "original_file_path": "macros\\relations\\materialized_view\\drop.sql", "unique_id": "macro.dbt.drop_materialized_view", "macro_sql": "{% macro drop_materialized_view(relation) -%}\n {{- adapter.dispatch('drop_materialized_view', 'dbt')(relation) -}}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__drop_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.470631, "supported_languages": null}, "macro.dbt.default__drop_materialized_view": {"name": "default__drop_materialized_view", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\materialized_view\\drop.sql", "original_file_path": "macros\\relations\\materialized_view\\drop.sql", "unique_id": "macro.dbt.default__drop_materialized_view", "macro_sql": "{% macro default__drop_materialized_view(relation) -%}\n drop materialized view if exists {{ relation.render() }} cascade\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.470631, "supported_languages": null}, "macro.dbt.refresh_materialized_view": {"name": "refresh_materialized_view", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\materialized_view\\refresh.sql", "original_file_path": "macros\\relations\\materialized_view\\refresh.sql", "unique_id": "macro.dbt.refresh_materialized_view", "macro_sql": "{% macro refresh_materialized_view(relation) %}\n {{- log('Applying REFRESH to: ' ~ relation) -}}\n {{- adapter.dispatch('refresh_materialized_view', 'dbt')(relation) -}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__refresh_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.471638, "supported_languages": null}, "macro.dbt.default__refresh_materialized_view": {"name": "default__refresh_materialized_view", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\materialized_view\\refresh.sql", "original_file_path": "macros\\relations\\materialized_view\\refresh.sql", "unique_id": "macro.dbt.default__refresh_materialized_view", "macro_sql": "{% macro default__refresh_materialized_view(relation) %}\n {{ exceptions.raise_compiler_error(\"`refresh_materialized_view` has not been implemented for this adapter.\") }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.471638, "supported_languages": null}, "macro.dbt.get_rename_materialized_view_sql": {"name": "get_rename_materialized_view_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\materialized_view\\rename.sql", "original_file_path": "macros\\relations\\materialized_view\\rename.sql", "unique_id": "macro.dbt.get_rename_materialized_view_sql", "macro_sql": "{% macro get_rename_materialized_view_sql(relation, new_name) %}\n {{- adapter.dispatch('get_rename_materialized_view_sql', 'dbt')(relation, new_name) -}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_rename_materialized_view_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "new_name", "type": null, "description": ""}], "created_at": 1785250505.4726331, "supported_languages": null}, "macro.dbt.default__get_rename_materialized_view_sql": {"name": "default__get_rename_materialized_view_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\materialized_view\\rename.sql", "original_file_path": "macros\\relations\\materialized_view\\rename.sql", "unique_id": "macro.dbt.default__get_rename_materialized_view_sql", "macro_sql": "{% macro default__get_rename_materialized_view_sql(relation, new_name) %}\n {{ exceptions.raise_compiler_error(\n \"`get_rename_materialized_view_sql` has not been implemented for this adapter.\"\n ) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "new_name", "type": null, "description": ""}], "created_at": 1785250505.4726331, "supported_languages": null}, "macro.dbt.get_replace_materialized_view_sql": {"name": "get_replace_materialized_view_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\materialized_view\\replace.sql", "original_file_path": "macros\\relations\\materialized_view\\replace.sql", "unique_id": "macro.dbt.get_replace_materialized_view_sql", "macro_sql": "{% macro get_replace_materialized_view_sql(relation, sql) %}\n {{- adapter.dispatch('get_replace_materialized_view_sql', 'dbt')(relation, sql) -}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_replace_materialized_view_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.473639, "supported_languages": null}, "macro.dbt.default__get_replace_materialized_view_sql": {"name": "default__get_replace_materialized_view_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\materialized_view\\replace.sql", "original_file_path": "macros\\relations\\materialized_view\\replace.sql", "unique_id": "macro.dbt.default__get_replace_materialized_view_sql", "macro_sql": "{% macro default__get_replace_materialized_view_sql(relation, sql) %}\n {{ exceptions.raise_compiler_error(\n \"`get_replace_materialized_view_sql` has not been implemented for this adapter.\"\n ) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.473639, "supported_languages": null}, "macro.dbt.get_create_table_as_sql": {"name": "get_create_table_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\table\\create.sql", "original_file_path": "macros\\relations\\table\\create.sql", "unique_id": "macro.dbt.get_create_table_as_sql", "macro_sql": "{% macro get_create_table_as_sql(temporary, relation, sql) -%}\n {{ adapter.dispatch('get_create_table_as_sql', 'dbt')(temporary, relation, sql) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_create_table_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "temporary", "type": null, "description": ""}, {"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4746318, "supported_languages": null}, "macro.dbt.default__get_create_table_as_sql": {"name": "default__get_create_table_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\table\\create.sql", "original_file_path": "macros\\relations\\table\\create.sql", "unique_id": "macro.dbt.default__get_create_table_as_sql", "macro_sql": "{% macro default__get_create_table_as_sql(temporary, relation, sql) -%}\n {{ return(create_table_as(temporary, relation, sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.create_table_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "temporary", "type": null, "description": ""}, {"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4756365, "supported_languages": null}, "macro.dbt.create_table_as": {"name": "create_table_as", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\table\\create.sql", "original_file_path": "macros\\relations\\table\\create.sql", "unique_id": "macro.dbt.create_table_as", "macro_sql": "{% macro create_table_as(temporary, relation, compiled_code, language='sql') -%}\n {# backward compatibility for create_table_as that does not support language #}\n {% if language == \"sql\" %}\n {{ adapter.dispatch('create_table_as', 'dbt')(temporary, relation, compiled_code)}}\n {% else %}\n {{ adapter.dispatch('create_table_as', 'dbt')(temporary, relation, compiled_code, language) }}\n {% endif %}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__create_table_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "temporary", "type": null, "description": ""}, {"name": "relation", "type": null, "description": ""}, {"name": "compiled_code", "type": null, "description": ""}, {"name": "language", "type": null, "description": ""}], "created_at": 1785250505.4766324, "supported_languages": null}, "macro.dbt.default__create_table_as": {"name": "default__create_table_as", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\table\\create.sql", "original_file_path": "macros\\relations\\table\\create.sql", "unique_id": "macro.dbt.default__create_table_as", "macro_sql": "{% macro default__create_table_as(temporary, relation, sql) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {{ sql_header if sql_header is not none }}\n\n create {% if temporary: -%}temporary{%- endif %} table\n {{ relation.include(database=(not temporary), schema=(not temporary)) }}\n {% set contract_config = config.get('contract') %}\n {% if contract_config.enforced and (not temporary) %}\n {{ get_assert_columns_equivalent(sql) }}\n {{ get_table_columns_and_constraints() }}\n {%- set sql = get_select_subquery(sql) %}\n {% endif %}\n as (\n {{ sql }}\n );\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_assert_columns_equivalent", "macro.dbt.get_table_columns_and_constraints", "macro.dbt.get_select_subquery"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "temporary", "type": null, "description": ""}, {"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4776363, "supported_languages": null}, "macro.dbt.default__get_column_names": {"name": "default__get_column_names", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\table\\create.sql", "original_file_path": "macros\\relations\\table\\create.sql", "unique_id": "macro.dbt.default__get_column_names", "macro_sql": "{% macro default__get_column_names() %}\n {#- loop through user_provided_columns to get column names -#}\n {%- set user_provided_columns = model['columns'] -%}\n {%- for i in user_provided_columns %}\n {%- set col = user_provided_columns[i] -%}\n {%- set col_name = adapter.quote(col['name']) if col.get('quote') else col['name'] -%}\n {{ col_name }}{{ \", \" if not loop.last }}\n {%- endfor -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.4786336, "supported_languages": null}, "macro.dbt.get_select_subquery": {"name": "get_select_subquery", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\table\\create.sql", "original_file_path": "macros\\relations\\table\\create.sql", "unique_id": "macro.dbt.get_select_subquery", "macro_sql": "{% macro get_select_subquery(sql) %}\n {{ return(adapter.dispatch('get_select_subquery', 'dbt')(sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_select_subquery"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4786336, "supported_languages": null}, "macro.dbt.default__get_select_subquery": {"name": "default__get_select_subquery", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\table\\create.sql", "original_file_path": "macros\\relations\\table\\create.sql", "unique_id": "macro.dbt.default__get_select_subquery", "macro_sql": "{% macro default__get_select_subquery(sql) %}\n select {{ adapter.dispatch('get_column_names', 'dbt')() }}\n from (\n {{ sql }}\n ) as model_subq\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_column_names"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4796362, "supported_languages": null}, "macro.dbt.drop_table": {"name": "drop_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\table\\drop.sql", "original_file_path": "macros\\relations\\table\\drop.sql", "unique_id": "macro.dbt.drop_table", "macro_sql": "{% macro drop_table(relation) -%}\n {{- adapter.dispatch('drop_table', 'dbt')(relation) -}}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__drop_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.4796362, "supported_languages": null}, "macro.dbt.default__drop_table": {"name": "default__drop_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\table\\drop.sql", "original_file_path": "macros\\relations\\table\\drop.sql", "unique_id": "macro.dbt.default__drop_table", "macro_sql": "{% macro default__drop_table(relation) -%}\n drop table if exists {{ relation.render() }} cascade\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.480656, "supported_languages": null}, "macro.dbt.get_rename_table_sql": {"name": "get_rename_table_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\table\\rename.sql", "original_file_path": "macros\\relations\\table\\rename.sql", "unique_id": "macro.dbt.get_rename_table_sql", "macro_sql": "{% macro get_rename_table_sql(relation, new_name) %}\n {{- adapter.dispatch('get_rename_table_sql', 'dbt')(relation, new_name) -}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_rename_table_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "new_name", "type": null, "description": ""}], "created_at": 1785250505.480656, "supported_languages": null}, "macro.dbt.default__get_rename_table_sql": {"name": "default__get_rename_table_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\table\\rename.sql", "original_file_path": "macros\\relations\\table\\rename.sql", "unique_id": "macro.dbt.default__get_rename_table_sql", "macro_sql": "{% macro default__get_rename_table_sql(relation, new_name) %}\n {{ exceptions.raise_compiler_error(\n \"`get_rename_table_sql` has not been implemented for this adapter.\"\n ) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "new_name", "type": null, "description": ""}], "created_at": 1785250505.4816575, "supported_languages": null}, "macro.dbt.get_replace_table_sql": {"name": "get_replace_table_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\table\\replace.sql", "original_file_path": "macros\\relations\\table\\replace.sql", "unique_id": "macro.dbt.get_replace_table_sql", "macro_sql": "{% macro get_replace_table_sql(relation, sql) %}\n {{- adapter.dispatch('get_replace_table_sql', 'dbt')(relation, sql) -}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_replace_table_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4816575, "supported_languages": null}, "macro.dbt.default__get_replace_table_sql": {"name": "default__get_replace_table_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\table\\replace.sql", "original_file_path": "macros\\relations\\table\\replace.sql", "unique_id": "macro.dbt.default__get_replace_table_sql", "macro_sql": "{% macro default__get_replace_table_sql(relation, sql) %}\n {{ exceptions.raise_compiler_error(\n \"`get_replace_table_sql` has not been implemented for this adapter.\"\n ) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4816575, "supported_languages": null}, "macro.dbt.get_create_view_as_sql": {"name": "get_create_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\view\\create.sql", "original_file_path": "macros\\relations\\view\\create.sql", "unique_id": "macro.dbt.get_create_view_as_sql", "macro_sql": "{% macro get_create_view_as_sql(relation, sql) -%}\n {{ adapter.dispatch('get_create_view_as_sql', 'dbt')(relation, sql) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_create_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4826534, "supported_languages": null}, "macro.dbt.default__get_create_view_as_sql": {"name": "default__get_create_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\view\\create.sql", "original_file_path": "macros\\relations\\view\\create.sql", "unique_id": "macro.dbt.default__get_create_view_as_sql", "macro_sql": "{% macro default__get_create_view_as_sql(relation, sql) -%}\n {{ return(create_view_as(relation, sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.create_view_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.483658, "supported_languages": null}, "macro.dbt.create_view_as": {"name": "create_view_as", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\view\\create.sql", "original_file_path": "macros\\relations\\view\\create.sql", "unique_id": "macro.dbt.create_view_as", "macro_sql": "{% macro create_view_as(relation, sql) -%}\n {{ adapter.dispatch('create_view_as', 'dbt')(relation, sql) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__create_view_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.483658, "supported_languages": null}, "macro.dbt.default__create_view_as": {"name": "default__create_view_as", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\view\\create.sql", "original_file_path": "macros\\relations\\view\\create.sql", "unique_id": "macro.dbt.default__create_view_as", "macro_sql": "{% macro default__create_view_as(relation, sql) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {{ sql_header if sql_header is not none }}\n create view {{ relation.render() }}\n {% set contract_config = config.get('contract') %}\n {% if contract_config.enforced %}\n {{ get_assert_columns_equivalent(sql) }}\n {%- endif %}\n as (\n {{ sql }}\n );\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_assert_columns_equivalent"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4846509, "supported_languages": null}, "macro.dbt.drop_view": {"name": "drop_view", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\view\\drop.sql", "original_file_path": "macros\\relations\\view\\drop.sql", "unique_id": "macro.dbt.drop_view", "macro_sql": "{% macro drop_view(relation) -%}\n {{- adapter.dispatch('drop_view', 'dbt')(relation) -}}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__drop_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.485658, "supported_languages": null}, "macro.dbt.default__drop_view": {"name": "default__drop_view", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\view\\drop.sql", "original_file_path": "macros\\relations\\view\\drop.sql", "unique_id": "macro.dbt.default__drop_view", "macro_sql": "{% macro default__drop_view(relation) -%}\n drop view if exists {{ relation.render() }} cascade\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.485658, "supported_languages": null}, "macro.dbt.get_rename_view_sql": {"name": "get_rename_view_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\view\\rename.sql", "original_file_path": "macros\\relations\\view\\rename.sql", "unique_id": "macro.dbt.get_rename_view_sql", "macro_sql": "{% macro get_rename_view_sql(relation, new_name) %}\n {{- adapter.dispatch('get_rename_view_sql', 'dbt')(relation, new_name) -}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_rename_view_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "new_name", "type": null, "description": ""}], "created_at": 1785250505.485658, "supported_languages": null}, "macro.dbt.default__get_rename_view_sql": {"name": "default__get_rename_view_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\view\\rename.sql", "original_file_path": "macros\\relations\\view\\rename.sql", "unique_id": "macro.dbt.default__get_rename_view_sql", "macro_sql": "{% macro default__get_rename_view_sql(relation, new_name) %}\n {{ exceptions.raise_compiler_error(\n \"`get_rename_view_sql` has not been implemented for this adapter.\"\n ) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "new_name", "type": null, "description": ""}], "created_at": 1785250505.4866512, "supported_languages": null}, "macro.dbt.get_replace_view_sql": {"name": "get_replace_view_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\view\\replace.sql", "original_file_path": "macros\\relations\\view\\replace.sql", "unique_id": "macro.dbt.get_replace_view_sql", "macro_sql": "{% macro get_replace_view_sql(relation, sql) %}\n {{- adapter.dispatch('get_replace_view_sql', 'dbt')(relation, sql) -}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__get_replace_view_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4876564, "supported_languages": null}, "macro.dbt.default__get_replace_view_sql": {"name": "default__get_replace_view_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\view\\replace.sql", "original_file_path": "macros\\relations\\view\\replace.sql", "unique_id": "macro.dbt.default__get_replace_view_sql", "macro_sql": "{% macro default__get_replace_view_sql(relation, sql) %}\n {{ exceptions.raise_compiler_error(\n \"`get_replace_view_sql` has not been implemented for this adapter.\"\n ) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "sql", "type": null, "description": ""}], "created_at": 1785250505.4876564, "supported_languages": null}, "macro.dbt.create_or_replace_view": {"name": "create_or_replace_view", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\view\\replace.sql", "original_file_path": "macros\\relations\\view\\replace.sql", "unique_id": "macro.dbt.create_or_replace_view", "macro_sql": "{% macro create_or_replace_view() %}\n {%- set identifier = model['alias'] -%}\n\n {%- set old_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier) -%}\n {%- set exists_as_view = (old_relation is not none and old_relation.is_view) -%}\n\n {%- set target_relation = api.Relation.create(\n identifier=identifier, schema=schema, database=database,\n type='view') -%}\n {% set grant_config = config.get('grants') %}\n\n {{ run_hooks(pre_hooks) }}\n\n -- If there's a table with the same name and we weren't told to full refresh,\n -- that's an error. If we were told to full refresh, drop it. This behavior differs\n -- for Snowflake and BigQuery, so multiple dispatch is used.\n {%- if old_relation is not none and old_relation.is_table -%}\n {{ handle_existing_table(should_full_refresh(), old_relation) }}\n {%- endif -%}\n\n -- build model\n {% call statement('main') -%}\n {{ get_create_view_as_sql(target_relation, sql) }}\n {%- endcall %}\n\n {% set should_revoke = should_revoke(exists_as_view, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {{ run_hooks(post_hooks) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_hooks", "macro.dbt.handle_existing_table", "macro.dbt.should_full_refresh", "macro.dbt.statement", "macro.dbt.get_create_view_as_sql", "macro.dbt.should_revoke", "macro.dbt.apply_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.4896553, "supported_languages": null}, "macro.dbt.handle_existing_table": {"name": "handle_existing_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\view\\replace.sql", "original_file_path": "macros\\relations\\view\\replace.sql", "unique_id": "macro.dbt.handle_existing_table", "macro_sql": "{% macro handle_existing_table(full_refresh, old_relation) %}\n {{ adapter.dispatch('handle_existing_table', 'dbt')(full_refresh, old_relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__handle_existing_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "full_refresh", "type": null, "description": ""}, {"name": "old_relation", "type": null, "description": ""}], "created_at": 1785250505.4906507, "supported_languages": null}, "macro.dbt.default__handle_existing_table": {"name": "default__handle_existing_table", "resource_type": "macro", "package_name": "dbt", "path": "macros\\relations\\view\\replace.sql", "original_file_path": "macros\\relations\\view\\replace.sql", "unique_id": "macro.dbt.default__handle_existing_table", "macro_sql": "{% macro default__handle_existing_table(full_refresh, old_relation) %}\n {{ log(\"Dropping relation \" ~ old_relation.render() ~ \" because it is of type \" ~ old_relation.type) }}\n {{ adapter.drop_relation(old_relation) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "full_refresh", "type": null, "description": ""}, {"name": "old_relation", "type": null, "description": ""}], "created_at": 1785250505.4906507, "supported_languages": null}, "macro.dbt.get_fixture_sql": {"name": "get_fixture_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\unit_test_sql\\get_fixture_sql.sql", "original_file_path": "macros\\unit_test_sql\\get_fixture_sql.sql", "unique_id": "macro.dbt.get_fixture_sql", "macro_sql": "{% macro get_fixture_sql(rows, column_name_to_data_types) %}\n-- Fixture for {{ model.name }}\n{% set default_row = {} %}\n\n{%- if not column_name_to_data_types -%}\n{#-- Use defer_relation IFF it is available in the manifest and 'this' is missing from the database --#}\n{%- set this_or_defer_relation = defer_relation if (defer_relation and not load_relation(this)) else this -%}\n{%- set columns_in_relation = adapter.get_columns_in_relation(this_or_defer_relation) -%}\n\n{%- set column_name_to_data_types = {} -%}\n{%- set column_name_to_quoted = {} -%}\n{%- for column in columns_in_relation -%}\n\n{#-- This needs to be a case-insensitive comparison --#}\n{%- do column_name_to_data_types.update({column.name|lower: column.data_type}) -%}\n{%- do column_name_to_quoted.update({column.name|lower: column.quoted}) -%}\n{%- endfor -%}\n{%- endif -%}\n\n{%- if not column_name_to_data_types -%}\n {{ exceptions.raise_compiler_error(\"Not able to get columns for unit test '\" ~ model.name ~ \"' from relation \" ~ this ~ \" because the relation doesn't exist\") }}\n{%- endif -%}\n\n{%- for column_name, column_type in column_name_to_data_types.items() -%}\n {%- do default_row.update({column_name: (safe_cast(\"null\", column_type) | trim )}) -%}\n{%- endfor -%}\n\n{{ validate_fixture_rows(rows, row_number) }}\n\n{%- for row in rows -%}\n{%- set formatted_row = format_row(row, column_name_to_data_types) -%}\n{%- set default_row_copy = default_row.copy() -%}\n{%- do default_row_copy.update(formatted_row) -%}\nselect\n{%- for column_name, column_value in default_row_copy.items() %} {{ column_value }} as {{ column_name_to_quoted[column_name] }}{% if not loop.last -%}, {%- endif %}\n{%- endfor %}\n{%- if not loop.last %}\nunion all\n{% endif %}\n{%- endfor -%}\n\n{%- if (rows | length) == 0 -%}\n select\n {%- for column_name, column_value in default_row.items() %} {{ column_value }} as {{ column_name_to_quoted[column_name] }}{% if not loop.last -%},{%- endif %}\n {%- endfor %}\n limit 0\n{%- endif -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.load_relation", "macro.dbt.safe_cast", "macro.dbt.validate_fixture_rows", "macro.dbt.format_row"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "rows", "type": null, "description": ""}, {"name": "column_name_to_data_types", "type": null, "description": ""}], "created_at": 1785250505.4961996, "supported_languages": null}, "macro.dbt.get_expected_sql": {"name": "get_expected_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros\\unit_test_sql\\get_fixture_sql.sql", "original_file_path": "macros\\unit_test_sql\\get_fixture_sql.sql", "unique_id": "macro.dbt.get_expected_sql", "macro_sql": "{% macro get_expected_sql(rows, column_name_to_data_types, column_name_to_quoted) %}\n\n{%- if (rows | length) == 0 -%}\n select * from dbt_internal_unit_test_actual\n limit 0\n{%- else -%}\n{%- for row in rows -%}\n{%- set formatted_row = format_row(row, column_name_to_data_types) -%}\nselect\n{%- for column_name, column_value in formatted_row.items() %} {{ column_value }} as {{ column_name_to_quoted[column_name] }}{% if not loop.last -%}, {%- endif %}\n{%- endfor %}\n{%- if not loop.last %}\nunion all\n{% endif %}\n{%- endfor -%}\n{%- endif -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.format_row"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "rows", "type": null, "description": ""}, {"name": "column_name_to_data_types", "type": null, "description": ""}, {"name": "column_name_to_quoted", "type": null, "description": ""}], "created_at": 1785250505.4982004, "supported_languages": null}, "macro.dbt.format_row": {"name": "format_row", "resource_type": "macro", "package_name": "dbt", "path": "macros\\unit_test_sql\\get_fixture_sql.sql", "original_file_path": "macros\\unit_test_sql\\get_fixture_sql.sql", "unique_id": "macro.dbt.format_row", "macro_sql": "\n\n{%- macro format_row(row, column_name_to_data_types) -%}\n {#-- generate case-insensitive formatted row --#}\n {% set formatted_row = {} %}\n {%- for column_name, column_value in row.items() -%}\n {% set column_name = column_name|lower %}\n\n {%- if column_name not in column_name_to_data_types %}\n {#-- if user-provided row contains column name that relation does not contain, raise an error --#}\n {% set fixture_name = \"expected output\" if model.resource_type == 'unit_test' else (\"'\" ~ model.name ~ \"'\") %}\n {{ exceptions.raise_compiler_error(\n \"Invalid column name: '\" ~ column_name ~ \"' in unit test fixture for \" ~ fixture_name ~ \".\"\n \"\\nAccepted columns for \" ~ fixture_name ~ \" are: \" ~ (column_name_to_data_types.keys()|list)\n ) }}\n {%- endif -%}\n\n {%- set column_type = column_name_to_data_types[column_name] %}\n\n {#-- For string fixture values, strip varchar length to prevent silent truncation (GH-11974) --#}\n {%- if column_value is string and 'varying' in column_type -%}\n {%- set column_type = column_type.split('(')[0] -%}\n {%- endif -%}\n\n {#-- sanitize column_value: wrap yaml strings in quotes, apply cast --#}\n {%- set column_value_clean = column_value -%}\n {%- if column_value is string -%}\n {%- set column_value_clean = dbt.string_literal(dbt.escape_single_quotes(column_value)) -%}\n {%- elif column_value is none -%}\n {%- set column_value_clean = 'null' -%}\n {%- endif -%}\n\n {%- set row_update = {column_name: safe_cast(column_value_clean, column_type) } -%}\n {%- do formatted_row.update(row_update) -%}\n {%- endfor -%}\n {{ return(formatted_row) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.string_literal", "macro.dbt.escape_single_quotes", "macro.dbt.safe_cast"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "row", "type": null, "description": ""}, {"name": "column_name_to_data_types", "type": null, "description": ""}], "created_at": 1785250505.5001986, "supported_languages": null}, "macro.dbt.validate_fixture_rows": {"name": "validate_fixture_rows", "resource_type": "macro", "package_name": "dbt", "path": "macros\\unit_test_sql\\get_fixture_sql.sql", "original_file_path": "macros\\unit_test_sql\\get_fixture_sql.sql", "unique_id": "macro.dbt.validate_fixture_rows", "macro_sql": "{%- macro validate_fixture_rows(rows, row_number) -%}\n {{ return(adapter.dispatch('validate_fixture_rows', 'dbt')(rows, row_number)) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__validate_fixture_rows"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "rows", "type": null, "description": ""}, {"name": "row_number", "type": null, "description": ""}], "created_at": 1785250505.501206, "supported_languages": null}, "macro.dbt.default__validate_fixture_rows": {"name": "default__validate_fixture_rows", "resource_type": "macro", "package_name": "dbt", "path": "macros\\unit_test_sql\\get_fixture_sql.sql", "original_file_path": "macros\\unit_test_sql\\get_fixture_sql.sql", "unique_id": "macro.dbt.default__validate_fixture_rows", "macro_sql": "{%- macro default__validate_fixture_rows(rows, row_number) -%}\n {# This is an abstract method for adapter overrides as needed #}\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "rows", "type": null, "description": ""}, {"name": "row_number", "type": null, "description": ""}], "created_at": 1785250505.501206, "supported_languages": null}, "macro.dbt.any_value": {"name": "any_value", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\any_value.sql", "original_file_path": "macros\\utils\\any_value.sql", "unique_id": "macro.dbt.any_value", "macro_sql": "{% macro any_value(expression) -%}\n {{ return(adapter.dispatch('any_value', 'dbt') (expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__any_value"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expression", "type": null, "description": ""}], "created_at": 1785250505.5022063, "supported_languages": null}, "macro.dbt.default__any_value": {"name": "default__any_value", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\any_value.sql", "original_file_path": "macros\\utils\\any_value.sql", "unique_id": "macro.dbt.default__any_value", "macro_sql": "{% macro default__any_value(expression) -%}\n\n any_value({{ expression }})\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expression", "type": null, "description": ""}], "created_at": 1785250505.5022063, "supported_languages": null}, "macro.dbt.array_append": {"name": "array_append", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\array_append.sql", "original_file_path": "macros\\utils\\array_append.sql", "unique_id": "macro.dbt.array_append", "macro_sql": "{% macro array_append(array, new_element) -%}\n {{ return(adapter.dispatch('array_append', 'dbt')(array, new_element)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__array_append"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "array", "type": null, "description": ""}, {"name": "new_element", "type": null, "description": ""}], "created_at": 1785250505.5032074, "supported_languages": null}, "macro.dbt.default__array_append": {"name": "default__array_append", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\array_append.sql", "original_file_path": "macros\\utils\\array_append.sql", "unique_id": "macro.dbt.default__array_append", "macro_sql": "{% macro default__array_append(array, new_element) -%}\n array_append({{ array }}, {{ new_element }})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "array", "type": null, "description": ""}, {"name": "new_element", "type": null, "description": ""}], "created_at": 1785250505.5032074, "supported_languages": null}, "macro.dbt.array_concat": {"name": "array_concat", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\array_concat.sql", "original_file_path": "macros\\utils\\array_concat.sql", "unique_id": "macro.dbt.array_concat", "macro_sql": "{% macro array_concat(array_1, array_2) -%}\n {{ return(adapter.dispatch('array_concat', 'dbt')(array_1, array_2)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__array_concat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "array_1", "type": null, "description": ""}, {"name": "array_2", "type": null, "description": ""}], "created_at": 1785250505.5032074, "supported_languages": null}, "macro.dbt.default__array_concat": {"name": "default__array_concat", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\array_concat.sql", "original_file_path": "macros\\utils\\array_concat.sql", "unique_id": "macro.dbt.default__array_concat", "macro_sql": "{% macro default__array_concat(array_1, array_2) -%}\n array_cat({{ array_1 }}, {{ array_2 }})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "array_1", "type": null, "description": ""}, {"name": "array_2", "type": null, "description": ""}], "created_at": 1785250505.5042, "supported_languages": null}, "macro.dbt.array_construct": {"name": "array_construct", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\array_construct.sql", "original_file_path": "macros\\utils\\array_construct.sql", "unique_id": "macro.dbt.array_construct", "macro_sql": "{% macro array_construct(inputs=[], data_type=api.Column.translate_type('integer')) -%}\n {{ return(adapter.dispatch('array_construct', 'dbt')(inputs, data_type)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__array_construct"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "inputs", "type": null, "description": ""}, {"name": "data_type", "type": null, "description": ""}], "created_at": 1785250505.5042, "supported_languages": null}, "macro.dbt.default__array_construct": {"name": "default__array_construct", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\array_construct.sql", "original_file_path": "macros\\utils\\array_construct.sql", "unique_id": "macro.dbt.default__array_construct", "macro_sql": "{% macro default__array_construct(inputs, data_type) -%}\n {% if inputs|length > 0 %}\n array[ {{ inputs|join(' , ') }} ]\n {% else %}\n array[]::{{data_type}}[]\n {% endif %}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "inputs", "type": null, "description": ""}, {"name": "data_type", "type": null, "description": ""}], "created_at": 1785250505.505205, "supported_languages": null}, "macro.dbt.bool_or": {"name": "bool_or", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\bool_or.sql", "original_file_path": "macros\\utils\\bool_or.sql", "unique_id": "macro.dbt.bool_or", "macro_sql": "{% macro bool_or(expression) -%}\n {{ return(adapter.dispatch('bool_or', 'dbt') (expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__bool_or"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expression", "type": null, "description": ""}], "created_at": 1785250505.505205, "supported_languages": null}, "macro.dbt.default__bool_or": {"name": "default__bool_or", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\bool_or.sql", "original_file_path": "macros\\utils\\bool_or.sql", "unique_id": "macro.dbt.default__bool_or", "macro_sql": "{% macro default__bool_or(expression) -%}\n\n bool_or({{ expression }})\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expression", "type": null, "description": ""}], "created_at": 1785250505.5062041, "supported_languages": null}, "macro.dbt.cast": {"name": "cast", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\cast.sql", "original_file_path": "macros\\utils\\cast.sql", "unique_id": "macro.dbt.cast", "macro_sql": "{% macro cast(field, type) %}\n {{ return(adapter.dispatch('cast', 'dbt') (field, type)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__cast"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}, {"name": "type", "type": null, "description": ""}], "created_at": 1785250505.5062041, "supported_languages": null}, "macro.dbt.default__cast": {"name": "default__cast", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\cast.sql", "original_file_path": "macros\\utils\\cast.sql", "unique_id": "macro.dbt.default__cast", "macro_sql": "{% macro default__cast(field, type) %}\n cast({{field}} as {{type}})\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}, {"name": "type", "type": null, "description": ""}], "created_at": 1785250505.507199, "supported_languages": null}, "macro.dbt.cast_bool_to_text": {"name": "cast_bool_to_text", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\cast_bool_to_text.sql", "original_file_path": "macros\\utils\\cast_bool_to_text.sql", "unique_id": "macro.dbt.cast_bool_to_text", "macro_sql": "{% macro cast_bool_to_text(field) %}\n {{ adapter.dispatch('cast_bool_to_text', 'dbt') (field) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__cast_bool_to_text"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}], "created_at": 1785250505.507199, "supported_languages": null}, "macro.dbt.default__cast_bool_to_text": {"name": "default__cast_bool_to_text", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\cast_bool_to_text.sql", "original_file_path": "macros\\utils\\cast_bool_to_text.sql", "unique_id": "macro.dbt.default__cast_bool_to_text", "macro_sql": "{% macro default__cast_bool_to_text(field) %}\n cast({{ field }} as {{ api.Column.translate_type('string') }})\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}], "created_at": 1785250505.507199, "supported_languages": null}, "macro.dbt.concat": {"name": "concat", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\concat.sql", "original_file_path": "macros\\utils\\concat.sql", "unique_id": "macro.dbt.concat", "macro_sql": "{% macro concat(fields) -%}\n {{ return(adapter.dispatch('concat', 'dbt')(fields)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__concat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "fields", "type": null, "description": ""}], "created_at": 1785250505.5082061, "supported_languages": null}, "macro.dbt.default__concat": {"name": "default__concat", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\concat.sql", "original_file_path": "macros\\utils\\concat.sql", "unique_id": "macro.dbt.default__concat", "macro_sql": "{% macro default__concat(fields) -%}\n {{ fields|join(' || ') }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "fields", "type": null, "description": ""}], "created_at": 1785250505.5082061, "supported_languages": null}, "macro.dbt.type_string": {"name": "type_string", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\data_types.sql", "original_file_path": "macros\\utils\\data_types.sql", "unique_id": "macro.dbt.type_string", "macro_sql": "\n\n{%- macro type_string() -%}\n {{ return(adapter.dispatch('type_string', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_string"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.510198, "supported_languages": null}, "macro.dbt.default__type_string": {"name": "default__type_string", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\data_types.sql", "original_file_path": "macros\\utils\\data_types.sql", "unique_id": "macro.dbt.default__type_string", "macro_sql": "{% macro default__type_string() %}\n {{ return(api.Column.translate_type(\"string\")) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.510198, "supported_languages": null}, "macro.dbt.type_timestamp": {"name": "type_timestamp", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\data_types.sql", "original_file_path": "macros\\utils\\data_types.sql", "unique_id": "macro.dbt.type_timestamp", "macro_sql": "\n\n{%- macro type_timestamp() -%}\n {{ return(adapter.dispatch('type_timestamp', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.510198, "supported_languages": null}, "macro.dbt.default__type_timestamp": {"name": "default__type_timestamp", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\data_types.sql", "original_file_path": "macros\\utils\\data_types.sql", "unique_id": "macro.dbt.default__type_timestamp", "macro_sql": "{% macro default__type_timestamp() %}\n {{ return(api.Column.translate_type(\"timestamp\")) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5111995, "supported_languages": null}, "macro.dbt.type_float": {"name": "type_float", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\data_types.sql", "original_file_path": "macros\\utils\\data_types.sql", "unique_id": "macro.dbt.type_float", "macro_sql": "\n\n{%- macro type_float() -%}\n {{ return(adapter.dispatch('type_float', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_float"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5111995, "supported_languages": null}, "macro.dbt.default__type_float": {"name": "default__type_float", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\data_types.sql", "original_file_path": "macros\\utils\\data_types.sql", "unique_id": "macro.dbt.default__type_float", "macro_sql": "{% macro default__type_float() %}\n {{ return(api.Column.translate_type(\"float\")) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5111995, "supported_languages": null}, "macro.dbt.type_numeric": {"name": "type_numeric", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\data_types.sql", "original_file_path": "macros\\utils\\data_types.sql", "unique_id": "macro.dbt.type_numeric", "macro_sql": "\n\n{%- macro type_numeric() -%}\n {{ return(adapter.dispatch('type_numeric', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_numeric"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5122058, "supported_languages": null}, "macro.dbt.default__type_numeric": {"name": "default__type_numeric", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\data_types.sql", "original_file_path": "macros\\utils\\data_types.sql", "unique_id": "macro.dbt.default__type_numeric", "macro_sql": "{% macro default__type_numeric() %}\n {{ return(api.Column.numeric_type(\"numeric\", 28, 6)) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5122058, "supported_languages": null}, "macro.dbt.type_bigint": {"name": "type_bigint", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\data_types.sql", "original_file_path": "macros\\utils\\data_types.sql", "unique_id": "macro.dbt.type_bigint", "macro_sql": "\n\n{%- macro type_bigint() -%}\n {{ return(adapter.dispatch('type_bigint', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_bigint"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5122058, "supported_languages": null}, "macro.dbt.default__type_bigint": {"name": "default__type_bigint", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\data_types.sql", "original_file_path": "macros\\utils\\data_types.sql", "unique_id": "macro.dbt.default__type_bigint", "macro_sql": "{% macro default__type_bigint() %}\n {{ return(api.Column.translate_type(\"bigint\")) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5131986, "supported_languages": null}, "macro.dbt.type_int": {"name": "type_int", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\data_types.sql", "original_file_path": "macros\\utils\\data_types.sql", "unique_id": "macro.dbt.type_int", "macro_sql": "\n\n{%- macro type_int() -%}\n {{ return(adapter.dispatch('type_int', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_int"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5131986, "supported_languages": null}, "macro.dbt.default__type_int": {"name": "default__type_int", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\data_types.sql", "original_file_path": "macros\\utils\\data_types.sql", "unique_id": "macro.dbt.default__type_int", "macro_sql": "{%- macro default__type_int() -%}\n {{ return(api.Column.translate_type(\"integer\")) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5131986, "supported_languages": null}, "macro.dbt.type_boolean": {"name": "type_boolean", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\data_types.sql", "original_file_path": "macros\\utils\\data_types.sql", "unique_id": "macro.dbt.type_boolean", "macro_sql": "\n\n{%- macro type_boolean() -%}\n {{ return(adapter.dispatch('type_boolean', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_boolean"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5142062, "supported_languages": null}, "macro.dbt.default__type_boolean": {"name": "default__type_boolean", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\data_types.sql", "original_file_path": "macros\\utils\\data_types.sql", "unique_id": "macro.dbt.default__type_boolean", "macro_sql": "{%- macro default__type_boolean() -%}\n {{ return(api.Column.translate_type(\"boolean\")) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5142062, "supported_languages": null}, "macro.dbt.date": {"name": "date", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\date.sql", "original_file_path": "macros\\utils\\date.sql", "unique_id": "macro.dbt.date", "macro_sql": "{% macro date(year, month, day) %}\n {{ return(adapter.dispatch('date', 'dbt') (year, month, day)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__date"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "year", "type": null, "description": ""}, {"name": "month", "type": null, "description": ""}, {"name": "day", "type": null, "description": ""}], "created_at": 1785250505.5152009, "supported_languages": null}, "macro.dbt.default__date": {"name": "default__date", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\date.sql", "original_file_path": "macros\\utils\\date.sql", "unique_id": "macro.dbt.default__date", "macro_sql": "{% macro default__date(year, month, day) -%}\n {%- set dt = modules.datetime.date(year, month, day) -%}\n {%- set iso_8601_formatted_date = dt.strftime('%Y-%m-%d') -%}\n to_date('{{ iso_8601_formatted_date }}', 'YYYY-MM-DD')\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "year", "type": null, "description": ""}, {"name": "month", "type": null, "description": ""}, {"name": "day", "type": null, "description": ""}], "created_at": 1785250505.5152009, "supported_languages": null}, "macro.dbt.dateadd": {"name": "dateadd", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\dateadd.sql", "original_file_path": "macros\\utils\\dateadd.sql", "unique_id": "macro.dbt.dateadd", "macro_sql": "{% macro dateadd(datepart, interval, from_date_or_timestamp) %}\n {{ return(adapter.dispatch('dateadd', 'dbt')(datepart, interval, from_date_or_timestamp)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__dateadd"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "datepart", "type": null, "description": ""}, {"name": "interval", "type": null, "description": ""}, {"name": "from_date_or_timestamp", "type": null, "description": ""}], "created_at": 1785250505.5162077, "supported_languages": null}, "macro.dbt.default__dateadd": {"name": "default__dateadd", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\dateadd.sql", "original_file_path": "macros\\utils\\dateadd.sql", "unique_id": "macro.dbt.default__dateadd", "macro_sql": "{% macro default__dateadd(datepart, interval, from_date_or_timestamp) %}\n\n dateadd(\n {{ datepart }},\n {{ interval }},\n {{ from_date_or_timestamp }}\n )\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "datepart", "type": null, "description": ""}, {"name": "interval", "type": null, "description": ""}, {"name": "from_date_or_timestamp", "type": null, "description": ""}], "created_at": 1785250505.5162077, "supported_languages": null}, "macro.dbt.datediff": {"name": "datediff", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\datediff.sql", "original_file_path": "macros\\utils\\datediff.sql", "unique_id": "macro.dbt.datediff", "macro_sql": "{% macro datediff(first_date, second_date, datepart) %}\n {{ return(adapter.dispatch('datediff', 'dbt')(first_date, second_date, datepart)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__datediff"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "first_date", "type": null, "description": ""}, {"name": "second_date", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}], "created_at": 1785250505.5171998, "supported_languages": null}, "macro.dbt.default__datediff": {"name": "default__datediff", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\datediff.sql", "original_file_path": "macros\\utils\\datediff.sql", "unique_id": "macro.dbt.default__datediff", "macro_sql": "{% macro default__datediff(first_date, second_date, datepart) -%}\n\n datediff(\n {{ datepart }},\n {{ first_date }},\n {{ second_date }}\n )\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "first_date", "type": null, "description": ""}, {"name": "second_date", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}], "created_at": 1785250505.5171998, "supported_languages": null}, "macro.dbt.get_intervals_between": {"name": "get_intervals_between", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\date_spine.sql", "original_file_path": "macros\\utils\\date_spine.sql", "unique_id": "macro.dbt.get_intervals_between", "macro_sql": "{% macro get_intervals_between(start_date, end_date, datepart) -%}\n {{ return(adapter.dispatch('get_intervals_between', 'dbt')(start_date, end_date, datepart)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_intervals_between"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "start_date", "type": null, "description": ""}, {"name": "end_date", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}], "created_at": 1785250505.5182025, "supported_languages": null}, "macro.dbt.default__get_intervals_between": {"name": "default__get_intervals_between", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\date_spine.sql", "original_file_path": "macros\\utils\\date_spine.sql", "unique_id": "macro.dbt.default__get_intervals_between", "macro_sql": "{% macro default__get_intervals_between(start_date, end_date, datepart) -%}\n {%- call statement('get_intervals_between', fetch_result=True) %}\n\n select {{ dbt.datediff(start_date, end_date, datepart) }}\n\n {%- endcall -%}\n\n {%- set value_list = load_result('get_intervals_between') -%}\n\n {%- if value_list and value_list['data'] -%}\n {%- set values = value_list['data'] | map(attribute=0) | list %}\n {{ return(values[0]) }}\n {%- else -%}\n {{ return(1) }}\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.datediff"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "start_date", "type": null, "description": ""}, {"name": "end_date", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}], "created_at": 1785250505.5202026, "supported_languages": null}, "macro.dbt.date_spine": {"name": "date_spine", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\date_spine.sql", "original_file_path": "macros\\utils\\date_spine.sql", "unique_id": "macro.dbt.date_spine", "macro_sql": "{% macro date_spine(datepart, start_date, end_date) %}\n {{ return(adapter.dispatch('date_spine', 'dbt')(datepart, start_date, end_date)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__date_spine"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "datepart", "type": null, "description": ""}, {"name": "start_date", "type": null, "description": ""}, {"name": "end_date", "type": null, "description": ""}], "created_at": 1785250505.5202026, "supported_languages": null}, "macro.dbt.default__date_spine": {"name": "default__date_spine", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\date_spine.sql", "original_file_path": "macros\\utils\\date_spine.sql", "unique_id": "macro.dbt.default__date_spine", "macro_sql": "{% macro default__date_spine(datepart, start_date, end_date) %}\n\n\n {# call as follows:\n\n date_spine(\n \"day\",\n \"to_date('01/01/2016', 'mm/dd/yyyy')\",\n \"dbt.dateadd(week, 1, current_date)\"\n ) #}\n\n\n with rawdata as (\n\n {{dbt.generate_series(\n dbt.get_intervals_between(start_date, end_date, datepart)\n )}}\n\n ),\n\n all_periods as (\n\n select (\n {{\n dbt.dateadd(\n datepart,\n \"row_number() over (order by 1) - 1\",\n start_date\n )\n }}\n ) as date_{{datepart}}\n from rawdata\n\n ),\n\n filtered as (\n\n select *\n from all_periods\n where date_{{datepart}} <= {{ end_date }}\n\n )\n\n select * from filtered\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.generate_series", "macro.dbt.get_intervals_between", "macro.dbt.dateadd"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "datepart", "type": null, "description": ""}, {"name": "start_date", "type": null, "description": ""}, {"name": "end_date", "type": null, "description": ""}], "created_at": 1785250505.5211976, "supported_languages": null}, "macro.dbt.date_trunc": {"name": "date_trunc", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\date_trunc.sql", "original_file_path": "macros\\utils\\date_trunc.sql", "unique_id": "macro.dbt.date_trunc", "macro_sql": "{% macro date_trunc(datepart, date) -%}\n {{ return(adapter.dispatch('date_trunc', 'dbt') (datepart, date)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__date_trunc"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "datepart", "type": null, "description": ""}, {"name": "date", "type": null, "description": ""}], "created_at": 1785250505.5221999, "supported_languages": null}, "macro.dbt.default__date_trunc": {"name": "default__date_trunc", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\date_trunc.sql", "original_file_path": "macros\\utils\\date_trunc.sql", "unique_id": "macro.dbt.default__date_trunc", "macro_sql": "{% macro default__date_trunc(datepart, date) -%}\n date_trunc('{{datepart}}', {{date}})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "datepart", "type": null, "description": ""}, {"name": "date", "type": null, "description": ""}], "created_at": 1785250505.5221999, "supported_languages": null}, "macro.dbt.equals": {"name": "equals", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\equals.sql", "original_file_path": "macros\\utils\\equals.sql", "unique_id": "macro.dbt.equals", "macro_sql": "{% macro equals(expr1, expr2) %}\n {{ return(adapter.dispatch('equals', 'dbt') (expr1, expr2)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__equals"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expr1", "type": null, "description": ""}, {"name": "expr2", "type": null, "description": ""}], "created_at": 1785250505.5232027, "supported_languages": null}, "macro.dbt.default__equals": {"name": "default__equals", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\equals.sql", "original_file_path": "macros\\utils\\equals.sql", "unique_id": "macro.dbt.default__equals", "macro_sql": "{% macro default__equals(expr1, expr2) -%}\n{%- if adapter.behavior.enable_truthy_nulls_equals_macro.no_warn %}\n case when (({{ expr1 }} = {{ expr2 }}) or ({{ expr1 }} is null and {{ expr2 }} is null))\n then 0\n else 1\n end = 0\n{%- else -%}\n ({{ expr1 }} = {{ expr2 }})\n{%- endif %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expr1", "type": null, "description": ""}, {"name": "expr2", "type": null, "description": ""}], "created_at": 1785250505.5232027, "supported_languages": null}, "macro.dbt.escape_single_quotes": {"name": "escape_single_quotes", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\escape_single_quotes.sql", "original_file_path": "macros\\utils\\escape_single_quotes.sql", "unique_id": "macro.dbt.escape_single_quotes", "macro_sql": "{% macro escape_single_quotes(expression) %}\n {{ return(adapter.dispatch('escape_single_quotes', 'dbt') (expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__escape_single_quotes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expression", "type": null, "description": ""}], "created_at": 1785250505.5242043, "supported_languages": null}, "macro.dbt.default__escape_single_quotes": {"name": "default__escape_single_quotes", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\escape_single_quotes.sql", "original_file_path": "macros\\utils\\escape_single_quotes.sql", "unique_id": "macro.dbt.default__escape_single_quotes", "macro_sql": "{% macro default__escape_single_quotes(expression) -%}\n{{ expression | replace(\"'\",\"''\") }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expression", "type": null, "description": ""}], "created_at": 1785250505.5242043, "supported_languages": null}, "macro.dbt.except": {"name": "except", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\except.sql", "original_file_path": "macros\\utils\\except.sql", "unique_id": "macro.dbt.except", "macro_sql": "{% macro except() %}\n {{ return(adapter.dispatch('except', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__except"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5252056, "supported_languages": null}, "macro.dbt.default__except": {"name": "default__except", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\except.sql", "original_file_path": "macros\\utils\\except.sql", "unique_id": "macro.dbt.default__except", "macro_sql": "{% macro default__except() %}\n\n except\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5252056, "supported_languages": null}, "macro.dbt.get_powers_of_two": {"name": "get_powers_of_two", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\generate_series.sql", "original_file_path": "macros\\utils\\generate_series.sql", "unique_id": "macro.dbt.get_powers_of_two", "macro_sql": "{% macro get_powers_of_two(upper_bound) %}\n {{ return(adapter.dispatch('get_powers_of_two', 'dbt')(upper_bound)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_powers_of_two"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "upper_bound", "type": null, "description": ""}], "created_at": 1785250505.5262036, "supported_languages": null}, "macro.dbt.default__get_powers_of_two": {"name": "default__get_powers_of_two", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\generate_series.sql", "original_file_path": "macros\\utils\\generate_series.sql", "unique_id": "macro.dbt.default__get_powers_of_two", "macro_sql": "{% macro default__get_powers_of_two(upper_bound) %}\n\n {% if upper_bound <= 0 %}\n {{ exceptions.raise_compiler_error(\"upper bound must be positive\") }}\n {% endif %}\n\n {% for _ in range(1, 100) %}\n {% if upper_bound <= 2 ** loop.index %}{{ return(loop.index) }}{% endif %}\n {% endfor %}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "upper_bound", "type": null, "description": ""}], "created_at": 1785250505.5272043, "supported_languages": null}, "macro.dbt.generate_series": {"name": "generate_series", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\generate_series.sql", "original_file_path": "macros\\utils\\generate_series.sql", "unique_id": "macro.dbt.generate_series", "macro_sql": "{% macro generate_series(upper_bound) %}\n {{ return(adapter.dispatch('generate_series', 'dbt')(upper_bound)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__generate_series"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "upper_bound", "type": null, "description": ""}], "created_at": 1785250505.5272043, "supported_languages": null}, "macro.dbt.default__generate_series": {"name": "default__generate_series", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\generate_series.sql", "original_file_path": "macros\\utils\\generate_series.sql", "unique_id": "macro.dbt.default__generate_series", "macro_sql": "{% macro default__generate_series(upper_bound) %}\n\n {% set n = dbt.get_powers_of_two(upper_bound) %}\n\n with p as (\n select 0 as generated_number union all select 1\n ), unioned as (\n\n select\n\n {% for i in range(n) %}\n p{{i}}.generated_number * power(2, {{i}})\n {% if not loop.last %} + {% endif %}\n {% endfor %}\n + 1\n as generated_number\n\n from\n\n {% for i in range(n) %}\n p as p{{i}}\n {% if not loop.last %} cross join {% endif %}\n {% endfor %}\n\n )\n\n select *\n from unioned\n where generated_number <= {{upper_bound}}\n order by generated_number\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_powers_of_two"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "upper_bound", "type": null, "description": ""}], "created_at": 1785250505.528204, "supported_languages": null}, "macro.dbt.hash": {"name": "hash", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\hash.sql", "original_file_path": "macros\\utils\\hash.sql", "unique_id": "macro.dbt.hash", "macro_sql": "{% macro hash(field) -%}\n {{ return(adapter.dispatch('hash', 'dbt') (field)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__hash"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}], "created_at": 1785250505.529205, "supported_languages": null}, "macro.dbt.default__hash": {"name": "default__hash", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\hash.sql", "original_file_path": "macros\\utils\\hash.sql", "unique_id": "macro.dbt.default__hash", "macro_sql": "{% macro default__hash(field) -%}\n md5(cast({{ field }} as {{ api.Column.translate_type('string') }}))\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}], "created_at": 1785250505.529205, "supported_languages": null}, "macro.dbt.intersect": {"name": "intersect", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\intersect.sql", "original_file_path": "macros\\utils\\intersect.sql", "unique_id": "macro.dbt.intersect", "macro_sql": "{% macro intersect() %}\n {{ return(adapter.dispatch('intersect', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__intersect"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5302052, "supported_languages": null}, "macro.dbt.default__intersect": {"name": "default__intersect", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\intersect.sql", "original_file_path": "macros\\utils\\intersect.sql", "unique_id": "macro.dbt.default__intersect", "macro_sql": "{% macro default__intersect() %}\n\n intersect\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5302052, "supported_languages": null}, "macro.dbt.last_day": {"name": "last_day", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\last_day.sql", "original_file_path": "macros\\utils\\last_day.sql", "unique_id": "macro.dbt.last_day", "macro_sql": "{% macro last_day(date, datepart) %}\n {{ return(adapter.dispatch('last_day', 'dbt') (date, datepart)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__last_day"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "date", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}], "created_at": 1785250505.531204, "supported_languages": null}, "macro.dbt.default_last_day": {"name": "default_last_day", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\last_day.sql", "original_file_path": "macros\\utils\\last_day.sql", "unique_id": "macro.dbt.default_last_day", "macro_sql": "\n\n{%- macro default_last_day(date, datepart) -%}\n cast(\n {{dbt.dateadd('day', '-1',\n dbt.dateadd(datepart, '1', dbt.date_trunc(datepart, date))\n )}}\n as date)\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.dateadd", "macro.dbt.date_trunc"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "date", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}], "created_at": 1785250505.531204, "supported_languages": null}, "macro.dbt.default__last_day": {"name": "default__last_day", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\last_day.sql", "original_file_path": "macros\\utils\\last_day.sql", "unique_id": "macro.dbt.default__last_day", "macro_sql": "{% macro default__last_day(date, datepart) -%}\n {{dbt.default_last_day(date, datepart)}}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default_last_day"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "date", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}], "created_at": 1785250505.5321999, "supported_languages": null}, "macro.dbt.length": {"name": "length", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\length.sql", "original_file_path": "macros\\utils\\length.sql", "unique_id": "macro.dbt.length", "macro_sql": "{% macro length(expression) -%}\n {{ return(adapter.dispatch('length', 'dbt') (expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__length"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expression", "type": null, "description": ""}], "created_at": 1785250505.5321999, "supported_languages": null}, "macro.dbt.default__length": {"name": "default__length", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\length.sql", "original_file_path": "macros\\utils\\length.sql", "unique_id": "macro.dbt.default__length", "macro_sql": "{% macro default__length(expression) %}\n\n length(\n {{ expression }}\n )\n\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expression", "type": null, "description": ""}], "created_at": 1785250505.5321999, "supported_languages": null}, "macro.dbt.listagg": {"name": "listagg", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\listagg.sql", "original_file_path": "macros\\utils\\listagg.sql", "unique_id": "macro.dbt.listagg", "macro_sql": "{% macro listagg(measure, delimiter_text=\"','\", order_by_clause=none, limit_num=none) -%}\n {{ return(adapter.dispatch('listagg', 'dbt') (measure, delimiter_text, order_by_clause, limit_num)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__listagg"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "measure", "type": null, "description": ""}, {"name": "delimiter_text", "type": null, "description": ""}, {"name": "order_by_clause", "type": null, "description": ""}, {"name": "limit_num", "type": null, "description": ""}], "created_at": 1785250505.5332053, "supported_languages": null}, "macro.dbt.default__listagg": {"name": "default__listagg", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\listagg.sql", "original_file_path": "macros\\utils\\listagg.sql", "unique_id": "macro.dbt.default__listagg", "macro_sql": "{% macro default__listagg(measure, delimiter_text, order_by_clause, limit_num) -%}\n\n {% if limit_num -%}\n array_to_string(\n array_slice(\n array_agg(\n {{ measure }}\n ){% if order_by_clause -%}\n within group ({{ order_by_clause }})\n {%- endif %}\n ,0\n ,{{ limit_num }}\n ),\n {{ delimiter_text }}\n )\n {%- else %}\n listagg(\n {{ measure }},\n {{ delimiter_text }}\n )\n {% if order_by_clause -%}\n within group ({{ order_by_clause }})\n {%- endif %}\n {%- endif %}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "measure", "type": null, "description": ""}, {"name": "delimiter_text", "type": null, "description": ""}, {"name": "order_by_clause", "type": null, "description": ""}, {"name": "limit_num", "type": null, "description": ""}], "created_at": 1785250505.534204, "supported_languages": null}, "macro.dbt.string_literal": {"name": "string_literal", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\literal.sql", "original_file_path": "macros\\utils\\literal.sql", "unique_id": "macro.dbt.string_literal", "macro_sql": "{%- macro string_literal(value) -%}\n {{ return(adapter.dispatch('string_literal', 'dbt') (value)) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__string_literal"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "value", "type": null, "description": ""}], "created_at": 1785250505.5352044, "supported_languages": null}, "macro.dbt.default__string_literal": {"name": "default__string_literal", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\literal.sql", "original_file_path": "macros\\utils\\literal.sql", "unique_id": "macro.dbt.default__string_literal", "macro_sql": "{% macro default__string_literal(value) -%}\n '{{ value }}'\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "value", "type": null, "description": ""}], "created_at": 1785250505.5352044, "supported_languages": null}, "macro.dbt.position": {"name": "position", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\position.sql", "original_file_path": "macros\\utils\\position.sql", "unique_id": "macro.dbt.position", "macro_sql": "{% macro position(substring_text, string_text) -%}\n {{ return(adapter.dispatch('position', 'dbt') (substring_text, string_text)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__position"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "substring_text", "type": null, "description": ""}, {"name": "string_text", "type": null, "description": ""}], "created_at": 1785250505.5362036, "supported_languages": null}, "macro.dbt.default__position": {"name": "default__position", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\position.sql", "original_file_path": "macros\\utils\\position.sql", "unique_id": "macro.dbt.default__position", "macro_sql": "{% macro default__position(substring_text, string_text) %}\n\n position(\n {{ substring_text }} in {{ string_text }}\n )\n\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "substring_text", "type": null, "description": ""}, {"name": "string_text", "type": null, "description": ""}], "created_at": 1785250505.5362036, "supported_languages": null}, "macro.dbt.replace": {"name": "replace", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\replace.sql", "original_file_path": "macros\\utils\\replace.sql", "unique_id": "macro.dbt.replace", "macro_sql": "{% macro replace(field, old_chars, new_chars) -%}\n {{ return(adapter.dispatch('replace', 'dbt') (field, old_chars, new_chars)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__replace"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}, {"name": "old_chars", "type": null, "description": ""}, {"name": "new_chars", "type": null, "description": ""}], "created_at": 1785250505.5371966, "supported_languages": null}, "macro.dbt.default__replace": {"name": "default__replace", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\replace.sql", "original_file_path": "macros\\utils\\replace.sql", "unique_id": "macro.dbt.default__replace", "macro_sql": "{% macro default__replace(field, old_chars, new_chars) %}\n\n replace(\n {{ field }},\n {{ old_chars }},\n {{ new_chars }}\n )\n\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}, {"name": "old_chars", "type": null, "description": ""}, {"name": "new_chars", "type": null, "description": ""}], "created_at": 1785250505.5371966, "supported_languages": null}, "macro.dbt.right": {"name": "right", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\right.sql", "original_file_path": "macros\\utils\\right.sql", "unique_id": "macro.dbt.right", "macro_sql": "{% macro right(string_text, length_expression) -%}\n {{ return(adapter.dispatch('right', 'dbt') (string_text, length_expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__right"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "string_text", "type": null, "description": ""}, {"name": "length_expression", "type": null, "description": ""}], "created_at": 1785250505.538207, "supported_languages": null}, "macro.dbt.default__right": {"name": "default__right", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\right.sql", "original_file_path": "macros\\utils\\right.sql", "unique_id": "macro.dbt.default__right", "macro_sql": "{% macro default__right(string_text, length_expression) %}\n\n right(\n {{ string_text }},\n {{ length_expression }}\n )\n\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "string_text", "type": null, "description": ""}, {"name": "length_expression", "type": null, "description": ""}], "created_at": 1785250505.538207, "supported_languages": null}, "macro.dbt.safe_cast": {"name": "safe_cast", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\safe_cast.sql", "original_file_path": "macros\\utils\\safe_cast.sql", "unique_id": "macro.dbt.safe_cast", "macro_sql": "{% macro safe_cast(field, type) %}\n {{ return(adapter.dispatch('safe_cast', 'dbt') (field, type)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_spark.spark__safe_cast"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}, {"name": "type", "type": null, "description": ""}], "created_at": 1785250505.5391972, "supported_languages": null}, "macro.dbt.default__safe_cast": {"name": "default__safe_cast", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\safe_cast.sql", "original_file_path": "macros\\utils\\safe_cast.sql", "unique_id": "macro.dbt.default__safe_cast", "macro_sql": "{% macro default__safe_cast(field, type) %}\n {# most databases don't support this function yet\n so we just need to use cast #}\n cast({{field}} as {{type}})\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}, {"name": "type", "type": null, "description": ""}], "created_at": 1785250505.5391972, "supported_languages": null}, "macro.dbt.split_part": {"name": "split_part", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\split_part.sql", "original_file_path": "macros\\utils\\split_part.sql", "unique_id": "macro.dbt.split_part", "macro_sql": "{% macro split_part(string_text, delimiter_text, part_number) %}\n {{ return(adapter.dispatch('split_part', 'dbt') (string_text, delimiter_text, part_number)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_databricks.databricks__split_part"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "string_text", "type": null, "description": ""}, {"name": "delimiter_text", "type": null, "description": ""}, {"name": "part_number", "type": null, "description": ""}], "created_at": 1785250505.5402071, "supported_languages": null}, "macro.dbt.default__split_part": {"name": "default__split_part", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\split_part.sql", "original_file_path": "macros\\utils\\split_part.sql", "unique_id": "macro.dbt.default__split_part", "macro_sql": "{% macro default__split_part(string_text, delimiter_text, part_number) %}\n\n split_part(\n {{ string_text }},\n {{ delimiter_text }},\n {{ part_number }}\n )\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "string_text", "type": null, "description": ""}, {"name": "delimiter_text", "type": null, "description": ""}, {"name": "part_number", "type": null, "description": ""}], "created_at": 1785250505.5402071, "supported_languages": null}, "macro.dbt._split_part_negative": {"name": "_split_part_negative", "resource_type": "macro", "package_name": "dbt", "path": "macros\\utils\\split_part.sql", "original_file_path": "macros\\utils\\split_part.sql", "unique_id": "macro.dbt._split_part_negative", "macro_sql": "{% macro _split_part_negative(string_text, delimiter_text, part_number) %}\n\n split_part(\n {{ string_text }},\n {{ delimiter_text }},\n length({{ string_text }})\n - length(\n replace({{ string_text }}, {{ delimiter_text }}, '')\n ) + 2 + {{ part_number }}\n )\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "string_text", "type": null, "description": ""}, {"name": "delimiter_text", "type": null, "description": ""}, {"name": "part_number", "type": null, "description": ""}], "created_at": 1785250505.5402071, "supported_languages": null}, "macro.dbt.test_unique": {"name": "test_unique", "resource_type": "macro", "package_name": "dbt", "path": "tests\\generic\\builtin.sql", "original_file_path": "tests\\generic\\builtin.sql", "unique_id": "macro.dbt.test_unique", "macro_sql": "{% test unique(model, column_name) %}\n {% set macro = adapter.dispatch('test_unique', 'dbt') %}\n {{ macro(model, column_name) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt.default__test_unique"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.541198, "supported_languages": null}, "macro.dbt.test_not_null": {"name": "test_not_null", "resource_type": "macro", "package_name": "dbt", "path": "tests\\generic\\builtin.sql", "original_file_path": "tests\\generic\\builtin.sql", "unique_id": "macro.dbt.test_not_null", "macro_sql": "{% test not_null(model, column_name) %}\n {% set macro = adapter.dispatch('test_not_null', 'dbt') %}\n {{ macro(model, column_name) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt.default__test_not_null"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5422068, "supported_languages": null}, "macro.dbt.test_accepted_values": {"name": "test_accepted_values", "resource_type": "macro", "package_name": "dbt", "path": "tests\\generic\\builtin.sql", "original_file_path": "tests\\generic\\builtin.sql", "unique_id": "macro.dbt.test_accepted_values", "macro_sql": "{% test accepted_values(model, column_name, values, quote=True) %}\n {% set macro = adapter.dispatch('test_accepted_values', 'dbt') %}\n {{ macro(model, column_name, values, quote) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt.default__test_accepted_values"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5422068, "supported_languages": null}, "macro.dbt.test_relationships": {"name": "test_relationships", "resource_type": "macro", "package_name": "dbt", "path": "tests\\generic\\builtin.sql", "original_file_path": "tests\\generic\\builtin.sql", "unique_id": "macro.dbt.test_relationships", "macro_sql": "{% test relationships(model, column_name, to, field) %}\n {% set macro = adapter.dispatch('test_relationships', 'dbt') %}\n {{ macro(model, column_name, to, field) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt.default__test_relationships"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.5431979, "supported_languages": null}, "macro.dbt_utils.test_accepted_range": {"name": "test_accepted_range", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\accepted_range.sql", "original_file_path": "macros\\generic_tests\\accepted_range.sql", "unique_id": "macro.dbt_utils.test_accepted_range", "macro_sql": "{% test accepted_range(model, column_name, min_value=none, max_value=none, inclusive=true) %}\n {{ return(adapter.dispatch('test_accepted_range', 'dbt_utils')(model, column_name, min_value, max_value, inclusive)) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_accepted_range"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "min_value", "type": null, "description": ""}, {"name": "max_value", "type": null, "description": ""}, {"name": "inclusive", "type": null, "description": ""}], "created_at": 1785250505.5442066, "supported_languages": null}, "macro.dbt_utils.default__test_accepted_range": {"name": "default__test_accepted_range", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\accepted_range.sql", "original_file_path": "macros\\generic_tests\\accepted_range.sql", "unique_id": "macro.dbt_utils.default__test_accepted_range", "macro_sql": "{% macro default__test_accepted_range(model, column_name, min_value=none, max_value=none, inclusive=true) %}\n\nwith meet_condition as(\n select *\n from {{ model }}\n),\n\nvalidation_errors as (\n select *\n from meet_condition\n where\n -- never true, defaults to an empty result set. Exists to ensure any combo of the `or` clauses below succeeds\n 1 = 2\n\n {%- if min_value is not none %}\n -- records with a value >= min_value are permitted. The `not` flips this to find records that don't meet the rule.\n or not {{ column_name }} > {{- \"=\" if inclusive }} {{ min_value }}\n {%- endif %}\n\n {%- if max_value is not none %}\n -- records with a value <= max_value are permitted. The `not` flips this to find records that don't meet the rule.\n or not {{ column_name }} < {{- \"=\" if inclusive }} {{ max_value }}\n {%- endif %}\n)\n\nselect *\nfrom validation_errors\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "min_value", "type": null, "description": ""}, {"name": "max_value", "type": null, "description": ""}, {"name": "inclusive", "type": null, "description": ""}], "created_at": 1785250505.5451968, "supported_languages": null}, "macro.dbt_utils.test_at_least_one": {"name": "test_at_least_one", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\at_least_one.sql", "original_file_path": "macros\\generic_tests\\at_least_one.sql", "unique_id": "macro.dbt_utils.test_at_least_one", "macro_sql": "{% test at_least_one(model, column_name, group_by_columns = []) %}\n {{ return(adapter.dispatch('test_at_least_one', 'dbt_utils')(model, column_name, group_by_columns)) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_at_least_one"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "group_by_columns", "type": null, "description": ""}], "created_at": 1785250505.5462039, "supported_languages": null}, "macro.dbt_utils.default__test_at_least_one": {"name": "default__test_at_least_one", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\at_least_one.sql", "original_file_path": "macros\\generic_tests\\at_least_one.sql", "unique_id": "macro.dbt_utils.default__test_at_least_one", "macro_sql": "{% macro default__test_at_least_one(model, column_name, group_by_columns) %}\n\n{% set pruned_cols = [column_name] %}\n\n{% if group_by_columns|length() > 0 %}\n\n {% set select_gb_cols = group_by_columns|join(' ,') + ', ' %}\n {% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %}\n {% set pruned_cols = group_by_columns %}\n\n {% if column_name not in pruned_cols %}\n {% do pruned_cols.append(column_name) %}\n {% endif %}\n\n{% endif %}\n\n{% set select_pruned_cols = pruned_cols|join(' ,') %}\n\nselect *\nfrom (\n with pruned_rows as (\n select\n {{ select_pruned_cols }}\n from {{ model }}\n {% if group_by_columns|length() == 0 %}\n where {{ column_name }} is not null\n limit 1\n {% endif %}\n )\n select\n {# In TSQL, subquery aggregate columns need aliases #}\n {# thus: a filler col name, 'filler_column' #}\n {{select_gb_cols}}\n count({{ column_name }}) as filler_column\n\n from pruned_rows\n\n {{groupby_gb_cols}}\n\n having count({{ column_name }}) = 0\n\n) validation_errors\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "group_by_columns", "type": null, "description": ""}], "created_at": 1785250505.548193, "supported_languages": null}, "macro.dbt_utils.test_cardinality_equality": {"name": "test_cardinality_equality", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\cardinality_equality.sql", "original_file_path": "macros\\generic_tests\\cardinality_equality.sql", "unique_id": "macro.dbt_utils.test_cardinality_equality", "macro_sql": "{% test cardinality_equality(model, column_name, to, field) %}\n {{ return(adapter.dispatch('test_cardinality_equality', 'dbt_utils')(model, column_name, to, field)) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_cardinality_equality"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "to", "type": null, "description": ""}, {"name": "field", "type": null, "description": ""}], "created_at": 1785250505.549197, "supported_languages": null}, "macro.dbt_utils.default__test_cardinality_equality": {"name": "default__test_cardinality_equality", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\cardinality_equality.sql", "original_file_path": "macros\\generic_tests\\cardinality_equality.sql", "unique_id": "macro.dbt_utils.default__test_cardinality_equality", "macro_sql": "{% macro default__test_cardinality_equality(model, column_name, to, field) %}\n\n{# T-SQL does not let you use numbers as aliases for columns #}\n{# Thus, no \"GROUP BY 1\" #}\n\nwith table_a as (\nselect\n {{ column_name }},\n count(*) as num_rows\nfrom {{ model }}\ngroup by {{ column_name }}\n),\n\ntable_b as (\nselect\n {{ field }},\n count(*) as num_rows\nfrom {{ to }}\ngroup by {{ field }}\n),\n\nexcept_a as (\n select *\n from table_a\n {{ dbt.except() }}\n select *\n from table_b\n),\n\nexcept_b as (\n select *\n from table_b\n {{ dbt.except() }}\n select *\n from table_a\n),\n\nunioned as (\n select *\n from except_a\n union all\n select *\n from except_b\n)\n\nselect *\nfrom unioned\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.except"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "to", "type": null, "description": ""}, {"name": "field", "type": null, "description": ""}], "created_at": 1785250505.5501983, "supported_languages": null}, "macro.dbt_utils.test_equality": {"name": "test_equality", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\equality.sql", "original_file_path": "macros\\generic_tests\\equality.sql", "unique_id": "macro.dbt_utils.test_equality", "macro_sql": "{% test equality(model, compare_model, compare_columns=None, exclude_columns=None, precision = None) %}\n {{ return(adapter.dispatch('test_equality', 'dbt_utils')(model, compare_model, compare_columns, exclude_columns, precision)) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_equality"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "compare_model", "type": null, "description": ""}, {"name": "compare_columns", "type": null, "description": ""}, {"name": "exclude_columns", "type": null, "description": ""}, {"name": "precision", "type": null, "description": ""}], "created_at": 1785250505.5521972, "supported_languages": null}, "macro.dbt_utils.default__test_equality": {"name": "default__test_equality", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\equality.sql", "original_file_path": "macros\\generic_tests\\equality.sql", "unique_id": "macro.dbt_utils.default__test_equality", "macro_sql": "{% macro default__test_equality(model, compare_model, compare_columns=None, exclude_columns=None, precision = None) %}\n\n{%- if compare_columns and exclude_columns -%}\n {{ exceptions.raise_compiler_error(\"Both a compare and an ignore list were provided to the `equality` macro. Only one is allowed\") }}\n{%- endif -%}\n\n{% set set_diff %}\n count(*) + coalesce(abs(\n sum(case when which_diff = 'a_minus_b' then 1 else 0 end) -\n sum(case when which_diff = 'b_minus_a' then 1 else 0 end)\n ), 0)\n{% endset %}\n\n{#-- Needs to be set at parse time, before we return '' below --#}\n{{ config(fail_calc = set_diff) }}\n\n{#-- Prevent querying of db in parsing mode. This works because this macro does not create any new refs. #}\n{%- if not execute -%}\n {{ return('') }}\n{% endif %}\n\n\n\n-- setup\n{%- do dbt_utils._is_relation(model, 'test_equality') -%}\n\n{# Ensure there are no extra columns in the compare_model vs model #}\n{%- if not compare_columns -%}\n {%- do dbt_utils._is_ephemeral(model, 'test_equality') -%}\n {%- do dbt_utils._is_ephemeral(compare_model, 'test_equality') -%}\n\n {%- set model_columns = adapter.get_columns_in_relation(model) -%}\n {%- set compare_model_columns = adapter.get_columns_in_relation(compare_model) -%}\n\n\n {%- if exclude_columns -%}\n {#-- Lower case ignore columns for easier comparison --#}\n {%- set exclude_columns = exclude_columns | map(\"lower\") | list %}\n\n {# Filter out the excluded columns #}\n {%- set include_columns = [] %}\n {%- set include_model_columns = [] %}\n {%- for column in model_columns -%}\n {%- if column.name | lower not in exclude_columns -%}\n {% do include_columns.append(column) %}\n {%- endif %}\n {%- endfor %}\n {%- for column in compare_model_columns -%}\n {%- if column.name | lower not in exclude_columns -%}\n {% do include_model_columns.append(column) %}\n {%- endif %}\n {%- endfor %}\n\n {%- set compare_columns_set = set(include_columns | map(attribute='quoted') | map(\"lower\")) %}\n {%- set compare_model_columns_set = set(include_model_columns | map(attribute='quoted') | map(\"lower\")) %}\n {%- else -%}\n {%- set compare_columns_set = set(model_columns | map(attribute='quoted') | map(\"lower\")) %}\n {%- set compare_model_columns_set = set(compare_model_columns | map(attribute='quoted') | map(\"lower\")) %}\n {%- endif -%}\n\n {% if compare_columns_set != compare_model_columns_set %}\n {{ exceptions.raise_compiler_error(compare_model ~\" has less columns than \" ~ model ~ \", please ensure they have the same columns or use the `compare_columns` or `exclude_columns` arguments to subset them.\") }}\n {% endif %}\n\n\n{% endif %}\n\n{%- if not precision -%}\n {%- if not compare_columns -%}\n {# \n You cannot get the columns in an ephemeral model (due to not existing in the information schema),\n so if the user does not provide an explicit list of columns we must error in the case it is ephemeral\n #}\n {%- do dbt_utils._is_ephemeral(model, 'test_equality') -%}\n {%- set compare_columns = adapter.get_columns_in_relation(model)-%}\n\n {%- if exclude_columns -%}\n {#-- Lower case ignore columns for easier comparison --#}\n {%- set exclude_columns = exclude_columns | map(\"lower\") | list %}\n\n {# Filter out the excluded columns #}\n {%- set include_columns = [] %}\n {%- for column in compare_columns -%}\n {%- if column.name | lower not in exclude_columns -%}\n {% do include_columns.append(column) %}\n {%- endif %}\n {%- endfor %}\n\n {%- set compare_columns = include_columns | map(attribute='quoted') %}\n {%- else -%} {# Compare columns provided #}\n {%- set compare_columns = compare_columns | map(attribute='quoted') %}\n {%- endif -%}\n {%- endif -%}\n\n {% set compare_cols_csv = compare_columns | join(', ') %}\n\n{% else %} {# Precision required #}\n {#-\n If rounding is required, we need to get the types, so it cannot be ephemeral even if they provide column names\n -#}\n {%- do dbt_utils._is_ephemeral(model, 'test_equality') -%}\n {%- set columns = adapter.get_columns_in_relation(model) -%}\n\n {% set columns_list = [] %}\n {%- for col in columns -%}\n {%- if (\n (col.name|lower in compare_columns|map('lower') or not compare_columns) and\n (col.name|lower not in exclude_columns|map('lower') or not exclude_columns)\n ) -%}\n {# Databricks double type is not picked up by any number type checks in dbt #}\n {%- if col.is_float() or col.is_numeric() or col.data_type == 'double' -%}\n {# Cast is required due to postgres not having round for a double precision number #}\n {%- do columns_list.append('round(cast(' ~ col.quoted ~ ' as ' ~ dbt.type_numeric() ~ '),' ~ precision ~ ') as ' ~ col.quoted) -%}\n {%- else -%} {# Non-numeric type #}\n {%- do columns_list.append(col.quoted) -%}\n {%- endif -%}\n {% endif %}\n {%- endfor -%}\n\n {% set compare_cols_csv = columns_list | join(', ') %}\n\n{% endif %}\n\nwith a as (\n\n select * from {{ model }}\n\n),\n\nb as (\n\n select * from {{ compare_model }}\n\n),\n\na_minus_b as (\n\n select {{compare_cols_csv}} from a\n {{ dbt.except() }}\n select {{compare_cols_csv}} from b\n\n),\n\nb_minus_a as (\n\n select {{compare_cols_csv}} from b\n {{ dbt.except() }}\n select {{compare_cols_csv}} from a\n\n),\n\nunioned as (\n\n select 'a_minus_b' as which_diff, a_minus_b.* from a_minus_b\n union all\n select 'b_minus_a' as which_diff, b_minus_a.* from b_minus_a\n\n)\n\nselect * from unioned\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils._is_relation", "macro.dbt_utils._is_ephemeral", "macro.dbt.type_numeric", "macro.dbt.except"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "compare_model", "type": null, "description": ""}, {"name": "compare_columns", "type": null, "description": ""}, {"name": "exclude_columns", "type": null, "description": ""}, {"name": "precision", "type": null, "description": ""}], "created_at": 1785250505.5602007, "supported_languages": null}, "macro.dbt_utils.test_equal_rowcount": {"name": "test_equal_rowcount", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\equal_rowcount.sql", "original_file_path": "macros\\generic_tests\\equal_rowcount.sql", "unique_id": "macro.dbt_utils.test_equal_rowcount", "macro_sql": "{% test equal_rowcount(model, compare_model, group_by_columns = []) %}\n {{ return(adapter.dispatch('test_equal_rowcount', 'dbt_utils')(model, compare_model, group_by_columns)) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_equal_rowcount"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "compare_model", "type": null, "description": ""}, {"name": "group_by_columns", "type": null, "description": ""}], "created_at": 1785250505.5622034, "supported_languages": null}, "macro.dbt_utils.default__test_equal_rowcount": {"name": "default__test_equal_rowcount", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\equal_rowcount.sql", "original_file_path": "macros\\generic_tests\\equal_rowcount.sql", "unique_id": "macro.dbt_utils.default__test_equal_rowcount", "macro_sql": "{% macro default__test_equal_rowcount(model, compare_model, group_by_columns) %}\n\n{#-- Needs to be set at parse time, before we return '' below --#}\n{{ config(fail_calc = 'sum(coalesce(diff_count, 0))') }}\n\n{#-- Prevent querying of db in parsing mode. This works because this macro does not create any new refs. #}\n{%- if not execute -%}\n {{ return('') }}\n{% endif %}\n\n{% if group_by_columns|length() > 0 %}\n {% set select_gb_cols = group_by_columns|join(', ') + ', ' %}\n {% set join_gb_cols %}\n {% for c in group_by_columns %}\n and a.{{c}} = b.{{c}}\n {% endfor %}\n {% endset %}\n {% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %}\n{% endif %}\n\n{#-- We must add a fake join key in case additional grouping variables are not provided --#}\n{#-- Redshift does not allow for dynamically created join conditions (e.g. full join on 1 = 1 --#}\n{#-- The same logic is used in fewer_rows_than. In case of changes, maintain consistent logic --#}\n{% set group_by_columns = ['id_dbtutils_test_equal_rowcount'] + group_by_columns %}\n{% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %}\n\nwith a as (\n\n select \n {{select_gb_cols}}\n 1 as id_dbtutils_test_equal_rowcount,\n count(*) as count_a \n from {{ model }}\n {{groupby_gb_cols}}\n\n\n),\nb as (\n\n select \n {{select_gb_cols}}\n 1 as id_dbtutils_test_equal_rowcount,\n count(*) as count_b \n from {{ compare_model }}\n {{groupby_gb_cols}}\n\n),\nfinal as (\n\n select\n \n {% for c in group_by_columns -%}\n a.{{c}} as {{c}}_a,\n b.{{c}} as {{c}}_b,\n {% endfor %}\n\n count_a,\n count_b,\n abs(count_a - count_b) as diff_count\n\n from a\n full join b\n on\n a.id_dbtutils_test_equal_rowcount = b.id_dbtutils_test_equal_rowcount\n {{join_gb_cols}}\n\n\n)\n\nselect * from final\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "compare_model", "type": null, "description": ""}, {"name": "group_by_columns", "type": null, "description": ""}], "created_at": 1785250505.5641985, "supported_languages": null}, "macro.dbt_utils.test_expression_is_true": {"name": "test_expression_is_true", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\expression_is_true.sql", "original_file_path": "macros\\generic_tests\\expression_is_true.sql", "unique_id": "macro.dbt_utils.test_expression_is_true", "macro_sql": "{% test expression_is_true(model, expression, column_name=None) %}\n {{ return(adapter.dispatch('test_expression_is_true', 'dbt_utils')(model, expression, column_name)) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_expression_is_true"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "expression", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}], "created_at": 1785250505.5651965, "supported_languages": null}, "macro.dbt_utils.default__test_expression_is_true": {"name": "default__test_expression_is_true", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\expression_is_true.sql", "original_file_path": "macros\\generic_tests\\expression_is_true.sql", "unique_id": "macro.dbt_utils.default__test_expression_is_true", "macro_sql": "{% macro default__test_expression_is_true(model, expression, column_name) %}\n\n{% set column_list = '*' if should_store_failures() else \"1\" %}\n\nselect\n {{ column_list }}\nfrom {{ model }}\n{% if column_name is none %}\nwhere not({{ expression }})\n{%- else %}\nwhere not({{ column_name }} {{ expression }})\n{%- endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.should_store_failures"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "expression", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}], "created_at": 1785250505.5661979, "supported_languages": null}, "macro.dbt_utils.test_fewer_rows_than": {"name": "test_fewer_rows_than", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\fewer_rows_than.sql", "original_file_path": "macros\\generic_tests\\fewer_rows_than.sql", "unique_id": "macro.dbt_utils.test_fewer_rows_than", "macro_sql": "{% test fewer_rows_than(model, compare_model, group_by_columns = []) %}\n {{ return(adapter.dispatch('test_fewer_rows_than', 'dbt_utils')(model, compare_model, group_by_columns)) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_fewer_rows_than"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "compare_model", "type": null, "description": ""}, {"name": "group_by_columns", "type": null, "description": ""}], "created_at": 1785250505.567197, "supported_languages": null}, "macro.dbt_utils.default__test_fewer_rows_than": {"name": "default__test_fewer_rows_than", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\fewer_rows_than.sql", "original_file_path": "macros\\generic_tests\\fewer_rows_than.sql", "unique_id": "macro.dbt_utils.default__test_fewer_rows_than", "macro_sql": "{% macro default__test_fewer_rows_than(model, compare_model, group_by_columns) %}\n\n{{ config(fail_calc = 'sum(coalesce(row_count_delta, 0))') }}\n\n{% if group_by_columns|length() > 0 %}\n {% set select_gb_cols = group_by_columns|join(' ,') + ', ' %}\n {% set join_gb_cols %}\n {% for c in group_by_columns %}\n and a.{{c}} = b.{{c}}\n {% endfor %}\n {% endset %}\n {% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %}\n{% endif %}\n\n{#-- We must add a fake join key in case additional grouping variables are not provided --#}\n{#-- Redshift does not allow for dynamically created join conditions (e.g. full join on 1 = 1 --#}\n{#-- The same logic is used in equal_rowcount. In case of changes, maintain consistent logic --#}\n{% set group_by_columns = ['id_dbtutils_test_fewer_rows_than'] + group_by_columns %}\n{% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %}\n\n\nwith a as (\n\n select \n {{select_gb_cols}}\n 1 as id_dbtutils_test_fewer_rows_than,\n count(*) as count_our_model \n from {{ model }}\n {{ groupby_gb_cols }}\n\n),\nb as (\n\n select \n {{select_gb_cols}}\n 1 as id_dbtutils_test_fewer_rows_than,\n count(*) as count_comparison_model \n from {{ compare_model }}\n {{ groupby_gb_cols }}\n\n),\ncounts as (\n\n select\n\n {% for c in group_by_columns -%}\n a.{{c}} as {{c}}_a,\n b.{{c}} as {{c}}_b,\n {% endfor %}\n\n count_our_model,\n count_comparison_model\n from a\n full join b on \n a.id_dbtutils_test_fewer_rows_than = b.id_dbtutils_test_fewer_rows_than\n {{ join_gb_cols }}\n\n),\nfinal as (\n\n select *,\n case\n -- fail the test if we have more rows than the reference model and return the row count delta\n when count_our_model > count_comparison_model then (count_our_model - count_comparison_model)\n -- fail the test if they are the same number\n when count_our_model = count_comparison_model then 1\n -- pass the test if the delta is positive (i.e. return the number 0)\n else 0\n end as row_count_delta\n from counts\n\n)\n\nselect * from final\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "compare_model", "type": null, "description": ""}, {"name": "group_by_columns", "type": null, "description": ""}], "created_at": 1785250505.569199, "supported_languages": null}, "macro.dbt_utils.test_mutually_exclusive_ranges": {"name": "test_mutually_exclusive_ranges", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\mutually_exclusive_ranges.sql", "original_file_path": "macros\\generic_tests\\mutually_exclusive_ranges.sql", "unique_id": "macro.dbt_utils.test_mutually_exclusive_ranges", "macro_sql": "{% test mutually_exclusive_ranges(model, lower_bound_column, upper_bound_column, partition_by=None, gaps='allowed', zero_length_range_allowed=False) %}\n {{ return(adapter.dispatch('test_mutually_exclusive_ranges', 'dbt_utils')(model, lower_bound_column, upper_bound_column, partition_by, gaps, zero_length_range_allowed)) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_mutually_exclusive_ranges"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "lower_bound_column", "type": null, "description": ""}, {"name": "upper_bound_column", "type": null, "description": ""}, {"name": "partition_by", "type": null, "description": ""}, {"name": "gaps", "type": null, "description": ""}, {"name": "zero_length_range_allowed", "type": null, "description": ""}], "created_at": 1785250505.5712, "supported_languages": null}, "macro.dbt_utils.default__test_mutually_exclusive_ranges": {"name": "default__test_mutually_exclusive_ranges", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\mutually_exclusive_ranges.sql", "original_file_path": "macros\\generic_tests\\mutually_exclusive_ranges.sql", "unique_id": "macro.dbt_utils.default__test_mutually_exclusive_ranges", "macro_sql": "{% macro default__test_mutually_exclusive_ranges(model, lower_bound_column, upper_bound_column, partition_by=None, gaps='allowed', zero_length_range_allowed=False) %}\n{% if gaps == 'not_allowed' %}\n {% set allow_gaps_operator='=' %}\n {% set allow_gaps_operator_in_words='equal_to' %}\n{% elif gaps == 'allowed' %}\n {% set allow_gaps_operator='<=' %}\n {% set allow_gaps_operator_in_words='less_than_or_equal_to' %}\n{% elif gaps == 'required' %}\n {% set allow_gaps_operator='<' %}\n {% set allow_gaps_operator_in_words='less_than' %}\n{% else %}\n {{ exceptions.raise_compiler_error(\n \"`gaps` argument for mutually_exclusive_ranges test must be one of ['not_allowed', 'allowed', 'required'] Got: '\" ~ gaps ~\"'.'\"\n ) }}\n{% endif %}\n{% if not zero_length_range_allowed %}\n {% set allow_zero_length_operator='<' %}\n {% set allow_zero_length_operator_in_words='less_than' %}\n{% elif zero_length_range_allowed %}\n {% set allow_zero_length_operator='<=' %}\n {% set allow_zero_length_operator_in_words='less_than_or_equal_to' %}\n{% else %}\n {{ exceptions.raise_compiler_error(\n \"`zero_length_range_allowed` argument for mutually_exclusive_ranges test must be one of [true, false] Got: '\" ~ zero_length_range_allowed ~\"'.'\"\n ) }}\n{% endif %}\n\n{% set partition_clause=\"partition by \" ~ partition_by if partition_by else '' %}\n\nwith window_functions as (\n\n select\n {% if partition_by %}\n {{ partition_by }} as partition_by_col,\n {% endif %}\n {{ lower_bound_column }} as lower_bound,\n {{ upper_bound_column }} as upper_bound,\n\n lead({{ lower_bound_column }}) over (\n {{ partition_clause }}\n order by {{ lower_bound_column }}, {{ upper_bound_column }}\n ) as next_lower_bound,\n\n row_number() over (\n {{ partition_clause }}\n order by {{ lower_bound_column }} desc, {{ upper_bound_column }} desc\n ) = 1 as is_last_record\n\n from {{ model }}\n\n),\n\ncalc as (\n -- We want to return records where one of our assumptions fails, so we'll use\n -- the `not` function with `and` statements so we can write our assumptions more cleanly\n select\n *,\n\n -- For each record: lower_bound should be < upper_bound.\n -- Coalesce it to return an error on the null case (implicit assumption\n -- these columns are not_null)\n coalesce(\n lower_bound {{ allow_zero_length_operator }} upper_bound,\n false\n ) as lower_bound_{{ allow_zero_length_operator_in_words }}_upper_bound,\n\n -- For each record: upper_bound {{ allow_gaps_operator }} the next lower_bound.\n -- Coalesce it to handle null cases for the last record.\n coalesce(\n upper_bound {{ allow_gaps_operator }} next_lower_bound,\n is_last_record,\n false\n ) as upper_bound_{{ allow_gaps_operator_in_words }}_next_lower_bound\n\n from window_functions\n\n),\n\nvalidation_errors as (\n\n select\n *\n from calc\n\n where not(\n -- THE FOLLOWING SHOULD BE TRUE --\n lower_bound_{{ allow_zero_length_operator_in_words }}_upper_bound\n and upper_bound_{{ allow_gaps_operator_in_words }}_next_lower_bound\n )\n)\n\nselect * from validation_errors\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "lower_bound_column", "type": null, "description": ""}, {"name": "upper_bound_column", "type": null, "description": ""}, {"name": "partition_by", "type": null, "description": ""}, {"name": "gaps", "type": null, "description": ""}, {"name": "zero_length_range_allowed", "type": null, "description": ""}], "created_at": 1785250505.5741963, "supported_languages": null}, "macro.dbt_utils.test_not_accepted_values": {"name": "test_not_accepted_values", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\not_accepted_values.sql", "original_file_path": "macros\\generic_tests\\not_accepted_values.sql", "unique_id": "macro.dbt_utils.test_not_accepted_values", "macro_sql": "{% test not_accepted_values(model, column_name, values, quote=True) %}\n {{ return(adapter.dispatch('test_not_accepted_values', 'dbt_utils')(model, column_name, values, quote)) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_not_accepted_values"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "values", "type": null, "description": ""}, {"name": "quote", "type": null, "description": ""}], "created_at": 1785250505.5752008, "supported_languages": null}, "macro.dbt_utils.default__test_not_accepted_values": {"name": "default__test_not_accepted_values", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\not_accepted_values.sql", "original_file_path": "macros\\generic_tests\\not_accepted_values.sql", "unique_id": "macro.dbt_utils.default__test_not_accepted_values", "macro_sql": "{% macro default__test_not_accepted_values(model, column_name, values, quote=True) %}\nwith all_values as (\n\n select distinct\n {{ column_name }} as value_field\n\n from {{ model }}\n\n),\n\nvalidation_errors as (\n\n select\n value_field\n\n from all_values\n where value_field in (\n {% for value in values -%}\n {% if quote -%}\n '{{ value }}'\n {%- else -%}\n {{ value }}\n {%- endif -%}\n {%- if not loop.last -%},{%- endif %}\n {%- endfor %}\n )\n\n)\n\nselect *\nfrom validation_errors\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "values", "type": null, "description": ""}, {"name": "quote", "type": null, "description": ""}], "created_at": 1785250505.5762007, "supported_languages": null}, "macro.dbt_utils.test_not_constant": {"name": "test_not_constant", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\not_constant.sql", "original_file_path": "macros\\generic_tests\\not_constant.sql", "unique_id": "macro.dbt_utils.test_not_constant", "macro_sql": "{% test not_constant(model, column_name, group_by_columns = []) %}\n {{ return(adapter.dispatch('test_not_constant', 'dbt_utils')(model, column_name, group_by_columns)) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_not_constant"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "group_by_columns", "type": null, "description": ""}], "created_at": 1785250505.5772202, "supported_languages": null}, "macro.dbt_utils.default__test_not_constant": {"name": "default__test_not_constant", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\not_constant.sql", "original_file_path": "macros\\generic_tests\\not_constant.sql", "unique_id": "macro.dbt_utils.default__test_not_constant", "macro_sql": "{% macro default__test_not_constant(model, column_name, group_by_columns) %}\n\n{% if group_by_columns|length() > 0 %}\n {% set select_gb_cols = group_by_columns|join(' ,') + ', ' %}\n {% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %}\n{% endif %}\n\n\nselect\n {# In TSQL, subquery aggregate columns need aliases #}\n {# thus: a filler col name, 'filler_column' #}\n {{select_gb_cols}}\n count(distinct {{ column_name }}) as filler_column\n\nfrom {{ model }}\n\n {{groupby_gb_cols}}\n\nhaving count(distinct {{ column_name }}) = 1\n\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "group_by_columns", "type": null, "description": ""}], "created_at": 1785250505.5782204, "supported_languages": null}, "macro.dbt_utils.test_not_empty_string": {"name": "test_not_empty_string", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\not_empty_string.sql", "original_file_path": "macros\\generic_tests\\not_empty_string.sql", "unique_id": "macro.dbt_utils.test_not_empty_string", "macro_sql": "{% test not_empty_string(model, column_name, trim_whitespace=true) %}\n\n {{ return(adapter.dispatch('test_not_empty_string', 'dbt_utils')(model, column_name, trim_whitespace)) }}\n\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_not_empty_string"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "trim_whitespace", "type": null, "description": ""}], "created_at": 1785250505.5792189, "supported_languages": null}, "macro.dbt_utils.default__test_not_empty_string": {"name": "default__test_not_empty_string", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\not_empty_string.sql", "original_file_path": "macros\\generic_tests\\not_empty_string.sql", "unique_id": "macro.dbt_utils.default__test_not_empty_string", "macro_sql": "{% macro default__test_not_empty_string(model, column_name, trim_whitespace=true) %}\n\n with\n \n all_values as (\n\n select \n\n\n {% if trim_whitespace == true -%}\n\n trim({{ column_name }}) as {{ column_name }}\n\n {%- else -%}\n\n {{ column_name }}\n\n {%- endif %}\n \n from {{ model }}\n\n ),\n\n errors as (\n\n select * from all_values\n where {{ column_name }} = ''\n\n )\n\n select * from errors\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "trim_whitespace", "type": null, "description": ""}], "created_at": 1785250505.5792189, "supported_languages": null}, "macro.dbt_utils.test_not_null_proportion": {"name": "test_not_null_proportion", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\not_null_proportion.sql", "original_file_path": "macros\\generic_tests\\not_null_proportion.sql", "unique_id": "macro.dbt_utils.test_not_null_proportion", "macro_sql": "{% macro test_not_null_proportion(model, group_by_columns = []) %}\n {{ return(adapter.dispatch('test_not_null_proportion', 'dbt_utils')(model, group_by_columns, **kwargs)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_not_null_proportion"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "group_by_columns", "type": null, "description": ""}], "created_at": 1785250505.5802202, "supported_languages": null}, "macro.dbt_utils.default__test_not_null_proportion": {"name": "default__test_not_null_proportion", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\not_null_proportion.sql", "original_file_path": "macros\\generic_tests\\not_null_proportion.sql", "unique_id": "macro.dbt_utils.default__test_not_null_proportion", "macro_sql": "{% macro default__test_not_null_proportion(model, group_by_columns) %}\n\n{% set column_name = kwargs.get('column_name', kwargs.get('arg')) %}\n{% set at_least = kwargs.get('at_least', kwargs.get('arg')) %}\n{% set at_most = kwargs.get('at_most', kwargs.get('arg', 1)) %}\n\n{% if group_by_columns|length() > 0 %}\n {% set select_gb_cols = group_by_columns|join(' ,') + ', ' %}\n {% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %}\n{% endif %}\n\nwith validation as (\n select\n {{select_gb_cols}}\n sum(case when {{ column_name }} is null then 0 else 1 end) / cast(count(*) as {{ dbt.type_numeric() }}) as not_null_proportion\n from {{ model }}\n {{groupby_gb_cols}}\n),\nvalidation_errors as (\n select\n {{select_gb_cols}}\n not_null_proportion\n from validation\n where not_null_proportion < {{ at_least }} or not_null_proportion > {{ at_most }}\n)\nselect\n *\nfrom validation_errors\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.type_numeric"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "group_by_columns", "type": null, "description": ""}], "created_at": 1785250505.5822136, "supported_languages": null}, "macro.dbt_utils.test_recency": {"name": "test_recency", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\recency.sql", "original_file_path": "macros\\generic_tests\\recency.sql", "unique_id": "macro.dbt_utils.test_recency", "macro_sql": "{% test recency(model, field, datepart, interval, ignore_time_component=False, group_by_columns = []) %}\n {{ return(adapter.dispatch('test_recency', 'dbt_utils')(model, field, datepart, interval, ignore_time_component, group_by_columns)) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_recency"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "field", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}, {"name": "interval", "type": null, "description": ""}, {"name": "ignore_time_component", "type": null, "description": ""}, {"name": "group_by_columns", "type": null, "description": ""}], "created_at": 1785250505.583219, "supported_languages": null}, "macro.dbt_utils.default__test_recency": {"name": "default__test_recency", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\recency.sql", "original_file_path": "macros\\generic_tests\\recency.sql", "unique_id": "macro.dbt_utils.default__test_recency", "macro_sql": "{% macro default__test_recency(model, field, datepart, interval, ignore_time_component, group_by_columns) %}\n\n{% set empty_invocation = flags.EMPTY is defined and flags.EMPTY %}\n\n{% set threshold = 'cast(' ~ dbt.dateadd(datepart, interval * -1, dbt.current_timestamp()) ~ ' as ' ~ ('date' if ignore_time_component else dbt.type_timestamp()) ~ ')' %}\n\n{% if group_by_columns|length() > 0 %}\n {% set select_gb_cols = group_by_columns|join(' ,') + ', ' %}\n {% set groupby_gb_cols = 'group by ' + group_by_columns|join(',') %}\n{% endif %}\n\n\nwith recency as (\n\n select \n\n {{ select_gb_cols }}\n {% if ignore_time_component %}\n cast(max({{ field }}) as date) as most_recent\n {%- else %}\n max({{ field }}) as most_recent\n {%- endif %}\n\n from {{ model }}\n\n {{ groupby_gb_cols }}\n\n)\n\nselect\n\n {{ select_gb_cols }}\n most_recent,\n {{ threshold }} as threshold\n\nfrom recency\nwhere most_recent < {{ threshold }}\n{%- if not empty_invocation %}\n or most_recent is null\n{%- endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.dateadd", "macro.dbt.current_timestamp", "macro.dbt.type_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "field", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}, {"name": "interval", "type": null, "description": ""}, {"name": "ignore_time_component", "type": null, "description": ""}, {"name": "group_by_columns", "type": null, "description": ""}], "created_at": 1785250505.5852213, "supported_languages": null}, "macro.dbt_utils.test_relationships_where": {"name": "test_relationships_where", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\relationships_where.sql", "original_file_path": "macros\\generic_tests\\relationships_where.sql", "unique_id": "macro.dbt_utils.test_relationships_where", "macro_sql": "{% test relationships_where(model, column_name, to, field, from_condition=\"1=1\", to_condition=\"1=1\") %}\n {{ return(adapter.dispatch('test_relationships_where', 'dbt_utils')(model, column_name, to, field, from_condition, to_condition)) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_relationships_where"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "to", "type": null, "description": ""}, {"name": "field", "type": null, "description": ""}, {"name": "from_condition", "type": null, "description": ""}, {"name": "to_condition", "type": null, "description": ""}], "created_at": 1785250505.5862195, "supported_languages": null}, "macro.dbt_utils.default__test_relationships_where": {"name": "default__test_relationships_where", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\relationships_where.sql", "original_file_path": "macros\\generic_tests\\relationships_where.sql", "unique_id": "macro.dbt_utils.default__test_relationships_where", "macro_sql": "{% macro default__test_relationships_where(model, column_name, to, field, from_condition=\"1=1\", to_condition=\"1=1\") %}\n\n{# T-SQL has no boolean data type so we use 1=1 which returns TRUE #}\n{# ref https://stackoverflow.com/a/7170753/3842610 #}\n\nwith left_table as (\n\n select\n {{column_name}} as id\n\n from {{model}}\n\n where {{column_name}} is not null\n and {{from_condition}}\n\n),\n\nright_table as (\n\n select\n {{field}} as id\n\n from {{to}}\n\n where {{field}} is not null\n and {{to_condition}}\n\n),\n\nexceptions as (\n\n select\n left_table.id,\n right_table.id as right_id\n\n from left_table\n\n left join right_table\n on left_table.id = right_table.id\n\n where right_table.id is null\n\n)\n\nselect * from exceptions\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "to", "type": null, "description": ""}, {"name": "field", "type": null, "description": ""}, {"name": "from_condition", "type": null, "description": ""}, {"name": "to_condition", "type": null, "description": ""}], "created_at": 1785250505.5872154, "supported_languages": null}, "macro.dbt_utils.test_sequential_values": {"name": "test_sequential_values", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\sequential_values.sql", "original_file_path": "macros\\generic_tests\\sequential_values.sql", "unique_id": "macro.dbt_utils.test_sequential_values", "macro_sql": "{% test sequential_values(model, column_name, interval=1, datepart=None, group_by_columns = []) %}\n\n {{ return(adapter.dispatch('test_sequential_values', 'dbt_utils')(model, column_name, interval, datepart, group_by_columns)) }}\n\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_sequential_values"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "interval", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}, {"name": "group_by_columns", "type": null, "description": ""}], "created_at": 1785250505.588219, "supported_languages": null}, "macro.dbt_utils.default__test_sequential_values": {"name": "default__test_sequential_values", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\sequential_values.sql", "original_file_path": "macros\\generic_tests\\sequential_values.sql", "unique_id": "macro.dbt_utils.default__test_sequential_values", "macro_sql": "{% macro default__test_sequential_values(model, column_name, interval=1, datepart=None, group_by_columns = []) %}\n\n{% set previous_column_name = \"previous_\" ~ dbt_utils.slugify(column_name) %}\n\n{% if group_by_columns|length() > 0 %}\n {% set select_gb_cols = group_by_columns|join(',') + ', ' %}\n {% set partition_gb_cols = 'partition by ' + group_by_columns|join(',') %}\n{% endif %}\n\nwith windowed as (\n\n select\n {{ select_gb_cols }}\n {{ column_name }},\n lag({{ column_name }}) over (\n {{partition_gb_cols}}\n order by {{ column_name }}\n ) as {{ previous_column_name }}\n from {{ model }}\n),\n\nvalidation_errors as (\n select\n *\n from windowed\n {% if datepart %}\n where not(cast({{ column_name }} as {{ dbt.type_timestamp() }})= cast({{ dbt.dateadd(datepart, interval, previous_column_name) }} as {{ dbt.type_timestamp() }}))\n {% else %}\n where not({{ column_name }} = {{ previous_column_name }} + {{ interval }})\n {% endif %}\n)\n\nselect *\nfrom validation_errors\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.slugify", "macro.dbt.type_timestamp", "macro.dbt.dateadd"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "column_name", "type": null, "description": ""}, {"name": "interval", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}, {"name": "group_by_columns", "type": null, "description": ""}], "created_at": 1785250505.5902164, "supported_languages": null}, "macro.dbt_utils.test_unique_combination_of_columns": {"name": "test_unique_combination_of_columns", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\unique_combination_of_columns.sql", "original_file_path": "macros\\generic_tests\\unique_combination_of_columns.sql", "unique_id": "macro.dbt_utils.test_unique_combination_of_columns", "macro_sql": "{% test unique_combination_of_columns(model, combination_of_columns, quote_columns=false) %}\n {{ return(adapter.dispatch('test_unique_combination_of_columns', 'dbt_utils')(model, combination_of_columns, quote_columns)) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt_utils.default__test_unique_combination_of_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "combination_of_columns", "type": null, "description": ""}, {"name": "quote_columns", "type": null, "description": ""}], "created_at": 1785250505.591737, "supported_languages": null}, "macro.dbt_utils.default__test_unique_combination_of_columns": {"name": "default__test_unique_combination_of_columns", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\generic_tests\\unique_combination_of_columns.sql", "original_file_path": "macros\\generic_tests\\unique_combination_of_columns.sql", "unique_id": "macro.dbt_utils.default__test_unique_combination_of_columns", "macro_sql": "{% macro default__test_unique_combination_of_columns(model, combination_of_columns, quote_columns=false) %}\n\n{% if not quote_columns %}\n {%- set column_list=combination_of_columns %}\n{% elif quote_columns %}\n {%- set column_list=[] %}\n {% for column in combination_of_columns -%}\n {% do column_list.append( adapter.quote(column) ) %}\n {%- endfor %}\n{% else %}\n {{ exceptions.raise_compiler_error(\n \"`quote_columns` argument for unique_combination_of_columns test must be one of [True, False] Got: '\" ~ quote ~\"'.'\"\n ) }}\n{% endif %}\n\n{%- set columns_csv=column_list | join(', ') %}\n\n\nwith validation_errors as (\n\n select\n {{ columns_csv }}\n from {{ model }}\n group by {{ columns_csv }}\n having count(*) > 1\n\n)\n\nselect *\nfrom validation_errors\n\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "model", "type": null, "description": ""}, {"name": "combination_of_columns", "type": null, "description": ""}, {"name": "quote_columns", "type": null, "description": ""}], "created_at": 1785250505.5927615, "supported_languages": null}, "macro.dbt_utils.log_info": {"name": "log_info", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\jinja_helpers\\log_info.sql", "original_file_path": "macros\\jinja_helpers\\log_info.sql", "unique_id": "macro.dbt_utils.log_info", "macro_sql": "{% macro log_info(message) %}\n {{ return(adapter.dispatch('log_info', 'dbt_utils')(message)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__log_info"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "message", "type": null, "description": ""}], "created_at": 1785250505.5937653, "supported_languages": null}, "macro.dbt_utils.default__log_info": {"name": "default__log_info", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\jinja_helpers\\log_info.sql", "original_file_path": "macros\\jinja_helpers\\log_info.sql", "unique_id": "macro.dbt_utils.default__log_info", "macro_sql": "{% macro default__log_info(message) %}\n {{ log(dbt_utils.pretty_log_format(message), info=True) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.pretty_log_format"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "message", "type": null, "description": ""}], "created_at": 1785250505.5937653, "supported_languages": null}, "macro.dbt_utils.pretty_log_format": {"name": "pretty_log_format", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\jinja_helpers\\pretty_log_format.sql", "original_file_path": "macros\\jinja_helpers\\pretty_log_format.sql", "unique_id": "macro.dbt_utils.pretty_log_format", "macro_sql": "{% macro pretty_log_format(message) %}\n {{ return(adapter.dispatch('pretty_log_format', 'dbt_utils')(message)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__pretty_log_format"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "message", "type": null, "description": ""}], "created_at": 1785250505.5937653, "supported_languages": null}, "macro.dbt_utils.default__pretty_log_format": {"name": "default__pretty_log_format", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\jinja_helpers\\pretty_log_format.sql", "original_file_path": "macros\\jinja_helpers\\pretty_log_format.sql", "unique_id": "macro.dbt_utils.default__pretty_log_format", "macro_sql": "{% macro default__pretty_log_format(message) %}\n {{ return( dbt_utils.pretty_time() ~ ' + ' ~ message) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.pretty_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "message", "type": null, "description": ""}], "created_at": 1785250505.5952814, "supported_languages": null}, "macro.dbt_utils.pretty_time": {"name": "pretty_time", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\jinja_helpers\\pretty_time.sql", "original_file_path": "macros\\jinja_helpers\\pretty_time.sql", "unique_id": "macro.dbt_utils.pretty_time", "macro_sql": "{% macro pretty_time(format='%H:%M:%S') %}\n {{ return(adapter.dispatch('pretty_time', 'dbt_utils')(format)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__pretty_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "format", "type": null, "description": ""}], "created_at": 1785250505.5952814, "supported_languages": null}, "macro.dbt_utils.default__pretty_time": {"name": "default__pretty_time", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\jinja_helpers\\pretty_time.sql", "original_file_path": "macros\\jinja_helpers\\pretty_time.sql", "unique_id": "macro.dbt_utils.default__pretty_time", "macro_sql": "{% macro default__pretty_time(format='%H:%M:%S') %}\n {{ return(modules.datetime.datetime.now().strftime(format)) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "format", "type": null, "description": ""}], "created_at": 1785250505.596305, "supported_languages": null}, "macro.dbt_utils.slugify": {"name": "slugify", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\jinja_helpers\\slugify.sql", "original_file_path": "macros\\jinja_helpers\\slugify.sql", "unique_id": "macro.dbt_utils.slugify", "macro_sql": "{% macro slugify(string) %}\n\n{% if not string %}\n{{ return('') }}\n{% endif %}\n\n{#- Lower case the string -#}\n{% set string = string | lower %}\n{#- Replace spaces and dashes with underscores -#}\n{% set string = modules.re.sub('[ -]+', '_', string) %}\n{#- Only take letters, numbers, and underscores -#}\n{% set string = modules.re.sub('[^a-z0-9_]+', '', string) %}\n{#- Prepends \"_\" if string begins with a number -#}\n{% set string = modules.re.sub('^[0-9]', '_' + string[0], string) %}\n\n{{ return(string) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "string", "type": null, "description": ""}], "created_at": 1785250505.597295, "supported_languages": null}, "macro.dbt_utils._is_ephemeral": {"name": "_is_ephemeral", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\jinja_helpers\\_is_ephemeral.sql", "original_file_path": "macros\\jinja_helpers\\_is_ephemeral.sql", "unique_id": "macro.dbt_utils._is_ephemeral", "macro_sql": "{% macro _is_ephemeral(obj, macro) %}\n {%- if obj.is_cte -%}\n {% set ephemeral_prefix = api.Relation.add_ephemeral_prefix('') %}\n {% if obj.name.startswith(ephemeral_prefix) %}\n {% set model_name = obj.name[(ephemeral_prefix|length):] %}\n {% else %}\n {% set model_name = obj.name %}\n {%- endif -%}\n {% set error_message %}\nThe `{{ macro }}` macro cannot be used with ephemeral models, as it relies on the information schema.\n\n`{{ model_name }}` is an ephemeral model. Consider making it a view or table instead.\n {% endset %}\n {%- do exceptions.raise_compiler_error(error_message) -%}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "obj", "type": null, "description": ""}, {"name": "macro", "type": null, "description": ""}], "created_at": 1785250505.5992947, "supported_languages": null}, "macro.dbt_utils._is_relation": {"name": "_is_relation", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\jinja_helpers\\_is_relation.sql", "original_file_path": "macros\\jinja_helpers\\_is_relation.sql", "unique_id": "macro.dbt_utils._is_relation", "macro_sql": "{% macro _is_relation(obj, macro) %}\n {%- if not (obj is mapping and obj.get('metadata', {}).get('type', '').endswith('Relation')) -%}\n {%- do exceptions.raise_compiler_error(\"Macro \" ~ macro ~ \" expected a Relation but received the value: \" ~ obj) -%}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "obj", "type": null, "description": ""}, {"name": "macro", "type": null, "description": ""}], "created_at": 1785250505.6003034, "supported_languages": null}, "macro.dbt_utils.get_intervals_between": {"name": "get_intervals_between", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\date_spine.sql", "original_file_path": "macros\\sql\\date_spine.sql", "unique_id": "macro.dbt_utils.get_intervals_between", "macro_sql": "{% macro get_intervals_between(start_date, end_date, datepart) -%}\n {{ return(adapter.dispatch('get_intervals_between', 'dbt_utils')(start_date, end_date, datepart)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__get_intervals_between"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "start_date", "type": null, "description": ""}, {"name": "end_date", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}], "created_at": 1785250505.601296, "supported_languages": null}, "macro.dbt_utils.default__get_intervals_between": {"name": "default__get_intervals_between", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\date_spine.sql", "original_file_path": "macros\\sql\\date_spine.sql", "unique_id": "macro.dbt_utils.default__get_intervals_between", "macro_sql": "{% macro default__get_intervals_between(start_date, end_date, datepart) -%}\n {%- call statement('get_intervals_between', fetch_result=True) %}\n\n select {{ dbt.datediff(start_date, end_date, datepart) }}\n\n {%- endcall -%}\n\n {%- set value_list = load_result('get_intervals_between') -%}\n\n {%- if value_list and value_list['data'] -%}\n {%- set values = value_list['data'] | map(attribute=0) | list %}\n {{ return(values[0]) }}\n {%- else -%}\n {{ return(1) }}\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.datediff"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "start_date", "type": null, "description": ""}, {"name": "end_date", "type": null, "description": ""}, {"name": "datepart", "type": null, "description": ""}], "created_at": 1785250505.602304, "supported_languages": null}, "macro.dbt_utils.date_spine": {"name": "date_spine", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\date_spine.sql", "original_file_path": "macros\\sql\\date_spine.sql", "unique_id": "macro.dbt_utils.date_spine", "macro_sql": "{% macro date_spine(datepart, start_date, end_date) %}\n {{ return(adapter.dispatch('date_spine', 'dbt_utils')(datepart, start_date, end_date)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__date_spine"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "datepart", "type": null, "description": ""}, {"name": "start_date", "type": null, "description": ""}, {"name": "end_date", "type": null, "description": ""}], "created_at": 1785250505.602304, "supported_languages": null}, "macro.dbt_utils.default__date_spine": {"name": "default__date_spine", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\date_spine.sql", "original_file_path": "macros\\sql\\date_spine.sql", "unique_id": "macro.dbt_utils.default__date_spine", "macro_sql": "{% macro default__date_spine(datepart, start_date, end_date) %}\n\n\n{# call as follows:\n\ndate_spine(\n \"day\",\n \"to_date('01/01/2016', 'mm/dd/yyyy')\",\n \"dbt.dateadd(week, 1, current_date)\"\n) #}\n\n\nwith rawdata as (\n\n {{dbt_utils.generate_series(\n dbt_utils.get_intervals_between(start_date, end_date, datepart)\n )}}\n\n),\n\nall_periods as (\n\n select (\n {{\n dbt.dateadd(\n datepart,\n \"row_number() over (order by generated_number) - 1\",\n start_date\n )\n }}\n ) as date_{{datepart}}\n from rawdata\n\n),\n\nfiltered as (\n\n select *\n from all_periods\n where date_{{datepart}} <= {{ end_date }}\n\n)\n\nselect * from filtered\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.generate_series", "macro.dbt_utils.get_intervals_between", "macro.dbt.dateadd"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "datepart", "type": null, "description": ""}, {"name": "start_date", "type": null, "description": ""}, {"name": "end_date", "type": null, "description": ""}], "created_at": 1785250505.6032956, "supported_languages": null}, "macro.dbt_utils.deduplicate": {"name": "deduplicate", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\deduplicate.sql", "original_file_path": "macros\\sql\\deduplicate.sql", "unique_id": "macro.dbt_utils.deduplicate", "macro_sql": "{%- macro deduplicate(relation, partition_by, order_by) -%}\n {{ return(adapter.dispatch('deduplicate', 'dbt_utils')(relation, partition_by, order_by)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.databricks__deduplicate"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "partition_by", "type": null, "description": ""}, {"name": "order_by", "type": null, "description": ""}], "created_at": 1785250505.6043036, "supported_languages": null}, "macro.dbt_utils.default__deduplicate": {"name": "default__deduplicate", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\deduplicate.sql", "original_file_path": "macros\\sql\\deduplicate.sql", "unique_id": "macro.dbt_utils.default__deduplicate", "macro_sql": "\n\n{%- macro default__deduplicate(relation, partition_by, order_by) -%}\n\n with row_numbered as (\n select\n _inner.*,\n row_number() over (\n partition by {{ partition_by }}\n order by {{ order_by }}\n ) as rn\n from {{ relation }} as _inner\n )\n\n select\n distinct data.*\n from {{ relation }} as data\n {#\n -- Not all DBs will support natural joins but the ones that do include:\n -- Oracle, MySQL, SQLite, Redshift, Teradata, Materialize, Databricks\n -- Apache Spark, SingleStore, Vertica\n -- Those that do not appear to support natural joins include:\n -- SQLServer, Trino, Presto, Rockset, Athena\n #}\n natural join row_numbered\n where row_numbered.rn = 1\n\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "partition_by", "type": null, "description": ""}, {"name": "order_by", "type": null, "description": ""}], "created_at": 1785250505.6052952, "supported_languages": null}, "macro.dbt_utils.redshift__deduplicate": {"name": "redshift__deduplicate", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\deduplicate.sql", "original_file_path": "macros\\sql\\deduplicate.sql", "unique_id": "macro.dbt_utils.redshift__deduplicate", "macro_sql": "{% macro redshift__deduplicate(relation, partition_by, order_by) -%}\n\n select *\n from {{ relation }} as tt\n qualify\n row_number() over (\n partition by {{ partition_by }}\n order by {{ order_by }}\n ) = 1\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "partition_by", "type": null, "description": ""}, {"name": "order_by", "type": null, "description": ""}], "created_at": 1785250505.6052952, "supported_languages": null}, "macro.dbt_utils.postgres__deduplicate": {"name": "postgres__deduplicate", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\deduplicate.sql", "original_file_path": "macros\\sql\\deduplicate.sql", "unique_id": "macro.dbt_utils.postgres__deduplicate", "macro_sql": "\n{%- macro postgres__deduplicate(relation, partition_by, order_by) -%}\n\n select\n distinct on ({{ partition_by }}) *\n from {{ relation }}\n order by {{ partition_by }}{{ ',' ~ order_by }}\n\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "partition_by", "type": null, "description": ""}, {"name": "order_by", "type": null, "description": ""}], "created_at": 1785250505.6063054, "supported_languages": null}, "macro.dbt_utils.snowflake__deduplicate": {"name": "snowflake__deduplicate", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\deduplicate.sql", "original_file_path": "macros\\sql\\deduplicate.sql", "unique_id": "macro.dbt_utils.snowflake__deduplicate", "macro_sql": "\n{%- macro snowflake__deduplicate(relation, partition_by, order_by) -%}\n\n select *\n from {{ relation }}\n qualify\n row_number() over (\n partition by {{ partition_by }}\n order by {{ order_by }}\n ) = 1\n\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "partition_by", "type": null, "description": ""}, {"name": "order_by", "type": null, "description": ""}], "created_at": 1785250505.6063054, "supported_languages": null}, "macro.dbt_utils.databricks__deduplicate": {"name": "databricks__deduplicate", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\deduplicate.sql", "original_file_path": "macros\\sql\\deduplicate.sql", "unique_id": "macro.dbt_utils.databricks__deduplicate", "macro_sql": "\n{%- macro databricks__deduplicate(relation, partition_by, order_by) -%}\n\n select *\n from {{ relation }}\n qualify\n row_number() over (\n partition by {{ partition_by }}\n order by {{ order_by }}\n ) = 1\n\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "partition_by", "type": null, "description": ""}, {"name": "order_by", "type": null, "description": ""}], "created_at": 1785250505.607296, "supported_languages": null}, "macro.dbt_utils.bigquery__deduplicate": {"name": "bigquery__deduplicate", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\deduplicate.sql", "original_file_path": "macros\\sql\\deduplicate.sql", "unique_id": "macro.dbt_utils.bigquery__deduplicate", "macro_sql": "\n{%- macro bigquery__deduplicate(relation, partition_by, order_by) -%}\n\n select unique.*\n from (\n select\n array_agg (\n original\n order by {{ order_by }}\n limit 1\n )[offset(0)] unique\n from {{ relation }} original\n group by {{ partition_by }}\n )\n\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "partition_by", "type": null, "description": ""}, {"name": "order_by", "type": null, "description": ""}], "created_at": 1785250505.607296, "supported_languages": null}, "macro.dbt_utils.get_powers_of_two": {"name": "get_powers_of_two", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\generate_series.sql", "original_file_path": "macros\\sql\\generate_series.sql", "unique_id": "macro.dbt_utils.get_powers_of_two", "macro_sql": "{% macro get_powers_of_two(upper_bound) %}\n {{ return(adapter.dispatch('get_powers_of_two', 'dbt_utils')(upper_bound)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__get_powers_of_two"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "upper_bound", "type": null, "description": ""}], "created_at": 1785250505.6083057, "supported_languages": null}, "macro.dbt_utils.default__get_powers_of_two": {"name": "default__get_powers_of_two", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\generate_series.sql", "original_file_path": "macros\\sql\\generate_series.sql", "unique_id": "macro.dbt_utils.default__get_powers_of_two", "macro_sql": "{% macro default__get_powers_of_two(upper_bound) %}\n\n {% if upper_bound <= 0 %}\n {{ exceptions.raise_compiler_error(\"upper bound must be positive\") }}\n {% endif %}\n\n {% for _ in range(1, 100) %}\n {% if upper_bound <= 2 ** loop.index %}{{ return(loop.index) }}{% endif %}\n {% endfor %}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "upper_bound", "type": null, "description": ""}], "created_at": 1785250505.609296, "supported_languages": null}, "macro.dbt_utils.generate_series": {"name": "generate_series", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\generate_series.sql", "original_file_path": "macros\\sql\\generate_series.sql", "unique_id": "macro.dbt_utils.generate_series", "macro_sql": "{% macro generate_series(upper_bound) %}\n {{ return(adapter.dispatch('generate_series', 'dbt_utils')(upper_bound)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__generate_series"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "upper_bound", "type": null, "description": ""}], "created_at": 1785250505.609296, "supported_languages": null}, "macro.dbt_utils.default__generate_series": {"name": "default__generate_series", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\generate_series.sql", "original_file_path": "macros\\sql\\generate_series.sql", "unique_id": "macro.dbt_utils.default__generate_series", "macro_sql": "{% macro default__generate_series(upper_bound) %}\n\n {% set n = dbt_utils.get_powers_of_two(upper_bound) %}\n\n with p as (\n select 0 as generated_number union all select 1\n ), unioned as (\n\n select\n\n {% for i in range(n) %}\n p{{i}}.generated_number * power(2, {{i}})\n {% if not loop.last %} + {% endif %}\n {% endfor %}\n + 1\n as generated_number\n\n from\n\n {% for i in range(n) %}\n p as p{{i}}\n {% if not loop.last %} cross join {% endif %}\n {% endfor %}\n\n )\n\n select *\n from unioned\n where generated_number <= {{upper_bound}}\n order by generated_number\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.get_powers_of_two"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "upper_bound", "type": null, "description": ""}], "created_at": 1785250505.6103027, "supported_languages": null}, "macro.dbt_utils.generate_surrogate_key": {"name": "generate_surrogate_key", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\generate_surrogate_key.sql", "original_file_path": "macros\\sql\\generate_surrogate_key.sql", "unique_id": "macro.dbt_utils.generate_surrogate_key", "macro_sql": "{%- macro generate_surrogate_key(field_list) -%}\n {{ return(adapter.dispatch('generate_surrogate_key', 'dbt_utils')(field_list)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__generate_surrogate_key"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field_list", "type": null, "description": ""}], "created_at": 1785250505.6112962, "supported_languages": null}, "macro.dbt_utils.default__generate_surrogate_key": {"name": "default__generate_surrogate_key", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\generate_surrogate_key.sql", "original_file_path": "macros\\sql\\generate_surrogate_key.sql", "unique_id": "macro.dbt_utils.default__generate_surrogate_key", "macro_sql": "\n\n{%- macro default__generate_surrogate_key(field_list) -%}\n\n{%- if var('surrogate_key_treat_nulls_as_empty_strings', False) -%}\n {%- set default_null_value = \"\" -%}\n{%- else -%}\n {%- set default_null_value = '_dbt_utils_surrogate_key_null_' -%}\n{%- endif -%}\n\n{%- set fields = [] -%}\n\n{%- for field in field_list -%}\n\n {%- do fields.append(\n \"coalesce(cast(\" ~ field ~ \" as \" ~ dbt.type_string() ~ \"), '\" ~ default_null_value ~\"')\"\n ) -%}\n\n {%- if not loop.last %}\n {%- do fields.append(\"'-'\") -%}\n {%- endif -%}\n\n{%- endfor -%}\n\n{{ dbt.hash(dbt.concat(fields)) }}\n\n{%- endmacro -%}", "depends_on": {"macros": ["macro.dbt.type_string", "macro.dbt.hash", "macro.dbt.concat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field_list", "type": null, "description": ""}], "created_at": 1785250505.6123004, "supported_languages": null}, "macro.dbt_utils.get_column_values": {"name": "get_column_values", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_column_values.sql", "original_file_path": "macros\\sql\\get_column_values.sql", "unique_id": "macro.dbt_utils.get_column_values", "macro_sql": "{% macro get_column_values(table, column, order_by='count(*) desc', max_records=none, default=none, where=none) -%}\n {{ return(adapter.dispatch('get_column_values', 'dbt_utils')(table, column, order_by, max_records, default, where)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__get_column_values"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "table", "type": null, "description": ""}, {"name": "column", "type": null, "description": ""}, {"name": "order_by", "type": null, "description": ""}, {"name": "max_records", "type": null, "description": ""}, {"name": "default", "type": null, "description": ""}, {"name": "where", "type": null, "description": ""}], "created_at": 1785250505.6142988, "supported_languages": null}, "macro.dbt_utils.default__get_column_values": {"name": "default__get_column_values", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_column_values.sql", "original_file_path": "macros\\sql\\get_column_values.sql", "unique_id": "macro.dbt_utils.default__get_column_values", "macro_sql": "{% macro default__get_column_values(table, column, order_by='count(*) desc', max_records=none, default=none, where=none) -%}\n {#-- Prevent querying of db in parsing mode. This works because this macro does not create any new refs. #}\n {%- if not execute -%}\n {% set default = [] if not default %}\n {{ return(default) }}\n {% endif %}\n\n {%- do dbt_utils._is_ephemeral(table, 'get_column_values') -%}\n\n {# Not all relations are tables. Renaming for internal clarity without breaking functionality for anyone using named arguments #}\n {# TODO: Change the method signature in a future 0.x.0 release #}\n {%- set target_relation = table -%}\n\n {# adapter.load_relation is a convenience wrapper to avoid building a Relation when we already have one #}\n {% set relation_exists = (load_relation(target_relation)) is not none %}\n\n {%- call statement('get_column_values', fetch_result=true) %}\n\n {%- if not relation_exists and default is none -%}\n\n {{ exceptions.raise_compiler_error(\"In get_column_values(): relation \" ~ target_relation ~ \" does not exist and no default value was provided.\") }}\n\n {%- elif not relation_exists and default is not none -%}\n\n {{ log(\"Relation \" ~ target_relation ~ \" does not exist. Returning the default value: \" ~ default) }}\n\n {{ return(default) }}\n\n {%- else -%}\n\n\n select\n {{ column }} as value\n\n from {{ target_relation }}\n\n {% if where is not none %}\n where {{ where }}\n {% endif %}\n\n group by {{ column }}\n order by {{ order_by }}\n\n {% if max_records is not none %}\n limit {{ max_records }}\n {% endif %}\n\n {% endif %}\n\n {%- endcall -%}\n\n {%- set value_list = load_result('get_column_values') -%}\n\n {%- if value_list and value_list['data'] -%}\n {%- set values = value_list['data'] | map(attribute=0) | list %}\n {{ return(values) }}\n {%- else -%}\n {{ return(default) }}\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_utils._is_ephemeral", "macro.dbt.load_relation", "macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "table", "type": null, "description": ""}, {"name": "column", "type": null, "description": ""}, {"name": "order_by", "type": null, "description": ""}, {"name": "max_records", "type": null, "description": ""}, {"name": "default", "type": null, "description": ""}, {"name": "where", "type": null, "description": ""}], "created_at": 1785250505.6172936, "supported_languages": null}, "macro.dbt_utils.get_filtered_columns_in_relation": {"name": "get_filtered_columns_in_relation", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_filtered_columns_in_relation.sql", "original_file_path": "macros\\sql\\get_filtered_columns_in_relation.sql", "unique_id": "macro.dbt_utils.get_filtered_columns_in_relation", "macro_sql": "{% macro get_filtered_columns_in_relation(from, except=[]) -%}\n {{ return(adapter.dispatch('get_filtered_columns_in_relation', 'dbt_utils')(from, except)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__get_filtered_columns_in_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "from", "type": null, "description": ""}, {"name": "except", "type": null, "description": ""}], "created_at": 1785250505.618303, "supported_languages": null}, "macro.dbt_utils.default__get_filtered_columns_in_relation": {"name": "default__get_filtered_columns_in_relation", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_filtered_columns_in_relation.sql", "original_file_path": "macros\\sql\\get_filtered_columns_in_relation.sql", "unique_id": "macro.dbt_utils.default__get_filtered_columns_in_relation", "macro_sql": "{% macro default__get_filtered_columns_in_relation(from, except=[]) -%}\n {%- do dbt_utils._is_relation(from, 'get_filtered_columns_in_relation') -%}\n {%- do dbt_utils._is_ephemeral(from, 'get_filtered_columns_in_relation') -%}\n\n {# -- Prevent querying of db in parsing mode. This works because this macro does not create any new refs. #}\n {%- if not execute -%}\n {{ return([]) }}\n {% endif %}\n\n {%- set include_cols = [] %}\n {%- set cols = adapter.get_columns_in_relation(from) -%}\n {%- set except = except | map(\"lower\") | list %}\n {%- for col in cols -%}\n {%- if col.column|lower not in except -%}\n {% do include_cols.append(col.column) %}\n {%- endif %}\n {%- endfor %}\n\n {{ return(include_cols) }}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_utils._is_relation", "macro.dbt_utils._is_ephemeral"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "from", "type": null, "description": ""}, {"name": "except", "type": null, "description": ""}], "created_at": 1785250505.6192946, "supported_languages": null}, "macro.dbt_utils.get_query_results_as_dict": {"name": "get_query_results_as_dict", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_query_results_as_dict.sql", "original_file_path": "macros\\sql\\get_query_results_as_dict.sql", "unique_id": "macro.dbt_utils.get_query_results_as_dict", "macro_sql": "{% macro get_query_results_as_dict(query) %}\n {{ return(adapter.dispatch('get_query_results_as_dict', 'dbt_utils')(query)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__get_query_results_as_dict"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "query", "type": null, "description": ""}], "created_at": 1785250505.620306, "supported_languages": null}, "macro.dbt_utils.default__get_query_results_as_dict": {"name": "default__get_query_results_as_dict", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_query_results_as_dict.sql", "original_file_path": "macros\\sql\\get_query_results_as_dict.sql", "unique_id": "macro.dbt_utils.default__get_query_results_as_dict", "macro_sql": "{% macro default__get_query_results_as_dict(query) %}\n\n{# This macro returns a dictionary of the form {column_name: (tuple_of_results)} #}\n\n {%- call statement('get_query_results', fetch_result=True,auto_begin=false) -%}\n\n {{ query }}\n\n {%- endcall -%}\n\n {% set sql_results={} %}\n\n {%- if execute -%}\n {% set sql_results_table = load_result('get_query_results').table.columns %}\n {% for column_name, column in sql_results_table.items() %}\n {% do sql_results.update({column_name: column.values()}) %}\n {% endfor %}\n {%- endif -%}\n\n {{ return(sql_results) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "query", "type": null, "description": ""}], "created_at": 1785250505.6212962, "supported_languages": null}, "macro.dbt_utils.get_relations_by_pattern": {"name": "get_relations_by_pattern", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_relations_by_pattern.sql", "original_file_path": "macros\\sql\\get_relations_by_pattern.sql", "unique_id": "macro.dbt_utils.get_relations_by_pattern", "macro_sql": "{% macro get_relations_by_pattern(schema_pattern, table_pattern, exclude='', database=target.database) %}\n {{ return(adapter.dispatch('get_relations_by_pattern', 'dbt_utils')(schema_pattern, table_pattern, exclude, database)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__get_relations_by_pattern"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_pattern", "type": null, "description": ""}, {"name": "table_pattern", "type": null, "description": ""}, {"name": "exclude", "type": null, "description": ""}, {"name": "database", "type": null, "description": ""}], "created_at": 1785250505.6232965, "supported_languages": null}, "macro.dbt_utils.default__get_relations_by_pattern": {"name": "default__get_relations_by_pattern", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_relations_by_pattern.sql", "original_file_path": "macros\\sql\\get_relations_by_pattern.sql", "unique_id": "macro.dbt_utils.default__get_relations_by_pattern", "macro_sql": "{% macro default__get_relations_by_pattern(schema_pattern, table_pattern, exclude='', database=target.database) %}\n\n {%- call statement('get_tables', fetch_result=True) %}\n\n {{ dbt_utils.get_tables_by_pattern_sql(schema_pattern, table_pattern, exclude, database) }}\n\n {%- endcall -%}\n\n {%- set table_list = load_result('get_tables') -%}\n\n {%- if table_list and table_list['table'] -%}\n {%- set tbl_relations = [] -%}\n {%- for row in table_list['table'] -%}\n {%- set tbl_relation = api.Relation.create(\n database=database,\n schema=row.table_schema,\n identifier=row.table_name,\n type=row.table_type\n ) -%}\n {%- do tbl_relations.append(tbl_relation) -%}\n {%- endfor -%}\n\n {{ return(tbl_relations) }}\n {%- else -%}\n {{ return([]) }}\n {%- endif -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_utils.get_tables_by_pattern_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_pattern", "type": null, "description": ""}, {"name": "table_pattern", "type": null, "description": ""}, {"name": "exclude", "type": null, "description": ""}, {"name": "database", "type": null, "description": ""}], "created_at": 1785250505.6242998, "supported_languages": null}, "macro.dbt_utils.get_relations_by_prefix": {"name": "get_relations_by_prefix", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_relations_by_prefix.sql", "original_file_path": "macros\\sql\\get_relations_by_prefix.sql", "unique_id": "macro.dbt_utils.get_relations_by_prefix", "macro_sql": "{% macro get_relations_by_prefix(schema, prefix, exclude='', database=target.database) %}\n {{ return(adapter.dispatch('get_relations_by_prefix', 'dbt_utils')(schema, prefix, exclude, database)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__get_relations_by_prefix"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema", "type": null, "description": ""}, {"name": "prefix", "type": null, "description": ""}, {"name": "exclude", "type": null, "description": ""}, {"name": "database", "type": null, "description": ""}], "created_at": 1785250505.6252964, "supported_languages": null}, "macro.dbt_utils.default__get_relations_by_prefix": {"name": "default__get_relations_by_prefix", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_relations_by_prefix.sql", "original_file_path": "macros\\sql\\get_relations_by_prefix.sql", "unique_id": "macro.dbt_utils.default__get_relations_by_prefix", "macro_sql": "{% macro default__get_relations_by_prefix(schema, prefix, exclude='', database=target.database) %}\n\n {%- call statement('get_tables', fetch_result=True) %}\n\n {{ dbt_utils.get_tables_by_prefix_sql(schema, prefix, exclude, database) }}\n\n {%- endcall -%}\n\n {%- set table_list = load_result('get_tables') -%}\n\n {%- if table_list and table_list['table'] -%}\n {%- set tbl_relations = [] -%}\n {%- for row in table_list['table'] -%}\n {%- set tbl_relation = api.Relation.create(\n database=database,\n schema=row.table_schema,\n identifier=row.table_name,\n type=row.table_type\n ) -%}\n {%- do tbl_relations.append(tbl_relation) -%}\n {%- endfor -%}\n\n {{ return(tbl_relations) }}\n {%- else -%}\n {{ return([]) }}\n {%- endif -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt_utils.get_tables_by_prefix_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema", "type": null, "description": ""}, {"name": "prefix", "type": null, "description": ""}, {"name": "exclude", "type": null, "description": ""}, {"name": "database", "type": null, "description": ""}], "created_at": 1785250505.627296, "supported_languages": null}, "macro.dbt_utils.get_single_value": {"name": "get_single_value", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_single_value.sql", "original_file_path": "macros\\sql\\get_single_value.sql", "unique_id": "macro.dbt_utils.get_single_value", "macro_sql": "{% macro get_single_value(query, default=none) %}\n {{ return(adapter.dispatch('get_single_value', 'dbt_utils')(query, default)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__get_single_value"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "query", "type": null, "description": ""}, {"name": "default", "type": null, "description": ""}], "created_at": 1785250505.6282983, "supported_languages": null}, "macro.dbt_utils.default__get_single_value": {"name": "default__get_single_value", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_single_value.sql", "original_file_path": "macros\\sql\\get_single_value.sql", "unique_id": "macro.dbt_utils.default__get_single_value", "macro_sql": "{% macro default__get_single_value(query, default) %}\n\n{# This macro returns the (0, 0) record in a query, i.e. the first row of the first column #}\n\n {%- call statement('get_query_result', fetch_result=True, auto_begin=false) -%}\n\n {{ query }}\n\n {%- endcall -%}\n\n {%- if execute -%}\n\n {% set r = load_result('get_query_result').table.columns[0].values() %}\n {% if r | length == 0 %}\n {% do print('Query `' ~ query ~ '` returned no rows. Using the default value: ' ~ default) %}\n {% set sql_result = default %}\n {% else %}\n {% set sql_result = r[0] %}\n {% endif %}\n \n {%- else -%}\n \n {% set sql_result = default %}\n \n {%- endif -%}\n\n {% do return(sql_result) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "query", "type": null, "description": ""}, {"name": "default", "type": null, "description": ""}], "created_at": 1785250505.6302974, "supported_languages": null}, "macro.dbt_utils.get_tables_by_pattern_sql": {"name": "get_tables_by_pattern_sql", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_tables_by_pattern_sql.sql", "original_file_path": "macros\\sql\\get_tables_by_pattern_sql.sql", "unique_id": "macro.dbt_utils.get_tables_by_pattern_sql", "macro_sql": "{% macro get_tables_by_pattern_sql(schema_pattern, table_pattern, exclude='', database=target.database) %}\n {{ return(adapter.dispatch('get_tables_by_pattern_sql', 'dbt_utils')\n (schema_pattern, table_pattern, exclude, database)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__get_tables_by_pattern_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_pattern", "type": null, "description": ""}, {"name": "table_pattern", "type": null, "description": ""}, {"name": "exclude", "type": null, "description": ""}, {"name": "database", "type": null, "description": ""}], "created_at": 1785250505.632296, "supported_languages": null}, "macro.dbt_utils.default__get_tables_by_pattern_sql": {"name": "default__get_tables_by_pattern_sql", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_tables_by_pattern_sql.sql", "original_file_path": "macros\\sql\\get_tables_by_pattern_sql.sql", "unique_id": "macro.dbt_utils.default__get_tables_by_pattern_sql", "macro_sql": "{% macro default__get_tables_by_pattern_sql(schema_pattern, table_pattern, exclude='', database=target.database) %}\n\n select distinct\n table_schema as {{ adapter.quote('table_schema') }},\n table_name as {{ adapter.quote('table_name') }},\n {{ dbt_utils.get_table_types_sql() }}\n from {{ database }}.information_schema.tables\n where table_schema ilike '{{ schema_pattern }}'\n and table_name ilike '{{ table_pattern }}'\n and table_name not ilike '{{ exclude }}'\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.get_table_types_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_pattern", "type": null, "description": ""}, {"name": "table_pattern", "type": null, "description": ""}, {"name": "exclude", "type": null, "description": ""}, {"name": "database", "type": null, "description": ""}], "created_at": 1785250505.632296, "supported_languages": null}, "macro.dbt_utils.redshift__get_tables_by_pattern_sql": {"name": "redshift__get_tables_by_pattern_sql", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_tables_by_pattern_sql.sql", "original_file_path": "macros\\sql\\get_tables_by_pattern_sql.sql", "unique_id": "macro.dbt_utils.redshift__get_tables_by_pattern_sql", "macro_sql": "{% macro redshift__get_tables_by_pattern_sql(schema_pattern, table_pattern, exclude='', database=target.database) %}\n\n {% set sql %}\n select distinct\n table_schema as {{ adapter.quote('table_schema') }},\n table_name as {{ adapter.quote('table_name') }},\n {{ dbt_utils.get_table_types_sql() }}\n from \"{{ database }}\".\"information_schema\".\"tables\"\n where table_schema ilike '{{ schema_pattern }}'\n and table_name ilike '{{ table_pattern }}'\n and table_name not ilike '{{ exclude }}'\n union all\n select distinct\n schemaname as {{ adapter.quote('table_schema') }},\n tablename as {{ adapter.quote('table_name') }},\n 'external' as {{ adapter.quote('table_type') }}\n from svv_external_tables\n where redshift_database_name = '{{ database }}'\n and schemaname ilike '{{ schema_pattern }}'\n and table_name ilike '{{ table_pattern }}'\n and table_name not ilike '{{ exclude }}'\n {% endset %}\n\n {{ return(sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.get_table_types_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_pattern", "type": null, "description": ""}, {"name": "table_pattern", "type": null, "description": ""}, {"name": "exclude", "type": null, "description": ""}, {"name": "database", "type": null, "description": ""}], "created_at": 1785250505.6342952, "supported_languages": null}, "macro.dbt_utils.bigquery__get_tables_by_pattern_sql": {"name": "bigquery__get_tables_by_pattern_sql", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_tables_by_pattern_sql.sql", "original_file_path": "macros\\sql\\get_tables_by_pattern_sql.sql", "unique_id": "macro.dbt_utils.bigquery__get_tables_by_pattern_sql", "macro_sql": "{% macro bigquery__get_tables_by_pattern_sql(schema_pattern, table_pattern, exclude='', database=target.database) %}\n\n {% if '%' in schema_pattern %}\n {% set schemata=dbt_utils._bigquery__get_matching_schemata(schema_pattern, database) %}\n {% else %}\n {% set schemata=[schema_pattern] %}\n {% endif %}\n\n {% set sql %}\n {% for schema in schemata %}\n select distinct\n table_schema,\n table_name,\n {{ dbt_utils.get_table_types_sql() }}\n\n from {{ adapter.quote(database) }}.{{ schema }}.INFORMATION_SCHEMA.TABLES\n where lower(table_name) like lower ('{{ table_pattern }}')\n and lower(table_name) not like lower ('{{ exclude }}')\n\n {% if not loop.last %} union all {% endif %}\n\n {% endfor %}\n {% endset %}\n\n {{ return(sql) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils._bigquery__get_matching_schemata", "macro.dbt_utils.get_table_types_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_pattern", "type": null, "description": ""}, {"name": "table_pattern", "type": null, "description": ""}, {"name": "exclude", "type": null, "description": ""}, {"name": "database", "type": null, "description": ""}], "created_at": 1785250505.6352968, "supported_languages": null}, "macro.dbt_utils._bigquery__get_matching_schemata": {"name": "_bigquery__get_matching_schemata", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_tables_by_pattern_sql.sql", "original_file_path": "macros\\sql\\get_tables_by_pattern_sql.sql", "unique_id": "macro.dbt_utils._bigquery__get_matching_schemata", "macro_sql": "{% macro _bigquery__get_matching_schemata(schema_pattern, database) %}\n {% if execute %}\n\n {% set sql %}\n select schema_name from {{ adapter.quote(database) }}.INFORMATION_SCHEMA.SCHEMATA\n where lower(schema_name) like lower('{{ schema_pattern }}')\n {% endset %}\n\n {% set results=run_query(sql) %}\n\n {% set schemata=results.columns['schema_name'].values() %}\n\n {{ return(schemata) }}\n\n {% else %}\n\n {{ return([]) }}\n\n {% endif %}\n\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema_pattern", "type": null, "description": ""}, {"name": "database", "type": null, "description": ""}], "created_at": 1785250505.6372974, "supported_languages": null}, "macro.dbt_utils.get_tables_by_prefix_sql": {"name": "get_tables_by_prefix_sql", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_tables_by_prefix_sql.sql", "original_file_path": "macros\\sql\\get_tables_by_prefix_sql.sql", "unique_id": "macro.dbt_utils.get_tables_by_prefix_sql", "macro_sql": "{% macro get_tables_by_prefix_sql(schema, prefix, exclude='', database=target.database) %}\n {{ return(adapter.dispatch('get_tables_by_prefix_sql', 'dbt_utils')(schema, prefix, exclude, database)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__get_tables_by_prefix_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema", "type": null, "description": ""}, {"name": "prefix", "type": null, "description": ""}, {"name": "exclude", "type": null, "description": ""}, {"name": "database", "type": null, "description": ""}], "created_at": 1785250505.6372974, "supported_languages": null}, "macro.dbt_utils.default__get_tables_by_prefix_sql": {"name": "default__get_tables_by_prefix_sql", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_tables_by_prefix_sql.sql", "original_file_path": "macros\\sql\\get_tables_by_prefix_sql.sql", "unique_id": "macro.dbt_utils.default__get_tables_by_prefix_sql", "macro_sql": "{% macro default__get_tables_by_prefix_sql(schema, prefix, exclude='', database=target.database) %}\n\n {{ dbt_utils.get_tables_by_pattern_sql(\n schema_pattern = schema,\n table_pattern = prefix ~ '%',\n exclude = exclude,\n database = database\n ) }}\n \n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.get_tables_by_pattern_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "schema", "type": null, "description": ""}, {"name": "prefix", "type": null, "description": ""}, {"name": "exclude", "type": null, "description": ""}, {"name": "database", "type": null, "description": ""}], "created_at": 1785250505.6382997, "supported_languages": null}, "macro.dbt_utils.get_table_types_sql": {"name": "get_table_types_sql", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_table_types_sql.sql", "original_file_path": "macros\\sql\\get_table_types_sql.sql", "unique_id": "macro.dbt_utils.get_table_types_sql", "macro_sql": "{%- macro get_table_types_sql() -%}\n {{ return(adapter.dispatch('get_table_types_sql', 'dbt_utils')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_utils.databricks__get_table_types_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.6392982, "supported_languages": null}, "macro.dbt_utils.default__get_table_types_sql": {"name": "default__get_table_types_sql", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_table_types_sql.sql", "original_file_path": "macros\\sql\\get_table_types_sql.sql", "unique_id": "macro.dbt_utils.default__get_table_types_sql", "macro_sql": "{% macro default__get_table_types_sql() %}\n case table_type\n when 'BASE TABLE' then 'table'\n when 'EXTERNAL TABLE' then 'external'\n when 'MATERIALIZED VIEW' then 'materializedview'\n else lower(table_type)\n end as {{ adapter.quote('table_type') }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.6392982, "supported_languages": null}, "macro.dbt_utils.postgres__get_table_types_sql": {"name": "postgres__get_table_types_sql", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_table_types_sql.sql", "original_file_path": "macros\\sql\\get_table_types_sql.sql", "unique_id": "macro.dbt_utils.postgres__get_table_types_sql", "macro_sql": "{% macro postgres__get_table_types_sql() %}\n case table_type\n when 'BASE TABLE' then 'table'\n when 'FOREIGN' then 'external'\n when 'MATERIALIZED VIEW' then 'materializedview'\n else lower(table_type)\n end as {{ adapter.quote('table_type') }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.6392982, "supported_languages": null}, "macro.dbt_utils.databricks__get_table_types_sql": {"name": "databricks__get_table_types_sql", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\get_table_types_sql.sql", "original_file_path": "macros\\sql\\get_table_types_sql.sql", "unique_id": "macro.dbt_utils.databricks__get_table_types_sql", "macro_sql": "{% macro databricks__get_table_types_sql() %}\n case table_type\n when 'MANAGED' then 'table'\n when 'BASE TABLE' then 'table'\n when 'MATERIALIZED VIEW' then 'materializedview'\n else lower(table_type)\n end as {{ adapter.quote('table_type') }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [], "created_at": 1785250505.640301, "supported_languages": null}, "macro.dbt_utils.group_by": {"name": "group_by", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\groupby.sql", "original_file_path": "macros\\sql\\groupby.sql", "unique_id": "macro.dbt_utils.group_by", "macro_sql": "{%- macro group_by(n) -%}\n {{ return(adapter.dispatch('group_by', 'dbt_utils')(n)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__group_by"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "n", "type": null, "description": ""}], "created_at": 1785250505.640301, "supported_languages": null}, "macro.dbt_utils.default__group_by": {"name": "default__group_by", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\groupby.sql", "original_file_path": "macros\\sql\\groupby.sql", "unique_id": "macro.dbt_utils.default__group_by", "macro_sql": "\n\n{%- macro default__group_by(n) -%}\n\n group by {% for i in range(1, n + 1) -%}\n {{ i }}{{ ',' if not loop.last }} \n {%- endfor -%}\n\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "n", "type": null, "description": ""}], "created_at": 1785250505.6412983, "supported_languages": null}, "macro.dbt_utils.degrees_to_radians": {"name": "degrees_to_radians", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\haversine_distance.sql", "original_file_path": "macros\\sql\\haversine_distance.sql", "unique_id": "macro.dbt_utils.degrees_to_radians", "macro_sql": "{% macro degrees_to_radians(degrees) -%}\n acos(-1) * {{degrees}} / 180\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "degrees", "type": null, "description": ""}], "created_at": 1785250505.6422963, "supported_languages": null}, "macro.dbt_utils.haversine_distance": {"name": "haversine_distance", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\haversine_distance.sql", "original_file_path": "macros\\sql\\haversine_distance.sql", "unique_id": "macro.dbt_utils.haversine_distance", "macro_sql": "{% macro haversine_distance(lat1, lon1, lat2, lon2, unit='mi') -%}\n {{ return(adapter.dispatch('haversine_distance', 'dbt_utils')(lat1,lon1,lat2,lon2,unit)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__haversine_distance"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "lat1", "type": null, "description": ""}, {"name": "lon1", "type": null, "description": ""}, {"name": "lat2", "type": null, "description": ""}, {"name": "lon2", "type": null, "description": ""}, {"name": "unit", "type": null, "description": ""}], "created_at": 1785250505.6422963, "supported_languages": null}, "macro.dbt_utils.default__haversine_distance": {"name": "default__haversine_distance", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\haversine_distance.sql", "original_file_path": "macros\\sql\\haversine_distance.sql", "unique_id": "macro.dbt_utils.default__haversine_distance", "macro_sql": "{% macro default__haversine_distance(lat1, lon1, lat2, lon2, unit='mi') -%}\n{%- if unit == 'mi' %}\n {% set conversion_rate = 1 %}\n{% elif unit == 'km' %}\n {% set conversion_rate = 1.60934 %}\n{% else %}\n {{ exceptions.raise_compiler_error(\"unit input must be one of 'mi' or 'km'. Got \" ~ unit) }}\n{% endif %}\n\n 2 * 3961 * asin(sqrt(power((sin(radians(({{ lat2 }} - {{ lat1 }}) / 2))), 2) +\n cos(radians({{lat1}})) * cos(radians({{lat2}})) *\n power((sin(radians(({{ lon2 }} - {{ lon1 }}) / 2))), 2))) * {{ conversion_rate }}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "lat1", "type": null, "description": ""}, {"name": "lon1", "type": null, "description": ""}, {"name": "lat2", "type": null, "description": ""}, {"name": "lon2", "type": null, "description": ""}, {"name": "unit", "type": null, "description": ""}], "created_at": 1785250505.643294, "supported_languages": null}, "macro.dbt_utils.bigquery__haversine_distance": {"name": "bigquery__haversine_distance", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\haversine_distance.sql", "original_file_path": "macros\\sql\\haversine_distance.sql", "unique_id": "macro.dbt_utils.bigquery__haversine_distance", "macro_sql": "{% macro bigquery__haversine_distance(lat1, lon1, lat2, lon2, unit='mi') -%}\n{% set radians_lat1 = dbt_utils.degrees_to_radians(lat1) %}\n{% set radians_lat2 = dbt_utils.degrees_to_radians(lat2) %}\n{% set radians_lon1 = dbt_utils.degrees_to_radians(lon1) %}\n{% set radians_lon2 = dbt_utils.degrees_to_radians(lon2) %}\n{%- if unit == 'mi' %}\n {% set conversion_rate = 1 %}\n{% elif unit == 'km' %}\n {% set conversion_rate = 1.60934 %}\n{% else %}\n {{ exceptions.raise_compiler_error(\"unit input must be one of 'mi' or 'km'. Got \" ~ unit) }}\n{% endif %}\n 2 * 3961 * asin(sqrt(power(sin(({{ radians_lat2 }} - {{ radians_lat1 }}) / 2), 2) +\n cos({{ radians_lat1 }}) * cos({{ radians_lat2 }}) *\n power(sin(({{ radians_lon2 }} - {{ radians_lon1 }}) / 2), 2))) * {{ conversion_rate }}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.degrees_to_radians"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "lat1", "type": null, "description": ""}, {"name": "lon1", "type": null, "description": ""}, {"name": "lat2", "type": null, "description": ""}, {"name": "lon2", "type": null, "description": ""}, {"name": "unit", "type": null, "description": ""}], "created_at": 1785250505.6452968, "supported_languages": null}, "macro.dbt_utils.nullcheck": {"name": "nullcheck", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\nullcheck.sql", "original_file_path": "macros\\sql\\nullcheck.sql", "unique_id": "macro.dbt_utils.nullcheck", "macro_sql": "{% macro nullcheck(cols) %}\n {{ return(adapter.dispatch('nullcheck', 'dbt_utils')(cols)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__nullcheck"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "cols", "type": null, "description": ""}], "created_at": 1785250505.646306, "supported_languages": null}, "macro.dbt_utils.default__nullcheck": {"name": "default__nullcheck", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\nullcheck.sql", "original_file_path": "macros\\sql\\nullcheck.sql", "unique_id": "macro.dbt_utils.default__nullcheck", "macro_sql": "{% macro default__nullcheck(cols) %}\n{%- for col in cols %}\n\n {% if col.is_string() -%}\n\n nullif({{col.name}},'') as {{col.name}}\n\n {%- else -%}\n\n {{col.name}}\n\n {%- endif -%}\n\n{%- if not loop.last -%} , {%- endif -%}\n\n{%- endfor -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "cols", "type": null, "description": ""}], "created_at": 1785250505.6472957, "supported_languages": null}, "macro.dbt_utils.nullcheck_table": {"name": "nullcheck_table", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\nullcheck_table.sql", "original_file_path": "macros\\sql\\nullcheck_table.sql", "unique_id": "macro.dbt_utils.nullcheck_table", "macro_sql": "{% macro nullcheck_table(relation) %}\n {{ return(adapter.dispatch('nullcheck_table', 'dbt_utils')(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__nullcheck_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.6483078, "supported_languages": null}, "macro.dbt_utils.default__nullcheck_table": {"name": "default__nullcheck_table", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\nullcheck_table.sql", "original_file_path": "macros\\sql\\nullcheck_table.sql", "unique_id": "macro.dbt_utils.default__nullcheck_table", "macro_sql": "{% macro default__nullcheck_table(relation) %}\n\n {%- do dbt_utils._is_relation(relation, 'nullcheck_table') -%}\n {%- do dbt_utils._is_ephemeral(relation, 'nullcheck_table') -%}\n {% set cols = adapter.get_columns_in_relation(relation) %}\n\n select {{ dbt_utils.nullcheck(cols) }}\n from {{relation}}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils._is_relation", "macro.dbt_utils._is_ephemeral", "macro.dbt_utils.nullcheck"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}], "created_at": 1785250505.6483078, "supported_languages": null}, "macro.dbt_utils.pivot": {"name": "pivot", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\pivot.sql", "original_file_path": "macros\\sql\\pivot.sql", "unique_id": "macro.dbt_utils.pivot", "macro_sql": "{% macro pivot(column,\n values,\n alias=True,\n agg='sum',\n cmp='=',\n prefix='',\n suffix='',\n then_value=1,\n else_value=0,\n quote_identifiers=True,\n distinct=False) %}\n {{ return(adapter.dispatch('pivot', 'dbt_utils')(column, values, alias, agg, cmp, prefix, suffix, then_value, else_value, quote_identifiers, distinct)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__pivot"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "column", "type": null, "description": ""}, {"name": "values", "type": null, "description": ""}, {"name": "alias", "type": null, "description": ""}, {"name": "agg", "type": null, "description": ""}, {"name": "cmp", "type": null, "description": ""}, {"name": "prefix", "type": null, "description": ""}, {"name": "suffix", "type": null, "description": ""}, {"name": "then_value", "type": null, "description": ""}, {"name": "else_value", "type": null, "description": ""}, {"name": "quote_identifiers", "type": null, "description": ""}, {"name": "distinct", "type": null, "description": ""}], "created_at": 1785250505.6503038, "supported_languages": null}, "macro.dbt_utils.default__pivot": {"name": "default__pivot", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\pivot.sql", "original_file_path": "macros\\sql\\pivot.sql", "unique_id": "macro.dbt_utils.default__pivot", "macro_sql": "{% macro default__pivot(column,\n values,\n alias=True,\n agg='sum',\n cmp='=',\n prefix='',\n suffix='',\n then_value=1,\n else_value=0,\n quote_identifiers=True,\n distinct=False) %}\n {% for value in values %}\n {{ agg }}(\n {% if distinct %} distinct {% endif %}\n case\n when {{ column }} {{ cmp }} '{{ dbt.escape_single_quotes(value) }}'\n then {{ then_value }}\n else {{ else_value }}\n end\n )\n {% if alias %}\n {% if quote_identifiers %}\n as {{ adapter.quote(prefix ~ value ~ suffix) }}\n {% else %}\n as {{ dbt_utils.slugify(prefix ~ value ~ suffix) }}\n {% endif %}\n {% endif %}\n {% if not loop.last %},{% endif %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.escape_single_quotes", "macro.dbt_utils.slugify"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "column", "type": null, "description": ""}, {"name": "values", "type": null, "description": ""}, {"name": "alias", "type": null, "description": ""}, {"name": "agg", "type": null, "description": ""}, {"name": "cmp", "type": null, "description": ""}, {"name": "prefix", "type": null, "description": ""}, {"name": "suffix", "type": null, "description": ""}, {"name": "then_value", "type": null, "description": ""}, {"name": "else_value", "type": null, "description": ""}, {"name": "quote_identifiers", "type": null, "description": ""}, {"name": "distinct", "type": null, "description": ""}], "created_at": 1785250505.6523023, "supported_languages": null}, "macro.dbt_utils.safe_add": {"name": "safe_add", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\safe_add.sql", "original_file_path": "macros\\sql\\safe_add.sql", "unique_id": "macro.dbt_utils.safe_add", "macro_sql": "{%- macro safe_add(field_list) -%}\n {{ return(adapter.dispatch('safe_add', 'dbt_utils')(field_list)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__safe_add"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field_list", "type": null, "description": ""}], "created_at": 1785250505.6523023, "supported_languages": null}, "macro.dbt_utils.default__safe_add": {"name": "default__safe_add", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\safe_add.sql", "original_file_path": "macros\\sql\\safe_add.sql", "unique_id": "macro.dbt_utils.default__safe_add", "macro_sql": "\n\n{%- macro default__safe_add(field_list) -%}\n\n{%- if field_list is not iterable or field_list is string or field_list is mapping -%}\n\n{%- set error_message = '\nWarning: the `safe_add` macro now takes a single list argument instead of \\\nstring arguments. The {}.{} model triggered this warning. \\\n'.format(model.package_name, model.name) -%}\n\n{%- do exceptions.warn(error_message) -%}\n\n{%- endif -%}\n\n{% set fields = [] %}\n\n{%- for field in field_list -%}\n\n {% do fields.append(\"coalesce(\" ~ field ~ \", 0)\") %}\n\n{%- endfor -%}\n\n{{ fields|join(' +\\n ') }}\n\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field_list", "type": null, "description": ""}], "created_at": 1785250505.654299, "supported_languages": null}, "macro.dbt_utils.safe_divide": {"name": "safe_divide", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\safe_divide.sql", "original_file_path": "macros\\sql\\safe_divide.sql", "unique_id": "macro.dbt_utils.safe_divide", "macro_sql": "{% macro safe_divide(numerator, denominator) -%}\n {{ return(adapter.dispatch('safe_divide', 'dbt_utils')(numerator, denominator)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__safe_divide"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "numerator", "type": null, "description": ""}, {"name": "denominator", "type": null, "description": ""}], "created_at": 1785250505.654299, "supported_languages": null}, "macro.dbt_utils.default__safe_divide": {"name": "default__safe_divide", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\safe_divide.sql", "original_file_path": "macros\\sql\\safe_divide.sql", "unique_id": "macro.dbt_utils.default__safe_divide", "macro_sql": "{% macro default__safe_divide(numerator, denominator) %}\n ( {{ numerator }} ) / nullif( ( {{ denominator }} ), 0)\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "numerator", "type": null, "description": ""}, {"name": "denominator", "type": null, "description": ""}], "created_at": 1785250505.654299, "supported_languages": null}, "macro.dbt_utils.safe_subtract": {"name": "safe_subtract", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\safe_subtract.sql", "original_file_path": "macros\\sql\\safe_subtract.sql", "unique_id": "macro.dbt_utils.safe_subtract", "macro_sql": "{%- macro safe_subtract(field_list) -%}\n {{ return(adapter.dispatch('safe_subtract', 'dbt_utils')(field_list)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__safe_subtract"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field_list", "type": null, "description": ""}], "created_at": 1785250505.6552968, "supported_languages": null}, "macro.dbt_utils.default__safe_subtract": {"name": "default__safe_subtract", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\safe_subtract.sql", "original_file_path": "macros\\sql\\safe_subtract.sql", "unique_id": "macro.dbt_utils.default__safe_subtract", "macro_sql": "\n\n{%- macro default__safe_subtract(field_list) -%}\n\n{%- if field_list is not iterable or field_list is string or field_list is mapping -%}\n\n{%- set error_message = '\nWarning: the `safe_subtract` macro takes a single list argument instead of \\\nstring arguments. The {}.{} model triggered this warning. \\\n'.format(model.package_name, model.name) -%}\n\n{%- do exceptions.raise_compiler_error(error_message) -%}\n\n{%- endif -%}\n\n{% set fields = [] %}\n\n{%- for field in field_list -%}\n\n {% do fields.append(\"coalesce(\" ~ field ~ \", 0)\") %}\n\n{%- endfor -%}\n\n{{ fields|join(' -\\n ') }}\n\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field_list", "type": null, "description": ""}], "created_at": 1785250505.6563048, "supported_languages": null}, "macro.dbt_utils.star": {"name": "star", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\star.sql", "original_file_path": "macros\\sql\\star.sql", "unique_id": "macro.dbt_utils.star", "macro_sql": "{% macro star(from, relation_alias=False, except=[], prefix='', suffix='', quote_identifiers=True, unquote_aliases=False, rename={}) -%}\r\n {{ return(adapter.dispatch('star', 'dbt_utils')(from, relation_alias, except, prefix, suffix, quote_identifiers, unquote_aliases, rename)) }}\r\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__star"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "from", "type": null, "description": ""}, {"name": "relation_alias", "type": null, "description": ""}, {"name": "except", "type": null, "description": ""}, {"name": "prefix", "type": null, "description": ""}, {"name": "suffix", "type": null, "description": ""}, {"name": "quote_identifiers", "type": null, "description": ""}, {"name": "unquote_aliases", "type": null, "description": ""}, {"name": "rename", "type": null, "description": ""}], "created_at": 1785250505.658299, "supported_languages": null}, "macro.dbt_utils.default__star": {"name": "default__star", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\star.sql", "original_file_path": "macros\\sql\\star.sql", "unique_id": "macro.dbt_utils.default__star", "macro_sql": "{% macro default__star(from, relation_alias=False, except=[], prefix='', suffix='', quote_identifiers=True, unquote_aliases=False, rename={}) -%}\r\n {%- do dbt_utils._is_relation(from, 'star') -%}\r\n {%- do dbt_utils._is_ephemeral(from, 'star') -%}\r\n\r\n {#-- Prevent querying of db in parsing mode. This works because this macro does not create any new refs. #}\r\n {%- if not execute -%}\r\n {% do return('*') %}\r\n {%- endif -%}\r\n\r\n {% set cols = dbt_utils.get_filtered_columns_in_relation(from, except) %}\r\n\r\n {%- set rename_lower = {} -%}\r\n {%- for key, val in rename.items() -%}\r\n {%- do rename_lower.update({key.lower(): val}) -%}\r\n {%- endfor -%}\r\n\r\n {%- if cols|length <= 0 -%}\r\n {% if flags.WHICH == 'compile' %}\r\n {% set response %}\r\n*\r\n/* No columns were returned. Maybe the relation doesn't exist yet\r\nor all columns were excluded. This star is only output during\r\ndbt compile, and exists to keep SQLFluff happy. */\r\n {% endset %}\r\n {% do return(response) %}\r\n {% else %}\r\n {% do return(\"/* no columns returned from star() macro */\") %}\r\n {% endif %}\r\n {%- else -%}\r\n {%- for col in cols %}\r\n {%- if relation_alias %}{{ relation_alias }}.{% else %}{%- endif -%}\r\n {%- if quote_identifiers -%}\r\n {{ adapter.quote(col)|trim }}\r\n {%- if col.lower() in rename_lower %} as {{ rename_lower[col.lower()] }}\r\n {%- elif unquote_aliases %} as {{ (prefix ~ col ~ suffix)|trim }}\r\n {%- elif prefix!='' or suffix!='' %} as {{ adapter.quote(prefix ~ col ~ suffix)|trim }}\r\n {%- endif -%}\r\n {%- else -%}\r\n {{ col|trim }}\r\n {%- if col.lower() in rename_lower %} as {{ rename_lower[col.lower()] }}\r\n {%- elif prefix!='' or suffix!='' %} as {{ (prefix ~ col ~ suffix)|trim }}\r\n {%- endif -%}\r\n {%- endif -%}\r\n {%- if not loop.last %},{{ '\\n ' }}{%- endif -%}\r\n {%- endfor -%}\r\n {% endif %}\r\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_utils._is_relation", "macro.dbt_utils._is_ephemeral", "macro.dbt_utils.get_filtered_columns_in_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "from", "type": null, "description": ""}, {"name": "relation_alias", "type": null, "description": ""}, {"name": "except", "type": null, "description": ""}, {"name": "prefix", "type": null, "description": ""}, {"name": "suffix", "type": null, "description": ""}, {"name": "quote_identifiers", "type": null, "description": ""}, {"name": "unquote_aliases", "type": null, "description": ""}, {"name": "rename", "type": null, "description": ""}], "created_at": 1785250505.663297, "supported_languages": null}, "macro.dbt_utils.surrogate_key": {"name": "surrogate_key", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\surrogate_key.sql", "original_file_path": "macros\\sql\\surrogate_key.sql", "unique_id": "macro.dbt_utils.surrogate_key", "macro_sql": "{%- macro surrogate_key(field_list) -%}\n {% set frustrating_jinja_feature = varargs %}\n {{ return(adapter.dispatch('surrogate_key', 'dbt_utils')(field_list, *varargs)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__surrogate_key"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field_list", "type": null, "description": ""}], "created_at": 1785250505.6643052, "supported_languages": null}, "macro.dbt_utils.default__surrogate_key": {"name": "default__surrogate_key", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\surrogate_key.sql", "original_file_path": "macros\\sql\\surrogate_key.sql", "unique_id": "macro.dbt_utils.default__surrogate_key", "macro_sql": "\n\n{%- macro default__surrogate_key(field_list) -%}\n\n{%- set error_message = '\nWarning: `dbt_utils.surrogate_key` has been replaced by \\\n`dbt_utils.generate_surrogate_key`. The new macro treats null values \\\ndifferently to empty strings. To restore the behaviour of the original \\\nmacro, add a global variable in dbt_project.yml called \\\n`surrogate_key_treat_nulls_as_empty_strings` to your \\\ndbt_project.yml file with a value of True. \\\nThe {}.{} model triggered this warning. \\\n'.format(model.package_name, model.name) -%}\n\n{%- do exceptions.raise_compiler_error(error_message) -%}\n\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field_list", "type": null, "description": ""}], "created_at": 1785250505.6643052, "supported_languages": null}, "macro.dbt_utils.union_relations": {"name": "union_relations", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\union.sql", "original_file_path": "macros\\sql\\union.sql", "unique_id": "macro.dbt_utils.union_relations", "macro_sql": "{%- macro union_relations(relations, column_override=none, include=[], exclude=[], source_column_name='_dbt_source_relation', where=none) -%}\n {{ return(adapter.dispatch('union_relations', 'dbt_utils')(relations, column_override, include, exclude, source_column_name, where)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__union_relations"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relations", "type": null, "description": ""}, {"name": "column_override", "type": null, "description": ""}, {"name": "include", "type": null, "description": ""}, {"name": "exclude", "type": null, "description": ""}, {"name": "source_column_name", "type": null, "description": ""}, {"name": "where", "type": null, "description": ""}], "created_at": 1785250505.6672957, "supported_languages": null}, "macro.dbt_utils.default__union_relations": {"name": "default__union_relations", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\union.sql", "original_file_path": "macros\\sql\\union.sql", "unique_id": "macro.dbt_utils.default__union_relations", "macro_sql": "\n\n{%- macro default__union_relations(relations, column_override=none, include=[], exclude=[], source_column_name='_dbt_source_relation', where=none) -%}\n\n {%- if exclude and include -%}\n {{ exceptions.raise_compiler_error(\"Both an exclude and include list were provided to the `union` macro. Only one is allowed\") }}\n {%- endif -%}\n\n {#-- Prevent querying of db in parsing mode. This works because this macro does not create any new refs. -#}\n {%- if not execute %}\n {{ return('') }}\n {% endif -%}\n\n {%- set column_override = column_override if column_override is not none else {} -%}\n\n {%- set relation_columns = {} -%}\n {%- set column_superset = {} -%}\n {%- set all_excludes = [] -%}\n {%- set all_includes = [] -%}\n\n {%- if exclude -%}\n {%- for exc in exclude -%}\n {%- do all_excludes.append(exc | lower) -%}\n {%- endfor -%}\n {%- endif -%}\n\n {%- if include -%}\n {%- for inc in include -%}\n {%- do all_includes.append(inc | lower) -%}\n {%- endfor -%}\n {%- endif -%}\n\n {%- for relation in relations -%}\n\n {%- do relation_columns.update({relation: []}) -%}\n\n {%- do dbt_utils._is_relation(relation, 'union_relations') -%}\n {%- do dbt_utils._is_ephemeral(relation, 'union_relations') -%}\n {%- set cols = adapter.get_columns_in_relation(relation) -%}\n {%- for col in cols -%}\n\n {#- If an exclude list was provided and the column is in the list, do nothing -#}\n {%- if exclude and col.column | lower in all_excludes -%}\n\n {#- If an include list was provided and the column is not in the list, do nothing -#}\n {%- elif include and col.column | lower not in all_includes -%}\n\n {#- Otherwise add the column to the column superset -#}\n {%- else -%}\n\n {#- update the list of columns in this relation -#}\n {%- do relation_columns[relation].append(col.column) -%}\n\n {%- if col.column in column_superset -%}\n\n {%- set stored = column_superset[col.column] -%}\n {%- if col.is_string() and stored.is_string() and col.string_size() > stored.string_size() -%}\n\n {%- do column_superset.update({col.column: col}) -%}\n\n {%- endif %}\n\n {%- else -%}\n\n {%- do column_superset.update({col.column: col}) -%}\n\n {%- endif -%}\n\n {%- endif -%}\n\n {%- endfor -%}\n {%- endfor -%}\n\n {%- set ordered_column_names = column_superset.keys() -%}\n {%- set dbt_command = flags.WHICH -%}\n\n\n {% if dbt_command in ['run', 'build'] %}\n {% if (include | length > 0 or exclude | length > 0) and not column_superset.keys() %}\n {%- set relations_string -%}\n {%- for relation in relations -%}\n {{ relation.name }}\n {%- if not loop.last %}, {% endif -%}\n {%- endfor -%}\n {%- endset -%}\n\n {%- set error_message -%}\n There were no columns found to union for relations {{ relations_string }}\n {%- endset -%}\n\n {{ exceptions.raise_compiler_error(error_message) }}\n {%- endif -%}\n {%- endif -%}\n\n {%- for relation in relations %}\n\n (\n select\n\n {%- if source_column_name is not none %}\n cast({{ dbt.string_literal(relation.render()) }} as {{ dbt.type_string() }}) as {{ source_column_name }},\n {%- endif %}\n\n /* No columns from any of the relations.\n This star is only output during dbt compile, and exists to keep SQLFluff happy. */\n {% if dbt_command == 'compile' and ordered_column_names|length == 0 %}\n *\n {% endif %}\n\n {% for col_name in ordered_column_names -%}\n\n {%- set col = column_superset[col_name] %}\n {%- set col_type = column_override.get(col.column, col.data_type) %}\n {%- set col_name = adapter.quote(col_name) if col_name in relation_columns[relation] else 'null' %}\n cast({{ col_name }} as {{ col_type }}) as {{ col.quoted }} {% if not loop.last %},{% endif -%}\n\n {%- endfor %}\n\n from {{ relation }}\n\n {% if where -%}\n where {{ where }}\n {%- endif %}\n )\n\n {% if not loop.last -%}\n union all\n {% endif -%}\n\n {%- endfor -%}\n\n{%- endmacro -%}", "depends_on": {"macros": ["macro.dbt_utils._is_relation", "macro.dbt_utils._is_ephemeral", "macro.dbt.string_literal", "macro.dbt.type_string"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relations", "type": null, "description": ""}, {"name": "column_override", "type": null, "description": ""}, {"name": "include", "type": null, "description": ""}, {"name": "exclude", "type": null, "description": ""}, {"name": "source_column_name", "type": null, "description": ""}, {"name": "where", "type": null, "description": ""}], "created_at": 1785250505.6743014, "supported_languages": null}, "macro.dbt_utils.unpivot": {"name": "unpivot", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\unpivot.sql", "original_file_path": "macros\\sql\\unpivot.sql", "unique_id": "macro.dbt_utils.unpivot", "macro_sql": "{% macro unpivot(relation=none, cast_to='varchar', exclude=none, remove=none, field_name='field_name', value_name='value', quote_identifiers=False) -%}\n {{ return(adapter.dispatch('unpivot', 'dbt_utils')(relation, cast_to, exclude, remove, field_name, value_name, quote_identifiers)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__unpivot"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "cast_to", "type": null, "description": ""}, {"name": "exclude", "type": null, "description": ""}, {"name": "remove", "type": null, "description": ""}, {"name": "field_name", "type": null, "description": ""}, {"name": "value_name", "type": null, "description": ""}, {"name": "quote_identifiers", "type": null, "description": ""}], "created_at": 1785250505.6763027, "supported_languages": null}, "macro.dbt_utils.default__unpivot": {"name": "default__unpivot", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\unpivot.sql", "original_file_path": "macros\\sql\\unpivot.sql", "unique_id": "macro.dbt_utils.default__unpivot", "macro_sql": "{% macro default__unpivot(relation=none, cast_to='varchar', exclude=none, remove=none, field_name='field_name', value_name='value', quote_identifiers=False) -%}\n\n {% if not relation %}\n {{ exceptions.raise_compiler_error(\"Error: argument `relation` is required for `unpivot` macro.\") }}\n {% endif %}\n\n {%- set exclude = exclude if exclude is not none else [] %}\n {%- set remove = remove if remove is not none else [] %}\n\n {%- set include_cols = [] %}\n\n {%- set table_columns = {} %}\n\n {%- do table_columns.update({relation: []}) %}\n\n {%- do dbt_utils._is_relation(relation, 'unpivot') -%}\n {%- do dbt_utils._is_ephemeral(relation, 'unpivot') -%}\n {%- set cols = adapter.get_columns_in_relation(relation) %}\n\n {%- for col in cols -%}\n {%- if col.column.lower() not in remove|map('lower') and col.column.lower() not in exclude|map('lower') -%}\n {% do include_cols.append(col) %}\n {%- endif %}\n {%- endfor %}\n\n\n {%- for col in include_cols -%}\n {%- set current_col_name = adapter.quote(col.column) if quote_identifiers else col.column -%}\n select\n {%- for exclude_col in exclude %}\n {{ adapter.quote(exclude_col) if quote_identifiers else exclude_col }},\n {%- endfor %}\n\n cast('{{ col.column }}' as {{ dbt.type_string() }}) as {{ adapter.quote(field_name) if quote_identifiers else field_name }},\n cast( {% if col.data_type == 'boolean' %}\n {{ dbt.cast_bool_to_text(current_col_name) }}\n {% else %}\n {{ current_col_name }}\n {% endif %}\n as {{ cast_to }}) as {{ adapter.quote(value_name) if quote_identifiers else value_name }}\n\n from {{ relation }}\n\n {% if not loop.last -%}\n union all\n {% endif -%}\n {%- endfor -%}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_utils._is_relation", "macro.dbt_utils._is_ephemeral", "macro.dbt.type_string", "macro.dbt.cast_bool_to_text"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "relation", "type": null, "description": ""}, {"name": "cast_to", "type": null, "description": ""}, {"name": "exclude", "type": null, "description": ""}, {"name": "remove", "type": null, "description": ""}, {"name": "field_name", "type": null, "description": ""}, {"name": "value_name", "type": null, "description": ""}, {"name": "quote_identifiers", "type": null, "description": ""}], "created_at": 1785250505.679295, "supported_languages": null}, "macro.dbt_utils.width_bucket": {"name": "width_bucket", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\width_bucket.sql", "original_file_path": "macros\\sql\\width_bucket.sql", "unique_id": "macro.dbt_utils.width_bucket", "macro_sql": "{% macro width_bucket(expr, min_value, max_value, num_buckets) %}\n {{ return(adapter.dispatch('width_bucket', 'dbt_utils') (expr, min_value, max_value, num_buckets)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__width_bucket"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expr", "type": null, "description": ""}, {"name": "min_value", "type": null, "description": ""}, {"name": "max_value", "type": null, "description": ""}, {"name": "num_buckets", "type": null, "description": ""}], "created_at": 1785250505.6803024, "supported_languages": null}, "macro.dbt_utils.default__width_bucket": {"name": "default__width_bucket", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\width_bucket.sql", "original_file_path": "macros\\sql\\width_bucket.sql", "unique_id": "macro.dbt_utils.default__width_bucket", "macro_sql": "{% macro default__width_bucket(expr, min_value, max_value, num_buckets) -%}\n\n {% set bin_size -%}\n (( {{ max_value }} - {{ min_value }} ) / {{ num_buckets }} )\n {%- endset %}\n (\n -- to break ties when the amount is eaxtly at the bucket egde\n case\n when\n mod(\n {{ dbt.safe_cast(expr, dbt.type_numeric() ) }},\n {{ dbt.safe_cast(bin_size, dbt.type_numeric() ) }}\n ) = 0\n then 1\n else 0\n end\n ) +\n -- Anything over max_value goes the N+1 bucket\n least(\n ceil(\n ({{ expr }} - {{ min_value }})/{{ bin_size }}\n ),\n {{ num_buckets }} + 1\n )\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.safe_cast", "macro.dbt.type_numeric"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expr", "type": null, "description": ""}, {"name": "min_value", "type": null, "description": ""}, {"name": "max_value", "type": null, "description": ""}, {"name": "num_buckets", "type": null, "description": ""}], "created_at": 1785250505.681318, "supported_languages": null}, "macro.dbt_utils.snowflake__width_bucket": {"name": "snowflake__width_bucket", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\sql\\width_bucket.sql", "original_file_path": "macros\\sql\\width_bucket.sql", "unique_id": "macro.dbt_utils.snowflake__width_bucket", "macro_sql": "{% macro snowflake__width_bucket(expr, min_value, max_value, num_buckets) %}\n width_bucket({{ expr }}, {{ min_value }}, {{ max_value }}, {{ num_buckets }} )\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "expr", "type": null, "description": ""}, {"name": "min_value", "type": null, "description": ""}, {"name": "max_value", "type": null, "description": ""}, {"name": "num_buckets", "type": null, "description": ""}], "created_at": 1785250505.6823256, "supported_languages": null}, "macro.dbt_utils.get_url_host": {"name": "get_url_host", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\web\\get_url_host.sql", "original_file_path": "macros\\web\\get_url_host.sql", "unique_id": "macro.dbt_utils.get_url_host", "macro_sql": "{% macro get_url_host(field) -%}\n {{ return(adapter.dispatch('get_url_host', 'dbt_utils')(field)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__get_url_host"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}], "created_at": 1785250505.6823256, "supported_languages": null}, "macro.dbt_utils.default__get_url_host": {"name": "default__get_url_host", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\web\\get_url_host.sql", "original_file_path": "macros\\web\\get_url_host.sql", "unique_id": "macro.dbt_utils.default__get_url_host", "macro_sql": "{% macro default__get_url_host(field) -%}\n\n{%- set parsed =\n dbt.split_part(\n dbt.split_part(\n dbt.replace(\n dbt.replace(\n dbt.replace(field, \"'android-app://'\", \"''\"\n ), \"'http://'\", \"''\"\n ), \"'https://'\", \"''\"\n ), \"'/'\", 1\n ), \"'?'\", 1\n )\n\n-%}\n\n\n {{ dbt.safe_cast(\n parsed,\n dbt.type_string()\n )}}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.split_part", "macro.dbt.replace", "macro.dbt.safe_cast", "macro.dbt.type_string"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}], "created_at": 1785250505.6843266, "supported_languages": null}, "macro.dbt_utils.get_url_parameter": {"name": "get_url_parameter", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\web\\get_url_parameter.sql", "original_file_path": "macros\\web\\get_url_parameter.sql", "unique_id": "macro.dbt_utils.get_url_parameter", "macro_sql": "{% macro get_url_parameter(field, url_parameter) -%}\n {{ return(adapter.dispatch('get_url_parameter', 'dbt_utils')(field, url_parameter)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__get_url_parameter"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}, {"name": "url_parameter", "type": null, "description": ""}], "created_at": 1785250505.6843266, "supported_languages": null}, "macro.dbt_utils.default__get_url_parameter": {"name": "default__get_url_parameter", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\web\\get_url_parameter.sql", "original_file_path": "macros\\web\\get_url_parameter.sql", "unique_id": "macro.dbt_utils.default__get_url_parameter", "macro_sql": "{% macro default__get_url_parameter(field, url_parameter) -%}\n\n{%- set formatted_url_parameter = \"'\" + url_parameter + \"='\" -%}\n\n{%- set split = dbt.split_part(dbt.split_part(field, formatted_url_parameter, 2), \"'&'\", 1) -%}\n\nnullif({{ split }},'')\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.split_part"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}, {"name": "url_parameter", "type": null, "description": ""}], "created_at": 1785250505.6853182, "supported_languages": null}, "macro.dbt_utils.get_url_path": {"name": "get_url_path", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\web\\get_url_path.sql", "original_file_path": "macros\\web\\get_url_path.sql", "unique_id": "macro.dbt_utils.get_url_path", "macro_sql": "{% macro get_url_path(field) -%}\n {{ return(adapter.dispatch('get_url_path', 'dbt_utils')(field)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__get_url_path"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}], "created_at": 1785250505.6863258, "supported_languages": null}, "macro.dbt_utils.default__get_url_path": {"name": "default__get_url_path", "resource_type": "macro", "package_name": "dbt_utils", "path": "macros\\web\\get_url_path.sql", "original_file_path": "macros\\web\\get_url_path.sql", "unique_id": "macro.dbt_utils.default__get_url_path", "macro_sql": "{% macro default__get_url_path(field) -%}\n\n {%- set stripped_url =\n dbt.replace(\n dbt.replace(field, \"'http://'\", \"''\"), \"'https://'\", \"''\")\n -%}\n\n {%- set first_slash_pos -%}\n coalesce(\n nullif({{ dbt.position(\"'/'\", stripped_url) }}, 0),\n {{ dbt.position(\"'?'\", stripped_url) }} - 1\n )\n {%- endset -%}\n\n {%- set parsed_path =\n dbt.split_part(\n dbt.right(\n stripped_url,\n dbt.length(stripped_url) ~ \"-\" ~ first_slash_pos\n ),\n \"'?'\", 1\n )\n -%}\n\n {{ dbt.safe_cast(\n parsed_path,\n dbt.type_string()\n )}}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.replace", "macro.dbt.position", "macro.dbt.split_part", "macro.dbt.right", "macro.dbt.length", "macro.dbt.safe_cast", "macro.dbt.type_string"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "config": {"meta": {}, "docs": {"show": true, "node_color": null}}, "patch_path": null, "arguments": [{"name": "field", "type": null, "description": ""}], "created_at": 1785250505.6873176, "supported_languages": null}}, "docs": {"doc.dbt.__overview__": {"name": "__overview__", "resource_type": "doc", "package_name": "dbt", "path": "overview.md", "original_file_path": "docs\\overview.md", "unique_id": "doc.dbt.__overview__", "block_contents": "### Welcome!\n\nWelcome to the auto-generated documentation for your dbt project!\n\n### Navigation\n\nYou can use the `Project` and `Database` navigation tabs on the left side of the window to explore the models\nin your project.\n\n#### Project Tab\nThe `Project` tab mirrors the directory structure of your dbt project. In this tab, you can see all of the\nmodels defined in your dbt project, as well as models imported from dbt packages.\n\n#### Database Tab\nThe `Database` tab also exposes your models, but in a format that looks more like a database explorer. This view\nshows relations (tables and views) grouped into database schemas. Note that ephemeral models are _not_ shown\nin this interface, as they do not exist in the database.\n\n### Graph Exploration\nYou can click the blue icon on the bottom-right corner of the page to view the lineage graph of your models.\n\nOn model pages, you'll see the immediate parents and children of the model you're exploring. By clicking the `Expand`\nbutton at the top-right of this lineage pane, you'll be able to see all of the models that are used to build,\nor are built from, the model you're exploring.\n\nOnce expanded, you'll be able to use the `--select` and `--exclude` model selection syntax to filter the\nmodels in the graph. For more information on model selection, check out the [dbt docs](https://docs.getdbt.com/docs/model-selection-syntax).\n\nNote that you can also right-click on models to interactively filter and explore the graph.\n\n---\n\n### More information\n\n- [What is dbt](https://docs.getdbt.com/docs/introduction)?\n- Read the [dbt viewpoint](https://docs.getdbt.com/docs/viewpoint)\n- [Installation](https://docs.getdbt.com/docs/installation)\n- Join the [dbt Community](https://www.getdbt.com/community/) for questions and discussion"}}, "exposures": {}, "metrics": {}, "groups": {}, "selectors": {}, "disabled": {}, "parent_map": {"model.nyc_taxi.fct_trips": ["model.nyc_taxi.stg_trips", "model.nyc_taxi.stg_zones"], "model.nyc_taxi.stg_trips": ["source.nyc_taxi.nyc_taxi.raw_trips"], "model.nyc_taxi.stg_zones": ["source.nyc_taxi.nyc_taxi.raw_zones"], "test.nyc_taxi.assert_fare_amount_non_negative": ["model.nyc_taxi.stg_trips"], "test.nyc_taxi.assert_pickup_before_dropoff": ["model.nyc_taxi.stg_trips"], "test.nyc_taxi.not_null_fct_trips_trip_id.df65bf8c1d": ["model.nyc_taxi.fct_trips"], "test.nyc_taxi.unique_fct_trips_trip_id.9b74cb6aab": ["model.nyc_taxi.fct_trips"], "test.nyc_taxi.not_null_fct_trips_pickup_datetime.3c78164d83": ["model.nyc_taxi.fct_trips"], "test.nyc_taxi.not_null_stg_trips_trip_id.159f524fc2": ["model.nyc_taxi.stg_trips"], "test.nyc_taxi.unique_stg_trips_trip_id.748f5076fb": ["model.nyc_taxi.stg_trips"], "test.nyc_taxi.not_null_stg_trips_pickup_datetime.4df9e7a15c": ["model.nyc_taxi.stg_trips"], "test.nyc_taxi.not_null_stg_trips_pickup_location_id.a4d16d4471": ["model.nyc_taxi.stg_trips"], "test.nyc_taxi.relationships_stg_trips_pickup_location_id__location_id__ref_stg_zones_.5eead0f98c": ["model.nyc_taxi.stg_trips", "model.nyc_taxi.stg_zones"], "test.nyc_taxi.not_null_stg_trips_payment_type.e14494b406": ["model.nyc_taxi.stg_trips"], "test.nyc_taxi.accepted_values_stg_trips_payment_type__0__1__2__3__4__5__6.0972e03b73": ["model.nyc_taxi.stg_trips"], "test.nyc_taxi.dbt_utils_unique_combination_of_columns_stg_trips_pickup_datetime__dropoff_datetime__pickup_location_id__fare_amount.72a6d320a5": ["model.nyc_taxi.stg_trips"], "test.nyc_taxi.unique_stg_zones_location_id.3578c2f409": ["model.nyc_taxi.stg_zones"], "test.nyc_taxi.not_null_stg_zones_location_id.244b100d38": ["model.nyc_taxi.stg_zones"], "source.nyc_taxi.nyc_taxi.raw_trips": [], "source.nyc_taxi.nyc_taxi.raw_zones": []}, "child_map": {"model.nyc_taxi.fct_trips": ["test.nyc_taxi.not_null_fct_trips_pickup_datetime.3c78164d83", "test.nyc_taxi.not_null_fct_trips_trip_id.df65bf8c1d", "test.nyc_taxi.unique_fct_trips_trip_id.9b74cb6aab"], "model.nyc_taxi.stg_trips": ["model.nyc_taxi.fct_trips", "test.nyc_taxi.accepted_values_stg_trips_payment_type__0__1__2__3__4__5__6.0972e03b73", "test.nyc_taxi.assert_fare_amount_non_negative", "test.nyc_taxi.assert_pickup_before_dropoff", "test.nyc_taxi.dbt_utils_unique_combination_of_columns_stg_trips_pickup_datetime__dropoff_datetime__pickup_location_id__fare_amount.72a6d320a5", "test.nyc_taxi.not_null_stg_trips_payment_type.e14494b406", "test.nyc_taxi.not_null_stg_trips_pickup_datetime.4df9e7a15c", "test.nyc_taxi.not_null_stg_trips_pickup_location_id.a4d16d4471", "test.nyc_taxi.not_null_stg_trips_trip_id.159f524fc2", "test.nyc_taxi.relationships_stg_trips_pickup_location_id__location_id__ref_stg_zones_.5eead0f98c", "test.nyc_taxi.unique_stg_trips_trip_id.748f5076fb"], "model.nyc_taxi.stg_zones": ["model.nyc_taxi.fct_trips", "test.nyc_taxi.not_null_stg_zones_location_id.244b100d38", "test.nyc_taxi.relationships_stg_trips_pickup_location_id__location_id__ref_stg_zones_.5eead0f98c", "test.nyc_taxi.unique_stg_zones_location_id.3578c2f409"], "test.nyc_taxi.assert_fare_amount_non_negative": [], "test.nyc_taxi.assert_pickup_before_dropoff": [], "test.nyc_taxi.not_null_fct_trips_trip_id.df65bf8c1d": [], "test.nyc_taxi.unique_fct_trips_trip_id.9b74cb6aab": [], "test.nyc_taxi.not_null_fct_trips_pickup_datetime.3c78164d83": [], "test.nyc_taxi.not_null_stg_trips_trip_id.159f524fc2": [], "test.nyc_taxi.unique_stg_trips_trip_id.748f5076fb": [], "test.nyc_taxi.not_null_stg_trips_pickup_datetime.4df9e7a15c": [], "test.nyc_taxi.not_null_stg_trips_pickup_location_id.a4d16d4471": [], "test.nyc_taxi.relationships_stg_trips_pickup_location_id__location_id__ref_stg_zones_.5eead0f98c": [], "test.nyc_taxi.not_null_stg_trips_payment_type.e14494b406": [], "test.nyc_taxi.accepted_values_stg_trips_payment_type__0__1__2__3__4__5__6.0972e03b73": [], "test.nyc_taxi.dbt_utils_unique_combination_of_columns_stg_trips_pickup_datetime__dropoff_datetime__pickup_location_id__fare_amount.72a6d320a5": [], "test.nyc_taxi.unique_stg_zones_location_id.3578c2f409": [], "test.nyc_taxi.not_null_stg_zones_location_id.244b100d38": [], "source.nyc_taxi.nyc_taxi.raw_trips": ["model.nyc_taxi.stg_trips"], "source.nyc_taxi.nyc_taxi.raw_zones": ["model.nyc_taxi.stg_zones"]}, "group_map": {}, "saved_queries": {}, "semantic_models": {}, "unit_tests": {}, "functions": {}} \ No newline at end of file diff --git a/task-2/target/osi_document.json b/task-2/target/osi_document.json new file mode 100644 index 0000000..e54060f --- /dev/null +++ b/task-2/target/osi_document.json @@ -0,0 +1 @@ +{"version": "0.1.1", "dialects": ["ANSI_SQL"], "semantic_model": [{"name": "semantic_model", "datasets": []}]} \ No newline at end of file diff --git a/task-2/target/partial_parse.msgpack b/task-2/target/partial_parse.msgpack new file mode 100644 index 0000000000000000000000000000000000000000..7cee267cc18ac31d617e894d2385e9e717fca51f GIT binary patch literal 1063841 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 F{{abREGGZ} literal 0 HcmV?d00001 diff --git a/task-2/target/run/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_pickup_datetime.sql b/task-2/target/run/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_pickup_datetime.sql new file mode 100644 index 0000000..6304d84 --- /dev/null +++ b/task-2/target/run/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_pickup_datetime.sql @@ -0,0 +1,25 @@ + + + select + count(*) as failures, + count(*) != 0 as should_warn, + count(*) != 0 as should_error + from ( + + + + + + + + +select pickup_datetime +from `hyf`.`dev_halyna`.`fct_trips` +where pickup_datetime is null + + + + + + + ) dbt_internal_test \ No newline at end of file diff --git a/task-2/target/run/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_trip_id.sql b/task-2/target/run/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_trip_id.sql new file mode 100644 index 0000000..8e90549 --- /dev/null +++ b/task-2/target/run/nyc_taxi/models/marts/_fct_trips.yml/not_null_fct_trips_trip_id.sql @@ -0,0 +1,25 @@ + + + select + count(*) as failures, + count(*) != 0 as should_warn, + count(*) != 0 as should_error + from ( + + + + + + + + +select trip_id +from `hyf`.`dev_halyna`.`fct_trips` +where trip_id is null + + + + + + + ) dbt_internal_test \ No newline at end of file diff --git a/task-2/target/run/nyc_taxi/models/marts/_fct_trips.yml/unique_fct_trips_trip_id.sql b/task-2/target/run/nyc_taxi/models/marts/_fct_trips.yml/unique_fct_trips_trip_id.sql new file mode 100644 index 0000000..508a97d --- /dev/null +++ b/task-2/target/run/nyc_taxi/models/marts/_fct_trips.yml/unique_fct_trips_trip_id.sql @@ -0,0 +1,28 @@ + + + select + count(*) as failures, + count(*) != 0 as should_warn, + count(*) != 0 as should_error + from ( + + + + + + +select + trip_id as unique_field, + count(*) as n_records + +from `hyf`.`dev_halyna`.`fct_trips` +where trip_id is not null +group by trip_id +having count(*) > 1 + + + + + + + ) dbt_internal_test \ No newline at end of file diff --git a/task-2/target/run/nyc_taxi/models/marts/fct_trips.sql b/task-2/target/run/nyc_taxi/models/marts/fct_trips.sql new file mode 100644 index 0000000..383b9a0 --- /dev/null +++ b/task-2/target/run/nyc_taxi/models/marts/fct_trips.sql @@ -0,0 +1,28 @@ +-- back compat for old kwarg name + + + + + + + + + + + + + merge + into + `hyf`.`dev_halyna`.`fct_trips` as DBT_INTERNAL_DEST + using + `fct_trips__dbt_tmp` as DBT_INTERNAL_SOURCE + on + + DBT_INTERNAL_SOURCE.trip_id <=> DBT_INTERNAL_DEST.trip_id + + when matched + then update set + * + when not matched + then insert + * diff --git a/task-2/target/run/nyc_taxi/models/staging/stg_trips.sql b/task-2/target/run/nyc_taxi/models/staging/stg_trips.sql new file mode 100644 index 0000000..35bcfcc --- /dev/null +++ b/task-2/target/run/nyc_taxi/models/staging/stg_trips.sql @@ -0,0 +1,60 @@ + + + + create or replace view `hyf`.`dev_halyna`.`stg_trips` + + as ( + with base as ( + select + md5(cast(concat(coalesce(cast(vendor_id as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(pickup_datetime as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(dropoff_datetime as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(pickup_location_id as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(dropoff_location_id as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(fare_amount as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(trip_distance as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(total_amount as string), '_dbt_utils_surrogate_key_null_'), '-', coalesce(cast(passenger_count as string), '_dbt_utils_surrogate_key_null_')) as string)) as trip_id, + pickup_datetime, + dropoff_datetime, + pickup_location_id, + dropoff_location_id, + fare_amount, + tip_amount, + trip_distance, + total_amount, + payment_type, + case + when fare_amount > 0 then round(tip_amount / fare_amount, 4) + else null + end as tip_pct, + case + when trip_distance > 0 then round(fare_amount / trip_distance, 4) + else null + end as fare_per_mile, + case payment_type + + when 0 then 'Flex Fare / unknown' + + when 1 then 'Credit card' + + when 2 then 'Cash' + + when 3 then 'No charge' + + when 4 then 'Dispute' + + when 5 then 'Unknown' + + when 6 then 'Voided trip' + + else 'Other' + end as payment_type_label, + round( + (unix_timestamp(dropoff_datetime) - unix_timestamp(pickup_datetime)) / 60.0, + 2 + ) as trip_duration_minutes + from `hyf`.`nyc_yellow`.`raw_trips` + where pickup_location_id is not null + and fare_amount >= 0 +) + +select * +from base +qualify row_number() over ( + partition by trip_id + order by pickup_datetime +) = 1 + ) diff --git a/task-2/target/run/nyc_taxi/models/staging/stg_zones.sql b/task-2/target/run/nyc_taxi/models/staging/stg_zones.sql new file mode 100644 index 0000000..521e0e3 --- /dev/null +++ b/task-2/target/run/nyc_taxi/models/staging/stg_zones.sql @@ -0,0 +1,13 @@ + + + + create or replace view `hyf`.`dev_halyna`.`stg_zones` + + as ( + select + location_id, + borough, + zone, + service_zone +from `hyf`.`nyc_yellow`.`raw_zones` + ) diff --git a/task-2/target/run_results.json b/task-2/target/run_results.json new file mode 100644 index 0000000..ce75140 --- /dev/null +++ b/task-2/target/run_results.json @@ -0,0 +1 @@ +{"metadata": {"dbt_schema_version": "https://schemas.getdbt.com/dbt/run-results/v6.json", "dbt_version": "1.12.0", "generated_at": "2026-07-28T15:44:57.495536Z", "invocation_id": "fa05f49b-4995-4d36-8502-c3a094c8bbdb", "invocation_started_at": "2026-07-28T15:43:08.888306Z", "env": {}}, "results": [{"status": "success", "timing": [{"name": "compile", "started_at": "2026-07-28T15:43:16.225422Z", "completed_at": "2026-07-28T15:43:16.243442Z"}, {"name": "execute", "started_at": "2026-07-28T15:43:16.244425Z", "completed_at": "2026-07-28T15:44:46.917637Z"}], "thread_id": "Thread-3 (worker)", "execution_time": 90.84377241134644, "adapter_response": {"_message": "OK", "query_id": "01f18a9b-1131-19dc-8cae-0ea943b39a92"}, "message": "OK", "failures": null, "unique_id": "model.nyc_taxi.fct_trips", "compiled": true, "compiled_code": "\n\nselect\n t.trip_id,\n t.pickup_datetime,\n t.dropoff_datetime,\n t.fare_amount,\n t.tip_amount,\n t.trip_distance,\n t.total_amount,\n t.trip_duration_minutes,\n t.tip_pct,\n t.fare_per_mile,\n t.payment_type_label,\n pz.borough as pickup_borough,\n pz.zone as pickup_zone,\n dz.borough as dropoff_borough,\n dz.zone as dropoff_zone\nfrom `hyf`.`dev_halyna`.`stg_trips` t\nleft join `hyf`.`dev_halyna`.`stg_zones` pz\n on t.pickup_location_id = pz.location_id\nleft join `hyf`.`dev_halyna`.`stg_zones` dz\n on t.dropoff_location_id = dz.location_id\n\n\n where t.pickup_datetime > (\n select max(pickup_datetime)\n from `hyf`.`dev_halyna`.`fct_trips`\n )\n", "relation_name": "`hyf`.`dev_halyna`.`fct_trips`", "batch_results": null, "overload_results": null}, {"status": "pass", "timing": [{"name": "compile", "started_at": "2026-07-28T15:44:47.125218Z", "completed_at": "2026-07-28T15:44:47.161207Z"}, {"name": "execute", "started_at": "2026-07-28T15:44:47.193751Z", "completed_at": "2026-07-28T15:44:48.468540Z"}], "thread_id": "Thread-6 (worker)", "execution_time": 1.6464669704437256, "adapter_response": {"_message": "OK", "query_id": "01f18a9b-4304-1245-82d6-2a178bb82028"}, "message": null, "failures": 0, "unique_id": "test.nyc_taxi.not_null_fct_trips_trip_id.df65bf8c1d", "compiled": true, "compiled_code": "\n \n \n\n\n\nselect trip_id\nfrom `hyf`.`dev_halyna`.`fct_trips`\nwhere trip_id is null\n\n\n", "relation_name": null, "batch_results": null, "overload_results": null}, {"status": "pass", "timing": [{"name": "compile", "started_at": "2026-07-28T15:44:47.098685Z", "completed_at": "2026-07-28T15:44:47.160207Z"}, {"name": "execute", "started_at": "2026-07-28T15:44:47.162213Z", "completed_at": "2026-07-28T15:44:48.470535Z"}], "thread_id": "Thread-5 (worker)", "execution_time": 1.6504688262939453, "adapter_response": {"_message": "OK", "query_id": "01f18a9b-4304-13d2-a1ec-602fdc5a0565"}, "message": null, "failures": 0, "unique_id": "test.nyc_taxi.not_null_fct_trips_pickup_datetime.3c78164d83", "compiled": true, "compiled_code": "\n \n \n\n\n\nselect pickup_datetime\nfrom `hyf`.`dev_halyna`.`fct_trips`\nwhere pickup_datetime is null\n\n\n", "relation_name": null, "batch_results": null, "overload_results": null}, {"status": "pass", "timing": [{"name": "compile", "started_at": "2026-07-28T15:44:47.141207Z", "completed_at": "2026-07-28T15:44:47.192740Z"}, {"name": "execute", "started_at": "2026-07-28T15:44:47.197741Z", "completed_at": "2026-07-28T15:44:57.360308Z"}], "thread_id": "Thread-4 (worker)", "execution_time": 10.39731740951538, "adapter_response": {"_message": "OK", "query_id": "01f18a9b-4304-1723-9034-b64c06f29d6f"}, "message": null, "failures": 0, "unique_id": "test.nyc_taxi.unique_fct_trips_trip_id.9b74cb6aab", "compiled": true, "compiled_code": "\n \n \n\nselect\n trip_id as unique_field,\n count(*) as n_records\n\nfrom `hyf`.`dev_halyna`.`fct_trips`\nwhere trip_id is not null\ngroup by trip_id\nhaving count(*) > 1\n\n\n", "relation_name": null, "batch_results": null, "overload_results": null}], "elapsed_time": 103.39273643493652, "args": {"log_level_file": "debug", "exclude_resource_types": [], "v2_parser": "dbt-core-experimental-parser parse", "use_colors": true, "write_json": true, "use_colors_file": true, "sqlparse": {"MAX_GROUPING_DEPTH": null, "MAX_GROUPING_TOKENS": null}, "latest_version_pointer_enabled_by_default": false, "log_path": "G:\\Halyna_work\\traineeship_Amsterdam\\Data-track\\week-13\\c55-data-week-13\\task-2\\logs", "require_explicit_package_overrides_for_builtin_materializations": true, "require_unique_project_resource_names": false, "show_resource_report": false, "use_v2_parser": false, "require_nested_cumulative_type_params": true, "select": ["fct_trips"], "strict_mode": false, "invocation_command": "dbt build --select fct_trips --profiles-dir .", "require_resource_names_without_spaces": true, "partial_parse": true, "skip_nodes_if_on_run_start_fails": true, "project_dir": "G:\\Halyna_work\\traineeship_Amsterdam\\Data-track\\week-13\\c55-data-week-13\\task-2", "send_anonymous_usage_stats": true, "show_all_deprecations": false, "support_custom_ref_kwargs": false, "hints_enabled": true, "which": "build", "require_yaml_configuration_for_mf_time_spines": true, "vars": {}, "show": false, "static_parser": true, "log_file_max_bytes": 10485760, "populate_cache": true, "warn_error_options": {"error": [], "warn": [], "silence": []}, "log_format_file": "debug", "exclude": [], "profiles_dir": ".", "log_level": "info", "allow_jinja_file_extensions": false, "use_fast_test_edges": false, "require_ref_searches_node_package_before_root": false, "defer": false, "include_saved_query": false, "state_modified_compare_more_unrendered_values": true, "state_modified_compare_vars": false, "favor_state": false, "empty": false, "introspect": true, "indirect_selection": "eager", "printer_width": 80, "require_generic_test_arguments_property": true, "partial_parse_file_diff": true, "require_sql_header_in_test_configs": false, "require_all_warnings_handled_by_warn_error": true, "quiet": false, "upload_to_artifacts_ingest_api": false, "require_source_and_semantic_model_names_without_spaces": false, "validate_macro_args": true, "log_format": "default", "cache_selected_only": false, "maximum_seed_size_mib": 1, "require_corrected_analysis_fqns": false, "resource_types": [], "use_catalogs_v2": false, "source_freshness_run_project_hooks": true, "require_valid_schema_from_generate_schema_name": false, "print": true, "macro_debugging": false, "version_check": true, "require_batched_execution_for_custom_microbatch_strategy": true, "export_saved_queries": false, "enable_grouped_warn_error_parser_logs": false}} \ No newline at end of file diff --git a/task-2/target/semantic_manifest.json b/task-2/target/semantic_manifest.json new file mode 100644 index 0000000..63d2a63 --- /dev/null +++ b/task-2/target/semantic_manifest.json @@ -0,0 +1 @@ +{"semantic_models": [], "metrics": [], "project_configuration": {"time_spine_table_configurations": [], "metadata": null, "dsi_package_version": {"major_version": "0", "minor_version": "211", "patch_version": "0"}, "time_spines": []}, "saved_queries": []} \ No newline at end of file diff --git a/task-2/tests/assert_fare_amount_non_negative.sql b/task-2/tests/assert_fare_amount_non_negative.sql new file mode 100644 index 0000000..0b6fbe5 --- /dev/null +++ b/task-2/tests/assert_fare_amount_non_negative.sql @@ -0,0 +1,5 @@ +select + pickup_datetime, + fare_amount +from {{ ref('stg_trips') }} +where fare_amount < 0 diff --git a/task-2/tests/assert_pickup_before_dropoff.sql b/task-2/tests/assert_pickup_before_dropoff.sql new file mode 100644 index 0000000..8ebb206 --- /dev/null +++ b/task-2/tests/assert_pickup_before_dropoff.sql @@ -0,0 +1,8 @@ +{{ config(severity='warn') }} + +select + pickup_datetime, + dropoff_datetime, + pickup_location_id +from {{ ref('stg_trips') }} +where pickup_datetime > dropoff_datetime From ff0cf73906d5d5c059e812e09e7dbaf9c1ea5294 Mon Sep 17 00:00:00 2001 From: Halyna Romanyshyn <30292604+halyna1995@users.noreply.github.com> Date: Tue, 28 Jul 2026 20:08:18 +0200 Subject: [PATCH 2/5] Complete Week 13 Databricks assignment --- AI_ASSIST.md | 19 ++ README.md | 108 ++++++++- task-1/screenshots/task1_pyspark_code.png | Bin 0 -> 121641 bytes task-1/screenshots/task1_pyspark_results.png | Bin 0 -> 146337 bytes task-1/task-1-week-13-halyna.py | 48 ++++ task-3/SCHEDULING.md | 47 ++++ task-3/screenshots/README.md | 8 + task-3/screenshots/job_config.png | Bin 0 -> 105192 bytes task-3/screenshots/job_success.png | Bin 0 -> 186182 bytes task-3/screenshots/job_success_overview.png | Bin 0 -> 170973 bytes task-3/screenshots/paused_schedule.png | Bin 0 -> 140130 bytes task-4/BONUSES.md | 128 ++++++++++ task-4/pyspark_app/pyproject.toml | 18 ++ .../pyspark_app/src/pyspark_app/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 228 bytes .../__pycache__/transform.cpython-311.pyc | Bin 0 -> 1877 bytes .../pyspark_app/src/pyspark_app/transform.py | 39 +++ .../conftest.cpython-311-pytest-8.4.2.pyc | Bin 0 -> 1269 bytes ...est_transform.cpython-311-pytest-8.4.2.pyc | Bin 0 -> 2104 bytes task-4/pyspark_app/tests/conftest.py | 21 ++ task-4/pyspark_app/tests/test_transform.py | 72 ++++++ task-4/pyspark_app/uv.lock | 226 ++++++++++++++++++ task-4/screenshots/job_notification.png | Bin 0 -> 36313 bytes task-4/screenshots/lineage(3).png | Bin 0 -> 145425 bytes task-4/screenshots/show_grants.png | Bin 0 -> 94316 bytes task-4/screenshots/streaming_dashboard.png | Bin 0 -> 155022 bytes task-4/screenshots/streaming_result.png | Bin 0 -> 113712 bytes task-4/screenshots/streaming_stopped.png | Bin 0 -> 112000 bytes 28 files changed, 724 insertions(+), 10 deletions(-) create mode 100644 AI_ASSIST.md create mode 100644 task-1/screenshots/task1_pyspark_code.png create mode 100644 task-1/screenshots/task1_pyspark_results.png create mode 100644 task-1/task-1-week-13-halyna.py create mode 100644 task-3/SCHEDULING.md create mode 100644 task-3/screenshots/README.md create mode 100644 task-3/screenshots/job_config.png create mode 100644 task-3/screenshots/job_success.png create mode 100644 task-3/screenshots/job_success_overview.png create mode 100644 task-3/screenshots/paused_schedule.png create mode 100644 task-4/BONUSES.md create mode 100644 task-4/pyspark_app/pyproject.toml create mode 100644 task-4/pyspark_app/src/pyspark_app/__init__.py create mode 100644 task-4/pyspark_app/src/pyspark_app/__pycache__/__init__.cpython-311.pyc create mode 100644 task-4/pyspark_app/src/pyspark_app/__pycache__/transform.cpython-311.pyc create mode 100644 task-4/pyspark_app/src/pyspark_app/transform.py create mode 100644 task-4/pyspark_app/tests/__pycache__/conftest.cpython-311-pytest-8.4.2.pyc create mode 100644 task-4/pyspark_app/tests/__pycache__/test_transform.cpython-311-pytest-8.4.2.pyc create mode 100644 task-4/pyspark_app/tests/conftest.py create mode 100644 task-4/pyspark_app/tests/test_transform.py create mode 100644 task-4/pyspark_app/uv.lock create mode 100644 task-4/screenshots/job_notification.png create mode 100644 task-4/screenshots/lineage(3).png create mode 100644 task-4/screenshots/show_grants.png create mode 100644 task-4/screenshots/streaming_dashboard.png create mode 100644 task-4/screenshots/streaming_result.png create mode 100644 task-4/screenshots/streaming_stopped.png diff --git a/AI_ASSIST.md b/AI_ASSIST.md new file mode 100644 index 0000000..2b3a68b --- /dev/null +++ b/AI_ASSIST.md @@ -0,0 +1,19 @@ +# AI assistance log + +## Where I used an LLM + +I used ChatGPT while debugging the local dbt-to-Databricks setup and while +organising the assignment repository. The main issues discussed were: + +- the Databricks adapter and `dbt_utils` package were missing; +- Git Bash converted `/sql/1.0/warehouses/...` into a Windows path; +- the source schema was incorrectly set to `public` instead of `nyc_yellow`; +- dbt initially authenticated with another user's token; +- the assignment repository contained only empty placeholder files. + +## How I checked the advice + +I did not accept the suggestions blindly. I checked them with `dbt --version`, +`dbt deps`, `dbt debug`, `session_user()`, compiled SQL, and the Databricks error +messages. I also kept all real tokens outside Git and left real timings, +Job URLs, and screenshots as manual evidence rather than inventing results. diff --git a/README.md b/README.md index 96ce7bc..c527b82 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,105 @@ -# [Track] week X assignment -HackYourFuture week X assignment -The Week X assignment for the HackYourFuture can be found at the following link: [TODO: Assignment url in the learning platform] +# Week 13 Assignment — Big Data on Databricks +This repository contains Halyna's Week 13 assignment scaffold for: -## Implementation Instructions +1. PySpark exploration in a Databricks notebook. +2. A Week 10 dbt project ported to Databricks and Delta Lake. +3. A Git-backed Databricks Job with a paused schedule. -Provide clear instructions on how trainees should implement the tasks. +The complete Ukrainian translation of the assignment is in [`ASSIGNMENT_UA.md`](ASSIGNMENT_UA.md). +A file-by-file explanation is in [`CHANGES_UA.md`](CHANGES_UA.md). -### Task 1 -Instructions for Task 1 +## Repository structure -### Task 2 -Instructions for Task 2 +```text +c55-data-week-13/ +├── task-1/ +│ └── pyspark_exploration.py +├── task-2/ +│ ├── dbt_project.yml +│ ├── packages.yml +│ ├── profiles.yml.example +│ ├── pyproject.toml +│ ├── models/ +│ ├── tests/ +│ └── WRITEUP.md +├── task-3/ +│ ├── SCHEDULING.md +│ └── screenshots/ +├── .env.example +├── AI_ASSIST.md +└── ASSIGNMENT_UA.md +``` -... +## What still requires manual evidence +The code and templates are prepared, but these values cannot be invented and must be added after real Databricks runs: + +- the output of Task 1; +- the full-refresh and incremental wall-clock times; +- the `DESCRIBE HISTORY` result or screenshot; +- the Databricks Job Run URL; +- screenshots of Job configuration, a successful run, and the paused schedule. + +## Local dbt setup + +Run these commands from `task-2/`: + +```bash +cp profiles.yml.example profiles.yml +cp ../.env.example ../.env +``` + +Fill in `../.env` with your personal token and correct warehouse values, then load it in Git Bash: + +```bash +set -a +source ../.env +set +a +``` + +Git Bash can convert `/sql/...` into a Windows path. Prevent that before running dbt: + +```bash +export MSYS2_ENV_CONV_EXCL='DATABRICKS_HTTP_PATH' +``` + +Install and check dbt: + +```bash +uv sync +uv run dbt deps +uv run dbt debug +``` + +First create the staging views once: + +```bash +uv run dbt run --select +fct_trips +``` + +Then run the two commands required for the timing comparison: + +```bash +uv run dbt build --select fct_trips --full-refresh +uv run dbt build --select fct_trips +``` + +## Databricks Job configuration + +Use these values: + +```text +Job name: dev_halyna_fct_trips +Git repository: https://github.com/halyna1995/c55-data-week-13.git +Branch: main +Project directory: task-2 +Commands: + dbt deps + dbt build --select fct_trips +Warehouse: hyf-dbt-warehouse +Catalog: hyf +Schema: dev_halyna +``` + +After proving the Job works, add a schedule and leave the trigger **Paused**. diff --git a/task-1/screenshots/task1_pyspark_code.png b/task-1/screenshots/task1_pyspark_code.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1b00ecff586c25d0b09526396718d5163145db GIT binary patch literal 121641 zcmbTebzGHO+cmlX5$Tc!X;4bKr9&E|rMtVkq@+VqT2i{ZQzR6m8ziK=;mo!7`|Ni= z-*^5vzcYU-i+kNU?>VnIt}(`CxT3ryDiR?Q1Oh>odMox00zu$~K;Yt^Jq24(Xs7DH z4;ZI+k|L1uQQ{r&%M&wUIbjH-DhBz^03Q5~X#ZBz2?9auf&PUVuq!f#Kpyj@#DrDc zb@vuMG*nD(5sqG`H@*(brN~B0%gNW6v$DWyq%W{&`joP9A%nWhIL)l&w8L1%pd>0T zUbEoHo($VXJp%v!IamLaC*qjmO2!$>q%|3*%$+FJxA)r9O`kn7w?6Z1eMebo8uJmv zMMOljta~4IdwEF7$4BI{J0)KBzE1J08l#4mR#4c#TTyP6VzJ5}ugilR+r?({rPihy z1+jlOl~oM^_ag`s6BCLf7UsX2QoezOl~u(1I?M3=e;*(whLa>NArbQ4nu_Aztz?j) z@9DocP~?7$4v_z^EhWzQ+y8Y`u5_rAGxV}bRmNs!>j#T1Z)IdeO-&1CCdq=H>mU1AQ38q29336U8y$?QBA}f|$20mv z3i_3)jEqcBMn=YrEciub6?z*M78ZtVf8WOU?JthWnVHdZbyg80&>aFY_}tK5w_oM{ zy+3&dkJHor`3Ai7aB$M1K&fHxNS_k=8Eh}aWMyUhbpu{Vw&p&sxzRL6kam{vqgt8L zSUqp25UuKyzwT94;IAJ_Cf!1`;EGCpNq5X7dYJ+NE`E}fY+RCiNmX^#A%~|2SCvlc zN#)f4?&{o=s>eS#jdmJQsy_-NP#j@}Ol{HHBLq+{QNI#wfB7~>aX?q%!w>UIAQKX? zJKbyh?}JP9Cl%LEu_ceD#spV|)e2^Gz949(qBy^!c72V*sW&27=P?n-=E?84L>OU- zY}W1h8%s#5CiP$At|<50cO^>7)1A*Ij`P8%8r~-$^U^^Zk_+Ie4 zlerS97Rr+}HaF+$b@&!(HI&cDsm9JaIh&evdEQEB>@Np@#$1n`w|k~v95ws(S0&Od z{1hK2dEqkAAPM*P@yieLpSfYc%XHrPDZWSN^7wH3+IFcG5f2ZK-D*m9k8?Ja&FpBe zW-M2&?7d;K(sYHMq=*PCF$u})-X4Q1Hs%lIQmV~uSs9rgQop-^2)x%6uU>(vMd<44 zYVYFGXI0Vml#h?k0SEL>uHhvq6kTcSaMUA}rwB1op5 zLF<~DZ%iQs&+WR0kM@E;tUrpVXLuNSvDroR_F{ka_ixpepS2dsVv>?Zhf8g1n_>Dm z7s%GjUT}lo#5OPaV)^uo_+u>$0v0miVy{PN$mp?unaaY-7Hw%K*4DB|;5H~h}d&h|_d<-+1(TzYy$o@9*SYIiWV&rNM3A#^H$rt~T2Y3z&iAO_X?8Pz|& z_vh+g^7B_ueh-I*hr`q&>T%gFbVdxQJD1FBf-txUCi5ct9`UnJxirU zbIfIc%@})gN!%Yp8l&6h*)=tVTUAxH{p+iGz;L6(`pV{J$jpp}gHs$aF|Ktu#`fjI)z6R++*HhjdjM#p4-eFeP6#>P&znbx+5l(l!lF+=>nXktG6s*pB* zYAZB4a|tv5XAJ|+if9AP3qez_G(h~P%Z&GRDt9-7WgX42=4D0G=4b{o7)PaA4f1<* zY#{mwvBY$BcZ*nq-l3~U#$zJm=Ej#x=j;n5^$nY?F*E87!^CGXd}2D5i7F^4$Zoep zoRgCi79EYNUXc?2>DdvoNaBobuCWOOHgU+%DL<(c#a~a+VeIXyw9~voq47&NSj9ep zKrq6@#7t-nk+f@tLq6y$+^=JO!ay18HY5pt`|RRFM1+S!AlO`Eg!wyXa@6gWOjA~b zPRARe!OP+zCq8tS_+Q-ZFL6rF(PMr1)QNTJ2stbh4;_?jE-o%^1{5f+4R|k#nIcB| z-jxK5f)~JUyPz?3adm7o>tvM1Y4cGs=0*5OUx8vTS?4w$D@+%Rv}Qzt9rs$d&nlG_ zqaR|Iz%zSfVQp>VZl4U<#}k?-lw|!xOV9eqjS91|hCJ*DV_ngw=BMD$+PDv?B{I1fN8uspPrBJIxgPDPDu)-TIR{?*V zT37|+4mR=SfLmf%rnJ(t_=oZ{WRd6bIViF91h^xIBn~92Zq_P_ukJ@j9-DvPc*TN{ z{O)7tPe|vZhIVnU07XGc=4X@9nGz-eCS*Ly7v$^SoP=*6dxvmpO0$DAaUlbEKl@hm z*Y+Eh`-$vY10HWX9z`Q?86l7tFJ9ok@nm1}*dlRvcZbaFvOiw>J%;9ph8liPVFANi zl0Zu(*6GqI0bK8H@x z-f(PgzX$#oZ#+L>)5?>P3!m<^xb72zxEf$JUB1)caCx8u<^bAo^6LS&WuMTiD|exE z3g3%8&3kThxab&C!TzZ-Elhm;FjC(u81)L>PfdOxc7lAD03)M_ z?CRR)Nk6`?`qNRz-dEHs`xRaX@O-s>_%MQcOOJ zEat@ZSK+$JVPV@l8&AchB)NweN+zwnZ?y>3?%eVG?oaVEGQS3(n{jn_#+{FElaF6v zu579kjXjJ%chM~ijZEOOf4#!><@Fr_L4-)($fqzc`?6({nX1#r85tRm7o5g&bXr`i zd+EUtcRpAksIRZTsi&=4uP#urm2&5W&B(i7je&$Yw1@3WyWfuax0E_ax1ZU_U284o z%Arn2BTronNiY8y_~=F}rY|k*Gl$iDBc4@O{7Q2-?}-Y`;>y}uxaPX{IHM5!OCRHk z3_V!1VAwn_zOLd+^OuS9CKmf^?S#5qu*%x}*-$YPZ9Ac?F(0OtMbC3Tu$V;E^H%ZY~RZ-J%^uhfj3Txc4kY-(<*?OdS z0KuTqdU=^NARs`a-kLzy=Unyfs0V#b@$TXF@aXKUH&;9Y0}PR1WV~Fr!=-0vX#HWB zl+1n)-r60$B$N`7<9gYsh=^TaW2NuCCq&5Fn!)p8FZ}v+i;|fc1N5MHmVnREqT8|o zh_WfHCLi}W65`{T?N@}pf9Ao4j?G8{w($x*!4JW~I|JXd1og7oX4|~n7<8JS|M>Ca z>U2!-{5HSFDLPo!e`E{);35Y@vukMR)pC?zaJ7>p-r~6i zB%`&>z@2UcDNav23Mt+=;w|eQJ3*rKi06%~himwrp_NMPu`FI3`zgB+;z*e&@5#Ou zt2%osC(&!zVuOgfSuXe}#?R$@UsqFtkw-+-N`2Fngpag{LsYbTB`jL3y&tRz_Ep^hlTRnD&`=^0jfVRWG zOm{~mCw%J1Ih#JBrnb##k$4?0nWDm^Mkq6G^VPpGWGh*(d!i3P`sJ$fB**QO{d3=a z4nI|4pPO||BfPm&{eBI(-{182YklJD14qjkq764%t@P$+93;fV^Z^JmWV<+6gaVO| zBh&}GiGYs82WSd2Ha z6YW1mPvQ4)S3)rMXBrzZ8sVKM9x(tW3BrFgnrk;Ynx;0F01!qYlEy`Q8gD)Co|U(Y ziyw`A$-ny%e{HS1%3X&z`kEeMH{x5yu#Jy}M*ckS$2_9HvR$Ow%PO6d5w{c6X;SqC z7QdG(QL(UGNm;DV(~M9rgRv=?`}z=`#l2{W;n%qNFgc<{R?!ntnQ?eid8b=OZrRT1v-e&Q1rNQK?J*ty4>Y@(=xa_2dBA=qf^cS5-Gd(YZ@rDc5`#{ zez@M!sI$aba$iS`1q)CkHOPxXap={y2cT1AYz&=* z*BJsi+x`LP>+5@TbkqrEAdB~vJqY+K`N_K7)h5G7U~%mR&=*X2_{hXaof=cr(z3ED z{Vv#2-8Mo>$>`qoffyFs1#U6%q1PKDDJ*bq2MfYq)yl?eEhfC@k&uylKJz#o0XPGN zUx%%yXd!4MA0?s)SMRP*2fu%xjH#=xhK0yx36KarTu}lf9yva)I9aBJCzHg`1rCjL}G zCP{p`ctnB0h0Oi2If2ZjNl&!i^ieFo;GV`r)Gm*zH`vV~IB45V@)G4>2b{!u^QmBvpae*PV-MT9C`1;8ff(n&Xi zPExe>qR544KlAAFJWLo;_nNs|52uOx39=*Rj}++28T<&{S6Tr5=d_&K)4_T{iCev( z?kSjenDuxmAaZwhvY2}*CBXb%*^dz#A^NB(p{JE5uIf**^r$j|Y;{q$FK*2)rff36 zg6Tzm|7_EYTe7Crzp~F)gVCq_@y@*6tfAF(C&mDU^IK3dUS8epmunO}--ECsG4YIU z@zs#*wTSL==FT=_PB6n&hN#G9lsy@}@#}8~3kQRKBFxuS1vMHygdP8&!Sz51YM>&Q z!a;qBQHDxKh?R^~@L}x2AjInC8>Gio_2SK(6h`aW)*3~GC{aW{aaee6q z#mK3?mm>cD5YZyGRmIvbV?@$fufhiLS~L*R*#=;5go5fBVM22y*HbucG1tmI#IUFA z=0!<`RS}LrWOr~O4H)YKsTmnjMg!3Xj}P}Z^=)34Yco|wG;&Q>U##u6x^`3l91;A2 zpiWF)dASfydZY<>p>yo>db0-z4a5&9qQ zZ_lSsDJdx(?yek&1$~L*;^H9wDJl3+lnhp|nRcI+%1>(^pA#rKapsk=w!c4$$7m2j zuEv#vV3=YqlM4WM1#x7@r|u zV)f~20KtQhIifs@CPQw2)tRUU6*R4ArK-(WTb`gC0&OrD%I0 zWrsvUBku>b8;Cr{YJ*19Lm2u4_hzc#Kq~0p(!%F@xD@pxPcqN%@c{}+1+G@$W@lDb z^!Yu{o&iMA`RCVH7WX546e3QPbWR(Q3f;D|^}YRl7M~kupX`aA9ypK~41feZq)e-U zf|?p00INQ*iifTCgc_}M252-nQhWROz(71a(z2YJ{j?fvqu>zG^Z_E@1}lFOgJxip z(-tfQ%<=+19Y~RS#fyu>r(F9(j-2deB>MZC{{sdGDRqCoR{ zNy#3Q`Go~-*$iGBKDUG3;ny9JAh(5b4F2_JjF8r&Ze)CJdor~O-6#-KdPYX%Is`B= zq?HIi=P|e#p4{%vdCzTCBkbEFF;l>q!?Fy zN|=jCC*l>?xQ{PN6B)$SdY)m!A~C%>4u9ZUJg(-EETwkP*H;gh6Jx;RZj_t6!NDgN zZ{30XVKI))tTb^0pSZcPhlv9-{KhANn3Q-7^D?&O4p@p6kXVm^v;f}=l_{1^(XA_8vU#t)KLgD8eHr2C7_ zuLZ1FLy)x)AbV81&LYY6FPX82x~f?0ha(+_#aka;b+OM6T@n#S@9Xe{R`QQ3U1BtUnrGWm`WZI8XqBp6~PrK$4N2AXe?AO zd9J&cwes84%Kcje$X~(E8%Y?|rXMsR{g~^e)>O-5P*%pOu>TYF0||$n9048Wbn4BN zZpGyb(=*SGDjV7-2tqsic411~*A!w|#qiwMe$z^ZbrgG-s<7WAL&?x@wub0 zm6BBHyo%@;G~`eupHWUQS5ssHDNx&ZjhTX&gaicx0}9}12daz)pj&1+?tlLLG5QoS zj-bfQF1Xys3XZngemz}fqu_U^Z{i!m*56^RwFB;rG+0S^V>z2)c=|tzwk55si(&gUm(b7$`Hx754B)3D#0jwC-hljLTdGC zZ&56y)5wHaB>NQ?JtN%Lk1z|pu(L>RFIAfPcs^3X&YxSXq>;W)b8ML7UiD^#!>b$0VYc1LYqs?8o^&F zPa<4SV&@=)nNzm`y_s;P*>Bl%mvNT+?UbOy+J{n~jlsBT{k+=D3xM(LcYabsnBSXD zEiLI@@V|Wd%qqRGb1_S-Rh$2E4T(80!oEQcq306qvDL znjOf~SyeS-s(8i8Zeodg`|3g_m8~9v79D$F+3w@y{6WW{t07{pvpS3P?v8Vf!Wm}c zj+i9>M{U1-qE4Z!zmZXo*Sig0ZIod=m7pN5y8$6DasfXAor$+htyY5Q#o^%)thf}q zgBp3^-3?kngh2TO=HWN*PkA_YaytkPJMt(|Dy$KX&yw(2!q!&8`h%Zl$qBlNslX!L zdgxLuYNyt$n7Cnj$E8sEsAwXpIv{2b?PT1XH@t)mMG^>N8@)Vu0Y@qxuWcSOH-&amiY#dl)-v_ z_c&nHIyyNK0bBYE@^hCvo9(UgQ_M*ByKo4jVZbiHj#(*B>6?;W{3p z377Wu7du)S!?C!mX8t-2R}GQm5<5TMg1Hf>~duI1WLKDWV|#Hn!)Q$Q{BLwX>B1S8Ud_QU1-T z*sRn0ADV67I5=G!o0-A+3n(j6fImG)$FqSQ3u{O53DJM z*p|Oaf&p6qfxJ^jRd3LBUxgof$+K7`!WV9@1XV$5Oyzn92G*zb{63xEUv@n9c^$SP zK(2l#>oL3hQ9&W*#sDO3wF4jz#~*w@Mntf^nn?wTd1E7Y>(yF>VX_pjTw4AZ#uN70 z;AY3PW^r{UXNNT*pZU^m<#}nUXOy;-EJ~Mr`~=_p``!{4%@1e>8_%V(O*yZ%le1tJ z8y-oEC`+q*>LRy8GE!1L_TRkC!N-u3SYs50ln>sU^F1{pBzmQ~U=eRB*vr~XGodq> z%y3gH<&foqq&2{gwv^ViX4WLRCCHgd>+#rUy)L#b7^onPl1oLqmXwkArMISNW0V9F zCr25tR_@cCE(0fmyTTc4w=2$R2$qwSpZxPXz7Q~+Wi1lYov~Dc71r}Vs_i6XeD;ia zDuPZflFz98)qYwa<`pxy1y&5fQOs=gGn?7>PF&P9j0BmI`X6N=3+Kv*!O!FKEk-pc zDGEBNI~OsgV@pv^k*q`jSgTFp}6FRlB&Uoyc73D^?R#NmKQ+b*p53gE<3RKh2A zc6L5{-QT_;z41KjJX-CMVHn!E?w9K=F!Tb0HSNrX8WtAfC#vhwReSpWkChPI+h=H_ zf?bT+9oVAEcJFCnmA#$al&@1F9;rUicI5F~dydaFTlMPP~Gk^M6Tm+?IW@^H0|UWJT_ zc>*^9kI=^;4dM1U`7-lmtROLIk$&&od43#T)a8+ohzJKK7|3sv#mWe-t|4EwnpX;= z*-_g7L3ES71Hcq@UL+BZBNZ-__A_(1bdWg4p8MVG6gJwg!h(2?4v4WkK-K_I9cqmN zbOng>;Svc@_Mk~R5@TGh+Se+ZdCtiaRT)17gSgzl4X0b`ERk9!_le>NUt2LHL&Fj( zFJ^+mGy30KP>At!pNc+*y?UhEyq-L@gH1EM4bP=5{H^RK<9VqVa#E-MG@9k(oo}CA zSzfq1Zm(t9>Aoe{agcyFSnsPJw=ThM2E+0Dei6M_Nh;sy9QBiPBVf&GN@MI{o#HhaCm{dwp#o>u=Q#f*&ZasCZq3=T)wW8qSn|5B{-G-AdRvZDZK^PuJ{S31nYxZ?JeClnR<59m@g;sw@ z2bk5W83WAjUtud%{D!z;WvEXzVbf4V@6R8?ULD0feUb6pUOAY8?71Sh#X80_aiOC0 z*)Ay_+OroVLHo+}lm$f=w@>8TB#Aa}KiIw(Tr|QlTq&4UH%}<7ML%URE5$@iJ4wEA z7w>gloV#9sZCKiG^qb{s;HtCl1DQC$GvC+;H8Ijn>xU(8nPLr_;l zF#$1Dj6~!PbMck(ibC(^ejz;jkss_;DyAJq1lznbHIW$4!D&z)O~a>Jqj%ljfY|ly zWf6PDLue&UN=cyfNpo|2v-}b2F~XUNU4v1Ih7mt0dMW>A3_j^ly>=}&Lvrli^)QST zkxDurPEzt~GP9EbFfSMxDA9A~9-{*HH!v&j-oR?=`Nn)6BJDZp7A)fQLQ>45scuKY zK(f4QS}C{$MOQ#2+3RcYAmSwiC$PRmMYDLvK-aB#NB( z#&bkrAb=guu!da*d4f@YB*D$rJ3y27f5f3b8ym|Kj0wl4g`Hz}azepphCrBY=GgD9 zx3X?7fcms@wlfhQmlin+l^H-<<$ia?0@cj`-dqRCWD1WH&63yQ8$eiKXJ%&JI5}-a z#}PXMVeilE+??S;qeG+bJ#S!O;L%DKoWrw&<&K!_Y%(YtJ0@_;P@?*k292eB0)zX2 zBe63vxncK%R86bBRo)jpBJLe_3lzdo#;N)W3Bz@fpKHXetFISF*UX>CmzaKrq8)b5 z#9eJvl*z(1mu@OeJ&G?a6H-pW@3oTZVylLvpFF2cSK=2Cly_sm=V&6oVE`yJ|y$<7AOH%UOg~Ficj(9 zb;%F?Fo|35O$Mq6;YJ3ZGRo4*A|?7}-BnII;NBrib9eUpaYkFn@_X zv=An4MabRniwa3cH_rba(f%rDg38nkq#h>Jy2xCP_X}R^*}IqF0go&_3-Qg@?5eiS zJnSHuX3y@%R&k$n{PTv8uFt4mW(s%x^|cWP7_{g=dgb^dq7hV{%t|tmIXOIYOfH8_xlWVBhQm)hT)I6abNNFDcYqf*j2{wcrw%?-hx$boWa2#CrT%iJ2;l_fi za&U0)<(1kEZLP^Lu6Cn648T@J%7tjGY-|pPOK-TjpWh{0zkg5oaI^cG|8}oNVvFfZ z3GJIVi{?^OuqGy5H-#7)+HHZK9h9?OokM;LDk*AdiQey>R=#a~y1P=5W4j*m*}w>* z{5l#oh1Z4dVs91>V!qJGLdb6J4>-OYsRWuvk5d}UsnX&xQ^2{i`dD?F@mrVLqkI-#Sifh3W9?Iq|*0wNMI&RBB%m_;3Hrg*S~$Dzp(+z zKMJk<=T5-WRas2X_;~e%p#CUQqSS6JYPxI}4Mlr~iYlJL>vA-uWw#0#18A50Xlu!d zz68_(i|d}oz3*b17hXlj1Mk|}8U!-Ne~JRU3jSZdP)!yo!G)rcbc2a}43L*05Uo<) zcyVTDB%cBK${lb7&?}zp&*OoGO$gl8c!38C> z#@rx91Ao!40i?{yl?*{LhJ%tB>-u*i+r)t2SXfxFf4K7in#(F!u({n1h`YPHk+hj~ znm=r1ddX+$NG2-OSq>7sc`b8sKpky2+=CbUv%Fy`0&pE{OSRIfViZj5b)|W zk{pWHfhz!bZeZoo*o7S(S#xvQU%@+VjrIZW!RpG2KM|KLnSj8H!?w#zh92zr>KdSO z_JZ#WEG&xA9pzJ)VFd4v;QmY&Q)(5yL?vYJeBE&etEZfe2LTZZYR{;wsp)B0_8oo{0?{D{xTk`7 zoHjcFT?KVOfIh_p_~`q0Stuxn#%QPl1*WGVSTU|Q!wR~^Gn(NqnNT8N=HknvT2y|L z(fSuDH>&FIr~_3Kw4ktj82eMR*qZ9f$_n&|dZd+9PDR1>kXFw9VTM6O8^mRBJGo%m z+dECjHq6vnsdIC4XIo4ZY|quvXGhrqp8P53Ls1~7eJFdr{4Pef$W#PpCO6Sif;R5e z_tEX=U_zs$$Ey0jkJ)316R0`HWS`%J-G%0=1&Ap&rUnSVLK#8e@0Q0tJGasAEtE+tS? zq@<)k=*4J(8pFQnNJu=5kB_$p5f?bjg!TY+L6J-6pKtY-ZA=5W+@K;n5TwZ2*p&bJ zmQEcg$56@=1X2hQ5m8k-^zKR^PkEt-{L_kl8tlA>j+%ek|C<5t|AR;G|IaQAKnvpqH8wV{-n6!Xv9fx~Q+%hXVJ;9+U#~b_ipcLem`QU7~lHX{CQ zWF#0z@bK>&|NCE@c<7CMCYF<+RWdQO&@2@yd|wulpRcKh`Ol@n2Rceqafe9{4+brn zPciw_vFY^nxKd?m5m4vmKTSnA1?RslpA;p}{%;fL|24p%qenI~Y@Fg1;veYi%0(KZ zcti5XbfkAvB)_n*2T+05Oi9CT0Y~m5Mha%xa&Qh}$3RI;sf%e#mJo5F*Rkf5{?W*Z zHnL65iT&v-$S@{-1D8durb=NTvMJ2M|LRCjOCPXuH@fU5&1e?^^WAz6y5RHl(^o_8 z5k(8Eyk8kL11)8e!bZeYzqQG(6v}jtRS7W?jhr}@7VPU5a5tY7+vexV(DTXeE)qh{ zV!)D3&zAs~`%fQ$6~76X`H&g4>OUkWCtDYTNbzU7BCDd!WH`wb_?$$W;CaJKs);%5 zH+U;A?8vS$#~Y}RqSH-x=HE@!U)YVL5GOd5MA-Fp4Qn_Yu|ie^%TbSovp6CCPz9K~$Fb5!>M z*DP>4UeDnm1vh#&>1QVteJDPFv3i7kXoPV#e-i2U!d)JV%X?IJVk#%j^!r=~`)*=E z1-eexbZ9vQ!oa}LdqAtE8&Go;j%IJ45_W>fCJ=5f>uf)WM;4`bibPCITq|S3U!J?a z(1Z<~WjN^$XWL3ZT(A0s06)i0#4-bJB!eRfQFkaYl*B>3(Lt!(36vO$52%=$*RTvoh~jGquun=o|#@&%z99&9J#h@qLPs zi$oJfLgWpLpp;Pn*fxG!FaatOpO_OcTbPQ(TeciYz;!tQ&gx{*1P(z;Rjzr7%-~txqhCA znnHY6F=J%^=yugHi!+kx2Q#8ejM#DX9FjWo<{F-zsPKbn^W<}DqD$B`)b}wOLRl}uj zAWYsAyrEYswVYNg9(ClEg_zOd8G_=sWkcKoU7FkUG+XUQ!q3pmjhv6G{J-w<^jcdHBeX#+pn zW~O8W<4qL&)pN=|AJ+q9(&@#Sf|z&x>q5^e^`j45+>AErSFe{Pd)GTPhpw5~ZYL)u zut5sY2M|o9-=i-I3GegFOmWh$JV30oah8&n27vEfyX&IJ|8^hFd;lDR{YocHHn6Au zN@8GX*68o+Vr62|Yq4dKA+cl7oFbZ5zr&-C>gRpziu6@JHmaHBcD!-BJGKzL+vCEG zc&O_e_R)ik-bJ56Vm)vLvtaD^pNtkj2Ja9;D^x}G#>{$Av2dgbWxQkI?=qhdD@-zU z&|1tzMwPMhtBaEMID-e%`J^_Dw?gQp=0zFs64y$XAlwOAo@fe(Ra7oKf2bOtHU!Q- z#OhY#198|i!il$cw%-dcTjmfi*kdb!zJo60>=-3aw1JhGnlN$xDeq>YAUs+B94ltS zG3l7@!S>;5(ch^_@bSh9wnUlMKRxVqDpfniGJ6o=Q*8n8ex`f5uw>a)5|h&*DzXVh(ZeNFbCI0IG)n`W{?+gIm8W}3xYJVe8K zO(A1~<0eMZ#PiW|=6-)psN(y1X+LD6GyS_ zz3G{MYBWtOX00hRbgF4`exX&{trkqk59kQ=DCdlvHi`TLmjE8)r!P0n**T2!*m0mi z=GY=7^=}PHLoSrmtQJXW*dj_d8Q72TdoA^?<)(VkM6gA{$J%Afm#gz%ew)hiqnF1U zVSXESo$5ez9QE<>kA(|E!0;n`as0o2S^ zdQA}T#D+dqMu1Z1lWU?2gE{h#psQ3`KiZ=w+W=4?lqGhnndl`V?NgNbR-$zf=^ zTbnnJhS6#>&M-kymc zcH~XrTA8|kj~NsB#hIpY`x=a#d)T0JzhOA3+Y|$Zkr91^d#Oi0+bGjG{HDB70Q*e= z@}`tb4{Ya3+05L7vNI>O&4hMl4~zRH=ZAqz@!Qo*{~G!^t1KBfue6hvc%fnep`DNL z&GGfkzZ=Q(s@N|UozB&4BrJ}h%TdM{)A-?`#cVp+DnAVJTEV$BN(8p2D@cJZq;wN7%BtFc zuEx0k@pRbK==XAnX(6r+q;??wsOIg>d?m3@3xWUE_%t^6yYva=f3@p zv9+UAtL?cu57RKtv+NcOw(4&b56Akw>E@ zlRh&_mAiMH6ARp*eRl2OXYsDwY+|b1T9}q(MaWNNW7mn#F2z)6Jv_Fml&H46OH-)Q z8XRYr+?&;CBwTtz%zQ&*?v7>`6AN6BKXuN z`BlSr&=#zyee2+Eb>{P(c6IY9qqp~@pQ7=|w$sYKIeneCnEIOK&>i{A=f_edNv^cz z`@^Y}sTK~1kPcEppy#M2#CuLtD|!n1YeW4&VTOx|+*ocK(-IA%+Z@jmfkJgr-QZsY z*wJ=E|TVsI(z4K58FpYuZr`HSg2)KWy38F1KkV>|4TaA!>05>+HAN z2JH}JK-aR%gT+2mAOh%IAb6wPN|uoK0#`~(ak`w56Hlg& zS_WccF~26$Jtw@BGJQcr#ppFV{yDc-acs;Uwhi;<(y;aE%5ld$i^oYacS<6BHep%^ zClQ~Tdyf=vdxb4ua^-fN(iN_e!}gKN+rs?3Z$tkF^t=OY;^$mE*&X zN5gQ=CH0iGel1z0A&^`ayc!lVI}#N7W8{&pa8iZ(-Gz|fw zv;?s7pBGo;_-e#GB7a8cUt=7=;~y;J|IVMp#6F?@oiP8io5~LJ|G7)FM}Ry%y-*ph zRyZAJ-TTwof8jTfKlii>71n|5kiH&E)w-!EZH(zZeGC1mO0WsfYhw-AiEp%A>i^fV zAmwQ`mDAYRsPtx3ePPML;OLZ7uBp8DzhN4r=+fUQC@Fhdi+%?o03y}D+0&&ew5Ypk za1dfS9n!4ESoQTS&}0pjgN^O%UUOoqYQB2)$`JSo|I<|M^Kpim1;-IP*Dh?xUMpbl z)m8#Z;9J&v)QEu?7#W!&A`UDsx%kXXT}!=Iz!1d0TfL0?r!T|8GIjF_hMB)QmqpJl zy(m%=O<+t;MXdbHsQLt$p2iGK3pQ&s^FlUjr2pwg@Ih6+ik0`gx|-d@x~7K1$!+s@ zIAz$k=zQwQsj14!s(@w*)a>^h4j(jA{;q-hpJUIArP-2>jRWL!=_3CtTg#d! z88#?UU*D)IIgDC>oY{7{eZ)yxLF{tYYO)B^+S0+0pmGt z#4s1>O4mAZRf|Z8@*<&4+GH2iYjyW#4&0X0S0frv!LWk=-vL?VZDL{~oc|758wrRz z(I`TWUUJi+!9gKQOFAeo8Z4r;A-)~&dtWlR;FOk;!N^w#<{w@tM(PH**ehH94a)5B0wB!IKYJKIjhJRe;NF)ogz5?zUB2)viU#46` zmUA|fKW1kZ27j)ZU5JNLJ(og!eTe<~7qQdnKSeX0R~gOG8`j8L^s{nH0&*^njFuLG zfPg?jE*2XCE*lHfy3e1#DZTi+P&5;*xVRWRJ9c`O28g%zfN84Y$@=MeUlO*J_$?wM zg9J)yZF*nLCak;FJEwa3st$oMov*w!04f!sr>CcvvG%k~Jga&HmVc;l`#0w$W*k2d zLz*m|+6!zADePm~7Hz(&#-ltYP4DTXKqqot*9;ui1n?|tW^$c^)6x%r{v7=3(CDwX z^Y)0{#POr_$qXA%B2G4>h~IcV2ZZ?F1)!isdneEA%3@t^9lcwLYn*Tf-+1GT*4s2ZvzH zhjxQ3to8vJIsQsIVPX}|FIyj_6=uX}TWbqGFKu99hFg5p)$r4?u1JHbHBe78C`IfB zrW|Te=Ll^$TDwzaKY)NT`?JzO6fjrJdR|~l->>4Ah|BBwG>4S3-rA$`MY$L!w`d>k z+Tmy`BqA1r!~E@7Dv0_jj{SA8X=hw+UmP2n8GO5K{dBo2C=O&*i#tN}iE^Lgd+LmX zN8z*NHVeG(W@)G82 zGmpiC{siNk;6ke!EtyMQXrssulAm7tYdN3+Goi6|@4UHlV1rG_$QGnYm|_#Zx`n@E zvAUvc(jHX}pje^*+!KFev@3;kHt>F?7t6aty3eKbFyCK~)pmZzTI9>7KX808v-W!%DzBjP_f&@e*I#sGo zUHnj81sO|IOd!^rEJ|@0^`k(bhFoZMConeyS%rJKF)XYawVRe64kMc(HTJzqtX{Z{ zOgT0U{8PjD@}G7piha+X(9mO&c^pd9VeCRZ;eK}9VI-z9A*|UO7k?K~a~l2H1d;4u zp(zL$X@`>lnI0x8vj{#raQ;zfooW#*kbiuAuposK`drwzY_rhy^mtR5*!tS|7K=FM z4L#?&#vXz9MNKP}!;n=dC(g+n`lpXamj+x&)w`BPIarc$n8#N9`qLh4{n8a|2x3M8 z6;c9Cm~XQGpzQsP>VwwuPQ!$C943`T3H>Y#7q&&>)1;2*3;gqDB%%wMF>zS6 z>%*?t)iehAW9^;cw6`^{^7CC?jHqta73OW|qc=jIMVvx--4YqAFIy84cM7vKQ zQu*bEu+lHjv!5m*gqqW_Jai*Zek2|JiI7%p7ydY2Hb1_TuYP1RPFOW;tlNXI z`b~4+;q4=7g+*tHZSy0x)mMdJnezGPM~{|akB_(&bt)KsdL3bT>hcjIo(Q9)U47{^ z?E~smTjFkLQ7R`$>DwQYlOE7tb9f-MR3g~ndiaRx>I~0}YzAlSR)&YToL3l4)ivbm z3c|Ka=uR-pH@73GQJYuKF5M9{u02-ooktyfJ#cD}aC%dG728W;>?JKoo3`t{Of)*t`|R2SyP{bBZpmJ*a{e+b*|a-iItZDY zt2w?W#!VH*CGKY5d_D_I-jCe%l{A%?5_`(}b<_5hL2mB;!D7=>`m5%dst|QdqZY~@l6=!+3$Ru7p^!T zCKp}8-Pk)C-+*9|<@fUutJM+LJj#5Zlo@fR0TX||g54H#GEtMoXWr{*v!07%>-vnp z^D%=Jg$&p6Arf>lL8a;?k98!D$-8eweV9{q?pJ6IB zAtC5|cX~bIb^CY&qjn?4?sSEur)RUZwUoWRedhqFUnFoyu0sEBh_`QrVqUy~da3VI z0R6f8OI@!ItmCmj4TkOlTmljxZ!wvt6HIfgY9>-LPED(p?I#nnU_;>2ee$jc*J?g8 z0*OvPT_lSinFUGMH;v4&nib-khS$C3y4WI=YU0T#HFhXBN}q*o{Gi*HI7mx5FOd z_&RZVl*|1k)`_H}AI`2@aZ&b^x4W((eOVgTjzU?tgL#dk;hC(fWA}y;;?<5zwoB*X z&2;kN?je55vB{8`OfZib$8-XcfcjGp509|O$Pe#|CmVpUh726Qz=~95ZJm1JjVlJtyaOg&yMJshWO$N4T(8>Pe#-Jzj?& zTlpYtZ|<`z*UXrUo3YfZYnbvYNu$J#tt6d!%7Tc%vvJ~we{Psm>hZBgXm#=&wgjmjByX z&L-?eHQlc$h4H)yl}kHhEzf8BK8WTe?{mbEQl$ac8;H4hKS*O=Il8$?0#7mwncmQx z@BK}9&u|=)6ED$0!K zzy_4~GPM$ZGeb-izcbvsVXfP&7>KCmc2hJZ^ zy#g+*w>miX3}*WnaZ`j)jL}@D30>d{Lh5}41GR^pPwTDkR&?|O;rh4>fmDC4)?)1l zOR3G%C6ZL|1z5}_!T;uv#H8~P2$VjLz{XbPyz@@G*%@(ZX$fD@mmg{+o0n+%$O|9I zVoXnAUB{^fCSF9|s(_4JoG}(}7tGQ_0R9ASpZueVC#Z!?KYDTlKq@esItpAnG9U~8BWlc-4*#2peGTx7R8Cu8?_owY> z&ADl!i3Jqd`4Uz(9G3+u&>mY8~5r2ef0y^9@=H_OOp+TqJ!>rzG{lw@8i#_^qb~ojIkL%LhzD32P z76V?f3ExSp>eNw9qV9L%{4v*aIuQWdsB@d8+cK-9F}-=#dR6pIyk`SfChh?XN_`bk zk!Uq$T&`eB{C@Vi<|)wxdGWgKW1%T6sV6_@aF3hT6j~h1`maM4W?Iq@U-jATs%8xw z2)Nv5CE_yvjv~FjQ5HF!N_ryE5C;nn)ltzJ6Y?NS*Yu90wfmelbzt^}i@SQ&R3E>5%!_y=5 zy60clH>2iA#|A5(m$3(Rqat*{Z1G=gmNTPYty)YymUw72PPRv05Frd}_iU?Wb!Txt ze|U4GMeX8N$IIv0{b))s&SIB|BhvWSG^0d3KOA*RbwWJ&*p-8^JOicUCVXm^TupU^fGd9Cv78LdI8=E^@_i2cMcuoxEa`S+ zayKu)gw^c~#LFc99<>d++)%b18%vA+77U(9d3kxET61~L;J7(xEq{zk^xnu9^tnAd z(opLsEViXAa?^N7P8cIrxLR|2)(ouQUXl-+j1pE%2(y1gctDc<=u)waCXNWBre5?` z;4p@Xa0|9C;pfc4Z_nBg@1w83q?|?sR|6zQxK?7O?ya^yg?S|{pF^l*w;_zy>Fb#{ z!9NBbbJ$iqUU80TLZ)ddM)Y9nun5}!QstTU_Q!~f=n^%mBveL@MDkiMd1bix83u%e z;C)nj?Cx^*e4MLtI5L_>MBB}W<^U)f3=W**&*TF;u8y{a8?tLO(e6X_C79q3~wlVxv&+zUa5W`??mmZV?p8k$V`TrhwRsJ zTgoOYHbghtzH!drWV5doQ8C%k^?n^!5!s^=RY_)2e8Huyo=7B;Qy$x52rSBk>gZS3{4soKTamM$NZpoy3Wi@hRukESKzv=smQG*(H- z=gf3h5k;NK2Nw*9M4s08QVjiIG7+Uj^ghvx>*!}2=5y1&$$0DyTum>5r$>B6+Qx`y zZ+;ErqdUYXeNxx}kT>J0B2qFTHwdEq2H+8#jyJI(indhjD>_<5GLAK4PJ)*l)UP=o zEbR#+P3JJk((B|~=b~ts*KC&YJi*Jo{Hm_c6Cc52@?J)3#+K&ci)5H^EI}95=_5=@JMZUMX!xgac>IvWN z{k94Nvk)02MgKH-0kI^r4OHxxjh|CdowgYYogbbX!pmD(!oNU0;zJ8`yLr@u;EITB zW5+!yg|C1^gZ2g8QaSNqb`(vGL0n*79Fcoj2IfFo-y_^b{=?eb-Zk~Y55MYirzyhs zr;DDiN(Rt)5URY}=sMniyH)2mVtYUJow075Rry0o7m*1e1)Vx&8}m$l@HTC)=C zB+@N;;Ya9?dtQ?T@_4>yh=5sM$2+oQ55w$COhdKPnRL4=NNZTmBA@k6;=fRUcU-QI z;N_)^)uVXvCH6_*m;i`=3}X*Bq8U^UfC|<$fS&h6P}jU$L;LmX3QW$+?m*lQA7rcp zFwzLjk1hu>3ZK#@wJ10@>rUQNfXu%8JT>by2h~8)9t5c(^IXf3Y-BW|ke+}VYG>0J z8Li>d6}sotfZrD@2XdVXos+e&!T9Z76V2o~{b~ zJc0_7`Zy@UJ$214>tO4SeS{R?< zD%A|kD_=RgU)V{;x8&;)Q{=YwPP^zT(haPthrdreG+T((Il6m`S`XVZdhV^2Zg*q` zCj3pz93{wv>(?Ck0+S7n5ebB#QE1+CHF}BYn^9qQ#|`~!9aF4X<)iGggNq&4gDgv8 zwxolzWfIHpwx*|Z?VSpI8(9bYZ%qjKYd<;+N*7{d=t^pLOe0mb+=yR}R`w;L_ibL2 zc&;b3m#>_IDyu}#XZQzL zAXlXp62`qk5v>krjZ=|}e3{c52ng?uuJLyb<_To$6xG3!3uD~tkDnTQQuYqME`o>* zMMw~9aHpJRN|iJY48LJp^bbHV;w9HMpdJ@1qm2`TxPeMH9V?lq$_+*3X@ zC60(c9s>v|Z1BDi`>Tu}ybAmh)mfSd@axgrW(oNRN3>IXEu+cET&fwId&tqTYza1QuTmqnQ zco<;zrh#%Zj#VECh<$}Xz;nQFEn~$K2U#XHT+Vj|{}_WGTXCvCaACu!T2x26>-$n- z(@df|<3%il?h=taZ6iPMPk%IK3i`=xjw&C`fhGIsbD|Tv@oo-tIc@8^*cFcGb_GAtZ@M$?+RBZ)=IrS(_IwJN@nxwIy^4YK z59RQxJuL1GCJF=wtab-zb*5i6Uw5Fu$l?fKH};>o4~g(=0~v4!oZD!g@LAO$l_Mf* z8PR#3m`!$`2}zZB?6URma-)`CHHV$($1c03Q0M5RzwM>x13T7+hmg)DCwY3}LOc1W znQ{`hXv47lbZw~4s$LBy7ut*&3HHH+4uLZfN!PXZ!Gl7YhNfM0HPAM;a8+Onc@3{@ z&#vj?d_Uo!`_2IGK|DX!fhUo}%u@8!_M$=emlWCxG@IlDn!%UF&Y|!gqcVkS0u=C` zNQvDEb!KuTA&J{=9cJ+nJJBngli@8J5xji%Q%4*-c<&e$=VT&rnv~5R6;Gg+9i?9t zAi5G?Byu?u8Nv5|cCCpEbhqr-=`(brm1^}Bz+`Of z>+54j3eX<9+vsxg9<*!06CGbbVC(pUP67?Qz5_Q!cjuhyPw2z<-2&|=@y%D zeB9=_MPlzR=+cN@Q2f?gLf>?XY4=A_+r`xtL>7V+no^(s6m9{1z7T(Zlxd*Xvbd-- zsiF+zf>fUr3kO!|!?U73^?O(3U@?MUy~Hy@zJLij9J44|JOhJfF<;)AmEphzwSNk% zBD~Mj^VKanK3Jr^?^~-`3=@g`!jwZlq3$Z39ctnS8UJUW7PWbZiDp5Sr8oF80QB4O z#q0HBnz`-~;oWHt`Lr8*;9@bm@~G~iwLI-|BCg$&pGT=v4#8BS^5S#1Z7HBBUBY9N zYRC^VizhN2B0WOS5igb%3Fd92&e9n)pkJz`Zc)qaH;Q*LE`;VoSfY4wv6%94edh0Pg=5yJHK4U;hXO` zrQ)%b?(f`l`@nQ=rY=6c0vGz@8nL`>^iu?aqS-VddE*p`P@yTjf9uElVashnOx6t# zKI(HOi%s9c?QbC@g<0F}DF+KL5}FC0y*Rt_Txs7QT#5az*)oHsoxa#s%{$^5d&lS@dBd*>nKcOP?HwzZsmE)e`!pZ7wN# zJn|0UmCOYIItXT=21#@F;Yw#vjnm;HBrLKg4%mPuHQIF75X%0dAL|nY5HM>8fB$}M z{}OE#P&WW)x@RWXLgQ^OAsfq@+h?{cfe+GlZ86IRpY&d2wnYs^)9EL3WhLHM==x-n zmB^38htBPKYW^4(?fmjGP|GEgY}0K+iW;_byhcJzzWE%!>DoznvTDmOXm#F8ING@W z3$aJs-QbIDvUO&XP>K_d*1jk?%FMN@czckZw#Mg ze4c0JPDRG^fpxi-Q2310?R(Vw#kQjMQc)6~$p#1&_KNcDpxFVH-G9HwM&1gjunHB{4jH~FlBTDtjr#yWRzy~>!ENhQ! zY(AG+fYa_xx6v2HYCwPOJ{>ZH(9ndMn=j?qBtkEkxE=A-6)Gw;^($69M=@VZ9Hc=ne6*(2n2Uu=AhlD?_&X-)X^*5_nh*mek z-pfWx#c{IYhznjVPh0Q#9##mmtVcF`{k~N2LWxdyvomh$M2u35Y)+OCb-(UR&riXL z;4~#R5}27iF0oO^vdc9pT%?tLVMJo_g6{6;G*RvDUrj$u2FT6&5jCKjXg5V-JsC9cvzprljmW7*Ur$jN5s$Eb`p9ucrr+it1d?eg>E{ zdKMPvNiUvv_4JOWrLr|aJ>BCBAf}28hMZu^;;$u3MM;SOMsI)==3!GeUuN(DTw34zKfjr-}jI~U6af8UXzkiw8vH!t$xl1=EeX6|^dWr#4r33h@( zAW2`1%L)B6QBj+XLDEvG;&Fr|zD)T#{NcAYMJ`@yNA;9zeK$2M9mtE#ccp7*hz0LW zZa-KbW0e0_&wRG-+zQ4|-F|H)Ji- zZJ@&X=t(O7gQLb5qEyMD9SsPmHBQ0=bZ5439Gx>03nERhTt6mJ#qpFQzxd1o_#}he z8sP{2ImWfMwLoQyL$JI&qP(KwLt!CfK|w(W({Er<+Plc8s5_PF7~vg6kI)8s z&w&C5nN2^t2O$l?i$A8?y&S4w<|CP+f=gv+W`o)3>f!_f=rC#GbV@IUSe&~%*@7Zy zu9h5%#)C^CqQV7Ye;uJSvFUs50>*`jrU*Tb))X3xZ;gvb9+0TWwutq#J*35!+bS(9 zdj?cC<$#E0_M2R_avGmRXiWh1Xn<;gHrtl~V+`c8r!A@gaE*$ZngY;)0PX|_;8V7y ziUa!vv%zxNeq^ zj+LPY{^qWvQ(+xkH$}0&Nb^YC7!mB3_$a4?Ajp|QNWFa$!dcH{THbG=g@i;Fa zeS75Pz*~+8CUNA02VI})dZugWAD9)JvGLU}3Iw(uF+D6DC_kUfrhKq}>qBlye;}9N zx5>Q^U#7hqSZP%$lCj<&BY>zt<4lMKHT&2jCFm?^ z&6!=xX3)y1pYe`w=gQ9k#4P zSe}xLDiGMYA@!(~m6yQUy47fCuGL8V?vd3(vkPu{Q?pkIKdit^|NO00zm*R1*$`<* z-2SRHD}q-g-b~XB!mM9?o3f*-BGtdyUcJiyd?28#vO)|sqL?d9{Gwflw#kEj)g*ox zi?sqwoC4#YLn9J+aQ{Zv8RT>56B*!d?h5aVYc`t9e8?+|AMa*9TEt0Uz(C?-p!vW2 zrQRpQ7aV%2cWM_!T#|UU7G-;CF zDO!I3gwTI!D?I}PjHmMP07atynKM3TWyuKWvi{E_$CQ=fTHnlq8sO^Cu6Lmf;_pL= z5gasMO(QL)kh6f1Q57wUUH}~(T~$Lp6+DxtmT)3R``>>FZ4kitL>akousvLpbeDf zzxwyN0AxX4z?EgvtbxHG-3zc=&|=crC#FZ{z`#HMb>O^+9%O>0lyTKkBG^G<5`*%| zg`zo9aR11~<_IOE$_qGimt0`w2a|AP0vKsj$l7m>^8dVVMT*_oYFYg6cf7!j1ARHE zJOhAziZH|98v1|FSr0qkP!j(~fEH4kWCk}C^KY(lBGGTw;(v~YV-P>$yw-~cQC|ZB zfQ$yv>jgUcY0gLMn+uKn>eZHvMb8v1|BW1s@(h)+jWT>;^!W~-?Ynm+?pF?g0;H;@ z24quF(R|@ysq(p>fK&~jK0CR(>H|J>NmUg-_fy67fAhrh2)zdZiD((fCO{b^fTigf z7$^ZGICvqX(F*ohpfK5zArbky+EVLV9Pm7#0Af*)SSv{F0m&N~5ca+irj;otifn*1 zG(0i!iJ7f~LzfpE!a+a#(AOC$_19&Kfbu2ylto2=F$H*hkZ?E! z1stH`Gx6DNJ}mnA{9m6kZB#kgdk`ouQvluD!NEa7PE*`?4wJNfh6#}kaAB7B_rsuM zn%%Jf(+Q($2@H0ym7UT%L%^v10UTO)BuxxxSB9UgIg*++YPSnSXGpLjdwvM z_5AXSnn?FgXA63~P7J%#tubUU)r_n}Mnqf&=c9}(91!ab2jZ!@2m=2F@uas{!`o~C zM1AD~Rd3Lv)CF|u9JzEPnC@C{Gz=!C=N51Y=7bQX@l~>b8c>t}-V+Ip2qAg*H!5)I zdcR5;Ue;x)J)6hZ8?W10d6@Q&6R3C|?=OgzSo$qAx~2oR!HZacnhDDP@0g|Z5+tzTJ+?seQ1F@c!5IYO@8>cyp*$7S zWo2d7JClrn({cB=UB&Ae@4*Cat28h)ep9aP;7~Pv2bKd4%!-gSRm!DHu1$WLw{DU_ zu8l?-AZ+(7`CtP1!TrgT@UxJ~f{2nLtQVB32^21b`piuEe zC_yA8T(%8zI4+xr0@v9LUcokn`d=>74#;hrFEkJV8Oa*QeKH_w z3yC{C7Zao4;J~f6oX1gNodq8U`@w@?u!Kbml~>D$gxbNB;P?j6a>2sSB-yN}s_KH0 zUPG7&xG><3Edeq-rRX63lvHroPZhn<=GI!zV7`}z%CYT}{L7D*9phW_l+8ojIPynZ zB;5EiJnx4Pye`-)yyZE>7e@-MWitD^%&FBjlp5ABBvKM1SJWP^=Ltzg{a5t!&nbhX z$bT0l2tXH0;fs83hhaJ3USk0EB7~x~oU4Ho7Z(R1X!~lm$|C6e{CpI{j*p+8l8H&i z90_)pm;(ifK6U`M*S-7qDR-d5saF_Nm@&lZg$};n&yTBC)J{G%A{V`wHWa$5XzkAT zmls4=NtcKjZ80%xz_nIVMpNmXXpEkIJ4|`cGk75|_Cs0Ce*z--DtZD)Gyq`d`!_!8 z#`ATY0LTwfvOyL4DxO0^xvA8t#+)gsEiT)G zr=YKef|-_6Gm3&4|Fzx>ViFP(}=n_Yt#dK*E3Br!J|gtxdK*loAHqB?Q2J5eJk=wkHc2NNmA<0;!Au z+^A1}J_EFefI2v&6$g(Fh@k9xUH#ccxDq;ATj9XofRlh84R|1@LjRqRd=`!GtOZj1 zYALKhCTU8z3G7VwyV(YTz7J?FJ}Xpi2O0wyBwQb&qm{Oh`QRYHHYC*oR;{jq0U|J= zs4$&C1Ggfy>VfqF0C7W-AP{#EaL-q0{ChQRKn)i1zsGFS%{yM8#(;vbe^^*Iz*qrr zjvSY_OcH=%E`gRcREhvQ6fnPp^emu_9K18IhAV5(1Z5?t(CO=y1H&!S~eGC2sf*M+tPO#{8`Ao?$;sE6akF?R`7A) zAPNZ8#V`H-Ux!w1b5nRs7-lWN=HtPC7@&$&;NGa=Cpupdc_QSw~x}RM<=cuxidy-HQCBPY>QmLwkQfQTW%y{TpEcwr^*8v5U?T56fsH5xaxrdM0Nxt#=wV-0l*+e;~ z+5*d+8epFRw1by-c7gzBQy)CDQWCg!iDYNB{IUHFKeik-jvJMXc^(J-QPbZODwx~9 zn@4o7Ag^2Oxk2_Tgd~t3^Vn_P`*oCZn+o(;oYp@Z9gIpbL+LBXn{huTEThm=8;2NP zc1ERsw=Xy`4e1Gojy-X_zb6g|7IL4@lKyOln-XhEKc5V~SDaXVlvbvYa^DDqPs{}2}{EEs8p4+h!^%yPm7%Lb23P=I?dv;;XO`GLJUFv^?FH_vdBur zQ3A=tks^nFUgpeRyks&TYm)89<+w)a8^orIb&}H0$?#a@LeD`|7P{JH2RcyliynaV z;dc7X2n7wT4QMhO?EFs>7VgXjK(=3>+-z=vzN9ZOcx z15|&scbQZG^M%J|IS2kd;L;72RgkIJJ=Qf)!n3|JtXbx%}F zL>_2Yd`&u6W5sdjWR<2YS`|5ddHrSJ`0mNV#}S1vm=j)p5ownj;(^OoJSyK1Uj=V{ zG4QcxA5}~leIo0M8=ksLZB2P|AfKbhuTg?>q}WEYnQIF^&h^!PGuZr~`Duq`-U<-T zC)aFn!UiQ}I~d^{?}2634g|%mLBRn@AeQ|{0p+W})B1gi<80SAwgL6_JNN+4jmpf- zeDf&cw9@<=4wS-ujLHGRMoU1w0?cBOfcpxCLoCC5A^Lq`^GJw4H7qA0fic#&EP2@#SYpsB`&)Z`g=kS=E`7#4^*b)%p9kl~23lS~aHc(+QXHyD-H9~j ze*%Y*fCM_#ekCe@3;A#lzjqZvR~_2C_q*xme90vPLtk&6rQ`9jmPp`$t0f8oq#qVJ zq?APo=5)>1KZC%BD*=ap1Gw9e7ZeC0Cwow-2mRXCSav!P{3x^Ul{#))m}cF>tFSF# za8M$e+F$6XCox)*|EV;H0HK0qzp$&G4&Jt2&9c8i1~;7&oCGrb!D+_U<=QGj&&sE^ z`MIF5jXkl5X>IS!xuMRYMY4xf=S-%H%IOa8$U>PVJ1747KN&a!zZ2lOK*(-*S3p3Z z;|JRmpx`LxD`N~Ka8JeNGaB32*+Gq3@Qx`h{gU57hCV=*>~M1=9bT9mj8MSRpalYL z0e}}m$e>&R0kH3pkOTon>LX^^NC`?ty(>`gZn6snjjv)f6wL%8AP#sEZGAL^BRw&A z8~H5Q$OL{pL`h5skNDRI$rLpgJh?LY$`xCecp%IH4bH6rx)$hYjpQjY*zHbZgB<0h z4A)WE-Mn#4P0fRp+iT?CHaXy8r-Hf|s%}FVW$n$TQ`4o~uLT zb1Z77{oZVCwjFqj0R(!a?t5TB?ixYp;806Mnwy23i2g0Ov2?@zFSR}sg;E01Zcmx4 zI2T7~<(oa+A-*HHNmmRv=^R1%2tb4;`l4G^3-#2jk_Hop=CU<^V3vgNkJ6$(uPeWxptOaZ; zA4U|TeSLlPj@Adt0$NsAS4)A!Adq_N=~BLfkKdA@m1yl$McZ{^jLIN|ZsY%r#+jbw z%$~cH$X3U(y}mfc|PlT*~=D+b5O`(+SpKtcm-T-mf}#Lh?KtR1b2wy zqj*>55AVisuf=zP;6xgIFC4R-g;!0262tPd=y)G1PpS4m^8J-!PqOqe+lj;F-4}#B zWn{#e2qENZEd#||$v0n6w@-6^TQ+h3mt_-PUj(&Oa7;eqOCX|B0>nB?Yo7zz{-?Q$ z&vF$Z`>I_g0+2{|H@b=qeRcum!FaKbjycV!EJ99DKIGLPnJK?mtVk~q(!d3iR{T^pzFt$B(G8)c8x_@LNpe2A@>CGzD>Oh2NFfh4AY4lfnt8VEpC zE1>OCCX{yx5dcAp4JZL30o#L#>W_YYD`3+7nm+m*K)K)UDB{}ZY3L6=kBI|kdGZ^gxuol#& zrWb8hV#&xY`f()Bu+|p2{$wuES^TdD6PWsTU-8}Zs%{p(yVgKG9pgqYE0hpg-5eHi zCL14GP1{p0IOJyaIOwV>qr+m<8|LQr5Utnw;!1L6N_bK1=h_q1h5pWP#?sm+w2vg#RFFy2{sG}mM{@OS_Tw5NI3>t7C+D8Ek(Xb#BKa;w#oJy^0@j zaI#D-RS?_itO#_>pb2IVlnBR^{vr#Kj>Eh(kfe$7cSjXd(Ji=ADG^#@8oPDHTlorycKWtY(ZRI}jU0r50HFCGwAM=88Yt2WBK_*- zuwdvUwf!kpRIaXja4dz$FW*E7%lP&%yaiI|-@MFh+pmCu~=HY+)(+x6MmQWrNQQJ5t)^ zE^A3LuS69iy%rQR09XzXsR07_s|fAd>c+-Lkl3aJ$PF}khv|Zd5B6LzH{kICw{jY2 zQ-I~-wvptxw6zrg>hfi9b6bOMwK%!^2hbFSG#yJyN?Jf#e$v+&L@)xhWNg@@Czo@Z z&c9t@h<=JnMgv~8JoekTkUG>w8HE?r&3GW-^jfD&x%#;n(XWT8dD%b<>EQIV3vjRe zfhWV(tT^aO$t3Z$&d!p6X8NZ>h42qavM+`@v0uLszHoQaA+LK6^uN4y7P;cSXATQ9 zqfW*sqqrR@bS#9ne;DR|!3Ovoo{fE=qM{(;#+hl8CAfplrH4SV1SC+95LnaI4}Jgyga0kp4x)|@bgj+jYUJkbDzR#7YdZmN ztL5)+{n2>&`SpPn4v@N!2q}DAH1FZ>_+I8sTOIq$m+n*!1hXJIoWKo6eElBv4kS|( z>G(@CNjrqi&iFKbgHIE>7)wnRVdjPT0qxSjixn9qK(vMgWr4r58T$(P|hP zIEf-=#O~XjwDi{Sboj!Ap6$)})6H^zPPef^Ih?fYB=y_v{UC}m(G*ocipqnFRui<9 z;DU;BI&NN{+QR%d%%^1e7;Tp`Wg9bfB5Z!(MxtH)o+2`uB4dA zA2vK%kFS1Q-P(TOq)C3pACc`#VLxM;A&rUTA?!_zFx#Hz>1cCb)*J}To`b%9=Q{k& zV9lD=Oalq;M*zUq1HM5ykO{FC6La7yeQM|WR0<6 zD`yPx{CSe<64CjbSz6^>s{EI>n)SA%g~Yt8_2EZy?OEqX&#YAP?hOyHcp5a-vZTb_ zce|NCF2=r>9>n6J8<$`iDnonjS3@bny^$4UXgT0dH?uMSjMc?YU^~Y;Y{bZGyK3wE z4pz07WxTyx+H#gV9qr=1V9bfCdOOjIW&wr!uUkk*UOy#x$oV!_a%1U91btlz3jN

vj_%HS3*-LUs^J)WB*j0jfM4xobNIASa(yAEy%thJ;YinzeT^n#EZTQ7!=gdx>9_cMZ{|a<` z;9x*R7Y0)V*Z@#gzG(Kif%Kq{cfWyONQ-c|I<^bqL$jr)Nu4{)mcU7 zzxJq6h${~Q-Y3F1h$1i8=%@vhiOU2t!;;*vfw>?5VwQuYtckEd37aN=b7r^X&1rjk z`$_R~DH}*!XHwJO4i41t44iV@M6lw>G%dfV${m1(1c@dJr+%uNY(cy(8H zI)gEYpEMe7h=%665HQ&+#D$QXy5b*$AGC9ZAPeN^9kzfT2EN>OUY`?N4{vuSk$Wc>d8C zp^(P<=LxbK$L9=S-;5}9FhuYP2==6vP0hJdMD54g|3C!mDcaZ2{pQfu!9#kL7;ND` ze}Qi~Gc6Z)?r;$KGp|ea&h#epx41TCQTB zd(^&L3oJp*Gfj5=!CPT5iw|x1V6c3=2T>#e+h(N7LPOwe&K9(FBz>uD$5ru-mjz1X z6C~81kTGD#3M>7c;`H{W)R$r;9Xz{Vn*OtVZ#hui*00rJQdM=piQM`2=1#3vV}~Af z7VtBI7B!$gW$8R01%|&j1i*s~AM}C12>N%&#m??Ih&r7=-YFDo3j#)_goCtZgV11E zrQ#XX_0c~mB$pSS1PX?-qft6v3Cy#;t)lm@I?P}qC;5{(!s`JXr;rxbn4 zqF~M@3QFe~U5$4d=ZMlzfag(=d~r+`2es0xz4Z@IPckW-+clx-2k?gLG$g{p!UE#! zs^(c}G~C=Ow@w#7*UE(Svt(0>Jl+0)F@_}+y;hL;`fw1EGV~==kA%@5{ezsNgOGEP zDW~@m{`TdQ(ay*Xo@qQOk}NHOZBM>UEq~-XDnhG7ipM$J18GFd2E>HWTNPgQHvEqw zu59mU+cWb#oV;xtY`JgHRAiHG`6@4HTG2#t-Tg0;#6`Y}OZkmL^lPQCAphRq>Q%A< z$(A99d;FwJKQysG!4))*Cj&r8){aFVtroYuk}Wg&)&BNj<-`p2EqvpvxJt?@yu_%7 z-UFp^ujouf)0vr;u6Qumabf!l523%Wu>N0)x@^cBn^dHO|I%s#_3^WRp$fo#Ci(GS zUm3x1B`G5W^k8(+62e?r=IXP%jsB2~x1bli| zK_a@s^6%e_jCM&q0);1}J>C^c8U#{S3VwbPh!F`=U4uSI-91d`5(SLNUw~$Q4bi_} zE(l4xRZgo$2wi-?55$krK@SgN8$&%~J1_(W>pdm}LSsTn5V#+|08Kcjvw25@8|t-# z@yP>6;o$Vu_#mydZSWmoh%P9h@}>>yc1VUBXH!sW@cpN(??h^x!&9h~ zEsS^BL_-4& zqc>nnRjsq51KRW!qBJTq94anUUbogPAwF9&( zKt8Y_=XwEb16+=sB3$zS>EmOuzLg0@b;pRLCW_7T67wn&{;t-)lZCM)cDbB69DXjE zkgKLk_ibIj)ZkdTAp-;Ui>KhbR0n=d81(+*Yq=wfw4RQZhEM10GxRI%kzV z)k$m1jEA<(=Hs(i6PG)Y^%k9k?)at;weMH`OQ21W48RgEfb7K*SP@W<0q}%BHZ%yR zHLDjQ!Bo}NSE5z4TYqngFPHaAFT)Z2kK3i-TCVj!vg*KHKS)hTKcY`l9BNal-g`#c`ZmSg$vy5+ z*VOxp@Itu1{XzdEsm@U{VS0_1YPwpId?AbQ+b4-ISn&#@)l%Yi9gQ_H)bZcB^qTV9 zVw2YR61f77R)&F%{h85xe!nCoSL>(2HwBOElAH~vUC=9yO&dcW&d<&^RCAKtWsF!C z{6(VoM%=*GmY-&8P*klM`C_hPFd%u8(}us-p8J20AoMx%SfB-3dmoI^IsrWA09bE8 zF2MkO<=5OS3^IBjLD$n3@QjYzAtH@TqW|snhA=3O?{Vwn`?@lG`9g`ys#4kdQqH!f zZi_6mbL5_`-4_G(Fx@h&doFtqySS}F5A{?Ix;G1*ddv_oi#0yj{<>wP+Bu|Ow;zl4 zo_K2zAA?H&O&s=`anvZ1%j}SNJ+~k0MIGA4rV;u4Dd^b^2|Zk=#~FUG+WsESB87t? z#=qb8zh!7ZWlF&nOB8f0UJ}|2moUvU-O<&`_Y3LCD0x78a=(tJ{`sDtzxq!$`Iv^_ zC>xr2jAsUgN7?5m)z;?m1@~O(lg@9lgNR-?2P7Re`HZbtUtenQc-&YpE*L)wrBmZ} z3}#l=t(E+Q7|q$2L3(%VFZ>{U3#=t)0J5;#9!CXwU=U&*@=pe(9|FJ>cY_WDE6{&} z;DahfnyoP$dNd16ZPT z-5Px(X6M)3TDrUso{HxG2>*L>93kH&}2a zHKN&CSP&TEmlho#N|sd~@2WCNMB-84>{Fjtt$3+0B@yvWy9!CsDNJy+VQNai>dQ6( zvoy&T<@m`n5{)G{;H4-FLiQM#S5<&)4nR?40Q}1_Y|6Jw=ek?yyYjchX0(MKx#5m8 zyPZ?=3`#`9otX!X9&K}ax8i8(s^2Fjx%8TMHrX0~HDu239eq@KC_yjZ))97G=ltWt zjhJNIrcvK`gp!MSKmA&P%wrWn8i9%?^q+050>lW`VUHyBgw+dPhH zHn2eYp@t;wCfn?m-GAn6VXJ|!F6`R3VMVrjlT@BGMLTuHCO7+CafW5qRi#WaEc!}w zU}}9M&cx$IlMwCH#>UAFSis9BGA6SfKNr2})lshmvM;ne%unbS7sbB~YVAW#=X3dld9+51%;9c<^g%en~NdONsw1px}2Cc9u4xVgDMmFN>myR zk%2r#2DIXUeC;qWDB8>P7wjAUc>H6Kiqx+9O~|NlmWzr2UzWq9PCr+n zmeC8-&-pGkS5C55lRp?Z-fU=+TNt}O9@x3YM%!wVWk0f2+9ead?d?X}ADKFFS4vj) z$$vC4hB-Bnxq>g zO!P_f(zlz=pU1O&N2(kg2m~kl%f`at3mXQ^P58glH&!l}pebfer3hz;RX>mKwi`>a zIw_nSa5|K3XJ$Tf(yzYrnQ)SYYvVn9{`%cAd^1$ow^7@v_#paCGzT&Mu$90+N z7Ru8Cj3rqzgU;%y-`}0-M@NooL~>}TB~;Vr23d@L4BWR5lTW9W{89UD+kpQxk;5$i zY+z_8wz?`sd3$v#|0EoqdLB1dxH=pYH-SR!Tl2}%1~*a4(dv}cEV`ig8iUT(m+pc6 zu3h}?nwwA5D6tFbhrUSlP2?6b^jk@6XN^vt8+BVZ^~FaIHpfUM-!;=>Qpcxc-q;p> zvP~ZCA9}n~``993AGN|(-o;FQS(VYo6DunxNMJF9Ish{_*14cEtu#WpZF2uZsjN4R z+A}+&8G*Bn-4l1k0JaSRr{rQ{yr`l@qoEBw59Nr8=GT!{2Mvo8`MU#?R8j|~SOIXq zSD9Du9f8f@urQUyCU;<4KzFle<*5LM=u=ey@*yD)8c}uwoKugVJb4ASKHnP-A!>8h znSv%WD*}?sPYZ>qg=XVswJwh1qK5pFns^%;ZLd^jXRg6lR>vQ*9jcD%hnC6C?9Fp< zs?LeI3C|3Yf=}JUe%iRJpb&%C+waecn*6vb`DKnmQaQ5YB3G=I(tVO#J2OeFQF}%t zQd!$JP>0F86S7k@6(zGilw>Kl#cnb2Y|+^2o04SZ2L*S_ddbTvZo|qY1Ide!i?f^o z>4jF4=roQ#JZ(fr6&-PJG%2br%n+FGD4b6Ntu)@9^z8;DTK?Nat^7gRr>hZ`|X9c zuUPN0z}sI48GZ21q-+r}BeV&Wa?JEY_rj7YD;(y*QN-BtK zO0`>A37{3i12j=30m`@T=5+RCSQP7n=>oBNWHsjqZyeo@IG)n6&daQErn88JTH$9h4l0JiQ|ij`Kh zpH2x(%Zf&d6Kd)22%mj0pv7d^`fA{^$#t8@rSU=2G8a}vSG2u|V<3}2dmB^GB`1Lms_r8IbrSj@g`Ts zI+-v*{em9jiXMTC9`1^qFOwNDC$N-g!%Wv|+&vtUOp95~r7jN-nR8 zi%v8V9jN^>GwxXX&4XRlChWQMx*w^$4*3qFGM&>WZO3+dUeU4b8?3lqX7Y0ggMiIZ7d!Hklg1?nQ*h<>GE0kw zS>?@_3y&9P%CGFo&iD$naH4XYi7f}~g;slou&#J%@j@qXnrBE{tK~z9s^r{nO!8+7 z3gu_7mwpLY-dq!Bs(O&3FZ7gFRJzMz<@vH{GUon?hp_YY1S<}}^5q02W|ZSKsz`(# zz*Zq5B7Xb06FoXQ>f#xeLmEmuxua_u>`tgmoqs%CB1*hhiJ2uWQ-NUEPv|NMxc$Z^qKCF1z7n|uch;yzIU=)DXW8qgJ*c?S;H z;bWi{n*Hc9x1T1KPFT+Z6M1h_rfo$jhhrwD0*0%@Z8_Qr}H{Hec> zaba?g^DiEUK|02u<>#^zKzj@_*&Sd;9FYOg0LiI;-ysYpax+$AbMg3SS53Bj=4bie zBfwy8A-V-bkOQD8;!uU70Zmqc|MyX$ z0dwfO#n=mDpo$lL7#lnzuG;%+Bv@EpzdJj-`}eWBZry1zCcsH8XFuw-^Y_0U{Fr0; z>mzn!HyH6>AFfmXdPfJfQTx)Ez5g!iq!&l<2AeW1FL3Tl(qw!|pk2#&6CU^u;k0f&s~=`A+UtQx+) zXXUzf?-9Us(4eY0b#6cvM5ws@j9@4EE*+V;6Q?r|(Il*fS1n0~FRs&XUGk_yocevb zw>1UvuSMnMtpPWCki*0xb7FI~$_X^E4@85+Y$R|2US8Cy@TFLlOs$t8>J{IsYDU40 zQr%o-WXM-oqviwu8J_B!yTxW@!2?(!s78RhI|rbTZTr+3-D$nF)Op3k!Jz<<@AH|1 z05CWVMgIYh#wmX_QJ)z>RKD$vm9x3g2dMKlsMS+d&E?j8=f*hXtWL7pbg!A(9#apm z#N!a1kzV-lNBD|ajv_p9-Xoo{B+dEzDR1U> zSLx+QT;=ck3eDKb#oH>Ovl6PtV-aG)-`XgZu4<(3=PQ>19{ z`wmzRc=h^!{(ClS9jSTnrhhbsfz)CRO{UK9gZ)+5} z1%)0}?8{X4m!6$1#^Flg)1&4(xLy#fsQ@oxx)(hk3Gt~`p9mj0q?;ezi;uP?>`{LxIJf{L%p6+>~LGJfi_@DfE zSP{cQChmr3!`?ryzi+>)nv)yt^5VKmUWcPpzd1X^9UIURGjccM_cd8QMTG86W0(CJ z+PJkD2%!!dXz1wRL4YMR2Ktfb09XuJTzs209$2#BB^Mq|DEQp+!ph~2l8VMlm2eFb zc<*~iS4BG@lGNkF0r)aId+G}Qk7x<3ICNjWoe(NtYG_%#Teqk-8J?Vc-w_5YCf4}e zf22site=@vfM-r0e9gIIM_gHdnO<;bh6Q~9OZx+O@Hv)3f>4B*1g++18Dwj*;C-09sl!TPZXO1 zKi84pwoW|y^-&S3`0Sq!WYDbr*XNJj54A(W<#K!rXZ|s&q&>gC1&%ui&cpILT~Kf4 z)p+E|at*%K!YIP&TowLH<>`$Ae8{86UY51VS%mpGt-Vqp==UvC0yWxgq`AynwHd`B za*3|wi?(KupXs>fZ8Y~A<)NfUF-dI2m#^AalHBpG9YU4!7M69Vhc?mOT?=|VRanXU zIQx|Pp+NKv%Y7Db@Rb<|tN-|UENvmktg#6k89d@E33ECRS#R_X*?x{t`dMHWLjaMU zNA;Q@TT$(>1f}S$R3Ux}P^(7DR&s{qCF}TZ%kp za}q|##7xHz=Gd~9;EAqCwix*Wmkwc(uafL@+j9Lg%xOQ~TLH7M{s7>~f_+;A zv9&=Xjn**R=@x^01#{aXA@8*0x)~YM&+Hk=4`pdjCaCdlG?mi_t}KYgzCZ6}S@U{U zmV-zNH2=7}I_a)^+dFZNV(#P$=d+mlZsOMYulXi9Pmbo=tp3<0L#4lV2$eVh#z!Pr zlAw)xdeD+O53QI<6Em(#&dZylGouSWdDuAWYl`FGbN20z?Z;ygRPN=*|_>84_r4WjS-a= z^uL{zDqT#=OG4ST$>zp%uk{}clNEMo^BP2Q7az0?L4S&c!}Q1qD=hUww(Y{--S*-P z1@i03+IN&f0}VHI;X$Xl{g{S<%4Rm5C}We9zOwi+XJIqeILWS5UyMsbNM!IJS3Kbv z>h^GltMr@emJywpI&nhm>2cd(e|&bOPjxG#dZeA+cfGQoc$Fu^q5)2CLFSf_YYu=@ zsCs`vt9DkkQYXKEv6HUv^vmeL9H^}9$H=LA)Uti|yEtW0slYvjI9W{bGPIs>Ysy=@ zTo+XJ71Nl%N;agQTE%{Z^(<{1JemEhQSh%2fo|jTTKVC^+jF+S#;s|i^1y)uULYR@ z188e4sR%h=cL>aeo#&ashQt+)C zZ9Uu!3K~26W`2J1c1nR#%!xK(^|=0-l)Db?g2IOG;H!kx=^?sdP)h!N?}wbXL};Tr6Vb_wwHcoj0>(T` z%HPY<^vk3bnk8FmCzd1SMC($HvN>o3B%g9Zx{89o=sUF3L-Zt5mK8RPlWbap72LWp zk7BvwlKi8NbW64EgKxk>>L>!a9M5Q}l6oB#k8|2`Mja>#m`$molC9tr=)7E}wi}-& zT;I#0-#g5}OL_5Le2rqwXWtdAMFf5L6K8rQ%8d_Mx@gern(d8hiVu|UNjldp{%n7w zS@soUPBjwB?kJR8M@@fA`A!#ilD%7Y(vIVj+s6gEbWrZ_McN~2VV-RAWg;~fOpdVL zE7C!q{bBdQbirz4Hg1}j=qjv_eQ&SrlFi4%=QX}=;P8X*uE1X+TWcFtfD09G{VKDV3 zBKze)XuXg^M81?T{IOL`^*DQWbP0c#m!ONO+xb_iK@rsFf>KA0jw(1OwwqJwZ||t{ z1-QL5=&8u$7>)6z&gHo1-&J_RxPe9BULz7ByRSX*B#FjX%MVnNBz&qLUQiz!npYdU2#fC!5 z^lruk(I0C*p4Vy?<`SPeG*A}Fa(w%(o$2*i94*XP|H98D?Nxx#0CdhFpfTqI8`#_M z79+l-%Ua7#xnzGMuUaIJ4Mw20YGT1t(^y9@S#~IY(^!$~)K5TXBT%mCMx29jdab1B zt#0+C0+$BBWGN3AjzKxfU}RmwPCZGF>><_5#D7a27`3b2Iq1fC1(ZFtI%k&W8`yG$kB$kHr+ z>g7Ii-3cAO`_Jnts=`Is6Az!_JymSSvs&bAf^Lkd*3xR|(bcIIGT2AHkGCUC45=cm zf9%`=iy#851^QlZfKqk5758=U;0WDmUcPG#0AH%(`r$C^eh=hdGzLy;5OgZGp z=S{`&HxOM&4p-ZU9Go+T1TkxJXhOjoUC&#|?~H-1{5X>=DmUT6-Hm%E)h>sh^+HXW z$;EBdxYqZnircl@3mTb^IRqEva?cd4n`!ZBR!oNllLm+7^v0v_x=i0LM|C>(mF32n z_kF23a56iirMR!XU4Skv+hX~E$Xoutw~hWh-ce4%j2;-tw)O2b`ZR3+DWyeR{NV)7 z{2{$b_zBegrr_EDnrS>4>eCxz$9kvTxeYiM=-Pn-)4_Mg(gyE{vp;#h*{Co7!PwFf zO_{?c=RXFvBQbx&#iO?I!%~;T!kLY$Zn=X^RcM$1qCB|d*l9i65o;xwrJZs1UX=$+ zo7E~ND^(Gl4MRS({d-yrw+KY5u|Kz8gRUshgH4KliOZ2+pJb;u^KPDDT8o{i&hs{W zzM6)-nW^mPJI;Q|1_X(|8xk#l4%{zZm~+i88n$B?>AWSnHq{Ck4_Lx?e6BSiZo{ls5%X((CnIk^T{`up1Z)o*HJlpU#%a0(RU$8=y>CXCr?>oZ zF^q$z7Dtp~!c&@5$HeyXp-$?l<@1;?H6&S8IQ0pc-#!_sj5?{fm)#^|gq_^r*y;zJ zWbv-+3rMvW@h3pXWSh$??dKjVv|e-LS*<7($4~xAs?q>_F5SF3K3CO-+IRh#)@S^$r-_$ir`H^vngWwc>g^}rc0qAURsfa(*6tD2N%=1hD*5orUC(R zMvIzNmZj9Cq007hFTd;-ztw%!bL+dfKH9&Y9K0B$Bz*CdVIetnik(ENx(w5@L-o;k zpxhkAldzSvo~qiiaOegWkEAdgN&`!>jL zR>TSGj=urxgzAGx6QY%(X-2WRmR}d>Gm^a3=Hs>Fa9>s{f5IsSY-1$atJB~3!;jED zHAeGFgW&{%mWD8mWgc zC>M3S0{DVl!Iv@#Faun8>M zZTHAJoyrfpiIU$Z=o#cGis;LHEN`7i%Z2sl?26(m+s1uvM&w+UvR-uKZB?EHM4!bB zVpr0XII;85{-dMvi9pXT)2Rl+HqfVr?0x#Ui8zrGOq1D0r!4N-r4I>jji|9Vxn)S1 zsF?S)9=(XSy5UgizhM^r_>TA2Qw2xawNkB{WnGkqx* z({)Fx86xhY5!|fV^O=r>dCcRIKW|T`Su#C1r)4M~Tv#{5ToSQ#OITiY*FCqRWK0co zMdFN^0k?XInvGi-cKg&UgJ{qJPCeEbZQ+>F&%DQtMc<~EPIcZcuC8dG`Hz{P_67O7 zhmCg@AoL0WPPXrucOqb$%tx?zKgMAk)I{=dm>;KNaoUH1P3n)JV0@0iM+XHM(iR&T zt}U&tg#27W(JV8+j06P=oB&~nQ0t9s+@!aV!@!r4fk++POW_vKaI7}} z15sJr0$<90^X4iu!x*qZ#d`znlOgh;WL6eF^E6K@B@fW^ZUe}^-zEl<2QY+I7|_oV z<+l$7IuyVF&|sDz;7hdljA7RuDVV*bq^SH8Gzd*rQRcTGWn~%6cuxc~TtLE5Io4|` zS`tt$jHLnE4eAc;wC)3K*b13f0VL4W7AAGJ=G5>&O1tlUiUyh8yu@El#;QGb-Wo=9U>39MlP|DF~&s%yA89g{Cy}Yzk z;j;i8^XwFkjEXAP(TtVb{BE=HEhfa!*f;^ypUDB>6&Y1E-d}3dHeW~A&3P(!_`rVJ zc)e2hX^l>-5mbi^q^>_dp^wkV%36Sy7O#W17!#oXyIHb0EP?s=K8e|`jt+g`OvS%? zH7mXeXj-!iRTH?QIxAA%J+bvMX)*g^StE=48 z4{)xhBX=hb|GE~-+db!AE7*H@l!EYYeh9q^*k1vFa0Nh}>+x}M)op<*vuD+rsAnD! zSrk@Re}tGoAaMyzH+SK31+&#ag57l4UR^oLE3u9auP+;GJ1OkiX%rr?z?)genanQ; z&8e$@mU!TJD`BS7I^X?nv0|(6bs@br^Jja1-@~U80Gt5WuNHtm4XsSa18|&*05ff| z6wDl{Q*1Occweis54F`vnfn&o2U1cj=JGn(_xEj)+O%Oqr5->4gm3 zGW2$jCfdXPF1vJo_rYk~A8i2}En^p})VLGW&(j|#H1*sQXvCi5sP(a|dS8#T!2e8; zgZl|}`op2ue=awXR7YuC=IZR}F$Nh+v49l^>b&FSRL6r5zBvHO>Q1#1ePO7Oz7Dwy zh4HT5U*>qVN4^5&ufhI-JrA}wBCgj!(Bc&dg4X4`y-b(ntOV`3G zayW_Nm=hbGZualUd} zaxi>0VFHs>11XwXU3=U`cYawFfaS<1hr(PM^2+_xlfE7`m(|SX>KMs4b(iy$~tEW?-tk4(i#F&8>|A8Ig=)O zJl5N^7B)2VS4erzFrAaFJ(D24v=MT zK`YI|W6Lshj3Nrz1-dX3wS9{|Rc9x&F~$*IgI0GAu)I}9MfNUPcm?Yj^s`_3wpqD) zvI!#l=7p=ja%AaK@r7Q(l7>@%SvZ~yuQG~g;~gAwOViCC;~#XSaXYzAsidbfc|ROch1(Cb`5>bw#%YqM_9nC z5~ZOlRsqXvw|VOMdk_r(R?bPv9y=?@Vv!1xr+HQPvQXw_o`T7|1YI^XVw2topM?PZDH!^GmX}GCXMTdo_c{xyDaxZ7Ez2x@a?V0BdfAv-r5rnxE8hS1R$;E~4-Z@H z_Kt&~l=>vto5a+#^9{frNvD>CptjaBw)()f;yhs#3u^cXa&U0WRW)s(Kx3u(0gev< zyGL`D{^IiplbxUox>Uu@bAS2sO&$?S6&wTo*MOM{IMOpI_YOwIRmnT||T$ z8HWs$Sr>~jKQ)K2p7QaV+3_jsP;vDNs)OL{3?iqvYOlyzHM{4MhADIrT31B(fO{w5 z*+{=c5v3m-Q*ZGkIe*XM%2l&wcE0ME&H(M?FVg7y@tns%VirF-^JmMRIvump5EtX6 z3X_#;7fty)04hlRGdH|@brfrd7v-viq-1``Mbplhvl`c(doL6BMa~YHaDmfw=0ba6 z#ajPLx7_$H18ogAtyqtR3uI-X(uLt@5_$8sEX@GmMy%%`8EvtR+~Q;2@=U_dw3U6h z|6(q{njX7FdN&a@kMJZQjpk<_?MjYKzZgL%8hHx-3chL3ZyiV8Qv8Ed)p1I6l{El{ z<}3L4x~t1P&Y?$2?v=S?ltvXoM*!tsPpp5UpC|rY>f*FYU{x^{3$o0#k->Wa)(sFc zOMaO(6^rIh%@XoFj_l&-;AqNr^P~)5_f~zaa6t%}MSEvF^x;OqWY|_q_!eW}d1~-z zn}_#svr+MT08e=M5svQK!2eaIF*uq_=autgGvF}$)HSkMJ65(sGPO0^W~Dp*5rr#K zU1wIJ*m$e4!=ELijJ~MeF)y@?aoX~$nMefS7MbyFEY4(9F)@O7h`p_T*M~BjeM28{ zR@LVwqOA*&UCROEGMYk`c#H4H(mwJDTu{{Vq>;>hKUkb8yqUjjPA(ICSvKxOmLu+~ zmHsTZr)GTlKt`YUJQsM<7t@Uu)BAx;RF&5!Sr->xvsC`W9<~?3~&6cPQ*&7zbHlFdFyKUSvc9A{|y34P4#!o?KEKB3FE z1utK<^OUgD9Jv@!#G28)dg}Q95BSTUZR%uNgvE~MzI?NQA7R_mOMannolRWPM(5R> zA>qxq%2lZ~Hu6~`&kGl;!#;|H9j+?!j*qE-G039Vhli<95@UN7G>d_?(BFSH@-OVJ->{2Nq2Z6hSVliRVVZZ>&z+d32cp^j8E^8UX24a<|Zm9 zcGxq)vyIZ7bFT(31eJ6|=DM+;rUs4~lKoTiO`B~gq|W}!C-HhPOU}DNc@srp$)|!; zZKaENJ&}0N@87??>t{{xEiJPbGhAsX`V4XNPvNpZSZU;GtkWsD%fe0aF(zKL+p1ll z@IF#*Gapk{mNCxAmv1U*!)!G))0a@eixc>YDmHTGd+Y`ETn3KRIWiztQND3QK1c*{ z>@24AN6ZkqSKyO^J*X5TZrgEeERfPbpUsY0shil)Hpsi(m$A9R5Bf#w0{0dNs@`~g z{iMJ=Ci%K;B$p)HcOVyZiZXjJ=hl)b9{?d1igXd`jm+lIue<+O0k=gbl$a55tneu@ zbw*-<;6YF!FSCRNGCKTq?? zxH_^9z9B557W=GZ0*P!L&*SxRrk2;1dA9Mh<9x5BYkWB4>*xl+XOZ(a?qU3O)Ipn`l)8+LP%5U&aKR4q>Q!Le!a{7XJIA@j@`*zCXD_5$O)HU0RzMApAbJ8xm zmla69R$^Qozu(yOm4V|x5Na1R>%C(8VaL7Z+dMH?PeJ8aWuG%o>dSd}v^JhAeOhTa zgWSrEF!YTN%G1XTMb9K=dNo_b%OeZ#KdB7r)k$0bL;Gow=tylUr?9z34Tn}b^7%Eo zSr=DYYHC(Vvq8~GuOyDga=3`%+smcx{SyXW-(&W9Q%yBLo$#zeKYdf-gnD)$quGIv zK^+*XYb&zAmxTpafK45J43YNVLwN{CYkb+gJ<@4cbQmL_y$~;^lUxW2^tF-6|mFwpacw={L;^<3fFx;mM` zJC_lAY#qL5V|kBGr&*J@iTlU94U*VOk$i!IWtNSK{)8cpb(a@8DLLkzx#w3sei-R9 zLmItIRX`??)xkRA1Oh-@50rjrP#e+#lnw*jlO-y;#iF> zYV}??JY_e6esnI6cA9>;&&~nxbhXMV^u6~5*!=)A(K~!i>p<$WU<%g zpVOg5I(4_xQC4W;E8aprtPxQv8L49-pFKVO3b>;-kDtG59wPea)OA+8-$C-prrrRJ z&>Ugj%YS0&fw|m!Yep<;M+TD@#KPz({m}*PxH;D+BYGv!U9S@K|F&z7bsPF?W`i=| zYX9bDC*go0mU6v>TK_)<0-}y?& ze7JiIYGf7`z1BX%m1TFLCS;vU053c4E$`cy$$6BmXwbXo8<;ib37CuJxLF1pD*6EK zt2kYI)5L_1Q$%eN<#c2|GH9fZ{o}CU;6(4<0plWo8-WT(X-J2Qg&+-;AcDKNVHKT-=;V-g?wFpl3#YXa_g zo#n*(Oqi$9BVsNtW0&`5#9Xr2+}nHYl;ZNtniJ{UD2bEW|9}|ox!hSW6bZn^Q2J%N z8MCparsx&-Xrn-mOOzPcpx^s11lE1soCWg8_UGjy>EJ4pZMnncSH7}*P3$KnL=Sot zA%4K6Vq)90FwPJt!k9N#eaHg$CUxp%iem_VgzEjhBN<|30 zy~tQz=k?Wcic|n$@UKrOm*W3HZrlB6dG;{l(62+pAO9-@FHGrQk5~A<7*S4NU5PpJ zuLQcspV^Vx4t-@I>iSlXtHsMEoHK?EaLrA=g zCcQ*$6Vh&t1Pm570G8>s?r`ze9HIWqGTkGGsR*WBI^JeCMrl2(ph*83Z%Q zZYhS9SGZz$szLyob9oBn3^mNcIy3MAspJz#%NQuyz9KrlYwB^X5Y|(Eu}07|;~oAQ zZms_^`L-KoY$F{Su2u`s5va5Z-YowoYWsR`Lp|wHBs(Hsh0ngiF}SdCW9ccnx~%j) zrCvYN#JY%_5>i4Au(AwPum?@AKTk~wjRC}90dRs2`L)bRyKmjIT*HCXu}ejj%XOlU z?+HH;>&DOUBU@bY^?WzQg)T&YJ9^+iM%K|f*(u?R6$$r@Yl&m=ap!KT|GTGfMi`z2hFJrEi6(& za0_zOIn~uS0PLwBTLF{`E)$JoK3+Tm0KR}y}0Lggx z!O?u+^tQ$byBSQ4Hqde6-r8OEr(o&7rUgkik-MbV-dvkR;1)582}BPKTTTdUwSbS$4AN2cxY~ww7qvu!4M# z`nTd;wL;3)V1^(USH??bDsZ-kRjJ)<*+(z{y&2(3GZNTli#^dceug;kbDk8<*>_(t zz^kHto7i{)v!UIdv$ZlJcn-;+5+T=hJ(F=C#HX;HhYxouD=W`|$}4!lrd|Q1Fg0SC z1xIOE^fy38wgQ@R`g}Ro*}ib}ukV}Cx(=OE7>@TcvKdPv~*QwB+)*3Yt6 zPy6w94R(Zn)Kcb>BA#uo7`bmEGmqwNkPVuYrC}(hFPS-?{(gP$*5{@F=~@g*NRzfUDO)R`uqBgr-4CiqlvdLbt3#uIF;V7E-I2>t>x9(gb3ToKR zene#0&0ynOl`mPb8m>dxOW@ok(aY;LPU!vst{t<3)+dNw6d6&SU7Xy@t^OtsfA>Ud z{4oYnLxy9u1J#uG;ZvAQipA8)${3RmYDu&yL`grJ?PcfOM|w-OmDKd?%akKM-R&>= zIgTB>&xXwDf^US{LA83_PJ&$`2|r3wjcBIp#J~hZw#p=e4}Pe z;OC6Ey@&a%i`x0D=lWZ>_6I2wK}@*~U<9tt_qhcxgXZgl>Yz<&V^(%H0P=DH{eA9u z)A#V;4YD;1)S{pRW;OMrP0X;4LAWk8Dlrd2DI#6&e{9?T)c)z6{_Kd8o*lBSb%cRy z)OODulYQZ(k$`GgH`cb$TbzW0a}%Xzi*w?Z()Xww5>U@%cbtLv2fz*1HkwtE&gNgB zJ{@4e-|Dk#D7+vn*=$f4aRks@N38qB_#9&yqkUYHH*&J4bq=!J44v0=@^VxBMa$pe zZA+=Fb#2wPge>S;Uh}UP(M;z0{(2z3cXLLvsqgt&C8o;9_Wpf`FCSh6%w|T!y?Bv1 z0n(p=AlIIjNDVvazuCq$2d9O_o@9Qhvyd z1(_WzB0*?eeWOIVvfE9d0qQo7SN@szWjPbdHQ}Bn;>erX`eI@5Qd!vGVgfMNnEZ%~ zT9BMVR^LlDGiP~+QWFx&*8rx39daF^r%hAwWi2m~abu=#1F%uqh(NeWknzH7gg@!i zoBTIuiApqFgn4t1#VU|zl2FzW2Gj#bgQtTV_epk##y@l^b-)vINfboOx+;?Ruo^tr;>`IGrOdJGR*&Pum~DS!ETD?Zxzvk(5+ z&x^9Kylt6$ctARudL?&1O z8xl|_GoJcXp$}eb&oqyU2k1=TY*NRXxiIryNZc7FQG zfDSXi$uJC?c1<*o##I*ZYNyN2S=m%J3jQb2nH=|Pwf@WrJDiceVB5at8N#?KqG;cf z>aisY%8rysS%WqTpEhfXi!a|XQ$ZPeJ%03P7G#@^?Ck7vM}VZF==mYe!~f)!b!(u7 zv-Pj^`i9;0`kp*~#0(&|KjP7m+SL|=9BIeP-{^7gm-?Mc59Lz%S5JFec4BdpNm{m( zep7an0Ad^8g}nNE@FI{&sFf?4syt816u6+Yws-vI!(J`>Qt=j7QF#&b1^2Jh2!TP+yvuaUGUR?JL^mC z_$y4>^77nAtBn&c@9jSsNG>`t$FNB!bpm2Y9a1R;gaU2vgfH+6vDeV%?86|i`x2Cp zjJS+I?aUl%fEA6fBq81dh?l~@giG$F=fNYsX0yQCuV?i2BM5M+2_HKgY#D9hPU|Uk-f2=x zfOpsm7&AtW3FI4d-|GdOuH%OUX^(1V><+f81J#=wq_XyJxnC0$5cUDnPx*edMx6w3 zIJzr(Ltrk$%st)puAbE!r5;N>S zn1O`PwZ2EGKVQ5^5HoHatmSl~Dwch5^&h#-*v>OIWX`NwA_cbT(QbTSekvB+-)+A| zkw;*tz{F~A7`oN@OX5)Nx6K0jd0q$i|3elQ8tPu*YQy_;d{|z${tw6hJQEAcf5^y~ zB8fBZK<&USz*GL4&*GlWyx;@)%eXaI;gsRe}TrT zZlXT4$Dea8i~04S?yf)1*H|H~=w!pY@8@?vo!Tb;xmrQbAG{q0CH$5P-B1PR3=NfD zwg2}7J@{TKGc;lxcLL(UnMz$o13#u0BB^(jU#`Sg+cY2iUy*Vi$VfgA^+!kgA0+)0 zDS$8b=-dhGIZByb#mK2Y|1RF-#gdj)USbPz`Kw9)wPMcmj-)COzx^W~(v6#rE>pQ`keo?(?+X@bAZ zJ-93ft8?%0oCHRyOc9$X)F+$yIm9yG+_n5ss)*!R4*A(U22=eHK*JLAc5fOfN3Wb0 zFU;GJ_2ejjNBQUskzU^ws8eNkw)UOeKg1dq&K+#he1%Di!FH8)*wg1w?%`>Yb9v-> z#xG+6P^%E9v$I}vIeJQj*$?9zvB?5o9$!aP;K%!o`!^e;?^)u1MW*0Zox$TRT01zJ z2&G-xOk@zXo8|;uLRw%}%;Am%dSbV~{@Jit42yql!ae&Nme+*{i_n@EO1Ewd;4^@1|ja&S^*I^_{1@j3+k3 zk77RmCH!?aiRHgmAvu!?@LtD3=k9b!%5MoQ5SWIOEdOQKWik3!v1jk6|BJ;5MsxcU zx|g~1etmBKJDm1!+S31}%jN%iDg6dI5T<^S;hqbc>a2W@x0DY5ajg98XTCl4R+aIt%9IvM0w zd_A&QW?uK+cRyS6h@fG)aZffI%~98h!g}CKfyP~D!_{L!2-(&&^=rU^My}ZSVGpSi zP2Fa?Ai`DVyNo;G=Vk48QP?Gf}>5eJNwuYtHrd4~VjBH5z2ciGNnmO&6vR z7F4d_Q5w85xP09y4jJGXab(+h<&M9TWHPH1;Oh~BN;7-8aNqY*pXJ<~B@eXvDz5lC zGpf9#1=oP7s`z2byHDGrj$uw&SE%`h$C$LfHw}NJ>Zkn+uV7)Z_yPu?f|*gAS0ajt zLC?n(p;vt{u@w*ln9JD$bL@?S?&#jVC7hMSBDIqU70oEi_;e3?=LhO)+6AgEG`Q04 zM$V2X_}GFo6LHvld11lFC{iTha|3S0qD0cxF!q-r>0pex1nrY7PhzMBox zz>KqOg1x3Lqw-N269k&^rx;|O4)~NVtHteDs5rJ6n^(A3$@KT!`?S*#sgQpGP=xz7 zmdk8A>nokeYdNlIb5K!H#j|5SpognU@3$xK4gG;ybDDbmz+FoNgIJupGe z)R;FksSdKW9VL5T6>pXMk!JwTM6r^7Lh2P0!_n}l_W!B|0jp`k;jgckL4i`hRxJs? zF2s4{NY-)dpgy@j2L&H$i(UBbFF0{2@LPxwULSQR_(Qty`EPq$;J7=@y|6^V9#zu! z3#tUeN{sq{VoNt~Y$i*~htx>BbyZ<44oL`?kcOA25fz<7VhiFtsMXM zV(^dPYqD~uj2js8ZrtLZ*PhXvL5U=Y*XazSp@}rYVCeX=bcN&Ev{S&dj4GWOijBc| z;P(8`?cDae;!5OmlD4jGG~acq4a!DD9C(#USe`K!nvC=4KFmvKBY%i!?jn{XU43tV z!h2oZ8y!#MEO0!o@!B7a)x&ODiSyy#xzyRl?Q_4~6SM84JxlvoB7v{M zurn$g{mmg815I-y_S)nTdp7bONTFJjQa{VJEv3!IkM4}y(K3~#*~yI)MiKN)oSad_ zdurX^19S_Vl-l+Lz2V8{|rbwDlgN*6-_Ec?wQ8YpJM=sl$*o`$nQwhEe0@^VJ;xjMfIZ zSl<}y$)d&p{pAw*V)47GD=T?p0e3%YIxP>m@}QTN3%*mdhp?08;N|5+HpwhvvmZKr zJI`1gO1G{}2R)YpheG5nEw(;tF7ru^OVrkip-(^fG&K}xFcH)qb@_9}gJy1TZv zIkO1U$4aYJ{APNPRVE9izwyhI8Y-{)DeL?-YcnMO2x+clonfV(jxEw69@9KwHbgx9SCdTe*R`>4Vbi`f zwh^jBdC4L2BVKazCZ<1<)w%}2`w1cy<{#tbwRYu}aDD~)YuQflu(ZTIo~`LqNQ_u)3|y4 zj~u$nrm<>~lMo{+w{fJw_-lh8vAI0}8bdlQ|Iqh}71jei!Bbw=v%xs)LfFiC_UK^A z5>1I$8#f?Nee~=>Nxi6G&DdS~H~flMCW7}Q`D=2>mG!L+7*YoPt%_^lzVUOm0urye zVH9shL_2LF4erM_cWTSZ2%EQ{qaoKA)0ok00k3%QxO#h+dOcYb|JooHL;Ps~MgZ=x^GQbRUIaDgTt<_H zR^lR#H32ijw3f+lnn-e*$lE%53Vm6-^E4-V&o3rqJ#K_pgU)o~G>`DV)>OQUas`JB z{Ov}`!izTb6lyBsM%Rsrye2M~tXxPZ{%y#b+DBD!?~^QhY0PoDPq@3N(F9Kj ze8G6;2i;Y-GkRvKqQs3~Q$|<5$Yo5^(|!S|@y2$3hmF?l zWjK01(DqGGi9{h+{BsUSTTO^Boeffaym6(%p^?&===H%_%6tyKey)Xl!v;y`-J4qH zzOk6tG;|m*Dl&#rEhg93HWFtzlV}Av`nUDHQ=@3?L=*9^p_Jz0rm4--CN&*$F-2R8 zsh#i>L0b()52Z1g$j`v&#;+HVenzgOZ0Up2N+4PWJ7?oZ~OAH4$Ohlg}vC0CkPmAw#Jn+_1`mz7jW^~!SdC* zcswXCy#f_q!{(^uW-gROei*Ph`L+t1nrACK3Rc)_mml>c9NbA_vws%<2or51?7HLZ zWCxmqc#49*p}czMG}O$^W{M-@uE87j-bSe1olzTnz3CbJieCVPcAcJV+Xi6!m-yUH zHtFRR_IyO~Ie(BH8>p=$cgc#rDJBqJq)#cTpcCcV4VV>ho_6R`jDJ{;?JqhhqV}eN zqD;LNjssqxP7x#Sf+J{`0$NcfA*%1iWAahOC>N;>Oqa7fdE9E*sKpVlA?gDp2cL_+ z{%Q1{(;DUeJ4|9pWk#zZAnzZakigVIay(8O8c=$fr!i35CfLm7!z?IuUf9J}$-FR( z?~t&?4d}q=Q2Nirnrj5nujx^db-kF&7XWGG*Y~#m0t{JL3LG(9UVHcLV{#k;VL~rD zJPi=Xi~KxtOvuB}7YjY5W5o*dVOLDfICZfb#oC$TC{F`~%|+!-E=b9Za;6%eVW!kz z86Y`1b*`(U`<(5{x2G+z2je``CXNFCjHCR2F7CZ-rwU?YkMQyHlR;fErhpU34DBWw zRG4#gU0VGaKnJQ`?pgQ!-vNXGN3I84t~*uAKz{RkHnY4LC|TtQ$~#Y2CLf|EBf4+@ zbF;@Iq5GN3?1DNdMQaRd5ZQITnmpav)pfZFQB{-uodVH3qfXWObdt z1^)lh_U3_5?tlNkbJ|WyP77sErDD)xCrb$-`<6Y)ItCd-c9l30N_NJQeHmk$u@03} z%D#*lMo7glV<~G)_`NSn=X~z__r34$AHU!HlOg7sYp(14el5?}<9VTk&e671S0bay zX0IK-EK!WrG(I;`)>qWVs7mYg&vmE}pk85FUgRAZPN7|CmSI>VSFaS?D?0A|erNKS#tNNBCYf02roQ;4LyOa!ife_jF_*UZ)0a%|v5k2H z1_&=24DK}i-qmv5DIRw5;7mzF)bDJ@rUz@(Qt+nfO@&Hfsd}7<{hW1wtExZVvyQ&MgtnKS=3wX#9ZCf0Fg?!DasaWLh z1zw=|jZ5v7$niHH3{Q32nLK79ib3rMie9NLd8 znZCf+M9nMT%I5A+E-Yq}{Dt{s?wK#10P3`swSI-2Vijt$X``eX(U&*@P*?y4$Mf1)m^!4 ze284p9!(Usraw16bN`v@a`{JWoij38Uu0IZtrQGTRbX6M;DRbH@#RxrcFwXICm8pp z6$kto{6BCotD~lYC?xb$g1uoq$sQqOn$sN0(=*YYR?61*LIU^v?6AMFA7ABmm+I3s z;{VvLGtOZIG2*x3MZ zPf0kXJ&u+Uq1l1>9kp!Nv;R#zyZ=6&l9%SI@%HW8rBRK?KoRivxOFA#E?hXI!ll{L z&8Xd{J)nNy_Mvns0eYtBaRi+L>he%A4s7IB=3xB;6}OhiDiCK-UjK`77oqtIkX)Td z8VF!9pTN~T)MnfV{JrTgaxIWN)xvF_1Mq_3R&>!H25(;aj`H4`fr37a4Bi4zw{{2h z@N?JrM~BTndocpHKP2#v=ou8JXFS;LzzS_OcrM-l&IpDX1ba}-WI6b|)7{;1(ZBxp zt3AaXk2>1gZepiF%@D*wTEAw*o2C@ZL9JW=yNuO9JfWi5N9ZbHuy5S7P{nqL>QTn) zfIW%pF!CZiQ;0BhjN%fxcRY#g$y1^Hge_GqZdi`#Q)(<&IJ*gp{j?*$*58b@g5Hb@ zkV`?kIT_?t4kOdt3thXGzfQJmsl8Y;q^r^|JZfX^L95G3_Z$sj7kz5<^PKt&o$W&W=b;DVht}Q(5M0`I z3q#FzwV+^a@D8KcO%)o0H+=rfLc(+UP@S>YER(xltGaPpqS2|s?KW`m0dw?T^aJAR zaZFqKwYYB-0CTifVWG_qpKCiT7!X4(DXjFkX_>KGOztTsam26DkNrF*Zv{D_oIH8R z$a@pKc&Brb2&jKu%!ux#6(>5V{t&2Fryce3TpxhG+Mwh;)d6mT%-dId68u|_+_K{Ta z+?$j}_B36im{Wa}qUy^a9;1Ts_Aha`NLO-_4~eH0KGJeDk+R|k-g9?<77;8xK9c4h z9lhVcSAf};7%M;S53s*y&WklW>TrRrv1m^0+*|I584QuT)d>f7o)0Y_)V(_WIt1tI z(`;>Dz8FJEZ(m9$PlAJW0g~0vpFh{*GcryxTqW|h=cj#>`KfIk@y6w8g*Vihxo~`Y=L-Hb>`y%@04yFf5A^Eio>L#+zhIqeC#ZqPScp|E8ED5&q)!z=tMzBwo%oNZ{?}G-$ zXhzQE%YJb=FMD5_VQ!OiYRO-TOW(u29~X{OGI~|bgoLXavz;I`fa*z_yGancQ&YKy zkgVTULjhm6*UQm(4_ihF_?!(f*i1Z&6`-~bYySTE^ZzN8 z++F`t42;UB2d)-e784`jfqE5W0r6ZLKu5-Q9IsMHr6cq&=$uk>Mp**B9ddbex^9zJkd<2n`PhO%OxR zy)l@V+r8oH8@k>56C&_C&!OXonj_oy4d~-<_K|}%hJX~Y60@DI2Cx1Pvl{>3HJ3kq zu9y`Rh@Q+JV@w^5J8$~ZWRsW}HR$jY=~y0!^T<*7hpEy5O<^!S@Vb+ux;}Dgtzr50 z(B1Uy2%IVPC+pGFUSu{0ntQ9elZrBj`&y%@pv54d{m*t zhYXgw-%RG7H`E8zukNnfTU*pSt?%?Cudw2>B4Hz_-8Ka#-NvZ4wH_}VTl{-Rfu!3D zaKHbmAJ&*cup97@_5V>yzCSeZ|3a>TgAsp$f&j)6r?h)Ur`D!y9b<;m08X!QXVxZl zf_fA;R&)kU3-5%)@RJZ94>7d+h{{fz?QOp0gnK&PBEsc5yKexD@t()_Bq?=Y$Yz`|LOL@Dx4wkK&t&3j+p6oRNC$>*3XEwd0u0!GLSZ<0l zw#o9uujE!3VAaW6o)1D_}A_t^Auo-c^SbNrWeWpu&WO z+vL3f{H0JQU4irB?O<|4!?f<5Wj4;TUMnAt!VofV47HdP-g(QeI$Ri9+P{5o8CDp! z+)pcb^)d50y&&hI!-cP5xmd+Ga`MDM;1*Bk+Rkpc0o!q`$$iv;TyEY{skS+4GEa#82a z&gy`5z#CW%P}CXATf?2&P-`SxJohUg@kHUGJI0HY4=qH6b7AkR_fAyrh>VTX1ehSI2TW z>|HnU*y<(Won4NR?%X|k-d_FItyW^neb94=@k35+J=C5o*na;VTSI7}wLgr7lrGl1#JC+d@ zVLfwzz}~2273qd9pwSK~Wr??&>M@-tBu!7-ivCkwn`P=jgsqpC#HlVwwB7_*nm1)u zL1o54zK<)$Fg%kr+V9^l;vFjgK;(qmj_L}yn4V0c7M89a1Em=&uj_avO;3wKn606%Ng(Yu1z%J$q&3TpFrumQxN*mCcQvy=0rduL;c>ag?p3(tNJmn{$@|a z!eBRImgIB3RWsa~qIy!Xv^bX5Tr7LVIDbH{o-w6Mz+~K@h^4)r zbznxNrF*#Gn)nNkjf!C*l61Im?#!5K$c_Fv7*6fG$Lbnh#0%eroF zC3`CK8B3cxfaRhABvlr&3>x*ozKCOxGoz1r)Qct@rb`~g=MoQ-uU{O zO4Z%Gq}O?FGJ^Ys{QvgX(KMbcv*GF^ukp_6IWJtFl*x)A{QM~&E5$*zl!BQ}T79zl%hc7I z0s=8hn7H|Od41&iv>`wqUg%|Pkkw8IiWPgJd-HpQMPyuW?%A-oy5WD-$*8z#(%^&M z+Tgt+*UD(~*kbLj+*_@FX7_J&SnZEr{sF410&MK}MQ3i@l%zfa*x97kfkY8R%7m%T z;($v*sggjEkz2{>8);_u&Xauxcjvqfy?I<*G$PKQPrRC~b$KBs>Xz|3wXfbXM*(cIb|Bz%YAd)On zz~gn3#6n;aa&4irnk7xfnu;>9mo!PQ4ups_?|xK9d(N*R{idKuKxXTaNW7Ua5e1FHztxZA$l%pY4y4Vr%V zXq%Jak=}dcX7be>I9CH;=grt#F}0Zta6!3)x1a7sIPoNBReJ##wS@SQ|CzE1AkppDLQ4}J&0TzY%`sK@q> zgac+1AS)|K$!oyM9msWp2Urbz=)5F376eM2Z&S$n^ne2(#^QE1sC+xx;piDy9YW(Bp=5re?=VCUgqgv*!*N@%khj~w3npMJ~9&820A@%AXQ z%4ZXahHFbzjbNg?6+#9vY^az`kmhtL>rUPb;+|K|A`=#X-3s`vnBR8o?a%WB5 zLWS&p0$SW2AFyRRq5#}{o*<1O{wPqh{u;9YhDl`b>p#IH^H+E2sU}z8fG#8~T*=CC z0p;*$x4&WGIY+~h;6VN{m-lCzYX;MJH;-DCADNQ6ZmZbTE6$2*l62tOdX+v{=(f^?3km@6vZ#t;=6tRBEBLqDiZ`nYYNo)KqGX4(nIo znWI_G4%nZe%ABRrCU4Do^%K3$mob`t`Wb>9py#=2cqZiwmF0v#Ig=_kq@k;rdM^opKW^n(f`(|wBGe}xvgKH-pu7t&x-R`T=)0h0ezlmNKCi6={dVP zpBA@M@}@9Y=BX02za^NM23gdvUp4fz`)I-jl3?gTd9xb57%~+hFlM8f)t3bJW>9K@i*}(dIgSuQp=~(o$ z3sUVQ7_SowU#cM4$OryjZh;5(U+J5c+6r4={Rt%3K*5u6W)e`3O*ZFJ)8yX;{j~}v zKU^HXi}>~V%6!ghHM$$R$aAW>mgvEj0F(&MrVK+A$|%T~@=(%nzX5{_%BDidK?tVB4~9V1JWzrj5}4sCN^7!?FRkG zhT%H7*t=02v&s+H6GxxxjY^smzLwVSD{&Anx-Hdde1VLphFVNbl7(1C;sCQI7mdvf zp^0nLGzcoR&1YWbzp79y810z+P46 zNJ3qsoQxnrLOpFHMc~PvX>rr*SF+_bc)V_84W*M^CQUV!q(>NH z9m)P-GRTq+s^8e^dg5SDnUMI#UZ5y0%vM420MeZ$a`M)I+tz28AqsB1o1kO^wt|o5 z)DASLKYtG70qXet;G0mrJD$vQdo6VMAJ-n4%v`&Q?@w3;tj z_k0|u(AkG9$su4Mh+*6yz~)$U+e%Q-7B{~)inw40W|YnY>rRhj?1{hWg68>C=2Du8 z(q@lgO^#TVU=a4x5&5j*l6lnMci$R$e)+F0`Vi*r7X9+``ePH%#5A%n{01(ucN@F~ zHmdZrTN$+Wx;t)w-ru3TX9-=H_w89K;fV0;An0Fc3JHI^l1&X@0UWhui^aGJf|mB8 z@86xXiAJsWDBiTn1{}g|33I2z8Y=g{yQRr=3vkxLj_`dCdG@+7Jg&*-eXmc`oati~ z*(>R49jXWe{Mi~9=Q-z;D?VOFn6r%dC$Y46}i#o6Qjrpq5CALCc zT3GNtwAbk9sF0{AsorN^+->*@;J4GkN>>vg1vbjxOdj`pYF&Esg7bi9$MYSrfXlQB z*Rz;DgV@}%K5R(6uAwo`bRgBbjk#^Uq`0!wP?yU*R4xQ*^8B4^aWxAZA!wR2=`{Bb zX+<~7S$={W6dmu}x#J1I=K%o19scA=H$ZyBK~NFA_cX8q^+uVT{Mwd&ZgJYGMB@U` z1{_Z9$0ADdOr733K%psnP6L}^rYY)4WK2aNzT7f57B27XZbSihhnWCBYon9cv@!b^_v?R|65eNMY0-PTc$C@_%l)J^k{u1|0!cs~(?ID1tNQqW z%j_kP@vHNl!DxRwl<(V)FBWqweq7ToKdJj!Uq>S4t4tL`AzLUKR%UH5OvZIC`*ye( z!2RBVY&f~H9qIZ7M^7B+so?7KoMpLGZda61^rv7_OU}tz*c~ z)$)ZMIck1>TGvIOxps!U-q6Az;4C|l>F@k1PWH@m3|O1w$INP%E(UVj;=Vpt=4|L* z;>NvSCp=%2uL_Evakv;Q7yD^#t)gCZnYTJxWMi$gfvT_4$k#C2H@_y+JZn_b$YRSD z@Adu%&o`f9x}VXy%-sz_QQvIbqBm#?dF2O$T*4^N+DV=(K8TxE8uAZI< z(F|abg%eOv^CS3x8X)Mt{c|hu4wi*R=9y^E!JY`rywc4d&Z7Rja8cFqtKWQ(rTVKB zIEz-gdAI|Hi0rnT0|roMw`Ztv(K~vJ5E2d?&e^T&z&-ONO2pz9y$t%MM9BY76F(i0 zrU1msPj=1ASQJ5Eam1tWA=XU^UX-s@iMBX<<_Ax z3X+Gl|k(?45(F&{iX#q>7cJ}rVvc3W!5tVjz znI+(a`7Wnn0U}ktD&z8JNeLr><8=L{89Si1J@mD=1;XppAgQ#4$zG@nYgXx)3EWq& zf(g);_Vzv;*{TR)Z31J*Qa)y4?f-QhaWWd5G(-1`DrkM*1io}6(I4Uy12RMmWW3iS zjI|t^FT7jwt5GD)$`e!m)xV}O;KcFFe-|9HNJ6qmBytg;Y9JR2K(VTiiHU&<+tAyG ztRaA54{BvB0VXeRneIRLWbNAleZYCywDSa0>7U+I(e+OM6d&yIN`}QH)14%BF1>qr zC;Qz|g^SCV9^SNd%_-3Z)=lv~!u&fOq6l5gZZznv`Hnt5ehlobV8&Vqymm}%YHIP< zuXok;o1=In;3Q!PuLWT#7n)cV`#bcXfI&dmm23PnA`mAG?Q8-L1K_oOYC(d^&t6}s zJ2R*Q-sKd9w2PozuGCD%J}=)34GNBhd;Ap*UHGox=Ef+I*FPd1k6y)CdykyD`xezuU`+5^_<8Us`DPq^9ODi z&w&5{sJl<7ybSFMTbTL0ZYI}T93l*fnhQ@wfI-?inwVc|-YKHNlbRhl^NAq4641oM zx^&v8G6wF+37=lC;Da}YZMMB?tUPiH;nf1wIHOWCm|8`%%0$WI2*_#nnF4b04xjla z^Udj3i1`+X5r`R(GOG>Sy_(2us3jP;};kOiZPm zqKT8dT?lr_pwFhP=wV-AV+?X!LH-$F{fm5&kZy=0m8@<|4f$Eb+O2PVm%8639(0zU zm+5HN6}y!9$>i||e_N*v6; zC!Wd<4!>T0HmBg#Y;=;}cv=d_iDQ3$TlBv&6V`?r%9FV`xVki7lWOBkN{GmwXq5Ke z%Ve1R^Xst2^dz>;Gz^V!o~FA?a@D8@j<&`*RF;5m%YR5B8QlLf+bifqA@apj+t$O0 zd%X<*%3jztY_(nTW-83nV3FMioJ=0=W2Jq58v*s5fkP`BH}_QHED4hW2!M-VT)2kY z#LzGsh}ROz=HPke%Eh)bE?uo<`?_OU?l&S+5plFZ8eHqCoaI zp;PQPushT0}1NMA1 zgH0^EK#is1d5VR3uWP$e6~`{_d5lAK2a1Q|tA{_GL!g=4mtZTq#Dl|k_#Np|^A5Yg z&m*6@4T)rO{tLV#fFLV|OwbqUWU>~ZEr9#M3ViL|wgDAf0+xsJf&eTFvU{<;0_6S( ziiPWmgiN;{jBVQ8^SRMtPp3FiG8Z=P-tvx_dY#E$Y#gu0Bjfw*cZ}S? zE4{VuIE{~W@2$L@#b3362zq)zIGGKJn!!43{Ae#raW7~q##;G*SAj@hS{_S>*F~&-BhisK$oWB5$$p5*PFG7U(YFplX;7Iz| zeC$j9(o|8{jCDbG&h7}~H8oG-KJ2;?pJ#I6ezpXpY%J-WM8sqazFrKvQ_#;cxmP6@hYATd-K=&(^m za#~$)z6p0SduUJ;*wi=nB95kSR((s`6ghj(Dk!z`cBFjv^zv~nlX_n~OU2_91aBXi zE6;gW`im8Vo-!fcn~a`W=u<`;JFDc4M&W*~zf8f&ZB(GRe@lAZG6$>{&I9jgaGie*W}nWyr-VaDBxA zs__u~mW{Di1Y-3)TRMNAHtD0^Lg{cXSt5tU1^Tp8D@)((8lixatHh?%2U??p!vVZ% z*Hs6^v$ckq%Br`RA41(N&oJ2!*4SPQYxhb8>Iu@HknDG(^VOlSY4c$y{!sfwA-u~p z2kuF_51n4M9?yE!kklBW>QPemlYBmSp@oPB1HXw!4M~{clPw{Q_PeR4*{Eq8X_tC%)@pL5ckKwrCXek zkXsjq{xO<=Ed`G|v{Th}-oN=bJ+E<<_a6ILpM%;tbX`qo65cs|mm6J6OaHFgKQD&g ze6h~C> z{MoarU^T(d0QRgvjqQ8(w>`foH_ikh7Fj9RkNJQYfR?^@P2O+G5L^$Qz_**QN-KgK z6;R%ek4_B^XJxz4cch&F;DIVC&k&Q6GI{dk32msZ3P@0LfGsxs=a28cz?eS^b?1<=*n-yT zpYp^`@tw~YBtmbDe7jb@H}k>gzJ7qL;#U{xd8(0|rrvsB`s5flcd=HAMtpsj@%>B7OI3GjnPOg`1WwUa-x-a9pKXp%6N)4GZ zCohhjnq22+9&kHkoZzhTUW7R=R$`ggfUTf_lW4`0d^cU{cQQ&xrbv4>6+UT{;##P| zGvPZj{>7r?ORhd@$RIbEoYT|i8|3|T`Jwi|q z_<7$8k=3M8g&z4EKIN z?W8f`a6m zQQm+BJf*ZUZfH$$dcccpRLE1C_Jse1Dn2;wF7Ag@=sM5h+N+w0 zzP#`{VIZa)bw5Z>-ou+~Fo0lZ7_YIWcCakf<*z%x-HM#s1W^OI-*|=7{V5u=n)PAt^r`Vbz2mYHFA?sS?GxxPK z4w?h^U?SA=7TueC4hJY{WgK{9?cvoTuUxfUx_XSuYxqDXCh}~tj}E6pU0SPePI|xc z7rc#g-_j*a*Ka%>@!;i(#8HE0JCPL_YP%E1=_!ez7=p>s@w@ z+8{J+touP&sl23wlWu2NLae z=WvVk%*U!#p)Xd^=bUwPf_Of<1U7^oT|Mtptk8mz*qfH;j1t?QA8U}c?xPRWd})G&Z*LAjDKzBp zKKbVH0ci1PmC@*%y-+Jb8koZwrK|Yf&C+{te$P%ccHmburlu>X4wImCmq@fB8H19K z7H<4?Cd;F@gQQL32;3VLq|>`BXZ}jmc#;jhHeyCC4=TdPyOSQRyX81t&AY!S9u+}Q zF(;q+&6P{*FW#4IOG}lQ_=Dt!jL6ec=X>s9)>m&Y$O;plv= zYepBU@0P;U=lBYeq^#gx0?CKMuiH9kMp9OEa*z7T&7cYa{6E>kgmRq!khek7S43 z7)aiAko4_ua-V68$2h$`k?cwFczOoDmxstiAxONB70|Nm!|)4F`XhkO``F3#&zdJQhboB#i#_rcCO)=D;@oNr&6|(n9D1xIOzpXk z3q3xU@}>;{xeC^-w8-;T7uIs^k`?4U-|U3b8Sx->>qQ?vtvVsqxDt8S8jEb&JGdI# zxYF(>e&_E$T89A(Ev9%j*1@;mv;U0wp1kaiqf7nQx>AQ^hiqf^?mgkRs8_|SZx!WT zX5MSFL6^qQBOak->2lQU8WiRfTS8^GB=1GzU4Gf;`*?F_2Gd?X8?_z#A*EBJhN`@G zd=FPNfxYl7cA!XHLMgI|mHtLgUAFjulQN1>aHo9nS!U03af91V$!=_!CFUb~a64MU z=}hO#-TBOM$%{PaMk>*(1DEsR63=~5-ssK%;Xkz zaBtmiEZU8$cp+y#E-zAJ=+dnr?!Hvq^&&qMqTdG1F^(mst+%B1sRXJPfqwPo?T}EVR^aNfyS3=X^m`6(4Om0!Yph5O4F7#`<$P1!5Y{9O_Wh_ZZOF(`7HM3}c zQPz0boNQXYK~ZSoy$kBhMugHa*|=1v^ftqHgRNtJBLutM(N~?jmP$L??%}KDCC_Q7 zjGjio-8Evej))m>yvQ=Vd(bT{Qw)I?ajWB?dl_eB7Ikv*OTq4+yz6 z+zx|j=c%%(IRnL=+93r<>ZmgFeuNuOgNK)VUUiNXtf#wVDUo!2@J(~xKJ!O^hnHO_C?f5)T3wk38>UU~ zu3SG!nTuMD+S4xuPOBBFl7w9YuNAm?n>@?1MC4w6x6q}tJpE1Rwn*!fNLz`|3)k2D zZd{;m3zO@Kb~K@!#!G+8J}uIa-ksvL zZV?1bEnyCPv|&P6Og_SmfS-<&YU|O!n}O@Bdw6JsM>&3SQVhAESAxo2g-c#G)jF1Q zQ*Ds)Ty~@F5UP60WiCX)tWLjiW%}Td4SGA$(Jcalso#KkOuqWB_DjY~F#o#OjJ%VS z0$S#tf8#NAzx=|rfjcGt-mk@bvo4IjtxX10}Ky+&HQPOwHnRDtv zvwQ^sQ4esk{k_(HF=9FGI_Gf?Zg$+>GH>vmiPy)>Rim}$O=#e&lun!X>OCWTI{IlV z!L4y()^4hvMi$pi-l}wZ`^^NXTe2Pho;tZ=lp0WmSzHz{?RfCz38lB!dY_c$$_GLm zWqv=87@xb0q++HaqXwR(xiOX6rS`#g5u82ltz(op45jjH{8FZ0)&mT6SWgthzw2L; ze$2}Gsr;>*w|uee2ThL5>g-68%?p&7I88tzNa8A*$2PO@xczWm1ZU;tK>TA}@OsW% zx#@W;FcihCIW4j_L^d!!d-e6zj(xu!75Dh&FYvBJY}Ui)_jk0(zvaWjxxuyI>7%*o z>@%*(DRZhzreEmhV!Pa9l*#G&FYP-0P4z{6W;~u;sn#71c{zbnxBpULki`*Y+FNN~ z#yjYf`c#hYQiD6der(nQS`FV{Z?`5G7flTk2ZiS)-Z%7LS{-FI7pHmApUOKj&$zCz zM*K!Al`x4ki6Yh*oi@67#$?F;p!}%Z? z?WRJ5bgvFs?lhMJ;UFLB{O>_k_D#E|lbK>pF~U-&3LgP-{VSs;V~oQ{u8#4rzAgG)q}hr2ELq@dY-mcl+M7Qx-)Z%Nl*-B9R4CEC zb5b&kUl%I}Q=f@TePPan#U^)1Dc`xCY&r z?xDh~OgcM>X`}`gR(~z)nev&hsvHP}e2`amKzgDA-xEKJYubXE=fsqW1<_UfdE8j@ zDsTm7j*=`;gU$t^S`j^h0)y`o-l|vF_mh_o>esO%`w;MQPT6HIjR^hWVGh?Q*if0% zI{q1@`ncx%mEHiksV`eGn?c0qo@4FdG4_Me2dqmBmT;2hofp%T^OJ=uta>$b0=;}E zr9^rc1~SbEFSoP}N*Fb0$94Xi^HdisOM~q5$=c~3MY3*}hj_H{$fI*Vjl0@vYtkua zSeA1u#T+n8Xzt=s(FaLdRvq5XvMw=V?gvj~bch_HWe;9#E_~#xQ@JnqH>nn#5y9r7 zFWL2N0nU^UD9h`!EV^NHds7c(Iv>8n18Y|m5g-2YhdGRrI(<~HjOh%Hh$WpDEC@xXrX?qw4oFUd5l%d zer+SavD2TO>?o|yjryQKBPrucgO@si|4uNI{9 zd~o}AWbg+9=92#0(P3w%IJgCJA#xnX`R&^gqvJezY@;HCAeNLfT>YFxHu1#a@| zZIl=(BDSIyX|12#6KQkd$DWVp?ERLD73UWd zJ<79lA4pMn$J@x9y|u{+#g&~=10qQFtT?vdX;nh&a)TebFI^Qy{eInUki2(MJD>KL zhx9m$bkEIab*ews?8%n)IGFPRs3yCks_kNYt8R4b`!TvD9=sTvaOME9`7UdNhXrF! z79jyctv%yYW|FL=(W%AS*!*4siStCt$ws?JXtH?WZZ{vx=S>aBE3ELv$)TnxgyHF0 zXDt8>sVYsYJ63g5-%Tc+o-&>xF<~rWS=G-`Y8;1%h&$|2RPV=$k#PTU8!c&7l{iGZ zQv3+%OGYk{g;ivog3{j6%_tU5={!8W$&T|5r}e|dO@8hzRMD+na%=N=dLILYdDbQM zY3oq4(hy4`Sbzm|EslcB?wBm?I5=d{<@t1p03k(F_u744K#T(V@0Z&&TmZK^zPx3pkFD@E4^F6p)=X&&8fbrzEs^b69_ z?Wd#=q|Eq?|Vk`(N-c6BSU3XBzfuJ#7=&Igw5Y?xn zEOdN-K`SanvMg{@T}?|iuxDJ`$J!F$L0j$^k$RE$f?odeqlt%+Xqgo zsCUmOmICoFvKw_?s5Z!5ja!{IFd`RRW85)^FW+8f3pILUt3oy7nUc|`TD&`$>0Ive zf)ZB~GK+t6dMZiT{v+g~0Ip!9IzJ z>`mR#=6~J}7Pr0z(P-r6qHyfjG(3~xSQJH(gbL5S zc?p3HEU}=wvgLkV9M3gd7K}D*N6!^1VC%WOZlL84M@I&ZRAwJ7CCZ2L~L9~u%~Mh+Yzm@Fw1bmx3u<$&S5XX)wbsA{tht*u2% z%YPLfo}1E`j${Qj9iMaAGX~i?^VzrQ+Yx85Gp3bjq!DEM7wUvb=9@Ry=+DTYI0O@E z&HoA@TR&$5tb%5i3Htd~yMrm%oXQ0$eX`@P77f z#b>CfbCEVef{iFp0*N;x6H?YR3=zK7Y5Ef0E!rqP0g>|bthM|kPPYq!IHM#=38~mx zaj0}Xq_&eA>-z4VSaVUzTH3ymdh-YpHK96;SYvSaqg6#<5NW>Sh;c8{X*U0^7C2jS z=1aZHbh75!dhzRX>$&J5#B!{xceoeD)i~@-!P@zDaaYn$U)*e7;K;1kyuaSz{E6#Y z`Usfp^!U^H?xpv4*5(iGbgqJF0F-bde_|nf@IC;G_2MIIuhJE@;(h{gT+mFOef#QU zr`Ys^?7Fp&E#%ck4!CDBnS3Q%MXqiz+6}8LxP-fAK&6;ZQaaZBrtyy>X1-!g!UM4Y zSxxI)`&zxv{GwB1RZ7#)uH^89?2NhDT{H28F4w`-)5j!aDjoA`J5vji#MBDb zGLKPL*aNVELHKkmWBVBL)2Rrh#SMNo!z+a^cANE zx+!J`EvNKNF}}1Il|%(y;4!-!QWVs?`qLjR%|H3~{xK?+Jd#`8IJ@*n9;-+Rj4caw zl0vz;$yzgBcTkDb3XAY@j}uIWI^H)}bJbxwx3;4^CZ=j}P(!)7=1Cxy=g8OpOwm4w z-}fSD=G<}(x{47u^5p1BZDw3vb+`Grdmo-7sgM%w!I8dFPj#;lu4!&GsfZWBG%@L( z{>X06v(sVv)MMn+l>|Oy_5e3S)wHfBKke~t2KqA{Ls2LhOP@OH6%^go*%l_aJb$bc z10R|*DdL(Ns_H=u=(j(`SFpWmWVH9J>Wo$E)AIi1Rr<=Pfcc^Jd~%XO<&CVHMv+6F z)`~LY8$O@+I^^UAc@GJj50YyNa;8ik(ig2nV0KfIR#~p@_=L4Q*QJlOq(`n_Hi`pB zE_hfVTViYQ7kf6W5eF^5Y^-DgcswcaBmuEcukt*+p z@0Y!A)VgMYT{l==v#U(R$QC5a*?|i}oHT!3<$t)NP58{S=|{5V|KpA>_&?pz55qf> z1r~c3d)kNKO7ETADh3 zL$3cW4HUA#GbVq@2*9re!%B*8_lEyV_4$fzRBJ5v+<*L5s?=yME)wGdIq~c~bnRLS zKP})}Ui|BKmEz8e)C-Gz6c!dHzKu9;WN7%c|3CaVa^{cS@nx2d2oLxC{#iv`pWwS_ z*ccelhcPz+nw#fX?1g{7@0Kru?_u=AG z)%Q5%eJcms`}h6&ZKdf^(NE&nwE6h>z-W4>-SAN;U#^YTgS`h@m}1-JsLj?BXtEtU zdNeCIm`S~7ZmiYl)-6Z*>oMXk{iT-;%%I)}19o;u{Mcn9bMlo!rQSc?1;JGFS1Q$k zr^NWb)y}qG-2FrCP0O4GsnAYgl={>n&n}e2loYQUhe|o#mumi{`tkL|A1)GY+m4^h{-nMf1v`#u|ff z^4I|SOnvOE@*3i}thhwcd6_@}u+mD`|>aytlzSAYPrZekHi+W2gbDqQ#!SQpx z{XVnX1ejEDaxENtqC3IqsN_GV@U*M^n0TuxAql(*O(91WO}uE>wxrr`Pi8kmqPQ35Pf2S|rID7uMUW>eb)5758;MF&?a0i9$8(DTQA5O%Ca zv;FfRKjk7k=w5R&AUjTyw)K=EulD_@R}%Hvy3`sImgYJVlUpAUWj+5RJ%Zg?%x=W6 zv$GS}BSLCxYti`UG@VaXL2oXs)D&}Mt4N>~Ow!JJ{EQJ@xn7@!ILUJcW%HlYc=O<8 zysxis4x%g{Jt*hy?gwV$=5Q)SlEc)bqc~9gKkfJpiVeZ9FW5-dS}rUBmO8@srp`IR z*!(9nPwN+HkhU#IRFa*bt#ZS?JCYZ?JAr7KIuZEXGqu~$jwJyJnN{~1*Wfq zMM3Y5ujMtc?b2((W9ub+_hHo3d64_Y%FW=UT` z2aZ-pp9#D*`x2x#Q=dN{oC@~w)I<>v>9jHd9hWvUaqO(L<Exd3C*A47GjyUFfkiko@jGKzi|+drHg8`*Yj!p-1!4qaU=%xTAC@PG~$H9|Km_ zuJNzkOXFca5amfbBZvN|1B3WQ^md7eQ^r}Fgk8avy_|lXikc}94H4d-rsBz})f)>+ zYu{eDE^REfXZdW`Kqr}@?5110MPmi~&C}c#lm;B@j>#A?Pq?KbZ1E=8b}LS#C>_0f zYi{W{Fg^n1;M%OLFR%$+OG^n+oBj^7SpuTcYPMek`Vmbbi}MG3>D~2@PIu`E9#{XB zyqAt$#J)XJt3{LpM2nj~IO&=m(nW=ftP`u=6pCwLtKoITjHpxOltQ;dBDHed zwAsT|DQ+7SQ9)jBPA?K`jSlrY{Dm!EDo=3E*pl5OH)=o0GS3RrSYUi#vyqp8Kk%+Q>MO7wk#R^!Y(^gtXv+*zF}pI$iH z@kia3mES^kfCI-@C2JYXO-RqcpfRuRBy^|v{?Horbpx{%j;O&e;hA$ z7TcQ6{>6C~kyB|78|*r?vBu^b-8MZS=C!Kx>QZL#yUbq;xr~P_XP+H~M@+e~yYjBN zjXyT$<#2p1{P_4(YUQ0S^xw^HS#Dc6t7UaD^3$%l*l*>G(=NkaQQ;8=%eh*iWLnD# zQ~&kPm85>!#ZA;&58+K&lmqn7ja0*KUUK`+tzkyw{E#g`b3x0o`c4E~JKNuIo}=iuIrUv6L~ zDu$jDFw9GpZ|!9igRX$$+2jwmTy)*&`EeJ)??%dppww$k7v6;E;@-;Ke6 zvazFwYAzAIVlm>&jJ^lUD7k{P8uy%9^2d5e>z2Og9W^3-=2Sm(Ar!5Zr-jf-Ts3`V$`7Yo_Ax}CnRK6#EwF91n$ zFkkDrY5W1Jc1gnY?^rhLs!>M1<{I;zyt;C_2!c5QPsl){+Q5MAukG#aW=5)GBoHGR zIkk!kG*&wOvd0Sv1x?j%OJO=XT<|mkf&sX&{?}^Dt z_#dG@INhGVzy>1VgO3y5wka*-Z;wp?A!NQm$vu!ebfpGM=YVOz@K9(=A=COyTn{8B zc`e5P-YJ-CQUGE$l^CIV$8&pbsf2m|dWSx;d;RPq92uX$LEt+D)T_n?0|wK#GePhJ zX*0o0`WbLEfay1*SE~t!$3jM!`=MaM2%kbM44p%*T2$Qx{wV>{t?A;)kyPFNqk55l z7JBgGv+j-@h&E5m5f4oA^6~NN<(zmATMI{I}z=CgVLqH6T;r9Q;U;%Aqtm30ZT)@pgzwpQFp zz1L_p-wHzs$a+vSsc{fL`yZvFHoxmfQuaZtw|?a^|UeRygrdY;t}!w)lKOd7f#}o6Px_Y-LKCOCC9H^`FeDv={1$4c!ow+K5vjZG4~%0| zX-Gm;<WlD)|wEh&OeBW{}g86|=&klS$9-rp(9Eh*E!?B$t6y zOg&svaMcVXRi<5%shYH7Dwf?l>e-K*n)jDrtTIA~&4e2dU?x@gn?Z<7`EyIIM{T-I z$5=_|8aD8X^|NLEyuJTy?J(@SLQv$ra0{Q^vo6O!$r%#ao~0xauDi-GgEZ-?fB^2K z&g%{nY{@oI{f{{2n+*7T{;S)V^I%XC<|t~Ge(glx{z$iWKg*8@FO&@KLYlm+(2@$C z0|jhHT}vd2Q|MYPEpe>Mz-bKoV=FtqPkA)G&N{V2wQFQ)0khv)V$=hukKdL8-^)dK z(dP^1es^n0<;L5m?xbyAz**~p<|aRB>?mDQQ7i0^KOo{0lOdDoWUHikLcvn_Hz54UHhoCDtu9Km5!7Zb>br0o^fOxGVNrS%9dXail+g zn)6JS`sFXqq_9S144S>0jW`WDc2@+bZzvrXu?T(V+5}}()BqlkazbNnbL@(Te<@S1Ng~UqzFjO zM6G+im?fnvMOiORb%F<+bKOhMN9Zm+t;9dRsO%=Zk1a_LE=M{fhYRe(++!ZN+}70G zYfXeM<~ze%+SSIw}?`S?U7f2k~s1iq$_UI=%w3()d7q8(s(2BcN^{m z2xgDMW5=Rt*Qljle%ECndDM750=2vJCvNn+Jf{f9%OKe8cH`Tcw@&zolDlfKAg5}- zPVc_{coZ5$y%QBN>~>%`zR8art!);k^fAS~6YvsEAFpag>a~&nT!$-!J>6@W=oWm; z3Rt^$a5`mexTXmZ!InCvV^WHflW(115-FTD+6$QoynghWC89Q)@|O08@{A+O(!$@g z%^s(S>Y3!5xW8sdFvrnkO^wmGAfpxQsxFGm;Ss4OGby!|DmznV$cW~-5Y2P8RabLX zQR>>K0T?5=H%l*hU|{bDF|zLOI9E4sFH>T7k5Q!QV|q@Lme{P-TvTH|oRt&V zX#p;U$a1rXhz||EIrec+bDoDu^}Dnn_QAH*1taoOqIlsFhsEne7Ge2k1?N{D;YWb7 zr1tM>n<0|_nF!kR^>3g+saQC=okP#1cvJ!RLFmEDts-~Kq`cpK*H&kzRu0Ysu*TtP zvE3)-!O2UQ;Ni_#sv0@E(!n%$DOnf*jQ9~aZCTkJ(XJOTVnAjLNS2)gj7XtYtnHiY zD||O@^f~$!L!P(JWl?3!+N|bmh)5$-#Iv!{?xoE(LScYe{#0p!iMW6==1@&Ro>;K; z!==4}Vr|&F44Rz-+Zc5I%C%40JcB@SD^-w6c6ws{f z!CFfw;EoKWwWhAQk7-j_Em(*qqjx1t==WsNsIk+QO3XjW9%n-%vWta3pw zzo<4p0aB-q{{3f4c{>-SsW0y~Se0)+1z~Q%(*78Nk>Z!t6-LDyQuI+3Ey})kRqYQ2 z?)7qZy^lXxPEoTpa}U~kn@&5UxXIfg?L!dVsx@6i{O zaarLB5*Ji!mSa16gD6%8wm(HWmTlifL%UX8+1HB$z>)Uplw=M#?ZIM`?Xs5dDHCk6 zLZvrARfeg%LF#5cvF!78ft4Xhuz;1|yFq^6 zxnjLz9`&T0-j%6lP5Ab%LhGq`p>t;Gt?sOzQoqT!K^Yz9-WU#Y7Z>_G z@oMR%KZWF>Z!%Kdfszd%=N$xlWuouYz4b*Txs+YRe(gv6wd-9s0tHE>h<% zq!btzwpRB!WLz!N!V|A>YXYr|V=KrtqKz4eZ-N({ir}$7DwIMGUvp4g)uAyNb z@HfrGBJ(>%`wUZo^C;JL7!Ly3i1vXJ3nj7AgUKMG1C?0=|J;bGsw!)r;4G$#?fE?; zzwF6B86rTODJx4v`13)_w+-1+m9NsenAZj@$#ZB!OFG2w<@IT7>VNkr^gy{jA}MJu z)J&h)b&i1{BAQP?Ko`t(1q7x{aFL^zU37p#fA^rlmwahLj>=+mg$gF-l#3XsKKH!S z0*U1wZ7C$5epKto=|2{dd@wV$*cjuSkE0ZOjSy)B@9PKb3Z8TX8$zK0_lDopsIU0lb zmnTU9MKc&Bf!hM;BM6R;xG{USeQ&T z3-(QY2~mFiufKcCtng4AA&K0RJ$9b26=0uex^0tl<-|KG#wjUMo2-mh3pu^S6>G4Xk9Sfhyb8-Ad+;niLKon z!ghit{f;-hYmzH`u%t{VC@!N+j#t_x!RiAC5Ics3p+CV+{yzOD9|v&+ql1|=HM{dD zYx%%6_Jaq00Uzsw6U;8Pcgb*Y=idT@!JB|7>%qisX|k$Wf3aiqh>eg^5o>}e(E_|d ze=nZPq)fiZdGA%^Y66wL_G8L}Aeo3Nj;9y`^G*$@?zCawa z>cA*!Y3BaKZ?m2Kq6RlxKU}OrxlUYS`$!Fa1ReVVmwm_6~bF*d!>l z0hyXCfdj}W$8O5cpl}sHL5tNs8YDip<~TI>N9^K|JsDn|vREB-j23*DazpQ=K>Hod z9ZO0f|H&4hhJ9&vm?Avc*WeycMqUPLpsA08&Rts_8*AK3NcP%0TuC=4HCqjGfD~8w zs-j%v!%+*DEb^DX5$R)1Aq(C2fqSG?G(I8sWcAg?U9U+Ads5O6Vj%WCQie7AKRUwf^?cQ@eVw9o)qI-&p%+L zaoZ`Fa8i@Y3Gsppp*XJOW`q4argEF4p>OmeFO$2(wVBP zjo#_2U|c(GzL77l&UX8~k1q@W?``qZSD?w_fP$|F+@PxQH{TBp8A81pfOLk}cvggl zg<<^n?NN7tl<5bo%B!CXS+6~w;4II_#v~TX4l8Qw!|vQe(9E98DrdHW>nZw-C#b3A z%Lrd-hha>`WzFoef#5)v9Up^5tT4P!KsiDs7!;>5I+#`bK2( z^zh60XKjo3#DN|Y2GoMJy{#jDz?RJ`Yg9JLI~AjjC@&M$8^%q-KFKO{<%IB_f5bc| z=8@G_jk24!mcbEc-)EeGF|;yeAM+_>Wn6meY#!u_aey@2kVtl5u3m%RT~fotueBT7 z{C56vZ&L4_!_~9LJ!~T#W>1Q0ggf3)>e_<_%F5{J*ohvt^&ugeSLJxn9g)HZ z>0;$uW4p%V8D|m*q#Kjc!tJS8usjJ$htpKTsu8X9g(RVQij1Z%h69_9C>J zjvusVLm^=2)Ykf39|Zgcwo3h=DnsBt7E=x(1F7EM>t4f<6WO3~@19=GT@_|3oyOk% zJr(u06GYOVPOd`6nVbtsFW;IshU2G`RRx)6k6b+y$=WlWHy2+S9b7$u?n`bT!s~{- z5&l&7w1}zyvRrnh4gCsAP2-Dwx5Gb<8Gb`}-<2Ts0c-+u1U~hJ`>37vJN#goR6S>S zpwj)2;+m3!IH2~N8%HX>vOf{XsUVKT&W%4f;i{bhA7>%ZUo6YOC=3I( z_`emPJ{=G@-3wyL_L!^I1Jy2ricf8z7Bt;fF+g}|waI~H`c+fhqjyxkE4-r}e}@wR z%$Pr@jNJyyAw5RS^FXBTIVA-8`|!n=0GVb$*?Z!GJMqVHP-3 zm4l_3-hU0tv|3xz18Fi}tQbFT;RUp3@EhT^Q{{sRQ=O@t3LrABzC14S_JVN3DVMF$ z?aid=Sj8+GJBAHPBN;S^x#Hmgz`-cAf+S8%dH$O~$=<5sw{yPO&?!oQVM zJ!Vc5YaMyvdy@y7Kw}Fud(LK3GBj$RGNauGY_uf$2f$Jou;=k{HMbw zI>OlFng#8&1Ax`ZE($YYYut1s3JXIVa8Y;vr+d0c($XC0L|bjUSoF2}0rS|qOw zWJ!`mqf9K~hEuBjQ8G5(pGq4t8J|}+-#}%0!W!mh(9gs!o@f&YEn{4%v&v_#X1H(I~^pl)^{rn!9R!PM-bB>D~KY#5O z)M;)ATqby#P2Vu2PZQL9BQDwEZPJ-^yz|cH;{tmT-++NRvZ_2bwVDC}DZ10$g&=ol zW-%LlV}Mi8y`dsWh}xPJIh>sKtO1>SDed4>MdxPn8hG_96>8QJUoHp*a z=;_6%W!OUvSH86O4BikJWTErVk^53x>Jex9!J|4O`*lkAK(|S@)Fzf|AOM#im!xj3 z=98`p7f2rnW;Hdb)xu$=v?!!ztzt4hDcy3%dgZ_t2iac2yi_^{jGWD*y*%~9XWB=` zEzOATkK#Q8ku}3c-t8~pZH8}jPvNCKD;C}&Rh`b1MqaWT^GrBNCyI%(c6^Xd2=8Lr zCbCXid1x<;vG3xB-HU^{(pb)jq{r89Eg2g~nFA(>ThYfhYfR{`Zki8n+6a2u2 zSiRJxv@k#435HsvG251ZG#d#6iw4h{9(jrOODt5XoV=Qp4cpQ+@hE33KtS{aREtcU zDnuAz;o>(m)qV=;K1{o+1V!Gf;6fAOn2&Y?lfYG*(dpjqLY-YfTO=91kpjg^mCUeN zj78M(ve6f>SEFfRXR`-zI6QcW+N1-PUOCv2xw3U;`3J3sw5-HQa6uvPu$^19wvav8xgTXdg6co(O8X>Dyd&TleW+d$(W6SY8jv@XzacH27`bErx+C!6;Vk zFZMSsW^$n8-`|LBA?!r=qRo_}OiW9mr%eU17W((83ZlOtH177RE(0pgrvgp&b~7s<^uKf43)SgK<|(cQ-EMk&HA8# ztC}Q@f$Z53O9*S#eT8f#i3G4FZeziMsPJkyyJe2Ci0o}fl*q$YkFJ{tKHY*ojG-Np zHVBkOnDp6+FKrzo?+}lX%26omV?>kd>4yp@23*tcF|Uw|7P_r`H)-~gwVM|>36fYV zP>&{D-*c;80(kU*CGAvp6)t$qfL} z@tCCoa(I^C8X1ZTf#=iH8c*5k3bg}E;Os@XP+HU<8A6tQO-&8{$$SdB{3Q3UP@L^N|Slf0o zG%1QcxhpJkZTQRTS^|dO>%_UNy>obEDjXdfI5b{^LggMo569-(+LpO$6C|`LLy5`R zooulk>%l!$u_JW53z2A(?=i-_JGN3w9rmEvV>H$fNEiza?q;^DO1b@FP0zanRFd*` z`#o4y-oL7eT_hzW@DdcP< zmnfF*bUVV0t^X>!9da*#fZL>foI)?71=nZlEqOA6QPhVjXl>=+yabs^OA20pB5P{n zvzuWqVCQW0!nClDO*mV~Q|0El4wXIihCBnmg-!sx^Mz(M>v3Tp*eDMs*z{eeb`N#k z;8;7yj|*OTOUXLOmMitA>b~bGSf%GXLDLjdXS@it+E<&nnyo;C0Y9A)2jXkgvqtFY z0sA;KqKQ+1-Dji7RC$>uQ47e1@-(jew`jG2PXh&w9?C(;>i<)z>Q5y1*Y8&N1oyr> z7)aE}>R9MvEy~91lL$jAdV6~Vh_6eG@b>K3SSqN@#CK5~j*SOhTI+$X ziZv}T6nbK8Y%F>k@E5?hFhl>DCUlGP4SZ*r1d1;OePj{PKvwNh)^^qe1_<9byQ|9{ zhCrY~=gmp!KJU8X1gc*^WtRo2UpL!yBEfIF+uE~@Db0obqtxB=AzhePtTiHzAimfR z4gzp73@Zq;Q0eB+M?HJ!V4^PcJ)f;AKv}a$a0~$TAo~c&!wc4jP929+mrJiS!UTCB zcjHvf4Xq#pi>3!Mu1lU12ANeMad{4Ns@>qr^G{<$uek&R#KGA|2|0J&crKp>zJ8cZu|el{Easa@dk3q) zm;~)to`bbCGM;UeB6Ja2lb7B$pd=s0>>mG9zGkDJZak2X3g)q#2Y!Pg;fN@K2D*7y zz*&B{_#iJ)btpCSa2c*G{3BaRLr_E#I_Ee-S2{KI2EUe#eD}B4YUswiZLQ!CHDt6^ z|7_63lCv9>$6n$8=#`(&d}K0@<-1vZVUdQFivgUC-e8$6sC5nXx}n7m@XR1*{<}0U zg?k8MKD@kHJTXd0)-D6s&W<3EgI?g=ENty6$>NO;0$>QXSozWBlZq0TSl7!->swWH zKfS*FX12Ra{E7nqTz8~}`HVtyVXpC;Dg}2Z3I0El!X9P9yY8V+1VCp<1k$}8sK4w) zYJ*JJe=8(#&1z^rdIMZjZTB;yFzNx*N9n{@Vmx-vqqU#-Fs- zQU-49w;i!83b5Z#_jUa^RmJI}JJ0zsSA%v9O^~_N%Q@?ODt^%wbRYUJ!>)UzlaLRs zI^*RLqWGw?_+&hCq`rcd+7p`ge_Dnf7MV@3Dq7-|7uUjXB0yN3*k2Oo`35@c0b5JuPHmNwJXBJ(cAfZRRJjI=7 zxh%|CMARU%tu&D}I>SPgd^+dWpLc#iKUe$&bze(L%B85kx`BEI$S^fPWgXor+BXH- z1{$gN0-Y(?z8Nq%PY3LYy@2c|YSncY5?$n1QejZ-Jpbl)NbC*Av=t=ECH}n+{j?eD zu6*MuUxU^c9wnU&(Qiv&Ndf4Up5)v6pU|qCR*adBv+whzGn$+uq{#Dyh_0U_UqQ`zyeGL6DJQ zepasfFO#gaRk^{U+~|M*+xjA0E=DUesPCf1WalM*MFDN?A-Vcm2aO~QZ`VhW>G2g! z>PkJp_gwOd)Xa)9slETNcESgbbR8!+pE$FK<+tA0`1<;;NE)LkvcZjCttNSPNtPjj zFOn`m$MEsG7Gv6vl6qbNZq3f=OVDXI6$69ak4rYhPeue#wUcG%9DP5v{~yh3mUIi* zF?N4Dh+V-9l=oTp6^ETQoW|OxKR*lT@;NrKXc{uJrJ05#pUWMxAs;E*-El2 zVlv_moePEFJf{fAiO`UppJ-xyDlS zY1bJkFR*E%h}|y`5~LK1TwhZGxr7^=3P{JRnf8|j&0Z1?WZZ1KFyP^Pj_KlbKIv@K zH}_V5yO1<#_nQvEDVGi_0pviJG^6PI;OQ3m(t-!?yzexFzRAv~_hlyVjVh|z<%%Ek z=I(iRf;5gW%-ilWWTHj+(H&Wqu37R{1M`4O33Nv!vsA9z=7>5GtVb1y@t6h2La_wN ztT3}f3ICKLv-*|wUDPv6YQi`ufYOsux23m#e_o^8#ho=g<-wm4%^vN`)E!$2ATu_? z3_o@D1n}N8NW=3Io@$)v!6_N7{(6%CqjYC*t|&~cP)}z@jT2EH%g1MwBiP*aG5t}= zW3wx}=U`|wzVvUpUC7}Hqu)5+#7Y~el+=`9GB4PtZm8Bw+K7`yJtC%9n(^^25VNPd*&LaK z{`421?IaFi!Uzt3>S5SjTQ68%zwuO+;_~>xE|ezJM+#4i-z4eC*Uxm7)yxoFbsd2X zL%$ZV^+Z9-WfO>b1RBrRtj+L&H}OO7qttVQ#O4NQ>uI4wC*IWc4n?)LOowr59UClv zMVj3^aUJtoY;XYVTewx`E8x1DMLl zYn3b48O|y0PuljuoBhHD&0jZdm?9U{Mgko;R*^!K*v?;tq>!e;QW>+eHoRar%EH0g zI+#_=k)NAd3A>3G_@8e(O0M1*`j%>r&pKvMTmE+a7hu!H`b4HR1TvEWKn}|!VyUjP z>$)}Gl8%&`eVWO7ZTDW)ZuP5Km0p2yXc}N#=7Q>>fD-q%k ztYr10D0k6Nwf!cW(O$R3<9uA=?LNIcx>mcrF2iq9V+dqnj^Yhq^M!U*fTGeCy=?(3 zkofoOPtbNg_a&MYe;>#Tbit;e^P*k(N0nQ#ISHeqd2x337ygqQ*!xDmXa^ETd`m@l zPM;|6azQ~7b5HN`iYmF~DDgUNrnegmUlQ=y?&7IsZ`<&VERP%6h?QlS_Ps8v zV{)k8c(Gxn18EgWnN#a=2!+u&mp`j8m~Ud1N48*s#JWHb30C>QjhU=^O5c>{CVp+} zZiq{ZOsbPiq|s4ppt2CAX<=&LSK<{kfm_wb(t?MA)S^whBe<;zlp60f=?SL+rvAa_ z-5*zQ&cjFd*!L>Qcz%KXIhCwSliwhx9I)dEEb5|X*0YSZkv)Ym1#}ascbMC(XnEZ* zuVQsyMyay;h|LY4Rmq@ArY#4J7b9NJC^KeD(7bBbZQf_a0Iz4>@L&w`=q}s_dJYUv zCGx_|lGcHYDX)&R6rcVcf6@+UM6&No!%8VtlTtqL+;j20AB`B%lZ}_6BFjOCXl8rYVo?>_b5i(b6=Pv9#nQ;kwDs|m)Rtko?Gvd+Wz^>)gwPImY9~kRQox8=C86a`a}CQi<$%-C8dyNP)X= z(U{j~Qi6lujHmtxsOfTJU)}h@$FQ1Js9N-fS$BacVYs2a=gEx$v$A<%+D7$ODBfxV zIOH?5z3}Vi5mWbxs4DYV)o(s?iy4cnNg@T)_QXkNFuD<+JCDc+*X<` zwnttCOyxjqCj*5pz#V!M@I-Yz?+in7O06qzJ*1m}NK(MV#JB18*orddg%xZ34GsRF z(*%|RP?i&5Ncdd?h==&wl~LaidUO@oM8EB#ki=KEX&*1o@NuW*1L;r1+(DDx)%5)Q z3Vk&SaF%w~;&F~IROis$zeq~iJwW$?AKVev8sdIY2nj<+&gW*HS>fh&EJQaPW5!;4 z^pX(15H<5JX4G{8Xzw&j*BHsN$`GGl@78^Gn?5Hj_N=AxO!eUNtc92Q5!oTrE6SlW zhYyRhgNoXFrm@q37*rFRBNbQUlCrwyvb&PxlMl6=&)rPD#K-yD zPMM5{vec6zm=>~2qLha&NCF8)L)K3)!Gpuv^7KL3nZIfYS_>)eYaA8NG$+M+NCh_t zGD#agYo79pM${9*6c6d9^a5c`$p}zhY+j;mcTq zOaXb~HBl{qQZe94YwKjsStX|CmNFIYM8%#)2|(d7cDmLz|CRAv77+k~rpyw!?^v~8 z-UVgoIr|Fiya=K%#m7bb<0dg+J(Jm73In0Ul;i9K1mjK~6bEVTG9fIoNd?jT^?o`z zS*-s2dO0q6Xr)c5i{1F@g-1*7jiuYoCakfh272(q}( z;!3Mk5$=XO?RP>!K{gHWKyS+Sgnozn_-@}G+)x$YC*(vXcMX~#A_j##QqRSGrfx>8W6LWKyBvA=6=Mi1c|D_Mi=<93Y+>Wv5w-TZ&vu`k zu?R-3^!H#MBKY(MX3nTyo()e+^4S7&W|LfFYPF%P#xQ?LoQZ5{Byn3wa9ywhfqXCv zP-IuQKMR@WepXa}1qvifAnPgBH8-1nZ2k&HbHD{%tyP}zao4X|0dz@gB*dTu)Td>2 zau81aA=LkB!|J`j)9(oa8imBrW(_&4p&MZTbwJRl*gU`7jEWPSL*h5AVrTeEh67A~ zIVKeQvrKwS;Y9Urx6kS%ia${TTq#p;gLo07AOCnifSqzFcrTCP`2)IF6{vSk>mkt{ z8-p!uyuS53mJNFv+2l$l2j+Tp<>C;!mA$$TbCPgcGQ>Mlh^JxMCP6QAjP0kv5VIy> zgA<^0zueb|omnhw^R)J9ZEdf;YNfH3-F$M@7jT3WB+#41H&-(#J?%}}4bg0C)6%J$ zH}$+xDiNO=&!A`S$8Sot0qAI4Pksa{XVwE_y7Y9(rh&kcz_-FDEDl~d!W$e?0`=kdJTPNvLn#bFu-g}Ig zYZ9a+lN&HIw`sTvaZinUlHRW>Dfpu=wl2jEj?&Ag+XKw0 zT7YJTe-pmxQH{J>gd4Sd+fb)t@yHP!C$fIFVXj~l_1%JF)thvshxr_HIY3qg@mSXl zkp~Y9=6u0K#EV6(RgX=Vn65XTYn$WnF>8a(dbT!?Z@E@DBXtU!HmaSh;LgQci@z)0 z`O^2kS)CLc_DujW88G3L=Y80LCEOQ4I=i!Ph4X8xL~`bC<*~K76zB!+wPvxkeh;%M zh`qXa#hxdyNctO`VV0F=TRAIq#o0ghV@}jv46YCkwMo6-GXxViyYW0mp{v=up`&*is!|J4y zxvJ(GC;qbvRChtXmxCQpo1?#6YQ!UB%sqoU9 zSz)$n=X1_oT$gOosWSI!{94w6D+bRUs!}iY(KU#UIzB&Y!>ZPkt#hZh-?TT2E2im* zM+MW#B1~|9GUZ`H%$T9ae1AMQgKzLv;U_ldhUDZX#q#4Urj%n>y(J}s=`5{gR8s}I ze8sdZ`#$Uwq*kx^Xj*)-uP$YrRS8Q9BT}w5xN95-{VqN?yyrfRV>$R#m zYxq99@FWha)EYyV4txLyghrE70bo{x(HO$7ys0_X^*Qo*D7h1Mz_m>Kv55d;qI^~2 zhi3dxQvT#^!nvCNAZvwoUa4Cuk6%V7>fcdaYzI|s$twzAP1OUAN$6UGQCsBN?acxJ z8ZyEGuc5dYRH4d$2_#}UDW^5l!U}jU0(M&piTGlFD!*A;ml=}r0^@aAB+Erv1kuH};y&pRK(<-qs1@oXva}cV8yP!Y-d=S%pKRvdLuMtq zCoYc}@(L??uwgDadm+}z6a9G)=hDT?tP4;oZN`^%e0m+T1H6pBc8&0TJ=d`LFsr1g zlyqhUQ|G4eyoY)RAzCo+9d8vkn|Dr(+FN7h4O2xK^1c?_G)Abs4P)t}QAOL;sHnKSGf!|SIHnPB+Ro?czWtm$S_TZ~4*gyy zrD9&FjHzAzTzV)Dyxv>8HvIYWg4H4rM(&7CU52^r8Ga*cTzw{oQb=&XC(?LFe= zlD^#FkMJ+ZTB`FudwOsLW|*D-Su{62o@3Li=f+H}!0iN#ljtW97>ldWB6XAxjx#tx z$~{UCErYffQuHN;T75LAV~I0ISm1uZVR4x5l&$O5MV2oPg?j`xTc|2G&=Kk?N zJmkd{6um1;{34HtQz*?xfBUKRF1SV{P{oi8nOMgXh&RHJ5Laf~*X`q`A+`20cl+CW zDA?$^=Y3hs(y~Jdj%|g#;O!=}uErpca75WY;w7vh`%LiVJS2>utT(r!8c9%%D^Lv> z(kU6q&juka!^NF;N%A=%*_LAcI#s9WX@RBEw)M5OnaayCOziWeY)p&gkr@4Kpbtio z0E*}v8wRNn)`2HXDjM!;&$BR~rShT@%t`DTY-YkBH#asUap~ACD{i1uAEB3-q8Zqc z>&Ca8Jm>+tZ6|Jm{wU{2*KuLeiJ^MqbZy~fK;%%$=HVDR$^YvM>VK-`Bfhfu;g3mT z-jh1>Y)))Z?hN9`n8&!wnEy?_Q8GU%BvnK;Jt@g4zONlabe*BDZ_CRU7aJ|RlHMFn zP*6~am2k~R?}Dbm0YGgiq2VIGxXB%d%Q2}hYn@inlYe2(61LcqZ;m7@(Dyyv4 zvc9$W!WX{Y+XwtWXt@_{pj)U9ia|QS0DuJq4Dym0VuuccaM>P-~h6!VGjIe z^F=Wz&h*|g5ZtEuVCu~9mu{1Q|5wzs;keg2rObUiM1JXK9X%45O`$P55s{JR!_{Yj zQRaMxE=q-{1sE%PK?S5AXs;bk;ZWZN$g>gQyE=TrJTHV095jh5pIU7yX=7HsKkT8D zt9%DYm-*1jDGOK-?XMx#95cMkF(;R2F>l8*5^{4PQZW!}l>`wdxK?zn+qs;TW17y7 z74%pk6T$#B4)8H1_vc5O!q1>Q+vF`(g3u$Y#zH*GQ%&vkY6_JGDh^#E7oz7Meg@`|htr_%5VlwS%Pj^5uSgV->;8B%0d*XVsCse?vQmw@Z8bb~6n zT681nDPUt(0&eJ0x+2wxujfJ|*Mj$eTeN+(HJ<07#GyMnf-O~Az=^>5m5q*l$R?Ke zvU+}vq?CN6L|X7fDwRE^;rKrg=aM!<{QpRx|CNyc4~Vl8cJ=7GOiC72aof{5XiMF_ zrhwqS$hYG`E$59m=fWoGtnU=MWyQLz7;z{eR9jp7F>B7Poq>5>+hGqA-j&`C$!Jo$ ze4Kw^#ARn16UTZ7J~O`YZvH6Hu!TKd=VMv-cH*jt7lfS6bXp|0w@z~TuF`}xg&?{f z;7-o!)nZoebCS}9^ps;&`$zj8cAwqzjqZPDh|q*|x#49|G?+=r`Gawc`uuBgp0Xv=+Isd6#+ zFyGXf2lUt^wxL0oR))Bi&Fz)Xk%S8#A6SQ~XSVm_=^~a{>P!RBi`$A$s`?fjwWp5t z@Hr_*=+XwZ9yXF^Y!b>@c2{%2pY$e(1EYxjSD&-?qVpT8Qw16YE`&)d2E&1!$%a`v zk~*#e@G5N(>6D%HNFU#p$K1V_ZVoJO&>+mTG!Be$HQdB=-gm@fP73rh6##fh@&0{v zFe#Jvv$@1OTcq81wZb9i?0R%)ar)L}KW?v&*5XWB7?T`^6}8@%Vz{3Ur6VPJ0U6Wp zIfJcyn-zr5E+&14#8D=}c9$_pX^BOw*bg<^JM*U4FQ2D<;tIB!KSC@*fXOfpbHq8| z9ACfMb@|@Jj3f_?U=$6;1ZuQkv@s~LRunTo%CePWg>gzJX89)Ole$j!s7QR#q;i3V z6KM=AFLN78ltg<*Cc{I)E2eI2>DVkR?4pW+QC>_fXy3Qqv(*G5LXO`Bk&b3bqTGof z>GxpB0j_mup?8GZ743wp!s$qv;&~LML(%vlz#cz_})PS^QPbxJ8r00z5 zCQU2;%@&Q0Qc>++(mm%`)Oy&OUFEzT?Ydoq8IyvECfY!ns-tuMclq4<%H^LTvh8YG zHKo)aSTG{(1mrdRGo5jf)ZPcs4ZT>Tp49fn;!MYP$3ZQW`gr*+NUX;WcY1BW#}+6I z&sVoWuJ-9l7KTuA}o(&h=oGXT^L ziiE(EnA5)NHt~|&F`L}ne*wV|W@T&jwRTEy8j#W3bpxgwig;$Krq$ZsS@hYU=#=df z`wTgE>_wiLBSEGsQ{NHsPC&OD-zcZ3WJKte_-zgeip1vExPR=yJNrfXNKog!gRE4R z9#F^$KhCqW{fa#;nK!5RNrMOV4%rN!yQ()r9A+qm{3BO#zXR|};Wr3{3k{5z$cgjH z2kB@2!}=XlNm7!OHfcmvy9Nwz%JBCF15`H44Og*&n&z+f(f_6 z<5Bb$916{7^SR^Aw5IPTr$35VrN_OgQ7Tat)U_vCs8QlJ4+%QF^}p#o7ipQC{c34S zgJ<@}WF(g1Z+=CKaKjm-H&l(7UB7u}X#)2DaQ5DDO{QJfsE)k=V*vyyqlijZs&pG7 zAe~S`Q;`;Wml9A=8L85H?*T$h=pZ5>y#+!Gh?D@KNK1qeI9E{Tndf`I_x#T9-2bQ% za<{AOz4qE`Z7kdw^Q_`ki5F>N`w+FheR73=lEbpSB4vQ6Cke9qZqW?6vh>Um;`FB& zLZs3wDEe!?#xM*kV$J$nrCetYnCC z^!1Sk{UAOtsW$2rO4E2*y3BsVV3DMff6|cMTUXZRmJD57`~GGz^Iqfm`Dku6F*;iH zM*-OV&YwYL7HhYfN6Wd2sAN+vVxgwXJ#!6>@Ci7{Fs9^L)4K(rWCw_KLw435wndy#i!YfwvAupnbA3#a7fLjsvN1@Z!b`7H@6H;8<0Mq_&Uv* zeEh()#igH(tx`*^r8axuh8rPs;bny*sC2jajb1d-5~Kmz{oPL7pmhRwZXx@sCbd&S z*`HFR^w*2zfsn^|%C*eLdXwUQ*uK^eP(e(V%d#+?W$s%%d0XX%D(%o+P5ZuW zbR&|a89>#A3O6+{I!VQZZaqDa<$jwH9jO1ScX)AJR?h#xzkw#{@;(cbLYr=ubdaF(A%U!SX)0z}uexnz+lhvVSISXBQ8Q-0N zjX107`oQR6wto zD^|&N(+)g8$(JRGcC7MBQ4pmd6RNZ)%>XWhv#J-@!xIlCm%J8HNHr4iPKX*WyhO#%;#jqNJoC>Xbx> z$A)O#v|lW~qOB>2h)b)>_UAO6zbyX>=JZ3BY4N-UvK+%lsLt@mAs?Iuk^qi#R#SrF zJmJ84K$9SoTpnBSSaU0~?0mn0-qtG(j`8wM-nV5E-Sy2Og~Ot#?@$2U%@8d7Mjn`t zj^@{@p*kC%=iMKC5tk59qhx0MfcOJnooWdyc)==Jttn^I)UF<-<3i+=k;ycL5cJU_drX8+Zyk<(W#~3rNNQHl|j@q^oMbV zWY@41RMbkAg-a0h%!r6Cus)>6}H7u>eH3!)6*JYIrK_F8zZAj z9vlZ=yVr~q9?b(Wn{?TdrK5*(v(djb?Zw45Yi19N;BJrE#LhF?XQ&7yEEg1vi|8k) z&}vucUz=STvc%;c@@(#_S2Y^294KJ}BKZvwMV4t}+}Fzv7%uNf_S&AV^)|%>O6*Uo zfpADF?cp?7@}BYtea?z?s3uUp^H?{*GPZ3{#&a2f8h^_gOQ>a6|3#5y>5uteMegV- z^0@b}i~lx2^4v=9YZG&YtJnhw+Mj&643oHl zNNoIe$VHbSXCuM@E58Y3{N=&_;_`jPB_Tz2ADCT6@_nPi?P5;v+AUw`U%8c6=VGvK zaBhL7yHmFxH1nwwz~zv$adJwF4?@ zkzbxoTIOZ2E&;9-uHI}8I9%1p1(?_>e|;goe`6U07?*78$((U(V|c2P!pnDg z$$G&8rb*~uyq%sO-Hy@5ddP-2jehc-l1?N|uS;F?wEr%!Omy5{qN#V*!)Cr~8f&xWWQB^E|nLlmeRg8-(+Znd` zLZ2COCA^>RW`_i1D#$elG*tJ6jO5wx>Xb*phPz0-;(S{L2M5QN*2hwbXtL_ z&dZa!-Kq{nZWlK@jWiSVOyF8$tC_3Z(;K&yw~`(9>J`zXy&ZeaK|1xuBhIt`8x#o@q|JMx^DX}SC-mdy2B-Y16G>ko zrn6Dy+@tcE5{y>()dC@rrV>l^78`3CcJ1LZ6ZNh0$oHxTh);W!OPA{I*EUI*22UF_-~ZC&kcyAfg;>DIBVttzgtL(a9s_!#;+ zCCx0FZCp@<*VOp3EW-|*5522^@{YwU|P^1yhR*iSUw-d@?M!+9tjS9Zq zOgW%j(Fg>h)$-#4FLm(9%1)X@PqB}yAEcl$Twif6>o)evvpUX-{VrI;oZ{kJE5Du1N?d7kCiO7t>P%$jd!axSxu-wz!VptI0I_dH zw(5*{RxM`+N_@U4p4CxNKiZ>Bwi+ww2m&3gD^WGuZ3E8yyefOM zG~y_gz~spsBO%3iiBvg;_sy*AV&y5Ux%|6T0KSZANKdb|_YPUDs05;&UL-=a8VdYT8Podm|Fp;VS zhPH%GAKVKC+pFhgX^6! z!j2D9O{gj(F>tS%H`P-7(l4t|gYIQEvuMnhb?6`+t)tAz*wipTJkM>{B=;B|iwuTn zCf~`lu6yh-%yM^0sSG=W=kc;kC#aye!7P%vA1w56s2wp28r)M48#QOH!{RBHY5z5U|@=>3@ig3(uV|EG-ne|le$T3{ikl9${hVcy?P zMtxy!52sq{fFzIT|I=KJm}`%93Q&6Nu*7`cl1725aAS>%t$%ogk8uLv(F6&bK6d57 z#4KQsDczK=^@52AH}kI!Ia}JL8jWnQOI|l)ieymQa8)qU!~h*ppd ztOFd6yQt&{i3qb4K|>PwJZbS;?YnIUfc2PKB`)>^^oz$hA%W>F$Fj-wskTK?lUFX7 zGMlgfAH23)<(XLNwM`j)nai--dSN9dtauzi`IX!*MX+MV_QdU3#eP}umR8u-{T4S7 zC0PCRYBS`C+VP$N0RG$rQwX+icbMqi*^5dEDQCBm$$19ge&B^WvkKzRe zel`4#zkRbp?W1{|CCQdxtXcEZLXLkmqHu8Ysf`3z45{q{=yw85O%iN1UMF;Aj{r|& zz%MtMT=$u65aCo!Soe>W=emO>s6PFdBO=dc{KX< zH$G@u#H;_oZ5bWM%Dc97{o=#TmRO7=ifNhDYGk#FieV8wdGd#s0k#_X!)plYSy)Fj zTSecdK<(TPN8R9d8*WD?ycI@j=(5i;jYf+V@N8nT5-6XVHleNNfL9PF* zhWG^Lqz+-!0XnOkAjk3fd+k+>F6tIYJ|a4Vn849 zb||)REF^znnlEu`0zF*~A9Lur_3h(D$~BV}zdH+2aowoRAQL;)OHakqnqPBqe@S#- zbI7{0ZoonRqBSqifo}z-Zk|i@@!1)5Nvgl6={(#KUBhS;ca`%}t6ag5Di5vFB2vH8 z^JGb_nI2F{sm9+EapUcyGm^fsA-x4Uy*J%!6k0$c892OHR(*sz-p3z&onmI`(9 zaqkR*VM;K)#uGhk+F7j46z%fFH=`!>3zB8*touW{UG>XD?i&G|74gL7q$LS_r2G4I z%3qCx8g5u<&mAkQUv%7T~u z?of6f^%W-8x#{XPr3?(R$KokapC1+$OxPc1F*bF6Q7GhT9{Yo;8PLO`Y|%v3TE9j% zOh8oB4;otdqvWYhcI)Z)3!b(zQ@q@shZXXkS@+TMdwqMwzP+esRCprC#ORpC375{k zN5OTK?@F0c30+?Yd}?jCs+E@yZO6Y(+o$Y2c%0oG#q4N}S=eMih>dBmE;_31%RH@O zP*C1E`=ONXCF7Te1@@5KL7TDrjDkr~+4LE2nHi(Z=uNOh7uc=ugMr+RNob4hANus> z*7^0(r`Lm@cCDIivn3RM))<=N)!4h2bh2JEczK$0r24-3gKwDJF9B@Ev6w{O=rj6B#Ra z8|>w7OiSBjuAWfodwXPZp0Q)iG@A5&Z}sE7BxVbl{2G_VkM}6#5AfFTZPBgVq@NvG zD1(gzzfH?UX50`O1z)@hVRKHFbW;IsiGx4Zrs;v|F#r}GheswSBZDv3ZR_lU^&2&Y z%(M_+QE}FBp0G(0$vSH4YQBT(K_a@?AXg&)tVbGRLp#Pe{$yUmX<67m)os zKXzZf5z1*}ZE7X-Q&1K8Q29vw&8;TVR_m8!A{QO~Iw`R9B@nyX1R{!rm73KdP$?V) zdcz9+t?WJppl~}}FA2hyah-tG5yNxS5vF|g8#Y*DntGL+rB{2ft7a5y%V&A4r*^*S z+Tn~IZsD7uxenj?1@dL3MXZO0$cnY=!xEY~1&xX&)r9K5{hG^f+oa_`=!`CNM7MaE zppZKQ6y&0+PSo6xywuQTUPxJu^B^arm|j!4Mq1^ZbPb`1N19zRfmkPJ;XOx@jWOxqV0M9CSPt!)>*vzj42!K2))AXGC8B#;LHo zKiQuk6a_4@TcCw<;_Gu4+dK>$;&EB|{r<2?ZSupBi-za)Hc4B$-7;L?%`%ji7_#(+ z26-!Xfy#`&K}w9T%c*FQyL_W{GiUFGQogQ@Ggr_Ky>FU8PqqC*sZeiOTl4YF${wt#OKOp-i00`4{$cZlCf5|L?IhlJkDJ_ZZ-PPju+Y&-WZ+f zyJHw-%R*`~T!)Xdg+zYzsYQks8x+M5o>Y5nC6~7MGYst|8b-w_V@%ZSD7*LU@IT7g zF)h%0^L;Cu+MM2f#!a1DhO;sgVHPVwBj>ZxYSUlowwiRJaZ1y&Mu$T?EMz?@_9(+x z1mkm+=v^sh+N3;*IsEglV$~D%(fQj262cm<$6Lj*$3({Z;|o_z$)j?Y^M zZI2ZD%+-dau?zYR4ws&_Q5fBXYtYn(h)(nz6=9p-_4f#$b-#v;2ZZx~#)3EnJTFYOSd3Ge^#{^zW z;4@`=KhGx7lyB&KvVRpZXHCi*R`Y3ndmgDT^LK_HRW5Gr9C50n-NC-WSHHZRP6yGk7C)%r9d6_^um9Hkn#WNN2)|vj zEA8$htY=-axpH(yu!-d2Fo*nRuQag=HkWVF+|!^rJ;`RSb<@cGba)MHVr3y93Cg*z zW5SttFQrOJy&v!5nRqohEZJCAZh85Dc=YOYpQxx|NDO({-{Baw6CeJ?3J@ddqfM=G zMARIgZf5yb%3_R=IRc$N(9=Ve9_xws( zEx(wswHu_iwVIGl5*@(<9?qv9!2`Xmu9jQFnWZ|OX$GgmGs;m5{qg7S;39GlEAJ!S zg^<0p%-agkwMUm}a{EB^atuN4Y#@BrG(?pQX$zap<8oXVCgO-61}ttr`Ern+ex%1w z(7IXm?P8;1qVi1lH?#+jCt(eof?GmZ^9u@il@sr%16@=M0Og%QKN3~c{ocKMFf203 zn^ZG7LdQ3f4S^20eK_yG*%v?4Mbw++4T|(p`+L{#KE`y)jC1R6Ee)i2jb2|%qR$6Y zDYvldqs=!>G=pY!@h`eRJ>Cvg3}aba{PSY^yfSCvi9@eCKDvD|qp{d=%Zka8vxKxI zp`zeQ4Ea4u%i-CZ^(( zF!)FxkL~XDzy?kA7j!M!8k4k1H(e=@vM&6zA+whw3`nNK^s(_O$x?a16^a0SX<(D} zb@8G$2tXC1VxkTvMLKB5w%9+@N$*(Ho)4SJooFU>^W`x!K7BF@?Uc|TR~)Fwgc;mL zhI_mrjOCq(ykzz!fwbHkv~=_>o?jz|{B3r==B~R_4YSiKEYsaKbYryJ5BmD2GdjUp z-00u5EKL_nLo1yu`lM{o=uA-c*@-w#$40G$C;~--^*4#_hM9R*&z~OxYLy{q zy)0(eMkJQI&CW|cHY=G*K>=jv30807ZOfgoZVa)0OGeOIvpNhoj$n7tS;i4@>t!> z>ka%zsUyp{Dv#dJ6Qmxux}3n@+5ul`s{A8K)@MRy2KDLFC&dmy@T3#L$^{xrmzp@& zNhDG=qO3sh`W+trjX778>S4B%66z8E^xx-N07T5N;Bq(Q!ivMGCOPUFek<6f1THwHD$NA1F{Ed`7TQv z0h`+=DI1mWUzSRT)Dkc|R4tUODjgvSu>q^gI`g^kp9m1>UbLcK4J@U%RapI$;su1ZX0TW|J)S#f?Nlx3NWg_ z?}9%j{oV)oZw{lH(!t5nGDZ_U?{?W%w#oeF3+8ej{6$E!^D@lxv%S3^ zU#Ov@-})`?pyo*hcwkWinrtx=0(~i$N6dd;JBsRmn5w-nj92PPHT^vgFdqK~24O5z zI`;2FB;=pr0@l6emX<}}szJ=V3L3fPfmRRTaF?kbhAjT?1LXHDwinu1SF;F^O6aCf zQ{7w0AF!ZJjR!c*0xOji?;Qm|zlX%|8wy+Wrk=0hH>{@GckBSQ?WKPiq8y3=b4b~+ z#&z&(qo2}vwd*oW_P3P+xMF?{;8oy5!TKmrh0}orVip+U3K|9miNF-)TAK(PJBXXB z7ZIh#+SIM(MDxuinGz5-To4_Tm%bB9Q(_&a*p6CtDG54tWwEq3@E_k%pevnQdLzK} zA`43a_{vZQl&FdPrntvFkQ>_Zj%gHEl$4F{9a zi2lU4Ve6|UkHw=?lE}8&<+CWMkcuUNX&2B#CdrKxQIvSW4#1Iv(@EaCh&f0*TZXobX*n#AJk&F_!+a*%i@(fl98dyAY`X# ze@6glR}KuK(Lm5;6lE1tT2{84!=e(cL@?~qBg z(M-@MmY^e8Gen}}0!=MP;VVOBV9jh>GmJK$ud<91%|@V9RZ7%e!6BpIzA4 zk(SX`XDZ5PT_DAO+@)Ew*tCPjJwBuV>#^Q#&cmcS0bv)wQ0xVITv2gxz?|585ya*3 zf~El>?6OF(J6f*Kv{9$1FrY3k<7#vo_IC1tg$xStt;q`kU#(^HQ6>gc>HE1C+s+l? z#YRXdr+1;8MGIAWefQR?2doVf>QdhX0GKGlbY!l+MHI{Q_&C_AW_L_)D*oaT)xZr#JF z*%s{2+5a^@MCNPlr+oi7as&c=VW~TFIN+hn<^i4*wa`grzJQ!y5dbgYnZS*J>PB_? z>{*PeEaipdShHZb=0%pl0SodX!!Y5>v7%rdjXWh6SIBeXVZMm0tHL)QvPMg1&So6R zeC3bwT4a-pb81`9oj>cttsQ@ke?Rq->EqKNDqE;2#0Qic_&Fsh%UhLo*}n3SSD-~{ zo-vVeaLBFMTFzyKSryI;ukbi6vzg1?{5=Z~*&o{w2icn)u`!_3qVFnvZyQf_O`v6$ zDF8_VHJUoZ$gc&wwm20)Z(S9zCoOcFaF=gvY=n)L=gI8vI=RgE-UDL_m9pL*UGv!R zkwS-zgd6q5NQV^Fx86(PKICeOo|^Vg+l zjtzs*dBudig`WC~iC2o~85p#o(dv2hNe}#KA%ImM6&98TT%2wKhaG8;&0Z>rVR@`V zmDc|Oo%H4hkInhC_ZMy~0?!*oRn-{K*uwVm>tXT&@+DK*w?S8KV42K3uViWZH>O{P z_V;uVhrr}+aDU0ZM9o)r_|+!HkwiVM^V}e)(IN$Oi^*?Wcy8M5q=XQE%UBFj{pbzD z=#z5)dUgs-Q~shbos0`Gyd0! zVtgnBV+n_EZ>VmVV9UP=l1HFUzq5@`+1lulB>)xI|NeO}{tz;%DA#3Zl9YS+zr~ie9C0q#g)n)xKAQ?$HW*tA`+KYV&cJkqYBxs3lfaVpU$zXg z)Wn-Q9w=KyK9HwRQ-Kd@W{F8F43y2Q*IF*;%N#_p>FMcGXkgwp=5|nA`}r6Z!b3wt z;kk=`-LI=cu?qUVt^X5qf>Y1Bg82bbR8`r%9~so^mEE19 zLja8_U~iUwT{)iWZya-DzTi%k;^Mih`+s$4zil+3hQ>B8bzc+TD@NYF^3afBZq)zx zN(6%2>Cf*kw70eO8M@)Jfc35#&1F$7uo(;%8Ou@@RDCqSt-+{4Lzf7=1MKRT_32N9 z{vJ#q#TWu;YY`CIy(b^S(r2Cm&jz~J2!)92RMTRh&5{bVQ1gHdq})iseCnTac7ooW zhMD~LKLSl`FV_CZ2)u{4YEh4tbN`l55j}*>u1e@>`nQxD9 z0<55tTiqmb>NZa3{@@shB}=5D;Xj}i8j_kX3a{Pj1~s3 zZr8a6O{cT1KY?S_t&$67P(J&$&hKr6$#X$llZinDR zA@Q!pf4|f7VKYS!;tJ-;6N8V-&byRcob7WIlT&Z&#L~@$(a}xJm#<*QvsZ>5&6Ts#L(=_o$+^;0^*0=V;;ADOj#%{VR!$IIpjsPU1Ezq?Q5`W})J}BtWAuAGbJCDv$M>A)QR35v!3GBF)k%CS7Pi}MLU)#L zaVUkXmhx`UzgWJ6wfb=)xQ}_cukq@JqIs-d;`gdbk<#dB^$r4SLLD6 zOlf&mLis#AAIc~NTQ2Qmu0tdJ#Bcv~7OG3RJUcv7Rc8C)vuDqsr7zxtxI%jd{i5wW zwdsS4i%U^Kp(G`HNwoPU%&j0fNm5~ez6f7<`0MCPY<%MA#f)4OeDi7SHJ3p@xF)Ew zN=0Q&oB@x%WF;Fur_tN;AH5Wv5ReUNYG?o{S2qH6nSp)kx2 z`EouLtO1j)T$SFEFjPqO$TsVYeU^gwQ~V6a;8e}9qNRM`=>H3>@c$ueOm&*9hkFnT zE1ZF2A*kR|a`i??sy4Cinky?3Kl?thrSF9gs?tZL(aJMtF-5-U8Gf@v6JHLcw7Yj5 zoH&)b#lPZqnEye7xi|3a#3lJLaCOCD5ROvD00W2t6lp0Y-x{H z?dm(LSDoa2wFiznQ9Mr(=T>wP#>o;nZotsx(B0*Jt6_g;N5}dh?Pp&OK$E*R^3-VM zqQ8b61gBRq-xjfI^|8Q;zS^XLxLTRD35(`%+Ipd))I}R8eB5`l!rKWWX#T!GAeWYB z-Ms9)W3;+5OmH+aK0$A4zFwP4yerX7XID3$M}U?kut-K(-@EWpc67!uJgd@H$E}S$ z4iPD}ovBK5k?f85x+2Bu*>};zD>=vc20OQ!puxP0&_bJs(sLR~qd_fAn} zOZfWa=PMbpc)sRC5cCwiZxqR^9(Nxn&OkNj?kmMArr9d12%tsgn5 zF`ia{S(xNj$9Hjj5ML#V(*;--QV5`${J-XyNpG!hL*4y)v z83||qHaXTr>wfY8=sY@%lzn7Q*b->KE={!n>Pwm4jEecJ1$>%0MIy&Ic{Hzq3H#Mr zaz2q1S%|%0*EiNhs_L$)er>*GxgN63EIDo%C(#`Eu~8EdJy(tyM#mT_RPTS5=|Klm z&+X#f>V?z9pyF*F@{#5f12K|jp6b)$`|B8SrN{c=e^K~Gb9GUw3W{UG3Kdn!Z)5Pn zNGH{rXpL08b5{AEy5cg6B$!F(e$*!m`$e6XmE;r})7S&QOcC@7@&3`zCUHS0a{B-#X?hg|C*!o9{lL5f@iDqSD!y z?8+CsDtC%B^_C)eU7^L(gkm5rdzl^fHx%kk;)Mv1PX%n&ANLw*d>PFSd)$4E<7Fq9 z?-4<(i{g}Zj7)IXB4Io9SO8@y(t1C{8@bw=?AjlZFitWa$Jgq_lG)QAhu7<;&+Ir| zG}p3>*-eh|Vwcc7xk!G?^sL-MW}vCqSv4{BgwR160&rd(EI++q7zVK<5T~ueH*LA)d{{9af5b zhCUctjgI4tI%d(l`b9U019Wn`&&HYNDw~G;g{_=xHe^GVu+pz92+N&;MHxS=whF45 zKWGk-Z`SDBS}YW>Z3}IPC148HAmzhf(CDq`!nWoANRIMnWHq1m(4OQ|FHNK$>NX*BjU@Qo zRZH)0IMU2B27lR=;W*|RiX=@!MUYChq2FY6VzRT$NJ1&@neR@lV0BtKS@rTORG~cQ z?fN2a1dD5yq$FwRu4L$q$z%E*_nW=D6Q1-geI%hU1>eUv>fbq+*BUvjRxyI7x|*q| zHVVH;lB(V2R|;qAg^^`z4<^~67^?oO8kdo(@ZP25fu4+I)4VGt8MH7t%%l| zDWol5RbMlJxTh&4_8=;?KhWo9_NbJEbVBx79d-O^QaG$4zM9#vhXs)&YvF%_R96>`s1MbMB+DpL_~jQ_i+J1*5`nvV zR7je;c``kzQLe+498}!c0gJv47eViND|LLfuG^csmWO*nVt?Poox$NW=;L3rjVL?a z+o7Ga z6)8!9!%)5)oA{YNT3zMq7OsBVP|s@+B_A}pQJ6bOme=!D&FW|Gj!{Hj{PS(v$l>)0 z^%JPh1^l2#FeA?jS$)SXwGyx1504xRqwL({b5Z5Mhx%*W;2Nn{4O48O(|J4L)+F+A zkM(9BUv*A>;kVL)kj}vfv+qNhS+gM%%%3`!)q4=a_-g-0 z&7)u`!VwN*!@91z!CX>NA~`5uOc@1+%i0hb8hqEAr!&mbHt5~En^8VuG+-D71@Xrt z-I>~i2YL&F+}kyw!En7QcU|CSsM~e>t&HuBdk`DzVJCLWFx6>bF@DLRVR2 zx*!^i(wSi5V+X6EPE_gK#(d6;xMiN@)vBtk2#=^V=0$Krd}WBfK<;lEV8yL8$u`5f zv6E(KocIxcEzx__BpZyXu3PwVZ86Uoxb@bmkno5X-Ke8otF6~?1KkwXd3sTK*-I(v zSTh-FxRQZAg6y%!>6zw7^6ikPn%z=ksn5Q0voAp zjyRphIhyqD# z%1JWPBmcf?=Nba;s7{+Tf#@xeFKQ+eA&{s|TW{4I1!6C*o{gXQ*(AU}UqLFBZ1d)lbDww$?-C|W#+A$#Dc%+p ztEKxPu1G`ceS=H-?+b16vGAX(+A8qEym_3e0)iPDLjC;g5I;K<`$>!1R)|ieIDiZSwNlR2vetS>Rw{y}88!6<$b!!hqQ^_J0jY4|p|*uR6p8EH_}FLO-+R1hkN zE4X~qj_8q`SKR-XSlsbw((T)~Pt($B2Qu(2Y4Ss=AK^g_(oo;RBDZxYONo(&O-dKY ztD@Qelf{2Mec}B1bnL7!N8Td-tLXTd&RzyKTg8c=aVL zP5-(p@CPCS^ii9bm;{bjJ13lvdm-NR;|1T>D2SQKU}o!ZMB`%Dzn8iMKZ>t(wHt- z(z@Z3yl z`~A8BuEfL5jrd{%a(g0<=Lx7($yvTuUx=et%ne_gs*KVG3+LZuB=yCs-)>ja;WRS` zwSA0_0~7ZHY&{R3OlmD481U#QNVi;)WmlVs_TTJ=cOSxRc+k$5^&KV({pU7|neN!9 zf|?0%7fo@0lLT~8=VoW~AoVQwDX5}YR;qMt9^|IT(|CMjV8IA zA^{0}}bpiwi_Hr#2G~v!z+2xF152!uA-%o{!&*}sn z+foV27B^a-aLw}j*G4GXIu2fW6fGiwkDtmmKQ#L6Q8de>DU;I>vDC!bL4H!{>)$#j zuvJYWU13>vtl^)|m-8(e;uHHA7!RpQ&J?la{2gaJ;;&QzNO;o`5cE=?s^6TA*3J&& zV3*9>{wRWUgR}o07mdtjf;MGD<`;CADx9xVGz3T&m_mIq>hMhQT7NGC+?s(yoj|Az z)a+df+m-nPB8ZC4o$9as+!D(>)nfzk`swOZOm`$8?jt7>U+0u`gUmB`Hbl|SC`y|@ zI-W}2IXEH@WbX7lWjh0Q6 z>zH|U=tk~G>IbbitZHV*ksFIV&H6?H>E?;(gx0o~G@;wyLR~^*{*u-6SspRuIM3Rj zqsr(|fa)sPk_p0kTz}wLn|E%mHlMpZl6t%>^4bMbn*s@R|i3cm)YA4ncx8y~~+cTPAj)I%HH5WO{#FWNno>*@1wq2i6p>9=t#isbS0YFTDCE3xo(p-*MU(mD)V`4^%P z4f=latqIW7JNVsxdCra6YWWf*b}W~(&mZ-X87bqW+o#l3^)zoR(8H=Y<=o@zT$orT z;|7De{_M#5rBOCwyRg1Xf>e%B)Am&kL*XCyY28Kfj3Hxp|JPvT|GFH#L741 z%4#AUVVEhDW8)rdsW%f5{-SVl`)m&=k5z0pD!o5OyT6N5yGAc|gNtZZnXZaDjb z5<8@Otov&TWmukm*AgN55tocm^tvzgEmoAi^m2TI|w+@~bmRwoLh zcyv6hYur}RtJ<`HWpf2G-MRRL4*acg^!`v?%ErkrbMsBJXG-a{aG3YJ=+(=eA z9}-qmuG%Eha`I%uW2Y}+cRF2`{(k6x&M~eN-c{@nkhmRder&e6b!3LcwcdM=AxoS^ zk;Rrx^2vKzf1*LZZ@WLL^;wmQ!ZJq_u1GIkaKaz!OD~N(E3m3wWV_bxQHV!MQ%K5h&~{q*i)yzOo7E|f zx|iCGeGV-p-lxw-I?~4Mg~ZGco!AOp*tZ#LSyUApb>kf+9?|%sOa!9e2S=8;{nuAk z(%tD)LJ);Qp|Wm(1bVy4SdCi|uu5O9IdTXVTy$~&$-C;hr`i*Bxwb==4P=Z`-pJw0Vdt%kT|O@x|i z5Zd41S`6SDI&!@`_oX0$2rB^v@6x^Go1`*>o!kPqei=c7l=`FsFOK<@*=4ffV9(-t z9zaw%I3lUuR&+~T&g+-y!4fe|(FkeTW5*>T?-XusU0HS{-pTx!{pcuEx>Z1Pa zIr;Ii>$C%9f@6`)O+DgRZI&sR=a}IdvY90iZ$MhJoQ}Qr_K`mG+Y0uac^0Sc@o(c+ zp8RmF(((?M9``iLolpXW(C%e!e`i(hSarAfllQOZ;!}@jzzJn@R^84>8@+Gvd7fs{ zl5P1PqLY&jSw%Ov6_At~p64$S9(<@bb&fKjwkc-A2&=lU)k7;D+R>iYvMPOzD`fpY zcXG`kMZ1{1n9YS8jiT;}{ao==1r&45#$;gjWmPErl1?g+tr_#L)z;P3wbVNfWc6P0+~1pO zLWeauy8c~=T7$;T7Cq_D0SjPI%oTi=6MA-86wTnD815WVzPPX8C$HeYbikzrgR&ji zWTjsE)#Q1(`?LzdF{ZH(n4?JWut;MWM2_)zScc1Y;5rEBkq2DdwhtGP_(H1~#Zj5E znqfr2G!xR>i41m6I~RRqF4){r^{w{Yl7rvfZ|0 z)w8k##t`{89VrL+1p~kKi)aoybp23e4S_?J5$rjk)SUFk%<# z)K$~NHC?-6!r{@JC_Dr_tfp`wxR*ACeu9G{SlS9 zc}Ac%6?kZAgqMT$6_kdl{7ov;65P3oEY7qTa8Pcy7t@W+@@p{K5sw_wO82~2~)wT*laJIK`*U@rqv3h!SFNEllIDsfRtIuV`mJJ_Z#((voE~#ru+|_LGZHseZZ4# z5CqzkSplCuzzlV(+Zxh`P1IJ+btmP6at5n}^J5PAkn$A7rJwa%w!lb}l<=Tb!GoeL z2qblKZB6{YjKmHdM6d-qc`u67a}ru{8AdpkQIkD7)u*|>vhaAt-=x0W=irU*{P=P6 z#tr!!s>v8oq32Za`O(BqHH6=q?|X3N$`yo8QF69Q5~43dUMc(?Eh|EDwRXTYJ6u?& z_}kX*b#i57*)1chB|i`hTr)B3+1v_KB!K=I>DH?MnE6FzgF9xE_ORIBqXdM63;_l; z=-&_mu0M)^vQo~#Z;%^tLsc=HN^A$@vo;`N4{G_PDcM>a89Nrr>tv z+xmP#bsl(D4uL8?yCEPzQ_VKKe@vYK+yRU?B77@8bD?Hh+PC$f6zcZDL!UHYCO64g zgbt*ma*x+bg@hgTDtUSVCm0a;Zq3ooH_qIS4(J8M+)EsBt+wuuSI2ceS0^Ss$2=Q( zFlv^_VP~sDW&^a28L@{Z)u!_!$vFDHvYM-A-lmfoCx2y3w3_J;b~c&tC2L5da#~JW zv2HObNL_R_cB&IZ`{K6NJ&SSzV^hD^CH}X+>6`D~yg5qwF&#>s{G1Bl#cMe_mI7Dp zRO;LTOoPF+2mS_R)p%hAw{Zvm*|T!Dn_9KDR06g9SDyzz?Q`;qWuT^y?RpltR%)w7 zn_r}uP5^BHHc4MYg#TkAuq;c3c-#WL7}VT1BMD8V7of3hIdY4RleAr5RMcJ~XB%)u zzRdIgJ6ZIAOmH*dn&M8h)Ch#&b)VeDmq;Oul z_OcW3adHO13Xuo&A7}9jI3ql z-v1T|%?@#|tuG~}a^&O=& zOCK^^oH7)hLTRB`95pMPmEUryK#5d*zD1yYS9}z|`20?!mdQ(Y-R2gb5_UcS9evkvp7(M%`}aoWn!ch)fw3KQMK@HdRP%+_BEJu@B%55wL%3 znh#SMaEw-ENBvRD{w8azs6O|AbcHBJj_zx7|Mk;y$yt;~NHK3Fcf0OQ2dvnNpW4eE z-VL#~fMA0X=KKM-wALweDmr8uZqXY?}|M}RT?Z!z&%;>ghLE#>|J z|CF+9O#h!M`C4UZY;y7exSfxW&to*oF%gm~16DvXVgRJB2K*W_cmkMw-Wc5ZuLpJX zHJ+f@W_4BJQ8{^eB2e5U04TGYV*Bkf=D%;F25#H7P1uoj-_G8C9;h1L<}pAK48$X? za$L#aC2jDYyY_89%-F$S%rbS%xRhf$Ke>5!^-qQOptFmg>tWb0jruY2slVxr%LISCRRI zCI0h4++=ZSlwPN_4NX_QYY{kFd2#9X!Z`>sOM>^$PSujHJ`zuBr$Dqu`1CKP_}Q~D)Y=33jW?%??TWBmT}_=qlsm&!TRAKrB_&!dGN(_ zNmL8hC9J~{?Haz~hCA~Um*_e*lB4C;k#Dh?U&WLzko_+6jC7R>_HVY+RnPfaZzHRo z*LI=XfIXt9sOaWRQr5c?8hTo`AkSKO(d1LuyxivgeB&@0Ckk)=K4LGn4M%wA5Sy?( zfJ%RCGHr)|b~B76+Z@OlyP*zWAymB5A7QGn%)@DffvgW3o8tT;Ac5_@NWd=);>-4N zg^U#uTDI;F`;J#IrqA@hX$whOw48HMU?;O7Qe5=J(MX!do;PQX9Sex@ZMYdXrr(?% zFH9e#ImP$i7anc`hE)+0B1z6jw~gJC=WM*lrmQLuENJ)zbEaXYSYJ07(^J5Hb(0$q z7k0w6gv{>K)G9ahqOrqC*J^%t*K4`#a4DwZF01y1g-0(Bqw zMcbw%g(ExvQFU9+qA zKugMX+@7kNzf8lg?i&2%+84K6*vRJL@HV=I(RP4PRwXrPd02GI>uAyFBNMw1iO z-d%NV10qA-?Q(}lVnlPd=TITlyPqyD0y6UuYZupEO)jEdpl4z*?VcwloxlUB`*u}b z6V`YTdzYXckM3?>=|gEdV3}oHdm&Zyjl6L1e)HKfB~B$I+p<;_b`*|06Ot>;rk#ka zA;D4&&-Yeqnz>T=S-jM>gC{vUu>(K~&v4m7ot5vt>a?JyTRX3vZAf8_hKsIeON#vec1LYfJ_ij(MB=s$ye@;R7GbO_ovh}6-e)uG9 z7X2CbIZo@Q*a%*j{Jx7C5_r)oHz^aCnuj%X@0jrYX5!m7er!45XY}c57x(vV~U?3J*kXJ;pv@9;W6xCqdV>W z;YECIcR(si#Y*rF3d@Tvi^{kh5^?0s4C9=MW8Qxlm6#eszPIwRZrShwx`#@I^PL4x zmTkvdhZZ&EjIU?|=w@P;(K*b|X@}RA=f5oKxk|D##cCZ~1^e;m&tS?UnCRuzzzJ9i z-ydkxecbKuTTRbju*8XR1$i2<8?VM&AxXvb?Bz>pLJY4E(!fo7c3UkW+dzYBLk+Fl zNHg>HKz#>JzAfIs0v01<)Y#6x8x*^-Tqn3vkBM9nWS4zK85tQ|k8cYu{<%k^F;+SW zCG?$@pLPn2Ndi*h>ujI;qN>Xs)KG>w{aS&}t(3R@s_Iu_5%6-Pspn#wM=|DsV(lch z(l5rKEq_*uPCOSv!IZW^0%Qr;%IOa1&=lTJgsxy#2h&-hU*3hkk43uCViJgBiu#-2!ijmb~Vi_ z>Z*?=Eaelhq90OWC(ifwPClCbFu?B6wiYr7wB3JeWaTn?1ib2U)jKOQUZ$1a%}4sNom*oQ)|0we`1R3_U>HQNW#smE>KN8BmV;Ji8cBF literal 0 HcmV?d00001 diff --git a/task-1/screenshots/task1_pyspark_results.png b/task-1/screenshots/task1_pyspark_results.png new file mode 100644 index 0000000000000000000000000000000000000000..b5783b3c0ce1459318f65d4a3fb6328b8b224009 GIT binary patch literal 146337 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 Gg#?U|r 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
NC*_1RCiI)h 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 QVc;buBK^GJsh0Qu0S9_EVgLXD literal 0 HcmV?d00001 diff --git a/task-3/screenshots/job_success_overview.png b/task-3/screenshots/job_success_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..11694b6c8940168290b3a5ea5d5a6d6dd2d68b9c GIT binary patch literal 170973 zcmbSzXIN8P6E0R13&#Q~QjQ2p5s=9J2%&?N zgkGihUITaKeBU|Wxj*ioyPpRkd#}B+%FL{pci!=lU$%Rx<3L7sy@B*| z24|c7hK%eqL;l5c4OfHZQ8zt=>B;GaU~*~&GwWljzPx8KgC9&4Eh>^xtTXs*;jat7 zc_L)T?^(VoOv=^~@ZwK+cb`yLY=6xjrSY_+@x1vva$2gN&(t2=`s3R;gLzd~htaJO z!!F#k*sPsC!E1C+=lg7R*IcDoctpe%(s2HJl?f?3ocsF&8QDm{CFL{!e0&y;t2-sG z)mK-G=~p_ojFA8HgiMf6Sy>s1)rIz>p%GHX#T$kjjo_3L$A{3?8 z_3=9#dSO5C~8ChAnZV7y${_~ZPq|5(Wg^_T0U-t7E*8er^ zL#fLh92|rsi5C_XC5R@IMrQLHbh$iO)Y{&zVPlh9ai5HAB6f3kS97$|37Tgh4%VuF zF0q!`N=_SZ_Q#Dc|Te*73?Gg`U1v7s7F!{06qTIHgam#q?n9b{u-Vm9~o z9zO$n_N-!gv`Wj{+xuqQF8Io1KJ%_bDCoYw+}`8^n1`J{S~bm&M$jf_*tSj|JmhyF zt%|8EY5Kl5P0h?&aX8$_RnT%2rInWmmbaq=GHRNk)2^Td9^g%5+`IAo%^G8 z8}U)Gmrga9I7+Nzlc~pLWqT-T^X#S{h=EB6-Xtx#?-Fdtc5dfn)wX0^a-)@_Sk>0{XrQgFjNyE7g^}3Z7RBE2fayNlYTr-san$FqmJ;YemIE#PEz*2u5yE! z**k2ad#x9J2$%%cme|A5>kbYTiepq5+i>ORICf~pikq&sc6N01-IbvdNZrXHreYX7 zRAR~g^r^~dm5Ww_h*SG$`DKJhS8w1QsOgNFo3&or@fm4ocTL%Ei?-t{S7u5~KcaIE zwGT#*vXjjv%?&Sj9j%mYZf^EG3>7n8t(-bJ8b4i}OY+g|%~b5qR(Mc3C$9qjM3 zfPvA8I!A_vh93L@wy3Q>F$)N>JHJD}&S(?|af5QFU04+0-BM`J6Ja_;nomMDZ5I?N+OQWY}n;(&`D3XZcoJ9{UJxiYGbu!S5r61%B8g_R16ciNO9fIR;H-EPb)p(R0JpD@=eB)$O z(zm`IR7OXdgMFzzTx18@w%8o@P{eM+_YFIvsMBJkQi4bZ=utD=apLDAVq<`?yRP?uK_@{nCS&2JmgvtZ*Ft68f(+U|jHp&&?3k|{AZPOWrYP+PX1 z?@oaa7G~VMb*rOSKPnm-hqmZNQkksg2fFEi)$VUAJ=1bU1Z9zRK|vt2YBsziSzVpq zdPpOII&y8%*ucg;K_YV#B>+#Zt_@II4Qgy<*fejcs&xCJjzF``?|tB`6;!52v7!%8 zPI*IFko8iQ+@(aHHg-lvDN^^qM0V(FDFV}<(dK!To}Pa85g8fh@Q;t=C9i*+<+mD8 zIX$X7#R!hMN}s!UwcGd1x$UO=wk%>|dcb(;mRiM3O;30D8z%Ln-o7UxXFt2kqYxON z@kS%I;=nJ8nhLcpj64d8Tvq7xvQ$vlc$02ZSoSAaXSg5XKD=|dKuhlFQ>!l{Yq z>fQ^plUgr6Uc44C!iB|p6Awda)&cIjtlne`x%)^BC|67Lo*AK`qT*KACy3T?+e=WWhHsTSK0bYyhq4<<8Y0EcXl>#3>f){NA5ES ztr5;E<2gFKHHV9s!=%##2I7+8shYEMsoTp9(i+p}+8wPtx-u{|`^j+lTgit9+^?o) zS;Tl02>vTXw9|EnNr&56d@?dL!|{Skb)vH-uTGnqIx3`2XQ{>4_=zrmkon$M z3mOZKe6%d&EmIg8jchYmhb9&XR^7sJEvmF%FkS0X|7e(Ts1vTGmsqG}$~HIQwzbYa zMd`Eu@o;+~O_I2v49DlhFrlRVuha0o{bt}gdBJJE`+1?4(pHuvQJ$oX6F)uzbx7=@ zTu~p(2$z}~JG2;iOYH4C?3$e3cDh{kQvV4{cWc8@M+ahRvo~f*yQh#V&^wKBR$qoq zBjwC&$da;}XZYCYjO$X@?mRH53FiJ^x-tgfkl$N8BvtkLx%osmODJG zk+LvQK2Wgxoo+=fAcvQa9Ac3N*wY4Xl8N%mv=;*aS=`Z4aT<-Qo8V*O# zcEn{Z^k!L}93QkcH>;SLW!4gRVJqWxhIcsix`FM({C=}kwKh;-atM4Kr{w`|94$DE zNm|2C>TLU$oQQpWC2E7zRNP}%sHuh8c=q@2`Jyg~-k^KD#hwT6=)~RoOxsV0M>{KJ z<7~XV>UG53IElmghbx0ca-?G)d}~_;^8)Zh4(B9K7hJ2!Dd`;-T;{6QYI{ljMm$zl z2;3jXTH*Lzh`+x-X%A**XW1TQ2Ay7upw4JU zZBWn)O7og&+kU*C#1ws&>^rATNPPoR;bX$7X6Idkw&V->lv~S^{>^e6d;@sN2Ytq( z1A_u4O+ug3xu7zeJ>|ltSXaSBmweB%SJ-a1Gi2rbB^u96vocwb>AY@->r1b^)(>=u zM_IHbwRwIgd%+hMh4XW1jvpNueAD$K^oY0JNAE^BA&8@_34zDDbC2`XcOy+_7uaNg zYqZ_`FtpsWV6?YaeQ(qyX|-n00BM{Hj+|^@mVkwHE{6V`WY?f$lgAbDbSNUGX0Ird zD|VlkX^p3A$_Y}N|3si#?%97A*5kC)Q@0z3eKICs^B&t}I%tT~-YR1;-hOBARXX#L zPEZbta;g~1XJKV6Oo$a&Nw=4dL+if@zfCp!ZZ$Q0XNJe3Tm59y2mbABs%B;6c3fV+ z+t}Tjk>UtFuF?H!?YxDV3s?GDGWzO1;j}KJ_g0e8y^rR5ys%Ci3`sAc7}U`GkIj+N z7Vaj?tvj3E2N$R`F_|O6ZP4}a4QP>_YgG7}QPbQhCg2zX+aLSX=!02%bc#i9=0eNk zq`u9WwhrkMO9H3UVxPQv=Br;oYWUnX--z$@sq5yyeos2czTSGw#>^}O?5~~YeASzl zo1}veQcr&ea`|IPxZXj-${e9P!(JF$yzH^f2=2sEN`D9>~ zgz0U|Y)1Ls{eEfs=8aI(y~P2$lWf%F1!f`ES1st=c1@6>^lf;5s!r=?8$>82RU zb7arLw|kW(QJ@pFR^B$30B}v3$H(iMkzW;l-^!6&PTEj_)6uZag*Gix5h$&uXYZnQ zuOfW$3SBHq_94y$w!275yXo2Tyk>4*&1PBImP02dQNjV1N&p{_oZ+9&3(Fire+sw{ z<2ed1>%>_dt`BL{EJgDIInT2Bb&sw`&7`VrKNX5;ngmu|=N%UE@X^&s zcTn28++l?%RxLGIZU`orO60X2XYMKdGMVCgET*Pv?}sxMl?UzWv0T}iQ5z#NRHuiq z@hW>i1s=j2VPA+bO>g`?=c}$TB5_J=jMh6E{qt(x`<XKH_8<#14i|9d`+hTC zrl&z;-{c}KP9uzlI1og`%{s5yCPy% zp~GwIa~4H+{^gW_0KVgmmj=nr*(y6lnsj&AXJ;}gBAhBlrg5Q`xbxC|vA0qC-uPV~ z$NUquvOp^ob7=uCluNa(**Qcqh?~oQ;rl1L(ptLM*IZ1&z)fnnuH81f;zeF>RX1@$ zQ@T?g^-1B(E$8|D4Qy=Xdb#tfOW&lhgq_eSdg)E1Zsv3MR>Sa9b(-6MWFY+N9-TCl ziqI1_=x*IkR^ecEE=*00YB|&{yB<*oY)J1@i?166{uLMVsWj#ZuaNYv+GA;kDu~dz z>H?&nBh+a}2D^=5XR8<@U+Z+R~WET0c31 z=fvGP5I?W4+ljA#KNp_9yE4oUoG>~O$8KCeE%#PkCA zoVmZvDn{J4W>E?Vwpc!k@Y&7;%=>fXY>ywyfwLQ`7r*5HF|Y2V()(cM4!`Y~9&pc} z@DQRnV0_-kt~0-XH+OX@b5*Z@INV*qT)al}_Vk3<+R@<@w6nPx&h(d)a=g{mpQ(7C z16KM9*sx!sYt?D-@w6Z+mS^zZPl*+K|P!??%U%&P1sLbq_(it7)uN#$}E`F1In_mYq2L)a`ETSsd5WnRAW z&%bZ+DDj#FX)GDzXq2Gw(vY2ohxq9n|9c-MQLx`j*)M6bCR|~km6yUe`(NS}n0ig_ zJ>lTzl(rP=3bKEoV7Pd7s3(=Ngirj%^m6|TPF$279cTRXqfff&<-)Nv49oGo%ycZB z4;n2$nYHKpUA9mS(}lZA-tCH`rdr@ReLZ~2&$4iLA*eJ5DNC9N??p`G1IvskX2%a^ z+J-8@4jwipC0g7HZp1EaWvd!IwSRG6On0SN$PHbtX;?nXoC6={iyNBOQc&d)fv@iix^J_%!dn6P27iQMq3Rgw8z zlM~H2*eKbT5^usR*ZtZOf=6zAEN+N`J-HmL7R~+V^&-=ovpG#7&$!A0HQJb08O#j~ z5}iT77<^w)WQb&vy>BFLG{nb9IqYG+pSp&%fX)cU=>&qh>ExBRkXPF;Ui-)B{H9X+_R7{c+I|6;&N zgP(Bd<>+Jrog~vzo2fj7zVUvB7I}@tgJ-IKKY3WkPRMbFbRyb5?@csiSzp)R6!u9X z@>@w|A7%KpJ(wMR3A~I_{&wO{-=73adjr29s$ZEr7=Da)td)?_D`p3h=l|uG@n@RVdiyn^JPCwd=RC?-kh=T&b8v<+OiLOl;WSW*B@ zG6x1V?kK}L??V7L^k+cs;K~nomX`Xp44pn@k<1GwuNECbC%On+T6I}jKYEX4Zm*Mr zxyA9iI+9!Ab3Dxe0;y=Gg&yW5L*=8>ix(~c=SGo6%r&3n3Al{8$=$edBRn146z*h~ zcUr>tHwE7>u^txKng7+m?Vli?>~*-1McN|8L@}MyJ)hGo2A^Y9OMH&%bW>;Ohbt5m zeD2$Cu?97|Afzvk;?zgS@>?pDn))y=r1;aTbtQ`PyR7Pw_7@l-M_NiU--N6z^T7`) z9|0ONGdC9(H=2JTNLM#~O3~i3Smwc^byv@mP?mwm`uKVTo@U|FU=D&$R^mYo_IZXC zgIL+!<(z?nPi%d^2Bki(&_&7JUUrZzrCQZbm%$QJsKsZR8=s`m+%Oh0UkdX(Uq6d$8^sVO!TIkLU3x%9DThTWLAV3&$PR2n4WFv>Lq>{ zdmKbWHr(?nt{DH2L&K^uGNT|b(jX)w6XHhnl9ClNh{NM=u`5~x==!|ma2H|lXLkG) zWcwpEzAJ1d?DavkPpRZw>3Go%zwR=pwLe%-$mdLWY7G^06?9 zOfJr2@?mnXBIqiH;)%GUEby{s*_TebEL3A5Z?BM*3Wh^PI2KX1nv|_yo~Zm z1K$I_mR%h;-w$*$O5D0`ufJU^DL#!)cZG3BLUuABGN=c6>plt}&xXGVrWMIH%qG^Z zY#nxc+eogt2)b;3cq#K)$?W+Z!vj?T?DO~aY1}WJ1tRwOEb}bccJtQWlP%g1&lNF zg_~p&>XoqRVSLv6`X(8+F1ssL4Pvv46~YbbuxRtqJziP%w6h8a7yWlE8RXCWU>jCS zlMhg)_~r&vJN1p~dC$ZQSzHgD)@58$t7>Ali@5%hqvJ{l`FZv~TTX%_+HRyFLT2ytx#}zH0ol3cZWRphfo9T75F> z-bv~`>N~-S^ed}%ZBQ9HOH4x7Y!p_PS_>#^eX8N} znfU&GmJ`Gd-)GE^v>mFL#7~d6W*?O;j}O@ij(K0(E*6UWp-0=@a2R&nkvs-YgH4&IZL%gC)y!3rtAo2jawJn zb|<}mF@I`nS~sd)A==IUmY09*v>9{|yAmLp$wHX>p1$)k_)17wt#aFKrpW0X+Y#+f z-lOK@ZA}`7rzRFp#&4cmDU@^}V|y;|(*-dd_i&7t^1N>06%!@$wBQr`Lk&;O=TNC- z_B*ehau(T|U9!$GN0$hEaHP_3 z{`3=GqbLhAUuOL{lE)F*gR|<7;kHEVWL@aV)koiO&qIq5Ke+`c5b_KqN$%$2SWVSK z$lLMS8hW2&dtkaX!9h1J4Xmxk-s&h7E$wpiIkwh!aV0{SH(4cb7SBWZN1`H)Fnxs` z`rd*Tu51UCamn4;2;J8w)H3$1RIe|x3~X>v-fCdzxqh0Dh@{lbbWWgV8QdjbeHI=^ z(ZNGrW;4L{d}U^3clahwP;YtKKy%=I&uMmKlVoy+$vq<^Oy;Ie1SGUref1bo*~j;6 zEbSt?HPfl}N@#cES6&U%1zM<1&8s_)yVS;_1vN~!MBGAYlj~(qTJ_6yKRYePX0bDJ zaVdw>QXyo4C;IMS@FX~B*p{mj3D?=Ri!cfiaaxS73P?yJB~c#r=jf>O!~4E5B?wO+ z|6B%V4o}cKQ=gnd>uo(6TU%R_=!@7-eIjAS$lAJ-oxH#p?sr{vZ3_YL~)PB z~JE8|%p$U(9`Q&dvIZ%pHM)*C3}s#?=`n(adrWLtDESQskwc^7dZM0VaN z%MF)@L)O`t2e`ZJH`9sZ>j2bK>TgNhwWQUOl6mdc6qRr=`Rpi>;uUt zB0zaSf(OxdmyC>Q0f0#=K>28v|}4{aK$p=>rKQQW6U%NC%-3#5v{tEM~ZEOZiDx za%#Y`XZd#vuOAzZk2oQe&C>Sp$0m0tKrdMY9io1U_!~*~6|-O^->iwFBFwKs-#6h@ zUI4LI48xflPVL;-Gm4rCn_xV$s(dQZSuU*Wp8YvTy##niop*Ozi@6Tqqk(xjgkSEz zNsy+Ke(KVqRJs zj^8{n(2?S2WEv%|ae*9Z)pg=+0B5++G2Fw=>o=SvhnL*!*>Lk|Z=>M#i#a(1k12i? z)|O7@1G}DL8lZlZf{9>^1dE-Y$27+ z;3~ChVu1}447uR=n~Ix#Mea_AVY`l^zt3{_r*lSdUB7Rs0C3de7vfOrmmNcoR#m{o zUGm`D9xwadB^W8kQ!l`@6hLOdd2I}P>#>s15T|}+Iso=8L5$A{JCi76FIDBTrU_c4 zVHt-G5C(lt6(WMxHa2KdE@ccDz1C(sn|84AP&s$~@SvcpNYm%+>i&esEPsBlv~gWH z=C{JE-07^ny~0BUyS6B4g>il*l>Ag$zA}oojKhB^kL+Gl$+d{60mzi-u`~`@tno(l z$Q~%ms5RWm9GhBVpcPhkq24om1rIxJoKi=FlYy`A@GcTW83$W)qC&aR(I_YUR@4faTB%2iX9I3ai3u5Xsb>94>_<1>{MT~$?53NdhBUv(f`wE_#uq3b64@<*=(2%;0=E~0P|W|%q z_bubS2Ag_v8-4(A=41cVH|wvn<-(bSarfGC;Ypj14lcCsbG#Dm%$r}=&SpHuBJ#l* zm5Q&SVqEfcn9@UrUN>aBmiPx-V9#x;1)JKN2B&J;Qjg2ULMj$@LeTx;#rWoXP2*X1 zSX(irTM8_W}oq||+NYkZ|bZSAJFa-hlO6%@69lt^9oL}8G}f}!JE@o+XZ zvhTsI$2#S4U0u@T^1CPb=VJ34Dzvh^e0tKOcE#mM(L1X=mG;-3CZLlde>i>j5>UB$ zYBU6IXQ@xWyeqCu^tbrRy{FBJg!f#}8!q~Uq*6~T@N*VDHG=4EMkD;vIu0Pea+(Yq zN;wN=A0;Ssoy#S68>VD)S-eSAEeea>b%7G=zM?m=ORb?=J&%(-Q=u5mg|twKo&pmb z6YRktpl{@mGTW*e05jnxWuQowSK{FJt==cdEJ#s6?QkGr#wWLZgnn>vun~DCvH|29 z(I3ev*@T3&f!JySN()HkKMu^;KNab0Z|?)VAlp%gE^(W^4?jERfTLoAOyj^e2BJ6f zm^X!DlaEulF!}bk+)i$1)w4l0T)T*yFC{YBu9%_MbE8_<1hv_g$aBL!QWJBdvr|8aBm*i6Eu#JO;eh3Y}!hHd&Z%ibhv7(|P#A~ppw|8egEp!ny zLNd__**ybv3M7-x6Ke78ZfO!c`bar(`4Swwl?|rJ`ryG2ZaENKY?D%HAcGBXf`T++ zi0G;c$N)Ree=Culcu!8>U1-{-QRQq+JlU%w?2Y^6DN7u@P!^liyW<7&6f`_Rsle{!>p$tf-QLnwxLqLQ;00IRKKYYH8tF8}ZHg*8~YWefa4fp9_L8f7eym9X% zY@+9;yw~vtZV``-yG}2bUA0;XaT#?&f|!U)J|HAS6Hset=g7%M^nfnA47M#O^!!Sb zD{na|DfU&jkUo#Knk;}ht6NxD1OygENxXRR;w`|`3$>qs`9zZVERrW1p`3_p zo+lNezygzCu*Af~kO{~A^-0}Y&kDd!S$X%$VzD2S1;FpO1Nla1;QCx=kjUxl(*Oyp zc_3@fgID?+8XD|Rfg*+{B_);Gj^_eA%L33)D6U-T4SOg@O0bX`H&9CcK8-v}rqEaI z<`B#vX+VO|Q0iI50Pku9j+UUH7Nz8I{>g4xoyG6wF!$vG+;-y~!`p)n_n8Ba9_arF z{i8&_bjHeyq2l>Rb$NS9mYM-mTN01&J1YPYOX8o|xu>mX`&5bPo`2~wo>5-~TkO%t z=IYw94R1D*0C;_u(Tpe#EKE^icfbTJ0|{^^fp#rXwj)jiebVGAomb$oGn+NTDS>E& zQOQstdUhtG&c(Bp#8ts=-ew7WrdO?aCK8?9rvOf}cY7PGLTWJVPU%IwMep6xx{7t&P}|;Va-5(_g>rOa{WH_u?cTqKX;F^;C7n3!B&g{#p5Iyts!Z2t)V<|IO|j^*&l5 zaSuV_7LXDZ6^sjGwa7VgJrb^V8ac<(>tK@B%IHxZBB96$m@#Kl>zl6uap zuBm~R+317D%HRa~4}Fl?xC^ZK-`DGZe_#n9ZNlHzznP=o|9_seJ`@$L>K>T~$H-=L zr>2oXqS)qE1_asu&=-U2RsRe{H>bg&RQT)%P>dP9>VwZf$N-xGw9rsdNv^LiB*y+d z7P5(<&Gq$fSy@@t)zuon*>rPtjrK1esB*~z_)WKUvxinaf^n-~>;X=bKndfS3kbXa$EZiNGilClf1>}qH@G}zwNoU|^J z7Z%3v!3`4K-c$hkC@Mc+g=FbL97Gy2iPHI>%lG~lFcW~#X98KtCh?V?mON2-^;xX2 zh`EI({$}))`^;oY{USi(k+f@rZAONfWlGG@{C^m;6GNozV9dEb;|BH6z&lvTj=M)( zmG6?8(avJe=PO947m2D!nkN=UAgSix->U~$ijff!Y4!EtE_@sUVo+xRkGQF(smTX! zZY|UG7aWvPoCej|z!JyC{lgo!i^vA7Kyd%9jkBt!Yb-KLii^vE9UL~>o8hf0@2oY! zcCkUx(f@vB9ncy{d)>hqa7|f!a|?^e`X2nVcdM|z7Xb2Z8{YqrkIO9pv3O>)p|>7_ z)GoXuNUyAnO8!2gOQJElxl>u+BVvMvcmh97XRnTvkN1xlNQ5S+g44+!Mf{)4x#FJPDR&MZvM*C z2mJ1?$@OJsFI)SER6+mUEE$k+o?_#9Y4~x9 zdu)k$>m}ks?^u+Lw`MqJkHzdps!8l)P9_Ba?<&uQ0o!%ICS|3{W#LG0t-EslLF}fX zt@zl=g9V)a5SM&~NAaqhJg&As@v3}Q{m20@c(z~LlXld@nP zy0D_P3{ATzs<}9A7`MQc_nEDG7|uCJnUz#D6j6Z*!V?yZ4T0mz{MZQ9Pf{(lbFXgniW>;T(V9xgmPZ zfqKimDn_08Sl_{dizjPihx^kpCtt{pPu^aY{}NnX2QBx zLdFG;)u6f=e-M-lopaJRMkQy2N;k? zTq?JPbAN7uO@2HWQpa16P{>~#L4>bs`u>U1&I&NLbOOyH{b+81xF+FB+>qxOp@_KQY!J%=e zT9)|gke;Ll=A;OSXbd`}G;{H^S2<9?%Mw<&2P3XO&weQ86y(zGP}XESoYrTZ*54{| zG5b|WhEfMY$yvvbO@$Ef7)ik{nDSA&hKAy48LNKaqbf}DJDe8RZn-|WvYCA5%qQ&L zt-zY59`@2V_f6J{MneU~xH55?%hS$ooE=o=jYpepTnL1zmzAlR7~!`Nb4=x^fyr?v zBf_O%D?qc4$|xs*eRrcWDQmu`t8=b$-qPH&Q;(e`u$C)0r$1eq67nnQE{05h?(VIm zY;K=HY>Rov^s6Zsw%0?fbbZ3toZ^R_M}OhxQq3JJcZ5sD8Fr7F*yNCN)9_kBy?rz! zzbqtEH>r*hF$Yv^Vbc?FJSGU29HF5R5Oj&`Gq=FTh{vCCIT9#?Ea=FfpZlXz7#Hu| z?{(rEh5ZN)vVOE0!oJ{Xp(CQ(C8uu%ZS|%+nos1>hoojU9se2r7xBA5f&=XRe^F17)R}HNCa@CP`oPiyW{YoE4zjx zNT)w@6N%&4rRku88s3$lLlLy8 z^$)pw@ghzNyyl%x{D86WuOQK`F zl0UNaBrAFXhPM+>^`{=Q#=Hu8%OOd!Z9#cn(ihlOc*kwizPLBp+ng_R(l{Y$9bUA) zOixk5!izKB`l3IjCG`H>L5R2UrQdl&9t}@adrK9(7@QqyY!K^Xb!XMoiky`5lO~;B z_C+hFe{LA9;i-rf>!4nwzFZ3t>1>(tj1qy{?0daD*a*6Qh-W40PW9eiVfQlC)~z0x zW8sI9ua#;WuJu{<9@oNG+2!(AzENlG^;|Qu&t0qgw4A84C%PBPrzysdp3KQ+lRs7}8E2EJHoJyRO5?(dzkE+E`ZN^WTi;0R1Q#JAyp8A}U^+R9YFp~Ro<-?Q;h3CorF zHP@Hs&+BM8-ehnCCii3K9aYjIk7~@P&!17xKVCGw&YhDN$LkxJQ8FtOwftm(<{Wsj zfxjt>b%=iX_L4J4G5IvLY#qJzwXP}|aa!En^RT{#b&0Q|D~BR9hN4LHcVJQW zG8&b=^w~~Z|CH$1sj;@e-ho{G+Ex#{(N*a~sSy5Z?!Jdht|l?s8#;bp6Ca>snUBn@ zWnMjFsX5|tO7R7VCd_gmDibl;c73(p)bg3lwWN-=wJ68<=V4nH;Il^^w{5Sy8BVe? z+rRm8!yz->4C3D9;0DyFZ25%f{An?r`AO z9}4UT4Jn7HTWxdGt=!gNinim?h#6$N)TUVgFPD`U@n}`up;KZp{}{&MnD z$DVqY6L*fSaYw916kx90ik z0-1AoQ=O5900C#=^XRqFU1nJb%F$XwdQZqZpR;kvb5u_@ijA4Ss&8&y!J*bRch#ez zV$R~eOrL1ho`T+H`J352Z_}>{cd)*r)JV3G$obQ^P`fxDVqzJCcbPk_lDgHsPzM)@ zrFVT6i`4({^=?_jtP`2bS_pGFWQWc-Ht zcNl(})9_&2@V^U~%UrLX93CU-Shn_XQRU6omk)buKmM?`hLkEu2R=!&z?|@|xGaLR zn))!YM+Hgo)TNqgQhT;I=LaglV0zR=be82*Z?)V&tLLa`#_$|}Z|Mk%7E&730V?I7 zSxR&yXiU(h!qj_I&ya94mwUkYT0)Onu|g-2zKu)O+B?}3hHLbVt$#)sdSycmt$yKqF*Vq;k7n2 zJ>PjQ)?cT;-nhJn*+cd(!uqC{SrvIThcX%$Y8t|S>!P4H8VyYHGs5?*wxP(^7Mq@e z&kF)KIeIGrt2#l#OV^|+NEOufXhC!h1?R@nI_ES@%VlBA^OaV}jOT3}91uBEZD(N# zY;>zS%+$a=wrQEuGQ$#>4Vts-#ka9+<}(&yd(OJ?)X<@$M#+(wVe{PH3Cx3-2jyj9m?+<>U zT*C&b8MIo<2P4b4IB;N@*HDdQM+$fNXieSXJIGlnQ3~vBc4g?W-)sCf@uy7l`d)W+ zPI;UuHlvWvrGoAF|q}xt8i$>QJ z7F$BZ)9Aj<%M2J_(4%%9y0_znoged6OE#-)XTbVe4ALCcdL?~-d*L|46Y9Ep+aq|j zb1he@ly(_W)S2PC(w0wy%pcX?3{QFlcwgoR^;aO4*i-3ibA?S?83iHY%8*J~%&xVK z*7l^8+!t@1<&=0LZ57mN2F2gqq3Ku|H!+HR*5T;pIS4lxYgOO!@EE#>3X4BF^j2&2 z_|cji z-|St0?_e~yHf@;Nb}TrNopzH?SK7%XOhL^>LCnw&w!|~FyK7e%zr&(3 zLEO$vN$GIMj>z^TQcfv^f+NFQWNivy>S)8d+KPLn%);ZABTc$D{Fb7;SbO7koD@J{ zu%ax$uAcmNQ2fju)OvslO%7yfjmKVVSC_6Dh`bNmxY)MWzo9j_UCt2ljy>IOQ=`{I zMBBxg8O1p0CoLK?fb+i#)8DIy*7yZr(-#FSXG~)chcH`ge>xi!`-w!clvY$(LBGh5 z4)*JJbZp9T46Susoc{#M$vk@AuCa)W`VqaB;R+3AyV14|gnwBXMO(!S#z~8fOUik+ zyZKx1&bHjY{O^~XUD04T@ea)32%F0xlD8^7U6sn!(r-6-idr^`9zhc$z9eKs#%5C(C zX9calFsa2~v*surh7yEh$Blh`}S!kw}zD)cTX zzvs!$Suajbeg={)m5zwr^Sj&Iksx6RfV6h~zsDY@4RA&#lxmvnET`TDQ?HYw&Jk1% zt}6!gMsMX_r5S8t39#6ndUa(aJsFZiQqmBBn_3(~h;)!%CNT#N4k8ao_$9c$V}G~D z@Pc`B3r@3bY;2Im+1??;l#w7Pm~u9^X-nRfLL)rz4p(ekZmgx7&41n^``(X?h-gr& zA*k#u_O}&xJ@JUw%*AYY-UK%5H(WD5R=@3krR^h6{tZw1{u{T<`F}kr3twMfXB7M% z0(|!XPSJ2;G3w`(mzgxPcbayB(v0Z%Y z_O9Knr4pSdG)28){~&P|i+w1W52_B&K&nW~X=MlsvK7w4)PGE}+Btb`G~N+$T~DU> z+Eyi%)^E*rsDnB$x4Tz)%0jvulU#fhz;S#bt-|iwc;3-!m2yf-3W*84 zxwW+eN)1>U8B?3BK>~$DUV3NyGd;hD=`G&U62UD0e!67FHMXaxhp#NcZDeQllV-KB z;gNC@{^TIfqOpW^qQ>Yq$Z-LI0LgP6my~!Cp8%A;lNh)pP#j!#kV3y?i6&T#RO@x! zb%#Rg0g1R#o_fR3PKW^II~MGz0wDXU0Zv)q$TB`hCv9Lrn?z*;d37h@-NWuzZIAX; zdXD^tsjds$={iw6b7S11pkkW(g)4=g41m$0y1KEPdgaL`xDfg94$3rQ30WwgSoyCe8BQu`Lh#s;s{?>8+N9_3XV3T^T3fmV9UKGGNT!{Y7R?203i z@T@hwEc*l(ei)r2y4{*>Hv7E%EYL+vwk08#L=z(=WU5~q;cjf;AC7q)af*^t#OZOm{IDR^e3>*|-RfTIw0zu&QCblR zN%9YJZ`DB@4iQ6kE%J6$jc@|C1M`FsyN*ils1fJmmE^?tz zu3VoX%S`)oLw90qhkSQK9B_uX=j&9Lm2n|-7!VvG76hD^wYMg}D`I2&kCiZLUrZ2KDTWD_&ZNkG<+w|JR`YTUu0{`pMn)~iuaLE z8e-FTsbf}jeO?s7Y)vep*E=L%;V7jLkZl-xrGZh7*df~as2d*8ia5Rm1Y@v8ZB7RE zi%Ps4mQaZN;}a92{WFi6K_N)QG8DDxa{1xX`7u`OQYdz{vwzKfP`bx#QEk{xPnTnd z|9oC99F-BmGQsuB9bQqPY&tK9$*5KA)XlS4;ZmE>=S*4M`5o{n3xz_#f2Do~diZeg zY?_4E;q8i&x4)#o?b(L+ak_wCPj&NVYI5?QSXh}7Bs~3SWRqERai4 z2MMF=bRy}1%paGPolKiBAS9ch%OBQg9M;(Lg3`aEH}Tb0x$&FTU)A~k{XfB7W7P22d5Ib{9TRHdR6Qc?E4mU;IOni3}cf#%8uCxh!#x3+zUKZ~h zji=vSo9}Dg5Yc|}96l^61qx3{m|at?giW?el1AjyiuEL=m+mhkDmXaPzXX=>V)a1nw5DxKVozd4#oOXbLh@1`y58N zZ_iJ@9WJ(rsBdV{Z_<}UFS^t$Q>D7d$E`fb;CMMYH!+kAw)?II-a|ttuUm+i5$Br*oYbq9ft{XqjIX4LHPcCq4-$_wx=mnWP3s9;b zo(>AM(6-~XoO>N*;LljIaz8cdrLSg_LuNMQY=b1mf%^{JYyAf~DYs9m<3t*I>wtQz z!l5$TytTShgTKlwSk*Jc23Ia-p(0dC= zNkRujM0#%tMMOYKK!gP8@4l9K=6V14{(0AzHH$TqWODC4=iYPn-oLV~O}K4)gt@}b zCiTxd(`Ez>S1gZe)6My>zL%g?SicyXwX2ZLr{{L@Qg>inw;Q~kGc3#9L6~VRIbeU7 zZg$*p7gnA935Q1S?DDty1i?|Yc_;rs?2vneTKy@<-Mf?@tvPAG(HphljN%lC3k?=kJ3L!<3Ai05~OngncXa>u^Vj1EiQ zF)3{6=XpsYR*rot#5T4)#6G~1xA47Jp)gxsK%Z#YOV?*^=4s!`OM(lR(?*(mz8aWo zb(0TZtphFlUou5mc(m?etCXqjIEZjUVs44&upeL0+B*I!MP9G;S{N9xdd|0b z)#;AmYOSNs_PQg{#0~Y9+B4kTby(eF?&>)kiGLP-QpuXwgMC^-hX^g-M@AK3y9=DE zz2$bVR6%X}II&(Q6gxI<9J8d3%^8p${dst@^(-wJ-_uZa?PUMvjoW!z4$CXc_4L7yl?zD6}E@XR0 z)s|hlHR^?rvB%G@E==QXek(NCAV=NoBAaPKfm84J?+84 z3PHv^%z9bLPf;(6jW2%r>vtU@DZLjrUpkVS$~XBX`z|&A(}9vBJsjd6wTHt|dZVL=$ zM4jc*q`=x8?d3^U^esti?x`oIjbpl#fAAy`Xab8@MobjjToHAOePXb>(Y4N3Yd#h$;3Kr+B+Nn8H2&(AA2Ty4Z|Hp2UfCzML!6Y zokZY+|O^3V4z;q&Y+ zM?0xst>|uQE||9qaak_noQOF;&U0qiZ9o(6&B^`tsv7%h-yGwUV8f%5xpf#X=DG*< zi2|67iFsdwR<@KOc14-LP^0MM4&A3h)WzikBg%asXD@QBG(YHS6wm+-&6Cg|x zE1w>5$L4+{<;7UvE7R$d_8VL_9d|5Tx-R47mHtn78pE*vgKwe6dDP}~m$XVn4dnWC;|rgMaT}VW zRT9&p1b5$2i|6wWB$&YiZb>X&);NPd%w)#3iN6ZXIE!xh) z=eBa8`r=kXA-mh#K?_J!lSXRs?*jFem0y2+#hj#N=%I1->Q#jPcI3Q4HZWDD$`=RK zu3Z~-C&_yI)|6B<`zKl7ZQhwQHQCmQH&5SDe(=fRJd>wq91FwjV+T=&xioZIY8a8F zAkTf6*5!I!U2C9Wcd+7*y+63*+EyMcj5ArI$y)P;)K4UxpFYl=@7wi))K{J5!JaLHRKL1fZpYpc|KdFA8>_u;;g-}j*`Nio zP>+dQoQ@USNQwSwD;;ciDId0Lyvn8OfmPeRXHPqrjUe^`lOP{! zhtRUnq~QpXIS;wd`)lSJ;KA7^11O^iB^FVBcr1;EkD+-4YGWl>Ot{zV_UPMRauoH^ zh-H%vz|Pk>8mj0lo@6krP^$GJC)NaG`{)l8JAF@Dq8?^ZPFtBd>qbpgwRAh~T;A@i z_Guu{obqP2@H^vdx~s>ymLWZjL&Z;=>Sf`Fk?zngM(aH!xyboSV*{gD!&dl<^@9R1 zc5dUBN~mX#6Sl_$1>Dhet8Fi%qL#j?^p!d&*~?y@ytAM@9=%y6Ddj0$QWva0en$zP zyP?n%5)zUO9%bQJ1$p_PngGDF8$A=&4-|4wqtaH8Ushy{V zwO$k{X)xdGN^GH)96zpfC>VwI<#6PqP*kkBn2wUa-0UiMb6%TquIvCCC?pQBq!5ey zzkK<^DF+!{hb3v?j9-oFONGVd`k{)&ufCQy!bN&Xn&wJ4R(&q30X5EZP5njhHBVCU zwa0m;7Cm`#x<>GL=Y!#x8>7=Yo|e=;4Tp_K9=wH}M9rlUc0Yl)x&x%p62`c!7}+CP z;UrEIbd3&$+!*@#nMcOG(r5bQ5we}e0yf@HYTXlW_apn_lDWS3RKZcx^f{`t*vD0; zi@FLGhWPO(rK|xCxoeGgZ+uhp(7NMGPuG>;23tNfLaz=zZ==cbZ=21tgh+DYe zK7za`w)MN3{f!S%W2^NBFEJ$nAxW1wcK@D^ehdi0)0hPxhAe?__wxMVq8bf&Bx;r% zyYG3VD&`rQXY9zt#aS?Aw6~up@y=bbXYj1oeiD4xtJB4y?p=y8o>Sj0aF8coZzed( zQul$@eXi*nlMzEDLe~A;#)IA+@~=^@*YXd%Nef*wJ+lbfIN3 zR%tL}flaPnWx2U-QnH;+`68`Xef*L?sjtA+^i3-v(cO)Kq!Dn|T=SOm4GYJamB`?? z8o{T-jxxO9ozUSi3OE&HivHY-Cyr~@i{|Ow-#VQuC&Dl@YEHeJr!p^mq_P&h)sRxu z(Dn7CChYaqtaMFyJg8dKwK%H8 zl?aKjZlDP1`Q*(!Ba4*)aGJ=?TXSW3;_ zsLEReb}KtKY$45NakRl}40j&7)PVsGBcByO31d*jDn zQpEEzVSb%=1%Z(`mHn_8f+yH5sC&a^cuIOZsC!B8Q*S*L6Thask+wtrP4z<9X=Q>& z#!Uu6b>CDo&t%Jtp`gOJgxRxfo$(LHHfdOeefRI)w!)D{&QZBfUkc!uBvQpcqRnt{(71k?DTH zWe;AEQG`$6a)>U~D$MHOEH@rXEr9L*-STC`B3 zQWc77<=$Ca0g|}TU`d(P95v7PvKd7eb>hnA&H9DsZghLxHahLlTC|#DG;z;g?7DlfSc(fFtk;={${c>{<<>vY6bJcbObVD$l zhEz4c9!)b&$^!ve=3nnIOL@UwN+{YWx9g;K6>F8JTDAt-mxfmKIi;b=`S*iLmMHRv zM)@~t4couO5ivyyc06)deS6>DU7K~(+=X3P$;xSn@XesmCD&YxpQh4Ev>2u#1-O>)b}tusEJQ>6syKu zkz8-zN&YdS$LwQ}bEdk-th&&^&On}hfZ~s#(s@r4J$g4sG`TQtBL9QcN~HIw1A|*i3Ew+i z3%A|lKipIdi}kTR{UT~qN(NvjhUJGhSYfw{s5mldsHA)#}(594yee9WNGDwan^dwQ(F^cz`6I$ zlFcTOg6P{I5eav1;Ioo#k#~~R-^(T;nfpmvkt7uRn`Zq8rvxxkXmIs-cn?^n24reE zPm?sW$z53yIOWY+BTHqcLeogwAdlx!k2R1yJ4VpJi5zNb%E?h>8Y5I5;ZYi>YiSvm zUgpt;-_b~^58Vj-gHGy6LJ2kqAJ3p=s2#UaA?S>mowFZ%sF%7EH<+VgM2^BWq!iYx zy;lQRs%PIY+7?VkLvT36`7N?kc|QnGAi)a*>Ur@W7*nJOF%9P8$^hvPz-HWPOq@Id zV9sRP9Ic|M8MbB1mR~paKSvE`Rm|pBW`YPd@Ejzuz+$7XGOry&;zjs4JkLZgAV=Pv_bXYkn%h& zRzPx-fNm)0!jf(>xMB^;4SB&$8XRn&e*RZa5PwkFb&tC0e{7d?tP#1$-`9U3Pk8U| znIj+H{Vyf^|NRqJV^hoz;K&T?p_{UacH;b@dQ{Rlm;8<^l*Or>d$N z1oqq-z>WuXIpkMLAUU|Gv{?^Kb^iX`CXvc4me?bQ51W1Y@Dfno_N|N(@gOD2gj+$t z2qb!Gh{Xno_f)T3c{GTf;s-Fe_|@i|{}^3A!Wp86(J3>oNNEwdi=ZZqr4o94x1|L+ zfPu%9wbu#`vGN6}8D77%TjKWv`RfdFO62z{1#(Dc0&q3~N;fT7MD>=zfDzHS78fGt zjOeRC58$x+(>7dcQB_Eq^Ok=Uv(-tzPzw$x)CX_F(*HqaHx-@Y;g?v0h{}OtNkVs~ ztAND^$RFe(*6Qgo^s=1cxoNN1|0cfEsGE`>rna#9{_y;Xf5&3eITD9>s#14@`~0EHxM@v2m}bkBonPt{i1R1-|MoSc@%OKgOCP8_v+VNY7Mfuzwa&x3{!}&XCU$1i!ok{TLtQh-B^GcFCk9 zVR==T7w$e$4dibvP^lK;(fo0|L_0$PduubKWO>_~tgK_tULD#;usZiY%!SV%RbbxW zsR2QTkyRKcVzPnU0U(rb)Cce;IL%c1{7CvB#x(ak+Zp~m@9=;Vj_?0jqTCeAQdKKN zM+(`#OtAj;&ysoRU_i*33ah<_qiI%8qs$G1$}xq-!x3j`E6U8vdP_U|PqSaH=Scte z@~arKvolOGzzQxAd?;{GxoeS_e}x!1A>z%Q``K(J#GR%iVAjXlH6_Ml(;BV?PU4;Q z!^iZGj_HY!RPGk?w@PFdCA%H|Mm*Me?BkA!wogd{4VzfE?+_6Y5hXwzx6>n4R#9Qg z-wg-UNVe)aE@bd(2fxb64=)dm3COjB4Fe6Fgwr8h3m_)R2J&!oXRr-}g}nCO1&hwZ zP0oj(iaph+we%~uTZlh6aKxY9dTHdR(Qf$|lich4$03{u#qzylNsOZF{*NTYW-Y7m zyAU9$@U*o_Z!9U~YH zq0;1Hf~@{BkzX&{STbYC=cc(b*UlI^m;1jIl1=@0;U2eajeiWNS{m|9A=P~S4`3q} z8Wfa>nBTx-BjOycxKfEpO#Rl@Mj4fMCS4P@{5y=%^qB!(X=&+2s*aUmzWM8j={~8dS@kYcwrD zzZ47%4B&W)?^%A0&*vTXU_Az_@f3)T#2`iiK_@?Gx8}jmTlo&j*kw=uEgnIMrluwh zD=VuvTv@-z!N#bezCMUV64?xRF_VL&Pg={_445SC=^xHO#e7|;vU6AiuA zLjQhvMiZe>g5UQqgZ`|ws`Q6CWwSS3H3i|UAdda5#=!5B>f8wjEu2>G1_1RVm zLC_~6Qv56pC>kA5lN@cg?gS$*@GGdFn-ATuq;2#!hOnWHPIvrxu?sKvIvLM${})I+ zrUJbOZb3!!^ghDSd8$*=ucidZ)jwiwL@efPM{e2!L#DNicto48SvOeo7y4`x<#WVz z=pfCrsI)%h@k45d@6tTsfniDU&P_IZ0bLC>@St@)u>P3Yk@fgrZjsdq#JC&mq6y%o z$@@>d{G_m~^x8tOQ?^02TzMH`o{;9KmF6mcA<+J;N4OK0X{7GJJbOF}jn)~Y^z?7t zRCLv{zer`O8!sp_r2H>S>GO^}bjKMO3~j`=S4~OM(PT^Kq~j<^=;Mh4Ov0{7PM+Ng zj`YfmI&(XVt(OR>#NepAkdQ{DcSQKhhbQAt8#5PaswNIv7`;iMO2jA!&>N@mKDgdY zZJdMZhda9LQ!iaH=6PlxG^>lL2fNL#r=210={@lrpCHDx$!Z&rgn)m71Dhk0nUeee zGS8|Q?tw!htk}VbeH4_aB*EeZGgPq_x?7oH(uoECc1L@vWhtke+efMF$God3%UWCZ zAxXswbDwV$b-UX~Iu<&jt%A0ou+>V-=<0hYm6GdOz7D4xyi3AG-W4B{NxQ9)c$?DY7#iGWena-1Tn=DxkcEs_-?scs({ z%gZgOJyATEN#VI2yi@2R;qnu}9`Vbvq$&`a`Z?ztvmB9|jSOHnsRc1dv3A=b0zSJE_L zy?jY7i!|f-eDn1wsg)}O?WP$m9*SMbYR{&5*S2iRk%slysUO6zoN`FO3PeK_4y;U3 z;xHOGAK|ASRsUUH&1_|O#}!<8e!V`6g%*!V@;A|X9#;45nNNWs2Z44Bi>`cDQl9+E#hT~&Cx4X)z;QVj3T`mSW~mJ z`S5zh?Gn?=LHT!;g!c9b+l&7>$^JcdmqKG>bDqVp5{z%_4xsFCGcgO1r=D<5*wSW4 z@kMo~g{;SSPZi+-s_JmE7!doRnMj-wOK4={UUSIjtRq=Dj;79bwvU=*NDO4YcsnZp zsqxL^ay==a`1mH9a>UCl)`PBXZ~qdu%@o8M0(gpI&NI=FsyTqX8dUn|zI+pTB_)yL zb~p6%zAr$AunfW|TItZ*9mMNlreeiPa`{^l@}?tL+RcBr>&;PVdeZsHmRF%QGI8nT zRTd_5tG|TaqFy0Y#NwPxV@_D46WR+IWD6Z#UgHZ~^K=-^Q5{wihZ0JaI-UkS#p zE0mJsEIBW_2g!7K)&bgrM8*bZxr23n>a+f|l^s?g8zXRCv{36GIE=HF8minnp18xm zdr~f@@hL3(FM;}ow5}O@DA$fqL_Z!pYQAtmdR zkzi+AzYnha|9cPF&B&+)>C2X_TVdsVSi9ElFgrNVpZw&>mfAHac^_qsl~=9yWIz)H%1d@xAitnB8%4I~1Wlg_K@s`G1veq8ma zGP9eL_HSCN2)nxQ?k$;9Vo8z)0wiT zQ(lS-Po)IyxotY@Co+HzoW71$*)1Upqwc-Q2 zqqLcMqtxl{zt2;osD2f8=102zc|RP08z$f}QwDt^0#-!yMkj#XlL!P6UNJEpSPa$f zC!la^U;tnEu!#jiz4}oin9R=~t}*W`i}O2=r-1DHvO6W#pWL~&?eB@M@dH;AA;%W| zte#lUyGF#Z2%pmM;B@_!0%Lyz-m4}pfA4>2L6q6~-2qsgdl(se`it#p6KQc6z$BNw zHfA>_AZjC5c$8}9=uO;x-{ZLgoZQBa!?RT?TsX?B2h}kObKW;_Zu+6N7FTTS)vBNF zvC)&YC!FECVN$Q1RA)V-6=M*G9{;h6HZ!O{Q0jvoYi4IT9+AS7yQaT8sL=5lUl=jU z`Mu|7P5-xdJDmo1BZM-``P744cy_ZlHJ7gGQr8YNpscU(g6oX7&U3Wu6YBRv^PSxf z+Fs!4OLxo+bp7~F6ORZU|9h`gHKhR+3({J|)}{k`L(rh13=)bVAvt*cIY2ln*A5;u zY$PD=UFK0!=&A^eRb0M}^Q9=@+m^zipgehSu`5}1>EoH2<0#a$Mo`igdis~3 zS21I8kL}0=Io#p&HZLk?&vxunq19aWl&^U5*sj}tZN_hfEso)@$PJ9GCdYY3rPf;N zznl+0=drM3tfWG`3;#LeWH{r61qTAU<0kk~#X}h{x58sZJ_tDL zmK<2-*iP0%$t1F4m%GuUsQkN0M^ev;PQ*9lS5P#M7%J*?=dCL-s9)*4;O|Qy^@dGS z7n3=q9a%f|rcNCd&%7Ue^iG@D`0$nDm|Oj4GeUK?N4h0XI!?)(=v*e1ObUM|3}#L7 z8V;3YT21X{lU6%miTgy7)4lPE%Ee{PC;5v1zSQ5LeT0((2o9+j)CHeqmyQ#2tZy@5 zUiGokoD6bX&=jZGmBKQ6?l#saJ0iGWLS%uEaFOB*K!r+BMGFV_255UTajXCs=R4SkDE%G?4I z9NU+R12)%BCj?;iUPhs;)9m!b4hqfAQj)vNJL`0|@yONZ9ZgJ4;~nVJlc?QHzt9~L zFIJ+&oA80b``@I_N(z9Nitq3D!h;oz6pz6C9qCQhW(dCB1FqvShz|@zErn1is{LC} z1$J>av8}pLpfFI-WqW;t^P^P75-n|om2~}H34C9X3af}fTLh6R#5HH27{z?XP;QU= zt;h16*_GCvFBi7)9~ajyeKoJ1d)iRWjX0x@O%?Q3j7DiU9BL1ZeXDocfO1AsO0PWX z7Up2OW>9y9h}ufKlG*szUHqt=fAkvvtZFdUB8LK}r>C#kpRPaSdS6SD#kI5Vp9=;< z;ym|lPyeUv{OZ-KJuUY`kw9rGR3sduWtYQgjVdCA59&%N4&ZuwrkmO-BFkwDA(uxp zA7h)CdHvlLSI$ton}-!SO)ygtM3$m2g~{v7eE4w9yE`yL3c(AlWD&xb!ml2)3d?h$Ea3e#y+R+p(fj#Ag;F4$G)Quq6AB}LS){925az|Lu8 zePNqA zEvk@)^yu@l6C|ObB^G~0lyI2-^nX(Y_%Em_7il=O_ZJF9$4@linFV%yC&V3)a;Ac-=@fX1<+|?rJy6JBz3@LVNVqxT=H%yxbPRF)@?kf0 z$5979Y6W5@G_U-*1ZowoUEnX=uO|Q*B~$F5B9h1sslEBWxI;NK|6265^qT(dpT#aX zPO7J*q(tKM@A4f%BAEVtdMc2k2CTqy>O5gTj(C{&FaG#pH^G|=?u1Y}Xh^Y~9V~~i zG?+(Rf*pcUBvpXUX_K%kEzieoSa6(@L(FD?3k{rDq~`(R=;O0V>))ZQA9=XWcaEP& z)gG02`>|Q^`;H>fJsZOZnvV79sDfEn8m57{=Oq7*mex<*IhI9XmkPg8%cJbNmpdfc zkE?ff(74z;c#RG*S#lV(Bu0qL1RE|Z?eRFTxYM#pa))F0PR5e`1M4lhs0AB#e)rh} zk`v_7irf#Pex=Rr0rnnj0=1#NrlI-wOT{dLKL&cJo?m8hlP`)rxSTz&U+C1&p8i2v zxPaYAV|B^*CQR+?zBTlxfhkwT(eyFO zelwL4PE^OvSw|wlS@Vktpi|Fxrqy2XV=+w2V?DTH6S8GeRmDIm^@1xjq#pF5wCkn|AD7sKpaJ_8P zkOgrIxMm}J0C4kCASVT2NU7R~Q469O8n~WjLBSmnaV#&+<^r2K9jXK5(w@1V)Z0Mp zEuVaB1~Dn7lkXFDuXeWa{G(G)L;oN==qdOth250voMYHhsSwj#^26f_5OI$={T{nb z>G1%_di(J9JNdo3bbd2dRpkwR{T9=NKtVT)sL@*;HXXyqqRNp0sRrtSKGd$jrq0C~ zKQa!(0{M6##@9MNDRI6|nuX`42WzI1WVLO@BKKr@^YZ8WE1RAkTwaZ>Xb~NMTH*cA zT!bcjPSW!Lo~DN^6cwGdB$Nx^gwATL=Lh9?eYZVk!@!LpkT;`+gF{wQpCVO-o>jqn zet&l=l$b)Z+_>0qKuUo|`_kd)U^C0D-SPTh^UnBoAa1a*v1OA6u?il`3vJ)pl4uZD zBW*(vTtWz>9&6C#%9hy+GNLJX>I5u%V&E>4`oY039tPOJZk=vB-$4Pj=cWJ_+?PB< z>qTm$)0sXMe+EbSqHUC*qo4auN|sD5_hrw_S2YQyNL!8G<((^-hECCvRdQQ5Ho1nm zX5$JLD`_^E9+l`N@o;4Vx!Tm7tdTpoW&DJ{nym`vC^U-2^b8g_cJ?UVbLpd}@-ABq zooZMkFQGDXo@R_UHKph&cn7s-Wwcb!gpCMfv~OkslFP2S8!x~*)RJ5%m(M?IUa1Ig*$CN8WpsX54?079o zOWs!DzU@I_Z455TH?+1YwXOcsv*bIT7JgD7U6$!8$lGFgHX>i&dc3o6{a8X2~-CZ}6gdu9M7}wg* z^A7A)2}ZU1A^%YtZ;t6eyc7YVQwTyRYY4st-P?Mg%}plcowV5@Lj?11je3BjW#fb^ zL;Gk2+n-k_bJ4lX)r6#zlfIm}>oq7WcI#F%r@%|5t%jliklrH zD)kQ}+pKa=1vV+mj(Au?im29!t$kSj)zsro_jcgG3wPKXWBZ%UMKKZ83pQ4p$6MlZ zZC=N{xxZ2Sr`|<+;_DgfP!3%dJN5iqpDFt_cvNq?(Hwg7_O7lv(P5n-muLmA{%D)E z@1OR`e4hNK{F5=z?Bl2Ip!UNiF&~)A#Jrj8C2}rJtw(1acW))0Pg^q0qHe6}WO2;s zIdGE~;tnqlYSV0w7Ktqvpy-m-`6VV3!H!<7RVJb=vk@y12F$p0GdWe1|Lk3THC2Yq z<}Z65NNPUqm+(HgVmu|{UEeIJ$Uedzm{J@hKP`S@t6DsJoil032>L1)|ya4)m+ z5=LY)Q14C#)>lO7BY6NyKNm?uOTBO@XQ;nw)Owshe?Gk82hx@AKR|`~70ry{3B=M9 ziW`8FDZmrc4Y*EcmezS$ml6oc5#c2wy9FE0g{rNLh;%R%n&Y`dFW$*mJzBl=809N6nvK_&5mhNKjGRbl;s=DJruFBY>o(sA1 zdzAELl*dKCvV5%n>5e*2cHWx-;@U*}-|N!n$%~#gx(3kCuN*DC*H>^`BD4UC!se&( ze|Okt^DO>jo@R|tqRAemj>N;Fv}A1aG4A{h^G1Ca(&EnTR_O^5BGYd691t3GboH>= zrEVm*ddU~CkM!G!cxf+N_%c{Fd2kshTa%;D!twLg@7#5HG>?w)ed zCuJ2Jm-)OQRR!V zH(wn~7y=IB=$<sfWA|)EhkTmDCBJ(k_=p}&b$yS+44{abz3>_ z^-H^iBxR@GPtR}903^}jb9&HdS~!vKwS`AgePJ%|@3DM@Q;7Dw{59#bZ1&4kq;mmv)O!O7%D*WPDkPx#_x%Vc$qu6a*HBc!l7t`qwcWhmGj}rQx@cP zqp+{K6y~ww0XHETzjaqlkM(Z?*=2gnI)(2l7Bf)}?k&{ytnOA@vyvM|$JH}>^4H>C zwx3uWHk0$h#JBF;+THhROVcurG=#UmgRW{N765+P>dK1GMs|FNu%M zr!jcM0pvHjn0WQg;<!riRb9w+Py_x~Oa%WL1 zzo6>Z?|mtTOuvV_s_7ihC8T{us8xS;Cs;m@TnniXf;WcuFvevDOX`Pr(srY>kH5#S zsgZtSzCTkA)YsTEVIbvozE|?F-*eEQ{c-PQ~BjL z!o-{w*@`Yu3D~{&{&f}0|wvo zdCaw!yZBDk@E?jbfYIAn?x|du z_1e${gWWMJA26>~Ml4Jbi5m2GyJ|nyc#*N#! zSdWajy-sEN{N?%BNFuh-;18jo3x5)mlJtLl!|yM)Sj7)HgonJG+(i+EAm9xl$~lB| zRJ8l=R3Yd4i1SZ{#3t+iE{Oat0X@n}1EYX`^@p$pjTW4MCeFcgL!Y5HVCh2fJg{=a zX54^2v=FKVJ-h&68f_;!&l&)NEB9X}*8gM4;1*B_v~J&ig~YS4L4$(%2GSxDup!rT za6xkaUQp2}I9kXfJw~B@G~#Isv;ct1?4dBw0fp0$*jOtmpepr0`?vhj{{xJsQ(-eh z#AXON4l4Bs1o*$c0;bItR(7^PSF#6|+J6SHXcQLSNSxj(AT~&YYnwx0ErQS~wveKL z%a{eyyspbp37|p;$gE-Ab(`#-tsh@93~SqM+Mk?;r;5j8ne~ z*rtZM&WGg1F6LUc)v8SA>7w4-NX`6^NnNitbYE!Cz?M*Z?2Vddsve7RET6$2$&TV3Z+nElRdVA>*Cq5i6%m-u-u;L z--hZDx-kXj{fL|$y@rR!GO!>ksId5=_0>-~IKesU(a^_eI#6y+(xWWhR5el!_f z8gXb|^IO6Io!-(p*(BUt&;4UqV}quuI1OGG|J>;07|yIJ^k+gfSHewh9T)+_*kyQs;e7MFvY^W?uk2O z!YVFn>)R3iUDQ|b)k`RAi4wh`^?~mzU%^JI7*P+JFkFCskNIOi#*3Ix%sDY=bQGnj zU&YQat=Jy_IGz(Vk@~jkI@PxBjFQ=471th|vG0~ci|6t*;u~Evf>&Vh48O!)r%hVV zQj^!q8+%S!vR_n=GT!r;bf+!o?LgF2L~lmj_hN5lQtfsX)~U;JF_Qwm{{9- zz4|Oo^-GXqGmm!Zq4|Ze3c2M*VU@aCN2K&fWwQ#%*sQlZlp~fy-05~h_<1cL$YW|Q)J1F zilwljoW4a6UM#*J?PlXAql1yKb=Brj zdE0VwP5Cjmjp#wb*}QPJr4&4igIuqv9d3IL``yMLr73LVpRpBHK3fP*&y)DndAoN^ zo*bFel{Jf(;yt*rLZ6`hCk30U za_VgA^~+(`Zu#moXiVzO|yIVt{h+KtzF1*HgVpFT`ZHmapMN! zK4RcTMXgO$u4g$1O9V{LMUfU7&Ce3-BaIx}PLqq@MO2}(cxW$^BB{+%xo%JHQwQyH z`#f`<;zFBUV#P_44xG^ixq@ypU6RdJ^y&E$)6sdcq$I3F(KV&GAcM?enf1_?saM5y z31=^jkCKo6UC-1eX2MZ-^9^v*$6&6Q>y?W``T`MN|Uj7h?y{IBbcM5E8s zZYt=P4gwhx&+$f|)$Rp2v*%>rCxmLDt5~8mBZtv=UxjdA{mA>4<<)CP$Sq+WWyP$9 zT0>uU2yU`${UTMXTvct!lN%&fP_N*F5;{>sPPsGhz8tkfeN@q&i`FTiQvKviLCbWe zW)pw+mKGkPZ}&~(B|fgDZnBTxlGJcVXy;`xT>o3h$@c+WQ3X_jh9Wj@CHOlNkMV>=J2S0wJ2OjG}oJlM-4 z>9NS3=_Hj~_bjHJS7*^5_0Z5~p%FJ&VW*uL^HK);Fm~a}id@QmsYKnTw~jHc(du7b zchBm-d;7QMmHJ%!@guhzC*rkTWg2;pDeu@4HL5QnfaYpx3R<+YdA^U7(XYkj_;74b zC{|sU%dx^rL+{81=Oi&)GJR{c5#{{&oOhSzj9Ta=``FBS(`GKr{>}a4$A0vj7JQW> z@Fr`jH2?tFSre@ z#3I4>+TiS3>{uiBD)r}1ukSm_&@2jLZcYo1TfGi)=4j{O{;{DP-SR0u*(h2e@f=1g zL7rENbc4LYE_(tS$I?XCl~ze{9UM=)b6NiLY{#H!cvPU@LT~qqLw#4zUG}bUmK0N| z@Coy-5(>%&Q+VRv?Xkl6N7>ZUl5smtuP(W{W%oJf%@dAn%5*Qaodo5SVkI`Uy3B94 z#WN+i7)YpdsS%mk2{u^|+LfP%ePurA{E4rY&9PFVw&VL|0;5J|oxwzeLZK;+#oN2{ z?T2Z5xu@QT)k1UiEUWD`^xjSv$Py|%bZ~dZBMx<`-4JuQEmPyiKA*9F>Pl(jeb1Pi z6vnEqOD4k;a7!S}XIHIp+Tdb^7SJ@i!1s;DxbdBFaIAk&LjQ8vf_K&plKErae`21w z9`BNvEx9O;Pn&JtM{&~{LC1)Bl1mT#d0_O6)_fV8+ph`UUkDZG%zn4OmMskp=bRqY z-uNnIoYAu*c0_2P+?;K*$(7CH|5UEwCyy;yT+&$9WtzF17D~vPe^wD8_V9+OsZ;2; ze*auk?@`6H(3$KIUtDLnaHg~yhW+HE4UXl(N4>=7iw#~9P5LQOUm~Wtm70og6XNgM z$H;8MRc||*)xQ58Z?`6oW~gXftR(|Wrk;7MX=rC;)`PBHrbY~wmu|9hXzI!|YP`!F z-ip!k@9 M#nuvc=ftN%V8BXytQ1csB-xp!e$XaSfhp(D;5#Nf3PcQxoW4>1tQ}} zJ_`F;J#GJCo?aLpQzi3zgR*I3h7Y5~64VB5oEm334D8R{cgxGt`2%%+CQn)I<7Jy^ z6&+_wt>_|`xTZ8aK4aSN!?fR8>&N;Fqy6gW?)pbx?k9Pyyc5-_bj;qIBI=dd-5D>|Xurp&dQT-=>)5Am+a{9lOP2PFrZ>_EUn9;7;gX;WKq)4AK6p&yn~ObR z&e15{z}zELjJ+1+NO55LrQw3Y^K-^XT0dB9=P*(C|L!itSr(C^+G(run%qy!H@5(W?!1j2;aTx1=o#zneSeTjHK!>6~g*0YKJayVII={X{`CPIW_|fzPD@kPl4{`!(Q+!1d(3})z z38AifE;@VlQ1tJRtXwoQ=!~V_RkWU4Uik^P+EuByCDOM0^G*wkUygabQfLqu<-weg z&E$>IE{|;!9xx%Ir;gOVuK2i`e!i>!86|ESdaj9H6}tLgA%M{{VfiE^MFJZwWqyHpADf=Lw^D`5K16dbMA}@(9;r zoN16QvHb%3^XmHuQJ|)#_^bpQ3rjnsj_DFLOd^r9pLz9N#ZrbR7@mG#NR|1^?VXQo zWF$e}oSJmrYpG#*F3@XQpZaBfsSwCgvzT8a7x8^T=Y&N0#9sin-~G&dH9rFS9{TmO z?6G(HqSHh|5@i?kpZq={C-rpSf*C+pDYq)9Cg}(>+^~ryM z(h+~^jwlePd4M>_nWxD;Up3@a?8t43s>5&5IJvGH~AY;?ejLudrr-(+4D z*X83IbH|snDwlaZhW8pOD=7u8j~cGusGMW1Oc?se+EDrJ^Sh_Z?~hi*SHd^j zy;f_zT%7+Bo^BgW%-npgyHcLDS#RrvgAN?E15^k&`$!S%!SrDsn}W#p?+bvd{`!HL z87qXIfoz^g7xY>Vx7&e|^a$kNb3JKU%QV9cM@MI8Bp0#eYWOuVFazdEr5CepF1w+p zV?E!=mz1{I4z6LEN^)*0RyUL^dsEbB=Icxa2$GsIff)8FYD$@6_4Y;FbsWS2v1ndv zR^gsNI|0{4K{rd@mgy0(_)^0~&%RoRxU6^IN;M->-B*fRE*4x~z5`W;vsRK8Jb36G$%{)H1R5%h^N+*OuiaADDj!yoh zPcZK@RIJ{aoa&$hV>r<)Uz3@AA@^EoHf^G?eL@Pwq!6meiqcYTAsR)lEk_9{YY6a8 zH4KfPv$WK}+-*g3)v~y#sL294YkIy+-7wKZr{9#;m$98e zL1HsHMU1_6Kx5b6v4eOv@duY!cL>_cV?@uo zc2nx7kmqS|f!zw{%aa4$zn<19c<4{k4qAZz<%`RcT9uigy`msXhLG2~yT?3ks58)W z;q+{(Xmr<1sPm`e4(Dg$9WtEG+<_H&TD?Jt~?pwtp$^^5noje}?eF_V&5tBUZw^!ad<;Z>#rRUeP72 z{k&#L%oG*j|1sT{3l?iAQ;)}!UGGLzEw8`%bjEeD8U0pfPIbfu8ANAC^TeeL_Y|GW z=E}D19eERdX?I7-w~NrMn!44GqKL+%W8MxH>8egM6CtFQY2uff8eeLGytG^4dClw^ zZSJpTZJgsC{g9dDvH`JQSvDZZGoPhDD_!b{%8|QUOG@s z>I(E)HF8^nrISkz8osteH_8lk9uty(%dcH=X9)?ts2y2NA2gQ=bD+Bp7-?mAJAN8$ zIW{Pgh3z7&v6q+z_O3NmBc2MGM9amf~Cnvm+S9>3^`{M-%Tz*x>1D zdzB3NZ0{>q3YyP`Hd;)+R(Ce?X~y?wXW#D1__}_3$VerBaHd78L zlq!kTP^4pn5d{`?vRRAAt~9=2}v{>vHn|rM%+Z;Um1I6)QfPj(H+9t4LDC)tvoGS$r_d z$8zX9(XEuqCW}dPVRQBGR~)0|{W5LJBL*3V=aoitRv`*FYku}6=QD05>g{K)96{c@ z7D;LoSS~Mcxdt^?islE5V3^6`+;ty0C^er;WGO~$veGz)h)PNVd_gEdjqo>>6cnn^{Y$W05`UG9UgNL5Va%xM6Y2kS+<1rml%GY zQWz74qy=Dw?sHVrBp(U>VSnN${NFRXQv&GX1Xu8j!M4Xk!jr4AHrU6~YonFUydvSe=zK(Ng`hp%eREPQ#n z-%9j_q~FA__wuBfbZ2ErPktmn%o19S*y3wENu3#$u>S^V9(xK$CoQ=er_odte1fRD z&u|b-(Up*mYDOrq>G}|qK!XG5QCtK5T*Q#H{W)Xjmk=#A<`5Z_81$B9BTtPlTMN(o ziYNP7?BpurV-^Q=@ab*s&n?#e60p3GHdNA4YjZ2$J}o$4o>x5e=%d~GF7IP_2pX`DKE|uvblJzLLk7_T*JogvR4?u&&W)qbtsKvMTJjK-WOGX6u^!}XQ%uYE)Wd{u+czY#f zv%-a)7>lv{IYe@Bd~ZuqnU4K)*Q!Sw_acdrD0E|VV^`Np7T=j?5ufsd*Er*J#QA4C z)9`{jbDHaP7PJAy(g5%lvO-?wLCZ+80xAcH*w#$p;|KRWzCKX(l}9ne;?S)BiPm!} zzFny&C{nU3NhaLZkcoBMxrr{_P*N0{?}C@PyzAHW#*?f!GS?03 zcPBFgwA@`jSpM;=*R)qp5sOOB4C9tuZ;?Ug>MMkQu`YEffnjKd588i20P@I}1<2zE z|3ZO*RGx5?kF>eqDY9ad0VYk*SwAiSpLho~eHQ}yX$ zq)~46aMD$*=_dv31({O|*y-F_UhT^MbU-!f?(#Q!GGdUmiawKzMn3-0^6s>=s61Pw zKN|51RQIO4lMrx>OvEgQC?7m$wX~kX*D9a?WqsPB!aq*oR&s3#%-y;m_8sR_(4y?W zS-Q1*oWs|w1wsjcC(#@ZI}y+F!M@FeUC}IycCVwPbXsu>;-w?186V5DtmQEN8iDIg zrm1r4OE04p@DhaVGUwN-hspsAIgJ}Y6d30sFO7{-&vBHaowx3r<<|}HzjXtz`Q>|E z$I}f|CytW_){>w(v&xy#(||c{wi4d>G%ft=@TU(D(<3C6i9A z_L&$YL8qJd-0?04N8io!ue3h<24Gvp)>gon?+7@9`F`Jz-I#@kNkN-lJHrJ#$$lu7 z@Wz68tY(>|!6J1a%B;J6@?;gjAS9(nA4|wI0TjmAzG9437u0)hLk~}ICI!y0Gu&0M zX>?^~YOqbUfl5Y84K0nCczr%eWdpbMEkc;k?U!zi@ZAA~wc3PM676z7bl|JFw)x1X zDj(p6lBzjyi1+^n^C$YgpDJ9g-LTnNcmG~it`)mRa1Yi2G9To+D6!&W&;fFyR3qhz zjgZif8HgMMN--$T{~l}t^WPG!UlnD6Ht&T#5!Ml>^>n5BOtq~{wbnDK+CB1hUpdmi zk&QqF{c?3zXu1?rH^L*Z!MVA@V%!%-y_Ik+OK-j5dG=#x?W+MJ8yhIQ*TB~~5bBpJ zE77v`M(HYA&f9%M)Zz>1S`-hsIpO-fkXeJdn(Xq6Jg`;hU!`7STvk`Fyzpk9+huT3 z5G`;VVHvCQmV<+1UPy5BFM-f)PZr?zai#aB@0u$4E%!AvgaP%8MjuOt^AK9zVB z!a8vhe7UK{VFTW-ay59b%}9irv(7`U#ajodrh`_OMQaXSEEp5p`PN<$4g=wN7N}qQ z^ju=0;QLmA90-7By$V%3>mw{5-yCo`ZviNh1teh0dS-P!{(xYRA#0PUwPu6!|73Ly z9nR8fqrmLUCg~Zs$ywJkHUByxsE#?d($6|o_o+nCb&xR9Oa8u1rmgHQudIPS@Hv$g z{}|A__EsWj>X1dXulT#45!T@P!)VQ~;g~(W$Iw4DRr&OfrnMkbg010iR%u}v`d?uZ z4c?$#_s4Dj_~XCH>Hj~xw|N23p`^N@4t{273$6LB}iog?_m_^)ApjV%rR9}Cm#fcO*4OEg%=pr2=bm*vZKUO|2aI>g1({byIUL|9d>70PnSIOFI2djwmU zS^zt2*4Oi61P!<_!eT5cs<@c4+h532&E%)x2@B=rK01E#iV&-@5k|Qa#FqDV6^#>O58VQo6^?ijMnoctKz zG3c}reKy9a2&Akd^_FW#GAIl0Gkuw-s%jVmMcV55Wt22)NIgVkTR|_7G5L(IBfHS2uW6}`) ztrq6~)Qq0v^H$O=saRFQc&P(@; zMw~F|B)u5K(oWFwS=pH%R&jucTs=&oDaTV@ zt89D5AUf>NxT-`CT-Z?A* zgcZ#H{aeiUx%uou25q@lXF@W3U*}bvgj|Rj`F`yfX}#+NAn&rLG@EcnQd>0w8~O4M z@Crqy6htq|wckf4mk0jAopUqLiCnv?=GjNunO1mY^N|N~b;5U6p(0wOx~kude6-=` zu;y4eb%LG%s?V2{N{D95rK4S9D~f>II}MIUziZ#Rl~U?I<>`7Pg4>tl*bC$mxZHlQ z&<~G{kb;@M!C*z9uxc-?8W%r5{}xy-0+kM&e*QLmKURj|tw`u>Ju7#=~-k4zdn^{tmmoATr_nzJ20G`BhEcbPsFVg`leKJAQ{n6a9(O$ttkR?kbpAaaY z5O5+eG1NPrE0@i+n97{B%QS%pOb9Ih-PMRl5}F60_VQqM;JOHGC@TsTmAgEU z(*T~6A$U%mpom&fyPgbQN^JV>TJ9E*RB~DQ8tUrmiosi@pot`NC3q!}mG@v_X~`Hy z7GSf^(+eV-Kc8R(%yzgEC%?2~TmxJfJOnSd+{}d@l(w)w1bsEjxm1r5eb(1N4r6%9 z(-`|WW)9Y36M->%n@d%5E>Hsmn1EU<30YxR3CX%0!>^33#b^6l9uYzRb?+(V`bOqL zz+6_*4$@NAFiz>SGQIp_>8>2AdY!pu93@9xFkiB%yunZ7Olk?zr!6sJw3lEL(1i-7 zHo5obrZnk9y4M?kK3sR7?4sxh^qLTbJ4Z%%%~y7#2FnBR=U)AFEMt~${SRy93{iLqqF*SH=k}HUVDUI=_w7$P~q;LZY2(wydN> zxIg!>;eu5VSQQpflp0~vbDVSgA<41hE!P+VJ$f#+U3Jw$rlFH7lK+y+LVE3wjvk_z+va-JJ%ZhTY-%P2;vZ}kF^Qjl~K=}WdzQ9Uj3Ww(cIcOntr{H^b zLFf)`3&`_GcloE>67e!OygAjYv(7q;pa5@9p#K)0o zX1KT<>Q;2}^C59fsd!pkyZvAc9ILUUc*n})f*7XSsK8Gfn#oZ_Th!sUuylbguivxH zH;!KH>!5?@^B6oIP-GL=Vi_W#P-yl=%!3=%ek(9Ny(j_y&&QU=Yb{v??);xYQ3>a3 zzwfMUtVvf{%HQwaJI0K{wFz|u1nkD^9-a39>)v`-xt|MlNr*^Y9otug66t z*w5*Yv1%RzTHn|1t=3C6bDXX+sp?-;lamS7Dj;e#skPVJFVp_2t;`xuEDH^>xFql|UEhm~-Wn!P5XwvC_KkCvzHgBaA-P!bx|c@nP`UY(`2 zNyB+lPUh`2c=(!G6}8m}U?Bs1MGB_(U3wbo1W+HwNv#QKd*n00Ko?-Lx8exyE;LN$ z@Ypw4G|oimYAx;CNz~j(TtK6YAfk*}TE5d5poqLQ$}AmNY_wTy?d#^?S0n7B*L++y zQV|%`A* zWl*=rZlBK};7?VS*_MiA5IWO>@gzCtZ!YUD>m@F|IjK9E=TaQxpYitzgC7tbSnL*E1>!()6Jm3JUu2_V7p7ji#BOO1$$cbeeIHm^51kg^ z@qoTuUqqQ=*85r$Bp&3O;akscjAj91&u&^hE03YI85hA04VSxEGWP`DzLRi6{aXM_ zfPNT^8o9 znl-L#0baWN%yautl3PnqzUF(2f#CET<6-ng7mm3`NLeTI!>;bkJgcts8Wqx?Ib2K4 zFREi20X1UySIsy~lnTnH-C$M9Ot1;iBC9eN6XS`*%YpUJ@&+j^jiCLmE8hG5^@pwP zktBL{aSblJIv)L_0I3BT|i`S!*`_Q#mw@T13{`c;qnIg9_MHakefynZYGe8CH zW3{yao2I*o0E<9p8Z+_hM{8M1uk{f}oCJBX5>5%wpBOWAfcaT8PK^@}z;yN=iYik# z7=24PbR=m+OOYl2GN16AI7X0US`P$Q|Ims=MInWgf_jJ{$5 zeFnZlROqu;P=PIFz9j6|ZBQ7NQ9oEvXK=(@=Pdo(GAcpfo_s;KD#m5}WUXhHQoH1Z zPe3bPFYG-b2hOdV|Jlmz!LX_e8VVWh>G_0c%O(;#LxQH>?+ZEfo?|6D!KUY}`f?FZ z3u5a1Qydoim58xZ!7-M4hu6&ZHqNtXK`^p+SZ?1bWiS~bKKhq_-+uuqJ@HP)sojGV zHSpoXUrwE=^A>)feUzK~Oyv|fObBE+vt$vEpSS>Jb((^FwIqjF+ z_%AUX7}qE)ags#N3N*TomKj#9g%CIdcR;|Wngmh4OqWzJ4Q1PJtL#v#c)io!L znfbL_KXVUR9}bmZxov;2VvH|3SH8qjzDE1MPQKGM`ES1Z|3yswZvi*#Klw!fZvKZt z0)z7Z@vHy)GyfNk+`u?LHkRjstoLL5o<$iO%v&z?Q*k>C9vd3(I>+VyA_g*Sx;p>)ls|Jn*v8F;ca@n} z$t6Wf^Y`98q4ecRml=$ID|NPfd{R~pJ6P12XUa&@A=Hxp;g}lPI5HLM1ggCDmPyik>7E)y1+1c0{lct$+x8xKTdbI5}dW9C>hw9>r}u%4pTmlP-eaNcNwP)a?Cfl6#2 z{_6(94Dj-Vcydr#Ug_VxHXpv_9)FdjY<0|hR<_KS5r zPm_IAu~}K(8*Mydm9}`9iEnzflqwO)IQVoTvqmV2V+7^z+Nda`&S14|x74XIy zF`U7^0UNGBX6FA@3~(qOicTALT$W@3NEUpoy`_(mUye-+gyo}i2lybRWnQ;i@`0m8 z1XkIPBC@>%2P^)hMsFmkU#j>YkM~O*`aNG(hVZ%4oc(H~9({G6Y|Ca)VWU)^d&GVp zeGPDi$gX4v*r>76Il(HieVMKthrHlk>wQk)O9Y7I*@aO%@h`+Sye0`CGbp4BPXO0t z*ZdLZY^#e#KGXm0#jm;*8{41tyRfIWoP&*18vQZ3tEDgL+WL1addx-Td8v0LEIYJK z-9xp6&y@MKviA0C>L~%kJhCsLK8XFf9M6~T2KJ_94*V5O1dg%&;$`7WdVbMwS51wZ zPRemCn#3qLNDPUDef^IS;xk$w6F2+&;*5C!jq23_ibXZJ+Agm)rBSM0T(n zf@JUW_AB4HDrh@@V}A0oPf81_^z_aUDl=JqJD}|S`F87U9=SZ+b(}fc+DB1Y_D}Ik zWf4nDL-O%FMp}^mPj+}5<&V2d8I-BB9QPhZ%A`eOS51@gP`SOs@M;Oau0w45{q z1)4^!AQw^ovI@qRBUqx08&Qy4c}Hv(VQ-RcI`lf}aoQ49BZ4AFA;S5%{F2cU91e{p<19PrzlmzLlZ!L?{VVULnZ&<^WF#w=N@ zTn44vxaFVG0C4h5Tf$Ncuxb*^tQHm)7F$kTwwf&eb28uxOCiM48BxA+Vqvrvhq}kk z?TJ$e-hx-Jj)9b_UeYqiqJ%&ovB0|X^QB{xPX;zOi>{j&D%r zh+kNitzsGUL3}tFbBQbZ+31O1A3UlH`f*$yLiB(Ak1)|FkoWMgN$Bj;8_hkVG&lNz zY_mZ``J+!^l zU-|drp4&&NN19+`;gf8S{G-S|@M7p;*#ZS~89-q|>3^p&wfZ1>FyY)DUHn+fz z6m$OhWPqQ@=1FdYkJy<*O1P^gk^NDm7shCnURDfYPEYdf!sns+$rCLGH%&BE(gTRSfJa7cle#ecpeL8pQ8&aQw8qt9fv zSaZTp9uYIP{u&doAiCAB;7k`#A+^*V2z$nUY0hBYBmI^11^cOd1%tFt5;wDFbR15G z@K7+=zrR6@z_pk}IPytj%?72YE)4~DAUJ+|ZI!slTY*s6tR5`t>{D9XC^!Ds2eX+t zF1+tWP4vJOvvHsb4`Nvo7&8W;h9XLbcIwuZDcE!|W@-2Oj0CMMefO`BFH{U0cLUeK zyw#5g5sO^lk*m5%vcT;u>jk8Aob`^XG!p7htdz#7;M)Qy_se2bbqkAPJa5~Zjo~bZ|4aEfxCzF@=YCOL&6K|T z^SXMf2>-XqTt?*tX4>_`qRE}mN$u+Y*ZiAy;*NR3#ZgwV*XqYjhKVi$Pt*EzeEdnc zCF}KCp9aU5ez61~`-JTO?zj>mDA%HjLKuRI40OIRsMG9xPGG!h!hnz})o<5#R@M0E zhgW{dnc#!q6Mau}t4w(7wq1fh9|$GpVgj_2=5@YnefNG>o9!BHTmQ-WUonM^ZJ>cG zJU3QWvwo)%jI1p&R*}HQc)T?!5m>%A>_v~qDfRVVNz`FTx5!45wzOeGV7rR2pGc6^ z+_kNIBgjYRq>9cnTh@-$SDCeY{X2SWlNKpeU)Gp`eCiBssG==o)x(S( zl>i+5qJ^(o_pklz&vYPTTT)i6qiFgpjN#e{YTc3qT@VOE-PxLan7h_z(!5Gl`}UV= z?YqMo)a^1=XU-WUNsY33q^E$`<4*Qm`+6iTX+3xS>OaY+tiiCVvW%K4eBa-L(1@RR zlhZ%fu;|W#FH%~vj+(zyp*J(*ntcDf;wbELIvLo(7QVW5nOIh+=zv=4Qi;0dz*j_C zE%&$q56sg4?Yc6sjbYrGH(d2M%VY*(eBDPk21^M3q1NT^-wn!#PBe5lEW9@ftTRDv zj=HxcJ=gX_Jf=8ZhDtZ~s7xd*k4_?(s|oTIzlUeFzX&5XWNTYa*Ijt64*ZS;a_Z^E2e90k))qKI3B%kXrGlBdM$I1DV6ZOE@XA z0&U!%OP(=PPi|`Bx%YwO9#bZF*dM+}o*;7Apk<|#!^sc<&HMH6iD~ACpbKrv)};ZY zpdA9cyILNd$5ivG$@OHG5i3s-XWR>bX}K?+WxV_Loif1FxN!P)r{E~2Hm&?UrEek` z8^VyCN?tG`jT9ny2P5x`h(+3-)P9Sj{8**uJ6^;Yi)IXn9?W5@ly!|)8U{k z_T<8wvcTTfTPa*aHO3{T8H`tdl@Zsqv_&yic^$B)h>vd+Q<)qB2?+4mcI&q!EQKs= z&vjT-ngg$tcq{DJw){lHGIiS0!a&c1i2X7u(;AY%8jnUsE%X2<_<$V;MgLBo z)ktCZ{zzyEg1GabNam@S&Eg-(v{dGqx3oR{r+bf9!rQ)dg+-2?%4}*`YuSFR6BKs;&}b>xhws$HN_ zB7G9}LAj7F^rTig{f$6 z5c9h>RzBCn6mfHwG=*pJL5rt$QHdIYgg(jTum?mv__1BV^skiHY z+`pCJN!M1>$Kkxybh7{OMDiKma{F!4+sFJ#Z~YtjANMFALnsRDpE+!#(twws4K$AA z*!o5IH0c!=o7!I*J4*^|iSNK_l2p^z33{TgF(evR5uF9FV+HK#CHC@$z(u+>HU_w;_manmYZOK z%bttY{evs!iD^O}Ooud4VteRIA@&7xHN&Ie--=gW3;lV8Tb_}`T{HBq z&~dr>g803`91O-ay48~HBp9r!lZKAx&xvLp5;MOX3b`ARn>}^ehg-M3on65o>_py+ zJW*q8cV>Ooagq8*7>+1J-TNtLY4poSA=9V7p5lU%1j_W~#_=}U-W3Jc4oshXsdg#* zxRVv_%#D7A@)?t>d?xKiA}K?%#M_rL5;JiW^QF0bB4gI>>+RdG5;MI9pi7BZ3}2w5 zopF&zG?OnTap2QpZ*AIF9*RhEY(NUiJ+n?1{rLezF^#+4r~5U&L(sGnCB1A}5`Z=? zb;}=+(8^{vkUV{PZSyqKxj_g#P57+LJPhXnH|swJAY9f>NcE?G#+wEW#ajt6a;6nS z#=nl9O;f(uad5D4dA+5@#DBqr#dC;OP{MOl3on}k^+^h^cHIR`F})4Yt`doyPsvcH zN%Q=sCMn>%lnO*Zxlyi|5swtyFtRU6G&`kQTMhxJMD!x7!6nK6HhmsTh*k8fjL1Tt z@1Qj2XgBc;JFH#JFAGn!HcAdv!?Fk=G|68-uuRTj)+r64LRv*zQWGaeqx6V(eIrJA za_%IKftC6N76-{`CBZ*0gt-84o~RKU9D#<2mNX`b3ZICU6E)g#z`VJX(C(4r)BR?l zW3u&3mIZexgA$@Nm&)VGSl4!Rw69UZ=4D9ZVb;*%*gpK+)C^)CAZ{HJSMWQ|%@+&9 z+t8P_MtI{vYZ7lvp9oJW&VdHKP>-{ezHaIE+vZ~t;n<`Gd6#j6P{}*tG*~D`MO0|r zKYob2zOzdrdv5AZCsOSEnM3%_DtT*bb7&g&UdeGvw6+U<|LKj6DmPkCJI#;7CxyR8 zAO3aRW-~$JOz5>A;HrUCJQv4avv^wDk5#Owp(IxKm0N5i9L5Rp!R-AkSajdNGnH44 z4;J*=TGiVQe#Hqq;YPLMsl2<-JoN!e=u61W z@K%PD$zliPtfbl6#6eqsKuh)UiXkgt`D7WDhyn?(UcJ)VFfvrmFf1`$$-7@N_^|(h z=sf$H%WcR>V(-+9__Sa~f4ASCCt=nZ77PTeWP!qcS*}yTD6L%DLoBwa5WiZKuWIsk zZfSxwt12$PMbN6O$lSZSmjE*aDnfOF6 zvirms97cFVyS5{8zoqnDr*n=l1N~S9s*4WEw$?;0W`Wz#0(OCMMF|pM=@sr~^INE4 zEZ2%&-s04oGa^3?Jq>+xL-LXfUuxk^p#4sw;zr}fo{D8qe;BBA z5L13ODZ7!HYoA~$Hk`uk#nZSIecY|d)=-xFwc4N9QeDSYw&?N1>A@d#u$E8O))ZUhS zEau4{`v178a&9+WMtvJcx-M(fs_s*t*^?*$m^;nFO5&zTYyf33uk}z0Hd{{K#adQ4 zI|Ijy1SoS$Zo_G-Y__+Qs>C6}B^`c`-?A$qX+;*m7%mQ66K9YPx0^Y!(Z|Vh?5=ov zR~O;wYlxL?&T9of=QqU`j{PcFoxG}XCDFN?W)CgWGDNWDLlu~AcYpAluHPciHfo|X z7nY#sPQNt872hcc;PyWJnAiAHU%pLt`|j9V-}y!gSf5*Q3ObDpND1U#=5^A86}+`I z^03Kb$jWJSdw(#mrR01aRfKM#QBTbbQe_X?&yE^L(Nyk?53oktUUf{d1=uQ3zqq%R zU?QC>@iGcy$J2%pT^r_T`iEkR#U;5%DFC>c$a31rP(|2u1GR*eGe<6%9Q^1GefbM+ zhtXKMl~$h3FW)CkA=Git_e04wi9hfQ_`?bgFyAEN5(gfSZ!40t`Zp4DfcIaw68N!~ z-mE^l@vp?xyo>2U#@N@+cJ)Tzc0zzFv9X$`0(aS_CJ!8m5eScI11DZ&G5`7X4HVSo zsw2}=N9Q?SJfW&ek@*$mc6<{D!O91d+x@J%v5r0b*W&fHRpG4|1^s{nA6CpUi}Q$~(_; z*w5H*)^t87|LFt=7vnLOviijvWa9xp)mUQu4s#>WPhyefW_l2@-ES8j??3W*1F>OF z-4FU_B=glfp_P0Gm9`|~TVfu_xBAk;;b_Hgf4QO0r-7Cd`;lJ;B5*Mz`I)Kt2N6sB zCBTh|sa7KGvbrT+IIg_!O@fex?ry3qVFz%1o*TdKZKseOx3p6GIvvM<$=u-5MsMdR zE7xW;u6Kg|W_uz`t0$5JhNc>+*wEvDXh^g7;N3!7Zp`2StS2O*M+F!kBTfCdX~4~y zOeqA{>+uw$DqL%dia=hPP&c?LYQfJ;54PF(y%7j-Hk*(A92EC?%m~}FN1Tfc95A>I zAjj>u9=clYy{~0rxWT+&7rk=pfNt}9_FES`Tc2|9Y^c&0fISeDAj$bR8(ymubV1-M&*IrZrO{+^lC(F zoe=SzoXsoRkJn*x_R7o@w)aTLm%S^vXQEpb{m7K%RZfbimgYK5*q{($S*CF$b)oOK zfiJZueEu=HT5@BNeNcL&pOBUgNyhUwxjjzco|?;%8J6qEVq^AX?OkYTnGVegl?B?s z&u|xn5e$zy?z29z`L6x&gB#<5I@T?`w)LGJmz4f&eWFKv6=H5&Qtc zh%_)UW5h>>dJ03x zD&fr9CBP%TJ+3{*nWPh(6p-0p+5CeU1gq@Rgh!tFT>~N)km@U>4SBUHnz-^wr;#<# z-*7uOLLF^l9L@=c);$Mj-d)}K+x9Q*wglaIq_LS*^Vx#&WA6I>YEL|ZoXu_joTZ*C z>BH+L)pLIwzl;ZMRKog4aiI?+cRNKRILUyMzEB8(eR9Cx`7U9o4r*~ za_`XW6I{p2I5B=k(aL$JF*VC>%IV|ofpZMw5}DWH9{jPU@tc~bhQ3$)y;v>Q;#X2{ zAs$U9?bdPCaMGA{=D6}<)UNnv`acWGq<7Q%UREO-`~JtQkbmGTnRUe!a+8zkX$wXJ z9u=EuuK)m`^^ca zr=YDR1tpO!I6mqAfq$sO8ZCeM>nQ!f`K;Sw-@5|Fabx-Pv_A}P#g~5?2yR#Au7(Nv zU^hKp4eW$I8>K}eVAf+N8u+7vpS7X+nM;_{f8E9t=J^Oo! z$@MH{h3uj0+2VYKW+f~#jvp^ZFx_3=k&B0%#q5aBtJU_hC{YD{JbI~Chn3+%*vP1PU?xBpa*LWL zT^&1V++Pl$iyPar?7GKms3$_tCSz-KFTD0jP4QGcm>nDYN#fE%esc5%4lcsKETiw+ zKJe->v|FI_Ra!Kfruf=);x4vI*s3C=A~`^c`Ramd~e(a4;@Se1$<6p(dWF-xF3_Up|ASqqy+sYAXHKN`6-G1 z=Mr^u78j6BB@xoll&9gd;<8yQH*5Tdxd$-{jQHuHd*eMXX?$eFT*pCJ^QWBGi%R*X z=H^p^*K@C3P`(e#*!n1SxEk?sJIwqP2W}UUldX`I0c0{>$`vAeo`ddGmF}$qBW&Ch z@iP`Kx%KGNdO&7Cnb<&KsgsXso%ST)^}6mpre+-n@wg8Q6PB-J^~aHmIJl$*b?cQP zsvVS(XTEuk4YlOmtv>eBlH%ao6u%>oIM-DJssTp(mT337R~s?f#2^iS731zaYZVwE z^>e2cNjN;M?R+Q++U+z}{mdrwtH59TWw^b>+m0YxPIqcP9jC4%?MT9lNLgYd-J)`Q zugI+<2ckA2y62y~FR_X($~#V+y52#TbwkXm%ztBc^XlbQWn1iyJKcILj+2NxE<)eU z%0TFw@-jaw4}fR;1Qh>&kJ&QUzvXjvFk`Fubw~aMt<}zNN9^0YA+zFhp6Pv+`}G#z_dhR*Hnr^rnXT55ttoZZxFd=h zdAFOnh$zl63=`8LbXKk{?>*`AkX*nm9n$g6Zqd|Wi%`+`*>TM1OAY=Z*0U32CuZG6 z?n48W;cjFGe-e#{e$W(#7xOW5+V5WPw>aSSx?T&scmo8Wse)!`WXqp~G&1Ue8AS*%6-T{ZS_^m95xrzldH-Q(dq%V7wfhP{)4oyLeW&``b^GhI}~=; z0l&63wt*;@NmT}}7OelRBlmp{qm|CI_0K&t8Cer%f;=0YsNAuU&m_~glw5{)RHnuH z?Gj8s*Z%5?q9&mef1K|yw6kJfZEQR#u4a`0ZMs`Z-TFFytiMmE!yL^6H#ZMUMtJv8h6V8}zcebfy+}qn z-4R=w-|lH!i@NW$yFYr%&$*QLp+!b8XJdu59S!-|G{L zU)JoR5)^$(9!dLMOFr1YknOY~MGtXq5@I)h=mVZ@hr)794JEl*PT4%ou*4^-_Bxa~ zmMQsn$6Y#og1kukvfG$iJnlpf%0Ih>+7>$LsOsJ?2NT6rJ!X3a<(KV@a-UUddywutt~B(bp4xp!r$02MVjS*cl+FJ1F>EAn;uwZ~n{TD% zzE<|}kPWp8kLc~Y`%^Z*2a0`{n}y>d@Q!dvXYzH+Z|=tdn(fp6QFI?HlJ$MgN53Es zblue}dRLC~yNM={sWJ%`j0f^_Sn*LzHW2yOhu#us4@jNk>?;>J@Prz}Kmia5L@p10 zdnI?zNG0(inKo6|f??hpw;dpONUrm@1s`w=f{Q7mvuwXJY|8~#z_Bx=7bC?1;)v4O zKWo)@f52xrBk_##c-0g%dsr<$cg5GOL@#$%fqDs@1uyNyw5>&NtADSWRjyUvSX4l^ zdu|P%+C(JQpQlNHH}kfj&wFatZchhwJnr?%?y~Hf|iYgbeX!5U?f)3(0;OxYV3LNTFtKJ9i!f+c28!?o;l z3`cGLWmLL>a)#4@WY7Kqx$qtBtQT(|?cIIj0J~=@Zz@mf5$r?{1j3qM|bY5Hoj!rSdk4$7~2DffYrU0BW)d8MptoDkH{|s}D-L zsSNw(Yq3%Sye)$D_Ts$uhk+8FoER*92&2DZ{IvQpFeEWcE6BrjAQK?o;n6#c1u$<( zF=-~izQ=$2BK`kk^FAX7xtHbv0I76d8x)S=EiS$X#O^@Wj&fcOn70py5e(BcKK(O@7h2F1|ej)fUFi>XTWawGk zYZWria`cj)$+iBNiT;-_G<;sFY}}E~ej?4S@zKn*)>oo+bDHkZWb1Ln^XgESZmhzh zgDjm#*gkT7t3%LU2MUY#I=qr>`9?Zp>&`NJF8;zKT#}ogezdID~~M8Z1fQ_219 zC^1x2Te9W5dL^52T4F4!;~maezqwS1wj<@wx-v{?*Kq)ls`tpBF?rC}V6+~nkVtP6 zW-7HorBbv9V>;xT*Y}BT#zsC(kx|!6h{x*oPZ+OE^m|%GpwtZ5migW*Rv($(8e6GU z9yn%}F|%vqSa%`H=ztX!vq7Kw9F%?$t$hg<6DM_x-!}H4aNF2~iUJxkYD~CUGF>ke zdoY_1HPmeD5hB4$O*(j+U+A3GtCc_K?#0teJr5?5doLtzkiHo9D-gTwc6Zuwk2p=i z5(uw-b&88)_S*~aURoVsS=Y+f@%0p(HiMHeQUI&ABSFW13k1qx5&}l{sOv0ic3TO( zIknZ3X<^`FXW+VvXnw)IG>m?xP6c-QuU%4SJjV)$d9ph9JiK!mSfz|F4CHqWYrEX} z@Yg<8d+3k@LmrroA#!~o*BUbyb1|-ng88^<)0Ql|gk$$k2J*6#7=2Zc+jO^FkYrI{ zH1WVdy9d;6P&^wzC3mM zQ2VijCK*{9*}RiVUr6D_`Ej1O<}X?H3X~h#jm<}&^h>3j=;yn4p=H#o!^;#E9}cy3 z8tct_Bp$ucb1fU!Ce3}#=h@8a$wjoPmH3c)zEj9)pIU+bq85)=*++OAwValjgX?Xh zbSFk~JtVsu5RU&vWQK;|UbBNiJ_z@Z0+9HA|H9l~#js16( z_Q{4_OZj!)mqWScI6u>Pg~rcTtHJS_acAr*^&=9>KmSqTb!p8{6Y_vR`R~eEd()@M zE0tjHZ-J{Orr6hkK%H|=(P@HKg2|}Zl2kkQXA8cc$vq0V&L1M zNJT2TR3XB4J>*C{=9(=eDc3H~;comoX;y=QG->qKO@W{J%j}=eI*#;`t`_ zW(KQz)ss6GZ19B3Z)Z9sv{w8Kh%dWJtgpt)YT`cx?az3J*x2yu+S%}g)CpOA7k3Cg z**?(99QXXbaqAlTSY~mbsuR(Or)J>l{%l9bg(dzGwGV~d6~NpYCThou!N@%4L)QjA zGvw_F&=07T#eg*-u%GxJgOrtjk~FU1%?I%6QLxno7d)j+@qucIsGA{ByG$$l^DgtN zzVQ|BH(dHXyp_a(y!XaT4nI2_b4tnN!>6X`!v2qy>Bp)rcm0N@@~p30fNYJyJ@aAq zm!`TK7lI;5MJ^9{$|@tI#{2)I-}qBLKGih1pP zU*gS0UeN=_CHZpD7d8@OX<=dITG>aT48=%TRe0>(J^32uH|-05pn#llan6j4K;_X8p7u z#)%zMD!Z=_T*hanTrW(nnWky?{D`ygT5|qycmv5P!8hW!gf|dPk=_7@P=Zu~QVFsa z2TP7Nm3dca@~;?u+R$Wnb}w*Vh9Nsn!@A`@-$C7=i1&WhbY){Bo*#HQ&@B1B`;Gmj zUEVM$Sw@tfHOSAp;1KaP+VFR$6X*nU}@pr?fyN#v|kjoreSk?OVTg(B6PGb*IUt5Y)D>1ntH>!t58n` z&fK^Y)-$&C8_PzA=6U%y~nH8X0!?b12Mh?TY;rRQ6O+=Uxt7+kp{g zjqKuf^kUW2?()!p-(zbKv03p^3xqmCA`4@s-2SO{}1gH#UZ7{+I6^*_u{&z!Tx0Dd&^~a zCkr(3MM52C6_$qjUnZsa;23?aaJMx3-?)*`Gx*ka)G&x2Qb$`TVdHRJ!>x%poEm4<1C$?I_7hzT-ng#vqP9jwPw*jcH)kow49OZ5LjRQ#t9 z7lx<)52_sS!Fgme`fx$_p4*V2MFCL2O@dM)ZPSD99c+;N-)3Fp`Cm=^fCe%0oF^Lc z8aHgXK`UR~Bs<5%p~_JicIJvRVUj zw1EbC$wBPZx4{uzQ1E(dc(c;7APd+_3+=S%=I65t84j)IxeuibtX%D%8>L?HZ2n3g z4G^}!%k=S7tqV!qkl>4>!Oq*WTdsgeG4K(ruREhGIV??v@8hv^!uC_o_FeQ%1n0F{ zu`1pg-xAD6H%%@mr{L~%*7>$b%LSj}9A1U6bRHdXN{GA8RN4FmfinZl_eTvKvw(Y( z0ij>9=J;99W?a$z+jL)*+X;5pz3519A1r=1c@+B3$FfySu|z~tmYotO(qAXxOpR7I ze^M7j;2`$0k;?M5%Pc!C2TmA1Y4=ph`k#7vM!?+{{`xM1!{k3u|EUcF*9ZmyI(=?m zcqxX51J}wqPh(8lI1C75dAQUczN>3EFbWVk( zQ5U%2?(RuAm3LKiQvUNCE7#pOUYs)bQ=NY}Ifz|SpuG(jO`WCLI@in>+qOs@-b{^Q z)}7pK|0Q^_%*w(;erDL>Vo{r<#DnN$bY4ggr@Lmt!OsgB*D1CgrLqyGvJeU{x{%>m z8#(;Z$hhd<4T{sPf)YDQo|7EJp{+f*x{B|&GV>*b7=vBI_O!akmB?;zYqz-3M&>l! z9JoifPOAv$L!|(QtJN#Rl3;f)j_i>UK4{mXJZj~|(HeZ6?kXJLRCUDUi()k{-V%o{ z#K#L`;T_#?{A&Wx3=NsHcUZ>c+1mMqR`be~7q`Gw4w6)XL1Ouf7n7%kGV;S90ZZYM zYb%JN=fjh>{~y-g0xZh)U;o8G7ikd!0(Q`iv`I-w44u*q!q6!a(uj14^b9kIbgKv` zHPp;Vg9t;-5JTsAMqO*|-~a5r&pFq1-fJxcMrYoBpXd9%@6R2xrMk)A-s%fVw}XZ~ z91E{#cQT^xq&YXJ#BBW*m;s+a^_?@S0AH_w(68pP+c}sx^7ET!nOJe8H7WTKPjT|K z<#%DEU&b-h$Ru`TC(K-E*p-}rcC`*P0eFRDi?1$Ia=@$Mh9~Yft5YnBA748i-En`p zGP(mYKU89L;|;SFH0sRFc2$@GNY+7THs zURR`!v|ESoD!|q2G%YOdSQvG@-EZtBkD*WIe^yHDPSc#2deZ@;(lnNskN|3HnWR1M zMv85ErNQA2OS3X3%r0jz+8v9kj_LXY)sCx4C1%*=5^vZ$ME@oKm4exs~* zp(^^|UGgbaZoUP!X&i0h@~lL${Z^&frIwsFdK&^%GtW}n-Ut$OLyv%>X4eNbVSl9- ze&ai{4H@LHd#;LLwg*$XVfCc4&A`kC)u&%DZt!rR%?GWom3eKhnMvm;WlF&&Y?X~^ zVB`;opUm-@23wY5KZ&IaxCV6$3ct+z$;SR(!zYWZHb*&0RL`~%GK0t8bUe?0vLT46 zw(}J0RA~F7@(RsTiJGMHDEUlt&qMes zm|Nm1#mHZ*71F|a@09Bafr&QtwA53r**UL@1?;Ng%{S_^jbMJtu|=In`z_^Nqs8;A zm`{IEE&|pMW~EE_MpfJ5$cUXk&yVY$_pz?veCl_60i+~!{&&N>~+{=(1z|7~p* zQ^K!~ZuR_|#vkrd#9>e<`dUfP$MYwEu@T-5A_vU-{mcbt3)Vxq4i^|6bDU^vh#v1P zEE(rlDy?m{%Y=Mem`58UlH~J$&X<=ob+R=LKD(q1b9A8{TNKkSm&p|?)~Qh$Doh*O z^88unk8M=Y9KquK35})xsLG313~PEQR|W9kiLr^`glj>6ykF1jOIq|T!R9{I&%s`c zi@IZw{IrrjsxAvxS88EKIh={p(3*H>;uhw|inMbZ)ws3gx6;u3d~MuSi~!#g-$$b< zWiN0nQo;dScgrpjYMhBX4@90c;^Sc|G5!Z=+hUa>WHlFfX>r$}bZC3Iwz4Q`eoTtA9+Pb%sqBsve~TfE=U3Jvs7KNx|FIU9l0M>f9W`5zvz5LW97q*YesnK^r4yG@QEa!O&uB%Qqu@OexVAR4e-GGs+TIa zBmlj@M+WC@W(-%|DkGazR46zfPj_}1+3Q-tas>b1> zJ~1{a)*JtxFsz?1dLGnRG6s#LY)_T`wyf5dNhg~8WlE+k_jXMI$U5tuf^i1;56IHE zPljS22o$_O5cf?*x%Cq8tKu?Q}ZN?IkFQ6AWjm3_CS|k*nQT`jTddcNyIi>ZS>N!x{mO~6q!KJ zocP;5am!~jToas$-!Ik@ow>~JpjP##3%tU8K- z!|Lgr&ftZUOyti)Hvg*nUaQ*xB9B7Z2(}8?BZMi`7;W~L^w*jnyb9Oytow>S0xF6H zcxu69UciG99)b4SyLA&Vaa4ik;l$6#mXn_~TYN8AkmM=6c$ zU!JWTsuTWu4kU^ZmGSlq5Lb+I$O~KKPhYda8 z4p~qS(Q1ANRlU@`By;nzUZsk6-K!KxSrU zw@&VACEY-8lE}vP=)K){!=tegH`{TBgI9+0HX$XlK9yB-Ozpl!oLN$NR^z@x>vI1nB8yk1#fwtL4K&<&K$I10JGuT&jP>Q-LuO5<&0!uI>1)p*K@Z;Y2T<7J<64qDy18HHgvg z%_i)QCkq3o*aOxA8sL1#K>MTdS<>S-iWzR)?nSlzMbwSZ7P$L}hbR}?>~v-eo?*T$ zxaR;-l|O7FBQi>AgJc=n${4Sf?A5gOHe?-M8u@b$eq67X&j&yoN$ED{=PNauENa(3 zC`7)|lB|82-mQq)Ac2hV$qWwa=0wGA^;a0VtHX7}IQ(OPOonFY+bpx_@sTP%x}!y-d4gBL8(Tk~4@7Jv{&N`? zAn9c6js>#F{yTGPy9SiqbbX%Q;c{KmDx2R2)c;7S_M3m33oj%qWnnY!xkKkt?uKG$ zJgB|(sZy?OUGbyr`oV;yk*1Q}8Ir9c?~))ere*Cg6E}Q@ z`iZOP!iGw52QC4n4L1mZlR4)rdwJFYM41#ArI7X^0Fen>sm!w2fqZ3Msz5c;r0|pW z?UEFn3@uQ+_KA!;f2Ac#-p^R{oL ze9=2z(_mrjxCRGOzGv&`qHcEc>QcsX`LCPvM@G(06xPe%!p23o#D0u`U+@zYmJ}P1m zY?z>uv-I*#t%r~HG12^^ea_~eh9MLwYb$ggH5ECkrr#%3U;IQ8X^+KI2u{bxEu2SB z)BXff;0Jwg^%goCl-1v=pX0P%1R5;Tobr_tm{XQMG2F0Nh}Od~YhTwa1g5+;FBmyF zP>J08P-0|gXc(cnW{gt#rul$!7fKvY4CJ_GxDcUfwBrMYPnRM%zN?pB$}Zs#=T!I5 z`ShVIK%UY+=~sOrh4PoHsz_{6^xIdJ6O>)dnhg{7%TAD-XZ@gDC3MT=OydYU@B6Yy ze$>Jz!x%A@z2@Rzy`p{!hL6u0W^I94`>6$a3b1H|7uQ%O&U%Zo#@50$ueGla2_ z)59%+GuwrFYA*|lk-C0r~XVL)Zh;NRy z7Xgjl;&~W>vQt+kB`O5s;aRKq;rKgHO|aZZLgSEkqvU``bwTRD0+=&^6XVs_RE3*n zrs&7{wkYpHbFLELZ^YFASqD_Sp}|7&VUIz(V%z88oEb{l+=ayJiM6GIY-&YA*6~2r z;iA%3nZE?Gq5Kfz?shVT1~@^z^m=1d?M*XE?Bhf+SfSMEWiMs{EYR%^>TB@|i{ffz z+7`{138f+v`oPfINU3#;F1kQd%Ly;DyYq#lcG!^?iis~GsMiSXF?TL>Z_GBCNo!lB z6NP(LnZo5BbTp6)>_zX6GbOIpCQLK8U1g)V!))J|FdR>mQtvIw2Gve7vU@!LO+La@ z#}R`YIv+h&V|W@RfhEDtDOHpY5UEoh0AJfEPRAQzE0BHJTPHCAGP{(RNK&fEM${;`XZ1228t~oM1dn5Kw(gCo1vP|9KV>Kv;eF)@$civ>Ulqg+dd-OB7 zm9sT1dqV-wcf9_q&b#WGtKE&D$S~`kIX9X#B;c3UNpmqTF)6XQT9oHbaZ?K@Va0F? z;Yzx>YCrE>S`zc_9AqJ>ZtWVpwkwmO9ve=%7z$a0&JQf>kHKk{a&Ba}9btg;%GU;B(xnJl)!^JBFy2VKmFvpVn#lq|Mu1*C`f^W)p zg&54nQDxm5)}a!Z^S{LTq(0JNlmss^<^XmJ{*Qad1 zNvcZRCbfjSE)qoPD2sW@4A6&N(zQM9-cpp6;Jy#z?L1(H3oU_;<97il8d*!O$yBV} z+q5bEIC#U%_e|8yw>LU3*dirLW@4_m(t{RflTu@M4AwmAO3vPaZI_uXO||}9R&uDm zX69Gw#L`Y2pK`4RWM~lp4{})+EVm$F<_bfp4{C|ma zAxnAtKTVT0ud4y@>Oaf>%Z!izs69_5fpDb8X+tqJRq35PAlvtV-uG`dmT+HML7qaw zfGp7#@cqWo(*P*+|40-%PG<7rCXrPVkZQF@Ji&~@8i2fz&|4}QPu0}oh0uxrwXT&4 zB5eRdBD1myT)U&Dod0YFnE?f$4*r)a6Q|?`GFv79K=t4RFzKGllCo-qgXBq4z3GBn zBfK=`+LWD#{XcIoc~b}|?h{>sKz#g4KyRZY$hu(t=T)+(2?&*{oUAN~tXr2PI^jD| zKXls>D_EMT$zjTkQV{ldnnPhS{7UWtW&7)KwDvtv?$ptqdHVM|D7k{##8`7cvmJmD ztviaS0Nwd&2HV_t!PxBAdazcDMM^Y_ab}ATRn0lH#vX2DxocLA+ih965O4@LXcfJ9 zRse}cj}#3(;Xf`}P>E8L$|_{1m-HB2A!+M@vhYgC^Oq*ybiP|twF@DAx!CykqHYrm zmc_@nccbMl?S(vusFBd(vM+PKbC1-Ob)8!2%`Ix5CJIDX5r-6Pus-YOcTWLLp zU05&UMf9~dRmd(jX%!Y8iN9OU_Uo({BU94X=KfV?8E^D4>;$vshIHkRU|N^0)jpAx z=%#f#Mth#7TmZTZuwFeSic%yZdI3zKhNLoVM{ic@?`2>Hj9oN8xXZwhVO@$? zKv{l!^8zvp6hZ+1uT|OzW~gTsmM4d{U|)^{K|m0RhbV#yG36Yh7Z4hEiu`Dczc545 z4bPnP=0;s|pZp%;kyQ7f3!&~Nce5)>?g8wHCOm(5d8qU~7@Ry6DoWZFa7v&9*JbBj zBW>+S7(JTGjQZS@7L32)0*qI~X;2&s20P+6VERHm8h`FO&NK&0Yp8XrfIVSI<$*SS zS?2ANBY%Z09vzquBNw{)aPLN==aRl&{UXJ|(1gFTO#Qy#GJ%W_Z&10iuE=5JS-(>x zA1k#7Y8=@JP~-4P*T?zkcoQoO59WoO7G1r&x~^$Ux@G&+qfs_E0isLaHQS2d;oM#I z+;t_NSx-H!Qmet@6IK?Qt_!)kDhF3wu7u~oVtMrhH-p)Xsfy-yu)&puK+Ez1bJ zr|&ufckI7C-_f9ukmRQEC|z_84sZtw!^e?bP{sr1sSjw3dgjwXYKv&waqq-$rM7!DrbMZ;+IhfS=riG6 z?8Onv{kvQ&iU3Tk7Sj+!e&s}26J)mha~pVq+8N{Ld+)7d@S7S>T!ibHusXHdolVbUr&nl#E zwECdoM#3YBh20B~2ZRBN+jD0+vN!$&#Chh`qiYUo7)UiB{-lkdy#8^#v&KdFgJ8W_ zS*XXV(_E~UZ^uZ+Of#~i&#*c`^XOp3*mkAeGNi8po2zGx@NR&&n*iCwZ$d{w5NP$_ zP}!w`blzJ@DiDFv9gg6j*UQ#N$?5E->CCnpn!7e=YS1$2?o^Jui;jPf(Y=ol!!8U6 z$0+s!GNv9x4`TkZgt)|kE*F1aeeXAna8Sf=KD_crQPZ13b+ow0sQHg`A;6bj|6|3L zqUb}Nz5V?xZBm!TC%6Irk^NGO^A~Kgxqa9>m{uf65{r3d+9`l8L2~Ho-%E^#A2j{$ zJr7_?LO3=ovUv0w^_qb0x|)5^i{_VuxB6URK|PBgJxnX#rpI9qy-@rJ??ltdVGGr+ zS1A5M!ZEax6MpWBC@oIY2X-XK6 zygRmd_tOET7|hZ&Q^Jw$f9diVev4=i+`kWoxULSMORG3UEU9b#<=pvc-)Xs?2~lGP zLv0plcK|bf!*1twpEt05k}yAIW&#ZE-Ck)*d6$SSZ5t1S5^dfr9h3_!-FtdCKKr@l zRJ!XshSA>_;Jw!%8>k52tqRi${x^h%-X76jU%pw-5RFW)_*zead^I2=mTSRY$BBE| zm?X0|QaT@BDpM?~k{x%wdnaJLG~eUR!n*2nhymaU`o0>r+kK-_7@hB07W&+Qk__AX zM+o)&9R{IaNJ5Th%S==r&Z(KD3;`2l9i|ybPMI%V8YDed7lYt#(F(D-~Avkv4#;(IaqAOn0j{~7%rA5YN?hU+EzZ|xS^VDv0(@Zt_;&P>d?sY zjy_kUWq_Uck63+ zCew$f1=+NlSf1vz?;fst>S@x%C-rzGDhwuRS(V9K20*0%_VX{<5upl~Tnd9dkyl+ z78L>dcsgSlWSJ=?W~P3G6566E9X*rD$d1+(9^Kc3eXaKgR33ha2-8&2bw~+fu(#|= z?yj(tKA;83E9(oCIkqBIAZf9H0zn72@6hblDuK*^BJGTAdc9hva_j5`vVm?82JmNN z0&QT;5ahhdfD5b4vL_+#7vaym+j^MYL-VaA#ce(iDh6LZ)H2hVZy0Nr z^Ya98J-9r0cPdtOWKp^vrj?!qS&ZexESAG<4M(2z-&1J(SZH{f&0Dog+l`X3h1+`uzTT* zz9BpjC%)t`{aiE4yDHIF&oAKBDTyxs>HH2l*d`n;4u+~RyrW(38?mn@^q)8TJGRwV z-q^H4ZcN2G^|F`hEbHA;AO)L>G;bGrqv`{U&K$HYgKSgClDcuipufrBx@Lb|j75YA z>l%VrOT&2hFB?SbrGjc_{hQQ@zru)DD{6{SjmF}F0dTd(v?)JYliielG1Z{?2$J8N zw1A+KR42S8aHfAh7;Em&KEPwwA3cti!rDk5EqgQ}GvziHzz(g<**A46&tpSl6zi81 zl*0fW;SpZAc9sPYK}!|OI#lvKAm-hPw%rbT2G)K)(Nd+w1I|HJS$f$p^GgH%j@@43 zK)eZH6=k!+(6uUl+#Nm`m@ccr|6UKE)rvNK=q1m7hoi4t3ct&XSDoKK+9~$95N*)# zmIf7|B@w%XmUGH1O`GuTt$$VgK%YVMZfIjSXh{iqm?d!FOaeXIRA$l#)B01v!^4CPPTTG=Sk6kKN29$PU4xjD?uPDnyDd1v zU#F2w`c(jL_&4FO=8kf~LP&?kD3`zcj+J*+;X?;Gi4B5B_tS5uXXmkz(jeKzOYX!s zb}%3+blbsKL+UH^0t{B~9E?U~6Wx#fx|Egv5N*L8uek{hG-`gJd80^N^e_a&rI&BK zUAr}x$bP9GenM^|Qf7tA@{+qWUrJ=)VJpu3$%{qMGu zQVwz1OIYK>WCkf>z3G_ly6N&P8J`2-CH^|TzrOqf2n9d=|C>tM0s_xS6$$WwP4;jR z_g*iO-l|2-gU|(c#J@zjKs$?$&jXqqz`S`L;F@pZez>hn-Y2C3$?Q*^FVxjygn=7QK1nG@p)%o;^{eniG zRHX$F3sfOZOhwgHbuW^D0^3D{{_4dqD=+m6iX#Na9ZKH``c&DNZ20w$FB=RH|J}WO zE?|0ofHppW_^l;m4L(D1oZ1UPr`enx(nkP0+oKTEJc~HX-EW4Hey3F0 z(=q5%Il^&D3OMs9LZNf=-;p}qnh|X1=^lq0tln2OhV*LQt(VX)C1L`QMvLg;6T0c* zsCLPwT=h*rMsU^YCC%M|hyj`r2KE21^niWNY|-N*pc~AFb6LvzcRiz8K}7}Em6{vI z<}FV`>X+_!l*+#*B_la}e}5lTm^K`<@L&BKg-R9S5e+mdK#q`~E3i??0UgCtpEvHS zb1LBY?R-iL@W8M>?T zh*O~P-*vwj473+|mR%`1AQBX0+>lc-c&1aO2l!-BY6xDI>Mtp*d>rr$Qo!J6u!w8S zzakOapz4z?96SsH$_^R^7Gx|cbxB^we!=YW<70nR5i|0-H&}N&L~O>|q42z4$?9W! zf~JTqUtl#FSr%l^Mibh!*FR#E&`S|vgaMF#hKSBbqlO?=)&B1ki7J_K{Q4zWyxtq) z-xc4fgK@5}7yITs1KJE9tgg!9e7zuur9^uUv)T^Fz~FoCh@+RfwEF8V zi0rM1x(o;m`B8M_iE!%lww=+cLGHsodynKi zq^H6b&7sf_Y|uqOUgahFt;#-{?QWu-idrlh<6NKGDkZm|Gg{b~C9SU23LA(&@cu?$ zk>(mNl17Z{VA)o*QfZv=bg$1U3mX+h5! z8x~8QKv)Y1I3|T#{8EaL@{K?tY`q=CERcTLlOdKH6GOY~NEVnrDomkz%kq!=mHfpg z3%m7uTe%4(4F*Y{;>qkP~HHXr_xVhvp=&~Rk@&TroObX-7I_&7Xgey0`;?tus?Y-IKK`SVUx#AJI{vERybtOPs zx>OLkV@!%%%c0O5`SYN-#{*(=tvJ;8^jmC~2-+TI0B1}h8fRSF1+(Dp4bu=qvjgUq zBRz*`KTF?D{%#V%aEnR>#=N$*76ure?!~_wbkNkA*U%k!NJv_6TxD%K~3MFDUsQ(&){N^Eo@#| z=Iar>_0NT}kRd~2m8)Gp-?#hvK2+zvRRFw--MFaxT)8r9YFvd34?+|pCsO)`mLPCq zh-CT^aEMoLl{m#Jx2U~HiZ>jxHzvt4;7@}L1X2e_Yh4W&foP}D6*rpG1%86gc6oL> zIWn~FMuJLR;gZEG>7&kmzb)?b&G!K3q-l+{drwJ^igSG0;W(eH#y`Td%-#<`L*V2g zT2PLH*Qx0pQ8ei}Z;+73W(o@Gfa-W#0NoM~`o$p@Y|oAZJRP^i5(tv`P7tzq+#6R@&3F$0`MA%Q?{sR_u zTF~KjmkOAU7A3{j)nH67#bggM;(X-;%6dmGm-qJ>#(U-A=?}2esqI_M0(qqY;2MOU zIb(Oy-%@`hPHldx@F=f(UBh8JO81qumY@IFC}ya-5~!m4(1pZN$panS>mg}WZ)I&y zaj%O~53#&QEScZ1{UV1#Bw?>c99#ZjM`G7|H>2sWRl8y;tY2TsZ?mdxrTxH?9dkJDhgTWHEfq09x6CS;+SeTy z-8K`KfgSo#vu;II&(gTCo)uw!e+r;&&|RI2fju6M^Iem480GgRP;o{=L( zSLNNqy%29g(P(sj(t?X-k#Q{YJ5=dvMU31a=uJHVP#Bq?r>plC|Nw-aV zPXF_nQ*-=x)ROEp;Tx=H+(jPe?c%o%p=1KEDTc%1X zDz&p+!)nHzeRs;M zJoY&^k+3(U>)q$gYa`DqPMF4Rs1E<67Qy>RRas>31TEIu>1*`)v15xT0YjLvL6Z;mw^yeX^VRD>nAZ~Y>-4sQpIZ64 zJ~?5>TH0Xs+(A&~(PxSE9pl4dBT1fbN0GZLAy33-hNP>v<`pF5S^Kj$zn+`x>2u<) zc+eoW8yuZF6_U*DmA&)z^?c!+sO5aiIL=HuTP=ooMJ^xd6rZ)<+idYbPCsbzBDRq! z)^&H6QwB=&$-r$w4tz+}a5w0n@INAgkMzpKRu8DhA2DuVR?EdX=a;s6o={mSV2Fb^ z#;UJhSQ9tivUoCnD|62(6Mbn+S`L&FgxD!9$0gcT7b17xO506fuS#uqCcBAqn-$qe zn1~Q^BgbNgX1xxz1nPH13PWaMu$A&>hPS%owi*eVE8@-wFs%{g!^M?!Hxfhwp0@GT z0<60`9}8gGsu$I2D?WyZ5~d7-*KWDes4mh3NTF`==Q#*4RBa(53mUpLP?w}dCU)vV zKe5U|3y9(ma>7R&(;hPW> zh_hl{;A?Im3%rMYP_)}dBj4X|KrLxOP+S-%$C^&c^#UdWP~j;(bvk-SeRsC?oaVp^N$BLmWyq@lW~ zW{czRr%SCuoeny)y*)C-r|hBy#Ro#aeubL>V-rTtc4co}8o zgePz8r+c98{J2Qi67)kxjM>L*)oBMUZXcCozQ*}VTMTQYrzB6d?2Yj+*PMJ$9!=I` zY>XXR3LGA+5TeTSi%sDc$~kt*0~|^Yd!Lv2O5GLL-l z#72ekjpuI(tPPVC$2)Z6o@Fb4kx@FNV)L3}ZQ%2!E-({ni>;c_&djk_9$3tDtW`|N zEcS}zwPME2TYeeaT=KgAX~EmRh1dUk2qTXhVT{XsX*a&D?)FXR#!sJ z>5p~Deq%cIpd;fM-v-&8&3xey*GdROCv$Xbgacd5W%Ilg7scPlN3)VYMNB*GxpqCR z20uNPV&JDrqe_c`OV233AioDe$)mf!80%H)GN$Pf#+SGZt#L&1Z4gLDXH?MMv4z4h z4d#X{xbMo#yi_wC(^B2E!EN9^WN~+)D0ih@=I|VEQu%Lnfv>L>uH9HrG#yx<2oWNZv0zhO|l3;|#&3ShthfY9-B>Q5_p%qyEpDTpVJ=*eGNb14ou-*ES(GJ8`F8M}c~5h+ z6>|7h((g3y65Wd&{p!hccZe0RGNXdO526^;iyKTnXxYTuPsPKt;xg z&qC?v)|I+BEg=|;Ha~y5a7(2z%V(oo!U?ZFg||N`ym|BLujO5k&Ej(|1M-Y>iMcd> z#37VF!^Hlqs7pJm$7I!rV+%yvFa!lMgV#*yCWnyCe;q5noVyxLCG`9tAlJah2l zghn~vg@)YKaEZ)?KAm+xA7&Gm;gNumpnz?{kk(uGF3qmgeMSRaOFis7R%m)}Wc+s4 z5${omv3(_WnXXFa#Tru%B%wodRXRbHjO~5rCVXtWNkdfOsnm<%*`Yn{K~^`rx)mxN zp}M;cOVDsnf!l?~t~pjmFX`o`bqi5Tm8NAEw!=`vsTEdHpSCmar&bDp&!?|BpRiif zIJ>kSDMKqc2C+>00aC?1WMY(iboP?zQ%tOWsx(^)w8=OqlS@t+8-1qAWqIS}-FDrV zT}ywTNOfT~p)-a@rF{RRV-&A0QOKmk=Oi|mw#gJU4G4*%=UHvt@xvi%xw7BV?fM4> zG`56a%)D)dKI;EG2(!@DXmqd2%c%@S%sXrxe-N=EU0M^=n86UnR<@~IXq9tw?Wt|r ztR_b;j#>c&Pt-HzdGZ5V3MZ99?Nxd8w8p4ZPN#N(&B!Bvs_v8yqLM`mBl zqEn8fe;;dcA&?=AI`9zB+*~3i$X_1~SRSn{XAhtfA1rA-4&^UNRN%gaVi3@>>Gjz> zq_;jJT7OIc)-JODBaDUbaPKfk=iR4wS<91CEnz;JXjoz4>1%Q^>-PH9j;v{EC48d6 zg^wNzcrKi*aicR)?n{rEvu?kn%7>o0;9PM$x`9i!E(D>q&xsj#M) z;d$?ziP++*M!BNmUR1o6`y38Y!!&)svTq1wUW}p|H*R86_c`JCcI0ZMgFI!gc#s*{ zJ+8ZRcPOZ{6c0jPdv99!e)sLvzTA|HWDuSwz zt&d|_!`d^2)n1({_HGJhlDr{KcFKR{P5AyBbL9)?el6&?S?rGB6&M@%ch})KiJIo% zLIdKP@PC)x?sYpJ^T{{ir)W;8z6vjLwA6YG$`k=MVmr>iKbZ9O-LY2#o9A7IjsE=V z-9vRLjZ@D_Kfh}N@0$W%{r!=DzOs^0XZ`1IzOIJLSy`V+Hf{si%mG)~Vy9yy2p{RS4T3;e{c(>`m(#<;!|%<%oo`s{;9RqT zE*iN>KbY`R8CUv`x6xEgOG(i&e9-~4V?=89AC za)oC3(ZzP}a}f51Lp+zJ)-=}jm|zJd$$Xj1f)lAPT^Xdp7q2CpO6geJi zC{2;WbmkokS(RkCYlbUJ+Ki$m)rFx=m5MyUujT^soPpy;)W^YH;Jg>P&5i4s+F4+~ zV6VyFGF#)hJW9!JHpZKv@GvMQhU3~jHMAISu#&*3hsnpa#Asgi{PnDozPdrDUjwtr z9Bk+JtU4aUoV0c6k{W%g(kWZbaelg=Z(A>X<+K^R+tn$}Zjl}Iyo+nFCPrTTRllHX zull`y|5LB|PZYnN~SNyaEsaV!L)ZNin+vN4eKY}0me^np=J zZC2z3*4w5Pw#*q94Qp!2a~_P-$jhRs1uU*vx`$@aeWa+i{c4RUy0j}8&-?OhJZ;4X zkdt>dEkyDx1;y6a`%h+ax@;bPaW&6y&?malSo%GGNnvR<8?JXEWhU`(!CO@A6VW;SjDek3yjzt72Pn*tG zHpI2vn(Ne0s(hx>e=igv6Jbfu-5!Z$GBVkiOLvx^i|H2EyW?MbBv#Md?=tki@?+rG zBrzN{`m$AZ=do(_WY7+$^Xe!kA7=bH0n78HjZvglPAMgw>%v*q*y0N!rg&K|iM~%3 z?$CEy)pu1Rra}OZ;S=tJHj#RyVg5*Sz`3$otL5*L%X9SUdU4InJw$m_9~4yngM88%Gw(<%`p0otZWsx30MDP)?$i zgWA1?rxqYGrC87Q%7D>x$?-dyCJr zCsZqf-_gIkc4d+I=Gj+2`z(%IHU-KTjaMx_VO4g6GMv@uFt=}e?a2NzUH>fXCb2)u z{rlb;i*ayRDkQ#xGet0k^ZxI1BJ3?fM|y(Nv#wNHR=S!e;8JO}BuiSsR9*2J>2VPR z&-n!Wh<=RCha08*rk_tLWl8Fe{O#B=>RyFzRMtb0kw%3Vw zEXyBbeS_1dUD74+$OAn{*CWIdv4*$#Sjavqs1tQ23*bxdeYJW2EI3hso`pL~>&C1~ zh<<`K%bTZc?Pzx>Yi0yx}#HqnCwNHz54A z;97X)ZZrh*Hp9zLN ze~@y7O1YlC+&*N6Y#ms0ADP`lwWZhvZzh#9ZDsq35GJ_5a{*@fFu3rHkoCD-JKutjRQ??J(Kf5}QFfp>a&h;DXD%Y#M(S7}M`l-yi#?f;~_-Jk!lp_9Et zV4&iX%G8t7$*GXVzcO}9z4W9wS8SBeaoQuEb!+?-f6I9FuaL}Qi_B!cMEeuLPo}iU z`RRIxZqRjn^A;+%PR7hizE?8eXy7w+DA?s1bw2skN$W&AoFf+s)9vw$31kcB7RGOo;wx``o>IPg#hsmF5*}2q1 z$H;Y>Koziid6=AIme-h|a$slik)iPTrsWsP5eWLiQYErn>uV7`!H#uOzX0K`tGEoc z9`ZdJx+rKFwel?Rb$Dn~=qc4|rwLlJ?d79GC&}HpTnppcj1AXyz-rEeZ~M$n(Wf}i zGb#$mwfnm;+~jJ`y)Njsl&Jdb+Z~Tdu3Jwkm)7f*YrF{|7@=lCwnw7i_D%4@JzLF3 zO*YN1i9I^~fR@$!SYXhbxI~;%?qZ2@S})bT`*QDw?-eJ^CksSi-7y1hSc%FHkBEwu zK}|or3s*faxk$Zm%Rb)ZM<0?Fm19ym#^eY&>pFZrKJ4`yZE`%-t+zMLQEk&jqd!e6 zIL^&cIJxIbvOd4ua!>mFsk4u{o_)Ocg|jWZv&ghceWJU!^46 zhl8T&2)Y{?y{Ck>w-AuPYZ;pKkIa(S^CXTmd?u>RGTm0SceSGaj<>bUVZnIUQRHO9 z?{NNp*!6v^W}qVY9<#cuTU;L0N=$B{(P%n6?u-DZH0_adW~jbpM&Jd@(c|Dp4ZO+E z9}a@fkqpk#M(tEJ7{Tu47|6|c;Pg+APB1p6hID(4*YkH*ikVdTjpmGkG(nlAt2HS$-09N)3%vV8C5z+}tjV zf%!gq^bqrYtlnd*gM}r(v5^&Ypdb2x&{Y%AySpgmEd)#m*Vq-^p5liqsd8nbUyEY% z3JVJfcD+w6uEO<#tUX}k!6Nj6f1c`MoA?pjp+u&N&*qN8_49;g55lO}$pEV1h#4Z| zacoa(7yo-famEwn!oIB;u@c>pZ)>Sikgdms!;0KlKX=afX}x#5f@~d4HCr-cm)mB* z)%7>NzeHRXa*1cP4$0)-_1tFI+wWM8Y=GVtbHpDniVbt=98Kk8Ec*I*Mp(D{+0MR% zsnKH_qA6qxh4HUZIQ`jfF@{^}?bY(uKll9io=`&{GGQ!K# z@pv-5WXIOe#0)%YdNcoHiLS0yq0czDrN|PA)u#;#>7P{dyliY2-#m@UdR5KaI&b(jlqk8pN5+`4S7i@`E779P`LY^Jpb zL1nrh8eXyQlj+n!IjbBEBQQ%`cRLdu{eO5Fj9Xa2c^n?QC)M=WFqHfIy~_MH95P~@ z8dC0uJMPbn6_L4aa5@FLdGMW@Ow~AYHjGCuIrCgSolGFB+>NU+{pM4uyiMEB_Qxg; zSdIL5EJ}=<*#fpa0>XF$b~@Kg!FiP-obT*XH+=WJ_elk0q{5%k%ZVO}lqpbGP|BhD zm=#)GqdM?KsbBHuJ-eMri;alXcUq~ApQt&-^+MiGBC2VGl!HY)Zo-fYXNj|C(jx7$ z#6LYD`}k!D57y1sjJgPCbfLNq7L`5<1$p>2|q1%bUZ?o-TOfe z(t>y(bFXT{eHl9L%jWbAq-TSHODlcNa?_sk za^u#I2u|e3csaH^?6Qx9)*nO61(>E<=e=M38E>pyydafp&fT}5{CNE*t4`%pooP3` zK*?vOa13j_kSXEpi}(7jo;e1y#dg&1tTFXd<2l_Og$Qt3IgYX=(98bLgB;1nTw3U#PXj- z=wwvttJ-ooDve#(Q^vcd?HvV1g{GTxkeUH8tdU0r;rpF}AL3;ORLW6E0iqiySk_py ziEveQy5XqqeIF;>fy3T~!d{oN!34($n0)ow;-B5P)!E_;e!(BIKH@Qm?{#S1fpulc z<8*)*x8ZV>>eYDXqed{NIb?YB zkaR`0adEXSkJY-esss*FSW>q8&r@WK?MpgN)SbnB(#v-1;xd`Xgxqx^9^9?pIsFlD zxG9|7R*6yJl0?;!u0}KX#wjaNnU|d*K6gbX0;(!!i!&+ecMi)<4Xf65t}>@A?9j4F z`_@eCM`3RF0YZ?c_7krIOj~m68v$P|0mat7LzU?74HSdKV>cF!w5%k4W^r?zx=s z?J|PQ+lPNHZs3RfPx`#XI5#6NP|h%jy_^~Ktv=A1vmy%GtaOuxTwEL$CHn}1YoHeR zc9D9F$4-;m5oI3t?K+qn#J~3qkq*BhW#LfDpK{@=<7q_YxsdBH?TZM#Q%nf@(;kmz z|4c8p%QOy&9EDfNak?s3E%RXe(-D^{K>bTbpESK(P`Uok-dJm$ywexRAPX<}^lBmm z44^rFj!oM9Uv#|%R8?F1zD)=y-Q6gSbayBQ0!nuYNOyN5ARr~33QBi(OLvzb-5r|^ z-`t*a-t&IH@qgEVp+nr8z1Es*u4mrQb>B;QkUHmi7v5vR4`LeHzf_C*s3SglX7Tiz z8ArtrH*%x7QRAL8g(OWHbmG_Oe!_Xqh=706CFRDg^euuX!&03gTzk4Y{jg!#$O`;)muJPJA2 zo5MhXpz?h-H6@-g5@*+)iI`DBAue63I8u-elZ|0XZRqJ4)nx$=UkO*yyXM(AGL zAiuKT8iD^dXrm`;&w)-&SW%KP9^K0#Mb8>WVrD{U&WzPHxP<{<_BF-W+<4^1bZTA5 zQ6@%;ut-T(SZT5@p<=l%H%TQ+cI@E7@pT^m>*`GD9&!sGP53iR;okUwgkEW!a_7(G zi2C5YvJ;b1U$PuAm6w1HO`$aX$50P(7C7|*gn`zSOiQHU1$RcbEh$k{Si5KzWy^W4 zd@@(HyKMY`gnvsVHAslUnY zdC=oUc?EB+4{w!_RrW6$`Z)>)UdV){#l?_dZ6yn z`=1D$jMiaxEIbUo@!a~Y5`7qk-}I@Y{I?&BLuL}v3p-YM(^^$*Z5wKrzS)QxzO2D& zA7p!|GG1)Fv-Ob4Djn_{zl8d(K+O$Z?gL{OOhl3%u>=NUG!tfE=78M+$um|}-_3Fw zBOSFj(C7|jx5c|+|(^M9y=n=h51)v zB26;RR5&_+&J*QSXWlH?=t5dWB+gQD?n1aE0jRZxVQw}wpO5s(`*Kb8mR2V=`;m9S zBVsSF3cYvx2dbq*aHGpKLV~Bu4sWz&O+7DZ@M@O>@xR96Y<(OPe{Wm84Xg^-X5Qll@pxt@M1yxO>+_j)Z~)A zFRqb`+p`|(6Sto=s}#GL6GqG0v1xG^b5X9vkndr)l=oRf!cF%=B#X3@7Ks?-DCwaYrG98Hr85%@rSDb)-W!P1tTm z<*%WBtZ>f~p8tZy?JEKT^q1-&>Y315^}&ErgE+#$COZn7u9)r4`}4lV)bUmH)W7uO zw;kXCqz0qe&k}`Qo^A}Kg+B`?{1xSMo8w80gM%UYcLiV>2m-$z0hOWYa;bwUFV){} zt@~F1mRRe?U`m-m2Qqks4^`WfFWUaFe43LVGAIkhIt?7=6O3*SZ@`^-r};UPMUfPZ zGZNfGCRN|If&BDLEPd0Xy0@4R&tX0mb$lW^!&2^vN>zz^6S+jxX@f-~#W6$YOl4Jw z`+>EK*HE`HezL}-=JZ5b!E{Pi%J^z}YsR>>d~iz5w&8`FHzd`WaZznfY{{r^aa?qI zKvyv z`zAYFG6ci|Pem_J&Q#uRJN#8F|F&6f_Bv=8->x*x$dIA^b?31;lm-RyZxoimfq?0K zUZD3&!RH2#{!MZqI6G@_zEWAfz>|#^%b?J0{6!}i%WF#-9C#V!0MM-n!J;~tRVzqO zr;H#M9ILPb5q%%b%@J-`T7wZXXmfTt7 z1=sP1@3Ovoj9v>^{A4ZEa6;g9N>e-Vv%fD{G+3>}G+8{;k zQ|pO7n`i=S33Z8r&zCfYG+7m4>pyLNm8EHZtuMnpQrh8l1gIxe_s3MOyG1oe=OsQA z;3;_Jrpvn}Es;bMvYMpNpY*?$Qy^jMIrmtP~!#zj*CY!cA zQ!Bn#Vh?+o;uiZ%-CWMFWXNQ_TRGDpfT`(POY$-p#)Ky)gzDT?T(2qWkz`tbs2~n?4D2v~!LkQ@;A3c#5{dv3fPKm1P!z_v5c6A; zM+&SyypG0=rGEo^br?w2>uvB93E5@$!Kf+n##IZifaBNkTNZVsp-izcwX}A_-gGVJ z2U0W1(%yt=v(kVzn@NON$S&RHn%}ehDyTKari`+Pk_g6P_>kRhX@wPVfor8K7HA)n7BW`RFj*xO5rzQ$sgpm0oLte&%%cG=3jJIRiE9 zaUM?V1%csetNCgJppm3o0XbRPg?|(4F)e96IC@|X^!O~FH@dj^i7rY67uH&e04Lft z@;D{k1+Ze1UZWxqM#>ZpG`*9j8RkiMD%y>9OzDhif;BRi*{60)-qxnYVga+ShX@cN zQ#cNTO0q%cV|nq4cObnKfy8B*P^9cZ?SAfX!}Jb|4GG_hiyEKC_>Gt&4aYCl!k;#+ zUgHKxj(LlIN>uh-R_iASWSb?@B0#KFVZJ*aI|eNzL*Hu1k8iCD?~nEWQzU0gXq9>1 z8Cs^;p@Eflu36%zu0;0dPxSO6v?u2B7P%1T3AH5qIk`8bQoOiq+tC+r1=bICUE!yt z#(5UF5Y?UX!h%*ILG5uZkpQolej1)T*!@!g9^_hoe=kZ30&7YAA=A_>T z;?T44GP||sw>Q%*7pXNq_ugk07w*-Q)*`v`(KXj@nBvLo$Py_>-(L5u#eb5YaPmBA zX1fpSdiZb&VMgFy+kirK*J<1Snz4W8Q3itUqOzUU_`x%mm9ix98pI!PBY_2*x?7K; zn>XUh?cd}RsKyCEyRld9xd9@Ib-!8l3G>uuZ}xvCUES(!z2e|O^Fb5j7(Ou zV_jB)v|sjexBjf{ZN5m{A`t*#ARVkJH1*DHup?Yl6`Zd#RZ?sGaWw+3x@`f~Qs+)U zSNuAARkHxRevX9Uq1wsx#6%#Q7PINrZOi@TJ%{t2x*O2eFmN!?(&dx5kU$h;8xSNu z#wv)B{FyC)V&QWCrRCOG+i~>S6-c@b0BzmL#b&ot6CU14vX%M3DzbGeNj`(6N<-h% z!t0dM?YpI{%qj1m}2!j^jL>s#NOK`rZ7%eX{_AMt;)F5qzx*o+e-`t-dMDf@P;k!n=pi5ql_%o3_;LNOWB zdeH4OXg)vva)TBoM&*PeSUpz^TXnY|wMbfIu!m`=~N(?X-@|FHn?+n|j#Tumb~Ii10xzB9-S6eDh_~;jcua$YXN6 z_n?)KeKe9MGJX)8yXf}`&${b!!AUZWx}Zw0t*G{mI@bAuM|zu8iSCoaH_S*z#^Wtv zN?%G^f2<=U@b2h3dLQ3?L42(`>$kl9av@mQR`q=h0f$vRLW`Cci*DTl({7!*uuDKG za(>1zop&Fqh;yIXVwK|GvLCp&GN**?R?ZSP?Z|sDYZF9;*c{8pdz_H8N_pfjbj@?D z5z>4YJZDLSw_w(3$u!9*)bZ^qK`dc+&fQeW8q$j_N(|ezPV%#QGGD|izd1ztNyTMu zo(O?RrEG%4-eJD@*p*yGanfu3KDgor)Pcn&ny z-hZ@v10c}5uK1yh%+H4_cqwN?sf#66UH)#?#gd`%zMf3Tk=Ghv{M+VqWvO#yWaYQBfzo0AzpiO4uS% zx?tFo2L>A%K!p9aCjx<;tSVa@V+m_$L^`CU8)@X4^%eCNW+a{6HRl zWx->w>NOdq08%~CqMzCZJ<6LEd{C4ufJcaGlb(USb0r7L+i`7Jp-UZdqQ>N0o(au9 zGkf0b^h7jXjmLr7ypuz+t*!{>U|s1S0nU)N;MFuoh2r`Rk2(;h0DbZ3r^im*xViam z76Zzlsps^Qd|IHeEglWgk}?Cy%}FMP1c=b@xjsEiz38aWeo2v$VNy-u{@83BOb*GQ8}pp&Wjoka=;Fy5H=@I>Fa{??Pe$B$yN@hn)0YZb``-6w-e-3^yntc$NrY zPYCa?qV7Wvy$(HKg9wJ{45aX5!SsAJ+))Z!7*awTYdaOAF@n-Hm!);o8u9W^If}(A z7Al7l{?XEdL33;>%FhgGWIkLRdlN>PeA`%w{tGdIKpD4g^%Khi0!K#Qt{>*8>W_Lq zG2(D+D0IdyxOzn!j7=MG#BVP2V$V*H5s^#pu2Oq+eYXqr) zI(TrD@uTruj0zr+UvTfXpkQiG{m|$|{2V<@%_c^z1tYS-ldxZ4wp;SayW&&wz>tJlAt zYmZA!{~=V6kv}$&{~^RbVJJ>?@SDJ3o~L-(AYhZ7CCnsE`-BOyna+bet!ID4d~?65 zaw}RZ@}%hhl(r%iT!iM)Pdd>v=Gt#&M~s8ywz!!rw*I*v2q5ju<_zyHJije*uI#^d z^K?CAI;+r@%_=;>|K@!dJ{`A1tyA-!{K4mby2_$+!Hol^sZp@tbu9Lg&O2tZOUs2ZUi6cj{Tx(PzRY&na^UsogFH|_P zW}hv$G$d`?9rcE3m~ia6$=a^dy_T;5?jNnA&YsnuUXL%+WTs{X;DnMWCj`POZ|5}MGP zudz8SQll$=`!m6q|E&7kbZ<)0K0oX3BJJUp&UlKo#i?js4cJ`X)YlZTEwUUgmhS~G zRaaO4`6f$<*PWd6k+#`>3h}nG0%4Mc+ixK0S_N!P{nj6L&y}tE%a_RZAVN;I7bPzt z)8A^Q#fGiKLHP8gy&E|F%Sw$Qx6OsTX7^%okPoo``>JoPCttQKLQ3>iF%1=&ob_}j z=d9K{pMt?Kr?~l%lC);iJr}Q<7!`Kzn;tE(PGOaZo)imKbEedAHj+SVVs9!!00>hW0WUy~-Z9Ypo- zsXMo+6Mxl5B;eh5YPDIO@!1~Qco?wzR?~XfM*ICHanZWw91PBZqx6SL2XTqM`h z+l$ucAhhR&mG1FPOy=4;U&8V{+3Wrt#+u9AWR z%s~M$x3MX?!i^HgZb1U`4u;CPC(5)1)CMtSN zb%6R2OqP7+W{(^Z?a$Xz%zw)0dP5zij^0betTRDhZQ+0>b?v|CJT>ROzC)#y>RgqJ zTV(g)rdJYg>gF{G??g^&tB@+GaGMjltQ5z)6ZgQ$M@$ZTcc^suOnN=`kVeC<;aFR4 zO({2gIXDv{AvC0|M|nDUBWOd3{cRkbo6=J~cMn6bnYLbB6~!n05q_JjQIYq`RTZlT zMR#S~OGvDge21Pk=s9pi5XVi~25m0PsqNj*;b%B(>iTmTpL^;CNrx)W@~!_yN91_d z<)KMoRwGNC70N62`!Lx3I?4g>+P~&a_7sY0#*{$OtF(;Icju)U6w6raHv&ojt|HA>WzhRH$Ik{j2F8 zC0C7qBd2fmIDjjFI4&un#3yJpzw;G>zRJgHNgN-JK;AT+hDh)0;~9c51GmyX_bl zpAkPVv#!IW2zv4T1S{Bt5(&RQVV6;-WzZOKB%Gbhe9dW}CYO4A)g_SS1@I*$4;f98 zVbD=Nqk@3HVjJdNtBfka6cV~DHm;90f5pfrY|UhrYVD8OA()jsbm*-EL~u1whb=~p zkm6Jh+R675?um@Q-;!sTOzFs$eC`yQ;&JwuQQ4Js$ha$3DVCO%xgBjRk!;jPajeV~ zMCV7VT)c#@;VL`FY#EO0gZ{dsc`kpdVS_tGW%)sMWpVJNg1h+UmJ>OHj~}gn0M zXb|0x5&Lg+?bBaA@bSLT=o;=dgxV($Cl@pqI&W8s#Tl5WWSF-8Tq;?(@EbrlNymVn z-EoR6D0Ld`u5tqhRpyrNWAiP4R7+omF!aT(Wl_Z-+Z0vu;~)}FX7LgXVzs|ltRad2 z8^C`BN`%)wi5N^~ABqeTHLA{fuGQZ?%$(WusMZjt?q1i!mPQ@ZWTDpKPGB7rs5n4l zG~dk*t+eL6-W}@==BuvZZ(BsgJ=9#3-FkQl1ocLY8 zXhnr>?`lJ`_=8J}7HYx4%_dl(^p9l*FOA;d;QGHH#7-qLb7j9wmMUpGq8M~Y`P6G@jC+{x{}f` z<;%jj5F80_*dNzGy4%cJr`MsG!=amTeClSU3om57{vo9AEMzm82I*&l{ML}zHTTQA z+wYajU$o_IQam#FkzO@dTzRU?Uio+@G!-9R7;?2m6e{r*uTE&}x-lw5lX zwlWBXB&~SqS!-+jJ`ESS#BX+aCAJF{i}lP{Kk18fxK4lKMSE$weMf!b6+{852*ZZp zxW}48PA+@B(`cT$MlZk83C*RMw$_)6R_9xAUwJ!UorT=aS{`CisyRc?UnFhH-LY2g zGKv>W$?po8Oi?Vq60m5YiB&y;>6 zS>>_eF=8xl-O)U|XEHL5-)C!VG9ZVJLi@9u44+@r-Y?ZTn2O&Lf&t?A;rphr>($Y( zbg!zN?d`VS&vc^mutjKYE`NJ*m3aC2-86US=sy_4Xr{8l zRKMb&h}S*zaulFP6vEE>!|9?Y)A2X2>zn#fd@D_QmCkeg>v@ z)rBC=WYm9y5bfYM*tS1n=uI($6S})v`wN7Bbg@11)+z(CM@(P@yPw)}hjpvqBr0f{<0_@+uzRq#)8L>7wngeV{ZxhOr<4Ti9);`ub+BJ~J6< zQ=8U^C9j{E5Hioh=;sfunoj%bsZK2l6WiN1Yk_9s9VV44n?48K!^5#y)Nl2LDIfS5 zlf3d0x=2w!-IUiBS6v!)S-qg0wV@3An_Ngt;h(UYKN+`20IFUVkv3FRnv8Q za!|kfG}XS3Nxl62BOrd$XQ<95pxDU+S$=3&csPDp4>!USb6Qqegw8s~3bX*?$YFYd zT>JTO*nBnU1)T6@d#_x7uI3RiF`4wu)I_qDkiW4Tb7&FMR%49as4FG@9eX*+^p!g8 zCv{F0Ejk=W*-e4c(QotZ+R2w&KUcfkS4*TaXsK#Q737l;bX@BoY7AKlN&d1#L|X5? z%CEe=#ymi{3M5%iC&J%hb?574Qyp~EpIsAkA<3$nHmJ~bJ19o7_eF`DT_JSOgzeOE-7+mOV_#)6dZ{^vqKbT zfI_6LD{6;11764rmkvLxCD5b~kkgcWu{6!FhXormq}nFhC&rfQw~zT=&#OUi_^p!)fE z3>AFn4-hb&dpDrl1RvCRu4&&*U+aT)S{N2x*;49GNT^W2**bfM^rtg$oXVDRgzDQv zNf=O-QtG@G6skbPhr^rt*ODA27knjVgIOdLhjIFYVzO@)1&6IZur6=mPexgsI> zhmtpjO$`=YwrcfPx*Si8(;RM)T0>LP{mZ>YhcY(y(jstb(b)TI{3%{Q4GDA7Jc{+O z)<cBXsg#_n3i^~-SP#7?G9J7myO3V5GeNoPKI;_99#kItGU*V%!f06I z@!)vF+uroFUu-q5>6>C=Bvr$nvJXi;xa`+Yt}Sc0t)LYy+pVZMDlEtdFk}U^G>;hb zO`@3~yY*@NOi(y7>&ZaYL3_F1Xf!fk5sO$kTUJalHJP!D<;iH%2PsCfG6$K=hkX4I zg!Wr?*MjVBUENZQJIyjm?+l9DtB;Ekxrzv=bdt_7f)U`v>`0&M<2lzqv+DYt!ejO3|MoMbJRyd=n@uh#1t=pc{qL`%*Y{2<97(m|g`Q@oC_LpPnH zP9#WHawUesR!p;Nq99B%E=BfYcDAeEb(mmRUzGdN7E?m%C2r6keo0RDU?#}JUlrnF_u!VRr?twy0A^F=l5@8e75S(`$ z3>=!I%26xL_QUw|@~ozH)hw6j>L{*|*-K(^$#aQq-h%BYT!YG?x7b|hE)lL3egzc5 z^yT?smQTM^^iAfRIkb9JBbdsRmVDvz^^Xj!Xc3S==rcg8*CSZV5xGBH+KImiSwK#& zezX_GHC#}2*?JK&4B|v_FQ1&P?xDfz6dt%Li8@z0N^PbGA*y$%WKXR-(1-0Vnju;v z!Fq;084YD?!^p+zUJ^X*+Z z@K0&4dHDY3{{X3Sx{WM$Yh5V$f_wzWLOpZKqCGlkMNxogHSQfeXf)hIfaim#^ANRI z9bMb5ZDz$GRhkMSboRQ?Yj*>&X6S~5&xo~HZ}C%PxZlfDjJ>PVrbHUO&Edvg7z`;YW12(ETLGVYME=8V49{{T_53Q*{zO8Aa}na&;IPIEX1x zP*nAuvuFIOB0eNjf<3yoWR-4HJZwsLc`cuYSqX=_ruSQS+729Onez@^961#P9(A{zmX<37LqSHk^eoMdN^@6XkLm7(6+X=$!JwsO2 z0d0zK{-<4dybs`d=x$8}obmz)lCuyFhuW7lT|J{=+xgHN#- z!l3PQ9%qL{xVFjon;+OGR5Q=tLA+@0(M{L|)p{cq1Km#HMgN#~?2fyIkLWz~VD0AZ zf|~kECXol)%t&fb(U4tHk~-3%^Z5f^8(^xmBRGn7XvB}s4d~n3k)a{nz1&M$joM)P z9WSV2YPZgFzg8rn`_N!>4uIWH0;QT0sB$bW59r6!F{k^;*(~RNAFvemtpUdUN@xn{}t41efqa6ud2QQgJk=5QZhRNwz`alf+2Pj7St%Pk?eI z!)Innhj=Z%M-R5XU$HjH%00Q5=;+#$=0D{yrCuJ30Dzjcq}j;gi?-0&b)4dqaa<|U zm{6JrPjuc~BpFP;ebn}1JM?R8C{2|ABNl<^UTM4Cj0f)wIof@fW(}(pVEE$ig@IQE zP2sb~t33V2a|<0ZYNqg62^*_a;`okRiEAcLg)Rro?7pU605=?9fB`)y_1y5Df@D;C5Cyt2o zfM*$7r+x-O^bcjM`(}SHHqmzjCU0sSvvn+eefik$(Gz>~R}=B`NZIqGME$$v>+X*5 zFlkmJPE&&ex%s$A)H}38?U5oW;22>67tR{t6-3JUA;Gmrg3&nKHlp0L@1r9GrX!@B z=H`={Md@zezOB0h&e^;blWUVP)RS})9RHpkc$y2@Z^LQjP@JPi%7{BgH7o#4zD+gD zu~VXj`JLbTBppNDe1!)s_*Ge#LQAw)Yr2gXtW(eyj=fBm)wKmY5Om!t$Pyiq=|!gu zjORr`rN{E-X6G=!+SN>hAX{r z3&Zs3;F88`1inz?VE%{1o{{^jdi8CUc0}62FIUB)9$i^V)M3WuL(aCT)>H>NL>OKO zTzG18+KJvxd=k1j>%V%d;%6)C+UNfWTB>MzvV)q+A88#VsEZVhG%K*SR91>H@9 zj$jN|K=1sP_T&M6L9)^ZYS$$$q#yoJ2`bdc+BLUCghqtTpsD{c&$4|ruNrQ~pI?t6 zYF5v(yw52r79K4XQib*{TqpEeO=z@d^C;)K)r#M1$(!A@F0#i8OK|!|WR=_CuwvNZ z5&3F>%@-o`hma29G{{b>Rzg92f8v}r@+ME@-aCPw zjmljqf#`WU5pH>Mj(O6tiiFeg4L1I!Kj$;jO=NW97j;QWOvKi{9bzt#UOoy(IsW!m zn3AjX4dM% zNRKGj1S*u!#ynh$_S69}yujO)OrBsG9z!6nbLOLf%F+gD_^#SLu43V?Yi^;aqWShX zzfFhff>4j`Zi+LuE%k+2Ro_LFs8gwu={o<(QhCBGbSJ&x?u{_wHT9(+4wAY0(FD(% zRQLS*o_<&ZT8=)T;jozumIMG6RZFgG7%<)hwkCX9_Z#;*PGWP($kcT;KgP@o8jp<0 z0s*6T|CFz|qg$!lsE~qq@v5DkCA0omDRJuoWrj-l__l7dRDFUa-o_gi`4*3<+c#6Z zUUDMRsV>U3RB)}R8>+=xc*VNs4lDM%-s$IhU*`R`0JcY~_KUMIn7;-N{5s>#8+jHv zl#mn}r7o;941(tcxCOM*6R5TXK9)qe3@Q~8j0nU`EV2D}e$xX)*fE=k2PnH0>{(2s zJMv#V_O3Weg~Drs;C^`TziQ=nDyi7mmhwFN)G(67is3B(^6E{SR*>1Fi227$yLbZ5 zCuFXdJ|eP{g9Ai+zDD@wMQh!I%wZr0<=eLLex`&8=7=>EZfP@#iNblL{TfFc(9Mnr znLz08`eBVHgo-?xBuGQ_=Y4SA}YbQ!}jd8>`8AlSs_F^d_HXOX}yJ zE<_LtqmAzEJm}n;6+@L}eqVZ7M@gg5t&{uNue6y_Eeh2r&)fvwO-BDd%|DvPss-Vm zF$;Np=k0U(*KOG8!YwjmG_pHU-q#C)#L!Wy^FNE8fX=>d?TcM`OWo@NE|Q?q@(24& zuNSA=2_dAd0W8AD48pMvV@Vf~^C8U?lmy;S#p+Y?ED+nhYmj5#9(EwVbs&^UF!VzM z&HHZC8q`$m@Li@>Bi?G#8M=FN9on86B-Mx|3I$V8dfg;fWcr`;1}O5I>A&Qg8l=B) zEA%J%3NQR{+n+XPxbiLqix+<$R@WPt8U&t{6wSZ(lOaQfIldj_JCu4soGq7|DL@#j z1o#&v1<@x|x>Z24%uRIDur^<^SGq~CgSobiu*5@5DRlwIVqzL5f6x3>_l_}rwic7j z)O#}d?gFrz*BLmun&6jl`-uT0G(}2MBsx?kjpTsi4)n4E&Y&f@WKfo z*3z!aSW;^}M#HboEG1cT15NeMa#?k~w=v*aZ}whA)NV5|?oKz9jCFNF)@8c0gbN^am%g7dnK`A_9~yMm9}hSu=q*$J;E?+KibQjLu946nkQQlc zN;?_OS387KWZ$J2QAl%yJUB&XFDbVg*`OfiNmAAjl@W1pFeWG{77C?n>z>q#-)Lhs z?9X{k^%lz3lCaU3_Dzr~>tNlN;Vn>QlUD{}&X9!tdhsyWRA`5*vrI`o$X&*W6W=qh zoA+&R&XwqU(5e`tfuHSN2cY{Q)ShAljkD8}Dq3?Avbeh+l`Q6hZ0{5ILskGEet}oF z=tk}O#~;=RWfV+b9bbFy2&@inGQ2f2;|j4fc&u0PfrwJ#ijBuP)J#u!&qA5HS~Ha^ zzDwG*ZE~36q}4i6yZ)(RrJT#cbWXC3%6WyrfMVoi^K7y$WvD7&Otb_;&uwqlFDd5J z*7!?PO-b$748{4J;}t?=cDq<<9_nlKjQWk&gXgXI1!BJO&$K8k7St^k6C93iQbTWf z!O(PkN8gHVP_oNc0aG~6c+ZVK?>fu}tEO|v&P)(@&MU0CL=hr&cd6Z`g z1Rc(>4x50UyjYJ$Uee4Gz0gT= zwu{`o_UJc3MyAqWw&FP3mSZl8oMZMAFSznIs>Kg9^V%M%H#gaHMM68xEj6|aIW-+Y zQE*&6ER>ryd#S(hJKoi(?3TNf7wM3ag%S-;J)@FKLr?qBUfpi^NS<6<>=SqmY97dQ za>(=J&XGOYQTuWFMuD!OKM?d9BFglZ^H zg6GCKnG5m;vYr@q$<3JWeh9B-@)f243OsgSwHwv5$;vz(B@lEn{48iV9zSfhIaKOR z_`2gw&Z|*A#?pD!4-OW3=$swCG)Q)$8OF}lr6M}DB><7B^lzM}dbAaUU05r>yo;k! zR3(%q)LAeHQe4mjNAsWH;Pfj^&M@gkg&F0^`QZ21p}rs#-|Z+Ojp4jMq<{?gg3IID zojPB0_XPE_a&93VzDyxd0`;5Y+&A8R5g(;yb%%Klfskbf=%U{jZ zl%b~8zDh*CY?}>kP~Cx7QOT%Y+0;2b3KJmM=b;gp@fD+R8Ejc)IdJTyP&Ds5E1Y_; zU}qw0xATjsrIU2o>9wET^z9gTu#>W0y4|#6wo#bCU>WzbL%3}R+7n*O%Y((HlkR3$ zV4=00x2pLCve(-|bkHXo@6!}GUox9U9AH52`V~TTP#mPmh+pb*s2f4TjSQ-b8pm(c zFu2Hpa~LBL6u<>(axdpA%(pA+0OOaeB7bxys7+Oenogi93VC(`mA|fI;I8~*Nw~`^ zeO#iEl=rUgX}TK?Wrtdk0}NWqE$Z;RoEcjSKX(Nx^+Bt0mOQ}EL;N$=TrQG-0O4M?k3%r9)q`nsFx9!2{ySkchZyp$G(DmE-5b! zjE*{!QC$J4HaZR?t3tFWw8V>guXX_Wc2l&kfwoKP_AD{@B=e1rC|r^TtYwC{L@4;d zS^xXe3J1kw6stXS3B)WmWGNC@0~xu_3vy9+FP}G_?&Xd9F%WVHqP{Wfmi_Opdc;>N zGN6TxNyy*LZwiu)J{;-$j48hRUtpW+ZJ|L@o-BnEJ}~2ioDKwJdy%=AS8GU@@LvPBBsn5Zebd2j&G8Koe>jK?E#f9S3V7*IZFt1 zoBfpV4;hd!dvvcKqo(VBuhG6-%pn*y1L))_xt60mR`jct0u{e^4yQUq*TpQhjkZdw7ZxF~K;pXN< zRY|7g%971b9f~0xqU_j1B*pzh^Vt>m|7FAhde>uK%ef_LFrq0by{`-!!83|ricYCP z#|Uh32ePUx^dO{>LOYDt_}Pe&|3-6BxC4mEmQj8l(#KK)>zxUJZrHjGPwU=N6B(@4 z2D}x_hbN#TMlpFI_*a}jW>PhO?^{`lpx5k8_@^6#9UwoCTjZz}F_GVf@@doAJ7oEP zVN~Q$SflPwB{dFL34GQt{r6-8_dgx6a}QV(@}CX48AQ(g0=Frw@j7EMs8?MxqnUBN*9!(jb+i>(o*;W$5O5K9K<3L1}Ppkmuw zsKfKP*!%1S4byCZTZV>@w$q`7;nEMM8l1RRA_y|Gn|N_>+p6q(J~6P;d(-X7aev zB+w9!=K>(Bkj>Xin87zCXh+VC#Z*7Jy}8yw7gJLt(zOo`RS5UV_&P9k4+(bJ$F?9?5@pottY}8~+er!|9mMo5TA(D937kzny2F#G} zx4u~<2mx^d^?GND!YPn$$s$=}>p3Xt<4*+N;Gak^8d8~>WT|OHh4oF+%^@SDZH+ko zj_2cW{>SGM%;ymGvKL#3-)71X#8iWfj=D?iK}5Gq#NC6mdXD`wJ}+_3us4Y{VTiA z|CuN-p8?#?;XX}1PZV zOK_B?TSm1imvV^3?7Q~ffB)3-&rj(iRN27QhFEmsU-;i2{h`5sPe`!${BH^XcIwdn zMHBvdA$Y(48V5Ky8vj2Q0K5W3AN>2_z~6e?!88+ZY@*UxmD=d04gptJMOrrF>6@U6i;nm*i6Rn#?|ln@P4csDw1`{=S79E{wEiL=vzpg-;O)- zjcQa@w%$z+>L0@UBbc^e$C8(oimMW!e!cVg9MS3PcleRyeR@y-`3Q)J;K&6?ym;9l zUTMn3oP7c>!y_OAf=ft|pEV9(4qzs(=qf*>kM*1D#cB;0p#phhijP-

Jh(s6yIL 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

tLoLhgnO)LvhB`)Oi`%SD|*juL$C0d za*m-Rm$n%9(hZWx7xv9w|L^<7{t#^QgInz8N5`)AE^Iz zpOW>8P{v5OnN%nLss@rsO5S^*5oOk|}+gZf|u6CreZI`wrTqvQG@ zam&RzDWt{!dfVV?*WUl0Vdp0d0IWX&&p9qF&5BP+O6op*K^ag)(r9uk%gdorQER_s zD0$rQjYs-W6OB0^*8uE?`wrT(}qdut6l zN+Kuvb`$HkK%J>Yvm&5B2R>Q$8^AVrZm~*NR@j#96p5lFtf&s<1lsk!Zv1j!51fOi zs5ErTj(HO0BUm`)kqn)yk}OF^roVl$4ez0LsND4ZLzsw|*-2PE;Zx`9G4VxDO5pI3 zi=;2~vP~~6hfEy=S{a&#%g4dsIo*fHC=6+jJ4d1zR!gA%cNZjoL2XH~_5*l9g zQ?cePu0a90RxGWOrHuK}%%F+|Dx6tbmwj=#*h{6B!SqkhPgiU3(}M%Ks*a=AW$pROL;_>i4^Vdr6Bdd)H|8D(~R<*cA9M zE`NTuHx6c{r;{p+oZx-<@L^)7XlhS7dwf~aRF`x15w+s1$t*Pv` z(8Y}IJo}GFWvxLgb=$pOR!E!ZtpN-Eofl=z4DMU}lk3cDGlLHjA_P7;AB;I1qHLnK zJS#dAC*$*#s}1pOOHBrj9`eEU*#aqKs&?q6gZb;X3M<@2$bJhKuT~MCZT=(XKORZG znv!Y**`84%4vR>ZmX>NI+KF4gokj7hg7OGz*N#BgaH8B5ATHkTN4yS;;($YXxGsJS zs2jKIcsj*pu;X)e*mD<~34DZA34kQz?#&~CP)<*GcQC+L1pJBe0AB(BJ_m4d6ZXsm zTW!LK8gyL$XZ<*r)$eWf5WilC-h5N6F{TpJbW91#81d65GRSG>bg8Oa#-)js?UDVf+C$Ti=lnYyLI4 zz#X;w%T-`9j;I22Tc?~xyE<=48o}d(l|sNUNN>ot*dQPIY+U7mk6~8Lx6`(!rwATJ z=^P^MpY*`J8qvZcQ4q6-ha;Ttz+XU4lfT~`rRheFz$L=%7n+EPtUHVz^2#*)@xIz` zzSWkyz4k+HK3|kc5_aR0CXpe5`vZ^lChDiY=7}h0k-4P2`>x?wU%vJL15k(wRap#4 zYmZpYO!yT{#u|)ShdCF9a`{c*Pc72y#?mxwbj+p&-EWKstpr@ z0&@oj>~t3Uo`?uhsf1 z2H$#PZoHL9fK^3V@82YYZ(g{sKEu~1$6!sYKh2hg&aL4Py>EnqE~|7{lC(yERSppM z6~w5%m&eG4TjPZjn{LP*ot>T_#Af>{O_TABZO`fUBvt^H*ws%vqZP2|!2uJhLkUB} z!m>EsnV#smBjme6u?<;6*rKyUyiwTQb~ODiH|ebranv$Xb@tgqvZ@a(Tm7y9$^Q6` z(Vr?e%E`%z{rtIusjR7E;pUW&@!gN0*4EaO2EeXRjWj|i8Q5E*+A-#F+Y+Pg2;@g;-f0*e$I=d#;bRP zJ73)h{d{u(r*Moo9c<6S3-3V!bZzJk3e7p^;b&qs7w7u35Lr$V#_VoZv-?)sW{K7Y zRD@v%&C8zT99~K);D?`XhoStooq9 z4B}doYM5$VQ4TLZ0@S)82?dXGKA1sECw%1lZB4Plorg`DFEs}IB%MCqUlCx7;(J$3 zP_6hu`}jH1*v&e5dG?loDZ`U2vd~9>-dV3{MbW>N^ZtK z$Jck6n4(KmE4!D_6ikyFA^g`GAe9nyAp~ z4NwlK5{sdatia)I5{8>tqJyh?0@fDV6X;QvHd@r<@$`=*p3tVe9UX-CNsvYJXSnme zc{=h{YQ`L|oqf9UVd2J`4jbo~cT?|z-F&7$(?*)>07tJ{#{(0iYQRK&+QxR!z{!FK zOok_1Yjiik8^~r7&}ix$Wi0CL%osyxE5mIz1OIMKcKf0ESJ( z;?EG2SV#ZfSE`rn^av|wB0&F{8Dge81{)OvHtl*st5Qe8QkgeM$>lo#nutDo=a*jUMS4lOP1;gm_tA&4N| zb2vXRYINVn3yAH5z zy}dycYE{w6#H6)s-vanqZZpk!7cQt85gh=;!pL2K0dXn-Pq3eBOnmC26pC{2^Cgz!#gQ2f4vvGP;}Xy|&!r_O1Qv3sNxn<&^#`Pwm|Fa?VS$~l zmHY1W2tW6gpXtjbb@NoTv=0U!=mDvQF_2A2NlPOyZfx`fAm6()GOkcr4Gj%z^*1Wb zlf{PeI}9eyVaLaIZQ=Rh8VX6-IPYRl0XGAfE$2T!pMxMy2Vm4fqod6Sl2|V0L9F#v zmHANdZy%}#wF2=w-O80OV68*m`VH&omLcdXDGL-Y&hnP4FI71u={{e~E`;MpqYP#W zCEu~XAVL$LkkADj#Pb1z8%Yn3ddC-(zQ@>r=jj?6ic-y2ip$6ttan`5VH9Q|;jVG%siOvvm zk1o-vb6RXe2BX{a_?L|5TA~J#fD=uO*bTpd@5#GTp7LD7M}D#$Wi`v(?8+kB^Ou+y zG9T`V#U||I)c}A5iU1%BU$69`$?W4{^6Yhf{mLgi9ig04e==; z7tXrSVt@;zRwp2df62~dAekLHLw|+0o@doo}T`fO24FW(*Bv1CTUAT6c}(i=6e_YU+})*jJF5)T)PeHJtYDTXczHEe z=z#mI);hVlLBXrH`u*c=i;w3&m;4{y;7iq=|D_~+`TrIh{{M4I=bicyHuc_hmju(& z($vCqF*X%-vW!$FbXIV!KW=w5=;g(cDWqOJ7!8U|`#CdH@ztw`lVt|2XnGCHSf2pTdgetLscb{dJvPwvlu>iBT%KBvU1PR(9mB3 z&A&|w`0vio$Hxb(Qr~cG_M6F;kK8PZ)=~YL-R;O^up=tdsF#S)buCnI+FI%uj{P)EA?u2;2YJ z`p{lm=dr)EqyJP4EMn!W|1(4SJ;c-6I`XwuwwLsqJjYw;_s0Cjy*yBKcK;T+{-^e% zchGw(5zanOIg{W2uc~A@W{Ht4Vf3Dt9XPL8F0(7>W%?=T#Nhlj6n1hYGLLX@JdtJT zebnTwnx9JGAQ5U_NXlD@oN&;$Yk$4$EjIad7l`|B>76U+LbeR9TNs9`v+^c6Ra7+0 zu+$kBlJvs3vQ~F?{15%Ih&Ltl_e4L9SU2}a`+A@Ijb8f@a|ZF<2)s_Q})g9sfiDxre>m`INzq5JWN|xgX zPR=*Z#eFg|4}C5L8Xco;A-E3y=Z;O&BU#_uDz0~YkL9vj{KdRkVm4*#LZXE5{@cl* zn;~&8wY9ZtPb4H!rr-UTim8`KV*F)Y)?~cH_~|}@D1PrY#>Qv%?-)5Y>kV#YPJUO6 zqRR%t9N&=#{8FPw@~=H?pq498kC+(44FkWGHJK2HXEYzrSf3cFMbQRPV9?}1Es9Go z8I`a2GgK*EbH6#7G<@gJ$@{EVlvL3mURYQ-UhuYaiupg&=5FT10R_~XZn}HTCXBMk z4!iv_`@+LtiOY^|*aU{MPDqdxJ%yaaP+M1L-EMLTen#5eIQ&T-vWW&;4Ota$ zp%VXYLfuFvek_XJTt3_gw&K&$muFo4?wPVi=z7T^7%?{}a)dWM6YlC2J+s#y`8`Gp zP6Tu=IXW*3&K*e8uFhG@_Df~zWZp@L*6J>oXbTOmKbp>R3-5`LK1yuRsrcGS5eZY^#_Za+8jvZ>Zp3{|J+=Q!u99Bx{QFUg9z z=6g>$yYtfEI-*L0n-xV*Sl;);tXMrrVY16BmZyk;Y$5+$PfD3()i(B%vdx=5pOIgj zzIOAz1oXt#yIcz~m7e-fCX@DEVIs*%o8IVWCzA&8pN$)N|J6Cz5u6mU;j>{%oNiEo zty|iBl`4aAQAiDcj8xVqqxGBCdUo4S0_PDkiXjDCHhdbN)`iweWYE_y^l}0P_;u%g z9OqXKosr3b2KBT#`K}aI&CF=Ty5yCFc(*q{Q3kb0UuqTU z!$#Z7C$H|XCs0Mdp!qj`5&|}^`Lv%&*Lw}$q^ehMf9GlrAr~LA*>H=lhqqpQNkWfe&BZn$PmL*W}f*_8k*d{Y)jX$BD$>fo>`O?WQK3t>FZmS zaDgsvr~DSkMX3z>#PtLH7Y>5c@sZbf1g)^tRTor2(x#Q-yD!p3!ZiXi0rDHgzl-K?XM3vUyRkT$t%YDB`nQE<{@aH)$L_MPmzeji zT$f)O?p2j^u!I9I@s4ZR$o99}0qVtnN}P8Bib|ZyQ`~I3v#H9`{CAQhGP8Om_@7Td z^CzxG8nD1$w$`p&+AalKCiTA|eH&KHS1hKTZ(%_I$zBPTC4`<-D{@9@n<9N{4wc40QCBs|$D}xe$Sd z#!Kn4|E@2gvsD00&X&`NW|^n`I8E5~%A{b?MNKN7#kd}mu)??g{QDih6uPJ3}VhAxuMOlcp_`>Lq-<(=Y4^7*Q+K*y@+-d z*Am6?_s zFQ!J>=UpS_c4kd0D@Goxaduwxa^H3@^9j4|MwI;Re@_ht1gmbnIG`npV|JNjGcy3{ zD3!|@9O&n4cK=sRQc`F}l(9){WdUk?!dhB+XMch3e>z0=`A*&xEf;PGe50>aO>S(b zKl8Z|X-GA9rSCH4C@CCc=+!7i2bMj$45ee@=b0vTO=*Il_qXB)bDP`K)ox|m&`|+IDUI1{c*HBsUZ_5ahZ5r;Wuq$e8EgPeK86A7hrD{|->o-}J zJ|D5UnRk{K5wY0}$b$bC6{%C}SQ0&mx%L7F^}Ucm1yylcCrAR5Ol>?a=Gs8~?lKA> z2xaghCjN5M{uy!&2;#|SEd0;#8zTPp-~Rgr_{^ay{;x`$_Gg@4#CgVXWSpOHCYPC$ zK)QFjOEFTKFX}5U@_uOl3VVp9W@Z|IbrUrgHP>zaL>8|5KLOpU-N{M20ddQ@3}!}4 zjzjfRlk8(2-Z>X=v&!3J+D|MqJ(Is$Ng(pT!<0oeGc$8s>&FMVMD~5V09TuunGq|$ z{MY&s{@%|tvO=!EApKDLZrXep98>@rxI1`Sv7Oi8cP$7UEmQL?Qjn|ipTf6ns`BIR zqLi*t{}M3f6WRaV9Ed2DG8_`9C$}X00G`pQc~+30tS$LByCp-ybSd+{UN}HTpV;_$;ryHV>Uz$ zmwzdFL_tB}5gE$uHvcLv@_;>41NOioGBfu}vA#R1u1F`e;^sUpn=fY1Xg1P9>8RGY z8x7pY_AfW}ueTd#Jk#Jz4~TBygO)pQD4EpB7QPW@bc**q`K>`F;1qNx2RvFEr~>*w zAjgdAlzP2*AKk0kxVQghj%J$5=x)d?s#5W@dRx_*hh>XF6=hH4m6bO@n8^gB=;Y)l z55rqddpvIJ`}`=fk67k!b?w~|aMA_Nt(EKI8TX0$)PK6UmwaSyPGkf@mD~5X^Z3Gv z?Ji9QhzdaR6QC-2c-L@9NcyQ`ggXEMIt0W5cM@aZ3GTJt`cZiOc@FY>96+qeZ9^sZ zHNJ@|N2ZYkOkF_`^;lnN*~fn+07ml}o8lhoBcHrIle2?HC^D^@dKm($t4A6+*{c}9 z)x2@tyCb@%#*Nu{Pb&JvaPjrn_51*CgQ|X#FXFTU@Qp|hu_zQG2v{OthVNXhx!hFj z(4S`1x2=et!G8w6b97~}=cA)#3H-jn3ZLs+c)y|(c>BakY3N7rZOa{D@K}yf=-)!tL z4KRl?WlqMs+^>!;Blf3Av)%YD&rs+dUW`>EJ{l_@!stARM3HzNv46>}sN1;&JguXv zYc7b`-L)0EXN-Em9Zrqf$4oq*rYv)vD%YHTU_ANItq$yz+l*&lcz9T2W-6Kwj^2aL z%}UDo2=4*}#$B5ZP}!u|6;5lfXXoZNC(9^7_FFEHrr*DR zALvxYff(%^v2d%jJ5vL4q3Rv^s4iaDD&%i($}5^!#L-rqEI6YsI9Ezl!C$duc6F45 z@Y`o@*ZpCv&4BK8N#T6oSll~oCEutn9^+^F!Z>5|{>q3ugA@eHA z{h_cVA_UE!Hru0s&Rzt;j!@Dwy_j!W`Ll~|lfS_-_pIVYt-mMcl@2!C&f;dvXy-r6 zQ6CG)j^nYOC9(*gzm-U19e$FN6zvwz~Z+{pJg1SET=xOY3!Zm{;9BE-)nE zf8l4j@d7X2KwCV)Q==B%x}GN3*bULx&EV64a&SeHHSXd})`;S%f2MEBxr>Pj7r-rp z2HEHF6&FcNH32TO^^QQ)S0Gylgm1)rgbmg_HdC>8d0>UA^dLWtNXU(uUMa&6M6B+z zNpR_RG<1qJ$|wNg4$(^wo%PeHwRuiM)3tXBqFaFtjI&_4fj$9zak4c~g2RAv!fcFf zriuvQ1;J6Urmv_A1!;(6=6p`9Ei)hgGZPpZf#ffV zT*$55qzAL*`c%ineHv%AJ6mokJrf#zrS{cePJUub)rX{fkgRk)X<^EXIelGjC_bdP z8@uR``$2(_{~CL#3&*~*ERSpjhQqe{^YuZt+D8qR8T|qWlk_)T^%NK-wn+}vR?_s4 zin^DD4|0H|;|7lpf}S4*@U~!e_N6*Nmmw!xkCFW|eD)O(8-ww*xV=4)Y~UvcGI>A< zI}c2Qpx|K8Y6(D6fmMV|#H+f?`un4+{5R(=1Bq5Q(*qqGzrr=W(`J$^S*p$JAxYFvcyYdx&7mMu||!H>d9 zq5@tI#y(zIT8S87ZSkI1>_E9Rhxx@cCLik55ywpiXK0D*z@6Fc_|{z&hI)vxQTq_6 zq)RbnCu9hAkf0*)nQSQBQi8WE_z{I``m&fC^+bM6=rHs92oP(z*ExhiPyegGX`~k2 zh6yb`OrIl8)Yf-5M!=ZGqPQ&1Q&BzO;KKtkLeCfd4VuuDc_w;I?Ah_-sRdzj`_;$J z{yH|w3w}ay@9D`S62!6?74yiM)6oq(^wiSYS5a7aYjj*J6#o}API?R^^xoNIq#y5! zUV-$>&6ygeX0MZFW&caumX?;|o$0Zey>)ZOz!DJ8i6Y&&$xHaP6oi-dyJ6(=ylqpy zsbc*p(!g0(g?d;E*nOmAP#NuAUrH)=v;Xa+q9m)t$BDwDda=w;0BfZ5mN&oA<-=Nc zodSpV=a_sgMrHRZ5eqKJu2;!OnHqmsOn%8muu1vN*olX-P@9%b{_Ifm!pBQA5%Z5j zwMiza)9-$fT<&Dudr67(7IJ5cp|6OA{=pTiS!+wFstIq-aOQDaO~M=%T2!<|I?3Mb zT_tu}t`%y*_@PwU6%zVasS7FBah7so0f*lHfiqa_L1SI{3Hgp=Ug9E+ zw>RE5@a)?Iko_Ji77oi zdV-(%(@zQZ!aBW99n(|BO&&AZB%=yf1yCTfak_6mAI^uUROJ;}?p(YqCL0Z>Ku5a? z)~WEeZ%o|}DI3g0%bLc6$|-F7oDRD_CrzEIeYDbvWfW#Nx^l|yzW6;7W-qk&1l{ZY z!SZYgnP7Ib^-x+pN>291&;IAtTNMExM~)uqinM>+!+7lB_}p7*=Dz&qh5%kmpNnFh zF6WYo_rY==JTIg>Wt7iL0&C2B+KYjK42@DbMn=XkT_#)eXXZl@XqD55oCK07kSH14IlP#(y!0)2X?mLnen$yQk&%cx4(qKZyVoZt*2U|;JY zg!ib zw+ZxrK$w#cMvBYkX!n#aLTlm~#%&Z{%p%!n zkv|>&wB)c2YO6!>3T-p@(${9^y9#Kgz4 zb*d$c+RjnK>H+if;aW#;**)GkPAWmcG!S2N20^n*^v7ZV!OH*~1rpJ|0lf)ykJOFF zN%&=lVyl22WXN2@hAJ#9tcyaolW0U_r;qD7Y^0tdo*&5rQ-AodiwlHao#_tw<-H&% z3_&p|P``lMX5z&svBUii5bmc`8pi!HI_&24WxfX3nYxX!_3Z-!MCr1|#>_hU*2a6& zoz)Lca|8Blq2)dr%wb{lq0yoe#yhOcomh&O?pgSy>i7tDpK^vRTAy5_9n_?>d&$Cq z^9Q-bHUjCs>(0XUIdu%@G{L#(Ph?!}J5$ymp^6HtQZC%|I40AH&Y!O!ZSmC_?&o#@ zp=r&-W*4~KfxudUuqH9n#7R$)HQte!h~yA+XIP3% zvGlx^=A88THQb!6xzGw4B2aJs#CDJk9#x=OK?T+~kdIGshh^O7JwpKhuY~||_HtaBFN>KGE^gc{VXb)HjU|x zZwlA!5!5X|B73b{c{%;XPFXNayj}hzX^CU{%9!@Z%SM02~Ctd+6`q$8y%G z)o>y6>>x2QKkJF(>J@DUi_EtHr-=or=9pp{x>V5bBwSWP&NqW>c?aWHDdz?eZ+Eo? znV(x~p~)~r1-MLCnlbCt4o>MZ3ZCrC4OZIkejJH^oBzyQAl=4ktUiU>18XZXe~3S> zl8Te_Gtg2T%vhIUYp4c8fGUKSrjvBMT`UQXb0;X$7mD{e= z6$|0xH@}iAR+z)|xan;zGKXHmmO6)8Wja8FRHWkb0sj$}mo=t|wB}RSp^ZQDzPwz_ z$~G?5itpa*eJax%kn%Th8m^>jG3hZ98R$@|iZ$9^0tVv&mS`hF?N1Mtz4h z!&Cf|8kOJ^oE2siU-ds^Y>M~`bix|bvs%OVsx#}8rq?$FX?>`ZdS_Jc*t6pVc{VR}2lT)$mN8){BZFnP=eE^qT6_^k^j%EB0Nn;le z6pc;?ixMWzsa31rS9~_M`X(jvdP3MN7WF1^QbY$QOMXmYvXL{fVy`%fu|@x|uuVHW zzvf-CK-(D0*c=^Cg&!id9;klXJY4#dVd-fPq(|8=RF_`lV#m&_kzXFU3@Y=gitjDL zL$id*J;LvCB-K{gXuE~y&967cRLQ?L7)jP%Pq%&WqmarK_50Sv`dde@q+n#;T{i@W za;J6bXLs*V*V`KCPWf~X=2#1yzt;7(;nJpVv%f=FEHg<+3;c=;(4%y8cRv6>5tHS2 zY56fQ5ctuw;HO^}7Y*+YEH5vggV43C(y$3fHz~nTmPnpAkM|j!#_`s~L;rMIG#21L zDhvDiJr^n7=1a5Ro#(z)$cr}?{hgF#$T5eLX3W=YSGRPpe#ys0oc^WjS2h-%wEb5- zsS~Bu^=VQrrbJ`VXfvtoT5j8|h@Phd-%_L(g)%r;6x{h{1_^zP&FVMLB>g1pb^Mw0 zO;xZL^48n7R-bq7rxnpi%i!?ZGMmU8f3+RUJNJ6Rp)r$G%B4d+^#AepmSIt?ZP+jd zqJW@;q@YMhqjZa)v?$$3_Ygz3C|#1014y?pbV^GO-QC@t?>+8k@5lWf&vzW}uW$a$ z0E@NOth=uJy3T0bYO32qx3h?Qhq5r!;$=jz($P0v@Ep8#6t^_ zk%I8~XveeJn`VMeFh4EQrr{Lyl$(1eLZyqnp0@54A&2J-?kPO1y)P5;7CCxLJzom0 zii|QogT0oA$!#p(<7}CC9jHy$FekZpZ>92(|RypaR3mWjpurJ?%Klp`_4j zVJWGiL_6ibS7=C3LETmCn}A1!M!giZS7)ZW_C(NFq24TqGN&;8P3<<(Ivib%lwxAR zO-Xjhdvv$iHun~*sSLkEXaUnV>{&yN@B_B#rqA@WF7W<=mse6e`An-#apaP;w^ISo zMjt>JTb5*H6CX{jpH8sJkeO*Ue*5Hln&~c6tFDhljd1Jei-z%y-;f&_*^-X+PIxkV za1ZC5h5k;_yTBqd?4~bQP4EnvuRrvCHJVq4UL-iw>{39_vEG)bb#Zc*l2uRP{6X2$w8ZL^qqZ4yk{ zks~9@RUCi~))M@<15n7m6cjLnx!@zfRpqLc1q0~=>p78C*YE~e=EWt=z^uEurmtg% zAf3ksZNx5UJ>wByi>y*Ayb(M#5DU+9Lg74}Orv=0!G!84sMM5T(3WP`T|zEc1-%kZ zEzLd44C#Qmfv76hkL9!~l3GN;v=l)Gi|BHl%JE6VgZv>VERKTxmCn5kAD_%G=j-X8 zkcFWfb1*_=QL7IJTk~!+3$0d-F3W`qXrrmT{E0`LPL6Ka_Z219k)6t@-c4ej{w~-} z&j2XUPk_@bn|6x>Sf`y1<~mS>wg52y29UQpoxZ*@oXCB@eVhMvI1l8)wjTRpF=adY zXi#%M$ihn)FG?zVA}Yoh*{ zrhVl}eX-Zkr5CI8hblMMZac%_M1vY_dABt_)yEX>ZBXffi*tYLPMdUB<9lx5Cl0gR zJ2}FSpHK@Vye(m@I}badZr@{_6|VE?+k}1I~gvkd?26K)Eay8a)$P8u4#T&aZf!ol@ikF zlxezsl!p7D>_oa2Q@u%aXpv-{#jHp=8r?zWN-3ZAjSSOPds1V;?&SncC*z^ox{I%1*CFEmYb~U5-4{IF|2u*Stq7y^b4p3{u)Gdg#Lm-(HKkm=B&Toqv(8@5|_FlPYdF%2?V$+@id zLMbmRBM2`HT_V8cs(Eb1==*+!H2j^yT8AZcb@3E`R%BeNV4crlhcUXvR*?1ck~NCu zmY#~?;qBhuDiz-D+EO?Re${b0NxI3%&g3f_F8c0U-Jgjx!;%O_1X+D6(!=$R@|AJA z*1v9P@^-)fqcEmP`eG5%LH8_Ia2l<9=J`D?!|J&l6;;r>`;)3#kAi_aWg=7$vfp@ z9-cUI(!ouqU^$nNB&xi7+?u7()m%>UGoh|jBIR?JV3_92Q=QIrtD)7=nC7kJjWhF% z>8=o~s?Y)YJ>t}KIz@u?t{*XD!_}o0Latuq{V{$exLxC$y0PcNx$DMfbizKf>0kQ? zjxj!Lach;YuvBMEx@q~^v&;9Ku^3)_eo(=@41jijy%y3K zlayP1?nD-VsCFk_Ul;;>T?+uhk5<~|Ol|_!8w!x12>~coK$ZRA-@j2gZyd8~yQp}+ zYV^X(eb%vaVYR=HPh+_)Ew`9qP5JKemQXPY7x_DfVtpqK8E@C60+RylNClnNB<$oVC1Yq`B} zUGJElP6P?97yvRO2SQjaA>=Xu^SIeE;hUj0w3Jd;s<*wKaO33SoNLM4Z`KRTeeRr- zhxOV^baguW>piQ>u`wAHQ!G(N9?Y^to#CP>1D{!bu=k5@l#E-oH!o8g?)RyC*BL`S zoY}Y&fBE|9vivKptJVYU?y7`SQ<*sP&HR2J?jct@gYKPfyJ3T4(&#dHm0JgKzV|Yq zLH+fDkTEkeYr384UmX^>&n_0A)Ofy(=nu?A4ttT~IcHf{V<|+#TZWbCgSt`hqf_!#T zI_BM%b>}kgzHg5N#j_}lYw#C(&ImyFU9^Ta`Mo(%nqHL2u+TG*+)$TZYHBGAyvr&g zwRMYd>fV#!U*gcwyECJ4H_D7wB_%bK7uth{XywC?Wu6&T(|RxkmoBj@^eY7$Zusw~ z5gaVVQ<8x8HWr$vy;6B3H2%>$PU|Y~**Feq6dY@LFx5ygFhMwV@{YkdXHiwE<62vg z8GpE;vEjX@7xpt;6nO+z-uU%Go$PgfRrj~dVK*HG=^t&BYC#8%YMr|%WFq4em%8Hi zfw)^j2F$5_v>>G1tuQ^YAB<-c1&EoFtBo&5?fQJtpr0)7Q>)RGsp)iEcg)4`IoK zy`ZEDS+yHx9W7dV&P#}IHhN8q)f7#yUYHwXQahc@EYn)u2IUxMRCgH~fY{esGiQUe zAeeEV0IeaUm>kG7;}Q}Yk=ix7&@gESo}$q}79Wf`I?l|_ep0F;7@Zf4)ON&wTY*-n z=V+mRLzZJ#hnJa;PioxJfjw#RYoy3>EWCtb5-oaYo3Gdqd-YYoi^dA7Q=`c#OirrG z)Gye{pF}m*oE&#-{*w(N0=s8& zHD<$FgZ2@7UM*&d(_B(pLM{AJ@veINPlKi76eW7i2|c<`cAGWv+(Wcq!$*0t3RYEJ ztOyB-3r@VcJD)Lk#~y^%-hmtWk&S0l_4H z-^Ww)-I~Uz?T*0#M2D$Q3Jn2~n%sG|k5*2EM(~OEmek@8l;V3^nsffbD91@uX3@QI z)Jqb5HhilbwzmYk$$tjL>xZ7)DLk4Hh{81e9MXlcst&(bV~AO%c0OP~cjx@r4^9JX z<}37fUHYMI!pWB>$zM4q2T!$1eWTHm%O8z!9-Us|K1f#ErXH|CmFLKKs=XF$`=+;OUdtdV#RoO5>C@8FWmDeX*M%0Qrl%9fL9)Q&P8gROLFr|iF?w?A z73Wg3w>IOu2(_(F&(h*p8=RG{y{6L>60|=?Z}_p`Fi9LGIRKtiZz7aBtN4SYn}74Q zq|%!3Qy&2e#~f%Ra65N?I!!z9IvqR*zj_H_qOh;Yp`@V-m7if8g=GC2U%rj86sw48 zOU8G>@g+rnwSrD^`JYNUg)C3Dyv<7vaUz97>T1O_MIk4d_o%BHZ}3ygR4JeF-NAvF zmCiQ~xKazI*eu!W!WU-kl)iEtSB4DgjuXcPG%E{b1Js5Jx>)nO{3kt;9B|Gb94lCA zKlYeX{{VwZj1Qx^>kouowivWEZeocEo|#I*%+5RtE0hCo7-s>{I1mC++B&+t3+npQ zdGUj7SF;suzU$YRFp!RA zH_aMpf;&IX?aO@9)!DhQHaHGH(`oj{x3cbIHvhZy1>QqFGd<-~@wmCUXXoauC3Cnt zBI$hs0s~OF#Jmp^`Dc4I(z^B zcF1pZXW{PK1THI2P~Uq%PA=o(!iNH|73rXCQEV|y1~z*@475!8Zv@YuP>Np~3!vC7 zpC#LTRxW?D4*)p;BOAnqw}D`ggOd~B+1!66C535aWd%?m4+#myuCFewKr(*o^+MFY zKq^4ykp9qv4PeS?<)_e zR{HL7FpwpO)JNjG*l9f293RfN06TH11fIeCJooD>HpoOYcrG{q?J@kV49;g5ul2p)-Dnv*9F=#6JPwx&9h)L9-TEkBlg}_w`{l^{vYBy9B5&sK z!9I1!;J*IAk>}B~f8DIUg5S+PE%(bv@T3qUW|5(x+GaQRV^cXFeFb5{iW6+>`pfF< z(E~Cyj<4H{gK3y0cOtCY7*zcj}wE2sagtd}n~**>G6ko$=ye(v!7$p$hf!92I> zn;bZX1=cI-r@1r^buGskGCLp8=H1@?*!SXzO88eRh!H7#_ZVnv^8?g5;VFN>UyoBWY4u@iLwS;B zX1Rq#9w6%SM=Ixmy`&YO!By1)sYkg2P5!FVi^W`_N`@W0f;wH0u=rNb-9Iseu4#eA zC}Z^`{h@&4Bipe%`L%qHoZ2DnnrZ@Whe6WZJe_mrLLH8sEUtfI_rUC+0T{Y9)zw@; z;T3FcU)bGX0o-j(KuiJ*D>HLm+cmrwFJ3g?6@%KuR{3T;o6<`z$z-MBE14=)rh64) z`4TaQfHA-yyPw^@2W7-hYo0%CFu-}2$by>YeJJzyChd2Sk-7oIO^F{o@CXmby}sOb z57JNsC9%ROM0dBr)x{|&DttmhQ-bJYX-=N!J}f|Eei{rO-WHhgU@s*_l4bZk;x!kH;li76~QMAGMqr3 zxPMklYF3(z1bz!azyZ(QjY~I%bd`M=mu}?g;@2MLe4Z@;dzDe476UR<-Nn_1m1FX$ zkA7OK@4uLPWM2|9Mi6CAq%-mQKU?eK>jaRj_63^OE-o$(mxsf&O8FwAxnh1`;hu7M&-~|Lu>XPtn1dbp`aBL=DoRXD z3{q{Xp!N(M=q^`RS0km^4crkL>xM+h=$ZaHjyryQaqn`pej5loBAxAF)_!pP`(a?1Go$2*QK7hG)71}(Gy zdNxF0%1ulDPO`PNRepZP3RSlN?1W_2pE0P#hdUodQuSwu9u*({Z0!5Enh5utNe6ff zhaNT~RGQ9|aC@1Qkc!EatrV$oi%~=n{q~xFP7Zy(f(DAE^$S5e>8B=BYEmakcb`6e zdSTjkZWh96fmavjXmJ_v6^O%Jv41+Y&luV4XQTEkd;Qvho`Otl{?{^VjNat%@(AAO zf0us{$8jLhe~p8BVPRohxHX=I;SI@MmQKU$SnXO4C*s}~T)*;16U0W(D8h#{Q7MR~ z?U}45zd?6^XfxC57t~2vE*U8+&{)`haFE{By@KJnz~VX&R>K{;Gx)q2|Lm&}4CM3E?iT|Q z_uCu~0>7;quX)qYmYl(~uePmljn#%9PbbaVpn-hHzA-d0$)`bVeJ?!%15#5#aMB;M%rlbD)zV43C>Gj-l+f$^pq^EWdS%qm{7&p`@I}P+{h8T(-)zfUEE%^k`YgxFq zJRG;~2@w3TXhd96#V?A{pIcL2OxEr@q`-aIEY)&pinFb@y!Lld5V_7()FAPk#GI7~ zt@@7*L|i(Ic0|UNi`|aznnvyLI`cN!C=gB7mR&3p95ugu0cuiMqH7gl_|jdDI1gNN zu*aRXJXzXs6DtsQW?>M#E?g5J$Z`$;%GZg>Ezsx# zEZnrwSFCgN&!$vJX>%=+J$weG}QT6+ejPHy;>9FQ)+9jp9gI#9l4mq+J_K)Gh|38g%o zanz;~TR*XhUD!QLB(D&=!&I)=Rr2YN)ekxP?J(!NYtMahEb&*m_DzWnb!J4(H zznbOW(QI4IsZBcnT5!JDl;ka+q56knj!(?@)1Qi}oN3-}%eS=r@O-{S`s30OCb0mn zRMKWq+CM!5d?@q#D?0qJp!qd6RsuPHcm4TyYXTq(dlTsF6bdN*JL>&k-U$B>bjA5} z)Ks~2DQ#r^1L;!m-&g4PQu^&wpjSTK7|~`P(UdFsz^jUHqU8kX>(Oe+PMIBpz6!f;p-6- zGlD<=DYVM}?@+n9wRIl|>h@IHngad1TR#ES8IZThk)n7YJmi4LitrLDSUlHKB|p|1 zT~)CuBGI)0)xZQUmebqhwk$_PNNkXu;6v3FfkjBz-w(EV?hk{-tdz@#nIe_pz+ z73gMBc|lyc zZ>|It&~h2#lKt;P0-sV}r4fJCtguG)K)MnD>3fhmZv^nbjWd5kv=q+}7X5F@=*8U+ z1e}twP(X|)n*%F2HHe|MM@w0=ojW8vc{%b;^@gNxhrJnDH&b$rZ9MbleeK*$w=w3a z`Ua1D26@dtrx*&^rN}kBsx*l6-ICXF`NMaTza;FY1?Utq3@_R$4%W_y(e}sR+0sWYL0K?J`p=Fi>;K!R zLavZ7V}vo%;{b%$^PpYTYh8#yrV`W*K{@qS-Q^Jp5I&p%kIHTyl>UW)l!5MWRL17h z0oB1_Qin&MCLO@`;iqz($ABTYYJgMMRrFBd;r__7%A-4&UM#4o_OX3;e-niNex9jj ztannWU^@2GwXQ&`mBszaMc{mcHC-mLo5Z5J9?(Na!IBT)21W16OeX;4JWnZAQ|&Hd zvEi3FcE6b^TqbmQ`qIX)B%2+w8|M-OulQr;17WZ>$Q~mh1uibthr1Qf<=oA*`hBl1 z$}b>GY`2tUwSFo~PpIjd4E7NWI_KZzJp_BRhK}cu<7@;+ZZmA#*p` z@>x2r>T@1!;1B>&1@)dfOQ3E6!bpd+)ePgQYHsJFjaeYt-C43^1Y{wixuNMA;|V6~ zgj#nBeZN%55LTrI{*S%#fhI24c7=Gs+KqSIg0{;r3-itC?6Lmu4KeuH0E9w+cUbVg z<<{a+9Ix^3jmR$zz}@&)oBR)VoBxLy{Qu#QzX<20v#LwBeXK>l+Pyc-s+dAwHrLnR z5Jj_O+7?62m@~ZmpUlrR2716nme&Kj|CV%}e-@uo$;fny9gC|FqUhbJSkq-zMz)^`A<>mhn zwj@cv9=Xh8sM9OVG=9(+b!PbF&TtWxalH{>cwec?ibzFegUcrBnIRL)j^EpAfy^2W z_f_sr!M7W8Vu=}}BVCOnj^nAVu81n$_yZC zii>&+>RrFBAow@siIyL1&1qh|=p9kdRDl~1#aW}KYPsy98X{mNrnfTXGO!SQ`+*v2 zF&JWHm)72)%>Olgj&Kto|+Eo9?uUJns7X}+VeK6_Plbn_BVs4;|zRl6N} zTkzus8(j@Z3>{f|yTU|VsO5Kd=IRP;(rjzFQ&-DL7_bvajYrn39$^_vNzYus28*@s zY}XEkz#vCzk9=HTImMQ}t~F?!mnkxR#XsNU9Q?1uUT7aK4vr^CX@RK+INyvq)v*9= zDo&13)YRVIUZnh^-DN3KIIlllIxj?$_X*=Jaq468{0_tUL<5_GsA^6Ij{@pr!|mSN zPPJFu{M7E<`He?y+bQ==tOORZt4d$4HoUvq9n~KTBL3BToJjecHOgJ2iAZ#DkLH?Y zlskpl6pjDaVolXb;RYoN`}o293K|uLC^V-v2kuQz`cI4=s`ec4amb1_EL%oCu!TO` z*)i$}g1{1Udg-INtQcvM7M7n=P$&Y#_|VUO>$)FmDoS%6cu8JmXeqbU_C)$CrB2Og z8kfwHoD>MMm277%;G8VBr%ZkM`e80q33-Bv>2`1BM z+8OyH*cD+-{`TK`ESqi;*AjP+X)!+b%e~%VB_q=wD;@L^w3>30#LmdX`=TO0aA$@SY{&~e+|9Tn=w7* zhhV$A4-O2o6s+HZ4zAs-w0IfGv8`V2;T_Hi*NHhjySln(@fbeJbV_I;t*JM*JT0i( zAX66ySmreU3>(=}q;m^^ffL6`wo0QjO49M|gCL)hr)>lz-SnkF zYdWr`ecP)URScQJ1mOe0$L(H++Ow_O&LK_V5!POzlb3{pDX1vqxzmX1`yU2u@|wWt z4vVo(_~uk*Aac9}q6h>_^Oj7 zry@o>nFppt!h$o-_pFRFL9u+6fr zxdcPZy`g)@m}J+iv{zRQ8|y+B%MWjFW;RuAAE%!_8mG0}45@(5-t@j)5qo86KV@X; zJTxNrIi(5IGh#OtE8$|e0N0?WMvHpq8_rcvcNm1MZhP_Qz7&H z4Ir%q0I0|ujoq?%fn+^ofxCtX2#EgzmDU?8V&AR_@Jv4Mszyvo9Kz9mS#$}R{f zT#e;VW>Q{H({9q*f$0%4=I;L$b$V_=IoKqU-dbQ0J;mu{*PUPO=FU|mc}(3d4Oyn5 z7e|muf35iA%94YY`ug&WnHtu&zSix_lCC%Fnc34D#_G2?zSyPK+Sc?*R14N|CZuroSZ-}|te3}@@*kRM zU4>T{8X?4qGX7KD*&>6%1;yJz)LXR!UERQx?nogmFQ+P2szV4r5~Yq6Xn6E6^d=tF6TpCD z1T>}$5U2y|F+@H>5tPC(uD+Q*tgeFy9`a3$TyBHvv@ME|4BK4F{SSQSN2+Jl6|tuz z?i4G2Z*$$}iKfuEULA`D5Cs!o#x}{kTKDOkrSVWxFhN=Fw@wc)NyOq@7SEYJ7EkA_ zXlb~1>3-&Z-RXv|8W5-}6L$qu>G+JhXeOlSbxE1g{zJt6-JGcFSskm|p&T>ko^;DP&* z{gcSmg1BRD9Rd=MgTUPH{QsE}W!LgGYb1d25s;OZ^}B9lw$9-OqCj8^)BcSa0Y-1o zWCid)0)~TBK$t%H!4`G)`{bLTK$3*yGG0~bJEmQ%+S009CHD7~0(E)N<iR7OamM z03r|MU_W)maZXpS+I_m5C)1yq(DNMHn4hWF=rk(w5$E^*(O_^k7H-k~6w-MIYfG(> z@L0NfM3>^+++L^DT^(Cl{hX`Zln(#cg8e|S{bwYsa|B;Z{`ji|c{r+JZH^axTMqnamb-Wf*6y@m|d*7|xN0?i%a->Qoi;Iz#YQ zd!qhGPH1jZfOg(qLE%OCb@)d7i?0dWH9vdB9~*170p`7 zRu?`&2?pyT81XGj>Iap08XrJoDgwbKB>(l}$E1=xU>8_yJ{|>*7!P9P5B4DOpDQr7+ftujX3)!=)3ovXX?+@2 zJxBfGwcUok`GkIV>t&Om!1evB1?dptA5eWR)A{_b!L01+`=@qWmkL?Zbdt}otm#f) zE*Eh1U&!D;!7Z=DLA?s^?edC+C}gQ*?PPIqh?vd#V0`lvEcLnx3g8cu?tTs%Mb9!5Y z5-w=Q;5x>UmQ`?xSACj2;=^s~JzH`327rWm*c?!40(C)tN*ScpbZZ8)FucFnS}=czfxUOtL{?mO z+Axr)I*Gt0XUw=PCLdW{YnI(VVxP$085&RA`?Z1~vYPI*mSO|9$LAAxsrqx*u%>K-Sz4kX0Cgg|dOv1R?NDqyCW5qzO;w0D=DaXnU`2NtPY zy%AhTk%CU8$_RJSO}~cI=DG8B&kRTPyIs7UI_U}>JLUUtU}?S0_3-h12ig9|nd`!m zACIqA;%|tHQ{I5FPeRA?mr|pZ!o&C9iLX1&VTdID@S`+uL{ti}p{jOr0V0)7xB0Q< z+88FB>jk3+S$G)X56ZAfG+Y(UCdBOI*t=(YQVeLrn2qNB0fEY2a|VDg8st4dK&*m7 z_^0)dB`Od|fg~Z)ZVa%xNd>M>bb&Dg5MT=(if4HEyXe;OS<)Tvn&kbr{`?p8F632M ztql_El$`~|uktlUXJl{W6lF@NCtK1E#jIg9Ny#Cy0#V!`(gW}sQy02O?7Q!R91 zg?qya_SRBuL@=L;KdMywsP^O3>ntg66er7SfjEo+!f2-Gb&d*8sRpz0giSp z?Hh;O@AE%FOf>{@SV{dpL+nEq0pPhSXVEc>Ydl*WNub7_)auE45)vcLIc)j1)WrLm z(nuwuM1;Ol_~ccrqhoK|Lbn!RX+p=>fUTmVcM1vtvnC}qb<2o)wuHKnD&G2W z^AF2@nWhUTKg~Rs=nHjTbvnG-x62xm_^F&;KxYA@U{cG$Zt}(Q`n(GPG*r$nD>a=! zAV|hh6iuBD>`+-T&`8S*tR2_nq1v<4svk~;84+pJ3{adyrSq*J^Gi$KK0ZE^BXeLhsMPo6{re`X zFOSAA&ejWBmR^HQWygpf!Po8>*4C}U4`2#Msw_ZUb3NoK$^Ua_nF1$Aw=v3Kb9;jg z^lxvNDB8BPrl2PVpTP?|x}oG-&2T5Gse4XMBUE7--@izJLM6bRB5UdvwWr>I{t3u) zI-7C8Y!E;Pl7ZM|1iex)&^rYtGT;Bl?S+yUlK9qwESH_DBXYwFTvvIYl&F0k0QRv* z$-f>8|CME<%~m*{Q+_}sw_rKYd&4E*LGVqNBli&Kku0%AF1OxBr5^>+Y;P2(`)$6l z@H>+JbobaK9k;wN#A}%0S{eEwQ&J);k0pGN{ z_kw2b*jpjSi}W!-+1p^LGX|tvVj6w0SwWU}eG?%2kUs)a2(Eci_$vItm5L51n+ty-^%mOahiB&~4nE7mc%oNhDQWIDm=|;3R_{X*y5E{-6`KNM);JkD zZWWM?@Y4}2P<8fJhECg@85GxC#JNyLiNDx);47YFHI3Pf%V z!EggmN^9VJTIhTXS>LQZ-+Bge=wJg79`CYzv3v+R-U3L4s#hsaP^Fm69AE770cr)` zbv3zy&a+YFKDI5Ge5ij@Q3j>fM;ikS3rvf~yMxegerm4zWD4pg3*Es1!tkjGlfm9=di~ zsCRX8a4hE(!JkRAx%IzVdqMixfbQ za8(Z2@u-b&-tS+ae*3^=6(i_5-}j(0atozplPczp3L4-tTojQ)s-M+Wp$0S>=HoXC z+FSywk6f|+gMv!p6ghzk94qPtL*&yBA3h-S)BuIkTkQzdwSU33s9oTnsu{?s^v$h4 z_%X>Qo#ec|OQ@WciMVVE=TbH-aO&h9NlMqeIgV1*rr_z#alYQ7AnDItrKN-UN8^$B zWabx{I8_-l(17WBf}!;v^4_ueT~1lMyeD(v%p-+{&k{vitRpc*B7antA(df3=m0qA z^vDhws%{M+J)q48)A)`R=wwRT@ooC^I;XaBJm~Rm(H@GUg)r1Xw=s;O)E+fpxYNu8@q#qE3|bI2`rH6v%k(yKU)J$gtwM5p8tTV{Dj^~l)i z`yQ5!pPon#i|27nfho6Cd&SD@g(Sw_^2d4SVkXBh?_GsG|BFju8BmM^dnPW|BhV`8jQDZ@BmS|b~`dFdMq z!L5E5(qQ3PVR1Wm-1>!KYsGJSL+yO0#~Za?t3wqo_s@wjC54}f9RT;h+PtQjK%XE4ulW#sA4tA);sE>Mx{A4hkmqtn!vo>OO1OT7OZL4@8kwIA<<4s! z)`b2Vq2tESxgw){`$+$6#KF$xA*x%H#IT{mcd72t@rW%q1>ebV=WLB|BaXM!bF&t; zSc1N1I%vCWX;oVHnMhxl6I@C%IF!u#aZEZ+O$Ycd(M=mlIP?PP@Rs4>Z=l%WcDhLL zTfBLqv0bN#(wZPEAmmU`boB`77EfWlj$h+YEK=0P3Y+*k)sbiFIJEgF5YcuSf13;L z$C6$&K`eI0%7?IgDQKw7LK{CN2OZkY<#loFCOD&**29r=>?#U2nuOdw7lH11%kq<_ ztJ*CHdQ4T2sU4BD#fAS`O<|h!boFKG6LN<0E&EZ7EMJdSU6*ICS6$D`l%#2}7EtVQ zJv@+5R%SpI9^Vmd02KDn{BmElh3i{;zZJ9Lj(fO_ol!u7<8%pGhym-xX& zcLed^cCXe{IK#Y#&;(0RP0L|`OU+UBWa`g*uuG9=p0^HH>w+cy-&@XPoDEwUit6XZ z-u%3n5W-UsQeEFq#wLt=GfsY7`!#W@$Ebei4zadlogIEf`Eh4QDw zE6LWyimfhw=YylR!ZStA#-7sht9XC|iMpaeK|wjdxSjf{U@U_`%ck~Xh@n6$VnV;k z@tIC6Kp`4#ru3_Xb6rS_B;jg53H@r_p!thqdz6<*)0*IQ z&#Z+mINx%@j}MJq(wk@PU+a0~-5Vw*l7($)Y})EvnDDn$kJeV`s&Zz7+oJ0^$VCytQ}J11AKyY8d9n()LMQy_aT>B)|Jl z&O*>Cof4)=>EA-tg|eL4(_=KKV)FNjg29B=r=C5ywO5>@FgB6vWOxVX!9Wm8BTi~) z%YOE2;n9iL3T+RYN*_JhH~;K;b6~~!$LDEiN*yQ*eFr1spqqDl1(-%IK?J$l%LIVK zgVUJ7H>%Rh!5C@${JkGC>#P3Mt9tOY1Z`tE^EB4G{Kj_`gS=OBK%GPVOhHL}`smHX z1Nwl;C55fB0{`;l1lcNSd~cjae3L%$iYd1yc3s;&{wjv)y)Qldt3dT1ShLsW06${s zc&^@w`zR=PSZ>NDDY<034{gX@b=ha{L{J93-@CkCy}a?NtU42rzcbGLvD*%h<#+`A!+`b*qYW4*~9C#{4R3P8502u z8KbD2)WUUuDA3(P;nQrQ(4gbvex{gePH#ZPGE2cCGoSg zC)<1!uTAUY;G_Z5fr4S+S>P+JPb2v*xPt2<8r!ywFD+s5tM8Scy&5`A=@*J|5N{J}qe6~~t8YC~ z=}kIHi777TR+Sl^;?i!F6O&-NVt#i3y+*)ra=x7CP#w)l3ooTUFXoz*i%Fx_THWH@ zRMt@4IQ69M+DDc96(7NI%yIu-(0ki@EX36hztt_A%1w=7+zqM<&2!)E3y*Bf46?&) z3y$3KV)FNIXkJPUYi86w%1})gp-WnGL_kL*5309)EKL+w6^BLaA{QbhLgn z1~~)LMebx~_xxDStPw#dd6`O(*m_!|ukP+4Ze4%6%UPtw`0 z`&wc8)gky_g@`SP($mo!VJU~s2c_BteUf!NofYT`!IwPrvFgw6pNUs!7`9FL9}C!W zqH@=I)G9?O)@J&L>)LkRA2!OJ>W||mMZtc|6Jd#mf>NASc7=`OK^f$$)LSd~+;*=n z&be}Vuj;_Z^IHBFi#Tz5DCdP{UCiP}PVRvAFxPNt#xtg2vBqbZBt$9aayooqu%X;) z>cQ|{nZ1tBoE7$ot{Ssj3WR8#yDtrKOdi#_4?ga1U2DK_IvdVYUK|a;o4t~B^y48k z(F`N}K9K8xPs1Zw1(A6Fp*oqG%Ulr8_ym+t;+N>vgqs``u(VNlX@>$j7nG?DpHgRwc*Z;ZwF z#3CzOmIh7rs_4ZSV+EPj6}%KxSS9t8BBB^VXYEZk% z-xTV~5KEk0N#btpY={%H>3ZIrq%tzaCnZ|h$Qp(%^Bw2DPlXt}XPG8Guo6yH-+pDi zQQ;)HU|D0x8bRw;D4RWR{OGNQEW3W`&fCXs|l*N+!m%2P+5=CYQGg zSVleXkjqV#DN8rn2zwlSL%2Zk;_`S6cB0}>XzWCYg5q&w$z3adXxpw@7Xs0 zm%==RD;Te{wO8aYc_XM&FS^L0qGiHMAQfEAkFKwFD$8-4R$5w`|G@cPPi@`BA~O#( zeLlnksDtKOxb4S*IplQT@HD}Gsy9+e(-`uWd2iWt3qk0xb9fUaX&q>XZMxL}h-86) z7BG)oa^u$%qq+JH#|Eb)7H}y)ug_ zU_(WU3dY|V30UpQzND@7I(t%y({M~?OdsuN5?>KJHl~ajy3071UA(n_qrn93(y+4D z9!j#<_j_VJX%pf(=((?o!>bwonyGgunIPK7;dC!>{$w&>dnJQJYxuBkDr;o0Dx&bz zV(c_Z!-C)C^GitWmlZCaFb7Znw ztBoEY-uszZ(PSHaxm(QVD(SHR`Ca6R3ue67hb6iutwYYF94ZeUtd|JorPGRlj z7x`HHHlOK~5WP98R%0hA7Do-RloiIOS?6aWjvB}d|E%bpudBaaWOnZb{)q+T7c*!Q z;^MskO_vKqrp`(bsFqVicJQL2_)mJam0RO$S*9c}*42UuGSDNhW`ww%1QhgzzHdPx zBx4$A*Ix@h&t8zfbK^?eA^#KOv0WbGzyBP+j^nL!M6K#6-d12 z15oLQy3;O;i1_$i-mP+BAiR(Sm;%M_*KP_53Ng(4{bY=f3DSGF8nY9Y0JlG3sM*VS z6$0gbBL1TCn6rEEI}Q4wRtTA0HQA#a(PQ%-jcN2KR>8rZ8SZu`?HolZJFN-EWaymj z;o>vOgdQ|P_+z_ za0mOSTSF#+Cyh!nYGr)-suVCVs?T_e$FqBB$8F{6weu2I&2q+*(yq71RjZ5wjdv$Svm;0b(>r4A1d&qA(Gu%X`wYMHP0k4@20P+Wi`Tk-iJKyp@}xu}$y z#hlyPyBnIAnDl|f-{kV7s*uy#04@L7N{VWsju$Xcv7NLXE;22?k3i0$)TY19GARf z<(&npo#98@(*?l%9jGs|SFYz*bqY`9m(QWIv#}Wgxn1PfBPJo~5>_3rc{AQZWAZKz zH>M4O$IH#bPt4Eo44%a$t2O5EA=Hl;#wZd zQm}|w-qZIUA{)F(Vg@-Qp*Rq6m_-X*UqD^= z+GsT0JU4YopY}W{Gms-a9M|s&D9jV78ioo$wcAE)6w+cA`1vK22!!Qiy>h}a%E``XigIxdr z4{_fa)#Mg!3n~^wImaU^h@c`$5m4zJQKX4T2|XYp(tDGR4HW5BdP!&rB+^MjQBjm$ zL!<;mCG;RQ5Zc?H=(%^id&hhC&l@kp4Bst-wEJxYdkH)G>VB+uIT)mg`Li!pSMo6KW!nm8D-4i(VKrx4gO~+bn zYlm5OTGVknRezZCsEj>dtY8tfP~elcZeeK&I;s}KV+bFUO`q#BbMj2u^5TAm_;Xc; zx6;It5YP9|4uJ(T(|3ys>KAo|E*MnH ztgZ}J8%_05>it3-oSlk;){-}QIZ(BbT`uTJlw-h0_NIP2xJFgfDa^9Ojp~k34AOt~ zwe0Vg&9)HitQ08!;OxA=OBGb*nHZoe$yO`VL`rK2W1cDF6lk%Bg7yKxI$#$U7b^e= z=p7B}_&?iMPJ_}B{6f>|_TKg5wUfN!$8UGF*jaMOclaXJ8cf7)^{|x4uOiQ1v%zg# zJMZIdmDP#U=)XT<_6n9#+G~8xu%|7{A+b!HI8YG5ws^DF%G0pP%t`Z5?_|vpRHE2S zX@<#4k^|;SB$o}d@9+IPJNixXgVj5e#+iZ+&bXxyn7Fq7>yd=hfj1);tuB`tajM=9 ziYzDRi`k@+{*K3TsH2(1De~wG13lmgJwFhDn<98rt)!oUPi!gFVjQYFb3kx& zLNmg|r*cVdZdsb*vAVvNTN&6;H8AHL$*pJ(+KsOIMu0os{vw;Td$-i8SI;IQ!B&c{ zsWAd(DSe=CUOU-bxaRAgNOsX%z~YL=#?Ed>Rj3Y_yB@y8;U5D{Zg4xg8h3k~UyFT7 zh=MU_@hI_Au*F$e!7>GB9`m;t9~%d)0+1CfzQRI=n994bvF47eQY8CDtK)%JG*@el zZ0^0rG+S>ZaP-(C7p-!=uC!umjhd5^E{>1$_g{T^KlgCLH$3K|#ntYq@Xsx}*7WPv z0~z0ktpaJp9}{R9aiW{EW<0NsfcxrD&t(n$*v<*Zd1L#<-U_QbnM+$=5-6|reM{$P zxDLVcvg5Jl_vopQf`w`;du_mP1(vm}<_Ua|#+=Q&y`g(Urp98U*Z>W99|Y*h@|ti# z9aMsJfsTm@@$pvFJ$^*r@&iQ|;C@qi^mnX5**oi5JKdntVo08unK>aNgG>YA*6uAN ztnOw?C@izYFuDJ8HeSZC763QjHhb{&)7hXVuHB z1?6);pP_@67wYQFDTsu-jb7)925qVZI}OcAcPw52$vP6GuLOU`L48i_d7p2m&}_!K z?~Z=D*1DR>dx6LnB7@O3;ZnO0h9BJMCEdxF;`g_qp*Zkvj6a{MP!^$IuzG!Qd07 zCKWwAWhM;`N9nc1LcFeka7_5DH&|GS)-Zvq?fuuYq7!lFa>B2Ouk2gBz+}R6_V-(4 zcy#C>^P=-XW?dz#x&T$a6HJj})n0c31IusiUoS1-_cI1dKHcAcaIS3V74qh*`@`3f zPkro+o~8zTl%maf&LRfjQP;}73GmftT4hG}e>_U~D~~Fud(*E%^s`oit{l^&yr|5N zf7d!|yg99G7)&30xas$-OWj3xNrInzo-Z2beB4(ZsYwJHqF=*_^8!~?K1GRBnQ<4T?Xj#>y~iP-_vp5xLV z{|^2Im;6FP;JlrN{KGN#B$A!I=B4dLn)Qm#kJr|E%<{IF!BMfznl}{&4}g}@8n&gw zrZF;xuLREbm7DZUm}iT(XkWgo5gQH5gBu_=0~(+9{SYKi1Qo_P+G!NG#aU_gt!8~p zO5$T1uhem`o~vK|aPb3Ls{75ntv4Q(VS%XH;2iUC^Q#vP@J=|iin~^Q7_gS3ox;}um46r2UVZg^n1MqMN2Gr^K(MWR(>V^8l$n4(0LL?rveee)KP#+u zpg3xqn8%ZtezhTznD?+<06v#W5}29xYj0i1JUtPI@GLo&u@PjFKJI;_mES2XoNZ7b zuekr+w0)kcKc?L1av73+Psg3ZI+O2icA9lFX}KS!Po~3J%_n{dlb8NkZA3Vl$_qLLG!B=sjGw z+@lG0z2r7B!v!dwAH(jyrzGRMh}^SxZ+km=6^hB0Iu%J^1m2C-?w)FsHlWuj^007? zlEr$9;j+ulstd)LVbbUSw88dG^%jt^z?b7YaiX=%x^);E#=`!MNHYGDNT-J!-)o?K z012g6Ak8WU)m9FlW6nW=|9;kou@b-Lu2S&gc(TRxE0Ovx;E`4Yz=-K@uSEJmsb6~| zL-y#|vnm$d$$NBrPG=tg#rYcGTDl;Y05N7hHeg)vPwcYQ1rTYkvF9i4ftfNh3yWtk zbuYtKikr6X5@hwTZ zKMb>goc$cg*-wKAdC7UFHIs=0z z`M-RP1k?8Nq9Sz=q55ReKKE3EWuhFs*2um5b}#Gahvie>qZRuhJj(%FXTTl2S*oF_ zxdI-VWDQ>1>qY-J&1FazC7WOOqc7W)nBjDTcQ!`F-M-xvGA_Hxb1UK}$5OW{H@~E$ zVerP#sOLvE!^y`7xF)@O4tt&yRNK8q7kj{oeGE#Z3`0S+YR7@x2H^AobB#$voygE4Ikb8pwQnVc(xcWc|UznZQLtP zGD9#OKJl8ss}5Sk_kd4>0W;4S3Yol!Fhe`gZQ2hsJ#M=ZSlElN0kPji;G?h{(TdeC zAkVdP-23lUL;As0LAKCJuMXaj6auxn=q)I*F@H41v^8s^*ozI`a@YcIPzMgrxL`Nc zlLzGx=Dy=>ScgIH=LU1~#i3T1@9O-#w-NILR$Kr)`E#3_Hc%Su>dFR=xxR@+d9Zkc z=)GC?pcKJxXNyLj1459P3rzd=*?#-*(%#nAmFCs)E7ElqXzs_$NNdh^c-JTCS6}ZX zqqRx~r|LU&!mEh_`q%}_)cO%=9rAuH8r~cQR~+gar7Kj<*f=c9pH3IFC<#UXr?1a} z%&Z1XHUgn>Hh1!;QHjm*m)K69o^d`5`Zt5fn>>+h=B_TeM^`;H$8>@lHn!uDmn-aF z;b{^ZM;5%}A=XM%a4yyV>NrYJ)}by8gu7O94;B50Eax1XdhH_UyXn2v4ezMFBP*fN zJbI>=uE3Wdspwd#UvZu zZ>7;|7PvhOK^WU$%>1B51o{)L*bm`63f?z1Rz6y|-=048YYy}7DZ$I( z`7Lux=Qz*jxlP=#^}qF&s6vAhJL;VZc_2iAi{=5(osl^X1mPORekf~IjRPUAZdkbZ z!r|kjpn!fZCBh9}t?U!&W-j6J*jZ)~kAnA}+W7s|aciJ?R_Gg*_CXB>?VTFcxBZpH zG4&Pqw(J)zI0NTN)9UllB!;iWbl@1e0xCymUS7)V0$w9|&>V!)XWvr{%csd2{5O=9 zmqCAR9FVRm6yxzS5MBVPAqMOGt3z42F|S{r!p?wbHy@ap`Br)vczx7SiI6Oa0Vzz8 zN3`w@cJd&Pi$iUv60BtClXlNqbri}#_ovT4d6C#cgPxACa<*8vf+z6r8Yc*?i&0$F zMnlV0sP@AqyJH?A@gZ;f?m0~S8@1;+bCN=i#Tk>L30-p5O~$v<9uTqui2lL)KmybO z{0y|Ps$EDxu#^k(v^F_T2KsYnCL{onV8H9i-kvkK+KJ|@dfpfGA2_2JWY*l=OrPJ` zb_rZTTX8A-@&+X8%BMeV&nV zC$dGI^=zw7EIvP1ID}A4rAjJT6_j7b&OCYv`<=?})h+42LojzBZ-}IHZn@SdhhdL; z?aL1nL_V;C$&ULlesvrGz1dS!QLrjJSlvv`Fy!D_TO)e-Bu4BDo*w6^v>KWPrC6*&n{y-mOZ z%StMFv4^ys>$H$CbY$B(w<-CuHd#qSbjCNC zs2fbdk~%GBvqyiUg&~-sypPpqbXT{)&TfxlopNmw#aFfInA29;Zs2*HlGo2ONC^V` zhgY2h_sM_`aiB7s0x(hh1rXr&+A>UXgG~w;dydn$X$@E&)hJs~?Mxq`)fa$W)D*&0 zdNt6pFv4@?y1W$!x^B9sXT_`lyhYLOb6J*Lyt{@J-Ss+ zs>dm;eckJmCMf2$!l)G7TN0ulN9o8wcXi!$8mTpARor}YCtb>tD;KCu)X;`l18@>3 z-?$+T^vz2#5)s|-yryeaVMN!qT6fRTethc?zGX%x%J3w+{YVr}4@(yan;}wp9(k=+ z+h?VG-!hAq-qZJ0MFeNDyV-vYkT56VC6CVS86q=(@qCp!8f@kkN{P8U`ieEgTrX1) zU3pidL+4J^k`Whj@3WMcWq|O&<0`CMPi%pEL^QS@_3hhz^&W_i;2=wwrm9?BkD8;) zAkd^EH^tYlmLUhgp&l^ltpwzF_wot~W|~gB^nqioh7iVN}Jv!G@K7{EfJ>}&$vS^^ckf@y;_N-Xtb((a2XH(Mu zP_1)Zx@Fq$Wu1zoi~rlYFuSRzXylIpijER1zoD}w;#<;$t$ISvz%>g^ifOu_rYKA| zP7qBj-_vIvH)ZUU>R{wxFQSug$%{g?V&ZP2nbAl}578X0S4Sy**b?7NuNUd42Mnj} z;*aLCp*dj35HH~}a+yHJ0N@g%2ZEhtUimnEa}exksHt`BWtGbY0S#afMf$+WX*f69 zU;!klLHhQc z%33EY-EU%HJI2)!%-&|A0^o@lpU_;=40tD%=LWljUS;-g>sxKXvkxS4--Rh5^Nrfh z+-esn$;wSn=d^CCRvX8e!2d29?;z$k3oP#|I55qI8^$qY$t~3V%F+t#RK1i9wdVU#;}QelC*m;n{y9h*=$$*8+Dlg$ zCMEqYob@^cGPrLaUnOQ{Vm3De#sO*~FAoQ;Sagkye5NBAwq6Tqop|-}Q|!g?GrvA^ z*Un|KDVjoaSb0#Kb9F6jaHk$o=R5!1&mHTa-958{EP94%T=DA>9|=6QdQQA!!Xc5r zEB@C0qOG;7N^X*bq~t-^VnE{iiFO~0f5dss+E-TMF0^j)y4$4a=pCm945WHwKCm$o z_=F<*j=^NU-cgIBeZ+wRN-22o)=H{EARa&_Hq=$U%0(-)tmvlCM$)9DhikK97cEM{ zr~7{hHZ7;12*_e|=TGC}(#tMdLAS%QT4g9LJ_=b55n6Ulot}~74jHsIpU$~QikbfF zv~9EbcfIp?49MP3_`=%61CG>=#1|D~7R)i2{=9G}4Udu5ZX3}6mw@2NkR|o#{YZv3 zM-9zleS;LZH(~vA`~r<{cQ$-Yw=FibIsCkqkFN`8@4bKmbqa`2d%=B}kx?O-b5p>?LCm5*e|p)o z=<~w5txiB?PdWT*x>lP0kImtV+r}D(xxS;_G13}`g!(V~xEmtQFzNO)lM0GIY78fQ zeT}%RsiEz8AX4^deqq}>&QT|z^w`i~L3z#F^#I>+7yt^6!BSw9?c3FAFY{wcjhH$n zgj?f!5JDPanV0ZSx{i)mxaCUlN>Rsf!Z$s1m0`2KjVQNT%a4OS$KhXnwO8dDFSVO{ zJV!~97g$OUEue(Ij2+5!O4H}e%Io{a}Jw73Tn31_gY0Y&XH_0-LA&B5I*pP93mnYuqRnzGYBU$W&&Oxdo1fyWBx*IpDCXbSBGK+t|!RN{(Eypz7Hg#LC9J(t-f3 zjK}ce#o=>VJf|GnyUmT~BGv%ppw!f9{vGxsmFGc}t}@!|&7d3H-W+Atc>kYo@RJn} z53*Rd8sN+He>lh7H+-Pp6r;1y;=URNkdVUlT6#98sjkn@?QgGs_z`ke0MgT~>DPHlMrYdei8brLWLcyh_eX~TbSdKScAvY~5>pO)-Y{j)n|x-Q+E zqDU2adgZ4Ny^#5$nJ`2AdcQkCtw;=uTtVsi*KvsJQUl62m1H4pz%ll(!-&3S^V|va zd-3Ne{KPQei}ml`&8AQu1}>$I_Q8F~d9$;Q12*U&qq>LI!NHQv(UbgKF4k4?`?u`8gemjn}ZnBJDh}NI72NEy2sfVqL)N?a#ATziXd((^`~>VwcM(S4#&o^8CCfZ$ZpohZ zSI(1JN4A@%TE?mn`S>0O-a@B%OQs?rt)!~=A0hRU|2&(0>m3&xqWzG}(zeM*zlOVDjta3`@@}Irh5T&@i z5KW!IpO?U@{Y@1J06LrQ4(8S``&5pf6wGa>zZp^11r3i=CNZf4yJk+4kin%Rjw zZQ))8i*wcoWLCf%fGOWB4d-DIREXq#ia4C0OPRl){#Uztk-l4=8}tr-p$e73R*YN2 zP_hS{zn!TG`S}+WDTO*gw<~H}T0Wg@rj8_>-d#{zkAt(A7`H%LJyZc2Hh7d1TEBN1GGS}2_za$*fx?P7oN&f|Q_;1jo{sCq+C%clJhp_}o zfcEA|NRR|>HqRBot4_lA3V%g68{W>_?Y%!$^H+jyQUwHJ@rbZn~7h5lvnk^gh&%Z6=ssQb|u;OFiUM0S!)EV?8B^7>q z)R;f`=Mo@7hxVcqX*PxfKRk^upPBlRCd zU({cJm>Y1pQ&+$_0kF*1Y1Voie_$T)xjOL92av#|sUC1M$GNyLAt6xn#XF#A z(DMKi{M`pi2E7KXllkT3%$S&%=${m~Ei?0vc$u68!U(t1`VQ2%bjAm-^RbHlhkkVU zcTl$&vbBo>mGxAa1n=p;*^@6n#a&G{hE(v+@DNJRgoSW%EF!tT;Ni}D!wyE8de3(S&iAv(H)&cCHDj>?~;DUU}hPZ zNrR2(i>PZ3&+oS!g7X4Zj291{WivHmS}8vWgOa3kA1H;XpF?0$8eJ2meb0q)&fDpKj+ zeay8gQK3fT@6J`T7sl~BAp)XV{XO?QekXVII3Vvg194Uv)S(eN`}~0I@(O5XoEFBY z)Nr*hFK;{oS1M|NF)IQa3MlZi1%+t%$=p}V?Jhxj1n;>XfZ>XR;w|8ws+|=?F9Mcp z7|GE9z3bPnLn;Sf0q$u?*P#CsnNVgV@JJmXFw1?Itdb%&!3xD|rqxsGb$Htdp4+vm zCL3Q^CMwJIUsvd1g*gxzv}gQ94=@s3t=*TU8(ZwKf=fnGp4zYDmXRD>X=CEm--oYi z`!+!`mV-wD!Dv^S9a#a$tq zR<7Y+;k?C$cZjW}It5USL$Sy3{{?fUhnbXQti~h+s0m(+Qj2?kZ6|lD=v`D|-pd|r zd{(y*yDG9P(J#=Y&>#|j!<2U_zkrzTQ|GIkm=DMLT(T%(V-NNgtNBEjF( zQ*0bokkRA)0BxsSgti(fmo1C-J6mJzUVigymKmF~Rvy*KV<*jvOOr#V6tOr>(7|>~ zJGNt@Q)BJ&!M&gXaRC&u6auIh(l1>2h3kUis}&Hkn4L6#l(T*;J24paF{OX!-YEp| z^2eqo`z97uuBVU3K~X1_1nhtprkAWi#6u+kaC>2TrWky&N4OP+14rgUD!_FW*PFFH z0V+RD7~R4^XbX@;+JmG}#)A?8%D@YNx?>vXeu#qDS_nD14Hb(B6K1b1=_}Oi=}8uw z*h#sesZF?acEx}&(ra^60&Z#L-ZW%_yQ;IHIiFzlcf3#GK)2k8CF-e7TepFSFNFP? zdd>jd2MS0)_`jYn% zLG3c|c`+prO#o>2v;14wxb(+%b|!C}2fPuP{yT0T*+2Pi9qwR%VxMO|x^d&VRHsF2 zF)eZrUs?L4qY6~=2@W3cU1Qqv)GWgdi0ss5-z|S%Z{vLHq!-QqWhTtP zARmH`WV~lzU$6t+OYxLc2hX`mu)XA-29eeF=7i!5G+fR#WBb*6fVw0bLIxKW7Vz8j zRmDce?e)&!Y0yNZ4oL6yo`;4`w@Z%p0ah@3pxh=c?3)}Zc~6gX@)xfy)_1kOO9`)E z7eYY{0JZfrG{UL1OLssC%pE9{NK8mT0x5-hT-I1&^;Z=^Prc?7a|uXt1F;2du*Px- z>=NF|MH#8SeZx*=a6!>L7*qZ|UDZnW)Pmu;zBYu6Zg;mCS5EARb+CNIxcf=}Rc-l2 ze3Y5j^C|Z9s0R+HjZ|Y3-yel7XI@oziF`=_4Bfz7*~yQBV(2!V`_+8rIkVTpgKTQc z=6$wU=U4D^`85vpCOQgIlm+k5f-8Z|2oSp3g5E{IGcrzL z{l`D@!0^C?;9a7yU9*+g|I@6N5@V}6d(C^4vO!1o=UPNYZ_eC4*^*{Jlp z|Ei=G76L3a?iG|XX&2IMFQ9js_;@+sppkjJ@ z3Sx`hMbIu?@InS44O|R+wnD#u;ipXG|n>VIw1c)Wei z$Rj?Fjg{)2-Ve}gCxTA3mleCG+55=B)P-mE7t{$A0ypqW`#VkOF@13Rpw(MW!nKwdK+%txhT*);$#Yj)#o=Fvs4pG-3d!Zb8SftmM1iT2E}76W-vS^~G_Z6Vq0j0t+ z7`r7Ide}$7aDhluJYXc zXJ}mgh}(UDF_OY{LFJ6-c#C$cM@h?Ne#v6xb{NjTSkhlT-!czHt64PbWbSYCem?+| zbvGcc;pWX}1SbGIrpo!2Z3F;j3`CPXKwdlMe1im4&j4;YiR?@Q&Qd@^_7K41&`Qr> zR=etYsM(P7W{)!qqby58)9}+Qj#d8sY63ULl<nBL-_QcNC?l?XhrPND#)@{i=9Y47&01$2o z3;C9Gx+AeTomZ!1KHgtRFG-4WHL5)MfxXw395<;V2>^OcY>Epg}6L)+DIH zV2QV)xt!`brJ@HC9;#bme~Yk|Eg=Dg$-9(GdD4wKicBBC|6re{^~C!(zBKmbu6MZV zW85&A*|AP$--p0~IOSCj1kwO69z`FKcY%)4ZTgIOAbt5x7=nw~5?%WFKKS!8w$vRX z)J}Ac<-ItH6NRwZ7u1y6Uhqe@3u`#LOI$$3;S_?B2<0w$JlO+bTI-|-Dz z-|yQQKpT#tea9sS&v&kH$!%d~>=U@HVhul`^2H|VI0Gdb zX-zazAR%RVb+@v{tca&ITt?WIEXwC zrvAX3b&D<@^t+A<{iV5)z{L|d=J;aD3~CHCPYAl{J+X=^yUZ`&eMXEb^*Z+&VW$40 zhNDAP$G1HbOXK_o;w{nY`ql<1OSoA9-CX_$mkk~-;aba(%eJqMMNYiLoUM3DGfXek zIuzyq2y?hQJ>f2!|HvDAP8XxnDlwIlk4EB2;W}8HGAy0?DD=y-N3fH#KlgP)s)P4w4=yv@v5zmd96w$c2Z zi7V@8g*x5#l>*}efNDMfMLJ-{s@_c<@>be_vJAlMXC6Hx^TRn!#tQ|y;Y=%F3k&bw zxbYO^8dT>S6EJ=K$#)01`~K0E%K;E57$}H#ef;<_{bwU9%-kH~HPg>8D?2p5WqzYP zeE6}MqjIgj@!aOHn1L@frt@!>DvB+(*gL4lr2GbxMmML=IQbD9j&cwv1iOH?&f6?G zHCcf427F)=QwjT?8v|vDn9FSJ8XHZR&v6mw5Z@BVXIWF?bMG$su3U%7VjOq2KAvn| zn#`P02E}ZBTjK8f-t&7XBfFYIaax0~H9^&zq?r}a;;rq|elxgA%eQKhS3RWKZ2?e& zx|aNkNlzH4pc^y_&pB=V8&e1w`6rLJnFp3SVb*MSsOK|<`HbuS{M9(QM2R%vg{O7( zIvngjgiB3>-oAO#myK{IfKW;wYyZu5$C&`)&+H<8&ZS-)`Pd6<9L zo1dfq@6gelWef<|ySg90xI4doLz%7H;K~4F@JQB=+OUlk&b&e;Sx%QP{~QcM+FQgX zeCeKOYr-8zgE3|{OOs&x)EX1*CmQG?v$*y>dIl1&K)5YPIdmfh#mlbKv5c?m44+`aKpYI zpZMtak~YeF%Zeqw;bQcyRgT-LMp}wnt2)}1A+=W%5JL7gOhqZaY}Q(p01?HXZ_{FsHT4&|xKn3#fFreNZ+5rW)y`y8FRkVCQghDoK&omqdP$1XQsC`o0+zIZtot^wdM6|a!%;vJ_5}=2#s6<$ zwm;Kt_RG~eP@v(r+^s4OQUvf-yw_Q_gG$27_)B0w+y1L|0K_n4FObSjhbeC6l$DoP zf=)R?=Cwv7bN>?GQ!-Nk&4n^w0G8%|;_`39evb~`L~P(OFWP@;LYF*xZ=Q*;wRvvs z_~d-}E4J>3fkrOpid0%qw>^V}3IB6U*QN6PznE@6^|ZKsLKLTTZnC+bI!M#cajG<2 z0bop?!%ov4It~Oy-WwJ@AXI^;H74c1o@Rs7qxl)agm*Tfx&PLrA0m;Rf|yU%}N>pT9f+S!LZ^`^s43B@t~>4Bi<=-c&Zsjgo9_HJTrV+a!K zb7$vd@f&sfx&r@C*ss({#{mr*n(w!6k3mU%J-pQDI6Njdm+|kYem=z}W990?jj=+Z zcAXJJm1l?$0IQDlH*q0fCbldRg#Y{=i|hXs`(2!k+WGm2TYiaK9ExOr-8_%}*7iaF z3SoQ-s0ufy1fr7{viV{CzxXmkT{!f>h_zR1nKD}{i~@sF<8T{M$K9)dUoDSRZS6v4cAU180Z5W+p}j6SpJ0oi|86YvTRqNo#owNUj8uBFiQl8Njw_3fTGjT!bV(N+-~jX7}aBs zE{l=PrL&1(7VsK8EON9!nauzk{{$~eZB_1@PBwaTeH}tzL&~kSS2Rs_f*VNP`2v9f z)6Z~2tsifwPKLjA6~a?5rT#55G)!h@v>SalpDQ&QxH@1XVAlAr7)l(gkE-}P%%5p@lH=iqsVIl4J$nSdM8Il@LcBXOuR-vX#X3`r*(|#r0jM)WX5CzYkeLEbX0M)h;p#qI| zhRvIQWX7J2qly8f;UCphv%?JXb6~iw$88nefZC;0^>WvdKl`kbWV+l+DX!Utj5`5_ z41VL!?}LBbdkdI{-?Jc{XS}7-B+=B_nWpWFf%Rj|Bg#=1cl@;4vEq`lb3Na5e9(Qv zvwFM2sG(HUr&;i`cP5Ua)f)vsU&m-i01_1XLBJq>0+D&?=bo|HeBteCw%zMbp7Tz8 zU}9bA$896x5z!Nu&MEZrTJ^@aM+V=^RlrUk6?_sQ*{6_GL_YZUM%B#94}eHq>mR0S zg4bKxmiaJFL`l#4eLu?(cn}=1-|r{dRJV?d#a?RI9{L@ZETb4c3UvYz&5T+SvvJDH zs9#vKB)PC8&4~X{Hdy+9KI*BPcItP^-lH=OUy_LwzUMPWmZ^5Oz;`4ilUUGnw^EMu zMnK$f98-$p?SP?i0){wu@{+Vgax!197yRK%&T0Wej8~;bS{_PS+aHWoN@y5=r#R-B z*KqGZub=atug-&cHr3?9p+)EJ_MuD%I2Q?r7u)3#avJlgJz_Rl+=6!<7O_6j8L7b^ zhUdhSOCzugGFbQODuVo6M^C-@I!W;C+@X>TARq+TqFi2pX73Ym@!;fgMI%OPJwyVS zn&=2Q)wM5}I}CpxdUT?(Hfjb-GD#boQL!`6CjAZKxAr6oqE?vKdp8E@N>;JccvLQM z^h-vb)8V`a6U@Eiu_&WC7VcJ$O8j}i2G zN4GQ>y*7bTEA0EA$Y3H#_Que7_~DrM@g52BS1nHTCW5jcHi;(ROkQIF&jZER+B1rO zqTZJqX{^aT@V{f~f>&|Fn^%*UZMIq*g1g}+oLdpp%V^jV5IPFS1tpFhk^sX&67n1D zrUjKa4|#@FabQ;O6HMcoT}U$>rJYlZC55Y={+%l)$;N9!s$cE#9dK$tkb?mLz@w@m zlYJ`1aY$5Gr{tHmD$}64k)2g)!-2RtOEmdAuv){bE;C?9q~&O$b5NB*yMJ)uUrW!c z2;%(T?P>C9tm|1=jaSv&;M`I!%#c(m!*hc%PFdt}3Zz#zci&ECrhkkp)_uGkN@Dx>j|T{Fh~N3>-wa zi_`w$%&`Ipl#JP0oPBzo_&TfYj25e{-J9}rYhixE9<@skk`1iY25A1P6A`WcCX$5C zh;&->^0TOOMcRV0eMFZ`L4ay~LYLtUm|y7|d8y1KqSL^2vsU(HpDR*aewNc@vwH6G zlAU(&tVrS+x{dshWz19nYpB1#S{QvrtI6S$AmQ^07nbBC*}TBTu*?AlsQURGgTkdO znaNEw=);&JLP0{-Ijl`*8{tJC%F8{()#!HuSR>p4LMbo<9@FeH71gyksC}&kgonEp>>8 z9XMd{ODXeqw>sFu1Ek)Nt-zgMKL8I<>|7N}lPA|vu3BzF8!X!12_@p37<+uU$u|Vj zY3SX9f-f_~Q-599DKnTr8B}wz*pKB=KH7L11$&1^zhge-6;?I4zBF34bxfmLiniZL-onu9qN7t_ zC-}U4=lkXpPARd15*j~a$4t1OvcrXs0$4R*iSgj&o#a1rl^&82X3?cBacL@&zL&n% zcL-F^a%aipNKUg(UP_CvSo(RG;+)RFIfU(nJCkzxV;NBbo+W&Vv%I`P z3C)RCSzRT-BrVQRK;@2I<*2Pgl)Rqi5{rLSk_)Wpym;RCSKa&_WmT9h74n8XM*mCI zguVd(kI*5usyW6Iujkp7+LMMuW+V&jkn`eEJxy*iBI-EiDdGXOpT)3d>hkCe)n_)? zPczjROCvq$&q z<%5UZ3_eG86)g9fjTSg@A@; z(x;-*t}9KIx)pLHSNQYu$+F5YAb1gqcJNFZskHZczG=q9kzJF$H&eHsCq8j(T1SzPsin92}<=TA7?CrnH{qEjRM>0FzW=o)<-*{xzUVCcj z<`ju4ua;L++rYQcb%t72(|NI?@<7q?IJ{;jyiOxN-O8nVFYqcc?PR+$?WcOhfiTp2 z0@^G+W*Iraldv{i?%1FVeZKX|gZjEg50RN(plgIl=bYEvX^!H&6iNFTr+3V*SpAhN zqoQZ=$_+uIZ!YnNlsn(m)NEz<;JNZwx}2{rKqM%XJ0MJ%zIQaO=RT_Pz6HwvA2%O@ zb^Nhe-{SL3_`>g5iqH-xB@2T0k@<^k4Yt=LeW&Ku3nn(h?qt%x49_Ny-4N+V_cx@a zb((Gp4-T~?Is}?uZx#K~ansEJ@&dwx|JvJQ^ixk1TWD>+S}jP8AM*&CKS@vfzX=7T z|B(A3jK%1&LcA{!sJ_MZY=taGu0SOlQ*!+?N9OO8_|Ud=frCe*UupN3I`amz`9LPu zAfPmfP=P$G(7kLuEpQr;*WkN=ZOpl%CU&sjqZh)*)IaxtkM*z2V zq-4iBR^j!!p6ckYpPC~icZQC~?U~5i6>f;=2G}OGq;EuVu&(|ICn7+pXV@ZsqUVie zBPgl4?;MJ(sU1{+nOEoKsWgTj0kVmodbB+~!J9WeH7FSW1E1h=={nL8FWE2qzT0B> zN{?vJk0W%IZ{veoa_C!E?|u-#61Ne*4i~73f8V}+g#bo{qClut8PsM$QD9$Pi08Kl zfm`JB^27G(wg?V|8hz4j(AZnpVk1>Jkd|F^9Oz0s5{JY&?If1YW_O~S8_XFIPtJU* zxTJ5z)nyFgjHO7tX&xnL_m$FNU`oiieS5~i!C|C6s0ui*!knDzJAh5}0yKOYfpN`l zcLrHah)sVC+c70XYg%XrsJ*(_Vr=dcR=?V7@wq0XZww6K_;sxy+t`csrREKCQpT*( z!h1SUzf59)FnkztUOCfY3CN2;_Y^~Q@~*ZkPCgp0)*YNM=*=&@>i218x84B{Ge9;~ zX@=LCpX>PP)${H^U;4!BQSR-{-PCg6uXR^ikYo{rg*R&kXYB;MpU*vY5bCxDu}(5U zn>7&m;UU>kYS|b%1qIOn^Thm5(~u>ugKBV2|0sclb3&>-YFt3(0Kv`*d4AF1`Y){jrsi!SJ{ewgH8XPFZ@P3eC84^+qrARUV^IKdnOe(R|CRpsf1Zux7RZnL zIkDP(Bu3#xNI=BLY$``zJzyfBjS*nHq!+SHPnY7PxxDxfSypcamu-^x+8&+6)%gy}xq@K2WzKazgz4m7>#Rr7M}&d$>b$tMj{ z(rTBh*SFS-kqwKq^0Q!x{qk6752;uhG1}2&t8-x1cESA`-&xjvx7wE0;`^!U=L9ue{4?g0OTsZe1lk{{KulM7} z=l*vk&+j}KdONPGP?jNJ;JcxF#`?yeNyp&Y0e%cU4sIQS*4EZ04MBClYd9e`HU}y} z0HuGTta|}X`X@zYV2B4|VxS+Dtfo0Z{y96_^E*(j8c?EjBh}-@?0POhRv~_r6q^d~ zITMK4q_hHSF_wP;5*8znUOq$t4~XbLxh2i%`Sa%}ES40Qr4Vd}-M^ZdV+oqEmPiSy_`WK$t5aX_GEI4+|3n1qETO z-2IRD9=L6|muy(Q#TMC#m5?ON0Z$6wq0{Z{6L%4rem~jdiPIu#*`kA6^@FYA^EMk5 zL&H%X5Deo~B?bh1+^VULl+xWHQp&oEF+o9i+y`yDIHUHp?APJ zk%$(?BJ{CnkzR))RH=yJ_&9EaG^m+iH!Ep2)d~p8oKmY#0_V@aCrkJ)KG4dP8wgYY zm6CwinF8`^*XnnLCOa#@BFaU9>#|{nudU1ED@$FAfQwn_qXh3ggY_tK$bwnX7oXMb z;qU2?7BNxF4ggsKK&dFn?Hexs$KZ!vNa>l#tKb~}@qS$7?L5=b(XIbbgt;M%Fc^ICn!sK6hNXqOm~RWgY*+5&OSEAQf8nd#S6c?|erp?Uf| zR>uux4Q96}+-p2% zt|?^Aqy#R^1g@2y_iP(>nfW|_fBB3@7;6)5!b#DRy6Sha(_b|Cn^&>HO08sP*7N>R zpYNnkHOlL3^42bWdaNK$_d!-WSyM}+bU%)FNSl$;uwL5JTWz7RtdXS}IwwsmS{yaB z9p0q46zjRkojMhiHG)Q)VjszOQ?k5VoEliu;SeSr4m0n+&PyTvu~-S&7UWaI6zj#I znB}cKOP<3ze(HB5=3?rJ0!|WUV%I*OLDBVLlPSF>g#zNJ`iv{*`1sVkyz0Llb%6*o z&}p^3-8N50+sUPSOY(WD?B;6K+-uKd5Ao@_lT+_Tr5Z8efvLuSXOl6BsG=O*2N6-j zG;ysiUXvXH&M%0nHgTETt{l@HJK9b}#76xDKDM4%SGbW5h2;&$ihG?+$BJPPQpJ2M z*Cvx(+Viww0K?m~0zjtQXp}6-oZnQskNF-L+D?o@V(z8~zbF1Ovz{oPazG~fu ztm!|$*XA_DDS;A}%LZP4Vt;&CzRIy>OBwQ;kzxV*G60LinXD|C&9$=G+=h|Qp`O-_ z$QB-aVM>*^xf5!mQp7sCNs)vBbts_oaYKN&L;>+0zEe;@pbr!Y0}`Gv)D;@u=y#Wq zen-|~DeCr%x?75_aBlYe4UsLiG{Fmz^=kh_RZqUKt9419H1{zwDH;9p;GmQ0v}`OU z+Zh=YGtJK=CrUpyA$YP=&I)s+Yu^%Xw6phJAV#dXrt;?0h@iIb6P0T35!HfviHz>T zf~w#jFk#=eVF%BhJWSApDA}5?fD^nNu{e3I=XLkVskv|&qB_dI#5kNK#%$t|BK}u{GHsr5T7*t7z)9pNWC-KW7l~NbIsD{&7K#3>-#Kos2o%LafR*Jnq zKw;aGz#oSMWRz*AJT1L`A<~6UZdkA5Wc{4*($QXg=if2vQD1+q59O(pXuP3+PvF{& zEa;oMJ;bm58CKeE=Yn!ywTUR5uSK=1d0;%=DYOh+BjjpeolhG%LC$Mi6jfAtEv~MEF{heiP9m z%Dp-&4i$Q>f^9=AXhS7*@ePFyDUXb&N$Un{7)GonCRHvd^krbRRNE|v55XQW1yYC+ zP4mWuC(PGlB@EN=epGw)&>o37H6=&$&nrbBF+O$=6yZ~#l1bW(H`%5?+M{|d%1JPW z8g)y4VJhc!v}$OQZbL z>C62N$esy-wEtR%Jor`a=CJ&MV>5jG9tq+Y0m6UtoxTTbf9)ARz~VQC^y zQ|z?WM{n`<7~QJ4pLL?{yZkq&Axj$bXZ)NCU3g%qD6T9jro-PwCk!8Y!tTdGS~!Vp zJ%^p0MID`A>bTlDlEAi6@!6(pcy;4vPZ1b4PG0M37ur6I*HE+_fuN{=7%MkkcM@IH zwz!s^BZJ?19ko9)CVku^+F3Cl5o;xb>#2z!_vR5w-RO{2*h}PDDG+mO1Z$fK)l^GQxz@pCsdn;c z&PtSZt`cbkq1J*1{uQH6g8E^#>n8eivXz>?P>^cBe1dyDHCL>pz)l>?Yrb=@IyEVW z--LfSXSFS?m_TSUI!KBkri%Jj9uUVDazv*fS#=R z&0ataKoeQh(wnZ zhF5W4e~lUTiS$ygY~PrawKsQj?k8A1JS7J>s+;O>_tq|%ET5c+$oZXy7HFSe^2o1g zcjx;VCg59P)e@`l*~_rOzshO^Tba>Xl&AC7arXax`O{ZH~{iJa`p%&8EE z=97(uviXe6mWa})F7IZDu-MwwrfBp4A1FU|H=8hw6&m5y?kEp4vpYQRF&~EEer9#j zh!h5FWZK&_xNCmZ1_9PBblE%9TN(j^c{wO+wqvB0DSUhtx+{%lG^3lmv%mr*AJZZHrcx8pcrb*v6C# zu#-}QP}$&M$-{;3gc2AzVJYV}MC7Tpyr6#5G)>9RK6J*+Vp&YB(yb(TOzrJKPFOmI zT<~?Cu#!v}|FBGsYY2lZqN-Pxk}9=PpX@I?#Y3wXNU6v=2K9d`()2a`*xh5XF&6Kk-a-g2wgLTlPX>RY?N7%Aik!9w*u^?%r_{^j? zGdYUCpN6=0xV%YYigsG)mw^f|2{7{Pt)uC}4O2uY^Pc}rj8D)lbb4$=o8)wsSxy$| z)Z>uyH~^SHuaL}onLndWE5&5kPGMT4#mw!;&r+{;9>iG^H$SriLzTM?HJcQK~o=@WNd=MHZ z;8J}%cD_kXkoBJiGKNh<0U9xc`#h4%Zay+=Yctf6KugnIe9JIWSejOD4VkDc8rWJJ z!6aBW4X0TrBTY$(pN_C71eee@R+Sp64C^^nZIPev-q^JD=M{k}U_GBqS6_28YuqlT z3R<0j9_~Rmd+Nl=$FtyY!rm>M*}MvbqpiQ(7-b7*^k&7{v^bEm*`ka>Fnie4QyZI$HZLx7#K%(r4EuBe{V6%LD!;$6A6l7|I5(=urMAmh!uO?{Am|4V&n10L6n0i6JOL>uLG) z3?Br%a8CZo!J!f5Ez&gFyo_E>@|{bqnsQWpb&D2CtR&vGRDsJ(`u8pFBx2k)cl5Wi zvI-3;)PRz-Cc69>%pEH7+YKWCQA%L>-G7Bobmn0^Pdc>iSzD*Eva#7ZmfjR&2&&L>8hF10 z-;5Pk+X}YfJu)3k1ad@4LG6U)@3(Hl4_f$MxxM z=#odVx`A1E&#!lc1$YTf_E}0t*LulryJ(oZg)Fd zX*{a9jFxySmd|zQzzKM`TCUY}>Lo1)PQVq@a*gZl=}AU|ucg-~OQqJqwrQgFGDc32RiMn~_b>(1r7mK+3XY~ZgJ23jIeIG>iFbf5p$RWOZ z@_W}vJK=PhjGfptW(J6YO@p34kMXvy3Ku8PEcznO-S%YOfO4$5~3S|Qd^=+8TL#h=UkIV zvc5fichePL}-#|J(ECav5Cd5omWQt==kby?`?;Vp15vi74N}i$fUQ@ zw6ZL6s#Pnd`1FLDr}-n=4CvWgr!owmVx-3i$y1zCP>iJQSAt5`3t`O^_3CWP0a$1p z3IEJLwZax<;Wg3wJDQnURySh4jVD#c2bHko{Yi@m zwEwIZNtj2qSLd)B^LL@NUDDfYcy8DRD#UgYpTFkxjG=m#wt``USqS~0GKYv$W3!&W zllvFP+ZrYIg>}a2o}|X0ikm+#tWTrudi>9JT^4y2&~~9itY^LqvVK* zJl(I?0}0-p)&!FS;%-9soJ|8s^$Kfxk7sj@n(qDfWMe6(MEDh&4bnF2A`DnXyAlP> zu94UX*H$w>IG2WQvhAaCux%DnWH{qKyL&c*c1~RWM z{le&|2D9fMx5I%Hc*LE3+3HZGty_)$=WH1FCn^#mWAFfnd|~qq<9^X$4z<(7Oy*|T^%p?XCT#tQTlI5&ZbA$B*TZIGwlgCmqYHc{sLj15 z77WF;`ec3nylT;Fb_>1l5acX|buoRnDpn~pq&tVzWdqa?SnjBDT@)`uinf&0UYQ?2 z0PZHEPMMWee@ynh3b@as{lvqh{S`AC)t8S?`9QiDN2#9nQ$2HMV8OIY2K(&hN8V$^XhnPT3w; zt`HR3O`z!WsO71-bX3W&4Keq?DIG!KP-}N-4*hPswe+lJ0uZ1^$vf;!85lsHnUh>D z1J``vQ{y@;HXgfIeRZvJzgw<9OoLna%jg-jV!uT?wQpD%EXWWX2y2hNfF9yTuwIa( zA+|4kentjz|ckaA$bR}BsDOV%hF1M?JB+uJ%PIc88D-PHn zh8R0YlAcbc4T#LSQuBF-$9DN}l^8wcKvw&_=!u_RzpcZMgI}R4^%vr=s$mwYdBs7} z6Oh)Rol=DLpcSQmzFwX6#&9ZQyJ%b^7b6jmXkBxv(Y?z}i*9baZ*q3)e24Z!p3X&2 zNC2p{?HQPkc5YJ6+`w`xwwe|P4qY@Ltr7Q=|EeOUp3N|A&2SS!Y;Ux^2HbnxwQpG2 zP@&OA`q>}wX4T?b$L4m&wO6-+7hUJgq(x;7-A$L`$lhl4;7vZN@vGi=#}GD9HSzqD zQ|94IXii?K{*@1pDiAL|rnUXLl1{4awv&SNX#;$#h&b4;4f}xRz8a@lNgwh3u8Q-~ z@dcXfdK|S)Ov<-E<0bdyXq&3+a2^BQ9dfptiCV>il~PS*vdf#BiC$?@DUz**egAuA z0bgbswZh*$H}s_=tjC9PY-Vjed+u*rk(L#+pWB2k&?m(8P39^rY(&H{zKk-+>`TT2 zNO!gE^0+W55md2vb$3JceInU8u@{%Cl0BcFRpX?WOseM$FdF1yc6;SEJ#?jqG?{Dn zX*X6j$x4(?pAL8Ne0E*@LVeW9{=4XmPGVPboB9;CZ68DS1K<%TBZ;n%(1AbRwuf6* zR+i*Kf3C8yuqWg@i`)*t?-??gd3@?V=nz5ga;3j(I&%)GU+X$UnhD?bG>Tm#-F>eK zBX}Q|8&j;{SE10a^|i;=%9VCi2hU6qahGetF_mZn^M1TXAWg`nB0T_36VEVNt)@iR ze~{&`$KRm}BicsC;PT=XeRg>4cr?b(M-(0Ya?4GUQr!Kius2Q42s?^0x~EB}Eq~{m zjzLfv*xlPlopZa)%OA&Kd9R&k{mq!`wkG6E=S-l6gfbnfKR~{t0-8;2LDFjhpt^Up zeI5>NZei|PeiAHp*?Ps=P%|pp9vf86tQ#0F9{29)E8G2b`^6XT)Q8*7w)PtDm!tJm z#4sje7bKhmw+sbHE?!J(X_1WMv=*M5nF6iat$V{zax0Xh756kChn7j>*O`?*Wsm{rd z(4~Sk3F+BmwPi01A))BAiR^ zOcDXq2j~WYKa{Oj+%#GO)DxvYwGS564!=9fV}9EdhZ+m*ktH@Lwb)xt)_SdUL8G?j z2t}yPGb#8IC?xV;_6Ma3==9CV%nXZ+oW&7ge>%3P_46VGO<%r5C*^Zd!Nj?GN7FAy z)R#1u|3LYTus=~oGefmZgxlu5ILn+%W(ys}bH0r2h6^UP(G_b1^ltAYcS@3wd*fbqrqG)4Xjye?|6PU7{@aS%FYilWGMj5F7SR3y2tvcf zfqYOiwR%dh*ZvVuND>nqWB zoF2r~D<+A|E+h%hjx+B1;Pf8I?{H@pyL874<)K!%4s+XW*NX**etooO4&Q4>3>2p{7ElX<+<=GxiK~q27SGNI=I9YADlF=*9D8PCfb7O6y876qRck(A zDb9s70|2N>7D&N`znA7a-Y#X%H8BeN?;1y@QjoAAr@Q-Q+tAW%t2obFwDsko-CDuv zy_@TyS@#IIFkf;vPYfX*Y|$XEgoBlTIC|J^Yp5)orjrdFUFBlVkxfZy4L*6Pl;^%Y zPFaq1EVoijIBoy#hv(r2hSlPsMq*NL9@^* z%%m)o@w03WL%gHdt5lgXQB=$C%HWOzU5V2SYXPHOg1eCid?^*yCLMT4{Jm)7(&3>;a+u4pR4} zdcikk-bScYzO64@U)IK{IHNnMY9_ZaV6}xfB=^_4Ni{U`s7w*fMCBfJx4TT&myNxU zG72Y}?r+#Rd=mP!S^3R3H#SdIGozgCr?PJ*DSi*#MtKKZsE0C^WnD(A-a46Fnc;uPl=m7Rv)#~0*z>-335Vd6BCc1j3zMw*ju|F;Djl~g%E9k z!KJf9p(>^%@>yS`&bA#g>nYx(xmhC&LRGqqJ`wi{74%Cpv**j91wKsg6%A{qq@6+f z7*Y%eT{&Sch_V?uAygGt}Q{cL`30#@W3eia2Fzb8~V*3vT#xK6lZpylJee z`MLF+e@BI!x*EtG3Emc?8|iX?(vy*?|D+ReyIt{ZaFxW=-3a62UYbn!gS0NhD6Y74 zcqEdybMPOL=#YW@?{mYz8%L7R{YTxV*%r5aKz`3>n=A=hQ@fi0vsRZ`@yM$mtEDZy z)BhxOWwn}fColXj{iJQF|FxmiD<<H{dFCL)xvmG4_BT)wge#eO%Or#L zyaAuWH3eIP`@KpuimnVH4bjGmB+thJdt8Bo3d)I3h~radQ^A@Cvb3*C zOAv@<2^Pt)DK6xdjz-m!B?q(qALk!Wp>62AfUc>w$ScpDP5dj?T8f&DlrkcO_w%Qz z@L&J_lVWiFNeakWJV=vJ)oZKbl$ta{I!u)YtG6VkDze`53GagH;`c1)7=h$Q<71&=kgpQz&{0m&+rEQ9DCass zs;8&z&I=hmsj(>++)nX;A1{l+#&5IprSq1<|8|5SO~fVUD_Wp!{=IRoqSV~K7Nv0a zgUK69n?+vd(d(`hh=cyMH+hEdBm3_`ZV)s|xA%>c;6%q9toe0@C_2wn+h^biziE$RyQ3PAO2X5blrLd#l z`Fi=^u`jiP2u3s!t5A)0nJfY>S~iCb6uJgG`emM6K1GP^(SNMeBL@f+1T+zmt0fPF zR;~!G^yTH6Ng@G#Km&hbe!7hYT1?z0f43c4l&t=(u>?esnW3Q!G?oKKZo(G*^l6$q zck&dS9UL6ePAUGLD#+inXF)_D8qx-kcQypPh1Qa)s%miZ#)eJq)_?e-%6o%FU`y*g z0Ds^2YhrWkUsl;MQ8lbKq zal6HZBsA9Za5Ua3I^$-3i(GJ!69+9R(7M7r_JPpQ1S*|)$wv$HeEVe;74^va#1PVX zNJToO`ojEG`Xd&9*&Wp5-iNibaoc4>wXCjH>nFv!WV3y(H(Tx6r=NT$>f zM5=5{`hkGfxov7O)@|ELMsKD=R=l_P`!tciE8Z!e>Vk}m*+^OEf(n#RI;vc5K{7`f zKYl@dPPf0$gC+Z%JEI)#mBF!@5`RJsO@61~gnw;_JrGpLpfXnloFkadn6n8RtwdZyoQi|MXMw9p}R!ZeFL$in9e9{*ST94<9 zPC>#Fi*BBtI_Ea(LzkA{F7a~zJxhBi~= z#{ZQzr#-d!>ig;q8c0<&pAU?K1DZ7ngaDm_ysYWC6$V)v7c}KG`qDv+DjZ3%{(m zrRFvuhiqTw2ebZ39wu!pmEEbIS44d%By*O-k1CAa*2r4R98wqLx^IHehZgvtm_P~g z1lsL?6Vzyl&WMz4EEBt(Fu;2N%7mzRI2NxAPToGtt@9N-ck4eeJ<8k`C2_z98m5hd zRiJ|RkFU3j$#?F5BM$rT7ImnDfs#lq5MPXp8D?|ZFyvipxG|$Yk#&r26)^ariihMN zwJ?$e+>b?tJlZCZTJ?$?MvUZxN4Ro{{F#7LeY0i~n|4%C47*gypyWR_*c}TDQI%}=$4|W`;PMp@N%RVp5xpTAgf*$^F|`mh0XCI|C!4MtO;*h zDl0T}uLr5nrK`<#=G^_;$%7>F;d+o=&g22bEgamxPzD%-+22Gde9UQB%@dUoJ4ASg ztxaA%x^l{#WYhNVBtkmT5|tGf66IKLJ@C(Ctx{P$@KI*ZCyAFP~p+sZJ;Luc3nWbSBiq%-wEr=YQySa^p9_`mNcB7) zZct%G^HQd_egG^EOqL>-!lNkt+enPG^f~F50P>7(@>rOgp5` zEiAN^xbIhhj3b00}PqY)uill~kwc8OqNKa!O3gJt`fnZEhE zhPy?kLYIhYTez|-Q3S1yiw`lJ1Ncmgk$5t}#pKePbAw%lt5+eEhlo#%p0#~!vn8<@ zU6+ZZF~F-kI(8{*_|DBESOaUofTLbXFjn;(>}o^|EWxIepD*jYwb%(|X{kd)YGPd& zmo*SY0vc9U1<=^Jqy41duTH4RoAP$UfN+2HEVJNb+M*`5YDg$ZJ8MRPYE6@!Sl7=t zaZa|KL< zG)jc@K8k;CR4f19mEwV&t2x_GVnMHkU`X2uw!v?!`2DW_(}v+D*jzStC*@+gz?gm1 zE}um&#nek%#K`u5x%zkgyg*IID)Lk$(xY0*l1Yg{QKcFLlW4iQ)q$5)exyI7R%94- z?c4k0QS~A-C}t`OlNa~QTZ1|&Ql+EXD5zPgbg#S-%VVc<-dR~R%D1>pL~#TXAz{h4 zNGE@bz?wxAW;+YLLN*E5Va3#T^72P==N$d%JFdlj0|IcVqCERe<6lf7zl7hv5HiH^~%5qi$x^T2&f%%7x-Q#xhl=-zT*0o{=#3b z+ehA8Q2%`O~lW6Se%2@}1l`Ed<_6^Id-tb`;K?cwF8)9Ka>)%YN=Z3MuFYS*$ z@M9eOepa`&J&9ON{Z9W*#lr>W(uGuPX|XZY@r2A91Z};^R#~@g!#a*6U9LH5wu!b* zVF~THFwUy~Hx%LCmEV2l@FaR@*(f1WNo*$Jh)P86bf%l*!uzXrj?-tZ1i%f*zhxU@ z+49R^rET&Z-S)458jDlhH}$xZPwZUGJ5O7xC8O+T z_ID^LpM`xjl`l;+w=~hw7&amddBi3B;v-?`)rUB`Us8o0X)AjV=2$(Wyl@3yXtUchOySGl{&*&Ype z%r_t?Yf2`k5mCJ%9$@eS_26NIGii#YCawr!>b6tfND)r`NTPYLa(*9uk`gCk$L?OLR-D6{Mq2?kju2^pP>z5(a-s>JeA^BNTYTk7quy_EO6XvJ>JfiyRrzOi}m!RS^V4ZN=*b|5`T|zr<>KV^IB_s{U>F;jA4C6)xYL zN6qg>nBy<$3=X|t!z8b46MNDWPLIhlNXjpfLw#?M{A#}6t{NI^4tC9&uemA_#|)XLRL?vnmI>G)+w-xZ%Ri>7?# zDkc8=+gACVRpju?g=yGw|6Bw3SI{|u6aW56I@2Zc|GZH6K_vJ8-+D>yEk?!_0CH2< zEe?FjP|VCz%SKb7Bi!9wKw!bG_k|eV15&4>%u>hNx_oM8M#+Kn`0~l|&T0j|e%&xg zOGn4b?wD=2G&GZH)p&f1!lDH$KptewVe&j0{0iJvvHXz2Iv&3AYIZzs-

JQB`3&GdTG8$&(dG9aJYXmjKNoli4E23z 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%0A!a`Kz*&Fh)p+9F=D>#!M>-hy>s_`)pPR+Wa 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.5,<4.0", +] + +[dependency-groups] +dev = [ + "numpy==1.26.4", + "pandas>=2.0,<3.0", + "pyarrow>=12,<20", + "pytest>=8,<9", +] + +[tool.pytest.ini_options] +pythonpath = ["src"] diff --git a/task-4/pyspark_app/src/pyspark_app/__init__.py b/task-4/pyspark_app/src/pyspark_app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/task-4/pyspark_app/src/pyspark_app/__pycache__/__init__.cpython-311.pyc b/task-4/pyspark_app/src/pyspark_app/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3b0fefbbf307c73ea7f3bcdc47a3f9e83fd6a0b GIT binary patch literal 228 zcmY*TJqp4w7)>mS2*q$I3RvX6|IF(WU-`ak`Ny1zHnd_SyA0s4Ms80np%_oWyWMF9bUu)Y|6u+`1*|KHVPO_$5#;QS_)T1^VTcM1xvUao^g~8~CMVLLYk#_->c|Xua*q19xFWTHcRhU zoQ~^Y+N@&7skl^+$dJKu;pSRpr^8+gKQFwY(<^c55){U3c7F!)0F6{Mf8o)UAFu4) ze_S8TUGwLzJ-9QHk&^u()k{59Gdp+o(gStbSC@xs9_Zt=fBE_o_4-hqJ4%R3>Lmhl zl0vC`Z*lkHKw0vYrDuxToB#fcoiBIqeplJ4{GPe=By*{+4l*S_QyM5`UnxIRa=pc$ z@(<7Nse^pM&ld*Dim$AU@`@xMLuE*xj0y-G*!)J1{{jMIiu%CME<>0B=yZ;Wdjz19 z5sPRiqd7ZbFqo0wKz}m0lk~8e9j=+G{(YEdYKM`Kw%@slO}%Ymk7yW%0oRD;*&a4E z+zMvJAyjj4r$zYObR1GP>SBVK^MwFb$8pDY9b z;o!RcG?#xUfjU?4bA@3peV=gW7&Yfq(EBuaY0OY@= DataFrame: + """Count trips for every pickup borough.""" + + zone_lookup = zones.select("location_id", "borough") + + return ( + trips.join( + F.broadcast(zone_lookup), + trips.pickup_location_id == zone_lookup.location_id, + "left", + ) + .groupBy("borough") + .agg(F.count("*").alias("trip_count")) + .orderBy(F.desc("trip_count")) + ) + + +def average_total_by_payment( + trips: DataFrame, +) -> DataFrame: + """Calculate average total amount per payment type.""" + + return ( + trips.groupBy("payment_type") + .agg( + F.round( + F.avg("total_amount"), + 2, + ).alias("avg_total_amount") + ) + .orderBy("payment_type") + ) diff --git a/task-4/pyspark_app/tests/__pycache__/conftest.cpython-311-pytest-8.4.2.pyc b/task-4/pyspark_app/tests/__pycache__/conftest.cpython-311-pytest-8.4.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b5024e929396a2f6c1d72d4c35289d54f1bf9f6 GIT binary patch literal 1269 zcmah|&2JM&6o0d}*B);IhL9kXQiTtxSi-JS>PuBsAQ}Y(I4G%#a9vr0XAB$f+RMzk zsUwgKid2Yt;Km8br=Thvxbk1v$P#ESiNvM!~`3+txk9Jpv=H!HW_x@4SB|wT7Us>T;9U*LwIt+7KQ#9U3JMwWhw5jn) zRd^C%L7-`bM#s5q$HoeV&NxGN;ST%^j}cP3ZT^3~J|D$sEWe&`>Sf~m^3AX7ht?RY z&Y#J6O`#dg_)Pd>Jry|FhMi?Ka>HR%#wx@SEFI?>myF+N*bZe}nl2H((sAN>dEzRf z%k^5tzA3Gn%wOW?IU_!kQQ_CUG~ybg(6r9IcNf1aULa1hMoMdSUM>2Z*fqw)E!!)d zbM>B-xWyldPckZ1t`;@U%>0>RIhV^&9S#FN5!KAM#bE;_1*8}>QPfDZmGzqH8tCr$ zLG^8{LFkL{w~`jTGXYQc5?}1#{hKq7l3hI8!?Qa$wRyO6;Hxe^)x)QPR3~-3z1YR4 zd-(JYKD0Ue@aUgM`xe9|`YEsuwytQ|jaq+PzJK{%ek0!sWKVqt()(mW^X1z$At%my z&C=-i>3!mRw@w=l`+*-*u0A30L{0q&Lg+Op zmOdl67050a8_8EN{Su}-GhaWS>O!suxenxZVX_s-YdF~%fBGgEsn*QKmyhfYn(Lyu c9-8YL7Mgl+rw>YfnEs7`aV*S!2nX>016pY}KmY&$ literal 0 HcmV?d00001 diff --git a/task-4/pyspark_app/tests/__pycache__/test_transform.cpython-311-pytest-8.4.2.pyc b/task-4/pyspark_app/tests/__pycache__/test_transform.cpython-311-pytest-8.4.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11b16316b2222e13a62a50c65cbde4aedbf29da3 GIT binary patch literal 2104 zcmbVN&2Jk;6rcUFcb(ljElI%+!ElS*=CK5uZGAb!KKvAJ5%hGDHJ2=Ms#q7Aj zRw_k;8-GBr5r@zy{R8+jXjQ4!o+5FIxHw9C>4`V%^-?=Y5sbaR`Fiioo44=x_BX>Q zA!s-L+WP)_0ii$nWYolLaJm75hsZ^);Gw#Z_M$I2qJVt4t_XZb^a_5lUQEZ5r}|o5 z^Go#-%;ld^eack;byxTnS%qV6_KqbaGdPY3WuIe)Z&U1(^&dLev&7^be4kL?!OCT>#$cv1hm9-sVXVRW@kv&&&3r*22PS}$f_kUzh+L2xLv9=Fq z9OmahNJ|jLsovr(etVPARur4xh14Vvwyrr0k(q_4YRLz}F%J+e0$9Q^zbtgzUT-do zrx!YywZgz|xn?V1q)DhHSt3nz#?r_O zGX^h%CMa;(R13yBAM+!6?`Pg-a!cu@hHuyO!k~HYKu8Q{i#Y9X!tJlAOXwX-O3Dr; zn2|hxD32ZG7qgT^i6czgiIRpVQF>uO;-r8b2050f+HyFjOfRK2r71^KpF(cH)euE#j3|mgSu}w&O`J)>RXKiiS<;$Z5hU50~Y9s2V zF4#DV8jQp&PSFPCAcoiFSEFt+$2aVAvzlH7*Lb+&-vM^fk$(BPe(kA#Z6GRIX@GLj zk+yhJR*k|71hBh4m_f#sk*Lf?b0{ILdSVp0D8TOe%PZ*8{NCE5#V5wfGh=1<_ECA} zd3oV!dErQZx35ZQIq-M>0FD9TFV1OdF@0H?hU zr{Fs}pP-Lm=f4wloN)V)*@rp(ABY#yO>$+Rn=(N+X^d{-j^q{|7thd51-faym0Q?z zIvymPnbjvVtxqQQQyxZynpvGPSvMlpoIy<<1B4c8kn=pOFaBum1eSE)})zUE=_ox9%z$99Rp2{3j_Q-Uak1un0 zi^B{+%=bA{=qwD9_tMP0s8Z88kh#vaegPOu-aHx8w1kXYoy^D&_Q(@s>6x)KmXEW2 zeKya>kNGvq&QkD zf$}gAG%06_a=J2IZ;q$YQI{7#Lh6D@% literal 0 HcmV?d00001 diff --git a/task-4/pyspark_app/tests/conftest.py b/task-4/pyspark_app/tests/conftest.py new file mode 100644 index 0000000..1771db1 --- /dev/null +++ b/task-4/pyspark_app/tests/conftest.py @@ -0,0 +1,21 @@ +import os + +os.environ.setdefault("PYARROW_IGNORE_TIMEZONE", "1") + +import pytest +from pyspark.sql import SparkSession + + +@pytest.fixture(scope="session") +def spark() -> SparkSession: + session = ( + SparkSession.builder + .master("local[2]") + .appName("week13-pyspark-tests") + .config("spark.ui.enabled", "false") + .getOrCreate() + ) + + yield session + + session.stop() \ No newline at end of file diff --git a/task-4/pyspark_app/tests/test_transform.py b/task-4/pyspark_app/tests/test_transform.py new file mode 100644 index 0000000..0585ee3 --- /dev/null +++ b/task-4/pyspark_app/tests/test_transform.py @@ -0,0 +1,72 @@ +from pyspark.testing import assertDataFrameEqual + +from pyspark_app.transform import ( + average_total_by_payment, + pickup_borough_counts, +) + + +def test_pickup_borough_counts(spark): + """Count trips for every pickup borough.""" + trips = spark.createDataFrame( + [ + (1,), + (1,), + (2,), + (3,), + ], + "pickup_location_id integer", + ) + + zones = spark.createDataFrame( + [ + (1, "Manhattan"), + (2, "Queens"), + (3, "Manhattan"), + ], + "location_id integer, borough string", + ) + + actual = pickup_borough_counts(trips, zones) + + expected = spark.createDataFrame( + [ + ("Manhattan", 3), + ("Queens", 1), + ], + "borough string, trip_count long", + ) + + assertDataFrameEqual( + actual, + expected, + checkRowOrder=True, + ) + + +def test_average_total_by_payment(spark): + """Calculate average total amount per payment type.""" + trips = spark.createDataFrame( + [ + (1, 10.0), + (1, 20.0), + (2, 30.0), + ], + "payment_type integer, total_amount double", + ) + + actual = average_total_by_payment(trips) + + expected = spark.createDataFrame( + [ + (1, 15.0), + (2, 30.0), + ], + "payment_type integer, avg_total_amount double", + ) + + assertDataFrameEqual( + actual, + expected, + checkRowOrder=True, + ) diff --git a/task-4/pyspark_app/uv.lock b/task-4/pyspark_app/uv.lock new file mode 100644 index 0000000..3f2af98 --- /dev/null +++ b/task-4/pyspark_app/uv.lock @@ -0,0 +1,226 @@ +version = 1 +revision = 3 +requires-python = ">=3.11, <3.13" +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version < '3.12'", +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "numpy" +version = "1.26.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload-time = "2024-02-06T00:26:44.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554, upload-time = "2024-02-05T23:51:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127, upload-time = "2024-02-05T23:52:15.314Z" }, + { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994, upload-time = "2024-02-05T23:52:47.569Z" }, + { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005, upload-time = "2024-02-05T23:53:15.637Z" }, + { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297, upload-time = "2024-02-05T23:53:42.16Z" }, + { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567, upload-time = "2024-02-05T23:54:11.696Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812, upload-time = "2024-02-05T23:54:26.453Z" }, + { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913, upload-time = "2024-02-05T23:54:53.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901, upload-time = "2024-02-05T23:55:32.801Z" }, + { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868, upload-time = "2024-02-05T23:55:56.28Z" }, + { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109, upload-time = "2024-02-05T23:56:20.368Z" }, + { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613, upload-time = "2024-02-05T23:56:56.054Z" }, + { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172, upload-time = "2024-02-05T23:57:21.56Z" }, + { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643, upload-time = "2024-02-05T23:57:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload-time = "2024-02-05T23:58:08.963Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload-time = "2024-02-05T23:58:36.364Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, + { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, + { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "py4j" +version = "0.10.9.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/38/31/0b210511177070c8d5d3059556194352e5753602fa64b85b7ab81ec1a009/py4j-0.10.9.9.tar.gz", hash = "sha256:f694cad19efa5bd1dee4f3e5270eb406613c974394035e5bfc4ec1aba870b879", size = 761089, upload-time = "2025-01-15T03:53:18.624Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/db/ea0203e495be491c85af87b66e37acfd3bf756fd985f87e46fc5e3bf022c/py4j-0.10.9.9-py2.py3-none-any.whl", hash = "sha256:c7c26e4158defb37b0bb124933163641a2ff6e3a3913f7811b0ddbe07ed61533", size = 203008, upload-time = "2025-01-15T03:53:15.648Z" }, +] + +[[package]] +name = "pyarrow" +version = "19.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/09/a9046344212690f0632b9c709f9bf18506522feb333c894d0de81d62341a/pyarrow-19.0.1.tar.gz", hash = "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e", size = 1129437, upload-time = "2025-02-18T18:55:57.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/55/f1a8d838ec07fe3ca53edbe76f782df7b9aafd4417080eebf0b42aab0c52/pyarrow-19.0.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc55d71898ea30dc95900297d191377caba257612f384207fe9f8293b5850f90", size = 30713987, upload-time = "2025-02-18T18:52:20.463Z" }, + { url = "https://files.pythonhosted.org/packages/13/12/428861540bb54c98a140ae858a11f71d041ef9e501e6b7eb965ca7909505/pyarrow-19.0.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:7a544ec12de66769612b2d6988c36adc96fb9767ecc8ee0a4d270b10b1c51e00", size = 32135613, upload-time = "2025-02-18T18:52:25.29Z" }, + { url = "https://files.pythonhosted.org/packages/2f/8a/23d7cc5ae2066c6c736bce1db8ea7bc9ac3ef97ac7e1c1667706c764d2d9/pyarrow-19.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0148bb4fc158bfbc3d6dfe5001d93ebeed253793fff4435167f6ce1dc4bddeae", size = 41149147, upload-time = "2025-02-18T18:52:30.975Z" }, + { url = "https://files.pythonhosted.org/packages/a2/7a/845d151bb81a892dfb368bf11db584cf8b216963ccce40a5cf50a2492a18/pyarrow-19.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f24faab6ed18f216a37870d8c5623f9c044566d75ec586ef884e13a02a9d62c5", size = 42178045, upload-time = "2025-02-18T18:52:36.859Z" }, + { url = "https://files.pythonhosted.org/packages/a7/31/e7282d79a70816132cf6cae7e378adfccce9ae10352d21c2fecf9d9756dd/pyarrow-19.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:4982f8e2b7afd6dae8608d70ba5bd91699077323f812a0448d8b7abdff6cb5d3", size = 40532998, upload-time = "2025-02-18T18:52:42.578Z" }, + { url = "https://files.pythonhosted.org/packages/b8/82/20f3c290d6e705e2ee9c1fa1d5a0869365ee477e1788073d8b548da8b64c/pyarrow-19.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:49a3aecb62c1be1d822f8bf629226d4a96418228a42f5b40835c1f10d42e4db6", size = 42084055, upload-time = "2025-02-18T18:52:48.749Z" }, + { url = "https://files.pythonhosted.org/packages/ff/77/e62aebd343238863f2c9f080ad2ef6ace25c919c6ab383436b5b81cbeef7/pyarrow-19.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:008a4009efdb4ea3d2e18f05cd31f9d43c388aad29c636112c2966605ba33466", size = 25283133, upload-time = "2025-02-18T18:52:54.549Z" }, + { url = "https://files.pythonhosted.org/packages/78/b4/94e828704b050e723f67d67c3535cf7076c7432cd4cf046e4bb3b96a9c9d/pyarrow-19.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:80b2ad2b193e7d19e81008a96e313fbd53157945c7be9ac65f44f8937a55427b", size = 30670749, upload-time = "2025-02-18T18:53:00.062Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3b/4692965e04bb1df55e2c314c4296f1eb12b4f3052d4cf43d29e076aedf66/pyarrow-19.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ee8dec072569f43835932a3b10c55973593abc00936c202707a4ad06af7cb294", size = 32128007, upload-time = "2025-02-18T18:53:06.581Z" }, + { url = "https://files.pythonhosted.org/packages/22/f7/2239af706252c6582a5635c35caa17cb4d401cd74a87821ef702e3888957/pyarrow-19.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5d1ec7ec5324b98887bdc006f4d2ce534e10e60f7ad995e7875ffa0ff9cb14", size = 41144566, upload-time = "2025-02-18T18:53:11.958Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e3/c9661b2b2849cfefddd9fd65b64e093594b231b472de08ff658f76c732b2/pyarrow-19.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ad4c0eb4e2a9aeb990af6c09e6fa0b195c8c0e7b272ecc8d4d2b6574809d34", size = 42202991, upload-time = "2025-02-18T18:53:17.678Z" }, + { url = "https://files.pythonhosted.org/packages/fe/4f/a2c0ed309167ef436674782dfee4a124570ba64299c551e38d3fdaf0a17b/pyarrow-19.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d383591f3dcbe545f6cc62daaef9c7cdfe0dff0fb9e1c8121101cabe9098cfa6", size = 40507986, upload-time = "2025-02-18T18:53:26.263Z" }, + { url = "https://files.pythonhosted.org/packages/27/2e/29bb28a7102a6f71026a9d70d1d61df926887e36ec797f2e6acfd2dd3867/pyarrow-19.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b4c4156a625f1e35d6c0b2132635a237708944eb41df5fbe7d50f20d20c17832", size = 42087026, upload-time = "2025-02-18T18:53:33.063Z" }, + { url = "https://files.pythonhosted.org/packages/16/33/2a67c0f783251106aeeee516f4806161e7b481f7d744d0d643d2f30230a5/pyarrow-19.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:5bd1618ae5e5476b7654c7b55a6364ae87686d4724538c24185bbb2952679960", size = 25250108, upload-time = "2025-02-18T18:53:38.462Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyspark" +version = "3.5.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "py4j" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/ce/81e53e729790556e3983e95de1a7d5df91a34adfcd34b5a5ab0e0c6e9b33/pyspark-3.5.9.tar.gz", hash = "sha256:ea27adc39ddac9413b8951e45aa748cbed6c785971b81386efc41938f6243d93", size = 317858593, upload-time = "2026-07-16T08:52:04.494Z" } + +[[package]] +name = "pytest" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pytz" +version = "2026.3.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/48/fb042503b6ca6cd271261dc559fd6432f7d8c713153e9ec5c591af4dfc1c/pytz-2026.3.post1.tar.gz", hash = "sha256:2211d3fcf9a797d3405cac96ac7f61d80e6a644f72a3309607282fe8a2010c5d", size = 319745, upload-time = "2026-07-25T15:12:07.385Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/7b/39c34ca613b0b198cb866466651b26b045e2009864c5183c979a3b83f383/pytz-2026.3.post1-py2.py3-none-any.whl", hash = "sha256:dd95840dd199baea12d9cc096a1d452caa6596a1c1e4b5f3dbd1541855d5e815", size = 508283, upload-time = "2026-07-25T15:12:05.782Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] + +[[package]] +name = "week13-pyspark-app" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "pyspark" }, +] + +[package.dev-dependencies] +dev = [ + { name = "numpy" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "pytest" }, +] + +[package.metadata] +requires-dist = [{ name = "pyspark", specifier = ">=3.5,<4.0" }] + +[package.metadata.requires-dev] +dev = [ + { name = "numpy", specifier = "==1.26.4" }, + { name = "pandas", specifier = ">=2.0,<3.0" }, + { name = "pyarrow", specifier = ">=12,<20" }, + { name = "pytest", specifier = ">=8,<9" }, +] diff --git a/task-4/screenshots/job_notification.png b/task-4/screenshots/job_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..a155b01e4d9a81a1443538d14c0230d577caa136 GIT binary patch literal 36313 zcmdqJXH=7E_&&&tg&7^dQ30inBGLpzdRGxJfb`IdinP#6=*5Pp2q+Mcu5=QLbO_A` zC=hA@=^{Ne={2zT>&)&syXU`Oejj$vu1CZqZ{GJQcfYUed8VzYN_ULq7!3^#9qQ%{ zT^gE0ZZtH%TmNws-toNQkA+{qdFZNMrzvP-n}rvLZLi(BMnh8+d3^8A5qSNl>rG=1 z8XEdf$j@(0E;;vTXu_RQH?HaXSj-Ox2ehsKI9Q%;jU-);t@3jG%k*^riIB&67mH2U z@zFojX>F4i*rsP5d#=2F9HAGO5N$vk8m++YaoyuC0f*9goG%qxq9ZY2ofF=Fd4pUy{ut>3j)>M)MwLsH>Y+ zShu6r6u}-H8XBseyt>2@A0MB2?%X+{L&zmG1re>S8tigD9cGS)r6aq#x^z9bk@vq- zws+*_)8 z@mLCZ)9(I2nM1Y>DIq@WzpJ#%9QxX}>eIy|PS7G((2?7NHbmn_eJ|1@FInEj3YsQ_ z{qgTDwZ$>|BE{%Szabxq{SnS0j{j+U^uG_^FY_R~L-YQwkL<6p8r`pw%~Z{;I*h#A zal2-RLJ+Dy^#ghJ=C{F0xAY5NKYdb4`}blo#|SUUlxM$YfBgJs~O%JiCKK=Kt zBD1Gqk&$sE8@*J8zrR6|D;|02f2HJo8ek~W$N9Z z`0&E|eUn$OUOf*FM_;@4K;7KStDM8<`){?IBmRw=0{r}4+pE*-ACC*$eSiNz?ba>q z*=bA;h8?+ynS$Yk&u=m6aYAT6KjO(#r^=iLCE|$QBfhGk^z2a;6&1btrrAS7W`Y(q zMzr*79hL_>hSt{Bd5zh5)2@#)NT{_^r%b8~YS>>&BA z5^eh4$B^SP9#bzad~I*nvaqmFNsf$+JbCgYtmgXXQ(9-n3Ka5Ya`s!m+Q(X%1 zp1&4?u=V{BL#fw-iHF;fuV25asi|FI?qhATLeu{%Q!n*FnoCQ?@=Yt+%&c#sP@Rq8 ztY}@`y9LC%1%6Kj1O?O(b<<;vNi#Uq;3RMhu@d?y+em z%Vai$G0#mUx=1w6b*6_}1Z`W7- z?qYQ~mHEt>9Jlet*`H&dgg*TalC=2ZjL7xB|NeUbWMGh~ia~Ktd#V1Q&bfL)VmSDK zIz{oD9AfcCD-D5AiwEv_!bBZbr${Q5ys!rm?6PY!>5-VJ)_9rV{Tg3=So>?s%gfK7 zJrf!6F@`-v6AWfY{Fl(6Bfc^G3m{IgC#kx6df{|ylW~@m544=*;Qdujt4c6OTw8gT z^&>NjIV-oBnVGZyJay5mM^cPK#`EUpkVj;S|DyEd#Kf7&rbtdh6O)9t6nOzug0x2# zJUyMdyEzA9tp`H`F-gPD_0B$^<;Yo=@SN7&TuzeqSX=AXV%@EL^X6*sPIs!9%ZQwn zVzOeeg{W;Cc|20F0Mw+VyIT+Bi0C@@u-vgf4VGa<%o>*HeQiz-ukwu>Fk=$;m%y#D z(1CY%9w93fepa;6I!Ryw|D>{FG{{uIAn)aca85;w0}wTkvGw&n%Q+av%M1BNMb}v+ z9509SO-@Z=hKbmn`h#6Xc6mR2(EF~XpiS9axz9DLZL(83ctkD2StT_`16IS`-QC4J zrZiApU!!@}VXe-5a_TQu_Ly$NU7+JsFtZF;4w?6=-rpTPU|Bub8jr-ieEARR7z0C} zwMg;c0{mrB2&nXR zRRWV1v^zM8IoPLShAN9Je8!Hj!wytcRSnbyR-ZqA{>2^Ba>rcdFs9j#w@L#QE~)e! zaygG5ANKX}nSpmyMBUBIl3-MB@9585zDmo$5i{&;2ycnVdkbMXZSUQif%T3ZcJ9kg z4Z^o2%c@67I1lB3(L;4TI7C}≪U7t<830w|?FMRTGevH9gp^KbTv&bPo1HI~n$3 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 HHqFJ9W_%gcsjsW(85(Y>VV6wK` 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 literal 0 HcmV?d00001 diff --git a/task-4/screenshots/show_grants.png b/task-4/screenshots/show_grants.png new file mode 100644 index 0000000000000000000000000000000000000000..5759d2e331f0bba1110e2f104e38e0762272f1fe GIT binary patch literal 94316 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ԮP@#ILZJpU8pLT@OEOn3B_Jf^ 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

b>O52HYJfg~f>uQz3Q!h`?eYU zhXuVn&K>2B8tdVa=2QE@LD&1~)WhM!l5==F}Y%V{hYdhSn%<;oRsOn4L?%l=~NjHu3|2b7PK% zgb!~!cxg)JT96S%G*{M2_od&@aQd-*iO9bTb$rhp-OqCU>mJbWc<|>v{QLgTpV=n! zpNHW8(|EtdD6?f6&-PyHKZPjI9vwZG<-f)#=9E4&JL?RiG|}|GrFHy&%ff=lstYWj zpMlm!czk>=7(QCP{^u~MR*L47R2HS&l@kc)i0qDgmn!GaJ?^enKM(N_#p9hYQ}-No zd%`aT*)1$`+hPSA0Otu!hNTEhtMee(3w;t9nO0FDp*RyTJUpx%+9;YfTn=kwEAlH* z{|1T@>8z5fPJAJEh zFq6K&O#fLV*gp2Pl?}&PVN(7j^iNjoZOwx9Y--^Xg=8#lmp(Jnvf{mLyOQ6f;@-(= zhqforYng=SsbKY<4QPevmwhPDNyD~k#&#la5uszXd74l#=$r1`@o%C@kyN)IXL5Ig zE&X~jt0#CYu7H=^q%zTT1}z%G1;u-^<)FH z^n?M^_=wbd&$de`f>K2twp{|=I>3_2k=p)y7Z%;xf{2g0&F1mpyF0$DTX{Xrub#XQs=u$ifWOAWf>cHZ8-dj(y_^$>z2zAOmGOmY|; z(N^BJG?t%pSzfk%?PNn&u}l)(ZoQJx=VMMO)|0~7+6H170WpaN<~rwDnv2i8IiHh& zA}Zaq=7G9NJ0l|8aC9%-L9DS)hK)5akKUsgEbpgHjbzjspi0J#)Xtv&@nki}@8k-Q zaGOa^OiUEC{=kbUJwlxZ-X6wyOxODT^AAFTSV1LQZ!J!1#JI^{h zsXmSKSeSiMW^IP<7EO=Km|7kq=HR!NrX%x8YJGi69+Ho#H3mO9Gd%jvbn1K!Vcc>V zCI3@5hGJ*mDy~HAtfDMW1-P9$QCDtIFVAsS7TesBUlu`s%y`shHfs6d=l9_uIsLfq zg&>XZvku{1%*i6cc!2&F>cB7$g~4RszrRy7R+UNOwmO&$r-6BDI=rF?3#SOYA9KN6 z^BM$4zn~x;cm+{KP$1JFsl-vDge@IX=LQ4jCv5k@1 zTyq4IN@X!92b_mvU9mF*?~rzYww4x@4l4@aI*3wI@=HugDl%_ko`8)$665j=N)I8Y z5p^nC6EVgmNkzaRxQ`q$#Jtn{Z9sued|HswR|LIo!F9*Bw zt;zQ)AIQky?6VpW$S9-)DzF8H9gT(mbup~K$r2qMEo9qsu>tr;1?Ej8NVUZ7hy7Uh z+jgZs{#WjC3*=?l{;Pq20t#Zs*o4qu#Zg;7@r85X`pqxj)Z;ez*t%Q1Q2%3lMb$J& zzn?~ZhY){U;JaQ4(D@1#{H6$}x10^1COg(TxgE3a;`e4V&8Qks^I zXzMUE^;32y?G-eMZhyi5Zti%$-n!J!a;o_aQr5v^&dPq_!h3cXX-7y{J_8GEy z=CV2ggk*N_vn~ghF|UpxoSi&8#Y4J{a@i%4j-rk$oAhhE!CsR_u!eF=I4;diEvV4p z9!ccix7-XxY8v-rKT3E4&+XtJsqMBApUZUer1o}&P~dS(noPzUgXd3^Uen3;nGP?A&nmf5JaJfrN;LVAXY>lJ~Wd21LB~n@3IS8bIqUoLo;vTSt z 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≺{7NohU5CR-Va@Y`hT@D`O9xgOoZOU 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 literal 0 HcmV?d00001 diff --git a/task-4/screenshots/streaming_result.png b/task-4/screenshots/streaming_result.png new file mode 100644 index 0000000000000000000000000000000000000000..9ccb8dcc25c147290557f5977d03ee25a3aa1949 GIT binary patch literal 113712 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