From cffc79f2cc774f976f4eb7cc5f9e7564fc3874e8 Mon Sep 17 00:00:00 2001 From: fujistone Date: Fri, 27 Sep 2024 17:32:15 +0200 Subject: [PATCH 1/3] adding models folder in test_lyon --- .gitignore | 1 + .../dbt_utils/.circleci/config.yml | 102 ++ .../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 | 29 + .../workflows/create-table-of-contents.yml | 30 + .../dbt_utils/.github/workflows/stale.yml | 30 + .../.github/workflows/triage-labels.yml | 31 + .../dbt_packages/dbt_utils/.gitignore | 9 + .../dbt_packages/dbt_utils/CHANGELOG.md | 535 ++++++ .../dbt_packages/dbt_utils/CONTRIBUTING.md | 87 + .../test_lyon/dbt_packages/dbt_utils/LICENSE | 201 +++ .../test_lyon/dbt_packages/dbt_utils/Makefile | 24 + .../dbt_packages/dbt_utils/README.md | 1440 +++++++++++++++++ .../dbt_packages/dbt_utils/RELEASE.md | 26 + .../dbt_packages/dbt_utils/dbt_project.yml | 11 + .../dbt_utils/dev-requirements.txt | 9 + .../dbt_packages/dbt_utils/docker-compose.yml | 8 + .../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_packages/dbt_utils/etc/dbt-logo.png | Bin 0 -> 18380 bytes .../dbt_utils/integration_tests/.gitignore | 6 + .../dbt_utils/integration_tests/README.md | 130 ++ .../integration_tests/ci/sample.profiles.yml | 49 + .../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 | 2 + .../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_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 | 71 + .../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 | 259 +++ .../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 | 266 +++ .../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_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_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 | 9 + .../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 | 46 + .../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 | 41 + .../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 | 14 + .../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 | 40 + .../dbt_utils/macros/sql/surrogate_key.sql | 20 + .../dbt_utils/macros/sql/union.sql | 128 ++ .../dbt_utils/macros/sql/unpivot.sql | 66 + .../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 + .../dbt_packages/dbt_utils/pytest.ini | 8 + .../dbt_utils/run_functional_test.sh | 3 + .../dbt_packages/dbt_utils/run_test.sh | 18 + .../dbt_packages/dbt_utils/tests/__init__.py | 0 .../dbt_packages/dbt_utils/tests/conftest.py | 98 ++ projects/test_lyon/dbt_packages/demo | 1 + .../budgets/int_budgets_orders.sql | 13 + .../budgets/int_budgets_projects.sql | 16 + .../components/int_components.sql | 25 + .../intermediate/forms/answers_file.sql | 27 + .../intermediate/forms/answers_matrix.sql | 21 + .../forms/answers_option_and_sorting.sql | 20 + .../forms/answers_short_and_long_answer.sql | 19 + .../intermediate/forms/int_forms_answers.sql | 18 + .../intermediate/meetings/int_meetings.sql | 24 + .../organizations/int_organizations.sql | 29 + .../intermediate/proposals/int_proposals.sql | 25 + .../models/intermediate/scopes/int_scopes.sql | 12 + .../models/intermediate/users/int_users.sql | 47 + .../demo/models/marts/attachments.sql | 15 + .../models/marts/blogs_posts/blogs_posts.sql | 11 + .../demo/models/marts/budgets/budgets.sql | 9 + .../models/marts/budgets/budgets_projects.sql | 33 + .../models/marts/budgets/projects_votes.sql | 28 + .../marts/categorizations/categorizations.sql | 31 + .../demo/models/marts/comments/comments.sql | 94 ++ .../models/marts/components/components.sql | 58 + .../demo/models/marts/debates/debates.sql | 42 + .../marts/endorsements/endorsements.sql | 43 + .../models/marts/followings/followings.sql | 120 ++ .../demo/models/marts/forms/forms.sql | 27 + .../demo/models/marts/forms/forms_answers.sql | 52 + .../demo/models/marts/meetings/meetings.sql | 48 + .../demo/models/marts/organizations.sql | 3 + .../demo/models/marts/participations.sql | 84 + .../demo/models/marts/proposals/proposals.sql | 69 + .../marts/proposals/proposals_votes.sql | 12 + .../demo/models/marts/users/users.sql | 109 ++ .../decidim/areas/stg_decidim_area_types.sql | 12 + .../decidim/areas/stg_decidim_areas.sql | 14 + .../assemblies/stg_decidim_assemblies.sql | 58 + .../blogs_posts/stg_decidim_blogs_posts.sql | 15 + .../decidim/budgets/stg_decidim_budgets.sql | 11 + .../stg_decidim_budgets_line_items.sql | 11 + .../budgets/stg_decidim_budgets_orders.sql | 14 + .../budgets/stg_decidim_budgets_projects.sql | 17 + .../categories/stg_decidim_categories.sql | 15 + .../stg_decidim_categorizations.sql | 14 + .../decidim/debates/stg_decidim_debates.sql | 18 + .../stg_decidim_forms_answer_choices.sql | 15 + .../forms/stg_decidim_forms_answers.sql | 17 + ...stg_decidim_forms_question_matrix_rows.sql | 12 + .../stg_decidim_forms_questionnaires.sql | 18 + .../forms/stg_decidim_forms_questions.sql | 21 + .../stg_decidim_organizations.sql | 23 + .../proposals/stg_decidim_proposals.sql | 14 + ...decidim_proposals_collaborative_drafts.sql | 28 + .../proposals/stg_decidim_proposals_votes.sql | 15 + .../decidim/scopes/stg_decidim_scopes.sql | 17 + .../stg_decidim_accountability_results.sql | 25 + .../decidim/stg_decidim_attachments.sql | 20 + .../decidim/stg_decidim_coauthorships.sql | 18 + .../staging/decidim/stg_decidim_comments.sql | 22 + .../decidim/stg_decidim_components.sql | 19 + .../decidim/stg_decidim_endorsements.sql | 10 + .../staging/decidim/stg_decidim_follows.sql | 14 + .../staging/decidim/stg_decidim_meetings.sql | 23 + .../stg_decidim_meetings_registrations.sql | 16 + .../decidim/stg_decidim_moderations.sql | 18 + ...tg_decidim_participatory_process_steps.sql | 21 + .../stg_decidim_participatory_processes.sql | 16 + .../staging/decidim/stg_decidim_surveys.sql | 12 + .../staging/decidim/stg_decidim_users.sql | 41 + ..._decidim_awesome_proposal_extra_fields.sql | 19 + ...the_correct_xml_information_are_parsed.sql | 32 + ..._decidim_awesome_proposal_extra_fields.sql | 12 + .../participations_with_extended_data.sql | 9 + ..._decidim_awesome_proposal_extra_fields.sql | 11 + projects/test_lyon/target/graph.gpickle | Bin 0 -> 267456 bytes projects/test_lyon/target/graph_summary.json | 1 + projects/test_lyon/target/manifest.json | 1 + .../test_lyon/target/partial_parse.msgpack | Bin 0 -> 1023822 bytes .../budgets/int_budgets_orders.sql | 25 + .../budgets/int_budgets_projects.sql | 28 + .../components/int_components.sql | 37 + .../intermediate/forms/answers_file.sql | 39 + .../intermediate/forms/answers_matrix.sql | 33 + .../forms/answers_option_and_sorting.sql | 32 + .../forms/answers_short_and_long_answer.sql | 31 + .../intermediate/forms/int_forms_answers.sql | 30 + .../intermediate/meetings/int_meetings.sql | 36 + .../organizations/int_organizations.sql | 41 + .../intermediate/proposals/int_proposals.sql | 37 + .../models/intermediate/scopes/int_scopes.sql | 24 + .../models/intermediate/users/int_users.sql | 59 + .../run/demo/models/marts/attachments.sql | 27 + .../models/marts/blogs_posts/blogs_posts.sql | 23 + .../run/demo/models/marts/budgets/budgets.sql | 21 + .../models/marts/budgets/budgets_projects.sql | 45 + .../models/marts/budgets/projects_votes.sql | 40 + .../marts/categorizations/categorizations.sql | 43 + .../demo/models/marts/comments/comments.sql | 106 ++ .../models/marts/components/components.sql | 70 + .../run/demo/models/marts/debates/debates.sql | 54 + .../marts/endorsements/endorsements.sql | 55 + .../models/marts/followings/followings.sql | 132 ++ .../run/demo/models/marts/forms/forms.sql | 39 + .../demo/models/marts/forms/forms_answers.sql | 64 + .../demo/models/marts/meetings/meetings.sql | 60 + .../run/demo/models/marts/organizations.sql | 15 + .../run/demo/models/marts/participations.sql | 96 ++ .../demo/models/marts/proposals/proposals.sql | 81 + .../marts/proposals/proposals_votes.sql | 24 + .../run/demo/models/marts/users/users.sql | 121 ++ .../decidim/areas/stg_decidim_area_types.sql | 24 + .../decidim/areas/stg_decidim_areas.sql | 26 + .../assemblies/stg_decidim_assemblies.sql | 70 + .../blogs_posts/stg_decidim_blogs_posts.sql | 27 + .../decidim/budgets/stg_decidim_budgets.sql | 23 + .../stg_decidim_budgets_line_items.sql | 23 + .../budgets/stg_decidim_budgets_orders.sql | 26 + .../budgets/stg_decidim_budgets_projects.sql | 29 + .../categories/stg_decidim_categories.sql | 27 + .../stg_decidim_categorizations.sql | 26 + .../decidim/debates/stg_decidim_debates.sql | 30 + .../stg_decidim_forms_answer_choices.sql | 27 + .../forms/stg_decidim_forms_answers.sql | 29 + ...stg_decidim_forms_question_matrix_rows.sql | 24 + .../stg_decidim_forms_questionnaires.sql | 30 + .../forms/stg_decidim_forms_questions.sql | 33 + .../stg_decidim_organizations.sql | 35 + .../proposals/stg_decidim_proposals.sql | 26 + ...decidim_proposals_collaborative_drafts.sql | 40 + .../proposals/stg_decidim_proposals_votes.sql | 27 + .../decidim/scopes/stg_decidim_scopes.sql | 29 + .../stg_decidim_accountability_results.sql | 37 + .../decidim/stg_decidim_attachments.sql | 32 + .../decidim/stg_decidim_coauthorships.sql | 30 + .../staging/decidim/stg_decidim_comments.sql | 34 + .../decidim/stg_decidim_components.sql | 31 + .../decidim/stg_decidim_endorsements.sql | 22 + .../staging/decidim/stg_decidim_follows.sql | 26 + .../staging/decidim/stg_decidim_meetings.sql | 35 + .../stg_decidim_meetings_registrations.sql | 28 + .../decidim/stg_decidim_moderations.sql | 30 + ...tg_decidim_participatory_process_steps.sql | 33 + .../stg_decidim_participatory_processes.sql | 28 + .../staging/decidim/stg_decidim_surveys.sql | 24 + .../staging/decidim/stg_decidim_users.sql | 53 + ..._decidim_awesome_proposal_extra_fields.sql | 31 + ...the_correct_xml_information_are_parsed.sql | 77 + .../participations_with_extended_data.sql | 21 + ..._decidim_awesome_proposal_extra_fields.sql | 23 + projects/test_lyon/target/run_results.json | 1 + .../test_lyon/target/semantic_manifest.json | 1 + 377 files changed, 12352 insertions(+) create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/.circleci/config.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/.github/CODEOWNERS create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/dbt_minor_release.md create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/utils_minor_release.md create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/.github/pull_request_template.md create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/.github/workflows/create-table-of-contents.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/.github/workflows/stale.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/.github/workflows/triage-labels.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/.gitignore create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/CHANGELOG.md create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/CONTRIBUTING.md create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/LICENSE create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/Makefile create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/README.md create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/RELEASE.md create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/dbt_project.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/dev-requirements.txt create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/docker-compose.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/docs/decisions/README.md create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/docs/decisions/adr-0000-documenting-architecture-decisions.md create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/docs/decisions/adr-0001-decision-record-format.md create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/docs/decisions/adr-0002-cross-database-utils.md create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/etc/dbt-logo.png create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/.gitignore create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/README.md create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/ci/sample.profiles.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/.gitkeep create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/datetime/data_date_spine.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/etc/data_people.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/geo/data_haversine_km.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/geo/data_haversine_mi.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_cardinality_equality_a.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_cardinality_equality_b.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_not_null_proportion.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_accepted_range.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_at_least_one.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equal_rowcount.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_a.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_b.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_a.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_b.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_columns_a.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_columns_b.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_expression_is_true.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_fewer_rows_than_table_1.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_fewer_rows_than_table_2.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_no_gaps.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_with_gaps.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_with_gaps_zero_length.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_not_accepted_values.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_not_constant.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_relationships_where_table_1.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_relationships_where_table_2.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_sequential_timestamps.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_sequential_values.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_unique_combination_of_columns.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/schema.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_deduplicate.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_deduplicate_expected.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180101.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180102.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180103.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_filtered_columns_in_relation.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_filtered_columns_in_relation_expected.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_generate_series.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_generate_surrogate_key.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_dropped.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_where.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_where_expected.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_query_results_as_dict.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_single_value.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_nullcheck_table.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot_expected.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot_expected_apostrophe.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_add.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide_denominator_expressions.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide_numerator_expressions.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_subtract.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_aggregate.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_aggregate_expected.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_expected.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_prefix_suffix_expected.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_quote_identifiers.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_events_expected.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_exclude_expected.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_expected.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_table_1.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_table_2.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_bool.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_bool_expected.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_expected.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_original_api_expected.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_width_bucket.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/web/data_url_host.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/web/data_url_path.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/web/data_urls.csv create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/dbt_project.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/macros/.gitkeep create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/macros/assert_equal_values.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/macros/limit_zero.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/macros/tests.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/datetime/schema.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/datetime/test_date_spine.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/equality_less_columns.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/recency_time_excluded.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/recency_time_included.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/schema.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_equal_column_subset.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_equal_rowcount.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_fewer_rows_than.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/geo/schema.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/geo/test_haversine_distance_km.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/geo/test_haversine_distance_mi.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/schema.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_deduplicate.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_generate_series.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_generate_surrogate_key.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_column_values.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_column_values_where.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_filtered_columns_in_relation.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_relations_by_pattern.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_relations_by_prefix_and_union.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_single_value.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_single_value_default.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_groupby.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_not_empty_string_failing.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_not_empty_string_passing.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_nullcheck_table.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_pivot.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_pivot_apostrophe.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_add.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_divide.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_subtract.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_aggregate.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_no_columns.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_prefix_suffix.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_quote_identifiers.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_uppercase.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_base.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_base_lowercase.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_base_uppercase.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_lowercase.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_uppercase.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_no_source_column.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_where.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_where_base.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot_bool.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_width_bucket.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/web/schema.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/web/test_url_host.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/web/test_url_path.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/web/test_urls.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/packages.yml create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/assert_get_query_results_as_dict_objects_equal.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/generic/expect_table_columns_to_match_set.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/assert_pretty_output_msg_is_string.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/assert_pretty_time_is_string.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/test_slugify.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/sql/test_get_column_values_use_default.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/sql/test_get_single_value_multiple_rows.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/accepted_range.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/at_least_one.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/cardinality_equality.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/equal_rowcount.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/equality.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/expression_is_true.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/fewer_rows_than.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/mutually_exclusive_ranges.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/not_accepted_values.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/not_constant.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/not_empty_string.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/not_null_proportion.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/recency.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/relationships_where.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/sequential_values.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/unique_combination_of_columns.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/_is_ephemeral.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/_is_relation.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/log_info.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/pretty_log_format.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/pretty_time.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/slugify.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/date_spine.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/deduplicate.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/generate_series.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/generate_surrogate_key.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_column_values.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_filtered_columns_in_relation.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_query_results_as_dict.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_relations_by_pattern.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_relations_by_prefix.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_single_value.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_table_types_sql.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_tables_by_pattern_sql.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_tables_by_prefix_sql.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/groupby.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/haversine_distance.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/nullcheck.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/nullcheck_table.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/pivot.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/safe_add.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/safe_divide.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/safe_subtract.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/star.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/surrogate_key.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/union.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/unpivot.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/sql/width_bucket.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/web/get_url_host.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/web/get_url_parameter.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/macros/web/get_url_path.sql create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/pytest.ini create mode 100755 projects/test_lyon/dbt_packages/dbt_utils/run_functional_test.sh create mode 100755 projects/test_lyon/dbt_packages/dbt_utils/run_test.sh create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/tests/__init__.py create mode 100644 projects/test_lyon/dbt_packages/dbt_utils/tests/conftest.py create mode 120000 projects/test_lyon/dbt_packages/demo create mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_orders.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_projects.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/components/int_components.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_file.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_matrix.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_option_and_sorting.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_short_and_long_answer.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/forms/int_forms_answers.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/meetings/int_meetings.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/organizations/int_organizations.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/proposals/int_proposals.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/scopes/int_scopes.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/users/int_users.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/attachments.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/blogs_posts/blogs_posts.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets_projects.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/budgets/projects_votes.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/categorizations/categorizations.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/comments/comments.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/components/components.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/debates/debates.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/endorsements/endorsements.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/followings/followings.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/forms/forms.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/forms/forms_answers.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/meetings/meetings.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/organizations.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/participations.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals_votes.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/marts/users/users.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_area_types.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_areas.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categories.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/debates/stg_decidim_debates.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_accountability_results.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_attachments.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_coauthorships.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_comments.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_components.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_endorsements.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_follows.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_moderations.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_processes.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_surveys.sql create mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_users.sql create mode 100644 projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql create mode 100644 projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql create mode 100644 projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/stg_decidim_awesome_proposal_extra_fields.sql create mode 100644 projects/test_lyon/target/compiled/test_lyon/models/marts/participations_with_extended_data.sql create mode 100644 projects/test_lyon/target/compiled/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql create mode 100644 projects/test_lyon/target/graph.gpickle create mode 100644 projects/test_lyon/target/graph_summary.json create mode 100644 projects/test_lyon/target/manifest.json create mode 100644 projects/test_lyon/target/partial_parse.msgpack create mode 100644 projects/test_lyon/target/run/demo/models/intermediate/budgets/int_budgets_orders.sql create mode 100644 projects/test_lyon/target/run/demo/models/intermediate/budgets/int_budgets_projects.sql create mode 100644 projects/test_lyon/target/run/demo/models/intermediate/components/int_components.sql create mode 100644 projects/test_lyon/target/run/demo/models/intermediate/forms/answers_file.sql create mode 100644 projects/test_lyon/target/run/demo/models/intermediate/forms/answers_matrix.sql create mode 100644 projects/test_lyon/target/run/demo/models/intermediate/forms/answers_option_and_sorting.sql create mode 100644 projects/test_lyon/target/run/demo/models/intermediate/forms/answers_short_and_long_answer.sql create mode 100644 projects/test_lyon/target/run/demo/models/intermediate/forms/int_forms_answers.sql create mode 100644 projects/test_lyon/target/run/demo/models/intermediate/meetings/int_meetings.sql create mode 100644 projects/test_lyon/target/run/demo/models/intermediate/organizations/int_organizations.sql create mode 100644 projects/test_lyon/target/run/demo/models/intermediate/proposals/int_proposals.sql create mode 100644 projects/test_lyon/target/run/demo/models/intermediate/scopes/int_scopes.sql create mode 100644 projects/test_lyon/target/run/demo/models/intermediate/users/int_users.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/attachments.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/blogs_posts/blogs_posts.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/budgets/budgets.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/budgets/budgets_projects.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/budgets/projects_votes.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/categorizations/categorizations.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/comments/comments.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/components/components.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/debates/debates.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/endorsements/endorsements.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/followings/followings.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/forms/forms.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/forms/forms_answers.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/meetings/meetings.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/organizations.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/participations.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/proposals/proposals.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/proposals/proposals_votes.sql create mode 100644 projects/test_lyon/target/run/demo/models/marts/users/users.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_area_types.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_areas.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categories.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/debates/stg_decidim_debates.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_accountability_results.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_attachments.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_coauthorships.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_comments.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_components.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_endorsements.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_follows.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_moderations.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_processes.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_surveys.sql create mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_users.sql create mode 100644 projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql create mode 100644 projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql create mode 100644 projects/test_lyon/target/run/test_lyon/models/marts/participations_with_extended_data.sql create mode 100644 projects/test_lyon/target/run/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql create mode 100644 projects/test_lyon/target/run_results.json create mode 100644 projects/test_lyon/target/semantic_manifest.json diff --git a/.gitignore b/.gitignore index 86cba71f..27020d58 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .vscode/ .user.yml .env +.venv .idea .DS_Store package-lock.yml diff --git a/projects/test_lyon/dbt_packages/dbt_utils/.circleci/config.yml b/projects/test_lyon/dbt_packages/dbt_utils/.circleci/config.yml new file mode 100644 index 00000000..057d9c83 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/.circleci/config.yml @@ -0,0 +1,102 @@ + +version: 2.1 + +jobs: + + integration-postgres: + docker: + - image: cimg/python:3.9 + - image: cimg/postgres:9.6 + environment: + POSTGRES_USER: root + environment: + POSTGRES_TEST_HOST: localhost + POSTGRES_TEST_USER: root + POSTGRES_TEST_PASS: '' + POSTGRES_TEST_PORT: 5432 + POSTGRES_TEST_DBNAME: circle_test + + 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.9 + 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.9 + 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.9 + steps: + - checkout + - run: pip install --pre dbt-bigquery -r dev-requirements.txt + - run: + name: "Set up credentials" + command: echo $BIGQUERY_SERVICE_ACCOUNT_JSON > ${HOME}/bigquery-service-key.json + - 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 + - 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/projects/test_lyon/dbt_packages/dbt_utils/.github/CODEOWNERS b/projects/test_lyon/dbt_packages/dbt_utils/.github/CODEOWNERS new file mode 100644 index 00000000..0f944340 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/.github/CODEOWNERS @@ -0,0 +1 @@ +* @clrcrl diff --git a/projects/test_lyon/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/bug_report.md b/projects/test_lyon/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..dba969e0 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/dbt_minor_release.md b/projects/test_lyon/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/dbt_minor_release.md new file mode 100644 index 00000000..334a4b36 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/feature_request.md b/projects/test_lyon/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..7f883550 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/utils_minor_release.md b/projects/test_lyon/dbt_packages/dbt_utils/.github/ISSUE_TEMPLATE/utils_minor_release.md new file mode 100644 index 00000000..4de914e5 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/.github/pull_request_template.md b/projects/test_lyon/dbt_packages/dbt_utils/.github/pull_request_template.md new file mode 100644 index 00000000..9f53b7a2 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/.github/pull_request_template.md @@ -0,0 +1,29 @@ +resolves # + +This is a: +- [ ] documentation update +- [ ] bug fix with no breaking changes +- [ ] new functionality +- [ ] a breaking change + +All pull requests from community contributors should target the `main` branch (default). + +## Description & motivation + + +## Checklist +- [ ] This code is associated with an Issue which has been triaged and [accepted for development](https://docs.getdbt.com/docs/contributing/oss-expectations#pull-requests). +- [ ] I have verified that these changes work locally on the following warehouses (Note: it's okay if you do not have access to all warehouses, this helps us understand what has been covered) + - [ ] BigQuery + - [ ] Postgres + - [ ] Redshift + - [ ] Snowflake +- [ ] I followed guidelines to ensure that my 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 `dbt.type_*` macros instead of explicit datatypes (e.g. `dbt.type_timestamp()` instead of `TIMESTAMP` +- [ ] I have updated the README.md (if applicable) +- [ ] I have added tests & descriptions to my models (and macros if applicable) +- [ ] I have added an entry to CHANGELOG.md diff --git a/projects/test_lyon/dbt_packages/dbt_utils/.github/workflows/create-table-of-contents.yml b/projects/test_lyon/dbt_packages/dbt_utils/.github/workflows/create-table-of-contents.yml new file mode 100644 index 00000000..ddcda67e --- /dev/null +++ b/projects/test_lyon/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@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@v4 + with: + commit_message: Auto update table of contents diff --git a/projects/test_lyon/dbt_packages/dbt_utils/.github/workflows/stale.yml b/projects/test_lyon/dbt_packages/dbt_utils/.github/workflows/stale.yml new file mode 100644 index 00000000..75a14dd4 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/.github/workflows/triage-labels.yml b/projects/test_lyon/dbt_packages/dbt_utils/.github/workflows/triage-labels.yml new file mode 100644 index 00000000..0f88157b --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/.gitignore b/projects/test_lyon/dbt_packages/dbt_utils/.gitignore new file mode 100644 index 00000000..d155937f --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/.gitignore @@ -0,0 +1,9 @@ + +target/ +dbt_modules/ +dbt_packages/ +logs/ +venv/ +env/ +test.env +__pycache__ \ No newline at end of file diff --git a/projects/test_lyon/dbt_packages/dbt_utils/CHANGELOG.md b/projects/test_lyon/dbt_packages/dbt_utils/CHANGELOG.md new file mode 100644 index 00000000..16e296f7 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/CHANGELOG.md @@ -0,0 +1,535 @@ +# Unreleased + +**Full Changelog**: https://github.com/dbt-labs/dbt-utils/compare/1.2.0...main + +# 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 + +# 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 + + +# dbt utils v1.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.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/projects/test_lyon/dbt_packages/dbt_utils/CONTRIBUTING.md b/projects/test_lyon/dbt_packages/dbt_utils/CONTRIBUTING.md new file mode 100644 index 00000000..1cfd8a21 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/CONTRIBUTING.md @@ -0,0 +1,87 @@ +# 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) + +## 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 + +Unlike `dbt-core`, we edit the `CHANGELOG.md` directly. + +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/projects/test_lyon/dbt_packages/dbt_utils/LICENSE b/projects/test_lyon/dbt_packages/dbt_utils/LICENSE new file mode 100644 index 00000000..d807259a --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/Makefile b/projects/test_lyon/dbt_packages/dbt_utils/Makefile new file mode 100644 index 00000000..ead2355b --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/Makefile @@ -0,0 +1,24 @@ +.DEFAULT_GOAL:=help + +.PHONY: test +test: ## Run the integration tests. + @./run_test.sh $(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/projects/test_lyon/dbt_packages/dbt_utils/README.md b/projects/test_lyon/dbt_packages/dbt_utils/README.md new file mode 100644 index 00000000..9dd888e2 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/README.md @@ -0,0 +1,1440 @@ +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 + +### 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: + 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: + 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: + compare_model: ref('other_table_name') + + # only compare some of the columns + - name: model_name_compare_columns + tests: + - dbt_utils.equality: + 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: + 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: + 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: + 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: + expression: '>= 1' + - name: col_b + tests: + - dbt_utils.expression_is_true: + 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: + 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. + +**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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + interval: 2 + + + - name: util_hours + columns: + - name: date_hour + tests: + - dbt_utils.sequential_values: + 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 (as discussed [here](https://docs.getdbt.com/docs/building-a-dbt-project/testing-and-documentation/testing/#testing-expressions)). + +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: + 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: + 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: + min_value: 0 + inclusive: false + + - name: account_created_at + tests: + - dbt_utils.accepted_range: + max_value: "getdate()" + #inclusive is true by default + + - name: num_returned_orders + tests: + - dbt_utils.accepted_range: + min_value: 0 + max_value: "num_orders" + + - name: num_web_sessions + tests: + - dbt_utils.accepted_range: + 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() +- fewer_rows_than() +- recency() +- at_least_one() +- not_constant() +- sequential_values() +- not_null_proportion() + +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: + 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"`). + +**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') }} + +``` + +### 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 + +### 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/projects/test_lyon/dbt_packages/dbt_utils/RELEASE.md b/projects/test_lyon/dbt_packages/dbt_utils/RELEASE.md new file mode 100644 index 00000000..ac542676 --- /dev/null +++ b/projects/test_lyon/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`, commit, and merge into the `main` branch +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/projects/test_lyon/dbt_packages/dbt_utils/dbt_project.yml b/projects/test_lyon/dbt_packages/dbt_utils/dbt_project.yml new file mode 100644 index 00000000..b3dd3964 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/dbt_project.yml @@ -0,0 +1,11 @@ +name: 'dbt_utils' +version: '0.1.0' + +require-dbt-version: [">=1.3.0", "<2.0.0"] + +config-version: 2 + +target-path: "target" +clean-targets: ["target", "dbt_modules", "dbt_packages"] +macro-paths: ["macros"] +log-path: "logs" diff --git a/projects/test_lyon/dbt_packages/dbt_utils/dev-requirements.txt b/projects/test_lyon/dbt_packages/dbt_utils/dev-requirements.txt new file mode 100644 index 00000000..6ddd9858 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/dev-requirements.txt @@ -0,0 +1,9 @@ +pytest +pytest-dotenv +dbt-core@git+https://github.com/dbt-labs/dbt-core.git#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-postgres.git +dbt-redshift@git+https://github.com/dbt-labs/dbt-redshift.git +dbt-snowflake@git+https://github.com/dbt-labs/dbt-snowflake.git +dbt-bigquery@git+https://github.com/dbt-labs/dbt-bigquery.git +pytest-xdist diff --git a/projects/test_lyon/dbt_packages/dbt_utils/docker-compose.yml b/projects/test_lyon/dbt_packages/dbt_utils/docker-compose.yml new file mode 100644 index 00000000..6957ffe8 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/docker-compose.yml @@ -0,0 +1,8 @@ +version: "3.7" +services: + postgres: + image: cimg/postgres:9.6 + environment: + - POSTGRES_USER=root + ports: + - "5432:5432" diff --git a/projects/test_lyon/dbt_packages/dbt_utils/docs/decisions/README.md b/projects/test_lyon/dbt_packages/dbt_utils/docs/decisions/README.md new file mode 100644 index 00000000..6819fe2b --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/docs/decisions/adr-0000-documenting-architecture-decisions.md b/projects/test_lyon/dbt_packages/dbt_utils/docs/decisions/adr-0000-documenting-architecture-decisions.md new file mode 100644 index 00000000..036e814c --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/docs/decisions/adr-0001-decision-record-format.md b/projects/test_lyon/dbt_packages/dbt_utils/docs/decisions/adr-0001-decision-record-format.md new file mode 100644 index 00000000..da2f6127 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/docs/decisions/adr-0002-cross-database-utils.md b/projects/test_lyon/dbt_packages/dbt_utils/docs/decisions/adr-0002-cross-database-utils.md new file mode 100644 index 00000000..db8b9d04 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/etc/dbt-logo.png b/projects/test_lyon/dbt_packages/dbt_utils/etc/dbt-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b3112c0ec7894cc4574af8e86961157e4e388773 GIT binary patch literal 18380 zcmaHSWn7!j(kSk3#R={X1wwFlD_$hHLve3$cZcHc?pj=0T#6KTFYes@&wI{$&xiZF z`H<}MWNc?=W@mS2BUF`T&{2p{prD}8A31BDFRI$?b*Qpz_5ARJ3+9a zpghAva@@5c(8eJvpG6jvU3Uu2(WW-v2$^;LLgXOyc}G?o~#Zo)c>I%Y3^d` zZ0+P~?dSmbha%X-(alwe3L@$Mbiv+9N$GzHJGlH?Q4p1}dxD+VIoUYa?d|{R*T0}$ zT-DA0uNePNXqQi3PUh_D<}QwI&Zdy@u%P}AGDLU(e@6cSG&B8QI43t}yMOi5%#_{S z&fMPI!PNyK6z9Jrf=CWjakhpGAlOdQ(bVmqf8`{FsNCGF&49d;TpauYTs#8Y;?k1h zoSXujJYxL30vwXuoV*}{AWD>EwQ}KamC9LRZ>Bws3=xpun2(eTwn0w z{}=Ipz5Xv#{tqO?KmKX{uVX?U{@1n59U%Vf3~^jgH+&crl!T$2q}V6Vl~V&mUyX(P zuiS!1>p=wa3IVAz&|GFHRDmR|3@8qNOW*Lt%oql$H`faaSn%PcLK-Y5Sds}2*E@f$ zKjvo95z5b6xczwb7q0bES_fV9Tz4Pje345UlVmaMO4n&HLk44ZKTvHcfoJ$O$jNZwzn?#7jd^JYlyU zAJl2ewGM9|pP6l19XnL7c2fHz6=R@9$kEWyE&^R80aT&1IT2^?ec9Oc@2J~Xh$M>A zFv+;kyI-(br1Ia<@tKD59TnKR5GUx`4a168kO@h5KYV02?`t%rmN>_qc5TDRiG$8j znb4s9ITZmrH6oh6TWXW_kzF{s+fG~eR+mKp4J{gjHr_0v_q`J~%rEB{*D32~9^y7f zi=E=ixwQdjMntg6oMcUv*Xp>-a_yU;ZeoPgDkl>5~i+e6veK+`>ixrs{6wB*Lij$l4IQrygn&7u zaPzo{{Rl7=p02t%8L#VjI5{}FlmYplg)KE_c~AU^K5ByJ-%F!N6J(gJq7lUNml`!B zsB_=!2ZO7Y5YhZ*a|g`p(uD>F%cg_v`C{IW3hS*`1L3<|%e9ucKJR_wuv@C0!my9K z^RbbAi3}M)6#iBm3F!qs45#k!WEyQr50~hvp!7O|SNuL^l7v)EK@yjJ}zagDkdhlL;Xv z=YNmgB$47oPS19m?0aKK-*?jUrr}tw?kKnF1{EX_*BWzAN+`kJ?w|qb&E3q%sj`o)jPTYbPySF3dyc>=& zAG+vC$a*zQ5N8|O?j>!#k08I3U+JSo_D>v>?+y^v3R}2xp)utQqf}nteQn8jWYB%Q znXF1nh#MeaFQQp*bv3(cMahnJ=fAtXtwfHL5#t8We5EY(qnOduXBT`1tKbIgM?|s|dlwUV<#w2DDc?#s z(!Pd8+WoTJDvjaieG;?NP%hlU0n?eY5P578N}aunk|ir#XrsE z8kDZ;UeR@#e*sys*;5q_xqWYXZmCCVh<8su`12x@?@fY)>n?7e9kQA(j*1>M0TeDe zHPu}!RG4t&3bSI*5al5Y{*-coBpS_;F8fg z%jeto%iO<9XFhcvYi5~USHNLEUrAx3IEo(6>v>L@SqYd6=>cU6=N4S1Gc+&2&25Tg zv)iPYm_Ma>D)@|+G%yp>}w&j)AVS9!12c@>;@7i$laBX$O^+wYt zNr=A3^F9`KDn8?yO=hgO-j7Nm>kg4eJ$W5W^6!j zuu1~yy&{Zou`@ykcsP=BI~-3*g3=y7$L2=I>`46EscZ^IlPj{V~9+aFYX;RYp9;of1x2GC4IqGnwyz+=}1UhS*9{9qm~YUk5FJ=xbU`)dC104tJ)?_by3^8^)Ea8xfw zY3dLYoiR~d=44-a$XYs97-O&YN@q+v_H*5jKqV%;?O?~nE2^i>>FvOxPTd!Lsa#jm@9fdyar_I99QI3;<_}hRM1jsnv_H>d!mq-fO&%}|kg?)o_NpEW z1%c{7r;M_N0$BzMNQ6NDu{<%6KiG38`Ftw5hHd3VyRshmR&DW9UUcOf-@|Zx*s&TE z%W&|z%Cn!{(?C@l6MYp#SclxVzv6#rB(S4MdFE54Guh&REB#b;F7CFEl{yt{**3NF zPN3vJM~x1U!PKADelewh2j*tMQPH2`{}^bq0pA56S!MF)tL;0MGd=6ba=YW>6CcMP zxdpG3(c_7dj{c3YVNOui!997P6AQY#$%~4%qC86p zhb%{YN%Bz4ZF^t-@v0Sci&t?dd-b3~+oTgIdNs<3Nq`v8AE0?@9S350uUP*z?)NJ^ ztoEO%MvFCDkg*Q(uqhrlE;D18&FA74P`6;?|7k#pxoRIz3#WxCNXc?j&Wby1$w~p- zE$0wh3VT%!M^pMO?ANby5hwqLfNHn+qji(TNd$x^;GG)N^6tI%6j`Bag7uN3unqWu z?<*vP#32txHa6^c)J9ISN=e}w5KDha1<6{*S=%J_;jxCm59G+5wt64z$~}`Gt@46< z|Mr;Vs*Dt|uk$>vP&10Xc~GJ%*>bdec9y}=7XV;3WSh=Rb6PFhFt77FyVE*6L7df) z7Asf<<*J8CYbKOG)3rMbWcPnCV=BaYgT&)Rc;;A}qAQD63w|kv1kTw`8DNIINC%EHXY`Mm> zm0N5bw0LC=B!47RBrw7{+U)3Dxe^uKTc6?`jjaKCpOdVeLJ}@uuqc*46YIl)lf;>0 z3$l$vQrL&k>hEe@qxH4$3Y+Ka^|cmj9E>hr$MG^ILsS8+aBc=>I=#O%hJD}m+P0o? zUVUpM(0EZ}bd18Z5ShYXl2DXL{)riqhlrpC`$tFQPiVN4hR8bsz6-uTj4Wscod2@;!H=-=v01 zijo$V4oR-@0a+dhc#I+iSeEeBFA=;vjlBSQb$|TKn|pne4C=`Ey#AF5V+DV$V4id+ zXLvm<2|qkYPmf?koQAGP(=3QIrgL#}0yhl}5O1<2>}-|Be#m((PB9 zfOyot7eI9yO_$`n{NwwhH#NrUP+#969E=zgv)SWAe4UR~B3ftFt`r|-T+3p@wu}Ha zjg*s#WdDsP#g`|8FPy>9c;(`?X-sI|M0TNx^{R{n0TgM}V8+BSs*dTN{WX;A$$Z*{ zY_feV+38@719_2`)-oncJ`YH5m8s+Bekq|F;eFS?^6meoQtX}WvMc5(OCJ238YXeY zg}oo`Rju?$5lKZWjK^I62T`e^h_|IWo-Ai+`3z|N8|5`_-^zO4YU0D$#4xxMlDxv` zUZV{>)U&Kc4Q!!7!eWr|k-mn;b(>ywO+TCoV&!D+>(gCXx&S3;eR@JZ4)>4c?{Q63 zDB33?dnANc$}vcCaCzB9rcC~k3(uKwdxyGRVUl;0`0q(vz!u0Vv*a5~|2KwhW4SmPJ5%{&D8gr2?faj#CgU_YW=!wDnp?5_K9@IGtJ~yB}C-u643v0h+ z#%s~1(KPG+^1$+smaPD-suYH*+;f7CEyWb|DvM;i?MRz|&L=m(H|JsjEX|43`sa z7z`!S@~VxteOEOEhiyW_vqV|`czE0DXggc5v1foN*4={E!JE3?OMbfjfYp(4SUX<| zeghrWSw}482*aVL7cde*BL1Y#x42estmCtTzrw+oHS=UK;dh{u%ci;8$2D<6d z&@A%?sGKmPnMr!HeZ2RQFT;JrB0@=!G)i^J*GXH%-^D2;)G8N0@z^wds7S5|bkSH`)z$L{ED&T+FOCLmy@8VPQz5%r*_ zM+j)4%x@H5V9)z%&({K)9wLmUGY!W~iwVhX+Y;{)@WDdA$~#gixk2gO?GhzD_HHiO zv@5*1Tp!Oo`--o9`m@Hdf+dAnv+nyCL!~fmmfwd1W&)*X6fz-Rx|f=Stsi`m{Lvzr zvg6Z{vcOre|Cbs}HU$xL3m+jCdS6DA~5B1Ww#f5IT`nAE0D2eAK%fCjgx*+ zS-c1c(w5(xElYEwqFOF0tJj0~hnzA&pH&|WG7i9Q^M#$F&4sGJog3TD1hF}oKo93C z!^Mt*o+CxDsB?&uNSj~S1qK7gR~kw^%&SQ|tw*NgRIDo=zsFaanOwAHW?8bZ#V!$etE1g>)iWzo(UL?}bbUv25aV^7LC~XjKXo z&RAhEq>TGr>Tajxa7ksPVc3w+3~-Q>!JcOYKVN*QA8^=klXlZw-@ls0ya+$PEok4| z)J#4IpsTl;w~8RFxB8ie8+MV2gZsAL^-52WGL|C0YJj1+pt;uOb-!~@Km7LeG`g!9 z;HwbZ1I?oZsOw0IXTJQ4kA4KtNjsw{JCMSc>Y6AN5@lk zWvD3DIwk#y+^g-Ev|eX^V?j$Aq{rpod!cDWqxo8|T#NxcA}3_BeM- zC)LDW=l8&`4HYLczC4s}x8dP^K0g}?GeNDOX`u7>_wO1nKSV+_59-J7GjT{UCrm{F zO9SsFKC~=rP>3nRP=;9ir<>izZXtjvkzkO?s(Y4`c?u z3{jo@4EZwvR(7@U!kK@GkE2l>RC#_3RqH&!kW05w(Xu?wA}M)kI9ab%`S4SsotQ_; zTag@%rwf=;Vz-rZ%2$7UPikymBq=TJfQ*5$4%yN}WcX0e%e_oehZAZ)e2p*O!EcbhG^qdh826g>IQ-I0e~#S{ok=Gb zC#x|!J7_s_ZNzG$#RI;*P`k+ZwtnqflqagD)SZ~@Lm!VwL`?jIo;%fBN_`@&i&xDL z02s&g_P+11oyQg!4F1s!746^!X0yFl(8SYKYrU^8e^2A*`NKJ&B~(_yHvVe0c=#Ls z2(||vC*vsIHE#cv$8joR6`oXDE~!ZW{+Brep1ALB_CULB9kC0AC}HB|&CNEhevrfQ9;yk)1!Gl{FnwDg&=sbIM>ENc18Cs2`GHKfjikLB@ z5v`w#lA-bYs`1$@Q37Xdd=>chqC6~t`n&7ai!X-KDSPGWrHk?yTh;g)?2T-@C^<=< z2aq@^%=U@o6=Eql>^KoQ7bwe=3V{V>vUQS%Zq6Tge230zVBk-79yFBzNIn&nQ}(RP z`Z1(~e`XH0oU&c-yX==*#MP{Mq@JpX`EJ4(>P2^D9WKoF-yU8w`lWE#PUauS2o5?; zew?4eBY@VnKL!Q{uESrYe;XUn{9|8neSHm?5g&=r3@l#?4iFZnsEvj0+zT23bb^8s zGw@bCnWvRGqFAXppxaQzT4ooXnywxrBvDZo>6I#`^TG zrO+MHIhlQ$jus-yZc`ZG z>*qS#`2!|r;KPNalE$yZ*V0@Z7gBvnE0fB5?rX#DX@(JS=ea(GOTG;84l7Lkyr;7l zOG5YOzrd4EYT?(Su@Ej`PhQM>LqK(ztSX5mSR`aN3NDW4YWT!pTETr z$AI_B=h*!|ns|n4m7YC-nfw3NrARo7p<{YqTT$9Gh&pm*au0S3<%TU9(-aH_Qcji7 z{LJaS-yMl%d#+4^&$^J0Hq0d^=a49$Gje8Un4)VH^M2Sd{m?VQvq`Qxk1?KnH;fu( z=+7UkSh-;F!Bo@Xzs2!g~ zH2V~`wXfW39udVL1?-!Wnb)O2P*Ez-XjHDh&o658jk@niVb{6c+Gzu}D`Rxz;JP+V zzF2UjZ6BB--%K%S=`_uz8rspR6^Y#p9UroSt~=}8?rW>!Uz#4ve;8V@oz4Axw;oSS z=ouzodqIxjf@+PVGfc|6ShTP>KlY2g3$LY6HxdQy!xc3gsa_d8ys0wU&9<3pS<~~5 z#5O^VfJPg6cwfy}Bweky@XlZt*?n}DctX){s~p5ico+;*J%7MKF+vIfWF3x7L6M6n zmH_W94v_TKiGP= zDMaOi3Lg75a#u;sEA&jbE4t9RGEezu)V`5lEZoqWu@T!}iMLyp_O z7ESRiy^ZnoHBmhL)?(IbwsCY%JfA5}fL@<*K*!0bMGor3LJtAAAp+tO^2~6AC^1!C zy;4$AG`c0ph42mKMkTua4%>T6RT;E=)Ghub;%-lDIc;|&>T?FTLahsBU&o5q*1GV{ zt>_PEiPr%kOCh1wx8{RP%X^Dz;1W%W-~t19SzR?pXm2T-JC#Dr;G@^>~_KBeJ4cDFl_u25XUfk=vX!yHd@r_NvsY1dt4cr8E_?e_LI4iZ8; zDnBP1YNoomxkdFcm0t~J#N5HdM2u9wpiswi$0#-HD@^oYHzGj>kcuBrD}!ITw;HS|993XM2!*EdDeA>WS<>@%lKiWUVwspRsOd1N*F3In~j zO4q!Xp)qt+FD&={!h@8Bh_^SL+Sej-7#Qk+ALWZ@{d6+dLzGKx;h1+3RSNT`gEe(B zwFv_NFX=`PG3#dY31mEW=5Zj^LG@yFH?zf936HcZ3`; z!0L07$8bZ%i`LoPsV#nBsbVE}H7LDt*SGs-Lx{H7@{5KWg(!Ih+Q6U}2W0~Cs3~u% z*$5QU?uR&hA}J}boM8Z5Lv6*rokP+M$2jU2NS11`@ALz_o(U>T#W|W45X9UtqDf)y za-(oG+qZiY>U|-@4s)Bhsxz1&jFx0K+R96-J=(A!IIHzCU(NmP?n;njJ#7jj=h0eS zm{V_9D}pM2js;;US~&BahY-#D{5%ebFfE337U9L4F1iAZ67k1KqccTjZc>L_bDC5( z(X}Xmofgxlm$LUqC@QU^MY3k@^<8&Y+ri+hUU5fwarSq#3iK#cfq4qWNCSSrH2r8j zegU5Ydj-?LuX%1K{_i{<_fj!x)moN>G15P`$>0E1#mc1ArUv1w%#f`z%N zmHjGejy`L-y}o4^FDx$}mYS4{zZocRRiw@0ZrCp#f-?P=jCrtoe3eHl3lUh_u3KTJ zwo86U<4KcpC7$q;R?wTCBF{nZ> zuFHvPmza5<{7IWwOW7vo232D9cJtv>oa5P?^Dq~>DnFV<&=JD@t-C>FUN*Y5*cAuB=HIf zZ`U*W_4hn5zt6VMb9T-55lPF=xi)o1BGZ;yH?MqV8N;BDhrz_89E6*F%mePw&^k*= z#K;?%YC8r@JHCB#W*LhODMpLzq;ZUG3Yvt8qV4?^}=NwdwEMugiQXg-;X zpn1w96n46N>? zU2rEl@wPWx^M*Wf8t;+futLp{!Bw4(mE`wchR2Mi2LTAP_CIRLynYq922#@i ziNT;(rT6YZLT%E3ye)qpxj+Wz3f)3`mgF&8-Nd5RW)SJk3+w7k$;Wd>#%VrRSIJ8u zl^@&Hx9NK0Q>n;k*C7d3#vPHfXeQnw z=|n?D4X`0Y5y3BO$@4iC92<$E#rWy!XJ#luhH`C*EPdk5DT77Px7W6{P2rwxB$*{n zz%-w(Bagwlg#n8S%*du!5~%7x)9QBcwp)TCdxZ~#%%^m5Yfy*e9nIz}n1ls%l|TGy z($I^8EZGm%6=5SWZz>c`*#2~U%e0FKU0~f&=DKPl?~cb^0Fz30WZMrDDoDeXc=PT^ z!B=^V12==cJL4=xS2v)vwls|K`Nt5r+wi2_Vs*K)$)QPicjoNQf>-73hGg0UDgOnr43II#BDOFwi_ z_4j2S)<$_;>9Eq!uQ}#RR~&pc0x&%TRV0pQgNP2`7o2;6Q3hNhIVnf@$h5Bv*qcUb zy3EzPUeQ0c{>-cM_qB`^Vp!;d%J)UV{&OtV`cG=23FJEDk|T*>_=mzdopfNSy7;h^ zw1dksZTY#T=_KShj_F0%She4BS2|B>Uiw@fF**eG^5C}ipGD;}R(T>jrWOBQJO zA!AN=7SZ8+ay>w?P9$V};r@E9ZBdG8%-@+D$u&x3h7+Jj!i3T_*c`{D`>m1x%#IEH zHY*P6ke#;pzP?zxYGCMc^||mgexX;iLlmxvdDTmlTx+!1d%I`XuoeyZ8g=;BJhdl~ zBASAMkCMQ2ByeEs=F03V`}}PGVJsY%5S_DKa6Cn+M?5(8r!u+1v$J((XK%%wYl^&P zziP7nE?9H2?9)?J`Kw3|=SP$DGsY}l;0`_g6uVR-zWZQZO6w>r^kbB7o8t5~CoI9X z#c{x6{!E)e=%BjkSS~nS^q(L|f4x9`c>Cl6=^!B_>=Zq3o94`CMq}VtATPqB;bKwZ z!SR$eXU?H3b+&22d@-aLD!KfL`v2{>~KItGsHuzqPQ2;8(s@Yf5yC)ujkI zrv%`0@e12b{(7ZKgrpEzaG4-dJu#^#6G*Vb5S>NS0gOo(`uxSH%S8dA9Msd)a=^56 z(oyjW@n0gOoJD(AhkD01e5i|N5Ff;pF?!YgR6hd(CuQw^nJEexMjAnWyL;MNT_+OU zEr%js>VmK6ygd}jcwaTpx~^uAN7@@b5O;m6)3lxCX^y9~d^;S(har$j>W~98=a2_Y z>|qQip7Q50h6PBjWzMZ7O6ugz9d$IATxkm8n}lH_rIkdy)86|SIC3@X=L82-%3dZ7 z7T*4XHz&fE*W^4Y``m%M3r1g9fQ?{4_x_;~w4;5|>$6>Rpz*APiGAgnf|3GW>xd3B z6mi|hZeCZFZLNuxb%*xiuk%a>!X^;lI}MyBuk)E`?f{$g?8$Cag`A77J-clGQH^-M z6VO_JcvK3?%dDUKyn+-9&-lv%f!G-bOvWFP^OBqRZ(~fhZUG~r%|NQpKYQJWnu9)4v^{quk(9)}+!WsoBHpJhSbX(o`pSki z4h(JB4Uac4^J)VBEo<`Le#Ay*rlR#FT|9ZZL_oQyx;OqhFF`)kz*3{Oh`o{qZW9Gy zc8~L{Dg#!&w_^KwBvY+`}gpqFsb+PwZ#@wBnjtT0gx+*&O)oKFW)7^JWhRO z71lJ}Ec1wh_~t0tZ>qD`h7k1QTg6eTH~&UUt|V1EuEN~&B_OH%K#3IED^aLak^sQK_>JyuRMPE9xItd}qi(^OFy*k}M4mEpl4m1UUe} zJUB9P0I!NCtW&TKt3wVeT2tG80+N~fR5)`wYtx+bBm%0~o;bK3F^2hzgMj!HGI_e> z6M&{mq5PA^%3n-u?8#Z6r*I&sw%)%LvOTFU-`x}2va{P#iwYDT_#(&dAhfCHLUo!a>!5Mkg7f-01JuRFZ!@ z!TlIDNZO)VSYO&E*u!C>ofvl8#n5Z+ZSrt>@*IlM-?Ryux4EV49{|b`7>)h`gTW$! zwA){t>469=65cwG=(w5G>jTesm?$XT!aO{#d<J3R z5{?R&xN+LY=l^d-XD_XyTUg@fyu06El;-?|)P6&b zlA+geiHHP<@sewGB|8M|7RH|*uyQK- z=w2$W;x*L{OqiOY2BztHG|NAQ2!>#2lQgIJ>v?V}L!^+-w2`S!Nve_KfGK z=gTG%T%cu$cz(510W_EBoNS?#B_&ppRO{tdj+E0BNFV1e8N@QeXl-NjG){64KUFi0 z+8|a$fO%#jz_M=<7COwrCFaNp+mHt)Nwv~!A-}V?v$E3h($ojUVI2CnyhG*6F_W?%sh@pg2lCw@XIz%~nvsnM`q{#9StxmL5z&f+L zz|T7#&2#!7hG}#hv-9JNbJrT%&yHp{Y-OK@x=%RL*;wW(c9@2L1AlwD z*dXPAk^o4Z-cHG|bkWNB)!#9fuQj7Ty~e`^#O5||gdiu?G1q!Niqo(k<7%7`{?`OUL^5iPmUpL@g=qWr=M^2>`m*pDX;V*UeqT)QH4nrC#ab#q36=L_26<@z~)ZrIXjAvzJ&*Z6M(aBR8B!Iif_WYynUZoof1 zHJ?_(L3tz3K5lNeE>1!lSgbv;Xa~vF`874?V)41!3ay3fy^u4ea#Ys%hRRe?f)YAb z98TB1Jq(BYWCmd5x|KfosrO2BKm940h6v zgr$lK+Q`t`_eSw($S$3Wn3`2*MJsampCDdd-uwJ5RzRc8!#iG!_zI%ZTnXf}{Oi{* zeZlPqt_-`vAI1#lkv`YrRAy5&@%lb8=-q5guBifcX*ZuE^isI5LeMa-vTlCH!*%Xa z3j@FSPuTZfkYukitZq%1=4;D%4_zG|_J^<6f%MY)>5&r+K;S+UwxCi2H+3~qSlSyL zh9YHpOjT7&W+o;F_z=oQtW3FL^|L;>*_O3F8;$wJ#dXBR5k4|Ea)7fyQxtsmA2yb= z&0~^&ac-m@{-Sqzo{*|BRH4ho0X2C*vDeY-h8)UGbJkXSciZt=o0}lrSErjbRMJSh zuBrzUZ9PaztViB*Vm0b0TXb=&f_A}8R!MRI6?y0fNc0d?(A7aIfYfYfeFL$L2|&Rt z$L5B^?n$bJyQ+NB)>eT!F}0V;t*x*BD-$CAmsiTo&=PG(EQnTb!8A9aQ*e@K`aU)P z$Jqe-K2jC8*rp1jkT(P^^9gqe?Iw+XTfjQWJ3fr|1(Cd)AF? z;f$FWX43>df|qA}?}~PBZ?Ev%DW->3Csg8BQrXu7Wg2XF(EC%)6I(lN zu~kC+yQ_M?bGuTrfd}b+?C3z|K>+FXQZV9A9bu-&jFuWpM_v0jw-b+b5ua5^QI+$8 z7>^p>PQNeJpFfbU&YwlDMB)JX>n0mx_d2F^*aGATxod@!uVxd zw|yT~0!#$ysbsOzirS)EUQt@W73s#>S{I!6ppV-7&s0_5(^J)fIEH!r!gyq4WWJ`R zX4IA*UiLDZ>a4Z7`JPaj3-mq91p`(6CwkHQ%Fw%|X^jnP@4wqagEa=7;eR?k1iR-7 zZgwr{r9;*W=TEwUcIFC@bxQIz2Z+VVq*2S`K~~eRMsc?Lybl^18-N5 zFkCWFKHp=!PV<8fdCQX3w`Wq)t+Xd?!-acIu4Yn=U>B&pm}AEL?}1#Y=G0ro7;f6S zdc!Bx<67|J7b<`nF%bGD-D_lZDtpK+ct+j(fY4Uvh5lhD%v=C@&2` zjXnP7odHqO-T;=!KKYf9f`LsJ^p{>(Jf?!v+caNuFyP&b%IHp1O;Jq1dK{KUG!j89=Up}?ZjdfRT z+)EjxrzBU$qXFzHaZ#R%mR!!&8E1d$K@l>$;OngL39PTVwQsJ+e9z>3gi3IsQQeH0 z7H}{>kn&ae;TI~ziS{pN5nD<*SmcbY))R2*7?i(>|3)7N(`S~hX25ZVf?qsA>kLV# z%Vx6q1MRBF_}cq0^jmMk-?${2KSql>(QgqeWGAD4z-D3b6ChPKdWe?bt=`lDUq+0t zDQsrKU4A`LC(EN#L{MnQWvs}CA8&-g7Z0|b3b@V<++*>jKdCu`Ip;&#{Yd;v5&0x& zlN>uAPLB&xfiSCEmQXNL@GNy7c^vYi8$YOOsxaE4ZRzs^%eM<+Z*NVQG-S9v!>U}+ zQ{#zG$ghOevFAgit2&1;aql0C%)Pb~0Vf`*pK{&r5K4!nidaZ_jgO|WdP!8pq?1p7 zH?qdP@6PLm9)6{aTln+zCji`=!ziL`?8#FE6Dfq1Y|5@m3@+PdQctYQ)1^$%jS>%- zxs+#h4h$3*9lB=fbh25fQ3J4c+q(Q=);WNx&x=^*|5&Ys$u(1uPidB-Yh!tP^Smdq zdRdQE-zT1~btT$dizgbt4}Y$`kaV$B3CG1sM`iwcTZlR43LKsf7|?QW4RWg!k2fl^ zTWlHNbNp4ye|)M$MgOuk{~(wn8=;TGwoO0Yi?j%c`dGuZuDX-+BV|LR{ zVH4VHy2#^b zFtg9es8|&j;bCd$ji1kIH0KFo*n?D?^Bj@X!iSQVuIB)Ouja~C>SdTzRA8%Ffvdw~ zFmr+54`63x;oYkW;h z6Xgm1;I<4?NO=@;02<0oR9mglDJVo~);KLe=A_mb-r$3RMnY|j@{|94H*U+?JfBG! zGfbI=&CNBJvOjPuEW5mSFQu2>*cv_4puQ26dZiVl$fir)!X-Jx>cxUzw;dV~<-`rS zs&R+|qYGs5;*2YKMN9o2H|d-%*Z?}srZCW_)}fAoPAnJM0B!f}ugdfaGW_QIjW0%8 zX;al>zXPcow*&HXwHmhI<6AfVvbbP`6z)1Qcp8gu#Orb+NMQ^q{c}NO)rvdX!`sg6 zcx8+llj+ubSkkqAZ_Cb}Sx1sZV$|(vRwdRz=T2?$v6gw4DVte5!AW;JA;0_Lq1P6N zAS~STb&uh6$?P~0%|)9vZn5`TH*>T+;Z5)~C|XWF8@kmKEt(uAv>^P;7G-xHEIS8w z$;VI=q*i}wgXO8Wd%7^V{$gvB3;U(B!vlJvI25`&i2vdXD`A^p$CX*dlX-fcBs{n7 zX?K8-m8xo0n>9Sa2)~+OT&E(-cW^?{Pe6!|0w=p&8o9Aw3lA(XBku3u`Ay zjSC+rP~8YcFGX2$;Meas(lM847R0QplcUUiTum@HB4hvD>blk!Vrmjdp?Y!~T%zg6 zsIYNFxYqaCaR~Azf_MRB(a*!)qj=tlmhyI}jB$M@i-5k=SMW$%dlMulaz@OxllH3O$gkf} zDP8`ztl%JLdj%DD=`>T|Ans>GvHAiu1-ZgB!Mm*Xu2-8lIg+=PZ+_2xqCUqy`kf39NU>}mOaX)+$UXvgm~BwcX4qh_qXru|HZf^O?J7_8^u zcwnp_qo)FjU$DyeNaqi|4J=%A^YNH2SgrtZ{ag1X&_w-hJN9Z`pH=xGjV-q_j$cAIfrW;bkNhI5g zj(iihJ&osF(D~L6BqZWIf!A1FZSp{4W~&!f9a`0%MPLIn%&M3kuI~mUBJg@k?6fY2 zII=JMJO$yDH)zo32pG(LcDYu0&h2zDp2vLW>)4o0M(Qn>2e6x!yM797r{4|8gJCus z@4M7(r3w4m^VjTA?IqI0*wrXc*-*>g&)TDBSiu)CXF@$!6NQppUZ+vfJuo&f1{3l* zl*+fArM|W3u9IZ(OwJEt>U-HrL7~Dd+afEHp1)6+nTN?hV zH);A@eQZ_)4Y6ddeJu_i+2+H8c(DtNn6ef|S*G?JV$D1uS~T^LWPpYEn448Ta2Xt% z%q4%$oXT|n>y6o^e>c}dsI9iDB~K6u8~c1*sGX$d(RZYdog0;ai)Wc(m&;y<{M<6V zwVBoVw2^0d-?fK0JAjaIkMHjmn6q_rKMr!ekTZY*lH4wi_C>(H_zm0I(TmipiCQV6 ztD0RQG~ekI>iGobGc>pFhVem`OB1lKQ7@zj{hzKDx7K7v-s(($F43cMb?gwng?P7{ z+&Svj#=YBUuhjHs@|x5od$QQ);(e}HU7^I3JPog#_mtrm=XA^U(T*#ZoO zM!Gn%eeT+x@W@Z*M1Vwi=5+kPQd{`73QwvZ>`UdW8*)$9r1Z4P-i^G0{mYI z47i=dY^?hH344<T8Kdsl>9+`TU@ zawt+R^?d8hg4GLYtBMYk!UP&VZkF@*yj?7RSTw_Tv{66G6hIrw=Hz#N35~A0*5bNJQ&769WIFjDJwjFLhCwm7iv0%=-NRNG!VLE>Ie3m`0%yL#xx%mYB zd@XPjWr{=YW#X9&Z=4{>*aYm~rM(h;ch-^TJ~^mj+@N4xUiQ9jvg$qTr6BQx3g?GO z>1!3D%bmiq#lY_tx*n-|AE<>!KnNA&zy#mkVGlh!{hko}$jYxqEPhDMZ6 z1Y;!V>)rE1a#U8E6;p6GAk-w@MZ0D$*PnA|@N8$vLh)j3H()w%mU!QO;?3^oL8tnX zWm*sWCWno%f{!A(1q`C|hFiXSw$PR6D2p|Vu1nDadQCRht#qAysN_RYULrfB-kQ(> zSN5xj9D|Zt8Y3fy4k5iQaolICL|y@4Uw!8AEVrA|G6QhjAWT3{h8s0-Z{~6+;^nch zcZ2gKo4P&g(-U*)!^Yppl1#xR@}~`Z5mM4GC3+p2gO+MU-mPN;FPDAl&pV1kEiIFs zN1wbxl^r<}((?`wYot~E5R{%^GYR7 zLN4b{1Su4LWT!()Ct4pA;w?SK65ta0Oi%6M>hNln4k zAapeJ_vY@rO(Q?vHSF_)`3pc6jUq1NGI=0FVq9EMT3hED-8(Ru%VikjMbC@LHte?% zK5&h93=9nS38Y4)&IbZek*$;zDj^&p;wL;YsP9Zi2Y4|p@d+S;FoVhD)UXvgt{9Z1 z-ef9ScHqpMYk%Bv?boLYc3q9a&##xuAKi3p`J^xRr0pxJTO;JM=0r)S$b&#R9eQGV zQusruQGVg}jvpZ8&~wMcy`VP_1)44)4-yExyjhitoa-1E7#MC7$nl!S^4uorF*FBA zYb7Pu8Hg8B6IVT#((i5o^PeFCq(LqnnKWnCz}~N+JQ8Ot50p2;XKD4;{K|L0;z(V% zH~Wifh1z(vKZHF6b@}5y-97W6bw?(YHmeQ@1+3j;5+4nphYZ7;eHG#{0kd3kc%ZHFMsaH2Sk9 zRDt)hM70*>pVQF1KfA8!5J`~q@bG|Gw){Qz52><_S+ja z>`Hs;-=iywniUExYWJ}Dbj7iet9MO%WlQ!Q4JvJpfXA9GJI6MqmH02WJkYZ-m`qg< ze4ll1l~k?9(#62Q@EU<2JhnY^>E`^><$gBPwmL%|$mxr!<(9~l`yTr9(D=#gcRjSf zysiL?*mEefdSco3+>L4PW(@o0P~iep?N`8ME=IMrN9t%BK5Q@38cHAj@#wUSbG7HN zR536xyiOo8t&X_kk9`Z496J2~MUqt#&ZR_Rub7_?mqp2hC2t+cojv-8?PJ#F6z{|{ z-gzITO-lK!pR<-<|JlB@o#$)5;|o}V&!Jlq5pAatCjTQ28XVy}S;Av{5qaoQdO46fdRA(^QFp#p zesFDO=|}JED_xHzhJk_MbplzlW)1Pf4?kS;1Nt6iOrzdyQjo8BSXjW&UOvL)Xt5v^ zQAn{=QJP)Xd?K^5{&+!?T!XelQCcL4D`Rv9kdquup(_IGZ*YW9#Ds+4R9`-um=q?F z> nS)oa5F=b$2V00AzUw{DsFiiq02_+1w00000NkvXXu0mjf1wIDd literal 0 HcmV?d00001 diff --git a/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/.gitignore b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/.gitignore new file mode 100644 index 00000000..b4500d79 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/.gitignore @@ -0,0 +1,6 @@ +target/ +dbt_modules/ +logs/ +.env/ +profiles.yml +package-lock.yml diff --git a/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/README.md b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/README.md new file mode 100644 index 00000000..7f74ec35 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/README.md @@ -0,0 +1,130 @@ +### 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`. + +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 + +#### Set up profiles +Do either one of the following: +1. Use `DBT_PROFILES_DIR` + ```shell + cp integration_tests/ci/sample.profiles.yml integration_tests/profiles.yml + export DBT_PROFILES_DIR=$(cd integration_tests && pwd) + ``` +2. Use `~/.dbt/profiles.yml` + - Copy contents from `integration_tests/ci/sample.profiles.yml` into `~/.dbt/profiles.yml`. + +#### 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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/ci/sample.profiles.yml b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/ci/sample.profiles.yml new file mode 100644 index 00000000..d3a61793 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/ci/sample.profiles.yml @@ -0,0 +1,49 @@ + +# HEY! This file is used in the dbt-utils integrations tests with CircleCI. +# You should __NEVER__ check credentials into version control. Thanks for reading :) + +config: + send_anonymous_usage_stats: False + use_colors: True + +integration_tests: + target: postgres + outputs: + postgres: + type: postgres + host: "{{ env_var('POSTGRES_TEST_HOST') }}" + user: "{{ env_var('POSTGRES_TEST_USER') }}" + pass: "{{ env_var('POSTGRES_TEST_PASS') }}" + port: "{{ env_var('POSTGRES_TEST_PORT') | as_number }}" + dbname: "{{ env_var('POSTGRES_TEST_DBNAME') }}" + schema: dbt_utils_integration_tests_postgres + threads: 5 + + redshift: + type: redshift + host: "{{ env_var('REDSHIFT_TEST_HOST') }}" + user: "{{ env_var('REDSHIFT_TEST_USER') }}" + pass: "{{ env_var('REDSHIFT_TEST_PASS') }}" + dbname: "{{ env_var('REDSHIFT_TEST_DBNAME') }}" + port: "{{ env_var('REDSHIFT_TEST_PORT') | as_number }}" + schema: dbt_utils_integration_tests_redshift + threads: 5 + + bigquery: + type: bigquery + method: service-account + keyfile: "{{ env_var('BIGQUERY_SERVICE_KEY_PATH') }}" + project: "{{ env_var('BIGQUERY_TEST_DATABASE') }}" + schema: dbt_utils_integration_tests_bigquery + threads: 10 + + snowflake: + type: snowflake + account: "{{ env_var('SNOWFLAKE_TEST_ACCOUNT') }}" + user: "{{ env_var('SNOWFLAKE_TEST_USER') }}" + password: "{{ env_var('SNOWFLAKE_TEST_PASSWORD') }}" + role: "{{ env_var('SNOWFLAKE_TEST_ROLE') }}" + database: "{{ env_var('SNOWFLAKE_TEST_DATABASE') }}" + warehouse: "{{ env_var('SNOWFLAKE_TEST_WAREHOUSE') }}" + schema: dbt_utils_integration_tests_snowflake + threads: 10 diff --git a/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/.gitkeep b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/datetime/data_date_spine.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/datetime/data_date_spine.csv new file mode 100644 index 00000000..e5819c84 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/etc/data_people.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/etc/data_people.csv new file mode 100644 index 00000000..90273837 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/geo/data_haversine_km.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/geo/data_haversine_km.csv new file mode 100644 index 00000000..636442f2 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/geo/data_haversine_mi.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/geo/data_haversine_mi.csv new file mode 100644 index 00000000..cc4757f7 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_cardinality_equality_a.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_cardinality_equality_a.csv new file mode 100644 index 00000000..ad9cdeb5 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_cardinality_equality_b.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_cardinality_equality_b.csv new file mode 100644 index 00000000..dfca57d6 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_not_null_proportion.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_not_null_proportion.csv new file mode 100644 index 00000000..b28bb8a2 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_accepted_range.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_accepted_range.csv new file mode 100644 index 00000000..38b90a50 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_at_least_one.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_at_least_one.csv new file mode 100644 index 00000000..8b75a3f5 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_at_least_one.csv @@ -0,0 +1,2 @@ +field +a diff --git a/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equal_rowcount.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equal_rowcount.csv new file mode 100644 index 00000000..25b5f504 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_a.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_a.csv new file mode 100644 index 00000000..35fa4ee0 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_b.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_b.csv new file mode 100644 index 00000000..c9fda320 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_a.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_a.csv new file mode 100644 index 00000000..85241961 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_b.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_b.csv new file mode 100644 index 00000000..0306a9aa --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_columns_a.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_columns_a.csv new file mode 100644 index 00000000..77beeae9 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_columns_b.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_equality_floats_columns_b.csv new file mode 100644 index 00000000..e26305de --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_expression_is_true.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_expression_is_true.csv new file mode 100644 index 00000000..eeab2b7c --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_fewer_rows_than_table_1.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_fewer_rows_than_table_1.csv new file mode 100644 index 00000000..0fc969a4 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_fewer_rows_than_table_2.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_fewer_rows_than_table_2.csv new file mode 100644 index 00000000..5f9bf69d --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_no_gaps.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_no_gaps.csv new file mode 100644 index 00000000..72dc14ee --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_with_gaps.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_with_gaps.csv new file mode 100644 index 00000000..9b7adb0f --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_with_gaps_zero_length.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_with_gaps_zero_length.csv new file mode 100644 index 00000000..c59227de --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_not_accepted_values.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_not_accepted_values.csv new file mode 100644 index 00000000..85b190f2 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_not_constant.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_not_constant.csv new file mode 100644 index 00000000..53af68d9 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_relationships_where_table_1.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_relationships_where_table_1.csv new file mode 100644 index 00000000..7a8faf79 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_relationships_where_table_2.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_relationships_where_table_2.csv new file mode 100644 index 00000000..60907911 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_sequential_timestamps.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_sequential_timestamps.csv new file mode 100644 index 00000000..e15c83c8 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_sequential_values.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_test_sequential_values.csv new file mode 100644 index 00000000..9cbd0532 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_unique_combination_of_columns.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/data_unique_combination_of_columns.csv new file mode 100644 index 00000000..09d64b53 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/schema.yml b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/schema_tests/schema.yml new file mode 100644 index 00000000..7b57a911 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_deduplicate.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_deduplicate.csv new file mode 100644 index 00000000..7e06170a --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_deduplicate_expected.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_deduplicate_expected.csv new file mode 100644 index 00000000..de5e204d --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180101.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180101.csv new file mode 100644 index 00000000..5570828c --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180102.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180102.csv new file mode 100644 index 00000000..aaa69a3d --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180103.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_events_20180103.csv new file mode 100644 index 00000000..4379e0d4 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_filtered_columns_in_relation.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_filtered_columns_in_relation.csv new file mode 100644 index 00000000..9d96143b --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_filtered_columns_in_relation_expected.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_filtered_columns_in_relation_expected.csv new file mode 100644 index 00000000..77ea0563 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_generate_series.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_generate_series.csv new file mode 100644 index 00000000..1964c4a2 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_generate_surrogate_key.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_generate_surrogate_key.csv new file mode 100644 index 00000000..27a188f6 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values.csv new file mode 100644 index 00000000..5651149b --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_dropped.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_dropped.csv new file mode 100644 index 00000000..5651149b --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_where.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_where.csv new file mode 100644 index 00000000..0295f559 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_where_expected.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_column_values_where_expected.csv new file mode 100644 index 00000000..e821706a --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_query_results_as_dict.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_query_results_as_dict.csv new file mode 100644 index 00000000..c44b43bb --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_single_value.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_get_single_value.csv new file mode 100644 index 00000000..a3a18139 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_nullcheck_table.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_nullcheck_table.csv new file mode 100644 index 00000000..3b6cdd74 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot.csv new file mode 100644 index 00000000..4725599d --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot_expected.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot_expected.csv new file mode 100644 index 00000000..a7702c78 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot_expected_apostrophe.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_pivot_expected_apostrophe.csv new file mode 100644 index 00000000..1f403a22 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_add.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_add.csv new file mode 100644 index 00000000..26e314ea --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide.csv new file mode 100644 index 00000000..aec2ee1d --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide_denominator_expressions.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide_denominator_expressions.csv new file mode 100644 index 00000000..3e647de1 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide_numerator_expressions.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_divide_numerator_expressions.csv new file mode 100644 index 00000000..2673d9b2 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_subtract.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_safe_subtract.csv new file mode 100644 index 00000000..1d5652a8 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star.csv new file mode 100644 index 00000000..74150762 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_aggregate.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_aggregate.csv new file mode 100644 index 00000000..19d47446 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_aggregate_expected.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_aggregate_expected.csv new file mode 100644 index 00000000..d7056386 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_expected.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_expected.csv new file mode 100644 index 00000000..f5aa3eed --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_prefix_suffix_expected.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_prefix_suffix_expected.csv new file mode 100644 index 00000000..fd34199b --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_quote_identifiers.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_quote_identifiers.csv new file mode 100644 index 00000000..0ecf1073 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_star_quote_identifiers.csv @@ -0,0 +1,2 @@ +column_one +a diff --git a/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_events_expected.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_events_expected.csv new file mode 100644 index 00000000..86303b2c --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_exclude_expected.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_exclude_expected.csv new file mode 100644 index 00000000..3283e5c6 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_expected.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_expected.csv new file mode 100644 index 00000000..6c7d8f68 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_table_1.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_table_1.csv new file mode 100644 index 00000000..d8270ee2 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_table_2.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_union_table_2.csv new file mode 100644 index 00000000..1ce620bf --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot.csv new file mode 100644 index 00000000..273ec56f --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_bool.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_bool.csv new file mode 100644 index 00000000..51277792 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_bool_expected.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_bool_expected.csv new file mode 100644 index 00000000..4e688a6b --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_expected.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_expected.csv new file mode 100644 index 00000000..e2c92fb0 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_original_api_expected.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_unpivot_original_api_expected.csv new file mode 100644 index 00000000..a2add2c1 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_width_bucket.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/sql/data_width_bucket.csv new file mode 100644 index 00000000..6a8906db --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/web/data_url_host.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/web/data_url_host.csv new file mode 100644 index 00000000..2350bb7a --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/web/data_url_path.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/web/data_url_path.csv new file mode 100644 index 00000000..e21d8dd9 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/web/data_urls.csv b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/data/web/data_urls.csv new file mode 100644 index 00000000..a98bd191 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/dbt_project.yml b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/dbt_project.yml new file mode 100644 index 00000000..830643ec --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/dbt_project.yml @@ -0,0 +1,71 @@ + +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" + +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 + + 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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/macros/.gitkeep b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/macros/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/macros/assert_equal_values.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/macros/assert_equal_values.sql new file mode 100644 index 00000000..d4f02618 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/macros/limit_zero.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/macros/limit_zero.sql new file mode 100644 index 00000000..697849d1 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/macros/tests.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/macros/tests.sql new file mode 100644 index 00000000..046fab3a --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/datetime/schema.yml b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/datetime/schema.yml new file mode 100644 index 00000000..82e813f5 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/datetime/test_date_spine.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/datetime/test_date_spine.sql new file mode 100644 index 00000000..fa4ae52b --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/equality_less_columns.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/equality_less_columns.sql new file mode 100644 index 00000000..415bf949 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/recency_time_excluded.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/recency_time_excluded.sql new file mode 100644 index 00000000..1c18e800 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/recency_time_included.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/recency_time_included.sql new file mode 100644 index 00000000..93fe1db1 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/schema.yml b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/schema.yml new file mode 100644 index 00000000..cecb9c3f --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/schema.yml @@ -0,0 +1,259 @@ +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 + - dbt_utils.at_least_one: + group_by_columns: ['field'] + + - 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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_equal_column_subset.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_equal_column_subset.sql new file mode 100644 index 00000000..b426bb63 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_equal_rowcount.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_equal_rowcount.sql new file mode 100644 index 00000000..01b1a549 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_fewer_rows_than.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/generic_tests/test_fewer_rows_than.sql new file mode 100644 index 00000000..de47bee7 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/geo/schema.yml b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/geo/schema.yml new file mode 100644 index 00000000..31cc6a72 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/geo/test_haversine_distance_km.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/geo/test_haversine_distance_km.sql new file mode 100644 index 00000000..6a382922 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/geo/test_haversine_distance_mi.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/geo/test_haversine_distance_mi.sql new file mode 100644 index 00000000..9d6bc642 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/schema.yml b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/schema.yml new file mode 100644 index 00000000..0103ceee --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/schema.yml @@ -0,0 +1,266 @@ +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_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_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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_deduplicate.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_deduplicate.sql new file mode 100644 index 00000000..226555b1 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_generate_series.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_generate_series.sql new file mode 100644 index 00000000..11370b7b --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_generate_surrogate_key.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_generate_surrogate_key.sql new file mode 100644 index 00000000..4babe730 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_column_values.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_column_values.sql new file mode 100644 index 00000000..fcfa1d8e --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_column_values_where.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_column_values_where.sql new file mode 100644 index 00000000..5eab9c9a --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_filtered_columns_in_relation.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_filtered_columns_in_relation.sql new file mode 100644 index 00000000..7b3ca72f --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_relations_by_pattern.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_relations_by_pattern.sql new file mode 100644 index 00000000..799bca50 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_relations_by_prefix_and_union.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_relations_by_prefix_and_union.sql new file mode 100644 index 00000000..936bf629 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_single_value.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_single_value.sql new file mode 100644 index 00000000..90d3aff1 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_single_value_default.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_get_single_value_default.sql new file mode 100644 index 00000000..7b049025 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_groupby.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_groupby.sql new file mode 100644 index 00000000..fe790e96 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_not_empty_string_failing.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_not_empty_string_failing.sql new file mode 100644 index 00000000..2870f9cc --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_not_empty_string_passing.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_not_empty_string_passing.sql new file mode 100644 index 00000000..65780410 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_nullcheck_table.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_nullcheck_table.sql new file mode 100644 index 00000000..807b0f3c --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_pivot.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_pivot.sql new file mode 100644 index 00000000..a63e6e3b --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_pivot_apostrophe.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_pivot_apostrophe.sql new file mode 100644 index 00000000..792f4686 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_add.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_add.sql new file mode 100644 index 00000000..10f487b2 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_divide.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_divide.sql new file mode 100644 index 00000000..34624787 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_subtract.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_safe_subtract.sql new file mode 100644 index 00000000..0ce816d0 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star.sql new file mode 100644 index 00000000..2092e16a --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_aggregate.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_aggregate.sql new file mode 100644 index 00000000..9dcd7c2d --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_no_columns.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_no_columns.sql new file mode 100644 index 00000000..ff5a5de9 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_prefix_suffix.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_prefix_suffix.sql new file mode 100644 index 00000000..ae1c64fe --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_quote_identifiers.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_quote_identifiers.sql new file mode 100644 index 00000000..180d5bca --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_uppercase.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_star_uppercase.sql new file mode 100644 index 00000000..6179e691 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union.sql new file mode 100644 index 00000000..8d675ede --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_base.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_base.sql new file mode 100644 index 00000000..a51bd2b8 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_base_lowercase.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_base_lowercase.sql new file mode 100644 index 00000000..dc005a8e --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_base_uppercase.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_base_uppercase.sql new file mode 100644 index 00000000..af3dc3fa --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_lowercase.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_lowercase.sql new file mode 100644 index 00000000..95efc06a --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_uppercase.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_exclude_uppercase.sql new file mode 100644 index 00000000..3e0ab4f9 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_no_source_column.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_no_source_column.sql new file mode 100644 index 00000000..660bdfee --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_where.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_where.sql new file mode 100644 index 00000000..a5986d41 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_where_base.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_union_where_base.sql new file mode 100644 index 00000000..177db51a --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot.sql new file mode 100644 index 00000000..17ea1e9b --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot_bool.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_unpivot_bool.sql new file mode 100644 index 00000000..00c39df8 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_width_bucket.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/sql/test_width_bucket.sql new file mode 100644 index 00000000..dc2b8609 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/web/schema.yml b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/web/schema.yml new file mode 100644 index 00000000..7f02b317 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/web/test_url_host.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/web/test_url_host.sql new file mode 100644 index 00000000..06a9f69c --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/web/test_url_path.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/web/test_url_path.sql new file mode 100644 index 00000000..c03e5547 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/web/test_urls.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/models/web/test_urls.sql new file mode 100644 index 00000000..60353dbb --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/packages.yml b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/packages.yml new file mode 100644 index 00000000..7468ac55 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/packages.yml @@ -0,0 +1,3 @@ + +packages: + - local: ../ diff --git a/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/assert_get_query_results_as_dict_objects_equal.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/assert_get_query_results_as_dict_objects_equal.sql new file mode 100644 index 00000000..55d5400e --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/generic/expect_table_columns_to_match_set.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/generic/expect_table_columns_to_match_set.sql new file mode 100644 index 00000000..5074ae0b --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/assert_pretty_output_msg_is_string.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/assert_pretty_output_msg_is_string.sql new file mode 100644 index 00000000..fea33594 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/assert_pretty_time_is_string.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/assert_pretty_time_is_string.sql new file mode 100644 index 00000000..a6347abd --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/test_slugify.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/test_slugify.sql new file mode 100644 index 00000000..7d07ec44 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/jinja_helpers/test_slugify.sql @@ -0,0 +1,9 @@ +with comparisons as ( + 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 \ No newline at end of file diff --git a/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/sql/test_get_column_values_use_default.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/sql/test_get_column_values_use_default.sql new file mode 100644 index 00000000..3b7aeb7d --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/sql/test_get_single_value_multiple_rows.sql b/projects/test_lyon/dbt_packages/dbt_utils/integration_tests/tests/sql/test_get_single_value_multiple_rows.sql new file mode 100644 index 00000000..fc4c9270 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/accepted_range.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/accepted_range.sql new file mode 100644 index 00000000..49ab00d9 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/at_least_one.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/at_least_one.sql new file mode 100644 index 00000000..74cf3191 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/at_least_one.sql @@ -0,0 +1,46 @@ +{% 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 }} + where {{ column_name }} is not null + limit 1 + ) + 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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/cardinality_equality.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/cardinality_equality.sql new file mode 100644 index 00000000..824f0e51 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/equal_rowcount.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/equal_rowcount.sql new file mode 100644 index 00000000..600eae23 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/equality.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/equality.sql new file mode 100644 index 00000000..d7d7197c --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/expression_is_true.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/expression_is_true.sql new file mode 100644 index 00000000..2c72b8a5 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/fewer_rows_than.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/fewer_rows_than.sql new file mode 100644 index 00000000..0be69e26 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/mutually_exclusive_ranges.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/mutually_exclusive_ranges.sql new file mode 100644 index 00000000..041788dd --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/not_accepted_values.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/not_accepted_values.sql new file mode 100644 index 00000000..ab24188f --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/not_constant.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/not_constant.sql new file mode 100644 index 00000000..c3a976bf --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/not_empty_string.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/not_empty_string.sql new file mode 100644 index 00000000..cfaa9986 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/not_null_proportion.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/not_null_proportion.sql new file mode 100644 index 00000000..ed49a3c9 --- /dev/null +++ b/projects/test_lyon/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 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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/recency.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/recency.sql new file mode 100644 index 00000000..7fe2cafd --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/recency.sql @@ -0,0 +1,41 @@ +{% 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 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 }} + +{% endmacro %} diff --git a/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/relationships_where.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/relationships_where.sql new file mode 100644 index 00000000..c35a380a --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/sequential_values.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/sequential_values.sql new file mode 100644 index 00000000..736ccbd8 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/unique_combination_of_columns.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/generic_tests/unique_combination_of_columns.sql new file mode 100644 index 00000000..74ccf5c6 --- /dev/null +++ b/projects/test_lyon/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 -%} + {% set column_list = 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/projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/_is_ephemeral.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/_is_ephemeral.sql new file mode 100644 index 00000000..34c70db9 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/_is_relation.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/_is_relation.sql new file mode 100644 index 00000000..bee6db97 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/log_info.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/log_info.sql new file mode 100644 index 00000000..52b4b4a5 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/pretty_log_format.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/pretty_log_format.sql new file mode 100644 index 00000000..fe580d13 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/pretty_time.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/pretty_time.sql new file mode 100644 index 00000000..bad37efe --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/slugify.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/slugify.sql new file mode 100644 index 00000000..14c0c74c --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/macros/jinja_helpers/slugify.sql @@ -0,0 +1,14 @@ +{% macro slugify(string) %} + +{#- 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 %} \ No newline at end of file diff --git a/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/date_spine.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/date_spine.sql new file mode 100644 index 00000000..43dfafa9 --- /dev/null +++ b/projects/test_lyon/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 1) - 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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/deduplicate.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/deduplicate.sql new file mode 100644 index 00000000..3e75579c --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/generate_series.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/generate_series.sql new file mode 100644 index 00000000..efcbd8ac --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/generate_surrogate_key.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/generate_surrogate_key.sql new file mode 100644 index 00000000..cc91e665 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_column_values.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_column_values.sql new file mode 100644 index 00000000..d1dcf5d4 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_filtered_columns_in_relation.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_filtered_columns_in_relation.sql new file mode 100644 index 00000000..7f4af889 --- /dev/null +++ b/projects/test_lyon/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 %} \ No newline at end of file diff --git a/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_query_results_as_dict.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_query_results_as_dict.sql new file mode 100644 index 00000000..6548f2dd --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_relations_by_pattern.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_relations_by_pattern.sql new file mode 100644 index 00000000..9325a883 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_relations_by_prefix.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_relations_by_prefix.sql new file mode 100644 index 00000000..b6733c4b --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_single_value.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_single_value.sql new file mode 100644 index 00000000..479a45f1 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_table_types_sql.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_table_types_sql.sql new file mode 100644 index 00000000..8a88c45a --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_tables_by_pattern_sql.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_tables_by_pattern_sql.sql new file mode 100644 index 00000000..03f96624 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_tables_by_prefix_sql.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/get_tables_by_prefix_sql.sql new file mode 100644 index 00000000..f8fdfba6 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/groupby.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/groupby.sql new file mode 100644 index 00000000..68a68cf2 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/haversine_distance.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/haversine_distance.sql new file mode 100644 index 00000000..70f276ec --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/nullcheck.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/nullcheck.sql new file mode 100644 index 00000000..509d24f7 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/nullcheck_table.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/nullcheck_table.sql new file mode 100644 index 00000000..c9ab5838 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/pivot.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/pivot.sql new file mode 100644 index 00000000..3eabc727 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/safe_add.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/safe_add.sql new file mode 100644 index 00000000..a67cd296 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/safe_divide.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/safe_divide.sql new file mode 100644 index 00000000..791f72c3 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/safe_subtract.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/safe_subtract.sql new file mode 100644 index 00000000..378424ce --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/star.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/star.sql new file mode 100644 index 00000000..515b77b6 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/star.sql @@ -0,0 +1,40 @@ +{% macro star(from, relation_alias=False, except=[], prefix='', suffix='', quote_identifiers=True) -%} + {{ return(adapter.dispatch('star', 'dbt_utils')(from, relation_alias, except, prefix, suffix, quote_identifiers)) }} +{% endmacro %} + +{% macro default__star(from, relation_alias=False, except=[], prefix='', suffix='', quote_identifiers=True) -%} + {%- 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) %} + + {%- 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 prefix!='' or suffix!='' %} as {{ adapter.quote(prefix ~ col ~ suffix)|trim }} {%- endif -%} + {%- else -%} + {{ col|trim }} {%- if prefix!='' or suffix!='' %} as {{ (prefix ~ col ~ suffix)|trim }} {%- endif -%} + {% endif %} + {%- if not loop.last %},{{ '\n ' }}{%- endif -%} + {%- endfor -%} + {% endif %} +{%- endmacro %} + diff --git a/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/surrogate_key.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/surrogate_key.sql new file mode 100644 index 00000000..98e968ae --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/union.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/union.sql new file mode 100644 index 00000000..ac289e2f --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/union.sql @@ -0,0 +1,128 @@ +{%- 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) }} as {{ dbt.type_string() }}) as {{ source_column_name }}, + {%- 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/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/unpivot.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/unpivot.sql new file mode 100644 index 00000000..371b314b --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/unpivot.sql @@ -0,0 +1,66 @@ +{# +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') -%} + {{ return(adapter.dispatch('unpivot', 'dbt_utils')(relation, cast_to, exclude, remove, field_name, value_name)) }} +{% endmacro %} + +{% macro default__unpivot(relation=none, cast_to='varchar', exclude=none, remove=none, field_name='field_name', value_name='value') -%} + + {% 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 -%} + select + {%- for exclude_col in exclude %} + {{ exclude_col }}, + {%- endfor %} + + cast('{{ col.column }}' as {{ dbt.type_string() }}) as {{ field_name }}, + cast( {% if col.data_type == 'boolean' %} + {{ dbt.cast_bool_to_text(col.column) }} + {% else %} + {{ col.column }} + {% endif %} + as {{ cast_to }}) as {{ value_name }} + + from {{ relation }} + + {% if not loop.last -%} + union all + {% endif -%} + {%- endfor -%} + +{%- endmacro %} diff --git a/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/width_bucket.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/sql/width_bucket.sql new file mode 100644 index 00000000..fb7fc231 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/web/get_url_host.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/web/get_url_host.sql new file mode 100644 index 00000000..ddd01974 --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/web/get_url_parameter.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/web/get_url_parameter.sql new file mode 100644 index 00000000..8147b41f --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/macros/web/get_url_path.sql b/projects/test_lyon/dbt_packages/dbt_utils/macros/web/get_url_path.sql new file mode 100644 index 00000000..b59401df --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/pytest.ini b/projects/test_lyon/dbt_packages/dbt_utils/pytest.ini new file mode 100644 index 00000000..a81f2a6b --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/run_functional_test.sh b/projects/test_lyon/dbt_packages/dbt_utils/run_functional_test.sh new file mode 100755 index 00000000..172d5aec --- /dev/null +++ b/projects/test_lyon/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/projects/test_lyon/dbt_packages/dbt_utils/run_test.sh b/projects/test_lyon/dbt_packages/dbt_utils/run_test.sh new file mode 100755 index 00000000..b6251b6d --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/run_test.sh @@ -0,0 +1,18 @@ +#!/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 +cp ci/sample.profiles.yml profiles.yml +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/projects/test_lyon/dbt_packages/dbt_utils/tests/__init__.py b/projects/test_lyon/dbt_packages/dbt_utils/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/projects/test_lyon/dbt_packages/dbt_utils/tests/conftest.py b/projects/test_lyon/dbt_packages/dbt_utils/tests/conftest.py new file mode 100644 index 00000000..e7d9d198 --- /dev/null +++ b/projects/test_lyon/dbt_packages/dbt_utils/tests/conftest.py @@ -0,0 +1,98 @@ +import pytest +import os + +pytest_plugins = ["dbt.tests.fixtures.project"] + + +def pytest_addoption(parser): + parser.addoption("--profile", action="store", default="postgres", type=str) + + +# Using @pytest.mark.skip_profile('postgres') uses the 'skip_by_profile_type' +# autouse fixture below +def pytest_configure(config): + config.addinivalue_line( + "markers", + "skip_profile(profile): skip test for the given profile", + ) + config.addinivalue_line( + "markers", + "only_profile(profile): only test the given profile", + ) + + +@pytest.fixture(scope="session") +def dbt_profile_target(request): + profile_type = request.config.getoption("--profile") + if profile_type == "postgres": + target = postgres_target() + elif profile_type == "redshift": + target = redshift_target() + elif profile_type == "snowflake": + target = snowflake_target() + elif profile_type == "bigquery": + target = bigquery_target() + else: + raise ValueError(f"Invalid profile type '{profile_type}'") + return target + + +def postgres_target(): + return { + "type": "postgres", + "host": os.getenv('POSTGRES_TEST_HOST'), + "user": os.getenv('POSTGRES_TEST_USER'), + "pass": os.getenv('POSTGRES_TEST_PASS'), + "port": int(os.getenv('POSTGRES_TEST_PORT')), + "dbname": os.getenv('POSTGRES_TEST_DBNAME'), + } + + +def redshift_target(): + return { + "type": "redshift", + "host": os.getenv('REDSHIFT_TEST_HOST'), + "user": os.getenv('REDSHIFT_TEST_USER'), + "pass": os.getenv('REDSHIFT_TEST_PASS'), + "port": int(os.getenv('REDSHIFT_TEST_PORT')), + "dbname": os.getenv('REDSHIFT_TEST_DBNAME'), + } + + +def bigquery_target(): + return { + "type": "bigquery", + "method": "service-account", + "keyfile": os.getenv('BIGQUERY_SERVICE_KEY_PATH'), + "project": os.getenv('BIGQUERY_TEST_DATABASE'), + } + + +def snowflake_target(): + return { + "type": "snowflake", + "account": os.getenv('SNOWFLAKE_TEST_ACCOUNT'), + "user": os.getenv('SNOWFLAKE_TEST_USER'), + "password": os.getenv('SNOWFLAKE_TEST_PASSWORD'), + "role": os.getenv('SNOWFLAKE_TEST_ROLE'), + "database": os.getenv('SNOWFLAKE_TEST_DATABASE'), + "warehouse": os.getenv('SNOWFLAKE_TEST_WAREHOUSE'), + } + + +@pytest.fixture(autouse=True) +def skip_by_profile_type(request): + profile_type = request.config.getoption("--profile") + if request.node.get_closest_marker("skip_profile"): + for skip_profile_type in request.node.get_closest_marker("skip_profile").args: + if skip_profile_type == profile_type: + pytest.skip("skipped on '{profile_type}' profile") + + +@pytest.fixture(autouse=True) +def only_profile_type(request): + profile_type = request.config.getoption("--profile") + if request.node.get_closest_marker("only_profile"): + for only_profile_type in request.node.get_closest_marker("only_profile").args: + if only_profile_type != profile_type: + pytest.skip("skipped on '{profile_type}' profile") diff --git a/projects/test_lyon/dbt_packages/demo b/projects/test_lyon/dbt_packages/demo new file mode 120000 index 00000000..3411b3fe --- /dev/null +++ b/projects/test_lyon/dbt_packages/demo @@ -0,0 +1 @@ +/Users/uosp/Documents/osp_dev/dbt-processing/projects/demo \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_orders.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_orders.sql new file mode 100644 index 00000000..71e20070 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_orders.sql @@ -0,0 +1,13 @@ +SELECT + id, + decidim_user_id, + checked_out_at, + created_at, + updated_at, + decidim_budgets_budget_id, + (CASE + WHEN checked_out_at IS NULL + THEN false + ELSE true + END) AS vote_finished +FROM "test_lyon"."prod"."stg_decidim_budgets_orders" \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_projects.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_projects.sql new file mode 100644 index 00000000..7b0a3bc4 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_projects.sql @@ -0,0 +1,16 @@ +SELECT + id, + title, + description, + created_at, + decidim_scope_id, + project_amount, + selected_at, + decidim_budgets_budget_id, + resource_type, + (CASE + WHEN selected_at IS NULL + THEN false + ELSE true + END) AS is_selected +FROM "test_lyon"."prod"."stg_decidim_budgets_projects" \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/components/int_components.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/components/int_components.sql new file mode 100644 index 00000000..013fc329 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/intermediate/components/int_components.sql @@ -0,0 +1,25 @@ +SELECT + decidim_components.id, + decidim_components.manifest_name, + -- For Metabase usage, we translate the name in French + (CASE decidim_components.manifest_name + WHEN 'accountability' THEN 'Suivi' + WHEN 'pages' THEN 'Page' + WHEN 'budgets' THEN 'Budgets' + WHEN 'meetings' THEN 'Rencontres' + WHEN 'proposals' THEN 'Propositions' + WHEN 'surveys' THEN 'Enquêtes' + WHEN 'blogs' THEN 'Blogs' + ELSE decidim_components.manifest_name + END + ) AS translated_manifest_name, + decidim_components.name, + decidim_components.participatory_space_id, + decidim_components.participatory_space_type, + decidim_components.settings, + decidim_components.weight, + decidim_components.permissions, + decidim_components.published_at, + decidim_components.created_at, + decidim_components.updated_at + FROM "test_lyon"."prod"."stg_decidim_components" as decidim_components \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_file.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_file.sql new file mode 100644 index 00000000..40117f9b --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_file.sql @@ -0,0 +1,27 @@ + + +WITH org AS ( + -- Assumption: There is only one organization, so we select the first available host + SELECT host + FROM "test_lyon"."prod"."organizations" + LIMIT 1 +) +SELECT DISTINCT + decidim_forms_answers.decidim_user_id, + decidim_forms_answers.session_token, + decidim_forms_answers.ip_hash, + decidim_forms_questions.question_type, + decidim_forms_questions.position AS "position", + decidim_attachments.file AS "answer", + '' AS "sub_matrix_question", + CONCAT('https://', org.host, '/uploads/decidim/attachment/file/', decidim_attachments.id, '/', decidim_attachments.file) AS custom_body, + -1 AS sorting_position, + decidim_forms_questions.decidim_questionnaire_id, + decidim_forms_questions.body, + decidim_forms_answers.created_at, + decidim_forms_answers.author_status +FROM "test_lyon"."prod"."int_forms_answers" decidim_forms_answers +JOIN "test_lyon"."prod"."stg_decidim_forms_questions" AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id +JOIN "test_lyon"."prod"."stg_decidim_attachments" decidim_attachments ON decidim_attachments.attached_to_id = decidim_forms_answers.id +CROSS JOIN org +WHERE attached_to_type = 'Decidim::Forms::Answer' \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_matrix.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_matrix.sql new file mode 100644 index 00000000..2185df95 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_matrix.sql @@ -0,0 +1,21 @@ + + +SELECT DISTINCT + decidim_forms_answers.decidim_user_id, + decidim_forms_answers.session_token, + decidim_forms_answers.ip_hash, + decidim_forms_questions.question_type, + decidim_forms_questions.position AS "position", + decidim_forms_answer_choices.body::text AS "answer", + decidim_forms_question_matrix_rows.body AS sub_matrix_question, + '' AS custom_body, + -1 AS sorting_position, + decidim_forms_questions.decidim_questionnaire_id, + decidim_forms_questions.body, + decidim_forms_answers.created_at, + decidim_forms_answers.author_status +FROM "test_lyon"."prod"."int_forms_answers" decidim_forms_answers +JOIN "test_lyon"."prod"."stg_decidim_forms_questions" AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id +JOIN "test_lyon"."prod"."stg_decidim_forms_answer_choices" decidim_forms_answer_choices ON decidim_forms_answer_choices.decidim_answer_id = decidim_forms_answers.id +JOIN "test_lyon"."prod"."stg_decidim_forms_question_matrix_rows" decidim_forms_question_matrix_rows ON decidim_forms_question_matrix_rows.id = decidim_forms_answer_choices.decidim_question_matrix_row_id +WHERE question_type = ANY('{matrix_single, matrix_multiple}'::text[]) \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_option_and_sorting.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_option_and_sorting.sql new file mode 100644 index 00000000..42beb7fb --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_option_and_sorting.sql @@ -0,0 +1,20 @@ + + +SELECT DISTINCT + decidim_forms_answers.decidim_user_id, + decidim_forms_answers.session_token, + decidim_forms_answers.ip_hash, + decidim_forms_questions.question_type, + decidim_forms_questions.position AS question_position, + decidim_forms_answer_choices.body::text AS "answer", + '' AS sub_matrix_question, + COALESCE(decidim_forms_answer_choices.custom_body, '') AS custom_body, + (CASE question_type WHEN 'sorting' THEN decidim_forms_answer_choices.position ELSE -1 END) AS sorting_position, + decidim_forms_questions.decidim_questionnaire_id, + decidim_forms_questions.body, + decidim_forms_answers.created_at, + decidim_forms_answers.author_status +FROM "test_lyon"."prod"."int_forms_answers" decidim_forms_answers +JOIN "test_lyon"."prod"."stg_decidim_forms_questions" AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id +JOIN "test_lyon"."prod"."stg_decidim_forms_answer_choices" decidim_forms_answer_choices ON decidim_forms_answer_choices.decidim_answer_id = decidim_forms_answers.id +WHERE question_type = ANY('{single_option, multiple_option, sorting}'::text[]) \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_short_and_long_answer.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_short_and_long_answer.sql new file mode 100644 index 00000000..148d3b2b --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_short_and_long_answer.sql @@ -0,0 +1,19 @@ + + +SELECT + decidim_user_id, + session_token, + ip_hash, + question_type, + position, + COALESCE(NULLIF(decidim_forms_answers.body,''), 'Pas de réponse') AS "answer", + '' AS sub_matrix_question, + '' AS custom_body, + -1 AS sorting_position, + decidim_forms_questions.decidim_questionnaire_id, + decidim_forms_questions.body, + decidim_forms_answers.created_at, + decidim_forms_answers.author_status +FROM "test_lyon"."prod"."int_forms_answers" decidim_forms_answers +JOIN "test_lyon"."prod"."stg_decidim_forms_questions" AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id +WHERE question_type = ANY('{short_answer,long_answer}'::text[]) \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/int_forms_answers.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/int_forms_answers.sql new file mode 100644 index 00000000..72289341 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/int_forms_answers.sql @@ -0,0 +1,18 @@ + + +SELECT + id, + body, + decidim_user_id, + decidim_questionnaire_id, + decidim_question_id, + created_at, + (CASE + WHEN decidim_user_id IS NULL THEN 'Non connecté' + ELSE 'Inscrit et connecté' + END + ) AS author_status, + updated_at, + session_token, + ip_hash +FROM "test_lyon"."prod"."stg_decidim_forms_answers" \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/meetings/int_meetings.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/meetings/int_meetings.sql new file mode 100644 index 00000000..50822855 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/intermediate/meetings/int_meetings.sql @@ -0,0 +1,24 @@ +SELECT + decidim_meetings.id, + decidim_meetings.title, + decidim_meetings.description, + decidim_meetings.address, + decidim_meetings.attendees_count, + decidim_meetings.created_at, + decidim_meetings.decidim_scope_id, + decidim_meetings.decidim_component_id, + decidim_meetings.start_time, + decidim_meetings.end_time, + decidim_meetings.registration_url, + decidim_meetings.type_of_meeting, + (CASE decidim_meetings.type_of_meeting + WHEN 'online' THEN 'En ligne' + WHEN 'in_person' THEN 'En présentiel' + WHEN 'hybrid' THEN 'Hybride' + ELSE decidim_meetings.type_of_meeting + END + ) AS translated_type_of_meeting, + decidim_meetings.private_meeting, + decidim_meetings.decidim_author_id, + decidim_meetings.resource_type + FROM "test_lyon"."prod"."stg_decidim_meetings" as decidim_meetings \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/organizations/int_organizations.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/organizations/int_organizations.sql new file mode 100644 index 00000000..bb104b91 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/intermediate/organizations/int_organizations.sql @@ -0,0 +1,29 @@ + + + +WITH source AS ( + SELECT * FROM "test_lyon"."prod"."stg_decidim_organizations" +), +renamed AS ( + SELECT + id, + name, + host, + default_locale, + available_locales, + created_at, + regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description, + secondary_hosts, + available_authorizations, + header_snippets, + tos_version, + badges_enabled, + send_welcome_notification, + users_registration_mode, + time_zone + FROM source + WHERE host = '' + -- Assumption: There is only one organization, so we select the first available host + LIMIT 1 +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/proposals/int_proposals.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/proposals/int_proposals.sql new file mode 100644 index 00000000..1302310a --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/intermediate/proposals/int_proposals.sql @@ -0,0 +1,25 @@ + + +SELECT + decidim_proposals.id, + decidim_proposals.title, + decidim_proposals.body, + decidim_proposals.resource_type, + decidim_proposals.decidim_component_id, + decidim_proposals.decidim_scope_id, + decidim_proposals.created_at, + decidim_proposals.published_at, + COALESCE(NULLIF(decidim_proposals.state, NULL), 'Pas d''état') AS state, + (CASE + WHEN decidim_proposals.state = 'evaluating' THEN 'En cours d''évaluation' + WHEN decidim_proposals.state = 'rejected' THEN 'Rejetée' + WHEN decidim_proposals.state = 'accepted' THEN 'Acceptée' + WHEN decidim_proposals.state IS NULL THEN 'Pas d''état' + ELSE decidim_proposals.state + END + ) AS translated_state, + decidim_proposals.comments_count, + decidim_proposals.endorsements_count, + COALESCE(NULLIF(decidim_proposals.address,''),'Pas d''adresse') AS address +FROM "test_lyon"."prod"."stg_decidim_proposals" AS decidim_proposals +WHERE published_at IS NOT NULL \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/scopes/int_scopes.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/scopes/int_scopes.sql new file mode 100644 index 00000000..86247ae0 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/intermediate/scopes/int_scopes.sql @@ -0,0 +1,12 @@ +-- Due to ARRAY bug in test, we create an intermediate scopes without the column part_of + +SELECT + decidim_scopes.id, + decidim_scopes.decidim_organization_id, + decidim_scopes.created_at, + decidim_scopes.updated_at, + coalesce(nullif(decidim_scopes.name, ''), 'Sans secteur') as name, + decidim_scopes.scope_type_id, + decidim_scopes.parent_id, + decidim_scopes.code +FROM "test_lyon"."prod"."stg_decidim_scopes" as decidim_scopes \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/users/int_users.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/users/int_users.sql new file mode 100644 index 00000000..39517ec8 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/intermediate/users/int_users.sql @@ -0,0 +1,47 @@ + + +SELECT + decidim_users.id, + decidim_users.email, + decidim_users.sign_in_count, + (CASE + WHEN decidim_users.sign_in_count = 0 THEN 'Jamais' + WHEN decidim_users.sign_in_count = 1 THEN 'Une seule fois' + WHEN decidim_users.sign_in_count = 2 THEN 'Deux fois' + WHEN decidim_users.sign_in_count BETWEEN 2 AND 10 THEN 'Entre 2 et 10 fois' + ELSE 'Plus de 10 fois' + END + ) AS sign_in_frequency, + decidim_users.last_sign_in_at, + decidim_users.created_at, + decidim_users.updated_at, + decidim_users.invitation_created_at, + decidim_users.invitation_sent_at, + decidim_users.invitation_accepted_at, + decidim_users.invited_by_id, + decidim_users.invited_by_type, + decidim_users.decidim_organization_id, + decidim_users.confirmed_at, + decidim_users.confirmation_token, + decidim_users.unconfirmed_email, + decidim_users.name, + decidim_users.locale, + decidim_users.deleted_at, + decidim_users.admin, + decidim_users.managed, + decidim_users.roles, + decidim_users.nickname, + decidim_users.accepted_tos_version, + decidim_users.type, + decidim_users.following_count, + decidim_users.followers_count, + decidim_users.failed_attempts, + decidim_users.locked_at, + decidim_users.admin_terms_accepted_at, + decidim_users.blocked, + decidim_users.blocked_at, + (CASE WHEN decidim_users.confirmed_at IS NULL THEN false ELSE true END) AS confirmed, + decidim_users.extended_data +FROM "test_lyon"."prod"."stg_decidim_users" as decidim_users + WHERE deleted_at IS NULL + AND type LIKE 'Decidim::User' \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/attachments.sql b/projects/test_lyon/target/compiled/demo/models/marts/attachments.sql new file mode 100644 index 00000000..c76517f0 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/attachments.sql @@ -0,0 +1,15 @@ +WITH org AS ( + -- Assumption: There is only one organization, so we select the first available host + SELECT host + FROM "test_lyon"."prod"."organizations" + LIMIT 1 +) +SELECT + decidim_attachments.id, + decidim_attachments.file, + decidim_attachments.attached_to_id, + decidim_attachments.attached_to_type, + concat('https://', org.host, '/uploads/decidim/attachment/file/', decidim_attachments.id, '/', decidim_attachments.file) AS url +FROM + "test_lyon"."prod"."stg_decidim_attachments" AS decidim_attachments +CROSS JOIN org \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/blogs_posts/blogs_posts.sql b/projects/test_lyon/target/compiled/demo/models/marts/blogs_posts/blogs_posts.sql new file mode 100644 index 00000000..f366d022 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/blogs_posts/blogs_posts.sql @@ -0,0 +1,11 @@ +SELECT + decidim_blogs_posts.id, + decidim_blogs_posts.title, + decidim_blogs_posts.body, + decidim_blogs_posts.decidim_component_id, + decidim_blogs_posts.created_at, + decidim_blogs_posts.decidim_author_id, + decidim_blogs_posts.resource_type, + concat('https://', decidim_components.organization_host, '/', decidim_components.ps_space_type_slug, '/', decidim_components.ps_slug, '/f/', decidim_components.id, '/posts/', decidim_blogs_posts.id) AS post_url +FROM "test_lyon"."prod"."stg_decidim_blogs_posts" AS decidim_blogs_posts +JOIN "test_lyon"."prod"."components" AS decidim_components ON decidim_components.id = decidim_component_id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets.sql b/projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets.sql new file mode 100644 index 00000000..53a9a8e8 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets.sql @@ -0,0 +1,9 @@ +SELECT + decidim_budgets_budgets.id, + decidim_budgets_budgets.title, + decidim_components.id AS decidim_component_id, + decidim_components.ps_url AS url, + decidim_components.ps_slug, + decidim_components.ps_title +FROM "test_lyon"."prod"."stg_decidim_budgets" AS decidim_budgets_budgets +JOIN "test_lyon"."prod"."components" AS decidim_components on decidim_components.id = decidim_budgets_budgets.decidim_component_id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets_projects.sql b/projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets_projects.sql new file mode 100644 index 00000000..2c11d0d2 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets_projects.sql @@ -0,0 +1,33 @@ +WITH categorizations AS ( + + SELECT + array_agg(category_name) AS categories, + array_agg(child_name) AS sub_categories, + categorizable_id + FROM "test_lyon"."prod"."categorizations" AS categorizations + WHERE categorizations.categorizable_type = 'Decidim::Budgets::Project' + GROUP BY categorizable_id + +) +SELECT + decidim_budgets_projects.id, + decidim_budgets_projects.title, + decidim_budgets_projects.description, + decidim_budgets_projects.created_at, + decidim_budgets_projects.decidim_scope_id, + decidim_budgets_projects.project_amount, + decidim_budgets_projects.selected_at, + decidim_budgets_projects.is_selected, + decidim_budgets_budgets.id AS budget_id, + decidim_budgets_budgets.title AS budget_title, + decidim_budgets_projects.resource_type, + decidim_budgets_budgets.decidim_component_id, + concat(decidim_components.component_url,'/', decidim_components.manifest_name,'/', decidim_budgets_budgets.id, '/projects/', decidim_budgets_projects.id) AS project_url, + categorizations.categories, + coalesce(categorizations.categories[1], 'Sans catégorie') AS first_category, + categorizations.sub_categories, + coalesce(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category +FROM "test_lyon"."prod"."int_budgets_projects" AS decidim_budgets_projects +JOIN "test_lyon"."prod"."stg_decidim_budgets" AS decidim_budgets_budgets on decidim_budgets_budgets.id = decidim_budgets_projects.decidim_budgets_budget_id +JOIN "test_lyon"."prod"."components" as decidim_components on decidim_components.id = decidim_budgets_budgets.decidim_component_id +LEFT JOIN categorizations on categorizations.categorizable_id = decidim_budgets_projects.id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/budgets/projects_votes.sql b/projects/test_lyon/target/compiled/demo/models/marts/budgets/projects_votes.sql new file mode 100644 index 00000000..405ccca3 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/budgets/projects_votes.sql @@ -0,0 +1,28 @@ +-- /!\ Warning : counts unfinished votes ! +-- /!\ Warning : should be filtered on the corresponding budget to get the good values + + + +WITH budgets_projects AS ( + SELECT + decidim_budgets_line_items.decidim_order_id, + decidim_budgets_projects.id AS "project_id", + decidim_budgets_projects.title AS "project_title", + decidim_budgets_projects.decidim_component_id, + decidim_budgets_projects.project_url + from "test_lyon"."prod"."stg_decidim_budgets_line_items" AS decidim_budgets_line_items + JOIN "test_lyon"."prod"."budgets_projects" decidim_budgets_projects on decidim_budgets_projects.id = decidim_budgets_line_items.decidim_project_id +) + SELECT + decidim_budgets_orders.id as order_id, + decidim_budgets_orders.decidim_user_id, + budgets_projects.project_id, + budgets_projects.project_title, + budgets_projects.decidim_component_id, + decidim_budgets_orders.created_at, + decidim_budgets_orders.checked_out_at, + budgets_projects.project_url, + decidim_budgets_orders.vote_finished, + decidim_budgets_orders.decidim_budgets_budget_id + from "test_lyon"."prod"."int_budgets_orders" AS decidim_budgets_orders + LEFT JOIN budgets_projects on decidim_order_id = decidim_budgets_orders.id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/categorizations/categorizations.sql b/projects/test_lyon/target/compiled/demo/models/marts/categorizations/categorizations.sql new file mode 100644 index 00000000..562d71e4 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/categorizations/categorizations.sql @@ -0,0 +1,31 @@ +WITH main_categories AS ( + SELECT + decidim_categories.id AS id, + decidim_categories.name AS category_name, + 0 AS child_id, + '' AS child_name, + decidim_categorizations.categorizable_id, + decidim_categorizations.categorizable_type + FROM "test_lyon"."prod"."stg_decidim_categorizations" AS decidim_categorizations + JOIN "test_lyon"."prod"."stg_decidim_categories" AS decidim_categories ON decidim_categories.id = decidim_categorizations.decidim_category_id + WHERE decidim_categories.parent_id IS NULL +), +sub_categories AS ( + SELECT + parent_categories.id AS id, + parent_categories.name AS category_name, + decidim_categories.id AS child_id, + decidim_categories.name AS child_name, + decidim_categorizations.categorizable_id, + decidim_categorizations.categorizable_type + FROM "test_lyon"."prod"."stg_decidim_categorizations" AS decidim_categorizations + JOIN "test_lyon"."prod"."stg_decidim_categories" AS decidim_categories ON decidim_categories.id = decidim_categorizations.decidim_category_id + LEFT JOIN "test_lyon"."prod"."stg_decidim_categories" AS parent_categories ON decidim_categories.parent_id = parent_categories.id + WHERE decidim_categories.parent_id IS NOT NULL +), +categories AS ( + SELECT * FROM main_categories + UNION ALL + SELECT * FROM sub_categories +) +SELECT * FROM categories \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/comments/comments.sql b/projects/test_lyon/target/compiled/demo/models/marts/comments/comments.sql new file mode 100644 index 00000000..81ba5640 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/comments/comments.sql @@ -0,0 +1,94 @@ + + + + + +WITH commentaries AS ( + + SELECT + comments.*, + "test_lyon"."prod"."stg_decidim_accountability_results".decidim_component_id AS "decidim_component_id" + FROM "test_lyon"."prod"."stg_decidim_accountability_results" + JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments + on comments.decidim_root_commentable_id = "test_lyon"."prod"."stg_decidim_accountability_results".id + and comments.decidim_root_commentable_type = 'Decidim::Accountability::Result' + union all + + SELECT + comments.*, + "test_lyon"."prod"."blogs_posts".decidim_component_id AS "decidim_component_id" + FROM "test_lyon"."prod"."blogs_posts" + JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments + on comments.decidim_root_commentable_id = "test_lyon"."prod"."blogs_posts".id + and comments.decidim_root_commentable_type = 'Decidim::Blogs::Post' + union all + + SELECT + comments.*, + "test_lyon"."prod"."budgets_projects".decidim_component_id AS "decidim_component_id" + FROM "test_lyon"."prod"."budgets_projects" + JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments + on comments.decidim_root_commentable_id = "test_lyon"."prod"."budgets_projects".id + and comments.decidim_root_commentable_type = 'Decidim::Budgets::Project' + union all + + SELECT + comments.*, + "test_lyon"."prod"."debates".decidim_component_id AS "decidim_component_id" + FROM "test_lyon"."prod"."debates" + JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments + on comments.decidim_root_commentable_id = "test_lyon"."prod"."debates".id + and comments.decidim_root_commentable_type = 'Decidim::Debates::Debate' + union all + + SELECT + comments.*, + "test_lyon"."prod"."meetings".decidim_component_id AS "decidim_component_id" + FROM "test_lyon"."prod"."meetings" + JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments + on comments.decidim_root_commentable_id = "test_lyon"."prod"."meetings".id + and comments.decidim_root_commentable_type = 'Decidim::Meetings::Meeting' + union all + + SELECT + comments.*, + "test_lyon"."prod"."proposals".decidim_component_id AS "decidim_component_id" + FROM "test_lyon"."prod"."proposals" + JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments + on comments.decidim_root_commentable_id = "test_lyon"."prod"."proposals".id + and comments.decidim_root_commentable_type = 'Decidim::Proposals::Proposal' + union all + + SELECT + comments.*, + "test_lyon"."prod"."stg_decidim_proposals_collaborative_drafts".decidim_component_id AS "decidim_component_id" + FROM "test_lyon"."prod"."stg_decidim_proposals_collaborative_drafts" + JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments + on comments.decidim_root_commentable_id = "test_lyon"."prod"."stg_decidim_proposals_collaborative_drafts".id + and comments.decidim_root_commentable_type = 'Decidim::Proposals::CollaborativeDraft' + + +) + +SELECT + commentaries.id, + commentaries.decidim_commentable_id, + commentaries.decidim_commentable_type, + commentaries.decidim_author_id, + commentaries.created_at, + commentaries.depth, + commentaries.alignment, + commentaries.decidim_root_commentable_id, + commentaries.decidim_root_commentable_type, + commentaries.decidim_author_type, + commentaries.body, + commentaries.decidim_component_id, + components.ps_slug, + concat('https://', components.organization_host, '/', components.ps_space_type_slug, '/', components.ps_slug, '/f/', components.id, '/', components.manifest_name,'/', commentaries.decidim_root_commentable_id, '?commentId=', commentaries.id, '#comment_', commentaries.id) AS comment_url +FROM commentaries +JOIN "test_lyon"."prod"."components" AS components + on components.id = commentaries.decidim_component_id +LEFT JOIN "test_lyon"."prod"."stg_decidim_moderations" AS decidim_moderations + on decidim_moderations.decidim_reportable_type = 'Decidim::Comments::Comment' + and decidim_moderations.decidim_reportable_id = commentaries.id +where decidim_moderations.hidden_at is null \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/components/components.sql b/projects/test_lyon/target/compiled/demo/models/marts/components/components.sql new file mode 100644 index 00000000..c6c8de5d --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/components/components.sql @@ -0,0 +1,58 @@ +-- Warning: are not taken by default into account Conferences, Consultations, Elections, Initiatives, Votations + + + +WITH assemblies_spaces AS ( + SELECT + id AS ps_id, + published_at AS ps_published_at, + title AS ps_title, + subtitle AS ps_subtitle, + slug AS ps_slug, + decidim_organization_id, + 'Decidim::Assembly' AS ps_type, + 'assemblies' AS ps_space_type_slug + FROM "test_lyon"."prod"."stg_decidim_assemblies" +), +participatory_processes_spaces AS ( + SELECT + id AS ps_id, + published_at AS ps_published_at, + title AS ps_title, + subtitle AS ps_subtitle, + slug AS ps_slug, + decidim_organization_id, + 'Decidim::ParticipatoryProcess' AS ps_type, + 'processes' AS ps_space_type_slug + FROM "test_lyon"."prod"."stg_decidim_participatory_processes" +), +participatory_spaces AS ( + SELECT * FROM assemblies_spaces + UNION ALL + SELECT * FROM participatory_processes_spaces +), +components AS ( + SELECT + decidim_components.id, + decidim_components.manifest_name, + decidim_components.translated_manifest_name, + concat(decidim_components.name, ' (', decidim_components.translated_manifest_name, ')') AS component_name, + decidim_components.published_at, + decidim_components.created_at, + concat('https://',decidim_organizations.host,'/', participatory_spaces.ps_space_type_slug, '/', participatory_spaces.ps_slug,'/f/', decidim_components.id) AS component_url, + participatory_spaces.ps_id, + participatory_spaces.ps_published_at, + participatory_spaces.ps_title, + participatory_spaces.ps_subtitle, + participatory_spaces.ps_slug, + participatory_spaces.ps_type, + participatory_spaces.ps_space_type_slug, + concat('https://',decidim_organizations.host,'/', participatory_spaces.ps_space_type_slug, '/', participatory_spaces.ps_slug,'/') AS ps_url, + decidim_organization_id, + decidim_organizations.host AS organization_host + FROM "test_lyon"."prod"."int_components" AS decidim_components + JOIN participatory_spaces ON participatory_spaces.ps_type = decidim_components.participatory_space_type AND decidim_components.participatory_space_id = participatory_spaces.ps_id + JOIN "test_lyon"."prod"."int_organizations" AS decidim_organizations ON decidim_organizations.id = participatory_spaces.decidim_organization_id + WHERE participatory_spaces.ps_published_at IS NOT NULL +) +SELECT * FROM components \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/debates/debates.sql b/projects/test_lyon/target/compiled/demo/models/marts/debates/debates.sql new file mode 100644 index 00000000..8e61c7b8 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/debates/debates.sql @@ -0,0 +1,42 @@ +WITH categorizations AS ( + + SELECT + array_agg(category_name) AS categories, + array_agg(child_name) AS sub_categories, + categorizable_id + FROM "test_lyon"."prod"."categorizations" AS categorizations + WHERE categorizations.categorizable_type = 'Decidim::Debates::Debate' + GROUP BY categorizable_id + +) +SELECT + decidim_debates_debates.id, + decidim_debates_debates.title, + decidim_debates_debates.description, + decidim_debates_debates.start_time, + decidim_debates_debates.end_time, + decidim_debates_debates.decidim_component_id, + decidim_debates_debates.decidim_author_id, + decidim_debates_debates.created_at, + decidim_debates_debates.closed_at, + decidim_components.ps_slug, + concat( + 'https://', + decidim_components.organization_host, + '/', + decidim_components.ps_space_type_slug, + '/', + decidim_components.ps_slug, + '/f/', + decidim_components.id, + '/debates/', + decidim_debates_debates.id + ) AS debate_url, + decidim_debates_debates.resource_type, + categorizations.categories, + coalesce(categorizations.categories[1], 'Sans catégorie') AS first_category, + categorizations.sub_categories, + coalesce(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category +FROM "test_lyon"."prod"."stg_decidim_debates" AS decidim_debates_debates + JOIN "test_lyon"."prod"."components" decidim_components on decidim_components.id = decidim_component_id + LEFT JOIN categorizations on categorizations.categorizable_id = decidim_debates_debates.id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/endorsements/endorsements.sql b/projects/test_lyon/target/compiled/demo/models/marts/endorsements/endorsements.sql new file mode 100644 index 00000000..91f258ac --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/endorsements/endorsements.sql @@ -0,0 +1,43 @@ + + +WITH endorsements_proposals AS ( + SELECT + decidim_endorsements.*, + decidim_component_id + FROM "test_lyon"."prod"."stg_decidim_endorsements" AS decidim_endorsements + JOIN "test_lyon"."prod"."stg_decidim_proposals" decidim_proposals_proposals on decidim_endorsements.resource_id = decidim_proposals_proposals.id + and decidim_proposals_proposals.resource_type = decidim_endorsements.resource_type +), endorsements_debates AS ( + SELECT + decidim_endorsements.*, + decidim_component_id + FROM "test_lyon"."prod"."stg_decidim_endorsements" AS decidim_endorsements + JOIN "test_lyon"."prod"."stg_decidim_debates" AS decidim_debates_debates on decidim_endorsements.resource_id = decidim_debates_debates.id + and decidim_debates_debates.resource_type = decidim_endorsements.resource_type +), endorsements_blogs_posts AS ( + SELECT + decidim_endorsements.*, + decidim_component_id + FROM "test_lyon"."prod"."stg_decidim_endorsements" AS decidim_endorsements + JOIN "test_lyon"."prod"."stg_decidim_blogs_posts" AS decidim_blogs_posts on decidim_endorsements.resource_id = decidim_blogs_posts.id + and decidim_blogs_posts.resource_type = decidim_endorsements.resource_type +), endorsements as ( + SELECT * FROM endorsements_proposals union all + SELECT * FROM endorsements_debates union all + SELECT * FROM endorsements_blogs_posts +) + +SELECT + endorsements.id, + endorsements.resource_type, + endorsements.resource_id, + endorsements.decidim_author_type, + endorsements.decidim_author_id, + endorsements.created_at, + endorsements.updated_at, + endorsements.decidim_component_id +FROM endorsements +LEFT JOIN "test_lyon"."prod"."stg_decidim_moderations" AS decidim_moderations + ON decidim_moderations.decidim_reportable_type = endorsements.resource_type + AND decidim_moderations.decidim_reportable_id = endorsements.resource_id +WHERE decidim_moderations.hidden_at IS NULL \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/followings/followings.sql b/projects/test_lyon/target/compiled/demo/models/marts/followings/followings.sql new file mode 100644 index 00000000..f0f2d97b --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/followings/followings.sql @@ -0,0 +1,120 @@ + + + +WITH followings_proposals AS ( + SELECT + decidim_follows.*, + decidim_proposals_proposals.decidim_component_id, + url AS followable_url, + title AS followable_title + FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows + JOIN "test_lyon"."prod"."proposals" decidim_proposals_proposals + ON decidim_proposals_proposals.id = decidim_follows.decidim_followable_id + AND decidim_proposals_proposals.resource_type = decidim_follows.decidim_followable_type + ), followings_components AS ( + SELECT + distinct decidim_follows.*, + -1 AS "decidim_components.id", + ps_url AS followable_url, + ps_title AS followable_title + FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows + JOIN "test_lyon"."prod"."components" decidim_components + ON decidim_components.ps_id = decidim_followable_id + AND ps_type = decidim_followable_type + ), followings_debates AS ( + SELECT + decidim_follows.*, + decidim_debates_debates.decidim_component_id, + debate_url AS followable_url, + title AS followable_title + FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows + JOIN "test_lyon"."prod"."debates" decidim_debates_debates ON decidim_debates_debates.id = decidim_followable_id + AND resource_type = decidim_followable_type + ), followings_blogs_posts AS ( + SELECT + decidim_follows.*, + decidim_blogs_posts.decidim_component_id, + post_url AS followable_url, + title AS followable_title + FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows + JOIN "test_lyon"."prod"."blogs_posts" decidim_blogs_posts + ON decidim_blogs_posts.id = decidim_followable_id + AND resource_type = decidim_followable_type + ), followings_users AS ( + SELECT + decidim_follows.*, + -1 AS decidim_component_id, + '' AS followable_url, + '' AS followable_title + FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows + JOIN "test_lyon"."prod"."int_users" decidim_users + ON decidim_users.id = decidim_followable_id + where decidim_followable_type = 'Decidim::UserBaseEntity' + ), followings_meetings AS ( + SELECT + decidim_follows.*, + decidim_component_id, + meeting_url AS followable_url, + title AS followable_title + FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows + JOIN "test_lyon"."prod"."meetings" decidim_meetings + ON decidim_meetings.id = decidim_followable_id + AND resource_type = decidim_followable_type + ), followings_budgets_projects AS ( + SELECT + decidim_follows.*, + decidim_component_id, + project_url AS followable_url, + title AS followable_title + FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows + join "test_lyon"."prod"."budgets_projects" decidim_budgets_projects + ON decidim_budgets_projects.id = decidim_followable_id + AND resource_type = decidim_followable_type + ), followings AS ( + SELECT * FROM followings_proposals union all + SELECT * FROM followings_components union all + SELECT * FROM followings_debates union all + SELECT * FROM followings_blogs_posts union all + SELECT * FROM followings_users union all + SELECT * FROM followings_meetings union all + SELECT * FROM followings_budgets_projects + ), real_follow AS ( + SELECT + followings.*, + 'real_follow' AS "following_way", + decidim_followable_id AS "root_decidim_followable_id", + decidim_followable_type AS "root_decidim_followable_type", + followable_url AS "root_following_url", + followable_title AS "root_followable_title" + FROM followings, + lateral (SELECT (case array_length(array_remove(string_to_array(decidim_followable_type, ':', ''),null),1) when 2 then 'Ancestor' else 'Child' end) AS followable_meta_type) p_is_ps + where followable_meta_type != 'Ancestor' + ), ancestor_follow AS ( + SELECT + distinct + followings.*, + 'ancestor_follow' AS "following_way", + real_follow.decidim_followable_id AS "root_decidim_followable_id", + real_follow.decidim_followable_type AS "root_decidim_followable_type", + real_follow.followable_url AS "root_following_url", + real_follow.followable_title AS "root_followable_title" + FROM real_follow + join "test_lyon"."prod"."components" AS components ON components.id = real_follow.decidim_component_id + join followings ON followings.decidim_followable_id = components.ps_id AND followings.decidim_followable_type = components.ps_type + ), follows AS ( + SELECT * FROM real_follow union all + SELECT * FROM ancestor_follow + ) +SELECT id, + decidim_component_id, + decidim_user_id, + root_decidim_followable_id, + root_decidim_followable_type, + root_followable_title, + created_at, + root_following_url, + decidim_followable_id, + decidim_followable_type, + followable_url, + following_way +FROM follows \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/forms/forms.sql b/projects/test_lyon/target/compiled/demo/models/marts/forms/forms.sql new file mode 100644 index 00000000..72dbf026 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/forms/forms.sql @@ -0,0 +1,27 @@ + + +WITH forms_meetings AS ( + SELECT decidim_forms_questionnaires.id AS questionnaire_id, + decidim_forms_questionnaires.title, + decidim_meetings_meetings.decidim_component_id + FROM "test_lyon"."prod"."stg_decidim_forms_questionnaires" decidim_forms_questionnaires + JOIN "test_lyon"."prod"."stg_decidim_meetings" decidim_meetings_meetings ON decidim_meetings_meetings.id = decidim_forms_questionnaires.questionnaire_for_id + WHERE questionnaire_for_type = 'Decidim::Meetings::Meeting' +), forms_surveys AS ( + SELECT decidim_forms_questionnaires.id AS questionnaire_id, + decidim_forms_questionnaires.title, + decidim_surveys_surveys.decidim_component_id + FROM decidim_forms_questionnaires + JOIN "test_lyon"."prod"."stg_decidim_surveys" decidim_surveys_surveys ON decidim_surveys_surveys.id = questionnaire_for_id + WHERE questionnaire_for_type = 'Decidim::Surveys::Survey' +), forms AS ( + SELECT * FROM forms_meetings UNION ALL + SELECT * FROM forms_surveys +) +SELECT + forms.questionnaire_id AS id, + title::jsonb->>'fr' AS title, + decidim_components.id AS decidim_component_id, + concat ('https://',organization_host, '/', ps_space_type_slug,'/', ps_slug, '/f/', decidim_component_id) AS "questionnaire_url" +FROM forms +JOIN "test_lyon"."prod"."components" decidim_components ON decidim_components.id = forms.decidim_component_id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/forms/forms_answers.sql b/projects/test_lyon/target/compiled/demo/models/marts/forms/forms_answers.sql new file mode 100644 index 00000000..a38b072b --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/forms/forms_answers.sql @@ -0,0 +1,52 @@ + + +WITH answers_short_and_long_answer AS ( + SELECT * FROM "test_lyon"."prod"."answers_short_and_long_answer" +), answers_option_and_sorting AS ( + SELECT * FROM "test_lyon"."prod"."answers_option_and_sorting" +), answers_matrix AS ( + SELECT * FROM "test_lyon"."prod"."answers_matrix" +), answers_file AS ( + SELECT * FROM "test_lyon"."prod"."answers_file" +), answers AS ( + SELECT * FROM answers_short_and_long_answer + UNION ALL + SELECT * FROM answers_option_and_sorting + UNION ALL + SELECT * FROM answers_matrix + UNION ALL + SELECT * FROM answers_file +) + +SELECT + answers.decidim_user_id, + answers.session_token, + answers.ip_hash, + answers.question_type, + answers.body AS question_title, + btrim(answers.answer, '"') AS answer, + answers.sub_matrix_question, + answers.custom_body, + answers.sorting_position, + answers.decidim_questionnaire_id, + decidim_forms_questionnaires.title AS form_title, + decidim_forms_questionnaires.decidim_component_id, + (CASE answers.sorting_position + WHEN 0 THEN 10 + WHEN 1 THEN 9 + WHEN 2 THEN 8 + WHEN 3 THEN 7 + WHEN 4 THEN 6 + WHEN 5 THEN 5 + WHEN 6 THEN 4 + WHEN 7 THEN 3 + WHEN 8 THEN 2 + WHEN 9 THEN 1 + ELSE -1 + END) AS sorting_points, + answers.position, + answers.created_at, + answers.author_status +FROM answers +JOIN "test_lyon"."prod"."forms" AS decidim_forms_questionnaires ON decidim_forms_questionnaires.id = answers.decidim_questionnaire_id +ORDER BY session_token, position \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/meetings/meetings.sql b/projects/test_lyon/target/compiled/demo/models/marts/meetings/meetings.sql new file mode 100644 index 00000000..f234e3b3 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/meetings/meetings.sql @@ -0,0 +1,48 @@ +WITH categorizations AS ( + + SELECT + array_agg(category_name) AS categories, + array_agg(child_name) AS sub_categories, + categorizable_id + FROM "test_lyon"."prod"."categorizations" AS categorizations + WHERE categorizations.categorizable_type = 'Decidim::Meetings::Meeting' + GROUP BY categorizable_id + +) +SELECT + decidim_meetings_meetings.id, + decidim_meetings_meetings.title, + decidim_meetings_meetings.description, + decidim_meetings_meetings.address, + decidim_meetings_meetings.attendees_count, + decidim_meetings_meetings.created_at, + decidim_meetings_meetings.decidim_scope_id, + decidim_meetings_meetings.decidim_component_id, + decidim_meetings_meetings.start_time, + decidim_meetings_meetings.end_time, + decidim_meetings_meetings.registration_url, + decidim_meetings_meetings.type_of_meeting, + decidim_meetings_meetings.translated_type_of_meeting, + decidim_meetings_meetings.private_meeting, + decidim_meetings_meetings.decidim_author_id, + decidim_meetings_meetings.resource_type, + concat( + 'https://', + decidim_components.organization_host, + '/', + decidim_components.ps_space_type_slug, + '/', + decidim_components.ps_slug, + '/f/', + decidim_meetings_meetings.decidim_component_id, + '/meetings/', + decidim_meetings_meetings.id + ) AS meeting_url, + categorizations.categories, + coalesce(categorizations.categories[1], 'Sans catégorie') AS first_category, + categorizations.sub_categories, + coalesce(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category +FROM "test_lyon"."prod"."int_meetings" AS decidim_meetings_meetings +JOIN "test_lyon"."prod"."components" decidim_components on decidim_components.id = decidim_component_id +LEFT JOIN categorizations on categorizations.categorizable_id = decidim_meetings_meetings.id +where manifest_name like 'meetings' \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/organizations.sql b/projects/test_lyon/target/compiled/demo/models/marts/organizations.sql new file mode 100644 index 00000000..58ea434a --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/organizations.sql @@ -0,0 +1,3 @@ +SELECT +* +FROM "test_lyon"."prod"."int_organizations" AS decidim_organizations \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/participations.sql b/projects/test_lyon/target/compiled/demo/models/marts/participations.sql new file mode 100644 index 00000000..bd67a0cd --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/participations.sql @@ -0,0 +1,84 @@ +WITH participations_proposals AS ( + SELECT decidim_users.id, + decidim_proposals_proposals.decidim_component_id, + 'Decidim::Proposals::Proposal' AS "participation_type", + decidim_proposals_proposals.id::text AS "participation_id", + decidim_proposals_proposals.created_at AS participation_date + FROM "test_lyon"."prod"."proposals" AS decidim_proposals_proposals + JOIN decidim_coauthorships on decidim_coauthorships.coauthorable_id = decidim_proposals_proposals.id + JOIN decidim_users on decidim_users.id = decidim_coauthorships.decidim_author_id + where coauthorable_type = 'Decidim::Proposals::Proposal' + ), participations_endorsements as ( + SELECT decidim_users.id, + decidim_endorsements.decidim_component_id, + 'Decidim::Endorsements::Endorsement' as "participation_type", + decidim_endorsements.id::text as "participation_id", + decidim_endorsements.created_at as participation_date + FROM "test_lyon"."prod"."endorsements" as decidim_endorsements + JOIN decidim_users on decidim_users.id = decidim_endorsements.decidim_author_id + ), participations_comments as ( + SELECT decidim_users.id, + decidim_component_id, + 'Decidim::Comments::Comment' as "participation_type", + decidim_comments_comments.id::text as "participation_id", + decidim_comments_comments.created_at as contribution_date + FROM "test_lyon"."prod"."comments" decidim_comments_comments + JOIN decidim_users on decidim_users.id = decidim_comments_comments.decidim_author_id + ), participations_proposal_votes as ( + SELECT decidim_users.id, + decidim_proposals_proposals.decidim_component_id, + 'Decidim::Proposals::ProposalVote' as "participation_type", + decidim_proposals_proposal_votes.id::text as "participation_id", + decidim_proposals_proposal_votes.created_at as participation_date + FROM "test_lyon"."prod"."proposals_votes" as decidim_proposals_proposal_votes + JOIN decidim_users on decidim_users.id = decidim_author_id + JOIN "test_lyon"."prod"."proposals" as decidim_proposals_proposals on decidim_proposals_proposal_votes.decidim_proposal_id = decidim_proposals_proposals.id + ), participations_answers as ( + SELECT distinct + decidim_user_id, + decidim_component_id, + 'Decidim::Forms::Answer' as "participation_type", + ('x'||lpad(decidim_forms_answers.session_token,16,'0'))::bit(64)::bigint::text as "participation_id", + decidim_forms_answers.created_at::date as participation_date + FROM "test_lyon"."prod"."forms_answers" as decidim_forms_answers + ), participations_debates as ( + SELECT decidim_author_id as decidim_user_id, + decidim_component_id, + 'Decidim::Debates::Debate' as "participation_type", + id::text as participation_id, + created_at as participation_date + FROM "test_lyon"."prod"."debates" decidim_debates_debates + ), participations_budgets_projects_votes as ( + SELECT + decidim_user_id, + decidim_component_id, + 'Decidim::Budgets::Project::Vote' as participation_type, + order_id::text as participation_id, + created_at as participation_date + FROM "test_lyon"."prod"."projects_votes" decidim_bugdets_projects_votes + ), participations_meetings_registrations as ( + SELECT + decidim_user_id, + decidim_component_id, + 'Decidim::Meetings::Registration' as participation_type, + decidim_meetings_meetings.id::text as participation_id, + decidim_meetings_registrations.created_at as participation_date + FROM "test_lyon"."prod"."meetings" decidim_meetings_meetings + join decidim_meetings_registrations on decidim_meetings_registrations.decidim_meeting_id = decidim_meetings_meetings.id + ), participations as ( + SELECT * FROM participations_proposals union all + SELECT * FROM participations_endorsements union all + SELECT * FROM participations_comments union all + SELECT * FROM participations_proposal_votes union all + SELECT * from participations_answers union all + SELECT * from participations_debates union all + SELECT * from participations_budgets_projects_votes union all + SELECT * from participations_meetings_registrations + ) + SELECT + distinct participations.id as "user_id", + substr(participation_id,1,10)::bigint as participation_id, + decidim_component_id, + participation_type, + participation_date + from participations \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals.sql b/projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals.sql new file mode 100644 index 00000000..2fd1b688 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals.sql @@ -0,0 +1,69 @@ + + +WITH coauthorships AS ( + SELECT + array_agg(decidim_users.id) AS authors_ids, + decidim_coauthorships.coauthorable_id + FROM "test_lyon"."prod"."int_users" AS decidim_users + JOIN "test_lyon"."prod"."stg_decidim_coauthorships" AS decidim_coauthorships on decidim_users.id = decidim_coauthorships.decidim_author_id + WHERE coauthorable_type = 'Decidim::Proposals::Proposal' + GROUP BY coauthorable_id +), +categorizations AS ( + + SELECT + array_agg(category_name) AS categories, + array_agg(child_name) AS sub_categories, + categorizable_id + FROM "test_lyon"."prod"."categorizations" AS categorizations + WHERE categorizations.categorizable_type = 'Decidim::Proposals::Proposal' + GROUP BY categorizable_id + +), +votes AS ( + SELECT + decidim_proposal_id, + COUNT(id) AS votes_count + FROM "test_lyon"."prod"."stg_decidim_proposals_votes" + GROUP BY decidim_proposal_id +), +proposals AS ( + SELECT + decidim_proposals.id, + decidim_components.ps_id AS decidim_participatory_space_id, + decidim_components.ps_slug AS decidim_participatory_space_slug, + decidim_scopes.name AS decidim_scope_name, + decidim_proposals.title, + decidim_proposals.body, + decidim_proposals.resource_type, + concat('https://', decidim_components.organization_host, '/', decidim_components.ps_space_type_slug, '/', decidim_components.ps_slug, '/f/', decidim_proposals.decidim_component_id, '/proposals/', decidim_proposals.id) AS url, + decidim_proposals.decidim_component_id, + decidim_proposals.created_at, + decidim_proposals.published_at, + decidim_proposals.state, + decidim_proposals.translated_state, + coauthorships.authors_ids, + COALESCE(coauthorships.authors_ids[1], -1) AS first_author_id, + decidim_proposals.address, + categorizations.categories, + COALESCE(categorizations.categories[1], 'Sans catégorie') AS first_category, + categorizations.sub_categories, + COALESCE(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category, + decidim_proposals.comments_count, + decidim_proposals.endorsements_count, + COALESCE(votes.votes_count,0) AS votes_count + FROM "test_lyon"."prod"."int_proposals" AS decidim_proposals + JOIN "test_lyon"."prod"."components" AS decidim_components ON decidim_components.id = decidim_component_id + LEFT JOIN coauthorships ON decidim_proposals.id = coauthorships.coauthorable_id + LEFT JOIN "test_lyon"."prod"."stg_decidim_moderations" AS decidim_moderations + ON decidim_moderations.decidim_reportable_id = decidim_proposals.id + AND decidim_moderations.decidim_reportable_type = 'Decidim::Proposals::Proposal' + LEFT JOIN "test_lyon"."prod"."int_scopes" AS decidim_scopes ON decidim_scopes.id = decidim_proposals.decidim_scope_id + LEFT JOIN votes ON decidim_proposals.id = votes.decidim_proposal_id + LEFT JOIN categorizations ON categorizations.categorizable_id = decidim_proposals.id + WHERE decidim_moderations.hidden_at IS NULL + AND decidim_proposals.published_at IS NOT NULL + AND (decidim_proposals.state NOT LIKE '%withdrawn' OR decidim_proposals.state IS NULL) +) + +SELECT * FROM proposals \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals_votes.sql b/projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals_votes.sql new file mode 100644 index 00000000..59a9bebc --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals_votes.sql @@ -0,0 +1,12 @@ + + +SELECT + proposals_votes.id, + proposals_votes.created_at, + proposals_votes.decidim_author_id, + proposals_votes.decidim_proposal_id, + proposals.decidim_component_id, + proposals.title AS proposal_title, + proposals.url AS proposal_url +FROM "test_lyon"."prod"."stg_decidim_proposals_votes" AS proposals_votes +JOIN "test_lyon"."prod"."proposals" AS proposals on proposals_votes.decidim_proposal_id = proposals.id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/users/users.sql b/projects/test_lyon/target/compiled/demo/models/marts/users/users.sql new file mode 100644 index 00000000..27166d72 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/marts/users/users.sql @@ -0,0 +1,109 @@ +WITH endorsements AS ( + SELECT + decidim_author_id, + MAX(1) AS is_endorsing + FROM "test_lyon"."prod"."endorsements" + GROUP BY decidim_author_id +), + +comments AS ( + SELECT + decidim_author_id, + MAX(1) AS has_authored_comment + FROM "test_lyon"."prod"."comments" + GROUP BY decidim_author_id +), + +forms_answers AS ( + SELECT + decidim_user_id, + MAX(1) AS has_answered_survey + FROM "test_lyon"."prod"."forms_answers" + GROUP BY decidim_user_id +), + +proposal_votes AS ( + SELECT + decidim_author_id, + MAX(1) AS has_voted_on_proposal + FROM "test_lyon"."prod"."proposals_votes" + GROUP BY decidim_author_id +), + +project_votes AS ( + SELECT + decidim_user_id, + MAX(1) AS has_voted_on_project + FROM "test_lyon"."prod"."projects_votes" + GROUP BY decidim_user_id +), + +participations_proposals AS ( + SELECT + decidim_coauthorships.decidim_author_id, + MAX(1) AS has_authored_proposal + FROM "test_lyon"."prod"."proposals" AS decidim_proposals_proposals + JOIN "test_lyon"."prod"."stg_decidim_coauthorships" AS decidim_coauthorships + ON decidim_coauthorships.coauthorable_id = decidim_proposals_proposals.id + WHERE coauthorable_type = 'Decidim::Proposals::Proposal' + GROUP BY decidim_coauthorships.decidim_author_id +), + +followings AS ( + SELECT DISTINCT decidim_user_id + FROM "test_lyon"."prod"."followings" +) + +SELECT + decidim_users.id, + decidim_users.email, + decidim_users.sign_in_count, + decidim_users.sign_in_frequency, + decidim_users.last_sign_in_at, + decidim_users.created_at, + decidim_users.updated_at, + decidim_users.invitation_created_at, + decidim_users.invitation_sent_at, + decidim_users.invitation_accepted_at, + decidim_users.invited_by_id, + decidim_users.invited_by_type, + decidim_users.decidim_organization_id, + decidim_users.confirmed_at, + decidim_users.confirmation_token, + decidim_users.unconfirmed_email, + decidim_users.name, + decidim_users.locale, + decidim_users.deleted_at, + decidim_users.admin, + decidim_users.managed, + decidim_users.roles, + decidim_users.nickname, + decidim_users.accepted_tos_version, + decidim_users.type, + decidim_users.following_count, + decidim_users.followers_count, + decidim_users.failed_attempts, + decidim_users.locked_at, + decidim_users.admin_terms_accepted_at, + decidim_users.blocked, + decidim_users.blocked_at, + COALESCE(endorsements.is_endorsing, 0)::boolean AS is_endorsing, + (CASE WHEN followings.decidim_user_id IS NULL THEN false ELSE true END) AS is_following, + COALESCE(comments.has_authored_comment, 0)::boolean AS has_authored_comment, + COALESCE(proposal_votes.has_voted_on_proposal, 0)::boolean AS has_voted_on_proposal, + COALESCE(project_votes.has_voted_on_project, 0)::boolean AS has_voted_on_project, + COALESCE(participations_proposals.has_authored_proposal, 0)::boolean AS has_authored_proposal, + COALESCE(forms_answers.has_answered_survey, 0)::boolean AS has_answered_survey, + decidim_users.confirmed, + CONCAT('https://', decidim_organizations.host, '/profiles/', decidim_users.nickname, '/activity') AS url, + decidim_users.extended_data +FROM "test_lyon"."prod"."int_users" AS decidim_users +LEFT JOIN followings ON followings.decidim_user_id = decidim_users.id +LEFT JOIN endorsements ON endorsements.decidim_author_id = decidim_users.id +LEFT JOIN comments ON comments.decidim_author_id = decidim_users.id +LEFT JOIN forms_answers ON forms_answers.decidim_user_id = decidim_users.id +LEFT JOIN proposal_votes ON proposal_votes.decidim_author_id = decidim_users.id +LEFT JOIN project_votes ON project_votes.decidim_user_id = decidim_users.id +LEFT JOIN participations_proposals ON participations_proposals.decidim_author_id = decidim_users.id +JOIN "test_lyon"."prod"."int_organizations" AS decidim_organizations + ON decidim_organizations.id = decidim_users.decidim_organization_id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_area_types.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_area_types.sql new file mode 100644 index 00000000..aab5c46f --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_area_types.sql @@ -0,0 +1,12 @@ +WITH source as ( + SELECT * FROM "test_lyon"."public"."decidim_area_types" +), +renamed as ( + SELECT + id, + decidim_organization_id, + name, + plural + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_areas.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_areas.sql new file mode 100644 index 00000000..59eb5acc --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_areas.sql @@ -0,0 +1,14 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_areas" +), +renamed as ( + select + id, + name, + area_type_id, + decidim_organization_id, + created_at, + updated_at + FROM source +) +select * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql new file mode 100644 index 00000000..bbc1c7a2 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql @@ -0,0 +1,58 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_assemblies" +), +renamed AS ( + SELECT + id, + slug, + hashtag, + decidim_organization_id, + created_at, + updated_at, + title::jsonb->>'fr' AS title, + subtitle::jsonb->>'fr' AS subtitle, + short_description, + description, + hero_image, + banner_image, + promoted, + published_at, + developer_group, + meta_scope, + local_area, + target, + participatory_scope, + participatory_structure, + show_statistics, + decidim_scope_id, + scopes_enabled, + private_space, + reference, + decidim_area_id, + parent_id, + parents_path, + children_count, + purpose_of_action, + composition, + creation_date, + created_by, + created_by_other, + duration, + included_at, + closing_date, + closing_date_reason, + internal_organisation, + is_transparent, + special_features, + twitter_handler, + instagram_handler, + facebook_handler, + youtube_handler, + github_handler, + decidim_assemblies_type_id, + weight, + follows_count + + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql new file mode 100644 index 00000000..9c3bd8dd --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql @@ -0,0 +1,15 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_blogs_posts" +), +renamed AS ( + SELECT + id, + title::jsonb->>'fr' AS title, + regexp_replace(body::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') AS body, + decidim_component_id, + created_at, + decidim_author_id, + 'Decidim::Blogs::Post' AS resource_type + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql new file mode 100644 index 00000000..ade360f5 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql @@ -0,0 +1,11 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_budgets_budgets" +), +renamed AS ( + SELECT + id, + title::jsonb->>'fr' as title, + decidim_component_id + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql new file mode 100644 index 00000000..4696e7b5 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql @@ -0,0 +1,11 @@ +WITH source as ( + SELECT * FROM "test_lyon"."public"."decidim_budgets_line_items" +), +renamed as ( + select + id, + decidim_order_id, + decidim_project_id + FROM source +) +select * from renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql new file mode 100644 index 00000000..59fa2274 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql @@ -0,0 +1,14 @@ +WITH source as ( + SELECT * FROM "test_lyon"."public"."decidim_budgets_orders" +), +renamed as ( + select + id, + decidim_user_id, + checked_out_at, + created_at, + updated_at, + decidim_budgets_budget_id + FROM source +) +select * from renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql new file mode 100644 index 00000000..d943e470 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql @@ -0,0 +1,17 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_budgets_projects" +), +renamed AS ( + SELECT + id, + title::jsonb->>'fr' as title, + regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description, + created_at, + decidim_scope_id, + budget_amount as project_amount, + selected_at, + decidim_budgets_budget_id, + 'Decidim::Budgets::Project' as resource_type + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categories.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categories.sql new file mode 100644 index 00000000..684c42ec --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categories.sql @@ -0,0 +1,15 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_categories" +), +renamed AS ( + SELECT + id, + name::jsonb->>'fr' AS name, + description, + parent_id, + decidim_participatory_space_id, + decidim_participatory_space_type, + weight + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql new file mode 100644 index 00000000..63efb071 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql @@ -0,0 +1,14 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_categorizations" +), +renamed AS ( + SELECT + id, + decidim_category_id, + categorizable_type, + categorizable_id, + created_at, + updated_at + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/debates/stg_decidim_debates.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/debates/stg_decidim_debates.sql new file mode 100644 index 00000000..8a998a05 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/debates/stg_decidim_debates.sql @@ -0,0 +1,18 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_debates_debates" +), +renamed AS ( + SELECT + id, + title::jsonb->>'fr' as title, + regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description, + start_time, + end_time, + decidim_component_id, + decidim_author_id, + created_at, + closed_at, + 'Decidim::Debates::Debate' as resource_type + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql new file mode 100644 index 00000000..b573e595 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql @@ -0,0 +1,15 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_forms_answer_choices" +), +renamed AS ( + SELECT + id, + decidim_answer_id, + decidim_answer_option_id, + position, + body::text AS body, + custom_body, + decidim_question_matrix_row_id + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql new file mode 100644 index 00000000..e40a8359 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql @@ -0,0 +1,17 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_forms_answers" +), +renamed AS ( + SELECT + id, + body, + decidim_user_id, + decidim_questionnaire_id, + decidim_question_id, + created_at, + updated_at, + session_token, + ip_hash + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql new file mode 100644 index 00000000..f9c1a85d --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql @@ -0,0 +1,12 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_forms_question_matrix_rows" +), +renamed AS ( + SELECT + id, + decidim_question_id, + position, + TRIM(body::jsonb->>'fr') AS body + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql new file mode 100644 index 00000000..6b7c9ab1 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql @@ -0,0 +1,18 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_forms_questionnaires" +), +renamed AS ( + SELECT + id, + title, + description, + tos, + questionnaire_for_type, + questionnaire_for_id, + published_at, + created_at, + updated_at, + salt + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql new file mode 100644 index 00000000..fedbe653 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql @@ -0,0 +1,21 @@ + + +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_forms_questions" +), +renamed AS ( + SELECT + id, + decidim_questionnaire_id, + position, + question_type, + mandatory, + body::jsonb->>'fr' AS body, + description, + max_choices, + created_at, + updated_at, + max_characters + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql new file mode 100644 index 00000000..0d4750c3 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql @@ -0,0 +1,23 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_organizations" +), +renamed AS ( + SELECT + id, + name, + host, + default_locale, + available_locales::text as available_locales, + created_at, + description, + secondary_hosts::text as secondary_hosts, + available_authorizations::text as available_authorizations, + header_snippets, + tos_version, + badges_enabled, + send_welcome_notification, + users_registration_mode, + time_zone + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql new file mode 100644 index 00000000..4250a5b8 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql @@ -0,0 +1,14 @@ +SELECT + id, + regexp_replace(title::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as title, + regexp_replace(body::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as body, + 'Decidim::Proposals::Proposal' as resource_type, + decidim_component_id, + decidim_scope_id, + created_at, + published_at, + state, + comments_count, + endorsements_count, + address +FROM "test_lyon"."public"."decidim_proposals_proposals" \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql new file mode 100644 index 00000000..ec5cbae5 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql @@ -0,0 +1,28 @@ +WITH source as ( + SELECT * FROM "test_lyon"."public"."decidim_proposals_collaborative_drafts" +), +renamed as ( + select + id, + title, + body, + decidim_component_id, + decidim_scope_id, + state, + reference, + address, + latitude, + longitude, + published_at, + authors_count, + versions_count, + contributions_count, + created_at, + updated_at, + coauthorships_count, + comments_count, + follows_count + + from source +) +select * from renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql new file mode 100644 index 00000000..abd81c78 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql @@ -0,0 +1,15 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_proposals_proposal_votes" +), +renamed AS ( + SELECT + id, + decidim_proposal_id, + decidim_author_id, + created_at, + updated_at, + weight, + temporary + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql new file mode 100644 index 00000000..cd2ed9ac --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql @@ -0,0 +1,17 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_scopes" +), +renamed AS ( + SELECT + id, + decidim_organization_id, + created_at, + updated_at, + name::jsonb->>'fr' AS name, + scope_type_id, + parent_id, + code, + part_of + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_accountability_results.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_accountability_results.sql new file mode 100644 index 00000000..a5a6d3b3 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_accountability_results.sql @@ -0,0 +1,25 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_accountability_results" +), +renamed as ( + select + id, + title, + description, + reference, + start_date, + end_date, + progress, + parent_id, + decidim_accountability_status_id, + decidim_component_id, + decidim_scope_id, + created_at, + updated_at, + children_count, + weight, + external_id, + comments_count + FROM source +) +select * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_attachments.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_attachments.sql new file mode 100644 index 00000000..6e7afb96 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_attachments.sql @@ -0,0 +1,20 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_attachments" +), +renamed as ( + SELECT + id, + title, + description, + file, + content_type, + file_size, + attached_to_id, + created_at, + updated_at, + attached_to_type, + weight, + attachment_collection_id + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_coauthorships.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_coauthorships.sql new file mode 100644 index 00000000..c306ba3f --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_coauthorships.sql @@ -0,0 +1,18 @@ + + +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_coauthorships" +), +renamed AS ( + SELECT + id, + decidim_author_id, + decidim_user_group_id, + coauthorable_type, + coauthorable_id, + created_at, + updated_at, + decidim_author_type + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_comments.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_comments.sql new file mode 100644 index 00000000..006b2ca3 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_comments.sql @@ -0,0 +1,22 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_comments_comments" +), +renamed as ( + SELECT + id, + decidim_commentable_type, + decidim_commentable_id, + decidim_author_id, + created_at, + updated_at, + depth, + alignment, + decidim_user_group_id, + decidim_root_commentable_type, + decidim_root_commentable_id, + decidim_author_type, + body::jsonb->>'fr' as body, + comments_count + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_components.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_components.sql new file mode 100644 index 00000000..f4e9bfea --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_components.sql @@ -0,0 +1,19 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_components" +), +renamed AS ( + SELECT + id, + manifest_name, + name::jsonb->>'fr' AS name, + participatory_space_id, + participatory_space_type, + settings, + weight, + permissions, + published_at, + created_at, + updated_at + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_endorsements.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_endorsements.sql new file mode 100644 index 00000000..5162a535 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_endorsements.sql @@ -0,0 +1,10 @@ +SELECT + id, + resource_type, + resource_id, + decidim_author_type, + decidim_author_id, + decidim_user_group_id, + created_at, + updated_at +FROM "test_lyon"."public"."decidim_endorsements" \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_follows.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_follows.sql new file mode 100644 index 00000000..f6d8e313 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_follows.sql @@ -0,0 +1,14 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_follows" +), +renamed as ( + SELECT + id, + decidim_user_id, + updated_at, + created_at, + decidim_followable_type, + decidim_followable_id + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings.sql new file mode 100644 index 00000000..b9577180 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings.sql @@ -0,0 +1,23 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_meetings_meetings" +), +renamed AS ( + SELECT + id, + title::jsonb->>'fr' AS title, + regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') AS description, + coalesce(nullif(address,''), 'Pas d''adresse') as address, + coalesce(attendees_count, 0) as attendees_count, + created_at, + decidim_scope_id, + decidim_component_id, + start_time, + end_time, + registration_url, + type_of_meeting, + private_meeting, + decidim_author_id, + 'Decidim::Meetings::Meeting' as resource_type + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql new file mode 100644 index 00000000..54e19056 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql @@ -0,0 +1,16 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_meetings_registrations" +), +renamed AS ( + select + id, + decidim_user_id, + decidim_meeting_id, + created_at, + updated_at, + code, + validated_at, + decidim_user_group_id + FROM source +) +select * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_moderations.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_moderations.sql new file mode 100644 index 00000000..6ed8abac --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_moderations.sql @@ -0,0 +1,18 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_moderations" +), +renamed AS ( + SELECT + id, + decidim_participatory_space_id, + decidim_reportable_type, + decidim_reportable_id, + report_count, + hidden_at, + created_at, + updated_at, + decidim_participatory_space_type, + reported_content + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql new file mode 100644 index 00000000..33dca5fc --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql @@ -0,0 +1,21 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_participatory_process_steps" +), +renamed AS ( + select + id, + title::jsonb->>'fr' as title, + title::jsonb->>'fr' as description, + start_date, + end_date, + decidim_participatory_process_id, + created_at, + updated_at, + active, + position, + cta_text, + cta_path + + FROM source +) +select * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_processes.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_processes.sql new file mode 100644 index 00000000..4ba0012d --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_processes.sql @@ -0,0 +1,16 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_participatory_processes" +), +renamed AS ( + SELECT + id, + published_at, + title::jsonb->>'fr' AS title, + subtitle::jsonb->>'fr' as subtitle, + slug, + 'Decidim::ParticipatoryProcess' as type, + 'processes' as space_type_slug, + decidim_organization_id + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_surveys.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_surveys.sql new file mode 100644 index 00000000..b3c032ea --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_surveys.sql @@ -0,0 +1,12 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_surveys_surveys" +), +renamed as ( + SELECT + id, + decidim_component_id, + created_at, + updated_at + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_users.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_users.sql new file mode 100644 index 00000000..cc655342 --- /dev/null +++ b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_users.sql @@ -0,0 +1,41 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_users" +), +renamed AS ( + SELECT + id, + email, + sign_in_count, + last_sign_in_at, + created_at, + updated_at, + invitation_created_at, + invitation_sent_at, + invitation_accepted_at, + invited_by_id, + invited_by_type, + decidim_organization_id, + confirmed_at, + confirmation_token, + unconfirmed_email, + name, + locale, + deleted_at, + admin, + managed, + roles::text AS roles, + nickname, + accepted_tos_version, + type, + following_count, + followers_count, + failed_attempts, + locked_at, + admin_terms_accepted_at, + blocked, + blocked_at, + (CASE WHEN confirmed_at IS NULL THEN false ELSE true END) AS "confirmed", + extended_data + FROM source +) +SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql b/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql new file mode 100644 index 00000000..3768942d --- /dev/null +++ b/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql @@ -0,0 +1,19 @@ +WITH parsed_data AS ( + SELECT + decidim_awesome_proposal_extra_fields.id, + decidim_awesome_proposal_extra_fields.proposal_id, + xpath('//text()', unnest(xpath('//dt', xml_data)))::text AS private_field_description, + unnest(xpath('//dd/div/text()', unnest(xpath('//dd', xml_data))))::text AS private_field_content + FROM + "test_lyon"."prod"."stg_decidim_awesome_proposal_extra_fields" AS decidim_awesome_proposal_extra_fields, + LATERAL xmlparse(document private_body_clear) AS xml_data +) +SELECT + parsed_data.id, + parsed_data.proposal_id, + replace(replace(private_field_description, '{"', ''), '"}', '') AS private_field_description, + parsed_data.private_field_content +FROM + parsed_data +WHERE + private_field_content IS NOT NULL \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql b/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql new file mode 100644 index 00000000..f869055c --- /dev/null +++ b/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql @@ -0,0 +1,32 @@ +WITH __dbt__cte__stg_decidim_awesome_proposal_extra_fields as ( + +-- Fixture for stg_decidim_awesome_proposal_extra_fields +select + + cast(1 as bigint) + as id, + + cast(101 as bigint) + as proposal_id, cast(null as timestamp without time zone) as updated_at, cast(null as timestamp without time zone) as created_at, + + cast('
Cette idée est déposée à titre :
Individuel
Votre tranche d''âge :
16-25 ans
' as text) + as private_body_clear +), parsed_data AS ( + SELECT + decidim_awesome_proposal_extra_fields.id, + decidim_awesome_proposal_extra_fields.proposal_id, + xpath('//text()', unnest(xpath('//dt', xml_data)))::text AS private_field_description, + unnest(xpath('//dd/div/text()', unnest(xpath('//dd', xml_data))))::text AS private_field_content + FROM + __dbt__cte__stg_decidim_awesome_proposal_extra_fields AS decidim_awesome_proposal_extra_fields, + LATERAL xmlparse(document private_body_clear) AS xml_data +) +SELECT + parsed_data.id, + parsed_data.proposal_id, + replace(replace(private_field_description, '{"', ''), '"}', '') AS private_field_description, + parsed_data.private_field_content +FROM + parsed_data +WHERE + private_field_content IS NOT NULL \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/stg_decidim_awesome_proposal_extra_fields.sql b/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/stg_decidim_awesome_proposal_extra_fields.sql new file mode 100644 index 00000000..67361bcf --- /dev/null +++ b/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/stg_decidim_awesome_proposal_extra_fields.sql @@ -0,0 +1,12 @@ + +-- Fixture for stg_decidim_awesome_proposal_extra_fields +select + + cast(1 as bigint) + as id, + + cast(101 as bigint) + as proposal_id, cast(null as timestamp without time zone) as updated_at, cast(null as timestamp without time zone) as created_at, + + cast('
Cette idée est déposée à titre :
Individuel
Votre tranche d''âge :
16-25 ans
' as text) + as private_body_clear \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/test_lyon/models/marts/participations_with_extended_data.sql b/projects/test_lyon/target/compiled/test_lyon/models/marts/participations_with_extended_data.sql new file mode 100644 index 00000000..05296bc1 --- /dev/null +++ b/projects/test_lyon/target/compiled/test_lyon/models/marts/participations_with_extended_data.sql @@ -0,0 +1,9 @@ +SELECT + DISTINCT ON (user_id, ps_title) + user_id, + users.age_category AS age_category, + decidim_component_id, + components.ps_title AS ps_title +FROM "test_lyon"."prod"."participations" participations + JOIN "test_lyon"."prod"."components" components ON participations.decidim_component_id = components.id + JOIN "test_lyon"."prod"."users" users ON participations.user_id = users.id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql b/projects/test_lyon/target/compiled/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql new file mode 100644 index 00000000..4c66c858 --- /dev/null +++ b/projects/test_lyon/target/compiled/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql @@ -0,0 +1,11 @@ +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_awesome_proposal_extra_fields_test" +) + +SELECT + id, + decidim_proposal_id AS proposal_id, + updated_at, + created_at, + private_body_clear +FROM source \ No newline at end of file diff --git a/projects/test_lyon/target/graph.gpickle b/projects/test_lyon/target/graph.gpickle new file mode 100644 index 0000000000000000000000000000000000000000..d5f6db55b8251d762a90c401fb8e53710e61f608 GIT binary patch literal 267456 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

{_c@v%Q+-G!UDx(W+Ofj@Pgpgl`%aNHtb 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 A_5c6? literal 0 HcmV?d00001 diff --git a/projects/test_lyon/target/graph_summary.json b/projects/test_lyon/target/graph_summary.json new file mode 100644 index 00000000..8d085487 --- /dev/null +++ b/projects/test_lyon/target/graph_summary.json @@ -0,0 +1 @@ +{"_invocation_id": "abd1849f-2f07-41b8-9fd3-963d4daf1290", "linked": {"0": {"name": "source.test_lyon.decidim.decidim_awesome_proposal_extra_fields_test", "type": "source", "succ": [39]}, "1": {"name": "source.demo.decidim.decidim_components", "type": "source", "succ": [41]}, "2": {"name": "source.demo.decidim.decidim_assemblies", "type": "source", "succ": [63]}, "3": {"name": "source.demo.decidim.decidim_participatory_processes", "type": "source", "succ": [46]}, "4": {"name": "source.demo.decidim.decidim_participatory_process_steps", "type": "source", "succ": [48]}, "5": {"name": "source.demo.decidim.decidim_users", "type": "source", "succ": [47]}, "6": {"name": "source.demo.decidim.decidim_proposals_proposals", "type": "source", "succ": [74]}, "7": {"name": "source.demo.decidim.decidim_coauthorships", "type": "source", "succ": [49]}, "8": {"name": "source.demo.decidim.decidim_moderations", "type": "source", "succ": [52]}, "9": {"name": "source.demo.decidim.decidim_scopes", "type": "source", "succ": [71]}, "10": {"name": "source.demo.decidim.decidim_blogs_posts", "type": "source", "succ": [62]}, "11": {"name": "source.demo.decidim.decidim_debates_debates", "type": "source", "succ": [64]}, "12": {"name": "source.demo.decidim.decidim_meetings_meetings", "type": "source", "succ": [50]}, "13": {"name": "source.demo.decidim.decidim_accountability_results", "type": "source", "succ": [51]}, "14": {"name": "source.demo.decidim.decidim_comments_comments", "type": "source", "succ": [44]}, "15": {"name": "source.demo.decidim.decidim_proposals_collaborative_drafts", "type": "source", "succ": [73]}, "16": {"name": "source.demo.decidim.decidim_endorsements", "type": "source", "succ": [42]}, "17": {"name": "source.demo.decidim.decidim_follows", "type": "source", "succ": [43]}, "18": {"name": "source.demo.decidim.decidim_initiatives", "type": "source"}, "19": {"name": "source.demo.decidim.decidim_initiatives_type_scopes", "type": "source"}, "20": {"name": "source.demo.decidim.decidim_surveys_surveys", "type": "source", "succ": [53]}, "21": {"name": "source.demo.decidim.decidim_attachments", "type": "source", "succ": [40]}, "22": {"name": "source.demo.decidim.decidim_proposals_proposal_votes", "type": "source", "succ": [72]}, "23": {"name": "source.demo.decidim.decidim_meetings_registrations", "type": "source", "succ": [45]}, "24": {"name": "source.demo.decidim.decidim_organizations", "type": "source", "succ": [54]}, "25": {"name": "source.demo.decidim.decidim_forms_answer_choices", "type": "source", "succ": [59]}, "26": {"name": "source.demo.decidim.decidim_forms_answers", "type": "source", "succ": [56]}, "27": {"name": "source.demo.decidim.decidim_forms_question_matrix_rows", "type": "source", "succ": [55]}, "28": {"name": "source.demo.decidim.decidim_forms_questionnaires", "type": "source", "succ": [58]}, "29": {"name": "source.demo.decidim.decidim_forms_questions", "type": "source", "succ": [57]}, "30": {"name": "source.demo.decidim.decidim_areas", "type": "source", "succ": [61]}, "31": {"name": "source.demo.decidim.decidim_area_types", "type": "source", "succ": [60]}, "32": {"name": "source.demo.decidim.decidim_budgets_projects", "type": "source", "succ": [66]}, "33": {"name": "source.demo.decidim.decidim_budgets_budgets", "type": "source", "succ": [68]}, "34": {"name": "source.demo.decidim.decidim_budgets_line_items", "type": "source", "succ": [65]}, "35": {"name": "source.demo.decidim.decidim_budgets_orders", "type": "source", "succ": [67]}, "36": {"name": "source.demo.decidim.decidim_categories", "type": "source", "succ": [69]}, "37": {"name": "source.demo.decidim.decidim_categorizations", "type": "source", "succ": [70]}, "38": {"name": "model.test_lyon.int_decidim_awesome_proposal_extra_fields", "type": "model", "succ": [138, 180]}, "39": {"name": "model.test_lyon.stg_decidim_awesome_proposal_extra_fields", "type": "model", "succ": [38, 139, 140, 141]}, "40": {"name": "model.demo.stg_decidim_attachments", "type": "model", "succ": [86, 96]}, "41": {"name": "model.demo.stg_decidim_components", "type": "model", "succ": [98]}, "42": {"name": "model.demo.stg_decidim_endorsements", "type": "model", "succ": [79]}, "43": {"name": "model.demo.stg_decidim_follows", "type": "model", "succ": [90]}, "44": {"name": "model.demo.stg_decidim_comments", "type": "model", "succ": [80]}, "45": {"name": "model.demo.stg_decidim_meetings_registrations", "type": "model"}, "46": {"name": "model.demo.stg_decidim_participatory_processes", "type": "model", "succ": [89]}, "47": {"name": "model.demo.stg_decidim_users", "type": "model", "succ": [91]}, "48": {"name": "model.demo.stg_decidim_participatory_process_steps", "type": "model"}, "49": {"name": "model.demo.stg_decidim_coauthorships", "type": "model", "succ": [99, 78]}, "50": {"name": "model.demo.stg_decidim_meetings", "type": "model", "succ": [92, 103]}, "51": {"name": "model.demo.stg_decidim_accountability_results", "type": "model", "succ": [80]}, "52": {"name": "model.demo.stg_decidim_moderations", "type": "model", "succ": [80, 79, 78]}, "53": {"name": "model.demo.stg_decidim_surveys", "type": "model", "succ": [92]}, "54": {"name": "model.demo.stg_decidim_organizations", "type": "model", "succ": [76]}, "55": {"name": "model.demo.stg_decidim_forms_question_matrix_rows", "type": "model", "succ": [95, 113, 114, 115, 116]}, "56": {"name": "model.demo.stg_decidim_forms_answers", "type": "model", "succ": [106, 111, 112]}, "57": {"name": "model.demo.stg_decidim_forms_questions", "type": "model", "succ": [96, 94, 95, 93, 119, 120]}, "58": {"name": "model.demo.stg_decidim_forms_questionnaires", "type": "model", "succ": [92, 117, 118]}, "59": {"name": "model.demo.stg_decidim_forms_answer_choices", "type": "model", "succ": [94, 95, 107, 108, 109, 110]}, "60": {"name": "model.demo.stg_decidim_area_types", "type": "model"}, "61": {"name": "model.demo.stg_decidim_areas", "type": "model"}, "62": {"name": "model.demo.stg_decidim_blogs_posts", "type": "model", "succ": [87, 79, 142]}, "63": {"name": "model.demo.stg_decidim_assemblies", "type": "model", "succ": [89]}, "64": {"name": "model.demo.stg_decidim_debates", "type": "model", "succ": [83, 79, 143]}, "65": {"name": "model.demo.stg_decidim_budgets_line_items", "type": "model", "succ": [84, 121, 122]}, "66": {"name": "model.demo.stg_decidim_budgets_projects", "type": "model", "succ": [102, 144]}, "67": {"name": "model.demo.stg_decidim_budgets_orders", "type": "model", "succ": [101]}, "68": {"name": "model.demo.stg_decidim_budgets", "type": "model", "succ": [100, 88]}, "69": {"name": "model.demo.stg_decidim_categories", "type": "model", "succ": [97]}, "70": {"name": "model.demo.stg_decidim_categorizations", "type": "model", "succ": [97, 123, 124, 125]}, "71": {"name": "model.demo.stg_decidim_scopes", "type": "model", "succ": [105]}, "72": {"name": "model.demo.stg_decidim_proposals_votes", "type": "model", "succ": [81, 78]}, "73": {"name": "model.demo.stg_decidim_proposals_collaborative_drafts", "type": "model", "succ": [80]}, "74": {"name": "model.demo.stg_decidim_proposals", "type": "model", "succ": [79, 104, 138, 145]}, "75": {"name": "model.demo.organizations", "type": "model", "succ": [86, 96]}, "76": {"name": "model.demo.int_organizations", "type": "model", "succ": [75, 89, 99, 162, 163]}, "77": {"name": "model.demo.participations", "type": "model"}, "78": {"name": "model.demo.proposals", "type": "model", "succ": [77, 80, 90, 99, 81, 158, 159, 160, 161]}, "79": {"name": "model.demo.endorsements", "type": "model", "succ": [77, 99, 154, 155]}, "80": {"name": "model.demo.comments", "type": "model", "succ": [77, 99]}, "81": {"name": "model.demo.proposals_votes", "type": "model", "succ": [77, 99, 134]}, "82": {"name": "model.demo.forms_answers", "type": "model", "succ": [77, 99]}, "83": {"name": "model.demo.debates", "type": "model", "succ": [77, 80, 90]}, "84": {"name": "model.demo.projects_votes", "type": "model", "succ": [77, 99]}, "85": {"name": "model.demo.meetings", "type": "model", "succ": [77, 80, 90, 156, 157]}, "86": {"name": "model.demo.attachments", "type": "model"}, "87": {"name": "model.demo.blogs_posts", "type": "model", "succ": [80, 90, 146]}, "88": {"name": "model.demo.budgets_projects", "type": "model", "succ": [80, 90, 84]}, "89": {"name": "model.demo.components", "type": "model", "succ": [80, 90, 92, 87, 83, 100, 88, 85, 78, 127, 128, 129, 130, 138, 147, 148, 149, 150, 151]}, "90": {"name": "model.demo.followings", "type": "model", "succ": [99, 126]}, "91": {"name": "model.demo.int_users", "type": "model", "succ": [90, 99, 78, 133, 135, 136, 137, 171, 172, 173]}, "92": {"name": "model.demo.forms", "type": "model", "succ": [82]}, "93": {"name": "model.demo.answers_short_and_long_answer", "type": "model", "succ": [82, 165, 168]}, "94": {"name": "model.demo.answers_option_and_sorting", "type": "model", "succ": [82, 167]}, "95": {"name": "model.demo.answers_matrix", "type": "model", "succ": [82, 166, 169]}, "96": {"name": "model.demo.answers_file", "type": "model", "succ": [82]}, "97": {"name": "model.demo.categorizations", "type": "model", "succ": [83, 88, 85, 78, 152, 153]}, "98": {"name": "model.demo.int_components", "type": "model", "succ": [89, 170]}, "99": {"name": "model.demo.users", "type": "model", "succ": [131, 132, 133]}, "100": {"name": "model.demo.budgets", "type": "model"}, "101": {"name": "model.demo.int_budgets_orders", "type": "model", "succ": [84, 174]}, "102": {"name": "model.demo.int_budgets_projects", "type": "model", "succ": [88, 175]}, "103": {"name": "model.demo.int_meetings", "type": "model", "succ": [85]}, "104": {"name": "model.demo.int_proposals", "type": "model", "succ": [78, 176, 177, 178, 179]}, "105": {"name": "model.demo.int_scopes", "type": "model", "succ": [78]}, "106": {"name": "model.demo.int_forms_answers", "type": "model", "succ": [96, 94, 95, 93, 164]}, "107": {"name": "test.demo.not_null_stg_decidim_forms_answer_choices_id.6373c5b027", "type": "test"}, "108": {"name": "test.demo.unique_stg_decidim_forms_answer_choices_id.cac0250df2", "type": "test"}, "109": {"name": "test.demo.not_null_stg_decidim_forms_answer_choices_decidim_answer_id.70e833d8d0", "type": "test"}, "110": {"name": "test.demo.not_null_stg_decidim_forms_answer_choices_body.0c7838e1b8", "type": "test"}, "111": {"name": "test.demo.not_null_stg_decidim_forms_answers_id.92ce43439f", "type": "test"}, "112": {"name": "test.demo.unique_stg_decidim_forms_answers_id.8fb3388969", "type": "test"}, "113": {"name": "test.demo.not_null_stg_decidim_forms_question_matrix_rows_id.7e6619509e", "type": "test"}, "114": {"name": "test.demo.unique_stg_decidim_forms_question_matrix_rows_id.8db20e3085", "type": "test"}, "115": {"name": "test.demo.not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id.55db0b6fe6", "type": "test"}, "116": {"name": "test.demo.not_null_stg_decidim_forms_question_matrix_rows_body.71d322a975", "type": "test"}, "117": {"name": "test.demo.not_null_stg_decidim_forms_questionnaires_id.74cea2a594", "type": "test"}, "118": {"name": "test.demo.unique_stg_decidim_forms_questionnaires_id.c228c4d2a1", "type": "test"}, "119": {"name": "test.demo.not_null_stg_decidim_forms_questions_id.c7a096fa50", "type": "test"}, "120": {"name": "test.demo.unique_stg_decidim_forms_questions_id.3becc3a082", "type": "test"}, "121": {"name": "test.demo.unique_stg_decidim_budgets_line_items_id.93d157dab5", "type": "test"}, "122": {"name": "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id.759330b24d", "type": "test"}, "123": {"name": "test.demo.unique_stg_decidim_categorizations_id.6566c00409", "type": "test"}, "124": {"name": "test.demo.not_null_stg_decidim_categorizations_id.a059a79c08", "type": "test"}, "125": {"name": "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type.d2c10e48e4", "type": "test"}, "126": {"name": "test.demo.accepted_values_followings_following_way__real_follow__ancestor_follow.60d8b91db4", "type": "test"}, "127": {"name": "test.demo.not_null_components_id.85e75ab698", "type": "test"}, "128": {"name": "test.demo.unique_components_id.55875f0fa3", "type": "test"}, "129": {"name": "test.demo.not_null_components_manifest_name.2795dc3709", "type": "test"}, "130": {"name": "test.demo.not_null_components_decidim_organization_id.3ae04f70dd", "type": "test"}, "131": {"name": "test.demo.unique_users_id.ec952d9777", "type": "test"}, "132": {"name": "test.demo.not_null_users_id.4db5ed5c63", "type": "test"}, "133": {"name": "test.demo.relationships_users_id__id__ref_int_users_.c269bba0d5", "type": "test"}, "134": {"name": "test.demo.dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id.da5f9c9505", "type": "test"}, "135": {"name": "test.demo.unique_int_users_id.e5ba0ede1e", "type": "test"}, "136": {"name": "test.demo.not_null_int_users_id.1125b186c1", "type": "test"}, "137": {"name": "test.demo.not_null_int_users_nickname.b90ddd7677", "type": "test"}, "138": {"name": "model.test_lyon.decidim_awesome_proposal_extra_fields", "type": "model"}, "139": {"name": "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_id.aad3a9d9b8", "type": "test"}, "140": {"name": "test.test_lyon.unique_stg_decidim_awesome_proposal_extra_fields_id.1f06fde107", "type": "test"}, "141": {"name": "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id.5154a34bb9", "type": "test"}, "142": {"name": "unit_test.demo.stg_decidim_blogs_posts.resource_type_definition", "type": "unit_test"}, "143": {"name": "unit_test.demo.stg_decidim_debates.resource_type_definition", "type": "unit_test"}, "144": {"name": "unit_test.demo.stg_decidim_budgets_projects.resource_type_definition", "type": "unit_test"}, "145": {"name": "unit_test.demo.stg_decidim_proposals.resource_type_definition", "type": "unit_test"}, "146": {"name": "unit_test.demo.blogs_posts.test_url_concatenation", "type": "unit_test"}, "147": {"name": "unit_test.demo.components.test_ps_type", "type": "unit_test"}, "148": {"name": "unit_test.demo.components.test_ps_space_type_slug", "type": "unit_test"}, "149": {"name": "unit_test.demo.components.test_no_null_published_at", "type": "unit_test"}, "150": {"name": "unit_test.demo.components.test_take_only_assemblies_and_participatory_processes", "type": "unit_test"}, "151": {"name": "unit_test.demo.components.test_url_creation", "type": "unit_test"}, "152": {"name": "unit_test.demo.categorizations.testing_that_main_categories_are_properly_processed", "type": "unit_test"}, "153": {"name": "unit_test.demo.categorizations.testing_that_sub_categories_are_properly_processed", "type": "unit_test"}, "154": {"name": "unit_test.demo.endorsements.moderations-check", "type": "unit_test"}, "155": {"name": "unit_test.demo.endorsements.endorsements-component-check", "type": "unit_test"}, "156": {"name": "unit_test.demo.meetings.test_url_concatenation", "type": "unit_test"}, "157": {"name": "unit_test.demo.meetings.test_manifest_name_is_meetings", "type": "unit_test"}, "158": {"name": "unit_test.demo.proposals.withdrawn_proposals_check", "type": "unit_test"}, "159": {"name": "unit_test.demo.proposals.moderations_proposals_check", "type": "unit_test"}, "160": {"name": "unit_test.demo.proposals.conflict_on_decidim_reportable_type_check", "type": "unit_test"}, "161": {"name": "unit_test.demo.proposals.published_at_check", "type": "unit_test"}, "162": {"name": "unit_test.demo.int_organizations.test_filter_by_host", "type": "unit_test"}, "163": {"name": "unit_test.demo.int_organizations.test_regex_clean_description", "type": "unit_test"}, "164": {"name": "unit_test.demo.int_forms_answers.int_forms_answers_author_status_check", "type": "unit_test"}, "165": {"name": "unit_test.demo.answers_short_and_long_answer.answers_short_and_long_answer_check", "type": "unit_test"}, "166": {"name": "unit_test.demo.answers_matrix.answers_matrix_check", "type": "unit_test"}, "167": {"name": "unit_test.demo.answers_option_and_sorting.answers_option_and_sorting_check_on_question_type", "type": "unit_test"}, "168": {"name": "unit_test.demo.answers_short_and_long_answer.short_and_long_answer_check_on_question_type", "type": "unit_test"}, "169": {"name": "unit_test.demo.answers_matrix.answers_matrix_check_on_question_type", "type": "unit_test"}, "170": {"name": "unit_test.demo.int_components.test_translated_manifest_name", "type": "unit_test"}, "171": {"name": "unit_test.demo.int_users.deleted_users_check", "type": "unit_test"}, "172": {"name": "unit_test.demo.int_users.type_check", "type": "unit_test"}, "173": {"name": "unit_test.demo.int_users.sign_in_frequency_check", "type": "unit_test"}, "174": {"name": "unit_test.demo.int_budgets_orders.vote_finished_test", "type": "unit_test"}, "175": {"name": "unit_test.demo.int_budgets_projects.is_selected_test", "type": "unit_test"}, "176": {"name": "unit_test.demo.int_proposals.test_default_state", "type": "unit_test"}, "177": {"name": "unit_test.demo.int_proposals.test_translated_state", "type": "unit_test"}, "178": {"name": "unit_test.demo.int_proposals.test_default_address", "type": "unit_test"}, "179": {"name": "unit_test.demo.int_proposals.test_published_at_not_null", "type": "unit_test"}, "180": {"name": "unit_test.test_lyon.int_decidim_awesome_proposal_extra_fields.testing_that_the_correct_xml_information_are_parsed", "type": "unit_test"}}} \ No newline at end of file diff --git a/projects/test_lyon/target/manifest.json b/projects/test_lyon/target/manifest.json new file mode 100644 index 00000000..fd88a3fa --- /dev/null +++ b/projects/test_lyon/target/manifest.json @@ -0,0 +1 @@ +{"metadata": {"dbt_schema_version": "https://schemas.getdbt.com/dbt/manifest/v12.json", "dbt_version": "1.8.7", "generated_at": "2024-09-27T14:10:05.847371Z", "invocation_id": "abd1849f-2f07-41b8-9fd3-963d4daf1290", "env": {}, "project_name": "test_lyon", "project_id": "d8e56c488ab880a5d9339647e9a91e77", "user_id": "adcb453e-1d39-47b3-9baa-63abbc85451c", "send_anonymous_usage_stats": true, "adapter_type": "postgres"}, "nodes": {"model.test_lyon.int_decidim_awesome_proposal_extra_fields": {"database": "test_lyon", "schema": "prod", "name": "int_decidim_awesome_proposal_extra_fields", "resource_type": "model", "package_name": "test_lyon", "path": "intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql", "original_file_path": "models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql", "unique_id": "model.test_lyon.int_decidim_awesome_proposal_extra_fields", "fqn": ["test_lyon", "intermediate", "decidim_awesome", "int_decidim_awesome_proposal_extra_fields"], "alias": "int_decidim_awesome_proposal_extra_fields", "checksum": {"name": "sha256", "checksum": "b835485e439f483316d7c11e01c190988a7f3415d43d63a0de0bf2c7a6eeae79"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.500312, "relation_name": "\"test_lyon\".\"prod\".\"int_decidim_awesome_proposal_extra_fields\"", "raw_code": "WITH parsed_data AS (\n SELECT\n decidim_awesome_proposal_extra_fields.id,\n decidim_awesome_proposal_extra_fields.proposal_id,\n xpath('//text()', unnest(xpath('//dt', xml_data)))::text AS private_field_description,\n unnest(xpath('//dd/div/text()', unnest(xpath('//dd', xml_data))))::text AS private_field_content\n FROM\n {{ ref (\"stg_decidim_awesome_proposal_extra_fields\")}} AS decidim_awesome_proposal_extra_fields,\n LATERAL xmlparse(document private_body_clear) AS xml_data\n)\nSELECT\n parsed_data.id,\n parsed_data.proposal_id,\n replace(replace(private_field_description, '{\"', ''), '\"}', '') AS private_field_description,\n parsed_data.private_field_content\nFROM\n parsed_data\nWHERE\n private_field_content IS NOT NULL", "language": "sql", "refs": [{"name": "stg_decidim_awesome_proposal_extra_fields", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_attachments": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_attachments", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_attachments.sql", "original_file_path": "models/staging/decidim/stg_decidim_attachments.sql", "unique_id": "model.demo.stg_decidim_attachments", "fqn": ["demo", "staging", "decidim", "stg_decidim_attachments"], "alias": "stg_decidim_attachments", "checksum": {"name": "sha256", "checksum": "8e4c1762127b7fb4a32fb9ba5b67d7c1cdcab73077043069303f971d6f764b49"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.509962, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_attachments\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_attachments') }}\n),\nrenamed as (\n SELECT\n id,\n title,\n description,\n file,\n content_type,\n file_size,\n attached_to_id,\n created_at,\n updated_at,\n attached_to_type,\n weight,\n attachment_collection_id\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_attachments"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_attachments"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_components": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_components", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_components.sql", "original_file_path": "models/staging/decidim/stg_decidim_components.sql", "unique_id": "model.demo.stg_decidim_components", "fqn": ["demo", "staging", "decidim", "stg_decidim_components"], "alias": "stg_decidim_components", "checksum": {"name": "sha256", "checksum": "e7f975f26d0129f6fc9d4b6367e672974c4e9f49b8c4486bafe7ae796bba5d12"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.5110981, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_components\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_components') }}\n),\nrenamed AS (\n SELECT\n id,\n manifest_name,\n name::jsonb->>'fr' AS name,\n participatory_space_id,\n participatory_space_type,\n settings,\n weight,\n permissions,\n published_at,\n created_at,\n updated_at\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_components"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_endorsements": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_endorsements", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_endorsements.sql", "original_file_path": "models/staging/decidim/stg_decidim_endorsements.sql", "unique_id": "model.demo.stg_decidim_endorsements", "fqn": ["demo", "staging", "decidim", "stg_decidim_endorsements"], "alias": "stg_decidim_endorsements", "checksum": {"name": "sha256", "checksum": "9bec191fd84606c6ffcc454c65c75ce685790295ca46168991848f4bb0184968"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.512197, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_endorsements\"", "raw_code": "SELECT\n id,\n resource_type,\n resource_id,\n decidim_author_type,\n decidim_author_id,\n decidim_user_group_id,\n created_at,\n updated_at\nFROM {{ source('decidim', 'decidim_endorsements') }}", "language": "sql", "refs": [], "sources": [["decidim", "decidim_endorsements"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_endorsements"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_follows": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_follows", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_follows.sql", "original_file_path": "models/staging/decidim/stg_decidim_follows.sql", "unique_id": "model.demo.stg_decidim_follows", "fqn": ["demo", "staging", "decidim", "stg_decidim_follows"], "alias": "stg_decidim_follows", "checksum": {"name": "sha256", "checksum": "845bec0e562eec37206c673c0afc83cacf07402c414370dd5ddd97e13dd98f39"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.513283, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_follows\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_follows') }}\n),\nrenamed as (\n SELECT\n id,\n decidim_user_id,\n updated_at,\n created_at,\n decidim_followable_type,\n decidim_followable_id\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_follows"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_follows"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_comments": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_comments", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_comments.sql", "original_file_path": "models/staging/decidim/stg_decidim_comments.sql", "unique_id": "model.demo.stg_decidim_comments", "fqn": ["demo", "staging", "decidim", "stg_decidim_comments"], "alias": "stg_decidim_comments", "checksum": {"name": "sha256", "checksum": "79b502cf06a2626b020049fb4b680547e6dbf7487a4f51ffe9a2579c91172337"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.514428, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_comments\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_comments_comments') }}\n),\nrenamed as (\n SELECT\n id,\n decidim_commentable_type,\n decidim_commentable_id,\n decidim_author_id,\n created_at,\n updated_at,\n depth,\n alignment,\n decidim_user_group_id,\n decidim_root_commentable_type,\n decidim_root_commentable_id,\n decidim_author_type,\n body::jsonb->>'fr' as body,\n comments_count\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_comments_comments"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_comments_comments"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_meetings_registrations": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_meetings_registrations", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_meetings_registrations.sql", "original_file_path": "models/staging/decidim/stg_decidim_meetings_registrations.sql", "unique_id": "model.demo.stg_decidim_meetings_registrations", "fqn": ["demo", "staging", "decidim", "stg_decidim_meetings_registrations"], "alias": "stg_decidim_meetings_registrations", "checksum": {"name": "sha256", "checksum": "293379745fa39579f8f128e1ed40eab024dcff4fbc9527c62497da0d24ff70f8"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.5154839, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_meetings_registrations\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_meetings_registrations') }}\n),\nrenamed AS (\n select\n id,\n decidim_user_id,\n decidim_meeting_id,\n created_at,\n updated_at,\n code,\n validated_at,\n decidim_user_group_id\n FROM source\n)\nselect * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_meetings_registrations"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_meetings_registrations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_participatory_processes": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_participatory_processes", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_participatory_processes.sql", "original_file_path": "models/staging/decidim/stg_decidim_participatory_processes.sql", "unique_id": "model.demo.stg_decidim_participatory_processes", "fqn": ["demo", "staging", "decidim", "stg_decidim_participatory_processes"], "alias": "stg_decidim_participatory_processes", "checksum": {"name": "sha256", "checksum": "76b94379422e2efc8138274d1d77289c93ee8ed7e3cb9b94f4b16bc80d4f6d57"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.516536, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_participatory_processes\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_participatory_processes') }}\n),\nrenamed AS (\n SELECT \n id, \n published_at, \n title::jsonb->>'fr' AS title,\n subtitle::jsonb->>'fr' as subtitle, \n slug, \n 'Decidim::ParticipatoryProcess' as type,\n 'processes' as space_type_slug,\n decidim_organization_id\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_participatory_processes"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_participatory_processes"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_users": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_users", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_users.sql", "original_file_path": "models/staging/decidim/stg_decidim_users.sql", "unique_id": "model.demo.stg_decidim_users", "fqn": ["demo", "staging", "decidim", "stg_decidim_users"], "alias": "stg_decidim_users", "checksum": {"name": "sha256", "checksum": "e2c91dfd9f730fc788d2adf9bb88f58d84445a81a24f863fe747a139241bd8d0"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.517567, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_users\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_users') }}\n),\nrenamed AS (\n SELECT \n id,\n email,\n sign_in_count,\n last_sign_in_at,\n created_at,\n updated_at,\n invitation_created_at,\n invitation_sent_at,\n invitation_accepted_at,\n invited_by_id,\n invited_by_type,\n decidim_organization_id,\n confirmed_at,\n confirmation_token,\n unconfirmed_email,\n name,\n locale,\n deleted_at,\n admin,\n managed,\n roles::text AS roles,\n nickname,\n accepted_tos_version,\n type,\n following_count,\n followers_count,\n failed_attempts,\n locked_at,\n admin_terms_accepted_at,\n blocked,\n blocked_at,\n (CASE WHEN confirmed_at IS NULL THEN false ELSE true END) AS \"confirmed\",\n extended_data\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_users"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_participatory_process_steps": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_participatory_process_steps", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_participatory_process_steps.sql", "original_file_path": "models/staging/decidim/stg_decidim_participatory_process_steps.sql", "unique_id": "model.demo.stg_decidim_participatory_process_steps", "fqn": ["demo", "staging", "decidim", "stg_decidim_participatory_process_steps"], "alias": "stg_decidim_participatory_process_steps", "checksum": {"name": "sha256", "checksum": "d8a8fe723174bcddf09a5900d0598c0c6c86c72947fcb462cb664e6dbdde860b"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.518616, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_participatory_process_steps\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_participatory_process_steps') }}\n),\nrenamed AS (\n select\n id,\n title::jsonb->>'fr' as title,\n title::jsonb->>'fr' as description,\n start_date,\n end_date,\n decidim_participatory_process_id,\n created_at,\n updated_at,\n active,\n position,\n cta_text,\n cta_path\n\n FROM source\n)\nselect * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_participatory_process_steps"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_participatory_process_steps"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_coauthorships": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_coauthorships", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_coauthorships.sql", "original_file_path": "models/staging/decidim/stg_decidim_coauthorships.sql", "unique_id": "model.demo.stg_decidim_coauthorships", "fqn": ["demo", "staging", "decidim", "stg_decidim_coauthorships"], "alias": "stg_decidim_coauthorships", "checksum": {"name": "sha256", "checksum": "9fed6dbe61618f54b9f08d7f60b5c8ec41046eda17cd24064dedb7b380b3cd63"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}, {"columns": ["decidim_author_id"], "type": "btree"}, {"columns": ["coauthorable_id"], "type": "btree"}, {"columns": ["coauthorable_type"], "type": "btree"}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}, {"columns": ["decidim_author_id"], "type": "btree"}, {"columns": ["coauthorable_id"], "type": "btree"}, {"columns": ["coauthorable_type"], "type": "btree"}]}, "created_at": 1727441769.519694, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_coauthorships\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n {'columns': ['decidim_author_id'], 'type': 'btree'},\n {'columns': ['coauthorable_id'], 'type': 'btree'},\n {'columns': ['coauthorable_type'], 'type': 'btree'},\n ]\n)}}\n\nWITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_coauthorships') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_author_id,\n decidim_user_group_id,\n coauthorable_type,\n coauthorable_id,\n created_at,\n updated_at,\n decidim_author_type\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_coauthorships"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_coauthorships"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_meetings": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_meetings", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_meetings.sql", "original_file_path": "models/staging/decidim/stg_decidim_meetings.sql", "unique_id": "model.demo.stg_decidim_meetings", "fqn": ["demo", "staging", "decidim", "stg_decidim_meetings"], "alias": "stg_decidim_meetings", "checksum": {"name": "sha256", "checksum": "cc97aa4855ffbe86bc253d3dbbf5e4d1a9411b4869271f5208574c4add1fa025"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.521081, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_meetings\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_meetings_meetings') }}\n),\nrenamed AS (\n SELECT\n id,\n title::jsonb->>'fr' AS title,\n regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') AS description,\n coalesce(nullif(address,''), 'Pas d''adresse') as address,\n coalesce(attendees_count, 0) as attendees_count,\n created_at,\n decidim_scope_id,\n decidim_component_id,\n start_time,\n end_time,\n registration_url,\n type_of_meeting,\n private_meeting,\n decidim_author_id,\n 'Decidim::Meetings::Meeting' as resource_type\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_meetings_meetings"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_meetings_meetings"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_accountability_results": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_accountability_results", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_accountability_results.sql", "original_file_path": "models/staging/decidim/stg_decidim_accountability_results.sql", "unique_id": "model.demo.stg_decidim_accountability_results", "fqn": ["demo", "staging", "decidim", "stg_decidim_accountability_results"], "alias": "stg_decidim_accountability_results", "checksum": {"name": "sha256", "checksum": "49855fb3280a786e77b03797472d8eceb9f3d3b5b1ed9e01cd0ac5aae55049db"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.522144, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_accountability_results\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_accountability_results') }}\n),\nrenamed as (\n select\n id,\n title,\n description,\n reference,\n start_date,\n end_date,\n progress,\n parent_id,\n decidim_accountability_status_id,\n decidim_component_id,\n decidim_scope_id,\n created_at,\n updated_at,\n children_count,\n weight,\n external_id,\n comments_count\n FROM source\n)\nselect * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_accountability_results"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_accountability_results"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_moderations": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_moderations", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_moderations.sql", "original_file_path": "models/staging/decidim/stg_decidim_moderations.sql", "unique_id": "model.demo.stg_decidim_moderations", "fqn": ["demo", "staging", "decidim", "stg_decidim_moderations"], "alias": "stg_decidim_moderations", "checksum": {"name": "sha256", "checksum": "56f85d7867823a3974795f077bff219974db2feefcfd50d41d995cbdb073d688"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.523198, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_moderations\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_moderations') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_participatory_space_id,\n decidim_reportable_type,\n decidim_reportable_id,\n report_count,\n hidden_at,\n created_at,\n updated_at,\n decidim_participatory_space_type,\n reported_content\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_moderations"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_moderations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_surveys": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_surveys", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_surveys.sql", "original_file_path": "models/staging/decidim/stg_decidim_surveys.sql", "unique_id": "model.demo.stg_decidim_surveys", "fqn": ["demo", "staging", "decidim", "stg_decidim_surveys"], "alias": "stg_decidim_surveys", "checksum": {"name": "sha256", "checksum": "23fa810230da2fc8db40b75648be3fd792a004c782e6b97380ebcc3a3a8a00f1"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.524245, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_surveys\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_surveys_surveys') }}\n),\nrenamed as (\n SELECT\n id,\n decidim_component_id,\n created_at,\n updated_at\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_surveys_surveys"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_surveys_surveys"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_organizations": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_organizations", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/organizations/stg_decidim_organizations.sql", "original_file_path": "models/staging/decidim/organizations/stg_decidim_organizations.sql", "unique_id": "model.demo.stg_decidim_organizations", "fqn": ["demo", "staging", "decidim", "organizations", "stg_decidim_organizations"], "alias": "stg_decidim_organizations", "checksum": {"name": "sha256", "checksum": "06c363b526b111c1e9b06a9c27ae49175dc6deee5d1c016b8e6e271639ba219b"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "A staging model for Decidim organizations", "columns": {"id": {"name": "id", "description": "Unique identifier for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "name": {"name": "name", "description": "Name of the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "host": {"name": "host", "description": "Host URL for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "default_locale": {"name": "default_locale", "description": "Default locale for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "available_locales": {"name": "available_locales", "description": "List of available locales for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the organization was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "description": {"name": "description", "description": "Description of the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "secondary_hosts": {"name": "secondary_hosts", "description": "Secondary hosts for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "available_authorizations": {"name": "available_authorizations", "description": "List of available authorizations for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "header_snippets": {"name": "header_snippets", "description": "Header snippets for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "tos_version": {"name": "tos_version", "description": "Version of the terms of service", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "badges_enabled": {"name": "badges_enabled", "description": "Indicates if badges are enabled. Badges in Decidim recognize participant actions and progress, enhancing engagement through gamification.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "send_welcome_notification": {"name": "send_welcome_notification", "description": "Flag indicating if welcome notifications are sent", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "users_registration_mode": {"name": "users_registration_mode", "description": "Mode of user registration", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "time_zone": {"name": "time_zone", "description": "Time zone of the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/organizations/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.763382, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_organizations\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_organizations') }}\n),\nrenamed AS (\n SELECT \n id,\n name,\n host,\n default_locale,\n available_locales::text as available_locales,\n created_at,\n description,\n secondary_hosts::text as secondary_hosts,\n available_authorizations::text as available_authorizations,\n header_snippets,\n tos_version,\n badges_enabled,\n send_welcome_notification,\n users_registration_mode,\n time_zone\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_organizations"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_organizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_forms_question_matrix_rows": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_forms_question_matrix_rows", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql", "original_file_path": "models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql", "unique_id": "model.demo.stg_decidim_forms_question_matrix_rows", "fqn": ["demo", "staging", "decidim", "forms", "stg_decidim_forms_question_matrix_rows"], "alias": "stg_decidim_forms_question_matrix_rows", "checksum": {"name": "sha256", "checksum": "814b4c0e437783633cd55c4813020ca4952f42adf8b0be80653d2d7dbe192a8d"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table for forms question of type matrix.", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_question_id": {"name": "decidim_question_id", "description": "Foreign key to the question.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "position": {"name": "position", "description": "Position of the matrix row.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "body": {"name": "body", "description": "Content of the matrix row.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/forms/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.766201, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_forms_question_matrix_rows\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_forms_question_matrix_rows') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_question_id,\n position,\n TRIM(body::jsonb->>'fr') AS body\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_forms_question_matrix_rows"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_forms_question_matrix_rows"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_forms_answers": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_forms_answers", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/forms/stg_decidim_forms_answers.sql", "original_file_path": "models/staging/decidim/forms/stg_decidim_forms_answers.sql", "unique_id": "model.demo.stg_decidim_forms_answers", "fqn": ["demo", "staging", "decidim", "forms", "stg_decidim_forms_answers"], "alias": "stg_decidim_forms_answers", "checksum": {"name": "sha256", "checksum": "ac9f9dc1a41cdb8330bd5cea54fb7dcc9533baf451d2ed5ca34864cccb85eedf"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table for forms answer when the answer is not in a matrix or optional and sorting question. (i.e long_answer and short_answer)", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "body": {"name": "body", "description": "Content of the answer. It is null if the question is a matrix or option, or sorting. It can be 'separator' if the question is a separator", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_user_id": {"name": "decidim_user_id", "description": "Foreign key to the user who gave the answer.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_questionnaire_id": {"name": "decidim_questionnaire_id", "description": "Foreign key to the questionnaire.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_question_id": {"name": "decidim_question_id", "description": "Foreign key to the question.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the answer was created.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Timestamp when the answer was last updated.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "session_token": {"name": "session_token", "description": "Session token of the user.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ip_hash": {"name": "ip_hash", "description": "Hashed IP address of the user.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/forms/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.765903, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_forms_answers\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_forms_answers') }}\n),\nrenamed AS (\n SELECT\n id,\n body,\n decidim_user_id,\n decidim_questionnaire_id,\n decidim_question_id,\n created_at,\n updated_at,\n session_token,\n ip_hash\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_forms_answers"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_forms_answers"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_forms_questions": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_forms_questions", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/forms/stg_decidim_forms_questions.sql", "original_file_path": "models/staging/decidim/forms/stg_decidim_forms_questions.sql", "unique_id": "model.demo.stg_decidim_forms_questions", "fqn": ["demo", "staging", "decidim", "forms", "stg_decidim_forms_questions"], "alias": "stg_decidim_forms_questions", "checksum": {"name": "sha256", "checksum": "05cb213ca7e5693567492a2593f1166ab83d4efff9cc02add61aacb18a01465f"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}, {"columns": ["decidim_questionnaire_id"], "type": "btree"}, {"type": "btree", "columns": ["question_type"]}]}, "tags": [], "description": "Table for forms questions", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_questionnaire_id": {"name": "decidim_questionnaire_id", "description": "Foreign key to the questionnaire.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "position": {"name": "position", "description": "Position of the question.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "question_type": {"name": "question_type", "description": "Type of the question (e.g., short_answer, long_answer, single_matrix ...).", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "mandatory": {"name": "mandatory", "description": "Boolean that indicates whether the question is mandatory.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "body": {"name": "body", "description": "Content of the question.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "description": {"name": "description", "description": "Description of the question.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "max_choices": {"name": "max_choices", "description": "Maximum number of choices allowed for the question.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the question was created.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Timestamp when the question was last updated.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "max_characters": {"name": "max_characters", "description": "Maximum number of characters allowed for the question.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/forms/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}, {"columns": ["decidim_questionnaire_id"], "type": "btree"}, {"type": "btree", "columns": ["question_type"]}]}, "created_at": 1727441769.769504, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_forms_questions\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n {'columns': ['decidim_questionnaire_id'], 'type': 'btree'},\n {'columns': ['question_type'], 'type': 'btree'},\n ]\n)}}\n\nWITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_forms_questions') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_questionnaire_id,\n position,\n question_type,\n mandatory,\n body::jsonb->>'fr' AS body,\n description,\n max_choices,\n created_at,\n updated_at,\n max_characters\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_forms_questions"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_forms_questions"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_forms_questionnaires": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_forms_questionnaires", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/forms/stg_decidim_forms_questionnaires.sql", "original_file_path": "models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql", "unique_id": "model.demo.stg_decidim_forms_questionnaires", "fqn": ["demo", "staging", "decidim", "forms", "stg_decidim_forms_questionnaires"], "alias": "stg_decidim_forms_questionnaires", "checksum": {"name": "sha256", "checksum": "2817595f60f5e32a08a712a7e37b9b45c3b7aae5ce698abe19f841f9728a6d10"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table for forms questionnaires", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "title": {"name": "title", "description": "Title of the questionnaire.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "description": {"name": "description", "description": "Description of the questionnaire.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "tos": {"name": "tos", "description": "Terms of service associated with the questionnaire.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "questionnaire_for_type": {"name": "questionnaire_for_type", "description": "Type of entity the questionnaire is for.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "questionnaire_for_id": {"name": "questionnaire_for_id", "description": "ID of the entity the questionnaire is for.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "published_at": {"name": "published_at", "description": "Timestamp when the questionnaire was published.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the questionnaire was created.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Timestamp when the questionnaire was last updated.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "salt": {"name": "salt", "description": "Salt used for hashing.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/forms/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.768296, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_forms_questionnaires\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_forms_questionnaires') }}\n),\nrenamed AS (\n SELECT\n id,\n title,\n description,\n tos,\n questionnaire_for_type,\n questionnaire_for_id,\n published_at,\n created_at,\n updated_at,\n salt\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_forms_questionnaires"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_forms_questionnaires"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_forms_answer_choices": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_forms_answer_choices", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/forms/stg_decidim_forms_answer_choices.sql", "original_file_path": "models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql", "unique_id": "model.demo.stg_decidim_forms_answer_choices", "fqn": ["demo", "staging", "decidim", "forms", "stg_decidim_forms_answer_choices"], "alias": "stg_decidim_forms_answer_choices", "checksum": {"name": "sha256", "checksum": "4589e69fcd414bd03e8a0b7fab9090f630dd97b20b8b2723a04cf5c115327383"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table for forms answer choices when the answer is in a matrix question or in a sorting or optional question, this table stores the choice of the answerer.", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_answer_id": {"name": "decidim_answer_id", "description": "Foreign key to the answer this choice belongs to from the table decidim_forms_answers", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_answer_option_id": {"name": "decidim_answer_option_id", "description": "Foreign key to the answer option from the table decidim_forms_answer_options. (Currently not used)", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "position": {"name": "position", "description": "Position of the answer choice when the question is of type sorting.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "body": {"name": "body", "description": "Content of the answer choice.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "custom_body": {"name": "custom_body", "description": "Custom body for the answer choice when the answer is of type free text.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_question_matrix_row_id": {"name": "decidim_question_matrix_row_id", "description": "Foreign key to the question matrix row when the question is of type matrix. It matches the matrix rows.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/forms/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.764865, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_forms_answer_choices\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_forms_answer_choices') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_answer_id,\n decidim_answer_option_id,\n position,\n body::text AS body,\n custom_body,\n decidim_question_matrix_row_id\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_forms_answer_choices"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_forms_answer_choices"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_area_types": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_area_types", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/areas/stg_decidim_area_types.sql", "original_file_path": "models/staging/decidim/areas/stg_decidim_area_types.sql", "unique_id": "model.demo.stg_decidim_area_types", "fqn": ["demo", "staging", "decidim", "areas", "stg_decidim_area_types"], "alias": "stg_decidim_area_types", "checksum": {"name": "sha256", "checksum": "980236296434c2d141aae8aa6f07ad8753edf8f6e0d8b91e6e9be4b3e8f7199a"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table for (deprecated) area types. Area types are used mainly as categories and super categories for decidim area.", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/areas/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.782188, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_area_types\"", "raw_code": "WITH source as (\n SELECT * FROM {{ source('decidim', 'decidim_area_types') }}\n),\nrenamed as (\n SELECT\n id,\n decidim_organization_id,\n name,\n plural\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_area_types"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_area_types"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_areas": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_areas", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/areas/stg_decidim_areas.sql", "original_file_path": "models/staging/decidim/areas/stg_decidim_areas.sql", "unique_id": "model.demo.stg_decidim_areas", "fqn": ["demo", "staging", "decidim", "areas", "stg_decidim_areas"], "alias": "stg_decidim_areas", "checksum": {"name": "sha256", "checksum": "00d6180e582e438635a273ae76448a025dd2e2a41c9f4ba8d8c8f75ef943472c"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table for (deprecated) areas. Areas are sub categories for area types.", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "area_type_id": {"name": "area_type_id", "description": "Id of the area type, the area is linked to.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/areas/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.782549, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_areas\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_areas') }}\n),\nrenamed as (\n select\n id,\n name,\n area_type_id,\n decidim_organization_id,\n created_at,\n updated_at\n FROM source\n)\nselect * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_areas"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_areas"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_blogs_posts": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_blogs_posts", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql", "original_file_path": "models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql", "unique_id": "model.demo.stg_decidim_blogs_posts", "fqn": ["demo", "staging", "decidim", "blogs_posts", "stg_decidim_blogs_posts"], "alias": "stg_decidim_blogs_posts", "checksum": {"name": "sha256", "checksum": "a0d517da497c87b66748cd2983933375b788f2d42954ddbb457dc77b6b1e031e"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.533806, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_blogs_posts\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_blogs_posts') }}\n),\nrenamed AS (\n SELECT\n id,\n title::jsonb->>'fr' AS title,\n regexp_replace(body::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') AS body,\n decidim_component_id,\n created_at,\n decidim_author_id,\n 'Decidim::Blogs::Post' AS resource_type\n FROM source \n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_blogs_posts"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_blogs_posts"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_assemblies": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_assemblies", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/assemblies/stg_decidim_assemblies.sql", "original_file_path": "models/staging/decidim/assemblies/stg_decidim_assemblies.sql", "unique_id": "model.demo.stg_decidim_assemblies", "fqn": ["demo", "staging", "decidim", "assemblies", "stg_decidim_assemblies"], "alias": "stg_decidim_assemblies", "checksum": {"name": "sha256", "checksum": "1015fbb9b8eaf4ec92de03aeaeb6d537b866ad4c1e4e16e8e3eb0d42272d4acf"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "This model represents the assemblies in Decidim, with selected and renamed fields for easier analysis.", "columns": {"id": {"name": "id", "description": "Unique identifier of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "slug": {"name": "slug", "description": "Readable unique identifier of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "hashtag": {"name": "hashtag", "description": "Hashtag associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "decidim_organization_id": {"name": "decidim_organization_id", "description": "Identifier of the associated Decidim organization.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "created_at": {"name": "created_at", "description": "Date when the assembly was created.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "timestamp"}, "updated_at": {"name": "updated_at", "description": "Date when the assembly was last updated.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "timestamp"}, "title": {"name": "title", "description": "Title of the assembly in French.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "subtitle": {"name": "subtitle", "description": "Subtitle of the assembly in French.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "short_description": {"name": "short_description", "description": "Short description of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "description": {"name": "description", "description": "Full description of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "hero_image": {"name": "hero_image", "description": "Hero image of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "banner_image": {"name": "banner_image", "description": "Banner image of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "promoted": {"name": "promoted", "description": "Indicator if the assembly is promoted.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "boolean"}, "published_at": {"name": "published_at", "description": "Date when the assembly was published.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "timestamp"}, "developer_group": {"name": "developer_group", "description": "Developer group associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "meta_scope": {"name": "meta_scope", "description": "Meta scope of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "local_area": {"name": "local_area", "description": "Local area related to the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "target": {"name": "target", "description": "Target audience of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "participatory_scope": {"name": "participatory_scope", "description": "Participatory scope of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "participatory_structure": {"name": "participatory_structure", "description": "Participatory structure of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "show_statistics": {"name": "show_statistics", "description": "Indicator if statistics are shown for the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "boolean"}, "decidim_scope_id": {"name": "decidim_scope_id", "description": "Identifier of the Decidim scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "scopes_enabled": {"name": "scopes_enabled", "description": "Indicator if scopes are enabled for the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "boolean"}, "private_space": {"name": "private_space", "description": "Indicator if the assembly is in a private space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "boolean"}, "reference": {"name": "reference", "description": "Reference identifier of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "decidim_area_id": {"name": "decidim_area_id", "description": "Identifier of the Decidim area.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "parent_id": {"name": "parent_id", "description": "Identifier of the parent assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "parents_path": {"name": "parents_path", "description": "Path of parent assemblies.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "children_count": {"name": "children_count", "description": "Count of child assemblies.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "purpose_of_action": {"name": "purpose_of_action", "description": "Purpose of the assembly's action.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "composition": {"name": "composition", "description": "Composition of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "creation_date": {"name": "creation_date", "description": "Creation date of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "date"}, "created_by": {"name": "created_by", "description": "User who created the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "created_by_other": {"name": "created_by_other", "description": "Other entity that created the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "duration": {"name": "duration", "description": "Duration of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "date"}, "included_at": {"name": "included_at", "description": "Date when the assembly was included.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "date"}, "closing_date": {"name": "closing_date", "description": "Closing date of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "date"}, "closing_date_reason": {"name": "closing_date_reason", "description": "Reason for the assembly's closing date.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "internal_organisation": {"name": "internal_organisation", "description": "Internal organization associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "is_transparent": {"name": "is_transparent", "description": "Indicator if the assembly is transparent.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "boolean"}, "special_features": {"name": "special_features", "description": "Special features of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "twitter_handler": {"name": "twitter_handler", "description": "Twitter handle associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "instagram_handler": {"name": "instagram_handler", "description": "Instagram handle associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "facebook_handler": {"name": "facebook_handler", "description": "Facebook handle associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "youtube_handler": {"name": "youtube_handler", "description": "YouTube handle associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "github_handler": {"name": "github_handler", "description": "GitHub handle associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "decidim_assemblies_type_id": {"name": "decidim_assemblies_type_id", "description": "Identifier of the Decidim assembly type.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "weight": {"name": "weight", "description": "Weight of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "follows_count": {"name": "follows_count", "description": "Count of follows for the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "announcement": {"name": "announcement", "description": "Announcements related to the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "_airbyte_ab_id": {"name": "_airbyte_ab_id", "description": "Airbyte unique identifier.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "varchar"}, "_airbyte_emitted_at": {"name": "_airbyte_emitted_at", "description": "Timestamp when the record was emitted by Airbyte.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "timestamp with time zone"}, "_airbyte_normalized_at": {"name": "_airbyte_normalized_at", "description": "Timestamp when the record was normalized by Airbyte.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "timestamp with time zone"}, "_airbyte_decidim_assemblies_hashid": {"name": "_airbyte_decidim_assemblies_hashid", "description": "Hash identifier for the Decidim assemblies record.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/assemblies/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.790986, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_assemblies\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_assemblies') }}\n),\nrenamed AS (\n SELECT\n id,\n slug,\n hashtag,\n decidim_organization_id,\n created_at,\n updated_at,\n title::jsonb->>'fr' AS title,\n subtitle::jsonb->>'fr' AS subtitle,\n short_description,\n description,\n hero_image,\n banner_image,\n promoted,\n published_at,\n developer_group,\n meta_scope,\n local_area,\n target,\n participatory_scope,\n participatory_structure,\n show_statistics,\n decidim_scope_id,\n scopes_enabled,\n private_space,\n reference,\n decidim_area_id,\n parent_id,\n parents_path,\n children_count,\n purpose_of_action,\n composition,\n creation_date,\n created_by,\n created_by_other,\n duration,\n included_at,\n closing_date,\n closing_date_reason,\n internal_organisation,\n is_transparent,\n special_features,\n twitter_handler,\n instagram_handler,\n facebook_handler,\n youtube_handler,\n github_handler,\n decidim_assemblies_type_id,\n weight,\n follows_count\n\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_assemblies"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_assemblies"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_debates": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_debates", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/debates/stg_decidim_debates.sql", "original_file_path": "models/staging/decidim/debates/stg_decidim_debates.sql", "unique_id": "model.demo.stg_decidim_debates", "fqn": ["demo", "staging", "decidim", "debates", "stg_decidim_debates"], "alias": "stg_decidim_debates", "checksum": {"name": "sha256", "checksum": "5c0b32b3ec2a2483a475d371bde8ddc92c7368e303029bb62e5a63880db2406c"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.535916, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_debates\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_debates_debates') }}\n),\nrenamed AS (\n SELECT\n id,\n title::jsonb->>'fr' as title,\n regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description,\n start_time,\n end_time,\n decidim_component_id,\n decidim_author_id,\n created_at,\n closed_at,\n 'Decidim::Debates::Debate' as resource_type\n FROM source \n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_debates_debates"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_debates_debates"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_budgets_line_items": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_budgets_line_items", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/budgets/stg_decidim_budgets_line_items.sql", "original_file_path": "models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql", "unique_id": "model.demo.stg_decidim_budgets_line_items", "fqn": ["demo", "staging", "decidim", "budgets", "stg_decidim_budgets_line_items"], "alias": "stg_decidim_budgets_line_items", "checksum": {"name": "sha256", "checksum": "72e0383100994445b0c8276bbbed676427fdcc9b65ade7ad26374d46669e6332"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "A line item links a given order to a given budget project", "columns": {"id": {"name": "id", "description": "Unique identifier of the line item", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_order_id": {"name": "decidim_order_id", "description": "ID of the issued order", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_project_id": {"name": "decidim_project_id", "description": "ID of the budget project", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/budgets/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.794361, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_budgets_line_items\"", "raw_code": "WITH source as (\n SELECT * FROM {{ source('decidim', 'decidim_budgets_line_items') }}\n),\nrenamed as (\n select\n id,\n decidim_order_id,\n decidim_project_id\n FROM source\n)\nselect * from renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_budgets_line_items"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_budgets_line_items"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_budgets_projects": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_budgets_projects", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/budgets/stg_decidim_budgets_projects.sql", "original_file_path": "models/staging/decidim/budgets/stg_decidim_budgets_projects.sql", "unique_id": "model.demo.stg_decidim_budgets_projects", "fqn": ["demo", "staging", "decidim", "budgets", "stg_decidim_budgets_projects"], "alias": "stg_decidim_budgets_projects", "checksum": {"name": "sha256", "checksum": "38ba6a896c76883b85f479bffced7d415dd7db1e56daf191e57d4f88c0b5e402"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Lists every project for every budget on the platform", "columns": {"id": {"name": "id", "description": "Unique identifier for a project", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "title": {"name": "title", "description": "Title of the project", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "description": {"name": "description", "description": "Description of the project", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp of the creation of the project", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_scope_id": {"name": "decidim_scope_id", "description": "ID of the scope to which the project may be linked to", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "project_amount": {"name": "project_amount", "description": "Cost of the project", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "selected_at": {"name": "selected_at", "description": "Timestamp of the selection of the project (if selected)", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_budgets_budget_id": {"name": "decidim_budgets_budget_id", "description": "ID of the related budget", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "resource_type": {"name": "resource_type", "description": "Hardcoded resource type", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/budgets/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.793084, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_budgets_projects\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_budgets_projects') }}\n),\nrenamed AS (\n SELECT\n id, \n title::jsonb->>'fr' as title,\n regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description,\n created_at,\n decidim_scope_id, \n budget_amount as project_amount,\n selected_at,\n decidim_budgets_budget_id,\n 'Decidim::Budgets::Project' as resource_type\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_budgets_projects"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_budgets_projects"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_budgets_orders": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_budgets_orders", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/budgets/stg_decidim_budgets_orders.sql", "original_file_path": "models/staging/decidim/budgets/stg_decidim_budgets_orders.sql", "unique_id": "model.demo.stg_decidim_budgets_orders", "fqn": ["demo", "staging", "decidim", "budgets", "stg_decidim_budgets_orders"], "alias": "stg_decidim_budgets_orders", "checksum": {"name": "sha256", "checksum": "3b3b9f2641d07ac85ded9cda4d4650ebbef60a90071fe7e5cc162dc856cf4cfc"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "An order is a vote from a single user to a given budget, and can be linked to one or several budget projects", "columns": {"id": {"name": "id", "description": "Unique identifier for an order", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_user_id": {"name": "decidim_user_id", "description": "ID of the user who has issued the order", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "checked_out_at": {"name": "checked_out_at", "description": "Timestamp of the completion of the order. Blank if the user has not completed the order", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp of the creation of the order", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Timestamp of the last modification of the order", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_budgets_budget_id": {"name": "decidim_budgets_budget_id", "description": "ID of the budget for which the order is issued", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/budgets/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.793715, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_budgets_orders\"", "raw_code": "WITH source as (\n SELECT * FROM {{ source('decidim', 'decidim_budgets_orders') }}\n),\nrenamed as (\n select\n id,\n decidim_user_id,\n checked_out_at,\n created_at,\n updated_at,\n decidim_budgets_budget_id\n FROM source\n)\nselect * from renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_budgets_orders"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_budgets_orders"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_budgets": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_budgets", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/budgets/stg_decidim_budgets.sql", "original_file_path": "models/staging/decidim/budgets/stg_decidim_budgets.sql", "unique_id": "model.demo.stg_decidim_budgets", "fqn": ["demo", "staging", "decidim", "budgets", "stg_decidim_budgets"], "alias": "stg_decidim_budgets", "checksum": {"name": "sha256", "checksum": "273d0e8ca55e8b9a6bdf6f696db0b5c626309254dcee5060197d62edbb3be147"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Lists every budget on the platform and their component", "columns": {"id": {"name": "id", "description": "Unique identifier for a budget", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "title": {"name": "title", "description": "Title of the budget", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_component_id": {"name": "decidim_component_id", "description": "ID of the component to which the budget is linked to. Multiple budgets can share the same component", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/budgets/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.79217, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_budgets\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_budgets_budgets') }}\n),\nrenamed AS (\n SELECT\n id,\n title::jsonb->>'fr' as title,\n decidim_component_id\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_budgets_budgets"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_budgets_budgets"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_categories": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_categories", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/categories/stg_decidim_categories.sql", "original_file_path": "models/staging/decidim/categories/stg_decidim_categories.sql", "unique_id": "model.demo.stg_decidim_categories", "fqn": ["demo", "staging", "decidim", "categories", "stg_decidim_categories"], "alias": "stg_decidim_categories", "checksum": {"name": "sha256", "checksum": "65d0ed6e7ec2006b035af60381a5786cce520d33a5144af16b29fc62ea025f3e"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table describing categories (and sub categories) attributes used to classify ressources within a space.", "columns": {"id": {"name": "id", "description": "Unique identifier of the category.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "name": {"name": "name", "description": "Name of the category. ex: Sports, Environment", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "description": {"name": "description", "description": "String describing the category", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "parent_id": {"name": "parent_id", "description": "Unique identifier of the parent category. Can be null if the category is not a sub category", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_participatory_space_id": {"name": "decidim_participatory_space_id", "description": "Unique identifier of the participatory space the category is in.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_participatory_space_type": {"name": "decidim_participatory_space_type", "description": "Type of the participatory space the category is in. ex: Decidim::ParticipatoryProcess", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "weight": {"name": "weight", "description": "Optional field. Which order will it have in relation to the other categories. Having a lower number means a higher priority. For instance, if you have two categories, 'Category a' with weight '10' and 'Category b' with weight '0', then 'Category b' will be first when ordering.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/categories/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.8061051, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_categories\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_categories') }}\n),\nrenamed AS (\n SELECT\n id,\n name::jsonb->>'fr' AS name,\n description,\n parent_id,\n decidim_participatory_space_id,\n decidim_participatory_space_type,\n weight\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_categories"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_categories"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_categorizations": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_categorizations", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/categories/stg_decidim_categorizations.sql", "original_file_path": "models/staging/decidim/categories/stg_decidim_categorizations.sql", "unique_id": "model.demo.stg_decidim_categorizations", "fqn": ["demo", "staging", "decidim", "categories", "stg_decidim_categorizations"], "alias": "stg_decidim_categorizations", "checksum": {"name": "sha256", "checksum": "b79de09812a3faf75232e5d456b3354fd58ea0553726e7c0b01d734595d64b34"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table describing entities that are categorized (and sub categorized) within a participatory space", "columns": {"id": {"name": "id", "description": "Unique incremental identifier of the table", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_category_id": {"name": "decidim_category_id", "description": "Unique idientifier of the category defined in the 'decidim_categories' table", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "categorizable_type": {"name": "categorizable_type", "description": "Type of the entities categorized. ex: 'Decidim::Proposals::Proposal', 'Decidim::Budgets::Project', 'Decidim::Accountability::Result'", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "categorizable_id": {"name": "categorizable_id", "description": "For each categorizable type, there is a unique identifier. The categorizable id is that identifier. However multiple categorizable entities can have the same idientifier. ex : All three of these 'Decidim::Proposals::Proposal', 'Decidim::Budgets::Project' and 'Decidim::Accountability::Result' can have the categorizable_id 52.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Creation date", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Update date", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/categories/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.8067222, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_categorizations\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_categorizations') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_category_id,\n categorizable_type,\n categorizable_id,\n created_at,\n updated_at\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_categorizations"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_categorizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_scopes": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_scopes", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/scopes/stg_decidim_scopes.sql", "original_file_path": "models/staging/decidim/scopes/stg_decidim_scopes.sql", "unique_id": "model.demo.stg_decidim_scopes", "fqn": ["demo", "staging", "decidim", "scopes", "stg_decidim_scopes"], "alias": "stg_decidim_scopes", "checksum": {"name": "sha256", "checksum": "78fb052a78c3ec5ff86af8887b59253923aa986d35fee713b9b57422a4d840e2"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Scopes are the set of territories or subjects that an Organization has. A scope may have child scopes.", "columns": {"id": {"name": "id", "description": "Unique identifier for the scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_organization_id": {"name": "decidim_organization_id", "description": "Identifier for the Decidim organization to which the scope belongs.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the scope was created.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Timestamp when the scope was last updated.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "name": {"name": "name", "description": "Name of the scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "scope_type_id": {"name": "scope_type_id", "description": "Identifier for the type of scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "parent_id": {"name": "parent_id", "description": "Identifier for the parent scope, if applicable.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "code": {"name": "code", "description": "Code associated with the scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "part_of": {"name": "part_of", "description": "IDs of the parent-child scope relationship", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/scopes/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.811626, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_scopes\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_scopes') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_organization_id,\n created_at,\n updated_at,\n name::jsonb->>'fr' AS name,\n scope_type_id,\n parent_id,\n code,\n part_of\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_scopes"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_scopes"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_proposals_votes": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_proposals_votes", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/proposals/stg_decidim_proposals_votes.sql", "original_file_path": "models/staging/decidim/proposals/stg_decidim_proposals_votes.sql", "unique_id": "model.demo.stg_decidim_proposals_votes", "fqn": ["demo", "staging", "decidim", "proposals", "stg_decidim_proposals_votes"], "alias": "stg_decidim_proposals_votes", "checksum": {"name": "sha256", "checksum": "9e3bde2943a6c3cfd7afa06d4acab78502ca706a2bbfc83abe03a4cae27d59a9"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.544272, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_proposals_votes\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_proposals_proposal_votes') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_proposal_id,\n decidim_author_id,\n created_at,\n updated_at,\n weight,\n temporary\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_proposals_proposal_votes"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_proposals_proposal_votes"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_proposals_collaborative_drafts": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_proposals_collaborative_drafts", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql", "original_file_path": "models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql", "unique_id": "model.demo.stg_decidim_proposals_collaborative_drafts", "fqn": ["demo", "staging", "decidim", "proposals", "stg_decidim_proposals_collaborative_drafts"], "alias": "stg_decidim_proposals_collaborative_drafts", "checksum": {"name": "sha256", "checksum": "759545c94982b9f7a19556309bc2eb2be8dc5aa79f473c7d8c433c6b1b85e260"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.545302, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_proposals_collaborative_drafts\"", "raw_code": "WITH source as (\n SELECT * FROM {{ source('decidim', 'decidim_proposals_collaborative_drafts') }}\n),\nrenamed as (\n select\n id,\n title,\n body,\n decidim_component_id,\n decidim_scope_id,\n state,\n reference,\n address,\n latitude,\n longitude,\n published_at,\n authors_count,\n versions_count,\n contributions_count,\n created_at,\n updated_at,\n coauthorships_count,\n comments_count,\n follows_count\n\n from source\n)\nselect * from renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_proposals_collaborative_drafts"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_proposals_collaborative_drafts"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_proposals": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_proposals", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/proposals/stg_decidim_proposals.sql", "original_file_path": "models/staging/decidim/proposals/stg_decidim_proposals.sql", "unique_id": "model.demo.stg_decidim_proposals", "fqn": ["demo", "staging", "decidim", "proposals", "stg_decidim_proposals"], "alias": "stg_decidim_proposals", "checksum": {"name": "sha256", "checksum": "c5734b71c06a368a300e5d191fdf8fdea3257641195ec4ed8045421e2ce80130"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.5467541, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_proposals\"", "raw_code": "SELECT\n id,\n regexp_replace(title::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as title,\n regexp_replace(body::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as body,\n 'Decidim::Proposals::Proposal' as resource_type,\n decidim_component_id,\n decidim_scope_id,\n created_at,\n published_at,\n state,\n comments_count,\n endorsements_count,\n address\nFROM {{ source('decidim', 'decidim_proposals_proposals') }}", "language": "sql", "refs": [], "sources": [["decidim", "decidim_proposals_proposals"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_proposals_proposals"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.organizations": {"database": "test_lyon", "schema": "prod", "name": "organizations", "resource_type": "model", "package_name": "demo", "path": "marts/organizations.sql", "original_file_path": "models/marts/organizations.sql", "unique_id": "model.demo.organizations", "fqn": ["demo", "marts", "organizations"], "alias": "organizations", "checksum": {"name": "sha256", "checksum": "ddd77d68867258fdee09d89570ff743ec6ff90abf8bd8d3d929d8e41e0a2282c"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.580381, "relation_name": "\"test_lyon\".\"prod\".\"organizations\"", "raw_code": "SELECT\n*\nFROM {{ ref (\"int_organizations\")}} AS decidim_organizations", "language": "sql", "refs": [{"name": "int_organizations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.int_organizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.participations": {"database": "test_lyon", "schema": "prod", "name": "participations", "resource_type": "model", "package_name": "demo", "path": "marts/participations.sql", "original_file_path": "models/marts/participations.sql", "unique_id": "model.demo.participations", "fqn": ["demo", "marts", "participations"], "alias": "participations", "checksum": {"name": "sha256", "checksum": "a31604539d031cc2ecee5548176a89fb9108a14a13e2a8b0daa97f6ed02e83ef"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.581425, "relation_name": "\"test_lyon\".\"prod\".\"participations\"", "raw_code": "WITH participations_proposals AS (\n SELECT decidim_users.id,\n decidim_proposals_proposals.decidim_component_id,\n 'Decidim::Proposals::Proposal' AS \"participation_type\",\n decidim_proposals_proposals.id::text AS \"participation_id\",\n decidim_proposals_proposals.created_at AS participation_date\n FROM {{ ref(\"proposals\")}} AS decidim_proposals_proposals\n JOIN decidim_coauthorships on decidim_coauthorships.coauthorable_id = decidim_proposals_proposals.id\n JOIN decidim_users on decidim_users.id = decidim_coauthorships.decidim_author_id\n where coauthorable_type = 'Decidim::Proposals::Proposal'\n ), participations_endorsements as (\n SELECT decidim_users.id,\n decidim_endorsements.decidim_component_id,\n 'Decidim::Endorsements::Endorsement' as \"participation_type\",\n decidim_endorsements.id::text as \"participation_id\", \n decidim_endorsements.created_at as participation_date\n FROM {{ ref(\"endorsements\")}} as decidim_endorsements\n JOIN decidim_users on decidim_users.id = decidim_endorsements.decidim_author_id\n ), participations_comments as (\n SELECT decidim_users.id,\n decidim_component_id,\n 'Decidim::Comments::Comment' as \"participation_type\",\n decidim_comments_comments.id::text as \"participation_id\",\n decidim_comments_comments.created_at as contribution_date\n FROM {{ ref(\"comments\")}} decidim_comments_comments\n JOIN decidim_users on decidim_users.id = decidim_comments_comments.decidim_author_id\n ), participations_proposal_votes as (\n SELECT decidim_users.id,\n decidim_proposals_proposals.decidim_component_id,\n 'Decidim::Proposals::ProposalVote' as \"participation_type\",\n decidim_proposals_proposal_votes.id::text as \"participation_id\",\n decidim_proposals_proposal_votes.created_at as participation_date\n FROM {{ ref(\"proposals_votes\")}} as decidim_proposals_proposal_votes\n JOIN decidim_users on decidim_users.id = decidim_author_id\n JOIN {{ ref(\"proposals\")}} as decidim_proposals_proposals on decidim_proposals_proposal_votes.decidim_proposal_id = decidim_proposals_proposals.id\n ), participations_answers as (\n SELECT distinct\n decidim_user_id,\n decidim_component_id,\n 'Decidim::Forms::Answer' as \"participation_type\",\n ('x'||lpad(decidim_forms_answers.session_token,16,'0'))::bit(64)::bigint::text as \"participation_id\",\n decidim_forms_answers.created_at::date as participation_date\n FROM {{ ref(\"forms_answers\")}} as decidim_forms_answers\n ), participations_debates as (\n SELECT decidim_author_id as decidim_user_id,\n decidim_component_id,\n 'Decidim::Debates::Debate' as \"participation_type\",\n id::text as participation_id,\n created_at as participation_date\n FROM {{ ref(\"debates\")}} decidim_debates_debates\n ), participations_budgets_projects_votes as (\n SELECT\n decidim_user_id,\n decidim_component_id,\n 'Decidim::Budgets::Project::Vote' as participation_type,\n order_id::text as participation_id,\n created_at as participation_date\n FROM {{ ref(\"projects_votes\")}} decidim_bugdets_projects_votes\n ), participations_meetings_registrations as (\n SELECT\n decidim_user_id,\n decidim_component_id,\n 'Decidim::Meetings::Registration' as participation_type,\n decidim_meetings_meetings.id::text as participation_id,\n decidim_meetings_registrations.created_at as participation_date\n FROM {{ ref(\"meetings\")}} decidim_meetings_meetings\n join decidim_meetings_registrations on decidim_meetings_registrations.decidim_meeting_id = decidim_meetings_meetings.id\n ), participations as (\n SELECT * FROM participations_proposals union all\n SELECT * FROM participations_endorsements union all\n SELECT * FROM participations_comments union all\n SELECT * FROM participations_proposal_votes union all\n SELECT * from participations_answers union all\n SELECT * from participations_debates union all\n SELECT * from participations_budgets_projects_votes union all\n SELECT * from participations_meetings_registrations\n )\n SELECT\n distinct participations.id as \"user_id\",\n substr(participation_id,1,10)::bigint as participation_id,\n decidim_component_id,\n participation_type,\n participation_date\n from participations", "language": "sql", "refs": [{"name": "proposals", "package": null, "version": null}, {"name": "endorsements", "package": null, "version": null}, {"name": "comments", "package": null, "version": null}, {"name": "proposals_votes", "package": null, "version": null}, {"name": "proposals", "package": null, "version": null}, {"name": "forms_answers", "package": null, "version": null}, {"name": "debates", "package": null, "version": null}, {"name": "projects_votes", "package": null, "version": null}, {"name": "meetings", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.proposals", "model.demo.endorsements", "model.demo.comments", "model.demo.proposals_votes", "model.demo.forms_answers", "model.demo.debates", "model.demo.projects_votes", "model.demo.meetings"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.attachments": {"database": "test_lyon", "schema": "prod", "name": "attachments", "resource_type": "model", "package_name": "demo", "path": "marts/attachments.sql", "original_file_path": "models/marts/attachments.sql", "unique_id": "model.demo.attachments", "fqn": ["demo", "marts", "attachments"], "alias": "attachments", "checksum": {"name": "sha256", "checksum": "ee218fea222850e098dba008928a144007e80c0a64925d81c164d14a644220d1"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.5828009, "relation_name": "\"test_lyon\".\"prod\".\"attachments\"", "raw_code": "WITH org AS (\n -- Assumption: There is only one organization, so we select the first available host\n SELECT host\n FROM {{ ref(\"organizations\") }}\n LIMIT 1\n)\nSELECT\n decidim_attachments.id,\n decidim_attachments.file,\n decidim_attachments.attached_to_id,\n decidim_attachments.attached_to_type,\n concat('https://', org.host, '/uploads/decidim/attachment/file/', decidim_attachments.id, '/', decidim_attachments.file) AS url\nFROM\n {{ ref(\"stg_decidim_attachments\") }} AS decidim_attachments\nCROSS JOIN org", "language": "sql", "refs": [{"name": "organizations", "package": null, "version": null}, {"name": "stg_decidim_attachments", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.organizations", "model.demo.stg_decidim_attachments"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.comments": {"database": "test_lyon", "schema": "prod", "name": "comments", "resource_type": "model", "package_name": "demo", "path": "marts/comments/comments.sql", "original_file_path": "models/marts/comments/comments.sql", "unique_id": "model.demo.comments", "fqn": ["demo", "marts", "comments", "comments"], "alias": "comments", "checksum": {"name": "sha256", "checksum": "264b5c2b6a1655529133aee76e25d9af8955987a052e972a32986255c1550005"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["decidim_author_id"], "type": "btree"}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["decidim_author_id"], "type": "btree"}]}, "created_at": 1727441769.583959, "relation_name": "\"test_lyon\".\"prod\".\"comments\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_author_id'], 'type': 'btree'},\n ]\n)}}\n\n\n{% set commentable_tables = [\n {\"table\": \"stg_decidim_accountability_results\", \"type\": \"Decidim::Accountability::Result\"},\n {\"table\": \"blogs_posts\", \"type\": \"Decidim::Blogs::Post\"},\n {\"table\": \"budgets_projects\", \"type\": \"Decidim::Budgets::Project\"},\n {\"table\": \"debates\", \"type\": \"Decidim::Debates::Debate\"},\n {\"table\": \"meetings\", \"type\": \"Decidim::Meetings::Meeting\"},\n {\"table\": \"proposals\", \"type\": \"Decidim::Proposals::Proposal\"},\n {\"table\": \"stg_decidim_proposals_collaborative_drafts\", \"type\": \"Decidim::Proposals::CollaborativeDraft\"}\n] %}\n\nWITH commentaries AS (\n {% for commentable in commentable_tables %}\n SELECT\n comments.*, \n {{ ref(commentable.table) }}.decidim_component_id AS \"decidim_component_id\"\n FROM {{ ref(commentable.table) }}\n JOIN {{ ref(\"stg_decidim_comments\") }} AS comments\n on comments.decidim_root_commentable_id = {{ ref(commentable.table) }}.id\n and comments.decidim_root_commentable_type = '{{ commentable.type }}'\n {% if not loop.last %} union all {% endif %}\n {% endfor %}\n)\n\nSELECT\n commentaries.id,\n commentaries.decidim_commentable_id,\n commentaries.decidim_commentable_type,\n commentaries.decidim_author_id,\n commentaries.created_at,\n commentaries.depth,\n commentaries.alignment,\n commentaries.decidim_root_commentable_id,\n commentaries.decidim_root_commentable_type,\n commentaries.decidim_author_type,\n commentaries.body,\n commentaries.decidim_component_id,\n components.ps_slug,\n concat('https://', components.organization_host, '/', components.ps_space_type_slug, '/', components.ps_slug, '/f/', components.id, '/', components.manifest_name,'/', commentaries.decidim_root_commentable_id, '?commentId=', commentaries.id, '#comment_', commentaries.id) AS comment_url\nFROM commentaries\nJOIN {{ ref('components') }} AS components\n on components.id = commentaries.decidim_component_id\nLEFT JOIN {{ ref('stg_decidim_moderations') }} AS decidim_moderations\n on decidim_moderations.decidim_reportable_type = 'Decidim::Comments::Comment' \n and decidim_moderations.decidim_reportable_id = commentaries.id\nwhere decidim_moderations.hidden_at is null", "language": "sql", "refs": [{"name": "stg_decidim_accountability_results", "package": null, "version": null}, {"name": "stg_decidim_accountability_results", "package": null, "version": null}, {"name": "stg_decidim_comments", "package": null, "version": null}, {"name": "stg_decidim_accountability_results", "package": null, "version": null}, {"name": "blogs_posts", "package": null, "version": null}, {"name": "blogs_posts", "package": null, "version": null}, {"name": "stg_decidim_comments", "package": null, "version": null}, {"name": "blogs_posts", "package": null, "version": null}, {"name": "budgets_projects", "package": null, "version": null}, {"name": "budgets_projects", "package": null, "version": null}, {"name": "stg_decidim_comments", "package": null, "version": null}, {"name": "budgets_projects", "package": null, "version": null}, {"name": "debates", "package": null, "version": null}, {"name": "debates", "package": null, "version": null}, {"name": "stg_decidim_comments", "package": null, "version": null}, {"name": "debates", "package": null, "version": null}, {"name": "meetings", "package": null, "version": null}, {"name": "meetings", "package": null, "version": null}, {"name": "stg_decidim_comments", "package": null, "version": null}, {"name": "meetings", "package": null, "version": null}, {"name": "proposals", "package": null, "version": null}, {"name": "proposals", "package": null, "version": null}, {"name": "stg_decidim_comments", "package": null, "version": null}, {"name": "proposals", "package": null, "version": null}, {"name": "stg_decidim_proposals_collaborative_drafts", "package": null, "version": null}, {"name": "stg_decidim_proposals_collaborative_drafts", "package": null, "version": null}, {"name": "stg_decidim_comments", "package": null, "version": null}, {"name": "stg_decidim_proposals_collaborative_drafts", "package": null, "version": null}, {"name": "components", "package": null, "version": null}, {"name": "stg_decidim_moderations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_accountability_results", "model.demo.stg_decidim_comments", "model.demo.blogs_posts", "model.demo.budgets_projects", "model.demo.debates", "model.demo.meetings", "model.demo.proposals", "model.demo.stg_decidim_proposals_collaborative_drafts", "model.demo.components", "model.demo.stg_decidim_moderations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.followings": {"database": "test_lyon", "schema": "prod", "name": "followings", "resource_type": "model", "package_name": "demo", "path": "marts/followings/followings.sql", "original_file_path": "models/marts/followings/followings.sql", "unique_id": "model.demo.followings", "fqn": ["demo", "marts", "followings", "followings"], "alias": "followings", "checksum": {"name": "sha256", "checksum": "837620ce549291c73aa7951545d3b3234551fa3990a9eb5c0ddb97c51c8f0547"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"type": "btree", "columns": ["decidim_user_id"]}]}, "tags": [], "description": "Every follow action performed on the platform. Decidim counts follow in two different ways: follows on a specific resource (proposal, commentary, etc.) named 'real follow' and follows made on a component; every resource contained in that component is then marked as followed.", "columns": {"following_way": {"name": "following_way", "description": "Describes if the follow is either on a specific resource ('real_follow') or a component as a whole ('ancestor_follow')", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/followings/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"type": "btree", "columns": ["decidim_user_id"]}]}, "created_at": 1727441769.812691, "relation_name": "\"test_lyon\".\"prod\".\"followings\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_user_id'], 'type': 'btree'},\n ]\n)}}\n\n\nWITH followings_proposals AS (\n SELECT\n decidim_follows.*,\n decidim_proposals_proposals.decidim_component_id,\n url AS followable_url,\n title AS followable_title\n FROM {{ ref(\"stg_decidim_follows\")}} AS decidim_follows\n JOIN {{ ref(\"proposals\")}} decidim_proposals_proposals\n ON decidim_proposals_proposals.id = decidim_follows.decidim_followable_id\n AND decidim_proposals_proposals.resource_type = decidim_follows.decidim_followable_type\n ), followings_components AS (\n SELECT\n distinct decidim_follows.*,\n -1 AS \"decidim_components.id\",\n ps_url AS followable_url,\n ps_title AS followable_title\n FROM {{ ref(\"stg_decidim_follows\")}} AS decidim_follows\n JOIN {{ ref(\"components\")}} decidim_components\n ON decidim_components.ps_id = decidim_followable_id\n AND ps_type = decidim_followable_type\n ), followings_debates AS (\n SELECT\n decidim_follows.*,\n decidim_debates_debates.decidim_component_id,\n debate_url AS followable_url,\n title AS followable_title\n FROM {{ ref(\"stg_decidim_follows\")}} AS decidim_follows\n JOIN {{ ref(\"debates\")}} decidim_debates_debates ON decidim_debates_debates.id = decidim_followable_id\n AND resource_type = decidim_followable_type\n ), followings_blogs_posts AS (\n SELECT\n decidim_follows.*,\n decidim_blogs_posts.decidim_component_id,\n post_url AS followable_url,\n title AS followable_title\n FROM {{ ref(\"stg_decidim_follows\")}} AS decidim_follows\n JOIN {{ ref(\"blogs_posts\")}} decidim_blogs_posts\n ON decidim_blogs_posts.id = decidim_followable_id\n AND resource_type = decidim_followable_type\n ), followings_users AS (\n SELECT\n decidim_follows.*,\n -1 AS decidim_component_id,\n '' AS followable_url,\n '' AS followable_title\n FROM {{ ref(\"stg_decidim_follows\")}} AS decidim_follows\n JOIN {{ ref(\"int_users\")}} decidim_users\n ON decidim_users.id = decidim_followable_id\n where decidim_followable_type = 'Decidim::UserBaseEntity'\n ), followings_meetings AS (\n SELECT\n decidim_follows.*,\n decidim_component_id,\n meeting_url AS followable_url,\n title AS followable_title\n FROM {{ ref(\"stg_decidim_follows\")}} AS decidim_follows\n JOIN {{ ref(\"meetings\")}} decidim_meetings\n ON decidim_meetings.id = decidim_followable_id\n AND resource_type = decidim_followable_type\n ), followings_budgets_projects AS (\n SELECT\n decidim_follows.*,\n decidim_component_id,\n project_url AS followable_url,\n title AS followable_title\n FROM {{ ref(\"stg_decidim_follows\")}} AS decidim_follows\n join {{ ref(\"budgets_projects\")}} decidim_budgets_projects\n ON decidim_budgets_projects.id = decidim_followable_id\n AND resource_type = decidim_followable_type\n ), followings AS (\n SELECT * FROM followings_proposals union all\n SELECT * FROM followings_components union all\n SELECT * FROM followings_debates union all\n SELECT * FROM followings_blogs_posts union all\n SELECT * FROM followings_users union all\n SELECT * FROM followings_meetings union all\n SELECT * FROM followings_budgets_projects\n ), real_follow AS (\n SELECT\n followings.*,\n 'real_follow' AS \"following_way\",\n decidim_followable_id AS \"root_decidim_followable_id\",\n decidim_followable_type AS \"root_decidim_followable_type\",\n followable_url AS \"root_following_url\",\n followable_title AS \"root_followable_title\"\n FROM followings,\n lateral (SELECT (case array_length(array_remove(string_to_array(decidim_followable_type, ':', ''),null),1) when 2 then 'Ancestor' else 'Child' end) AS followable_meta_type) p_is_ps\n where followable_meta_type != 'Ancestor'\n ), ancestor_follow AS (\n SELECT\n distinct\n followings.*,\n 'ancestor_follow' AS \"following_way\",\n real_follow.decidim_followable_id AS \"root_decidim_followable_id\",\n real_follow.decidim_followable_type AS \"root_decidim_followable_type\",\n real_follow.followable_url AS \"root_following_url\",\n real_follow.followable_title AS \"root_followable_title\"\n FROM real_follow\n join {{ ref(\"components\")}} AS components ON components.id = real_follow.decidim_component_id\n join followings ON followings.decidim_followable_id = components.ps_id AND followings.decidim_followable_type = components.ps_type\n ), follows AS (\n SELECT * FROM real_follow union all\n SELECT * FROM ancestor_follow\n )\nSELECT id,\n decidim_component_id,\n decidim_user_id,\n root_decidim_followable_id,\n root_decidim_followable_type,\n root_followable_title,\n created_at,\n root_following_url,\n decidim_followable_id,\n decidim_followable_type,\n followable_url,\n following_way\nFROM follows", "language": "sql", "refs": [{"name": "stg_decidim_follows", "package": null, "version": null}, {"name": "proposals", "package": null, "version": null}, {"name": "stg_decidim_follows", "package": null, "version": null}, {"name": "components", "package": null, "version": null}, {"name": "stg_decidim_follows", "package": null, "version": null}, {"name": "debates", "package": null, "version": null}, {"name": "stg_decidim_follows", "package": null, "version": null}, {"name": "blogs_posts", "package": null, "version": null}, {"name": "stg_decidim_follows", "package": null, "version": null}, {"name": "int_users", "package": null, "version": null}, {"name": "stg_decidim_follows", "package": null, "version": null}, {"name": "meetings", "package": null, "version": null}, {"name": "stg_decidim_follows", "package": null, "version": null}, {"name": "budgets_projects", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_follows", "model.demo.proposals", "model.demo.components", "model.demo.debates", "model.demo.blogs_posts", "model.demo.int_users", "model.demo.meetings", "model.demo.budgets_projects"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.forms": {"database": "test_lyon", "schema": "prod", "name": "forms", "resource_type": "model", "package_name": "demo", "path": "marts/forms/forms.sql", "original_file_path": "models/marts/forms/forms.sql", "unique_id": "model.demo.forms", "fqn": ["demo", "marts", "forms", "forms"], "alias": "forms", "checksum": {"name": "sha256", "checksum": "6719434e32f89aa082de26a828fad3bc6349b23810b833e717a98325f89d1c0c"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"type": "btree", "columns": ["id"]}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"type": "btree", "columns": ["id"]}]}, "created_at": 1727441769.593865, "relation_name": "\"test_lyon\".\"prod\".\"forms\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n ]\n)}}\n\nWITH forms_meetings AS (\n SELECT decidim_forms_questionnaires.id AS questionnaire_id,\n decidim_forms_questionnaires.title,\n decidim_meetings_meetings.decidim_component_id\n FROM {{ ref(\"stg_decidim_forms_questionnaires\")}} decidim_forms_questionnaires\n JOIN {{ ref(\"stg_decidim_meetings\")}} decidim_meetings_meetings ON decidim_meetings_meetings.id = decidim_forms_questionnaires.questionnaire_for_id\n WHERE questionnaire_for_type = 'Decidim::Meetings::Meeting'\n), forms_surveys AS (\n SELECT decidim_forms_questionnaires.id AS questionnaire_id,\n decidim_forms_questionnaires.title,\n decidim_surveys_surveys.decidim_component_id\n FROM decidim_forms_questionnaires\n JOIN {{ ref(\"stg_decidim_surveys\")}} decidim_surveys_surveys ON decidim_surveys_surveys.id = questionnaire_for_id\n WHERE questionnaire_for_type = 'Decidim::Surveys::Survey'\n), forms AS (\n SELECT * FROM forms_meetings UNION ALL\n SELECT * FROM forms_surveys \n)\nSELECT\n forms.questionnaire_id AS id,\n title::jsonb->>'fr' AS title,\n decidim_components.id AS decidim_component_id,\n concat ('https://',organization_host, '/', ps_space_type_slug,'/', ps_slug, '/f/', decidim_component_id) AS \"questionnaire_url\"\nFROM forms\nJOIN {{ ref(\"components\")}} decidim_components ON decidim_components.id = forms.decidim_component_id", "language": "sql", "refs": [{"name": "stg_decidim_forms_questionnaires", "package": null, "version": null}, {"name": "stg_decidim_meetings", "package": null, "version": null}, {"name": "stg_decidim_surveys", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_forms_questionnaires", "model.demo.stg_decidim_meetings", "model.demo.stg_decidim_surveys", "model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.forms_answers": {"database": "test_lyon", "schema": "prod", "name": "forms_answers", "resource_type": "model", "package_name": "demo", "path": "marts/forms/forms_answers.sql", "original_file_path": "models/marts/forms/forms_answers.sql", "unique_id": "model.demo.forms_answers", "fqn": ["demo", "marts", "forms", "forms_answers"], "alias": "forms_answers", "checksum": {"name": "sha256", "checksum": "59df8d1b703c307d94beb38013950f0323576519f4dea59e8d9431119224fed0"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["decidim_user_id"], "type": "btree"}]}, "tags": [], "description": "Table gathering all types of answers (long, short, optional, sorting and matrix). ", "columns": {"sorting_points": {"name": "sorting_points", "description": "In order to evaluate the weight of the sorting answers, points are given to the answer according to its sorting position.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/forms/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["decidim_user_id"], "type": "btree"}]}, "created_at": 1727441769.81677, "relation_name": "\"test_lyon\".\"prod\".\"forms_answers\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_user_id'], 'type': 'btree'},\n ]\n)}}\n\nWITH answers_short_and_long_answer AS (\n SELECT * FROM {{ ref('answers_short_and_long_answer') }}\n), answers_option_and_sorting AS (\n SELECT * FROM {{ ref('answers_option_and_sorting') }}\n), answers_matrix AS (\n SELECT * FROM {{ ref('answers_matrix') }}\n), answers_file AS (\n SELECT * FROM {{ ref('answers_file') }}\n), answers AS (\n SELECT * FROM answers_short_and_long_answer\n UNION ALL\n SELECT * FROM answers_option_and_sorting\n UNION ALL\n SELECT * FROM answers_matrix\n UNION ALL\n SELECT * FROM answers_file\n)\n\nSELECT\n answers.decidim_user_id,\n answers.session_token,\n answers.ip_hash,\n answers.question_type,\n answers.body AS question_title,\n btrim(answers.answer, '\"') AS answer,\n answers.sub_matrix_question,\n answers.custom_body,\n answers.sorting_position,\n answers.decidim_questionnaire_id,\n decidim_forms_questionnaires.title AS form_title,\n decidim_forms_questionnaires.decidim_component_id,\n (CASE answers.sorting_position\n WHEN 0 THEN 10\n WHEN 1 THEN 9\n WHEN 2 THEN 8\n WHEN 3 THEN 7\n WHEN 4 THEN 6\n WHEN 5 THEN 5\n WHEN 6 THEN 4\n WHEN 7 THEN 3\n WHEN 8 THEN 2\n WHEN 9 THEN 1\n ELSE -1\n END) AS sorting_points,\n answers.position,\n answers.created_at,\n answers.author_status\nFROM answers\nJOIN {{ ref('forms') }} AS decidim_forms_questionnaires ON decidim_forms_questionnaires.id = answers.decidim_questionnaire_id\nORDER BY session_token, position", "language": "sql", "refs": [{"name": "answers_short_and_long_answer", "package": null, "version": null}, {"name": "answers_option_and_sorting", "package": null, "version": null}, {"name": "answers_matrix", "package": null, "version": null}, {"name": "answers_file", "package": null, "version": null}, {"name": "forms", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.answers_short_and_long_answer", "model.demo.answers_option_and_sorting", "model.demo.answers_matrix", "model.demo.answers_file", "model.demo.forms"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.blogs_posts": {"database": "test_lyon", "schema": "prod", "name": "blogs_posts", "resource_type": "model", "package_name": "demo", "path": "marts/blogs_posts/blogs_posts.sql", "original_file_path": "models/marts/blogs_posts/blogs_posts.sql", "unique_id": "model.demo.blogs_posts", "fqn": ["demo", "marts", "blogs_posts", "blogs_posts"], "alias": "blogs_posts", "checksum": {"name": "sha256", "checksum": "e5194c7f72ff483a0fa8a5c9e185580f607b35ee90cf1fd0ab99b36efb699681"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.596417, "relation_name": "\"test_lyon\".\"prod\".\"blogs_posts\"", "raw_code": "SELECT\n decidim_blogs_posts.id,\n decidim_blogs_posts.title,\n decidim_blogs_posts.body,\n decidim_blogs_posts.decidim_component_id,\n decidim_blogs_posts.created_at,\n decidim_blogs_posts.decidim_author_id,\n decidim_blogs_posts.resource_type,\n concat('https://', decidim_components.organization_host, '/', decidim_components.ps_space_type_slug, '/', decidim_components.ps_slug, '/f/', decidim_components.id, '/posts/', decidim_blogs_posts.id) AS post_url\nFROM {{ ref (\"stg_decidim_blogs_posts\")}} AS decidim_blogs_posts\nJOIN {{ ref (\"components\")}} AS decidim_components ON decidim_components.id = decidim_component_id", "language": "sql", "refs": [{"name": "stg_decidim_blogs_posts", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_blogs_posts", "model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.debates": {"database": "test_lyon", "schema": "prod", "name": "debates", "resource_type": "model", "package_name": "demo", "path": "marts/debates/debates.sql", "original_file_path": "models/marts/debates/debates.sql", "unique_id": "model.demo.debates", "fqn": ["demo", "marts", "debates", "debates"], "alias": "debates", "checksum": {"name": "sha256", "checksum": "7542d1f3f81682850fc1525d5cf6d64453d81fb8de59a12b53faea6bc025db62"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.597547, "relation_name": "\"test_lyon\".\"prod\".\"debates\"", "raw_code": "WITH categorizations AS (\n {{ categorizations_filter('Decidim::Debates::Debate') }}\n)\nSELECT\n decidim_debates_debates.id,\n decidim_debates_debates.title,\n decidim_debates_debates.description,\n decidim_debates_debates.start_time,\n decidim_debates_debates.end_time,\n decidim_debates_debates.decidim_component_id,\n decidim_debates_debates.decidim_author_id,\n decidim_debates_debates.created_at,\n decidim_debates_debates.closed_at,\n decidim_components.ps_slug,\n concat(\n 'https://',\n decidim_components.organization_host,\n '/',\n decidim_components.ps_space_type_slug,\n '/',\n decidim_components.ps_slug,\n '/f/',\n decidim_components.id,\n '/debates/',\n decidim_debates_debates.id\n ) AS debate_url,\n decidim_debates_debates.resource_type,\n categorizations.categories,\n coalesce(categorizations.categories[1], 'Sans cat\u00e9gorie') AS first_category,\n categorizations.sub_categories,\n coalesce(categorizations.sub_categories[1], 'Sans sous-cat\u00e9gorie') AS first_sub_category\nFROM {{ ref(\"stg_decidim_debates\")}} AS decidim_debates_debates\n JOIN {{ ref(\"components\")}} decidim_components on decidim_components.id = decidim_component_id\n LEFT JOIN categorizations on categorizations.categorizable_id = decidim_debates_debates.id", "language": "sql", "refs": [{"name": "categorizations", "package": null, "version": null}, {"name": "stg_decidim_debates", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.demo.categorizations_filter"], "nodes": ["model.demo.categorizations", "model.demo.stg_decidim_debates", "model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.components": {"database": "test_lyon", "schema": "prod", "name": "components", "resource_type": "model", "package_name": "demo", "path": "marts/components/components.sql", "original_file_path": "models/marts/components/components.sql", "unique_id": "model.demo.components", "fqn": ["demo", "marts", "components", "components"], "alias": "components", "checksum": {"name": "sha256", "checksum": "bb67bddf26ab7bbdfd5a55dae7843fdcad38758cb38831b5b3a53291822e5b1f"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}]}, "tags": [], "description": "Model representing the components associated with participatory spaces in Decidim.", "columns": {"id": {"name": "id", "description": "Unique identifier for the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "manifest_name": {"name": "manifest_name", "description": "Name of the component's manifest file. The manifest defines the component's configuration and metadata.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "translated_manifest_name": {"name": "translated_manifest_name", "description": "Translated name of the component's manifest.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "component_name": {"name": "component_name", "description": "Full name of the component, including its translated name.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "published_at": {"name": "published_at", "description": "Date when the component was published.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Date when the component was created.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "component_url": {"name": "component_url", "description": "URL for accessing the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_id": {"name": "ps_id", "description": "Identifier of the associated participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_published_at": {"name": "ps_published_at", "description": "Publication date of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_title": {"name": "ps_title", "description": "Title of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_subtitle": {"name": "ps_subtitle", "description": "Subtitle of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_slug": {"name": "ps_slug", "description": "Slug of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_type": {"name": "ps_type", "description": "Type of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_space_type_slug": {"name": "ps_space_type_slug", "description": "Slug for the type of participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_url": {"name": "ps_url", "description": "URL of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_organization_id": {"name": "decidim_organization_id", "description": "Identifier of the Decidim organization.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "organization_host": {"name": "organization_host", "description": "Host of the Decidim organization.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/components/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}]}, "created_at": 1727441769.8202848, "relation_name": "\"test_lyon\".\"prod\".\"components\"", "raw_code": "-- Warning: are not taken by default into account Conferences, Consultations, Elections, Initiatives, Votations\n\n{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n ]\n)}}\n\nWITH assemblies_spaces AS (\n SELECT\n id AS ps_id,\n published_at AS ps_published_at,\n title AS ps_title,\n subtitle AS ps_subtitle,\n slug AS ps_slug,\n decidim_organization_id,\n 'Decidim::Assembly' AS ps_type,\n 'assemblies' AS ps_space_type_slug\n FROM {{ ref (\"stg_decidim_assemblies\")}}\n),\nparticipatory_processes_spaces AS (\n SELECT\n id AS ps_id, \n published_at AS ps_published_at, \n title AS ps_title, \n subtitle AS ps_subtitle, \n slug AS ps_slug, \n decidim_organization_id, \n 'Decidim::ParticipatoryProcess' AS ps_type,\n 'processes' AS ps_space_type_slug\n FROM {{ ref (\"stg_decidim_participatory_processes\")}}\n), \nparticipatory_spaces AS (\n SELECT * FROM assemblies_spaces \n UNION ALL\n SELECT * FROM participatory_processes_spaces\n),\ncomponents AS (\n SELECT \n decidim_components.id,\n decidim_components.manifest_name,\n decidim_components.translated_manifest_name,\n concat(decidim_components.name, ' (', decidim_components.translated_manifest_name, ')') AS component_name,\n decidim_components.published_at,\n decidim_components.created_at,\n concat('https://',decidim_organizations.host,'/', participatory_spaces.ps_space_type_slug, '/', participatory_spaces.ps_slug,'/f/', decidim_components.id) AS component_url,\n participatory_spaces.ps_id, \n participatory_spaces.ps_published_at, \n participatory_spaces.ps_title, \n participatory_spaces.ps_subtitle, \n participatory_spaces.ps_slug, \n participatory_spaces.ps_type,\n participatory_spaces.ps_space_type_slug,\n concat('https://',decidim_organizations.host,'/', participatory_spaces.ps_space_type_slug, '/', participatory_spaces.ps_slug,'/') AS ps_url,\n decidim_organization_id, \n decidim_organizations.host AS organization_host\n FROM {{ ref (\"int_components\")}} AS decidim_components\n JOIN participatory_spaces ON participatory_spaces.ps_type = decidim_components.participatory_space_type AND decidim_components.participatory_space_id = participatory_spaces.ps_id \n JOIN {{ ref (\"int_organizations\")}} AS decidim_organizations ON decidim_organizations.id = participatory_spaces.decidim_organization_id\n WHERE participatory_spaces.ps_published_at IS NOT NULL\n)\nSELECT * FROM components", "language": "sql", "refs": [{"name": "stg_decidim_assemblies", "package": null, "version": null}, {"name": "stg_decidim_participatory_processes", "package": null, "version": null}, {"name": "int_components", "package": null, "version": null}, {"name": "int_organizations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_assemblies", "model.demo.stg_decidim_participatory_processes", "model.demo.int_components", "model.demo.int_organizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.categorizations": {"database": "test_lyon", "schema": "prod", "name": "categorizations", "resource_type": "model", "package_name": "demo", "path": "marts/categorizations/categorizations.sql", "original_file_path": "models/marts/categorizations/categorizations.sql", "unique_id": "model.demo.categorizations", "fqn": ["demo", "marts", "categorizations", "categorizations"], "alias": "categorizations", "checksum": {"name": "sha256", "checksum": "ced1275a578c4c2efb0122b46382132d550a2604a10306f2fa59c0191ad11d18"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.601779, "relation_name": "\"test_lyon\".\"prod\".\"categorizations\"", "raw_code": "WITH main_categories AS (\n SELECT\n decidim_categories.id AS id,\n decidim_categories.name AS category_name,\n 0 AS child_id,\n '' AS child_name,\n decidim_categorizations.categorizable_id,\n decidim_categorizations.categorizable_type\n FROM {{ ref (\"stg_decidim_categorizations\")}} AS decidim_categorizations\n JOIN {{ ref (\"stg_decidim_categories\")}} AS decidim_categories ON decidim_categories.id = decidim_categorizations.decidim_category_id\n WHERE decidim_categories.parent_id IS NULL\n), \nsub_categories AS ( \n SELECT\n parent_categories.id AS id,\n parent_categories.name AS category_name,\n decidim_categories.id AS child_id,\n decidim_categories.name AS child_name,\n decidim_categorizations.categorizable_id,\n decidim_categorizations.categorizable_type\n FROM {{ ref (\"stg_decidim_categorizations\")}} AS decidim_categorizations\n JOIN {{ ref (\"stg_decidim_categories\")}} AS decidim_categories ON decidim_categories.id = decidim_categorizations.decidim_category_id\n LEFT JOIN {{ ref (\"stg_decidim_categories\")}} AS parent_categories ON decidim_categories.parent_id = parent_categories.id\n WHERE decidim_categories.parent_id IS NOT NULL\n), \ncategories AS (\n SELECT * FROM main_categories \n UNION ALL\n SELECT * FROM sub_categories\n)\nSELECT * FROM categories", "language": "sql", "refs": [{"name": "stg_decidim_categorizations", "package": null, "version": null}, {"name": "stg_decidim_categories", "package": null, "version": null}, {"name": "stg_decidim_categorizations", "package": null, "version": null}, {"name": "stg_decidim_categories", "package": null, "version": null}, {"name": "stg_decidim_categories", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_categorizations", "model.demo.stg_decidim_categories"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.endorsements": {"database": "test_lyon", "schema": "prod", "name": "endorsements", "resource_type": "model", "package_name": "demo", "path": "marts/endorsements/endorsements.sql", "original_file_path": "models/marts/endorsements/endorsements.sql", "unique_id": "model.demo.endorsements", "fqn": ["demo", "marts", "endorsements", "endorsements"], "alias": "endorsements", "checksum": {"name": "sha256", "checksum": "269e0015542536377fb502c1eee1c1b71b8d585f7758d0d95c5d95ed1c5ab575"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["decidim_author_id"], "type": "btree"}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["decidim_author_id"], "type": "btree"}]}, "created_at": 1727441769.602952, "relation_name": "\"test_lyon\".\"prod\".\"endorsements\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_author_id'], 'type': 'btree'},\n ]\n)}}\n\nWITH endorsements_proposals AS (\n SELECT\n decidim_endorsements.*,\n decidim_component_id\n FROM {{ ref(\"stg_decidim_endorsements\")}} AS decidim_endorsements\n JOIN {{ ref(\"stg_decidim_proposals\")}} decidim_proposals_proposals on decidim_endorsements.resource_id = decidim_proposals_proposals.id\n and decidim_proposals_proposals.resource_type = decidim_endorsements.resource_type\n), endorsements_debates AS (\n SELECT\n decidim_endorsements.*,\n decidim_component_id\n FROM {{ ref(\"stg_decidim_endorsements\")}} AS decidim_endorsements\n JOIN {{ ref(\"stg_decidim_debates\")}} AS decidim_debates_debates on decidim_endorsements.resource_id = decidim_debates_debates.id\n and decidim_debates_debates.resource_type = decidim_endorsements.resource_type\n), endorsements_blogs_posts AS (\n SELECT\n decidim_endorsements.*,\n decidim_component_id\n FROM {{ ref(\"stg_decidim_endorsements\")}} AS decidim_endorsements\n JOIN {{ ref(\"stg_decidim_blogs_posts\")}} AS decidim_blogs_posts on decidim_endorsements.resource_id = decidim_blogs_posts.id\n and decidim_blogs_posts.resource_type = decidim_endorsements.resource_type\n), endorsements as (\n SELECT * FROM endorsements_proposals union all\n SELECT * FROM endorsements_debates union all\n SELECT * FROM endorsements_blogs_posts\n)\n\nSELECT\n endorsements.id,\n endorsements.resource_type,\n endorsements.resource_id,\n endorsements.decidim_author_type,\n endorsements.decidim_author_id,\n endorsements.created_at,\n endorsements.updated_at,\n endorsements.decidim_component_id\nFROM endorsements\nLEFT JOIN {{ ref(\"stg_decidim_moderations\")}} AS decidim_moderations\n ON decidim_moderations.decidim_reportable_type = endorsements.resource_type\n AND decidim_moderations.decidim_reportable_id = endorsements.resource_id\nWHERE decidim_moderations.hidden_at IS NULL", "language": "sql", "refs": [{"name": "stg_decidim_endorsements", "package": null, "version": null}, {"name": "stg_decidim_proposals", "package": null, "version": null}, {"name": "stg_decidim_endorsements", "package": null, "version": null}, {"name": "stg_decidim_debates", "package": null, "version": null}, {"name": "stg_decidim_endorsements", "package": null, "version": null}, {"name": "stg_decidim_blogs_posts", "package": null, "version": null}, {"name": "stg_decidim_moderations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_endorsements", "model.demo.stg_decidim_proposals", "model.demo.stg_decidim_debates", "model.demo.stg_decidim_blogs_posts", "model.demo.stg_decidim_moderations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.users": {"database": "test_lyon", "schema": "prod", "name": "users", "resource_type": "model", "package_name": "demo", "path": "marts/users/users.sql", "original_file_path": "models/marts/users/users.sql", "unique_id": "model.demo.users", "fqn": ["demo", "marts", "users", "users"], "alias": "users", "checksum": {"name": "sha256", "checksum": "64b40467d6c14d708c5428be0ac86ad87f32aa2a04021c09d7e4bf5fda90d0b2"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "All created users on your platform (includes admins, invited, managed, reported, blocked and deleted users)", "columns": {"id": {"name": "id", "description": "ID of the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "email": {"name": "email", "description": "Email of the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "sign_in_count": {"name": "sign_in_count", "description": "Number of times the user signed in on the platform", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "sign_in_frequency": {"name": "sign_in_frequency", "description": "Classification of sign-in counts in human-readable categories", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "last_sign_in_at": {"name": "last_sign_in_at", "description": "Last time the user signed in on the platform", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Date of creation", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Date of update", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "invitation_created_at": {"name": "invitation_created_at", "description": "Users can either register on the platform by themselves or by being invited. If empty, it means the user self-registered. Else it'll give the time the invitation of the user was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "invitation_sent_at": {"name": "invitation_sent_at", "description": "Users can either register on the platform by themselves or by being invited. If empty, it means the user self-registered. Else it'll give the time the invitation of the user was sent", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "invitation_accepted_at": {"name": "invitation_accepted_at", "description": "Users can either register on the platform by themselves or by being invited. If empty, it means the user self-registered. Else it'll give the time the invitation of the user was accepted", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "invited_by_id": {"name": "invited_by_id", "description": "ID of the user that invited that user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "invited_by_type": {"name": "invited_by_type", "description": "Users can either register on the platform by themselves or by being invited. If empty, it means the user self-registered. Else it'll give the type of the inviter (whether an organization, a single user etc.)", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_organization_id": {"name": "decidim_organization_id", "description": "ID of organization to which belong the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "confirmed_at": {"name": "confirmed_at", "description": "Date at which the user confirmed its account. Empty if the account was not confirmed", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "confirmation_token": {"name": "confirmation_token", "description": "Token of account confirmation", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "unconfirmed_email": {"name": "unconfirmed_email", "description": "Whether or not the user has confirmed its email.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "name": {"name": "name", "description": "Name of the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "locale": {"name": "locale", "description": "Language used by the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "deleted_at": {"name": "deleted_at", "description": "A user can choose to delete its account. If empty, it means the user still has an account. If not, it gives the time at which the user deleted it.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "admin": {"name": "admin", "description": "Whether or not the user is administrator of the platform", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "managed": {"name": "managed", "description": "A user can be managed. It means that someone else can participate in its name. This field indicate whether or not the user is managed", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "roles": {"name": "roles", "description": "A user can have different roles inside a Decidim platform. This field list all roles that the user have", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "nickname": {"name": "nickname", "description": "Nickname of the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "accepted_tos_version": {"name": "accepted_tos_version", "description": "When registering on the platform, a user must accept the Terms of Services. These terms can be versionized. This field give the version of the Terms of Services that was accepted", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "type": {"name": "type", "description": "Type of user can be a group, a single person, etc.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "following_count": {"name": "following_count", "description": "Number of resources followed by the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "followers_count": {"name": "followers_count", "description": "Number of people that follows the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "failed_attempts": {"name": "failed_attempts", "description": "Number of time the user failed to sign in", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "locked_at": {"name": "locked_at", "description": "Datetime at which the user was blocked", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "admin_terms_accepted_at": {"name": "admin_terms_accepted_at", "description": "If the user is an admin, gives the datetime at which he/she accepted the terms of use", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "blocked": {"name": "blocked", "description": "Whether or not the user was blocked", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "blocked_at": {"name": "blocked_at", "description": "Datetime at which the user was blocked. Empty if not blocked", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "confirmed": {"name": "confirmed", "description": "Whether or not the account of the registration of the user was confirmed", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "url": {"name": "url", "description": "URL of the user profile", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "extended_data": {"name": "extended_data", "description": "Decidim stores in this field all data related to the user that doesn't fit into a specific column. Used in multiple Decidim modules to describe the user more precisely. Informations regarding what happens on a page and its associated metrics like visits, time spent, exits, date, url, label.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "is_endorsing": {"name": "is_endorsing", "description": "Indicates if the user .....", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "is_following": {"name": "is_following", "description": "Indicates if the user .....", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "has_authored_comment": {"name": "has_authored_comment", "description": "Indicates if the user has authored a comment", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "has_voted": {"name": "has_voted", "description": "Indicates if the user has voted", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "has_authored_proposal": {"name": "has_authored_proposal", "description": "Indicates if the user has authored a proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "has_answered_survey": {"name": "has_answered_survey", "description": "Indicates if the user has answered a survey", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/users/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.837395, "relation_name": "\"test_lyon\".\"prod\".\"users\"", "raw_code": "WITH endorsements AS (\n SELECT\n decidim_author_id,\n MAX(1) AS is_endorsing\n FROM {{ ref(\"endorsements\") }}\n GROUP BY decidim_author_id\n),\n\ncomments AS (\n SELECT\n decidim_author_id,\n MAX(1) AS has_authored_comment\n FROM {{ ref(\"comments\") }}\n GROUP BY decidim_author_id\n),\n\nforms_answers AS (\n SELECT\n decidim_user_id,\n MAX(1) AS has_answered_survey\n FROM {{ ref(\"forms_answers\") }}\n GROUP BY decidim_user_id\n),\n\nproposal_votes AS (\n SELECT\n decidim_author_id,\n MAX(1) AS has_voted_on_proposal\n FROM {{ ref(\"proposals_votes\") }}\n GROUP BY decidim_author_id\n),\n\nproject_votes AS (\n SELECT\n decidim_user_id,\n MAX(1) AS has_voted_on_project\n FROM {{ ref(\"projects_votes\") }}\n GROUP BY decidim_user_id\n),\n\nparticipations_proposals AS (\n SELECT\n decidim_coauthorships.decidim_author_id,\n MAX(1) AS has_authored_proposal\n FROM {{ ref(\"proposals\") }} AS decidim_proposals_proposals\n JOIN {{ ref(\"stg_decidim_coauthorships\") }} AS decidim_coauthorships\n ON decidim_coauthorships.coauthorable_id = decidim_proposals_proposals.id\n WHERE coauthorable_type = 'Decidim::Proposals::Proposal'\n GROUP BY decidim_coauthorships.decidim_author_id\n),\n\nfollowings AS (\n SELECT DISTINCT decidim_user_id\n FROM {{ ref(\"followings\") }}\n)\n\nSELECT\n decidim_users.id,\n decidim_users.email,\n decidim_users.sign_in_count,\n decidim_users.sign_in_frequency,\n decidim_users.last_sign_in_at,\n decidim_users.created_at,\n decidim_users.updated_at,\n decidim_users.invitation_created_at,\n decidim_users.invitation_sent_at,\n decidim_users.invitation_accepted_at,\n decidim_users.invited_by_id,\n decidim_users.invited_by_type,\n decidim_users.decidim_organization_id,\n decidim_users.confirmed_at,\n decidim_users.confirmation_token,\n decidim_users.unconfirmed_email,\n decidim_users.name,\n decidim_users.locale,\n decidim_users.deleted_at,\n decidim_users.admin,\n decidim_users.managed,\n decidim_users.roles,\n decidim_users.nickname,\n decidim_users.accepted_tos_version,\n decidim_users.type,\n decidim_users.following_count,\n decidim_users.followers_count,\n decidim_users.failed_attempts,\n decidim_users.locked_at,\n decidim_users.admin_terms_accepted_at,\n decidim_users.blocked,\n decidim_users.blocked_at,\n COALESCE(endorsements.is_endorsing, 0)::boolean AS is_endorsing,\n (CASE WHEN followings.decidim_user_id IS NULL THEN false ELSE true END) AS is_following,\n COALESCE(comments.has_authored_comment, 0)::boolean AS has_authored_comment,\n COALESCE(proposal_votes.has_voted_on_proposal, 0)::boolean AS has_voted_on_proposal,\n COALESCE(project_votes.has_voted_on_project, 0)::boolean AS has_voted_on_project,\n COALESCE(participations_proposals.has_authored_proposal, 0)::boolean AS has_authored_proposal,\n COALESCE(forms_answers.has_answered_survey, 0)::boolean AS has_answered_survey,\n decidim_users.confirmed,\n CONCAT('https://', decidim_organizations.host, '/profiles/', decidim_users.nickname, '/activity') AS url,\n decidim_users.extended_data\nFROM {{ ref(\"int_users\") }} AS decidim_users\nLEFT JOIN followings ON followings.decidim_user_id = decidim_users.id\nLEFT JOIN endorsements ON endorsements.decidim_author_id = decidim_users.id\nLEFT JOIN comments ON comments.decidim_author_id = decidim_users.id\nLEFT JOIN forms_answers ON forms_answers.decidim_user_id = decidim_users.id\nLEFT JOIN proposal_votes ON proposal_votes.decidim_author_id = decidim_users.id\nLEFT JOIN project_votes ON project_votes.decidim_user_id = decidim_users.id\nLEFT JOIN participations_proposals ON participations_proposals.decidim_author_id = decidim_users.id\nJOIN {{ ref(\"int_organizations\") }} AS decidim_organizations\n ON decidim_organizations.id = decidim_users.decidim_organization_id", "language": "sql", "refs": [{"name": "endorsements", "package": null, "version": null}, {"name": "comments", "package": null, "version": null}, {"name": "forms_answers", "package": null, "version": null}, {"name": "proposals_votes", "package": null, "version": null}, {"name": "projects_votes", "package": null, "version": null}, {"name": "proposals", "package": null, "version": null}, {"name": "stg_decidim_coauthorships", "package": null, "version": null}, {"name": "followings", "package": null, "version": null}, {"name": "int_users", "package": null, "version": null}, {"name": "int_organizations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.endorsements", "model.demo.comments", "model.demo.forms_answers", "model.demo.proposals_votes", "model.demo.projects_votes", "model.demo.proposals", "model.demo.stg_decidim_coauthorships", "model.demo.followings", "model.demo.int_users", "model.demo.int_organizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.budgets": {"database": "test_lyon", "schema": "prod", "name": "budgets", "resource_type": "model", "package_name": "demo", "path": "marts/budgets/budgets.sql", "original_file_path": "models/marts/budgets/budgets.sql", "unique_id": "model.demo.budgets", "fqn": ["demo", "marts", "budgets", "budgets"], "alias": "budgets", "checksum": {"name": "sha256", "checksum": "0b413c401e389f7970fff98b95a83345d5ce8fbcd68783b96a6c1b3802eaca8c"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.6055381, "relation_name": "\"test_lyon\".\"prod\".\"budgets\"", "raw_code": "SELECT\n decidim_budgets_budgets.id,\n decidim_budgets_budgets.title,\n decidim_components.id AS decidim_component_id,\n decidim_components.ps_url AS url,\n decidim_components.ps_slug,\n decidim_components.ps_title\nFROM {{ ref (\"stg_decidim_budgets\")}} AS decidim_budgets_budgets\nJOIN {{ ref(\"components\")}} AS decidim_components on decidim_components.id = decidim_budgets_budgets.decidim_component_id", "language": "sql", "refs": [{"name": "stg_decidim_budgets", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_budgets", "model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.projects_votes": {"database": "test_lyon", "schema": "prod", "name": "projects_votes", "resource_type": "model", "package_name": "demo", "path": "marts/budgets/projects_votes.sql", "original_file_path": "models/marts/budgets/projects_votes.sql", "unique_id": "model.demo.projects_votes", "fqn": ["demo", "marts", "budgets", "projects_votes"], "alias": "projects_votes", "checksum": {"name": "sha256", "checksum": "4ac28e3d1f9ad333a96548c7173455a2eadc05f2d645c9e5021074e50973fc33"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["decidim_user_id"], "type": "btree"}]}, "tags": [], "description": "Splits budgets orders (i.e. votes) on a per-project basis", "columns": {"order_id": {"name": "order_id", "description": "ID of the budget order through which the vote has been issued", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/budgets/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["decidim_user_id"], "type": "btree"}]}, "created_at": 1727441769.842602, "relation_name": "\"test_lyon\".\"prod\".\"projects_votes\"", "raw_code": "-- /!\\ Warning : counts unfinished votes !\n-- /!\\ Warning : should be filtered on the corresponding budget to get the good values\n\n{{ config(\n indexes=[\n {'columns': ['decidim_user_id'], 'type': 'btree'},\n ]\n)}}\n\nWITH budgets_projects AS (\n SELECT\n decidim_budgets_line_items.decidim_order_id,\n decidim_budgets_projects.id AS \"project_id\",\n decidim_budgets_projects.title AS \"project_title\",\n decidim_budgets_projects.decidim_component_id,\n decidim_budgets_projects.project_url\n from {{ ref(\"stg_decidim_budgets_line_items\")}} AS decidim_budgets_line_items\n JOIN {{ ref(\"budgets_projects\")}} decidim_budgets_projects on decidim_budgets_projects.id = decidim_budgets_line_items.decidim_project_id\n)\n SELECT\n decidim_budgets_orders.id as order_id,\n decidim_budgets_orders.decidim_user_id,\n budgets_projects.project_id,\n budgets_projects.project_title,\n budgets_projects.decidim_component_id,\n decidim_budgets_orders.created_at,\n decidim_budgets_orders.checked_out_at,\n budgets_projects.project_url,\n decidim_budgets_orders.vote_finished,\n decidim_budgets_orders.decidim_budgets_budget_id\n from {{ ref(\"int_budgets_orders\")}} AS decidim_budgets_orders\n LEFT JOIN budgets_projects on decidim_order_id = decidim_budgets_orders.id", "language": "sql", "refs": [{"name": "stg_decidim_budgets_line_items", "package": null, "version": null}, {"name": "budgets_projects", "package": null, "version": null}, {"name": "int_budgets_orders", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_budgets_line_items", "model.demo.budgets_projects", "model.demo.int_budgets_orders"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.budgets_projects": {"database": "test_lyon", "schema": "prod", "name": "budgets_projects", "resource_type": "model", "package_name": "demo", "path": "marts/budgets/budgets_projects.sql", "original_file_path": "models/marts/budgets/budgets_projects.sql", "unique_id": "model.demo.budgets_projects", "fqn": ["demo", "marts", "budgets", "budgets_projects"], "alias": "budgets_projects", "checksum": {"name": "sha256", "checksum": "c7b4a0bec11b0ab5b0be3811ef287b4b609763be2ed58ac7bb6149e67b1f5d40"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.6078908, "relation_name": "\"test_lyon\".\"prod\".\"budgets_projects\"", "raw_code": "WITH categorizations AS (\n {{ categorizations_filter('Decidim::Budgets::Project') }}\n)\nSELECT\n decidim_budgets_projects.id, \n decidim_budgets_projects.title,\n decidim_budgets_projects.description,\n decidim_budgets_projects.created_at,\n decidim_budgets_projects.decidim_scope_id, \n decidim_budgets_projects.project_amount,\n decidim_budgets_projects.selected_at,\n decidim_budgets_projects.is_selected,\n decidim_budgets_budgets.id AS budget_id,\n decidim_budgets_budgets.title AS budget_title,\n decidim_budgets_projects.resource_type,\n decidim_budgets_budgets.decidim_component_id,\n concat(decidim_components.component_url,'/', decidim_components.manifest_name,'/', decidim_budgets_budgets.id, '/projects/', decidim_budgets_projects.id) AS project_url,\n categorizations.categories,\n coalesce(categorizations.categories[1], 'Sans cat\u00e9gorie') AS first_category,\n categorizations.sub_categories,\n coalesce(categorizations.sub_categories[1], 'Sans sous-cat\u00e9gorie') AS first_sub_category\nFROM {{ ref(\"int_budgets_projects\")}} AS decidim_budgets_projects\nJOIN {{ ref(\"stg_decidim_budgets\")}} AS decidim_budgets_budgets on decidim_budgets_budgets.id = decidim_budgets_projects.decidim_budgets_budget_id\nJOIN {{ ref(\"components\")}} as decidim_components on decidim_components.id = decidim_budgets_budgets.decidim_component_id\nLEFT JOIN categorizations on categorizations.categorizable_id = decidim_budgets_projects.id", "language": "sql", "refs": [{"name": "categorizations", "package": null, "version": null}, {"name": "int_budgets_projects", "package": null, "version": null}, {"name": "stg_decidim_budgets", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.demo.categorizations_filter"], "nodes": ["model.demo.categorizations", "model.demo.int_budgets_projects", "model.demo.stg_decidim_budgets", "model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.meetings": {"database": "test_lyon", "schema": "prod", "name": "meetings", "resource_type": "model", "package_name": "demo", "path": "marts/meetings/meetings.sql", "original_file_path": "models/marts/meetings/meetings.sql", "unique_id": "model.demo.meetings", "fqn": ["demo", "marts", "meetings", "meetings"], "alias": "meetings", "checksum": {"name": "sha256", "checksum": "efbcbe041d4488a47f867de0bbe43c4297d86e1b8ee0da21f9ee6c6898ea1f7b"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Every meeting published on the platform", "columns": {"id": {"name": "id", "description": "The unique identifier for a meeting", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/meetings/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.843044, "relation_name": "\"test_lyon\".\"prod\".\"meetings\"", "raw_code": "WITH categorizations AS (\n {{ categorizations_filter('Decidim::Meetings::Meeting') }}\n)\nSELECT\n decidim_meetings_meetings.id,\n decidim_meetings_meetings.title,\n decidim_meetings_meetings.description,\n decidim_meetings_meetings.address,\n decidim_meetings_meetings.attendees_count,\n decidim_meetings_meetings.created_at,\n decidim_meetings_meetings.decidim_scope_id,\n decidim_meetings_meetings.decidim_component_id,\n decidim_meetings_meetings.start_time,\n decidim_meetings_meetings.end_time,\n decidim_meetings_meetings.registration_url,\n decidim_meetings_meetings.type_of_meeting, \n decidim_meetings_meetings.translated_type_of_meeting,\n decidim_meetings_meetings.private_meeting,\n decidim_meetings_meetings.decidim_author_id,\n decidim_meetings_meetings.resource_type,\n concat(\n 'https://',\n decidim_components.organization_host,\n '/',\n decidim_components.ps_space_type_slug,\n '/',\n decidim_components.ps_slug,\n '/f/',\n decidim_meetings_meetings.decidim_component_id,\n '/meetings/',\n decidim_meetings_meetings.id\n ) AS meeting_url,\n categorizations.categories,\n coalesce(categorizations.categories[1], 'Sans cat\u00e9gorie') AS first_category,\n categorizations.sub_categories,\n coalesce(categorizations.sub_categories[1], 'Sans sous-cat\u00e9gorie') AS first_sub_category\nFROM {{ ref(\"int_meetings\")}} AS decidim_meetings_meetings\nJOIN {{ ref(\"components\")}} decidim_components on decidim_components.id = decidim_component_id\nLEFT JOIN categorizations on categorizations.categorizable_id = decidim_meetings_meetings.id\nwhere manifest_name like 'meetings'", "language": "sql", "refs": [{"name": "categorizations", "package": null, "version": null}, {"name": "int_meetings", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.demo.categorizations_filter"], "nodes": ["model.demo.categorizations", "model.demo.int_meetings", "model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.proposals_votes": {"database": "test_lyon", "schema": "prod", "name": "proposals_votes", "resource_type": "model", "package_name": "demo", "path": "marts/proposals/proposals_votes.sql", "original_file_path": "models/marts/proposals/proposals_votes.sql", "unique_id": "model.demo.proposals_votes", "fqn": ["demo", "marts", "proposals", "proposals_votes"], "alias": "proposals_votes", "checksum": {"name": "sha256", "checksum": "02f65fdd9ddb319ae31747796af6f0827b3094aaedf6c6223e68d4080499793b"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"type": "btree", "columns": ["decidim_author_id"]}]}, "tags": [], "description": "Every vote made on propositions", "columns": {"decidim_author_id": {"name": "decidim_author_id", "description": "id of the user who has voted", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_proposal_id": {"name": "decidim_proposal_id", "description": "id of the proposal for which has been voted for", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/proposals/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"type": "btree", "columns": ["decidim_author_id"]}]}, "created_at": 1727441769.8469949, "relation_name": "\"test_lyon\".\"prod\".\"proposals_votes\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_author_id'], 'type': 'btree'},\n ]\n)}}\n\nSELECT\n proposals_votes.id,\n proposals_votes.created_at,\n proposals_votes.decidim_author_id,\n proposals_votes.decidim_proposal_id,\n proposals.decidim_component_id,\n proposals.title AS proposal_title,\n proposals.url AS proposal_url\nFROM {{ ref(\"stg_decidim_proposals_votes\")}} AS proposals_votes\nJOIN {{ ref(\"proposals\")}} AS proposals on proposals_votes.decidim_proposal_id = proposals.id", "language": "sql", "refs": [{"name": "stg_decidim_proposals_votes", "package": null, "version": null}, {"name": "proposals", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_proposals_votes", "model.demo.proposals"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.proposals": {"database": "test_lyon", "schema": "prod", "name": "proposals", "resource_type": "model", "package_name": "demo", "path": "marts/proposals/proposals.sql", "original_file_path": "models/marts/proposals/proposals.sql", "unique_id": "model.demo.proposals", "fqn": ["demo", "marts", "proposals", "proposals"], "alias": "proposals", "checksum": {"name": "sha256", "checksum": "090e535cad1a4675179cdd488dc186ba314bb1a4e89cfe9466416161c32ac832"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}, {"columns": ["resource_type"], "type": "btree"}]}, "tags": [], "description": "Every proposal that has been created on your Decidim instance, including accepted, pending, rejected and withdrawn proposals. Does not include hidden (moderation) and unpublished proposals (i.e. linked to either an unpublished participatory process or an unpublished component).", "columns": {"id": {"name": "id", "description": "Unique identifier for the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_participatory_space_id": {"name": "decidim_participatory_space_id", "description": "Identifier for the participatory space where the proposal was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_participatory_space_slug": {"name": "decidim_participatory_space_slug", "description": "Slug for the participatory space where the proposal was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_scope_name": {"name": "decidim_scope_name", "description": "Name of the scope for the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "title": {"name": "title", "description": "Title of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "body": {"name": "body", "description": "Body text of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "resource_type": {"name": "resource_type", "description": "Type of the resource, typically 'Decidim::Proposals::Proposal'", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "url": {"name": "url", "description": "URL link to the proposal on the Decidim platform", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_component_id": {"name": "decidim_component_id", "description": "Identifier for the component within which the proposal was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the proposal was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "published_at": {"name": "published_at", "description": "Timestamp when the proposal was published", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "state": {"name": "state", "description": "Current state of the proposal (e.g., evaluating, rejected, accepted)", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "translated_state": {"name": "translated_state", "description": "Human-readable translated state of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "authors_ids": {"name": "authors_ids", "description": "Array of IDs of the authors of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "first_author_id": {"name": "first_author_id", "description": "ID of the first author of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "address": {"name": "address", "description": "Address related to the proposal, if any", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "categories": {"name": "categories", "description": "Array of categories associated with the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "first_category": {"name": "first_category", "description": "First category associated with the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "sub_categories": {"name": "sub_categories", "description": "Array of sub-categories associated with the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "first_sub_category": {"name": "first_sub_category", "description": "First sub-category associated with the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "comments_count": {"name": "comments_count", "description": "Number of comments on the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "endorsements_count": {"name": "endorsements_count", "description": "Number of endorsements on the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "votes_count": {"name": "votes_count", "description": "Number of votes the proposal has received", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/proposals/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}, {"columns": ["resource_type"], "type": "btree"}]}, "created_at": 1727441769.846499, "relation_name": "\"test_lyon\".\"prod\".\"proposals\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n {'columns': ['resource_type'], 'type': 'btree'}\n ]\n)}}\n\nWITH coauthorships AS (\n SELECT \n array_agg(decidim_users.id) AS authors_ids,\n decidim_coauthorships.coauthorable_id \n FROM {{ ref(\"int_users\")}} AS decidim_users \n JOIN {{ ref(\"stg_decidim_coauthorships\")}} AS decidim_coauthorships on decidim_users.id = decidim_coauthorships.decidim_author_id\n WHERE coauthorable_type = 'Decidim::Proposals::Proposal'\n GROUP BY coauthorable_id\n), \ncategorizations AS (\n {{ categorizations_filter('Decidim::Proposals::Proposal') }}\n),\nvotes AS (\n SELECT\n decidim_proposal_id,\n COUNT(id) AS votes_count\n FROM {{ ref(\"stg_decidim_proposals_votes\")}}\n GROUP BY decidim_proposal_id\n),\nproposals AS (\n SELECT\n decidim_proposals.id,\n decidim_components.ps_id AS decidim_participatory_space_id,\n decidim_components.ps_slug AS decidim_participatory_space_slug,\n decidim_scopes.name AS decidim_scope_name,\n decidim_proposals.title,\n decidim_proposals.body,\n decidim_proposals.resource_type,\n concat('https://', decidim_components.organization_host, '/', decidim_components.ps_space_type_slug, '/', decidim_components.ps_slug, '/f/', decidim_proposals.decidim_component_id, '/proposals/', decidim_proposals.id) AS url,\n decidim_proposals.decidim_component_id,\n decidim_proposals.created_at,\n decidim_proposals.published_at,\n decidim_proposals.state,\n decidim_proposals.translated_state,\n coauthorships.authors_ids,\n COALESCE(coauthorships.authors_ids[1], -1) AS first_author_id,\n decidim_proposals.address,\n categorizations.categories,\n COALESCE(categorizations.categories[1], 'Sans cat\u00e9gorie') AS first_category,\n categorizations.sub_categories,\n COALESCE(categorizations.sub_categories[1], 'Sans sous-cat\u00e9gorie') AS first_sub_category,\n decidim_proposals.comments_count,\n decidim_proposals.endorsements_count,\n COALESCE(votes.votes_count,0) AS votes_count\n FROM {{ ref(\"int_proposals\")}} AS decidim_proposals\n JOIN {{ ref(\"components\")}} AS decidim_components ON decidim_components.id = decidim_component_id\n LEFT JOIN coauthorships ON decidim_proposals.id = coauthorships.coauthorable_id\n LEFT JOIN {{ ref(\"stg_decidim_moderations\")}} AS decidim_moderations\n ON decidim_moderations.decidim_reportable_id = decidim_proposals.id\n AND decidim_moderations.decidim_reportable_type = 'Decidim::Proposals::Proposal'\n LEFT JOIN {{ ref(\"int_scopes\")}} AS decidim_scopes ON decidim_scopes.id = decidim_proposals.decidim_scope_id\n LEFT JOIN votes ON decidim_proposals.id = votes.decidim_proposal_id\n LEFT JOIN categorizations ON categorizations.categorizable_id = decidim_proposals.id\n WHERE decidim_moderations.hidden_at IS NULL\n AND decidim_proposals.published_at IS NOT NULL\n AND (decidim_proposals.state NOT LIKE '%withdrawn' OR decidim_proposals.state IS NULL)\n)\n\nSELECT * FROM proposals", "language": "sql", "refs": [{"name": "int_users", "package": null, "version": null}, {"name": "stg_decidim_coauthorships", "package": null, "version": null}, {"name": "categorizations", "package": null, "version": null}, {"name": "stg_decidim_proposals_votes", "package": null, "version": null}, {"name": "int_proposals", "package": null, "version": null}, {"name": "components", "package": null, "version": null}, {"name": "stg_decidim_moderations", "package": null, "version": null}, {"name": "int_scopes", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.demo.categorizations_filter"], "nodes": ["model.demo.int_users", "model.demo.stg_decidim_coauthorships", "model.demo.categorizations", "model.demo.stg_decidim_proposals_votes", "model.demo.int_proposals", "model.demo.components", "model.demo.stg_decidim_moderations", "model.demo.int_scopes"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_organizations": {"database": "test_lyon", "schema": "prod", "name": "int_organizations", "resource_type": "model", "package_name": "demo", "path": "intermediate/organizations/int_organizations.sql", "original_file_path": "models/intermediate/organizations/int_organizations.sql", "unique_id": "model.demo.int_organizations", "fqn": ["demo", "intermediate", "organizations", "int_organizations"], "alias": "int_organizations", "checksum": {"name": "sha256", "checksum": "427ba5c6ba0c669374062a3bad93f93f09d2b2c9e911cb3df108ea01a13d4be0"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}]}, "tags": [], "description": "A staging model for Decidim organizations", "columns": {"id": {"name": "id", "description": "Unique identifier for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "name": {"name": "name", "description": "Name of the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "host": {"name": "host", "description": "Host URL for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "default_locale": {"name": "default_locale", "description": "Default locale for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "available_locales": {"name": "available_locales", "description": "List of available locales for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the organization was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "description": {"name": "description", "description": "Description of the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "secondary_hosts": {"name": "secondary_hosts", "description": "Secondary hosts for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "available_authorizations": {"name": "available_authorizations", "description": "List of available authorizations for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "header_snippets": {"name": "header_snippets", "description": "Header snippets for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "tos_version": {"name": "tos_version", "description": "Version of the terms of service", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "badges_enabled": {"name": "badges_enabled", "description": "Indicates if badges are enabled. Badges in Decidim recognize participant actions and progress, enhancing engagement through gamification.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "send_welcome_notification": {"name": "send_welcome_notification", "description": "Flag indicating if welcome notifications are sent", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "users_registration_mode": {"name": "users_registration_mode", "description": "Mode of user registration", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "time_zone": {"name": "time_zone", "description": "Time zone of the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/intermediate/organizations/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}]}, "created_at": 1727441769.8527172, "relation_name": "\"test_lyon\".\"prod\".\"int_organizations\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n ]\n)}}\n\n\nWITH source AS (\n SELECT * FROM {{ ref (\"stg_decidim_organizations\")}}\n),\nrenamed AS (\n SELECT\n id,\n name,\n host,\n default_locale,\n available_locales,\n created_at,\n regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description,\n secondary_hosts,\n available_authorizations,\n header_snippets,\n tos_version,\n badges_enabled,\n send_welcome_notification,\n users_registration_mode,\n time_zone\n FROM source\n WHERE host = '{{ env_var('PARTICIPATION_HOST_NAME') }}'\n -- Assumption: There is only one organization, so we select the first available host\n LIMIT 1\n)\nSELECT * FROM renamed", "language": "sql", "refs": [{"name": "stg_decidim_organizations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_organizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.answers_file": {"database": "test_lyon", "schema": "prod", "name": "answers_file", "resource_type": "model", "package_name": "demo", "path": "intermediate/forms/answers_file.sql", "original_file_path": "models/intermediate/forms/answers_file.sql", "unique_id": "model.demo.answers_file", "fqn": ["demo", "intermediate", "forms", "answers_file"], "alias": "answers_file", "checksum": {"name": "sha256", "checksum": "0546b730d1ed65433b1cdaab4a32e5d837cb0587ae8bde6b4f32fb4a16c24c54"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"type": "btree", "columns": ["decidim_questionnaire_id"]}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"type": "btree", "columns": ["decidim_questionnaire_id"]}]}, "created_at": 1727441769.623206, "relation_name": "\"test_lyon\".\"prod\".\"answers_file\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_questionnaire_id'], 'type': 'btree'},\n ]\n)}}\n\nWITH org AS (\n -- Assumption: There is only one organization, so we select the first available host\n SELECT host\n FROM {{ ref('organizations') }}\n LIMIT 1\n)\nSELECT DISTINCT\n decidim_forms_answers.decidim_user_id,\n decidim_forms_answers.session_token,\n decidim_forms_answers.ip_hash,\n decidim_forms_questions.question_type,\n decidim_forms_questions.position AS \"position\",\n decidim_attachments.file AS \"answer\",\n '' AS \"sub_matrix_question\",\n CONCAT('https://', org.host, '/uploads/decidim/attachment/file/', decidim_attachments.id, '/', decidim_attachments.file) AS custom_body,\n -1 AS sorting_position,\n decidim_forms_questions.decidim_questionnaire_id,\n decidim_forms_questions.body,\n decidim_forms_answers.created_at,\n decidim_forms_answers.author_status\nFROM {{ ref('int_forms_answers') }} decidim_forms_answers\nJOIN {{ ref('stg_decidim_forms_questions') }} AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id\nJOIN {{ ref('stg_decidim_attachments') }} decidim_attachments ON decidim_attachments.attached_to_id = decidim_forms_answers.id\nCROSS JOIN org\nWHERE attached_to_type = 'Decidim::Forms::Answer'", "language": "sql", "refs": [{"name": "organizations", "package": null, "version": null}, {"name": "int_forms_answers", "package": null, "version": null}, {"name": "stg_decidim_forms_questions", "package": null, "version": null}, {"name": "stg_decidim_attachments", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.organizations", "model.demo.int_forms_answers", "model.demo.stg_decidim_forms_questions", "model.demo.stg_decidim_attachments"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.answers_option_and_sorting": {"database": "test_lyon", "schema": "prod", "name": "answers_option_and_sorting", "resource_type": "model", "package_name": "demo", "path": "intermediate/forms/answers_option_and_sorting.sql", "original_file_path": "models/intermediate/forms/answers_option_and_sorting.sql", "unique_id": "model.demo.answers_option_and_sorting", "fqn": ["demo", "intermediate", "forms", "answers_option_and_sorting"], "alias": "answers_option_and_sorting", "checksum": {"name": "sha256", "checksum": "a6c8be435c9adf60421f3d7b63da0338432abac9a04e4a3e4f0751e748e880a0"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["decidim_questionnaire_id"], "type": "btree"}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["decidim_questionnaire_id"], "type": "btree"}]}, "created_at": 1727441769.624459, "relation_name": "\"test_lyon\".\"prod\".\"answers_option_and_sorting\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_questionnaire_id'], 'type': 'btree'},\n ]\n)}}\n\nSELECT DISTINCT\n decidim_forms_answers.decidim_user_id,\n decidim_forms_answers.session_token,\n decidim_forms_answers.ip_hash,\n decidim_forms_questions.question_type,\n decidim_forms_questions.position AS question_position,\n decidim_forms_answer_choices.body::text AS \"answer\",\n '' AS sub_matrix_question,\n COALESCE(decidim_forms_answer_choices.custom_body, '') AS custom_body,\n (CASE question_type WHEN 'sorting' THEN decidim_forms_answer_choices.position ELSE -1 END) AS sorting_position,\n decidim_forms_questions.decidim_questionnaire_id,\n decidim_forms_questions.body,\n decidim_forms_answers.created_at,\n decidim_forms_answers.author_status\nFROM {{ ref('int_forms_answers') }} decidim_forms_answers\nJOIN {{ ref('stg_decidim_forms_questions') }} AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id\nJOIN {{ ref('stg_decidim_forms_answer_choices') }} decidim_forms_answer_choices ON decidim_forms_answer_choices.decidim_answer_id = decidim_forms_answers.id\nWHERE question_type = ANY('{single_option, multiple_option, sorting}'::text[])", "language": "sql", "refs": [{"name": "int_forms_answers", "package": null, "version": null}, {"name": "stg_decidim_forms_questions", "package": null, "version": null}, {"name": "stg_decidim_forms_answer_choices", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.int_forms_answers", "model.demo.stg_decidim_forms_questions", "model.demo.stg_decidim_forms_answer_choices"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.answers_matrix": {"database": "test_lyon", "schema": "prod", "name": "answers_matrix", "resource_type": "model", "package_name": "demo", "path": "intermediate/forms/answers_matrix.sql", "original_file_path": "models/intermediate/forms/answers_matrix.sql", "unique_id": "model.demo.answers_matrix", "fqn": ["demo", "intermediate", "forms", "answers_matrix"], "alias": "answers_matrix", "checksum": {"name": "sha256", "checksum": "e0edf6477ef36c34189c0498ead937aed57124c071d2f1ab6f5e0c65f50deb42"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"type": "btree", "columns": ["decidim_questionnaire_id"]}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"type": "btree", "columns": ["decidim_questionnaire_id"]}]}, "created_at": 1727441769.62566, "relation_name": "\"test_lyon\".\"prod\".\"answers_matrix\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_questionnaire_id'], 'type': 'btree'},\n ]\n)}}\n\nSELECT DISTINCT\n decidim_forms_answers.decidim_user_id,\n decidim_forms_answers.session_token,\n decidim_forms_answers.ip_hash,\n decidim_forms_questions.question_type,\n decidim_forms_questions.position AS \"position\",\n decidim_forms_answer_choices.body::text AS \"answer\",\n decidim_forms_question_matrix_rows.body AS sub_matrix_question,\n '' AS custom_body,\n -1 AS sorting_position,\n decidim_forms_questions.decidim_questionnaire_id,\n decidim_forms_questions.body,\n decidim_forms_answers.created_at,\n decidim_forms_answers.author_status\nFROM {{ ref('int_forms_answers') }} decidim_forms_answers\nJOIN {{ ref('stg_decidim_forms_questions') }} AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id\nJOIN {{ ref('stg_decidim_forms_answer_choices') }} decidim_forms_answer_choices ON decidim_forms_answer_choices.decidim_answer_id = decidim_forms_answers.id\nJOIN {{ ref('stg_decidim_forms_question_matrix_rows') }} decidim_forms_question_matrix_rows ON decidim_forms_question_matrix_rows.id = decidim_forms_answer_choices.decidim_question_matrix_row_id\nWHERE question_type = ANY('{matrix_single, matrix_multiple}'::text[])", "language": "sql", "refs": [{"name": "int_forms_answers", "package": null, "version": null}, {"name": "stg_decidim_forms_questions", "package": null, "version": null}, {"name": "stg_decidim_forms_answer_choices", "package": null, "version": null}, {"name": "stg_decidim_forms_question_matrix_rows", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.int_forms_answers", "model.demo.stg_decidim_forms_questions", "model.demo.stg_decidim_forms_answer_choices", "model.demo.stg_decidim_forms_question_matrix_rows"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.answers_short_and_long_answer": {"database": "test_lyon", "schema": "prod", "name": "answers_short_and_long_answer", "resource_type": "model", "package_name": "demo", "path": "intermediate/forms/answers_short_and_long_answer.sql", "original_file_path": "models/intermediate/forms/answers_short_and_long_answer.sql", "unique_id": "model.demo.answers_short_and_long_answer", "fqn": ["demo", "intermediate", "forms", "answers_short_and_long_answer"], "alias": "answers_short_and_long_answer", "checksum": {"name": "sha256", "checksum": "4243913982485ea514a9fde9fa70cdeccd9f17ad77050b2fc65146042950333a"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["decidim_questionnaire_id"], "type": "btree"}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["decidim_questionnaire_id"], "type": "btree"}]}, "created_at": 1727441769.626914, "relation_name": "\"test_lyon\".\"prod\".\"answers_short_and_long_answer\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_questionnaire_id'], 'type': 'btree'},\n ]\n)}}\n\nSELECT\n decidim_user_id,\n session_token,\n ip_hash,\n question_type,\n position,\n COALESCE(NULLIF(decidim_forms_answers.body,''), 'Pas de r\u00e9ponse') AS \"answer\",\n '' AS sub_matrix_question,\n '' AS custom_body,\n -1 AS sorting_position,\n decidim_forms_questions.decidim_questionnaire_id,\n decidim_forms_questions.body,\n decidim_forms_answers.created_at,\n decidim_forms_answers.author_status\nFROM {{ ref('int_forms_answers') }} decidim_forms_answers\nJOIN {{ ref('stg_decidim_forms_questions') }} AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id\nWHERE question_type = ANY('{short_answer,long_answer}'::text[])", "language": "sql", "refs": [{"name": "int_forms_answers", "package": null, "version": null}, {"name": "stg_decidim_forms_questions", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.int_forms_answers", "model.demo.stg_decidim_forms_questions"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_forms_answers": {"database": "test_lyon", "schema": "prod", "name": "int_forms_answers", "resource_type": "model", "package_name": "demo", "path": "intermediate/forms/int_forms_answers.sql", "original_file_path": "models/intermediate/forms/int_forms_answers.sql", "unique_id": "model.demo.int_forms_answers", "fqn": ["demo", "intermediate", "forms", "int_forms_answers"], "alias": "int_forms_answers", "checksum": {"name": "sha256", "checksum": "f3bb33340aa78ba8eaf0355577fd471b6ab835dc8aab0831ccd5f74fb70fc975"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}, {"type": "btree", "columns": ["decidim_question_id"]}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}, {"type": "btree", "columns": ["decidim_question_id"]}]}, "created_at": 1727441769.62815, "relation_name": "\"test_lyon\".\"prod\".\"int_forms_answers\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n {'columns': ['decidim_question_id'], 'type': 'btree'},\n ]\n)}}\n\nSELECT\n id,\n body,\n decidim_user_id,\n decidim_questionnaire_id,\n decidim_question_id,\n created_at,\n (CASE\n WHEN decidim_user_id IS NULL THEN 'Non connect\u00e9'\n ELSE 'Inscrit et connect\u00e9'\n END\n ) AS author_status,\n updated_at,\n session_token,\n ip_hash\nFROM {{ ref(\"stg_decidim_forms_answers\")}}", "language": "sql", "refs": [{"name": "stg_decidim_forms_answers", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_forms_answers"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_components": {"database": "test_lyon", "schema": "prod", "name": "int_components", "resource_type": "model", "package_name": "demo", "path": "intermediate/components/int_components.sql", "original_file_path": "models/intermediate/components/int_components.sql", "unique_id": "model.demo.int_components", "fqn": ["demo", "intermediate", "components", "int_components"], "alias": "int_components", "checksum": {"name": "sha256", "checksum": "33411b41c132dac10318196d6fa8e3ecce4fd974587aaa5f74347e03fbc8829f"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "An intermediate model representing the components associated with participatory spaces in Decidim.", "columns": {"id": {"name": "id", "description": "The ID of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "manifest_name": {"name": "manifest_name", "description": "The original manifest name of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "translated_manifest_name": {"name": "translated_manifest_name", "description": "The translated manifest name based on predefined mappings for Metabase usage ", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "name": {"name": "name", "description": "The name of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "participatory_space_id": {"name": "participatory_space_id", "description": "The ID of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "participatory_space_type": {"name": "participatory_space_type", "description": "The type of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "settings": {"name": "settings", "description": "The settings of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "weight": {"name": "weight", "description": "The weight of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "permissions": {"name": "permissions", "description": "The permissions of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "published_at": {"name": "published_at", "description": "The publish date of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "The creation date of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "The last update date of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/intermediate/components/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.8612149, "relation_name": "\"test_lyon\".\"prod\".\"int_components\"", "raw_code": "SELECT\n decidim_components.id,\n decidim_components.manifest_name,\n -- For Metabase usage, we translate the name in French\n (CASE decidim_components.manifest_name\n WHEN 'accountability' THEN 'Suivi'\n WHEN 'pages' THEN 'Page'\n WHEN 'budgets' THEN 'Budgets'\n WHEN 'meetings' THEN 'Rencontres'\n WHEN 'proposals' THEN 'Propositions'\n WHEN 'surveys' THEN 'Enqu\u00eates'\n WHEN 'blogs' THEN 'Blogs'\n ELSE decidim_components.manifest_name\n END\n ) AS translated_manifest_name,\n decidim_components.name,\n decidim_components.participatory_space_id,\n decidim_components.participatory_space_type,\n decidim_components.settings,\n decidim_components.weight,\n decidim_components.permissions,\n decidim_components.published_at,\n decidim_components.created_at,\n decidim_components.updated_at\n FROM {{ ref (\"stg_decidim_components\")}} as decidim_components", "language": "sql", "refs": [{"name": "stg_decidim_components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_users": {"database": "test_lyon", "schema": "prod", "name": "int_users", "resource_type": "model", "package_name": "demo", "path": "intermediate/users/int_users.sql", "original_file_path": "models/intermediate/users/int_users.sql", "unique_id": "model.demo.int_users", "fqn": ["demo", "intermediate", "users", "int_users"], "alias": "int_users", "checksum": {"name": "sha256", "checksum": "bb725e225fa3e67f74f6e98804916fe5d20c30416b506833ceb1f771fe74b5f7"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}]}, "tags": [], "description": "", "columns": {"id": {"name": "id", "description": "The unique identifier for a user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "email": {"name": "email", "description": "The user's email address", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "nickname": {"name": "nickname", "description": "The user's nickname", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/intermediate/users/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}]}, "created_at": 1727441769.86358, "relation_name": "\"test_lyon\".\"prod\".\"int_users\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n ]\n)}}\n\nSELECT\n decidim_users.id,\n decidim_users.email,\n decidim_users.sign_in_count,\n (CASE\n WHEN decidim_users.sign_in_count = 0 THEN 'Jamais'\n WHEN decidim_users.sign_in_count = 1 THEN 'Une seule fois'\n WHEN decidim_users.sign_in_count = 2 THEN 'Deux fois'\n WHEN decidim_users.sign_in_count BETWEEN 2 AND 10 THEN 'Entre 2 et 10 fois'\n ELSE 'Plus de 10 fois'\n END\n ) AS sign_in_frequency,\n decidim_users.last_sign_in_at,\n decidim_users.created_at,\n decidim_users.updated_at,\n decidim_users.invitation_created_at,\n decidim_users.invitation_sent_at,\n decidim_users.invitation_accepted_at,\n decidim_users.invited_by_id,\n decidim_users.invited_by_type,\n decidim_users.decidim_organization_id,\n decidim_users.confirmed_at,\n decidim_users.confirmation_token,\n decidim_users.unconfirmed_email,\n decidim_users.name,\n decidim_users.locale,\n decidim_users.deleted_at,\n decidim_users.admin,\n decidim_users.managed,\n decidim_users.roles,\n decidim_users.nickname,\n decidim_users.accepted_tos_version,\n decidim_users.type,\n decidim_users.following_count,\n decidim_users.followers_count,\n decidim_users.failed_attempts,\n decidim_users.locked_at,\n decidim_users.admin_terms_accepted_at,\n decidim_users.blocked,\n decidim_users.blocked_at,\n (CASE WHEN decidim_users.confirmed_at IS NULL THEN false ELSE true END) AS confirmed,\n decidim_users.extended_data\nFROM {{ ref (\"stg_decidim_users\")}} as decidim_users\n WHERE deleted_at IS NULL\n AND type LIKE 'Decidim::User'", "language": "sql", "refs": [{"name": "stg_decidim_users", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_budgets_projects": {"database": "test_lyon", "schema": "prod", "name": "int_budgets_projects", "resource_type": "model", "package_name": "demo", "path": "intermediate/budgets/int_budgets_projects.sql", "original_file_path": "models/intermediate/budgets/int_budgets_projects.sql", "unique_id": "model.demo.int_budgets_projects", "fqn": ["demo", "intermediate", "budgets", "int_budgets_projects"], "alias": "int_budgets_projects", "checksum": {"name": "sha256", "checksum": "6a6b85bc8272a54383966503a6ac5050d3b4be3e20c41fa303a47769ba3f0a77"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.631509, "relation_name": "\"test_lyon\".\"prod\".\"int_budgets_projects\"", "raw_code": "SELECT\n id, \n title,\n description,\n created_at,\n decidim_scope_id, \n project_amount,\n selected_at,\n decidim_budgets_budget_id,\n resource_type,\n (CASE\n WHEN selected_at IS NULL\n THEN false\n ELSE true\n END) AS is_selected\nFROM {{ ref(\"stg_decidim_budgets_projects\")}}", "language": "sql", "refs": [{"name": "stg_decidim_budgets_projects", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_budgets_projects"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_budgets_orders": {"database": "test_lyon", "schema": "prod", "name": "int_budgets_orders", "resource_type": "model", "package_name": "demo", "path": "intermediate/budgets/int_budgets_orders.sql", "original_file_path": "models/intermediate/budgets/int_budgets_orders.sql", "unique_id": "model.demo.int_budgets_orders", "fqn": ["demo", "intermediate", "budgets", "int_budgets_orders"], "alias": "int_budgets_orders", "checksum": {"name": "sha256", "checksum": "c5e8547892ae21bf292f3901f4c325d3612f5574b76934c832086cf44d077b76"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.6325629, "relation_name": "\"test_lyon\".\"prod\".\"int_budgets_orders\"", "raw_code": "SELECT\n id,\n decidim_user_id,\n checked_out_at,\n created_at,\n updated_at,\n decidim_budgets_budget_id,\n (CASE\n WHEN checked_out_at IS NULL\n THEN false\n ELSE true\n END) AS vote_finished\nFROM {{ ref(\"stg_decidim_budgets_orders\")}}", "language": "sql", "refs": [{"name": "stg_decidim_budgets_orders", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_budgets_orders"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_meetings": {"database": "test_lyon", "schema": "prod", "name": "int_meetings", "resource_type": "model", "package_name": "demo", "path": "intermediate/meetings/int_meetings.sql", "original_file_path": "models/intermediate/meetings/int_meetings.sql", "unique_id": "model.demo.int_meetings", "fqn": ["demo", "intermediate", "meetings", "int_meetings"], "alias": "int_meetings", "checksum": {"name": "sha256", "checksum": "3ae6f139762d8f65078a697317a1e2e49502ab89cf3d56eb058b28d6d7ef0575"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.633665, "relation_name": "\"test_lyon\".\"prod\".\"int_meetings\"", "raw_code": "SELECT\n decidim_meetings.id,\n decidim_meetings.title,\n decidim_meetings.description,\n decidim_meetings.address,\n decidim_meetings.attendees_count,\n decidim_meetings.created_at,\n decidim_meetings.decidim_scope_id,\n decidim_meetings.decidim_component_id,\n decidim_meetings.start_time,\n decidim_meetings.end_time,\n decidim_meetings.registration_url,\n decidim_meetings.type_of_meeting, \n (CASE decidim_meetings.type_of_meeting\n WHEN 'online' THEN 'En ligne'\n WHEN 'in_person' THEN 'En pr\u00e9sentiel'\n WHEN 'hybrid' THEN 'Hybride'\n ELSE decidim_meetings.type_of_meeting\n END\n ) AS translated_type_of_meeting,\n decidim_meetings.private_meeting,\n decidim_meetings.decidim_author_id,\n decidim_meetings.resource_type\n FROM {{ ref (\"stg_decidim_meetings\")}} as decidim_meetings", "language": "sql", "refs": [{"name": "stg_decidim_meetings", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_meetings"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_scopes": {"database": "test_lyon", "schema": "prod", "name": "int_scopes", "resource_type": "model", "package_name": "demo", "path": "intermediate/scopes/int_scopes.sql", "original_file_path": "models/intermediate/scopes/int_scopes.sql", "unique_id": "model.demo.int_scopes", "fqn": ["demo", "intermediate", "scopes", "int_scopes"], "alias": "int_scopes", "checksum": {"name": "sha256", "checksum": "7c5488af2c9da4834ad42b60ed68513bd62b3d77121bd1345bc2edf5a77d7a67"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Intermediate model for Decidim scopes, excluding the 'part_of' column due to ARRAY bug in tests.", "columns": {"id": {"name": "id", "description": "Unique identifier for the scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_organization_id": {"name": "decidim_organization_id", "description": "Identifier for the Decidim organization to which the scope belongs.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the scope was created.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Timestamp when the scope was last updated.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "name": {"name": "name", "description": "Name of the scope in French, with a default value 'Sans secteur' if the name is empty.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "scope_type_id": {"name": "scope_type_id", "description": "Identifier for the type of scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "parent_id": {"name": "parent_id", "description": "Identifier for the parent scope, if applicable.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "code": {"name": "code", "description": "Code associated with the scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/intermediate/scopes/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.8699672, "relation_name": "\"test_lyon\".\"prod\".\"int_scopes\"", "raw_code": "-- Due to ARRAY bug in test, we create an intermediate scopes without the column part_of\n\nSELECT\n decidim_scopes.id,\n decidim_scopes.decidim_organization_id,\n decidim_scopes.created_at,\n decidim_scopes.updated_at,\n coalesce(nullif(decidim_scopes.name, ''), 'Sans secteur') as name,\n decidim_scopes.scope_type_id,\n decidim_scopes.parent_id,\n decidim_scopes.code\nFROM {{ ref (\"stg_decidim_scopes\") }} as decidim_scopes", "language": "sql", "refs": [{"name": "stg_decidim_scopes", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_scopes"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_proposals": {"database": "test_lyon", "schema": "prod", "name": "int_proposals", "resource_type": "model", "package_name": "demo", "path": "intermediate/proposals/int_proposals.sql", "original_file_path": "models/intermediate/proposals/int_proposals.sql", "unique_id": "model.demo.int_proposals", "fqn": ["demo", "intermediate", "proposals", "int_proposals"], "alias": "int_proposals", "checksum": {"name": "sha256", "checksum": "e20700e4bfae96e8013077d5be8976060be0b337d3c652e9c49210c1b44b3b91"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}]}, "tags": [], "description": "Intermediate model for Decidim proposals, containing basic proposal details and states.", "columns": {"id": {"name": "id", "description": "Unique identifier for the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "title": {"name": "title", "description": "Title of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "body": {"name": "body", "description": "Body text of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "resource_type": {"name": "resource_type", "description": "Type of the resource, typically 'Decidim::Proposals::Proposal'", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_component_id": {"name": "decidim_component_id", "description": "Identifier for the component within which the proposal was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_scope_id": {"name": "decidim_scope_id", "description": "Identifier for the scope of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the proposal was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "published_at": {"name": "published_at", "description": "Timestamp when the proposal was published", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "state": {"name": "state", "description": "Current state of the proposal, with default 'Pas d'\u00e9tat' if null", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "translated_state": {"name": "translated_state", "description": "Human-readable translated state of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "comments_count": {"name": "comments_count", "description": "Number of comments on the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "endorsements_count": {"name": "endorsements_count", "description": "Number of endorsements on the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "address": {"name": "address", "description": "Address related to the proposal, with default 'Pas d'adresse' if empty", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/intermediate/proposals/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}]}, "created_at": 1727441769.8703701, "relation_name": "\"test_lyon\".\"prod\".\"int_proposals\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n ]\n)}}\n\nSELECT\n decidim_proposals.id,\n decidim_proposals.title,\n decidim_proposals.body,\n decidim_proposals.resource_type,\n decidim_proposals.decidim_component_id,\n decidim_proposals.decidim_scope_id,\n decidim_proposals.created_at,\n decidim_proposals.published_at,\n COALESCE(NULLIF(decidim_proposals.state, NULL), 'Pas d''\u00e9tat') AS state,\n (CASE\n WHEN decidim_proposals.state = 'evaluating' THEN 'En cours d''\u00e9valuation'\n WHEN decidim_proposals.state = 'rejected' THEN 'Rejet\u00e9e'\n WHEN decidim_proposals.state = 'accepted' THEN 'Accept\u00e9e'\n WHEN decidim_proposals.state IS NULL THEN 'Pas d''\u00e9tat'\n ELSE decidim_proposals.state\n END\n ) AS translated_state,\n decidim_proposals.comments_count,\n decidim_proposals.endorsements_count,\n COALESCE(NULLIF(decidim_proposals.address,''),'Pas d''adresse') AS address\nFROM {{ ref (\"stg_decidim_proposals\")}} AS decidim_proposals\nWHERE published_at IS NOT NULL", "language": "sql", "refs": [{"name": "stg_decidim_proposals", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_proposals"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "test.demo.not_null_stg_decidim_forms_answer_choices_id.6373c5b027": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_answer_choices_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_answer_choices_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_answer_choices_id.6373c5b027", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_answer_choices_id"], "alias": "not_null_stg_decidim_forms_answer_choices_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.77, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_answer_choices", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_answer_choices"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_answer_choices", "attached_node": "model.demo.stg_decidim_forms_answer_choices", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_answer_choices')) }}"}, "namespace": null}}, "test.demo.unique_stg_decidim_forms_answer_choices_id.cac0250df2": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_forms_answer_choices_id", "resource_type": "test", "package_name": "demo", "path": "unique_stg_decidim_forms_answer_choices_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.unique_stg_decidim_forms_answer_choices_id.cac0250df2", "fqn": ["demo", "staging", "decidim", "forms", "unique_stg_decidim_forms_answer_choices_id"], "alias": "unique_stg_decidim_forms_answer_choices_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.770902, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_answer_choices", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.stg_decidim_forms_answer_choices"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_answer_choices", "attached_node": "model.demo.stg_decidim_forms_answer_choices", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_answer_choices')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_answer_choices_decidim_answer_id.70e833d8d0": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_answer_choices_decidim_answer_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_answer_choices_decidim_answer_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_answer_choices_decidim_answer_id.70e833d8d0", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_answer_choices_decidim_answer_id"], "alias": "not_null_stg_decidim_forms_answer_choices_decidim_answer_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.771706, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_answer_choices", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_answer_choices"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "decidim_answer_id", "file_key_name": "models.stg_decidim_forms_answer_choices", "attached_node": "model.demo.stg_decidim_forms_answer_choices", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "decidim_answer_id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_answer_choices')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_answer_choices_body.0c7838e1b8": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_answer_choices_body", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_answer_choices_body.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_answer_choices_body.0c7838e1b8", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_answer_choices_body"], "alias": "not_null_stg_decidim_forms_answer_choices_body", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.772497, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_answer_choices", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_answer_choices"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "body", "file_key_name": "models.stg_decidim_forms_answer_choices", "attached_node": "model.demo.stg_decidim_forms_answer_choices", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "body", "model": "{{ get_where_subquery(ref('stg_decidim_forms_answer_choices')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_answers_id.92ce43439f": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_answers_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_answers_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_answers_id.92ce43439f", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_answers_id"], "alias": "not_null_stg_decidim_forms_answers_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.7733161, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_answers", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_answers"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_answers", "attached_node": "model.demo.stg_decidim_forms_answers", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_answers')) }}"}, "namespace": null}}, "test.demo.unique_stg_decidim_forms_answers_id.8fb3388969": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_forms_answers_id", "resource_type": "test", "package_name": "demo", "path": "unique_stg_decidim_forms_answers_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.unique_stg_decidim_forms_answers_id.8fb3388969", "fqn": ["demo", "staging", "decidim", "forms", "unique_stg_decidim_forms_answers_id"], "alias": "unique_stg_decidim_forms_answers_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.774173, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_answers", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.stg_decidim_forms_answers"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_answers", "attached_node": "model.demo.stg_decidim_forms_answers", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_answers')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_question_matrix_rows_id.7e6619509e": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_question_matrix_rows_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_question_matrix_rows_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_question_matrix_rows_id.7e6619509e", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_question_matrix_rows_id"], "alias": "not_null_stg_decidim_forms_question_matrix_rows_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.774949, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_question_matrix_rows", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_question_matrix_rows"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_question_matrix_rows", "attached_node": "model.demo.stg_decidim_forms_question_matrix_rows", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_question_matrix_rows')) }}"}, "namespace": null}}, "test.demo.unique_stg_decidim_forms_question_matrix_rows_id.8db20e3085": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_forms_question_matrix_rows_id", "resource_type": "test", "package_name": "demo", "path": "unique_stg_decidim_forms_question_matrix_rows_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.unique_stg_decidim_forms_question_matrix_rows_id.8db20e3085", "fqn": ["demo", "staging", "decidim", "forms", "unique_stg_decidim_forms_question_matrix_rows_id"], "alias": "unique_stg_decidim_forms_question_matrix_rows_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.775705, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_question_matrix_rows", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.stg_decidim_forms_question_matrix_rows"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_question_matrix_rows", "attached_node": "model.demo.stg_decidim_forms_question_matrix_rows", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_question_matrix_rows')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id.55db0b6fe6": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_que_b7cff25dabb5d3b02a571f0f586cf6bf.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id.55db0b6fe6", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id"], "alias": "not_null_stg_decidim_forms_que_b7cff25dabb5d3b02a571f0f586cf6bf", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": "not_null_stg_decidim_forms_que_b7cff25dabb5d3b02a571f0f586cf6bf", "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": {"alias": "not_null_stg_decidim_forms_que_b7cff25dabb5d3b02a571f0f586cf6bf"}, "created_at": 1727441769.77647, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}{{ config(alias=\"not_null_stg_decidim_forms_que_b7cff25dabb5d3b02a571f0f586cf6bf\") }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_question_matrix_rows", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_question_matrix_rows"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "decidim_question_id", "file_key_name": "models.stg_decidim_forms_question_matrix_rows", "attached_node": "model.demo.stg_decidim_forms_question_matrix_rows", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "decidim_question_id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_question_matrix_rows')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_question_matrix_rows_body.71d322a975": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_question_matrix_rows_body", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_question_matrix_rows_body.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_question_matrix_rows_body.71d322a975", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_question_matrix_rows_body"], "alias": "not_null_stg_decidim_forms_question_matrix_rows_body", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.777229, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_question_matrix_rows", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_question_matrix_rows"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "body", "file_key_name": "models.stg_decidim_forms_question_matrix_rows", "attached_node": "model.demo.stg_decidim_forms_question_matrix_rows", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "body", "model": "{{ get_where_subquery(ref('stg_decidim_forms_question_matrix_rows')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_questionnaires_id.74cea2a594": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_questionnaires_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_questionnaires_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_questionnaires_id.74cea2a594", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_questionnaires_id"], "alias": "not_null_stg_decidim_forms_questionnaires_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.778058, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_questionnaires", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_questionnaires"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_questionnaires", "attached_node": "model.demo.stg_decidim_forms_questionnaires", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_questionnaires')) }}"}, "namespace": null}}, "test.demo.unique_stg_decidim_forms_questionnaires_id.c228c4d2a1": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_forms_questionnaires_id", "resource_type": "test", "package_name": "demo", "path": "unique_stg_decidim_forms_questionnaires_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.unique_stg_decidim_forms_questionnaires_id.c228c4d2a1", "fqn": ["demo", "staging", "decidim", "forms", "unique_stg_decidim_forms_questionnaires_id"], "alias": "unique_stg_decidim_forms_questionnaires_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.7788239, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_questionnaires", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.stg_decidim_forms_questionnaires"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_questionnaires", "attached_node": "model.demo.stg_decidim_forms_questionnaires", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_questionnaires')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_questions_id.c7a096fa50": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_questions_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_questions_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_questions_id.c7a096fa50", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_questions_id"], "alias": "not_null_stg_decidim_forms_questions_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.779597, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_questions", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_questions"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_questions", "attached_node": "model.demo.stg_decidim_forms_questions", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_questions')) }}"}, "namespace": null}}, "test.demo.unique_stg_decidim_forms_questions_id.3becc3a082": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_forms_questions_id", "resource_type": "test", "package_name": "demo", "path": "unique_stg_decidim_forms_questions_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.unique_stg_decidim_forms_questions_id.3becc3a082", "fqn": ["demo", "staging", "decidim", "forms", "unique_stg_decidim_forms_questions_id"], "alias": "unique_stg_decidim_forms_questions_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.780351, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_questions", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.stg_decidim_forms_questions"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_questions", "attached_node": "model.demo.stg_decidim_forms_questions", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_questions')) }}"}, "namespace": null}}, "test.demo.unique_stg_decidim_budgets_line_items_id.93d157dab5": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_budgets_line_items_id", "resource_type": "test", "package_name": "demo", "path": "unique_stg_decidim_budgets_line_items_id.sql", "original_file_path": "models/staging/decidim/budgets/schema.yml", "unique_id": "test.demo.unique_stg_decidim_budgets_line_items_id.93d157dab5", "fqn": ["demo", "staging", "decidim", "budgets", "unique_stg_decidim_budgets_line_items_id"], "alias": "unique_stg_decidim_budgets_line_items_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.7947578, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_budgets_line_items", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.stg_decidim_budgets_line_items"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_budgets_line_items", "attached_node": "model.demo.stg_decidim_budgets_line_items", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_budgets_line_items')) }}"}, "namespace": null}}, "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id.759330b24d": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id", "resource_type": "test", "package_name": "demo", "path": "dbt_utils_unique_combination_o_b42a72e6dc642c4f0174b7aaf01eabc7.sql", "original_file_path": "models/staging/decidim/budgets/schema.yml", "unique_id": "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id.759330b24d", "fqn": ["demo", "staging", "decidim", "budgets", "dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id"], "alias": "dbt_utils_unique_combination_o_b42a72e6dc642c4f0174b7aaf01eabc7", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": "dbt_utils_unique_combination_o_b42a72e6dc642c4f0174b7aaf01eabc7", "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": {"alias": "dbt_utils_unique_combination_o_b42a72e6dc642c4f0174b7aaf01eabc7"}, "created_at": 1727441769.795609, "relation_name": null, "raw_code": "{{ dbt_utils.test_unique_combination_of_columns(**_dbt_generic_test_kwargs) }}{{ config(alias=\"dbt_utils_unique_combination_o_b42a72e6dc642c4f0174b7aaf01eabc7\") }}", "language": "sql", "refs": [{"name": "stg_decidim_budgets_line_items", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt_utils.test_unique_combination_of_columns", "macro.dbt.get_where_subquery"], "nodes": ["model.demo.stg_decidim_budgets_line_items"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": null, "file_key_name": "models.stg_decidim_budgets_line_items", "attached_node": "model.demo.stg_decidim_budgets_line_items", "test_metadata": {"name": "unique_combination_of_columns", "kwargs": {"combination_of_columns": ["decidim_order_id", "decidim_project_id"], "model": "{{ get_where_subquery(ref('stg_decidim_budgets_line_items')) }}"}, "namespace": "dbt_utils"}}, "test.demo.unique_stg_decidim_categorizations_id.6566c00409": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_categorizations_id", "resource_type": "test", "package_name": "demo", "path": "unique_stg_decidim_categorizations_id.sql", "original_file_path": "models/staging/decidim/categories/schema.yml", "unique_id": "test.demo.unique_stg_decidim_categorizations_id.6566c00409", "fqn": ["demo", "staging", "decidim", "categories", "unique_stg_decidim_categorizations_id"], "alias": "unique_stg_decidim_categorizations_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.807109, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_categorizations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.stg_decidim_categorizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_categorizations", "attached_node": "model.demo.stg_decidim_categorizations", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_categorizations')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_categorizations_id.a059a79c08": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_categorizations_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_categorizations_id.sql", "original_file_path": "models/staging/decidim/categories/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_categorizations_id.a059a79c08", "fqn": ["demo", "staging", "decidim", "categories", "not_null_stg_decidim_categorizations_id"], "alias": "not_null_stg_decidim_categorizations_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.8079271, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_categorizations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_categorizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_categorizations", "attached_node": "model.demo.stg_decidim_categorizations", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_categorizations')) }}"}, "namespace": null}}, "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type.d2c10e48e4": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type", "resource_type": "test", "package_name": "demo", "path": "dbt_utils_unique_combination_o_e91d0d82d3171d32221006a1ae09a09f.sql", "original_file_path": "models/staging/decidim/categories/schema.yml", "unique_id": "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type.d2c10e48e4", "fqn": ["demo", "staging", "decidim", "categories", "dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type"], "alias": "dbt_utils_unique_combination_o_e91d0d82d3171d32221006a1ae09a09f", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": "dbt_utils_unique_combination_o_e91d0d82d3171d32221006a1ae09a09f", "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": {"alias": "dbt_utils_unique_combination_o_e91d0d82d3171d32221006a1ae09a09f"}, "created_at": 1727441769.808712, "relation_name": null, "raw_code": "{{ dbt_utils.test_unique_combination_of_columns(**_dbt_generic_test_kwargs) }}{{ config(alias=\"dbt_utils_unique_combination_o_e91d0d82d3171d32221006a1ae09a09f\") }}", "language": "sql", "refs": [{"name": "stg_decidim_categorizations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt_utils.test_unique_combination_of_columns", "macro.dbt.get_where_subquery"], "nodes": ["model.demo.stg_decidim_categorizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": null, "file_key_name": "models.stg_decidim_categorizations", "attached_node": "model.demo.stg_decidim_categorizations", "test_metadata": {"name": "unique_combination_of_columns", "kwargs": {"combination_of_columns": ["categorizable_id", "categorizable_type"], "model": "{{ get_where_subquery(ref('stg_decidim_categorizations')) }}"}, "namespace": "dbt_utils"}}, "test.demo.accepted_values_followings_following_way__real_follow__ancestor_follow.60d8b91db4": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "accepted_values_followings_following_way__real_follow__ancestor_follow", "resource_type": "test", "package_name": "demo", "path": "accepted_values_followings_2bd6d020694d7d1aa5e3c0a6620f8f06.sql", "original_file_path": "models/marts/followings/schema.yml", "unique_id": "test.demo.accepted_values_followings_following_way__real_follow__ancestor_follow.60d8b91db4", "fqn": ["demo", "marts", "followings", "accepted_values_followings_following_way__real_follow__ancestor_follow"], "alias": "accepted_values_followings_2bd6d020694d7d1aa5e3c0a6620f8f06", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": "accepted_values_followings_2bd6d020694d7d1aa5e3c0a6620f8f06", "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": {"alias": "accepted_values_followings_2bd6d020694d7d1aa5e3c0a6620f8f06"}, "created_at": 1727441769.8130739, "relation_name": null, "raw_code": "{{ test_accepted_values(**_dbt_generic_test_kwargs) }}{{ config(alias=\"accepted_values_followings_2bd6d020694d7d1aa5e3c0a6620f8f06\") }}", "language": "sql", "refs": [{"name": "followings", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_accepted_values", "macro.dbt.get_where_subquery"], "nodes": ["model.demo.followings"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "following_way", "file_key_name": "models.followings", "attached_node": "model.demo.followings", "test_metadata": {"name": "accepted_values", "kwargs": {"values": ["real_follow", "ancestor_follow"], "column_name": "following_way", "model": "{{ get_where_subquery(ref('followings')) }}"}, "namespace": null}}, "test.demo.not_null_components_id.85e75ab698": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_components_id", "resource_type": "test", "package_name": "demo", "path": "not_null_components_id.sql", "original_file_path": "models/marts/components/schema.yml", "unique_id": "test.demo.not_null_components_id.85e75ab698", "fqn": ["demo", "marts", "components", "not_null_components_id"], "alias": "not_null_components_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.820657, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.components", "attached_node": "model.demo.components", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('components')) }}"}, "namespace": null}}, "test.demo.unique_components_id.55875f0fa3": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_components_id", "resource_type": "test", "package_name": "demo", "path": "unique_components_id.sql", "original_file_path": "models/marts/components/schema.yml", "unique_id": "test.demo.unique_components_id.55875f0fa3", "fqn": ["demo", "marts", "components", "unique_components_id"], "alias": "unique_components_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.821463, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.components", "attached_node": "model.demo.components", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('components')) }}"}, "namespace": null}}, "test.demo.not_null_components_manifest_name.2795dc3709": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_components_manifest_name", "resource_type": "test", "package_name": "demo", "path": "not_null_components_manifest_name.sql", "original_file_path": "models/marts/components/schema.yml", "unique_id": "test.demo.not_null_components_manifest_name.2795dc3709", "fqn": ["demo", "marts", "components", "not_null_components_manifest_name"], "alias": "not_null_components_manifest_name", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.8222458, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "manifest_name", "file_key_name": "models.components", "attached_node": "model.demo.components", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "manifest_name", "model": "{{ get_where_subquery(ref('components')) }}"}, "namespace": null}}, "test.demo.not_null_components_decidim_organization_id.3ae04f70dd": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_components_decidim_organization_id", "resource_type": "test", "package_name": "demo", "path": "not_null_components_decidim_organization_id.sql", "original_file_path": "models/marts/components/schema.yml", "unique_id": "test.demo.not_null_components_decidim_organization_id.3ae04f70dd", "fqn": ["demo", "marts", "components", "not_null_components_decidim_organization_id"], "alias": "not_null_components_decidim_organization_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.823076, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "decidim_organization_id", "file_key_name": "models.components", "attached_node": "model.demo.components", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "decidim_organization_id", "model": "{{ get_where_subquery(ref('components')) }}"}, "namespace": null}}, "test.demo.unique_users_id.ec952d9777": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_users_id", "resource_type": "test", "package_name": "demo", "path": "unique_users_id.sql", "original_file_path": "models/marts/users/schema.yml", "unique_id": "test.demo.unique_users_id.ec952d9777", "fqn": ["demo", "marts", "users", "unique_users_id"], "alias": "unique_users_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.837776, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "users", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.users", "attached_node": "model.demo.users", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('users')) }}"}, "namespace": null}}, "test.demo.not_null_users_id.4db5ed5c63": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_users_id", "resource_type": "test", "package_name": "demo", "path": "not_null_users_id.sql", "original_file_path": "models/marts/users/schema.yml", "unique_id": "test.demo.not_null_users_id.4db5ed5c63", "fqn": ["demo", "marts", "users", "not_null_users_id"], "alias": "not_null_users_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.8385909, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "users", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.users", "attached_node": "model.demo.users", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('users')) }}"}, "namespace": null}}, "test.demo.relationships_users_id__id__ref_int_users_.c269bba0d5": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "relationships_users_id__id__ref_int_users_", "resource_type": "test", "package_name": "demo", "path": "relationships_users_id__id__ref_int_users_.sql", "original_file_path": "models/marts/users/schema.yml", "unique_id": "test.demo.relationships_users_id__id__ref_int_users_.c269bba0d5", "fqn": ["demo", "marts", "users", "relationships_users_id__id__ref_int_users_"], "alias": "relationships_users_id__id__ref_int_users_", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.839432, "relation_name": null, "raw_code": "{{ test_relationships(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "int_users", "package": null, "version": null}, {"name": "users", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_relationships", "macro.dbt.get_where_subquery"], "nodes": ["model.demo.int_users", "model.demo.users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": null, "file_key_name": "models.users", "attached_node": "model.demo.users", "test_metadata": {"name": "relationships", "kwargs": {"column_name": "id", "to": "ref('int_users')", "field": "id", "model": "{{ get_where_subquery(ref('users')) }}"}, "namespace": null}}, "test.demo.dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id.da5f9c9505": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id", "resource_type": "test", "package_name": "demo", "path": "dbt_utils_unique_combination_o_f2799d012d3f7daa7590aefc4588a1c9.sql", "original_file_path": "models/marts/proposals/schema.yml", "unique_id": "test.demo.dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id.da5f9c9505", "fqn": ["demo", "marts", "proposals", "dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id"], "alias": "dbt_utils_unique_combination_o_f2799d012d3f7daa7590aefc4588a1c9", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": "dbt_utils_unique_combination_o_f2799d012d3f7daa7590aefc4588a1c9", "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": {"alias": "dbt_utils_unique_combination_o_f2799d012d3f7daa7590aefc4588a1c9"}, "created_at": 1727441769.847372, "relation_name": null, "raw_code": "{{ dbt_utils.test_unique_combination_of_columns(**_dbt_generic_test_kwargs) }}{{ config(alias=\"dbt_utils_unique_combination_o_f2799d012d3f7daa7590aefc4588a1c9\") }}", "language": "sql", "refs": [{"name": "proposals_votes", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt_utils.test_unique_combination_of_columns", "macro.dbt.get_where_subquery"], "nodes": ["model.demo.proposals_votes"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": null, "file_key_name": "models.proposals_votes", "attached_node": "model.demo.proposals_votes", "test_metadata": {"name": "unique_combination_of_columns", "kwargs": {"combination_of_columns": ["decidim_author_id", "decidim_proposal_id"], "model": "{{ get_where_subquery(ref('proposals_votes')) }}"}, "namespace": "dbt_utils"}}, "test.demo.unique_int_users_id.e5ba0ede1e": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_int_users_id", "resource_type": "test", "package_name": "demo", "path": "unique_int_users_id.sql", "original_file_path": "models/intermediate/users/schema.yml", "unique_id": "test.demo.unique_int_users_id.e5ba0ede1e", "fqn": ["demo", "intermediate", "users", "unique_int_users_id"], "alias": "unique_int_users_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.8639638, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "int_users", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.int_users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.int_users", "attached_node": "model.demo.int_users", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('int_users')) }}"}, "namespace": null}}, "test.demo.not_null_int_users_id.1125b186c1": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_int_users_id", "resource_type": "test", "package_name": "demo", "path": "not_null_int_users_id.sql", "original_file_path": "models/intermediate/users/schema.yml", "unique_id": "test.demo.not_null_int_users_id.1125b186c1", "fqn": ["demo", "intermediate", "users", "not_null_int_users_id"], "alias": "not_null_int_users_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.8647811, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "int_users", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.int_users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.int_users", "attached_node": "model.demo.int_users", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('int_users')) }}"}, "namespace": null}}, "test.demo.not_null_int_users_nickname.b90ddd7677": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_int_users_nickname", "resource_type": "test", "package_name": "demo", "path": "not_null_int_users_nickname.sql", "original_file_path": "models/intermediate/users/schema.yml", "unique_id": "test.demo.not_null_int_users_nickname.b90ddd7677", "fqn": ["demo", "intermediate", "users", "not_null_int_users_nickname"], "alias": "not_null_int_users_nickname", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.8655622, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "int_users", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.int_users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "nickname", "file_key_name": "models.int_users", "attached_node": "model.demo.int_users", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "nickname", "model": "{{ get_where_subquery(ref('int_users')) }}"}, "namespace": null}}, "model.test_lyon.decidim_awesome_proposal_extra_fields": {"database": "test_lyon", "schema": "prod", "name": "decidim_awesome_proposal_extra_fields", "resource_type": "model", "package_name": "test_lyon", "path": "marts/decidim_awesome/decidim_awesome_proposal_extra_fields.sql", "original_file_path": "models/marts/decidim_awesome/decidim_awesome_proposal_extra_fields.sql", "unique_id": "model.test_lyon.decidim_awesome_proposal_extra_fields", "fqn": ["test_lyon", "marts", "decidim_awesome", "decidim_awesome_proposal_extra_fields"], "alias": "decidim_awesome_proposal_extra_fields", "checksum": {"name": "sha256", "checksum": "e74fef8bbaffd8fb07cd179ee4cd299727ac45ee1c196509a24b2b0dbf0a1561"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727446081.2962859, "relation_name": "\"test_lyon\".\"prod\".\"decidim_awesome_proposal_extra_fields\"", "raw_code": "SELECT\n decidim_awesome_proposal_extra_fields.id,\n decidim_awesome_proposal_extra_fields.proposal_id,\n decidim_awesome_proposal_extra_fields.private_field_description,\n decidim_awesome_proposal_extra_fields.private_field_content,\n decidim_proposals_proposals.decidim_component_id,\n components.ps_title\nFROM\n {{ ref (\"int_decidim_awesome_proposal_extra_fields\")}} AS decidim_awesome_proposal_extra_fields\nJOIN {{ ref (\"stg_decidim_proposals\")}} AS decidim_proposals_proposals ON decidim_awesome_proposal_extra_fields.proposal_id = decidim_proposals_proposals.id\nJOIN {{ ref (\"components\")}} AS components ON decidim_proposals_proposals.decidim_component_id = components.id", "language": "sql", "refs": [{"name": "int_decidim_awesome_proposal_extra_fields", "package": null, "version": null}, {"name": "stg_decidim_proposals", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.test_lyon.int_decidim_awesome_proposal_extra_fields", "model.demo.stg_decidim_proposals", "model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.test_lyon.stg_decidim_awesome_proposal_extra_fields": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_awesome_proposal_extra_fields", "resource_type": "model", "package_name": "test_lyon", "path": "staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql", "original_file_path": "models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql", "unique_id": "model.test_lyon.stg_decidim_awesome_proposal_extra_fields", "fqn": ["test_lyon", "staging", "decidim", "stg_decidim_awesome_proposal_extra_fields"], "alias": "stg_decidim_awesome_proposal_extra_fields", "checksum": {"name": "sha256", "checksum": "c680c40fcfafcbeb0896883b2dcd15f87fa987271129f4df0c3e1073c695caaa"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table for private proposal fields in the module decidim awesome.", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "proposal_id": {"name": "proposal_id", "description": "Id of the proposal the private field is linked to.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "private_body": {"name": "private_body", "description": "Body of the answers of the private proposals fields answered by the user. The format is XML.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "test_lyon://models/staging/decidim/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727446081.349271, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_awesome_proposal_extra_fields\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_awesome_proposal_extra_fields_test') }}\n)\n\n\nSELECT\n id,\n decidim_proposal_id AS proposal_id,\n updated_at,\n created_at,\n replace(private_body_clear, ' ', '') AS private_body_clear\nFROM source", "language": "sql", "refs": [], "sources": [["decidim", "decidim_awesome_proposal_extra_fields_test"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.test_lyon.decidim.decidim_awesome_proposal_extra_fields_test"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_id.aad3a9d9b8": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_awesome_proposal_extra_fields_id", "resource_type": "test", "package_name": "test_lyon", "path": "not_null_stg_decidim_awesome_proposal_extra_fields_id.sql", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_id.aad3a9d9b8", "fqn": ["test_lyon", "staging", "decidim", "not_null_stg_decidim_awesome_proposal_extra_fields_id"], "alias": "not_null_stg_decidim_awesome_proposal_extra_fields_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727446081.381366, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_awesome_proposal_extra_fields", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_awesome_proposal_extra_fields", "attached_node": "model.test_lyon.stg_decidim_awesome_proposal_extra_fields", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_awesome_proposal_extra_fields')) }}"}, "namespace": null}}, "test.test_lyon.unique_stg_decidim_awesome_proposal_extra_fields_id.1f06fde107": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_awesome_proposal_extra_fields_id", "resource_type": "test", "package_name": "test_lyon", "path": "unique_stg_decidim_awesome_proposal_extra_fields_id.sql", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "test.test_lyon.unique_stg_decidim_awesome_proposal_extra_fields_id.1f06fde107", "fqn": ["test_lyon", "staging", "decidim", "unique_stg_decidim_awesome_proposal_extra_fields_id"], "alias": "unique_stg_decidim_awesome_proposal_extra_fields_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727446081.3822951, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_awesome_proposal_extra_fields", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_awesome_proposal_extra_fields", "attached_node": "model.test_lyon.stg_decidim_awesome_proposal_extra_fields", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_awesome_proposal_extra_fields')) }}"}, "namespace": null}}, "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id.5154a34bb9": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id", "resource_type": "test", "package_name": "test_lyon", "path": "not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id.sql", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id.5154a34bb9", "fqn": ["test_lyon", "staging", "decidim", "not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id"], "alias": "not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727446081.383069, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_awesome_proposal_extra_fields", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "proposal_id", "file_key_name": "models.stg_decidim_awesome_proposal_extra_fields", "attached_node": "model.test_lyon.stg_decidim_awesome_proposal_extra_fields", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "proposal_id", "model": "{{ get_where_subquery(ref('stg_decidim_awesome_proposal_extra_fields')) }}"}, "namespace": null}}}, "sources": {"source.test_lyon.decidim.decidim_awesome_proposal_extra_fields_test": {"database": "test_lyon", "schema": "public", "name": "decidim_awesome_proposal_extra_fields_test", "resource_type": "source", "package_name": "test_lyon", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.test_lyon.decidim.decidim_awesome_proposal_extra_fields_test", "fqn": ["test_lyon", "staging", "decidim", "decidim", "decidim_awesome_proposal_extra_fields_test"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_awesome_proposal_extra_fields_test", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_awesome_proposal_extra_fields_test\"", "created_at": 1727441769.8751261}, "source.demo.decidim.decidim_components": {"database": "test_lyon", "schema": "public", "name": "decidim_components", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_components", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_components"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_components", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_components\"", "created_at": 1727441769.875642}, "source.demo.decidim.decidim_assemblies": {"database": "test_lyon", "schema": "public", "name": "decidim_assemblies", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_assemblies", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_assemblies"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_assemblies", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_assemblies\"", "created_at": 1727441769.8757172}, "source.demo.decidim.decidim_participatory_processes": {"database": "test_lyon", "schema": "public", "name": "decidim_participatory_processes", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_participatory_processes", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_participatory_processes"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_participatory_processes", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_participatory_processes\"", "created_at": 1727441769.875784}, "source.demo.decidim.decidim_participatory_process_steps": {"database": "test_lyon", "schema": "public", "name": "decidim_participatory_process_steps", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_participatory_process_steps", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_participatory_process_steps"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_participatory_process_steps", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_participatory_process_steps\"", "created_at": 1727441769.8758452}, "source.demo.decidim.decidim_users": {"database": "test_lyon", "schema": "public", "name": "decidim_users", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_users", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_users"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_users", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_users\"", "created_at": 1727441769.875906}, "source.demo.decidim.decidim_proposals_proposals": {"database": "test_lyon", "schema": "public", "name": "decidim_proposals_proposals", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_proposals_proposals", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_proposals_proposals"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_proposals_proposals", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_proposals_proposals\"", "created_at": 1727441769.875964}, "source.demo.decidim.decidim_coauthorships": {"database": "test_lyon", "schema": "public", "name": "decidim_coauthorships", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_coauthorships", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_coauthorships"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_coauthorships", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_coauthorships\"", "created_at": 1727441769.876035}, "source.demo.decidim.decidim_moderations": {"database": "test_lyon", "schema": "public", "name": "decidim_moderations", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_moderations", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_moderations"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_moderations", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_moderations\"", "created_at": 1727441769.876097}, "source.demo.decidim.decidim_scopes": {"database": "test_lyon", "schema": "public", "name": "decidim_scopes", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_scopes", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_scopes"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_scopes", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_scopes\"", "created_at": 1727441769.876155}, "source.demo.decidim.decidim_blogs_posts": {"database": "test_lyon", "schema": "public", "name": "decidim_blogs_posts", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_blogs_posts", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_blogs_posts"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_blogs_posts", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_blogs_posts\"", "created_at": 1727441769.876214}, "source.demo.decidim.decidim_debates_debates": {"database": "test_lyon", "schema": "public", "name": "decidim_debates_debates", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_debates_debates", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_debates_debates"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_debates_debates", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_debates_debates\"", "created_at": 1727441769.876269}, "source.demo.decidim.decidim_meetings_meetings": {"database": "test_lyon", "schema": "public", "name": "decidim_meetings_meetings", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_meetings_meetings", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_meetings_meetings"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_meetings_meetings", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_meetings_meetings\"", "created_at": 1727441769.8763251}, "source.demo.decidim.decidim_accountability_results": {"database": "test_lyon", "schema": "public", "name": "decidim_accountability_results", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_accountability_results", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_accountability_results"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_accountability_results", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_accountability_results\"", "created_at": 1727441769.8763819}, "source.demo.decidim.decidim_comments_comments": {"database": "test_lyon", "schema": "public", "name": "decidim_comments_comments", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_comments_comments", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_comments_comments"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_comments_comments", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_comments_comments\"", "created_at": 1727441769.876437}, "source.demo.decidim.decidim_proposals_collaborative_drafts": {"database": "test_lyon", "schema": "public", "name": "decidim_proposals_collaborative_drafts", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_proposals_collaborative_drafts", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_proposals_collaborative_drafts"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_proposals_collaborative_drafts", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_proposals_collaborative_drafts\"", "created_at": 1727441769.876491}, "source.demo.decidim.decidim_endorsements": {"database": "test_lyon", "schema": "public", "name": "decidim_endorsements", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_endorsements", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_endorsements"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_endorsements", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_endorsements\"", "created_at": 1727441769.876547}, "source.demo.decidim.decidim_follows": {"database": "test_lyon", "schema": "public", "name": "decidim_follows", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_follows", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_follows"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_follows", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_follows\"", "created_at": 1727441769.876603}, "source.demo.decidim.decidim_initiatives": {"database": "test_lyon", "schema": "public", "name": "decidim_initiatives", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_initiatives", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_initiatives"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_initiatives", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_initiatives\"", "created_at": 1727441769.876657}, "source.demo.decidim.decidim_initiatives_type_scopes": {"database": "test_lyon", "schema": "public", "name": "decidim_initiatives_type_scopes", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_initiatives_type_scopes", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_initiatives_type_scopes"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_initiatives_type_scopes", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_initiatives_type_scopes\"", "created_at": 1727441769.8767118}, "source.demo.decidim.decidim_surveys_surveys": {"database": "test_lyon", "schema": "public", "name": "decidim_surveys_surveys", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_surveys_surveys", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_surveys_surveys"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_surveys_surveys", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_surveys_surveys\"", "created_at": 1727441769.876767}, "source.demo.decidim.decidim_attachments": {"database": "test_lyon", "schema": "public", "name": "decidim_attachments", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_attachments", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_attachments"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_attachments", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_attachments\"", "created_at": 1727441769.876822}, "source.demo.decidim.decidim_proposals_proposal_votes": {"database": "test_lyon", "schema": "public", "name": "decidim_proposals_proposal_votes", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_proposals_proposal_votes", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_proposals_proposal_votes"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_proposals_proposal_votes", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_proposals_proposal_votes\"", "created_at": 1727441769.8768792}, "source.demo.decidim.decidim_meetings_registrations": {"database": "test_lyon", "schema": "public", "name": "decidim_meetings_registrations", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_meetings_registrations", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_meetings_registrations"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_meetings_registrations", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_meetings_registrations\"", "created_at": 1727441769.876936}, "source.demo.decidim.decidim_organizations": {"database": "test_lyon", "schema": "public", "name": "decidim_organizations", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/organizations/schema.yml", "original_file_path": "models/staging/decidim/organizations/schema.yml", "unique_id": "source.demo.decidim.decidim_organizations", "fqn": ["demo", "staging", "decidim", "organizations", "decidim", "decidim_organizations"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_organizations", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "Table containing organization informations", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_organizations\"", "created_at": 1727441769.876991}, "source.demo.decidim.decidim_forms_answer_choices": {"database": "test_lyon", "schema": "public", "name": "decidim_forms_answer_choices", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/forms/schema.yml", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "source.demo.decidim.decidim_forms_answer_choices", "fqn": ["demo", "staging", "decidim", "forms", "decidim", "decidim_forms_answer_choices"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_forms_answer_choices", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_forms_answer_choices\"", "created_at": 1727441769.877047}, "source.demo.decidim.decidim_forms_answers": {"database": "test_lyon", "schema": "public", "name": "decidim_forms_answers", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/forms/schema.yml", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "source.demo.decidim.decidim_forms_answers", "fqn": ["demo", "staging", "decidim", "forms", "decidim", "decidim_forms_answers"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_forms_answers", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_forms_answers\"", "created_at": 1727441769.877271}, "source.demo.decidim.decidim_forms_question_matrix_rows": {"database": "test_lyon", "schema": "public", "name": "decidim_forms_question_matrix_rows", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/forms/schema.yml", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "source.demo.decidim.decidim_forms_question_matrix_rows", "fqn": ["demo", "staging", "decidim", "forms", "decidim", "decidim_forms_question_matrix_rows"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_forms_question_matrix_rows", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_forms_question_matrix_rows\"", "created_at": 1727441769.877335}, "source.demo.decidim.decidim_forms_questionnaires": {"database": "test_lyon", "schema": "public", "name": "decidim_forms_questionnaires", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/forms/schema.yml", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "source.demo.decidim.decidim_forms_questionnaires", "fqn": ["demo", "staging", "decidim", "forms", "decidim", "decidim_forms_questionnaires"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_forms_questionnaires", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_forms_questionnaires\"", "created_at": 1727441769.877393}, "source.demo.decidim.decidim_forms_questions": {"database": "test_lyon", "schema": "public", "name": "decidim_forms_questions", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/forms/schema.yml", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "source.demo.decidim.decidim_forms_questions", "fqn": ["demo", "staging", "decidim", "forms", "decidim", "decidim_forms_questions"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_forms_questions", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_forms_questions\"", "created_at": 1727441769.877449}, "source.demo.decidim.decidim_areas": {"database": "test_lyon", "schema": "public", "name": "decidim_areas", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/areas/schema.yml", "original_file_path": "models/staging/decidim/areas/schema.yml", "unique_id": "source.demo.decidim.decidim_areas", "fqn": ["demo", "staging", "decidim", "areas", "decidim", "decidim_areas"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_areas", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_areas\"", "created_at": 1727441769.877506}, "source.demo.decidim.decidim_area_types": {"database": "test_lyon", "schema": "public", "name": "decidim_area_types", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/areas/schema.yml", "original_file_path": "models/staging/decidim/areas/schema.yml", "unique_id": "source.demo.decidim.decidim_area_types", "fqn": ["demo", "staging", "decidim", "areas", "decidim", "decidim_area_types"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_area_types", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_area_types\"", "created_at": 1727441769.877562}, "source.demo.decidim.decidim_budgets_projects": {"database": "test_lyon", "schema": "public", "name": "decidim_budgets_projects", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/budgets/schema.yml", "original_file_path": "models/staging/decidim/budgets/schema.yml", "unique_id": "source.demo.decidim.decidim_budgets_projects", "fqn": ["demo", "staging", "decidim", "budgets", "decidim", "decidim_budgets_projects"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_budgets_projects", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_budgets_projects\"", "created_at": 1727441769.877619}, "source.demo.decidim.decidim_budgets_budgets": {"database": "test_lyon", "schema": "public", "name": "decidim_budgets_budgets", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/budgets/schema.yml", "original_file_path": "models/staging/decidim/budgets/schema.yml", "unique_id": "source.demo.decidim.decidim_budgets_budgets", "fqn": ["demo", "staging", "decidim", "budgets", "decidim", "decidim_budgets_budgets"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_budgets_budgets", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_budgets_budgets\"", "created_at": 1727441769.877673}, "source.demo.decidim.decidim_budgets_line_items": {"database": "test_lyon", "schema": "public", "name": "decidim_budgets_line_items", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/budgets/schema.yml", "original_file_path": "models/staging/decidim/budgets/schema.yml", "unique_id": "source.demo.decidim.decidim_budgets_line_items", "fqn": ["demo", "staging", "decidim", "budgets", "decidim", "decidim_budgets_line_items"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_budgets_line_items", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_budgets_line_items\"", "created_at": 1727441769.877729}, "source.demo.decidim.decidim_budgets_orders": {"database": "test_lyon", "schema": "public", "name": "decidim_budgets_orders", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/budgets/schema.yml", "original_file_path": "models/staging/decidim/budgets/schema.yml", "unique_id": "source.demo.decidim.decidim_budgets_orders", "fqn": ["demo", "staging", "decidim", "budgets", "decidim", "decidim_budgets_orders"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_budgets_orders", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_budgets_orders\"", "created_at": 1727441769.8777852}, "source.demo.decidim.decidim_categories": {"database": "test_lyon", "schema": "public", "name": "decidim_categories", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/categories/schema.yml", "original_file_path": "models/staging/decidim/categories/schema.yml", "unique_id": "source.demo.decidim.decidim_categories", "fqn": ["demo", "staging", "decidim", "categories", "decidim", "decidim_categories"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_categories", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_categories\"", "created_at": 1727441769.877841}, "source.demo.decidim.decidim_categorizations": {"database": "test_lyon", "schema": "public", "name": "decidim_categorizations", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/categories/schema.yml", "original_file_path": "models/staging/decidim/categories/schema.yml", "unique_id": "source.demo.decidim.decidim_categorizations", "fqn": ["demo", "staging", "decidim", "categories", "decidim", "decidim_categorizations"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_categorizations", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_categorizations\"", "created_at": 1727441769.877898}}, "macros": {"macro.dbt_postgres.postgres__current_timestamp": {"name": "postgres__current_timestamp", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__current_timestamp", "macro_sql": "{% macro postgres__current_timestamp() -%}\n now()\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0357308, "supported_languages": null}, "macro.dbt_postgres.postgres__snapshot_string_as_time": {"name": "postgres__snapshot_string_as_time", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__snapshot_string_as_time", "macro_sql": "{% macro postgres__snapshot_string_as_time(timestamp) -%}\n {%- set result = \"'\" ~ timestamp ~ \"'::timestamp without time zone\" -%}\n {{ return(result) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.035918, "supported_languages": null}, "macro.dbt_postgres.postgres__snapshot_get_time": {"name": "postgres__snapshot_get_time", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__snapshot_get_time", "macro_sql": "{% macro postgres__snapshot_get_time() -%}\n {{ current_timestamp() }}::timestamp without time zone\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.036009, "supported_languages": null}, "macro.dbt_postgres.postgres__current_timestamp_backcompat": {"name": "postgres__current_timestamp_backcompat", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__current_timestamp_backcompat", "macro_sql": "{% macro postgres__current_timestamp_backcompat() %}\n current_timestamp::{{ type_timestamp() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.type_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.036087, "supported_languages": null}, "macro.dbt_postgres.postgres__current_timestamp_in_utc_backcompat": {"name": "postgres__current_timestamp_in_utc_backcompat", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__current_timestamp_in_utc_backcompat", "macro_sql": "{% macro postgres__current_timestamp_in_utc_backcompat() %}\n (current_timestamp at time zone 'utc')::{{ type_timestamp() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.type_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.036167, "supported_languages": null}, "macro.dbt_postgres.postgres__get_catalog_relations": {"name": "postgres__get_catalog_relations", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/catalog.sql", "original_file_path": "macros/catalog.sql", "unique_id": "macro.dbt_postgres.postgres__get_catalog_relations", "macro_sql": "{% macro postgres__get_catalog_relations(information_schema, relations) -%}\n {%- call statement('catalog', fetch_result=True) -%}\n\n {#\n If the user has multiple databases set and the first one is wrong, this will fail.\n But we won't fail in the case where there are multiple quoting-difference-only dbs, which is better.\n #}\n {% set database = information_schema.database %}\n {{ adapter.verify_database(database) }}\n\n select\n '{{ database }}' as table_database,\n sch.nspname as table_schema,\n tbl.relname as table_name,\n case tbl.relkind\n when 'v' then 'VIEW'\n when 'm' then 'MATERIALIZED VIEW'\n else 'BASE TABLE'\n end as table_type,\n tbl_desc.description as table_comment,\n col.attname as column_name,\n col.attnum as column_index,\n pg_catalog.format_type(col.atttypid, col.atttypmod) as column_type,\n col_desc.description as column_comment,\n pg_get_userbyid(tbl.relowner) as table_owner\n\n from pg_catalog.pg_namespace sch\n join pg_catalog.pg_class tbl on tbl.relnamespace = sch.oid\n join pg_catalog.pg_attribute col on col.attrelid = tbl.oid\n left outer join pg_catalog.pg_description tbl_desc on (tbl_desc.objoid = tbl.oid and tbl_desc.objsubid = 0)\n left outer join pg_catalog.pg_description col_desc on (col_desc.objoid = tbl.oid and col_desc.objsubid = col.attnum)\n where (\n {%- for relation in relations -%}\n {%- if relation.identifier -%}\n (upper(sch.nspname) = upper('{{ relation.schema }}') and\n upper(tbl.relname) = upper('{{ relation.identifier }}'))\n {%- else-%}\n upper(sch.nspname) = upper('{{ relation.schema }}')\n {%- endif -%}\n {%- if not loop.last %} or {% endif -%}\n {%- endfor -%}\n )\n and not pg_is_other_temp_schema(sch.oid) -- not a temporary schema belonging to another session\n and tbl.relpersistence in ('p', 'u') -- [p]ermanent table or [u]nlogged table. Exclude [t]emporary tables\n and tbl.relkind in ('r', 'v', 'f', 'p', 'm') -- o[r]dinary table, [v]iew, [f]oreign table, [p]artitioned table, [m]aterialized view. Other values are [i]ndex, [S]equence, [c]omposite type, [t]OAST table\n and col.attnum > 0 -- negative numbers are used for system columns such as oid\n and not col.attisdropped -- column as not been dropped\n\n order by\n sch.nspname,\n tbl.relname,\n col.attnum\n\n {%- endcall -%}\n\n {{ return(load_result('catalog').table) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0373151, "supported_languages": null}, "macro.dbt_postgres.postgres__get_catalog": {"name": "postgres__get_catalog", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/catalog.sql", "original_file_path": "macros/catalog.sql", "unique_id": "macro.dbt_postgres.postgres__get_catalog", "macro_sql": "{% macro postgres__get_catalog(information_schema, schemas) -%}\n {%- set relations = [] -%}\n {%- for schema in schemas -%}\n {%- set dummy = relations.append({'schema': schema}) -%}\n {%- endfor -%}\n {{ return(postgres__get_catalog_relations(information_schema, relations)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_catalog_relations"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.037568, "supported_languages": null}, "macro.dbt_postgres.postgres__get_relations": {"name": "postgres__get_relations", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations.sql", "original_file_path": "macros/relations.sql", "unique_id": "macro.dbt_postgres.postgres__get_relations", "macro_sql": "{% macro postgres__get_relations() -%}\n\n {#\n -- in pg_depend, objid is the dependent, refobjid is the referenced object\n -- > a pg_depend entry indicates that the referenced object cannot be\n -- > dropped without also dropping the dependent object.\n #}\n\n {%- call statement('relations', fetch_result=True) -%}\n with relation as (\n select\n pg_rewrite.ev_class as class,\n pg_rewrite.oid as id\n from pg_rewrite\n ),\n class as (\n select\n oid as id,\n relname as name,\n relnamespace as schema,\n relkind as kind\n from pg_class\n ),\n dependency as (\n select distinct\n pg_depend.objid as id,\n pg_depend.refobjid as ref\n from pg_depend\n ),\n schema as (\n select\n pg_namespace.oid as id,\n pg_namespace.nspname as name\n from pg_namespace\n where nspname != 'information_schema' and nspname not like 'pg\\_%'\n ),\n referenced as (\n select\n relation.id AS id,\n referenced_class.name ,\n referenced_class.schema ,\n referenced_class.kind\n from relation\n join class as referenced_class on relation.class=referenced_class.id\n where referenced_class.kind in ('r', 'v', 'm')\n ),\n relationships as (\n select\n referenced.name as referenced_name,\n referenced.schema as referenced_schema_id,\n dependent_class.name as dependent_name,\n dependent_class.schema as dependent_schema_id,\n referenced.kind as kind\n from referenced\n join dependency on referenced.id=dependency.id\n join class as dependent_class on dependency.ref=dependent_class.id\n where\n (referenced.name != dependent_class.name or\n referenced.schema != dependent_class.schema)\n )\n\n select\n referenced_schema.name as referenced_schema,\n relationships.referenced_name as referenced_name,\n dependent_schema.name as dependent_schema,\n relationships.dependent_name as dependent_name\n from relationships\n join schema as dependent_schema on relationships.dependent_schema_id=dependent_schema.id\n join schema as referenced_schema on relationships.referenced_schema_id=referenced_schema.id\n group by referenced_schema, referenced_name, dependent_schema, dependent_name\n order by referenced_schema, referenced_name, dependent_schema, dependent_name;\n\n {%- endcall -%}\n\n {{ return(load_result('relations').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.038083, "supported_languages": null}, "macro.dbt_postgres.postgres_get_relations": {"name": "postgres_get_relations", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations.sql", "original_file_path": "macros/relations.sql", "unique_id": "macro.dbt_postgres.postgres_get_relations", "macro_sql": "{% macro postgres_get_relations() %}\n {{ return(postgres__get_relations()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_relations"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.038173, "supported_languages": null}, "macro.dbt_postgres.postgres__create_table_as": {"name": "postgres__create_table_as", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__create_table_as", "macro_sql": "{% macro postgres__create_table_as(temporary, relation, sql) -%}\n {%- set unlogged = config.get('unlogged', default=false) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {{ sql_header if sql_header is not none }}\n\n create {% if temporary -%}\n temporary\n {%- elif unlogged -%}\n unlogged\n {%- endif %} table {{ relation }}\n {% set contract_config = config.get('contract') %}\n {% if contract_config.enforced %}\n {{ get_assert_columns_equivalent(sql) }}\n {% endif -%}\n {% if contract_config.enforced and (not temporary) -%}\n {{ get_table_columns_and_constraints() }} ;\n insert into {{ relation }} (\n {{ adapter.dispatch('get_column_names', 'dbt')() }}\n )\n {%- set sql = get_select_subquery(sql) %}\n {% else %}\n as\n {% endif %}\n (\n {{ sql }}\n );\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_assert_columns_equivalent", "macro.dbt.get_table_columns_and_constraints", "macro.dbt.default__get_column_names", "macro.dbt.get_select_subquery"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.045192, "supported_languages": null}, "macro.dbt_postgres.postgres__get_create_index_sql": {"name": "postgres__get_create_index_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_create_index_sql", "macro_sql": "{% macro postgres__get_create_index_sql(relation, index_dict) -%}\n {%- set index_config = adapter.parse_index(index_dict) -%}\n {%- set comma_separated_columns = \", \".join(index_config.columns) -%}\n {%- set index_name = index_config.render(relation) -%}\n\n create {% if index_config.unique -%}\n unique\n {%- endif %} index if not exists\n \"{{ index_name }}\"\n on {{ relation }} {% if index_config.type -%}\n using {{ index_config.type }}\n {%- endif %}\n ({{ comma_separated_columns }})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.045526, "supported_languages": null}, "macro.dbt_postgres.postgres__create_schema": {"name": "postgres__create_schema", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__create_schema", "macro_sql": "{% macro postgres__create_schema(relation) -%}\n {% if relation.database -%}\n {{ adapter.verify_database(relation.database) }}\n {%- endif -%}\n {%- call statement('create_schema') -%}\n create schema if not exists {{ relation.without_identifier().include(database=False) }}\n {%- endcall -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.045741, "supported_languages": null}, "macro.dbt_postgres.postgres__drop_schema": {"name": "postgres__drop_schema", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__drop_schema", "macro_sql": "{% macro postgres__drop_schema(relation) -%}\n {% if relation.database -%}\n {{ adapter.verify_database(relation.database) }}\n {%- endif -%}\n {%- call statement('drop_schema') -%}\n drop schema if exists {{ relation.without_identifier().include(database=False) }} cascade\n {%- endcall -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.045959, "supported_languages": null}, "macro.dbt_postgres.postgres__get_columns_in_relation": {"name": "postgres__get_columns_in_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_columns_in_relation", "macro_sql": "{% macro postgres__get_columns_in_relation(relation) -%}\n {% call statement('get_columns_in_relation', fetch_result=True) %}\n select\n column_name,\n data_type,\n character_maximum_length,\n numeric_precision,\n numeric_scale\n\n from {{ relation.information_schema('columns') }}\n where table_name = '{{ relation.identifier }}'\n {% if relation.schema %}\n and table_schema = '{{ relation.schema }}'\n {% endif %}\n order by ordinal_position\n\n {% endcall %}\n {% set table = load_result('get_columns_in_relation').table %}\n {{ return(sql_convert_columns_in_relation(table)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.sql_convert_columns_in_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.04627, "supported_languages": null}, "macro.dbt_postgres.postgres__list_relations_without_caching": {"name": "postgres__list_relations_without_caching", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__list_relations_without_caching", "macro_sql": "{% macro postgres__list_relations_without_caching(schema_relation) %}\n {% call statement('list_relations_without_caching', fetch_result=True) -%}\n select\n '{{ schema_relation.database }}' as database,\n tablename as name,\n schemaname as schema,\n 'table' as type\n from pg_tables\n where schemaname ilike '{{ schema_relation.schema }}'\n union all\n select\n '{{ schema_relation.database }}' as database,\n viewname as name,\n schemaname as schema,\n 'view' as type\n from pg_views\n where schemaname ilike '{{ schema_relation.schema }}'\n union all\n select\n '{{ schema_relation.database }}' as database,\n matviewname as name,\n schemaname as schema,\n 'materialized_view' as type\n from pg_matviews\n where schemaname ilike '{{ schema_relation.schema }}'\n {% endcall %}\n {{ return(load_result('list_relations_without_caching').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.046558, "supported_languages": null}, "macro.dbt_postgres.postgres__information_schema_name": {"name": "postgres__information_schema_name", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__information_schema_name", "macro_sql": "{% macro postgres__information_schema_name(database) -%}\n {% if database_name -%}\n {{ adapter.verify_database(database_name) }}\n {%- endif -%}\n information_schema\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.046676, "supported_languages": null}, "macro.dbt_postgres.postgres__list_schemas": {"name": "postgres__list_schemas", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__list_schemas", "macro_sql": "{% macro postgres__list_schemas(database) %}\n {% if database -%}\n {{ adapter.verify_database(database) }}\n {%- endif -%}\n {% call statement('list_schemas', fetch_result=True, auto_begin=False) %}\n select distinct nspname from pg_namespace\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0468988, "supported_languages": null}, "macro.dbt_postgres.postgres__check_schema_exists": {"name": "postgres__check_schema_exists", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__check_schema_exists", "macro_sql": "{% macro postgres__check_schema_exists(information_schema, schema) -%}\n {% if information_schema.database -%}\n {{ adapter.verify_database(information_schema.database) }}\n {%- endif -%}\n {% call statement('check_schema_exists', fetch_result=True, auto_begin=False) %}\n select count(*) from pg_namespace where nspname = '{{ schema }}'\n {% endcall %}\n {{ return(load_result('check_schema_exists').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.047148, "supported_languages": null}, "macro.dbt_postgres.postgres__make_relation_with_suffix": {"name": "postgres__make_relation_with_suffix", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_relation_with_suffix", "macro_sql": "{% macro postgres__make_relation_with_suffix(base_relation, suffix, dstring) %}\n {% if dstring %}\n {% set dt = modules.datetime.datetime.now() %}\n {% set dtstring = dt.strftime(\"%H%M%S%f\") %}\n {% set suffix = suffix ~ dtstring %}\n {% endif %}\n {% set suffix_length = suffix|length %}\n {% set relation_max_name_length = base_relation.relation_max_name_length() %}\n {% if suffix_length > relation_max_name_length %}\n {% do exceptions.raise_compiler_error('Relation suffix is too long (' ~ suffix_length ~ ' characters). Maximum length is ' ~ relation_max_name_length ~ ' characters.') %}\n {% endif %}\n {% set identifier = base_relation.identifier[:relation_max_name_length - suffix_length] ~ suffix %}\n\n {{ return(base_relation.incorporate(path={\"identifier\": identifier })) }}\n\n {% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0477, "supported_languages": null}, "macro.dbt_postgres.postgres__make_intermediate_relation": {"name": "postgres__make_intermediate_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_intermediate_relation", "macro_sql": "{% macro postgres__make_intermediate_relation(base_relation, suffix) %}\n {{ return(postgres__make_relation_with_suffix(base_relation, suffix, dstring=False)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_relation_with_suffix"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.047832, "supported_languages": null}, "macro.dbt_postgres.postgres__make_temp_relation": {"name": "postgres__make_temp_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_temp_relation", "macro_sql": "{% macro postgres__make_temp_relation(base_relation, suffix) %}\n {% set temp_relation = postgres__make_relation_with_suffix(base_relation, suffix, dstring=True) %}\n {{ return(temp_relation.incorporate(path={\"schema\": none,\n \"database\": none})) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_relation_with_suffix"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.048047, "supported_languages": null}, "macro.dbt_postgres.postgres__make_backup_relation": {"name": "postgres__make_backup_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_backup_relation", "macro_sql": "{% macro postgres__make_backup_relation(base_relation, backup_relation_type, suffix) %}\n {% set backup_relation = postgres__make_relation_with_suffix(base_relation, suffix, dstring=False) %}\n {{ return(backup_relation.incorporate(type=backup_relation_type)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_relation_with_suffix"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.048228, "supported_languages": null}, "macro.dbt_postgres.postgres_escape_comment": {"name": "postgres_escape_comment", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres_escape_comment", "macro_sql": "{% macro postgres_escape_comment(comment) -%}\n {% if comment is not string %}\n {% do exceptions.raise_compiler_error('cannot escape a non-string: ' ~ comment) %}\n {% endif %}\n {%- set magic = '$dbt_comment_literal_block$' -%}\n {%- if magic in comment -%}\n {%- do exceptions.raise_compiler_error('The string ' ~ magic ~ ' is not allowed in comments.') -%}\n {%- endif -%}\n {{ magic }}{{ comment }}{{ magic }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.048515, "supported_languages": null}, "macro.dbt_postgres.postgres__alter_relation_comment": {"name": "postgres__alter_relation_comment", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__alter_relation_comment", "macro_sql": "{% macro postgres__alter_relation_comment(relation, comment) %}\n {% set escaped_comment = postgres_escape_comment(comment) %}\n comment on {{ relation.type }} {{ relation }} is {{ escaped_comment }};\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres_escape_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.048667, "supported_languages": null}, "macro.dbt_postgres.postgres__alter_column_comment": {"name": "postgres__alter_column_comment", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__alter_column_comment", "macro_sql": "{% macro postgres__alter_column_comment(relation, column_dict) %}\n {% set existing_columns = adapter.get_columns_in_relation(relation) | map(attribute=\"name\") | list %}\n {% for column_name in column_dict if (column_name in existing_columns) %}\n {% set comment = column_dict[column_name]['description'] %}\n {% set escaped_comment = postgres_escape_comment(comment) %}\n comment on column {{ relation }}.{{ adapter.quote(column_name) if column_dict[column_name]['quote'] else column_name }} is {{ escaped_comment }};\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres_escape_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.049053, "supported_languages": null}, "macro.dbt_postgres.postgres__get_show_grant_sql": {"name": "postgres__get_show_grant_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_show_grant_sql", "macro_sql": "\n\n{%- macro postgres__get_show_grant_sql(relation) -%}\n select grantee, privilege_type\n from {{ relation.information_schema('role_table_grants') }}\n where grantor = current_role\n and grantee != current_role\n and table_schema = '{{ relation.schema }}'\n and table_name = '{{ relation.identifier }}'\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.049193, "supported_languages": null}, "macro.dbt_postgres.postgres__copy_grants": {"name": "postgres__copy_grants", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__copy_grants", "macro_sql": "{% macro postgres__copy_grants() %}\n {{ return(False) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.049271, "supported_languages": null}, "macro.dbt_postgres.postgres__get_show_indexes_sql": {"name": "postgres__get_show_indexes_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_show_indexes_sql", "macro_sql": "{% macro postgres__get_show_indexes_sql(relation) %}\n select\n i.relname as name,\n m.amname as method,\n ix.indisunique as \"unique\",\n array_to_string(array_agg(a.attname), ',') as column_names\n from pg_index ix\n join pg_class i\n on i.oid = ix.indexrelid\n join pg_am m\n on m.oid=i.relam\n join pg_class t\n on t.oid = ix.indrelid\n join pg_namespace n\n on n.oid = t.relnamespace\n join pg_attribute a\n on a.attrelid = t.oid\n and a.attnum = ANY(ix.indkey)\n where t.relname = '{{ relation.identifier }}'\n and n.nspname = '{{ relation.schema }}'\n and t.relkind in ('r', 'm')\n group by 1, 2, 3\n order by 1, 2, 3\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.049398, "supported_languages": null}, "macro.dbt_postgres.postgres__get_drop_index_sql": {"name": "postgres__get_drop_index_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_drop_index_sql", "macro_sql": "\n\n\n{%- macro postgres__get_drop_index_sql(relation, index_name) -%}\n drop index if exists \"{{ relation.schema }}\".\"{{ index_name }}\"\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.049498, "supported_languages": null}, "macro.dbt_postgres.postgres__get_incremental_default_sql": {"name": "postgres__get_incremental_default_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/incremental_strategies.sql", "original_file_path": "macros/materializations/incremental_strategies.sql", "unique_id": "macro.dbt_postgres.postgres__get_incremental_default_sql", "macro_sql": "{% macro postgres__get_incremental_default_sql(arg_dict) %}\n\n {% if arg_dict[\"unique_key\"] %}\n {% do return(get_incremental_delete_insert_sql(arg_dict)) %}\n {% else %}\n {% do return(get_incremental_append_sql(arg_dict)) %}\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_incremental_delete_insert_sql", "macro.dbt.get_incremental_append_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.049758, "supported_languages": null}, "macro.dbt_postgres.postgres__snapshot_merge_sql": {"name": "postgres__snapshot_merge_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/snapshot_merge.sql", "original_file_path": "macros/materializations/snapshot_merge.sql", "unique_id": "macro.dbt_postgres.postgres__snapshot_merge_sql", "macro_sql": "{% macro postgres__snapshot_merge_sql(target, source, insert_cols) -%}\n {%- set insert_cols_csv = insert_cols | join(', ') -%}\n\n update {{ target }}\n set dbt_valid_to = DBT_INTERNAL_SOURCE.dbt_valid_to\n from {{ source }} as DBT_INTERNAL_SOURCE\n where DBT_INTERNAL_SOURCE.dbt_scd_id::text = {{ target }}.dbt_scd_id::text\n and DBT_INTERNAL_SOURCE.dbt_change_type::text in ('update'::text, 'delete'::text)\n and {{ target }}.dbt_valid_to is null;\n\n insert into {{ target }} ({{ insert_cols_csv }})\n select {% for column in insert_cols -%}\n DBT_INTERNAL_SOURCE.{{ column }} {%- if not loop.last %}, {%- endif %}\n {%- endfor %}\n from {{ source }} as DBT_INTERNAL_SOURCE\n where DBT_INTERNAL_SOURCE.dbt_change_type::text = 'insert'::text;\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0502982, "supported_languages": null}, "macro.dbt_postgres.postgres__drop_materialized_view": {"name": "postgres__drop_materialized_view", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/drop.sql", "original_file_path": "macros/relations/materialized_view/drop.sql", "unique_id": "macro.dbt_postgres.postgres__drop_materialized_view", "macro_sql": "{% macro postgres__drop_materialized_view(relation) -%}\n drop materialized view if exists {{ relation }} cascade\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.050405, "supported_languages": null}, "macro.dbt_postgres.postgres__describe_materialized_view": {"name": "postgres__describe_materialized_view", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/describe.sql", "original_file_path": "macros/relations/materialized_view/describe.sql", "unique_id": "macro.dbt_postgres.postgres__describe_materialized_view", "macro_sql": "{% macro postgres__describe_materialized_view(relation) %}\n -- for now just get the indexes, we don't need the name or the query yet\n {% set _indexes = run_query(get_show_indexes_sql(relation)) %}\n {% do return({'indexes': _indexes}) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query", "macro.dbt.get_show_indexes_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.050606, "supported_languages": null}, "macro.dbt_postgres.postgres__refresh_materialized_view": {"name": "postgres__refresh_materialized_view", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/refresh.sql", "original_file_path": "macros/relations/materialized_view/refresh.sql", "unique_id": "macro.dbt_postgres.postgres__refresh_materialized_view", "macro_sql": "{% macro postgres__refresh_materialized_view(relation) %}\n refresh materialized view {{ relation }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.050706, "supported_languages": null}, "macro.dbt_postgres.postgres__get_rename_materialized_view_sql": {"name": "postgres__get_rename_materialized_view_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/rename.sql", "original_file_path": "macros/relations/materialized_view/rename.sql", "unique_id": "macro.dbt_postgres.postgres__get_rename_materialized_view_sql", "macro_sql": "{% macro postgres__get_rename_materialized_view_sql(relation, new_name) %}\n alter materialized view {{ relation }} rename to {{ new_name }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.050826, "supported_languages": null}, "macro.dbt_postgres.postgres__get_alter_materialized_view_as_sql": {"name": "postgres__get_alter_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/alter.sql", "original_file_path": "macros/relations/materialized_view/alter.sql", "unique_id": "macro.dbt_postgres.postgres__get_alter_materialized_view_as_sql", "macro_sql": "{% macro postgres__get_alter_materialized_view_as_sql(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n) %}\n\n -- apply a full refresh immediately if needed\n {% if configuration_changes.requires_full_refresh %}\n\n {{ get_replace_sql(existing_relation, relation, sql) }}\n\n -- otherwise apply individual changes as needed\n {% else %}\n\n {{ postgres__update_indexes_on_materialized_view(relation, configuration_changes.indexes) }}\n\n {%- endif -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_replace_sql", "macro.dbt_postgres.postgres__update_indexes_on_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.051483, "supported_languages": null}, "macro.dbt_postgres.postgres__update_indexes_on_materialized_view": {"name": "postgres__update_indexes_on_materialized_view", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/alter.sql", "original_file_path": "macros/relations/materialized_view/alter.sql", "unique_id": "macro.dbt_postgres.postgres__update_indexes_on_materialized_view", "macro_sql": "\n\n\n{%- macro postgres__update_indexes_on_materialized_view(relation, index_changes) -%}\n {{- log(\"Applying UPDATE INDEXES to: \" ~ relation) -}}\n\n {%- for _index_change in index_changes -%}\n {%- set _index = _index_change.context -%}\n\n {%- if _index_change.action == \"drop\" -%}\n\n {{ postgres__get_drop_index_sql(relation, _index.name) }}\n\n {%- elif _index_change.action == \"create\" -%}\n\n {{ postgres__get_create_index_sql(relation, _index.as_node_config) }}\n\n {%- endif -%}\n\t{{ ';' if not loop.last else \"\" }}\n\n {%- endfor -%}\n\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_drop_index_sql", "macro.dbt_postgres.postgres__get_create_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0519161, "supported_languages": null}, "macro.dbt_postgres.postgres__get_materialized_view_configuration_changes": {"name": "postgres__get_materialized_view_configuration_changes", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/alter.sql", "original_file_path": "macros/relations/materialized_view/alter.sql", "unique_id": "macro.dbt_postgres.postgres__get_materialized_view_configuration_changes", "macro_sql": "{% macro postgres__get_materialized_view_configuration_changes(existing_relation, new_config) %}\n {% set _existing_materialized_view = postgres__describe_materialized_view(existing_relation) %}\n {% set _configuration_changes = existing_relation.get_materialized_view_config_change_collection(_existing_materialized_view, new_config.model) %}\n {% do return(_configuration_changes) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__describe_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.052115, "supported_languages": null}, "macro.dbt_postgres.postgres__get_create_materialized_view_as_sql": {"name": "postgres__get_create_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/create.sql", "original_file_path": "macros/relations/materialized_view/create.sql", "unique_id": "macro.dbt_postgres.postgres__get_create_materialized_view_as_sql", "macro_sql": "{% macro postgres__get_create_materialized_view_as_sql(relation, sql) %}\n create materialized view if not exists {{ relation }} as {{ sql }};\n\n {% for _index_dict in config.get('indexes', []) -%}\n {{- get_create_index_sql(relation, _index_dict) -}}{{ ';' if not loop.last else \"\" }}\n {%- endfor -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_create_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.052416, "supported_languages": null}, "macro.dbt_postgres.postgres__drop_table": {"name": "postgres__drop_table", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/table/drop.sql", "original_file_path": "macros/relations/table/drop.sql", "unique_id": "macro.dbt_postgres.postgres__drop_table", "macro_sql": "{% macro postgres__drop_table(relation) -%}\n drop table if exists {{ relation }} cascade\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.052514, "supported_languages": null}, "macro.dbt_postgres.postgres__get_replace_table_sql": {"name": "postgres__get_replace_table_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/table/replace.sql", "original_file_path": "macros/relations/table/replace.sql", "unique_id": "macro.dbt_postgres.postgres__get_replace_table_sql", "macro_sql": "{% macro postgres__get_replace_table_sql(relation, sql) -%}\n\n {%- set sql_header = config.get('sql_header', none) -%}\n {{ sql_header if sql_header is not none }}\n\n create or replace table {{ relation }}\n {% set contract_config = config.get('contract') %}\n {% if contract_config.enforced %}\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\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.052979, "supported_languages": null}, "macro.dbt_postgres.postgres__get_rename_table_sql": {"name": "postgres__get_rename_table_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/table/rename.sql", "original_file_path": "macros/relations/table/rename.sql", "unique_id": "macro.dbt_postgres.postgres__get_rename_table_sql", "macro_sql": "{% macro postgres__get_rename_table_sql(relation, new_name) %}\n alter table {{ relation }} rename to {{ new_name }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0531, "supported_languages": null}, "macro.dbt_postgres.postgres__drop_view": {"name": "postgres__drop_view", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/view/drop.sql", "original_file_path": "macros/relations/view/drop.sql", "unique_id": "macro.dbt_postgres.postgres__drop_view", "macro_sql": "{% macro postgres__drop_view(relation) -%}\n drop view if exists {{ relation }} cascade\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.05319, "supported_languages": null}, "macro.dbt_postgres.postgres__get_replace_view_sql": {"name": "postgres__get_replace_view_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/view/replace.sql", "original_file_path": "macros/relations/view/replace.sql", "unique_id": "macro.dbt_postgres.postgres__get_replace_view_sql", "macro_sql": "{% macro postgres__get_replace_view_sql(relation, sql) -%}\n\n {%- set sql_header = config.get('sql_header', none) -%}\n {{ sql_header if sql_header is not none }}\n\n create or replace view {{ relation }}\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\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_assert_columns_equivalent"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0535629, "supported_languages": null}, "macro.dbt_postgres.postgres__get_rename_view_sql": {"name": "postgres__get_rename_view_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/view/rename.sql", "original_file_path": "macros/relations/view/rename.sql", "unique_id": "macro.dbt_postgres.postgres__get_rename_view_sql", "macro_sql": "{% macro postgres__get_rename_view_sql(relation, new_name) %}\n alter view {{ relation }} rename to {{ new_name }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0536819, "supported_languages": null}, "macro.dbt_postgres.postgres__dateadd": {"name": "postgres__dateadd", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/dateadd.sql", "original_file_path": "macros/utils/dateadd.sql", "unique_id": "macro.dbt_postgres.postgres__dateadd", "macro_sql": "{% macro postgres__dateadd(datepart, interval, from_date_or_timestamp) %}\n\n {{ from_date_or_timestamp }} + ((interval '1 {{ datepart }}') * ({{ interval }}))\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.053824, "supported_languages": null}, "macro.dbt_postgres.postgres__listagg": {"name": "postgres__listagg", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/listagg.sql", "original_file_path": "macros/utils/listagg.sql", "unique_id": "macro.dbt_postgres.postgres__listagg", "macro_sql": "{% macro postgres__listagg(measure, delimiter_text, order_by_clause, limit_num) -%}\n\n {% if limit_num -%}\n array_to_string(\n (array_agg(\n {{ measure }}\n {% if order_by_clause -%}\n {{ order_by_clause }}\n {%- endif %}\n ))[1:{{ limit_num }}],\n {{ delimiter_text }}\n )\n {%- else %}\n string_agg(\n {{ measure }},\n {{ delimiter_text }}\n {% if order_by_clause -%}\n {{ order_by_clause }}\n {%- endif %}\n )\n {%- endif %}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.054253, "supported_languages": null}, "macro.dbt_postgres.postgres__datediff": {"name": "postgres__datediff", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/datediff.sql", "original_file_path": "macros/utils/datediff.sql", "unique_id": "macro.dbt_postgres.postgres__datediff", "macro_sql": "{% macro postgres__datediff(first_date, second_date, datepart) -%}\n\n {% if datepart == 'year' %}\n (date_part('year', ({{second_date}})::date) - date_part('year', ({{first_date}})::date))\n {% elif datepart == 'quarter' %}\n ({{ datediff(first_date, second_date, 'year') }} * 4 + date_part('quarter', ({{second_date}})::date) - date_part('quarter', ({{first_date}})::date))\n {% elif datepart == 'month' %}\n ({{ datediff(first_date, second_date, 'year') }} * 12 + date_part('month', ({{second_date}})::date) - date_part('month', ({{first_date}})::date))\n {% elif datepart == 'day' %}\n (({{second_date}})::date - ({{first_date}})::date)\n {% elif datepart == 'week' %}\n ({{ datediff(first_date, second_date, 'day') }} / 7 + case\n when date_part('dow', ({{first_date}})::timestamp) <= date_part('dow', ({{second_date}})::timestamp) then\n case when {{first_date}} <= {{second_date}} then 0 else -1 end\n else\n case when {{first_date}} <= {{second_date}} then 1 else 0 end\n end)\n {% elif datepart == 'hour' %}\n ({{ datediff(first_date, second_date, 'day') }} * 24 + date_part('hour', ({{second_date}})::timestamp) - date_part('hour', ({{first_date}})::timestamp))\n {% elif datepart == 'minute' %}\n ({{ datediff(first_date, second_date, 'hour') }} * 60 + date_part('minute', ({{second_date}})::timestamp) - date_part('minute', ({{first_date}})::timestamp))\n {% elif datepart == 'second' %}\n ({{ datediff(first_date, second_date, 'minute') }} * 60 + floor(date_part('second', ({{second_date}})::timestamp)) - floor(date_part('second', ({{first_date}})::timestamp)))\n {% elif datepart == 'millisecond' %}\n ({{ datediff(first_date, second_date, 'minute') }} * 60000 + floor(date_part('millisecond', ({{second_date}})::timestamp)) - floor(date_part('millisecond', ({{first_date}})::timestamp)))\n {% elif datepart == 'microsecond' %}\n ({{ datediff(first_date, second_date, 'minute') }} * 60000000 + floor(date_part('microsecond', ({{second_date}})::timestamp)) - floor(date_part('microsecond', ({{first_date}})::timestamp)))\n {% else %}\n {{ exceptions.raise_compiler_error(\"Unsupported datepart for macro datediff in postgres: {!r}\".format(datepart)) }}\n {% endif %}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.datediff"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.05651, "supported_languages": null}, "macro.dbt_postgres.postgres__any_value": {"name": "postgres__any_value", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/any_value.sql", "original_file_path": "macros/utils/any_value.sql", "unique_id": "macro.dbt_postgres.postgres__any_value", "macro_sql": "{% macro postgres__any_value(expression) -%}\n\n min({{ expression }})\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0566158, "supported_languages": null}, "macro.dbt_postgres.postgres__last_day": {"name": "postgres__last_day", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/last_day.sql", "original_file_path": "macros/utils/last_day.sql", "unique_id": "macro.dbt_postgres.postgres__last_day", "macro_sql": "{% macro postgres__last_day(date, datepart) -%}\n\n {%- if datepart == 'quarter' -%}\n -- postgres dateadd does not support quarter interval.\n cast(\n {{dbt.dateadd('day', '-1',\n dbt.dateadd('month', '3', dbt.date_trunc(datepart, date))\n )}}\n as date)\n {%- else -%}\n {{dbt.default_last_day(date, datepart)}}\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.dateadd", "macro.dbt.date_trunc", "macro.dbt.default_last_day"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.056951, "supported_languages": null}, "macro.dbt_postgres.postgres__split_part": {"name": "postgres__split_part", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/split_part.sql", "original_file_path": "macros/utils/split_part.sql", "unique_id": "macro.dbt_postgres.postgres__split_part", "macro_sql": "{% macro postgres__split_part(string_text, delimiter_text, part_number) %}\n\n {% if part_number >= 0 %}\n {{ dbt.default__split_part(string_text, delimiter_text, part_number) }}\n {% else %}\n {{ dbt._split_part_negative(string_text, delimiter_text, part_number) }}\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__split_part", "macro.dbt._split_part_negative"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.057227, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0579782, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.05811, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.058208, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.058305, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.058399, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.058669, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.058868, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0590641, "supported_languages": null}, "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_postgres.postgres__snapshot_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.059493, "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 and DBT_INTERNAL_DEST.{{ columns.dbt_valid_to }} is null\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"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.059835, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.062251, "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.default__snapshot_hash_arguments"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.062366, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0625181, "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 invalidate_hard_deletes = config.get('invalidate_hard_deletes') or false %}\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_id_expr = snapshot_hash_arguments([primary_key, updated_at]) %}\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 }) %}\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.063083, "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_postgres.postgres__snapshot_string_as_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.063197, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.063315, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.064239, "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 invalidate_hard_deletes = config.get('invalidate_hard_deletes') or false %}\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_id_expr = snapshot_hash_arguments([primary_key, updated_at]) %}\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 }) %}\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.06511, "supported_languages": null}, "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.default__create_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.070294, "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 \"{{ column.name }}\" {{ column.data_type }};\n {% endcall %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.070494, "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.default__post_snapshot"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.070608, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.070673, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.07077, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.070849, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.070983, "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'}) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0711339, "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\n with snapshot_query as (\n\n {{ source_sql }}\n\n ),\n\n snapshotted_data as (\n\n select *,\n {{ strategy.unique_key }} as dbt_unique_key\n\n from {{ target_relation }}\n where {{ columns.dbt_valid_to }} is null\n\n ),\n\n insertions_source_data as (\n\n select\n *,\n {{ strategy.unique_key }} as dbt_unique_key,\n {{ strategy.updated_at }} as {{ columns.dbt_updated_at }},\n {{ strategy.updated_at }} as {{ columns.dbt_valid_from }},\n nullif({{ strategy.updated_at }}, {{ strategy.updated_at }}) as {{ columns.dbt_valid_to }},\n {{ strategy.scd_id }} as {{ columns.dbt_scd_id }}\n\n from snapshot_query\n ),\n\n updates_source_data as (\n\n select\n *,\n {{ strategy.unique_key }} as dbt_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.invalidate_hard_deletes %}\n\n deletes_source_data as (\n\n select\n *,\n {{ strategy.unique_key }} as dbt_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\n from insertions_source_data as source_data\n left outer join snapshotted_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key\n where snapshotted_data.dbt_unique_key is null\n or (\n snapshotted_data.dbt_unique_key is not null\n and (\n {{ strategy.row_changed }}\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\n from updates_source_data as source_data\n join snapshotted_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key\n where (\n {{ strategy.row_changed }}\n )\n )\n\n {%- if strategy.invalidate_hard_deletes -%}\n ,\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\n from snapshotted_data\n left join deletes_source_data as source_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key\n where source_data.dbt_unique_key is null\n )\n {%- endif %}\n\n select * from insertions\n union all\n select * from updates\n {%- if strategy.invalidate_hard_deletes %}\n union all\n select * from deletes\n {%- endif %}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_snapshot_table_column_names", "macro.dbt.snapshot_get_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.071987, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.072117, "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 nullif({{ strategy.updated_at }}, {{ strategy.updated_at }}) as {{ columns.dbt_valid_to }}\n from (\n {{ sql }}\n ) sbq\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_snapshot_table_column_names"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.072402, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.072673, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.073063, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0733492, "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.valid_snapshot_target(target_relation, columns) }}\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 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\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0772219, "supported_languages": ["sql"]}, "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\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 {{ get_create_sql(target_relation, sql) }}\n {% endcall %}\n\n {% do relations.append(target_relation) %}\n\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 %}\n\n {% endif %}\n\n {% set limit = config.get('limit') %}\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 {{ get_test_sql(main_sql, fail_calc, warn_if, error_if, limit)}}\n\n {%- endcall %}\n\n {{ return({'relations': relations}) }}\n\n{%- endmaterialization -%}", "depends_on": {"macros": ["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}, "patch_path": null, "arguments": [], "created_at": 1727441769.079092, "supported_languages": ["sql"]}, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.079943, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.080147, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0802839, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.080682, "supported_languages": null}, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.080945, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0811899, "supported_languages": null}, "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\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 {%- for column in columns_in_relation -%}\n {%- do column_name_to_data_types.update({column.name|lower: column.data_type}) -%}\n {%- endfor -%}\n\n {% if not expected_sql %}\n {% set expected_sql = get_expected_sql(expected_rows, column_name_to_data_types) %}\n {% endif %}\n {% set unit_test_sql = get_unit_test_sql(sql, expected_sql, tested_expected_column_names) %}\n\n {% call statement('main', fetch_result=True) -%}\n\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.082382, "supported_languages": ["sql"]}, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.086219, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0864892, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.086659, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.087571, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.087734, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0881732, "supported_languages": null}, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0903091, "supported_languages": ["sql"]}, "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 -- 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 {% do create_indexes(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}, "patch_path": null, "arguments": [], "created_at": 1727441769.092577, "supported_languages": ["sql"]}, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.093944, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.094354, "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\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.data_type != tc.data_type and not sc.can_expand_to(other_column=tc) %}\n {{ result.append( { 'column_name': tc.name, 'new_type': sc.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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0948532, "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.default__get_merge_update_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0950332, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.09555, "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.default__get_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1008892, "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 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 {% 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"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.102219, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.102423, "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 sequence and unique_key is not string %}\n delete from {{target }}\n using {{ source }}\n where (\n {% for key in unique_key %}\n {{ source }}.{{ key }} = {{ target }}.{{ key }}\n {{ \"and \" if not loop.last}}\n {% endfor %}\n {% if incremental_predicates %}\n {% for predicate in incremental_predicates %}\n and {{ predicate }}\n {% endfor %}\n {% endif %}\n );\n {% else %}\n delete from {{ target }}\n where (\n {{ unique_key }}) in (\n select ({{ unique_key }})\n from {{ source }}\n )\n {%- if incremental_predicates %}\n {% for predicate in incremental_predicates %}\n and {{ predicate }}\n {% endfor %}\n {%- endif -%};\n\n {% endif %}\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.103143, "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.default__get_insert_overwrite_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.103339, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.103812, "supported_languages": null}, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1043022, "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.default__get_incremental_append_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1052082, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.105377, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.105511, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.105723, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1058571, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1060731, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.106209, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.106393, "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_postgres.postgres__get_incremental_default_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.106527, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.106642, "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.default__get_incremental_microbatch_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1067789, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.106899, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.107098, "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 {% if existing_relation is none %}\n {% set build_sql = get_create_table_as_sql(False, target_relation, sql) %}\n {% elif full_refresh_mode %}\n {% set build_sql = get_create_table_as_sql(False, intermediate_relation, sql) %}\n {% set need_swap = true %}\n {% else %}\n {% do run_query(get_create_table_as_sql(True, temp_relation, sql)) %}\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_strategy = config.get('incremental_strategy') or 'default' %}\n {% set incremental_predicates = config.get('predicates', none) or config.get('incremental_predicates', none) %}\n {% set strategy_sql_macro_func = adapter.get_incremental_strategy_macro(context, incremental_strategy) %}\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 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 {% if existing_relation is none or existing_relation.is_view or should_full_refresh() %}\n {% do create_indexes(target_relation) %}\n {% endif %}\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.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs", "macro.dbt.create_indexes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.11126, "supported_languages": ["sql"]}, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.116114, "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\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1170392, "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\n {%- set add_to_target_arr = schema_changes_dict['source_not_in_target'] -%}\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 {%- 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 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.117929, "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\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.118863, "supported_languages": null}, "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.default__can_clone_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.119065, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.119154, "supported_languages": null}, "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.default__create_or_replace_clone"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.119379, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.119502, "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\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 {% call statement('main') %}\n {% if target_relation and defer_relation and target_relation == defer_relation %}\n {{ log(\"Target relation and defer relation are the same, skipping clone for relation: \" ~ target_relation.render()) }}\n {% else %}\n {{ create_or_replace_clone(target_relation, defer_relation) }}\n {% endif %}\n\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\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1225102, "supported_languages": ["sql"]}, "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 = 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 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1256802, "supported_languages": ["sql"]}, "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.default__create_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1302888, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.130927, "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.default__reset_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1311, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1314409, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.131575, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.131676, "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.default__get_binding_char"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.131775, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.131855, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.131974, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1320598, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.132385, "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.default__load_csv_rows"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1325161, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1334789, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1338198, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.134089, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.134497, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.134696, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.134898, "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.default__generate_database_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.135187, "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 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.135364, "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.default__get_drop_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.135922, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1361978, "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.default__drop_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.136318, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.13645, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.136582, "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.default__get_replace_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.137196, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.138027, "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.default__get_create_intermediate_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.138316, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.138488, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.138679, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.138825, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1390479, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.139188, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.139723, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.140023, "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.default__rename_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.140168, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.140374, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1406238, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.140898, "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.default__get_create_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1412501, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.141564, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.141809, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1419609, "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_postgres.postgres__drop_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.142148, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.142237, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1424372, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1425438, "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_postgres.postgres__refresh_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.142771, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.142868, "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_postgres.postgres__get_rename_materialized_view_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.143067, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1431732, "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_postgres.postgres__get_alter_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1436439, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.143786, "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_postgres.postgres__get_materialized_view_configuration_changes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1439848, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1440861, "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_postgres.postgres__get_create_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.144285, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.144393, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1451368, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1452181, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1455731, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.145687, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.14578, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.146701, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1469598, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.147189, "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_postgres.postgres__drop_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1473632, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.147447, "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_postgres.postgres__get_replace_table_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1476328, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1477299, "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_postgres.postgres__get_rename_table_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.147916, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.148014, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1486359, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.148758, "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_postgres.postgres__create_table_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.149038, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1494882, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1497998, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1499221, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.150039, "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_postgres.postgres__drop_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1502059, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1502872, "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_postgres.postgres__get_replace_view_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.150929, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.151027, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.151754, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.151885, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.152044, "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_postgres.postgres__get_rename_view_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.152228, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.152334, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.152632, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.15274, "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.default__create_view_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1528609, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.153394, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1536472, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.153842, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1540108, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.154407, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1554182, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.155798, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.155988, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1573708, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1581728, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.158667, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1588202, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.158974, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.159028, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.159564, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.159956, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.160107, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1603498, "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.default__date"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.160578, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.160766, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.160991, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.161103, "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.default__concat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.161267, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.161354, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.161976, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.162324, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.162451, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.162796, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.16297, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1630442, "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_postgres.postgres__dateadd"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.163275, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.163386, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.163533, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.163585, "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.default__escape_single_quotes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.163763, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1638558, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.164053, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.164146, "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_postgres.postgres__listagg"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.164588, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1648571, "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_postgres.postgres__datediff"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.165084, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.165194, "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.default__safe_cast"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.165385, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.165479, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.165649, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1657548, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1659222, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1660302, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.166214, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.166303, "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_postgres.postgres__any_value"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.166471, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1665401, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.166732, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1668968, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.16706, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.167128, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.167805, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.167906, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.168013, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.168114, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1682198, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.168326, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1684349, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.168556, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1686668, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.168774, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1688828, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.168981, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.169087, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.169191, "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.default__array_concat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.169388, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.169483, "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.default__bool_or"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.169645, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.169715, "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_postgres.postgres__last_day"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1699462, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1701171, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.170217, "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_postgres.postgres__split_part"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1705852, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1707048, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.17085, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.171123, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.171212, "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.default__array_construct"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1714659, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.171629, "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.default__array_append"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1718159, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.171906, "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_postgres.postgres__create_schema"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.172172, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1722949, "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_postgres.postgres__drop_schema"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.172404, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.172523, "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_postgres.postgres__current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.17302, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.173121, "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_postgres.postgres__snapshot_get_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.173214, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.173284, "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_postgres.postgres__snapshot_get_time", "macro.dbt.get_column_schema_from_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.173562, "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_postgres.postgres__current_timestamp_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.173671, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.173723, "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_postgres.postgres__current_timestamp_in_utc_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1738298, "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_postgres.postgres__current_timestamp_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.173938, "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_postgres.postgres__get_create_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.17456, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1746528, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.174758, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.17502, "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_postgres.postgres__get_drop_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.175144, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.175236, "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_postgres.postgres__get_show_indexes_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.175337, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1754198, "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_postgres.postgres__make_intermediate_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1770308, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.177143, "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 {{ return(adapter.dispatch('make_temp_relation', 'dbt')(base_relation, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_temp_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.177283, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.177471, "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_postgres.postgres__make_backup_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1776361, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1778471, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.177969, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.178095, "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.default__get_or_create_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.178257, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1786282, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.178782, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.178876, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1791658, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.179432, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.179643, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.179788, "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_postgres.postgres__copy_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.181077, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.181155, "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.default__support_multiple_grantees_per_dcl_statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1812658, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.181341, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1815639, "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_postgres.postgres__get_show_grant_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1816828, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.181762, "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.default__get_grant_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.181911, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1820512, "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.default__get_revoke_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.182198, "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 revoke {{ privilege }} on {{ relation.render() }} from {{ grantees | join(', ') }}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.182411, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.182562, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.183003, "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.default__call_dcl_statements"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.183136, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.183302, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.183452, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.184202, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.184484, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.184604, "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 {{ compiled_code }}\n {% if limit is not none %}\n limit {{ limit }}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.184729, "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_postgres.postgres__alter_column_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1852238, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.185338, "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_postgres.postgres__alter_relation_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.185472, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.185584, "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.default__persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.185759, "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 {% do run_query(alter_column_comment(relation, model.columns)) %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query", "macro.dbt.alter_relation_comment", "macro.dbt.alter_column_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1860712, "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_postgres.postgres__get_catalog_relations"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.18868, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.188848, "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_postgres.postgres__get_catalog"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.188981, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.189151, "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_postgres.postgres__information_schema_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1892679, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1893718, "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_postgres.postgres__list_schemas"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.189489, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.189645, "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_postgres.postgres__check_schema_exists"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.189782, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1900558, "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_postgres.postgres__list_relations_without_caching"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.190179, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1902878, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1904051, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.190511, "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_postgres.postgres__get_relations"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.190618, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.190721, "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.default__get_relation_last_modified"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.190855, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.190969, "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_postgres.postgres__get_columns_in_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.192668, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.192776, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.192978, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1931221, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.193259, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.193377, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1941361, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1943629, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.194485, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.194714, "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.default__alter_column_type"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.19486, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.195284, "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.default__alter_relation_add_remove_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1954508, "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.name }} {{ column.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.name }}{{ ',' 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1959722, "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{%- for column in columns_in_relation -%}\n{#-- This needs to be a case-insensitive comparison --#}\n{%- do column_name_to_data_types.update({column.name|lower: column.data_type}) -%}\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 }}{% 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 }}{% 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1985102, "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) %}\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 }}{% 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1988852, "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 {#-- 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.199622, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.199768, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1998348, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.201086, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.201189, "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 {%- 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.201715, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2019808, "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 -%}\nconfig_dict = {{ config_dict }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.202358, "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\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.202678, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.202731, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.203115, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.203281, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.203488, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.203682, "supported_languages": null}, "macro.demo.categorizations_filter": {"name": "categorizations_filter", "resource_type": "macro", "package_name": "demo", "path": "macros/categorizations_filter.sql", "original_file_path": "macros/categorizations_filter.sql", "unique_id": "macro.demo.categorizations_filter", "macro_sql": "{% macro categorizations_filter(type) %}\n SELECT \n array_agg(category_name) AS categories,\n array_agg(child_name) AS sub_categories,\n categorizable_id\n FROM {{ ref(\"categorizations\")}} AS categorizations\n WHERE categorizations.categorizable_type = '{{type}}'\n GROUP BY categorizable_id \n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.203849, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.204094, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.204442, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2047842, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.205207, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2054222, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.205633, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2064488, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.207128, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2077491, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.208544, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2090108, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2092428, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2097611, "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 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\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.dateadd", "macro.dbt.current_timestamp", "macro.dbt.type_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.2103171, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.210624, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.210923, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2113512, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.211664, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2120562, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2123141, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.212785, "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 where {{ column_name }} is not null\n limit 1\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.213299, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.213751, "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 {% set column_list = 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2141702, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.214561, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2147892, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.215064, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.215296, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.215769, "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 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": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.21629, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.216948, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.217531, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2189639, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.221642, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.222019, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.222222, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2248828, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.225888, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2260768, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.226187, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.226481, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.226667, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2267919, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.226961, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.227072, "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{#- 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.227474, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.228043, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.228549, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2289321, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.229085, "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 1) - 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.229323, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.229593, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2299469, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.230162, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.230387, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.23087, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2314198, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.232055, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.232403, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2325299, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.232872, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2333581, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.233906, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2341802, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.234373, "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) -%}\r\n {{ return(adapter.dispatch('star', 'dbt_utils')(from, relation_alias, except, prefix, suffix, quote_identifiers)) }}\r\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__star"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.235275, "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) -%}\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 {%- 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 }} {%- if prefix!='' or suffix!='' %} as {{ adapter.quote(prefix ~ col ~ suffix)|trim }} {%- endif -%}\r\n {%- else -%}\r\n {{ col|trim }} {%- if prefix!='' or suffix!='' %} as {{ (prefix ~ col ~ suffix)|trim }} {%- 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.236195, "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') -%}\n {{ return(adapter.dispatch('unpivot', 'dbt_utils')(relation, cast_to, exclude, remove, field_name, value_name)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__unpivot"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.2371662, "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') -%}\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 select\n {%- for exclude_col in exclude %}\n {{ exclude_col }},\n {%- endfor %}\n\n cast('{{ col.column }}' as {{ dbt.type_string() }}) as {{ field_name }},\n cast( {% if col.data_type == 'boolean' %}\n {{ dbt.cast_bool_to_text(col.column) }}\n {% else %}\n {{ col.column }}\n {% endif %}\n as {{ cast_to }}) as {{ 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2382, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.238401, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.238492, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.240919, "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) }} as {{ dbt.type_string() }}) as {{ source_column_name }},\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.243242, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.243454, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.243621, "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.postgres__deduplicate"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.244294, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2444448, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.244558, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2447019, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.244812, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2449229, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.245039, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.245313, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.245471, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.245739, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2460952, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.246333, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.246551, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.248961, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2491992, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2496362, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2501068, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.250435, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.251244, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.252424, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.253171, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2537138, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2540412, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.254515, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.255081, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.25539, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.255519, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2557921, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2561889, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.256518, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.256937, "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.postgres__get_table_types_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.257324, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.257421, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2575119, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.257608, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.257971, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.258456, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.259287, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.25947, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.259849, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.260374, "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": {"model.demo.stg_matomo_device_type": [{"database": "test_lyon", "schema": "prod", "name": "stg_matomo_device_type", "resource_type": "model", "package_name": "demo", "path": "staging/matomo/stg_matomo_device_type.sql", "original_file_path": "models/staging/matomo/stg_matomo_device_type.sql", "unique_id": "model.demo.stg_matomo_device_type", "fqn": ["demo", "staging", "matomo", "stg_matomo_device_type"], "alias": "stg_matomo_device_type", "checksum": {"name": "sha256", "checksum": "67a75376b53a61b18e2a5c472ea6ad0a00c906e739f7554f002a9db5f72a2b39"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.5478148, "relation_name": "\"test_lyon\".\"prod\".\"stg_matomo_device_type\"", "raw_code": "SELECT\n date,\n nb_actions,\n bounce_count,\n index,\n label,\n sum_visit_length,\n nb_visits_converted,\n max_actions,\n segment,\n nb_visits,\n logo,\n nb_uniq_visitors,\n nb_users\nFROM {{ source('matomo', 'device_type') }}", "language": "sql", "refs": [], "sources": [["matomo", "device_type"]], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.stg_matomo_visits": [{"database": "test_lyon", "schema": "prod", "name": "stg_matomo_visits", "resource_type": "model", "package_name": "demo", "path": "staging/matomo/stg_matomo_visits.sql", "original_file_path": "models/staging/matomo/stg_matomo_visits.sql", "unique_id": "model.demo.stg_matomo_visits", "fqn": ["demo", "staging", "matomo", "stg_matomo_visits"], "alias": "stg_matomo_visits", "checksum": {"name": "sha256", "checksum": "396613d2a5c5ef16a05077c9612a6d4aaa38f9ce6def2620fa04790f0cf58ee2"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.548887, "relation_name": "\"test_lyon\".\"prod\".\"stg_matomo_visits\"", "raw_code": "SELECT\n index,\n date,\n nb_visits,\n nb_uniq_visitors,\n bounce_count,\n bounce_rate,\n bounce_rate_new, \n sum_visit_length, \n nb_visits_new,\n nb_downloads\nFROM {{ source('matomo', 'visits') }}", "language": "sql", "refs": [], "sources": [["matomo", "visits"]], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.stg_matomo_referrers": [{"database": "test_lyon", "schema": "prod", "name": "stg_matomo_referrers", "resource_type": "model", "package_name": "demo", "path": "staging/matomo/stg_matomo_referrers.sql", "original_file_path": "models/staging/matomo/stg_matomo_referrers.sql", "unique_id": "model.demo.stg_matomo_referrers", "fqn": ["demo", "staging", "matomo", "stg_matomo_referrers"], "alias": "stg_matomo_referrers", "checksum": {"name": "sha256", "checksum": "464c69db3e749c3e62ceb37e57ce2ff6e32875590ffe15e94c3279753f87dece"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.549949, "relation_name": "\"test_lyon\".\"prod\".\"stg_matomo_referrers\"", "raw_code": "SELECT \n label, \n nb_uniq_visitors,\n nb_visits,\n nb_actions,\n sum_visit_length,\n bounce_count,\n sub_type, \n date\nFROM {{ source('matomo', 'referrers') }}\nWHERE sub_type IS NOT null", "language": "sql", "refs": [], "sources": [["matomo", "referrers"]], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.stg_matomo_pages": [{"database": "test_lyon", "schema": "prod", "name": "stg_matomo_pages", "resource_type": "model", "package_name": "demo", "path": "staging/matomo/stg_matomo_pages.sql", "original_file_path": "models/staging/matomo/stg_matomo_pages.sql", "unique_id": "model.demo.stg_matomo_pages", "fqn": ["demo", "staging", "matomo", "stg_matomo_pages"], "alias": "stg_matomo_pages", "checksum": {"name": "sha256", "checksum": "571a3524d8d5ba458269fdaf15c012601803777c6e86f4b1ef0cbd7487fb3e10"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.551001, "relation_name": "\"test_lyon\".\"prod\".\"stg_matomo_pages\"", "raw_code": "SELECT \n nb_visits::int, \n nb_uniq_visitors::int,\n nb_hits,\n sum_time_spent,\n coalesce(exit_nb_uniq_visitors::float::int, 0) AS exit_nb_uniq_visitors,\n coalesce(exit_nb_visits::float::int, 0) as exit_nb_visits,\n avg_time_on_page, \n bounce_rate, \n exit_rate,\n url,\n date,\n coalesce(entry_nb_uniq_visitors::float::int, 0) as entry_nb_uniq_visitors,\n coalesce(entry_nb_visits::float::int, 0) as entry_nb_visits,\n coalesce(entry_bounce_count::float::int, 0) as entry_bounce_count,\n label\nFROM {{ source('matomo', 'pages') }}", "language": "sql", "refs": [], "sources": [["matomo", "pages"]], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.stg_matomo_page_titles": [{"database": "test_lyon", "schema": "prod", "name": "stg_matomo_page_titles", "resource_type": "model", "package_name": "demo", "path": "staging/matomo/stg_matomo_page_titles.sql", "original_file_path": "models/staging/matomo/stg_matomo_page_titles.sql", "unique_id": "model.demo.stg_matomo_page_titles", "fqn": ["demo", "staging", "matomo", "stg_matomo_page_titles"], "alias": "stg_matomo_page_titles", "checksum": {"name": "sha256", "checksum": "b04f78c5d3e756fdec032d6f163e370e340bec6a357daa9e6099956209cf1782"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.578132, "relation_name": "\"test_lyon\".\"prod\".\"stg_matomo_page_titles\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('matomo', 'page_titles') }}\n),\nrenamed AS (\n select\n date,\n min_time_server,\n min_time_network,\n min_time_dom_processing,\n nb_hits_with_time_on_load,\n coalesce(exit_nb_uniq_visitors::float::int, 0) AS exit_nb_uniq_visitors,\n max_time_dom_completion,\n avg_page_load_time,\n max_time_dom_processing,\n nb_hits_with_time_network,\n sum_time_spent,\n avg_time_dom_processing,\n bounce_rate,\n nb_hits_with_time_dom_processing,\n avg_time_network,\n nb_hits_with_time_dom_completion,\n entry_nb_actions,\n max_time_transfer,\n coalesce(entry_nb_uniq_visitors::float::int, 0) AS entry_nb_uniq_visitors,\n avg_time_on_page,\n actions_pagetitle,\n segment,\n nb_visits,\n coalesce(entry_bounce_count::float::int, 0) as entry_bounce_count,\n coalesce(exit_nb_visits::float::int, 0) as exit_nb_visits,\n min_time_transfer,\n max_time_network,\n nb_hits_with_time_server,\n max_time_server,\n max_time_on_load,\n avg_time_server,\n index,\n label,\n avg_time_dom_completion,\n nb_hits_with_time_transfer,\n avg_time_transfer,\n coalesce(entry_nb_visits::float::int, 0) as entry_nb_visits,\n entry_sum_visit_length,\n min_time_dom_completion,\n nb_hits,\n nb_uniq_visitors,\n avg_time_on_load,\n exit_rate,\n min_time_on_load\n FROM source\n)\nselect * FROM renamed", "language": "sql", "refs": [], "sources": [["matomo", "page_titles"]], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.stg_matomo_users_city": [{"database": "test_lyon", "schema": "prod", "name": "stg_matomo_users_city", "resource_type": "model", "package_name": "demo", "path": "staging/matomo/stg_matomo_users_city.sql", "original_file_path": "models/staging/matomo/stg_matomo_users_city.sql", "unique_id": "model.demo.stg_matomo_users_city", "fqn": ["demo", "staging", "matomo", "stg_matomo_users_city"], "alias": "stg_matomo_users_city", "checksum": {"name": "sha256", "checksum": "8d824c2e297de1fb98eb5d9b546b306c899e3bc604ec58c3cb5a83c76034a375"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.5793018, "relation_name": "\"test_lyon\".\"prod\".\"stg_matomo_users_city\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('matomo', 'users_city') }}\n),\nrenamed AS (\n SELECT\n date,\n country,\n nb_actions,\n city,\n bounce_count,\n index,\n label,\n long,\n sum_visit_length,\n city_name,\n nb_visits_converted,\n max_actions,\n segment,\n nb_visits,\n country_name,\n logo,\n region_name,\n nb_uniq_visitors,\n nb_users,\n region,\n lat\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["matomo", "users_city"]], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.matomo_pages": [{"database": "test_lyon", "schema": "prod", "name": "matomo_pages", "resource_type": "model", "package_name": "demo", "path": "marts/matomo/matomo_pages.sql", "original_file_path": "models/marts/matomo/matomo_pages.sql", "unique_id": "model.demo.matomo_pages", "fqn": ["demo", "marts", "matomo", "matomo_pages"], "alias": "matomo_pages", "checksum": {"name": "sha256", "checksum": "2e89b17cbc88c634343d9121c361bb2a13ade1e8c65fc8bb81c649b57bc62350"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.6177511, "relation_name": "\"test_lyon\".\"prod\".\"matomo_pages\"", "raw_code": "SELECT *,\n\tcase\n when label similar to '/(processes|assemblies)/%' then split_part(split_part(label, '/', 3), '?', 1)\n\t\telse ''\n\t\tend AS slug,\n\tcase\n\t when label similar to '/(processes|assemblies)/%/%/f/[0-9]*/%' then null --remove non-int garbage data\n\t when label similar to '/(processes|assemblies)/%/f/[0-9]*/%' then split_part(split_part(label, '/', 5), '?', 1)::int\n\t\telse null\n\t\tend as component_id\nFROM {{ref (\"stg_matomo_pages\")}}", "language": "sql", "refs": [{"name": "stg_matomo_pages", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.users_city": [{"database": "test_lyon", "schema": "prod", "name": "users_city", "resource_type": "model", "package_name": "demo", "path": "marts/matomo/users_city.sql", "original_file_path": "models/marts/matomo/users_city.sql", "unique_id": "model.demo.users_city", "fqn": ["demo", "marts", "matomo", "users_city"], "alias": "users_city", "checksum": {"name": "sha256", "checksum": "149ca0c19e7a52eaae753ec134ba96afe20c6c4f233c248a280e76dc8466f212"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.618856, "relation_name": "\"test_lyon\".\"prod\".\"users_city\"", "raw_code": "SELECT \n nb_visits,\n country_name,\n country,\n region_name,\n region,\n city_name,\n date, \n lat, \n long\nFROM {{ ref (\"stg_matomo_users_city\")}} AS users_city", "language": "sql", "refs": [{"name": "stg_matomo_users_city", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.int_matomo_referrers": [{"database": "test_lyon", "schema": "prod", "name": "int_matomo_referrers", "resource_type": "model", "package_name": "demo", "path": "intermediate/matomo/int_matomo_referrers.sql", "original_file_path": "models/intermediate/matomo/int_matomo_referrers.sql", "unique_id": "model.demo.int_matomo_referrers", "fqn": ["demo", "intermediate", "matomo", "int_matomo_referrers"], "alias": "int_matomo_referrers", "checksum": {"name": "sha256", "checksum": "c9826979571b4627c08f9265149ab8ae8d35fb783e0ecd5ab0a6e6e0a4993958"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.6369011, "relation_name": "\"test_lyon\".\"prod\".\"int_matomo_referrers\"", "raw_code": "SELECT *,\n (CASE stg_matomo_referrers.label\n WHEN 'Mot clef ind\u00e9fini' THEN 'Moteur de recherche'\n ELSE stg_matomo_referrers.label\n END\n ) AS renamed_label\nFROM {{ref (\"stg_matomo_referrers\")}} as stg_matomo_referrers", "language": "sql", "refs": [{"name": "stg_matomo_referrers", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.int_matomo_visits": [{"database": "test_lyon", "schema": "prod", "name": "int_matomo_visits", "resource_type": "model", "package_name": "demo", "path": "intermediate/matomo/int_matomo_visits.sql", "original_file_path": "models/intermediate/matomo/int_matomo_visits.sql", "unique_id": "model.demo.int_matomo_visits", "fqn": ["demo", "intermediate", "matomo", "int_matomo_visits"], "alias": "int_matomo_visits", "checksum": {"name": "sha256", "checksum": "e5f809f14776b8d85d09fe6b125476a0d1729c37a956808bbaf2fe10508cb250"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.6379688, "relation_name": "\"test_lyon\".\"prod\".\"int_matomo_visits\"", "raw_code": "SELECT\n *,\n bounce_count::decimal / nb_visits as bounce_rate_as_number,\n sum_visit_length / nb_visits as daily_average_visit_length\nFROM {{ref (\"stg_matomo_visits\")}}", "language": "sql", "refs": [{"name": "stg_matomo_visits", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}]}, "parent_map": {"model.test_lyon.int_decidim_awesome_proposal_extra_fields": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"], "model.demo.stg_decidim_attachments": ["source.demo.decidim.decidim_attachments"], "model.demo.stg_decidim_components": ["source.demo.decidim.decidim_components"], "model.demo.stg_decidim_endorsements": ["source.demo.decidim.decidim_endorsements"], "model.demo.stg_decidim_follows": ["source.demo.decidim.decidim_follows"], "model.demo.stg_decidim_comments": ["source.demo.decidim.decidim_comments_comments"], "model.demo.stg_decidim_meetings_registrations": ["source.demo.decidim.decidim_meetings_registrations"], "model.demo.stg_decidim_participatory_processes": ["source.demo.decidim.decidim_participatory_processes"], "model.demo.stg_decidim_users": ["source.demo.decidim.decidim_users"], "model.demo.stg_decidim_participatory_process_steps": ["source.demo.decidim.decidim_participatory_process_steps"], "model.demo.stg_decidim_coauthorships": ["source.demo.decidim.decidim_coauthorships"], "model.demo.stg_decidim_meetings": ["source.demo.decidim.decidim_meetings_meetings"], "model.demo.stg_decidim_accountability_results": ["source.demo.decidim.decidim_accountability_results"], "model.demo.stg_decidim_moderations": ["source.demo.decidim.decidim_moderations"], "model.demo.stg_decidim_surveys": ["source.demo.decidim.decidim_surveys_surveys"], "model.demo.stg_decidim_organizations": ["source.demo.decidim.decidim_organizations"], "model.demo.stg_decidim_forms_question_matrix_rows": ["source.demo.decidim.decidim_forms_question_matrix_rows"], "model.demo.stg_decidim_forms_answers": ["source.demo.decidim.decidim_forms_answers"], "model.demo.stg_decidim_forms_questions": ["source.demo.decidim.decidim_forms_questions"], "model.demo.stg_decidim_forms_questionnaires": ["source.demo.decidim.decidim_forms_questionnaires"], "model.demo.stg_decidim_forms_answer_choices": ["source.demo.decidim.decidim_forms_answer_choices"], "model.demo.stg_decidim_area_types": ["source.demo.decidim.decidim_area_types"], "model.demo.stg_decidim_areas": ["source.demo.decidim.decidim_areas"], "model.demo.stg_decidim_blogs_posts": ["source.demo.decidim.decidim_blogs_posts"], "model.demo.stg_decidim_assemblies": ["source.demo.decidim.decidim_assemblies"], "model.demo.stg_decidim_debates": ["source.demo.decidim.decidim_debates_debates"], "model.demo.stg_decidim_budgets_line_items": ["source.demo.decidim.decidim_budgets_line_items"], "model.demo.stg_decidim_budgets_projects": ["source.demo.decidim.decidim_budgets_projects"], "model.demo.stg_decidim_budgets_orders": ["source.demo.decidim.decidim_budgets_orders"], "model.demo.stg_decidim_budgets": ["source.demo.decidim.decidim_budgets_budgets"], "model.demo.stg_decidim_categories": ["source.demo.decidim.decidim_categories"], "model.demo.stg_decidim_categorizations": ["source.demo.decidim.decidim_categorizations"], "model.demo.stg_decidim_scopes": ["source.demo.decidim.decidim_scopes"], "model.demo.stg_decidim_proposals_votes": ["source.demo.decidim.decidim_proposals_proposal_votes"], "model.demo.stg_decidim_proposals_collaborative_drafts": ["source.demo.decidim.decidim_proposals_collaborative_drafts"], "model.demo.stg_decidim_proposals": ["source.demo.decidim.decidim_proposals_proposals"], "model.demo.organizations": ["model.demo.int_organizations"], "model.demo.participations": ["model.demo.comments", "model.demo.debates", "model.demo.endorsements", "model.demo.forms_answers", "model.demo.meetings", "model.demo.projects_votes", "model.demo.proposals", "model.demo.proposals_votes"], "model.demo.attachments": ["model.demo.organizations", "model.demo.stg_decidim_attachments"], "model.demo.comments": ["model.demo.blogs_posts", "model.demo.budgets_projects", "model.demo.components", "model.demo.debates", "model.demo.meetings", "model.demo.proposals", "model.demo.stg_decidim_accountability_results", "model.demo.stg_decidim_comments", "model.demo.stg_decidim_moderations", "model.demo.stg_decidim_proposals_collaborative_drafts"], "model.demo.followings": ["model.demo.blogs_posts", "model.demo.budgets_projects", "model.demo.components", "model.demo.debates", "model.demo.int_users", "model.demo.meetings", "model.demo.proposals", "model.demo.stg_decidim_follows"], "model.demo.forms": ["model.demo.components", "model.demo.stg_decidim_forms_questionnaires", "model.demo.stg_decidim_meetings", "model.demo.stg_decidim_surveys"], "model.demo.forms_answers": ["model.demo.answers_file", "model.demo.answers_matrix", "model.demo.answers_option_and_sorting", "model.demo.answers_short_and_long_answer", "model.demo.forms"], "model.demo.blogs_posts": ["model.demo.components", "model.demo.stg_decidim_blogs_posts"], "model.demo.debates": ["model.demo.categorizations", "model.demo.components", "model.demo.stg_decidim_debates"], "model.demo.components": ["model.demo.int_components", "model.demo.int_organizations", "model.demo.stg_decidim_assemblies", "model.demo.stg_decidim_participatory_processes"], "model.demo.categorizations": ["model.demo.stg_decidim_categories", "model.demo.stg_decidim_categorizations"], "model.demo.endorsements": ["model.demo.stg_decidim_blogs_posts", "model.demo.stg_decidim_debates", "model.demo.stg_decidim_endorsements", "model.demo.stg_decidim_moderations", "model.demo.stg_decidim_proposals"], "model.demo.users": ["model.demo.comments", "model.demo.endorsements", "model.demo.followings", "model.demo.forms_answers", "model.demo.int_organizations", "model.demo.int_users", "model.demo.projects_votes", "model.demo.proposals", "model.demo.proposals_votes", "model.demo.stg_decidim_coauthorships"], "model.demo.budgets": ["model.demo.components", "model.demo.stg_decidim_budgets"], "model.demo.projects_votes": ["model.demo.budgets_projects", "model.demo.int_budgets_orders", "model.demo.stg_decidim_budgets_line_items"], "model.demo.budgets_projects": ["model.demo.categorizations", "model.demo.components", "model.demo.int_budgets_projects", "model.demo.stg_decidim_budgets"], "model.demo.meetings": ["model.demo.categorizations", "model.demo.components", "model.demo.int_meetings"], "model.demo.proposals_votes": ["model.demo.proposals", "model.demo.stg_decidim_proposals_votes"], "model.demo.proposals": ["model.demo.categorizations", "model.demo.components", "model.demo.int_proposals", "model.demo.int_scopes", "model.demo.int_users", "model.demo.stg_decidim_coauthorships", "model.demo.stg_decidim_moderations", "model.demo.stg_decidim_proposals_votes"], "model.demo.int_organizations": ["model.demo.stg_decidim_organizations"], "model.demo.answers_file": ["model.demo.int_forms_answers", "model.demo.organizations", "model.demo.stg_decidim_attachments", "model.demo.stg_decidim_forms_questions"], "model.demo.answers_option_and_sorting": ["model.demo.int_forms_answers", "model.demo.stg_decidim_forms_answer_choices", "model.demo.stg_decidim_forms_questions"], "model.demo.answers_matrix": ["model.demo.int_forms_answers", "model.demo.stg_decidim_forms_answer_choices", "model.demo.stg_decidim_forms_question_matrix_rows", "model.demo.stg_decidim_forms_questions"], "model.demo.answers_short_and_long_answer": ["model.demo.int_forms_answers", "model.demo.stg_decidim_forms_questions"], "model.demo.int_forms_answers": ["model.demo.stg_decidim_forms_answers"], "model.demo.int_components": ["model.demo.stg_decidim_components"], "model.demo.int_users": ["model.demo.stg_decidim_users"], "model.demo.int_budgets_projects": ["model.demo.stg_decidim_budgets_projects"], "model.demo.int_budgets_orders": ["model.demo.stg_decidim_budgets_orders"], "model.demo.int_meetings": ["model.demo.stg_decidim_meetings"], "model.demo.int_scopes": ["model.demo.stg_decidim_scopes"], "model.demo.int_proposals": ["model.demo.stg_decidim_proposals"], "test.demo.not_null_stg_decidim_forms_answer_choices_id.6373c5b027": ["model.demo.stg_decidim_forms_answer_choices"], "test.demo.unique_stg_decidim_forms_answer_choices_id.cac0250df2": ["model.demo.stg_decidim_forms_answer_choices"], "test.demo.not_null_stg_decidim_forms_answer_choices_decidim_answer_id.70e833d8d0": ["model.demo.stg_decidim_forms_answer_choices"], "test.demo.not_null_stg_decidim_forms_answer_choices_body.0c7838e1b8": ["model.demo.stg_decidim_forms_answer_choices"], "test.demo.not_null_stg_decidim_forms_answers_id.92ce43439f": ["model.demo.stg_decidim_forms_answers"], "test.demo.unique_stg_decidim_forms_answers_id.8fb3388969": ["model.demo.stg_decidim_forms_answers"], "test.demo.not_null_stg_decidim_forms_question_matrix_rows_id.7e6619509e": ["model.demo.stg_decidim_forms_question_matrix_rows"], "test.demo.unique_stg_decidim_forms_question_matrix_rows_id.8db20e3085": ["model.demo.stg_decidim_forms_question_matrix_rows"], "test.demo.not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id.55db0b6fe6": ["model.demo.stg_decidim_forms_question_matrix_rows"], "test.demo.not_null_stg_decidim_forms_question_matrix_rows_body.71d322a975": ["model.demo.stg_decidim_forms_question_matrix_rows"], "test.demo.not_null_stg_decidim_forms_questionnaires_id.74cea2a594": ["model.demo.stg_decidim_forms_questionnaires"], "test.demo.unique_stg_decidim_forms_questionnaires_id.c228c4d2a1": ["model.demo.stg_decidim_forms_questionnaires"], "test.demo.not_null_stg_decidim_forms_questions_id.c7a096fa50": ["model.demo.stg_decidim_forms_questions"], "test.demo.unique_stg_decidim_forms_questions_id.3becc3a082": ["model.demo.stg_decidim_forms_questions"], "test.demo.unique_stg_decidim_budgets_line_items_id.93d157dab5": ["model.demo.stg_decidim_budgets_line_items"], "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id.759330b24d": ["model.demo.stg_decidim_budgets_line_items"], "test.demo.unique_stg_decidim_categorizations_id.6566c00409": ["model.demo.stg_decidim_categorizations"], "test.demo.not_null_stg_decidim_categorizations_id.a059a79c08": ["model.demo.stg_decidim_categorizations"], "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type.d2c10e48e4": ["model.demo.stg_decidim_categorizations"], "test.demo.accepted_values_followings_following_way__real_follow__ancestor_follow.60d8b91db4": ["model.demo.followings"], "test.demo.not_null_components_id.85e75ab698": ["model.demo.components"], "test.demo.unique_components_id.55875f0fa3": ["model.demo.components"], "test.demo.not_null_components_manifest_name.2795dc3709": ["model.demo.components"], "test.demo.not_null_components_decidim_organization_id.3ae04f70dd": ["model.demo.components"], "test.demo.unique_users_id.ec952d9777": ["model.demo.users"], "test.demo.not_null_users_id.4db5ed5c63": ["model.demo.users"], "test.demo.relationships_users_id__id__ref_int_users_.c269bba0d5": ["model.demo.int_users", "model.demo.users"], "test.demo.dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id.da5f9c9505": ["model.demo.proposals_votes"], "test.demo.unique_int_users_id.e5ba0ede1e": ["model.demo.int_users"], "test.demo.not_null_int_users_id.1125b186c1": ["model.demo.int_users"], "test.demo.not_null_int_users_nickname.b90ddd7677": ["model.demo.int_users"], "model.test_lyon.decidim_awesome_proposal_extra_fields": ["model.demo.components", "model.demo.stg_decidim_proposals", "model.test_lyon.int_decidim_awesome_proposal_extra_fields"], "model.test_lyon.stg_decidim_awesome_proposal_extra_fields": ["source.test_lyon.decidim.decidim_awesome_proposal_extra_fields_test"], "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_id.aad3a9d9b8": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"], "test.test_lyon.unique_stg_decidim_awesome_proposal_extra_fields_id.1f06fde107": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"], "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id.5154a34bb9": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"], "source.test_lyon.decidim.decidim_awesome_proposal_extra_fields_test": [], "source.demo.decidim.decidim_components": [], "source.demo.decidim.decidim_assemblies": [], "source.demo.decidim.decidim_participatory_processes": [], "source.demo.decidim.decidim_participatory_process_steps": [], "source.demo.decidim.decidim_users": [], "source.demo.decidim.decidim_proposals_proposals": [], "source.demo.decidim.decidim_coauthorships": [], "source.demo.decidim.decidim_moderations": [], "source.demo.decidim.decidim_scopes": [], "source.demo.decidim.decidim_blogs_posts": [], "source.demo.decidim.decidim_debates_debates": [], "source.demo.decidim.decidim_meetings_meetings": [], "source.demo.decidim.decidim_accountability_results": [], "source.demo.decidim.decidim_comments_comments": [], "source.demo.decidim.decidim_proposals_collaborative_drafts": [], "source.demo.decidim.decidim_endorsements": [], "source.demo.decidim.decidim_follows": [], "source.demo.decidim.decidim_initiatives": [], "source.demo.decidim.decidim_initiatives_type_scopes": [], "source.demo.decidim.decidim_surveys_surveys": [], "source.demo.decidim.decidim_attachments": [], "source.demo.decidim.decidim_proposals_proposal_votes": [], "source.demo.decidim.decidim_meetings_registrations": [], "source.demo.decidim.decidim_organizations": [], "source.demo.decidim.decidim_forms_answer_choices": [], "source.demo.decidim.decidim_forms_answers": [], "source.demo.decidim.decidim_forms_question_matrix_rows": [], "source.demo.decidim.decidim_forms_questionnaires": [], "source.demo.decidim.decidim_forms_questions": [], "source.demo.decidim.decidim_areas": [], "source.demo.decidim.decidim_area_types": [], "source.demo.decidim.decidim_budgets_projects": [], "source.demo.decidim.decidim_budgets_budgets": [], "source.demo.decidim.decidim_budgets_line_items": [], "source.demo.decidim.decidim_budgets_orders": [], "source.demo.decidim.decidim_categories": [], "source.demo.decidim.decidim_categorizations": [], "unit_test.demo.stg_decidim_blogs_posts.resource_type_definition": ["model.demo.stg_decidim_blogs_posts"], "unit_test.demo.stg_decidim_debates.resource_type_definition": ["model.demo.stg_decidim_debates"], "unit_test.demo.stg_decidim_budgets_projects.resource_type_definition": ["model.demo.stg_decidim_budgets_projects"], "unit_test.demo.stg_decidim_proposals.resource_type_definition": ["model.demo.stg_decidim_proposals"], "unit_test.demo.blogs_posts.test_url_concatenation": ["model.demo.blogs_posts"], "unit_test.demo.components.test_ps_type": ["model.demo.components"], "unit_test.demo.components.test_ps_space_type_slug": ["model.demo.components"], "unit_test.demo.components.test_no_null_published_at": ["model.demo.components"], "unit_test.demo.components.test_take_only_assemblies_and_participatory_processes": ["model.demo.components"], "unit_test.demo.components.test_url_creation": ["model.demo.components"], "unit_test.demo.categorizations.testing_that_main_categories_are_properly_processed": ["model.demo.categorizations"], "unit_test.demo.categorizations.testing_that_sub_categories_are_properly_processed": ["model.demo.categorizations"], "unit_test.demo.endorsements.moderations-check": ["model.demo.endorsements"], "unit_test.demo.endorsements.endorsements-component-check": ["model.demo.endorsements"], "unit_test.demo.meetings.test_url_concatenation": ["model.demo.meetings"], "unit_test.demo.meetings.test_manifest_name_is_meetings": ["model.demo.meetings"], "unit_test.demo.proposals.withdrawn_proposals_check": ["model.demo.proposals"], "unit_test.demo.proposals.moderations_proposals_check": ["model.demo.proposals"], "unit_test.demo.proposals.conflict_on_decidim_reportable_type_check": ["model.demo.proposals"], "unit_test.demo.proposals.published_at_check": ["model.demo.proposals"], "unit_test.demo.int_organizations.test_filter_by_host": ["model.demo.int_organizations"], "unit_test.demo.int_organizations.test_regex_clean_description": ["model.demo.int_organizations"], "unit_test.demo.int_forms_answers.int_forms_answers_author_status_check": ["model.demo.int_forms_answers"], "unit_test.demo.answers_short_and_long_answer.answers_short_and_long_answer_check": ["model.demo.answers_short_and_long_answer"], "unit_test.demo.answers_matrix.answers_matrix_check": ["model.demo.answers_matrix"], "unit_test.demo.answers_option_and_sorting.answers_option_and_sorting_check_on_question_type": ["model.demo.answers_option_and_sorting"], "unit_test.demo.answers_short_and_long_answer.short_and_long_answer_check_on_question_type": ["model.demo.answers_short_and_long_answer"], "unit_test.demo.answers_matrix.answers_matrix_check_on_question_type": ["model.demo.answers_matrix"], "unit_test.demo.int_components.test_translated_manifest_name": ["model.demo.int_components"], "unit_test.demo.int_users.deleted_users_check": ["model.demo.int_users"], "unit_test.demo.int_users.type_check": ["model.demo.int_users"], "unit_test.demo.int_users.sign_in_frequency_check": ["model.demo.int_users"], "unit_test.demo.int_budgets_orders.vote_finished_test": ["model.demo.int_budgets_orders"], "unit_test.demo.int_budgets_projects.is_selected_test": ["model.demo.int_budgets_projects"], "unit_test.demo.int_proposals.test_default_state": ["model.demo.int_proposals"], "unit_test.demo.int_proposals.test_translated_state": ["model.demo.int_proposals"], "unit_test.demo.int_proposals.test_default_address": ["model.demo.int_proposals"], "unit_test.demo.int_proposals.test_published_at_not_null": ["model.demo.int_proposals"], "unit_test.test_lyon.int_decidim_awesome_proposal_extra_fields.testing_that_the_correct_xml_information_are_parsed": ["model.test_lyon.int_decidim_awesome_proposal_extra_fields"]}, "child_map": {"model.test_lyon.int_decidim_awesome_proposal_extra_fields": ["model.test_lyon.decidim_awesome_proposal_extra_fields", "unit_test.test_lyon.int_decidim_awesome_proposal_extra_fields.testing_that_the_correct_xml_information_are_parsed"], "model.demo.stg_decidim_attachments": ["model.demo.answers_file", "model.demo.attachments"], "model.demo.stg_decidim_components": ["model.demo.int_components"], "model.demo.stg_decidim_endorsements": ["model.demo.endorsements"], "model.demo.stg_decidim_follows": ["model.demo.followings"], "model.demo.stg_decidim_comments": ["model.demo.comments"], "model.demo.stg_decidim_meetings_registrations": [], "model.demo.stg_decidim_participatory_processes": ["model.demo.components"], "model.demo.stg_decidim_users": ["model.demo.int_users"], "model.demo.stg_decidim_participatory_process_steps": [], "model.demo.stg_decidim_coauthorships": ["model.demo.proposals", "model.demo.users"], "model.demo.stg_decidim_meetings": ["model.demo.forms", "model.demo.int_meetings"], "model.demo.stg_decidim_accountability_results": ["model.demo.comments"], "model.demo.stg_decidim_moderations": ["model.demo.comments", "model.demo.endorsements", "model.demo.proposals"], "model.demo.stg_decidim_surveys": ["model.demo.forms"], "model.demo.stg_decidim_organizations": ["model.demo.int_organizations"], "model.demo.stg_decidim_forms_question_matrix_rows": ["model.demo.answers_matrix", "test.demo.not_null_stg_decidim_forms_question_matrix_rows_body.71d322a975", "test.demo.not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id.55db0b6fe6", "test.demo.not_null_stg_decidim_forms_question_matrix_rows_id.7e6619509e", "test.demo.unique_stg_decidim_forms_question_matrix_rows_id.8db20e3085"], "model.demo.stg_decidim_forms_answers": ["model.demo.int_forms_answers", "test.demo.not_null_stg_decidim_forms_answers_id.92ce43439f", "test.demo.unique_stg_decidim_forms_answers_id.8fb3388969"], "model.demo.stg_decidim_forms_questions": ["model.demo.answers_file", "model.demo.answers_matrix", "model.demo.answers_option_and_sorting", "model.demo.answers_short_and_long_answer", "test.demo.not_null_stg_decidim_forms_questions_id.c7a096fa50", "test.demo.unique_stg_decidim_forms_questions_id.3becc3a082"], "model.demo.stg_decidim_forms_questionnaires": ["model.demo.forms", "test.demo.not_null_stg_decidim_forms_questionnaires_id.74cea2a594", "test.demo.unique_stg_decidim_forms_questionnaires_id.c228c4d2a1"], "model.demo.stg_decidim_forms_answer_choices": ["model.demo.answers_matrix", "model.demo.answers_option_and_sorting", "test.demo.not_null_stg_decidim_forms_answer_choices_body.0c7838e1b8", "test.demo.not_null_stg_decidim_forms_answer_choices_decidim_answer_id.70e833d8d0", "test.demo.not_null_stg_decidim_forms_answer_choices_id.6373c5b027", "test.demo.unique_stg_decidim_forms_answer_choices_id.cac0250df2"], "model.demo.stg_decidim_area_types": [], "model.demo.stg_decidim_areas": [], "model.demo.stg_decidim_blogs_posts": ["model.demo.blogs_posts", "model.demo.endorsements", "unit_test.demo.stg_decidim_blogs_posts.resource_type_definition"], "model.demo.stg_decidim_assemblies": ["model.demo.components"], "model.demo.stg_decidim_debates": ["model.demo.debates", "model.demo.endorsements", "unit_test.demo.stg_decidim_debates.resource_type_definition"], "model.demo.stg_decidim_budgets_line_items": ["model.demo.projects_votes", "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id.759330b24d", "test.demo.unique_stg_decidim_budgets_line_items_id.93d157dab5"], "model.demo.stg_decidim_budgets_projects": ["model.demo.int_budgets_projects", "unit_test.demo.stg_decidim_budgets_projects.resource_type_definition"], "model.demo.stg_decidim_budgets_orders": ["model.demo.int_budgets_orders"], "model.demo.stg_decidim_budgets": ["model.demo.budgets", "model.demo.budgets_projects"], "model.demo.stg_decidim_categories": ["model.demo.categorizations"], "model.demo.stg_decidim_categorizations": ["model.demo.categorizations", "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type.d2c10e48e4", "test.demo.not_null_stg_decidim_categorizations_id.a059a79c08", "test.demo.unique_stg_decidim_categorizations_id.6566c00409"], "model.demo.stg_decidim_scopes": ["model.demo.int_scopes"], "model.demo.stg_decidim_proposals_votes": ["model.demo.proposals", "model.demo.proposals_votes"], "model.demo.stg_decidim_proposals_collaborative_drafts": ["model.demo.comments"], "model.demo.stg_decidim_proposals": ["model.demo.endorsements", "model.demo.int_proposals", "model.test_lyon.decidim_awesome_proposal_extra_fields", "unit_test.demo.stg_decidim_proposals.resource_type_definition"], "model.demo.organizations": ["model.demo.answers_file", "model.demo.attachments"], "model.demo.participations": [], "model.demo.attachments": [], "model.demo.comments": ["model.demo.participations", "model.demo.users"], "model.demo.followings": ["model.demo.users", "test.demo.accepted_values_followings_following_way__real_follow__ancestor_follow.60d8b91db4"], "model.demo.forms": ["model.demo.forms_answers"], "model.demo.forms_answers": ["model.demo.participations", "model.demo.users"], "model.demo.blogs_posts": ["model.demo.comments", "model.demo.followings", "unit_test.demo.blogs_posts.test_url_concatenation"], "model.demo.debates": ["model.demo.comments", "model.demo.followings", "model.demo.participations"], "model.demo.components": ["model.demo.blogs_posts", "model.demo.budgets", "model.demo.budgets_projects", "model.demo.comments", "model.demo.debates", "model.demo.followings", "model.demo.forms", "model.demo.meetings", "model.demo.proposals", "model.test_lyon.decidim_awesome_proposal_extra_fields", "test.demo.not_null_components_decidim_organization_id.3ae04f70dd", "test.demo.not_null_components_id.85e75ab698", "test.demo.not_null_components_manifest_name.2795dc3709", "test.demo.unique_components_id.55875f0fa3", "unit_test.demo.components.test_no_null_published_at", "unit_test.demo.components.test_ps_space_type_slug", "unit_test.demo.components.test_ps_type", "unit_test.demo.components.test_take_only_assemblies_and_participatory_processes", "unit_test.demo.components.test_url_creation"], "model.demo.categorizations": ["model.demo.budgets_projects", "model.demo.debates", "model.demo.meetings", "model.demo.proposals", "unit_test.demo.categorizations.testing_that_main_categories_are_properly_processed", "unit_test.demo.categorizations.testing_that_sub_categories_are_properly_processed"], "model.demo.endorsements": ["model.demo.participations", "model.demo.users", "unit_test.demo.endorsements.endorsements-component-check", "unit_test.demo.endorsements.moderations-check"], "model.demo.users": ["test.demo.not_null_users_id.4db5ed5c63", "test.demo.relationships_users_id__id__ref_int_users_.c269bba0d5", "test.demo.unique_users_id.ec952d9777"], "model.demo.budgets": [], "model.demo.projects_votes": ["model.demo.participations", "model.demo.users"], "model.demo.budgets_projects": ["model.demo.comments", "model.demo.followings", "model.demo.projects_votes"], "model.demo.meetings": ["model.demo.comments", "model.demo.followings", "model.demo.participations", "unit_test.demo.meetings.test_manifest_name_is_meetings", "unit_test.demo.meetings.test_url_concatenation"], "model.demo.proposals_votes": ["model.demo.participations", "model.demo.users", "test.demo.dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id.da5f9c9505"], "model.demo.proposals": ["model.demo.comments", "model.demo.followings", "model.demo.participations", "model.demo.proposals_votes", "model.demo.users", "unit_test.demo.proposals.conflict_on_decidim_reportable_type_check", "unit_test.demo.proposals.moderations_proposals_check", "unit_test.demo.proposals.published_at_check", "unit_test.demo.proposals.withdrawn_proposals_check"], "model.demo.int_organizations": ["model.demo.components", "model.demo.organizations", "model.demo.users", "unit_test.demo.int_organizations.test_filter_by_host", "unit_test.demo.int_organizations.test_regex_clean_description"], "model.demo.answers_file": ["model.demo.forms_answers"], "model.demo.answers_option_and_sorting": ["model.demo.forms_answers", "unit_test.demo.answers_option_and_sorting.answers_option_and_sorting_check_on_question_type"], "model.demo.answers_matrix": ["model.demo.forms_answers", "unit_test.demo.answers_matrix.answers_matrix_check", "unit_test.demo.answers_matrix.answers_matrix_check_on_question_type"], "model.demo.answers_short_and_long_answer": ["model.demo.forms_answers", "unit_test.demo.answers_short_and_long_answer.answers_short_and_long_answer_check", "unit_test.demo.answers_short_and_long_answer.short_and_long_answer_check_on_question_type"], "model.demo.int_forms_answers": ["model.demo.answers_file", "model.demo.answers_matrix", "model.demo.answers_option_and_sorting", "model.demo.answers_short_and_long_answer", "unit_test.demo.int_forms_answers.int_forms_answers_author_status_check"], "model.demo.int_components": ["model.demo.components", "unit_test.demo.int_components.test_translated_manifest_name"], "model.demo.int_users": ["model.demo.followings", "model.demo.proposals", "model.demo.users", "test.demo.not_null_int_users_id.1125b186c1", "test.demo.not_null_int_users_nickname.b90ddd7677", "test.demo.relationships_users_id__id__ref_int_users_.c269bba0d5", "test.demo.unique_int_users_id.e5ba0ede1e", "unit_test.demo.int_users.deleted_users_check", "unit_test.demo.int_users.sign_in_frequency_check", "unit_test.demo.int_users.type_check"], "model.demo.int_budgets_projects": ["model.demo.budgets_projects", "unit_test.demo.int_budgets_projects.is_selected_test"], "model.demo.int_budgets_orders": ["model.demo.projects_votes", "unit_test.demo.int_budgets_orders.vote_finished_test"], "model.demo.int_meetings": ["model.demo.meetings"], "model.demo.int_scopes": ["model.demo.proposals"], "model.demo.int_proposals": ["model.demo.proposals", "unit_test.demo.int_proposals.test_default_address", "unit_test.demo.int_proposals.test_default_state", "unit_test.demo.int_proposals.test_published_at_not_null", "unit_test.demo.int_proposals.test_translated_state"], "test.demo.not_null_stg_decidim_forms_answer_choices_id.6373c5b027": [], "test.demo.unique_stg_decidim_forms_answer_choices_id.cac0250df2": [], "test.demo.not_null_stg_decidim_forms_answer_choices_decidim_answer_id.70e833d8d0": [], "test.demo.not_null_stg_decidim_forms_answer_choices_body.0c7838e1b8": [], "test.demo.not_null_stg_decidim_forms_answers_id.92ce43439f": [], "test.demo.unique_stg_decidim_forms_answers_id.8fb3388969": [], "test.demo.not_null_stg_decidim_forms_question_matrix_rows_id.7e6619509e": [], "test.demo.unique_stg_decidim_forms_question_matrix_rows_id.8db20e3085": [], "test.demo.not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id.55db0b6fe6": [], "test.demo.not_null_stg_decidim_forms_question_matrix_rows_body.71d322a975": [], "test.demo.not_null_stg_decidim_forms_questionnaires_id.74cea2a594": [], "test.demo.unique_stg_decidim_forms_questionnaires_id.c228c4d2a1": [], "test.demo.not_null_stg_decidim_forms_questions_id.c7a096fa50": [], "test.demo.unique_stg_decidim_forms_questions_id.3becc3a082": [], "test.demo.unique_stg_decidim_budgets_line_items_id.93d157dab5": [], "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id.759330b24d": [], "test.demo.unique_stg_decidim_categorizations_id.6566c00409": [], "test.demo.not_null_stg_decidim_categorizations_id.a059a79c08": [], "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type.d2c10e48e4": [], "test.demo.accepted_values_followings_following_way__real_follow__ancestor_follow.60d8b91db4": [], "test.demo.not_null_components_id.85e75ab698": [], "test.demo.unique_components_id.55875f0fa3": [], "test.demo.not_null_components_manifest_name.2795dc3709": [], "test.demo.not_null_components_decidim_organization_id.3ae04f70dd": [], "test.demo.unique_users_id.ec952d9777": [], "test.demo.not_null_users_id.4db5ed5c63": [], "test.demo.relationships_users_id__id__ref_int_users_.c269bba0d5": [], "test.demo.dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id.da5f9c9505": [], "test.demo.unique_int_users_id.e5ba0ede1e": [], "test.demo.not_null_int_users_id.1125b186c1": [], "test.demo.not_null_int_users_nickname.b90ddd7677": [], "model.test_lyon.decidim_awesome_proposal_extra_fields": [], "model.test_lyon.stg_decidim_awesome_proposal_extra_fields": ["model.test_lyon.int_decidim_awesome_proposal_extra_fields", "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_id.aad3a9d9b8", "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id.5154a34bb9", "test.test_lyon.unique_stg_decidim_awesome_proposal_extra_fields_id.1f06fde107"], "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_id.aad3a9d9b8": [], "test.test_lyon.unique_stg_decidim_awesome_proposal_extra_fields_id.1f06fde107": [], "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id.5154a34bb9": [], "source.test_lyon.decidim.decidim_awesome_proposal_extra_fields_test": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"], "source.demo.decidim.decidim_components": ["model.demo.stg_decidim_components"], "source.demo.decidim.decidim_assemblies": ["model.demo.stg_decidim_assemblies"], "source.demo.decidim.decidim_participatory_processes": ["model.demo.stg_decidim_participatory_processes"], "source.demo.decidim.decidim_participatory_process_steps": ["model.demo.stg_decidim_participatory_process_steps"], "source.demo.decidim.decidim_users": ["model.demo.stg_decidim_users"], "source.demo.decidim.decidim_proposals_proposals": ["model.demo.stg_decidim_proposals"], "source.demo.decidim.decidim_coauthorships": ["model.demo.stg_decidim_coauthorships"], "source.demo.decidim.decidim_moderations": ["model.demo.stg_decidim_moderations"], "source.demo.decidim.decidim_scopes": ["model.demo.stg_decidim_scopes"], "source.demo.decidim.decidim_blogs_posts": ["model.demo.stg_decidim_blogs_posts"], "source.demo.decidim.decidim_debates_debates": ["model.demo.stg_decidim_debates"], "source.demo.decidim.decidim_meetings_meetings": ["model.demo.stg_decidim_meetings"], "source.demo.decidim.decidim_accountability_results": ["model.demo.stg_decidim_accountability_results"], "source.demo.decidim.decidim_comments_comments": ["model.demo.stg_decidim_comments"], "source.demo.decidim.decidim_proposals_collaborative_drafts": ["model.demo.stg_decidim_proposals_collaborative_drafts"], "source.demo.decidim.decidim_endorsements": ["model.demo.stg_decidim_endorsements"], "source.demo.decidim.decidim_follows": ["model.demo.stg_decidim_follows"], "source.demo.decidim.decidim_initiatives": [], "source.demo.decidim.decidim_initiatives_type_scopes": [], "source.demo.decidim.decidim_surveys_surveys": ["model.demo.stg_decidim_surveys"], "source.demo.decidim.decidim_attachments": ["model.demo.stg_decidim_attachments"], "source.demo.decidim.decidim_proposals_proposal_votes": ["model.demo.stg_decidim_proposals_votes"], "source.demo.decidim.decidim_meetings_registrations": ["model.demo.stg_decidim_meetings_registrations"], "source.demo.decidim.decidim_organizations": ["model.demo.stg_decidim_organizations"], "source.demo.decidim.decidim_forms_answer_choices": ["model.demo.stg_decidim_forms_answer_choices"], "source.demo.decidim.decidim_forms_answers": ["model.demo.stg_decidim_forms_answers"], "source.demo.decidim.decidim_forms_question_matrix_rows": ["model.demo.stg_decidim_forms_question_matrix_rows"], "source.demo.decidim.decidim_forms_questionnaires": ["model.demo.stg_decidim_forms_questionnaires"], "source.demo.decidim.decidim_forms_questions": ["model.demo.stg_decidim_forms_questions"], "source.demo.decidim.decidim_areas": ["model.demo.stg_decidim_areas"], "source.demo.decidim.decidim_area_types": ["model.demo.stg_decidim_area_types"], "source.demo.decidim.decidim_budgets_projects": ["model.demo.stg_decidim_budgets_projects"], "source.demo.decidim.decidim_budgets_budgets": ["model.demo.stg_decidim_budgets"], "source.demo.decidim.decidim_budgets_line_items": ["model.demo.stg_decidim_budgets_line_items"], "source.demo.decidim.decidim_budgets_orders": ["model.demo.stg_decidim_budgets_orders"], "source.demo.decidim.decidim_categories": ["model.demo.stg_decidim_categories"], "source.demo.decidim.decidim_categorizations": ["model.demo.stg_decidim_categorizations"], "unit_test.demo.stg_decidim_blogs_posts.resource_type_definition": [], "unit_test.demo.stg_decidim_debates.resource_type_definition": [], "unit_test.demo.stg_decidim_budgets_projects.resource_type_definition": [], "unit_test.demo.stg_decidim_proposals.resource_type_definition": [], "unit_test.demo.blogs_posts.test_url_concatenation": [], "unit_test.demo.components.test_ps_type": [], "unit_test.demo.components.test_ps_space_type_slug": [], "unit_test.demo.components.test_no_null_published_at": [], "unit_test.demo.components.test_take_only_assemblies_and_participatory_processes": [], "unit_test.demo.components.test_url_creation": [], "unit_test.demo.categorizations.testing_that_main_categories_are_properly_processed": [], "unit_test.demo.categorizations.testing_that_sub_categories_are_properly_processed": [], "unit_test.demo.endorsements.moderations-check": [], "unit_test.demo.endorsements.endorsements-component-check": [], "unit_test.demo.meetings.test_url_concatenation": [], "unit_test.demo.meetings.test_manifest_name_is_meetings": [], "unit_test.demo.proposals.withdrawn_proposals_check": [], "unit_test.demo.proposals.moderations_proposals_check": [], "unit_test.demo.proposals.conflict_on_decidim_reportable_type_check": [], "unit_test.demo.proposals.published_at_check": [], "unit_test.demo.int_organizations.test_filter_by_host": [], "unit_test.demo.int_organizations.test_regex_clean_description": [], "unit_test.demo.int_forms_answers.int_forms_answers_author_status_check": [], "unit_test.demo.answers_short_and_long_answer.answers_short_and_long_answer_check": [], "unit_test.demo.answers_matrix.answers_matrix_check": [], "unit_test.demo.answers_option_and_sorting.answers_option_and_sorting_check_on_question_type": [], "unit_test.demo.answers_short_and_long_answer.short_and_long_answer_check_on_question_type": [], "unit_test.demo.answers_matrix.answers_matrix_check_on_question_type": [], "unit_test.demo.int_components.test_translated_manifest_name": [], "unit_test.demo.int_users.deleted_users_check": [], "unit_test.demo.int_users.type_check": [], "unit_test.demo.int_users.sign_in_frequency_check": [], "unit_test.demo.int_budgets_orders.vote_finished_test": [], "unit_test.demo.int_budgets_projects.is_selected_test": [], "unit_test.demo.int_proposals.test_default_state": [], "unit_test.demo.int_proposals.test_translated_state": [], "unit_test.demo.int_proposals.test_default_address": [], "unit_test.demo.int_proposals.test_published_at_not_null": [], "unit_test.test_lyon.int_decidim_awesome_proposal_extra_fields.testing_that_the_correct_xml_information_are_parsed": []}, "group_map": {}, "saved_queries": {}, "semantic_models": {}, "unit_tests": {"unit_test.demo.stg_decidim_blogs_posts.resource_type_definition": {"model": "stg_decidim_blogs_posts", "given": [{"input": "source('decidim', 'decidim_blogs_posts')", "rows": [{"id": 1}], "format": "dict", "fixture": null}], "expect": {"rows": [{"resource_type": "Decidim::Blogs::Post"}], "format": "dict", "fixture": null}, "name": "resource_type_definition", "resource_type": "unit_test", "package_name": "demo", "path": "staging/decidim/blogs_posts/schema.yml", "original_file_path": "models/staging/decidim/blogs_posts/schema.yml", "unique_id": "unit_test.demo.stg_decidim_blogs_posts.resource_type_definition", "fqn": ["demo", "staging", "decidim", "blogs_posts", "stg_decidim_blogs_posts", "resource_type_definition"], "description": "Checks that the resource type is properly defined", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_blogs_posts"]}, "config": {"tags": [], "meta": {}}, "checksum": "eb7438e26f14fb031c02d2388338d2ed2a0cab11ff0a98b10675c9e7304c9a37", "schema": "prod", "created_at": 1727441769.783929, "versions": null, "version": null}, "unit_test.demo.stg_decidim_debates.resource_type_definition": {"model": "stg_decidim_debates", "given": [{"input": "source('decidim', 'decidim_debates_debates')", "rows": [{"id": 1}], "format": "dict", "fixture": null}], "expect": {"rows": [{"resource_type": "Decidim::Debates::Debate"}], "format": "dict", "fixture": null}, "name": "resource_type_definition", "resource_type": "unit_test", "package_name": "demo", "path": "staging/decidim/debates/schema.yml", "original_file_path": "models/staging/decidim/debates/schema.yml", "unique_id": "unit_test.demo.stg_decidim_debates.resource_type_definition", "fqn": ["demo", "staging", "decidim", "debates", "stg_decidim_debates", "resource_type_definition"], "description": "Checks that the resource type is properly defined", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_debates"]}, "config": {"tags": [], "meta": {}}, "checksum": "17f10a03ce0eb3d75b3d757c7c0fd8a921bf6a1359393294b42a49ba31bfea02", "schema": "prod", "created_at": 1727441769.7915819, "versions": null, "version": null}, "unit_test.demo.stg_decidim_budgets_projects.resource_type_definition": {"model": "stg_decidim_budgets_projects", "given": [{"input": "source('decidim', 'decidim_budgets_projects')", "rows": [{"id": 1}], "format": "dict", "fixture": null}], "expect": {"rows": [{"resource_type": "Decidim::Budgets::Project"}], "format": "dict", "fixture": null}, "name": "resource_type_definition", "resource_type": "unit_test", "package_name": "demo", "path": "staging/decidim/budgets/schema.yml", "original_file_path": "models/staging/decidim/budgets/schema.yml", "unique_id": "unit_test.demo.stg_decidim_budgets_projects.resource_type_definition", "fqn": ["demo", "staging", "decidim", "budgets", "stg_decidim_budgets_projects", "resource_type_definition"], "description": "Checks that the resource type is properly defined", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_budgets_projects"]}, "config": {"tags": [], "meta": {}}, "checksum": "36df33d78ce20b3b36c751e7c28eaabddaff81942da7dc7c61d5c55e75b8efad", "schema": "prod", "created_at": 1727441769.80553, "versions": null, "version": null}, "unit_test.demo.stg_decidim_proposals.resource_type_definition": {"model": "stg_decidim_proposals", "given": [{"input": "source('decidim', 'decidim_proposals_proposals')", "rows": [{"id": 1}], "format": "dict", "fixture": null}], "expect": {"rows": [{"resource_type": "Decidim::Proposals::Proposal"}], "format": "dict", "fixture": null}, "name": "resource_type_definition", "resource_type": "unit_test", "package_name": "demo", "path": "staging/decidim/proposals/schema.yml", "original_file_path": "models/staging/decidim/proposals/schema.yml", "unique_id": "unit_test.demo.stg_decidim_proposals.resource_type_definition", "fqn": ["demo", "staging", "decidim", "proposals", "stg_decidim_proposals", "resource_type_definition"], "description": "Checks that the resource type is properly defined", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "053664ae8043289103cdc4ecc00f79758bc69b6b82f93f5b57b9a3c0b1ad3a0d", "schema": "prod", "created_at": 1727441769.812192, "versions": null, "version": null}, "unit_test.demo.blogs_posts.test_url_concatenation": {"model": "blogs_posts", "given": [{"input": "ref('stg_decidim_blogs_posts')", "rows": [{"id": 1, "decidim_component_id": 42}, {"id": 2, "decidim_component_id": 43}], "format": "dict", "fixture": null}, {"input": "ref('components')", "rows": [{"organization_host": "host1.com", "ps_space_type_slug": "foo", "ps_slug": "bar", "id": 42}, {"organization_host": "host2.com", "ps_space_type_slug": "type", "ps_slug": "space", "id": 43}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "post_url": "https://host1.com/foo/bar/f/42/posts/1"}, {"id": 2, "post_url": "https://host2.com/type/space/f/43/posts/2"}], "format": "dict", "fixture": null}, "name": "test_url_concatenation", "resource_type": "unit_test", "package_name": "demo", "path": "marts/blogs_posts/schema.yml", "original_file_path": "models/marts/blogs_posts/schema.yml", "unique_id": "unit_test.demo.blogs_posts.test_url_concatenation", "fqn": ["demo", "marts", "blogs_posts", "blogs_posts", "test_url_concatenation"], "description": "Check URL concatenation logic", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.blogs_posts"]}, "config": {"tags": [], "meta": {}}, "checksum": "c43e4202437c012524105287c529b6a46e29ebae4d732a254b44378506ad494a", "schema": "prod", "created_at": 1727441769.818351, "versions": null, "version": null}, "unit_test.demo.components.test_ps_type": {"model": "components", "given": [{"input": "ref('stg_decidim_assemblies')", "rows": [{"id": 1, "title": "Assembly 1", "published_at": "2023-01-01", "decidim_organization_id": 101}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_participatory_processes')", "rows": [{"id": 2, "title": "Process 1", "published_at": "2023-02-01", "decidim_organization_id": 101}], "format": "dict", "fixture": null}, {"input": "ref('int_components')", "rows": [{"id": 41, "participatory_space_id": 1, "participatory_space_type": "Decidim::Assembly", "published_at": "2024-01-01"}, {"id": 42, "participatory_space_id": 2, "participatory_space_type": "Decidim::ParticipatoryProcess", "published_at": "2024-02-01"}], "format": "dict", "fixture": null}, {"input": "ref('int_organizations')", "rows": [{"id": 101}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 41, "ps_type": "Decidim::Assembly"}, {"id": 42, "ps_type": "Decidim::ParticipatoryProcess"}], "format": "dict", "fixture": null}, "name": "test_ps_type", "resource_type": "unit_test", "package_name": "demo", "path": "marts/components/schema.yml", "original_file_path": "models/marts/components/schema.yml", "unique_id": "unit_test.demo.components.test_ps_type", "fqn": ["demo", "marts", "components", "components", "test_ps_type"], "description": "", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.components"]}, "config": {"tags": [], "meta": {}}, "checksum": "9817ee9c96b6f98c0133b23d4d955eefa1e9392d8ea5a2ddff76e2d87a819f7c", "schema": "prod", "created_at": 1727441769.825293, "versions": null, "version": null}, "unit_test.demo.components.test_ps_space_type_slug": {"model": "components", "given": [{"input": "ref('stg_decidim_assemblies')", "rows": [{"id": 1, "title": "Assembly 1", "slug": "slug1", "published_at": "2023-01-01", "decidim_organization_id": 101}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_participatory_processes')", "rows": [{"id": 2, "title": "Process 1", "slug": "slug2", "published_at": "2023-02-01", "decidim_organization_id": 101}], "format": "dict", "fixture": null}, {"input": "ref('int_components')", "rows": [{"id": 41, "participatory_space_id": 1, "participatory_space_type": "Decidim::Assembly", "published_at": "2024-01-01"}, {"id": 42, "participatory_space_id": 2, "participatory_space_type": "Decidim::ParticipatoryProcess", "published_at": "2024-02-01"}], "format": "dict", "fixture": null}, {"input": "ref('int_organizations')", "rows": [{"id": 101}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 41, "ps_space_type_slug": "assemblies"}, {"id": 42, "ps_space_type_slug": "processes"}], "format": "dict", "fixture": null}, "name": "test_ps_space_type_slug", "resource_type": "unit_test", "package_name": "demo", "path": "marts/components/schema.yml", "original_file_path": "models/marts/components/schema.yml", "unique_id": "unit_test.demo.components.test_ps_space_type_slug", "fqn": ["demo", "marts", "components", "components", "test_ps_space_type_slug"], "description": "", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.components"]}, "config": {"tags": [], "meta": {}}, "checksum": "e2ed42f87f27b1fc3ffdd2fc572399accf84e98cbf9050878a35286e880da5ad", "schema": "prod", "created_at": 1727441769.826292, "versions": null, "version": null}, "unit_test.demo.components.test_no_null_published_at": {"model": "components", "given": [{"input": "ref('stg_decidim_assemblies')", "rows": [{"id": 1, "published_at": "2023-01-01", "decidim_organization_id": 101}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_participatory_processes')", "rows": [{"id": 2, "published_at": "2023-02-01", "decidim_organization_id": 101}], "format": "dict", "fixture": null}, {"input": "ref('int_components')", "rows": [{"id": 41, "participatory_space_id": 1, "participatory_space_type": "Decidim::Assembly", "published_at": "2024-01-01"}, {"id": 42, "participatory_space_id": 2, "participatory_space_type": "Decidim::ParticipatoryProcess", "published_at": "2024-02-01"}, {"id": 43, "participatory_space_id": 1, "participatory_space_type": "Decidim::Assembly", "published_at": null}, {"id": 44, "participatory_space_id": 2, "participatory_space_type": "Decidim::ParticipatoryProcess", "published_at": "2024-02-01"}], "format": "dict", "fixture": null}, {"input": "ref('int_organizations')", "rows": [{"id": 101}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 41, "published_at": "2024-01-01"}, {"id": 42, "published_at": "2024-02-01"}, {"id": 43, "published_at": null}, {"id": 44, "published_at": "2024-02-01"}], "format": "dict", "fixture": null}, "name": "test_no_null_published_at", "resource_type": "unit_test", "package_name": "demo", "path": "marts/components/schema.yml", "original_file_path": "models/marts/components/schema.yml", "unique_id": "unit_test.demo.components.test_no_null_published_at", "fqn": ["demo", "marts", "components", "components", "test_no_null_published_at"], "description": "", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.components"]}, "config": {"tags": [], "meta": {}}, "checksum": "78c010a0b4ce617ea1bbf3459e78f04b6331a0b13aff30f6e621ad45230055c3", "schema": "prod", "created_at": 1727441769.826802, "versions": null, "version": null}, "unit_test.demo.components.test_take_only_assemblies_and_participatory_processes": {"model": "components", "given": [{"input": "ref('stg_decidim_assemblies')", "rows": [{"id": 1, "published_at": "2023-01-01", "decidim_organization_id": 101, "slug": "assemblies1"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_participatory_processes')", "rows": [{"id": 2, "published_at": "2023-01-15", "decidim_organization_id": 101, "slug": "process1"}], "format": "dict", "fixture": null}, {"input": "ref('int_components')", "rows": [{"id": 42, "participatory_space_type": "Decidim::Assembly", "participatory_space_id": 1, "published_at": "2024-01-01"}, {"id": 43, "participatory_space_type": "Decidim::ParticipatoryProcess", "participatory_space_id": 2, "published_at": "2024-02-01"}, {"id": 44, "participatory_space_type": "Decidim::Votations", "participatory_space_id": 3, "published_at": "2024-03-01"}], "format": "dict", "fixture": null}, {"input": "ref('int_organizations')", "rows": [{"id": 101}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 42, "decidim_organization_id": 101}, {"id": 43, "decidim_organization_id": 101}], "format": "dict", "fixture": null}, "name": "test_take_only_assemblies_and_participatory_processes", "resource_type": "unit_test", "package_name": "demo", "path": "marts/components/schema.yml", "original_file_path": "models/marts/components/schema.yml", "unique_id": "unit_test.demo.components.test_take_only_assemblies_and_participatory_processes", "fqn": ["demo", "marts", "components", "components", "test_take_only_assemblies_and_participatory_processes"], "description": "", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.components"]}, "config": {"tags": [], "meta": {}}, "checksum": "8264dbbdd5756c971a8c974089d1e7df0f3516e41821e115fe4e044631d9f684", "schema": "prod", "created_at": 1727441769.82778, "versions": null, "version": null}, "unit_test.demo.components.test_url_creation": {"model": "components", "given": [{"input": "ref('stg_decidim_assemblies')", "rows": [{"id": 1, "published_at": "2023-01-01", "decidim_organization_id": 101, "slug": "assemblies1"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_participatory_processes')", "rows": [{"id": 2, "published_at": "2023-01-15", "decidim_organization_id": 101, "slug": "process1"}], "format": "dict", "fixture": null}, {"input": "ref('int_components')", "rows": [{"id": 42, "participatory_space_type": "Decidim::Assembly", "participatory_space_id": 1, "published_at": "2024-01-01"}, {"id": 43, "participatory_space_type": "Decidim::ParticipatoryProcess", "participatory_space_id": 2, "published_at": "2024-02-01"}], "format": "dict", "fixture": null}, {"input": "ref('int_organizations')", "rows": [{"id": 101, "host": "organization1"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 42, "component_url": "https://organization1/assemblies/assemblies1/f/42", "ps_id": 1, "ps_url": "https://organization1/assemblies/assemblies1/", "decidim_organization_id": 101}, {"id": 43, "component_url": "https://organization1/processes/process1/f/43", "ps_id": 2, "ps_url": "https://organization1/processes/process1/", "decidim_organization_id": 101}], "format": "dict", "fixture": null}, "name": "test_url_creation", "resource_type": "unit_test", "package_name": "demo", "path": "marts/components/schema.yml", "original_file_path": "models/marts/components/schema.yml", "unique_id": "unit_test.demo.components.test_url_creation", "fqn": ["demo", "marts", "components", "components", "test_url_creation"], "description": "", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.components"]}, "config": {"tags": [], "meta": {}}, "checksum": "1b9184ef66b0dcb7f869cd343f184046a9e383147473a249586bada597df6789", "schema": "prod", "created_at": 1727441769.828757, "versions": null, "version": null}, "unit_test.demo.categorizations.testing_that_main_categories_are_properly_processed": {"model": "categorizations", "given": [{"input": "ref('stg_decidim_categories')", "rows": [{"id": 1, "name": "Environment"}, {"id": 2, "name": "Public Affairs"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_categorizations')", "rows": [{"decidim_category_id": 1, "categorizable_id": 23, "categorizable_type": "Decidim::Proposals::Proposal"}, {"decidim_category_id": 2, "categorizable_id": 25, "categorizable_type": "Decidim::Budgets::Project"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "category_name": "Environment", "child_id": 0, "child_name": "", "categorizable_id": 23, "categorizable_type": "Decidim::Proposals::Proposal"}, {"id": 2, "category_name": "Public Affairs", "child_id": 0, "child_name": "", "categorizable_id": 25, "categorizable_type": "Decidim::Budgets::Project"}], "format": "dict", "fixture": null}, "name": "testing_that_main_categories_are_properly_processed", "resource_type": "unit_test", "package_name": "demo", "path": "marts/categorizations/schema.yml", "original_file_path": "models/marts/categorizations/schema.yml", "unique_id": "unit_test.demo.categorizations.testing_that_main_categories_are_properly_processed", "fqn": ["demo", "marts", "categorizations", "categorizations", "testing_that_main_categories_are_properly_processed"], "description": "Checks that main categories has the correct infos ", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.categorizations"]}, "config": {"tags": [], "meta": {}}, "checksum": "161f8eeaf91497b4de33349be26b11f4e9372db26288bdcd2a487e92174f16c1", "schema": "prod", "created_at": 1727441769.829823, "versions": null, "version": null}, "unit_test.demo.categorizations.testing_that_sub_categories_are_properly_processed": {"model": "categorizations", "given": [{"input": "ref('stg_decidim_categories')", "rows": [{"id": 1, "name": "Environment", "parent_id": null}, {"id": 2, "name": "Public Affairs", "parent_id": null}, {"id": 101, "name": "Green public spaces", "parent_id": 1}, {"id": 102, "name": "Pollution", "parent_id": 1}, {"id": 201, "name": "Administration", "parent_id": 2}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_categorizations')", "rows": [{"decidim_category_id": 1, "categorizable_id": 23, "categorizable_type": "Decidim::Proposals::Proposal"}, {"decidim_category_id": 2, "categorizable_id": 25, "categorizable_type": "Decidim::Budgets::Project"}, {"decidim_category_id": 101, "categorizable_id": 1001, "categorizable_type": "Decidim::Proposals::Proposal"}, {"decidim_category_id": 102, "categorizable_id": 1002, "categorizable_type": "Decidim::Proposals::Proposal"}, {"decidim_category_id": 201, "categorizable_id": 2001, "categorizable_type": "Decidim::Budgets::Project"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "category_name": "Environment", "child_id": 0, "child_name": "", "categorizable_id": 23, "categorizable_type": "Decidim::Proposals::Proposal"}, {"id": 2, "category_name": "Public Affairs", "child_id": 0, "child_name": "", "categorizable_id": 25, "categorizable_type": "Decidim::Budgets::Project"}, {"id": 1, "category_name": "Environment", "child_id": 101, "child_name": "Green public spaces", "categorizable_id": 1001, "categorizable_type": "Decidim::Proposals::Proposal"}, {"id": 1, "category_name": "Environment", "child_id": 102, "child_name": "Pollution", "categorizable_id": 1002, "categorizable_type": "Decidim::Proposals::Proposal"}, {"id": 2, "category_name": "Public Affairs", "child_id": 201, "child_name": "Administration", "categorizable_id": 2001, "categorizable_type": "Decidim::Budgets::Project"}], "format": "dict", "fixture": null}, "name": "testing_that_sub_categories_are_properly_processed", "resource_type": "unit_test", "package_name": "demo", "path": "marts/categorizations/schema.yml", "original_file_path": "models/marts/categorizations/schema.yml", "unique_id": "unit_test.demo.categorizations.testing_that_sub_categories_are_properly_processed", "fqn": ["demo", "marts", "categorizations", "categorizations", "testing_that_sub_categories_are_properly_processed"], "description": "Checks that sub categories has the correct infos ", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.categorizations"]}, "config": {"tags": [], "meta": {}}, "checksum": "b83934eb842ec29d283ef2dccc073ec4937184614b3c2080d3fc17685dd922d1", "schema": "prod", "created_at": 1727441769.830809, "versions": null, "version": null}, "unit_test.demo.endorsements.moderations-check": {"model": "endorsements", "given": [{"input": "ref('stg_decidim_endorsements')", "rows": [{"id": 1, "resource_id": 1, "resource_type": "Decidim::Proposals::Proposal"}, {"id": 2, "resource_id": 2, "resource_type": "Decidim::Proposals::Proposal"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_moderations')", "rows": [{"decidim_reportable_id": 1, "decidim_reportable_type": "Decidim::Proposals::Proposal", "hidden_at": "2024-07-22"}, {"decidim_reportable_id": 2, "decidim_reportable_type": "Decidim::Proposals::Proposal", "hidden_at": null}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_proposals')", "rows": [{"id": 1, "resource_type": "Decidim::Proposals::Proposal"}, {"id": 2, "resource_type": "Decidim::Proposals::Proposal"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_debates')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_blogs_posts')", "rows": [{}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 2}], "format": "dict", "fixture": null}, "name": "moderations-check", "resource_type": "unit_test", "package_name": "demo", "path": "marts/endorsements/schema.yml", "original_file_path": "models/marts/endorsements/schema.yml", "unique_id": "unit_test.demo.endorsements.moderations-check", "fqn": ["demo", "marts", "endorsements", "endorsements", "moderations-check"], "description": "Check if endorsements to moderated proposals/debates/blog posts are properly ignored", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.endorsements"]}, "config": {"tags": [], "meta": {}}, "checksum": "3a11fa2d068270a1dedcf90e5cdee22503ba67c1a023b97fdd2c64758a884880", "schema": "prod", "created_at": 1727441769.8319411, "versions": null, "version": null}, "unit_test.demo.endorsements.endorsements-component-check": {"model": "endorsements", "given": [{"input": "ref('stg_decidim_endorsements')", "rows": [{"id": 1, "resource_id": 42, "resource_type": "Decidim::Proposals::Proposal"}, {"id": 2, "resource_id": 42, "resource_type": "Decidim::Debates::Debate"}, {"id": 3, "resource_id": 42, "resource_type": "Decidim::Blogs::Post"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_proposals')", "rows": [{"id": 42, "resource_type": "Decidim::Proposals::Proposal", "decidim_component_id": 100}, {"id": 91, "resource_type": "Decidim::Proposals::Proposal", "decidim_component_id": 991}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_debates')", "rows": [{"id": 42, "resource_type": "Decidim::Debates::Debate", "decidim_component_id": 200}, {"id": 92, "resource_type": "Decidim::Debates::Debate", "decidim_component_id": 992}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_blogs_posts')", "rows": [{"id": 42, "resource_type": "Decidim::Blogs::Post", "decidim_component_id": 300}, {"id": 93, "resource_type": "Decidim::Blogs::Post", "decidim_component_id": 993}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_moderations')", "rows": [{}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "decidim_component_id": 100}, {"id": 2, "decidim_component_id": 200}, {"id": 3, "decidim_component_id": 300}], "format": "dict", "fixture": null}, "name": "endorsements-component-check", "resource_type": "unit_test", "package_name": "demo", "path": "marts/endorsements/schema.yml", "original_file_path": "models/marts/endorsements/schema.yml", "unique_id": "unit_test.demo.endorsements.endorsements-component-check", "fqn": ["demo", "marts", "endorsements", "endorsements", "endorsements-component-check"], "description": "Check if endorsements are properly matched to their components", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.endorsements"]}, "config": {"tags": [], "meta": {}}, "checksum": "74fe535402ddaf5bbd14ae3f26c12f98e068c078258c75873ccfd1b8bac66202", "schema": "prod", "created_at": 1727441769.832486, "versions": null, "version": null}, "unit_test.demo.meetings.test_url_concatenation": {"model": "meetings", "given": [{"input": "ref('int_meetings')", "rows": [{"decidim_component_id": 1, "id": 100}], "format": "dict", "fixture": null}, {"input": "ref('components')", "rows": [{"organization_host": "host1", "ps_space_type_slug": "space_type_slug1", "ps_slug": "ps_slug1", "id": 1, "manifest_name": "meetings"}], "format": "dict", "fixture": null}, {"input": "ref(\"categorizations\")", "rows": [{"categorizable_id": 100}], "format": "dict", "fixture": null}], "expect": {"rows": [{"meeting_url": "https://host1/space_type_slug1/ps_slug1/f/1/meetings/100"}], "format": "dict", "fixture": null}, "name": "test_url_concatenation", "resource_type": "unit_test", "package_name": "demo", "path": "marts/meetings/schema.yml", "original_file_path": "models/marts/meetings/schema.yml", "unique_id": "unit_test.demo.meetings.test_url_concatenation", "fqn": ["demo", "marts", "meetings", "meetings", "test_url_concatenation"], "description": "Check URL concatenation logic", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.meetings"]}, "config": {"tags": [], "meta": {}}, "checksum": "e56762e868e7f9ed2a622429c34e91c3e5a0ff87f9087907d1db360ed294e140", "schema": "prod", "created_at": 1727441769.843999, "versions": null, "version": null}, "unit_test.demo.meetings.test_manifest_name_is_meetings": {"model": "meetings", "given": [{"input": "ref('int_meetings')", "rows": [{"decidim_component_id": 1, "id": 100}, {"decidim_component_id": 2, "id": 200}], "format": "dict", "fixture": null}, {"input": "ref('components')", "rows": [{"id": 1, "manifest_name": "meetings"}, {"id": 2, "manifest_name": "foo"}], "format": "dict", "fixture": null}, {"input": "ref(\"categorizations\")", "rows": [{}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 100}], "format": "dict", "fixture": null}, "name": "test_manifest_name_is_meetings", "resource_type": "unit_test", "package_name": "demo", "path": "marts/meetings/schema.yml", "original_file_path": "models/marts/meetings/schema.yml", "unique_id": "unit_test.demo.meetings.test_manifest_name_is_meetings", "fqn": ["demo", "marts", "meetings", "meetings", "test_manifest_name_is_meetings"], "description": "Check that manifest name filters on meetings", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.meetings"]}, "config": {"tags": [], "meta": {}}, "checksum": "9671543d8da01650b69dc3130e626c7107ea62e2c2818d5ec2cbb201430efdd7", "schema": "prod", "created_at": 1727441769.8445408, "versions": null, "version": null}, "unit_test.demo.proposals.withdrawn_proposals_check": {"model": "proposals", "given": [{"input": "ref('int_users')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_coauthorships')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_proposals_votes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('int_proposals')", "rows": [{"id": 41, "state": "submitted", "published_at": "2023-01-01", "decidim_component_id": 100}, {"id": 42, "state": "withdrawn", "published_at": "2023-01-02", "decidim_component_id": 100}], "format": "dict", "fixture": null}, {"input": "ref('components')", "rows": [{"id": 100}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_moderations')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('int_scopes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('categorizations')", "rows": [{}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 41, "state": "submitted"}], "format": "dict", "fixture": null}, "name": "withdrawn_proposals_check", "resource_type": "unit_test", "package_name": "demo", "path": "marts/proposals/schema.yml", "original_file_path": "models/marts/proposals/schema.yml", "unique_id": "unit_test.demo.proposals.withdrawn_proposals_check", "fqn": ["demo", "marts", "proposals", "proposals", "withdrawn_proposals_check"], "description": "Check if withdrawn proposals are properly removed", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "46bf72c0d7e701298d97608f5efe66874fb73cf2e9c011a9d900e148d532e678", "schema": "prod", "created_at": 1727441769.8505101, "versions": null, "version": null}, "unit_test.demo.proposals.moderations_proposals_check": {"model": "proposals", "given": [{"input": "ref('int_users')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_coauthorships')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_proposals_votes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('int_proposals')", "rows": [{"id": 43, "state": "submitted", "published_at": "2023-01-03", "decidim_component_id": 100}, {"id": 44, "state": "submitted", "published_at": "2023-01-03", "decidim_component_id": 100}], "format": "dict", "fixture": null}, {"input": "ref('components')", "rows": [{"id": 100}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_moderations')", "rows": [{"decidim_reportable_id": 43, "decidim_reportable_type": "Decidim::Proposals::Proposal", "hidden_at": "2024-07-22"}], "format": "dict", "fixture": null}, {"input": "ref('int_scopes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('categorizations')", "rows": [{}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 44}], "format": "dict", "fixture": null}, "name": "moderations_proposals_check", "resource_type": "unit_test", "package_name": "demo", "path": "marts/proposals/schema.yml", "original_file_path": "models/marts/proposals/schema.yml", "unique_id": "unit_test.demo.proposals.moderations_proposals_check", "fqn": ["demo", "marts", "proposals", "proposals", "moderations_proposals_check"], "description": "Check if proposals are properly ignored due to 'hidden_at' date and other moderation conditions", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "c95871be5e14969c07bd0da8f47391df026e1e773e13289644d94847d72886b9", "schema": "prod", "created_at": 1727441769.8511739, "versions": null, "version": null}, "unit_test.demo.proposals.conflict_on_decidim_reportable_type_check": {"model": "proposals", "given": [{"input": "ref('int_users')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_coauthorships')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_proposals_votes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('int_proposals')", "rows": [{"id": 43, "state": "submitted", "published_at": "2023-01-03", "decidim_component_id": 100}], "format": "dict", "fixture": null}, {"input": "ref('components')", "rows": [{"id": 100}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_moderations')", "rows": [{"decidim_reportable_id": 43, "decidim_reportable_type": "Decidim::Debates::Debate", "hidden_at": null}, {"decidim_reportable_id": 43, "decidim_reportable_type": "Decidim::Proposals::Proposal", "hidden_at": null}], "format": "dict", "fixture": null}, {"input": "ref('int_scopes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('categorizations')", "rows": [{}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 43}], "format": "dict", "fixture": null}, "name": "conflict_on_decidim_reportable_type_check", "resource_type": "unit_test", "package_name": "demo", "path": "marts/proposals/schema.yml", "original_file_path": "models/marts/proposals/schema.yml", "unique_id": "unit_test.demo.proposals.conflict_on_decidim_reportable_type_check", "fqn": ["demo", "marts", "proposals", "proposals", "conflict_on_decidim_reportable_type_check"], "description": "Check if there is no conflict in moderation table on id if there is a decidim_reportable_type that is not a proposal and has the same id", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "ca3008534822d18f38caa2f819e4782a2c0eabe9518b375f5fe6e277fc86a272", "schema": "prod", "created_at": 1727441769.851716, "versions": null, "version": null}, "unit_test.demo.proposals.published_at_check": {"model": "proposals", "given": [{"input": "ref('int_users')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_coauthorships')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_proposals_votes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('int_proposals')", "rows": [{"id": 43, "state": "submitted", "published_at": "2023-01-03", "decidim_component_id": 100}, {"id": 44, "state": "submitted", "published_at": null, "decidim_component_id": 100}], "format": "dict", "fixture": null}, {"input": "ref('components')", "rows": [{"id": 100}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_moderations')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('int_scopes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('categorizations')", "rows": [{}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 43}], "format": "dict", "fixture": null}, "name": "published_at_check", "resource_type": "unit_test", "package_name": "demo", "path": "marts/proposals/schema.yml", "original_file_path": "models/marts/proposals/schema.yml", "unique_id": "unit_test.demo.proposals.published_at_check", "fqn": ["demo", "marts", "proposals", "proposals", "published_at_check"], "description": "Check if proposals are properly ignored if 'published_at' is null", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "f3c4d2acc441595bef57899b0f9da3d27b11417154d8c704024f2b825ddf6a50", "schema": "prod", "created_at": 1727441769.852256, "versions": null, "version": null}, "unit_test.demo.int_organizations.test_filter_by_host": {"model": "int_organizations", "given": [{"input": "ref('stg_decidim_organizations')", "rows": [{"id": 1, "host": "host1.com"}, {"id": 2, "host": "host2.com"}, {"id": 3, "host": "host3.com"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "host": "host1.com"}], "format": "dict", "fixture": null}, "name": "test_filter_by_host", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/organizations/schema.yml", "original_file_path": "models/intermediate/organizations/schema.yml", "unique_id": "unit_test.demo.int_organizations.test_filter_by_host", "fqn": ["demo", "intermediate", "organizations", "int_organizations", "test_filter_by_host"], "description": "Test that the model only includes records with the specified host.", "overrides": {"macros": {}, "vars": {}, "env_vars": {"PARTICIPATION_HOST_NAME": "host1.com"}}, "depends_on": {"macros": [], "nodes": ["model.demo.int_organizations"]}, "config": {"tags": [], "meta": {}}, "checksum": "3ffd43912cc818e1cdd9a02af9d1c2baa07004dfa076ae0308ab5df4dc19d6bb", "schema": "prod", "created_at": 1727441769.853934, "versions": null, "version": null}, "unit_test.demo.int_organizations.test_regex_clean_description": {"model": "int_organizations", "given": [{"input": "ref('stg_decidim_organizations')", "rows": [{"id": 1, "description": "{\"fr\": \"

Welcome to &Decidim

\"}", "host": "host1.com"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "description": "Welcome to Decidim"}], "format": "dict", "fixture": null}, "name": "test_regex_clean_description", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/organizations/schema.yml", "original_file_path": "models/intermediate/organizations/schema.yml", "unique_id": "unit_test.demo.int_organizations.test_regex_clean_description", "fqn": ["demo", "intermediate", "organizations", "int_organizations", "test_regex_clean_description"], "description": "Test that the regex properly cleans the description field by removing HTML tags and entities.", "overrides": {"macros": {}, "vars": {}, "env_vars": {"PARTICIPATION_HOST_NAME": "host1.com"}}, "depends_on": {"macros": [], "nodes": ["model.demo.int_organizations"]}, "config": {"tags": [], "meta": {}}, "checksum": "1aa4927763e93ab0d202c2f7b1590b5d5811c5a87f4341b9f02aaccfe0fc344d", "schema": "prod", "created_at": 1727441769.854413, "versions": null, "version": null}, "unit_test.demo.int_forms_answers.int_forms_answers_author_status_check": {"model": "int_forms_answers", "given": [{"input": "ref('stg_decidim_forms_answers')", "rows": [{"decidim_user_id": 1}, {"decidim_user_id": null}], "format": "dict", "fixture": null}], "expect": {"rows": [{"author_status": "Inscrit et connect\u00e9"}, {"author_status": "Non connect\u00e9"}], "format": "dict", "fixture": null}, "name": "int_forms_answers_author_status_check", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/forms/schema.yml", "original_file_path": "models/intermediate/forms/schema.yml", "unique_id": "unit_test.demo.int_forms_answers.int_forms_answers_author_status_check", "fqn": ["demo", "intermediate", "forms", "int_forms_answers", "int_forms_answers_author_status_check"], "description": "Check that the author status is correctly detected", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_forms_answers"]}, "config": {"tags": [], "meta": {}}, "checksum": "30fbbbdc10405bc7c3cf35461d1e3d7e920736f21e27a27c367725ccf742e898", "schema": "prod", "created_at": 1727441769.8553119, "versions": null, "version": null}, "unit_test.demo.answers_short_and_long_answer.answers_short_and_long_answer_check": {"model": "answers_short_and_long_answer", "given": [{"input": "ref('int_forms_answers')", "rows": [{"id": 1, "decidim_question_id": 41, "body": "Answer 1"}, {"id": 2, "decidim_question_id": 42, "body": null}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_questions')", "rows": [{"id": 41, "decidim_questionnaire_id": 101, "body": "{\"fr\": \"Question 1\"}", "position": 1, "question_type": "short_answer"}, {"id": 42, "decidim_questionnaire_id": 101, "body": "{\"fr\": \"Question 2\"}", "position": 2, "question_type": "long_answer"}], "format": "dict", "fixture": null}, {"input": "ref('forms')", "rows": [{"id": 101}], "format": "dict", "fixture": null}], "expect": {"rows": [{"answer": "Answer 1", "sub_matrix_question": "", "custom_body": "", "sorting_position": -1, "decidim_questionnaire_id": 101, "position": 1}, {"answer": "Pas de r\u00e9ponse", "sub_matrix_question": "", "custom_body": "", "sorting_position": -1, "decidim_questionnaire_id": 101, "position": 2}], "format": "dict", "fixture": null}, "name": "answers_short_and_long_answer_check", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/forms/schema.yml", "original_file_path": "models/intermediate/forms/schema.yml", "unique_id": "unit_test.demo.answers_short_and_long_answer.answers_short_and_long_answer_check", "fqn": ["demo", "intermediate", "forms", "answers_short_and_long_answer", "answers_short_and_long_answer_check"], "description": "Check if option and sorting answers are correctly processed in the answers_short_and_long_answer CTE", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.answers_short_and_long_answer"]}, "config": {"tags": [], "meta": {}}, "checksum": "27662a116e5bd624cb2423e0197f7b8b6d7ac197ffce93f37b136cb057d6ee9b", "schema": "prod", "created_at": 1727441769.856771, "versions": null, "version": null}, "unit_test.demo.answers_matrix.answers_matrix_check": {"model": "answers_matrix", "given": [{"input": "ref('int_forms_answers')", "rows": [{"id": 901, "decidim_question_id": 41}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_questions')", "rows": [{"id": 41, "decidim_questionnaire_id": 101, "body": "How often do you go there ?", "question_type": "matrix_single"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_answer_choices')", "rows": [{"decidim_answer_id": 901, "body": "Rarely", "decidim_question_matrix_row_id": 1}, {"decidim_answer_id": 901, "body": "Never", "decidim_question_matrix_row_id": 2}, {"decidim_answer_id": 901, "body": "Often", "decidim_question_matrix_row_id": 3}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_question_matrix_rows')", "rows": [{"id": 1, "body": "Place 1"}, {"id": 2, "body": "Place 2"}, {"id": 3, "body": "Place 3"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"body": "How often do you go there ?", "answer": "Rarely", "sub_matrix_question": "Place 1", "sorting_position": -1, "decidim_questionnaire_id": 101, "custom_body": "", "question_type": "matrix_single"}, {"body": "How often do you go there ?", "answer": "Never", "sub_matrix_question": "Place 2", "sorting_position": -1, "decidim_questionnaire_id": 101, "custom_body": "", "question_type": "matrix_single"}, {"body": "How often do you go there ?", "answer": "Often", "sub_matrix_question": "Place 3", "sorting_position": -1, "decidim_questionnaire_id": 101, "custom_body": "", "question_type": "matrix_single"}], "format": "dict", "fixture": null}, "name": "answers_matrix_check", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/forms/schema.yml", "original_file_path": "models/intermediate/forms/schema.yml", "unique_id": "unit_test.demo.answers_matrix.answers_matrix_check", "fqn": ["demo", "intermediate", "forms", "answers_matrix", "answers_matrix_check"], "description": "Check if matrix answers are correctly processed", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.answers_matrix"]}, "config": {"tags": [], "meta": {}}, "checksum": "556bc9bc1bed125883a476da395cda9394c83fb1a94fc69d6fd557aeb5e8d1d7", "schema": "prod", "created_at": 1727441769.8585112, "versions": null, "version": null}, "unit_test.demo.answers_option_and_sorting.answers_option_and_sorting_check_on_question_type": {"model": "answers_option_and_sorting", "given": [{"input": "ref('int_forms_answers')", "rows": [{"id": 901, "decidim_question_id": 41}, {"id": 902, "decidim_question_id": 42}, {"id": 903, "decidim_question_id": 43}, {"id": 904, "decidim_question_id": 44}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_questions')", "rows": [{"id": 41, "question_type": "single_option"}, {"id": 42, "question_type": "multiple_option"}, {"id": 43, "question_type": "sorting"}, {"id": 44, "question_type": "matrix_single"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_answer_choices')", "rows": [{"decidim_answer_id": 901}, {"decidim_answer_id": 902}, {"decidim_answer_id": 903}, {"decidim_answer_id": 904}], "format": "dict", "fixture": null}], "expect": {"rows": [{"question_type": "single_option"}, {"question_type": "multiple_option"}, {"question_type": "sorting"}], "format": "dict", "fixture": null}, "name": "answers_option_and_sorting_check_on_question_type", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/forms/schema.yml", "original_file_path": "models/intermediate/forms/schema.yml", "unique_id": "unit_test.demo.answers_option_and_sorting.answers_option_and_sorting_check_on_question_type", "fqn": ["demo", "intermediate", "forms", "answers_option_and_sorting", "answers_option_and_sorting_check_on_question_type"], "description": "Check that question_type is correctly taken into account", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.answers_option_and_sorting"]}, "config": {"tags": [], "meta": {}}, "checksum": "29d207b693231893bc29f409bc074e036c6eb7e187e34ca9dbfc0f3e5b8f7f9e", "schema": "prod", "created_at": 1727441769.8593931, "versions": null, "version": null}, "unit_test.demo.answers_short_and_long_answer.short_and_long_answer_check_on_question_type": {"model": "answers_short_and_long_answer", "given": [{"input": "ref('int_forms_answers')", "rows": [{"id": 901, "decidim_question_id": 41}, {"id": 902, "decidim_question_id": 42}, {"id": 903, "decidim_question_id": 43}, {"id": 904, "decidim_question_id": 44}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_questions')", "rows": [{"id": 41, "question_type": "short_answer"}, {"id": 42, "question_type": "long_answer"}, {"id": 43, "question_type": "sorting"}, {"id": 44, "question_type": "matrix_single"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"question_type": "short_answer"}, {"question_type": "long_answer"}], "format": "dict", "fixture": null}, "name": "short_and_long_answer_check_on_question_type", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/forms/schema.yml", "original_file_path": "models/intermediate/forms/schema.yml", "unique_id": "unit_test.demo.answers_short_and_long_answer.short_and_long_answer_check_on_question_type", "fqn": ["demo", "intermediate", "forms", "answers_short_and_long_answer", "short_and_long_answer_check_on_question_type"], "description": "Check that question_type is correctly taken into account", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.answers_short_and_long_answer"]}, "config": {"tags": [], "meta": {}}, "checksum": "b3553f57599f4bcc0997a33d0f7158e00c4e326a0a3c9d87434041aa6783da06", "schema": "prod", "created_at": 1727441769.8597991, "versions": null, "version": null}, "unit_test.demo.answers_matrix.answers_matrix_check_on_question_type": {"model": "answers_matrix", "given": [{"input": "ref('int_forms_answers')", "rows": [{"id": 901, "decidim_question_id": 41}, {"id": 902, "decidim_question_id": 42}, {"id": 903, "decidim_question_id": 43}, {"id": 904, "decidim_question_id": 44}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_questions')", "rows": [{"id": 41, "question_type": "short_answer"}, {"id": 42, "question_type": "long_answer"}, {"id": 43, "question_type": "matrix_multiple"}, {"id": 44, "question_type": "matrix_single"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_answer_choices')", "rows": [{"decidim_answer_id": 903, "decidim_question_matrix_row_id": 1}, {"decidim_answer_id": 904, "decidim_question_matrix_row_id": 2}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_question_matrix_rows')", "rows": [{"id": 1}, {"id": 2}, {"id": 3}], "format": "dict", "fixture": null}], "expect": {"rows": [{"question_type": "matrix_multiple"}, {"question_type": "matrix_single"}], "format": "dict", "fixture": null}, "name": "answers_matrix_check_on_question_type", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/forms/schema.yml", "original_file_path": "models/intermediate/forms/schema.yml", "unique_id": "unit_test.demo.answers_matrix.answers_matrix_check_on_question_type", "fqn": ["demo", "intermediate", "forms", "answers_matrix", "answers_matrix_check_on_question_type"], "description": "Check that question_type is correctly taken into account", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.answers_matrix"]}, "config": {"tags": [], "meta": {}}, "checksum": "824c413a3cf2f73558cf4b203a42542cdcb695fdd70abab16e1f59c644f66686", "schema": "prod", "created_at": 1727441769.860398, "versions": null, "version": null}, "unit_test.demo.int_components.test_translated_manifest_name": {"model": "int_components", "given": [{"input": "ref('stg_decidim_components')", "rows": [{"id": 1, "manifest_name": "accountability"}, {"id": 2, "manifest_name": "pages"}, {"id": 3, "manifest_name": "budgets"}, {"id": 4, "manifest_name": "meetings"}, {"id": 5, "manifest_name": "proposals"}, {"id": 6, "manifest_name": "surveys"}, {"id": 7, "manifest_name": "blogs"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "translated_manifest_name": "Suivi"}, {"id": 2, "translated_manifest_name": "Page"}, {"id": 3, "translated_manifest_name": "Budgets"}, {"id": 4, "translated_manifest_name": "Rencontres"}, {"id": 5, "translated_manifest_name": "Propositions"}, {"id": 6, "translated_manifest_name": "Enqu\u00eates"}, {"id": 7, "translated_manifest_name": "Blogs"}], "format": "dict", "fixture": null}, "name": "test_translated_manifest_name", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/components/schema.yml", "original_file_path": "models/intermediate/components/schema.yml", "unique_id": "unit_test.demo.int_components.test_translated_manifest_name", "fqn": ["demo", "intermediate", "components", "int_components", "test_translated_manifest_name"], "description": "", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_components"]}, "config": {"tags": [], "meta": {}}, "checksum": "ef0147cb1b03f6ccaab1db45b7b72dc773046c25fab2a661f02e72b1161d22c6", "schema": "prod", "created_at": 1727441769.863044, "versions": null, "version": null}, "unit_test.demo.int_users.deleted_users_check": {"model": "int_users", "given": [{"input": "ref('stg_decidim_users')", "rows": [{"id": 1, "deleted_at": "2024-07-17", "type": "Decidim::User"}, {"id": 2, "deleted_at": null, "type": "Decidim::User"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 2}], "format": "dict", "fixture": null}, "name": "deleted_users_check", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/users/schema.yml", "original_file_path": "models/intermediate/users/schema.yml", "unique_id": "unit_test.demo.int_users.deleted_users_check", "fqn": ["demo", "intermediate", "users", "int_users", "deleted_users_check"], "description": "Check that no deleted users are retrieved", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_users"]}, "config": {"tags": [], "meta": {}}, "checksum": "d9c03269fac281530a3935d59e3433f531d771356b3e28f1ddc2910a1d9d0d76", "schema": "prod", "created_at": 1727441769.866791, "versions": null, "version": null}, "unit_test.demo.int_users.type_check": {"model": "int_users", "given": [{"input": "ref('stg_decidim_users')", "rows": [{"id": 1, "type": "Decidim::User"}, {"id": 2, "type": "Decidim::Admin"}, {"id": 3, "type": "Decidim::Admin, Decidim::User"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1}], "format": "dict", "fixture": null}, "name": "type_check", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/users/schema.yml", "original_file_path": "models/intermediate/users/schema.yml", "unique_id": "unit_test.demo.int_users.type_check", "fqn": ["demo", "intermediate", "users", "int_users", "type_check"], "description": "Check that the type contains Decidim::User", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_users"]}, "config": {"tags": [], "meta": {}}, "checksum": "70fed1350b42b9929a9a7f7584487c58e07b99c676aac775602ff673a788ed71", "schema": "prod", "created_at": 1727441769.8673239, "versions": null, "version": null}, "unit_test.demo.int_users.sign_in_frequency_check": {"model": "int_users", "given": [{"input": "ref('stg_decidim_users')", "rows": [{"sign_in_count": 0, "type": "Decidim::User"}, {"sign_in_count": 1, "type": "Decidim::User"}, {"sign_in_count": 2, "type": "Decidim::User"}, {"sign_in_count": 3, "type": "Decidim::User"}, {"sign_in_count": 4, "type": "Decidim::User"}, {"sign_in_count": 5, "type": "Decidim::User"}, {"sign_in_count": 6, "type": "Decidim::User"}, {"sign_in_count": 7, "type": "Decidim::User"}, {"sign_in_count": 8, "type": "Decidim::User"}, {"sign_in_count": 9, "type": "Decidim::User"}, {"sign_in_count": 10, "type": "Decidim::User"}, {"sign_in_count": 11, "type": "Decidim::User"}, {"sign_in_count": 100, "type": "Decidim::User"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"sign_in_frequency": "Jamais"}, {"sign_in_frequency": "Une seule fois"}, {"sign_in_frequency": "Deux fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Plus de 10 fois"}, {"sign_in_frequency": "Plus de 10 fois"}], "format": "dict", "fixture": null}, "name": "sign_in_frequency_check", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/users/schema.yml", "original_file_path": "models/intermediate/users/schema.yml", "unique_id": "unit_test.demo.int_users.sign_in_frequency_check", "fqn": ["demo", "intermediate", "users", "int_users", "sign_in_frequency_check"], "description": "Check that the sign in frequency is properly calculated", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_users"]}, "config": {"tags": [], "meta": {}}, "checksum": "6a820ca405c9eb1ea0e0eff4a300a42d2bfad0ae5c2985c25021b2310682354d", "schema": "prod", "created_at": 1727441769.868347, "versions": null, "version": null}, "unit_test.demo.int_budgets_orders.vote_finished_test": {"model": "int_budgets_orders", "given": [{"input": "ref('stg_decidim_budgets_orders')", "rows": [{"id": 1, "checked_out_at": "2024-04-03"}, {"id": 2, "checked_out_at": null}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "vote_finished": true}, {"id": 2, "vote_finished": false}], "format": "dict", "fixture": null}, "name": "vote_finished_test", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/budgets/schema.yml", "original_file_path": "models/intermediate/budgets/schema.yml", "unique_id": "unit_test.demo.int_budgets_orders.vote_finished_test", "fqn": ["demo", "intermediate", "budgets", "int_budgets_orders", "vote_finished_test"], "description": "Checks that the boolean is properly set to True only if there is a checked_out_at timestamp", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_budgets_orders"]}, "config": {"tags": [], "meta": {}}, "checksum": "d70b7d78fdbe2bccee166df639e81431ddea02bdb41280ef3df91af064e17737", "schema": "prod", "created_at": 1727441769.869021, "versions": null, "version": null}, "unit_test.demo.int_budgets_projects.is_selected_test": {"model": "int_budgets_projects", "given": [{"input": "ref('stg_decidim_budgets_projects')", "rows": [{"id": 1, "selected_at": "2024-04-03"}, {"id": 2, "selected_at": null}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "is_selected": true}, {"id": 2, "is_selected": false}], "format": "dict", "fixture": null}, "name": "is_selected_test", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/budgets/schema.yml", "original_file_path": "models/intermediate/budgets/schema.yml", "unique_id": "unit_test.demo.int_budgets_projects.is_selected_test", "fqn": ["demo", "intermediate", "budgets", "int_budgets_projects", "is_selected_test"], "description": "Checks that the boolean is properly set to True only if there is a selected_at timestamp", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_budgets_projects"]}, "config": {"tags": [], "meta": {}}, "checksum": "bc0d0eda2b984b5fd6a997d8d00cefff68cb7df81fd8735d7bc1d3581e93f8b0", "schema": "prod", "created_at": 1727441769.869627, "versions": null, "version": null}, "unit_test.demo.int_proposals.test_default_state": {"model": "int_proposals", "given": [{"input": "ref('stg_decidim_proposals')", "rows": [{"id": 1, "published_at": "2024-08-12", "state": null}, {"id": 2, "published_at": "2024-08-12", "state": "rejected"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "state": "Pas d'\u00e9tat", "translated_state": "Pas d'\u00e9tat"}, {"id": 2, "state": "rejected", "translated_state": "Rejet\u00e9e"}], "format": "dict", "fixture": null}, "name": "test_default_state", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/proposals/schema.yml", "original_file_path": "models/intermediate/proposals/schema.yml", "unique_id": "unit_test.demo.int_proposals.test_default_state", "fqn": ["demo", "intermediate", "proposals", "int_proposals", "test_default_state"], "description": "Test that the state column correctly defaults to 'Pas d'\u00e9tat' if null", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "99d1bb435590a321f2dfe40852c9fc9f2ce8248a328ce6b64f8008bcc17f0e24", "schema": "prod", "created_at": 1727441769.8711412, "versions": null, "version": null}, "unit_test.demo.int_proposals.test_translated_state": {"model": "int_proposals", "given": [{"input": "ref('stg_decidim_proposals')", "rows": [{"id": 1, "published_at": "2024-08-12", "state": "evaluating"}, {"id": 2, "published_at": "2024-08-12", "state": "rejected"}, {"id": 3, "published_at": "2024-08-12", "state": "accepted"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "translated_state": "En cours d'\u00e9valuation"}, {"id": 2, "translated_state": "Rejet\u00e9e"}, {"id": 3, "translated_state": "Accept\u00e9e"}], "format": "dict", "fixture": null}, "name": "test_translated_state", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/proposals/schema.yml", "original_file_path": "models/intermediate/proposals/schema.yml", "unique_id": "unit_test.demo.int_proposals.test_translated_state", "fqn": ["demo", "intermediate", "proposals", "int_proposals", "test_translated_state"], "description": "Test that the state column is correctly translated", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "46e7cf3cc02dd0af985de431a877d98a41bf18854a1fd4de9dfd1b9a3def31d4", "schema": "prod", "created_at": 1727441769.871907, "versions": null, "version": null}, "unit_test.demo.int_proposals.test_default_address": {"model": "int_proposals", "given": [{"input": "ref('stg_decidim_proposals')", "rows": [{"id": 1, "published_at": "2024-08-12", "address": ""}, {"id": 2, "published_at": "2024-08-12", "address": "1 Place Hannah Arendt"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "address": "Pas d'adresse"}, {"id": 2, "address": "1 Place Hannah Arendt"}], "format": "dict", "fixture": null}, "name": "test_default_address", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/proposals/schema.yml", "original_file_path": "models/intermediate/proposals/schema.yml", "unique_id": "unit_test.demo.int_proposals.test_default_address", "fqn": ["demo", "intermediate", "proposals", "int_proposals", "test_default_address"], "description": "Test that the address column correctly defaults to 'Pas d'adresse' if empty", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "4b15bb31bd37d801158ffb6821c2efb44897a972db9e9fd773b47e756ed2ddc1", "schema": "prod", "created_at": 1727441769.872523, "versions": null, "version": null}, "unit_test.demo.int_proposals.test_published_at_not_null": {"model": "int_proposals", "given": [{"input": "ref('stg_decidim_proposals')", "rows": [{"id": 1, "published_at": "2023-01-01"}, {"id": 2, "published_at": null}, {"id": 3, "published_at": "2023-02-01"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "published_at": "2023-01-01"}, {"id": 3, "published_at": "2023-02-01"}], "format": "dict", "fixture": null}, "name": "test_published_at_not_null", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/proposals/schema.yml", "original_file_path": "models/intermediate/proposals/schema.yml", "unique_id": "unit_test.demo.int_proposals.test_published_at_not_null", "fqn": ["demo", "intermediate", "proposals", "int_proposals", "test_published_at_not_null"], "description": "Test that only rows with non-null published_at are included", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "e0807cc7eb3d4c87115af2388bd7d58ada8368b6a782f0e8b6ae5c0d2f8fb0e5", "schema": "prod", "created_at": 1727441769.87285, "versions": null, "version": null}, "unit_test.test_lyon.int_decidim_awesome_proposal_extra_fields.testing_that_the_correct_xml_information_are_parsed": {"model": "int_decidim_awesome_proposal_extra_fields", "given": [{"input": "ref('stg_decidim_awesome_proposal_extra_fields')", "rows": [{"id": 1, "proposal_id": 101, "private_body_clear": "
Cette id\u00e9e est d\u00e9pos\u00e9e \u00e0 titre :
Individuel
Votre tranche d'\u00e2ge :
16-25 ans
"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "proposal_id": 101, "private_field_description": "Cette id\u00e9e est d\u00e9pos\u00e9e \u00e0 titre :", "private_field_content": "Individuel"}, {"id": 1, "proposal_id": 101, "private_field_description": "Votre tranche d'\u00e2ge :", "private_field_content": "16-25 ans"}], "format": "dict", "fixture": null}, "name": "testing_that_the_correct_xml_information_are_parsed", "resource_type": "unit_test", "package_name": "test_lyon", "path": "intermediate/decidim_awesome/schema.yml", "original_file_path": "models/intermediate/decidim_awesome/schema.yml", "unique_id": "unit_test.test_lyon.int_decidim_awesome_proposal_extra_fields.testing_that_the_correct_xml_information_are_parsed", "fqn": ["test_lyon", "intermediate", "decidim_awesome", "int_decidim_awesome_proposal_extra_fields", "testing_that_the_correct_xml_information_are_parsed"], "description": "Checks that age matching fetches the correct infos ", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.test_lyon.int_decidim_awesome_proposal_extra_fields"]}, "config": {"tags": [], "meta": {}}, "checksum": "e0b27182953e4023551ddfadb365b30f131b958c51aff139d3210bf258637f2e", "schema": "prod", "created_at": 1727446205.904194, "versions": null, "version": null}}} \ No newline at end of file diff --git a/projects/test_lyon/target/partial_parse.msgpack b/projects/test_lyon/target/partial_parse.msgpack new file mode 100644 index 0000000000000000000000000000000000000000..b170e3683b414af1e412186a9814ebeb27eef846 GIT binary patch literal 1023822 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 bbJ@s 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'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description, + secondary_hosts, + available_authorizations, + header_snippets, + tos_version, + badges_enabled, + send_welcome_notification, + users_registration_mode, + time_zone + FROM source + WHERE host = '' + -- Assumption: There is only one organization, so we select the first available host + LIMIT 1 +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/intermediate/proposals/int_proposals.sql b/projects/test_lyon/target/run/demo/models/intermediate/proposals/int_proposals.sql new file mode 100644 index 00000000..8fd1dafb --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/intermediate/proposals/int_proposals.sql @@ -0,0 +1,37 @@ + + + + + create table "test_lyon"."prod"."int_proposals__dbt_tmp" + + + as + + ( + + +SELECT + decidim_proposals.id, + decidim_proposals.title, + decidim_proposals.body, + decidim_proposals.resource_type, + decidim_proposals.decidim_component_id, + decidim_proposals.decidim_scope_id, + decidim_proposals.created_at, + decidim_proposals.published_at, + COALESCE(NULLIF(decidim_proposals.state, NULL), 'Pas d''état') AS state, + (CASE + WHEN decidim_proposals.state = 'evaluating' THEN 'En cours d''évaluation' + WHEN decidim_proposals.state = 'rejected' THEN 'Rejetée' + WHEN decidim_proposals.state = 'accepted' THEN 'Acceptée' + WHEN decidim_proposals.state IS NULL THEN 'Pas d''état' + ELSE decidim_proposals.state + END + ) AS translated_state, + decidim_proposals.comments_count, + decidim_proposals.endorsements_count, + COALESCE(NULLIF(decidim_proposals.address,''),'Pas d''adresse') AS address +FROM "test_lyon"."prod"."stg_decidim_proposals" AS decidim_proposals +WHERE published_at IS NOT NULL + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/intermediate/scopes/int_scopes.sql b/projects/test_lyon/target/run/demo/models/intermediate/scopes/int_scopes.sql new file mode 100644 index 00000000..10cc4ca8 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/intermediate/scopes/int_scopes.sql @@ -0,0 +1,24 @@ + + + + + create table "test_lyon"."prod"."int_scopes__dbt_tmp" + + + as + + ( + -- Due to ARRAY bug in test, we create an intermediate scopes without the column part_of + +SELECT + decidim_scopes.id, + decidim_scopes.decidim_organization_id, + decidim_scopes.created_at, + decidim_scopes.updated_at, + coalesce(nullif(decidim_scopes.name, ''), 'Sans secteur') as name, + decidim_scopes.scope_type_id, + decidim_scopes.parent_id, + decidim_scopes.code +FROM "test_lyon"."prod"."stg_decidim_scopes" as decidim_scopes + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/intermediate/users/int_users.sql b/projects/test_lyon/target/run/demo/models/intermediate/users/int_users.sql new file mode 100644 index 00000000..955cb7d9 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/intermediate/users/int_users.sql @@ -0,0 +1,59 @@ + + + + + create table "test_lyon"."prod"."int_users__dbt_tmp" + + + as + + ( + + +SELECT + decidim_users.id, + decidim_users.email, + decidim_users.sign_in_count, + (CASE + WHEN decidim_users.sign_in_count = 0 THEN 'Jamais' + WHEN decidim_users.sign_in_count = 1 THEN 'Une seule fois' + WHEN decidim_users.sign_in_count = 2 THEN 'Deux fois' + WHEN decidim_users.sign_in_count BETWEEN 2 AND 10 THEN 'Entre 2 et 10 fois' + ELSE 'Plus de 10 fois' + END + ) AS sign_in_frequency, + decidim_users.last_sign_in_at, + decidim_users.created_at, + decidim_users.updated_at, + decidim_users.invitation_created_at, + decidim_users.invitation_sent_at, + decidim_users.invitation_accepted_at, + decidim_users.invited_by_id, + decidim_users.invited_by_type, + decidim_users.decidim_organization_id, + decidim_users.confirmed_at, + decidim_users.confirmation_token, + decidim_users.unconfirmed_email, + decidim_users.name, + decidim_users.locale, + decidim_users.deleted_at, + decidim_users.admin, + decidim_users.managed, + decidim_users.roles, + decidim_users.nickname, + decidim_users.accepted_tos_version, + decidim_users.type, + decidim_users.following_count, + decidim_users.followers_count, + decidim_users.failed_attempts, + decidim_users.locked_at, + decidim_users.admin_terms_accepted_at, + decidim_users.blocked, + decidim_users.blocked_at, + (CASE WHEN decidim_users.confirmed_at IS NULL THEN false ELSE true END) AS confirmed, + decidim_users.extended_data +FROM "test_lyon"."prod"."stg_decidim_users" as decidim_users + WHERE deleted_at IS NULL + AND type LIKE 'Decidim::User' + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/attachments.sql b/projects/test_lyon/target/run/demo/models/marts/attachments.sql new file mode 100644 index 00000000..d8f125ea --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/attachments.sql @@ -0,0 +1,27 @@ + + + + + create table "test_lyon"."prod"."attachments__dbt_tmp" + + + as + + ( + WITH org AS ( + -- Assumption: There is only one organization, so we select the first available host + SELECT host + FROM "test_lyon"."prod"."organizations" + LIMIT 1 +) +SELECT + decidim_attachments.id, + decidim_attachments.file, + decidim_attachments.attached_to_id, + decidim_attachments.attached_to_type, + concat('https://', org.host, '/uploads/decidim/attachment/file/', decidim_attachments.id, '/', decidim_attachments.file) AS url +FROM + "test_lyon"."prod"."stg_decidim_attachments" AS decidim_attachments +CROSS JOIN org + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/blogs_posts/blogs_posts.sql b/projects/test_lyon/target/run/demo/models/marts/blogs_posts/blogs_posts.sql new file mode 100644 index 00000000..26a0da6c --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/blogs_posts/blogs_posts.sql @@ -0,0 +1,23 @@ + + + + + create table "test_lyon"."prod"."blogs_posts__dbt_tmp" + + + as + + ( + SELECT + decidim_blogs_posts.id, + decidim_blogs_posts.title, + decidim_blogs_posts.body, + decidim_blogs_posts.decidim_component_id, + decidim_blogs_posts.created_at, + decidim_blogs_posts.decidim_author_id, + decidim_blogs_posts.resource_type, + concat('https://', decidim_components.organization_host, '/', decidim_components.ps_space_type_slug, '/', decidim_components.ps_slug, '/f/', decidim_components.id, '/posts/', decidim_blogs_posts.id) AS post_url +FROM "test_lyon"."prod"."stg_decidim_blogs_posts" AS decidim_blogs_posts +JOIN "test_lyon"."prod"."components" AS decidim_components ON decidim_components.id = decidim_component_id + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/budgets/budgets.sql b/projects/test_lyon/target/run/demo/models/marts/budgets/budgets.sql new file mode 100644 index 00000000..2538f2dd --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/budgets/budgets.sql @@ -0,0 +1,21 @@ + + + + + create table "test_lyon"."prod"."budgets__dbt_tmp" + + + as + + ( + SELECT + decidim_budgets_budgets.id, + decidim_budgets_budgets.title, + decidim_components.id AS decidim_component_id, + decidim_components.ps_url AS url, + decidim_components.ps_slug, + decidim_components.ps_title +FROM "test_lyon"."prod"."stg_decidim_budgets" AS decidim_budgets_budgets +JOIN "test_lyon"."prod"."components" AS decidim_components on decidim_components.id = decidim_budgets_budgets.decidim_component_id + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/budgets/budgets_projects.sql b/projects/test_lyon/target/run/demo/models/marts/budgets/budgets_projects.sql new file mode 100644 index 00000000..d8049bf8 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/budgets/budgets_projects.sql @@ -0,0 +1,45 @@ + + + + + create table "test_lyon"."prod"."budgets_projects__dbt_tmp" + + + as + + ( + WITH categorizations AS ( + + SELECT + array_agg(category_name) AS categories, + array_agg(child_name) AS sub_categories, + categorizable_id + FROM "test_lyon"."prod"."categorizations" AS categorizations + WHERE categorizations.categorizable_type = 'Decidim::Budgets::Project' + GROUP BY categorizable_id + +) +SELECT + decidim_budgets_projects.id, + decidim_budgets_projects.title, + decidim_budgets_projects.description, + decidim_budgets_projects.created_at, + decidim_budgets_projects.decidim_scope_id, + decidim_budgets_projects.project_amount, + decidim_budgets_projects.selected_at, + decidim_budgets_projects.is_selected, + decidim_budgets_budgets.id AS budget_id, + decidim_budgets_budgets.title AS budget_title, + decidim_budgets_projects.resource_type, + decidim_budgets_budgets.decidim_component_id, + concat(decidim_components.component_url,'/', decidim_components.manifest_name,'/', decidim_budgets_budgets.id, '/projects/', decidim_budgets_projects.id) AS project_url, + categorizations.categories, + coalesce(categorizations.categories[1], 'Sans catégorie') AS first_category, + categorizations.sub_categories, + coalesce(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category +FROM "test_lyon"."prod"."int_budgets_projects" AS decidim_budgets_projects +JOIN "test_lyon"."prod"."stg_decidim_budgets" AS decidim_budgets_budgets on decidim_budgets_budgets.id = decidim_budgets_projects.decidim_budgets_budget_id +JOIN "test_lyon"."prod"."components" as decidim_components on decidim_components.id = decidim_budgets_budgets.decidim_component_id +LEFT JOIN categorizations on categorizations.categorizable_id = decidim_budgets_projects.id + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/budgets/projects_votes.sql b/projects/test_lyon/target/run/demo/models/marts/budgets/projects_votes.sql new file mode 100644 index 00000000..7d5b9b51 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/budgets/projects_votes.sql @@ -0,0 +1,40 @@ + + + + + create table "test_lyon"."prod"."projects_votes__dbt_tmp" + + + as + + ( + -- /!\ Warning : counts unfinished votes ! +-- /!\ Warning : should be filtered on the corresponding budget to get the good values + + + +WITH budgets_projects AS ( + SELECT + decidim_budgets_line_items.decidim_order_id, + decidim_budgets_projects.id AS "project_id", + decidim_budgets_projects.title AS "project_title", + decidim_budgets_projects.decidim_component_id, + decidim_budgets_projects.project_url + from "test_lyon"."prod"."stg_decidim_budgets_line_items" AS decidim_budgets_line_items + JOIN "test_lyon"."prod"."budgets_projects" decidim_budgets_projects on decidim_budgets_projects.id = decidim_budgets_line_items.decidim_project_id +) + SELECT + decidim_budgets_orders.id as order_id, + decidim_budgets_orders.decidim_user_id, + budgets_projects.project_id, + budgets_projects.project_title, + budgets_projects.decidim_component_id, + decidim_budgets_orders.created_at, + decidim_budgets_orders.checked_out_at, + budgets_projects.project_url, + decidim_budgets_orders.vote_finished, + decidim_budgets_orders.decidim_budgets_budget_id + from "test_lyon"."prod"."int_budgets_orders" AS decidim_budgets_orders + LEFT JOIN budgets_projects on decidim_order_id = decidim_budgets_orders.id + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/categorizations/categorizations.sql b/projects/test_lyon/target/run/demo/models/marts/categorizations/categorizations.sql new file mode 100644 index 00000000..ae4f6e37 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/categorizations/categorizations.sql @@ -0,0 +1,43 @@ + + + + + create table "test_lyon"."prod"."categorizations__dbt_tmp" + + + as + + ( + WITH main_categories AS ( + SELECT + decidim_categories.id AS id, + decidim_categories.name AS category_name, + 0 AS child_id, + '' AS child_name, + decidim_categorizations.categorizable_id, + decidim_categorizations.categorizable_type + FROM "test_lyon"."prod"."stg_decidim_categorizations" AS decidim_categorizations + JOIN "test_lyon"."prod"."stg_decidim_categories" AS decidim_categories ON decidim_categories.id = decidim_categorizations.decidim_category_id + WHERE decidim_categories.parent_id IS NULL +), +sub_categories AS ( + SELECT + parent_categories.id AS id, + parent_categories.name AS category_name, + decidim_categories.id AS child_id, + decidim_categories.name AS child_name, + decidim_categorizations.categorizable_id, + decidim_categorizations.categorizable_type + FROM "test_lyon"."prod"."stg_decidim_categorizations" AS decidim_categorizations + JOIN "test_lyon"."prod"."stg_decidim_categories" AS decidim_categories ON decidim_categories.id = decidim_categorizations.decidim_category_id + LEFT JOIN "test_lyon"."prod"."stg_decidim_categories" AS parent_categories ON decidim_categories.parent_id = parent_categories.id + WHERE decidim_categories.parent_id IS NOT NULL +), +categories AS ( + SELECT * FROM main_categories + UNION ALL + SELECT * FROM sub_categories +) +SELECT * FROM categories + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/comments/comments.sql b/projects/test_lyon/target/run/demo/models/marts/comments/comments.sql new file mode 100644 index 00000000..9c385428 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/comments/comments.sql @@ -0,0 +1,106 @@ + + + + + create table "test_lyon"."prod"."comments__dbt_tmp" + + + as + + ( + + + + + +WITH commentaries AS ( + + SELECT + comments.*, + "test_lyon"."prod"."stg_decidim_accountability_results".decidim_component_id AS "decidim_component_id" + FROM "test_lyon"."prod"."stg_decidim_accountability_results" + JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments + on comments.decidim_root_commentable_id = "test_lyon"."prod"."stg_decidim_accountability_results".id + and comments.decidim_root_commentable_type = 'Decidim::Accountability::Result' + union all + + SELECT + comments.*, + "test_lyon"."prod"."blogs_posts".decidim_component_id AS "decidim_component_id" + FROM "test_lyon"."prod"."blogs_posts" + JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments + on comments.decidim_root_commentable_id = "test_lyon"."prod"."blogs_posts".id + and comments.decidim_root_commentable_type = 'Decidim::Blogs::Post' + union all + + SELECT + comments.*, + "test_lyon"."prod"."budgets_projects".decidim_component_id AS "decidim_component_id" + FROM "test_lyon"."prod"."budgets_projects" + JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments + on comments.decidim_root_commentable_id = "test_lyon"."prod"."budgets_projects".id + and comments.decidim_root_commentable_type = 'Decidim::Budgets::Project' + union all + + SELECT + comments.*, + "test_lyon"."prod"."debates".decidim_component_id AS "decidim_component_id" + FROM "test_lyon"."prod"."debates" + JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments + on comments.decidim_root_commentable_id = "test_lyon"."prod"."debates".id + and comments.decidim_root_commentable_type = 'Decidim::Debates::Debate' + union all + + SELECT + comments.*, + "test_lyon"."prod"."meetings".decidim_component_id AS "decidim_component_id" + FROM "test_lyon"."prod"."meetings" + JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments + on comments.decidim_root_commentable_id = "test_lyon"."prod"."meetings".id + and comments.decidim_root_commentable_type = 'Decidim::Meetings::Meeting' + union all + + SELECT + comments.*, + "test_lyon"."prod"."proposals".decidim_component_id AS "decidim_component_id" + FROM "test_lyon"."prod"."proposals" + JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments + on comments.decidim_root_commentable_id = "test_lyon"."prod"."proposals".id + and comments.decidim_root_commentable_type = 'Decidim::Proposals::Proposal' + union all + + SELECT + comments.*, + "test_lyon"."prod"."stg_decidim_proposals_collaborative_drafts".decidim_component_id AS "decidim_component_id" + FROM "test_lyon"."prod"."stg_decidim_proposals_collaborative_drafts" + JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments + on comments.decidim_root_commentable_id = "test_lyon"."prod"."stg_decidim_proposals_collaborative_drafts".id + and comments.decidim_root_commentable_type = 'Decidim::Proposals::CollaborativeDraft' + + +) + +SELECT + commentaries.id, + commentaries.decidim_commentable_id, + commentaries.decidim_commentable_type, + commentaries.decidim_author_id, + commentaries.created_at, + commentaries.depth, + commentaries.alignment, + commentaries.decidim_root_commentable_id, + commentaries.decidim_root_commentable_type, + commentaries.decidim_author_type, + commentaries.body, + commentaries.decidim_component_id, + components.ps_slug, + concat('https://', components.organization_host, '/', components.ps_space_type_slug, '/', components.ps_slug, '/f/', components.id, '/', components.manifest_name,'/', commentaries.decidim_root_commentable_id, '?commentId=', commentaries.id, '#comment_', commentaries.id) AS comment_url +FROM commentaries +JOIN "test_lyon"."prod"."components" AS components + on components.id = commentaries.decidim_component_id +LEFT JOIN "test_lyon"."prod"."stg_decidim_moderations" AS decidim_moderations + on decidim_moderations.decidim_reportable_type = 'Decidim::Comments::Comment' + and decidim_moderations.decidim_reportable_id = commentaries.id +where decidim_moderations.hidden_at is null + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/components/components.sql b/projects/test_lyon/target/run/demo/models/marts/components/components.sql new file mode 100644 index 00000000..32fbff7a --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/components/components.sql @@ -0,0 +1,70 @@ + + + + + create table "test_lyon"."prod"."components__dbt_tmp" + + + as + + ( + -- Warning: are not taken by default into account Conferences, Consultations, Elections, Initiatives, Votations + + + +WITH assemblies_spaces AS ( + SELECT + id AS ps_id, + published_at AS ps_published_at, + title AS ps_title, + subtitle AS ps_subtitle, + slug AS ps_slug, + decidim_organization_id, + 'Decidim::Assembly' AS ps_type, + 'assemblies' AS ps_space_type_slug + FROM "test_lyon"."prod"."stg_decidim_assemblies" +), +participatory_processes_spaces AS ( + SELECT + id AS ps_id, + published_at AS ps_published_at, + title AS ps_title, + subtitle AS ps_subtitle, + slug AS ps_slug, + decidim_organization_id, + 'Decidim::ParticipatoryProcess' AS ps_type, + 'processes' AS ps_space_type_slug + FROM "test_lyon"."prod"."stg_decidim_participatory_processes" +), +participatory_spaces AS ( + SELECT * FROM assemblies_spaces + UNION ALL + SELECT * FROM participatory_processes_spaces +), +components AS ( + SELECT + decidim_components.id, + decidim_components.manifest_name, + decidim_components.translated_manifest_name, + concat(decidim_components.name, ' (', decidim_components.translated_manifest_name, ')') AS component_name, + decidim_components.published_at, + decidim_components.created_at, + concat('https://',decidim_organizations.host,'/', participatory_spaces.ps_space_type_slug, '/', participatory_spaces.ps_slug,'/f/', decidim_components.id) AS component_url, + participatory_spaces.ps_id, + participatory_spaces.ps_published_at, + participatory_spaces.ps_title, + participatory_spaces.ps_subtitle, + participatory_spaces.ps_slug, + participatory_spaces.ps_type, + participatory_spaces.ps_space_type_slug, + concat('https://',decidim_organizations.host,'/', participatory_spaces.ps_space_type_slug, '/', participatory_spaces.ps_slug,'/') AS ps_url, + decidim_organization_id, + decidim_organizations.host AS organization_host + FROM "test_lyon"."prod"."int_components" AS decidim_components + JOIN participatory_spaces ON participatory_spaces.ps_type = decidim_components.participatory_space_type AND decidim_components.participatory_space_id = participatory_spaces.ps_id + JOIN "test_lyon"."prod"."int_organizations" AS decidim_organizations ON decidim_organizations.id = participatory_spaces.decidim_organization_id + WHERE participatory_spaces.ps_published_at IS NOT NULL +) +SELECT * FROM components + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/debates/debates.sql b/projects/test_lyon/target/run/demo/models/marts/debates/debates.sql new file mode 100644 index 00000000..471cff5f --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/debates/debates.sql @@ -0,0 +1,54 @@ + + + + + create table "test_lyon"."prod"."debates__dbt_tmp" + + + as + + ( + WITH categorizations AS ( + + SELECT + array_agg(category_name) AS categories, + array_agg(child_name) AS sub_categories, + categorizable_id + FROM "test_lyon"."prod"."categorizations" AS categorizations + WHERE categorizations.categorizable_type = 'Decidim::Debates::Debate' + GROUP BY categorizable_id + +) +SELECT + decidim_debates_debates.id, + decidim_debates_debates.title, + decidim_debates_debates.description, + decidim_debates_debates.start_time, + decidim_debates_debates.end_time, + decidim_debates_debates.decidim_component_id, + decidim_debates_debates.decidim_author_id, + decidim_debates_debates.created_at, + decidim_debates_debates.closed_at, + decidim_components.ps_slug, + concat( + 'https://', + decidim_components.organization_host, + '/', + decidim_components.ps_space_type_slug, + '/', + decidim_components.ps_slug, + '/f/', + decidim_components.id, + '/debates/', + decidim_debates_debates.id + ) AS debate_url, + decidim_debates_debates.resource_type, + categorizations.categories, + coalesce(categorizations.categories[1], 'Sans catégorie') AS first_category, + categorizations.sub_categories, + coalesce(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category +FROM "test_lyon"."prod"."stg_decidim_debates" AS decidim_debates_debates + JOIN "test_lyon"."prod"."components" decidim_components on decidim_components.id = decidim_component_id + LEFT JOIN categorizations on categorizations.categorizable_id = decidim_debates_debates.id + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/endorsements/endorsements.sql b/projects/test_lyon/target/run/demo/models/marts/endorsements/endorsements.sql new file mode 100644 index 00000000..7575f8aa --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/endorsements/endorsements.sql @@ -0,0 +1,55 @@ + + + + + create table "test_lyon"."prod"."endorsements__dbt_tmp" + + + as + + ( + + +WITH endorsements_proposals AS ( + SELECT + decidim_endorsements.*, + decidim_component_id + FROM "test_lyon"."prod"."stg_decidim_endorsements" AS decidim_endorsements + JOIN "test_lyon"."prod"."stg_decidim_proposals" decidim_proposals_proposals on decidim_endorsements.resource_id = decidim_proposals_proposals.id + and decidim_proposals_proposals.resource_type = decidim_endorsements.resource_type +), endorsements_debates AS ( + SELECT + decidim_endorsements.*, + decidim_component_id + FROM "test_lyon"."prod"."stg_decidim_endorsements" AS decidim_endorsements + JOIN "test_lyon"."prod"."stg_decidim_debates" AS decidim_debates_debates on decidim_endorsements.resource_id = decidim_debates_debates.id + and decidim_debates_debates.resource_type = decidim_endorsements.resource_type +), endorsements_blogs_posts AS ( + SELECT + decidim_endorsements.*, + decidim_component_id + FROM "test_lyon"."prod"."stg_decidim_endorsements" AS decidim_endorsements + JOIN "test_lyon"."prod"."stg_decidim_blogs_posts" AS decidim_blogs_posts on decidim_endorsements.resource_id = decidim_blogs_posts.id + and decidim_blogs_posts.resource_type = decidim_endorsements.resource_type +), endorsements as ( + SELECT * FROM endorsements_proposals union all + SELECT * FROM endorsements_debates union all + SELECT * FROM endorsements_blogs_posts +) + +SELECT + endorsements.id, + endorsements.resource_type, + endorsements.resource_id, + endorsements.decidim_author_type, + endorsements.decidim_author_id, + endorsements.created_at, + endorsements.updated_at, + endorsements.decidim_component_id +FROM endorsements +LEFT JOIN "test_lyon"."prod"."stg_decidim_moderations" AS decidim_moderations + ON decidim_moderations.decidim_reportable_type = endorsements.resource_type + AND decidim_moderations.decidim_reportable_id = endorsements.resource_id +WHERE decidim_moderations.hidden_at IS NULL + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/followings/followings.sql b/projects/test_lyon/target/run/demo/models/marts/followings/followings.sql new file mode 100644 index 00000000..ce8f6b0c --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/followings/followings.sql @@ -0,0 +1,132 @@ + + + + + create table "test_lyon"."prod"."followings__dbt_tmp" + + + as + + ( + + + +WITH followings_proposals AS ( + SELECT + decidim_follows.*, + decidim_proposals_proposals.decidim_component_id, + url AS followable_url, + title AS followable_title + FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows + JOIN "test_lyon"."prod"."proposals" decidim_proposals_proposals + ON decidim_proposals_proposals.id = decidim_follows.decidim_followable_id + AND decidim_proposals_proposals.resource_type = decidim_follows.decidim_followable_type + ), followings_components AS ( + SELECT + distinct decidim_follows.*, + -1 AS "decidim_components.id", + ps_url AS followable_url, + ps_title AS followable_title + FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows + JOIN "test_lyon"."prod"."components" decidim_components + ON decidim_components.ps_id = decidim_followable_id + AND ps_type = decidim_followable_type + ), followings_debates AS ( + SELECT + decidim_follows.*, + decidim_debates_debates.decidim_component_id, + debate_url AS followable_url, + title AS followable_title + FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows + JOIN "test_lyon"."prod"."debates" decidim_debates_debates ON decidim_debates_debates.id = decidim_followable_id + AND resource_type = decidim_followable_type + ), followings_blogs_posts AS ( + SELECT + decidim_follows.*, + decidim_blogs_posts.decidim_component_id, + post_url AS followable_url, + title AS followable_title + FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows + JOIN "test_lyon"."prod"."blogs_posts" decidim_blogs_posts + ON decidim_blogs_posts.id = decidim_followable_id + AND resource_type = decidim_followable_type + ), followings_users AS ( + SELECT + decidim_follows.*, + -1 AS decidim_component_id, + '' AS followable_url, + '' AS followable_title + FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows + JOIN "test_lyon"."prod"."int_users" decidim_users + ON decidim_users.id = decidim_followable_id + where decidim_followable_type = 'Decidim::UserBaseEntity' + ), followings_meetings AS ( + SELECT + decidim_follows.*, + decidim_component_id, + meeting_url AS followable_url, + title AS followable_title + FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows + JOIN "test_lyon"."prod"."meetings" decidim_meetings + ON decidim_meetings.id = decidim_followable_id + AND resource_type = decidim_followable_type + ), followings_budgets_projects AS ( + SELECT + decidim_follows.*, + decidim_component_id, + project_url AS followable_url, + title AS followable_title + FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows + join "test_lyon"."prod"."budgets_projects" decidim_budgets_projects + ON decidim_budgets_projects.id = decidim_followable_id + AND resource_type = decidim_followable_type + ), followings AS ( + SELECT * FROM followings_proposals union all + SELECT * FROM followings_components union all + SELECT * FROM followings_debates union all + SELECT * FROM followings_blogs_posts union all + SELECT * FROM followings_users union all + SELECT * FROM followings_meetings union all + SELECT * FROM followings_budgets_projects + ), real_follow AS ( + SELECT + followings.*, + 'real_follow' AS "following_way", + decidim_followable_id AS "root_decidim_followable_id", + decidim_followable_type AS "root_decidim_followable_type", + followable_url AS "root_following_url", + followable_title AS "root_followable_title" + FROM followings, + lateral (SELECT (case array_length(array_remove(string_to_array(decidim_followable_type, ':', ''),null),1) when 2 then 'Ancestor' else 'Child' end) AS followable_meta_type) p_is_ps + where followable_meta_type != 'Ancestor' + ), ancestor_follow AS ( + SELECT + distinct + followings.*, + 'ancestor_follow' AS "following_way", + real_follow.decidim_followable_id AS "root_decidim_followable_id", + real_follow.decidim_followable_type AS "root_decidim_followable_type", + real_follow.followable_url AS "root_following_url", + real_follow.followable_title AS "root_followable_title" + FROM real_follow + join "test_lyon"."prod"."components" AS components ON components.id = real_follow.decidim_component_id + join followings ON followings.decidim_followable_id = components.ps_id AND followings.decidim_followable_type = components.ps_type + ), follows AS ( + SELECT * FROM real_follow union all + SELECT * FROM ancestor_follow + ) +SELECT id, + decidim_component_id, + decidim_user_id, + root_decidim_followable_id, + root_decidim_followable_type, + root_followable_title, + created_at, + root_following_url, + decidim_followable_id, + decidim_followable_type, + followable_url, + following_way +FROM follows + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/forms/forms.sql b/projects/test_lyon/target/run/demo/models/marts/forms/forms.sql new file mode 100644 index 00000000..38998771 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/forms/forms.sql @@ -0,0 +1,39 @@ + + + + + create table "test_lyon"."prod"."forms__dbt_tmp" + + + as + + ( + + +WITH forms_meetings AS ( + SELECT decidim_forms_questionnaires.id AS questionnaire_id, + decidim_forms_questionnaires.title, + decidim_meetings_meetings.decidim_component_id + FROM "test_lyon"."prod"."stg_decidim_forms_questionnaires" decidim_forms_questionnaires + JOIN "test_lyon"."prod"."stg_decidim_meetings" decidim_meetings_meetings ON decidim_meetings_meetings.id = decidim_forms_questionnaires.questionnaire_for_id + WHERE questionnaire_for_type = 'Decidim::Meetings::Meeting' +), forms_surveys AS ( + SELECT decidim_forms_questionnaires.id AS questionnaire_id, + decidim_forms_questionnaires.title, + decidim_surveys_surveys.decidim_component_id + FROM decidim_forms_questionnaires + JOIN "test_lyon"."prod"."stg_decidim_surveys" decidim_surveys_surveys ON decidim_surveys_surveys.id = questionnaire_for_id + WHERE questionnaire_for_type = 'Decidim::Surveys::Survey' +), forms AS ( + SELECT * FROM forms_meetings UNION ALL + SELECT * FROM forms_surveys +) +SELECT + forms.questionnaire_id AS id, + title::jsonb->>'fr' AS title, + decidim_components.id AS decidim_component_id, + concat ('https://',organization_host, '/', ps_space_type_slug,'/', ps_slug, '/f/', decidim_component_id) AS "questionnaire_url" +FROM forms +JOIN "test_lyon"."prod"."components" decidim_components ON decidim_components.id = forms.decidim_component_id + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/forms/forms_answers.sql b/projects/test_lyon/target/run/demo/models/marts/forms/forms_answers.sql new file mode 100644 index 00000000..86f65482 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/forms/forms_answers.sql @@ -0,0 +1,64 @@ + + + + + create table "test_lyon"."prod"."forms_answers__dbt_tmp" + + + as + + ( + + +WITH answers_short_and_long_answer AS ( + SELECT * FROM "test_lyon"."prod"."answers_short_and_long_answer" +), answers_option_and_sorting AS ( + SELECT * FROM "test_lyon"."prod"."answers_option_and_sorting" +), answers_matrix AS ( + SELECT * FROM "test_lyon"."prod"."answers_matrix" +), answers_file AS ( + SELECT * FROM "test_lyon"."prod"."answers_file" +), answers AS ( + SELECT * FROM answers_short_and_long_answer + UNION ALL + SELECT * FROM answers_option_and_sorting + UNION ALL + SELECT * FROM answers_matrix + UNION ALL + SELECT * FROM answers_file +) + +SELECT + answers.decidim_user_id, + answers.session_token, + answers.ip_hash, + answers.question_type, + answers.body AS question_title, + btrim(answers.answer, '"') AS answer, + answers.sub_matrix_question, + answers.custom_body, + answers.sorting_position, + answers.decidim_questionnaire_id, + decidim_forms_questionnaires.title AS form_title, + decidim_forms_questionnaires.decidim_component_id, + (CASE answers.sorting_position + WHEN 0 THEN 10 + WHEN 1 THEN 9 + WHEN 2 THEN 8 + WHEN 3 THEN 7 + WHEN 4 THEN 6 + WHEN 5 THEN 5 + WHEN 6 THEN 4 + WHEN 7 THEN 3 + WHEN 8 THEN 2 + WHEN 9 THEN 1 + ELSE -1 + END) AS sorting_points, + answers.position, + answers.created_at, + answers.author_status +FROM answers +JOIN "test_lyon"."prod"."forms" AS decidim_forms_questionnaires ON decidim_forms_questionnaires.id = answers.decidim_questionnaire_id +ORDER BY session_token, position + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/meetings/meetings.sql b/projects/test_lyon/target/run/demo/models/marts/meetings/meetings.sql new file mode 100644 index 00000000..52b17abc --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/meetings/meetings.sql @@ -0,0 +1,60 @@ + + + + + create table "test_lyon"."prod"."meetings__dbt_tmp" + + + as + + ( + WITH categorizations AS ( + + SELECT + array_agg(category_name) AS categories, + array_agg(child_name) AS sub_categories, + categorizable_id + FROM "test_lyon"."prod"."categorizations" AS categorizations + WHERE categorizations.categorizable_type = 'Decidim::Meetings::Meeting' + GROUP BY categorizable_id + +) +SELECT + decidim_meetings_meetings.id, + decidim_meetings_meetings.title, + decidim_meetings_meetings.description, + decidim_meetings_meetings.address, + decidim_meetings_meetings.attendees_count, + decidim_meetings_meetings.created_at, + decidim_meetings_meetings.decidim_scope_id, + decidim_meetings_meetings.decidim_component_id, + decidim_meetings_meetings.start_time, + decidim_meetings_meetings.end_time, + decidim_meetings_meetings.registration_url, + decidim_meetings_meetings.type_of_meeting, + decidim_meetings_meetings.translated_type_of_meeting, + decidim_meetings_meetings.private_meeting, + decidim_meetings_meetings.decidim_author_id, + decidim_meetings_meetings.resource_type, + concat( + 'https://', + decidim_components.organization_host, + '/', + decidim_components.ps_space_type_slug, + '/', + decidim_components.ps_slug, + '/f/', + decidim_meetings_meetings.decidim_component_id, + '/meetings/', + decidim_meetings_meetings.id + ) AS meeting_url, + categorizations.categories, + coalesce(categorizations.categories[1], 'Sans catégorie') AS first_category, + categorizations.sub_categories, + coalesce(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category +FROM "test_lyon"."prod"."int_meetings" AS decidim_meetings_meetings +JOIN "test_lyon"."prod"."components" decidim_components on decidim_components.id = decidim_component_id +LEFT JOIN categorizations on categorizations.categorizable_id = decidim_meetings_meetings.id +where manifest_name like 'meetings' + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/organizations.sql b/projects/test_lyon/target/run/demo/models/marts/organizations.sql new file mode 100644 index 00000000..d185dd53 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/organizations.sql @@ -0,0 +1,15 @@ + + + + + create table "test_lyon"."prod"."organizations__dbt_tmp" + + + as + + ( + SELECT +* +FROM "test_lyon"."prod"."int_organizations" AS decidim_organizations + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/participations.sql b/projects/test_lyon/target/run/demo/models/marts/participations.sql new file mode 100644 index 00000000..11362871 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/participations.sql @@ -0,0 +1,96 @@ + + + + + create table "test_lyon"."prod"."participations__dbt_tmp" + + + as + + ( + WITH participations_proposals AS ( + SELECT decidim_users.id, + decidim_proposals_proposals.decidim_component_id, + 'Decidim::Proposals::Proposal' AS "participation_type", + decidim_proposals_proposals.id::text AS "participation_id", + decidim_proposals_proposals.created_at AS participation_date + FROM "test_lyon"."prod"."proposals" AS decidim_proposals_proposals + JOIN decidim_coauthorships on decidim_coauthorships.coauthorable_id = decidim_proposals_proposals.id + JOIN decidim_users on decidim_users.id = decidim_coauthorships.decidim_author_id + where coauthorable_type = 'Decidim::Proposals::Proposal' + ), participations_endorsements as ( + SELECT decidim_users.id, + decidim_endorsements.decidim_component_id, + 'Decidim::Endorsements::Endorsement' as "participation_type", + decidim_endorsements.id::text as "participation_id", + decidim_endorsements.created_at as participation_date + FROM "test_lyon"."prod"."endorsements" as decidim_endorsements + JOIN decidim_users on decidim_users.id = decidim_endorsements.decidim_author_id + ), participations_comments as ( + SELECT decidim_users.id, + decidim_component_id, + 'Decidim::Comments::Comment' as "participation_type", + decidim_comments_comments.id::text as "participation_id", + decidim_comments_comments.created_at as contribution_date + FROM "test_lyon"."prod"."comments" decidim_comments_comments + JOIN decidim_users on decidim_users.id = decidim_comments_comments.decidim_author_id + ), participations_proposal_votes as ( + SELECT decidim_users.id, + decidim_proposals_proposals.decidim_component_id, + 'Decidim::Proposals::ProposalVote' as "participation_type", + decidim_proposals_proposal_votes.id::text as "participation_id", + decidim_proposals_proposal_votes.created_at as participation_date + FROM "test_lyon"."prod"."proposals_votes" as decidim_proposals_proposal_votes + JOIN decidim_users on decidim_users.id = decidim_author_id + JOIN "test_lyon"."prod"."proposals" as decidim_proposals_proposals on decidim_proposals_proposal_votes.decidim_proposal_id = decidim_proposals_proposals.id + ), participations_answers as ( + SELECT distinct + decidim_user_id, + decidim_component_id, + 'Decidim::Forms::Answer' as "participation_type", + ('x'||lpad(decidim_forms_answers.session_token,16,'0'))::bit(64)::bigint::text as "participation_id", + decidim_forms_answers.created_at::date as participation_date + FROM "test_lyon"."prod"."forms_answers" as decidim_forms_answers + ), participations_debates as ( + SELECT decidim_author_id as decidim_user_id, + decidim_component_id, + 'Decidim::Debates::Debate' as "participation_type", + id::text as participation_id, + created_at as participation_date + FROM "test_lyon"."prod"."debates" decidim_debates_debates + ), participations_budgets_projects_votes as ( + SELECT + decidim_user_id, + decidim_component_id, + 'Decidim::Budgets::Project::Vote' as participation_type, + order_id::text as participation_id, + created_at as participation_date + FROM "test_lyon"."prod"."projects_votes" decidim_bugdets_projects_votes + ), participations_meetings_registrations as ( + SELECT + decidim_user_id, + decidim_component_id, + 'Decidim::Meetings::Registration' as participation_type, + decidim_meetings_meetings.id::text as participation_id, + decidim_meetings_registrations.created_at as participation_date + FROM "test_lyon"."prod"."meetings" decidim_meetings_meetings + join decidim_meetings_registrations on decidim_meetings_registrations.decidim_meeting_id = decidim_meetings_meetings.id + ), participations as ( + SELECT * FROM participations_proposals union all + SELECT * FROM participations_endorsements union all + SELECT * FROM participations_comments union all + SELECT * FROM participations_proposal_votes union all + SELECT * from participations_answers union all + SELECT * from participations_debates union all + SELECT * from participations_budgets_projects_votes union all + SELECT * from participations_meetings_registrations + ) + SELECT + distinct participations.id as "user_id", + substr(participation_id,1,10)::bigint as participation_id, + decidim_component_id, + participation_type, + participation_date + from participations + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/proposals/proposals.sql b/projects/test_lyon/target/run/demo/models/marts/proposals/proposals.sql new file mode 100644 index 00000000..bfa7990b --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/proposals/proposals.sql @@ -0,0 +1,81 @@ + + + + + create table "test_lyon"."prod"."proposals__dbt_tmp" + + + as + + ( + + +WITH coauthorships AS ( + SELECT + array_agg(decidim_users.id) AS authors_ids, + decidim_coauthorships.coauthorable_id + FROM "test_lyon"."prod"."int_users" AS decidim_users + JOIN "test_lyon"."prod"."stg_decidim_coauthorships" AS decidim_coauthorships on decidim_users.id = decidim_coauthorships.decidim_author_id + WHERE coauthorable_type = 'Decidim::Proposals::Proposal' + GROUP BY coauthorable_id +), +categorizations AS ( + + SELECT + array_agg(category_name) AS categories, + array_agg(child_name) AS sub_categories, + categorizable_id + FROM "test_lyon"."prod"."categorizations" AS categorizations + WHERE categorizations.categorizable_type = 'Decidim::Proposals::Proposal' + GROUP BY categorizable_id + +), +votes AS ( + SELECT + decidim_proposal_id, + COUNT(id) AS votes_count + FROM "test_lyon"."prod"."stg_decidim_proposals_votes" + GROUP BY decidim_proposal_id +), +proposals AS ( + SELECT + decidim_proposals.id, + decidim_components.ps_id AS decidim_participatory_space_id, + decidim_components.ps_slug AS decidim_participatory_space_slug, + decidim_scopes.name AS decidim_scope_name, + decidim_proposals.title, + decidim_proposals.body, + decidim_proposals.resource_type, + concat('https://', decidim_components.organization_host, '/', decidim_components.ps_space_type_slug, '/', decidim_components.ps_slug, '/f/', decidim_proposals.decidim_component_id, '/proposals/', decidim_proposals.id) AS url, + decidim_proposals.decidim_component_id, + decidim_proposals.created_at, + decidim_proposals.published_at, + decidim_proposals.state, + decidim_proposals.translated_state, + coauthorships.authors_ids, + COALESCE(coauthorships.authors_ids[1], -1) AS first_author_id, + decidim_proposals.address, + categorizations.categories, + COALESCE(categorizations.categories[1], 'Sans catégorie') AS first_category, + categorizations.sub_categories, + COALESCE(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category, + decidim_proposals.comments_count, + decidim_proposals.endorsements_count, + COALESCE(votes.votes_count,0) AS votes_count + FROM "test_lyon"."prod"."int_proposals" AS decidim_proposals + JOIN "test_lyon"."prod"."components" AS decidim_components ON decidim_components.id = decidim_component_id + LEFT JOIN coauthorships ON decidim_proposals.id = coauthorships.coauthorable_id + LEFT JOIN "test_lyon"."prod"."stg_decidim_moderations" AS decidim_moderations + ON decidim_moderations.decidim_reportable_id = decidim_proposals.id + AND decidim_moderations.decidim_reportable_type = 'Decidim::Proposals::Proposal' + LEFT JOIN "test_lyon"."prod"."int_scopes" AS decidim_scopes ON decidim_scopes.id = decidim_proposals.decidim_scope_id + LEFT JOIN votes ON decidim_proposals.id = votes.decidim_proposal_id + LEFT JOIN categorizations ON categorizations.categorizable_id = decidim_proposals.id + WHERE decidim_moderations.hidden_at IS NULL + AND decidim_proposals.published_at IS NOT NULL + AND (decidim_proposals.state NOT LIKE '%withdrawn' OR decidim_proposals.state IS NULL) +) + +SELECT * FROM proposals + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/proposals/proposals_votes.sql b/projects/test_lyon/target/run/demo/models/marts/proposals/proposals_votes.sql new file mode 100644 index 00000000..32e4efac --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/proposals/proposals_votes.sql @@ -0,0 +1,24 @@ + + + + + create table "test_lyon"."prod"."proposals_votes__dbt_tmp" + + + as + + ( + + +SELECT + proposals_votes.id, + proposals_votes.created_at, + proposals_votes.decidim_author_id, + proposals_votes.decidim_proposal_id, + proposals.decidim_component_id, + proposals.title AS proposal_title, + proposals.url AS proposal_url +FROM "test_lyon"."prod"."stg_decidim_proposals_votes" AS proposals_votes +JOIN "test_lyon"."prod"."proposals" AS proposals on proposals_votes.decidim_proposal_id = proposals.id + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/users/users.sql b/projects/test_lyon/target/run/demo/models/marts/users/users.sql new file mode 100644 index 00000000..5da57503 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/marts/users/users.sql @@ -0,0 +1,121 @@ + + + + + create table "test_lyon"."prod"."users__dbt_tmp" + + + as + + ( + WITH endorsements AS ( + SELECT + decidim_author_id, + MAX(1) AS is_endorsing + FROM "test_lyon"."prod"."endorsements" + GROUP BY decidim_author_id +), + +comments AS ( + SELECT + decidim_author_id, + MAX(1) AS has_authored_comment + FROM "test_lyon"."prod"."comments" + GROUP BY decidim_author_id +), + +forms_answers AS ( + SELECT + decidim_user_id, + MAX(1) AS has_answered_survey + FROM "test_lyon"."prod"."forms_answers" + GROUP BY decidim_user_id +), + +proposal_votes AS ( + SELECT + decidim_author_id, + MAX(1) AS has_voted_on_proposal + FROM "test_lyon"."prod"."proposals_votes" + GROUP BY decidim_author_id +), + +project_votes AS ( + SELECT + decidim_user_id, + MAX(1) AS has_voted_on_project + FROM "test_lyon"."prod"."projects_votes" + GROUP BY decidim_user_id +), + +participations_proposals AS ( + SELECT + decidim_coauthorships.decidim_author_id, + MAX(1) AS has_authored_proposal + FROM "test_lyon"."prod"."proposals" AS decidim_proposals_proposals + JOIN "test_lyon"."prod"."stg_decidim_coauthorships" AS decidim_coauthorships + ON decidim_coauthorships.coauthorable_id = decidim_proposals_proposals.id + WHERE coauthorable_type = 'Decidim::Proposals::Proposal' + GROUP BY decidim_coauthorships.decidim_author_id +), + +followings AS ( + SELECT DISTINCT decidim_user_id + FROM "test_lyon"."prod"."followings" +) + +SELECT + decidim_users.id, + decidim_users.email, + decidim_users.sign_in_count, + decidim_users.sign_in_frequency, + decidim_users.last_sign_in_at, + decidim_users.created_at, + decidim_users.updated_at, + decidim_users.invitation_created_at, + decidim_users.invitation_sent_at, + decidim_users.invitation_accepted_at, + decidim_users.invited_by_id, + decidim_users.invited_by_type, + decidim_users.decidim_organization_id, + decidim_users.confirmed_at, + decidim_users.confirmation_token, + decidim_users.unconfirmed_email, + decidim_users.name, + decidim_users.locale, + decidim_users.deleted_at, + decidim_users.admin, + decidim_users.managed, + decidim_users.roles, + decidim_users.nickname, + decidim_users.accepted_tos_version, + decidim_users.type, + decidim_users.following_count, + decidim_users.followers_count, + decidim_users.failed_attempts, + decidim_users.locked_at, + decidim_users.admin_terms_accepted_at, + decidim_users.blocked, + decidim_users.blocked_at, + COALESCE(endorsements.is_endorsing, 0)::boolean AS is_endorsing, + (CASE WHEN followings.decidim_user_id IS NULL THEN false ELSE true END) AS is_following, + COALESCE(comments.has_authored_comment, 0)::boolean AS has_authored_comment, + COALESCE(proposal_votes.has_voted_on_proposal, 0)::boolean AS has_voted_on_proposal, + COALESCE(project_votes.has_voted_on_project, 0)::boolean AS has_voted_on_project, + COALESCE(participations_proposals.has_authored_proposal, 0)::boolean AS has_authored_proposal, + COALESCE(forms_answers.has_answered_survey, 0)::boolean AS has_answered_survey, + decidim_users.confirmed, + CONCAT('https://', decidim_organizations.host, '/profiles/', decidim_users.nickname, '/activity') AS url, + decidim_users.extended_data +FROM "test_lyon"."prod"."int_users" AS decidim_users +LEFT JOIN followings ON followings.decidim_user_id = decidim_users.id +LEFT JOIN endorsements ON endorsements.decidim_author_id = decidim_users.id +LEFT JOIN comments ON comments.decidim_author_id = decidim_users.id +LEFT JOIN forms_answers ON forms_answers.decidim_user_id = decidim_users.id +LEFT JOIN proposal_votes ON proposal_votes.decidim_author_id = decidim_users.id +LEFT JOIN project_votes ON project_votes.decidim_user_id = decidim_users.id +LEFT JOIN participations_proposals ON participations_proposals.decidim_author_id = decidim_users.id +JOIN "test_lyon"."prod"."int_organizations" AS decidim_organizations + ON decidim_organizations.id = decidim_users.decidim_organization_id + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_area_types.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_area_types.sql new file mode 100644 index 00000000..e33f9850 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_area_types.sql @@ -0,0 +1,24 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_area_types__dbt_tmp" + + + as + + ( + WITH source as ( + SELECT * FROM "test_lyon"."public"."decidim_area_types" +), +renamed as ( + SELECT + id, + decidim_organization_id, + name, + plural + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_areas.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_areas.sql new file mode 100644 index 00000000..fbb8eced --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_areas.sql @@ -0,0 +1,26 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_areas__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_areas" +), +renamed as ( + select + id, + name, + area_type_id, + decidim_organization_id, + created_at, + updated_at + FROM source +) +select * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql new file mode 100644 index 00000000..313ff0d9 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql @@ -0,0 +1,70 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_assemblies__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_assemblies" +), +renamed AS ( + SELECT + id, + slug, + hashtag, + decidim_organization_id, + created_at, + updated_at, + title::jsonb->>'fr' AS title, + subtitle::jsonb->>'fr' AS subtitle, + short_description, + description, + hero_image, + banner_image, + promoted, + published_at, + developer_group, + meta_scope, + local_area, + target, + participatory_scope, + participatory_structure, + show_statistics, + decidim_scope_id, + scopes_enabled, + private_space, + reference, + decidim_area_id, + parent_id, + parents_path, + children_count, + purpose_of_action, + composition, + creation_date, + created_by, + created_by_other, + duration, + included_at, + closing_date, + closing_date_reason, + internal_organisation, + is_transparent, + special_features, + twitter_handler, + instagram_handler, + facebook_handler, + youtube_handler, + github_handler, + decidim_assemblies_type_id, + weight, + follows_count + + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql new file mode 100644 index 00000000..1c0ce72c --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql @@ -0,0 +1,27 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_blogs_posts__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_blogs_posts" +), +renamed AS ( + SELECT + id, + title::jsonb->>'fr' AS title, + regexp_replace(body::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') AS body, + decidim_component_id, + created_at, + decidim_author_id, + 'Decidim::Blogs::Post' AS resource_type + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql new file mode 100644 index 00000000..7b7f8510 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql @@ -0,0 +1,23 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_budgets__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_budgets_budgets" +), +renamed AS ( + SELECT + id, + title::jsonb->>'fr' as title, + decidim_component_id + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql new file mode 100644 index 00000000..010f414a --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql @@ -0,0 +1,23 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_budgets_line_items__dbt_tmp" + + + as + + ( + WITH source as ( + SELECT * FROM "test_lyon"."public"."decidim_budgets_line_items" +), +renamed as ( + select + id, + decidim_order_id, + decidim_project_id + FROM source +) +select * from renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql new file mode 100644 index 00000000..738387c7 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql @@ -0,0 +1,26 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_budgets_orders__dbt_tmp" + + + as + + ( + WITH source as ( + SELECT * FROM "test_lyon"."public"."decidim_budgets_orders" +), +renamed as ( + select + id, + decidim_user_id, + checked_out_at, + created_at, + updated_at, + decidim_budgets_budget_id + FROM source +) +select * from renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql new file mode 100644 index 00000000..054f54f0 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql @@ -0,0 +1,29 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_budgets_projects__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_budgets_projects" +), +renamed AS ( + SELECT + id, + title::jsonb->>'fr' as title, + regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description, + created_at, + decidim_scope_id, + budget_amount as project_amount, + selected_at, + decidim_budgets_budget_id, + 'Decidim::Budgets::Project' as resource_type + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categories.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categories.sql new file mode 100644 index 00000000..2cb51081 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categories.sql @@ -0,0 +1,27 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_categories__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_categories" +), +renamed AS ( + SELECT + id, + name::jsonb->>'fr' AS name, + description, + parent_id, + decidim_participatory_space_id, + decidim_participatory_space_type, + weight + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql new file mode 100644 index 00000000..75aebd31 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql @@ -0,0 +1,26 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_categorizations__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_categorizations" +), +renamed AS ( + SELECT + id, + decidim_category_id, + categorizable_type, + categorizable_id, + created_at, + updated_at + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/debates/stg_decidim_debates.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/debates/stg_decidim_debates.sql new file mode 100644 index 00000000..2dde98d6 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/debates/stg_decidim_debates.sql @@ -0,0 +1,30 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_debates__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_debates_debates" +), +renamed AS ( + SELECT + id, + title::jsonb->>'fr' as title, + regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description, + start_time, + end_time, + decidim_component_id, + decidim_author_id, + created_at, + closed_at, + 'Decidim::Debates::Debate' as resource_type + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql new file mode 100644 index 00000000..dacf92aa --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql @@ -0,0 +1,27 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_forms_answer_choices__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_forms_answer_choices" +), +renamed AS ( + SELECT + id, + decidim_answer_id, + decidim_answer_option_id, + position, + body::text AS body, + custom_body, + decidim_question_matrix_row_id + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql new file mode 100644 index 00000000..d029888e --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql @@ -0,0 +1,29 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_forms_answers__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_forms_answers" +), +renamed AS ( + SELECT + id, + body, + decidim_user_id, + decidim_questionnaire_id, + decidim_question_id, + created_at, + updated_at, + session_token, + ip_hash + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql new file mode 100644 index 00000000..c571ff4c --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql @@ -0,0 +1,24 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_forms_question_matrix_rows__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_forms_question_matrix_rows" +), +renamed AS ( + SELECT + id, + decidim_question_id, + position, + TRIM(body::jsonb->>'fr') AS body + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql new file mode 100644 index 00000000..ac0d68c4 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql @@ -0,0 +1,30 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_forms_questionnaires__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_forms_questionnaires" +), +renamed AS ( + SELECT + id, + title, + description, + tos, + questionnaire_for_type, + questionnaire_for_id, + published_at, + created_at, + updated_at, + salt + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql new file mode 100644 index 00000000..313f291c --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql @@ -0,0 +1,33 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_forms_questions__dbt_tmp" + + + as + + ( + + +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_forms_questions" +), +renamed AS ( + SELECT + id, + decidim_questionnaire_id, + position, + question_type, + mandatory, + body::jsonb->>'fr' AS body, + description, + max_choices, + created_at, + updated_at, + max_characters + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql new file mode 100644 index 00000000..96d51656 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql @@ -0,0 +1,35 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_organizations__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_organizations" +), +renamed AS ( + SELECT + id, + name, + host, + default_locale, + available_locales::text as available_locales, + created_at, + description, + secondary_hosts::text as secondary_hosts, + available_authorizations::text as available_authorizations, + header_snippets, + tos_version, + badges_enabled, + send_welcome_notification, + users_registration_mode, + time_zone + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql new file mode 100644 index 00000000..4ae14e89 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql @@ -0,0 +1,26 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_proposals__dbt_tmp" + + + as + + ( + SELECT + id, + regexp_replace(title::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as title, + regexp_replace(body::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as body, + 'Decidim::Proposals::Proposal' as resource_type, + decidim_component_id, + decidim_scope_id, + created_at, + published_at, + state, + comments_count, + endorsements_count, + address +FROM "test_lyon"."public"."decidim_proposals_proposals" + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql new file mode 100644 index 00000000..4d1768f1 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql @@ -0,0 +1,40 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_proposals_collaborative_drafts__dbt_tmp" + + + as + + ( + WITH source as ( + SELECT * FROM "test_lyon"."public"."decidim_proposals_collaborative_drafts" +), +renamed as ( + select + id, + title, + body, + decidim_component_id, + decidim_scope_id, + state, + reference, + address, + latitude, + longitude, + published_at, + authors_count, + versions_count, + contributions_count, + created_at, + updated_at, + coauthorships_count, + comments_count, + follows_count + + from source +) +select * from renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql new file mode 100644 index 00000000..24f0f26c --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql @@ -0,0 +1,27 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_proposals_votes__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_proposals_proposal_votes" +), +renamed AS ( + SELECT + id, + decidim_proposal_id, + decidim_author_id, + created_at, + updated_at, + weight, + temporary + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql new file mode 100644 index 00000000..7ded8f15 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql @@ -0,0 +1,29 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_scopes__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_scopes" +), +renamed AS ( + SELECT + id, + decidim_organization_id, + created_at, + updated_at, + name::jsonb->>'fr' AS name, + scope_type_id, + parent_id, + code, + part_of + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_accountability_results.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_accountability_results.sql new file mode 100644 index 00000000..ecfae97e --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_accountability_results.sql @@ -0,0 +1,37 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_accountability_results__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_accountability_results" +), +renamed as ( + select + id, + title, + description, + reference, + start_date, + end_date, + progress, + parent_id, + decidim_accountability_status_id, + decidim_component_id, + decidim_scope_id, + created_at, + updated_at, + children_count, + weight, + external_id, + comments_count + FROM source +) +select * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_attachments.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_attachments.sql new file mode 100644 index 00000000..4d321dd7 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_attachments.sql @@ -0,0 +1,32 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_attachments__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_attachments" +), +renamed as ( + SELECT + id, + title, + description, + file, + content_type, + file_size, + attached_to_id, + created_at, + updated_at, + attached_to_type, + weight, + attachment_collection_id + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_coauthorships.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_coauthorships.sql new file mode 100644 index 00000000..2081cdcf --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_coauthorships.sql @@ -0,0 +1,30 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_coauthorships__dbt_tmp" + + + as + + ( + + +WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_coauthorships" +), +renamed AS ( + SELECT + id, + decidim_author_id, + decidim_user_group_id, + coauthorable_type, + coauthorable_id, + created_at, + updated_at, + decidim_author_type + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_comments.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_comments.sql new file mode 100644 index 00000000..cc2e4895 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_comments.sql @@ -0,0 +1,34 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_comments__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_comments_comments" +), +renamed as ( + SELECT + id, + decidim_commentable_type, + decidim_commentable_id, + decidim_author_id, + created_at, + updated_at, + depth, + alignment, + decidim_user_group_id, + decidim_root_commentable_type, + decidim_root_commentable_id, + decidim_author_type, + body::jsonb->>'fr' as body, + comments_count + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_components.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_components.sql new file mode 100644 index 00000000..085a86ae --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_components.sql @@ -0,0 +1,31 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_components__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_components" +), +renamed AS ( + SELECT + id, + manifest_name, + name::jsonb->>'fr' AS name, + participatory_space_id, + participatory_space_type, + settings, + weight, + permissions, + published_at, + created_at, + updated_at + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_endorsements.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_endorsements.sql new file mode 100644 index 00000000..a6ac65a7 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_endorsements.sql @@ -0,0 +1,22 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_endorsements__dbt_tmp" + + + as + + ( + SELECT + id, + resource_type, + resource_id, + decidim_author_type, + decidim_author_id, + decidim_user_group_id, + created_at, + updated_at +FROM "test_lyon"."public"."decidim_endorsements" + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_follows.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_follows.sql new file mode 100644 index 00000000..e0122d04 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_follows.sql @@ -0,0 +1,26 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_follows__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_follows" +), +renamed as ( + SELECT + id, + decidim_user_id, + updated_at, + created_at, + decidim_followable_type, + decidim_followable_id + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings.sql new file mode 100644 index 00000000..156ef2bc --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings.sql @@ -0,0 +1,35 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_meetings__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_meetings_meetings" +), +renamed AS ( + SELECT + id, + title::jsonb->>'fr' AS title, + regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') AS description, + coalesce(nullif(address,''), 'Pas d''adresse') as address, + coalesce(attendees_count, 0) as attendees_count, + created_at, + decidim_scope_id, + decidim_component_id, + start_time, + end_time, + registration_url, + type_of_meeting, + private_meeting, + decidim_author_id, + 'Decidim::Meetings::Meeting' as resource_type + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql new file mode 100644 index 00000000..41281f25 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql @@ -0,0 +1,28 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_meetings_registrations__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_meetings_registrations" +), +renamed AS ( + select + id, + decidim_user_id, + decidim_meeting_id, + created_at, + updated_at, + code, + validated_at, + decidim_user_group_id + FROM source +) +select * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_moderations.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_moderations.sql new file mode 100644 index 00000000..47a87d15 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_moderations.sql @@ -0,0 +1,30 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_moderations__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_moderations" +), +renamed AS ( + SELECT + id, + decidim_participatory_space_id, + decidim_reportable_type, + decidim_reportable_id, + report_count, + hidden_at, + created_at, + updated_at, + decidim_participatory_space_type, + reported_content + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql new file mode 100644 index 00000000..784a460d --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql @@ -0,0 +1,33 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_participatory_process_steps__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_participatory_process_steps" +), +renamed AS ( + select + id, + title::jsonb->>'fr' as title, + title::jsonb->>'fr' as description, + start_date, + end_date, + decidim_participatory_process_id, + created_at, + updated_at, + active, + position, + cta_text, + cta_path + + FROM source +) +select * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_processes.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_processes.sql new file mode 100644 index 00000000..c6590459 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_processes.sql @@ -0,0 +1,28 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_participatory_processes__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_participatory_processes" +), +renamed AS ( + SELECT + id, + published_at, + title::jsonb->>'fr' AS title, + subtitle::jsonb->>'fr' as subtitle, + slug, + 'Decidim::ParticipatoryProcess' as type, + 'processes' as space_type_slug, + decidim_organization_id + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_surveys.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_surveys.sql new file mode 100644 index 00000000..a1e2c372 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_surveys.sql @@ -0,0 +1,24 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_surveys__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_surveys_surveys" +), +renamed as ( + SELECT + id, + decidim_component_id, + created_at, + updated_at + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_users.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_users.sql new file mode 100644 index 00000000..8e95e476 --- /dev/null +++ b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_users.sql @@ -0,0 +1,53 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_users__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_users" +), +renamed AS ( + SELECT + id, + email, + sign_in_count, + last_sign_in_at, + created_at, + updated_at, + invitation_created_at, + invitation_sent_at, + invitation_accepted_at, + invited_by_id, + invited_by_type, + decidim_organization_id, + confirmed_at, + confirmation_token, + unconfirmed_email, + name, + locale, + deleted_at, + admin, + managed, + roles::text AS roles, + nickname, + accepted_tos_version, + type, + following_count, + followers_count, + failed_attempts, + locked_at, + admin_terms_accepted_at, + blocked, + blocked_at, + (CASE WHEN confirmed_at IS NULL THEN false ELSE true END) AS "confirmed", + extended_data + FROM source +) +SELECT * FROM renamed + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql b/projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql new file mode 100644 index 00000000..98dbd1d8 --- /dev/null +++ b/projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql @@ -0,0 +1,31 @@ + + + + + create table "test_lyon"."prod"."int_decidim_awesome_proposal_extra_fields__dbt_tmp" + + + as + + ( + WITH parsed_data AS ( + SELECT + decidim_awesome_proposal_extra_fields.id, + decidim_awesome_proposal_extra_fields.proposal_id, + xpath('//text()', unnest(xpath('//dt', xml_data)))::text AS private_field_description, + unnest(xpath('//dd/div/text()', unnest(xpath('//dd', xml_data))))::text AS private_field_content + FROM + "test_lyon"."prod"."stg_decidim_awesome_proposal_extra_fields" AS decidim_awesome_proposal_extra_fields, + LATERAL xmlparse(document private_body_clear) AS xml_data +) +SELECT + parsed_data.id, + parsed_data.proposal_id, + replace(replace(private_field_description, '{"', ''), '"}', '') AS private_field_description, + parsed_data.private_field_content +FROM + parsed_data +WHERE + private_field_content IS NOT NULL + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql b/projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql new file mode 100644 index 00000000..ed4d9982 --- /dev/null +++ b/projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql @@ -0,0 +1,77 @@ +-- Build actual result given inputs +with dbt_internal_unit_test_actual as ( + select + id,proposal_id,private_field_description,private_field_content, 'actual' as "actual_or_expected" + from ( + WITH __dbt__cte__stg_decidim_awesome_proposal_extra_fields as ( + +-- Fixture for stg_decidim_awesome_proposal_extra_fields +select + + cast(1 as bigint) + as id, + + cast(101 as bigint) + as proposal_id, cast(null as timestamp without time zone) as updated_at, cast(null as timestamp without time zone) as created_at, + + cast('
Cette idée est déposée à titre :
Individuel
Votre tranche d''âge :
16-25 ans
' as text) + as private_body_clear +), parsed_data AS ( + SELECT + decidim_awesome_proposal_extra_fields.id, + decidim_awesome_proposal_extra_fields.proposal_id, + xpath('//text()', unnest(xpath('//dt', xml_data)))::text AS private_field_description, + unnest(xpath('//dd/div/text()', unnest(xpath('//dd', xml_data))))::text AS private_field_content + FROM + __dbt__cte__stg_decidim_awesome_proposal_extra_fields AS decidim_awesome_proposal_extra_fields, + LATERAL xmlparse(document private_body_clear) AS xml_data +) +SELECT + parsed_data.id, + parsed_data.proposal_id, + replace(replace(private_field_description, '{"', ''), '"}', '') AS private_field_description, + parsed_data.private_field_content +FROM + parsed_data +WHERE + private_field_content IS NOT NULL + ) _dbt_internal_unit_test_actual +), +-- Build expected result +dbt_internal_unit_test_expected as ( + select + id, proposal_id, private_field_description, private_field_content, 'expected' as "actual_or_expected" + from ( + select + + cast(1 as bigint) + as id, + + cast(101 as bigint) + as proposal_id, + + cast('Cette idée est déposée à titre :' as text) + as private_field_description, + + cast('Individuel' as text) + as private_field_content +union all +select + + cast(1 as bigint) + as id, + + cast(101 as bigint) + as proposal_id, + + cast('Votre tranche d''âge :' as text) + as private_field_description, + + cast('16-25 ans' as text) + as private_field_content + ) _dbt_internal_unit_test_expected +) +-- Union actual and expected results +select * from dbt_internal_unit_test_actual +union all +select * from dbt_internal_unit_test_expected \ No newline at end of file diff --git a/projects/test_lyon/target/run/test_lyon/models/marts/participations_with_extended_data.sql b/projects/test_lyon/target/run/test_lyon/models/marts/participations_with_extended_data.sql new file mode 100644 index 00000000..de8ca5d6 --- /dev/null +++ b/projects/test_lyon/target/run/test_lyon/models/marts/participations_with_extended_data.sql @@ -0,0 +1,21 @@ + + + + + create table "test_lyon"."prod"."participations_with_extended_data__dbt_tmp" + + + as + + ( + SELECT + DISTINCT ON (user_id, ps_title) + user_id, + users.age_category AS age_category, + decidim_component_id, + components.ps_title AS ps_title +FROM "test_lyon"."prod"."participations" participations + JOIN "test_lyon"."prod"."components" components ON participations.decidim_component_id = components.id + JOIN "test_lyon"."prod"."users" users ON participations.user_id = users.id + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql b/projects/test_lyon/target/run/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql new file mode 100644 index 00000000..525004c8 --- /dev/null +++ b/projects/test_lyon/target/run/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql @@ -0,0 +1,23 @@ + + + + + create table "test_lyon"."prod"."stg_decidim_awesome_proposal_extra_fields__dbt_tmp" + + + as + + ( + WITH source AS ( + SELECT * FROM "test_lyon"."public"."decidim_awesome_proposal_extra_fields_test" +) + +SELECT + id, + decidim_proposal_id AS proposal_id, + updated_at, + created_at, + private_body_clear +FROM source + ); + \ No newline at end of file diff --git a/projects/test_lyon/target/run_results.json b/projects/test_lyon/target/run_results.json new file mode 100644 index 00000000..fe8fbd94 --- /dev/null +++ b/projects/test_lyon/target/run_results.json @@ -0,0 +1 @@ +{"metadata": {"dbt_schema_version": "https://schemas.getdbt.com/dbt/run-results/v6.json", "dbt_version": "1.8.7", "generated_at": "2024-09-27T14:10:06.935490Z", "invocation_id": "abd1849f-2f07-41b8-9fd3-963d4daf1290", "env": {}}, "results": [{"status": "pass", "timing": [{"name": "compile", "started_at": "2024-09-27T14:10:06.469911Z", "completed_at": "2024-09-27T14:10:06.469921Z"}, {"name": "execute", "started_at": "2024-09-27T14:10:06.470529Z", "completed_at": "2024-09-27T14:10:06.820048Z"}], "thread_id": "Thread-1 (worker)", "execution_time": 0.36307215690612793, "adapter_response": {"_message": "SELECT 4", "code": "SELECT", "rows_affected": 4}, "message": null, "failures": 0, "unique_id": "unit_test.test_lyon.int_decidim_awesome_proposal_extra_fields.testing_that_the_correct_xml_information_are_parsed", "compiled": true, "compiled_code": "WITH __dbt__cte__stg_decidim_awesome_proposal_extra_fields as (\n\n-- Fixture for stg_decidim_awesome_proposal_extra_fields\nselect \n \n cast(1 as bigint)\n as id, \n \n cast(101 as bigint)\n as proposal_id, cast(null as timestamp without time zone) as updated_at, cast(null as timestamp without time zone) as created_at, \n \n cast('
Cette id\u00e9e est d\u00e9pos\u00e9e \u00e0 titre :
Individuel
Votre tranche d''\u00e2ge :
16-25 ans
' as text)\n as private_body_clear\n), parsed_data AS (\n SELECT\n decidim_awesome_proposal_extra_fields.id,\n decidim_awesome_proposal_extra_fields.proposal_id,\n xpath('//text()', unnest(xpath('//dt', xml_data)))::text AS private_field_description,\n unnest(xpath('//dd/div/text()', unnest(xpath('//dd', xml_data))))::text AS private_field_content\n FROM\n __dbt__cte__stg_decidim_awesome_proposal_extra_fields AS decidim_awesome_proposal_extra_fields,\n LATERAL xmlparse(document private_body_clear) AS xml_data\n)\nSELECT\n parsed_data.id,\n parsed_data.proposal_id,\n replace(replace(private_field_description, '{\"', ''), '\"}', '') AS private_field_description,\n parsed_data.private_field_content\nFROM\n parsed_data\nWHERE\n private_field_content IS NOT NULL", "relation_name": null}], "elapsed_time": 0.8687701225280762, "args": {"indirect_selection": "eager", "log_path": "/Users/uosp/Documents/osp_dev/dbt-processing/projects/test_lyon/logs", "defer": false, "log_file_max_bytes": 10485760, "require_resource_names_without_spaces": false, "use_colors_file": true, "enable_legacy_logger": false, "log_level": "info", "partial_parse": true, "profiles_dir": "/Users/uosp/Documents/osp_dev/dbt-processing/projects/test_lyon", "require_explicit_package_overrides_for_builtin_materializations": true, "which": "test", "log_format_file": "debug", "exclude": [], "favor_state": false, "project_dir": "/Users/uosp/Documents/osp_dev/dbt-processing/projects/test_lyon", "log_level_file": "debug", "write_json": true, "select": ["path:models/intermediate/decidim_awesome"], "cache_selected_only": false, "quiet": false, "warn_error_options": {"include": [], "exclude": []}, "populate_cache": true, "send_anonymous_usage_stats": true, "printer_width": 80, "version_check": true, "use_colors": true, "macro_debugging": false, "vars": {}, "print": true, "static_parser": true, "partial_parse_file_diff": true, "invocation_command": "dbt test --select path:models/intermediate/decidim_awesome", "strict_mode": false, "log_format": "default", "introspect": true, "show_resource_report": false, "source_freshness_run_project_hooks": false}} \ No newline at end of file diff --git a/projects/test_lyon/target/semantic_manifest.json b/projects/test_lyon/target/semantic_manifest.json new file mode 100644 index 00000000..a40b829c --- /dev/null +++ b/projects/test_lyon/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": "5", "patch_version": "1"}}, "saved_queries": []} \ No newline at end of file From f213212ca02f62e481ec7c8707a71a8ccf8774d5 Mon Sep 17 00:00:00 2001 From: Fujistone <73913825+Fujistone@users.noreply.github.com> Date: Mon, 30 Sep 2024 00:05:22 +0200 Subject: [PATCH 2/3] deleting projects/test_lyon/target directory --- .../budgets/int_budgets_orders.sql | 13 -- .../budgets/int_budgets_projects.sql | 16 --- .../components/int_components.sql | 25 ---- .../intermediate/forms/answers_file.sql | 27 ---- .../intermediate/forms/answers_matrix.sql | 21 --- .../forms/answers_option_and_sorting.sql | 20 --- .../forms/answers_short_and_long_answer.sql | 19 --- .../intermediate/forms/int_forms_answers.sql | 18 --- .../intermediate/meetings/int_meetings.sql | 24 ---- .../organizations/int_organizations.sql | 29 ---- .../intermediate/proposals/int_proposals.sql | 25 ---- .../models/intermediate/scopes/int_scopes.sql | 12 -- .../models/intermediate/users/int_users.sql | 47 ------- .../demo/models/marts/attachments.sql | 15 -- .../models/marts/blogs_posts/blogs_posts.sql | 11 -- .../demo/models/marts/budgets/budgets.sql | 9 -- .../models/marts/budgets/budgets_projects.sql | 33 ----- .../models/marts/budgets/projects_votes.sql | 28 ---- .../marts/categorizations/categorizations.sql | 31 ---- .../demo/models/marts/comments/comments.sql | 94 ------------- .../models/marts/components/components.sql | 58 -------- .../demo/models/marts/debates/debates.sql | 42 ------ .../marts/endorsements/endorsements.sql | 43 ------ .../models/marts/followings/followings.sql | 120 ---------------- .../demo/models/marts/forms/forms.sql | 27 ---- .../demo/models/marts/forms/forms_answers.sql | 52 ------- .../demo/models/marts/meetings/meetings.sql | 48 ------- .../demo/models/marts/organizations.sql | 3 - .../demo/models/marts/participations.sql | 84 ----------- .../demo/models/marts/proposals/proposals.sql | 69 --------- .../marts/proposals/proposals_votes.sql | 12 -- .../demo/models/marts/users/users.sql | 109 --------------- .../decidim/areas/stg_decidim_area_types.sql | 12 -- .../decidim/areas/stg_decidim_areas.sql | 14 -- .../assemblies/stg_decidim_assemblies.sql | 58 -------- .../blogs_posts/stg_decidim_blogs_posts.sql | 15 -- .../decidim/budgets/stg_decidim_budgets.sql | 11 -- .../stg_decidim_budgets_line_items.sql | 11 -- .../budgets/stg_decidim_budgets_orders.sql | 14 -- .../budgets/stg_decidim_budgets_projects.sql | 17 --- .../categories/stg_decidim_categories.sql | 15 -- .../stg_decidim_categorizations.sql | 14 -- .../decidim/debates/stg_decidim_debates.sql | 18 --- .../stg_decidim_forms_answer_choices.sql | 15 -- .../forms/stg_decidim_forms_answers.sql | 17 --- ...stg_decidim_forms_question_matrix_rows.sql | 12 -- .../stg_decidim_forms_questionnaires.sql | 18 --- .../forms/stg_decidim_forms_questions.sql | 21 --- .../stg_decidim_organizations.sql | 23 --- .../proposals/stg_decidim_proposals.sql | 14 -- ...decidim_proposals_collaborative_drafts.sql | 28 ---- .../proposals/stg_decidim_proposals_votes.sql | 15 -- .../decidim/scopes/stg_decidim_scopes.sql | 17 --- .../stg_decidim_accountability_results.sql | 25 ---- .../decidim/stg_decidim_attachments.sql | 20 --- .../decidim/stg_decidim_coauthorships.sql | 18 --- .../staging/decidim/stg_decidim_comments.sql | 22 --- .../decidim/stg_decidim_components.sql | 19 --- .../decidim/stg_decidim_endorsements.sql | 10 -- .../staging/decidim/stg_decidim_follows.sql | 14 -- .../staging/decidim/stg_decidim_meetings.sql | 23 --- .../stg_decidim_meetings_registrations.sql | 16 --- .../decidim/stg_decidim_moderations.sql | 18 --- ...tg_decidim_participatory_process_steps.sql | 21 --- .../stg_decidim_participatory_processes.sql | 16 --- .../staging/decidim/stg_decidim_surveys.sql | 12 -- .../staging/decidim/stg_decidim_users.sql | 41 ------ ..._decidim_awesome_proposal_extra_fields.sql | 19 --- ...the_correct_xml_information_are_parsed.sql | 32 ----- ..._decidim_awesome_proposal_extra_fields.sql | 12 -- .../participations_with_extended_data.sql | 9 -- ..._decidim_awesome_proposal_extra_fields.sql | 11 -- projects/test_lyon/target/graph.gpickle | Bin 267456 -> 0 bytes projects/test_lyon/target/graph_summary.json | 1 - projects/test_lyon/target/manifest.json | 1 - .../test_lyon/target/partial_parse.msgpack | Bin 1023822 -> 0 bytes .../budgets/int_budgets_orders.sql | 25 ---- .../budgets/int_budgets_projects.sql | 28 ---- .../components/int_components.sql | 37 ----- .../intermediate/forms/answers_file.sql | 39 ------ .../intermediate/forms/answers_matrix.sql | 33 ----- .../forms/answers_option_and_sorting.sql | 32 ----- .../forms/answers_short_and_long_answer.sql | 31 ---- .../intermediate/forms/int_forms_answers.sql | 30 ---- .../intermediate/meetings/int_meetings.sql | 36 ----- .../organizations/int_organizations.sql | 41 ------ .../intermediate/proposals/int_proposals.sql | 37 ----- .../models/intermediate/scopes/int_scopes.sql | 24 ---- .../models/intermediate/users/int_users.sql | 59 -------- .../run/demo/models/marts/attachments.sql | 27 ---- .../models/marts/blogs_posts/blogs_posts.sql | 23 --- .../run/demo/models/marts/budgets/budgets.sql | 21 --- .../models/marts/budgets/budgets_projects.sql | 45 ------ .../models/marts/budgets/projects_votes.sql | 40 ------ .../marts/categorizations/categorizations.sql | 43 ------ .../demo/models/marts/comments/comments.sql | 106 -------------- .../models/marts/components/components.sql | 70 ---------- .../run/demo/models/marts/debates/debates.sql | 54 ------- .../marts/endorsements/endorsements.sql | 55 -------- .../models/marts/followings/followings.sql | 132 ------------------ .../run/demo/models/marts/forms/forms.sql | 39 ------ .../demo/models/marts/forms/forms_answers.sql | 64 --------- .../demo/models/marts/meetings/meetings.sql | 60 -------- .../run/demo/models/marts/organizations.sql | 15 -- .../run/demo/models/marts/participations.sql | 96 ------------- .../demo/models/marts/proposals/proposals.sql | 81 ----------- .../marts/proposals/proposals_votes.sql | 24 ---- .../run/demo/models/marts/users/users.sql | 121 ---------------- .../decidim/areas/stg_decidim_area_types.sql | 24 ---- .../decidim/areas/stg_decidim_areas.sql | 26 ---- .../assemblies/stg_decidim_assemblies.sql | 70 ---------- .../blogs_posts/stg_decidim_blogs_posts.sql | 27 ---- .../decidim/budgets/stg_decidim_budgets.sql | 23 --- .../stg_decidim_budgets_line_items.sql | 23 --- .../budgets/stg_decidim_budgets_orders.sql | 26 ---- .../budgets/stg_decidim_budgets_projects.sql | 29 ---- .../categories/stg_decidim_categories.sql | 27 ---- .../stg_decidim_categorizations.sql | 26 ---- .../decidim/debates/stg_decidim_debates.sql | 30 ---- .../stg_decidim_forms_answer_choices.sql | 27 ---- .../forms/stg_decidim_forms_answers.sql | 29 ---- ...stg_decidim_forms_question_matrix_rows.sql | 24 ---- .../stg_decidim_forms_questionnaires.sql | 30 ---- .../forms/stg_decidim_forms_questions.sql | 33 ----- .../stg_decidim_organizations.sql | 35 ----- .../proposals/stg_decidim_proposals.sql | 26 ---- ...decidim_proposals_collaborative_drafts.sql | 40 ------ .../proposals/stg_decidim_proposals_votes.sql | 27 ---- .../decidim/scopes/stg_decidim_scopes.sql | 29 ---- .../stg_decidim_accountability_results.sql | 37 ----- .../decidim/stg_decidim_attachments.sql | 32 ----- .../decidim/stg_decidim_coauthorships.sql | 30 ---- .../staging/decidim/stg_decidim_comments.sql | 34 ----- .../decidim/stg_decidim_components.sql | 31 ---- .../decidim/stg_decidim_endorsements.sql | 22 --- .../staging/decidim/stg_decidim_follows.sql | 26 ---- .../staging/decidim/stg_decidim_meetings.sql | 35 ----- .../stg_decidim_meetings_registrations.sql | 28 ---- .../decidim/stg_decidim_moderations.sql | 30 ---- ...tg_decidim_participatory_process_steps.sql | 33 ----- .../stg_decidim_participatory_processes.sql | 28 ---- .../staging/decidim/stg_decidim_surveys.sql | 24 ---- .../staging/decidim/stg_decidim_users.sql | 53 ------- ..._decidim_awesome_proposal_extra_fields.sql | 31 ---- ...the_correct_xml_information_are_parsed.sql | 77 ---------- .../participations_with_extended_data.sql | 21 --- ..._decidim_awesome_proposal_extra_fields.sql | 23 --- projects/test_lyon/target/run_results.json | 1 - .../test_lyon/target/semantic_manifest.json | 1 - 149 files changed, 4719 deletions(-) delete mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_orders.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_projects.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/components/int_components.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_file.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_matrix.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_option_and_sorting.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_short_and_long_answer.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/forms/int_forms_answers.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/meetings/int_meetings.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/organizations/int_organizations.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/proposals/int_proposals.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/scopes/int_scopes.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/intermediate/users/int_users.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/attachments.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/blogs_posts/blogs_posts.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets_projects.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/budgets/projects_votes.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/categorizations/categorizations.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/comments/comments.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/components/components.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/debates/debates.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/endorsements/endorsements.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/followings/followings.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/forms/forms.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/forms/forms_answers.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/meetings/meetings.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/organizations.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/participations.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals_votes.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/marts/users/users.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_area_types.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_areas.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categories.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/debates/stg_decidim_debates.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_accountability_results.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_attachments.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_coauthorships.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_comments.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_components.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_endorsements.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_follows.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_moderations.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_processes.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_surveys.sql delete mode 100644 projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_users.sql delete mode 100644 projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql delete mode 100644 projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql delete mode 100644 projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/stg_decidim_awesome_proposal_extra_fields.sql delete mode 100644 projects/test_lyon/target/compiled/test_lyon/models/marts/participations_with_extended_data.sql delete mode 100644 projects/test_lyon/target/compiled/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql delete mode 100644 projects/test_lyon/target/graph.gpickle delete mode 100644 projects/test_lyon/target/graph_summary.json delete mode 100644 projects/test_lyon/target/manifest.json delete mode 100644 projects/test_lyon/target/partial_parse.msgpack delete mode 100644 projects/test_lyon/target/run/demo/models/intermediate/budgets/int_budgets_orders.sql delete mode 100644 projects/test_lyon/target/run/demo/models/intermediate/budgets/int_budgets_projects.sql delete mode 100644 projects/test_lyon/target/run/demo/models/intermediate/components/int_components.sql delete mode 100644 projects/test_lyon/target/run/demo/models/intermediate/forms/answers_file.sql delete mode 100644 projects/test_lyon/target/run/demo/models/intermediate/forms/answers_matrix.sql delete mode 100644 projects/test_lyon/target/run/demo/models/intermediate/forms/answers_option_and_sorting.sql delete mode 100644 projects/test_lyon/target/run/demo/models/intermediate/forms/answers_short_and_long_answer.sql delete mode 100644 projects/test_lyon/target/run/demo/models/intermediate/forms/int_forms_answers.sql delete mode 100644 projects/test_lyon/target/run/demo/models/intermediate/meetings/int_meetings.sql delete mode 100644 projects/test_lyon/target/run/demo/models/intermediate/organizations/int_organizations.sql delete mode 100644 projects/test_lyon/target/run/demo/models/intermediate/proposals/int_proposals.sql delete mode 100644 projects/test_lyon/target/run/demo/models/intermediate/scopes/int_scopes.sql delete mode 100644 projects/test_lyon/target/run/demo/models/intermediate/users/int_users.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/attachments.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/blogs_posts/blogs_posts.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/budgets/budgets.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/budgets/budgets_projects.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/budgets/projects_votes.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/categorizations/categorizations.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/comments/comments.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/components/components.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/debates/debates.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/endorsements/endorsements.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/followings/followings.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/forms/forms.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/forms/forms_answers.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/meetings/meetings.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/organizations.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/participations.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/proposals/proposals.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/proposals/proposals_votes.sql delete mode 100644 projects/test_lyon/target/run/demo/models/marts/users/users.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_area_types.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_areas.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categories.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/debates/stg_decidim_debates.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_accountability_results.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_attachments.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_coauthorships.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_comments.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_components.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_endorsements.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_follows.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_moderations.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_processes.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_surveys.sql delete mode 100644 projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_users.sql delete mode 100644 projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql delete mode 100644 projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql delete mode 100644 projects/test_lyon/target/run/test_lyon/models/marts/participations_with_extended_data.sql delete mode 100644 projects/test_lyon/target/run/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql delete mode 100644 projects/test_lyon/target/run_results.json delete mode 100644 projects/test_lyon/target/semantic_manifest.json diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_orders.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_orders.sql deleted file mode 100644 index 71e20070..00000000 --- a/projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_orders.sql +++ /dev/null @@ -1,13 +0,0 @@ -SELECT - id, - decidim_user_id, - checked_out_at, - created_at, - updated_at, - decidim_budgets_budget_id, - (CASE - WHEN checked_out_at IS NULL - THEN false - ELSE true - END) AS vote_finished -FROM "test_lyon"."prod"."stg_decidim_budgets_orders" \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_projects.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_projects.sql deleted file mode 100644 index 7b0a3bc4..00000000 --- a/projects/test_lyon/target/compiled/demo/models/intermediate/budgets/int_budgets_projects.sql +++ /dev/null @@ -1,16 +0,0 @@ -SELECT - id, - title, - description, - created_at, - decidim_scope_id, - project_amount, - selected_at, - decidim_budgets_budget_id, - resource_type, - (CASE - WHEN selected_at IS NULL - THEN false - ELSE true - END) AS is_selected -FROM "test_lyon"."prod"."stg_decidim_budgets_projects" \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/components/int_components.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/components/int_components.sql deleted file mode 100644 index 013fc329..00000000 --- a/projects/test_lyon/target/compiled/demo/models/intermediate/components/int_components.sql +++ /dev/null @@ -1,25 +0,0 @@ -SELECT - decidim_components.id, - decidim_components.manifest_name, - -- For Metabase usage, we translate the name in French - (CASE decidim_components.manifest_name - WHEN 'accountability' THEN 'Suivi' - WHEN 'pages' THEN 'Page' - WHEN 'budgets' THEN 'Budgets' - WHEN 'meetings' THEN 'Rencontres' - WHEN 'proposals' THEN 'Propositions' - WHEN 'surveys' THEN 'Enquêtes' - WHEN 'blogs' THEN 'Blogs' - ELSE decidim_components.manifest_name - END - ) AS translated_manifest_name, - decidim_components.name, - decidim_components.participatory_space_id, - decidim_components.participatory_space_type, - decidim_components.settings, - decidim_components.weight, - decidim_components.permissions, - decidim_components.published_at, - decidim_components.created_at, - decidim_components.updated_at - FROM "test_lyon"."prod"."stg_decidim_components" as decidim_components \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_file.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_file.sql deleted file mode 100644 index 40117f9b..00000000 --- a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_file.sql +++ /dev/null @@ -1,27 +0,0 @@ - - -WITH org AS ( - -- Assumption: There is only one organization, so we select the first available host - SELECT host - FROM "test_lyon"."prod"."organizations" - LIMIT 1 -) -SELECT DISTINCT - decidim_forms_answers.decidim_user_id, - decidim_forms_answers.session_token, - decidim_forms_answers.ip_hash, - decidim_forms_questions.question_type, - decidim_forms_questions.position AS "position", - decidim_attachments.file AS "answer", - '' AS "sub_matrix_question", - CONCAT('https://', org.host, '/uploads/decidim/attachment/file/', decidim_attachments.id, '/', decidim_attachments.file) AS custom_body, - -1 AS sorting_position, - decidim_forms_questions.decidim_questionnaire_id, - decidim_forms_questions.body, - decidim_forms_answers.created_at, - decidim_forms_answers.author_status -FROM "test_lyon"."prod"."int_forms_answers" decidim_forms_answers -JOIN "test_lyon"."prod"."stg_decidim_forms_questions" AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id -JOIN "test_lyon"."prod"."stg_decidim_attachments" decidim_attachments ON decidim_attachments.attached_to_id = decidim_forms_answers.id -CROSS JOIN org -WHERE attached_to_type = 'Decidim::Forms::Answer' \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_matrix.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_matrix.sql deleted file mode 100644 index 2185df95..00000000 --- a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_matrix.sql +++ /dev/null @@ -1,21 +0,0 @@ - - -SELECT DISTINCT - decidim_forms_answers.decidim_user_id, - decidim_forms_answers.session_token, - decidim_forms_answers.ip_hash, - decidim_forms_questions.question_type, - decidim_forms_questions.position AS "position", - decidim_forms_answer_choices.body::text AS "answer", - decidim_forms_question_matrix_rows.body AS sub_matrix_question, - '' AS custom_body, - -1 AS sorting_position, - decidim_forms_questions.decidim_questionnaire_id, - decidim_forms_questions.body, - decidim_forms_answers.created_at, - decidim_forms_answers.author_status -FROM "test_lyon"."prod"."int_forms_answers" decidim_forms_answers -JOIN "test_lyon"."prod"."stg_decidim_forms_questions" AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id -JOIN "test_lyon"."prod"."stg_decidim_forms_answer_choices" decidim_forms_answer_choices ON decidim_forms_answer_choices.decidim_answer_id = decidim_forms_answers.id -JOIN "test_lyon"."prod"."stg_decidim_forms_question_matrix_rows" decidim_forms_question_matrix_rows ON decidim_forms_question_matrix_rows.id = decidim_forms_answer_choices.decidim_question_matrix_row_id -WHERE question_type = ANY('{matrix_single, matrix_multiple}'::text[]) \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_option_and_sorting.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_option_and_sorting.sql deleted file mode 100644 index 42beb7fb..00000000 --- a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_option_and_sorting.sql +++ /dev/null @@ -1,20 +0,0 @@ - - -SELECT DISTINCT - decidim_forms_answers.decidim_user_id, - decidim_forms_answers.session_token, - decidim_forms_answers.ip_hash, - decidim_forms_questions.question_type, - decidim_forms_questions.position AS question_position, - decidim_forms_answer_choices.body::text AS "answer", - '' AS sub_matrix_question, - COALESCE(decidim_forms_answer_choices.custom_body, '') AS custom_body, - (CASE question_type WHEN 'sorting' THEN decidim_forms_answer_choices.position ELSE -1 END) AS sorting_position, - decidim_forms_questions.decidim_questionnaire_id, - decidim_forms_questions.body, - decidim_forms_answers.created_at, - decidim_forms_answers.author_status -FROM "test_lyon"."prod"."int_forms_answers" decidim_forms_answers -JOIN "test_lyon"."prod"."stg_decidim_forms_questions" AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id -JOIN "test_lyon"."prod"."stg_decidim_forms_answer_choices" decidim_forms_answer_choices ON decidim_forms_answer_choices.decidim_answer_id = decidim_forms_answers.id -WHERE question_type = ANY('{single_option, multiple_option, sorting}'::text[]) \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_short_and_long_answer.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_short_and_long_answer.sql deleted file mode 100644 index 148d3b2b..00000000 --- a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/answers_short_and_long_answer.sql +++ /dev/null @@ -1,19 +0,0 @@ - - -SELECT - decidim_user_id, - session_token, - ip_hash, - question_type, - position, - COALESCE(NULLIF(decidim_forms_answers.body,''), 'Pas de réponse') AS "answer", - '' AS sub_matrix_question, - '' AS custom_body, - -1 AS sorting_position, - decidim_forms_questions.decidim_questionnaire_id, - decidim_forms_questions.body, - decidim_forms_answers.created_at, - decidim_forms_answers.author_status -FROM "test_lyon"."prod"."int_forms_answers" decidim_forms_answers -JOIN "test_lyon"."prod"."stg_decidim_forms_questions" AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id -WHERE question_type = ANY('{short_answer,long_answer}'::text[]) \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/int_forms_answers.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/forms/int_forms_answers.sql deleted file mode 100644 index 72289341..00000000 --- a/projects/test_lyon/target/compiled/demo/models/intermediate/forms/int_forms_answers.sql +++ /dev/null @@ -1,18 +0,0 @@ - - -SELECT - id, - body, - decidim_user_id, - decidim_questionnaire_id, - decidim_question_id, - created_at, - (CASE - WHEN decidim_user_id IS NULL THEN 'Non connecté' - ELSE 'Inscrit et connecté' - END - ) AS author_status, - updated_at, - session_token, - ip_hash -FROM "test_lyon"."prod"."stg_decidim_forms_answers" \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/meetings/int_meetings.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/meetings/int_meetings.sql deleted file mode 100644 index 50822855..00000000 --- a/projects/test_lyon/target/compiled/demo/models/intermediate/meetings/int_meetings.sql +++ /dev/null @@ -1,24 +0,0 @@ -SELECT - decidim_meetings.id, - decidim_meetings.title, - decidim_meetings.description, - decidim_meetings.address, - decidim_meetings.attendees_count, - decidim_meetings.created_at, - decidim_meetings.decidim_scope_id, - decidim_meetings.decidim_component_id, - decidim_meetings.start_time, - decidim_meetings.end_time, - decidim_meetings.registration_url, - decidim_meetings.type_of_meeting, - (CASE decidim_meetings.type_of_meeting - WHEN 'online' THEN 'En ligne' - WHEN 'in_person' THEN 'En présentiel' - WHEN 'hybrid' THEN 'Hybride' - ELSE decidim_meetings.type_of_meeting - END - ) AS translated_type_of_meeting, - decidim_meetings.private_meeting, - decidim_meetings.decidim_author_id, - decidim_meetings.resource_type - FROM "test_lyon"."prod"."stg_decidim_meetings" as decidim_meetings \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/organizations/int_organizations.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/organizations/int_organizations.sql deleted file mode 100644 index bb104b91..00000000 --- a/projects/test_lyon/target/compiled/demo/models/intermediate/organizations/int_organizations.sql +++ /dev/null @@ -1,29 +0,0 @@ - - - -WITH source AS ( - SELECT * FROM "test_lyon"."prod"."stg_decidim_organizations" -), -renamed AS ( - SELECT - id, - name, - host, - default_locale, - available_locales, - created_at, - regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description, - secondary_hosts, - available_authorizations, - header_snippets, - tos_version, - badges_enabled, - send_welcome_notification, - users_registration_mode, - time_zone - FROM source - WHERE host = '' - -- Assumption: There is only one organization, so we select the first available host - LIMIT 1 -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/proposals/int_proposals.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/proposals/int_proposals.sql deleted file mode 100644 index 1302310a..00000000 --- a/projects/test_lyon/target/compiled/demo/models/intermediate/proposals/int_proposals.sql +++ /dev/null @@ -1,25 +0,0 @@ - - -SELECT - decidim_proposals.id, - decidim_proposals.title, - decidim_proposals.body, - decidim_proposals.resource_type, - decidim_proposals.decidim_component_id, - decidim_proposals.decidim_scope_id, - decidim_proposals.created_at, - decidim_proposals.published_at, - COALESCE(NULLIF(decidim_proposals.state, NULL), 'Pas d''état') AS state, - (CASE - WHEN decidim_proposals.state = 'evaluating' THEN 'En cours d''évaluation' - WHEN decidim_proposals.state = 'rejected' THEN 'Rejetée' - WHEN decidim_proposals.state = 'accepted' THEN 'Acceptée' - WHEN decidim_proposals.state IS NULL THEN 'Pas d''état' - ELSE decidim_proposals.state - END - ) AS translated_state, - decidim_proposals.comments_count, - decidim_proposals.endorsements_count, - COALESCE(NULLIF(decidim_proposals.address,''),'Pas d''adresse') AS address -FROM "test_lyon"."prod"."stg_decidim_proposals" AS decidim_proposals -WHERE published_at IS NOT NULL \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/scopes/int_scopes.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/scopes/int_scopes.sql deleted file mode 100644 index 86247ae0..00000000 --- a/projects/test_lyon/target/compiled/demo/models/intermediate/scopes/int_scopes.sql +++ /dev/null @@ -1,12 +0,0 @@ --- Due to ARRAY bug in test, we create an intermediate scopes without the column part_of - -SELECT - decidim_scopes.id, - decidim_scopes.decidim_organization_id, - decidim_scopes.created_at, - decidim_scopes.updated_at, - coalesce(nullif(decidim_scopes.name, ''), 'Sans secteur') as name, - decidim_scopes.scope_type_id, - decidim_scopes.parent_id, - decidim_scopes.code -FROM "test_lyon"."prod"."stg_decidim_scopes" as decidim_scopes \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/intermediate/users/int_users.sql b/projects/test_lyon/target/compiled/demo/models/intermediate/users/int_users.sql deleted file mode 100644 index 39517ec8..00000000 --- a/projects/test_lyon/target/compiled/demo/models/intermediate/users/int_users.sql +++ /dev/null @@ -1,47 +0,0 @@ - - -SELECT - decidim_users.id, - decidim_users.email, - decidim_users.sign_in_count, - (CASE - WHEN decidim_users.sign_in_count = 0 THEN 'Jamais' - WHEN decidim_users.sign_in_count = 1 THEN 'Une seule fois' - WHEN decidim_users.sign_in_count = 2 THEN 'Deux fois' - WHEN decidim_users.sign_in_count BETWEEN 2 AND 10 THEN 'Entre 2 et 10 fois' - ELSE 'Plus de 10 fois' - END - ) AS sign_in_frequency, - decidim_users.last_sign_in_at, - decidim_users.created_at, - decidim_users.updated_at, - decidim_users.invitation_created_at, - decidim_users.invitation_sent_at, - decidim_users.invitation_accepted_at, - decidim_users.invited_by_id, - decidim_users.invited_by_type, - decidim_users.decidim_organization_id, - decidim_users.confirmed_at, - decidim_users.confirmation_token, - decidim_users.unconfirmed_email, - decidim_users.name, - decidim_users.locale, - decidim_users.deleted_at, - decidim_users.admin, - decidim_users.managed, - decidim_users.roles, - decidim_users.nickname, - decidim_users.accepted_tos_version, - decidim_users.type, - decidim_users.following_count, - decidim_users.followers_count, - decidim_users.failed_attempts, - decidim_users.locked_at, - decidim_users.admin_terms_accepted_at, - decidim_users.blocked, - decidim_users.blocked_at, - (CASE WHEN decidim_users.confirmed_at IS NULL THEN false ELSE true END) AS confirmed, - decidim_users.extended_data -FROM "test_lyon"."prod"."stg_decidim_users" as decidim_users - WHERE deleted_at IS NULL - AND type LIKE 'Decidim::User' \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/attachments.sql b/projects/test_lyon/target/compiled/demo/models/marts/attachments.sql deleted file mode 100644 index c76517f0..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/attachments.sql +++ /dev/null @@ -1,15 +0,0 @@ -WITH org AS ( - -- Assumption: There is only one organization, so we select the first available host - SELECT host - FROM "test_lyon"."prod"."organizations" - LIMIT 1 -) -SELECT - decidim_attachments.id, - decidim_attachments.file, - decidim_attachments.attached_to_id, - decidim_attachments.attached_to_type, - concat('https://', org.host, '/uploads/decidim/attachment/file/', decidim_attachments.id, '/', decidim_attachments.file) AS url -FROM - "test_lyon"."prod"."stg_decidim_attachments" AS decidim_attachments -CROSS JOIN org \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/blogs_posts/blogs_posts.sql b/projects/test_lyon/target/compiled/demo/models/marts/blogs_posts/blogs_posts.sql deleted file mode 100644 index f366d022..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/blogs_posts/blogs_posts.sql +++ /dev/null @@ -1,11 +0,0 @@ -SELECT - decidim_blogs_posts.id, - decidim_blogs_posts.title, - decidim_blogs_posts.body, - decidim_blogs_posts.decidim_component_id, - decidim_blogs_posts.created_at, - decidim_blogs_posts.decidim_author_id, - decidim_blogs_posts.resource_type, - concat('https://', decidim_components.organization_host, '/', decidim_components.ps_space_type_slug, '/', decidim_components.ps_slug, '/f/', decidim_components.id, '/posts/', decidim_blogs_posts.id) AS post_url -FROM "test_lyon"."prod"."stg_decidim_blogs_posts" AS decidim_blogs_posts -JOIN "test_lyon"."prod"."components" AS decidim_components ON decidim_components.id = decidim_component_id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets.sql b/projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets.sql deleted file mode 100644 index 53a9a8e8..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets.sql +++ /dev/null @@ -1,9 +0,0 @@ -SELECT - decidim_budgets_budgets.id, - decidim_budgets_budgets.title, - decidim_components.id AS decidim_component_id, - decidim_components.ps_url AS url, - decidim_components.ps_slug, - decidim_components.ps_title -FROM "test_lyon"."prod"."stg_decidim_budgets" AS decidim_budgets_budgets -JOIN "test_lyon"."prod"."components" AS decidim_components on decidim_components.id = decidim_budgets_budgets.decidim_component_id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets_projects.sql b/projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets_projects.sql deleted file mode 100644 index 2c11d0d2..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/budgets/budgets_projects.sql +++ /dev/null @@ -1,33 +0,0 @@ -WITH categorizations AS ( - - SELECT - array_agg(category_name) AS categories, - array_agg(child_name) AS sub_categories, - categorizable_id - FROM "test_lyon"."prod"."categorizations" AS categorizations - WHERE categorizations.categorizable_type = 'Decidim::Budgets::Project' - GROUP BY categorizable_id - -) -SELECT - decidim_budgets_projects.id, - decidim_budgets_projects.title, - decidim_budgets_projects.description, - decidim_budgets_projects.created_at, - decidim_budgets_projects.decidim_scope_id, - decidim_budgets_projects.project_amount, - decidim_budgets_projects.selected_at, - decidim_budgets_projects.is_selected, - decidim_budgets_budgets.id AS budget_id, - decidim_budgets_budgets.title AS budget_title, - decidim_budgets_projects.resource_type, - decidim_budgets_budgets.decidim_component_id, - concat(decidim_components.component_url,'/', decidim_components.manifest_name,'/', decidim_budgets_budgets.id, '/projects/', decidim_budgets_projects.id) AS project_url, - categorizations.categories, - coalesce(categorizations.categories[1], 'Sans catégorie') AS first_category, - categorizations.sub_categories, - coalesce(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category -FROM "test_lyon"."prod"."int_budgets_projects" AS decidim_budgets_projects -JOIN "test_lyon"."prod"."stg_decidim_budgets" AS decidim_budgets_budgets on decidim_budgets_budgets.id = decidim_budgets_projects.decidim_budgets_budget_id -JOIN "test_lyon"."prod"."components" as decidim_components on decidim_components.id = decidim_budgets_budgets.decidim_component_id -LEFT JOIN categorizations on categorizations.categorizable_id = decidim_budgets_projects.id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/budgets/projects_votes.sql b/projects/test_lyon/target/compiled/demo/models/marts/budgets/projects_votes.sql deleted file mode 100644 index 405ccca3..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/budgets/projects_votes.sql +++ /dev/null @@ -1,28 +0,0 @@ --- /!\ Warning : counts unfinished votes ! --- /!\ Warning : should be filtered on the corresponding budget to get the good values - - - -WITH budgets_projects AS ( - SELECT - decidim_budgets_line_items.decidim_order_id, - decidim_budgets_projects.id AS "project_id", - decidim_budgets_projects.title AS "project_title", - decidim_budgets_projects.decidim_component_id, - decidim_budgets_projects.project_url - from "test_lyon"."prod"."stg_decidim_budgets_line_items" AS decidim_budgets_line_items - JOIN "test_lyon"."prod"."budgets_projects" decidim_budgets_projects on decidim_budgets_projects.id = decidim_budgets_line_items.decidim_project_id -) - SELECT - decidim_budgets_orders.id as order_id, - decidim_budgets_orders.decidim_user_id, - budgets_projects.project_id, - budgets_projects.project_title, - budgets_projects.decidim_component_id, - decidim_budgets_orders.created_at, - decidim_budgets_orders.checked_out_at, - budgets_projects.project_url, - decidim_budgets_orders.vote_finished, - decidim_budgets_orders.decidim_budgets_budget_id - from "test_lyon"."prod"."int_budgets_orders" AS decidim_budgets_orders - LEFT JOIN budgets_projects on decidim_order_id = decidim_budgets_orders.id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/categorizations/categorizations.sql b/projects/test_lyon/target/compiled/demo/models/marts/categorizations/categorizations.sql deleted file mode 100644 index 562d71e4..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/categorizations/categorizations.sql +++ /dev/null @@ -1,31 +0,0 @@ -WITH main_categories AS ( - SELECT - decidim_categories.id AS id, - decidim_categories.name AS category_name, - 0 AS child_id, - '' AS child_name, - decidim_categorizations.categorizable_id, - decidim_categorizations.categorizable_type - FROM "test_lyon"."prod"."stg_decidim_categorizations" AS decidim_categorizations - JOIN "test_lyon"."prod"."stg_decidim_categories" AS decidim_categories ON decidim_categories.id = decidim_categorizations.decidim_category_id - WHERE decidim_categories.parent_id IS NULL -), -sub_categories AS ( - SELECT - parent_categories.id AS id, - parent_categories.name AS category_name, - decidim_categories.id AS child_id, - decidim_categories.name AS child_name, - decidim_categorizations.categorizable_id, - decidim_categorizations.categorizable_type - FROM "test_lyon"."prod"."stg_decidim_categorizations" AS decidim_categorizations - JOIN "test_lyon"."prod"."stg_decidim_categories" AS decidim_categories ON decidim_categories.id = decidim_categorizations.decidim_category_id - LEFT JOIN "test_lyon"."prod"."stg_decidim_categories" AS parent_categories ON decidim_categories.parent_id = parent_categories.id - WHERE decidim_categories.parent_id IS NOT NULL -), -categories AS ( - SELECT * FROM main_categories - UNION ALL - SELECT * FROM sub_categories -) -SELECT * FROM categories \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/comments/comments.sql b/projects/test_lyon/target/compiled/demo/models/marts/comments/comments.sql deleted file mode 100644 index 81ba5640..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/comments/comments.sql +++ /dev/null @@ -1,94 +0,0 @@ - - - - - -WITH commentaries AS ( - - SELECT - comments.*, - "test_lyon"."prod"."stg_decidim_accountability_results".decidim_component_id AS "decidim_component_id" - FROM "test_lyon"."prod"."stg_decidim_accountability_results" - JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments - on comments.decidim_root_commentable_id = "test_lyon"."prod"."stg_decidim_accountability_results".id - and comments.decidim_root_commentable_type = 'Decidim::Accountability::Result' - union all - - SELECT - comments.*, - "test_lyon"."prod"."blogs_posts".decidim_component_id AS "decidim_component_id" - FROM "test_lyon"."prod"."blogs_posts" - JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments - on comments.decidim_root_commentable_id = "test_lyon"."prod"."blogs_posts".id - and comments.decidim_root_commentable_type = 'Decidim::Blogs::Post' - union all - - SELECT - comments.*, - "test_lyon"."prod"."budgets_projects".decidim_component_id AS "decidim_component_id" - FROM "test_lyon"."prod"."budgets_projects" - JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments - on comments.decidim_root_commentable_id = "test_lyon"."prod"."budgets_projects".id - and comments.decidim_root_commentable_type = 'Decidim::Budgets::Project' - union all - - SELECT - comments.*, - "test_lyon"."prod"."debates".decidim_component_id AS "decidim_component_id" - FROM "test_lyon"."prod"."debates" - JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments - on comments.decidim_root_commentable_id = "test_lyon"."prod"."debates".id - and comments.decidim_root_commentable_type = 'Decidim::Debates::Debate' - union all - - SELECT - comments.*, - "test_lyon"."prod"."meetings".decidim_component_id AS "decidim_component_id" - FROM "test_lyon"."prod"."meetings" - JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments - on comments.decidim_root_commentable_id = "test_lyon"."prod"."meetings".id - and comments.decidim_root_commentable_type = 'Decidim::Meetings::Meeting' - union all - - SELECT - comments.*, - "test_lyon"."prod"."proposals".decidim_component_id AS "decidim_component_id" - FROM "test_lyon"."prod"."proposals" - JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments - on comments.decidim_root_commentable_id = "test_lyon"."prod"."proposals".id - and comments.decidim_root_commentable_type = 'Decidim::Proposals::Proposal' - union all - - SELECT - comments.*, - "test_lyon"."prod"."stg_decidim_proposals_collaborative_drafts".decidim_component_id AS "decidim_component_id" - FROM "test_lyon"."prod"."stg_decidim_proposals_collaborative_drafts" - JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments - on comments.decidim_root_commentable_id = "test_lyon"."prod"."stg_decidim_proposals_collaborative_drafts".id - and comments.decidim_root_commentable_type = 'Decidim::Proposals::CollaborativeDraft' - - -) - -SELECT - commentaries.id, - commentaries.decidim_commentable_id, - commentaries.decidim_commentable_type, - commentaries.decidim_author_id, - commentaries.created_at, - commentaries.depth, - commentaries.alignment, - commentaries.decidim_root_commentable_id, - commentaries.decidim_root_commentable_type, - commentaries.decidim_author_type, - commentaries.body, - commentaries.decidim_component_id, - components.ps_slug, - concat('https://', components.organization_host, '/', components.ps_space_type_slug, '/', components.ps_slug, '/f/', components.id, '/', components.manifest_name,'/', commentaries.decidim_root_commentable_id, '?commentId=', commentaries.id, '#comment_', commentaries.id) AS comment_url -FROM commentaries -JOIN "test_lyon"."prod"."components" AS components - on components.id = commentaries.decidim_component_id -LEFT JOIN "test_lyon"."prod"."stg_decidim_moderations" AS decidim_moderations - on decidim_moderations.decidim_reportable_type = 'Decidim::Comments::Comment' - and decidim_moderations.decidim_reportable_id = commentaries.id -where decidim_moderations.hidden_at is null \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/components/components.sql b/projects/test_lyon/target/compiled/demo/models/marts/components/components.sql deleted file mode 100644 index c6c8de5d..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/components/components.sql +++ /dev/null @@ -1,58 +0,0 @@ --- Warning: are not taken by default into account Conferences, Consultations, Elections, Initiatives, Votations - - - -WITH assemblies_spaces AS ( - SELECT - id AS ps_id, - published_at AS ps_published_at, - title AS ps_title, - subtitle AS ps_subtitle, - slug AS ps_slug, - decidim_organization_id, - 'Decidim::Assembly' AS ps_type, - 'assemblies' AS ps_space_type_slug - FROM "test_lyon"."prod"."stg_decidim_assemblies" -), -participatory_processes_spaces AS ( - SELECT - id AS ps_id, - published_at AS ps_published_at, - title AS ps_title, - subtitle AS ps_subtitle, - slug AS ps_slug, - decidim_organization_id, - 'Decidim::ParticipatoryProcess' AS ps_type, - 'processes' AS ps_space_type_slug - FROM "test_lyon"."prod"."stg_decidim_participatory_processes" -), -participatory_spaces AS ( - SELECT * FROM assemblies_spaces - UNION ALL - SELECT * FROM participatory_processes_spaces -), -components AS ( - SELECT - decidim_components.id, - decidim_components.manifest_name, - decidim_components.translated_manifest_name, - concat(decidim_components.name, ' (', decidim_components.translated_manifest_name, ')') AS component_name, - decidim_components.published_at, - decidim_components.created_at, - concat('https://',decidim_organizations.host,'/', participatory_spaces.ps_space_type_slug, '/', participatory_spaces.ps_slug,'/f/', decidim_components.id) AS component_url, - participatory_spaces.ps_id, - participatory_spaces.ps_published_at, - participatory_spaces.ps_title, - participatory_spaces.ps_subtitle, - participatory_spaces.ps_slug, - participatory_spaces.ps_type, - participatory_spaces.ps_space_type_slug, - concat('https://',decidim_organizations.host,'/', participatory_spaces.ps_space_type_slug, '/', participatory_spaces.ps_slug,'/') AS ps_url, - decidim_organization_id, - decidim_organizations.host AS organization_host - FROM "test_lyon"."prod"."int_components" AS decidim_components - JOIN participatory_spaces ON participatory_spaces.ps_type = decidim_components.participatory_space_type AND decidim_components.participatory_space_id = participatory_spaces.ps_id - JOIN "test_lyon"."prod"."int_organizations" AS decidim_organizations ON decidim_organizations.id = participatory_spaces.decidim_organization_id - WHERE participatory_spaces.ps_published_at IS NOT NULL -) -SELECT * FROM components \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/debates/debates.sql b/projects/test_lyon/target/compiled/demo/models/marts/debates/debates.sql deleted file mode 100644 index 8e61c7b8..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/debates/debates.sql +++ /dev/null @@ -1,42 +0,0 @@ -WITH categorizations AS ( - - SELECT - array_agg(category_name) AS categories, - array_agg(child_name) AS sub_categories, - categorizable_id - FROM "test_lyon"."prod"."categorizations" AS categorizations - WHERE categorizations.categorizable_type = 'Decidim::Debates::Debate' - GROUP BY categorizable_id - -) -SELECT - decidim_debates_debates.id, - decidim_debates_debates.title, - decidim_debates_debates.description, - decidim_debates_debates.start_time, - decidim_debates_debates.end_time, - decidim_debates_debates.decidim_component_id, - decidim_debates_debates.decidim_author_id, - decidim_debates_debates.created_at, - decidim_debates_debates.closed_at, - decidim_components.ps_slug, - concat( - 'https://', - decidim_components.organization_host, - '/', - decidim_components.ps_space_type_slug, - '/', - decidim_components.ps_slug, - '/f/', - decidim_components.id, - '/debates/', - decidim_debates_debates.id - ) AS debate_url, - decidim_debates_debates.resource_type, - categorizations.categories, - coalesce(categorizations.categories[1], 'Sans catégorie') AS first_category, - categorizations.sub_categories, - coalesce(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category -FROM "test_lyon"."prod"."stg_decidim_debates" AS decidim_debates_debates - JOIN "test_lyon"."prod"."components" decidim_components on decidim_components.id = decidim_component_id - LEFT JOIN categorizations on categorizations.categorizable_id = decidim_debates_debates.id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/endorsements/endorsements.sql b/projects/test_lyon/target/compiled/demo/models/marts/endorsements/endorsements.sql deleted file mode 100644 index 91f258ac..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/endorsements/endorsements.sql +++ /dev/null @@ -1,43 +0,0 @@ - - -WITH endorsements_proposals AS ( - SELECT - decidim_endorsements.*, - decidim_component_id - FROM "test_lyon"."prod"."stg_decidim_endorsements" AS decidim_endorsements - JOIN "test_lyon"."prod"."stg_decidim_proposals" decidim_proposals_proposals on decidim_endorsements.resource_id = decidim_proposals_proposals.id - and decidim_proposals_proposals.resource_type = decidim_endorsements.resource_type -), endorsements_debates AS ( - SELECT - decidim_endorsements.*, - decidim_component_id - FROM "test_lyon"."prod"."stg_decidim_endorsements" AS decidim_endorsements - JOIN "test_lyon"."prod"."stg_decidim_debates" AS decidim_debates_debates on decidim_endorsements.resource_id = decidim_debates_debates.id - and decidim_debates_debates.resource_type = decidim_endorsements.resource_type -), endorsements_blogs_posts AS ( - SELECT - decidim_endorsements.*, - decidim_component_id - FROM "test_lyon"."prod"."stg_decidim_endorsements" AS decidim_endorsements - JOIN "test_lyon"."prod"."stg_decidim_blogs_posts" AS decidim_blogs_posts on decidim_endorsements.resource_id = decidim_blogs_posts.id - and decidim_blogs_posts.resource_type = decidim_endorsements.resource_type -), endorsements as ( - SELECT * FROM endorsements_proposals union all - SELECT * FROM endorsements_debates union all - SELECT * FROM endorsements_blogs_posts -) - -SELECT - endorsements.id, - endorsements.resource_type, - endorsements.resource_id, - endorsements.decidim_author_type, - endorsements.decidim_author_id, - endorsements.created_at, - endorsements.updated_at, - endorsements.decidim_component_id -FROM endorsements -LEFT JOIN "test_lyon"."prod"."stg_decidim_moderations" AS decidim_moderations - ON decidim_moderations.decidim_reportable_type = endorsements.resource_type - AND decidim_moderations.decidim_reportable_id = endorsements.resource_id -WHERE decidim_moderations.hidden_at IS NULL \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/followings/followings.sql b/projects/test_lyon/target/compiled/demo/models/marts/followings/followings.sql deleted file mode 100644 index f0f2d97b..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/followings/followings.sql +++ /dev/null @@ -1,120 +0,0 @@ - - - -WITH followings_proposals AS ( - SELECT - decidim_follows.*, - decidim_proposals_proposals.decidim_component_id, - url AS followable_url, - title AS followable_title - FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows - JOIN "test_lyon"."prod"."proposals" decidim_proposals_proposals - ON decidim_proposals_proposals.id = decidim_follows.decidim_followable_id - AND decidim_proposals_proposals.resource_type = decidim_follows.decidim_followable_type - ), followings_components AS ( - SELECT - distinct decidim_follows.*, - -1 AS "decidim_components.id", - ps_url AS followable_url, - ps_title AS followable_title - FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows - JOIN "test_lyon"."prod"."components" decidim_components - ON decidim_components.ps_id = decidim_followable_id - AND ps_type = decidim_followable_type - ), followings_debates AS ( - SELECT - decidim_follows.*, - decidim_debates_debates.decidim_component_id, - debate_url AS followable_url, - title AS followable_title - FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows - JOIN "test_lyon"."prod"."debates" decidim_debates_debates ON decidim_debates_debates.id = decidim_followable_id - AND resource_type = decidim_followable_type - ), followings_blogs_posts AS ( - SELECT - decidim_follows.*, - decidim_blogs_posts.decidim_component_id, - post_url AS followable_url, - title AS followable_title - FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows - JOIN "test_lyon"."prod"."blogs_posts" decidim_blogs_posts - ON decidim_blogs_posts.id = decidim_followable_id - AND resource_type = decidim_followable_type - ), followings_users AS ( - SELECT - decidim_follows.*, - -1 AS decidim_component_id, - '' AS followable_url, - '' AS followable_title - FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows - JOIN "test_lyon"."prod"."int_users" decidim_users - ON decidim_users.id = decidim_followable_id - where decidim_followable_type = 'Decidim::UserBaseEntity' - ), followings_meetings AS ( - SELECT - decidim_follows.*, - decidim_component_id, - meeting_url AS followable_url, - title AS followable_title - FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows - JOIN "test_lyon"."prod"."meetings" decidim_meetings - ON decidim_meetings.id = decidim_followable_id - AND resource_type = decidim_followable_type - ), followings_budgets_projects AS ( - SELECT - decidim_follows.*, - decidim_component_id, - project_url AS followable_url, - title AS followable_title - FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows - join "test_lyon"."prod"."budgets_projects" decidim_budgets_projects - ON decidim_budgets_projects.id = decidim_followable_id - AND resource_type = decidim_followable_type - ), followings AS ( - SELECT * FROM followings_proposals union all - SELECT * FROM followings_components union all - SELECT * FROM followings_debates union all - SELECT * FROM followings_blogs_posts union all - SELECT * FROM followings_users union all - SELECT * FROM followings_meetings union all - SELECT * FROM followings_budgets_projects - ), real_follow AS ( - SELECT - followings.*, - 'real_follow' AS "following_way", - decidim_followable_id AS "root_decidim_followable_id", - decidim_followable_type AS "root_decidim_followable_type", - followable_url AS "root_following_url", - followable_title AS "root_followable_title" - FROM followings, - lateral (SELECT (case array_length(array_remove(string_to_array(decidim_followable_type, ':', ''),null),1) when 2 then 'Ancestor' else 'Child' end) AS followable_meta_type) p_is_ps - where followable_meta_type != 'Ancestor' - ), ancestor_follow AS ( - SELECT - distinct - followings.*, - 'ancestor_follow' AS "following_way", - real_follow.decidim_followable_id AS "root_decidim_followable_id", - real_follow.decidim_followable_type AS "root_decidim_followable_type", - real_follow.followable_url AS "root_following_url", - real_follow.followable_title AS "root_followable_title" - FROM real_follow - join "test_lyon"."prod"."components" AS components ON components.id = real_follow.decidim_component_id - join followings ON followings.decidim_followable_id = components.ps_id AND followings.decidim_followable_type = components.ps_type - ), follows AS ( - SELECT * FROM real_follow union all - SELECT * FROM ancestor_follow - ) -SELECT id, - decidim_component_id, - decidim_user_id, - root_decidim_followable_id, - root_decidim_followable_type, - root_followable_title, - created_at, - root_following_url, - decidim_followable_id, - decidim_followable_type, - followable_url, - following_way -FROM follows \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/forms/forms.sql b/projects/test_lyon/target/compiled/demo/models/marts/forms/forms.sql deleted file mode 100644 index 72dbf026..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/forms/forms.sql +++ /dev/null @@ -1,27 +0,0 @@ - - -WITH forms_meetings AS ( - SELECT decidim_forms_questionnaires.id AS questionnaire_id, - decidim_forms_questionnaires.title, - decidim_meetings_meetings.decidim_component_id - FROM "test_lyon"."prod"."stg_decidim_forms_questionnaires" decidim_forms_questionnaires - JOIN "test_lyon"."prod"."stg_decidim_meetings" decidim_meetings_meetings ON decidim_meetings_meetings.id = decidim_forms_questionnaires.questionnaire_for_id - WHERE questionnaire_for_type = 'Decidim::Meetings::Meeting' -), forms_surveys AS ( - SELECT decidim_forms_questionnaires.id AS questionnaire_id, - decidim_forms_questionnaires.title, - decidim_surveys_surveys.decidim_component_id - FROM decidim_forms_questionnaires - JOIN "test_lyon"."prod"."stg_decidim_surveys" decidim_surveys_surveys ON decidim_surveys_surveys.id = questionnaire_for_id - WHERE questionnaire_for_type = 'Decidim::Surveys::Survey' -), forms AS ( - SELECT * FROM forms_meetings UNION ALL - SELECT * FROM forms_surveys -) -SELECT - forms.questionnaire_id AS id, - title::jsonb->>'fr' AS title, - decidim_components.id AS decidim_component_id, - concat ('https://',organization_host, '/', ps_space_type_slug,'/', ps_slug, '/f/', decidim_component_id) AS "questionnaire_url" -FROM forms -JOIN "test_lyon"."prod"."components" decidim_components ON decidim_components.id = forms.decidim_component_id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/forms/forms_answers.sql b/projects/test_lyon/target/compiled/demo/models/marts/forms/forms_answers.sql deleted file mode 100644 index a38b072b..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/forms/forms_answers.sql +++ /dev/null @@ -1,52 +0,0 @@ - - -WITH answers_short_and_long_answer AS ( - SELECT * FROM "test_lyon"."prod"."answers_short_and_long_answer" -), answers_option_and_sorting AS ( - SELECT * FROM "test_lyon"."prod"."answers_option_and_sorting" -), answers_matrix AS ( - SELECT * FROM "test_lyon"."prod"."answers_matrix" -), answers_file AS ( - SELECT * FROM "test_lyon"."prod"."answers_file" -), answers AS ( - SELECT * FROM answers_short_and_long_answer - UNION ALL - SELECT * FROM answers_option_and_sorting - UNION ALL - SELECT * FROM answers_matrix - UNION ALL - SELECT * FROM answers_file -) - -SELECT - answers.decidim_user_id, - answers.session_token, - answers.ip_hash, - answers.question_type, - answers.body AS question_title, - btrim(answers.answer, '"') AS answer, - answers.sub_matrix_question, - answers.custom_body, - answers.sorting_position, - answers.decidim_questionnaire_id, - decidim_forms_questionnaires.title AS form_title, - decidim_forms_questionnaires.decidim_component_id, - (CASE answers.sorting_position - WHEN 0 THEN 10 - WHEN 1 THEN 9 - WHEN 2 THEN 8 - WHEN 3 THEN 7 - WHEN 4 THEN 6 - WHEN 5 THEN 5 - WHEN 6 THEN 4 - WHEN 7 THEN 3 - WHEN 8 THEN 2 - WHEN 9 THEN 1 - ELSE -1 - END) AS sorting_points, - answers.position, - answers.created_at, - answers.author_status -FROM answers -JOIN "test_lyon"."prod"."forms" AS decidim_forms_questionnaires ON decidim_forms_questionnaires.id = answers.decidim_questionnaire_id -ORDER BY session_token, position \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/meetings/meetings.sql b/projects/test_lyon/target/compiled/demo/models/marts/meetings/meetings.sql deleted file mode 100644 index f234e3b3..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/meetings/meetings.sql +++ /dev/null @@ -1,48 +0,0 @@ -WITH categorizations AS ( - - SELECT - array_agg(category_name) AS categories, - array_agg(child_name) AS sub_categories, - categorizable_id - FROM "test_lyon"."prod"."categorizations" AS categorizations - WHERE categorizations.categorizable_type = 'Decidim::Meetings::Meeting' - GROUP BY categorizable_id - -) -SELECT - decidim_meetings_meetings.id, - decidim_meetings_meetings.title, - decidim_meetings_meetings.description, - decidim_meetings_meetings.address, - decidim_meetings_meetings.attendees_count, - decidim_meetings_meetings.created_at, - decidim_meetings_meetings.decidim_scope_id, - decidim_meetings_meetings.decidim_component_id, - decidim_meetings_meetings.start_time, - decidim_meetings_meetings.end_time, - decidim_meetings_meetings.registration_url, - decidim_meetings_meetings.type_of_meeting, - decidim_meetings_meetings.translated_type_of_meeting, - decidim_meetings_meetings.private_meeting, - decidim_meetings_meetings.decidim_author_id, - decidim_meetings_meetings.resource_type, - concat( - 'https://', - decidim_components.organization_host, - '/', - decidim_components.ps_space_type_slug, - '/', - decidim_components.ps_slug, - '/f/', - decidim_meetings_meetings.decidim_component_id, - '/meetings/', - decidim_meetings_meetings.id - ) AS meeting_url, - categorizations.categories, - coalesce(categorizations.categories[1], 'Sans catégorie') AS first_category, - categorizations.sub_categories, - coalesce(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category -FROM "test_lyon"."prod"."int_meetings" AS decidim_meetings_meetings -JOIN "test_lyon"."prod"."components" decidim_components on decidim_components.id = decidim_component_id -LEFT JOIN categorizations on categorizations.categorizable_id = decidim_meetings_meetings.id -where manifest_name like 'meetings' \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/organizations.sql b/projects/test_lyon/target/compiled/demo/models/marts/organizations.sql deleted file mode 100644 index 58ea434a..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/organizations.sql +++ /dev/null @@ -1,3 +0,0 @@ -SELECT -* -FROM "test_lyon"."prod"."int_organizations" AS decidim_organizations \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/participations.sql b/projects/test_lyon/target/compiled/demo/models/marts/participations.sql deleted file mode 100644 index bd67a0cd..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/participations.sql +++ /dev/null @@ -1,84 +0,0 @@ -WITH participations_proposals AS ( - SELECT decidim_users.id, - decidim_proposals_proposals.decidim_component_id, - 'Decidim::Proposals::Proposal' AS "participation_type", - decidim_proposals_proposals.id::text AS "participation_id", - decidim_proposals_proposals.created_at AS participation_date - FROM "test_lyon"."prod"."proposals" AS decidim_proposals_proposals - JOIN decidim_coauthorships on decidim_coauthorships.coauthorable_id = decidim_proposals_proposals.id - JOIN decidim_users on decidim_users.id = decidim_coauthorships.decidim_author_id - where coauthorable_type = 'Decidim::Proposals::Proposal' - ), participations_endorsements as ( - SELECT decidim_users.id, - decidim_endorsements.decidim_component_id, - 'Decidim::Endorsements::Endorsement' as "participation_type", - decidim_endorsements.id::text as "participation_id", - decidim_endorsements.created_at as participation_date - FROM "test_lyon"."prod"."endorsements" as decidim_endorsements - JOIN decidim_users on decidim_users.id = decidim_endorsements.decidim_author_id - ), participations_comments as ( - SELECT decidim_users.id, - decidim_component_id, - 'Decidim::Comments::Comment' as "participation_type", - decidim_comments_comments.id::text as "participation_id", - decidim_comments_comments.created_at as contribution_date - FROM "test_lyon"."prod"."comments" decidim_comments_comments - JOIN decidim_users on decidim_users.id = decidim_comments_comments.decidim_author_id - ), participations_proposal_votes as ( - SELECT decidim_users.id, - decidim_proposals_proposals.decidim_component_id, - 'Decidim::Proposals::ProposalVote' as "participation_type", - decidim_proposals_proposal_votes.id::text as "participation_id", - decidim_proposals_proposal_votes.created_at as participation_date - FROM "test_lyon"."prod"."proposals_votes" as decidim_proposals_proposal_votes - JOIN decidim_users on decidim_users.id = decidim_author_id - JOIN "test_lyon"."prod"."proposals" as decidim_proposals_proposals on decidim_proposals_proposal_votes.decidim_proposal_id = decidim_proposals_proposals.id - ), participations_answers as ( - SELECT distinct - decidim_user_id, - decidim_component_id, - 'Decidim::Forms::Answer' as "participation_type", - ('x'||lpad(decidim_forms_answers.session_token,16,'0'))::bit(64)::bigint::text as "participation_id", - decidim_forms_answers.created_at::date as participation_date - FROM "test_lyon"."prod"."forms_answers" as decidim_forms_answers - ), participations_debates as ( - SELECT decidim_author_id as decidim_user_id, - decidim_component_id, - 'Decidim::Debates::Debate' as "participation_type", - id::text as participation_id, - created_at as participation_date - FROM "test_lyon"."prod"."debates" decidim_debates_debates - ), participations_budgets_projects_votes as ( - SELECT - decidim_user_id, - decidim_component_id, - 'Decidim::Budgets::Project::Vote' as participation_type, - order_id::text as participation_id, - created_at as participation_date - FROM "test_lyon"."prod"."projects_votes" decidim_bugdets_projects_votes - ), participations_meetings_registrations as ( - SELECT - decidim_user_id, - decidim_component_id, - 'Decidim::Meetings::Registration' as participation_type, - decidim_meetings_meetings.id::text as participation_id, - decidim_meetings_registrations.created_at as participation_date - FROM "test_lyon"."prod"."meetings" decidim_meetings_meetings - join decidim_meetings_registrations on decidim_meetings_registrations.decidim_meeting_id = decidim_meetings_meetings.id - ), participations as ( - SELECT * FROM participations_proposals union all - SELECT * FROM participations_endorsements union all - SELECT * FROM participations_comments union all - SELECT * FROM participations_proposal_votes union all - SELECT * from participations_answers union all - SELECT * from participations_debates union all - SELECT * from participations_budgets_projects_votes union all - SELECT * from participations_meetings_registrations - ) - SELECT - distinct participations.id as "user_id", - substr(participation_id,1,10)::bigint as participation_id, - decidim_component_id, - participation_type, - participation_date - from participations \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals.sql b/projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals.sql deleted file mode 100644 index 2fd1b688..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals.sql +++ /dev/null @@ -1,69 +0,0 @@ - - -WITH coauthorships AS ( - SELECT - array_agg(decidim_users.id) AS authors_ids, - decidim_coauthorships.coauthorable_id - FROM "test_lyon"."prod"."int_users" AS decidim_users - JOIN "test_lyon"."prod"."stg_decidim_coauthorships" AS decidim_coauthorships on decidim_users.id = decidim_coauthorships.decidim_author_id - WHERE coauthorable_type = 'Decidim::Proposals::Proposal' - GROUP BY coauthorable_id -), -categorizations AS ( - - SELECT - array_agg(category_name) AS categories, - array_agg(child_name) AS sub_categories, - categorizable_id - FROM "test_lyon"."prod"."categorizations" AS categorizations - WHERE categorizations.categorizable_type = 'Decidim::Proposals::Proposal' - GROUP BY categorizable_id - -), -votes AS ( - SELECT - decidim_proposal_id, - COUNT(id) AS votes_count - FROM "test_lyon"."prod"."stg_decidim_proposals_votes" - GROUP BY decidim_proposal_id -), -proposals AS ( - SELECT - decidim_proposals.id, - decidim_components.ps_id AS decidim_participatory_space_id, - decidim_components.ps_slug AS decidim_participatory_space_slug, - decidim_scopes.name AS decidim_scope_name, - decidim_proposals.title, - decidim_proposals.body, - decidim_proposals.resource_type, - concat('https://', decidim_components.organization_host, '/', decidim_components.ps_space_type_slug, '/', decidim_components.ps_slug, '/f/', decidim_proposals.decidim_component_id, '/proposals/', decidim_proposals.id) AS url, - decidim_proposals.decidim_component_id, - decidim_proposals.created_at, - decidim_proposals.published_at, - decidim_proposals.state, - decidim_proposals.translated_state, - coauthorships.authors_ids, - COALESCE(coauthorships.authors_ids[1], -1) AS first_author_id, - decidim_proposals.address, - categorizations.categories, - COALESCE(categorizations.categories[1], 'Sans catégorie') AS first_category, - categorizations.sub_categories, - COALESCE(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category, - decidim_proposals.comments_count, - decidim_proposals.endorsements_count, - COALESCE(votes.votes_count,0) AS votes_count - FROM "test_lyon"."prod"."int_proposals" AS decidim_proposals - JOIN "test_lyon"."prod"."components" AS decidim_components ON decidim_components.id = decidim_component_id - LEFT JOIN coauthorships ON decidim_proposals.id = coauthorships.coauthorable_id - LEFT JOIN "test_lyon"."prod"."stg_decidim_moderations" AS decidim_moderations - ON decidim_moderations.decidim_reportable_id = decidim_proposals.id - AND decidim_moderations.decidim_reportable_type = 'Decidim::Proposals::Proposal' - LEFT JOIN "test_lyon"."prod"."int_scopes" AS decidim_scopes ON decidim_scopes.id = decidim_proposals.decidim_scope_id - LEFT JOIN votes ON decidim_proposals.id = votes.decidim_proposal_id - LEFT JOIN categorizations ON categorizations.categorizable_id = decidim_proposals.id - WHERE decidim_moderations.hidden_at IS NULL - AND decidim_proposals.published_at IS NOT NULL - AND (decidim_proposals.state NOT LIKE '%withdrawn' OR decidim_proposals.state IS NULL) -) - -SELECT * FROM proposals \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals_votes.sql b/projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals_votes.sql deleted file mode 100644 index 59a9bebc..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/proposals/proposals_votes.sql +++ /dev/null @@ -1,12 +0,0 @@ - - -SELECT - proposals_votes.id, - proposals_votes.created_at, - proposals_votes.decidim_author_id, - proposals_votes.decidim_proposal_id, - proposals.decidim_component_id, - proposals.title AS proposal_title, - proposals.url AS proposal_url -FROM "test_lyon"."prod"."stg_decidim_proposals_votes" AS proposals_votes -JOIN "test_lyon"."prod"."proposals" AS proposals on proposals_votes.decidim_proposal_id = proposals.id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/marts/users/users.sql b/projects/test_lyon/target/compiled/demo/models/marts/users/users.sql deleted file mode 100644 index 27166d72..00000000 --- a/projects/test_lyon/target/compiled/demo/models/marts/users/users.sql +++ /dev/null @@ -1,109 +0,0 @@ -WITH endorsements AS ( - SELECT - decidim_author_id, - MAX(1) AS is_endorsing - FROM "test_lyon"."prod"."endorsements" - GROUP BY decidim_author_id -), - -comments AS ( - SELECT - decidim_author_id, - MAX(1) AS has_authored_comment - FROM "test_lyon"."prod"."comments" - GROUP BY decidim_author_id -), - -forms_answers AS ( - SELECT - decidim_user_id, - MAX(1) AS has_answered_survey - FROM "test_lyon"."prod"."forms_answers" - GROUP BY decidim_user_id -), - -proposal_votes AS ( - SELECT - decidim_author_id, - MAX(1) AS has_voted_on_proposal - FROM "test_lyon"."prod"."proposals_votes" - GROUP BY decidim_author_id -), - -project_votes AS ( - SELECT - decidim_user_id, - MAX(1) AS has_voted_on_project - FROM "test_lyon"."prod"."projects_votes" - GROUP BY decidim_user_id -), - -participations_proposals AS ( - SELECT - decidim_coauthorships.decidim_author_id, - MAX(1) AS has_authored_proposal - FROM "test_lyon"."prod"."proposals" AS decidim_proposals_proposals - JOIN "test_lyon"."prod"."stg_decidim_coauthorships" AS decidim_coauthorships - ON decidim_coauthorships.coauthorable_id = decidim_proposals_proposals.id - WHERE coauthorable_type = 'Decidim::Proposals::Proposal' - GROUP BY decidim_coauthorships.decidim_author_id -), - -followings AS ( - SELECT DISTINCT decidim_user_id - FROM "test_lyon"."prod"."followings" -) - -SELECT - decidim_users.id, - decidim_users.email, - decidim_users.sign_in_count, - decidim_users.sign_in_frequency, - decidim_users.last_sign_in_at, - decidim_users.created_at, - decidim_users.updated_at, - decidim_users.invitation_created_at, - decidim_users.invitation_sent_at, - decidim_users.invitation_accepted_at, - decidim_users.invited_by_id, - decidim_users.invited_by_type, - decidim_users.decidim_organization_id, - decidim_users.confirmed_at, - decidim_users.confirmation_token, - decidim_users.unconfirmed_email, - decidim_users.name, - decidim_users.locale, - decidim_users.deleted_at, - decidim_users.admin, - decidim_users.managed, - decidim_users.roles, - decidim_users.nickname, - decidim_users.accepted_tos_version, - decidim_users.type, - decidim_users.following_count, - decidim_users.followers_count, - decidim_users.failed_attempts, - decidim_users.locked_at, - decidim_users.admin_terms_accepted_at, - decidim_users.blocked, - decidim_users.blocked_at, - COALESCE(endorsements.is_endorsing, 0)::boolean AS is_endorsing, - (CASE WHEN followings.decidim_user_id IS NULL THEN false ELSE true END) AS is_following, - COALESCE(comments.has_authored_comment, 0)::boolean AS has_authored_comment, - COALESCE(proposal_votes.has_voted_on_proposal, 0)::boolean AS has_voted_on_proposal, - COALESCE(project_votes.has_voted_on_project, 0)::boolean AS has_voted_on_project, - COALESCE(participations_proposals.has_authored_proposal, 0)::boolean AS has_authored_proposal, - COALESCE(forms_answers.has_answered_survey, 0)::boolean AS has_answered_survey, - decidim_users.confirmed, - CONCAT('https://', decidim_organizations.host, '/profiles/', decidim_users.nickname, '/activity') AS url, - decidim_users.extended_data -FROM "test_lyon"."prod"."int_users" AS decidim_users -LEFT JOIN followings ON followings.decidim_user_id = decidim_users.id -LEFT JOIN endorsements ON endorsements.decidim_author_id = decidim_users.id -LEFT JOIN comments ON comments.decidim_author_id = decidim_users.id -LEFT JOIN forms_answers ON forms_answers.decidim_user_id = decidim_users.id -LEFT JOIN proposal_votes ON proposal_votes.decidim_author_id = decidim_users.id -LEFT JOIN project_votes ON project_votes.decidim_user_id = decidim_users.id -LEFT JOIN participations_proposals ON participations_proposals.decidim_author_id = decidim_users.id -JOIN "test_lyon"."prod"."int_organizations" AS decidim_organizations - ON decidim_organizations.id = decidim_users.decidim_organization_id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_area_types.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_area_types.sql deleted file mode 100644 index aab5c46f..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_area_types.sql +++ /dev/null @@ -1,12 +0,0 @@ -WITH source as ( - SELECT * FROM "test_lyon"."public"."decidim_area_types" -), -renamed as ( - SELECT - id, - decidim_organization_id, - name, - plural - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_areas.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_areas.sql deleted file mode 100644 index 59eb5acc..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/areas/stg_decidim_areas.sql +++ /dev/null @@ -1,14 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_areas" -), -renamed as ( - select - id, - name, - area_type_id, - decidim_organization_id, - created_at, - updated_at - FROM source -) -select * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql deleted file mode 100644 index bbc1c7a2..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql +++ /dev/null @@ -1,58 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_assemblies" -), -renamed AS ( - SELECT - id, - slug, - hashtag, - decidim_organization_id, - created_at, - updated_at, - title::jsonb->>'fr' AS title, - subtitle::jsonb->>'fr' AS subtitle, - short_description, - description, - hero_image, - banner_image, - promoted, - published_at, - developer_group, - meta_scope, - local_area, - target, - participatory_scope, - participatory_structure, - show_statistics, - decidim_scope_id, - scopes_enabled, - private_space, - reference, - decidim_area_id, - parent_id, - parents_path, - children_count, - purpose_of_action, - composition, - creation_date, - created_by, - created_by_other, - duration, - included_at, - closing_date, - closing_date_reason, - internal_organisation, - is_transparent, - special_features, - twitter_handler, - instagram_handler, - facebook_handler, - youtube_handler, - github_handler, - decidim_assemblies_type_id, - weight, - follows_count - - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql deleted file mode 100644 index 9c3bd8dd..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql +++ /dev/null @@ -1,15 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_blogs_posts" -), -renamed AS ( - SELECT - id, - title::jsonb->>'fr' AS title, - regexp_replace(body::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') AS body, - decidim_component_id, - created_at, - decidim_author_id, - 'Decidim::Blogs::Post' AS resource_type - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql deleted file mode 100644 index ade360f5..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql +++ /dev/null @@ -1,11 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_budgets_budgets" -), -renamed AS ( - SELECT - id, - title::jsonb->>'fr' as title, - decidim_component_id - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql deleted file mode 100644 index 4696e7b5..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql +++ /dev/null @@ -1,11 +0,0 @@ -WITH source as ( - SELECT * FROM "test_lyon"."public"."decidim_budgets_line_items" -), -renamed as ( - select - id, - decidim_order_id, - decidim_project_id - FROM source -) -select * from renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql deleted file mode 100644 index 59fa2274..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql +++ /dev/null @@ -1,14 +0,0 @@ -WITH source as ( - SELECT * FROM "test_lyon"."public"."decidim_budgets_orders" -), -renamed as ( - select - id, - decidim_user_id, - checked_out_at, - created_at, - updated_at, - decidim_budgets_budget_id - FROM source -) -select * from renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql deleted file mode 100644 index d943e470..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql +++ /dev/null @@ -1,17 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_budgets_projects" -), -renamed AS ( - SELECT - id, - title::jsonb->>'fr' as title, - regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description, - created_at, - decidim_scope_id, - budget_amount as project_amount, - selected_at, - decidim_budgets_budget_id, - 'Decidim::Budgets::Project' as resource_type - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categories.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categories.sql deleted file mode 100644 index 684c42ec..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categories.sql +++ /dev/null @@ -1,15 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_categories" -), -renamed AS ( - SELECT - id, - name::jsonb->>'fr' AS name, - description, - parent_id, - decidim_participatory_space_id, - decidim_participatory_space_type, - weight - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql deleted file mode 100644 index 63efb071..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql +++ /dev/null @@ -1,14 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_categorizations" -), -renamed AS ( - SELECT - id, - decidim_category_id, - categorizable_type, - categorizable_id, - created_at, - updated_at - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/debates/stg_decidim_debates.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/debates/stg_decidim_debates.sql deleted file mode 100644 index 8a998a05..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/debates/stg_decidim_debates.sql +++ /dev/null @@ -1,18 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_debates_debates" -), -renamed AS ( - SELECT - id, - title::jsonb->>'fr' as title, - regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description, - start_time, - end_time, - decidim_component_id, - decidim_author_id, - created_at, - closed_at, - 'Decidim::Debates::Debate' as resource_type - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql deleted file mode 100644 index b573e595..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql +++ /dev/null @@ -1,15 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_forms_answer_choices" -), -renamed AS ( - SELECT - id, - decidim_answer_id, - decidim_answer_option_id, - position, - body::text AS body, - custom_body, - decidim_question_matrix_row_id - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql deleted file mode 100644 index e40a8359..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql +++ /dev/null @@ -1,17 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_forms_answers" -), -renamed AS ( - SELECT - id, - body, - decidim_user_id, - decidim_questionnaire_id, - decidim_question_id, - created_at, - updated_at, - session_token, - ip_hash - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql deleted file mode 100644 index f9c1a85d..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql +++ /dev/null @@ -1,12 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_forms_question_matrix_rows" -), -renamed AS ( - SELECT - id, - decidim_question_id, - position, - TRIM(body::jsonb->>'fr') AS body - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql deleted file mode 100644 index 6b7c9ab1..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql +++ /dev/null @@ -1,18 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_forms_questionnaires" -), -renamed AS ( - SELECT - id, - title, - description, - tos, - questionnaire_for_type, - questionnaire_for_id, - published_at, - created_at, - updated_at, - salt - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql deleted file mode 100644 index fedbe653..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql +++ /dev/null @@ -1,21 +0,0 @@ - - -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_forms_questions" -), -renamed AS ( - SELECT - id, - decidim_questionnaire_id, - position, - question_type, - mandatory, - body::jsonb->>'fr' AS body, - description, - max_choices, - created_at, - updated_at, - max_characters - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql deleted file mode 100644 index 0d4750c3..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql +++ /dev/null @@ -1,23 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_organizations" -), -renamed AS ( - SELECT - id, - name, - host, - default_locale, - available_locales::text as available_locales, - created_at, - description, - secondary_hosts::text as secondary_hosts, - available_authorizations::text as available_authorizations, - header_snippets, - tos_version, - badges_enabled, - send_welcome_notification, - users_registration_mode, - time_zone - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql deleted file mode 100644 index 4250a5b8..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql +++ /dev/null @@ -1,14 +0,0 @@ -SELECT - id, - regexp_replace(title::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as title, - regexp_replace(body::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as body, - 'Decidim::Proposals::Proposal' as resource_type, - decidim_component_id, - decidim_scope_id, - created_at, - published_at, - state, - comments_count, - endorsements_count, - address -FROM "test_lyon"."public"."decidim_proposals_proposals" \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql deleted file mode 100644 index ec5cbae5..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql +++ /dev/null @@ -1,28 +0,0 @@ -WITH source as ( - SELECT * FROM "test_lyon"."public"."decidim_proposals_collaborative_drafts" -), -renamed as ( - select - id, - title, - body, - decidim_component_id, - decidim_scope_id, - state, - reference, - address, - latitude, - longitude, - published_at, - authors_count, - versions_count, - contributions_count, - created_at, - updated_at, - coauthorships_count, - comments_count, - follows_count - - from source -) -select * from renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql deleted file mode 100644 index abd81c78..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql +++ /dev/null @@ -1,15 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_proposals_proposal_votes" -), -renamed AS ( - SELECT - id, - decidim_proposal_id, - decidim_author_id, - created_at, - updated_at, - weight, - temporary - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql deleted file mode 100644 index cd2ed9ac..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql +++ /dev/null @@ -1,17 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_scopes" -), -renamed AS ( - SELECT - id, - decidim_organization_id, - created_at, - updated_at, - name::jsonb->>'fr' AS name, - scope_type_id, - parent_id, - code, - part_of - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_accountability_results.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_accountability_results.sql deleted file mode 100644 index a5a6d3b3..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_accountability_results.sql +++ /dev/null @@ -1,25 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_accountability_results" -), -renamed as ( - select - id, - title, - description, - reference, - start_date, - end_date, - progress, - parent_id, - decidim_accountability_status_id, - decidim_component_id, - decidim_scope_id, - created_at, - updated_at, - children_count, - weight, - external_id, - comments_count - FROM source -) -select * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_attachments.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_attachments.sql deleted file mode 100644 index 6e7afb96..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_attachments.sql +++ /dev/null @@ -1,20 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_attachments" -), -renamed as ( - SELECT - id, - title, - description, - file, - content_type, - file_size, - attached_to_id, - created_at, - updated_at, - attached_to_type, - weight, - attachment_collection_id - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_coauthorships.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_coauthorships.sql deleted file mode 100644 index c306ba3f..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_coauthorships.sql +++ /dev/null @@ -1,18 +0,0 @@ - - -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_coauthorships" -), -renamed AS ( - SELECT - id, - decidim_author_id, - decidim_user_group_id, - coauthorable_type, - coauthorable_id, - created_at, - updated_at, - decidim_author_type - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_comments.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_comments.sql deleted file mode 100644 index 006b2ca3..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_comments.sql +++ /dev/null @@ -1,22 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_comments_comments" -), -renamed as ( - SELECT - id, - decidim_commentable_type, - decidim_commentable_id, - decidim_author_id, - created_at, - updated_at, - depth, - alignment, - decidim_user_group_id, - decidim_root_commentable_type, - decidim_root_commentable_id, - decidim_author_type, - body::jsonb->>'fr' as body, - comments_count - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_components.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_components.sql deleted file mode 100644 index f4e9bfea..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_components.sql +++ /dev/null @@ -1,19 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_components" -), -renamed AS ( - SELECT - id, - manifest_name, - name::jsonb->>'fr' AS name, - participatory_space_id, - participatory_space_type, - settings, - weight, - permissions, - published_at, - created_at, - updated_at - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_endorsements.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_endorsements.sql deleted file mode 100644 index 5162a535..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_endorsements.sql +++ /dev/null @@ -1,10 +0,0 @@ -SELECT - id, - resource_type, - resource_id, - decidim_author_type, - decidim_author_id, - decidim_user_group_id, - created_at, - updated_at -FROM "test_lyon"."public"."decidim_endorsements" \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_follows.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_follows.sql deleted file mode 100644 index f6d8e313..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_follows.sql +++ /dev/null @@ -1,14 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_follows" -), -renamed as ( - SELECT - id, - decidim_user_id, - updated_at, - created_at, - decidim_followable_type, - decidim_followable_id - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings.sql deleted file mode 100644 index b9577180..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings.sql +++ /dev/null @@ -1,23 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_meetings_meetings" -), -renamed AS ( - SELECT - id, - title::jsonb->>'fr' AS title, - regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') AS description, - coalesce(nullif(address,''), 'Pas d''adresse') as address, - coalesce(attendees_count, 0) as attendees_count, - created_at, - decidim_scope_id, - decidim_component_id, - start_time, - end_time, - registration_url, - type_of_meeting, - private_meeting, - decidim_author_id, - 'Decidim::Meetings::Meeting' as resource_type - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql deleted file mode 100644 index 54e19056..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql +++ /dev/null @@ -1,16 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_meetings_registrations" -), -renamed AS ( - select - id, - decidim_user_id, - decidim_meeting_id, - created_at, - updated_at, - code, - validated_at, - decidim_user_group_id - FROM source -) -select * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_moderations.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_moderations.sql deleted file mode 100644 index 6ed8abac..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_moderations.sql +++ /dev/null @@ -1,18 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_moderations" -), -renamed AS ( - SELECT - id, - decidim_participatory_space_id, - decidim_reportable_type, - decidim_reportable_id, - report_count, - hidden_at, - created_at, - updated_at, - decidim_participatory_space_type, - reported_content - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql deleted file mode 100644 index 33dca5fc..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql +++ /dev/null @@ -1,21 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_participatory_process_steps" -), -renamed AS ( - select - id, - title::jsonb->>'fr' as title, - title::jsonb->>'fr' as description, - start_date, - end_date, - decidim_participatory_process_id, - created_at, - updated_at, - active, - position, - cta_text, - cta_path - - FROM source -) -select * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_processes.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_processes.sql deleted file mode 100644 index 4ba0012d..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_participatory_processes.sql +++ /dev/null @@ -1,16 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_participatory_processes" -), -renamed AS ( - SELECT - id, - published_at, - title::jsonb->>'fr' AS title, - subtitle::jsonb->>'fr' as subtitle, - slug, - 'Decidim::ParticipatoryProcess' as type, - 'processes' as space_type_slug, - decidim_organization_id - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_surveys.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_surveys.sql deleted file mode 100644 index b3c032ea..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_surveys.sql +++ /dev/null @@ -1,12 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_surveys_surveys" -), -renamed as ( - SELECT - id, - decidim_component_id, - created_at, - updated_at - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_users.sql b/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_users.sql deleted file mode 100644 index cc655342..00000000 --- a/projects/test_lyon/target/compiled/demo/models/staging/decidim/stg_decidim_users.sql +++ /dev/null @@ -1,41 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_users" -), -renamed AS ( - SELECT - id, - email, - sign_in_count, - last_sign_in_at, - created_at, - updated_at, - invitation_created_at, - invitation_sent_at, - invitation_accepted_at, - invited_by_id, - invited_by_type, - decidim_organization_id, - confirmed_at, - confirmation_token, - unconfirmed_email, - name, - locale, - deleted_at, - admin, - managed, - roles::text AS roles, - nickname, - accepted_tos_version, - type, - following_count, - followers_count, - failed_attempts, - locked_at, - admin_terms_accepted_at, - blocked, - blocked_at, - (CASE WHEN confirmed_at IS NULL THEN false ELSE true END) AS "confirmed", - extended_data - FROM source -) -SELECT * FROM renamed \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql b/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql deleted file mode 100644 index 3768942d..00000000 --- a/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql +++ /dev/null @@ -1,19 +0,0 @@ -WITH parsed_data AS ( - SELECT - decidim_awesome_proposal_extra_fields.id, - decidim_awesome_proposal_extra_fields.proposal_id, - xpath('//text()', unnest(xpath('//dt', xml_data)))::text AS private_field_description, - unnest(xpath('//dd/div/text()', unnest(xpath('//dd', xml_data))))::text AS private_field_content - FROM - "test_lyon"."prod"."stg_decidim_awesome_proposal_extra_fields" AS decidim_awesome_proposal_extra_fields, - LATERAL xmlparse(document private_body_clear) AS xml_data -) -SELECT - parsed_data.id, - parsed_data.proposal_id, - replace(replace(private_field_description, '{"', ''), '"}', '') AS private_field_description, - parsed_data.private_field_content -FROM - parsed_data -WHERE - private_field_content IS NOT NULL \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql b/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql deleted file mode 100644 index f869055c..00000000 --- a/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql +++ /dev/null @@ -1,32 +0,0 @@ -WITH __dbt__cte__stg_decidim_awesome_proposal_extra_fields as ( - --- Fixture for stg_decidim_awesome_proposal_extra_fields -select - - cast(1 as bigint) - as id, - - cast(101 as bigint) - as proposal_id, cast(null as timestamp without time zone) as updated_at, cast(null as timestamp without time zone) as created_at, - - cast('
Cette idée est déposée à titre :
Individuel
Votre tranche d''âge :
16-25 ans
' as text) - as private_body_clear -), parsed_data AS ( - SELECT - decidim_awesome_proposal_extra_fields.id, - decidim_awesome_proposal_extra_fields.proposal_id, - xpath('//text()', unnest(xpath('//dt', xml_data)))::text AS private_field_description, - unnest(xpath('//dd/div/text()', unnest(xpath('//dd', xml_data))))::text AS private_field_content - FROM - __dbt__cte__stg_decidim_awesome_proposal_extra_fields AS decidim_awesome_proposal_extra_fields, - LATERAL xmlparse(document private_body_clear) AS xml_data -) -SELECT - parsed_data.id, - parsed_data.proposal_id, - replace(replace(private_field_description, '{"', ''), '"}', '') AS private_field_description, - parsed_data.private_field_content -FROM - parsed_data -WHERE - private_field_content IS NOT NULL \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/stg_decidim_awesome_proposal_extra_fields.sql b/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/stg_decidim_awesome_proposal_extra_fields.sql deleted file mode 100644 index 67361bcf..00000000 --- a/projects/test_lyon/target/compiled/test_lyon/models/intermediate/decidim_awesome/schema.yml/stg_decidim_awesome_proposal_extra_fields.sql +++ /dev/null @@ -1,12 +0,0 @@ - --- Fixture for stg_decidim_awesome_proposal_extra_fields -select - - cast(1 as bigint) - as id, - - cast(101 as bigint) - as proposal_id, cast(null as timestamp without time zone) as updated_at, cast(null as timestamp without time zone) as created_at, - - cast('
Cette idée est déposée à titre :
Individuel
Votre tranche d''âge :
16-25 ans
' as text) - as private_body_clear \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/test_lyon/models/marts/participations_with_extended_data.sql b/projects/test_lyon/target/compiled/test_lyon/models/marts/participations_with_extended_data.sql deleted file mode 100644 index 05296bc1..00000000 --- a/projects/test_lyon/target/compiled/test_lyon/models/marts/participations_with_extended_data.sql +++ /dev/null @@ -1,9 +0,0 @@ -SELECT - DISTINCT ON (user_id, ps_title) - user_id, - users.age_category AS age_category, - decidim_component_id, - components.ps_title AS ps_title -FROM "test_lyon"."prod"."participations" participations - JOIN "test_lyon"."prod"."components" components ON participations.decidim_component_id = components.id - JOIN "test_lyon"."prod"."users" users ON participations.user_id = users.id \ No newline at end of file diff --git a/projects/test_lyon/target/compiled/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql b/projects/test_lyon/target/compiled/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql deleted file mode 100644 index 4c66c858..00000000 --- a/projects/test_lyon/target/compiled/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql +++ /dev/null @@ -1,11 +0,0 @@ -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_awesome_proposal_extra_fields_test" -) - -SELECT - id, - decidim_proposal_id AS proposal_id, - updated_at, - created_at, - private_body_clear -FROM source \ No newline at end of file diff --git a/projects/test_lyon/target/graph.gpickle b/projects/test_lyon/target/graph.gpickle deleted file mode 100644 index d5f6db55b8251d762a90c401fb8e53710e61f608..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267456 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

{_c@v%Q+-G!UDx(W+Ofj@Pgpgl`%aNHtb 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 A_5c6? diff --git a/projects/test_lyon/target/graph_summary.json b/projects/test_lyon/target/graph_summary.json deleted file mode 100644 index 8d085487..00000000 --- a/projects/test_lyon/target/graph_summary.json +++ /dev/null @@ -1 +0,0 @@ -{"_invocation_id": "abd1849f-2f07-41b8-9fd3-963d4daf1290", "linked": {"0": {"name": "source.test_lyon.decidim.decidim_awesome_proposal_extra_fields_test", "type": "source", "succ": [39]}, "1": {"name": "source.demo.decidim.decidim_components", "type": "source", "succ": [41]}, "2": {"name": "source.demo.decidim.decidim_assemblies", "type": "source", "succ": [63]}, "3": {"name": "source.demo.decidim.decidim_participatory_processes", "type": "source", "succ": [46]}, "4": {"name": "source.demo.decidim.decidim_participatory_process_steps", "type": "source", "succ": [48]}, "5": {"name": "source.demo.decidim.decidim_users", "type": "source", "succ": [47]}, "6": {"name": "source.demo.decidim.decidim_proposals_proposals", "type": "source", "succ": [74]}, "7": {"name": "source.demo.decidim.decidim_coauthorships", "type": "source", "succ": [49]}, "8": {"name": "source.demo.decidim.decidim_moderations", "type": "source", "succ": [52]}, "9": {"name": "source.demo.decidim.decidim_scopes", "type": "source", "succ": [71]}, "10": {"name": "source.demo.decidim.decidim_blogs_posts", "type": "source", "succ": [62]}, "11": {"name": "source.demo.decidim.decidim_debates_debates", "type": "source", "succ": [64]}, "12": {"name": "source.demo.decidim.decidim_meetings_meetings", "type": "source", "succ": [50]}, "13": {"name": "source.demo.decidim.decidim_accountability_results", "type": "source", "succ": [51]}, "14": {"name": "source.demo.decidim.decidim_comments_comments", "type": "source", "succ": [44]}, "15": {"name": "source.demo.decidim.decidim_proposals_collaborative_drafts", "type": "source", "succ": [73]}, "16": {"name": "source.demo.decidim.decidim_endorsements", "type": "source", "succ": [42]}, "17": {"name": "source.demo.decidim.decidim_follows", "type": "source", "succ": [43]}, "18": {"name": "source.demo.decidim.decidim_initiatives", "type": "source"}, "19": {"name": "source.demo.decidim.decidim_initiatives_type_scopes", "type": "source"}, "20": {"name": "source.demo.decidim.decidim_surveys_surveys", "type": "source", "succ": [53]}, "21": {"name": "source.demo.decidim.decidim_attachments", "type": "source", "succ": [40]}, "22": {"name": "source.demo.decidim.decidim_proposals_proposal_votes", "type": "source", "succ": [72]}, "23": {"name": "source.demo.decidim.decidim_meetings_registrations", "type": "source", "succ": [45]}, "24": {"name": "source.demo.decidim.decidim_organizations", "type": "source", "succ": [54]}, "25": {"name": "source.demo.decidim.decidim_forms_answer_choices", "type": "source", "succ": [59]}, "26": {"name": "source.demo.decidim.decidim_forms_answers", "type": "source", "succ": [56]}, "27": {"name": "source.demo.decidim.decidim_forms_question_matrix_rows", "type": "source", "succ": [55]}, "28": {"name": "source.demo.decidim.decidim_forms_questionnaires", "type": "source", "succ": [58]}, "29": {"name": "source.demo.decidim.decidim_forms_questions", "type": "source", "succ": [57]}, "30": {"name": "source.demo.decidim.decidim_areas", "type": "source", "succ": [61]}, "31": {"name": "source.demo.decidim.decidim_area_types", "type": "source", "succ": [60]}, "32": {"name": "source.demo.decidim.decidim_budgets_projects", "type": "source", "succ": [66]}, "33": {"name": "source.demo.decidim.decidim_budgets_budgets", "type": "source", "succ": [68]}, "34": {"name": "source.demo.decidim.decidim_budgets_line_items", "type": "source", "succ": [65]}, "35": {"name": "source.demo.decidim.decidim_budgets_orders", "type": "source", "succ": [67]}, "36": {"name": "source.demo.decidim.decidim_categories", "type": "source", "succ": [69]}, "37": {"name": "source.demo.decidim.decidim_categorizations", "type": "source", "succ": [70]}, "38": {"name": "model.test_lyon.int_decidim_awesome_proposal_extra_fields", "type": "model", "succ": [138, 180]}, "39": {"name": "model.test_lyon.stg_decidim_awesome_proposal_extra_fields", "type": "model", "succ": [38, 139, 140, 141]}, "40": {"name": "model.demo.stg_decidim_attachments", "type": "model", "succ": [86, 96]}, "41": {"name": "model.demo.stg_decidim_components", "type": "model", "succ": [98]}, "42": {"name": "model.demo.stg_decidim_endorsements", "type": "model", "succ": [79]}, "43": {"name": "model.demo.stg_decidim_follows", "type": "model", "succ": [90]}, "44": {"name": "model.demo.stg_decidim_comments", "type": "model", "succ": [80]}, "45": {"name": "model.demo.stg_decidim_meetings_registrations", "type": "model"}, "46": {"name": "model.demo.stg_decidim_participatory_processes", "type": "model", "succ": [89]}, "47": {"name": "model.demo.stg_decidim_users", "type": "model", "succ": [91]}, "48": {"name": "model.demo.stg_decidim_participatory_process_steps", "type": "model"}, "49": {"name": "model.demo.stg_decidim_coauthorships", "type": "model", "succ": [99, 78]}, "50": {"name": "model.demo.stg_decidim_meetings", "type": "model", "succ": [92, 103]}, "51": {"name": "model.demo.stg_decidim_accountability_results", "type": "model", "succ": [80]}, "52": {"name": "model.demo.stg_decidim_moderations", "type": "model", "succ": [80, 79, 78]}, "53": {"name": "model.demo.stg_decidim_surveys", "type": "model", "succ": [92]}, "54": {"name": "model.demo.stg_decidim_organizations", "type": "model", "succ": [76]}, "55": {"name": "model.demo.stg_decidim_forms_question_matrix_rows", "type": "model", "succ": [95, 113, 114, 115, 116]}, "56": {"name": "model.demo.stg_decidim_forms_answers", "type": "model", "succ": [106, 111, 112]}, "57": {"name": "model.demo.stg_decidim_forms_questions", "type": "model", "succ": [96, 94, 95, 93, 119, 120]}, "58": {"name": "model.demo.stg_decidim_forms_questionnaires", "type": "model", "succ": [92, 117, 118]}, "59": {"name": "model.demo.stg_decidim_forms_answer_choices", "type": "model", "succ": [94, 95, 107, 108, 109, 110]}, "60": {"name": "model.demo.stg_decidim_area_types", "type": "model"}, "61": {"name": "model.demo.stg_decidim_areas", "type": "model"}, "62": {"name": "model.demo.stg_decidim_blogs_posts", "type": "model", "succ": [87, 79, 142]}, "63": {"name": "model.demo.stg_decidim_assemblies", "type": "model", "succ": [89]}, "64": {"name": "model.demo.stg_decidim_debates", "type": "model", "succ": [83, 79, 143]}, "65": {"name": "model.demo.stg_decidim_budgets_line_items", "type": "model", "succ": [84, 121, 122]}, "66": {"name": "model.demo.stg_decidim_budgets_projects", "type": "model", "succ": [102, 144]}, "67": {"name": "model.demo.stg_decidim_budgets_orders", "type": "model", "succ": [101]}, "68": {"name": "model.demo.stg_decidim_budgets", "type": "model", "succ": [100, 88]}, "69": {"name": "model.demo.stg_decidim_categories", "type": "model", "succ": [97]}, "70": {"name": "model.demo.stg_decidim_categorizations", "type": "model", "succ": [97, 123, 124, 125]}, "71": {"name": "model.demo.stg_decidim_scopes", "type": "model", "succ": [105]}, "72": {"name": "model.demo.stg_decidim_proposals_votes", "type": "model", "succ": [81, 78]}, "73": {"name": "model.demo.stg_decidim_proposals_collaborative_drafts", "type": "model", "succ": [80]}, "74": {"name": "model.demo.stg_decidim_proposals", "type": "model", "succ": [79, 104, 138, 145]}, "75": {"name": "model.demo.organizations", "type": "model", "succ": [86, 96]}, "76": {"name": "model.demo.int_organizations", "type": "model", "succ": [75, 89, 99, 162, 163]}, "77": {"name": "model.demo.participations", "type": "model"}, "78": {"name": "model.demo.proposals", "type": "model", "succ": [77, 80, 90, 99, 81, 158, 159, 160, 161]}, "79": {"name": "model.demo.endorsements", "type": "model", "succ": [77, 99, 154, 155]}, "80": {"name": "model.demo.comments", "type": "model", "succ": [77, 99]}, "81": {"name": "model.demo.proposals_votes", "type": "model", "succ": [77, 99, 134]}, "82": {"name": "model.demo.forms_answers", "type": "model", "succ": [77, 99]}, "83": {"name": "model.demo.debates", "type": "model", "succ": [77, 80, 90]}, "84": {"name": "model.demo.projects_votes", "type": "model", "succ": [77, 99]}, "85": {"name": "model.demo.meetings", "type": "model", "succ": [77, 80, 90, 156, 157]}, "86": {"name": "model.demo.attachments", "type": "model"}, "87": {"name": "model.demo.blogs_posts", "type": "model", "succ": [80, 90, 146]}, "88": {"name": "model.demo.budgets_projects", "type": "model", "succ": [80, 90, 84]}, "89": {"name": "model.demo.components", "type": "model", "succ": [80, 90, 92, 87, 83, 100, 88, 85, 78, 127, 128, 129, 130, 138, 147, 148, 149, 150, 151]}, "90": {"name": "model.demo.followings", "type": "model", "succ": [99, 126]}, "91": {"name": "model.demo.int_users", "type": "model", "succ": [90, 99, 78, 133, 135, 136, 137, 171, 172, 173]}, "92": {"name": "model.demo.forms", "type": "model", "succ": [82]}, "93": {"name": "model.demo.answers_short_and_long_answer", "type": "model", "succ": [82, 165, 168]}, "94": {"name": "model.demo.answers_option_and_sorting", "type": "model", "succ": [82, 167]}, "95": {"name": "model.demo.answers_matrix", "type": "model", "succ": [82, 166, 169]}, "96": {"name": "model.demo.answers_file", "type": "model", "succ": [82]}, "97": {"name": "model.demo.categorizations", "type": "model", "succ": [83, 88, 85, 78, 152, 153]}, "98": {"name": "model.demo.int_components", "type": "model", "succ": [89, 170]}, "99": {"name": "model.demo.users", "type": "model", "succ": [131, 132, 133]}, "100": {"name": "model.demo.budgets", "type": "model"}, "101": {"name": "model.demo.int_budgets_orders", "type": "model", "succ": [84, 174]}, "102": {"name": "model.demo.int_budgets_projects", "type": "model", "succ": [88, 175]}, "103": {"name": "model.demo.int_meetings", "type": "model", "succ": [85]}, "104": {"name": "model.demo.int_proposals", "type": "model", "succ": [78, 176, 177, 178, 179]}, "105": {"name": "model.demo.int_scopes", "type": "model", "succ": [78]}, "106": {"name": "model.demo.int_forms_answers", "type": "model", "succ": [96, 94, 95, 93, 164]}, "107": {"name": "test.demo.not_null_stg_decidim_forms_answer_choices_id.6373c5b027", "type": "test"}, "108": {"name": "test.demo.unique_stg_decidim_forms_answer_choices_id.cac0250df2", "type": "test"}, "109": {"name": "test.demo.not_null_stg_decidim_forms_answer_choices_decidim_answer_id.70e833d8d0", "type": "test"}, "110": {"name": "test.demo.not_null_stg_decidim_forms_answer_choices_body.0c7838e1b8", "type": "test"}, "111": {"name": "test.demo.not_null_stg_decidim_forms_answers_id.92ce43439f", "type": "test"}, "112": {"name": "test.demo.unique_stg_decidim_forms_answers_id.8fb3388969", "type": "test"}, "113": {"name": "test.demo.not_null_stg_decidim_forms_question_matrix_rows_id.7e6619509e", "type": "test"}, "114": {"name": "test.demo.unique_stg_decidim_forms_question_matrix_rows_id.8db20e3085", "type": "test"}, "115": {"name": "test.demo.not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id.55db0b6fe6", "type": "test"}, "116": {"name": "test.demo.not_null_stg_decidim_forms_question_matrix_rows_body.71d322a975", "type": "test"}, "117": {"name": "test.demo.not_null_stg_decidim_forms_questionnaires_id.74cea2a594", "type": "test"}, "118": {"name": "test.demo.unique_stg_decidim_forms_questionnaires_id.c228c4d2a1", "type": "test"}, "119": {"name": "test.demo.not_null_stg_decidim_forms_questions_id.c7a096fa50", "type": "test"}, "120": {"name": "test.demo.unique_stg_decidim_forms_questions_id.3becc3a082", "type": "test"}, "121": {"name": "test.demo.unique_stg_decidim_budgets_line_items_id.93d157dab5", "type": "test"}, "122": {"name": "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id.759330b24d", "type": "test"}, "123": {"name": "test.demo.unique_stg_decidim_categorizations_id.6566c00409", "type": "test"}, "124": {"name": "test.demo.not_null_stg_decidim_categorizations_id.a059a79c08", "type": "test"}, "125": {"name": "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type.d2c10e48e4", "type": "test"}, "126": {"name": "test.demo.accepted_values_followings_following_way__real_follow__ancestor_follow.60d8b91db4", "type": "test"}, "127": {"name": "test.demo.not_null_components_id.85e75ab698", "type": "test"}, "128": {"name": "test.demo.unique_components_id.55875f0fa3", "type": "test"}, "129": {"name": "test.demo.not_null_components_manifest_name.2795dc3709", "type": "test"}, "130": {"name": "test.demo.not_null_components_decidim_organization_id.3ae04f70dd", "type": "test"}, "131": {"name": "test.demo.unique_users_id.ec952d9777", "type": "test"}, "132": {"name": "test.demo.not_null_users_id.4db5ed5c63", "type": "test"}, "133": {"name": "test.demo.relationships_users_id__id__ref_int_users_.c269bba0d5", "type": "test"}, "134": {"name": "test.demo.dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id.da5f9c9505", "type": "test"}, "135": {"name": "test.demo.unique_int_users_id.e5ba0ede1e", "type": "test"}, "136": {"name": "test.demo.not_null_int_users_id.1125b186c1", "type": "test"}, "137": {"name": "test.demo.not_null_int_users_nickname.b90ddd7677", "type": "test"}, "138": {"name": "model.test_lyon.decidim_awesome_proposal_extra_fields", "type": "model"}, "139": {"name": "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_id.aad3a9d9b8", "type": "test"}, "140": {"name": "test.test_lyon.unique_stg_decidim_awesome_proposal_extra_fields_id.1f06fde107", "type": "test"}, "141": {"name": "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id.5154a34bb9", "type": "test"}, "142": {"name": "unit_test.demo.stg_decidim_blogs_posts.resource_type_definition", "type": "unit_test"}, "143": {"name": "unit_test.demo.stg_decidim_debates.resource_type_definition", "type": "unit_test"}, "144": {"name": "unit_test.demo.stg_decidim_budgets_projects.resource_type_definition", "type": "unit_test"}, "145": {"name": "unit_test.demo.stg_decidim_proposals.resource_type_definition", "type": "unit_test"}, "146": {"name": "unit_test.demo.blogs_posts.test_url_concatenation", "type": "unit_test"}, "147": {"name": "unit_test.demo.components.test_ps_type", "type": "unit_test"}, "148": {"name": "unit_test.demo.components.test_ps_space_type_slug", "type": "unit_test"}, "149": {"name": "unit_test.demo.components.test_no_null_published_at", "type": "unit_test"}, "150": {"name": "unit_test.demo.components.test_take_only_assemblies_and_participatory_processes", "type": "unit_test"}, "151": {"name": "unit_test.demo.components.test_url_creation", "type": "unit_test"}, "152": {"name": "unit_test.demo.categorizations.testing_that_main_categories_are_properly_processed", "type": "unit_test"}, "153": {"name": "unit_test.demo.categorizations.testing_that_sub_categories_are_properly_processed", "type": "unit_test"}, "154": {"name": "unit_test.demo.endorsements.moderations-check", "type": "unit_test"}, "155": {"name": "unit_test.demo.endorsements.endorsements-component-check", "type": "unit_test"}, "156": {"name": "unit_test.demo.meetings.test_url_concatenation", "type": "unit_test"}, "157": {"name": "unit_test.demo.meetings.test_manifest_name_is_meetings", "type": "unit_test"}, "158": {"name": "unit_test.demo.proposals.withdrawn_proposals_check", "type": "unit_test"}, "159": {"name": "unit_test.demo.proposals.moderations_proposals_check", "type": "unit_test"}, "160": {"name": "unit_test.demo.proposals.conflict_on_decidim_reportable_type_check", "type": "unit_test"}, "161": {"name": "unit_test.demo.proposals.published_at_check", "type": "unit_test"}, "162": {"name": "unit_test.demo.int_organizations.test_filter_by_host", "type": "unit_test"}, "163": {"name": "unit_test.demo.int_organizations.test_regex_clean_description", "type": "unit_test"}, "164": {"name": "unit_test.demo.int_forms_answers.int_forms_answers_author_status_check", "type": "unit_test"}, "165": {"name": "unit_test.demo.answers_short_and_long_answer.answers_short_and_long_answer_check", "type": "unit_test"}, "166": {"name": "unit_test.demo.answers_matrix.answers_matrix_check", "type": "unit_test"}, "167": {"name": "unit_test.demo.answers_option_and_sorting.answers_option_and_sorting_check_on_question_type", "type": "unit_test"}, "168": {"name": "unit_test.demo.answers_short_and_long_answer.short_and_long_answer_check_on_question_type", "type": "unit_test"}, "169": {"name": "unit_test.demo.answers_matrix.answers_matrix_check_on_question_type", "type": "unit_test"}, "170": {"name": "unit_test.demo.int_components.test_translated_manifest_name", "type": "unit_test"}, "171": {"name": "unit_test.demo.int_users.deleted_users_check", "type": "unit_test"}, "172": {"name": "unit_test.demo.int_users.type_check", "type": "unit_test"}, "173": {"name": "unit_test.demo.int_users.sign_in_frequency_check", "type": "unit_test"}, "174": {"name": "unit_test.demo.int_budgets_orders.vote_finished_test", "type": "unit_test"}, "175": {"name": "unit_test.demo.int_budgets_projects.is_selected_test", "type": "unit_test"}, "176": {"name": "unit_test.demo.int_proposals.test_default_state", "type": "unit_test"}, "177": {"name": "unit_test.demo.int_proposals.test_translated_state", "type": "unit_test"}, "178": {"name": "unit_test.demo.int_proposals.test_default_address", "type": "unit_test"}, "179": {"name": "unit_test.demo.int_proposals.test_published_at_not_null", "type": "unit_test"}, "180": {"name": "unit_test.test_lyon.int_decidim_awesome_proposal_extra_fields.testing_that_the_correct_xml_information_are_parsed", "type": "unit_test"}}} \ No newline at end of file diff --git a/projects/test_lyon/target/manifest.json b/projects/test_lyon/target/manifest.json deleted file mode 100644 index fd88a3fa..00000000 --- a/projects/test_lyon/target/manifest.json +++ /dev/null @@ -1 +0,0 @@ -{"metadata": {"dbt_schema_version": "https://schemas.getdbt.com/dbt/manifest/v12.json", "dbt_version": "1.8.7", "generated_at": "2024-09-27T14:10:05.847371Z", "invocation_id": "abd1849f-2f07-41b8-9fd3-963d4daf1290", "env": {}, "project_name": "test_lyon", "project_id": "d8e56c488ab880a5d9339647e9a91e77", "user_id": "adcb453e-1d39-47b3-9baa-63abbc85451c", "send_anonymous_usage_stats": true, "adapter_type": "postgres"}, "nodes": {"model.test_lyon.int_decidim_awesome_proposal_extra_fields": {"database": "test_lyon", "schema": "prod", "name": "int_decidim_awesome_proposal_extra_fields", "resource_type": "model", "package_name": "test_lyon", "path": "intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql", "original_file_path": "models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql", "unique_id": "model.test_lyon.int_decidim_awesome_proposal_extra_fields", "fqn": ["test_lyon", "intermediate", "decidim_awesome", "int_decidim_awesome_proposal_extra_fields"], "alias": "int_decidim_awesome_proposal_extra_fields", "checksum": {"name": "sha256", "checksum": "b835485e439f483316d7c11e01c190988a7f3415d43d63a0de0bf2c7a6eeae79"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.500312, "relation_name": "\"test_lyon\".\"prod\".\"int_decidim_awesome_proposal_extra_fields\"", "raw_code": "WITH parsed_data AS (\n SELECT\n decidim_awesome_proposal_extra_fields.id,\n decidim_awesome_proposal_extra_fields.proposal_id,\n xpath('//text()', unnest(xpath('//dt', xml_data)))::text AS private_field_description,\n unnest(xpath('//dd/div/text()', unnest(xpath('//dd', xml_data))))::text AS private_field_content\n FROM\n {{ ref (\"stg_decidim_awesome_proposal_extra_fields\")}} AS decidim_awesome_proposal_extra_fields,\n LATERAL xmlparse(document private_body_clear) AS xml_data\n)\nSELECT\n parsed_data.id,\n parsed_data.proposal_id,\n replace(replace(private_field_description, '{\"', ''), '\"}', '') AS private_field_description,\n parsed_data.private_field_content\nFROM\n parsed_data\nWHERE\n private_field_content IS NOT NULL", "language": "sql", "refs": [{"name": "stg_decidim_awesome_proposal_extra_fields", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_attachments": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_attachments", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_attachments.sql", "original_file_path": "models/staging/decidim/stg_decidim_attachments.sql", "unique_id": "model.demo.stg_decidim_attachments", "fqn": ["demo", "staging", "decidim", "stg_decidim_attachments"], "alias": "stg_decidim_attachments", "checksum": {"name": "sha256", "checksum": "8e4c1762127b7fb4a32fb9ba5b67d7c1cdcab73077043069303f971d6f764b49"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.509962, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_attachments\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_attachments') }}\n),\nrenamed as (\n SELECT\n id,\n title,\n description,\n file,\n content_type,\n file_size,\n attached_to_id,\n created_at,\n updated_at,\n attached_to_type,\n weight,\n attachment_collection_id\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_attachments"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_attachments"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_components": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_components", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_components.sql", "original_file_path": "models/staging/decidim/stg_decidim_components.sql", "unique_id": "model.demo.stg_decidim_components", "fqn": ["demo", "staging", "decidim", "stg_decidim_components"], "alias": "stg_decidim_components", "checksum": {"name": "sha256", "checksum": "e7f975f26d0129f6fc9d4b6367e672974c4e9f49b8c4486bafe7ae796bba5d12"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.5110981, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_components\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_components') }}\n),\nrenamed AS (\n SELECT\n id,\n manifest_name,\n name::jsonb->>'fr' AS name,\n participatory_space_id,\n participatory_space_type,\n settings,\n weight,\n permissions,\n published_at,\n created_at,\n updated_at\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_components"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_endorsements": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_endorsements", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_endorsements.sql", "original_file_path": "models/staging/decidim/stg_decidim_endorsements.sql", "unique_id": "model.demo.stg_decidim_endorsements", "fqn": ["demo", "staging", "decidim", "stg_decidim_endorsements"], "alias": "stg_decidim_endorsements", "checksum": {"name": "sha256", "checksum": "9bec191fd84606c6ffcc454c65c75ce685790295ca46168991848f4bb0184968"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.512197, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_endorsements\"", "raw_code": "SELECT\n id,\n resource_type,\n resource_id,\n decidim_author_type,\n decidim_author_id,\n decidim_user_group_id,\n created_at,\n updated_at\nFROM {{ source('decidim', 'decidim_endorsements') }}", "language": "sql", "refs": [], "sources": [["decidim", "decidim_endorsements"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_endorsements"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_follows": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_follows", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_follows.sql", "original_file_path": "models/staging/decidim/stg_decidim_follows.sql", "unique_id": "model.demo.stg_decidim_follows", "fqn": ["demo", "staging", "decidim", "stg_decidim_follows"], "alias": "stg_decidim_follows", "checksum": {"name": "sha256", "checksum": "845bec0e562eec37206c673c0afc83cacf07402c414370dd5ddd97e13dd98f39"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.513283, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_follows\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_follows') }}\n),\nrenamed as (\n SELECT\n id,\n decidim_user_id,\n updated_at,\n created_at,\n decidim_followable_type,\n decidim_followable_id\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_follows"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_follows"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_comments": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_comments", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_comments.sql", "original_file_path": "models/staging/decidim/stg_decidim_comments.sql", "unique_id": "model.demo.stg_decidim_comments", "fqn": ["demo", "staging", "decidim", "stg_decidim_comments"], "alias": "stg_decidim_comments", "checksum": {"name": "sha256", "checksum": "79b502cf06a2626b020049fb4b680547e6dbf7487a4f51ffe9a2579c91172337"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.514428, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_comments\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_comments_comments') }}\n),\nrenamed as (\n SELECT\n id,\n decidim_commentable_type,\n decidim_commentable_id,\n decidim_author_id,\n created_at,\n updated_at,\n depth,\n alignment,\n decidim_user_group_id,\n decidim_root_commentable_type,\n decidim_root_commentable_id,\n decidim_author_type,\n body::jsonb->>'fr' as body,\n comments_count\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_comments_comments"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_comments_comments"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_meetings_registrations": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_meetings_registrations", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_meetings_registrations.sql", "original_file_path": "models/staging/decidim/stg_decidim_meetings_registrations.sql", "unique_id": "model.demo.stg_decidim_meetings_registrations", "fqn": ["demo", "staging", "decidim", "stg_decidim_meetings_registrations"], "alias": "stg_decidim_meetings_registrations", "checksum": {"name": "sha256", "checksum": "293379745fa39579f8f128e1ed40eab024dcff4fbc9527c62497da0d24ff70f8"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.5154839, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_meetings_registrations\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_meetings_registrations') }}\n),\nrenamed AS (\n select\n id,\n decidim_user_id,\n decidim_meeting_id,\n created_at,\n updated_at,\n code,\n validated_at,\n decidim_user_group_id\n FROM source\n)\nselect * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_meetings_registrations"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_meetings_registrations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_participatory_processes": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_participatory_processes", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_participatory_processes.sql", "original_file_path": "models/staging/decidim/stg_decidim_participatory_processes.sql", "unique_id": "model.demo.stg_decidim_participatory_processes", "fqn": ["demo", "staging", "decidim", "stg_decidim_participatory_processes"], "alias": "stg_decidim_participatory_processes", "checksum": {"name": "sha256", "checksum": "76b94379422e2efc8138274d1d77289c93ee8ed7e3cb9b94f4b16bc80d4f6d57"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.516536, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_participatory_processes\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_participatory_processes') }}\n),\nrenamed AS (\n SELECT \n id, \n published_at, \n title::jsonb->>'fr' AS title,\n subtitle::jsonb->>'fr' as subtitle, \n slug, \n 'Decidim::ParticipatoryProcess' as type,\n 'processes' as space_type_slug,\n decidim_organization_id\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_participatory_processes"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_participatory_processes"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_users": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_users", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_users.sql", "original_file_path": "models/staging/decidim/stg_decidim_users.sql", "unique_id": "model.demo.stg_decidim_users", "fqn": ["demo", "staging", "decidim", "stg_decidim_users"], "alias": "stg_decidim_users", "checksum": {"name": "sha256", "checksum": "e2c91dfd9f730fc788d2adf9bb88f58d84445a81a24f863fe747a139241bd8d0"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.517567, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_users\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_users') }}\n),\nrenamed AS (\n SELECT \n id,\n email,\n sign_in_count,\n last_sign_in_at,\n created_at,\n updated_at,\n invitation_created_at,\n invitation_sent_at,\n invitation_accepted_at,\n invited_by_id,\n invited_by_type,\n decidim_organization_id,\n confirmed_at,\n confirmation_token,\n unconfirmed_email,\n name,\n locale,\n deleted_at,\n admin,\n managed,\n roles::text AS roles,\n nickname,\n accepted_tos_version,\n type,\n following_count,\n followers_count,\n failed_attempts,\n locked_at,\n admin_terms_accepted_at,\n blocked,\n blocked_at,\n (CASE WHEN confirmed_at IS NULL THEN false ELSE true END) AS \"confirmed\",\n extended_data\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_users"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_participatory_process_steps": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_participatory_process_steps", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_participatory_process_steps.sql", "original_file_path": "models/staging/decidim/stg_decidim_participatory_process_steps.sql", "unique_id": "model.demo.stg_decidim_participatory_process_steps", "fqn": ["demo", "staging", "decidim", "stg_decidim_participatory_process_steps"], "alias": "stg_decidim_participatory_process_steps", "checksum": {"name": "sha256", "checksum": "d8a8fe723174bcddf09a5900d0598c0c6c86c72947fcb462cb664e6dbdde860b"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.518616, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_participatory_process_steps\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_participatory_process_steps') }}\n),\nrenamed AS (\n select\n id,\n title::jsonb->>'fr' as title,\n title::jsonb->>'fr' as description,\n start_date,\n end_date,\n decidim_participatory_process_id,\n created_at,\n updated_at,\n active,\n position,\n cta_text,\n cta_path\n\n FROM source\n)\nselect * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_participatory_process_steps"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_participatory_process_steps"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_coauthorships": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_coauthorships", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_coauthorships.sql", "original_file_path": "models/staging/decidim/stg_decidim_coauthorships.sql", "unique_id": "model.demo.stg_decidim_coauthorships", "fqn": ["demo", "staging", "decidim", "stg_decidim_coauthorships"], "alias": "stg_decidim_coauthorships", "checksum": {"name": "sha256", "checksum": "9fed6dbe61618f54b9f08d7f60b5c8ec41046eda17cd24064dedb7b380b3cd63"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}, {"columns": ["decidim_author_id"], "type": "btree"}, {"columns": ["coauthorable_id"], "type": "btree"}, {"columns": ["coauthorable_type"], "type": "btree"}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}, {"columns": ["decidim_author_id"], "type": "btree"}, {"columns": ["coauthorable_id"], "type": "btree"}, {"columns": ["coauthorable_type"], "type": "btree"}]}, "created_at": 1727441769.519694, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_coauthorships\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n {'columns': ['decidim_author_id'], 'type': 'btree'},\n {'columns': ['coauthorable_id'], 'type': 'btree'},\n {'columns': ['coauthorable_type'], 'type': 'btree'},\n ]\n)}}\n\nWITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_coauthorships') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_author_id,\n decidim_user_group_id,\n coauthorable_type,\n coauthorable_id,\n created_at,\n updated_at,\n decidim_author_type\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_coauthorships"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_coauthorships"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_meetings": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_meetings", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_meetings.sql", "original_file_path": "models/staging/decidim/stg_decidim_meetings.sql", "unique_id": "model.demo.stg_decidim_meetings", "fqn": ["demo", "staging", "decidim", "stg_decidim_meetings"], "alias": "stg_decidim_meetings", "checksum": {"name": "sha256", "checksum": "cc97aa4855ffbe86bc253d3dbbf5e4d1a9411b4869271f5208574c4add1fa025"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.521081, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_meetings\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_meetings_meetings') }}\n),\nrenamed AS (\n SELECT\n id,\n title::jsonb->>'fr' AS title,\n regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') AS description,\n coalesce(nullif(address,''), 'Pas d''adresse') as address,\n coalesce(attendees_count, 0) as attendees_count,\n created_at,\n decidim_scope_id,\n decidim_component_id,\n start_time,\n end_time,\n registration_url,\n type_of_meeting,\n private_meeting,\n decidim_author_id,\n 'Decidim::Meetings::Meeting' as resource_type\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_meetings_meetings"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_meetings_meetings"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_accountability_results": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_accountability_results", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_accountability_results.sql", "original_file_path": "models/staging/decidim/stg_decidim_accountability_results.sql", "unique_id": "model.demo.stg_decidim_accountability_results", "fqn": ["demo", "staging", "decidim", "stg_decidim_accountability_results"], "alias": "stg_decidim_accountability_results", "checksum": {"name": "sha256", "checksum": "49855fb3280a786e77b03797472d8eceb9f3d3b5b1ed9e01cd0ac5aae55049db"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.522144, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_accountability_results\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_accountability_results') }}\n),\nrenamed as (\n select\n id,\n title,\n description,\n reference,\n start_date,\n end_date,\n progress,\n parent_id,\n decidim_accountability_status_id,\n decidim_component_id,\n decidim_scope_id,\n created_at,\n updated_at,\n children_count,\n weight,\n external_id,\n comments_count\n FROM source\n)\nselect * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_accountability_results"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_accountability_results"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_moderations": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_moderations", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_moderations.sql", "original_file_path": "models/staging/decidim/stg_decidim_moderations.sql", "unique_id": "model.demo.stg_decidim_moderations", "fqn": ["demo", "staging", "decidim", "stg_decidim_moderations"], "alias": "stg_decidim_moderations", "checksum": {"name": "sha256", "checksum": "56f85d7867823a3974795f077bff219974db2feefcfd50d41d995cbdb073d688"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.523198, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_moderations\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_moderations') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_participatory_space_id,\n decidim_reportable_type,\n decidim_reportable_id,\n report_count,\n hidden_at,\n created_at,\n updated_at,\n decidim_participatory_space_type,\n reported_content\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_moderations"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_moderations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_surveys": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_surveys", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/stg_decidim_surveys.sql", "original_file_path": "models/staging/decidim/stg_decidim_surveys.sql", "unique_id": "model.demo.stg_decidim_surveys", "fqn": ["demo", "staging", "decidim", "stg_decidim_surveys"], "alias": "stg_decidim_surveys", "checksum": {"name": "sha256", "checksum": "23fa810230da2fc8db40b75648be3fd792a004c782e6b97380ebcc3a3a8a00f1"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.524245, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_surveys\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_surveys_surveys') }}\n),\nrenamed as (\n SELECT\n id,\n decidim_component_id,\n created_at,\n updated_at\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_surveys_surveys"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_surveys_surveys"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_organizations": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_organizations", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/organizations/stg_decidim_organizations.sql", "original_file_path": "models/staging/decidim/organizations/stg_decidim_organizations.sql", "unique_id": "model.demo.stg_decidim_organizations", "fqn": ["demo", "staging", "decidim", "organizations", "stg_decidim_organizations"], "alias": "stg_decidim_organizations", "checksum": {"name": "sha256", "checksum": "06c363b526b111c1e9b06a9c27ae49175dc6deee5d1c016b8e6e271639ba219b"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "A staging model for Decidim organizations", "columns": {"id": {"name": "id", "description": "Unique identifier for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "name": {"name": "name", "description": "Name of the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "host": {"name": "host", "description": "Host URL for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "default_locale": {"name": "default_locale", "description": "Default locale for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "available_locales": {"name": "available_locales", "description": "List of available locales for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the organization was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "description": {"name": "description", "description": "Description of the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "secondary_hosts": {"name": "secondary_hosts", "description": "Secondary hosts for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "available_authorizations": {"name": "available_authorizations", "description": "List of available authorizations for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "header_snippets": {"name": "header_snippets", "description": "Header snippets for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "tos_version": {"name": "tos_version", "description": "Version of the terms of service", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "badges_enabled": {"name": "badges_enabled", "description": "Indicates if badges are enabled. Badges in Decidim recognize participant actions and progress, enhancing engagement through gamification.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "send_welcome_notification": {"name": "send_welcome_notification", "description": "Flag indicating if welcome notifications are sent", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "users_registration_mode": {"name": "users_registration_mode", "description": "Mode of user registration", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "time_zone": {"name": "time_zone", "description": "Time zone of the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/organizations/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.763382, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_organizations\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_organizations') }}\n),\nrenamed AS (\n SELECT \n id,\n name,\n host,\n default_locale,\n available_locales::text as available_locales,\n created_at,\n description,\n secondary_hosts::text as secondary_hosts,\n available_authorizations::text as available_authorizations,\n header_snippets,\n tos_version,\n badges_enabled,\n send_welcome_notification,\n users_registration_mode,\n time_zone\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_organizations"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_organizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_forms_question_matrix_rows": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_forms_question_matrix_rows", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql", "original_file_path": "models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql", "unique_id": "model.demo.stg_decidim_forms_question_matrix_rows", "fqn": ["demo", "staging", "decidim", "forms", "stg_decidim_forms_question_matrix_rows"], "alias": "stg_decidim_forms_question_matrix_rows", "checksum": {"name": "sha256", "checksum": "814b4c0e437783633cd55c4813020ca4952f42adf8b0be80653d2d7dbe192a8d"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table for forms question of type matrix.", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_question_id": {"name": "decidim_question_id", "description": "Foreign key to the question.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "position": {"name": "position", "description": "Position of the matrix row.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "body": {"name": "body", "description": "Content of the matrix row.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/forms/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.766201, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_forms_question_matrix_rows\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_forms_question_matrix_rows') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_question_id,\n position,\n TRIM(body::jsonb->>'fr') AS body\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_forms_question_matrix_rows"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_forms_question_matrix_rows"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_forms_answers": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_forms_answers", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/forms/stg_decidim_forms_answers.sql", "original_file_path": "models/staging/decidim/forms/stg_decidim_forms_answers.sql", "unique_id": "model.demo.stg_decidim_forms_answers", "fqn": ["demo", "staging", "decidim", "forms", "stg_decidim_forms_answers"], "alias": "stg_decidim_forms_answers", "checksum": {"name": "sha256", "checksum": "ac9f9dc1a41cdb8330bd5cea54fb7dcc9533baf451d2ed5ca34864cccb85eedf"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table for forms answer when the answer is not in a matrix or optional and sorting question. (i.e long_answer and short_answer)", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "body": {"name": "body", "description": "Content of the answer. It is null if the question is a matrix or option, or sorting. It can be 'separator' if the question is a separator", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_user_id": {"name": "decidim_user_id", "description": "Foreign key to the user who gave the answer.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_questionnaire_id": {"name": "decidim_questionnaire_id", "description": "Foreign key to the questionnaire.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_question_id": {"name": "decidim_question_id", "description": "Foreign key to the question.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the answer was created.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Timestamp when the answer was last updated.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "session_token": {"name": "session_token", "description": "Session token of the user.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ip_hash": {"name": "ip_hash", "description": "Hashed IP address of the user.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/forms/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.765903, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_forms_answers\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_forms_answers') }}\n),\nrenamed AS (\n SELECT\n id,\n body,\n decidim_user_id,\n decidim_questionnaire_id,\n decidim_question_id,\n created_at,\n updated_at,\n session_token,\n ip_hash\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_forms_answers"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_forms_answers"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_forms_questions": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_forms_questions", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/forms/stg_decidim_forms_questions.sql", "original_file_path": "models/staging/decidim/forms/stg_decidim_forms_questions.sql", "unique_id": "model.demo.stg_decidim_forms_questions", "fqn": ["demo", "staging", "decidim", "forms", "stg_decidim_forms_questions"], "alias": "stg_decidim_forms_questions", "checksum": {"name": "sha256", "checksum": "05cb213ca7e5693567492a2593f1166ab83d4efff9cc02add61aacb18a01465f"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}, {"columns": ["decidim_questionnaire_id"], "type": "btree"}, {"type": "btree", "columns": ["question_type"]}]}, "tags": [], "description": "Table for forms questions", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_questionnaire_id": {"name": "decidim_questionnaire_id", "description": "Foreign key to the questionnaire.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "position": {"name": "position", "description": "Position of the question.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "question_type": {"name": "question_type", "description": "Type of the question (e.g., short_answer, long_answer, single_matrix ...).", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "mandatory": {"name": "mandatory", "description": "Boolean that indicates whether the question is mandatory.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "body": {"name": "body", "description": "Content of the question.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "description": {"name": "description", "description": "Description of the question.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "max_choices": {"name": "max_choices", "description": "Maximum number of choices allowed for the question.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the question was created.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Timestamp when the question was last updated.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "max_characters": {"name": "max_characters", "description": "Maximum number of characters allowed for the question.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/forms/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}, {"columns": ["decidim_questionnaire_id"], "type": "btree"}, {"type": "btree", "columns": ["question_type"]}]}, "created_at": 1727441769.769504, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_forms_questions\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n {'columns': ['decidim_questionnaire_id'], 'type': 'btree'},\n {'columns': ['question_type'], 'type': 'btree'},\n ]\n)}}\n\nWITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_forms_questions') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_questionnaire_id,\n position,\n question_type,\n mandatory,\n body::jsonb->>'fr' AS body,\n description,\n max_choices,\n created_at,\n updated_at,\n max_characters\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_forms_questions"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_forms_questions"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_forms_questionnaires": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_forms_questionnaires", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/forms/stg_decidim_forms_questionnaires.sql", "original_file_path": "models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql", "unique_id": "model.demo.stg_decidim_forms_questionnaires", "fqn": ["demo", "staging", "decidim", "forms", "stg_decidim_forms_questionnaires"], "alias": "stg_decidim_forms_questionnaires", "checksum": {"name": "sha256", "checksum": "2817595f60f5e32a08a712a7e37b9b45c3b7aae5ce698abe19f841f9728a6d10"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table for forms questionnaires", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "title": {"name": "title", "description": "Title of the questionnaire.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "description": {"name": "description", "description": "Description of the questionnaire.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "tos": {"name": "tos", "description": "Terms of service associated with the questionnaire.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "questionnaire_for_type": {"name": "questionnaire_for_type", "description": "Type of entity the questionnaire is for.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "questionnaire_for_id": {"name": "questionnaire_for_id", "description": "ID of the entity the questionnaire is for.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "published_at": {"name": "published_at", "description": "Timestamp when the questionnaire was published.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the questionnaire was created.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Timestamp when the questionnaire was last updated.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "salt": {"name": "salt", "description": "Salt used for hashing.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/forms/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.768296, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_forms_questionnaires\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_forms_questionnaires') }}\n),\nrenamed AS (\n SELECT\n id,\n title,\n description,\n tos,\n questionnaire_for_type,\n questionnaire_for_id,\n published_at,\n created_at,\n updated_at,\n salt\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_forms_questionnaires"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_forms_questionnaires"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_forms_answer_choices": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_forms_answer_choices", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/forms/stg_decidim_forms_answer_choices.sql", "original_file_path": "models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql", "unique_id": "model.demo.stg_decidim_forms_answer_choices", "fqn": ["demo", "staging", "decidim", "forms", "stg_decidim_forms_answer_choices"], "alias": "stg_decidim_forms_answer_choices", "checksum": {"name": "sha256", "checksum": "4589e69fcd414bd03e8a0b7fab9090f630dd97b20b8b2723a04cf5c115327383"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table for forms answer choices when the answer is in a matrix question or in a sorting or optional question, this table stores the choice of the answerer.", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_answer_id": {"name": "decidim_answer_id", "description": "Foreign key to the answer this choice belongs to from the table decidim_forms_answers", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_answer_option_id": {"name": "decidim_answer_option_id", "description": "Foreign key to the answer option from the table decidim_forms_answer_options. (Currently not used)", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "position": {"name": "position", "description": "Position of the answer choice when the question is of type sorting.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "body": {"name": "body", "description": "Content of the answer choice.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "custom_body": {"name": "custom_body", "description": "Custom body for the answer choice when the answer is of type free text.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_question_matrix_row_id": {"name": "decidim_question_matrix_row_id", "description": "Foreign key to the question matrix row when the question is of type matrix. It matches the matrix rows.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/forms/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.764865, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_forms_answer_choices\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_forms_answer_choices') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_answer_id,\n decidim_answer_option_id,\n position,\n body::text AS body,\n custom_body,\n decidim_question_matrix_row_id\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_forms_answer_choices"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_forms_answer_choices"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_area_types": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_area_types", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/areas/stg_decidim_area_types.sql", "original_file_path": "models/staging/decidim/areas/stg_decidim_area_types.sql", "unique_id": "model.demo.stg_decidim_area_types", "fqn": ["demo", "staging", "decidim", "areas", "stg_decidim_area_types"], "alias": "stg_decidim_area_types", "checksum": {"name": "sha256", "checksum": "980236296434c2d141aae8aa6f07ad8753edf8f6e0d8b91e6e9be4b3e8f7199a"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table for (deprecated) area types. Area types are used mainly as categories and super categories for decidim area.", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/areas/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.782188, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_area_types\"", "raw_code": "WITH source as (\n SELECT * FROM {{ source('decidim', 'decidim_area_types') }}\n),\nrenamed as (\n SELECT\n id,\n decidim_organization_id,\n name,\n plural\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_area_types"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_area_types"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_areas": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_areas", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/areas/stg_decidim_areas.sql", "original_file_path": "models/staging/decidim/areas/stg_decidim_areas.sql", "unique_id": "model.demo.stg_decidim_areas", "fqn": ["demo", "staging", "decidim", "areas", "stg_decidim_areas"], "alias": "stg_decidim_areas", "checksum": {"name": "sha256", "checksum": "00d6180e582e438635a273ae76448a025dd2e2a41c9f4ba8d8c8f75ef943472c"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table for (deprecated) areas. Areas are sub categories for area types.", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "area_type_id": {"name": "area_type_id", "description": "Id of the area type, the area is linked to.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/areas/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.782549, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_areas\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_areas') }}\n),\nrenamed as (\n select\n id,\n name,\n area_type_id,\n decidim_organization_id,\n created_at,\n updated_at\n FROM source\n)\nselect * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_areas"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_areas"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_blogs_posts": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_blogs_posts", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql", "original_file_path": "models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql", "unique_id": "model.demo.stg_decidim_blogs_posts", "fqn": ["demo", "staging", "decidim", "blogs_posts", "stg_decidim_blogs_posts"], "alias": "stg_decidim_blogs_posts", "checksum": {"name": "sha256", "checksum": "a0d517da497c87b66748cd2983933375b788f2d42954ddbb457dc77b6b1e031e"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.533806, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_blogs_posts\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_blogs_posts') }}\n),\nrenamed AS (\n SELECT\n id,\n title::jsonb->>'fr' AS title,\n regexp_replace(body::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') AS body,\n decidim_component_id,\n created_at,\n decidim_author_id,\n 'Decidim::Blogs::Post' AS resource_type\n FROM source \n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_blogs_posts"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_blogs_posts"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_assemblies": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_assemblies", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/assemblies/stg_decidim_assemblies.sql", "original_file_path": "models/staging/decidim/assemblies/stg_decidim_assemblies.sql", "unique_id": "model.demo.stg_decidim_assemblies", "fqn": ["demo", "staging", "decidim", "assemblies", "stg_decidim_assemblies"], "alias": "stg_decidim_assemblies", "checksum": {"name": "sha256", "checksum": "1015fbb9b8eaf4ec92de03aeaeb6d537b866ad4c1e4e16e8e3eb0d42272d4acf"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "This model represents the assemblies in Decidim, with selected and renamed fields for easier analysis.", "columns": {"id": {"name": "id", "description": "Unique identifier of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "slug": {"name": "slug", "description": "Readable unique identifier of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "hashtag": {"name": "hashtag", "description": "Hashtag associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "decidim_organization_id": {"name": "decidim_organization_id", "description": "Identifier of the associated Decidim organization.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "created_at": {"name": "created_at", "description": "Date when the assembly was created.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "timestamp"}, "updated_at": {"name": "updated_at", "description": "Date when the assembly was last updated.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "timestamp"}, "title": {"name": "title", "description": "Title of the assembly in French.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "subtitle": {"name": "subtitle", "description": "Subtitle of the assembly in French.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "short_description": {"name": "short_description", "description": "Short description of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "description": {"name": "description", "description": "Full description of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "hero_image": {"name": "hero_image", "description": "Hero image of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "banner_image": {"name": "banner_image", "description": "Banner image of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "promoted": {"name": "promoted", "description": "Indicator if the assembly is promoted.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "boolean"}, "published_at": {"name": "published_at", "description": "Date when the assembly was published.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "timestamp"}, "developer_group": {"name": "developer_group", "description": "Developer group associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "meta_scope": {"name": "meta_scope", "description": "Meta scope of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "local_area": {"name": "local_area", "description": "Local area related to the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "target": {"name": "target", "description": "Target audience of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "participatory_scope": {"name": "participatory_scope", "description": "Participatory scope of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "participatory_structure": {"name": "participatory_structure", "description": "Participatory structure of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "show_statistics": {"name": "show_statistics", "description": "Indicator if statistics are shown for the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "boolean"}, "decidim_scope_id": {"name": "decidim_scope_id", "description": "Identifier of the Decidim scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "scopes_enabled": {"name": "scopes_enabled", "description": "Indicator if scopes are enabled for the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "boolean"}, "private_space": {"name": "private_space", "description": "Indicator if the assembly is in a private space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "boolean"}, "reference": {"name": "reference", "description": "Reference identifier of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "decidim_area_id": {"name": "decidim_area_id", "description": "Identifier of the Decidim area.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "parent_id": {"name": "parent_id", "description": "Identifier of the parent assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "parents_path": {"name": "parents_path", "description": "Path of parent assemblies.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "children_count": {"name": "children_count", "description": "Count of child assemblies.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "purpose_of_action": {"name": "purpose_of_action", "description": "Purpose of the assembly's action.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "composition": {"name": "composition", "description": "Composition of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "creation_date": {"name": "creation_date", "description": "Creation date of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "date"}, "created_by": {"name": "created_by", "description": "User who created the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "created_by_other": {"name": "created_by_other", "description": "Other entity that created the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "duration": {"name": "duration", "description": "Duration of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "date"}, "included_at": {"name": "included_at", "description": "Date when the assembly was included.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "date"}, "closing_date": {"name": "closing_date", "description": "Closing date of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "date"}, "closing_date_reason": {"name": "closing_date_reason", "description": "Reason for the assembly's closing date.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "internal_organisation": {"name": "internal_organisation", "description": "Internal organization associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "is_transparent": {"name": "is_transparent", "description": "Indicator if the assembly is transparent.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "boolean"}, "special_features": {"name": "special_features", "description": "Special features of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "twitter_handler": {"name": "twitter_handler", "description": "Twitter handle associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "instagram_handler": {"name": "instagram_handler", "description": "Instagram handle associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "facebook_handler": {"name": "facebook_handler", "description": "Facebook handle associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "youtube_handler": {"name": "youtube_handler", "description": "YouTube handle associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "github_handler": {"name": "github_handler", "description": "GitHub handle associated with the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "decidim_assemblies_type_id": {"name": "decidim_assemblies_type_id", "description": "Identifier of the Decidim assembly type.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "weight": {"name": "weight", "description": "Weight of the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "follows_count": {"name": "follows_count", "description": "Count of follows for the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "bigint"}, "announcement": {"name": "announcement", "description": "Announcements related to the assembly.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}, "_airbyte_ab_id": {"name": "_airbyte_ab_id", "description": "Airbyte unique identifier.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "varchar"}, "_airbyte_emitted_at": {"name": "_airbyte_emitted_at", "description": "Timestamp when the record was emitted by Airbyte.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "timestamp with time zone"}, "_airbyte_normalized_at": {"name": "_airbyte_normalized_at", "description": "Timestamp when the record was normalized by Airbyte.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "timestamp with time zone"}, "_airbyte_decidim_assemblies_hashid": {"name": "_airbyte_decidim_assemblies_hashid", "description": "Hash identifier for the Decidim assemblies record.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": [], "type": "text"}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/assemblies/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.790986, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_assemblies\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_assemblies') }}\n),\nrenamed AS (\n SELECT\n id,\n slug,\n hashtag,\n decidim_organization_id,\n created_at,\n updated_at,\n title::jsonb->>'fr' AS title,\n subtitle::jsonb->>'fr' AS subtitle,\n short_description,\n description,\n hero_image,\n banner_image,\n promoted,\n published_at,\n developer_group,\n meta_scope,\n local_area,\n target,\n participatory_scope,\n participatory_structure,\n show_statistics,\n decidim_scope_id,\n scopes_enabled,\n private_space,\n reference,\n decidim_area_id,\n parent_id,\n parents_path,\n children_count,\n purpose_of_action,\n composition,\n creation_date,\n created_by,\n created_by_other,\n duration,\n included_at,\n closing_date,\n closing_date_reason,\n internal_organisation,\n is_transparent,\n special_features,\n twitter_handler,\n instagram_handler,\n facebook_handler,\n youtube_handler,\n github_handler,\n decidim_assemblies_type_id,\n weight,\n follows_count\n\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_assemblies"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_assemblies"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_debates": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_debates", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/debates/stg_decidim_debates.sql", "original_file_path": "models/staging/decidim/debates/stg_decidim_debates.sql", "unique_id": "model.demo.stg_decidim_debates", "fqn": ["demo", "staging", "decidim", "debates", "stg_decidim_debates"], "alias": "stg_decidim_debates", "checksum": {"name": "sha256", "checksum": "5c0b32b3ec2a2483a475d371bde8ddc92c7368e303029bb62e5a63880db2406c"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.535916, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_debates\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_debates_debates') }}\n),\nrenamed AS (\n SELECT\n id,\n title::jsonb->>'fr' as title,\n regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description,\n start_time,\n end_time,\n decidim_component_id,\n decidim_author_id,\n created_at,\n closed_at,\n 'Decidim::Debates::Debate' as resource_type\n FROM source \n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_debates_debates"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_debates_debates"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_budgets_line_items": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_budgets_line_items", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/budgets/stg_decidim_budgets_line_items.sql", "original_file_path": "models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql", "unique_id": "model.demo.stg_decidim_budgets_line_items", "fqn": ["demo", "staging", "decidim", "budgets", "stg_decidim_budgets_line_items"], "alias": "stg_decidim_budgets_line_items", "checksum": {"name": "sha256", "checksum": "72e0383100994445b0c8276bbbed676427fdcc9b65ade7ad26374d46669e6332"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "A line item links a given order to a given budget project", "columns": {"id": {"name": "id", "description": "Unique identifier of the line item", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_order_id": {"name": "decidim_order_id", "description": "ID of the issued order", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_project_id": {"name": "decidim_project_id", "description": "ID of the budget project", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/budgets/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.794361, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_budgets_line_items\"", "raw_code": "WITH source as (\n SELECT * FROM {{ source('decidim', 'decidim_budgets_line_items') }}\n),\nrenamed as (\n select\n id,\n decidim_order_id,\n decidim_project_id\n FROM source\n)\nselect * from renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_budgets_line_items"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_budgets_line_items"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_budgets_projects": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_budgets_projects", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/budgets/stg_decidim_budgets_projects.sql", "original_file_path": "models/staging/decidim/budgets/stg_decidim_budgets_projects.sql", "unique_id": "model.demo.stg_decidim_budgets_projects", "fqn": ["demo", "staging", "decidim", "budgets", "stg_decidim_budgets_projects"], "alias": "stg_decidim_budgets_projects", "checksum": {"name": "sha256", "checksum": "38ba6a896c76883b85f479bffced7d415dd7db1e56daf191e57d4f88c0b5e402"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Lists every project for every budget on the platform", "columns": {"id": {"name": "id", "description": "Unique identifier for a project", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "title": {"name": "title", "description": "Title of the project", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "description": {"name": "description", "description": "Description of the project", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp of the creation of the project", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_scope_id": {"name": "decidim_scope_id", "description": "ID of the scope to which the project may be linked to", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "project_amount": {"name": "project_amount", "description": "Cost of the project", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "selected_at": {"name": "selected_at", "description": "Timestamp of the selection of the project (if selected)", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_budgets_budget_id": {"name": "decidim_budgets_budget_id", "description": "ID of the related budget", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "resource_type": {"name": "resource_type", "description": "Hardcoded resource type", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/budgets/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.793084, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_budgets_projects\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_budgets_projects') }}\n),\nrenamed AS (\n SELECT\n id, \n title::jsonb->>'fr' as title,\n regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description,\n created_at,\n decidim_scope_id, \n budget_amount as project_amount,\n selected_at,\n decidim_budgets_budget_id,\n 'Decidim::Budgets::Project' as resource_type\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_budgets_projects"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_budgets_projects"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_budgets_orders": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_budgets_orders", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/budgets/stg_decidim_budgets_orders.sql", "original_file_path": "models/staging/decidim/budgets/stg_decidim_budgets_orders.sql", "unique_id": "model.demo.stg_decidim_budgets_orders", "fqn": ["demo", "staging", "decidim", "budgets", "stg_decidim_budgets_orders"], "alias": "stg_decidim_budgets_orders", "checksum": {"name": "sha256", "checksum": "3b3b9f2641d07ac85ded9cda4d4650ebbef60a90071fe7e5cc162dc856cf4cfc"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "An order is a vote from a single user to a given budget, and can be linked to one or several budget projects", "columns": {"id": {"name": "id", "description": "Unique identifier for an order", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_user_id": {"name": "decidim_user_id", "description": "ID of the user who has issued the order", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "checked_out_at": {"name": "checked_out_at", "description": "Timestamp of the completion of the order. Blank if the user has not completed the order", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp of the creation of the order", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Timestamp of the last modification of the order", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_budgets_budget_id": {"name": "decidim_budgets_budget_id", "description": "ID of the budget for which the order is issued", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/budgets/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.793715, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_budgets_orders\"", "raw_code": "WITH source as (\n SELECT * FROM {{ source('decidim', 'decidim_budgets_orders') }}\n),\nrenamed as (\n select\n id,\n decidim_user_id,\n checked_out_at,\n created_at,\n updated_at,\n decidim_budgets_budget_id\n FROM source\n)\nselect * from renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_budgets_orders"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_budgets_orders"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_budgets": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_budgets", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/budgets/stg_decidim_budgets.sql", "original_file_path": "models/staging/decidim/budgets/stg_decidim_budgets.sql", "unique_id": "model.demo.stg_decidim_budgets", "fqn": ["demo", "staging", "decidim", "budgets", "stg_decidim_budgets"], "alias": "stg_decidim_budgets", "checksum": {"name": "sha256", "checksum": "273d0e8ca55e8b9a6bdf6f696db0b5c626309254dcee5060197d62edbb3be147"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Lists every budget on the platform and their component", "columns": {"id": {"name": "id", "description": "Unique identifier for a budget", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "title": {"name": "title", "description": "Title of the budget", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_component_id": {"name": "decidim_component_id", "description": "ID of the component to which the budget is linked to. Multiple budgets can share the same component", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/budgets/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.79217, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_budgets\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_budgets_budgets') }}\n),\nrenamed AS (\n SELECT\n id,\n title::jsonb->>'fr' as title,\n decidim_component_id\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_budgets_budgets"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_budgets_budgets"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_categories": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_categories", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/categories/stg_decidim_categories.sql", "original_file_path": "models/staging/decidim/categories/stg_decidim_categories.sql", "unique_id": "model.demo.stg_decidim_categories", "fqn": ["demo", "staging", "decidim", "categories", "stg_decidim_categories"], "alias": "stg_decidim_categories", "checksum": {"name": "sha256", "checksum": "65d0ed6e7ec2006b035af60381a5786cce520d33a5144af16b29fc62ea025f3e"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table describing categories (and sub categories) attributes used to classify ressources within a space.", "columns": {"id": {"name": "id", "description": "Unique identifier of the category.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "name": {"name": "name", "description": "Name of the category. ex: Sports, Environment", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "description": {"name": "description", "description": "String describing the category", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "parent_id": {"name": "parent_id", "description": "Unique identifier of the parent category. Can be null if the category is not a sub category", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_participatory_space_id": {"name": "decidim_participatory_space_id", "description": "Unique identifier of the participatory space the category is in.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_participatory_space_type": {"name": "decidim_participatory_space_type", "description": "Type of the participatory space the category is in. ex: Decidim::ParticipatoryProcess", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "weight": {"name": "weight", "description": "Optional field. Which order will it have in relation to the other categories. Having a lower number means a higher priority. For instance, if you have two categories, 'Category a' with weight '10' and 'Category b' with weight '0', then 'Category b' will be first when ordering.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/categories/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.8061051, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_categories\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_categories') }}\n),\nrenamed AS (\n SELECT\n id,\n name::jsonb->>'fr' AS name,\n description,\n parent_id,\n decidim_participatory_space_id,\n decidim_participatory_space_type,\n weight\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_categories"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_categories"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_categorizations": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_categorizations", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/categories/stg_decidim_categorizations.sql", "original_file_path": "models/staging/decidim/categories/stg_decidim_categorizations.sql", "unique_id": "model.demo.stg_decidim_categorizations", "fqn": ["demo", "staging", "decidim", "categories", "stg_decidim_categorizations"], "alias": "stg_decidim_categorizations", "checksum": {"name": "sha256", "checksum": "b79de09812a3faf75232e5d456b3354fd58ea0553726e7c0b01d734595d64b34"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table describing entities that are categorized (and sub categorized) within a participatory space", "columns": {"id": {"name": "id", "description": "Unique incremental identifier of the table", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_category_id": {"name": "decidim_category_id", "description": "Unique idientifier of the category defined in the 'decidim_categories' table", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "categorizable_type": {"name": "categorizable_type", "description": "Type of the entities categorized. ex: 'Decidim::Proposals::Proposal', 'Decidim::Budgets::Project', 'Decidim::Accountability::Result'", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "categorizable_id": {"name": "categorizable_id", "description": "For each categorizable type, there is a unique identifier. The categorizable id is that identifier. However multiple categorizable entities can have the same idientifier. ex : All three of these 'Decidim::Proposals::Proposal', 'Decidim::Budgets::Project' and 'Decidim::Accountability::Result' can have the categorizable_id 52.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Creation date", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Update date", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/categories/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.8067222, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_categorizations\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_categorizations') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_category_id,\n categorizable_type,\n categorizable_id,\n created_at,\n updated_at\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_categorizations"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_categorizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_scopes": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_scopes", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/scopes/stg_decidim_scopes.sql", "original_file_path": "models/staging/decidim/scopes/stg_decidim_scopes.sql", "unique_id": "model.demo.stg_decidim_scopes", "fqn": ["demo", "staging", "decidim", "scopes", "stg_decidim_scopes"], "alias": "stg_decidim_scopes", "checksum": {"name": "sha256", "checksum": "78fb052a78c3ec5ff86af8887b59253923aa986d35fee713b9b57422a4d840e2"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Scopes are the set of territories or subjects that an Organization has. A scope may have child scopes.", "columns": {"id": {"name": "id", "description": "Unique identifier for the scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_organization_id": {"name": "decidim_organization_id", "description": "Identifier for the Decidim organization to which the scope belongs.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the scope was created.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Timestamp when the scope was last updated.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "name": {"name": "name", "description": "Name of the scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "scope_type_id": {"name": "scope_type_id", "description": "Identifier for the type of scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "parent_id": {"name": "parent_id", "description": "Identifier for the parent scope, if applicable.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "code": {"name": "code", "description": "Code associated with the scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "part_of": {"name": "part_of", "description": "IDs of the parent-child scope relationship", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/staging/decidim/scopes/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.811626, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_scopes\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_scopes') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_organization_id,\n created_at,\n updated_at,\n name::jsonb->>'fr' AS name,\n scope_type_id,\n parent_id,\n code,\n part_of\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_scopes"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_scopes"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_proposals_votes": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_proposals_votes", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/proposals/stg_decidim_proposals_votes.sql", "original_file_path": "models/staging/decidim/proposals/stg_decidim_proposals_votes.sql", "unique_id": "model.demo.stg_decidim_proposals_votes", "fqn": ["demo", "staging", "decidim", "proposals", "stg_decidim_proposals_votes"], "alias": "stg_decidim_proposals_votes", "checksum": {"name": "sha256", "checksum": "9e3bde2943a6c3cfd7afa06d4acab78502ca706a2bbfc83abe03a4cae27d59a9"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.544272, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_proposals_votes\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_proposals_proposal_votes') }}\n),\nrenamed AS (\n SELECT\n id,\n decidim_proposal_id,\n decidim_author_id,\n created_at,\n updated_at,\n weight,\n temporary\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_proposals_proposal_votes"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_proposals_proposal_votes"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_proposals_collaborative_drafts": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_proposals_collaborative_drafts", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql", "original_file_path": "models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql", "unique_id": "model.demo.stg_decidim_proposals_collaborative_drafts", "fqn": ["demo", "staging", "decidim", "proposals", "stg_decidim_proposals_collaborative_drafts"], "alias": "stg_decidim_proposals_collaborative_drafts", "checksum": {"name": "sha256", "checksum": "759545c94982b9f7a19556309bc2eb2be8dc5aa79f473c7d8c433c6b1b85e260"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.545302, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_proposals_collaborative_drafts\"", "raw_code": "WITH source as (\n SELECT * FROM {{ source('decidim', 'decidim_proposals_collaborative_drafts') }}\n),\nrenamed as (\n select\n id,\n title,\n body,\n decidim_component_id,\n decidim_scope_id,\n state,\n reference,\n address,\n latitude,\n longitude,\n published_at,\n authors_count,\n versions_count,\n contributions_count,\n created_at,\n updated_at,\n coauthorships_count,\n comments_count,\n follows_count\n\n from source\n)\nselect * from renamed", "language": "sql", "refs": [], "sources": [["decidim", "decidim_proposals_collaborative_drafts"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_proposals_collaborative_drafts"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.stg_decidim_proposals": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_proposals", "resource_type": "model", "package_name": "demo", "path": "staging/decidim/proposals/stg_decidim_proposals.sql", "original_file_path": "models/staging/decidim/proposals/stg_decidim_proposals.sql", "unique_id": "model.demo.stg_decidim_proposals", "fqn": ["demo", "staging", "decidim", "proposals", "stg_decidim_proposals"], "alias": "stg_decidim_proposals", "checksum": {"name": "sha256", "checksum": "c5734b71c06a368a300e5d191fdf8fdea3257641195ec4ed8045421e2ce80130"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.5467541, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_proposals\"", "raw_code": "SELECT\n id,\n regexp_replace(title::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as title,\n regexp_replace(body::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as body,\n 'Decidim::Proposals::Proposal' as resource_type,\n decidim_component_id,\n decidim_scope_id,\n created_at,\n published_at,\n state,\n comments_count,\n endorsements_count,\n address\nFROM {{ source('decidim', 'decidim_proposals_proposals') }}", "language": "sql", "refs": [], "sources": [["decidim", "decidim_proposals_proposals"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.demo.decidim.decidim_proposals_proposals"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.organizations": {"database": "test_lyon", "schema": "prod", "name": "organizations", "resource_type": "model", "package_name": "demo", "path": "marts/organizations.sql", "original_file_path": "models/marts/organizations.sql", "unique_id": "model.demo.organizations", "fqn": ["demo", "marts", "organizations"], "alias": "organizations", "checksum": {"name": "sha256", "checksum": "ddd77d68867258fdee09d89570ff743ec6ff90abf8bd8d3d929d8e41e0a2282c"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.580381, "relation_name": "\"test_lyon\".\"prod\".\"organizations\"", "raw_code": "SELECT\n*\nFROM {{ ref (\"int_organizations\")}} AS decidim_organizations", "language": "sql", "refs": [{"name": "int_organizations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.int_organizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.participations": {"database": "test_lyon", "schema": "prod", "name": "participations", "resource_type": "model", "package_name": "demo", "path": "marts/participations.sql", "original_file_path": "models/marts/participations.sql", "unique_id": "model.demo.participations", "fqn": ["demo", "marts", "participations"], "alias": "participations", "checksum": {"name": "sha256", "checksum": "a31604539d031cc2ecee5548176a89fb9108a14a13e2a8b0daa97f6ed02e83ef"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.581425, "relation_name": "\"test_lyon\".\"prod\".\"participations\"", "raw_code": "WITH participations_proposals AS (\n SELECT decidim_users.id,\n decidim_proposals_proposals.decidim_component_id,\n 'Decidim::Proposals::Proposal' AS \"participation_type\",\n decidim_proposals_proposals.id::text AS \"participation_id\",\n decidim_proposals_proposals.created_at AS participation_date\n FROM {{ ref(\"proposals\")}} AS decidim_proposals_proposals\n JOIN decidim_coauthorships on decidim_coauthorships.coauthorable_id = decidim_proposals_proposals.id\n JOIN decidim_users on decidim_users.id = decidim_coauthorships.decidim_author_id\n where coauthorable_type = 'Decidim::Proposals::Proposal'\n ), participations_endorsements as (\n SELECT decidim_users.id,\n decidim_endorsements.decidim_component_id,\n 'Decidim::Endorsements::Endorsement' as \"participation_type\",\n decidim_endorsements.id::text as \"participation_id\", \n decidim_endorsements.created_at as participation_date\n FROM {{ ref(\"endorsements\")}} as decidim_endorsements\n JOIN decidim_users on decidim_users.id = decidim_endorsements.decidim_author_id\n ), participations_comments as (\n SELECT decidim_users.id,\n decidim_component_id,\n 'Decidim::Comments::Comment' as \"participation_type\",\n decidim_comments_comments.id::text as \"participation_id\",\n decidim_comments_comments.created_at as contribution_date\n FROM {{ ref(\"comments\")}} decidim_comments_comments\n JOIN decidim_users on decidim_users.id = decidim_comments_comments.decidim_author_id\n ), participations_proposal_votes as (\n SELECT decidim_users.id,\n decidim_proposals_proposals.decidim_component_id,\n 'Decidim::Proposals::ProposalVote' as \"participation_type\",\n decidim_proposals_proposal_votes.id::text as \"participation_id\",\n decidim_proposals_proposal_votes.created_at as participation_date\n FROM {{ ref(\"proposals_votes\")}} as decidim_proposals_proposal_votes\n JOIN decidim_users on decidim_users.id = decidim_author_id\n JOIN {{ ref(\"proposals\")}} as decidim_proposals_proposals on decidim_proposals_proposal_votes.decidim_proposal_id = decidim_proposals_proposals.id\n ), participations_answers as (\n SELECT distinct\n decidim_user_id,\n decidim_component_id,\n 'Decidim::Forms::Answer' as \"participation_type\",\n ('x'||lpad(decidim_forms_answers.session_token,16,'0'))::bit(64)::bigint::text as \"participation_id\",\n decidim_forms_answers.created_at::date as participation_date\n FROM {{ ref(\"forms_answers\")}} as decidim_forms_answers\n ), participations_debates as (\n SELECT decidim_author_id as decidim_user_id,\n decidim_component_id,\n 'Decidim::Debates::Debate' as \"participation_type\",\n id::text as participation_id,\n created_at as participation_date\n FROM {{ ref(\"debates\")}} decidim_debates_debates\n ), participations_budgets_projects_votes as (\n SELECT\n decidim_user_id,\n decidim_component_id,\n 'Decidim::Budgets::Project::Vote' as participation_type,\n order_id::text as participation_id,\n created_at as participation_date\n FROM {{ ref(\"projects_votes\")}} decidim_bugdets_projects_votes\n ), participations_meetings_registrations as (\n SELECT\n decidim_user_id,\n decidim_component_id,\n 'Decidim::Meetings::Registration' as participation_type,\n decidim_meetings_meetings.id::text as participation_id,\n decidim_meetings_registrations.created_at as participation_date\n FROM {{ ref(\"meetings\")}} decidim_meetings_meetings\n join decidim_meetings_registrations on decidim_meetings_registrations.decidim_meeting_id = decidim_meetings_meetings.id\n ), participations as (\n SELECT * FROM participations_proposals union all\n SELECT * FROM participations_endorsements union all\n SELECT * FROM participations_comments union all\n SELECT * FROM participations_proposal_votes union all\n SELECT * from participations_answers union all\n SELECT * from participations_debates union all\n SELECT * from participations_budgets_projects_votes union all\n SELECT * from participations_meetings_registrations\n )\n SELECT\n distinct participations.id as \"user_id\",\n substr(participation_id,1,10)::bigint as participation_id,\n decidim_component_id,\n participation_type,\n participation_date\n from participations", "language": "sql", "refs": [{"name": "proposals", "package": null, "version": null}, {"name": "endorsements", "package": null, "version": null}, {"name": "comments", "package": null, "version": null}, {"name": "proposals_votes", "package": null, "version": null}, {"name": "proposals", "package": null, "version": null}, {"name": "forms_answers", "package": null, "version": null}, {"name": "debates", "package": null, "version": null}, {"name": "projects_votes", "package": null, "version": null}, {"name": "meetings", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.proposals", "model.demo.endorsements", "model.demo.comments", "model.demo.proposals_votes", "model.demo.forms_answers", "model.demo.debates", "model.demo.projects_votes", "model.demo.meetings"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.attachments": {"database": "test_lyon", "schema": "prod", "name": "attachments", "resource_type": "model", "package_name": "demo", "path": "marts/attachments.sql", "original_file_path": "models/marts/attachments.sql", "unique_id": "model.demo.attachments", "fqn": ["demo", "marts", "attachments"], "alias": "attachments", "checksum": {"name": "sha256", "checksum": "ee218fea222850e098dba008928a144007e80c0a64925d81c164d14a644220d1"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.5828009, "relation_name": "\"test_lyon\".\"prod\".\"attachments\"", "raw_code": "WITH org AS (\n -- Assumption: There is only one organization, so we select the first available host\n SELECT host\n FROM {{ ref(\"organizations\") }}\n LIMIT 1\n)\nSELECT\n decidim_attachments.id,\n decidim_attachments.file,\n decidim_attachments.attached_to_id,\n decidim_attachments.attached_to_type,\n concat('https://', org.host, '/uploads/decidim/attachment/file/', decidim_attachments.id, '/', decidim_attachments.file) AS url\nFROM\n {{ ref(\"stg_decidim_attachments\") }} AS decidim_attachments\nCROSS JOIN org", "language": "sql", "refs": [{"name": "organizations", "package": null, "version": null}, {"name": "stg_decidim_attachments", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.organizations", "model.demo.stg_decidim_attachments"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.comments": {"database": "test_lyon", "schema": "prod", "name": "comments", "resource_type": "model", "package_name": "demo", "path": "marts/comments/comments.sql", "original_file_path": "models/marts/comments/comments.sql", "unique_id": "model.demo.comments", "fqn": ["demo", "marts", "comments", "comments"], "alias": "comments", "checksum": {"name": "sha256", "checksum": "264b5c2b6a1655529133aee76e25d9af8955987a052e972a32986255c1550005"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["decidim_author_id"], "type": "btree"}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["decidim_author_id"], "type": "btree"}]}, "created_at": 1727441769.583959, "relation_name": "\"test_lyon\".\"prod\".\"comments\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_author_id'], 'type': 'btree'},\n ]\n)}}\n\n\n{% set commentable_tables = [\n {\"table\": \"stg_decidim_accountability_results\", \"type\": \"Decidim::Accountability::Result\"},\n {\"table\": \"blogs_posts\", \"type\": \"Decidim::Blogs::Post\"},\n {\"table\": \"budgets_projects\", \"type\": \"Decidim::Budgets::Project\"},\n {\"table\": \"debates\", \"type\": \"Decidim::Debates::Debate\"},\n {\"table\": \"meetings\", \"type\": \"Decidim::Meetings::Meeting\"},\n {\"table\": \"proposals\", \"type\": \"Decidim::Proposals::Proposal\"},\n {\"table\": \"stg_decidim_proposals_collaborative_drafts\", \"type\": \"Decidim::Proposals::CollaborativeDraft\"}\n] %}\n\nWITH commentaries AS (\n {% for commentable in commentable_tables %}\n SELECT\n comments.*, \n {{ ref(commentable.table) }}.decidim_component_id AS \"decidim_component_id\"\n FROM {{ ref(commentable.table) }}\n JOIN {{ ref(\"stg_decidim_comments\") }} AS comments\n on comments.decidim_root_commentable_id = {{ ref(commentable.table) }}.id\n and comments.decidim_root_commentable_type = '{{ commentable.type }}'\n {% if not loop.last %} union all {% endif %}\n {% endfor %}\n)\n\nSELECT\n commentaries.id,\n commentaries.decidim_commentable_id,\n commentaries.decidim_commentable_type,\n commentaries.decidim_author_id,\n commentaries.created_at,\n commentaries.depth,\n commentaries.alignment,\n commentaries.decidim_root_commentable_id,\n commentaries.decidim_root_commentable_type,\n commentaries.decidim_author_type,\n commentaries.body,\n commentaries.decidim_component_id,\n components.ps_slug,\n concat('https://', components.organization_host, '/', components.ps_space_type_slug, '/', components.ps_slug, '/f/', components.id, '/', components.manifest_name,'/', commentaries.decidim_root_commentable_id, '?commentId=', commentaries.id, '#comment_', commentaries.id) AS comment_url\nFROM commentaries\nJOIN {{ ref('components') }} AS components\n on components.id = commentaries.decidim_component_id\nLEFT JOIN {{ ref('stg_decidim_moderations') }} AS decidim_moderations\n on decidim_moderations.decidim_reportable_type = 'Decidim::Comments::Comment' \n and decidim_moderations.decidim_reportable_id = commentaries.id\nwhere decidim_moderations.hidden_at is null", "language": "sql", "refs": [{"name": "stg_decidim_accountability_results", "package": null, "version": null}, {"name": "stg_decidim_accountability_results", "package": null, "version": null}, {"name": "stg_decidim_comments", "package": null, "version": null}, {"name": "stg_decidim_accountability_results", "package": null, "version": null}, {"name": "blogs_posts", "package": null, "version": null}, {"name": "blogs_posts", "package": null, "version": null}, {"name": "stg_decidim_comments", "package": null, "version": null}, {"name": "blogs_posts", "package": null, "version": null}, {"name": "budgets_projects", "package": null, "version": null}, {"name": "budgets_projects", "package": null, "version": null}, {"name": "stg_decidim_comments", "package": null, "version": null}, {"name": "budgets_projects", "package": null, "version": null}, {"name": "debates", "package": null, "version": null}, {"name": "debates", "package": null, "version": null}, {"name": "stg_decidim_comments", "package": null, "version": null}, {"name": "debates", "package": null, "version": null}, {"name": "meetings", "package": null, "version": null}, {"name": "meetings", "package": null, "version": null}, {"name": "stg_decidim_comments", "package": null, "version": null}, {"name": "meetings", "package": null, "version": null}, {"name": "proposals", "package": null, "version": null}, {"name": "proposals", "package": null, "version": null}, {"name": "stg_decidim_comments", "package": null, "version": null}, {"name": "proposals", "package": null, "version": null}, {"name": "stg_decidim_proposals_collaborative_drafts", "package": null, "version": null}, {"name": "stg_decidim_proposals_collaborative_drafts", "package": null, "version": null}, {"name": "stg_decidim_comments", "package": null, "version": null}, {"name": "stg_decidim_proposals_collaborative_drafts", "package": null, "version": null}, {"name": "components", "package": null, "version": null}, {"name": "stg_decidim_moderations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_accountability_results", "model.demo.stg_decidim_comments", "model.demo.blogs_posts", "model.demo.budgets_projects", "model.demo.debates", "model.demo.meetings", "model.demo.proposals", "model.demo.stg_decidim_proposals_collaborative_drafts", "model.demo.components", "model.demo.stg_decidim_moderations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.followings": {"database": "test_lyon", "schema": "prod", "name": "followings", "resource_type": "model", "package_name": "demo", "path": "marts/followings/followings.sql", "original_file_path": "models/marts/followings/followings.sql", "unique_id": "model.demo.followings", "fqn": ["demo", "marts", "followings", "followings"], "alias": "followings", "checksum": {"name": "sha256", "checksum": "837620ce549291c73aa7951545d3b3234551fa3990a9eb5c0ddb97c51c8f0547"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"type": "btree", "columns": ["decidim_user_id"]}]}, "tags": [], "description": "Every follow action performed on the platform. Decidim counts follow in two different ways: follows on a specific resource (proposal, commentary, etc.) named 'real follow' and follows made on a component; every resource contained in that component is then marked as followed.", "columns": {"following_way": {"name": "following_way", "description": "Describes if the follow is either on a specific resource ('real_follow') or a component as a whole ('ancestor_follow')", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/followings/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"type": "btree", "columns": ["decidim_user_id"]}]}, "created_at": 1727441769.812691, "relation_name": "\"test_lyon\".\"prod\".\"followings\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_user_id'], 'type': 'btree'},\n ]\n)}}\n\n\nWITH followings_proposals AS (\n SELECT\n decidim_follows.*,\n decidim_proposals_proposals.decidim_component_id,\n url AS followable_url,\n title AS followable_title\n FROM {{ ref(\"stg_decidim_follows\")}} AS decidim_follows\n JOIN {{ ref(\"proposals\")}} decidim_proposals_proposals\n ON decidim_proposals_proposals.id = decidim_follows.decidim_followable_id\n AND decidim_proposals_proposals.resource_type = decidim_follows.decidim_followable_type\n ), followings_components AS (\n SELECT\n distinct decidim_follows.*,\n -1 AS \"decidim_components.id\",\n ps_url AS followable_url,\n ps_title AS followable_title\n FROM {{ ref(\"stg_decidim_follows\")}} AS decidim_follows\n JOIN {{ ref(\"components\")}} decidim_components\n ON decidim_components.ps_id = decidim_followable_id\n AND ps_type = decidim_followable_type\n ), followings_debates AS (\n SELECT\n decidim_follows.*,\n decidim_debates_debates.decidim_component_id,\n debate_url AS followable_url,\n title AS followable_title\n FROM {{ ref(\"stg_decidim_follows\")}} AS decidim_follows\n JOIN {{ ref(\"debates\")}} decidim_debates_debates ON decidim_debates_debates.id = decidim_followable_id\n AND resource_type = decidim_followable_type\n ), followings_blogs_posts AS (\n SELECT\n decidim_follows.*,\n decidim_blogs_posts.decidim_component_id,\n post_url AS followable_url,\n title AS followable_title\n FROM {{ ref(\"stg_decidim_follows\")}} AS decidim_follows\n JOIN {{ ref(\"blogs_posts\")}} decidim_blogs_posts\n ON decidim_blogs_posts.id = decidim_followable_id\n AND resource_type = decidim_followable_type\n ), followings_users AS (\n SELECT\n decidim_follows.*,\n -1 AS decidim_component_id,\n '' AS followable_url,\n '' AS followable_title\n FROM {{ ref(\"stg_decidim_follows\")}} AS decidim_follows\n JOIN {{ ref(\"int_users\")}} decidim_users\n ON decidim_users.id = decidim_followable_id\n where decidim_followable_type = 'Decidim::UserBaseEntity'\n ), followings_meetings AS (\n SELECT\n decidim_follows.*,\n decidim_component_id,\n meeting_url AS followable_url,\n title AS followable_title\n FROM {{ ref(\"stg_decidim_follows\")}} AS decidim_follows\n JOIN {{ ref(\"meetings\")}} decidim_meetings\n ON decidim_meetings.id = decidim_followable_id\n AND resource_type = decidim_followable_type\n ), followings_budgets_projects AS (\n SELECT\n decidim_follows.*,\n decidim_component_id,\n project_url AS followable_url,\n title AS followable_title\n FROM {{ ref(\"stg_decidim_follows\")}} AS decidim_follows\n join {{ ref(\"budgets_projects\")}} decidim_budgets_projects\n ON decidim_budgets_projects.id = decidim_followable_id\n AND resource_type = decidim_followable_type\n ), followings AS (\n SELECT * FROM followings_proposals union all\n SELECT * FROM followings_components union all\n SELECT * FROM followings_debates union all\n SELECT * FROM followings_blogs_posts union all\n SELECT * FROM followings_users union all\n SELECT * FROM followings_meetings union all\n SELECT * FROM followings_budgets_projects\n ), real_follow AS (\n SELECT\n followings.*,\n 'real_follow' AS \"following_way\",\n decidim_followable_id AS \"root_decidim_followable_id\",\n decidim_followable_type AS \"root_decidim_followable_type\",\n followable_url AS \"root_following_url\",\n followable_title AS \"root_followable_title\"\n FROM followings,\n lateral (SELECT (case array_length(array_remove(string_to_array(decidim_followable_type, ':', ''),null),1) when 2 then 'Ancestor' else 'Child' end) AS followable_meta_type) p_is_ps\n where followable_meta_type != 'Ancestor'\n ), ancestor_follow AS (\n SELECT\n distinct\n followings.*,\n 'ancestor_follow' AS \"following_way\",\n real_follow.decidim_followable_id AS \"root_decidim_followable_id\",\n real_follow.decidim_followable_type AS \"root_decidim_followable_type\",\n real_follow.followable_url AS \"root_following_url\",\n real_follow.followable_title AS \"root_followable_title\"\n FROM real_follow\n join {{ ref(\"components\")}} AS components ON components.id = real_follow.decidim_component_id\n join followings ON followings.decidim_followable_id = components.ps_id AND followings.decidim_followable_type = components.ps_type\n ), follows AS (\n SELECT * FROM real_follow union all\n SELECT * FROM ancestor_follow\n )\nSELECT id,\n decidim_component_id,\n decidim_user_id,\n root_decidim_followable_id,\n root_decidim_followable_type,\n root_followable_title,\n created_at,\n root_following_url,\n decidim_followable_id,\n decidim_followable_type,\n followable_url,\n following_way\nFROM follows", "language": "sql", "refs": [{"name": "stg_decidim_follows", "package": null, "version": null}, {"name": "proposals", "package": null, "version": null}, {"name": "stg_decidim_follows", "package": null, "version": null}, {"name": "components", "package": null, "version": null}, {"name": "stg_decidim_follows", "package": null, "version": null}, {"name": "debates", "package": null, "version": null}, {"name": "stg_decidim_follows", "package": null, "version": null}, {"name": "blogs_posts", "package": null, "version": null}, {"name": "stg_decidim_follows", "package": null, "version": null}, {"name": "int_users", "package": null, "version": null}, {"name": "stg_decidim_follows", "package": null, "version": null}, {"name": "meetings", "package": null, "version": null}, {"name": "stg_decidim_follows", "package": null, "version": null}, {"name": "budgets_projects", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_follows", "model.demo.proposals", "model.demo.components", "model.demo.debates", "model.demo.blogs_posts", "model.demo.int_users", "model.demo.meetings", "model.demo.budgets_projects"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.forms": {"database": "test_lyon", "schema": "prod", "name": "forms", "resource_type": "model", "package_name": "demo", "path": "marts/forms/forms.sql", "original_file_path": "models/marts/forms/forms.sql", "unique_id": "model.demo.forms", "fqn": ["demo", "marts", "forms", "forms"], "alias": "forms", "checksum": {"name": "sha256", "checksum": "6719434e32f89aa082de26a828fad3bc6349b23810b833e717a98325f89d1c0c"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"type": "btree", "columns": ["id"]}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"type": "btree", "columns": ["id"]}]}, "created_at": 1727441769.593865, "relation_name": "\"test_lyon\".\"prod\".\"forms\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n ]\n)}}\n\nWITH forms_meetings AS (\n SELECT decidim_forms_questionnaires.id AS questionnaire_id,\n decidim_forms_questionnaires.title,\n decidim_meetings_meetings.decidim_component_id\n FROM {{ ref(\"stg_decidim_forms_questionnaires\")}} decidim_forms_questionnaires\n JOIN {{ ref(\"stg_decidim_meetings\")}} decidim_meetings_meetings ON decidim_meetings_meetings.id = decidim_forms_questionnaires.questionnaire_for_id\n WHERE questionnaire_for_type = 'Decidim::Meetings::Meeting'\n), forms_surveys AS (\n SELECT decidim_forms_questionnaires.id AS questionnaire_id,\n decidim_forms_questionnaires.title,\n decidim_surveys_surveys.decidim_component_id\n FROM decidim_forms_questionnaires\n JOIN {{ ref(\"stg_decidim_surveys\")}} decidim_surveys_surveys ON decidim_surveys_surveys.id = questionnaire_for_id\n WHERE questionnaire_for_type = 'Decidim::Surveys::Survey'\n), forms AS (\n SELECT * FROM forms_meetings UNION ALL\n SELECT * FROM forms_surveys \n)\nSELECT\n forms.questionnaire_id AS id,\n title::jsonb->>'fr' AS title,\n decidim_components.id AS decidim_component_id,\n concat ('https://',organization_host, '/', ps_space_type_slug,'/', ps_slug, '/f/', decidim_component_id) AS \"questionnaire_url\"\nFROM forms\nJOIN {{ ref(\"components\")}} decidim_components ON decidim_components.id = forms.decidim_component_id", "language": "sql", "refs": [{"name": "stg_decidim_forms_questionnaires", "package": null, "version": null}, {"name": "stg_decidim_meetings", "package": null, "version": null}, {"name": "stg_decidim_surveys", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_forms_questionnaires", "model.demo.stg_decidim_meetings", "model.demo.stg_decidim_surveys", "model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.forms_answers": {"database": "test_lyon", "schema": "prod", "name": "forms_answers", "resource_type": "model", "package_name": "demo", "path": "marts/forms/forms_answers.sql", "original_file_path": "models/marts/forms/forms_answers.sql", "unique_id": "model.demo.forms_answers", "fqn": ["demo", "marts", "forms", "forms_answers"], "alias": "forms_answers", "checksum": {"name": "sha256", "checksum": "59df8d1b703c307d94beb38013950f0323576519f4dea59e8d9431119224fed0"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["decidim_user_id"], "type": "btree"}]}, "tags": [], "description": "Table gathering all types of answers (long, short, optional, sorting and matrix). ", "columns": {"sorting_points": {"name": "sorting_points", "description": "In order to evaluate the weight of the sorting answers, points are given to the answer according to its sorting position.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/forms/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["decidim_user_id"], "type": "btree"}]}, "created_at": 1727441769.81677, "relation_name": "\"test_lyon\".\"prod\".\"forms_answers\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_user_id'], 'type': 'btree'},\n ]\n)}}\n\nWITH answers_short_and_long_answer AS (\n SELECT * FROM {{ ref('answers_short_and_long_answer') }}\n), answers_option_and_sorting AS (\n SELECT * FROM {{ ref('answers_option_and_sorting') }}\n), answers_matrix AS (\n SELECT * FROM {{ ref('answers_matrix') }}\n), answers_file AS (\n SELECT * FROM {{ ref('answers_file') }}\n), answers AS (\n SELECT * FROM answers_short_and_long_answer\n UNION ALL\n SELECT * FROM answers_option_and_sorting\n UNION ALL\n SELECT * FROM answers_matrix\n UNION ALL\n SELECT * FROM answers_file\n)\n\nSELECT\n answers.decidim_user_id,\n answers.session_token,\n answers.ip_hash,\n answers.question_type,\n answers.body AS question_title,\n btrim(answers.answer, '\"') AS answer,\n answers.sub_matrix_question,\n answers.custom_body,\n answers.sorting_position,\n answers.decidim_questionnaire_id,\n decidim_forms_questionnaires.title AS form_title,\n decidim_forms_questionnaires.decidim_component_id,\n (CASE answers.sorting_position\n WHEN 0 THEN 10\n WHEN 1 THEN 9\n WHEN 2 THEN 8\n WHEN 3 THEN 7\n WHEN 4 THEN 6\n WHEN 5 THEN 5\n WHEN 6 THEN 4\n WHEN 7 THEN 3\n WHEN 8 THEN 2\n WHEN 9 THEN 1\n ELSE -1\n END) AS sorting_points,\n answers.position,\n answers.created_at,\n answers.author_status\nFROM answers\nJOIN {{ ref('forms') }} AS decidim_forms_questionnaires ON decidim_forms_questionnaires.id = answers.decidim_questionnaire_id\nORDER BY session_token, position", "language": "sql", "refs": [{"name": "answers_short_and_long_answer", "package": null, "version": null}, {"name": "answers_option_and_sorting", "package": null, "version": null}, {"name": "answers_matrix", "package": null, "version": null}, {"name": "answers_file", "package": null, "version": null}, {"name": "forms", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.answers_short_and_long_answer", "model.demo.answers_option_and_sorting", "model.demo.answers_matrix", "model.demo.answers_file", "model.demo.forms"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.blogs_posts": {"database": "test_lyon", "schema": "prod", "name": "blogs_posts", "resource_type": "model", "package_name": "demo", "path": "marts/blogs_posts/blogs_posts.sql", "original_file_path": "models/marts/blogs_posts/blogs_posts.sql", "unique_id": "model.demo.blogs_posts", "fqn": ["demo", "marts", "blogs_posts", "blogs_posts"], "alias": "blogs_posts", "checksum": {"name": "sha256", "checksum": "e5194c7f72ff483a0fa8a5c9e185580f607b35ee90cf1fd0ab99b36efb699681"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.596417, "relation_name": "\"test_lyon\".\"prod\".\"blogs_posts\"", "raw_code": "SELECT\n decidim_blogs_posts.id,\n decidim_blogs_posts.title,\n decidim_blogs_posts.body,\n decidim_blogs_posts.decidim_component_id,\n decidim_blogs_posts.created_at,\n decidim_blogs_posts.decidim_author_id,\n decidim_blogs_posts.resource_type,\n concat('https://', decidim_components.organization_host, '/', decidim_components.ps_space_type_slug, '/', decidim_components.ps_slug, '/f/', decidim_components.id, '/posts/', decidim_blogs_posts.id) AS post_url\nFROM {{ ref (\"stg_decidim_blogs_posts\")}} AS decidim_blogs_posts\nJOIN {{ ref (\"components\")}} AS decidim_components ON decidim_components.id = decidim_component_id", "language": "sql", "refs": [{"name": "stg_decidim_blogs_posts", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_blogs_posts", "model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.debates": {"database": "test_lyon", "schema": "prod", "name": "debates", "resource_type": "model", "package_name": "demo", "path": "marts/debates/debates.sql", "original_file_path": "models/marts/debates/debates.sql", "unique_id": "model.demo.debates", "fqn": ["demo", "marts", "debates", "debates"], "alias": "debates", "checksum": {"name": "sha256", "checksum": "7542d1f3f81682850fc1525d5cf6d64453d81fb8de59a12b53faea6bc025db62"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.597547, "relation_name": "\"test_lyon\".\"prod\".\"debates\"", "raw_code": "WITH categorizations AS (\n {{ categorizations_filter('Decidim::Debates::Debate') }}\n)\nSELECT\n decidim_debates_debates.id,\n decidim_debates_debates.title,\n decidim_debates_debates.description,\n decidim_debates_debates.start_time,\n decidim_debates_debates.end_time,\n decidim_debates_debates.decidim_component_id,\n decidim_debates_debates.decidim_author_id,\n decidim_debates_debates.created_at,\n decidim_debates_debates.closed_at,\n decidim_components.ps_slug,\n concat(\n 'https://',\n decidim_components.organization_host,\n '/',\n decidim_components.ps_space_type_slug,\n '/',\n decidim_components.ps_slug,\n '/f/',\n decidim_components.id,\n '/debates/',\n decidim_debates_debates.id\n ) AS debate_url,\n decidim_debates_debates.resource_type,\n categorizations.categories,\n coalesce(categorizations.categories[1], 'Sans cat\u00e9gorie') AS first_category,\n categorizations.sub_categories,\n coalesce(categorizations.sub_categories[1], 'Sans sous-cat\u00e9gorie') AS first_sub_category\nFROM {{ ref(\"stg_decidim_debates\")}} AS decidim_debates_debates\n JOIN {{ ref(\"components\")}} decidim_components on decidim_components.id = decidim_component_id\n LEFT JOIN categorizations on categorizations.categorizable_id = decidim_debates_debates.id", "language": "sql", "refs": [{"name": "categorizations", "package": null, "version": null}, {"name": "stg_decidim_debates", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.demo.categorizations_filter"], "nodes": ["model.demo.categorizations", "model.demo.stg_decidim_debates", "model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.components": {"database": "test_lyon", "schema": "prod", "name": "components", "resource_type": "model", "package_name": "demo", "path": "marts/components/components.sql", "original_file_path": "models/marts/components/components.sql", "unique_id": "model.demo.components", "fqn": ["demo", "marts", "components", "components"], "alias": "components", "checksum": {"name": "sha256", "checksum": "bb67bddf26ab7bbdfd5a55dae7843fdcad38758cb38831b5b3a53291822e5b1f"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}]}, "tags": [], "description": "Model representing the components associated with participatory spaces in Decidim.", "columns": {"id": {"name": "id", "description": "Unique identifier for the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "manifest_name": {"name": "manifest_name", "description": "Name of the component's manifest file. The manifest defines the component's configuration and metadata.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "translated_manifest_name": {"name": "translated_manifest_name", "description": "Translated name of the component's manifest.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "component_name": {"name": "component_name", "description": "Full name of the component, including its translated name.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "published_at": {"name": "published_at", "description": "Date when the component was published.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Date when the component was created.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "component_url": {"name": "component_url", "description": "URL for accessing the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_id": {"name": "ps_id", "description": "Identifier of the associated participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_published_at": {"name": "ps_published_at", "description": "Publication date of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_title": {"name": "ps_title", "description": "Title of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_subtitle": {"name": "ps_subtitle", "description": "Subtitle of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_slug": {"name": "ps_slug", "description": "Slug of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_type": {"name": "ps_type", "description": "Type of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_space_type_slug": {"name": "ps_space_type_slug", "description": "Slug for the type of participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "ps_url": {"name": "ps_url", "description": "URL of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_organization_id": {"name": "decidim_organization_id", "description": "Identifier of the Decidim organization.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "organization_host": {"name": "organization_host", "description": "Host of the Decidim organization.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/components/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}]}, "created_at": 1727441769.8202848, "relation_name": "\"test_lyon\".\"prod\".\"components\"", "raw_code": "-- Warning: are not taken by default into account Conferences, Consultations, Elections, Initiatives, Votations\n\n{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n ]\n)}}\n\nWITH assemblies_spaces AS (\n SELECT\n id AS ps_id,\n published_at AS ps_published_at,\n title AS ps_title,\n subtitle AS ps_subtitle,\n slug AS ps_slug,\n decidim_organization_id,\n 'Decidim::Assembly' AS ps_type,\n 'assemblies' AS ps_space_type_slug\n FROM {{ ref (\"stg_decidim_assemblies\")}}\n),\nparticipatory_processes_spaces AS (\n SELECT\n id AS ps_id, \n published_at AS ps_published_at, \n title AS ps_title, \n subtitle AS ps_subtitle, \n slug AS ps_slug, \n decidim_organization_id, \n 'Decidim::ParticipatoryProcess' AS ps_type,\n 'processes' AS ps_space_type_slug\n FROM {{ ref (\"stg_decidim_participatory_processes\")}}\n), \nparticipatory_spaces AS (\n SELECT * FROM assemblies_spaces \n UNION ALL\n SELECT * FROM participatory_processes_spaces\n),\ncomponents AS (\n SELECT \n decidim_components.id,\n decidim_components.manifest_name,\n decidim_components.translated_manifest_name,\n concat(decidim_components.name, ' (', decidim_components.translated_manifest_name, ')') AS component_name,\n decidim_components.published_at,\n decidim_components.created_at,\n concat('https://',decidim_organizations.host,'/', participatory_spaces.ps_space_type_slug, '/', participatory_spaces.ps_slug,'/f/', decidim_components.id) AS component_url,\n participatory_spaces.ps_id, \n participatory_spaces.ps_published_at, \n participatory_spaces.ps_title, \n participatory_spaces.ps_subtitle, \n participatory_spaces.ps_slug, \n participatory_spaces.ps_type,\n participatory_spaces.ps_space_type_slug,\n concat('https://',decidim_organizations.host,'/', participatory_spaces.ps_space_type_slug, '/', participatory_spaces.ps_slug,'/') AS ps_url,\n decidim_organization_id, \n decidim_organizations.host AS organization_host\n FROM {{ ref (\"int_components\")}} AS decidim_components\n JOIN participatory_spaces ON participatory_spaces.ps_type = decidim_components.participatory_space_type AND decidim_components.participatory_space_id = participatory_spaces.ps_id \n JOIN {{ ref (\"int_organizations\")}} AS decidim_organizations ON decidim_organizations.id = participatory_spaces.decidim_organization_id\n WHERE participatory_spaces.ps_published_at IS NOT NULL\n)\nSELECT * FROM components", "language": "sql", "refs": [{"name": "stg_decidim_assemblies", "package": null, "version": null}, {"name": "stg_decidim_participatory_processes", "package": null, "version": null}, {"name": "int_components", "package": null, "version": null}, {"name": "int_organizations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_assemblies", "model.demo.stg_decidim_participatory_processes", "model.demo.int_components", "model.demo.int_organizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.categorizations": {"database": "test_lyon", "schema": "prod", "name": "categorizations", "resource_type": "model", "package_name": "demo", "path": "marts/categorizations/categorizations.sql", "original_file_path": "models/marts/categorizations/categorizations.sql", "unique_id": "model.demo.categorizations", "fqn": ["demo", "marts", "categorizations", "categorizations"], "alias": "categorizations", "checksum": {"name": "sha256", "checksum": "ced1275a578c4c2efb0122b46382132d550a2604a10306f2fa59c0191ad11d18"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.601779, "relation_name": "\"test_lyon\".\"prod\".\"categorizations\"", "raw_code": "WITH main_categories AS (\n SELECT\n decidim_categories.id AS id,\n decidim_categories.name AS category_name,\n 0 AS child_id,\n '' AS child_name,\n decidim_categorizations.categorizable_id,\n decidim_categorizations.categorizable_type\n FROM {{ ref (\"stg_decidim_categorizations\")}} AS decidim_categorizations\n JOIN {{ ref (\"stg_decidim_categories\")}} AS decidim_categories ON decidim_categories.id = decidim_categorizations.decidim_category_id\n WHERE decidim_categories.parent_id IS NULL\n), \nsub_categories AS ( \n SELECT\n parent_categories.id AS id,\n parent_categories.name AS category_name,\n decidim_categories.id AS child_id,\n decidim_categories.name AS child_name,\n decidim_categorizations.categorizable_id,\n decidim_categorizations.categorizable_type\n FROM {{ ref (\"stg_decidim_categorizations\")}} AS decidim_categorizations\n JOIN {{ ref (\"stg_decidim_categories\")}} AS decidim_categories ON decidim_categories.id = decidim_categorizations.decidim_category_id\n LEFT JOIN {{ ref (\"stg_decidim_categories\")}} AS parent_categories ON decidim_categories.parent_id = parent_categories.id\n WHERE decidim_categories.parent_id IS NOT NULL\n), \ncategories AS (\n SELECT * FROM main_categories \n UNION ALL\n SELECT * FROM sub_categories\n)\nSELECT * FROM categories", "language": "sql", "refs": [{"name": "stg_decidim_categorizations", "package": null, "version": null}, {"name": "stg_decidim_categories", "package": null, "version": null}, {"name": "stg_decidim_categorizations", "package": null, "version": null}, {"name": "stg_decidim_categories", "package": null, "version": null}, {"name": "stg_decidim_categories", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_categorizations", "model.demo.stg_decidim_categories"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.endorsements": {"database": "test_lyon", "schema": "prod", "name": "endorsements", "resource_type": "model", "package_name": "demo", "path": "marts/endorsements/endorsements.sql", "original_file_path": "models/marts/endorsements/endorsements.sql", "unique_id": "model.demo.endorsements", "fqn": ["demo", "marts", "endorsements", "endorsements"], "alias": "endorsements", "checksum": {"name": "sha256", "checksum": "269e0015542536377fb502c1eee1c1b71b8d585f7758d0d95c5d95ed1c5ab575"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["decidim_author_id"], "type": "btree"}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["decidim_author_id"], "type": "btree"}]}, "created_at": 1727441769.602952, "relation_name": "\"test_lyon\".\"prod\".\"endorsements\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_author_id'], 'type': 'btree'},\n ]\n)}}\n\nWITH endorsements_proposals AS (\n SELECT\n decidim_endorsements.*,\n decidim_component_id\n FROM {{ ref(\"stg_decidim_endorsements\")}} AS decidim_endorsements\n JOIN {{ ref(\"stg_decidim_proposals\")}} decidim_proposals_proposals on decidim_endorsements.resource_id = decidim_proposals_proposals.id\n and decidim_proposals_proposals.resource_type = decidim_endorsements.resource_type\n), endorsements_debates AS (\n SELECT\n decidim_endorsements.*,\n decidim_component_id\n FROM {{ ref(\"stg_decidim_endorsements\")}} AS decidim_endorsements\n JOIN {{ ref(\"stg_decidim_debates\")}} AS decidim_debates_debates on decidim_endorsements.resource_id = decidim_debates_debates.id\n and decidim_debates_debates.resource_type = decidim_endorsements.resource_type\n), endorsements_blogs_posts AS (\n SELECT\n decidim_endorsements.*,\n decidim_component_id\n FROM {{ ref(\"stg_decidim_endorsements\")}} AS decidim_endorsements\n JOIN {{ ref(\"stg_decidim_blogs_posts\")}} AS decidim_blogs_posts on decidim_endorsements.resource_id = decidim_blogs_posts.id\n and decidim_blogs_posts.resource_type = decidim_endorsements.resource_type\n), endorsements as (\n SELECT * FROM endorsements_proposals union all\n SELECT * FROM endorsements_debates union all\n SELECT * FROM endorsements_blogs_posts\n)\n\nSELECT\n endorsements.id,\n endorsements.resource_type,\n endorsements.resource_id,\n endorsements.decidim_author_type,\n endorsements.decidim_author_id,\n endorsements.created_at,\n endorsements.updated_at,\n endorsements.decidim_component_id\nFROM endorsements\nLEFT JOIN {{ ref(\"stg_decidim_moderations\")}} AS decidim_moderations\n ON decidim_moderations.decidim_reportable_type = endorsements.resource_type\n AND decidim_moderations.decidim_reportable_id = endorsements.resource_id\nWHERE decidim_moderations.hidden_at IS NULL", "language": "sql", "refs": [{"name": "stg_decidim_endorsements", "package": null, "version": null}, {"name": "stg_decidim_proposals", "package": null, "version": null}, {"name": "stg_decidim_endorsements", "package": null, "version": null}, {"name": "stg_decidim_debates", "package": null, "version": null}, {"name": "stg_decidim_endorsements", "package": null, "version": null}, {"name": "stg_decidim_blogs_posts", "package": null, "version": null}, {"name": "stg_decidim_moderations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_endorsements", "model.demo.stg_decidim_proposals", "model.demo.stg_decidim_debates", "model.demo.stg_decidim_blogs_posts", "model.demo.stg_decidim_moderations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.users": {"database": "test_lyon", "schema": "prod", "name": "users", "resource_type": "model", "package_name": "demo", "path": "marts/users/users.sql", "original_file_path": "models/marts/users/users.sql", "unique_id": "model.demo.users", "fqn": ["demo", "marts", "users", "users"], "alias": "users", "checksum": {"name": "sha256", "checksum": "64b40467d6c14d708c5428be0ac86ad87f32aa2a04021c09d7e4bf5fda90d0b2"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "All created users on your platform (includes admins, invited, managed, reported, blocked and deleted users)", "columns": {"id": {"name": "id", "description": "ID of the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "email": {"name": "email", "description": "Email of the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "sign_in_count": {"name": "sign_in_count", "description": "Number of times the user signed in on the platform", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "sign_in_frequency": {"name": "sign_in_frequency", "description": "Classification of sign-in counts in human-readable categories", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "last_sign_in_at": {"name": "last_sign_in_at", "description": "Last time the user signed in on the platform", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Date of creation", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Date of update", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "invitation_created_at": {"name": "invitation_created_at", "description": "Users can either register on the platform by themselves or by being invited. If empty, it means the user self-registered. Else it'll give the time the invitation of the user was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "invitation_sent_at": {"name": "invitation_sent_at", "description": "Users can either register on the platform by themselves or by being invited. If empty, it means the user self-registered. Else it'll give the time the invitation of the user was sent", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "invitation_accepted_at": {"name": "invitation_accepted_at", "description": "Users can either register on the platform by themselves or by being invited. If empty, it means the user self-registered. Else it'll give the time the invitation of the user was accepted", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "invited_by_id": {"name": "invited_by_id", "description": "ID of the user that invited that user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "invited_by_type": {"name": "invited_by_type", "description": "Users can either register on the platform by themselves or by being invited. If empty, it means the user self-registered. Else it'll give the type of the inviter (whether an organization, a single user etc.)", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_organization_id": {"name": "decidim_organization_id", "description": "ID of organization to which belong the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "confirmed_at": {"name": "confirmed_at", "description": "Date at which the user confirmed its account. Empty if the account was not confirmed", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "confirmation_token": {"name": "confirmation_token", "description": "Token of account confirmation", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "unconfirmed_email": {"name": "unconfirmed_email", "description": "Whether or not the user has confirmed its email.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "name": {"name": "name", "description": "Name of the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "locale": {"name": "locale", "description": "Language used by the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "deleted_at": {"name": "deleted_at", "description": "A user can choose to delete its account. If empty, it means the user still has an account. If not, it gives the time at which the user deleted it.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "admin": {"name": "admin", "description": "Whether or not the user is administrator of the platform", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "managed": {"name": "managed", "description": "A user can be managed. It means that someone else can participate in its name. This field indicate whether or not the user is managed", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "roles": {"name": "roles", "description": "A user can have different roles inside a Decidim platform. This field list all roles that the user have", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "nickname": {"name": "nickname", "description": "Nickname of the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "accepted_tos_version": {"name": "accepted_tos_version", "description": "When registering on the platform, a user must accept the Terms of Services. These terms can be versionized. This field give the version of the Terms of Services that was accepted", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "type": {"name": "type", "description": "Type of user can be a group, a single person, etc.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "following_count": {"name": "following_count", "description": "Number of resources followed by the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "followers_count": {"name": "followers_count", "description": "Number of people that follows the user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "failed_attempts": {"name": "failed_attempts", "description": "Number of time the user failed to sign in", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "locked_at": {"name": "locked_at", "description": "Datetime at which the user was blocked", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "admin_terms_accepted_at": {"name": "admin_terms_accepted_at", "description": "If the user is an admin, gives the datetime at which he/she accepted the terms of use", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "blocked": {"name": "blocked", "description": "Whether or not the user was blocked", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "blocked_at": {"name": "blocked_at", "description": "Datetime at which the user was blocked. Empty if not blocked", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "confirmed": {"name": "confirmed", "description": "Whether or not the account of the registration of the user was confirmed", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "url": {"name": "url", "description": "URL of the user profile", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "extended_data": {"name": "extended_data", "description": "Decidim stores in this field all data related to the user that doesn't fit into a specific column. Used in multiple Decidim modules to describe the user more precisely. Informations regarding what happens on a page and its associated metrics like visits, time spent, exits, date, url, label.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "is_endorsing": {"name": "is_endorsing", "description": "Indicates if the user .....", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "is_following": {"name": "is_following", "description": "Indicates if the user .....", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "has_authored_comment": {"name": "has_authored_comment", "description": "Indicates if the user has authored a comment", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "has_voted": {"name": "has_voted", "description": "Indicates if the user has voted", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "has_authored_proposal": {"name": "has_authored_proposal", "description": "Indicates if the user has authored a proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "has_answered_survey": {"name": "has_answered_survey", "description": "Indicates if the user has answered a survey", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/users/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.837395, "relation_name": "\"test_lyon\".\"prod\".\"users\"", "raw_code": "WITH endorsements AS (\n SELECT\n decidim_author_id,\n MAX(1) AS is_endorsing\n FROM {{ ref(\"endorsements\") }}\n GROUP BY decidim_author_id\n),\n\ncomments AS (\n SELECT\n decidim_author_id,\n MAX(1) AS has_authored_comment\n FROM {{ ref(\"comments\") }}\n GROUP BY decidim_author_id\n),\n\nforms_answers AS (\n SELECT\n decidim_user_id,\n MAX(1) AS has_answered_survey\n FROM {{ ref(\"forms_answers\") }}\n GROUP BY decidim_user_id\n),\n\nproposal_votes AS (\n SELECT\n decidim_author_id,\n MAX(1) AS has_voted_on_proposal\n FROM {{ ref(\"proposals_votes\") }}\n GROUP BY decidim_author_id\n),\n\nproject_votes AS (\n SELECT\n decidim_user_id,\n MAX(1) AS has_voted_on_project\n FROM {{ ref(\"projects_votes\") }}\n GROUP BY decidim_user_id\n),\n\nparticipations_proposals AS (\n SELECT\n decidim_coauthorships.decidim_author_id,\n MAX(1) AS has_authored_proposal\n FROM {{ ref(\"proposals\") }} AS decidim_proposals_proposals\n JOIN {{ ref(\"stg_decidim_coauthorships\") }} AS decidim_coauthorships\n ON decidim_coauthorships.coauthorable_id = decidim_proposals_proposals.id\n WHERE coauthorable_type = 'Decidim::Proposals::Proposal'\n GROUP BY decidim_coauthorships.decidim_author_id\n),\n\nfollowings AS (\n SELECT DISTINCT decidim_user_id\n FROM {{ ref(\"followings\") }}\n)\n\nSELECT\n decidim_users.id,\n decidim_users.email,\n decidim_users.sign_in_count,\n decidim_users.sign_in_frequency,\n decidim_users.last_sign_in_at,\n decidim_users.created_at,\n decidim_users.updated_at,\n decidim_users.invitation_created_at,\n decidim_users.invitation_sent_at,\n decidim_users.invitation_accepted_at,\n decidim_users.invited_by_id,\n decidim_users.invited_by_type,\n decidim_users.decidim_organization_id,\n decidim_users.confirmed_at,\n decidim_users.confirmation_token,\n decidim_users.unconfirmed_email,\n decidim_users.name,\n decidim_users.locale,\n decidim_users.deleted_at,\n decidim_users.admin,\n decidim_users.managed,\n decidim_users.roles,\n decidim_users.nickname,\n decidim_users.accepted_tos_version,\n decidim_users.type,\n decidim_users.following_count,\n decidim_users.followers_count,\n decidim_users.failed_attempts,\n decidim_users.locked_at,\n decidim_users.admin_terms_accepted_at,\n decidim_users.blocked,\n decidim_users.blocked_at,\n COALESCE(endorsements.is_endorsing, 0)::boolean AS is_endorsing,\n (CASE WHEN followings.decidim_user_id IS NULL THEN false ELSE true END) AS is_following,\n COALESCE(comments.has_authored_comment, 0)::boolean AS has_authored_comment,\n COALESCE(proposal_votes.has_voted_on_proposal, 0)::boolean AS has_voted_on_proposal,\n COALESCE(project_votes.has_voted_on_project, 0)::boolean AS has_voted_on_project,\n COALESCE(participations_proposals.has_authored_proposal, 0)::boolean AS has_authored_proposal,\n COALESCE(forms_answers.has_answered_survey, 0)::boolean AS has_answered_survey,\n decidim_users.confirmed,\n CONCAT('https://', decidim_organizations.host, '/profiles/', decidim_users.nickname, '/activity') AS url,\n decidim_users.extended_data\nFROM {{ ref(\"int_users\") }} AS decidim_users\nLEFT JOIN followings ON followings.decidim_user_id = decidim_users.id\nLEFT JOIN endorsements ON endorsements.decidim_author_id = decidim_users.id\nLEFT JOIN comments ON comments.decidim_author_id = decidim_users.id\nLEFT JOIN forms_answers ON forms_answers.decidim_user_id = decidim_users.id\nLEFT JOIN proposal_votes ON proposal_votes.decidim_author_id = decidim_users.id\nLEFT JOIN project_votes ON project_votes.decidim_user_id = decidim_users.id\nLEFT JOIN participations_proposals ON participations_proposals.decidim_author_id = decidim_users.id\nJOIN {{ ref(\"int_organizations\") }} AS decidim_organizations\n ON decidim_organizations.id = decidim_users.decidim_organization_id", "language": "sql", "refs": [{"name": "endorsements", "package": null, "version": null}, {"name": "comments", "package": null, "version": null}, {"name": "forms_answers", "package": null, "version": null}, {"name": "proposals_votes", "package": null, "version": null}, {"name": "projects_votes", "package": null, "version": null}, {"name": "proposals", "package": null, "version": null}, {"name": "stg_decidim_coauthorships", "package": null, "version": null}, {"name": "followings", "package": null, "version": null}, {"name": "int_users", "package": null, "version": null}, {"name": "int_organizations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.endorsements", "model.demo.comments", "model.demo.forms_answers", "model.demo.proposals_votes", "model.demo.projects_votes", "model.demo.proposals", "model.demo.stg_decidim_coauthorships", "model.demo.followings", "model.demo.int_users", "model.demo.int_organizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.budgets": {"database": "test_lyon", "schema": "prod", "name": "budgets", "resource_type": "model", "package_name": "demo", "path": "marts/budgets/budgets.sql", "original_file_path": "models/marts/budgets/budgets.sql", "unique_id": "model.demo.budgets", "fqn": ["demo", "marts", "budgets", "budgets"], "alias": "budgets", "checksum": {"name": "sha256", "checksum": "0b413c401e389f7970fff98b95a83345d5ce8fbcd68783b96a6c1b3802eaca8c"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.6055381, "relation_name": "\"test_lyon\".\"prod\".\"budgets\"", "raw_code": "SELECT\n decidim_budgets_budgets.id,\n decidim_budgets_budgets.title,\n decidim_components.id AS decidim_component_id,\n decidim_components.ps_url AS url,\n decidim_components.ps_slug,\n decidim_components.ps_title\nFROM {{ ref (\"stg_decidim_budgets\")}} AS decidim_budgets_budgets\nJOIN {{ ref(\"components\")}} AS decidim_components on decidim_components.id = decidim_budgets_budgets.decidim_component_id", "language": "sql", "refs": [{"name": "stg_decidim_budgets", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_budgets", "model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.projects_votes": {"database": "test_lyon", "schema": "prod", "name": "projects_votes", "resource_type": "model", "package_name": "demo", "path": "marts/budgets/projects_votes.sql", "original_file_path": "models/marts/budgets/projects_votes.sql", "unique_id": "model.demo.projects_votes", "fqn": ["demo", "marts", "budgets", "projects_votes"], "alias": "projects_votes", "checksum": {"name": "sha256", "checksum": "4ac28e3d1f9ad333a96548c7173455a2eadc05f2d645c9e5021074e50973fc33"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["decidim_user_id"], "type": "btree"}]}, "tags": [], "description": "Splits budgets orders (i.e. votes) on a per-project basis", "columns": {"order_id": {"name": "order_id", "description": "ID of the budget order through which the vote has been issued", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/budgets/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["decidim_user_id"], "type": "btree"}]}, "created_at": 1727441769.842602, "relation_name": "\"test_lyon\".\"prod\".\"projects_votes\"", "raw_code": "-- /!\\ Warning : counts unfinished votes !\n-- /!\\ Warning : should be filtered on the corresponding budget to get the good values\n\n{{ config(\n indexes=[\n {'columns': ['decidim_user_id'], 'type': 'btree'},\n ]\n)}}\n\nWITH budgets_projects AS (\n SELECT\n decidim_budgets_line_items.decidim_order_id,\n decidim_budgets_projects.id AS \"project_id\",\n decidim_budgets_projects.title AS \"project_title\",\n decidim_budgets_projects.decidim_component_id,\n decidim_budgets_projects.project_url\n from {{ ref(\"stg_decidim_budgets_line_items\")}} AS decidim_budgets_line_items\n JOIN {{ ref(\"budgets_projects\")}} decidim_budgets_projects on decidim_budgets_projects.id = decidim_budgets_line_items.decidim_project_id\n)\n SELECT\n decidim_budgets_orders.id as order_id,\n decidim_budgets_orders.decidim_user_id,\n budgets_projects.project_id,\n budgets_projects.project_title,\n budgets_projects.decidim_component_id,\n decidim_budgets_orders.created_at,\n decidim_budgets_orders.checked_out_at,\n budgets_projects.project_url,\n decidim_budgets_orders.vote_finished,\n decidim_budgets_orders.decidim_budgets_budget_id\n from {{ ref(\"int_budgets_orders\")}} AS decidim_budgets_orders\n LEFT JOIN budgets_projects on decidim_order_id = decidim_budgets_orders.id", "language": "sql", "refs": [{"name": "stg_decidim_budgets_line_items", "package": null, "version": null}, {"name": "budgets_projects", "package": null, "version": null}, {"name": "int_budgets_orders", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_budgets_line_items", "model.demo.budgets_projects", "model.demo.int_budgets_orders"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.budgets_projects": {"database": "test_lyon", "schema": "prod", "name": "budgets_projects", "resource_type": "model", "package_name": "demo", "path": "marts/budgets/budgets_projects.sql", "original_file_path": "models/marts/budgets/budgets_projects.sql", "unique_id": "model.demo.budgets_projects", "fqn": ["demo", "marts", "budgets", "budgets_projects"], "alias": "budgets_projects", "checksum": {"name": "sha256", "checksum": "c7b4a0bec11b0ab5b0be3811ef287b4b609763be2ed58ac7bb6149e67b1f5d40"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.6078908, "relation_name": "\"test_lyon\".\"prod\".\"budgets_projects\"", "raw_code": "WITH categorizations AS (\n {{ categorizations_filter('Decidim::Budgets::Project') }}\n)\nSELECT\n decidim_budgets_projects.id, \n decidim_budgets_projects.title,\n decidim_budgets_projects.description,\n decidim_budgets_projects.created_at,\n decidim_budgets_projects.decidim_scope_id, \n decidim_budgets_projects.project_amount,\n decidim_budgets_projects.selected_at,\n decidim_budgets_projects.is_selected,\n decidim_budgets_budgets.id AS budget_id,\n decidim_budgets_budgets.title AS budget_title,\n decidim_budgets_projects.resource_type,\n decidim_budgets_budgets.decidim_component_id,\n concat(decidim_components.component_url,'/', decidim_components.manifest_name,'/', decidim_budgets_budgets.id, '/projects/', decidim_budgets_projects.id) AS project_url,\n categorizations.categories,\n coalesce(categorizations.categories[1], 'Sans cat\u00e9gorie') AS first_category,\n categorizations.sub_categories,\n coalesce(categorizations.sub_categories[1], 'Sans sous-cat\u00e9gorie') AS first_sub_category\nFROM {{ ref(\"int_budgets_projects\")}} AS decidim_budgets_projects\nJOIN {{ ref(\"stg_decidim_budgets\")}} AS decidim_budgets_budgets on decidim_budgets_budgets.id = decidim_budgets_projects.decidim_budgets_budget_id\nJOIN {{ ref(\"components\")}} as decidim_components on decidim_components.id = decidim_budgets_budgets.decidim_component_id\nLEFT JOIN categorizations on categorizations.categorizable_id = decidim_budgets_projects.id", "language": "sql", "refs": [{"name": "categorizations", "package": null, "version": null}, {"name": "int_budgets_projects", "package": null, "version": null}, {"name": "stg_decidim_budgets", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.demo.categorizations_filter"], "nodes": ["model.demo.categorizations", "model.demo.int_budgets_projects", "model.demo.stg_decidim_budgets", "model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.meetings": {"database": "test_lyon", "schema": "prod", "name": "meetings", "resource_type": "model", "package_name": "demo", "path": "marts/meetings/meetings.sql", "original_file_path": "models/marts/meetings/meetings.sql", "unique_id": "model.demo.meetings", "fqn": ["demo", "marts", "meetings", "meetings"], "alias": "meetings", "checksum": {"name": "sha256", "checksum": "efbcbe041d4488a47f867de0bbe43c4297d86e1b8ee0da21f9ee6c6898ea1f7b"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Every meeting published on the platform", "columns": {"id": {"name": "id", "description": "The unique identifier for a meeting", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/meetings/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.843044, "relation_name": "\"test_lyon\".\"prod\".\"meetings\"", "raw_code": "WITH categorizations AS (\n {{ categorizations_filter('Decidim::Meetings::Meeting') }}\n)\nSELECT\n decidim_meetings_meetings.id,\n decidim_meetings_meetings.title,\n decidim_meetings_meetings.description,\n decidim_meetings_meetings.address,\n decidim_meetings_meetings.attendees_count,\n decidim_meetings_meetings.created_at,\n decidim_meetings_meetings.decidim_scope_id,\n decidim_meetings_meetings.decidim_component_id,\n decidim_meetings_meetings.start_time,\n decidim_meetings_meetings.end_time,\n decidim_meetings_meetings.registration_url,\n decidim_meetings_meetings.type_of_meeting, \n decidim_meetings_meetings.translated_type_of_meeting,\n decidim_meetings_meetings.private_meeting,\n decidim_meetings_meetings.decidim_author_id,\n decidim_meetings_meetings.resource_type,\n concat(\n 'https://',\n decidim_components.organization_host,\n '/',\n decidim_components.ps_space_type_slug,\n '/',\n decidim_components.ps_slug,\n '/f/',\n decidim_meetings_meetings.decidim_component_id,\n '/meetings/',\n decidim_meetings_meetings.id\n ) AS meeting_url,\n categorizations.categories,\n coalesce(categorizations.categories[1], 'Sans cat\u00e9gorie') AS first_category,\n categorizations.sub_categories,\n coalesce(categorizations.sub_categories[1], 'Sans sous-cat\u00e9gorie') AS first_sub_category\nFROM {{ ref(\"int_meetings\")}} AS decidim_meetings_meetings\nJOIN {{ ref(\"components\")}} decidim_components on decidim_components.id = decidim_component_id\nLEFT JOIN categorizations on categorizations.categorizable_id = decidim_meetings_meetings.id\nwhere manifest_name like 'meetings'", "language": "sql", "refs": [{"name": "categorizations", "package": null, "version": null}, {"name": "int_meetings", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.demo.categorizations_filter"], "nodes": ["model.demo.categorizations", "model.demo.int_meetings", "model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.proposals_votes": {"database": "test_lyon", "schema": "prod", "name": "proposals_votes", "resource_type": "model", "package_name": "demo", "path": "marts/proposals/proposals_votes.sql", "original_file_path": "models/marts/proposals/proposals_votes.sql", "unique_id": "model.demo.proposals_votes", "fqn": ["demo", "marts", "proposals", "proposals_votes"], "alias": "proposals_votes", "checksum": {"name": "sha256", "checksum": "02f65fdd9ddb319ae31747796af6f0827b3094aaedf6c6223e68d4080499793b"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"type": "btree", "columns": ["decidim_author_id"]}]}, "tags": [], "description": "Every vote made on propositions", "columns": {"decidim_author_id": {"name": "decidim_author_id", "description": "id of the user who has voted", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_proposal_id": {"name": "decidim_proposal_id", "description": "id of the proposal for which has been voted for", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/proposals/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"type": "btree", "columns": ["decidim_author_id"]}]}, "created_at": 1727441769.8469949, "relation_name": "\"test_lyon\".\"prod\".\"proposals_votes\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_author_id'], 'type': 'btree'},\n ]\n)}}\n\nSELECT\n proposals_votes.id,\n proposals_votes.created_at,\n proposals_votes.decidim_author_id,\n proposals_votes.decidim_proposal_id,\n proposals.decidim_component_id,\n proposals.title AS proposal_title,\n proposals.url AS proposal_url\nFROM {{ ref(\"stg_decidim_proposals_votes\")}} AS proposals_votes\nJOIN {{ ref(\"proposals\")}} AS proposals on proposals_votes.decidim_proposal_id = proposals.id", "language": "sql", "refs": [{"name": "stg_decidim_proposals_votes", "package": null, "version": null}, {"name": "proposals", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_proposals_votes", "model.demo.proposals"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.proposals": {"database": "test_lyon", "schema": "prod", "name": "proposals", "resource_type": "model", "package_name": "demo", "path": "marts/proposals/proposals.sql", "original_file_path": "models/marts/proposals/proposals.sql", "unique_id": "model.demo.proposals", "fqn": ["demo", "marts", "proposals", "proposals"], "alias": "proposals", "checksum": {"name": "sha256", "checksum": "090e535cad1a4675179cdd488dc186ba314bb1a4e89cfe9466416161c32ac832"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}, {"columns": ["resource_type"], "type": "btree"}]}, "tags": [], "description": "Every proposal that has been created on your Decidim instance, including accepted, pending, rejected and withdrawn proposals. Does not include hidden (moderation) and unpublished proposals (i.e. linked to either an unpublished participatory process or an unpublished component).", "columns": {"id": {"name": "id", "description": "Unique identifier for the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_participatory_space_id": {"name": "decidim_participatory_space_id", "description": "Identifier for the participatory space where the proposal was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_participatory_space_slug": {"name": "decidim_participatory_space_slug", "description": "Slug for the participatory space where the proposal was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_scope_name": {"name": "decidim_scope_name", "description": "Name of the scope for the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "title": {"name": "title", "description": "Title of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "body": {"name": "body", "description": "Body text of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "resource_type": {"name": "resource_type", "description": "Type of the resource, typically 'Decidim::Proposals::Proposal'", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "url": {"name": "url", "description": "URL link to the proposal on the Decidim platform", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_component_id": {"name": "decidim_component_id", "description": "Identifier for the component within which the proposal was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the proposal was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "published_at": {"name": "published_at", "description": "Timestamp when the proposal was published", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "state": {"name": "state", "description": "Current state of the proposal (e.g., evaluating, rejected, accepted)", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "translated_state": {"name": "translated_state", "description": "Human-readable translated state of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "authors_ids": {"name": "authors_ids", "description": "Array of IDs of the authors of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "first_author_id": {"name": "first_author_id", "description": "ID of the first author of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "address": {"name": "address", "description": "Address related to the proposal, if any", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "categories": {"name": "categories", "description": "Array of categories associated with the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "first_category": {"name": "first_category", "description": "First category associated with the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "sub_categories": {"name": "sub_categories", "description": "Array of sub-categories associated with the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "first_sub_category": {"name": "first_sub_category", "description": "First sub-category associated with the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "comments_count": {"name": "comments_count", "description": "Number of comments on the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "endorsements_count": {"name": "endorsements_count", "description": "Number of endorsements on the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "votes_count": {"name": "votes_count", "description": "Number of votes the proposal has received", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/marts/proposals/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}, {"columns": ["resource_type"], "type": "btree"}]}, "created_at": 1727441769.846499, "relation_name": "\"test_lyon\".\"prod\".\"proposals\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n {'columns': ['resource_type'], 'type': 'btree'}\n ]\n)}}\n\nWITH coauthorships AS (\n SELECT \n array_agg(decidim_users.id) AS authors_ids,\n decidim_coauthorships.coauthorable_id \n FROM {{ ref(\"int_users\")}} AS decidim_users \n JOIN {{ ref(\"stg_decidim_coauthorships\")}} AS decidim_coauthorships on decidim_users.id = decidim_coauthorships.decidim_author_id\n WHERE coauthorable_type = 'Decidim::Proposals::Proposal'\n GROUP BY coauthorable_id\n), \ncategorizations AS (\n {{ categorizations_filter('Decidim::Proposals::Proposal') }}\n),\nvotes AS (\n SELECT\n decidim_proposal_id,\n COUNT(id) AS votes_count\n FROM {{ ref(\"stg_decidim_proposals_votes\")}}\n GROUP BY decidim_proposal_id\n),\nproposals AS (\n SELECT\n decidim_proposals.id,\n decidim_components.ps_id AS decidim_participatory_space_id,\n decidim_components.ps_slug AS decidim_participatory_space_slug,\n decidim_scopes.name AS decidim_scope_name,\n decidim_proposals.title,\n decidim_proposals.body,\n decidim_proposals.resource_type,\n concat('https://', decidim_components.organization_host, '/', decidim_components.ps_space_type_slug, '/', decidim_components.ps_slug, '/f/', decidim_proposals.decidim_component_id, '/proposals/', decidim_proposals.id) AS url,\n decidim_proposals.decidim_component_id,\n decidim_proposals.created_at,\n decidim_proposals.published_at,\n decidim_proposals.state,\n decidim_proposals.translated_state,\n coauthorships.authors_ids,\n COALESCE(coauthorships.authors_ids[1], -1) AS first_author_id,\n decidim_proposals.address,\n categorizations.categories,\n COALESCE(categorizations.categories[1], 'Sans cat\u00e9gorie') AS first_category,\n categorizations.sub_categories,\n COALESCE(categorizations.sub_categories[1], 'Sans sous-cat\u00e9gorie') AS first_sub_category,\n decidim_proposals.comments_count,\n decidim_proposals.endorsements_count,\n COALESCE(votes.votes_count,0) AS votes_count\n FROM {{ ref(\"int_proposals\")}} AS decidim_proposals\n JOIN {{ ref(\"components\")}} AS decidim_components ON decidim_components.id = decidim_component_id\n LEFT JOIN coauthorships ON decidim_proposals.id = coauthorships.coauthorable_id\n LEFT JOIN {{ ref(\"stg_decidim_moderations\")}} AS decidim_moderations\n ON decidim_moderations.decidim_reportable_id = decidim_proposals.id\n AND decidim_moderations.decidim_reportable_type = 'Decidim::Proposals::Proposal'\n LEFT JOIN {{ ref(\"int_scopes\")}} AS decidim_scopes ON decidim_scopes.id = decidim_proposals.decidim_scope_id\n LEFT JOIN votes ON decidim_proposals.id = votes.decidim_proposal_id\n LEFT JOIN categorizations ON categorizations.categorizable_id = decidim_proposals.id\n WHERE decidim_moderations.hidden_at IS NULL\n AND decidim_proposals.published_at IS NOT NULL\n AND (decidim_proposals.state NOT LIKE '%withdrawn' OR decidim_proposals.state IS NULL)\n)\n\nSELECT * FROM proposals", "language": "sql", "refs": [{"name": "int_users", "package": null, "version": null}, {"name": "stg_decidim_coauthorships", "package": null, "version": null}, {"name": "categorizations", "package": null, "version": null}, {"name": "stg_decidim_proposals_votes", "package": null, "version": null}, {"name": "int_proposals", "package": null, "version": null}, {"name": "components", "package": null, "version": null}, {"name": "stg_decidim_moderations", "package": null, "version": null}, {"name": "int_scopes", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.demo.categorizations_filter"], "nodes": ["model.demo.int_users", "model.demo.stg_decidim_coauthorships", "model.demo.categorizations", "model.demo.stg_decidim_proposals_votes", "model.demo.int_proposals", "model.demo.components", "model.demo.stg_decidim_moderations", "model.demo.int_scopes"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_organizations": {"database": "test_lyon", "schema": "prod", "name": "int_organizations", "resource_type": "model", "package_name": "demo", "path": "intermediate/organizations/int_organizations.sql", "original_file_path": "models/intermediate/organizations/int_organizations.sql", "unique_id": "model.demo.int_organizations", "fqn": ["demo", "intermediate", "organizations", "int_organizations"], "alias": "int_organizations", "checksum": {"name": "sha256", "checksum": "427ba5c6ba0c669374062a3bad93f93f09d2b2c9e911cb3df108ea01a13d4be0"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}]}, "tags": [], "description": "A staging model for Decidim organizations", "columns": {"id": {"name": "id", "description": "Unique identifier for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "name": {"name": "name", "description": "Name of the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "host": {"name": "host", "description": "Host URL for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "default_locale": {"name": "default_locale", "description": "Default locale for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "available_locales": {"name": "available_locales", "description": "List of available locales for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the organization was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "description": {"name": "description", "description": "Description of the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "secondary_hosts": {"name": "secondary_hosts", "description": "Secondary hosts for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "available_authorizations": {"name": "available_authorizations", "description": "List of available authorizations for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "header_snippets": {"name": "header_snippets", "description": "Header snippets for the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "tos_version": {"name": "tos_version", "description": "Version of the terms of service", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "badges_enabled": {"name": "badges_enabled", "description": "Indicates if badges are enabled. Badges in Decidim recognize participant actions and progress, enhancing engagement through gamification.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "send_welcome_notification": {"name": "send_welcome_notification", "description": "Flag indicating if welcome notifications are sent", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "users_registration_mode": {"name": "users_registration_mode", "description": "Mode of user registration", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "time_zone": {"name": "time_zone", "description": "Time zone of the organization", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/intermediate/organizations/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}]}, "created_at": 1727441769.8527172, "relation_name": "\"test_lyon\".\"prod\".\"int_organizations\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n ]\n)}}\n\n\nWITH source AS (\n SELECT * FROM {{ ref (\"stg_decidim_organizations\")}}\n),\nrenamed AS (\n SELECT\n id,\n name,\n host,\n default_locale,\n available_locales,\n created_at,\n regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description,\n secondary_hosts,\n available_authorizations,\n header_snippets,\n tos_version,\n badges_enabled,\n send_welcome_notification,\n users_registration_mode,\n time_zone\n FROM source\n WHERE host = '{{ env_var('PARTICIPATION_HOST_NAME') }}'\n -- Assumption: There is only one organization, so we select the first available host\n LIMIT 1\n)\nSELECT * FROM renamed", "language": "sql", "refs": [{"name": "stg_decidim_organizations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_organizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.answers_file": {"database": "test_lyon", "schema": "prod", "name": "answers_file", "resource_type": "model", "package_name": "demo", "path": "intermediate/forms/answers_file.sql", "original_file_path": "models/intermediate/forms/answers_file.sql", "unique_id": "model.demo.answers_file", "fqn": ["demo", "intermediate", "forms", "answers_file"], "alias": "answers_file", "checksum": {"name": "sha256", "checksum": "0546b730d1ed65433b1cdaab4a32e5d837cb0587ae8bde6b4f32fb4a16c24c54"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"type": "btree", "columns": ["decidim_questionnaire_id"]}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"type": "btree", "columns": ["decidim_questionnaire_id"]}]}, "created_at": 1727441769.623206, "relation_name": "\"test_lyon\".\"prod\".\"answers_file\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_questionnaire_id'], 'type': 'btree'},\n ]\n)}}\n\nWITH org AS (\n -- Assumption: There is only one organization, so we select the first available host\n SELECT host\n FROM {{ ref('organizations') }}\n LIMIT 1\n)\nSELECT DISTINCT\n decidim_forms_answers.decidim_user_id,\n decidim_forms_answers.session_token,\n decidim_forms_answers.ip_hash,\n decidim_forms_questions.question_type,\n decidim_forms_questions.position AS \"position\",\n decidim_attachments.file AS \"answer\",\n '' AS \"sub_matrix_question\",\n CONCAT('https://', org.host, '/uploads/decidim/attachment/file/', decidim_attachments.id, '/', decidim_attachments.file) AS custom_body,\n -1 AS sorting_position,\n decidim_forms_questions.decidim_questionnaire_id,\n decidim_forms_questions.body,\n decidim_forms_answers.created_at,\n decidim_forms_answers.author_status\nFROM {{ ref('int_forms_answers') }} decidim_forms_answers\nJOIN {{ ref('stg_decidim_forms_questions') }} AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id\nJOIN {{ ref('stg_decidim_attachments') }} decidim_attachments ON decidim_attachments.attached_to_id = decidim_forms_answers.id\nCROSS JOIN org\nWHERE attached_to_type = 'Decidim::Forms::Answer'", "language": "sql", "refs": [{"name": "organizations", "package": null, "version": null}, {"name": "int_forms_answers", "package": null, "version": null}, {"name": "stg_decidim_forms_questions", "package": null, "version": null}, {"name": "stg_decidim_attachments", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.organizations", "model.demo.int_forms_answers", "model.demo.stg_decidim_forms_questions", "model.demo.stg_decidim_attachments"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.answers_option_and_sorting": {"database": "test_lyon", "schema": "prod", "name": "answers_option_and_sorting", "resource_type": "model", "package_name": "demo", "path": "intermediate/forms/answers_option_and_sorting.sql", "original_file_path": "models/intermediate/forms/answers_option_and_sorting.sql", "unique_id": "model.demo.answers_option_and_sorting", "fqn": ["demo", "intermediate", "forms", "answers_option_and_sorting"], "alias": "answers_option_and_sorting", "checksum": {"name": "sha256", "checksum": "a6c8be435c9adf60421f3d7b63da0338432abac9a04e4a3e4f0751e748e880a0"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["decidim_questionnaire_id"], "type": "btree"}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["decidim_questionnaire_id"], "type": "btree"}]}, "created_at": 1727441769.624459, "relation_name": "\"test_lyon\".\"prod\".\"answers_option_and_sorting\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_questionnaire_id'], 'type': 'btree'},\n ]\n)}}\n\nSELECT DISTINCT\n decidim_forms_answers.decidim_user_id,\n decidim_forms_answers.session_token,\n decidim_forms_answers.ip_hash,\n decidim_forms_questions.question_type,\n decidim_forms_questions.position AS question_position,\n decidim_forms_answer_choices.body::text AS \"answer\",\n '' AS sub_matrix_question,\n COALESCE(decidim_forms_answer_choices.custom_body, '') AS custom_body,\n (CASE question_type WHEN 'sorting' THEN decidim_forms_answer_choices.position ELSE -1 END) AS sorting_position,\n decidim_forms_questions.decidim_questionnaire_id,\n decidim_forms_questions.body,\n decidim_forms_answers.created_at,\n decidim_forms_answers.author_status\nFROM {{ ref('int_forms_answers') }} decidim_forms_answers\nJOIN {{ ref('stg_decidim_forms_questions') }} AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id\nJOIN {{ ref('stg_decidim_forms_answer_choices') }} decidim_forms_answer_choices ON decidim_forms_answer_choices.decidim_answer_id = decidim_forms_answers.id\nWHERE question_type = ANY('{single_option, multiple_option, sorting}'::text[])", "language": "sql", "refs": [{"name": "int_forms_answers", "package": null, "version": null}, {"name": "stg_decidim_forms_questions", "package": null, "version": null}, {"name": "stg_decidim_forms_answer_choices", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.int_forms_answers", "model.demo.stg_decidim_forms_questions", "model.demo.stg_decidim_forms_answer_choices"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.answers_matrix": {"database": "test_lyon", "schema": "prod", "name": "answers_matrix", "resource_type": "model", "package_name": "demo", "path": "intermediate/forms/answers_matrix.sql", "original_file_path": "models/intermediate/forms/answers_matrix.sql", "unique_id": "model.demo.answers_matrix", "fqn": ["demo", "intermediate", "forms", "answers_matrix"], "alias": "answers_matrix", "checksum": {"name": "sha256", "checksum": "e0edf6477ef36c34189c0498ead937aed57124c071d2f1ab6f5e0c65f50deb42"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"type": "btree", "columns": ["decidim_questionnaire_id"]}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"type": "btree", "columns": ["decidim_questionnaire_id"]}]}, "created_at": 1727441769.62566, "relation_name": "\"test_lyon\".\"prod\".\"answers_matrix\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_questionnaire_id'], 'type': 'btree'},\n ]\n)}}\n\nSELECT DISTINCT\n decidim_forms_answers.decidim_user_id,\n decidim_forms_answers.session_token,\n decidim_forms_answers.ip_hash,\n decidim_forms_questions.question_type,\n decidim_forms_questions.position AS \"position\",\n decidim_forms_answer_choices.body::text AS \"answer\",\n decidim_forms_question_matrix_rows.body AS sub_matrix_question,\n '' AS custom_body,\n -1 AS sorting_position,\n decidim_forms_questions.decidim_questionnaire_id,\n decidim_forms_questions.body,\n decidim_forms_answers.created_at,\n decidim_forms_answers.author_status\nFROM {{ ref('int_forms_answers') }} decidim_forms_answers\nJOIN {{ ref('stg_decidim_forms_questions') }} AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id\nJOIN {{ ref('stg_decidim_forms_answer_choices') }} decidim_forms_answer_choices ON decidim_forms_answer_choices.decidim_answer_id = decidim_forms_answers.id\nJOIN {{ ref('stg_decidim_forms_question_matrix_rows') }} decidim_forms_question_matrix_rows ON decidim_forms_question_matrix_rows.id = decidim_forms_answer_choices.decidim_question_matrix_row_id\nWHERE question_type = ANY('{matrix_single, matrix_multiple}'::text[])", "language": "sql", "refs": [{"name": "int_forms_answers", "package": null, "version": null}, {"name": "stg_decidim_forms_questions", "package": null, "version": null}, {"name": "stg_decidim_forms_answer_choices", "package": null, "version": null}, {"name": "stg_decidim_forms_question_matrix_rows", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.int_forms_answers", "model.demo.stg_decidim_forms_questions", "model.demo.stg_decidim_forms_answer_choices", "model.demo.stg_decidim_forms_question_matrix_rows"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.answers_short_and_long_answer": {"database": "test_lyon", "schema": "prod", "name": "answers_short_and_long_answer", "resource_type": "model", "package_name": "demo", "path": "intermediate/forms/answers_short_and_long_answer.sql", "original_file_path": "models/intermediate/forms/answers_short_and_long_answer.sql", "unique_id": "model.demo.answers_short_and_long_answer", "fqn": ["demo", "intermediate", "forms", "answers_short_and_long_answer"], "alias": "answers_short_and_long_answer", "checksum": {"name": "sha256", "checksum": "4243913982485ea514a9fde9fa70cdeccd9f17ad77050b2fc65146042950333a"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["decidim_questionnaire_id"], "type": "btree"}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["decidim_questionnaire_id"], "type": "btree"}]}, "created_at": 1727441769.626914, "relation_name": "\"test_lyon\".\"prod\".\"answers_short_and_long_answer\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['decidim_questionnaire_id'], 'type': 'btree'},\n ]\n)}}\n\nSELECT\n decidim_user_id,\n session_token,\n ip_hash,\n question_type,\n position,\n COALESCE(NULLIF(decidim_forms_answers.body,''), 'Pas de r\u00e9ponse') AS \"answer\",\n '' AS sub_matrix_question,\n '' AS custom_body,\n -1 AS sorting_position,\n decidim_forms_questions.decidim_questionnaire_id,\n decidim_forms_questions.body,\n decidim_forms_answers.created_at,\n decidim_forms_answers.author_status\nFROM {{ ref('int_forms_answers') }} decidim_forms_answers\nJOIN {{ ref('stg_decidim_forms_questions') }} AS decidim_forms_questions ON decidim_forms_questions.id = decidim_forms_answers.decidim_question_id\nWHERE question_type = ANY('{short_answer,long_answer}'::text[])", "language": "sql", "refs": [{"name": "int_forms_answers", "package": null, "version": null}, {"name": "stg_decidim_forms_questions", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.int_forms_answers", "model.demo.stg_decidim_forms_questions"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_forms_answers": {"database": "test_lyon", "schema": "prod", "name": "int_forms_answers", "resource_type": "model", "package_name": "demo", "path": "intermediate/forms/int_forms_answers.sql", "original_file_path": "models/intermediate/forms/int_forms_answers.sql", "unique_id": "model.demo.int_forms_answers", "fqn": ["demo", "intermediate", "forms", "int_forms_answers"], "alias": "int_forms_answers", "checksum": {"name": "sha256", "checksum": "f3bb33340aa78ba8eaf0355577fd471b6ab835dc8aab0831ccd5f74fb70fc975"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}, {"type": "btree", "columns": ["decidim_question_id"]}]}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}, {"type": "btree", "columns": ["decidim_question_id"]}]}, "created_at": 1727441769.62815, "relation_name": "\"test_lyon\".\"prod\".\"int_forms_answers\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n {'columns': ['decidim_question_id'], 'type': 'btree'},\n ]\n)}}\n\nSELECT\n id,\n body,\n decidim_user_id,\n decidim_questionnaire_id,\n decidim_question_id,\n created_at,\n (CASE\n WHEN decidim_user_id IS NULL THEN 'Non connect\u00e9'\n ELSE 'Inscrit et connect\u00e9'\n END\n ) AS author_status,\n updated_at,\n session_token,\n ip_hash\nFROM {{ ref(\"stg_decidim_forms_answers\")}}", "language": "sql", "refs": [{"name": "stg_decidim_forms_answers", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_forms_answers"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_components": {"database": "test_lyon", "schema": "prod", "name": "int_components", "resource_type": "model", "package_name": "demo", "path": "intermediate/components/int_components.sql", "original_file_path": "models/intermediate/components/int_components.sql", "unique_id": "model.demo.int_components", "fqn": ["demo", "intermediate", "components", "int_components"], "alias": "int_components", "checksum": {"name": "sha256", "checksum": "33411b41c132dac10318196d6fa8e3ecce4fd974587aaa5f74347e03fbc8829f"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "An intermediate model representing the components associated with participatory spaces in Decidim.", "columns": {"id": {"name": "id", "description": "The ID of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "manifest_name": {"name": "manifest_name", "description": "The original manifest name of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "translated_manifest_name": {"name": "translated_manifest_name", "description": "The translated manifest name based on predefined mappings for Metabase usage ", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "name": {"name": "name", "description": "The name of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "participatory_space_id": {"name": "participatory_space_id", "description": "The ID of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "participatory_space_type": {"name": "participatory_space_type", "description": "The type of the participatory space.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "settings": {"name": "settings", "description": "The settings of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "weight": {"name": "weight", "description": "The weight of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "permissions": {"name": "permissions", "description": "The permissions of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "published_at": {"name": "published_at", "description": "The publish date of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "The creation date of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "The last update date of the component.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/intermediate/components/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.8612149, "relation_name": "\"test_lyon\".\"prod\".\"int_components\"", "raw_code": "SELECT\n decidim_components.id,\n decidim_components.manifest_name,\n -- For Metabase usage, we translate the name in French\n (CASE decidim_components.manifest_name\n WHEN 'accountability' THEN 'Suivi'\n WHEN 'pages' THEN 'Page'\n WHEN 'budgets' THEN 'Budgets'\n WHEN 'meetings' THEN 'Rencontres'\n WHEN 'proposals' THEN 'Propositions'\n WHEN 'surveys' THEN 'Enqu\u00eates'\n WHEN 'blogs' THEN 'Blogs'\n ELSE decidim_components.manifest_name\n END\n ) AS translated_manifest_name,\n decidim_components.name,\n decidim_components.participatory_space_id,\n decidim_components.participatory_space_type,\n decidim_components.settings,\n decidim_components.weight,\n decidim_components.permissions,\n decidim_components.published_at,\n decidim_components.created_at,\n decidim_components.updated_at\n FROM {{ ref (\"stg_decidim_components\")}} as decidim_components", "language": "sql", "refs": [{"name": "stg_decidim_components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_users": {"database": "test_lyon", "schema": "prod", "name": "int_users", "resource_type": "model", "package_name": "demo", "path": "intermediate/users/int_users.sql", "original_file_path": "models/intermediate/users/int_users.sql", "unique_id": "model.demo.int_users", "fqn": ["demo", "intermediate", "users", "int_users"], "alias": "int_users", "checksum": {"name": "sha256", "checksum": "bb725e225fa3e67f74f6e98804916fe5d20c30416b506833ceb1f771fe74b5f7"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}]}, "tags": [], "description": "", "columns": {"id": {"name": "id", "description": "The unique identifier for a user", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "email": {"name": "email", "description": "The user's email address", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "nickname": {"name": "nickname", "description": "The user's nickname", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/intermediate/users/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}]}, "created_at": 1727441769.86358, "relation_name": "\"test_lyon\".\"prod\".\"int_users\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n ]\n)}}\n\nSELECT\n decidim_users.id,\n decidim_users.email,\n decidim_users.sign_in_count,\n (CASE\n WHEN decidim_users.sign_in_count = 0 THEN 'Jamais'\n WHEN decidim_users.sign_in_count = 1 THEN 'Une seule fois'\n WHEN decidim_users.sign_in_count = 2 THEN 'Deux fois'\n WHEN decidim_users.sign_in_count BETWEEN 2 AND 10 THEN 'Entre 2 et 10 fois'\n ELSE 'Plus de 10 fois'\n END\n ) AS sign_in_frequency,\n decidim_users.last_sign_in_at,\n decidim_users.created_at,\n decidim_users.updated_at,\n decidim_users.invitation_created_at,\n decidim_users.invitation_sent_at,\n decidim_users.invitation_accepted_at,\n decidim_users.invited_by_id,\n decidim_users.invited_by_type,\n decidim_users.decidim_organization_id,\n decidim_users.confirmed_at,\n decidim_users.confirmation_token,\n decidim_users.unconfirmed_email,\n decidim_users.name,\n decidim_users.locale,\n decidim_users.deleted_at,\n decidim_users.admin,\n decidim_users.managed,\n decidim_users.roles,\n decidim_users.nickname,\n decidim_users.accepted_tos_version,\n decidim_users.type,\n decidim_users.following_count,\n decidim_users.followers_count,\n decidim_users.failed_attempts,\n decidim_users.locked_at,\n decidim_users.admin_terms_accepted_at,\n decidim_users.blocked,\n decidim_users.blocked_at,\n (CASE WHEN decidim_users.confirmed_at IS NULL THEN false ELSE true END) AS confirmed,\n decidim_users.extended_data\nFROM {{ ref (\"stg_decidim_users\")}} as decidim_users\n WHERE deleted_at IS NULL\n AND type LIKE 'Decidim::User'", "language": "sql", "refs": [{"name": "stg_decidim_users", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_budgets_projects": {"database": "test_lyon", "schema": "prod", "name": "int_budgets_projects", "resource_type": "model", "package_name": "demo", "path": "intermediate/budgets/int_budgets_projects.sql", "original_file_path": "models/intermediate/budgets/int_budgets_projects.sql", "unique_id": "model.demo.int_budgets_projects", "fqn": ["demo", "intermediate", "budgets", "int_budgets_projects"], "alias": "int_budgets_projects", "checksum": {"name": "sha256", "checksum": "6a6b85bc8272a54383966503a6ac5050d3b4be3e20c41fa303a47769ba3f0a77"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.631509, "relation_name": "\"test_lyon\".\"prod\".\"int_budgets_projects\"", "raw_code": "SELECT\n id, \n title,\n description,\n created_at,\n decidim_scope_id, \n project_amount,\n selected_at,\n decidim_budgets_budget_id,\n resource_type,\n (CASE\n WHEN selected_at IS NULL\n THEN false\n ELSE true\n END) AS is_selected\nFROM {{ ref(\"stg_decidim_budgets_projects\")}}", "language": "sql", "refs": [{"name": "stg_decidim_budgets_projects", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_budgets_projects"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_budgets_orders": {"database": "test_lyon", "schema": "prod", "name": "int_budgets_orders", "resource_type": "model", "package_name": "demo", "path": "intermediate/budgets/int_budgets_orders.sql", "original_file_path": "models/intermediate/budgets/int_budgets_orders.sql", "unique_id": "model.demo.int_budgets_orders", "fqn": ["demo", "intermediate", "budgets", "int_budgets_orders"], "alias": "int_budgets_orders", "checksum": {"name": "sha256", "checksum": "c5e8547892ae21bf292f3901f4c325d3612f5574b76934c832086cf44d077b76"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.6325629, "relation_name": "\"test_lyon\".\"prod\".\"int_budgets_orders\"", "raw_code": "SELECT\n id,\n decidim_user_id,\n checked_out_at,\n created_at,\n updated_at,\n decidim_budgets_budget_id,\n (CASE\n WHEN checked_out_at IS NULL\n THEN false\n ELSE true\n END) AS vote_finished\nFROM {{ ref(\"stg_decidim_budgets_orders\")}}", "language": "sql", "refs": [{"name": "stg_decidim_budgets_orders", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_budgets_orders"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_meetings": {"database": "test_lyon", "schema": "prod", "name": "int_meetings", "resource_type": "model", "package_name": "demo", "path": "intermediate/meetings/int_meetings.sql", "original_file_path": "models/intermediate/meetings/int_meetings.sql", "unique_id": "model.demo.int_meetings", "fqn": ["demo", "intermediate", "meetings", "int_meetings"], "alias": "int_meetings", "checksum": {"name": "sha256", "checksum": "3ae6f139762d8f65078a697317a1e2e49502ab89cf3d56eb058b28d6d7ef0575"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.633665, "relation_name": "\"test_lyon\".\"prod\".\"int_meetings\"", "raw_code": "SELECT\n decidim_meetings.id,\n decidim_meetings.title,\n decidim_meetings.description,\n decidim_meetings.address,\n decidim_meetings.attendees_count,\n decidim_meetings.created_at,\n decidim_meetings.decidim_scope_id,\n decidim_meetings.decidim_component_id,\n decidim_meetings.start_time,\n decidim_meetings.end_time,\n decidim_meetings.registration_url,\n decidim_meetings.type_of_meeting, \n (CASE decidim_meetings.type_of_meeting\n WHEN 'online' THEN 'En ligne'\n WHEN 'in_person' THEN 'En pr\u00e9sentiel'\n WHEN 'hybrid' THEN 'Hybride'\n ELSE decidim_meetings.type_of_meeting\n END\n ) AS translated_type_of_meeting,\n decidim_meetings.private_meeting,\n decidim_meetings.decidim_author_id,\n decidim_meetings.resource_type\n FROM {{ ref (\"stg_decidim_meetings\")}} as decidim_meetings", "language": "sql", "refs": [{"name": "stg_decidim_meetings", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_meetings"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_scopes": {"database": "test_lyon", "schema": "prod", "name": "int_scopes", "resource_type": "model", "package_name": "demo", "path": "intermediate/scopes/int_scopes.sql", "original_file_path": "models/intermediate/scopes/int_scopes.sql", "unique_id": "model.demo.int_scopes", "fqn": ["demo", "intermediate", "scopes", "int_scopes"], "alias": "int_scopes", "checksum": {"name": "sha256", "checksum": "7c5488af2c9da4834ad42b60ed68513bd62b3d77121bd1345bc2edf5a77d7a67"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Intermediate model for Decidim scopes, excluding the 'part_of' column due to ARRAY bug in tests.", "columns": {"id": {"name": "id", "description": "Unique identifier for the scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_organization_id": {"name": "decidim_organization_id", "description": "Identifier for the Decidim organization to which the scope belongs.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the scope was created.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "updated_at": {"name": "updated_at", "description": "Timestamp when the scope was last updated.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "name": {"name": "name", "description": "Name of the scope in French, with a default value 'Sans secteur' if the name is empty.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "scope_type_id": {"name": "scope_type_id", "description": "Identifier for the type of scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "parent_id": {"name": "parent_id", "description": "Identifier for the parent scope, if applicable.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "code": {"name": "code", "description": "Code associated with the scope.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/intermediate/scopes/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727441769.8699672, "relation_name": "\"test_lyon\".\"prod\".\"int_scopes\"", "raw_code": "-- Due to ARRAY bug in test, we create an intermediate scopes without the column part_of\n\nSELECT\n decidim_scopes.id,\n decidim_scopes.decidim_organization_id,\n decidim_scopes.created_at,\n decidim_scopes.updated_at,\n coalesce(nullif(decidim_scopes.name, ''), 'Sans secteur') as name,\n decidim_scopes.scope_type_id,\n decidim_scopes.parent_id,\n decidim_scopes.code\nFROM {{ ref (\"stg_decidim_scopes\") }} as decidim_scopes", "language": "sql", "refs": [{"name": "stg_decidim_scopes", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_scopes"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.demo.int_proposals": {"database": "test_lyon", "schema": "prod", "name": "int_proposals", "resource_type": "model", "package_name": "demo", "path": "intermediate/proposals/int_proposals.sql", "original_file_path": "models/intermediate/proposals/int_proposals.sql", "unique_id": "model.demo.int_proposals", "fqn": ["demo", "intermediate", "proposals", "int_proposals"], "alias": "int_proposals", "checksum": {"name": "sha256", "checksum": "e20700e4bfae96e8013077d5be8976060be0b337d3c652e9c49210c1b44b3b91"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected", "indexes": [{"columns": ["id"], "type": "btree"}]}, "tags": [], "description": "Intermediate model for Decidim proposals, containing basic proposal details and states.", "columns": {"id": {"name": "id", "description": "Unique identifier for the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "title": {"name": "title", "description": "Title of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "body": {"name": "body", "description": "Body text of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "resource_type": {"name": "resource_type", "description": "Type of the resource, typically 'Decidim::Proposals::Proposal'", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_component_id": {"name": "decidim_component_id", "description": "Identifier for the component within which the proposal was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "decidim_scope_id": {"name": "decidim_scope_id", "description": "Identifier for the scope of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "created_at": {"name": "created_at", "description": "Timestamp when the proposal was created", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "published_at": {"name": "published_at", "description": "Timestamp when the proposal was published", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "state": {"name": "state", "description": "Current state of the proposal, with default 'Pas d'\u00e9tat' if null", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "translated_state": {"name": "translated_state", "description": "Human-readable translated state of the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "comments_count": {"name": "comments_count", "description": "Number of comments on the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "endorsements_count": {"name": "endorsements_count", "description": "Number of endorsements on the proposal", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "address": {"name": "address", "description": "Address related to the proposal, with default 'Pas d'adresse' if empty", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "demo://models/intermediate/proposals/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table", "indexes": [{"columns": ["id"], "type": "btree"}]}, "created_at": 1727441769.8703701, "relation_name": "\"test_lyon\".\"prod\".\"int_proposals\"", "raw_code": "{{ config(\n indexes=[\n {'columns': ['id'], 'type': 'btree'},\n ]\n)}}\n\nSELECT\n decidim_proposals.id,\n decidim_proposals.title,\n decidim_proposals.body,\n decidim_proposals.resource_type,\n decidim_proposals.decidim_component_id,\n decidim_proposals.decidim_scope_id,\n decidim_proposals.created_at,\n decidim_proposals.published_at,\n COALESCE(NULLIF(decidim_proposals.state, NULL), 'Pas d''\u00e9tat') AS state,\n (CASE\n WHEN decidim_proposals.state = 'evaluating' THEN 'En cours d''\u00e9valuation'\n WHEN decidim_proposals.state = 'rejected' THEN 'Rejet\u00e9e'\n WHEN decidim_proposals.state = 'accepted' THEN 'Accept\u00e9e'\n WHEN decidim_proposals.state IS NULL THEN 'Pas d''\u00e9tat'\n ELSE decidim_proposals.state\n END\n ) AS translated_state,\n decidim_proposals.comments_count,\n decidim_proposals.endorsements_count,\n COALESCE(NULLIF(decidim_proposals.address,''),'Pas d''adresse') AS address\nFROM {{ ref (\"stg_decidim_proposals\")}} AS decidim_proposals\nWHERE published_at IS NOT NULL", "language": "sql", "refs": [{"name": "stg_decidim_proposals", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_proposals"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "test.demo.not_null_stg_decidim_forms_answer_choices_id.6373c5b027": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_answer_choices_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_answer_choices_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_answer_choices_id.6373c5b027", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_answer_choices_id"], "alias": "not_null_stg_decidim_forms_answer_choices_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.77, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_answer_choices", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_answer_choices"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_answer_choices", "attached_node": "model.demo.stg_decidim_forms_answer_choices", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_answer_choices')) }}"}, "namespace": null}}, "test.demo.unique_stg_decidim_forms_answer_choices_id.cac0250df2": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_forms_answer_choices_id", "resource_type": "test", "package_name": "demo", "path": "unique_stg_decidim_forms_answer_choices_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.unique_stg_decidim_forms_answer_choices_id.cac0250df2", "fqn": ["demo", "staging", "decidim", "forms", "unique_stg_decidim_forms_answer_choices_id"], "alias": "unique_stg_decidim_forms_answer_choices_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.770902, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_answer_choices", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.stg_decidim_forms_answer_choices"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_answer_choices", "attached_node": "model.demo.stg_decidim_forms_answer_choices", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_answer_choices')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_answer_choices_decidim_answer_id.70e833d8d0": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_answer_choices_decidim_answer_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_answer_choices_decidim_answer_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_answer_choices_decidim_answer_id.70e833d8d0", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_answer_choices_decidim_answer_id"], "alias": "not_null_stg_decidim_forms_answer_choices_decidim_answer_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.771706, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_answer_choices", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_answer_choices"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "decidim_answer_id", "file_key_name": "models.stg_decidim_forms_answer_choices", "attached_node": "model.demo.stg_decidim_forms_answer_choices", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "decidim_answer_id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_answer_choices')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_answer_choices_body.0c7838e1b8": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_answer_choices_body", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_answer_choices_body.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_answer_choices_body.0c7838e1b8", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_answer_choices_body"], "alias": "not_null_stg_decidim_forms_answer_choices_body", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.772497, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_answer_choices", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_answer_choices"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "body", "file_key_name": "models.stg_decidim_forms_answer_choices", "attached_node": "model.demo.stg_decidim_forms_answer_choices", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "body", "model": "{{ get_where_subquery(ref('stg_decidim_forms_answer_choices')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_answers_id.92ce43439f": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_answers_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_answers_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_answers_id.92ce43439f", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_answers_id"], "alias": "not_null_stg_decidim_forms_answers_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.7733161, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_answers", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_answers"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_answers", "attached_node": "model.demo.stg_decidim_forms_answers", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_answers')) }}"}, "namespace": null}}, "test.demo.unique_stg_decidim_forms_answers_id.8fb3388969": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_forms_answers_id", "resource_type": "test", "package_name": "demo", "path": "unique_stg_decidim_forms_answers_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.unique_stg_decidim_forms_answers_id.8fb3388969", "fqn": ["demo", "staging", "decidim", "forms", "unique_stg_decidim_forms_answers_id"], "alias": "unique_stg_decidim_forms_answers_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.774173, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_answers", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.stg_decidim_forms_answers"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_answers", "attached_node": "model.demo.stg_decidim_forms_answers", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_answers')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_question_matrix_rows_id.7e6619509e": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_question_matrix_rows_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_question_matrix_rows_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_question_matrix_rows_id.7e6619509e", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_question_matrix_rows_id"], "alias": "not_null_stg_decidim_forms_question_matrix_rows_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.774949, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_question_matrix_rows", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_question_matrix_rows"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_question_matrix_rows", "attached_node": "model.demo.stg_decidim_forms_question_matrix_rows", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_question_matrix_rows')) }}"}, "namespace": null}}, "test.demo.unique_stg_decidim_forms_question_matrix_rows_id.8db20e3085": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_forms_question_matrix_rows_id", "resource_type": "test", "package_name": "demo", "path": "unique_stg_decidim_forms_question_matrix_rows_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.unique_stg_decidim_forms_question_matrix_rows_id.8db20e3085", "fqn": ["demo", "staging", "decidim", "forms", "unique_stg_decidim_forms_question_matrix_rows_id"], "alias": "unique_stg_decidim_forms_question_matrix_rows_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.775705, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_question_matrix_rows", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.stg_decidim_forms_question_matrix_rows"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_question_matrix_rows", "attached_node": "model.demo.stg_decidim_forms_question_matrix_rows", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_question_matrix_rows')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id.55db0b6fe6": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_que_b7cff25dabb5d3b02a571f0f586cf6bf.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id.55db0b6fe6", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id"], "alias": "not_null_stg_decidim_forms_que_b7cff25dabb5d3b02a571f0f586cf6bf", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": "not_null_stg_decidim_forms_que_b7cff25dabb5d3b02a571f0f586cf6bf", "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": {"alias": "not_null_stg_decidim_forms_que_b7cff25dabb5d3b02a571f0f586cf6bf"}, "created_at": 1727441769.77647, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}{{ config(alias=\"not_null_stg_decidim_forms_que_b7cff25dabb5d3b02a571f0f586cf6bf\") }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_question_matrix_rows", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_question_matrix_rows"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "decidim_question_id", "file_key_name": "models.stg_decidim_forms_question_matrix_rows", "attached_node": "model.demo.stg_decidim_forms_question_matrix_rows", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "decidim_question_id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_question_matrix_rows')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_question_matrix_rows_body.71d322a975": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_question_matrix_rows_body", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_question_matrix_rows_body.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_question_matrix_rows_body.71d322a975", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_question_matrix_rows_body"], "alias": "not_null_stg_decidim_forms_question_matrix_rows_body", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.777229, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_question_matrix_rows", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_question_matrix_rows"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "body", "file_key_name": "models.stg_decidim_forms_question_matrix_rows", "attached_node": "model.demo.stg_decidim_forms_question_matrix_rows", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "body", "model": "{{ get_where_subquery(ref('stg_decidim_forms_question_matrix_rows')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_questionnaires_id.74cea2a594": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_questionnaires_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_questionnaires_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_questionnaires_id.74cea2a594", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_questionnaires_id"], "alias": "not_null_stg_decidim_forms_questionnaires_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.778058, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_questionnaires", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_questionnaires"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_questionnaires", "attached_node": "model.demo.stg_decidim_forms_questionnaires", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_questionnaires')) }}"}, "namespace": null}}, "test.demo.unique_stg_decidim_forms_questionnaires_id.c228c4d2a1": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_forms_questionnaires_id", "resource_type": "test", "package_name": "demo", "path": "unique_stg_decidim_forms_questionnaires_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.unique_stg_decidim_forms_questionnaires_id.c228c4d2a1", "fqn": ["demo", "staging", "decidim", "forms", "unique_stg_decidim_forms_questionnaires_id"], "alias": "unique_stg_decidim_forms_questionnaires_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.7788239, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_questionnaires", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.stg_decidim_forms_questionnaires"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_questionnaires", "attached_node": "model.demo.stg_decidim_forms_questionnaires", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_questionnaires')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_forms_questions_id.c7a096fa50": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_forms_questions_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_forms_questions_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_forms_questions_id.c7a096fa50", "fqn": ["demo", "staging", "decidim", "forms", "not_null_stg_decidim_forms_questions_id"], "alias": "not_null_stg_decidim_forms_questions_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.779597, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_questions", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_forms_questions"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_questions", "attached_node": "model.demo.stg_decidim_forms_questions", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_questions')) }}"}, "namespace": null}}, "test.demo.unique_stg_decidim_forms_questions_id.3becc3a082": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_forms_questions_id", "resource_type": "test", "package_name": "demo", "path": "unique_stg_decidim_forms_questions_id.sql", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "test.demo.unique_stg_decidim_forms_questions_id.3becc3a082", "fqn": ["demo", "staging", "decidim", "forms", "unique_stg_decidim_forms_questions_id"], "alias": "unique_stg_decidim_forms_questions_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.780351, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_forms_questions", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.stg_decidim_forms_questions"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_forms_questions", "attached_node": "model.demo.stg_decidim_forms_questions", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_forms_questions')) }}"}, "namespace": null}}, "test.demo.unique_stg_decidim_budgets_line_items_id.93d157dab5": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_budgets_line_items_id", "resource_type": "test", "package_name": "demo", "path": "unique_stg_decidim_budgets_line_items_id.sql", "original_file_path": "models/staging/decidim/budgets/schema.yml", "unique_id": "test.demo.unique_stg_decidim_budgets_line_items_id.93d157dab5", "fqn": ["demo", "staging", "decidim", "budgets", "unique_stg_decidim_budgets_line_items_id"], "alias": "unique_stg_decidim_budgets_line_items_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.7947578, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_budgets_line_items", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.stg_decidim_budgets_line_items"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_budgets_line_items", "attached_node": "model.demo.stg_decidim_budgets_line_items", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_budgets_line_items')) }}"}, "namespace": null}}, "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id.759330b24d": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id", "resource_type": "test", "package_name": "demo", "path": "dbt_utils_unique_combination_o_b42a72e6dc642c4f0174b7aaf01eabc7.sql", "original_file_path": "models/staging/decidim/budgets/schema.yml", "unique_id": "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id.759330b24d", "fqn": ["demo", "staging", "decidim", "budgets", "dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id"], "alias": "dbt_utils_unique_combination_o_b42a72e6dc642c4f0174b7aaf01eabc7", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": "dbt_utils_unique_combination_o_b42a72e6dc642c4f0174b7aaf01eabc7", "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": {"alias": "dbt_utils_unique_combination_o_b42a72e6dc642c4f0174b7aaf01eabc7"}, "created_at": 1727441769.795609, "relation_name": null, "raw_code": "{{ dbt_utils.test_unique_combination_of_columns(**_dbt_generic_test_kwargs) }}{{ config(alias=\"dbt_utils_unique_combination_o_b42a72e6dc642c4f0174b7aaf01eabc7\") }}", "language": "sql", "refs": [{"name": "stg_decidim_budgets_line_items", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt_utils.test_unique_combination_of_columns", "macro.dbt.get_where_subquery"], "nodes": ["model.demo.stg_decidim_budgets_line_items"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": null, "file_key_name": "models.stg_decidim_budgets_line_items", "attached_node": "model.demo.stg_decidim_budgets_line_items", "test_metadata": {"name": "unique_combination_of_columns", "kwargs": {"combination_of_columns": ["decidim_order_id", "decidim_project_id"], "model": "{{ get_where_subquery(ref('stg_decidim_budgets_line_items')) }}"}, "namespace": "dbt_utils"}}, "test.demo.unique_stg_decidim_categorizations_id.6566c00409": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_categorizations_id", "resource_type": "test", "package_name": "demo", "path": "unique_stg_decidim_categorizations_id.sql", "original_file_path": "models/staging/decidim/categories/schema.yml", "unique_id": "test.demo.unique_stg_decidim_categorizations_id.6566c00409", "fqn": ["demo", "staging", "decidim", "categories", "unique_stg_decidim_categorizations_id"], "alias": "unique_stg_decidim_categorizations_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.807109, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_categorizations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.stg_decidim_categorizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_categorizations", "attached_node": "model.demo.stg_decidim_categorizations", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_categorizations')) }}"}, "namespace": null}}, "test.demo.not_null_stg_decidim_categorizations_id.a059a79c08": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_categorizations_id", "resource_type": "test", "package_name": "demo", "path": "not_null_stg_decidim_categorizations_id.sql", "original_file_path": "models/staging/decidim/categories/schema.yml", "unique_id": "test.demo.not_null_stg_decidim_categorizations_id.a059a79c08", "fqn": ["demo", "staging", "decidim", "categories", "not_null_stg_decidim_categorizations_id"], "alias": "not_null_stg_decidim_categorizations_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.8079271, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_categorizations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.stg_decidim_categorizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_categorizations", "attached_node": "model.demo.stg_decidim_categorizations", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_categorizations')) }}"}, "namespace": null}}, "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type.d2c10e48e4": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type", "resource_type": "test", "package_name": "demo", "path": "dbt_utils_unique_combination_o_e91d0d82d3171d32221006a1ae09a09f.sql", "original_file_path": "models/staging/decidim/categories/schema.yml", "unique_id": "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type.d2c10e48e4", "fqn": ["demo", "staging", "decidim", "categories", "dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type"], "alias": "dbt_utils_unique_combination_o_e91d0d82d3171d32221006a1ae09a09f", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": "dbt_utils_unique_combination_o_e91d0d82d3171d32221006a1ae09a09f", "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": {"alias": "dbt_utils_unique_combination_o_e91d0d82d3171d32221006a1ae09a09f"}, "created_at": 1727441769.808712, "relation_name": null, "raw_code": "{{ dbt_utils.test_unique_combination_of_columns(**_dbt_generic_test_kwargs) }}{{ config(alias=\"dbt_utils_unique_combination_o_e91d0d82d3171d32221006a1ae09a09f\") }}", "language": "sql", "refs": [{"name": "stg_decidim_categorizations", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt_utils.test_unique_combination_of_columns", "macro.dbt.get_where_subquery"], "nodes": ["model.demo.stg_decidim_categorizations"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": null, "file_key_name": "models.stg_decidim_categorizations", "attached_node": "model.demo.stg_decidim_categorizations", "test_metadata": {"name": "unique_combination_of_columns", "kwargs": {"combination_of_columns": ["categorizable_id", "categorizable_type"], "model": "{{ get_where_subquery(ref('stg_decidim_categorizations')) }}"}, "namespace": "dbt_utils"}}, "test.demo.accepted_values_followings_following_way__real_follow__ancestor_follow.60d8b91db4": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "accepted_values_followings_following_way__real_follow__ancestor_follow", "resource_type": "test", "package_name": "demo", "path": "accepted_values_followings_2bd6d020694d7d1aa5e3c0a6620f8f06.sql", "original_file_path": "models/marts/followings/schema.yml", "unique_id": "test.demo.accepted_values_followings_following_way__real_follow__ancestor_follow.60d8b91db4", "fqn": ["demo", "marts", "followings", "accepted_values_followings_following_way__real_follow__ancestor_follow"], "alias": "accepted_values_followings_2bd6d020694d7d1aa5e3c0a6620f8f06", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": "accepted_values_followings_2bd6d020694d7d1aa5e3c0a6620f8f06", "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": {"alias": "accepted_values_followings_2bd6d020694d7d1aa5e3c0a6620f8f06"}, "created_at": 1727441769.8130739, "relation_name": null, "raw_code": "{{ test_accepted_values(**_dbt_generic_test_kwargs) }}{{ config(alias=\"accepted_values_followings_2bd6d020694d7d1aa5e3c0a6620f8f06\") }}", "language": "sql", "refs": [{"name": "followings", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_accepted_values", "macro.dbt.get_where_subquery"], "nodes": ["model.demo.followings"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "following_way", "file_key_name": "models.followings", "attached_node": "model.demo.followings", "test_metadata": {"name": "accepted_values", "kwargs": {"values": ["real_follow", "ancestor_follow"], "column_name": "following_way", "model": "{{ get_where_subquery(ref('followings')) }}"}, "namespace": null}}, "test.demo.not_null_components_id.85e75ab698": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_components_id", "resource_type": "test", "package_name": "demo", "path": "not_null_components_id.sql", "original_file_path": "models/marts/components/schema.yml", "unique_id": "test.demo.not_null_components_id.85e75ab698", "fqn": ["demo", "marts", "components", "not_null_components_id"], "alias": "not_null_components_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.820657, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.components", "attached_node": "model.demo.components", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('components')) }}"}, "namespace": null}}, "test.demo.unique_components_id.55875f0fa3": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_components_id", "resource_type": "test", "package_name": "demo", "path": "unique_components_id.sql", "original_file_path": "models/marts/components/schema.yml", "unique_id": "test.demo.unique_components_id.55875f0fa3", "fqn": ["demo", "marts", "components", "unique_components_id"], "alias": "unique_components_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.821463, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.components", "attached_node": "model.demo.components", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('components')) }}"}, "namespace": null}}, "test.demo.not_null_components_manifest_name.2795dc3709": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_components_manifest_name", "resource_type": "test", "package_name": "demo", "path": "not_null_components_manifest_name.sql", "original_file_path": "models/marts/components/schema.yml", "unique_id": "test.demo.not_null_components_manifest_name.2795dc3709", "fqn": ["demo", "marts", "components", "not_null_components_manifest_name"], "alias": "not_null_components_manifest_name", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.8222458, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "manifest_name", "file_key_name": "models.components", "attached_node": "model.demo.components", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "manifest_name", "model": "{{ get_where_subquery(ref('components')) }}"}, "namespace": null}}, "test.demo.not_null_components_decidim_organization_id.3ae04f70dd": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_components_decidim_organization_id", "resource_type": "test", "package_name": "demo", "path": "not_null_components_decidim_organization_id.sql", "original_file_path": "models/marts/components/schema.yml", "unique_id": "test.demo.not_null_components_decidim_organization_id.3ae04f70dd", "fqn": ["demo", "marts", "components", "not_null_components_decidim_organization_id"], "alias": "not_null_components_decidim_organization_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.823076, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "decidim_organization_id", "file_key_name": "models.components", "attached_node": "model.demo.components", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "decidim_organization_id", "model": "{{ get_where_subquery(ref('components')) }}"}, "namespace": null}}, "test.demo.unique_users_id.ec952d9777": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_users_id", "resource_type": "test", "package_name": "demo", "path": "unique_users_id.sql", "original_file_path": "models/marts/users/schema.yml", "unique_id": "test.demo.unique_users_id.ec952d9777", "fqn": ["demo", "marts", "users", "unique_users_id"], "alias": "unique_users_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.837776, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "users", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.users", "attached_node": "model.demo.users", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('users')) }}"}, "namespace": null}}, "test.demo.not_null_users_id.4db5ed5c63": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_users_id", "resource_type": "test", "package_name": "demo", "path": "not_null_users_id.sql", "original_file_path": "models/marts/users/schema.yml", "unique_id": "test.demo.not_null_users_id.4db5ed5c63", "fqn": ["demo", "marts", "users", "not_null_users_id"], "alias": "not_null_users_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.8385909, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "users", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.users", "attached_node": "model.demo.users", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('users')) }}"}, "namespace": null}}, "test.demo.relationships_users_id__id__ref_int_users_.c269bba0d5": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "relationships_users_id__id__ref_int_users_", "resource_type": "test", "package_name": "demo", "path": "relationships_users_id__id__ref_int_users_.sql", "original_file_path": "models/marts/users/schema.yml", "unique_id": "test.demo.relationships_users_id__id__ref_int_users_.c269bba0d5", "fqn": ["demo", "marts", "users", "relationships_users_id__id__ref_int_users_"], "alias": "relationships_users_id__id__ref_int_users_", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.839432, "relation_name": null, "raw_code": "{{ test_relationships(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "int_users", "package": null, "version": null}, {"name": "users", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_relationships", "macro.dbt.get_where_subquery"], "nodes": ["model.demo.int_users", "model.demo.users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": null, "file_key_name": "models.users", "attached_node": "model.demo.users", "test_metadata": {"name": "relationships", "kwargs": {"column_name": "id", "to": "ref('int_users')", "field": "id", "model": "{{ get_where_subquery(ref('users')) }}"}, "namespace": null}}, "test.demo.dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id.da5f9c9505": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id", "resource_type": "test", "package_name": "demo", "path": "dbt_utils_unique_combination_o_f2799d012d3f7daa7590aefc4588a1c9.sql", "original_file_path": "models/marts/proposals/schema.yml", "unique_id": "test.demo.dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id.da5f9c9505", "fqn": ["demo", "marts", "proposals", "dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id"], "alias": "dbt_utils_unique_combination_o_f2799d012d3f7daa7590aefc4588a1c9", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": "dbt_utils_unique_combination_o_f2799d012d3f7daa7590aefc4588a1c9", "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": {"alias": "dbt_utils_unique_combination_o_f2799d012d3f7daa7590aefc4588a1c9"}, "created_at": 1727441769.847372, "relation_name": null, "raw_code": "{{ dbt_utils.test_unique_combination_of_columns(**_dbt_generic_test_kwargs) }}{{ config(alias=\"dbt_utils_unique_combination_o_f2799d012d3f7daa7590aefc4588a1c9\") }}", "language": "sql", "refs": [{"name": "proposals_votes", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt_utils.test_unique_combination_of_columns", "macro.dbt.get_where_subquery"], "nodes": ["model.demo.proposals_votes"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": null, "file_key_name": "models.proposals_votes", "attached_node": "model.demo.proposals_votes", "test_metadata": {"name": "unique_combination_of_columns", "kwargs": {"combination_of_columns": ["decidim_author_id", "decidim_proposal_id"], "model": "{{ get_where_subquery(ref('proposals_votes')) }}"}, "namespace": "dbt_utils"}}, "test.demo.unique_int_users_id.e5ba0ede1e": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_int_users_id", "resource_type": "test", "package_name": "demo", "path": "unique_int_users_id.sql", "original_file_path": "models/intermediate/users/schema.yml", "unique_id": "test.demo.unique_int_users_id.e5ba0ede1e", "fqn": ["demo", "intermediate", "users", "unique_int_users_id"], "alias": "unique_int_users_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.8639638, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "int_users", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.demo.int_users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.int_users", "attached_node": "model.demo.int_users", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('int_users')) }}"}, "namespace": null}}, "test.demo.not_null_int_users_id.1125b186c1": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_int_users_id", "resource_type": "test", "package_name": "demo", "path": "not_null_int_users_id.sql", "original_file_path": "models/intermediate/users/schema.yml", "unique_id": "test.demo.not_null_int_users_id.1125b186c1", "fqn": ["demo", "intermediate", "users", "not_null_int_users_id"], "alias": "not_null_int_users_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.8647811, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "int_users", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.int_users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.int_users", "attached_node": "model.demo.int_users", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('int_users')) }}"}, "namespace": null}}, "test.demo.not_null_int_users_nickname.b90ddd7677": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_int_users_nickname", "resource_type": "test", "package_name": "demo", "path": "not_null_int_users_nickname.sql", "original_file_path": "models/intermediate/users/schema.yml", "unique_id": "test.demo.not_null_int_users_nickname.b90ddd7677", "fqn": ["demo", "intermediate", "users", "not_null_int_users_nickname"], "alias": "not_null_int_users_nickname", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727441769.8655622, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "int_users", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.demo.int_users"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "nickname", "file_key_name": "models.int_users", "attached_node": "model.demo.int_users", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "nickname", "model": "{{ get_where_subquery(ref('int_users')) }}"}, "namespace": null}}, "model.test_lyon.decidim_awesome_proposal_extra_fields": {"database": "test_lyon", "schema": "prod", "name": "decidim_awesome_proposal_extra_fields", "resource_type": "model", "package_name": "test_lyon", "path": "marts/decidim_awesome/decidim_awesome_proposal_extra_fields.sql", "original_file_path": "models/marts/decidim_awesome/decidim_awesome_proposal_extra_fields.sql", "unique_id": "model.test_lyon.decidim_awesome_proposal_extra_fields", "fqn": ["test_lyon", "marts", "decidim_awesome", "decidim_awesome_proposal_extra_fields"], "alias": "decidim_awesome_proposal_extra_fields", "checksum": {"name": "sha256", "checksum": "e74fef8bbaffd8fb07cd179ee4cd299727ac45ee1c196509a24b2b0dbf0a1561"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727446081.2962859, "relation_name": "\"test_lyon\".\"prod\".\"decidim_awesome_proposal_extra_fields\"", "raw_code": "SELECT\n decidim_awesome_proposal_extra_fields.id,\n decidim_awesome_proposal_extra_fields.proposal_id,\n decidim_awesome_proposal_extra_fields.private_field_description,\n decidim_awesome_proposal_extra_fields.private_field_content,\n decidim_proposals_proposals.decidim_component_id,\n components.ps_title\nFROM\n {{ ref (\"int_decidim_awesome_proposal_extra_fields\")}} AS decidim_awesome_proposal_extra_fields\nJOIN {{ ref (\"stg_decidim_proposals\")}} AS decidim_proposals_proposals ON decidim_awesome_proposal_extra_fields.proposal_id = decidim_proposals_proposals.id\nJOIN {{ ref (\"components\")}} AS components ON decidim_proposals_proposals.decidim_component_id = components.id", "language": "sql", "refs": [{"name": "int_decidim_awesome_proposal_extra_fields", "package": null, "version": null}, {"name": "stg_decidim_proposals", "package": null, "version": null}, {"name": "components", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.test_lyon.int_decidim_awesome_proposal_extra_fields", "model.demo.stg_decidim_proposals", "model.demo.components"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "model.test_lyon.stg_decidim_awesome_proposal_extra_fields": {"database": "test_lyon", "schema": "prod", "name": "stg_decidim_awesome_proposal_extra_fields", "resource_type": "model", "package_name": "test_lyon", "path": "staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql", "original_file_path": "models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql", "unique_id": "model.test_lyon.stg_decidim_awesome_proposal_extra_fields", "fqn": ["test_lyon", "staging", "decidim", "stg_decidim_awesome_proposal_extra_fields"], "alias": "stg_decidim_awesome_proposal_extra_fields", "checksum": {"name": "sha256", "checksum": "c680c40fcfafcbeb0896883b2dcd15f87fa987271129f4df0c3e1073c695caaa"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "Table for private proposal fields in the module decidim awesome.", "columns": {"id": {"name": "id", "description": "Primary key.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "proposal_id": {"name": "proposal_id", "description": "Id of the proposal the private field is linked to.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}, "private_body": {"name": "private_body", "description": "Body of the answers of the private proposals fields answered by the user. The format is XML.", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "test_lyon://models/staging/decidim/schema.yml", "build_path": null, "unrendered_config": {"materialized": "table"}, "created_at": 1727446081.349271, "relation_name": "\"test_lyon\".\"prod\".\"stg_decidim_awesome_proposal_extra_fields\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('decidim', 'decidim_awesome_proposal_extra_fields_test') }}\n)\n\n\nSELECT\n id,\n decidim_proposal_id AS proposal_id,\n updated_at,\n created_at,\n replace(private_body_clear, ' ', '') AS private_body_clear\nFROM source", "language": "sql", "refs": [], "sources": [["decidim", "decidim_awesome_proposal_extra_fields_test"]], "metrics": [], "depends_on": {"macros": [], "nodes": ["source.test_lyon.decidim.decidim_awesome_proposal_extra_fields_test"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_id.aad3a9d9b8": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_awesome_proposal_extra_fields_id", "resource_type": "test", "package_name": "test_lyon", "path": "not_null_stg_decidim_awesome_proposal_extra_fields_id.sql", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_id.aad3a9d9b8", "fqn": ["test_lyon", "staging", "decidim", "not_null_stg_decidim_awesome_proposal_extra_fields_id"], "alias": "not_null_stg_decidim_awesome_proposal_extra_fields_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727446081.381366, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_awesome_proposal_extra_fields", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_awesome_proposal_extra_fields", "attached_node": "model.test_lyon.stg_decidim_awesome_proposal_extra_fields", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_awesome_proposal_extra_fields')) }}"}, "namespace": null}}, "test.test_lyon.unique_stg_decidim_awesome_proposal_extra_fields_id.1f06fde107": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "unique_stg_decidim_awesome_proposal_extra_fields_id", "resource_type": "test", "package_name": "test_lyon", "path": "unique_stg_decidim_awesome_proposal_extra_fields_id.sql", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "test.test_lyon.unique_stg_decidim_awesome_proposal_extra_fields_id.1f06fde107", "fqn": ["test_lyon", "staging", "decidim", "unique_stg_decidim_awesome_proposal_extra_fields_id"], "alias": "unique_stg_decidim_awesome_proposal_extra_fields_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727446081.3822951, "relation_name": null, "raw_code": "{{ test_unique(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_awesome_proposal_extra_fields", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_unique"], "nodes": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "id", "file_key_name": "models.stg_decidim_awesome_proposal_extra_fields", "attached_node": "model.test_lyon.stg_decidim_awesome_proposal_extra_fields", "test_metadata": {"name": "unique", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('stg_decidim_awesome_proposal_extra_fields')) }}"}, "namespace": null}}, "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id.5154a34bb9": {"database": "test_lyon", "schema": "prod_dbt_test__audit", "name": "not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id", "resource_type": "test", "package_name": "test_lyon", "path": "not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id.sql", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id.5154a34bb9", "fqn": ["test_lyon", "staging", "decidim", "not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id"], "alias": "not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "store_failures_as": 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": 1727446081.383069, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "stg_decidim_awesome_proposal_extra_fields", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"]}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "column_name": "proposal_id", "file_key_name": "models.stg_decidim_awesome_proposal_extra_fields", "attached_node": "model.test_lyon.stg_decidim_awesome_proposal_extra_fields", "test_metadata": {"name": "not_null", "kwargs": {"column_name": "proposal_id", "model": "{{ get_where_subquery(ref('stg_decidim_awesome_proposal_extra_fields')) }}"}, "namespace": null}}}, "sources": {"source.test_lyon.decidim.decidim_awesome_proposal_extra_fields_test": {"database": "test_lyon", "schema": "public", "name": "decidim_awesome_proposal_extra_fields_test", "resource_type": "source", "package_name": "test_lyon", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.test_lyon.decidim.decidim_awesome_proposal_extra_fields_test", "fqn": ["test_lyon", "staging", "decidim", "decidim", "decidim_awesome_proposal_extra_fields_test"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_awesome_proposal_extra_fields_test", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_awesome_proposal_extra_fields_test\"", "created_at": 1727441769.8751261}, "source.demo.decidim.decidim_components": {"database": "test_lyon", "schema": "public", "name": "decidim_components", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_components", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_components"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_components", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_components\"", "created_at": 1727441769.875642}, "source.demo.decidim.decidim_assemblies": {"database": "test_lyon", "schema": "public", "name": "decidim_assemblies", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_assemblies", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_assemblies"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_assemblies", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_assemblies\"", "created_at": 1727441769.8757172}, "source.demo.decidim.decidim_participatory_processes": {"database": "test_lyon", "schema": "public", "name": "decidim_participatory_processes", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_participatory_processes", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_participatory_processes"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_participatory_processes", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_participatory_processes\"", "created_at": 1727441769.875784}, "source.demo.decidim.decidim_participatory_process_steps": {"database": "test_lyon", "schema": "public", "name": "decidim_participatory_process_steps", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_participatory_process_steps", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_participatory_process_steps"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_participatory_process_steps", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_participatory_process_steps\"", "created_at": 1727441769.8758452}, "source.demo.decidim.decidim_users": {"database": "test_lyon", "schema": "public", "name": "decidim_users", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_users", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_users"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_users", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_users\"", "created_at": 1727441769.875906}, "source.demo.decidim.decidim_proposals_proposals": {"database": "test_lyon", "schema": "public", "name": "decidim_proposals_proposals", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_proposals_proposals", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_proposals_proposals"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_proposals_proposals", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_proposals_proposals\"", "created_at": 1727441769.875964}, "source.demo.decidim.decidim_coauthorships": {"database": "test_lyon", "schema": "public", "name": "decidim_coauthorships", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_coauthorships", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_coauthorships"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_coauthorships", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_coauthorships\"", "created_at": 1727441769.876035}, "source.demo.decidim.decidim_moderations": {"database": "test_lyon", "schema": "public", "name": "decidim_moderations", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_moderations", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_moderations"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_moderations", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_moderations\"", "created_at": 1727441769.876097}, "source.demo.decidim.decidim_scopes": {"database": "test_lyon", "schema": "public", "name": "decidim_scopes", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_scopes", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_scopes"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_scopes", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_scopes\"", "created_at": 1727441769.876155}, "source.demo.decidim.decidim_blogs_posts": {"database": "test_lyon", "schema": "public", "name": "decidim_blogs_posts", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_blogs_posts", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_blogs_posts"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_blogs_posts", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_blogs_posts\"", "created_at": 1727441769.876214}, "source.demo.decidim.decidim_debates_debates": {"database": "test_lyon", "schema": "public", "name": "decidim_debates_debates", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_debates_debates", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_debates_debates"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_debates_debates", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_debates_debates\"", "created_at": 1727441769.876269}, "source.demo.decidim.decidim_meetings_meetings": {"database": "test_lyon", "schema": "public", "name": "decidim_meetings_meetings", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_meetings_meetings", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_meetings_meetings"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_meetings_meetings", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_meetings_meetings\"", "created_at": 1727441769.8763251}, "source.demo.decidim.decidim_accountability_results": {"database": "test_lyon", "schema": "public", "name": "decidim_accountability_results", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_accountability_results", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_accountability_results"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_accountability_results", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_accountability_results\"", "created_at": 1727441769.8763819}, "source.demo.decidim.decidim_comments_comments": {"database": "test_lyon", "schema": "public", "name": "decidim_comments_comments", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_comments_comments", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_comments_comments"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_comments_comments", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_comments_comments\"", "created_at": 1727441769.876437}, "source.demo.decidim.decidim_proposals_collaborative_drafts": {"database": "test_lyon", "schema": "public", "name": "decidim_proposals_collaborative_drafts", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_proposals_collaborative_drafts", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_proposals_collaborative_drafts"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_proposals_collaborative_drafts", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_proposals_collaborative_drafts\"", "created_at": 1727441769.876491}, "source.demo.decidim.decidim_endorsements": {"database": "test_lyon", "schema": "public", "name": "decidim_endorsements", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_endorsements", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_endorsements"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_endorsements", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_endorsements\"", "created_at": 1727441769.876547}, "source.demo.decidim.decidim_follows": {"database": "test_lyon", "schema": "public", "name": "decidim_follows", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_follows", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_follows"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_follows", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_follows\"", "created_at": 1727441769.876603}, "source.demo.decidim.decidim_initiatives": {"database": "test_lyon", "schema": "public", "name": "decidim_initiatives", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_initiatives", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_initiatives"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_initiatives", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_initiatives\"", "created_at": 1727441769.876657}, "source.demo.decidim.decidim_initiatives_type_scopes": {"database": "test_lyon", "schema": "public", "name": "decidim_initiatives_type_scopes", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_initiatives_type_scopes", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_initiatives_type_scopes"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_initiatives_type_scopes", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_initiatives_type_scopes\"", "created_at": 1727441769.8767118}, "source.demo.decidim.decidim_surveys_surveys": {"database": "test_lyon", "schema": "public", "name": "decidim_surveys_surveys", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_surveys_surveys", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_surveys_surveys"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_surveys_surveys", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_surveys_surveys\"", "created_at": 1727441769.876767}, "source.demo.decidim.decidim_attachments": {"database": "test_lyon", "schema": "public", "name": "decidim_attachments", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_attachments", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_attachments"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_attachments", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_attachments\"", "created_at": 1727441769.876822}, "source.demo.decidim.decidim_proposals_proposal_votes": {"database": "test_lyon", "schema": "public", "name": "decidim_proposals_proposal_votes", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_proposals_proposal_votes", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_proposals_proposal_votes"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_proposals_proposal_votes", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_proposals_proposal_votes\"", "created_at": 1727441769.8768792}, "source.demo.decidim.decidim_meetings_registrations": {"database": "test_lyon", "schema": "public", "name": "decidim_meetings_registrations", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/schema.yml", "original_file_path": "models/staging/decidim/schema.yml", "unique_id": "source.demo.decidim.decidim_meetings_registrations", "fqn": ["demo", "staging", "decidim", "decidim", "decidim_meetings_registrations"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_meetings_registrations", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_meetings_registrations\"", "created_at": 1727441769.876936}, "source.demo.decidim.decidim_organizations": {"database": "test_lyon", "schema": "public", "name": "decidim_organizations", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/organizations/schema.yml", "original_file_path": "models/staging/decidim/organizations/schema.yml", "unique_id": "source.demo.decidim.decidim_organizations", "fqn": ["demo", "staging", "decidim", "organizations", "decidim", "decidim_organizations"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_organizations", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "Table containing organization informations", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_organizations\"", "created_at": 1727441769.876991}, "source.demo.decidim.decidim_forms_answer_choices": {"database": "test_lyon", "schema": "public", "name": "decidim_forms_answer_choices", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/forms/schema.yml", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "source.demo.decidim.decidim_forms_answer_choices", "fqn": ["demo", "staging", "decidim", "forms", "decidim", "decidim_forms_answer_choices"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_forms_answer_choices", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_forms_answer_choices\"", "created_at": 1727441769.877047}, "source.demo.decidim.decidim_forms_answers": {"database": "test_lyon", "schema": "public", "name": "decidim_forms_answers", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/forms/schema.yml", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "source.demo.decidim.decidim_forms_answers", "fqn": ["demo", "staging", "decidim", "forms", "decidim", "decidim_forms_answers"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_forms_answers", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_forms_answers\"", "created_at": 1727441769.877271}, "source.demo.decidim.decidim_forms_question_matrix_rows": {"database": "test_lyon", "schema": "public", "name": "decidim_forms_question_matrix_rows", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/forms/schema.yml", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "source.demo.decidim.decidim_forms_question_matrix_rows", "fqn": ["demo", "staging", "decidim", "forms", "decidim", "decidim_forms_question_matrix_rows"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_forms_question_matrix_rows", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_forms_question_matrix_rows\"", "created_at": 1727441769.877335}, "source.demo.decidim.decidim_forms_questionnaires": {"database": "test_lyon", "schema": "public", "name": "decidim_forms_questionnaires", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/forms/schema.yml", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "source.demo.decidim.decidim_forms_questionnaires", "fqn": ["demo", "staging", "decidim", "forms", "decidim", "decidim_forms_questionnaires"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_forms_questionnaires", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_forms_questionnaires\"", "created_at": 1727441769.877393}, "source.demo.decidim.decidim_forms_questions": {"database": "test_lyon", "schema": "public", "name": "decidim_forms_questions", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/forms/schema.yml", "original_file_path": "models/staging/decidim/forms/schema.yml", "unique_id": "source.demo.decidim.decidim_forms_questions", "fqn": ["demo", "staging", "decidim", "forms", "decidim", "decidim_forms_questions"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_forms_questions", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_forms_questions\"", "created_at": 1727441769.877449}, "source.demo.decidim.decidim_areas": {"database": "test_lyon", "schema": "public", "name": "decidim_areas", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/areas/schema.yml", "original_file_path": "models/staging/decidim/areas/schema.yml", "unique_id": "source.demo.decidim.decidim_areas", "fqn": ["demo", "staging", "decidim", "areas", "decidim", "decidim_areas"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_areas", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_areas\"", "created_at": 1727441769.877506}, "source.demo.decidim.decidim_area_types": {"database": "test_lyon", "schema": "public", "name": "decidim_area_types", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/areas/schema.yml", "original_file_path": "models/staging/decidim/areas/schema.yml", "unique_id": "source.demo.decidim.decidim_area_types", "fqn": ["demo", "staging", "decidim", "areas", "decidim", "decidim_area_types"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_area_types", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_area_types\"", "created_at": 1727441769.877562}, "source.demo.decidim.decidim_budgets_projects": {"database": "test_lyon", "schema": "public", "name": "decidim_budgets_projects", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/budgets/schema.yml", "original_file_path": "models/staging/decidim/budgets/schema.yml", "unique_id": "source.demo.decidim.decidim_budgets_projects", "fqn": ["demo", "staging", "decidim", "budgets", "decidim", "decidim_budgets_projects"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_budgets_projects", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_budgets_projects\"", "created_at": 1727441769.877619}, "source.demo.decidim.decidim_budgets_budgets": {"database": "test_lyon", "schema": "public", "name": "decidim_budgets_budgets", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/budgets/schema.yml", "original_file_path": "models/staging/decidim/budgets/schema.yml", "unique_id": "source.demo.decidim.decidim_budgets_budgets", "fqn": ["demo", "staging", "decidim", "budgets", "decidim", "decidim_budgets_budgets"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_budgets_budgets", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_budgets_budgets\"", "created_at": 1727441769.877673}, "source.demo.decidim.decidim_budgets_line_items": {"database": "test_lyon", "schema": "public", "name": "decidim_budgets_line_items", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/budgets/schema.yml", "original_file_path": "models/staging/decidim/budgets/schema.yml", "unique_id": "source.demo.decidim.decidim_budgets_line_items", "fqn": ["demo", "staging", "decidim", "budgets", "decidim", "decidim_budgets_line_items"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_budgets_line_items", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_budgets_line_items\"", "created_at": 1727441769.877729}, "source.demo.decidim.decidim_budgets_orders": {"database": "test_lyon", "schema": "public", "name": "decidim_budgets_orders", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/budgets/schema.yml", "original_file_path": "models/staging/decidim/budgets/schema.yml", "unique_id": "source.demo.decidim.decidim_budgets_orders", "fqn": ["demo", "staging", "decidim", "budgets", "decidim", "decidim_budgets_orders"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_budgets_orders", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_budgets_orders\"", "created_at": 1727441769.8777852}, "source.demo.decidim.decidim_categories": {"database": "test_lyon", "schema": "public", "name": "decidim_categories", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/categories/schema.yml", "original_file_path": "models/staging/decidim/categories/schema.yml", "unique_id": "source.demo.decidim.decidim_categories", "fqn": ["demo", "staging", "decidim", "categories", "decidim", "decidim_categories"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_categories", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_categories\"", "created_at": 1727441769.877841}, "source.demo.decidim.decidim_categorizations": {"database": "test_lyon", "schema": "public", "name": "decidim_categorizations", "resource_type": "source", "package_name": "demo", "path": "models/staging/decidim/categories/schema.yml", "original_file_path": "models/staging/decidim/categories/schema.yml", "unique_id": "source.demo.decidim.decidim_categorizations", "fqn": ["demo", "staging", "decidim", "categories", "decidim", "decidim_categorizations"], "source_name": "decidim", "source_description": "", "loader": "", "identifier": "decidim_categorizations", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"test_lyon\".\"public\".\"decidim_categorizations\"", "created_at": 1727441769.877898}}, "macros": {"macro.dbt_postgres.postgres__current_timestamp": {"name": "postgres__current_timestamp", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__current_timestamp", "macro_sql": "{% macro postgres__current_timestamp() -%}\n now()\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0357308, "supported_languages": null}, "macro.dbt_postgres.postgres__snapshot_string_as_time": {"name": "postgres__snapshot_string_as_time", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__snapshot_string_as_time", "macro_sql": "{% macro postgres__snapshot_string_as_time(timestamp) -%}\n {%- set result = \"'\" ~ timestamp ~ \"'::timestamp without time zone\" -%}\n {{ return(result) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.035918, "supported_languages": null}, "macro.dbt_postgres.postgres__snapshot_get_time": {"name": "postgres__snapshot_get_time", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__snapshot_get_time", "macro_sql": "{% macro postgres__snapshot_get_time() -%}\n {{ current_timestamp() }}::timestamp without time zone\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.036009, "supported_languages": null}, "macro.dbt_postgres.postgres__current_timestamp_backcompat": {"name": "postgres__current_timestamp_backcompat", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__current_timestamp_backcompat", "macro_sql": "{% macro postgres__current_timestamp_backcompat() %}\n current_timestamp::{{ type_timestamp() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.type_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.036087, "supported_languages": null}, "macro.dbt_postgres.postgres__current_timestamp_in_utc_backcompat": {"name": "postgres__current_timestamp_in_utc_backcompat", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__current_timestamp_in_utc_backcompat", "macro_sql": "{% macro postgres__current_timestamp_in_utc_backcompat() %}\n (current_timestamp at time zone 'utc')::{{ type_timestamp() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.type_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.036167, "supported_languages": null}, "macro.dbt_postgres.postgres__get_catalog_relations": {"name": "postgres__get_catalog_relations", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/catalog.sql", "original_file_path": "macros/catalog.sql", "unique_id": "macro.dbt_postgres.postgres__get_catalog_relations", "macro_sql": "{% macro postgres__get_catalog_relations(information_schema, relations) -%}\n {%- call statement('catalog', fetch_result=True) -%}\n\n {#\n If the user has multiple databases set and the first one is wrong, this will fail.\n But we won't fail in the case where there are multiple quoting-difference-only dbs, which is better.\n #}\n {% set database = information_schema.database %}\n {{ adapter.verify_database(database) }}\n\n select\n '{{ database }}' as table_database,\n sch.nspname as table_schema,\n tbl.relname as table_name,\n case tbl.relkind\n when 'v' then 'VIEW'\n when 'm' then 'MATERIALIZED VIEW'\n else 'BASE TABLE'\n end as table_type,\n tbl_desc.description as table_comment,\n col.attname as column_name,\n col.attnum as column_index,\n pg_catalog.format_type(col.atttypid, col.atttypmod) as column_type,\n col_desc.description as column_comment,\n pg_get_userbyid(tbl.relowner) as table_owner\n\n from pg_catalog.pg_namespace sch\n join pg_catalog.pg_class tbl on tbl.relnamespace = sch.oid\n join pg_catalog.pg_attribute col on col.attrelid = tbl.oid\n left outer join pg_catalog.pg_description tbl_desc on (tbl_desc.objoid = tbl.oid and tbl_desc.objsubid = 0)\n left outer join pg_catalog.pg_description col_desc on (col_desc.objoid = tbl.oid and col_desc.objsubid = col.attnum)\n where (\n {%- for relation in relations -%}\n {%- if relation.identifier -%}\n (upper(sch.nspname) = upper('{{ relation.schema }}') and\n upper(tbl.relname) = upper('{{ relation.identifier }}'))\n {%- else-%}\n upper(sch.nspname) = upper('{{ relation.schema }}')\n {%- endif -%}\n {%- if not loop.last %} or {% endif -%}\n {%- endfor -%}\n )\n and not pg_is_other_temp_schema(sch.oid) -- not a temporary schema belonging to another session\n and tbl.relpersistence in ('p', 'u') -- [p]ermanent table or [u]nlogged table. Exclude [t]emporary tables\n and tbl.relkind in ('r', 'v', 'f', 'p', 'm') -- o[r]dinary table, [v]iew, [f]oreign table, [p]artitioned table, [m]aterialized view. Other values are [i]ndex, [S]equence, [c]omposite type, [t]OAST table\n and col.attnum > 0 -- negative numbers are used for system columns such as oid\n and not col.attisdropped -- column as not been dropped\n\n order by\n sch.nspname,\n tbl.relname,\n col.attnum\n\n {%- endcall -%}\n\n {{ return(load_result('catalog').table) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0373151, "supported_languages": null}, "macro.dbt_postgres.postgres__get_catalog": {"name": "postgres__get_catalog", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/catalog.sql", "original_file_path": "macros/catalog.sql", "unique_id": "macro.dbt_postgres.postgres__get_catalog", "macro_sql": "{% macro postgres__get_catalog(information_schema, schemas) -%}\n {%- set relations = [] -%}\n {%- for schema in schemas -%}\n {%- set dummy = relations.append({'schema': schema}) -%}\n {%- endfor -%}\n {{ return(postgres__get_catalog_relations(information_schema, relations)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_catalog_relations"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.037568, "supported_languages": null}, "macro.dbt_postgres.postgres__get_relations": {"name": "postgres__get_relations", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations.sql", "original_file_path": "macros/relations.sql", "unique_id": "macro.dbt_postgres.postgres__get_relations", "macro_sql": "{% macro postgres__get_relations() -%}\n\n {#\n -- in pg_depend, objid is the dependent, refobjid is the referenced object\n -- > a pg_depend entry indicates that the referenced object cannot be\n -- > dropped without also dropping the dependent object.\n #}\n\n {%- call statement('relations', fetch_result=True) -%}\n with relation as (\n select\n pg_rewrite.ev_class as class,\n pg_rewrite.oid as id\n from pg_rewrite\n ),\n class as (\n select\n oid as id,\n relname as name,\n relnamespace as schema,\n relkind as kind\n from pg_class\n ),\n dependency as (\n select distinct\n pg_depend.objid as id,\n pg_depend.refobjid as ref\n from pg_depend\n ),\n schema as (\n select\n pg_namespace.oid as id,\n pg_namespace.nspname as name\n from pg_namespace\n where nspname != 'information_schema' and nspname not like 'pg\\_%'\n ),\n referenced as (\n select\n relation.id AS id,\n referenced_class.name ,\n referenced_class.schema ,\n referenced_class.kind\n from relation\n join class as referenced_class on relation.class=referenced_class.id\n where referenced_class.kind in ('r', 'v', 'm')\n ),\n relationships as (\n select\n referenced.name as referenced_name,\n referenced.schema as referenced_schema_id,\n dependent_class.name as dependent_name,\n dependent_class.schema as dependent_schema_id,\n referenced.kind as kind\n from referenced\n join dependency on referenced.id=dependency.id\n join class as dependent_class on dependency.ref=dependent_class.id\n where\n (referenced.name != dependent_class.name or\n referenced.schema != dependent_class.schema)\n )\n\n select\n referenced_schema.name as referenced_schema,\n relationships.referenced_name as referenced_name,\n dependent_schema.name as dependent_schema,\n relationships.dependent_name as dependent_name\n from relationships\n join schema as dependent_schema on relationships.dependent_schema_id=dependent_schema.id\n join schema as referenced_schema on relationships.referenced_schema_id=referenced_schema.id\n group by referenced_schema, referenced_name, dependent_schema, dependent_name\n order by referenced_schema, referenced_name, dependent_schema, dependent_name;\n\n {%- endcall -%}\n\n {{ return(load_result('relations').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.038083, "supported_languages": null}, "macro.dbt_postgres.postgres_get_relations": {"name": "postgres_get_relations", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations.sql", "original_file_path": "macros/relations.sql", "unique_id": "macro.dbt_postgres.postgres_get_relations", "macro_sql": "{% macro postgres_get_relations() %}\n {{ return(postgres__get_relations()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_relations"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.038173, "supported_languages": null}, "macro.dbt_postgres.postgres__create_table_as": {"name": "postgres__create_table_as", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__create_table_as", "macro_sql": "{% macro postgres__create_table_as(temporary, relation, sql) -%}\n {%- set unlogged = config.get('unlogged', default=false) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {{ sql_header if sql_header is not none }}\n\n create {% if temporary -%}\n temporary\n {%- elif unlogged -%}\n unlogged\n {%- endif %} table {{ relation }}\n {% set contract_config = config.get('contract') %}\n {% if contract_config.enforced %}\n {{ get_assert_columns_equivalent(sql) }}\n {% endif -%}\n {% if contract_config.enforced and (not temporary) -%}\n {{ get_table_columns_and_constraints() }} ;\n insert into {{ relation }} (\n {{ adapter.dispatch('get_column_names', 'dbt')() }}\n )\n {%- set sql = get_select_subquery(sql) %}\n {% else %}\n as\n {% endif %}\n (\n {{ sql }}\n );\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_assert_columns_equivalent", "macro.dbt.get_table_columns_and_constraints", "macro.dbt.default__get_column_names", "macro.dbt.get_select_subquery"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.045192, "supported_languages": null}, "macro.dbt_postgres.postgres__get_create_index_sql": {"name": "postgres__get_create_index_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_create_index_sql", "macro_sql": "{% macro postgres__get_create_index_sql(relation, index_dict) -%}\n {%- set index_config = adapter.parse_index(index_dict) -%}\n {%- set comma_separated_columns = \", \".join(index_config.columns) -%}\n {%- set index_name = index_config.render(relation) -%}\n\n create {% if index_config.unique -%}\n unique\n {%- endif %} index if not exists\n \"{{ index_name }}\"\n on {{ relation }} {% if index_config.type -%}\n using {{ index_config.type }}\n {%- endif %}\n ({{ comma_separated_columns }})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.045526, "supported_languages": null}, "macro.dbt_postgres.postgres__create_schema": {"name": "postgres__create_schema", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__create_schema", "macro_sql": "{% macro postgres__create_schema(relation) -%}\n {% if relation.database -%}\n {{ adapter.verify_database(relation.database) }}\n {%- endif -%}\n {%- call statement('create_schema') -%}\n create schema if not exists {{ relation.without_identifier().include(database=False) }}\n {%- endcall -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.045741, "supported_languages": null}, "macro.dbt_postgres.postgres__drop_schema": {"name": "postgres__drop_schema", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__drop_schema", "macro_sql": "{% macro postgres__drop_schema(relation) -%}\n {% if relation.database -%}\n {{ adapter.verify_database(relation.database) }}\n {%- endif -%}\n {%- call statement('drop_schema') -%}\n drop schema if exists {{ relation.without_identifier().include(database=False) }} cascade\n {%- endcall -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.045959, "supported_languages": null}, "macro.dbt_postgres.postgres__get_columns_in_relation": {"name": "postgres__get_columns_in_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_columns_in_relation", "macro_sql": "{% macro postgres__get_columns_in_relation(relation) -%}\n {% call statement('get_columns_in_relation', fetch_result=True) %}\n select\n column_name,\n data_type,\n character_maximum_length,\n numeric_precision,\n numeric_scale\n\n from {{ relation.information_schema('columns') }}\n where table_name = '{{ relation.identifier }}'\n {% if relation.schema %}\n and table_schema = '{{ relation.schema }}'\n {% endif %}\n order by ordinal_position\n\n {% endcall %}\n {% set table = load_result('get_columns_in_relation').table %}\n {{ return(sql_convert_columns_in_relation(table)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.sql_convert_columns_in_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.04627, "supported_languages": null}, "macro.dbt_postgres.postgres__list_relations_without_caching": {"name": "postgres__list_relations_without_caching", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__list_relations_without_caching", "macro_sql": "{% macro postgres__list_relations_without_caching(schema_relation) %}\n {% call statement('list_relations_without_caching', fetch_result=True) -%}\n select\n '{{ schema_relation.database }}' as database,\n tablename as name,\n schemaname as schema,\n 'table' as type\n from pg_tables\n where schemaname ilike '{{ schema_relation.schema }}'\n union all\n select\n '{{ schema_relation.database }}' as database,\n viewname as name,\n schemaname as schema,\n 'view' as type\n from pg_views\n where schemaname ilike '{{ schema_relation.schema }}'\n union all\n select\n '{{ schema_relation.database }}' as database,\n matviewname as name,\n schemaname as schema,\n 'materialized_view' as type\n from pg_matviews\n where schemaname ilike '{{ schema_relation.schema }}'\n {% endcall %}\n {{ return(load_result('list_relations_without_caching').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.046558, "supported_languages": null}, "macro.dbt_postgres.postgres__information_schema_name": {"name": "postgres__information_schema_name", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__information_schema_name", "macro_sql": "{% macro postgres__information_schema_name(database) -%}\n {% if database_name -%}\n {{ adapter.verify_database(database_name) }}\n {%- endif -%}\n information_schema\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.046676, "supported_languages": null}, "macro.dbt_postgres.postgres__list_schemas": {"name": "postgres__list_schemas", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__list_schemas", "macro_sql": "{% macro postgres__list_schemas(database) %}\n {% if database -%}\n {{ adapter.verify_database(database) }}\n {%- endif -%}\n {% call statement('list_schemas', fetch_result=True, auto_begin=False) %}\n select distinct nspname from pg_namespace\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0468988, "supported_languages": null}, "macro.dbt_postgres.postgres__check_schema_exists": {"name": "postgres__check_schema_exists", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__check_schema_exists", "macro_sql": "{% macro postgres__check_schema_exists(information_schema, schema) -%}\n {% if information_schema.database -%}\n {{ adapter.verify_database(information_schema.database) }}\n {%- endif -%}\n {% call statement('check_schema_exists', fetch_result=True, auto_begin=False) %}\n select count(*) from pg_namespace where nspname = '{{ schema }}'\n {% endcall %}\n {{ return(load_result('check_schema_exists').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.047148, "supported_languages": null}, "macro.dbt_postgres.postgres__make_relation_with_suffix": {"name": "postgres__make_relation_with_suffix", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_relation_with_suffix", "macro_sql": "{% macro postgres__make_relation_with_suffix(base_relation, suffix, dstring) %}\n {% if dstring %}\n {% set dt = modules.datetime.datetime.now() %}\n {% set dtstring = dt.strftime(\"%H%M%S%f\") %}\n {% set suffix = suffix ~ dtstring %}\n {% endif %}\n {% set suffix_length = suffix|length %}\n {% set relation_max_name_length = base_relation.relation_max_name_length() %}\n {% if suffix_length > relation_max_name_length %}\n {% do exceptions.raise_compiler_error('Relation suffix is too long (' ~ suffix_length ~ ' characters). Maximum length is ' ~ relation_max_name_length ~ ' characters.') %}\n {% endif %}\n {% set identifier = base_relation.identifier[:relation_max_name_length - suffix_length] ~ suffix %}\n\n {{ return(base_relation.incorporate(path={\"identifier\": identifier })) }}\n\n {% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0477, "supported_languages": null}, "macro.dbt_postgres.postgres__make_intermediate_relation": {"name": "postgres__make_intermediate_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_intermediate_relation", "macro_sql": "{% macro postgres__make_intermediate_relation(base_relation, suffix) %}\n {{ return(postgres__make_relation_with_suffix(base_relation, suffix, dstring=False)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_relation_with_suffix"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.047832, "supported_languages": null}, "macro.dbt_postgres.postgres__make_temp_relation": {"name": "postgres__make_temp_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_temp_relation", "macro_sql": "{% macro postgres__make_temp_relation(base_relation, suffix) %}\n {% set temp_relation = postgres__make_relation_with_suffix(base_relation, suffix, dstring=True) %}\n {{ return(temp_relation.incorporate(path={\"schema\": none,\n \"database\": none})) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_relation_with_suffix"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.048047, "supported_languages": null}, "macro.dbt_postgres.postgres__make_backup_relation": {"name": "postgres__make_backup_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_backup_relation", "macro_sql": "{% macro postgres__make_backup_relation(base_relation, backup_relation_type, suffix) %}\n {% set backup_relation = postgres__make_relation_with_suffix(base_relation, suffix, dstring=False) %}\n {{ return(backup_relation.incorporate(type=backup_relation_type)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_relation_with_suffix"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.048228, "supported_languages": null}, "macro.dbt_postgres.postgres_escape_comment": {"name": "postgres_escape_comment", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres_escape_comment", "macro_sql": "{% macro postgres_escape_comment(comment) -%}\n {% if comment is not string %}\n {% do exceptions.raise_compiler_error('cannot escape a non-string: ' ~ comment) %}\n {% endif %}\n {%- set magic = '$dbt_comment_literal_block$' -%}\n {%- if magic in comment -%}\n {%- do exceptions.raise_compiler_error('The string ' ~ magic ~ ' is not allowed in comments.') -%}\n {%- endif -%}\n {{ magic }}{{ comment }}{{ magic }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.048515, "supported_languages": null}, "macro.dbt_postgres.postgres__alter_relation_comment": {"name": "postgres__alter_relation_comment", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__alter_relation_comment", "macro_sql": "{% macro postgres__alter_relation_comment(relation, comment) %}\n {% set escaped_comment = postgres_escape_comment(comment) %}\n comment on {{ relation.type }} {{ relation }} is {{ escaped_comment }};\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres_escape_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.048667, "supported_languages": null}, "macro.dbt_postgres.postgres__alter_column_comment": {"name": "postgres__alter_column_comment", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__alter_column_comment", "macro_sql": "{% macro postgres__alter_column_comment(relation, column_dict) %}\n {% set existing_columns = adapter.get_columns_in_relation(relation) | map(attribute=\"name\") | list %}\n {% for column_name in column_dict if (column_name in existing_columns) %}\n {% set comment = column_dict[column_name]['description'] %}\n {% set escaped_comment = postgres_escape_comment(comment) %}\n comment on column {{ relation }}.{{ adapter.quote(column_name) if column_dict[column_name]['quote'] else column_name }} is {{ escaped_comment }};\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres_escape_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.049053, "supported_languages": null}, "macro.dbt_postgres.postgres__get_show_grant_sql": {"name": "postgres__get_show_grant_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_show_grant_sql", "macro_sql": "\n\n{%- macro postgres__get_show_grant_sql(relation) -%}\n select grantee, privilege_type\n from {{ relation.information_schema('role_table_grants') }}\n where grantor = current_role\n and grantee != current_role\n and table_schema = '{{ relation.schema }}'\n and table_name = '{{ relation.identifier }}'\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.049193, "supported_languages": null}, "macro.dbt_postgres.postgres__copy_grants": {"name": "postgres__copy_grants", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__copy_grants", "macro_sql": "{% macro postgres__copy_grants() %}\n {{ return(False) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.049271, "supported_languages": null}, "macro.dbt_postgres.postgres__get_show_indexes_sql": {"name": "postgres__get_show_indexes_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_show_indexes_sql", "macro_sql": "{% macro postgres__get_show_indexes_sql(relation) %}\n select\n i.relname as name,\n m.amname as method,\n ix.indisunique as \"unique\",\n array_to_string(array_agg(a.attname), ',') as column_names\n from pg_index ix\n join pg_class i\n on i.oid = ix.indexrelid\n join pg_am m\n on m.oid=i.relam\n join pg_class t\n on t.oid = ix.indrelid\n join pg_namespace n\n on n.oid = t.relnamespace\n join pg_attribute a\n on a.attrelid = t.oid\n and a.attnum = ANY(ix.indkey)\n where t.relname = '{{ relation.identifier }}'\n and n.nspname = '{{ relation.schema }}'\n and t.relkind in ('r', 'm')\n group by 1, 2, 3\n order by 1, 2, 3\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.049398, "supported_languages": null}, "macro.dbt_postgres.postgres__get_drop_index_sql": {"name": "postgres__get_drop_index_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_drop_index_sql", "macro_sql": "\n\n\n{%- macro postgres__get_drop_index_sql(relation, index_name) -%}\n drop index if exists \"{{ relation.schema }}\".\"{{ index_name }}\"\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.049498, "supported_languages": null}, "macro.dbt_postgres.postgres__get_incremental_default_sql": {"name": "postgres__get_incremental_default_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/incremental_strategies.sql", "original_file_path": "macros/materializations/incremental_strategies.sql", "unique_id": "macro.dbt_postgres.postgres__get_incremental_default_sql", "macro_sql": "{% macro postgres__get_incremental_default_sql(arg_dict) %}\n\n {% if arg_dict[\"unique_key\"] %}\n {% do return(get_incremental_delete_insert_sql(arg_dict)) %}\n {% else %}\n {% do return(get_incremental_append_sql(arg_dict)) %}\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_incremental_delete_insert_sql", "macro.dbt.get_incremental_append_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.049758, "supported_languages": null}, "macro.dbt_postgres.postgres__snapshot_merge_sql": {"name": "postgres__snapshot_merge_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/snapshot_merge.sql", "original_file_path": "macros/materializations/snapshot_merge.sql", "unique_id": "macro.dbt_postgres.postgres__snapshot_merge_sql", "macro_sql": "{% macro postgres__snapshot_merge_sql(target, source, insert_cols) -%}\n {%- set insert_cols_csv = insert_cols | join(', ') -%}\n\n update {{ target }}\n set dbt_valid_to = DBT_INTERNAL_SOURCE.dbt_valid_to\n from {{ source }} as DBT_INTERNAL_SOURCE\n where DBT_INTERNAL_SOURCE.dbt_scd_id::text = {{ target }}.dbt_scd_id::text\n and DBT_INTERNAL_SOURCE.dbt_change_type::text in ('update'::text, 'delete'::text)\n and {{ target }}.dbt_valid_to is null;\n\n insert into {{ target }} ({{ insert_cols_csv }})\n select {% for column in insert_cols -%}\n DBT_INTERNAL_SOURCE.{{ column }} {%- if not loop.last %}, {%- endif %}\n {%- endfor %}\n from {{ source }} as DBT_INTERNAL_SOURCE\n where DBT_INTERNAL_SOURCE.dbt_change_type::text = 'insert'::text;\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0502982, "supported_languages": null}, "macro.dbt_postgres.postgres__drop_materialized_view": {"name": "postgres__drop_materialized_view", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/drop.sql", "original_file_path": "macros/relations/materialized_view/drop.sql", "unique_id": "macro.dbt_postgres.postgres__drop_materialized_view", "macro_sql": "{% macro postgres__drop_materialized_view(relation) -%}\n drop materialized view if exists {{ relation }} cascade\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.050405, "supported_languages": null}, "macro.dbt_postgres.postgres__describe_materialized_view": {"name": "postgres__describe_materialized_view", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/describe.sql", "original_file_path": "macros/relations/materialized_view/describe.sql", "unique_id": "macro.dbt_postgres.postgres__describe_materialized_view", "macro_sql": "{% macro postgres__describe_materialized_view(relation) %}\n -- for now just get the indexes, we don't need the name or the query yet\n {% set _indexes = run_query(get_show_indexes_sql(relation)) %}\n {% do return({'indexes': _indexes}) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query", "macro.dbt.get_show_indexes_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.050606, "supported_languages": null}, "macro.dbt_postgres.postgres__refresh_materialized_view": {"name": "postgres__refresh_materialized_view", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/refresh.sql", "original_file_path": "macros/relations/materialized_view/refresh.sql", "unique_id": "macro.dbt_postgres.postgres__refresh_materialized_view", "macro_sql": "{% macro postgres__refresh_materialized_view(relation) %}\n refresh materialized view {{ relation }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.050706, "supported_languages": null}, "macro.dbt_postgres.postgres__get_rename_materialized_view_sql": {"name": "postgres__get_rename_materialized_view_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/rename.sql", "original_file_path": "macros/relations/materialized_view/rename.sql", "unique_id": "macro.dbt_postgres.postgres__get_rename_materialized_view_sql", "macro_sql": "{% macro postgres__get_rename_materialized_view_sql(relation, new_name) %}\n alter materialized view {{ relation }} rename to {{ new_name }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.050826, "supported_languages": null}, "macro.dbt_postgres.postgres__get_alter_materialized_view_as_sql": {"name": "postgres__get_alter_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/alter.sql", "original_file_path": "macros/relations/materialized_view/alter.sql", "unique_id": "macro.dbt_postgres.postgres__get_alter_materialized_view_as_sql", "macro_sql": "{% macro postgres__get_alter_materialized_view_as_sql(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n) %}\n\n -- apply a full refresh immediately if needed\n {% if configuration_changes.requires_full_refresh %}\n\n {{ get_replace_sql(existing_relation, relation, sql) }}\n\n -- otherwise apply individual changes as needed\n {% else %}\n\n {{ postgres__update_indexes_on_materialized_view(relation, configuration_changes.indexes) }}\n\n {%- endif -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_replace_sql", "macro.dbt_postgres.postgres__update_indexes_on_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.051483, "supported_languages": null}, "macro.dbt_postgres.postgres__update_indexes_on_materialized_view": {"name": "postgres__update_indexes_on_materialized_view", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/alter.sql", "original_file_path": "macros/relations/materialized_view/alter.sql", "unique_id": "macro.dbt_postgres.postgres__update_indexes_on_materialized_view", "macro_sql": "\n\n\n{%- macro postgres__update_indexes_on_materialized_view(relation, index_changes) -%}\n {{- log(\"Applying UPDATE INDEXES to: \" ~ relation) -}}\n\n {%- for _index_change in index_changes -%}\n {%- set _index = _index_change.context -%}\n\n {%- if _index_change.action == \"drop\" -%}\n\n {{ postgres__get_drop_index_sql(relation, _index.name) }}\n\n {%- elif _index_change.action == \"create\" -%}\n\n {{ postgres__get_create_index_sql(relation, _index.as_node_config) }}\n\n {%- endif -%}\n\t{{ ';' if not loop.last else \"\" }}\n\n {%- endfor -%}\n\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_drop_index_sql", "macro.dbt_postgres.postgres__get_create_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0519161, "supported_languages": null}, "macro.dbt_postgres.postgres__get_materialized_view_configuration_changes": {"name": "postgres__get_materialized_view_configuration_changes", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/alter.sql", "original_file_path": "macros/relations/materialized_view/alter.sql", "unique_id": "macro.dbt_postgres.postgres__get_materialized_view_configuration_changes", "macro_sql": "{% macro postgres__get_materialized_view_configuration_changes(existing_relation, new_config) %}\n {% set _existing_materialized_view = postgres__describe_materialized_view(existing_relation) %}\n {% set _configuration_changes = existing_relation.get_materialized_view_config_change_collection(_existing_materialized_view, new_config.model) %}\n {% do return(_configuration_changes) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__describe_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.052115, "supported_languages": null}, "macro.dbt_postgres.postgres__get_create_materialized_view_as_sql": {"name": "postgres__get_create_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/materialized_view/create.sql", "original_file_path": "macros/relations/materialized_view/create.sql", "unique_id": "macro.dbt_postgres.postgres__get_create_materialized_view_as_sql", "macro_sql": "{% macro postgres__get_create_materialized_view_as_sql(relation, sql) %}\n create materialized view if not exists {{ relation }} as {{ sql }};\n\n {% for _index_dict in config.get('indexes', []) -%}\n {{- get_create_index_sql(relation, _index_dict) -}}{{ ';' if not loop.last else \"\" }}\n {%- endfor -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_create_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.052416, "supported_languages": null}, "macro.dbt_postgres.postgres__drop_table": {"name": "postgres__drop_table", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/table/drop.sql", "original_file_path": "macros/relations/table/drop.sql", "unique_id": "macro.dbt_postgres.postgres__drop_table", "macro_sql": "{% macro postgres__drop_table(relation) -%}\n drop table if exists {{ relation }} cascade\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.052514, "supported_languages": null}, "macro.dbt_postgres.postgres__get_replace_table_sql": {"name": "postgres__get_replace_table_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/table/replace.sql", "original_file_path": "macros/relations/table/replace.sql", "unique_id": "macro.dbt_postgres.postgres__get_replace_table_sql", "macro_sql": "{% macro postgres__get_replace_table_sql(relation, sql) -%}\n\n {%- set sql_header = config.get('sql_header', none) -%}\n {{ sql_header if sql_header is not none }}\n\n create or replace table {{ relation }}\n {% set contract_config = config.get('contract') %}\n {% if contract_config.enforced %}\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\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.052979, "supported_languages": null}, "macro.dbt_postgres.postgres__get_rename_table_sql": {"name": "postgres__get_rename_table_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/table/rename.sql", "original_file_path": "macros/relations/table/rename.sql", "unique_id": "macro.dbt_postgres.postgres__get_rename_table_sql", "macro_sql": "{% macro postgres__get_rename_table_sql(relation, new_name) %}\n alter table {{ relation }} rename to {{ new_name }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0531, "supported_languages": null}, "macro.dbt_postgres.postgres__drop_view": {"name": "postgres__drop_view", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/view/drop.sql", "original_file_path": "macros/relations/view/drop.sql", "unique_id": "macro.dbt_postgres.postgres__drop_view", "macro_sql": "{% macro postgres__drop_view(relation) -%}\n drop view if exists {{ relation }} cascade\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.05319, "supported_languages": null}, "macro.dbt_postgres.postgres__get_replace_view_sql": {"name": "postgres__get_replace_view_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/view/replace.sql", "original_file_path": "macros/relations/view/replace.sql", "unique_id": "macro.dbt_postgres.postgres__get_replace_view_sql", "macro_sql": "{% macro postgres__get_replace_view_sql(relation, sql) -%}\n\n {%- set sql_header = config.get('sql_header', none) -%}\n {{ sql_header if sql_header is not none }}\n\n create or replace view {{ relation }}\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\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_assert_columns_equivalent"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0535629, "supported_languages": null}, "macro.dbt_postgres.postgres__get_rename_view_sql": {"name": "postgres__get_rename_view_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations/view/rename.sql", "original_file_path": "macros/relations/view/rename.sql", "unique_id": "macro.dbt_postgres.postgres__get_rename_view_sql", "macro_sql": "{% macro postgres__get_rename_view_sql(relation, new_name) %}\n alter view {{ relation }} rename to {{ new_name }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0536819, "supported_languages": null}, "macro.dbt_postgres.postgres__dateadd": {"name": "postgres__dateadd", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/dateadd.sql", "original_file_path": "macros/utils/dateadd.sql", "unique_id": "macro.dbt_postgres.postgres__dateadd", "macro_sql": "{% macro postgres__dateadd(datepart, interval, from_date_or_timestamp) %}\n\n {{ from_date_or_timestamp }} + ((interval '1 {{ datepart }}') * ({{ interval }}))\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.053824, "supported_languages": null}, "macro.dbt_postgres.postgres__listagg": {"name": "postgres__listagg", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/listagg.sql", "original_file_path": "macros/utils/listagg.sql", "unique_id": "macro.dbt_postgres.postgres__listagg", "macro_sql": "{% macro postgres__listagg(measure, delimiter_text, order_by_clause, limit_num) -%}\n\n {% if limit_num -%}\n array_to_string(\n (array_agg(\n {{ measure }}\n {% if order_by_clause -%}\n {{ order_by_clause }}\n {%- endif %}\n ))[1:{{ limit_num }}],\n {{ delimiter_text }}\n )\n {%- else %}\n string_agg(\n {{ measure }},\n {{ delimiter_text }}\n {% if order_by_clause -%}\n {{ order_by_clause }}\n {%- endif %}\n )\n {%- endif %}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.054253, "supported_languages": null}, "macro.dbt_postgres.postgres__datediff": {"name": "postgres__datediff", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/datediff.sql", "original_file_path": "macros/utils/datediff.sql", "unique_id": "macro.dbt_postgres.postgres__datediff", "macro_sql": "{% macro postgres__datediff(first_date, second_date, datepart) -%}\n\n {% if datepart == 'year' %}\n (date_part('year', ({{second_date}})::date) - date_part('year', ({{first_date}})::date))\n {% elif datepart == 'quarter' %}\n ({{ datediff(first_date, second_date, 'year') }} * 4 + date_part('quarter', ({{second_date}})::date) - date_part('quarter', ({{first_date}})::date))\n {% elif datepart == 'month' %}\n ({{ datediff(first_date, second_date, 'year') }} * 12 + date_part('month', ({{second_date}})::date) - date_part('month', ({{first_date}})::date))\n {% elif datepart == 'day' %}\n (({{second_date}})::date - ({{first_date}})::date)\n {% elif datepart == 'week' %}\n ({{ datediff(first_date, second_date, 'day') }} / 7 + case\n when date_part('dow', ({{first_date}})::timestamp) <= date_part('dow', ({{second_date}})::timestamp) then\n case when {{first_date}} <= {{second_date}} then 0 else -1 end\n else\n case when {{first_date}} <= {{second_date}} then 1 else 0 end\n end)\n {% elif datepart == 'hour' %}\n ({{ datediff(first_date, second_date, 'day') }} * 24 + date_part('hour', ({{second_date}})::timestamp) - date_part('hour', ({{first_date}})::timestamp))\n {% elif datepart == 'minute' %}\n ({{ datediff(first_date, second_date, 'hour') }} * 60 + date_part('minute', ({{second_date}})::timestamp) - date_part('minute', ({{first_date}})::timestamp))\n {% elif datepart == 'second' %}\n ({{ datediff(first_date, second_date, 'minute') }} * 60 + floor(date_part('second', ({{second_date}})::timestamp)) - floor(date_part('second', ({{first_date}})::timestamp)))\n {% elif datepart == 'millisecond' %}\n ({{ datediff(first_date, second_date, 'minute') }} * 60000 + floor(date_part('millisecond', ({{second_date}})::timestamp)) - floor(date_part('millisecond', ({{first_date}})::timestamp)))\n {% elif datepart == 'microsecond' %}\n ({{ datediff(first_date, second_date, 'minute') }} * 60000000 + floor(date_part('microsecond', ({{second_date}})::timestamp)) - floor(date_part('microsecond', ({{first_date}})::timestamp)))\n {% else %}\n {{ exceptions.raise_compiler_error(\"Unsupported datepart for macro datediff in postgres: {!r}\".format(datepart)) }}\n {% endif %}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.datediff"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.05651, "supported_languages": null}, "macro.dbt_postgres.postgres__any_value": {"name": "postgres__any_value", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/any_value.sql", "original_file_path": "macros/utils/any_value.sql", "unique_id": "macro.dbt_postgres.postgres__any_value", "macro_sql": "{% macro postgres__any_value(expression) -%}\n\n min({{ expression }})\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0566158, "supported_languages": null}, "macro.dbt_postgres.postgres__last_day": {"name": "postgres__last_day", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/last_day.sql", "original_file_path": "macros/utils/last_day.sql", "unique_id": "macro.dbt_postgres.postgres__last_day", "macro_sql": "{% macro postgres__last_day(date, datepart) -%}\n\n {%- if datepart == 'quarter' -%}\n -- postgres dateadd does not support quarter interval.\n cast(\n {{dbt.dateadd('day', '-1',\n dbt.dateadd('month', '3', dbt.date_trunc(datepart, date))\n )}}\n as date)\n {%- else -%}\n {{dbt.default_last_day(date, datepart)}}\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.dateadd", "macro.dbt.date_trunc", "macro.dbt.default_last_day"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.056951, "supported_languages": null}, "macro.dbt_postgres.postgres__split_part": {"name": "postgres__split_part", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/split_part.sql", "original_file_path": "macros/utils/split_part.sql", "unique_id": "macro.dbt_postgres.postgres__split_part", "macro_sql": "{% macro postgres__split_part(string_text, delimiter_text, part_number) %}\n\n {% if part_number >= 0 %}\n {{ dbt.default__split_part(string_text, delimiter_text, part_number) }}\n {% else %}\n {{ dbt._split_part_negative(string_text, delimiter_text, part_number) }}\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__split_part", "macro.dbt._split_part_negative"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.057227, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0579782, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.05811, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.058208, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.058305, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.058399, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.058669, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.058868, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0590641, "supported_languages": null}, "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_postgres.postgres__snapshot_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.059493, "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 and DBT_INTERNAL_DEST.{{ columns.dbt_valid_to }} is null\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"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.059835, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.062251, "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.default__snapshot_hash_arguments"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.062366, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0625181, "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 invalidate_hard_deletes = config.get('invalidate_hard_deletes') or false %}\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_id_expr = snapshot_hash_arguments([primary_key, updated_at]) %}\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 }) %}\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.063083, "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_postgres.postgres__snapshot_string_as_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.063197, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.063315, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.064239, "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 invalidate_hard_deletes = config.get('invalidate_hard_deletes') or false %}\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_id_expr = snapshot_hash_arguments([primary_key, updated_at]) %}\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 }) %}\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.06511, "supported_languages": null}, "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.default__create_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.070294, "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 \"{{ column.name }}\" {{ column.data_type }};\n {% endcall %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.070494, "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.default__post_snapshot"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.070608, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.070673, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.07077, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.070849, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.070983, "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'}) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0711339, "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\n with snapshot_query as (\n\n {{ source_sql }}\n\n ),\n\n snapshotted_data as (\n\n select *,\n {{ strategy.unique_key }} as dbt_unique_key\n\n from {{ target_relation }}\n where {{ columns.dbt_valid_to }} is null\n\n ),\n\n insertions_source_data as (\n\n select\n *,\n {{ strategy.unique_key }} as dbt_unique_key,\n {{ strategy.updated_at }} as {{ columns.dbt_updated_at }},\n {{ strategy.updated_at }} as {{ columns.dbt_valid_from }},\n nullif({{ strategy.updated_at }}, {{ strategy.updated_at }}) as {{ columns.dbt_valid_to }},\n {{ strategy.scd_id }} as {{ columns.dbt_scd_id }}\n\n from snapshot_query\n ),\n\n updates_source_data as (\n\n select\n *,\n {{ strategy.unique_key }} as dbt_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.invalidate_hard_deletes %}\n\n deletes_source_data as (\n\n select\n *,\n {{ strategy.unique_key }} as dbt_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\n from insertions_source_data as source_data\n left outer join snapshotted_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key\n where snapshotted_data.dbt_unique_key is null\n or (\n snapshotted_data.dbt_unique_key is not null\n and (\n {{ strategy.row_changed }}\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\n from updates_source_data as source_data\n join snapshotted_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key\n where (\n {{ strategy.row_changed }}\n )\n )\n\n {%- if strategy.invalidate_hard_deletes -%}\n ,\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\n from snapshotted_data\n left join deletes_source_data as source_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key\n where source_data.dbt_unique_key is null\n )\n {%- endif %}\n\n select * from insertions\n union all\n select * from updates\n {%- if strategy.invalidate_hard_deletes %}\n union all\n select * from deletes\n {%- endif %}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_snapshot_table_column_names", "macro.dbt.snapshot_get_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.071987, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.072117, "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 nullif({{ strategy.updated_at }}, {{ strategy.updated_at }}) as {{ columns.dbt_valid_to }}\n from (\n {{ sql }}\n ) sbq\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_snapshot_table_column_names"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.072402, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.072673, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.073063, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0733492, "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.valid_snapshot_target(target_relation, columns) }}\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 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\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0772219, "supported_languages": ["sql"]}, "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\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 {{ get_create_sql(target_relation, sql) }}\n {% endcall %}\n\n {% do relations.append(target_relation) %}\n\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 %}\n\n {% endif %}\n\n {% set limit = config.get('limit') %}\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 {{ get_test_sql(main_sql, fail_calc, warn_if, error_if, limit)}}\n\n {%- endcall %}\n\n {{ return({'relations': relations}) }}\n\n{%- endmaterialization -%}", "depends_on": {"macros": ["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}, "patch_path": null, "arguments": [], "created_at": 1727441769.079092, "supported_languages": ["sql"]}, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.079943, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.080147, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0802839, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.080682, "supported_languages": null}, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.080945, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0811899, "supported_languages": null}, "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\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 {%- for column in columns_in_relation -%}\n {%- do column_name_to_data_types.update({column.name|lower: column.data_type}) -%}\n {%- endfor -%}\n\n {% if not expected_sql %}\n {% set expected_sql = get_expected_sql(expected_rows, column_name_to_data_types) %}\n {% endif %}\n {% set unit_test_sql = get_unit_test_sql(sql, expected_sql, tested_expected_column_names) %}\n\n {% call statement('main', fetch_result=True) -%}\n\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.082382, "supported_languages": ["sql"]}, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.086219, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0864892, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.086659, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.087571, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.087734, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0881732, "supported_languages": null}, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0903091, "supported_languages": ["sql"]}, "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 -- 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 {% do create_indexes(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}, "patch_path": null, "arguments": [], "created_at": 1727441769.092577, "supported_languages": ["sql"]}, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.093944, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.094354, "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\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.data_type != tc.data_type and not sc.can_expand_to(other_column=tc) %}\n {{ result.append( { 'column_name': tc.name, 'new_type': sc.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}, "patch_path": null, "arguments": [], "created_at": 1727441769.0948532, "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.default__get_merge_update_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.0950332, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.09555, "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.default__get_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1008892, "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 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 {% 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"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.102219, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.102423, "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 sequence and unique_key is not string %}\n delete from {{target }}\n using {{ source }}\n where (\n {% for key in unique_key %}\n {{ source }}.{{ key }} = {{ target }}.{{ key }}\n {{ \"and \" if not loop.last}}\n {% endfor %}\n {% if incremental_predicates %}\n {% for predicate in incremental_predicates %}\n and {{ predicate }}\n {% endfor %}\n {% endif %}\n );\n {% else %}\n delete from {{ target }}\n where (\n {{ unique_key }}) in (\n select ({{ unique_key }})\n from {{ source }}\n )\n {%- if incremental_predicates %}\n {% for predicate in incremental_predicates %}\n and {{ predicate }}\n {% endfor %}\n {%- endif -%};\n\n {% endif %}\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.103143, "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.default__get_insert_overwrite_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.103339, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.103812, "supported_languages": null}, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1043022, "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.default__get_incremental_append_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1052082, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.105377, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.105511, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.105723, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1058571, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1060731, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.106209, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.106393, "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_postgres.postgres__get_incremental_default_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.106527, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.106642, "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.default__get_incremental_microbatch_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1067789, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.106899, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.107098, "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 {% if existing_relation is none %}\n {% set build_sql = get_create_table_as_sql(False, target_relation, sql) %}\n {% elif full_refresh_mode %}\n {% set build_sql = get_create_table_as_sql(False, intermediate_relation, sql) %}\n {% set need_swap = true %}\n {% else %}\n {% do run_query(get_create_table_as_sql(True, temp_relation, sql)) %}\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_strategy = config.get('incremental_strategy') or 'default' %}\n {% set incremental_predicates = config.get('predicates', none) or config.get('incremental_predicates', none) %}\n {% set strategy_sql_macro_func = adapter.get_incremental_strategy_macro(context, incremental_strategy) %}\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 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 {% if existing_relation is none or existing_relation.is_view or should_full_refresh() %}\n {% do create_indexes(target_relation) %}\n {% endif %}\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.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs", "macro.dbt.create_indexes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.11126, "supported_languages": ["sql"]}, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.116114, "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\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1170392, "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\n {%- set add_to_target_arr = schema_changes_dict['source_not_in_target'] -%}\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 {%- 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 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.117929, "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\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.118863, "supported_languages": null}, "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.default__can_clone_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.119065, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.119154, "supported_languages": null}, "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.default__create_or_replace_clone"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.119379, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.119502, "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\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 {% call statement('main') %}\n {% if target_relation and defer_relation and target_relation == defer_relation %}\n {{ log(\"Target relation and defer relation are the same, skipping clone for relation: \" ~ target_relation.render()) }}\n {% else %}\n {{ create_or_replace_clone(target_relation, defer_relation) }}\n {% endif %}\n\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\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1225102, "supported_languages": ["sql"]}, "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 = 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 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1256802, "supported_languages": ["sql"]}, "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.default__create_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1302888, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.130927, "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.default__reset_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1311, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1314409, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.131575, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.131676, "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.default__get_binding_char"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.131775, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.131855, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.131974, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1320598, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.132385, "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.default__load_csv_rows"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1325161, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1334789, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1338198, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.134089, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.134497, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.134696, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.134898, "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.default__generate_database_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.135187, "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 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.135364, "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.default__get_drop_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.135922, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1361978, "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.default__drop_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.136318, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.13645, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.136582, "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.default__get_replace_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.137196, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.138027, "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.default__get_create_intermediate_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.138316, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.138488, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.138679, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.138825, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1390479, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.139188, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.139723, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.140023, "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.default__rename_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.140168, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.140374, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1406238, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.140898, "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.default__get_create_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1412501, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.141564, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.141809, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1419609, "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_postgres.postgres__drop_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.142148, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.142237, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1424372, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1425438, "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_postgres.postgres__refresh_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.142771, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.142868, "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_postgres.postgres__get_rename_materialized_view_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.143067, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1431732, "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_postgres.postgres__get_alter_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1436439, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.143786, "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_postgres.postgres__get_materialized_view_configuration_changes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1439848, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1440861, "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_postgres.postgres__get_create_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.144285, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.144393, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1451368, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1452181, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1455731, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.145687, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.14578, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.146701, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1469598, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.147189, "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_postgres.postgres__drop_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1473632, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.147447, "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_postgres.postgres__get_replace_table_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1476328, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1477299, "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_postgres.postgres__get_rename_table_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.147916, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.148014, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1486359, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.148758, "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_postgres.postgres__create_table_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.149038, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1494882, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1497998, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1499221, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.150039, "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_postgres.postgres__drop_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1502059, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1502872, "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_postgres.postgres__get_replace_view_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.150929, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.151027, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.151754, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.151885, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.152044, "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_postgres.postgres__get_rename_view_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.152228, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.152334, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.152632, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.15274, "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.default__create_view_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1528609, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.153394, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1536472, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.153842, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1540108, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.154407, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1554182, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.155798, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.155988, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1573708, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1581728, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.158667, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1588202, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.158974, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.159028, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.159564, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.159956, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.160107, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1603498, "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.default__date"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.160578, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.160766, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.160991, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.161103, "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.default__concat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.161267, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.161354, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.161976, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.162324, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.162451, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.162796, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.16297, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1630442, "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_postgres.postgres__dateadd"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.163275, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.163386, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.163533, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.163585, "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.default__escape_single_quotes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.163763, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1638558, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.164053, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.164146, "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_postgres.postgres__listagg"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.164588, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1648571, "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_postgres.postgres__datediff"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.165084, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.165194, "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.default__safe_cast"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.165385, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.165479, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.165649, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1657548, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1659222, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1660302, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.166214, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.166303, "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_postgres.postgres__any_value"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.166471, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1665401, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.166732, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1668968, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.16706, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.167128, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.167805, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.167906, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.168013, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.168114, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1682198, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.168326, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1684349, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.168556, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1686668, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.168774, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1688828, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.168981, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.169087, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.169191, "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.default__array_concat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.169388, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.169483, "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.default__bool_or"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.169645, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.169715, "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_postgres.postgres__last_day"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1699462, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1701171, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.170217, "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_postgres.postgres__split_part"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1705852, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1707048, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.17085, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.171123, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.171212, "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.default__array_construct"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1714659, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.171629, "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.default__array_append"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1718159, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.171906, "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_postgres.postgres__create_schema"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.172172, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1722949, "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_postgres.postgres__drop_schema"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.172404, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.172523, "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_postgres.postgres__current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.17302, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.173121, "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_postgres.postgres__snapshot_get_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.173214, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.173284, "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_postgres.postgres__snapshot_get_time", "macro.dbt.get_column_schema_from_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.173562, "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_postgres.postgres__current_timestamp_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.173671, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.173723, "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_postgres.postgres__current_timestamp_in_utc_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1738298, "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_postgres.postgres__current_timestamp_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.173938, "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_postgres.postgres__get_create_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.17456, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1746528, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.174758, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.17502, "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_postgres.postgres__get_drop_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.175144, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.175236, "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_postgres.postgres__get_show_indexes_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.175337, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1754198, "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_postgres.postgres__make_intermediate_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1770308, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.177143, "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 {{ return(adapter.dispatch('make_temp_relation', 'dbt')(base_relation, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_temp_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.177283, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.177471, "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_postgres.postgres__make_backup_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1776361, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1778471, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.177969, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.178095, "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.default__get_or_create_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.178257, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1786282, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.178782, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.178876, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1791658, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.179432, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.179643, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.179788, "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_postgres.postgres__copy_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.181077, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.181155, "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.default__support_multiple_grantees_per_dcl_statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1812658, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.181341, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1815639, "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_postgres.postgres__get_show_grant_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1816828, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.181762, "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.default__get_grant_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.181911, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1820512, "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.default__get_revoke_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.182198, "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 revoke {{ privilege }} on {{ relation.render() }} from {{ grantees | join(', ') }}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.182411, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.182562, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.183003, "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.default__call_dcl_statements"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.183136, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.183302, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.183452, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.184202, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.184484, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.184604, "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 {{ compiled_code }}\n {% if limit is not none %}\n limit {{ limit }}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.184729, "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_postgres.postgres__alter_column_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1852238, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.185338, "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_postgres.postgres__alter_relation_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.185472, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.185584, "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.default__persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.185759, "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 {% do run_query(alter_column_comment(relation, model.columns)) %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query", "macro.dbt.alter_relation_comment", "macro.dbt.alter_column_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1860712, "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_postgres.postgres__get_catalog_relations"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.18868, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.188848, "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_postgres.postgres__get_catalog"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.188981, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.189151, "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_postgres.postgres__information_schema_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1892679, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1893718, "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_postgres.postgres__list_schemas"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.189489, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.189645, "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_postgres.postgres__check_schema_exists"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.189782, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1900558, "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_postgres.postgres__list_relations_without_caching"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.190179, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1902878, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1904051, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.190511, "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_postgres.postgres__get_relations"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.190618, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.190721, "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.default__get_relation_last_modified"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.190855, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.190969, "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_postgres.postgres__get_columns_in_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.192668, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.192776, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.192978, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1931221, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.193259, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.193377, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1941361, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1943629, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.194485, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.194714, "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.default__alter_column_type"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.19486, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.195284, "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.default__alter_relation_add_remove_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.1954508, "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.name }} {{ column.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.name }}{{ ',' 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1959722, "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{%- for column in columns_in_relation -%}\n{#-- This needs to be a case-insensitive comparison --#}\n{%- do column_name_to_data_types.update({column.name|lower: column.data_type}) -%}\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 }}{% 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 }}{% 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1985102, "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) %}\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 }}{% 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1988852, "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 {#-- 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.199622, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.199768, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.1998348, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.201086, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.201189, "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 {%- 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.201715, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2019808, "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 -%}\nconfig_dict = {{ config_dict }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.202358, "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\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.202678, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.202731, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.203115, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.203281, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.203488, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.203682, "supported_languages": null}, "macro.demo.categorizations_filter": {"name": "categorizations_filter", "resource_type": "macro", "package_name": "demo", "path": "macros/categorizations_filter.sql", "original_file_path": "macros/categorizations_filter.sql", "unique_id": "macro.demo.categorizations_filter", "macro_sql": "{% macro categorizations_filter(type) %}\n SELECT \n array_agg(category_name) AS categories,\n array_agg(child_name) AS sub_categories,\n categorizable_id\n FROM {{ ref(\"categorizations\")}} AS categorizations\n WHERE categorizations.categorizable_type = '{{type}}'\n GROUP BY categorizable_id \n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.203849, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.204094, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.204442, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2047842, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.205207, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2054222, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.205633, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2064488, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.207128, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2077491, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.208544, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2090108, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2092428, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2097611, "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 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\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.dateadd", "macro.dbt.current_timestamp", "macro.dbt.type_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.2103171, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.210624, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.210923, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2113512, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.211664, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2120562, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2123141, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.212785, "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 where {{ column_name }} is not null\n limit 1\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.213299, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.213751, "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 {% set column_list = 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2141702, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.214561, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2147892, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.215064, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.215296, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.215769, "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 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": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.21629, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.216948, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.217531, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2189639, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.221642, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.222019, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.222222, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2248828, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.225888, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2260768, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.226187, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.226481, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.226667, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2267919, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.226961, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.227072, "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{#- 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.227474, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.228043, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.228549, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2289321, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.229085, "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 1) - 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.229323, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.229593, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2299469, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.230162, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.230387, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.23087, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2314198, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.232055, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.232403, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2325299, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.232872, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2333581, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.233906, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2341802, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.234373, "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) -%}\r\n {{ return(adapter.dispatch('star', 'dbt_utils')(from, relation_alias, except, prefix, suffix, quote_identifiers)) }}\r\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__star"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.235275, "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) -%}\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 {%- 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 }} {%- if prefix!='' or suffix!='' %} as {{ adapter.quote(prefix ~ col ~ suffix)|trim }} {%- endif -%}\r\n {%- else -%}\r\n {{ col|trim }} {%- if prefix!='' or suffix!='' %} as {{ (prefix ~ col ~ suffix)|trim }} {%- 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.236195, "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') -%}\n {{ return(adapter.dispatch('unpivot', 'dbt_utils')(relation, cast_to, exclude, remove, field_name, value_name)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_utils.default__unpivot"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.2371662, "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') -%}\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 select\n {%- for exclude_col in exclude %}\n {{ exclude_col }},\n {%- endfor %}\n\n cast('{{ col.column }}' as {{ dbt.type_string() }}) as {{ field_name }},\n cast( {% if col.data_type == 'boolean' %}\n {{ dbt.cast_bool_to_text(col.column) }}\n {% else %}\n {{ col.column }}\n {% endif %}\n as {{ cast_to }}) as {{ 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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2382, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.238401, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.238492, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.240919, "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) }} as {{ dbt.type_string() }}) as {{ source_column_name }},\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}, "patch_path": null, "arguments": [], "created_at": 1727441769.243242, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.243454, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.243621, "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.postgres__deduplicate"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.244294, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2444448, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.244558, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2447019, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.244812, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2449229, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.245039, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.245313, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.245471, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.245739, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2460952, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.246333, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.246551, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.248961, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2491992, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2496362, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2501068, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.250435, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.251244, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.252424, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.253171, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2537138, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2540412, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.254515, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.255081, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.25539, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.255519, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2557921, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2561889, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.256518, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.256937, "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.postgres__get_table_types_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1727441769.257324, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.257421, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.2575119, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.257608, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.257971, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.258456, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.259287, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.25947, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.259849, "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}, "patch_path": null, "arguments": [], "created_at": 1727441769.260374, "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": {"model.demo.stg_matomo_device_type": [{"database": "test_lyon", "schema": "prod", "name": "stg_matomo_device_type", "resource_type": "model", "package_name": "demo", "path": "staging/matomo/stg_matomo_device_type.sql", "original_file_path": "models/staging/matomo/stg_matomo_device_type.sql", "unique_id": "model.demo.stg_matomo_device_type", "fqn": ["demo", "staging", "matomo", "stg_matomo_device_type"], "alias": "stg_matomo_device_type", "checksum": {"name": "sha256", "checksum": "67a75376b53a61b18e2a5c472ea6ad0a00c906e739f7554f002a9db5f72a2b39"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.5478148, "relation_name": "\"test_lyon\".\"prod\".\"stg_matomo_device_type\"", "raw_code": "SELECT\n date,\n nb_actions,\n bounce_count,\n index,\n label,\n sum_visit_length,\n nb_visits_converted,\n max_actions,\n segment,\n nb_visits,\n logo,\n nb_uniq_visitors,\n nb_users\nFROM {{ source('matomo', 'device_type') }}", "language": "sql", "refs": [], "sources": [["matomo", "device_type"]], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.stg_matomo_visits": [{"database": "test_lyon", "schema": "prod", "name": "stg_matomo_visits", "resource_type": "model", "package_name": "demo", "path": "staging/matomo/stg_matomo_visits.sql", "original_file_path": "models/staging/matomo/stg_matomo_visits.sql", "unique_id": "model.demo.stg_matomo_visits", "fqn": ["demo", "staging", "matomo", "stg_matomo_visits"], "alias": "stg_matomo_visits", "checksum": {"name": "sha256", "checksum": "396613d2a5c5ef16a05077c9612a6d4aaa38f9ce6def2620fa04790f0cf58ee2"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.548887, "relation_name": "\"test_lyon\".\"prod\".\"stg_matomo_visits\"", "raw_code": "SELECT\n index,\n date,\n nb_visits,\n nb_uniq_visitors,\n bounce_count,\n bounce_rate,\n bounce_rate_new, \n sum_visit_length, \n nb_visits_new,\n nb_downloads\nFROM {{ source('matomo', 'visits') }}", "language": "sql", "refs": [], "sources": [["matomo", "visits"]], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.stg_matomo_referrers": [{"database": "test_lyon", "schema": "prod", "name": "stg_matomo_referrers", "resource_type": "model", "package_name": "demo", "path": "staging/matomo/stg_matomo_referrers.sql", "original_file_path": "models/staging/matomo/stg_matomo_referrers.sql", "unique_id": "model.demo.stg_matomo_referrers", "fqn": ["demo", "staging", "matomo", "stg_matomo_referrers"], "alias": "stg_matomo_referrers", "checksum": {"name": "sha256", "checksum": "464c69db3e749c3e62ceb37e57ce2ff6e32875590ffe15e94c3279753f87dece"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.549949, "relation_name": "\"test_lyon\".\"prod\".\"stg_matomo_referrers\"", "raw_code": "SELECT \n label, \n nb_uniq_visitors,\n nb_visits,\n nb_actions,\n sum_visit_length,\n bounce_count,\n sub_type, \n date\nFROM {{ source('matomo', 'referrers') }}\nWHERE sub_type IS NOT null", "language": "sql", "refs": [], "sources": [["matomo", "referrers"]], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.stg_matomo_pages": [{"database": "test_lyon", "schema": "prod", "name": "stg_matomo_pages", "resource_type": "model", "package_name": "demo", "path": "staging/matomo/stg_matomo_pages.sql", "original_file_path": "models/staging/matomo/stg_matomo_pages.sql", "unique_id": "model.demo.stg_matomo_pages", "fqn": ["demo", "staging", "matomo", "stg_matomo_pages"], "alias": "stg_matomo_pages", "checksum": {"name": "sha256", "checksum": "571a3524d8d5ba458269fdaf15c012601803777c6e86f4b1ef0cbd7487fb3e10"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.551001, "relation_name": "\"test_lyon\".\"prod\".\"stg_matomo_pages\"", "raw_code": "SELECT \n nb_visits::int, \n nb_uniq_visitors::int,\n nb_hits,\n sum_time_spent,\n coalesce(exit_nb_uniq_visitors::float::int, 0) AS exit_nb_uniq_visitors,\n coalesce(exit_nb_visits::float::int, 0) as exit_nb_visits,\n avg_time_on_page, \n bounce_rate, \n exit_rate,\n url,\n date,\n coalesce(entry_nb_uniq_visitors::float::int, 0) as entry_nb_uniq_visitors,\n coalesce(entry_nb_visits::float::int, 0) as entry_nb_visits,\n coalesce(entry_bounce_count::float::int, 0) as entry_bounce_count,\n label\nFROM {{ source('matomo', 'pages') }}", "language": "sql", "refs": [], "sources": [["matomo", "pages"]], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.stg_matomo_page_titles": [{"database": "test_lyon", "schema": "prod", "name": "stg_matomo_page_titles", "resource_type": "model", "package_name": "demo", "path": "staging/matomo/stg_matomo_page_titles.sql", "original_file_path": "models/staging/matomo/stg_matomo_page_titles.sql", "unique_id": "model.demo.stg_matomo_page_titles", "fqn": ["demo", "staging", "matomo", "stg_matomo_page_titles"], "alias": "stg_matomo_page_titles", "checksum": {"name": "sha256", "checksum": "b04f78c5d3e756fdec032d6f163e370e340bec6a357daa9e6099956209cf1782"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.578132, "relation_name": "\"test_lyon\".\"prod\".\"stg_matomo_page_titles\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('matomo', 'page_titles') }}\n),\nrenamed AS (\n select\n date,\n min_time_server,\n min_time_network,\n min_time_dom_processing,\n nb_hits_with_time_on_load,\n coalesce(exit_nb_uniq_visitors::float::int, 0) AS exit_nb_uniq_visitors,\n max_time_dom_completion,\n avg_page_load_time,\n max_time_dom_processing,\n nb_hits_with_time_network,\n sum_time_spent,\n avg_time_dom_processing,\n bounce_rate,\n nb_hits_with_time_dom_processing,\n avg_time_network,\n nb_hits_with_time_dom_completion,\n entry_nb_actions,\n max_time_transfer,\n coalesce(entry_nb_uniq_visitors::float::int, 0) AS entry_nb_uniq_visitors,\n avg_time_on_page,\n actions_pagetitle,\n segment,\n nb_visits,\n coalesce(entry_bounce_count::float::int, 0) as entry_bounce_count,\n coalesce(exit_nb_visits::float::int, 0) as exit_nb_visits,\n min_time_transfer,\n max_time_network,\n nb_hits_with_time_server,\n max_time_server,\n max_time_on_load,\n avg_time_server,\n index,\n label,\n avg_time_dom_completion,\n nb_hits_with_time_transfer,\n avg_time_transfer,\n coalesce(entry_nb_visits::float::int, 0) as entry_nb_visits,\n entry_sum_visit_length,\n min_time_dom_completion,\n nb_hits,\n nb_uniq_visitors,\n avg_time_on_load,\n exit_rate,\n min_time_on_load\n FROM source\n)\nselect * FROM renamed", "language": "sql", "refs": [], "sources": [["matomo", "page_titles"]], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.stg_matomo_users_city": [{"database": "test_lyon", "schema": "prod", "name": "stg_matomo_users_city", "resource_type": "model", "package_name": "demo", "path": "staging/matomo/stg_matomo_users_city.sql", "original_file_path": "models/staging/matomo/stg_matomo_users_city.sql", "unique_id": "model.demo.stg_matomo_users_city", "fqn": ["demo", "staging", "matomo", "stg_matomo_users_city"], "alias": "stg_matomo_users_city", "checksum": {"name": "sha256", "checksum": "8d824c2e297de1fb98eb5d9b546b306c899e3bc604ec58c3cb5a83c76034a375"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.5793018, "relation_name": "\"test_lyon\".\"prod\".\"stg_matomo_users_city\"", "raw_code": "WITH source AS (\n SELECT * FROM {{ source('matomo', 'users_city') }}\n),\nrenamed AS (\n SELECT\n date,\n country,\n nb_actions,\n city,\n bounce_count,\n index,\n label,\n long,\n sum_visit_length,\n city_name,\n nb_visits_converted,\n max_actions,\n segment,\n nb_visits,\n country_name,\n logo,\n region_name,\n nb_uniq_visitors,\n nb_users,\n region,\n lat\n FROM source\n)\nSELECT * FROM renamed", "language": "sql", "refs": [], "sources": [["matomo", "users_city"]], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.matomo_pages": [{"database": "test_lyon", "schema": "prod", "name": "matomo_pages", "resource_type": "model", "package_name": "demo", "path": "marts/matomo/matomo_pages.sql", "original_file_path": "models/marts/matomo/matomo_pages.sql", "unique_id": "model.demo.matomo_pages", "fqn": ["demo", "marts", "matomo", "matomo_pages"], "alias": "matomo_pages", "checksum": {"name": "sha256", "checksum": "2e89b17cbc88c634343d9121c361bb2a13ade1e8c65fc8bb81c649b57bc62350"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.6177511, "relation_name": "\"test_lyon\".\"prod\".\"matomo_pages\"", "raw_code": "SELECT *,\n\tcase\n when label similar to '/(processes|assemblies)/%' then split_part(split_part(label, '/', 3), '?', 1)\n\t\telse ''\n\t\tend AS slug,\n\tcase\n\t when label similar to '/(processes|assemblies)/%/%/f/[0-9]*/%' then null --remove non-int garbage data\n\t when label similar to '/(processes|assemblies)/%/f/[0-9]*/%' then split_part(split_part(label, '/', 5), '?', 1)::int\n\t\telse null\n\t\tend as component_id\nFROM {{ref (\"stg_matomo_pages\")}}", "language": "sql", "refs": [{"name": "stg_matomo_pages", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.users_city": [{"database": "test_lyon", "schema": "prod", "name": "users_city", "resource_type": "model", "package_name": "demo", "path": "marts/matomo/users_city.sql", "original_file_path": "models/marts/matomo/users_city.sql", "unique_id": "model.demo.users_city", "fqn": ["demo", "marts", "matomo", "users_city"], "alias": "users_city", "checksum": {"name": "sha256", "checksum": "149ca0c19e7a52eaae753ec134ba96afe20c6c4f233c248a280e76dc8466f212"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.618856, "relation_name": "\"test_lyon\".\"prod\".\"users_city\"", "raw_code": "SELECT \n nb_visits,\n country_name,\n country,\n region_name,\n region,\n city_name,\n date, \n lat, \n long\nFROM {{ ref (\"stg_matomo_users_city\")}} AS users_city", "language": "sql", "refs": [{"name": "stg_matomo_users_city", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.int_matomo_referrers": [{"database": "test_lyon", "schema": "prod", "name": "int_matomo_referrers", "resource_type": "model", "package_name": "demo", "path": "intermediate/matomo/int_matomo_referrers.sql", "original_file_path": "models/intermediate/matomo/int_matomo_referrers.sql", "unique_id": "model.demo.int_matomo_referrers", "fqn": ["demo", "intermediate", "matomo", "int_matomo_referrers"], "alias": "int_matomo_referrers", "checksum": {"name": "sha256", "checksum": "c9826979571b4627c08f9265149ab8ae8d35fb783e0ecd5ab0a6e6e0a4993958"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.6369011, "relation_name": "\"test_lyon\".\"prod\".\"int_matomo_referrers\"", "raw_code": "SELECT *,\n (CASE stg_matomo_referrers.label\n WHEN 'Mot clef ind\u00e9fini' THEN 'Moteur de recherche'\n ELSE stg_matomo_referrers.label\n END\n ) AS renamed_label\nFROM {{ref (\"stg_matomo_referrers\")}} as stg_matomo_referrers", "language": "sql", "refs": [{"name": "stg_matomo_referrers", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}], "model.demo.int_matomo_visits": [{"database": "test_lyon", "schema": "prod", "name": "int_matomo_visits", "resource_type": "model", "package_name": "demo", "path": "intermediate/matomo/int_matomo_visits.sql", "original_file_path": "models/intermediate/matomo/int_matomo_visits.sql", "unique_id": "model.demo.int_matomo_visits", "fqn": ["demo", "intermediate", "matomo", "int_matomo_visits"], "alias": "int_matomo_visits", "checksum": {"name": "sha256", "checksum": "e5f809f14776b8d85d09fe6b125476a0d1729c37a956808bbaf2fe10508cb250"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "table", "incremental_strategy": 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}, "access": "protected"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "unrendered_config": {"materialized": "table", "enabled": false}, "created_at": 1727441769.6379688, "relation_name": "\"test_lyon\".\"prod\".\"int_matomo_visits\"", "raw_code": "SELECT\n *,\n bounce_count::decimal / nb_visits as bounce_rate_as_number,\n sum_visit_length / nb_visits as daily_average_visit_length\nFROM {{ref (\"stg_matomo_visits\")}}", "language": "sql", "refs": [{"name": "stg_matomo_visits", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "alias_types": true, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}]}, "parent_map": {"model.test_lyon.int_decidim_awesome_proposal_extra_fields": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"], "model.demo.stg_decidim_attachments": ["source.demo.decidim.decidim_attachments"], "model.demo.stg_decidim_components": ["source.demo.decidim.decidim_components"], "model.demo.stg_decidim_endorsements": ["source.demo.decidim.decidim_endorsements"], "model.demo.stg_decidim_follows": ["source.demo.decidim.decidim_follows"], "model.demo.stg_decidim_comments": ["source.demo.decidim.decidim_comments_comments"], "model.demo.stg_decidim_meetings_registrations": ["source.demo.decidim.decidim_meetings_registrations"], "model.demo.stg_decidim_participatory_processes": ["source.demo.decidim.decidim_participatory_processes"], "model.demo.stg_decidim_users": ["source.demo.decidim.decidim_users"], "model.demo.stg_decidim_participatory_process_steps": ["source.demo.decidim.decidim_participatory_process_steps"], "model.demo.stg_decidim_coauthorships": ["source.demo.decidim.decidim_coauthorships"], "model.demo.stg_decidim_meetings": ["source.demo.decidim.decidim_meetings_meetings"], "model.demo.stg_decidim_accountability_results": ["source.demo.decidim.decidim_accountability_results"], "model.demo.stg_decidim_moderations": ["source.demo.decidim.decidim_moderations"], "model.demo.stg_decidim_surveys": ["source.demo.decidim.decidim_surveys_surveys"], "model.demo.stg_decidim_organizations": ["source.demo.decidim.decidim_organizations"], "model.demo.stg_decidim_forms_question_matrix_rows": ["source.demo.decidim.decidim_forms_question_matrix_rows"], "model.demo.stg_decidim_forms_answers": ["source.demo.decidim.decidim_forms_answers"], "model.demo.stg_decidim_forms_questions": ["source.demo.decidim.decidim_forms_questions"], "model.demo.stg_decidim_forms_questionnaires": ["source.demo.decidim.decidim_forms_questionnaires"], "model.demo.stg_decidim_forms_answer_choices": ["source.demo.decidim.decidim_forms_answer_choices"], "model.demo.stg_decidim_area_types": ["source.demo.decidim.decidim_area_types"], "model.demo.stg_decidim_areas": ["source.demo.decidim.decidim_areas"], "model.demo.stg_decidim_blogs_posts": ["source.demo.decidim.decidim_blogs_posts"], "model.demo.stg_decidim_assemblies": ["source.demo.decidim.decidim_assemblies"], "model.demo.stg_decidim_debates": ["source.demo.decidim.decidim_debates_debates"], "model.demo.stg_decidim_budgets_line_items": ["source.demo.decidim.decidim_budgets_line_items"], "model.demo.stg_decidim_budgets_projects": ["source.demo.decidim.decidim_budgets_projects"], "model.demo.stg_decidim_budgets_orders": ["source.demo.decidim.decidim_budgets_orders"], "model.demo.stg_decidim_budgets": ["source.demo.decidim.decidim_budgets_budgets"], "model.demo.stg_decidim_categories": ["source.demo.decidim.decidim_categories"], "model.demo.stg_decidim_categorizations": ["source.demo.decidim.decidim_categorizations"], "model.demo.stg_decidim_scopes": ["source.demo.decidim.decidim_scopes"], "model.demo.stg_decidim_proposals_votes": ["source.demo.decidim.decidim_proposals_proposal_votes"], "model.demo.stg_decidim_proposals_collaborative_drafts": ["source.demo.decidim.decidim_proposals_collaborative_drafts"], "model.demo.stg_decidim_proposals": ["source.demo.decidim.decidim_proposals_proposals"], "model.demo.organizations": ["model.demo.int_organizations"], "model.demo.participations": ["model.demo.comments", "model.demo.debates", "model.demo.endorsements", "model.demo.forms_answers", "model.demo.meetings", "model.demo.projects_votes", "model.demo.proposals", "model.demo.proposals_votes"], "model.demo.attachments": ["model.demo.organizations", "model.demo.stg_decidim_attachments"], "model.demo.comments": ["model.demo.blogs_posts", "model.demo.budgets_projects", "model.demo.components", "model.demo.debates", "model.demo.meetings", "model.demo.proposals", "model.demo.stg_decidim_accountability_results", "model.demo.stg_decidim_comments", "model.demo.stg_decidim_moderations", "model.demo.stg_decidim_proposals_collaborative_drafts"], "model.demo.followings": ["model.demo.blogs_posts", "model.demo.budgets_projects", "model.demo.components", "model.demo.debates", "model.demo.int_users", "model.demo.meetings", "model.demo.proposals", "model.demo.stg_decidim_follows"], "model.demo.forms": ["model.demo.components", "model.demo.stg_decidim_forms_questionnaires", "model.demo.stg_decidim_meetings", "model.demo.stg_decidim_surveys"], "model.demo.forms_answers": ["model.demo.answers_file", "model.demo.answers_matrix", "model.demo.answers_option_and_sorting", "model.demo.answers_short_and_long_answer", "model.demo.forms"], "model.demo.blogs_posts": ["model.demo.components", "model.demo.stg_decidim_blogs_posts"], "model.demo.debates": ["model.demo.categorizations", "model.demo.components", "model.demo.stg_decidim_debates"], "model.demo.components": ["model.demo.int_components", "model.demo.int_organizations", "model.demo.stg_decidim_assemblies", "model.demo.stg_decidim_participatory_processes"], "model.demo.categorizations": ["model.demo.stg_decidim_categories", "model.demo.stg_decidim_categorizations"], "model.demo.endorsements": ["model.demo.stg_decidim_blogs_posts", "model.demo.stg_decidim_debates", "model.demo.stg_decidim_endorsements", "model.demo.stg_decidim_moderations", "model.demo.stg_decidim_proposals"], "model.demo.users": ["model.demo.comments", "model.demo.endorsements", "model.demo.followings", "model.demo.forms_answers", "model.demo.int_organizations", "model.demo.int_users", "model.demo.projects_votes", "model.demo.proposals", "model.demo.proposals_votes", "model.demo.stg_decidim_coauthorships"], "model.demo.budgets": ["model.demo.components", "model.demo.stg_decidim_budgets"], "model.demo.projects_votes": ["model.demo.budgets_projects", "model.demo.int_budgets_orders", "model.demo.stg_decidim_budgets_line_items"], "model.demo.budgets_projects": ["model.demo.categorizations", "model.demo.components", "model.demo.int_budgets_projects", "model.demo.stg_decidim_budgets"], "model.demo.meetings": ["model.demo.categorizations", "model.demo.components", "model.demo.int_meetings"], "model.demo.proposals_votes": ["model.demo.proposals", "model.demo.stg_decidim_proposals_votes"], "model.demo.proposals": ["model.demo.categorizations", "model.demo.components", "model.demo.int_proposals", "model.demo.int_scopes", "model.demo.int_users", "model.demo.stg_decidim_coauthorships", "model.demo.stg_decidim_moderations", "model.demo.stg_decidim_proposals_votes"], "model.demo.int_organizations": ["model.demo.stg_decidim_organizations"], "model.demo.answers_file": ["model.demo.int_forms_answers", "model.demo.organizations", "model.demo.stg_decidim_attachments", "model.demo.stg_decidim_forms_questions"], "model.demo.answers_option_and_sorting": ["model.demo.int_forms_answers", "model.demo.stg_decidim_forms_answer_choices", "model.demo.stg_decidim_forms_questions"], "model.demo.answers_matrix": ["model.demo.int_forms_answers", "model.demo.stg_decidim_forms_answer_choices", "model.demo.stg_decidim_forms_question_matrix_rows", "model.demo.stg_decidim_forms_questions"], "model.demo.answers_short_and_long_answer": ["model.demo.int_forms_answers", "model.demo.stg_decidim_forms_questions"], "model.demo.int_forms_answers": ["model.demo.stg_decidim_forms_answers"], "model.demo.int_components": ["model.demo.stg_decidim_components"], "model.demo.int_users": ["model.demo.stg_decidim_users"], "model.demo.int_budgets_projects": ["model.demo.stg_decidim_budgets_projects"], "model.demo.int_budgets_orders": ["model.demo.stg_decidim_budgets_orders"], "model.demo.int_meetings": ["model.demo.stg_decidim_meetings"], "model.demo.int_scopes": ["model.demo.stg_decidim_scopes"], "model.demo.int_proposals": ["model.demo.stg_decidim_proposals"], "test.demo.not_null_stg_decidim_forms_answer_choices_id.6373c5b027": ["model.demo.stg_decidim_forms_answer_choices"], "test.demo.unique_stg_decidim_forms_answer_choices_id.cac0250df2": ["model.demo.stg_decidim_forms_answer_choices"], "test.demo.not_null_stg_decidim_forms_answer_choices_decidim_answer_id.70e833d8d0": ["model.demo.stg_decidim_forms_answer_choices"], "test.demo.not_null_stg_decidim_forms_answer_choices_body.0c7838e1b8": ["model.demo.stg_decidim_forms_answer_choices"], "test.demo.not_null_stg_decidim_forms_answers_id.92ce43439f": ["model.demo.stg_decidim_forms_answers"], "test.demo.unique_stg_decidim_forms_answers_id.8fb3388969": ["model.demo.stg_decidim_forms_answers"], "test.demo.not_null_stg_decidim_forms_question_matrix_rows_id.7e6619509e": ["model.demo.stg_decidim_forms_question_matrix_rows"], "test.demo.unique_stg_decidim_forms_question_matrix_rows_id.8db20e3085": ["model.demo.stg_decidim_forms_question_matrix_rows"], "test.demo.not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id.55db0b6fe6": ["model.demo.stg_decidim_forms_question_matrix_rows"], "test.demo.not_null_stg_decidim_forms_question_matrix_rows_body.71d322a975": ["model.demo.stg_decidim_forms_question_matrix_rows"], "test.demo.not_null_stg_decidim_forms_questionnaires_id.74cea2a594": ["model.demo.stg_decidim_forms_questionnaires"], "test.demo.unique_stg_decidim_forms_questionnaires_id.c228c4d2a1": ["model.demo.stg_decidim_forms_questionnaires"], "test.demo.not_null_stg_decidim_forms_questions_id.c7a096fa50": ["model.demo.stg_decidim_forms_questions"], "test.demo.unique_stg_decidim_forms_questions_id.3becc3a082": ["model.demo.stg_decidim_forms_questions"], "test.demo.unique_stg_decidim_budgets_line_items_id.93d157dab5": ["model.demo.stg_decidim_budgets_line_items"], "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id.759330b24d": ["model.demo.stg_decidim_budgets_line_items"], "test.demo.unique_stg_decidim_categorizations_id.6566c00409": ["model.demo.stg_decidim_categorizations"], "test.demo.not_null_stg_decidim_categorizations_id.a059a79c08": ["model.demo.stg_decidim_categorizations"], "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type.d2c10e48e4": ["model.demo.stg_decidim_categorizations"], "test.demo.accepted_values_followings_following_way__real_follow__ancestor_follow.60d8b91db4": ["model.demo.followings"], "test.demo.not_null_components_id.85e75ab698": ["model.demo.components"], "test.demo.unique_components_id.55875f0fa3": ["model.demo.components"], "test.demo.not_null_components_manifest_name.2795dc3709": ["model.demo.components"], "test.demo.not_null_components_decidim_organization_id.3ae04f70dd": ["model.demo.components"], "test.demo.unique_users_id.ec952d9777": ["model.demo.users"], "test.demo.not_null_users_id.4db5ed5c63": ["model.demo.users"], "test.demo.relationships_users_id__id__ref_int_users_.c269bba0d5": ["model.demo.int_users", "model.demo.users"], "test.demo.dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id.da5f9c9505": ["model.demo.proposals_votes"], "test.demo.unique_int_users_id.e5ba0ede1e": ["model.demo.int_users"], "test.demo.not_null_int_users_id.1125b186c1": ["model.demo.int_users"], "test.demo.not_null_int_users_nickname.b90ddd7677": ["model.demo.int_users"], "model.test_lyon.decidim_awesome_proposal_extra_fields": ["model.demo.components", "model.demo.stg_decidim_proposals", "model.test_lyon.int_decidim_awesome_proposal_extra_fields"], "model.test_lyon.stg_decidim_awesome_proposal_extra_fields": ["source.test_lyon.decidim.decidim_awesome_proposal_extra_fields_test"], "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_id.aad3a9d9b8": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"], "test.test_lyon.unique_stg_decidim_awesome_proposal_extra_fields_id.1f06fde107": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"], "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id.5154a34bb9": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"], "source.test_lyon.decidim.decidim_awesome_proposal_extra_fields_test": [], "source.demo.decidim.decidim_components": [], "source.demo.decidim.decidim_assemblies": [], "source.demo.decidim.decidim_participatory_processes": [], "source.demo.decidim.decidim_participatory_process_steps": [], "source.demo.decidim.decidim_users": [], "source.demo.decidim.decidim_proposals_proposals": [], "source.demo.decidim.decidim_coauthorships": [], "source.demo.decidim.decidim_moderations": [], "source.demo.decidim.decidim_scopes": [], "source.demo.decidim.decidim_blogs_posts": [], "source.demo.decidim.decidim_debates_debates": [], "source.demo.decidim.decidim_meetings_meetings": [], "source.demo.decidim.decidim_accountability_results": [], "source.demo.decidim.decidim_comments_comments": [], "source.demo.decidim.decidim_proposals_collaborative_drafts": [], "source.demo.decidim.decidim_endorsements": [], "source.demo.decidim.decidim_follows": [], "source.demo.decidim.decidim_initiatives": [], "source.demo.decidim.decidim_initiatives_type_scopes": [], "source.demo.decidim.decidim_surveys_surveys": [], "source.demo.decidim.decidim_attachments": [], "source.demo.decidim.decidim_proposals_proposal_votes": [], "source.demo.decidim.decidim_meetings_registrations": [], "source.demo.decidim.decidim_organizations": [], "source.demo.decidim.decidim_forms_answer_choices": [], "source.demo.decidim.decidim_forms_answers": [], "source.demo.decidim.decidim_forms_question_matrix_rows": [], "source.demo.decidim.decidim_forms_questionnaires": [], "source.demo.decidim.decidim_forms_questions": [], "source.demo.decidim.decidim_areas": [], "source.demo.decidim.decidim_area_types": [], "source.demo.decidim.decidim_budgets_projects": [], "source.demo.decidim.decidim_budgets_budgets": [], "source.demo.decidim.decidim_budgets_line_items": [], "source.demo.decidim.decidim_budgets_orders": [], "source.demo.decidim.decidim_categories": [], "source.demo.decidim.decidim_categorizations": [], "unit_test.demo.stg_decidim_blogs_posts.resource_type_definition": ["model.demo.stg_decidim_blogs_posts"], "unit_test.demo.stg_decidim_debates.resource_type_definition": ["model.demo.stg_decidim_debates"], "unit_test.demo.stg_decidim_budgets_projects.resource_type_definition": ["model.demo.stg_decidim_budgets_projects"], "unit_test.demo.stg_decidim_proposals.resource_type_definition": ["model.demo.stg_decidim_proposals"], "unit_test.demo.blogs_posts.test_url_concatenation": ["model.demo.blogs_posts"], "unit_test.demo.components.test_ps_type": ["model.demo.components"], "unit_test.demo.components.test_ps_space_type_slug": ["model.demo.components"], "unit_test.demo.components.test_no_null_published_at": ["model.demo.components"], "unit_test.demo.components.test_take_only_assemblies_and_participatory_processes": ["model.demo.components"], "unit_test.demo.components.test_url_creation": ["model.demo.components"], "unit_test.demo.categorizations.testing_that_main_categories_are_properly_processed": ["model.demo.categorizations"], "unit_test.demo.categorizations.testing_that_sub_categories_are_properly_processed": ["model.demo.categorizations"], "unit_test.demo.endorsements.moderations-check": ["model.demo.endorsements"], "unit_test.demo.endorsements.endorsements-component-check": ["model.demo.endorsements"], "unit_test.demo.meetings.test_url_concatenation": ["model.demo.meetings"], "unit_test.demo.meetings.test_manifest_name_is_meetings": ["model.demo.meetings"], "unit_test.demo.proposals.withdrawn_proposals_check": ["model.demo.proposals"], "unit_test.demo.proposals.moderations_proposals_check": ["model.demo.proposals"], "unit_test.demo.proposals.conflict_on_decidim_reportable_type_check": ["model.demo.proposals"], "unit_test.demo.proposals.published_at_check": ["model.demo.proposals"], "unit_test.demo.int_organizations.test_filter_by_host": ["model.demo.int_organizations"], "unit_test.demo.int_organizations.test_regex_clean_description": ["model.demo.int_organizations"], "unit_test.demo.int_forms_answers.int_forms_answers_author_status_check": ["model.demo.int_forms_answers"], "unit_test.demo.answers_short_and_long_answer.answers_short_and_long_answer_check": ["model.demo.answers_short_and_long_answer"], "unit_test.demo.answers_matrix.answers_matrix_check": ["model.demo.answers_matrix"], "unit_test.demo.answers_option_and_sorting.answers_option_and_sorting_check_on_question_type": ["model.demo.answers_option_and_sorting"], "unit_test.demo.answers_short_and_long_answer.short_and_long_answer_check_on_question_type": ["model.demo.answers_short_and_long_answer"], "unit_test.demo.answers_matrix.answers_matrix_check_on_question_type": ["model.demo.answers_matrix"], "unit_test.demo.int_components.test_translated_manifest_name": ["model.demo.int_components"], "unit_test.demo.int_users.deleted_users_check": ["model.demo.int_users"], "unit_test.demo.int_users.type_check": ["model.demo.int_users"], "unit_test.demo.int_users.sign_in_frequency_check": ["model.demo.int_users"], "unit_test.demo.int_budgets_orders.vote_finished_test": ["model.demo.int_budgets_orders"], "unit_test.demo.int_budgets_projects.is_selected_test": ["model.demo.int_budgets_projects"], "unit_test.demo.int_proposals.test_default_state": ["model.demo.int_proposals"], "unit_test.demo.int_proposals.test_translated_state": ["model.demo.int_proposals"], "unit_test.demo.int_proposals.test_default_address": ["model.demo.int_proposals"], "unit_test.demo.int_proposals.test_published_at_not_null": ["model.demo.int_proposals"], "unit_test.test_lyon.int_decidim_awesome_proposal_extra_fields.testing_that_the_correct_xml_information_are_parsed": ["model.test_lyon.int_decidim_awesome_proposal_extra_fields"]}, "child_map": {"model.test_lyon.int_decidim_awesome_proposal_extra_fields": ["model.test_lyon.decidim_awesome_proposal_extra_fields", "unit_test.test_lyon.int_decidim_awesome_proposal_extra_fields.testing_that_the_correct_xml_information_are_parsed"], "model.demo.stg_decidim_attachments": ["model.demo.answers_file", "model.demo.attachments"], "model.demo.stg_decidim_components": ["model.demo.int_components"], "model.demo.stg_decidim_endorsements": ["model.demo.endorsements"], "model.demo.stg_decidim_follows": ["model.demo.followings"], "model.demo.stg_decidim_comments": ["model.demo.comments"], "model.demo.stg_decidim_meetings_registrations": [], "model.demo.stg_decidim_participatory_processes": ["model.demo.components"], "model.demo.stg_decidim_users": ["model.demo.int_users"], "model.demo.stg_decidim_participatory_process_steps": [], "model.demo.stg_decidim_coauthorships": ["model.demo.proposals", "model.demo.users"], "model.demo.stg_decidim_meetings": ["model.demo.forms", "model.demo.int_meetings"], "model.demo.stg_decidim_accountability_results": ["model.demo.comments"], "model.demo.stg_decidim_moderations": ["model.demo.comments", "model.demo.endorsements", "model.demo.proposals"], "model.demo.stg_decidim_surveys": ["model.demo.forms"], "model.demo.stg_decidim_organizations": ["model.demo.int_organizations"], "model.demo.stg_decidim_forms_question_matrix_rows": ["model.demo.answers_matrix", "test.demo.not_null_stg_decidim_forms_question_matrix_rows_body.71d322a975", "test.demo.not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id.55db0b6fe6", "test.demo.not_null_stg_decidim_forms_question_matrix_rows_id.7e6619509e", "test.demo.unique_stg_decidim_forms_question_matrix_rows_id.8db20e3085"], "model.demo.stg_decidim_forms_answers": ["model.demo.int_forms_answers", "test.demo.not_null_stg_decidim_forms_answers_id.92ce43439f", "test.demo.unique_stg_decidim_forms_answers_id.8fb3388969"], "model.demo.stg_decidim_forms_questions": ["model.demo.answers_file", "model.demo.answers_matrix", "model.demo.answers_option_and_sorting", "model.demo.answers_short_and_long_answer", "test.demo.not_null_stg_decidim_forms_questions_id.c7a096fa50", "test.demo.unique_stg_decidim_forms_questions_id.3becc3a082"], "model.demo.stg_decidim_forms_questionnaires": ["model.demo.forms", "test.demo.not_null_stg_decidim_forms_questionnaires_id.74cea2a594", "test.demo.unique_stg_decidim_forms_questionnaires_id.c228c4d2a1"], "model.demo.stg_decidim_forms_answer_choices": ["model.demo.answers_matrix", "model.demo.answers_option_and_sorting", "test.demo.not_null_stg_decidim_forms_answer_choices_body.0c7838e1b8", "test.demo.not_null_stg_decidim_forms_answer_choices_decidim_answer_id.70e833d8d0", "test.demo.not_null_stg_decidim_forms_answer_choices_id.6373c5b027", "test.demo.unique_stg_decidim_forms_answer_choices_id.cac0250df2"], "model.demo.stg_decidim_area_types": [], "model.demo.stg_decidim_areas": [], "model.demo.stg_decidim_blogs_posts": ["model.demo.blogs_posts", "model.demo.endorsements", "unit_test.demo.stg_decidim_blogs_posts.resource_type_definition"], "model.demo.stg_decidim_assemblies": ["model.demo.components"], "model.demo.stg_decidim_debates": ["model.demo.debates", "model.demo.endorsements", "unit_test.demo.stg_decidim_debates.resource_type_definition"], "model.demo.stg_decidim_budgets_line_items": ["model.demo.projects_votes", "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id.759330b24d", "test.demo.unique_stg_decidim_budgets_line_items_id.93d157dab5"], "model.demo.stg_decidim_budgets_projects": ["model.demo.int_budgets_projects", "unit_test.demo.stg_decidim_budgets_projects.resource_type_definition"], "model.demo.stg_decidim_budgets_orders": ["model.demo.int_budgets_orders"], "model.demo.stg_decidim_budgets": ["model.demo.budgets", "model.demo.budgets_projects"], "model.demo.stg_decidim_categories": ["model.demo.categorizations"], "model.demo.stg_decidim_categorizations": ["model.demo.categorizations", "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type.d2c10e48e4", "test.demo.not_null_stg_decidim_categorizations_id.a059a79c08", "test.demo.unique_stg_decidim_categorizations_id.6566c00409"], "model.demo.stg_decidim_scopes": ["model.demo.int_scopes"], "model.demo.stg_decidim_proposals_votes": ["model.demo.proposals", "model.demo.proposals_votes"], "model.demo.stg_decidim_proposals_collaborative_drafts": ["model.demo.comments"], "model.demo.stg_decidim_proposals": ["model.demo.endorsements", "model.demo.int_proposals", "model.test_lyon.decidim_awesome_proposal_extra_fields", "unit_test.demo.stg_decidim_proposals.resource_type_definition"], "model.demo.organizations": ["model.demo.answers_file", "model.demo.attachments"], "model.demo.participations": [], "model.demo.attachments": [], "model.demo.comments": ["model.demo.participations", "model.demo.users"], "model.demo.followings": ["model.demo.users", "test.demo.accepted_values_followings_following_way__real_follow__ancestor_follow.60d8b91db4"], "model.demo.forms": ["model.demo.forms_answers"], "model.demo.forms_answers": ["model.demo.participations", "model.demo.users"], "model.demo.blogs_posts": ["model.demo.comments", "model.demo.followings", "unit_test.demo.blogs_posts.test_url_concatenation"], "model.demo.debates": ["model.demo.comments", "model.demo.followings", "model.demo.participations"], "model.demo.components": ["model.demo.blogs_posts", "model.demo.budgets", "model.demo.budgets_projects", "model.demo.comments", "model.demo.debates", "model.demo.followings", "model.demo.forms", "model.demo.meetings", "model.demo.proposals", "model.test_lyon.decidim_awesome_proposal_extra_fields", "test.demo.not_null_components_decidim_organization_id.3ae04f70dd", "test.demo.not_null_components_id.85e75ab698", "test.demo.not_null_components_manifest_name.2795dc3709", "test.demo.unique_components_id.55875f0fa3", "unit_test.demo.components.test_no_null_published_at", "unit_test.demo.components.test_ps_space_type_slug", "unit_test.demo.components.test_ps_type", "unit_test.demo.components.test_take_only_assemblies_and_participatory_processes", "unit_test.demo.components.test_url_creation"], "model.demo.categorizations": ["model.demo.budgets_projects", "model.demo.debates", "model.demo.meetings", "model.demo.proposals", "unit_test.demo.categorizations.testing_that_main_categories_are_properly_processed", "unit_test.demo.categorizations.testing_that_sub_categories_are_properly_processed"], "model.demo.endorsements": ["model.demo.participations", "model.demo.users", "unit_test.demo.endorsements.endorsements-component-check", "unit_test.demo.endorsements.moderations-check"], "model.demo.users": ["test.demo.not_null_users_id.4db5ed5c63", "test.demo.relationships_users_id__id__ref_int_users_.c269bba0d5", "test.demo.unique_users_id.ec952d9777"], "model.demo.budgets": [], "model.demo.projects_votes": ["model.demo.participations", "model.demo.users"], "model.demo.budgets_projects": ["model.demo.comments", "model.demo.followings", "model.demo.projects_votes"], "model.demo.meetings": ["model.demo.comments", "model.demo.followings", "model.demo.participations", "unit_test.demo.meetings.test_manifest_name_is_meetings", "unit_test.demo.meetings.test_url_concatenation"], "model.demo.proposals_votes": ["model.demo.participations", "model.demo.users", "test.demo.dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id.da5f9c9505"], "model.demo.proposals": ["model.demo.comments", "model.demo.followings", "model.demo.participations", "model.demo.proposals_votes", "model.demo.users", "unit_test.demo.proposals.conflict_on_decidim_reportable_type_check", "unit_test.demo.proposals.moderations_proposals_check", "unit_test.demo.proposals.published_at_check", "unit_test.demo.proposals.withdrawn_proposals_check"], "model.demo.int_organizations": ["model.demo.components", "model.demo.organizations", "model.demo.users", "unit_test.demo.int_organizations.test_filter_by_host", "unit_test.demo.int_organizations.test_regex_clean_description"], "model.demo.answers_file": ["model.demo.forms_answers"], "model.demo.answers_option_and_sorting": ["model.demo.forms_answers", "unit_test.demo.answers_option_and_sorting.answers_option_and_sorting_check_on_question_type"], "model.demo.answers_matrix": ["model.demo.forms_answers", "unit_test.demo.answers_matrix.answers_matrix_check", "unit_test.demo.answers_matrix.answers_matrix_check_on_question_type"], "model.demo.answers_short_and_long_answer": ["model.demo.forms_answers", "unit_test.demo.answers_short_and_long_answer.answers_short_and_long_answer_check", "unit_test.demo.answers_short_and_long_answer.short_and_long_answer_check_on_question_type"], "model.demo.int_forms_answers": ["model.demo.answers_file", "model.demo.answers_matrix", "model.demo.answers_option_and_sorting", "model.demo.answers_short_and_long_answer", "unit_test.demo.int_forms_answers.int_forms_answers_author_status_check"], "model.demo.int_components": ["model.demo.components", "unit_test.demo.int_components.test_translated_manifest_name"], "model.demo.int_users": ["model.demo.followings", "model.demo.proposals", "model.demo.users", "test.demo.not_null_int_users_id.1125b186c1", "test.demo.not_null_int_users_nickname.b90ddd7677", "test.demo.relationships_users_id__id__ref_int_users_.c269bba0d5", "test.demo.unique_int_users_id.e5ba0ede1e", "unit_test.demo.int_users.deleted_users_check", "unit_test.demo.int_users.sign_in_frequency_check", "unit_test.demo.int_users.type_check"], "model.demo.int_budgets_projects": ["model.demo.budgets_projects", "unit_test.demo.int_budgets_projects.is_selected_test"], "model.demo.int_budgets_orders": ["model.demo.projects_votes", "unit_test.demo.int_budgets_orders.vote_finished_test"], "model.demo.int_meetings": ["model.demo.meetings"], "model.demo.int_scopes": ["model.demo.proposals"], "model.demo.int_proposals": ["model.demo.proposals", "unit_test.demo.int_proposals.test_default_address", "unit_test.demo.int_proposals.test_default_state", "unit_test.demo.int_proposals.test_published_at_not_null", "unit_test.demo.int_proposals.test_translated_state"], "test.demo.not_null_stg_decidim_forms_answer_choices_id.6373c5b027": [], "test.demo.unique_stg_decidim_forms_answer_choices_id.cac0250df2": [], "test.demo.not_null_stg_decidim_forms_answer_choices_decidim_answer_id.70e833d8d0": [], "test.demo.not_null_stg_decidim_forms_answer_choices_body.0c7838e1b8": [], "test.demo.not_null_stg_decidim_forms_answers_id.92ce43439f": [], "test.demo.unique_stg_decidim_forms_answers_id.8fb3388969": [], "test.demo.not_null_stg_decidim_forms_question_matrix_rows_id.7e6619509e": [], "test.demo.unique_stg_decidim_forms_question_matrix_rows_id.8db20e3085": [], "test.demo.not_null_stg_decidim_forms_question_matrix_rows_decidim_question_id.55db0b6fe6": [], "test.demo.not_null_stg_decidim_forms_question_matrix_rows_body.71d322a975": [], "test.demo.not_null_stg_decidim_forms_questionnaires_id.74cea2a594": [], "test.demo.unique_stg_decidim_forms_questionnaires_id.c228c4d2a1": [], "test.demo.not_null_stg_decidim_forms_questions_id.c7a096fa50": [], "test.demo.unique_stg_decidim_forms_questions_id.3becc3a082": [], "test.demo.unique_stg_decidim_budgets_line_items_id.93d157dab5": [], "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_budgets_line_items_decidim_order_id__decidim_project_id.759330b24d": [], "test.demo.unique_stg_decidim_categorizations_id.6566c00409": [], "test.demo.not_null_stg_decidim_categorizations_id.a059a79c08": [], "test.demo.dbt_utils_unique_combination_of_columns_stg_decidim_categorizations_categorizable_id__categorizable_type.d2c10e48e4": [], "test.demo.accepted_values_followings_following_way__real_follow__ancestor_follow.60d8b91db4": [], "test.demo.not_null_components_id.85e75ab698": [], "test.demo.unique_components_id.55875f0fa3": [], "test.demo.not_null_components_manifest_name.2795dc3709": [], "test.demo.not_null_components_decidim_organization_id.3ae04f70dd": [], "test.demo.unique_users_id.ec952d9777": [], "test.demo.not_null_users_id.4db5ed5c63": [], "test.demo.relationships_users_id__id__ref_int_users_.c269bba0d5": [], "test.demo.dbt_utils_unique_combination_of_columns_proposals_votes_decidim_author_id__decidim_proposal_id.da5f9c9505": [], "test.demo.unique_int_users_id.e5ba0ede1e": [], "test.demo.not_null_int_users_id.1125b186c1": [], "test.demo.not_null_int_users_nickname.b90ddd7677": [], "model.test_lyon.decidim_awesome_proposal_extra_fields": [], "model.test_lyon.stg_decidim_awesome_proposal_extra_fields": ["model.test_lyon.int_decidim_awesome_proposal_extra_fields", "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_id.aad3a9d9b8", "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id.5154a34bb9", "test.test_lyon.unique_stg_decidim_awesome_proposal_extra_fields_id.1f06fde107"], "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_id.aad3a9d9b8": [], "test.test_lyon.unique_stg_decidim_awesome_proposal_extra_fields_id.1f06fde107": [], "test.test_lyon.not_null_stg_decidim_awesome_proposal_extra_fields_proposal_id.5154a34bb9": [], "source.test_lyon.decidim.decidim_awesome_proposal_extra_fields_test": ["model.test_lyon.stg_decidim_awesome_proposal_extra_fields"], "source.demo.decidim.decidim_components": ["model.demo.stg_decidim_components"], "source.demo.decidim.decidim_assemblies": ["model.demo.stg_decidim_assemblies"], "source.demo.decidim.decidim_participatory_processes": ["model.demo.stg_decidim_participatory_processes"], "source.demo.decidim.decidim_participatory_process_steps": ["model.demo.stg_decidim_participatory_process_steps"], "source.demo.decidim.decidim_users": ["model.demo.stg_decidim_users"], "source.demo.decidim.decidim_proposals_proposals": ["model.demo.stg_decidim_proposals"], "source.demo.decidim.decidim_coauthorships": ["model.demo.stg_decidim_coauthorships"], "source.demo.decidim.decidim_moderations": ["model.demo.stg_decidim_moderations"], "source.demo.decidim.decidim_scopes": ["model.demo.stg_decidim_scopes"], "source.demo.decidim.decidim_blogs_posts": ["model.demo.stg_decidim_blogs_posts"], "source.demo.decidim.decidim_debates_debates": ["model.demo.stg_decidim_debates"], "source.demo.decidim.decidim_meetings_meetings": ["model.demo.stg_decidim_meetings"], "source.demo.decidim.decidim_accountability_results": ["model.demo.stg_decidim_accountability_results"], "source.demo.decidim.decidim_comments_comments": ["model.demo.stg_decidim_comments"], "source.demo.decidim.decidim_proposals_collaborative_drafts": ["model.demo.stg_decidim_proposals_collaborative_drafts"], "source.demo.decidim.decidim_endorsements": ["model.demo.stg_decidim_endorsements"], "source.demo.decidim.decidim_follows": ["model.demo.stg_decidim_follows"], "source.demo.decidim.decidim_initiatives": [], "source.demo.decidim.decidim_initiatives_type_scopes": [], "source.demo.decidim.decidim_surveys_surveys": ["model.demo.stg_decidim_surveys"], "source.demo.decidim.decidim_attachments": ["model.demo.stg_decidim_attachments"], "source.demo.decidim.decidim_proposals_proposal_votes": ["model.demo.stg_decidim_proposals_votes"], "source.demo.decidim.decidim_meetings_registrations": ["model.demo.stg_decidim_meetings_registrations"], "source.demo.decidim.decidim_organizations": ["model.demo.stg_decidim_organizations"], "source.demo.decidim.decidim_forms_answer_choices": ["model.demo.stg_decidim_forms_answer_choices"], "source.demo.decidim.decidim_forms_answers": ["model.demo.stg_decidim_forms_answers"], "source.demo.decidim.decidim_forms_question_matrix_rows": ["model.demo.stg_decidim_forms_question_matrix_rows"], "source.demo.decidim.decidim_forms_questionnaires": ["model.demo.stg_decidim_forms_questionnaires"], "source.demo.decidim.decidim_forms_questions": ["model.demo.stg_decidim_forms_questions"], "source.demo.decidim.decidim_areas": ["model.demo.stg_decidim_areas"], "source.demo.decidim.decidim_area_types": ["model.demo.stg_decidim_area_types"], "source.demo.decidim.decidim_budgets_projects": ["model.demo.stg_decidim_budgets_projects"], "source.demo.decidim.decidim_budgets_budgets": ["model.demo.stg_decidim_budgets"], "source.demo.decidim.decidim_budgets_line_items": ["model.demo.stg_decidim_budgets_line_items"], "source.demo.decidim.decidim_budgets_orders": ["model.demo.stg_decidim_budgets_orders"], "source.demo.decidim.decidim_categories": ["model.demo.stg_decidim_categories"], "source.demo.decidim.decidim_categorizations": ["model.demo.stg_decidim_categorizations"], "unit_test.demo.stg_decidim_blogs_posts.resource_type_definition": [], "unit_test.demo.stg_decidim_debates.resource_type_definition": [], "unit_test.demo.stg_decidim_budgets_projects.resource_type_definition": [], "unit_test.demo.stg_decidim_proposals.resource_type_definition": [], "unit_test.demo.blogs_posts.test_url_concatenation": [], "unit_test.demo.components.test_ps_type": [], "unit_test.demo.components.test_ps_space_type_slug": [], "unit_test.demo.components.test_no_null_published_at": [], "unit_test.demo.components.test_take_only_assemblies_and_participatory_processes": [], "unit_test.demo.components.test_url_creation": [], "unit_test.demo.categorizations.testing_that_main_categories_are_properly_processed": [], "unit_test.demo.categorizations.testing_that_sub_categories_are_properly_processed": [], "unit_test.demo.endorsements.moderations-check": [], "unit_test.demo.endorsements.endorsements-component-check": [], "unit_test.demo.meetings.test_url_concatenation": [], "unit_test.demo.meetings.test_manifest_name_is_meetings": [], "unit_test.demo.proposals.withdrawn_proposals_check": [], "unit_test.demo.proposals.moderations_proposals_check": [], "unit_test.demo.proposals.conflict_on_decidim_reportable_type_check": [], "unit_test.demo.proposals.published_at_check": [], "unit_test.demo.int_organizations.test_filter_by_host": [], "unit_test.demo.int_organizations.test_regex_clean_description": [], "unit_test.demo.int_forms_answers.int_forms_answers_author_status_check": [], "unit_test.demo.answers_short_and_long_answer.answers_short_and_long_answer_check": [], "unit_test.demo.answers_matrix.answers_matrix_check": [], "unit_test.demo.answers_option_and_sorting.answers_option_and_sorting_check_on_question_type": [], "unit_test.demo.answers_short_and_long_answer.short_and_long_answer_check_on_question_type": [], "unit_test.demo.answers_matrix.answers_matrix_check_on_question_type": [], "unit_test.demo.int_components.test_translated_manifest_name": [], "unit_test.demo.int_users.deleted_users_check": [], "unit_test.demo.int_users.type_check": [], "unit_test.demo.int_users.sign_in_frequency_check": [], "unit_test.demo.int_budgets_orders.vote_finished_test": [], "unit_test.demo.int_budgets_projects.is_selected_test": [], "unit_test.demo.int_proposals.test_default_state": [], "unit_test.demo.int_proposals.test_translated_state": [], "unit_test.demo.int_proposals.test_default_address": [], "unit_test.demo.int_proposals.test_published_at_not_null": [], "unit_test.test_lyon.int_decidim_awesome_proposal_extra_fields.testing_that_the_correct_xml_information_are_parsed": []}, "group_map": {}, "saved_queries": {}, "semantic_models": {}, "unit_tests": {"unit_test.demo.stg_decidim_blogs_posts.resource_type_definition": {"model": "stg_decidim_blogs_posts", "given": [{"input": "source('decidim', 'decidim_blogs_posts')", "rows": [{"id": 1}], "format": "dict", "fixture": null}], "expect": {"rows": [{"resource_type": "Decidim::Blogs::Post"}], "format": "dict", "fixture": null}, "name": "resource_type_definition", "resource_type": "unit_test", "package_name": "demo", "path": "staging/decidim/blogs_posts/schema.yml", "original_file_path": "models/staging/decidim/blogs_posts/schema.yml", "unique_id": "unit_test.demo.stg_decidim_blogs_posts.resource_type_definition", "fqn": ["demo", "staging", "decidim", "blogs_posts", "stg_decidim_blogs_posts", "resource_type_definition"], "description": "Checks that the resource type is properly defined", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_blogs_posts"]}, "config": {"tags": [], "meta": {}}, "checksum": "eb7438e26f14fb031c02d2388338d2ed2a0cab11ff0a98b10675c9e7304c9a37", "schema": "prod", "created_at": 1727441769.783929, "versions": null, "version": null}, "unit_test.demo.stg_decidim_debates.resource_type_definition": {"model": "stg_decidim_debates", "given": [{"input": "source('decidim', 'decidim_debates_debates')", "rows": [{"id": 1}], "format": "dict", "fixture": null}], "expect": {"rows": [{"resource_type": "Decidim::Debates::Debate"}], "format": "dict", "fixture": null}, "name": "resource_type_definition", "resource_type": "unit_test", "package_name": "demo", "path": "staging/decidim/debates/schema.yml", "original_file_path": "models/staging/decidim/debates/schema.yml", "unique_id": "unit_test.demo.stg_decidim_debates.resource_type_definition", "fqn": ["demo", "staging", "decidim", "debates", "stg_decidim_debates", "resource_type_definition"], "description": "Checks that the resource type is properly defined", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_debates"]}, "config": {"tags": [], "meta": {}}, "checksum": "17f10a03ce0eb3d75b3d757c7c0fd8a921bf6a1359393294b42a49ba31bfea02", "schema": "prod", "created_at": 1727441769.7915819, "versions": null, "version": null}, "unit_test.demo.stg_decidim_budgets_projects.resource_type_definition": {"model": "stg_decidim_budgets_projects", "given": [{"input": "source('decidim', 'decidim_budgets_projects')", "rows": [{"id": 1}], "format": "dict", "fixture": null}], "expect": {"rows": [{"resource_type": "Decidim::Budgets::Project"}], "format": "dict", "fixture": null}, "name": "resource_type_definition", "resource_type": "unit_test", "package_name": "demo", "path": "staging/decidim/budgets/schema.yml", "original_file_path": "models/staging/decidim/budgets/schema.yml", "unique_id": "unit_test.demo.stg_decidim_budgets_projects.resource_type_definition", "fqn": ["demo", "staging", "decidim", "budgets", "stg_decidim_budgets_projects", "resource_type_definition"], "description": "Checks that the resource type is properly defined", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_budgets_projects"]}, "config": {"tags": [], "meta": {}}, "checksum": "36df33d78ce20b3b36c751e7c28eaabddaff81942da7dc7c61d5c55e75b8efad", "schema": "prod", "created_at": 1727441769.80553, "versions": null, "version": null}, "unit_test.demo.stg_decidim_proposals.resource_type_definition": {"model": "stg_decidim_proposals", "given": [{"input": "source('decidim', 'decidim_proposals_proposals')", "rows": [{"id": 1}], "format": "dict", "fixture": null}], "expect": {"rows": [{"resource_type": "Decidim::Proposals::Proposal"}], "format": "dict", "fixture": null}, "name": "resource_type_definition", "resource_type": "unit_test", "package_name": "demo", "path": "staging/decidim/proposals/schema.yml", "original_file_path": "models/staging/decidim/proposals/schema.yml", "unique_id": "unit_test.demo.stg_decidim_proposals.resource_type_definition", "fqn": ["demo", "staging", "decidim", "proposals", "stg_decidim_proposals", "resource_type_definition"], "description": "Checks that the resource type is properly defined", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.stg_decidim_proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "053664ae8043289103cdc4ecc00f79758bc69b6b82f93f5b57b9a3c0b1ad3a0d", "schema": "prod", "created_at": 1727441769.812192, "versions": null, "version": null}, "unit_test.demo.blogs_posts.test_url_concatenation": {"model": "blogs_posts", "given": [{"input": "ref('stg_decidim_blogs_posts')", "rows": [{"id": 1, "decidim_component_id": 42}, {"id": 2, "decidim_component_id": 43}], "format": "dict", "fixture": null}, {"input": "ref('components')", "rows": [{"organization_host": "host1.com", "ps_space_type_slug": "foo", "ps_slug": "bar", "id": 42}, {"organization_host": "host2.com", "ps_space_type_slug": "type", "ps_slug": "space", "id": 43}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "post_url": "https://host1.com/foo/bar/f/42/posts/1"}, {"id": 2, "post_url": "https://host2.com/type/space/f/43/posts/2"}], "format": "dict", "fixture": null}, "name": "test_url_concatenation", "resource_type": "unit_test", "package_name": "demo", "path": "marts/blogs_posts/schema.yml", "original_file_path": "models/marts/blogs_posts/schema.yml", "unique_id": "unit_test.demo.blogs_posts.test_url_concatenation", "fqn": ["demo", "marts", "blogs_posts", "blogs_posts", "test_url_concatenation"], "description": "Check URL concatenation logic", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.blogs_posts"]}, "config": {"tags": [], "meta": {}}, "checksum": "c43e4202437c012524105287c529b6a46e29ebae4d732a254b44378506ad494a", "schema": "prod", "created_at": 1727441769.818351, "versions": null, "version": null}, "unit_test.demo.components.test_ps_type": {"model": "components", "given": [{"input": "ref('stg_decidim_assemblies')", "rows": [{"id": 1, "title": "Assembly 1", "published_at": "2023-01-01", "decidim_organization_id": 101}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_participatory_processes')", "rows": [{"id": 2, "title": "Process 1", "published_at": "2023-02-01", "decidim_organization_id": 101}], "format": "dict", "fixture": null}, {"input": "ref('int_components')", "rows": [{"id": 41, "participatory_space_id": 1, "participatory_space_type": "Decidim::Assembly", "published_at": "2024-01-01"}, {"id": 42, "participatory_space_id": 2, "participatory_space_type": "Decidim::ParticipatoryProcess", "published_at": "2024-02-01"}], "format": "dict", "fixture": null}, {"input": "ref('int_organizations')", "rows": [{"id": 101}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 41, "ps_type": "Decidim::Assembly"}, {"id": 42, "ps_type": "Decidim::ParticipatoryProcess"}], "format": "dict", "fixture": null}, "name": "test_ps_type", "resource_type": "unit_test", "package_name": "demo", "path": "marts/components/schema.yml", "original_file_path": "models/marts/components/schema.yml", "unique_id": "unit_test.demo.components.test_ps_type", "fqn": ["demo", "marts", "components", "components", "test_ps_type"], "description": "", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.components"]}, "config": {"tags": [], "meta": {}}, "checksum": "9817ee9c96b6f98c0133b23d4d955eefa1e9392d8ea5a2ddff76e2d87a819f7c", "schema": "prod", "created_at": 1727441769.825293, "versions": null, "version": null}, "unit_test.demo.components.test_ps_space_type_slug": {"model": "components", "given": [{"input": "ref('stg_decidim_assemblies')", "rows": [{"id": 1, "title": "Assembly 1", "slug": "slug1", "published_at": "2023-01-01", "decidim_organization_id": 101}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_participatory_processes')", "rows": [{"id": 2, "title": "Process 1", "slug": "slug2", "published_at": "2023-02-01", "decidim_organization_id": 101}], "format": "dict", "fixture": null}, {"input": "ref('int_components')", "rows": [{"id": 41, "participatory_space_id": 1, "participatory_space_type": "Decidim::Assembly", "published_at": "2024-01-01"}, {"id": 42, "participatory_space_id": 2, "participatory_space_type": "Decidim::ParticipatoryProcess", "published_at": "2024-02-01"}], "format": "dict", "fixture": null}, {"input": "ref('int_organizations')", "rows": [{"id": 101}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 41, "ps_space_type_slug": "assemblies"}, {"id": 42, "ps_space_type_slug": "processes"}], "format": "dict", "fixture": null}, "name": "test_ps_space_type_slug", "resource_type": "unit_test", "package_name": "demo", "path": "marts/components/schema.yml", "original_file_path": "models/marts/components/schema.yml", "unique_id": "unit_test.demo.components.test_ps_space_type_slug", "fqn": ["demo", "marts", "components", "components", "test_ps_space_type_slug"], "description": "", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.components"]}, "config": {"tags": [], "meta": {}}, "checksum": "e2ed42f87f27b1fc3ffdd2fc572399accf84e98cbf9050878a35286e880da5ad", "schema": "prod", "created_at": 1727441769.826292, "versions": null, "version": null}, "unit_test.demo.components.test_no_null_published_at": {"model": "components", "given": [{"input": "ref('stg_decidim_assemblies')", "rows": [{"id": 1, "published_at": "2023-01-01", "decidim_organization_id": 101}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_participatory_processes')", "rows": [{"id": 2, "published_at": "2023-02-01", "decidim_organization_id": 101}], "format": "dict", "fixture": null}, {"input": "ref('int_components')", "rows": [{"id": 41, "participatory_space_id": 1, "participatory_space_type": "Decidim::Assembly", "published_at": "2024-01-01"}, {"id": 42, "participatory_space_id": 2, "participatory_space_type": "Decidim::ParticipatoryProcess", "published_at": "2024-02-01"}, {"id": 43, "participatory_space_id": 1, "participatory_space_type": "Decidim::Assembly", "published_at": null}, {"id": 44, "participatory_space_id": 2, "participatory_space_type": "Decidim::ParticipatoryProcess", "published_at": "2024-02-01"}], "format": "dict", "fixture": null}, {"input": "ref('int_organizations')", "rows": [{"id": 101}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 41, "published_at": "2024-01-01"}, {"id": 42, "published_at": "2024-02-01"}, {"id": 43, "published_at": null}, {"id": 44, "published_at": "2024-02-01"}], "format": "dict", "fixture": null}, "name": "test_no_null_published_at", "resource_type": "unit_test", "package_name": "demo", "path": "marts/components/schema.yml", "original_file_path": "models/marts/components/schema.yml", "unique_id": "unit_test.demo.components.test_no_null_published_at", "fqn": ["demo", "marts", "components", "components", "test_no_null_published_at"], "description": "", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.components"]}, "config": {"tags": [], "meta": {}}, "checksum": "78c010a0b4ce617ea1bbf3459e78f04b6331a0b13aff30f6e621ad45230055c3", "schema": "prod", "created_at": 1727441769.826802, "versions": null, "version": null}, "unit_test.demo.components.test_take_only_assemblies_and_participatory_processes": {"model": "components", "given": [{"input": "ref('stg_decidim_assemblies')", "rows": [{"id": 1, "published_at": "2023-01-01", "decidim_organization_id": 101, "slug": "assemblies1"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_participatory_processes')", "rows": [{"id": 2, "published_at": "2023-01-15", "decidim_organization_id": 101, "slug": "process1"}], "format": "dict", "fixture": null}, {"input": "ref('int_components')", "rows": [{"id": 42, "participatory_space_type": "Decidim::Assembly", "participatory_space_id": 1, "published_at": "2024-01-01"}, {"id": 43, "participatory_space_type": "Decidim::ParticipatoryProcess", "participatory_space_id": 2, "published_at": "2024-02-01"}, {"id": 44, "participatory_space_type": "Decidim::Votations", "participatory_space_id": 3, "published_at": "2024-03-01"}], "format": "dict", "fixture": null}, {"input": "ref('int_organizations')", "rows": [{"id": 101}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 42, "decidim_organization_id": 101}, {"id": 43, "decidim_organization_id": 101}], "format": "dict", "fixture": null}, "name": "test_take_only_assemblies_and_participatory_processes", "resource_type": "unit_test", "package_name": "demo", "path": "marts/components/schema.yml", "original_file_path": "models/marts/components/schema.yml", "unique_id": "unit_test.demo.components.test_take_only_assemblies_and_participatory_processes", "fqn": ["demo", "marts", "components", "components", "test_take_only_assemblies_and_participatory_processes"], "description": "", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.components"]}, "config": {"tags": [], "meta": {}}, "checksum": "8264dbbdd5756c971a8c974089d1e7df0f3516e41821e115fe4e044631d9f684", "schema": "prod", "created_at": 1727441769.82778, "versions": null, "version": null}, "unit_test.demo.components.test_url_creation": {"model": "components", "given": [{"input": "ref('stg_decidim_assemblies')", "rows": [{"id": 1, "published_at": "2023-01-01", "decidim_organization_id": 101, "slug": "assemblies1"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_participatory_processes')", "rows": [{"id": 2, "published_at": "2023-01-15", "decidim_organization_id": 101, "slug": "process1"}], "format": "dict", "fixture": null}, {"input": "ref('int_components')", "rows": [{"id": 42, "participatory_space_type": "Decidim::Assembly", "participatory_space_id": 1, "published_at": "2024-01-01"}, {"id": 43, "participatory_space_type": "Decidim::ParticipatoryProcess", "participatory_space_id": 2, "published_at": "2024-02-01"}], "format": "dict", "fixture": null}, {"input": "ref('int_organizations')", "rows": [{"id": 101, "host": "organization1"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 42, "component_url": "https://organization1/assemblies/assemblies1/f/42", "ps_id": 1, "ps_url": "https://organization1/assemblies/assemblies1/", "decidim_organization_id": 101}, {"id": 43, "component_url": "https://organization1/processes/process1/f/43", "ps_id": 2, "ps_url": "https://organization1/processes/process1/", "decidim_organization_id": 101}], "format": "dict", "fixture": null}, "name": "test_url_creation", "resource_type": "unit_test", "package_name": "demo", "path": "marts/components/schema.yml", "original_file_path": "models/marts/components/schema.yml", "unique_id": "unit_test.demo.components.test_url_creation", "fqn": ["demo", "marts", "components", "components", "test_url_creation"], "description": "", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.components"]}, "config": {"tags": [], "meta": {}}, "checksum": "1b9184ef66b0dcb7f869cd343f184046a9e383147473a249586bada597df6789", "schema": "prod", "created_at": 1727441769.828757, "versions": null, "version": null}, "unit_test.demo.categorizations.testing_that_main_categories_are_properly_processed": {"model": "categorizations", "given": [{"input": "ref('stg_decidim_categories')", "rows": [{"id": 1, "name": "Environment"}, {"id": 2, "name": "Public Affairs"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_categorizations')", "rows": [{"decidim_category_id": 1, "categorizable_id": 23, "categorizable_type": "Decidim::Proposals::Proposal"}, {"decidim_category_id": 2, "categorizable_id": 25, "categorizable_type": "Decidim::Budgets::Project"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "category_name": "Environment", "child_id": 0, "child_name": "", "categorizable_id": 23, "categorizable_type": "Decidim::Proposals::Proposal"}, {"id": 2, "category_name": "Public Affairs", "child_id": 0, "child_name": "", "categorizable_id": 25, "categorizable_type": "Decidim::Budgets::Project"}], "format": "dict", "fixture": null}, "name": "testing_that_main_categories_are_properly_processed", "resource_type": "unit_test", "package_name": "demo", "path": "marts/categorizations/schema.yml", "original_file_path": "models/marts/categorizations/schema.yml", "unique_id": "unit_test.demo.categorizations.testing_that_main_categories_are_properly_processed", "fqn": ["demo", "marts", "categorizations", "categorizations", "testing_that_main_categories_are_properly_processed"], "description": "Checks that main categories has the correct infos ", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.categorizations"]}, "config": {"tags": [], "meta": {}}, "checksum": "161f8eeaf91497b4de33349be26b11f4e9372db26288bdcd2a487e92174f16c1", "schema": "prod", "created_at": 1727441769.829823, "versions": null, "version": null}, "unit_test.demo.categorizations.testing_that_sub_categories_are_properly_processed": {"model": "categorizations", "given": [{"input": "ref('stg_decidim_categories')", "rows": [{"id": 1, "name": "Environment", "parent_id": null}, {"id": 2, "name": "Public Affairs", "parent_id": null}, {"id": 101, "name": "Green public spaces", "parent_id": 1}, {"id": 102, "name": "Pollution", "parent_id": 1}, {"id": 201, "name": "Administration", "parent_id": 2}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_categorizations')", "rows": [{"decidim_category_id": 1, "categorizable_id": 23, "categorizable_type": "Decidim::Proposals::Proposal"}, {"decidim_category_id": 2, "categorizable_id": 25, "categorizable_type": "Decidim::Budgets::Project"}, {"decidim_category_id": 101, "categorizable_id": 1001, "categorizable_type": "Decidim::Proposals::Proposal"}, {"decidim_category_id": 102, "categorizable_id": 1002, "categorizable_type": "Decidim::Proposals::Proposal"}, {"decidim_category_id": 201, "categorizable_id": 2001, "categorizable_type": "Decidim::Budgets::Project"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "category_name": "Environment", "child_id": 0, "child_name": "", "categorizable_id": 23, "categorizable_type": "Decidim::Proposals::Proposal"}, {"id": 2, "category_name": "Public Affairs", "child_id": 0, "child_name": "", "categorizable_id": 25, "categorizable_type": "Decidim::Budgets::Project"}, {"id": 1, "category_name": "Environment", "child_id": 101, "child_name": "Green public spaces", "categorizable_id": 1001, "categorizable_type": "Decidim::Proposals::Proposal"}, {"id": 1, "category_name": "Environment", "child_id": 102, "child_name": "Pollution", "categorizable_id": 1002, "categorizable_type": "Decidim::Proposals::Proposal"}, {"id": 2, "category_name": "Public Affairs", "child_id": 201, "child_name": "Administration", "categorizable_id": 2001, "categorizable_type": "Decidim::Budgets::Project"}], "format": "dict", "fixture": null}, "name": "testing_that_sub_categories_are_properly_processed", "resource_type": "unit_test", "package_name": "demo", "path": "marts/categorizations/schema.yml", "original_file_path": "models/marts/categorizations/schema.yml", "unique_id": "unit_test.demo.categorizations.testing_that_sub_categories_are_properly_processed", "fqn": ["demo", "marts", "categorizations", "categorizations", "testing_that_sub_categories_are_properly_processed"], "description": "Checks that sub categories has the correct infos ", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.categorizations"]}, "config": {"tags": [], "meta": {}}, "checksum": "b83934eb842ec29d283ef2dccc073ec4937184614b3c2080d3fc17685dd922d1", "schema": "prod", "created_at": 1727441769.830809, "versions": null, "version": null}, "unit_test.demo.endorsements.moderations-check": {"model": "endorsements", "given": [{"input": "ref('stg_decidim_endorsements')", "rows": [{"id": 1, "resource_id": 1, "resource_type": "Decidim::Proposals::Proposal"}, {"id": 2, "resource_id": 2, "resource_type": "Decidim::Proposals::Proposal"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_moderations')", "rows": [{"decidim_reportable_id": 1, "decidim_reportable_type": "Decidim::Proposals::Proposal", "hidden_at": "2024-07-22"}, {"decidim_reportable_id": 2, "decidim_reportable_type": "Decidim::Proposals::Proposal", "hidden_at": null}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_proposals')", "rows": [{"id": 1, "resource_type": "Decidim::Proposals::Proposal"}, {"id": 2, "resource_type": "Decidim::Proposals::Proposal"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_debates')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_blogs_posts')", "rows": [{}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 2}], "format": "dict", "fixture": null}, "name": "moderations-check", "resource_type": "unit_test", "package_name": "demo", "path": "marts/endorsements/schema.yml", "original_file_path": "models/marts/endorsements/schema.yml", "unique_id": "unit_test.demo.endorsements.moderations-check", "fqn": ["demo", "marts", "endorsements", "endorsements", "moderations-check"], "description": "Check if endorsements to moderated proposals/debates/blog posts are properly ignored", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.endorsements"]}, "config": {"tags": [], "meta": {}}, "checksum": "3a11fa2d068270a1dedcf90e5cdee22503ba67c1a023b97fdd2c64758a884880", "schema": "prod", "created_at": 1727441769.8319411, "versions": null, "version": null}, "unit_test.demo.endorsements.endorsements-component-check": {"model": "endorsements", "given": [{"input": "ref('stg_decidim_endorsements')", "rows": [{"id": 1, "resource_id": 42, "resource_type": "Decidim::Proposals::Proposal"}, {"id": 2, "resource_id": 42, "resource_type": "Decidim::Debates::Debate"}, {"id": 3, "resource_id": 42, "resource_type": "Decidim::Blogs::Post"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_proposals')", "rows": [{"id": 42, "resource_type": "Decidim::Proposals::Proposal", "decidim_component_id": 100}, {"id": 91, "resource_type": "Decidim::Proposals::Proposal", "decidim_component_id": 991}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_debates')", "rows": [{"id": 42, "resource_type": "Decidim::Debates::Debate", "decidim_component_id": 200}, {"id": 92, "resource_type": "Decidim::Debates::Debate", "decidim_component_id": 992}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_blogs_posts')", "rows": [{"id": 42, "resource_type": "Decidim::Blogs::Post", "decidim_component_id": 300}, {"id": 93, "resource_type": "Decidim::Blogs::Post", "decidim_component_id": 993}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_moderations')", "rows": [{}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "decidim_component_id": 100}, {"id": 2, "decidim_component_id": 200}, {"id": 3, "decidim_component_id": 300}], "format": "dict", "fixture": null}, "name": "endorsements-component-check", "resource_type": "unit_test", "package_name": "demo", "path": "marts/endorsements/schema.yml", "original_file_path": "models/marts/endorsements/schema.yml", "unique_id": "unit_test.demo.endorsements.endorsements-component-check", "fqn": ["demo", "marts", "endorsements", "endorsements", "endorsements-component-check"], "description": "Check if endorsements are properly matched to their components", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.endorsements"]}, "config": {"tags": [], "meta": {}}, "checksum": "74fe535402ddaf5bbd14ae3f26c12f98e068c078258c75873ccfd1b8bac66202", "schema": "prod", "created_at": 1727441769.832486, "versions": null, "version": null}, "unit_test.demo.meetings.test_url_concatenation": {"model": "meetings", "given": [{"input": "ref('int_meetings')", "rows": [{"decidim_component_id": 1, "id": 100}], "format": "dict", "fixture": null}, {"input": "ref('components')", "rows": [{"organization_host": "host1", "ps_space_type_slug": "space_type_slug1", "ps_slug": "ps_slug1", "id": 1, "manifest_name": "meetings"}], "format": "dict", "fixture": null}, {"input": "ref(\"categorizations\")", "rows": [{"categorizable_id": 100}], "format": "dict", "fixture": null}], "expect": {"rows": [{"meeting_url": "https://host1/space_type_slug1/ps_slug1/f/1/meetings/100"}], "format": "dict", "fixture": null}, "name": "test_url_concatenation", "resource_type": "unit_test", "package_name": "demo", "path": "marts/meetings/schema.yml", "original_file_path": "models/marts/meetings/schema.yml", "unique_id": "unit_test.demo.meetings.test_url_concatenation", "fqn": ["demo", "marts", "meetings", "meetings", "test_url_concatenation"], "description": "Check URL concatenation logic", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.meetings"]}, "config": {"tags": [], "meta": {}}, "checksum": "e56762e868e7f9ed2a622429c34e91c3e5a0ff87f9087907d1db360ed294e140", "schema": "prod", "created_at": 1727441769.843999, "versions": null, "version": null}, "unit_test.demo.meetings.test_manifest_name_is_meetings": {"model": "meetings", "given": [{"input": "ref('int_meetings')", "rows": [{"decidim_component_id": 1, "id": 100}, {"decidim_component_id": 2, "id": 200}], "format": "dict", "fixture": null}, {"input": "ref('components')", "rows": [{"id": 1, "manifest_name": "meetings"}, {"id": 2, "manifest_name": "foo"}], "format": "dict", "fixture": null}, {"input": "ref(\"categorizations\")", "rows": [{}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 100}], "format": "dict", "fixture": null}, "name": "test_manifest_name_is_meetings", "resource_type": "unit_test", "package_name": "demo", "path": "marts/meetings/schema.yml", "original_file_path": "models/marts/meetings/schema.yml", "unique_id": "unit_test.demo.meetings.test_manifest_name_is_meetings", "fqn": ["demo", "marts", "meetings", "meetings", "test_manifest_name_is_meetings"], "description": "Check that manifest name filters on meetings", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.meetings"]}, "config": {"tags": [], "meta": {}}, "checksum": "9671543d8da01650b69dc3130e626c7107ea62e2c2818d5ec2cbb201430efdd7", "schema": "prod", "created_at": 1727441769.8445408, "versions": null, "version": null}, "unit_test.demo.proposals.withdrawn_proposals_check": {"model": "proposals", "given": [{"input": "ref('int_users')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_coauthorships')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_proposals_votes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('int_proposals')", "rows": [{"id": 41, "state": "submitted", "published_at": "2023-01-01", "decidim_component_id": 100}, {"id": 42, "state": "withdrawn", "published_at": "2023-01-02", "decidim_component_id": 100}], "format": "dict", "fixture": null}, {"input": "ref('components')", "rows": [{"id": 100}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_moderations')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('int_scopes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('categorizations')", "rows": [{}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 41, "state": "submitted"}], "format": "dict", "fixture": null}, "name": "withdrawn_proposals_check", "resource_type": "unit_test", "package_name": "demo", "path": "marts/proposals/schema.yml", "original_file_path": "models/marts/proposals/schema.yml", "unique_id": "unit_test.demo.proposals.withdrawn_proposals_check", "fqn": ["demo", "marts", "proposals", "proposals", "withdrawn_proposals_check"], "description": "Check if withdrawn proposals are properly removed", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "46bf72c0d7e701298d97608f5efe66874fb73cf2e9c011a9d900e148d532e678", "schema": "prod", "created_at": 1727441769.8505101, "versions": null, "version": null}, "unit_test.demo.proposals.moderations_proposals_check": {"model": "proposals", "given": [{"input": "ref('int_users')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_coauthorships')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_proposals_votes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('int_proposals')", "rows": [{"id": 43, "state": "submitted", "published_at": "2023-01-03", "decidim_component_id": 100}, {"id": 44, "state": "submitted", "published_at": "2023-01-03", "decidim_component_id": 100}], "format": "dict", "fixture": null}, {"input": "ref('components')", "rows": [{"id": 100}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_moderations')", "rows": [{"decidim_reportable_id": 43, "decidim_reportable_type": "Decidim::Proposals::Proposal", "hidden_at": "2024-07-22"}], "format": "dict", "fixture": null}, {"input": "ref('int_scopes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('categorizations')", "rows": [{}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 44}], "format": "dict", "fixture": null}, "name": "moderations_proposals_check", "resource_type": "unit_test", "package_name": "demo", "path": "marts/proposals/schema.yml", "original_file_path": "models/marts/proposals/schema.yml", "unique_id": "unit_test.demo.proposals.moderations_proposals_check", "fqn": ["demo", "marts", "proposals", "proposals", "moderations_proposals_check"], "description": "Check if proposals are properly ignored due to 'hidden_at' date and other moderation conditions", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "c95871be5e14969c07bd0da8f47391df026e1e773e13289644d94847d72886b9", "schema": "prod", "created_at": 1727441769.8511739, "versions": null, "version": null}, "unit_test.demo.proposals.conflict_on_decidim_reportable_type_check": {"model": "proposals", "given": [{"input": "ref('int_users')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_coauthorships')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_proposals_votes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('int_proposals')", "rows": [{"id": 43, "state": "submitted", "published_at": "2023-01-03", "decidim_component_id": 100}], "format": "dict", "fixture": null}, {"input": "ref('components')", "rows": [{"id": 100}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_moderations')", "rows": [{"decidim_reportable_id": 43, "decidim_reportable_type": "Decidim::Debates::Debate", "hidden_at": null}, {"decidim_reportable_id": 43, "decidim_reportable_type": "Decidim::Proposals::Proposal", "hidden_at": null}], "format": "dict", "fixture": null}, {"input": "ref('int_scopes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('categorizations')", "rows": [{}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 43}], "format": "dict", "fixture": null}, "name": "conflict_on_decidim_reportable_type_check", "resource_type": "unit_test", "package_name": "demo", "path": "marts/proposals/schema.yml", "original_file_path": "models/marts/proposals/schema.yml", "unique_id": "unit_test.demo.proposals.conflict_on_decidim_reportable_type_check", "fqn": ["demo", "marts", "proposals", "proposals", "conflict_on_decidim_reportable_type_check"], "description": "Check if there is no conflict in moderation table on id if there is a decidim_reportable_type that is not a proposal and has the same id", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "ca3008534822d18f38caa2f819e4782a2c0eabe9518b375f5fe6e277fc86a272", "schema": "prod", "created_at": 1727441769.851716, "versions": null, "version": null}, "unit_test.demo.proposals.published_at_check": {"model": "proposals", "given": [{"input": "ref('int_users')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_coauthorships')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_proposals_votes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('int_proposals')", "rows": [{"id": 43, "state": "submitted", "published_at": "2023-01-03", "decidim_component_id": 100}, {"id": 44, "state": "submitted", "published_at": null, "decidim_component_id": 100}], "format": "dict", "fixture": null}, {"input": "ref('components')", "rows": [{"id": 100}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_moderations')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('int_scopes')", "rows": [{}], "format": "dict", "fixture": null}, {"input": "ref('categorizations')", "rows": [{}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 43}], "format": "dict", "fixture": null}, "name": "published_at_check", "resource_type": "unit_test", "package_name": "demo", "path": "marts/proposals/schema.yml", "original_file_path": "models/marts/proposals/schema.yml", "unique_id": "unit_test.demo.proposals.published_at_check", "fqn": ["demo", "marts", "proposals", "proposals", "published_at_check"], "description": "Check if proposals are properly ignored if 'published_at' is null", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "f3c4d2acc441595bef57899b0f9da3d27b11417154d8c704024f2b825ddf6a50", "schema": "prod", "created_at": 1727441769.852256, "versions": null, "version": null}, "unit_test.demo.int_organizations.test_filter_by_host": {"model": "int_organizations", "given": [{"input": "ref('stg_decidim_organizations')", "rows": [{"id": 1, "host": "host1.com"}, {"id": 2, "host": "host2.com"}, {"id": 3, "host": "host3.com"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "host": "host1.com"}], "format": "dict", "fixture": null}, "name": "test_filter_by_host", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/organizations/schema.yml", "original_file_path": "models/intermediate/organizations/schema.yml", "unique_id": "unit_test.demo.int_organizations.test_filter_by_host", "fqn": ["demo", "intermediate", "organizations", "int_organizations", "test_filter_by_host"], "description": "Test that the model only includes records with the specified host.", "overrides": {"macros": {}, "vars": {}, "env_vars": {"PARTICIPATION_HOST_NAME": "host1.com"}}, "depends_on": {"macros": [], "nodes": ["model.demo.int_organizations"]}, "config": {"tags": [], "meta": {}}, "checksum": "3ffd43912cc818e1cdd9a02af9d1c2baa07004dfa076ae0308ab5df4dc19d6bb", "schema": "prod", "created_at": 1727441769.853934, "versions": null, "version": null}, "unit_test.demo.int_organizations.test_regex_clean_description": {"model": "int_organizations", "given": [{"input": "ref('stg_decidim_organizations')", "rows": [{"id": 1, "description": "{\"fr\": \"

Welcome to &Decidim

\"}", "host": "host1.com"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "description": "Welcome to Decidim"}], "format": "dict", "fixture": null}, "name": "test_regex_clean_description", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/organizations/schema.yml", "original_file_path": "models/intermediate/organizations/schema.yml", "unique_id": "unit_test.demo.int_organizations.test_regex_clean_description", "fqn": ["demo", "intermediate", "organizations", "int_organizations", "test_regex_clean_description"], "description": "Test that the regex properly cleans the description field by removing HTML tags and entities.", "overrides": {"macros": {}, "vars": {}, "env_vars": {"PARTICIPATION_HOST_NAME": "host1.com"}}, "depends_on": {"macros": [], "nodes": ["model.demo.int_organizations"]}, "config": {"tags": [], "meta": {}}, "checksum": "1aa4927763e93ab0d202c2f7b1590b5d5811c5a87f4341b9f02aaccfe0fc344d", "schema": "prod", "created_at": 1727441769.854413, "versions": null, "version": null}, "unit_test.demo.int_forms_answers.int_forms_answers_author_status_check": {"model": "int_forms_answers", "given": [{"input": "ref('stg_decidim_forms_answers')", "rows": [{"decidim_user_id": 1}, {"decidim_user_id": null}], "format": "dict", "fixture": null}], "expect": {"rows": [{"author_status": "Inscrit et connect\u00e9"}, {"author_status": "Non connect\u00e9"}], "format": "dict", "fixture": null}, "name": "int_forms_answers_author_status_check", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/forms/schema.yml", "original_file_path": "models/intermediate/forms/schema.yml", "unique_id": "unit_test.demo.int_forms_answers.int_forms_answers_author_status_check", "fqn": ["demo", "intermediate", "forms", "int_forms_answers", "int_forms_answers_author_status_check"], "description": "Check that the author status is correctly detected", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_forms_answers"]}, "config": {"tags": [], "meta": {}}, "checksum": "30fbbbdc10405bc7c3cf35461d1e3d7e920736f21e27a27c367725ccf742e898", "schema": "prod", "created_at": 1727441769.8553119, "versions": null, "version": null}, "unit_test.demo.answers_short_and_long_answer.answers_short_and_long_answer_check": {"model": "answers_short_and_long_answer", "given": [{"input": "ref('int_forms_answers')", "rows": [{"id": 1, "decidim_question_id": 41, "body": "Answer 1"}, {"id": 2, "decidim_question_id": 42, "body": null}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_questions')", "rows": [{"id": 41, "decidim_questionnaire_id": 101, "body": "{\"fr\": \"Question 1\"}", "position": 1, "question_type": "short_answer"}, {"id": 42, "decidim_questionnaire_id": 101, "body": "{\"fr\": \"Question 2\"}", "position": 2, "question_type": "long_answer"}], "format": "dict", "fixture": null}, {"input": "ref('forms')", "rows": [{"id": 101}], "format": "dict", "fixture": null}], "expect": {"rows": [{"answer": "Answer 1", "sub_matrix_question": "", "custom_body": "", "sorting_position": -1, "decidim_questionnaire_id": 101, "position": 1}, {"answer": "Pas de r\u00e9ponse", "sub_matrix_question": "", "custom_body": "", "sorting_position": -1, "decidim_questionnaire_id": 101, "position": 2}], "format": "dict", "fixture": null}, "name": "answers_short_and_long_answer_check", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/forms/schema.yml", "original_file_path": "models/intermediate/forms/schema.yml", "unique_id": "unit_test.demo.answers_short_and_long_answer.answers_short_and_long_answer_check", "fqn": ["demo", "intermediate", "forms", "answers_short_and_long_answer", "answers_short_and_long_answer_check"], "description": "Check if option and sorting answers are correctly processed in the answers_short_and_long_answer CTE", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.answers_short_and_long_answer"]}, "config": {"tags": [], "meta": {}}, "checksum": "27662a116e5bd624cb2423e0197f7b8b6d7ac197ffce93f37b136cb057d6ee9b", "schema": "prod", "created_at": 1727441769.856771, "versions": null, "version": null}, "unit_test.demo.answers_matrix.answers_matrix_check": {"model": "answers_matrix", "given": [{"input": "ref('int_forms_answers')", "rows": [{"id": 901, "decidim_question_id": 41}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_questions')", "rows": [{"id": 41, "decidim_questionnaire_id": 101, "body": "How often do you go there ?", "question_type": "matrix_single"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_answer_choices')", "rows": [{"decidim_answer_id": 901, "body": "Rarely", "decidim_question_matrix_row_id": 1}, {"decidim_answer_id": 901, "body": "Never", "decidim_question_matrix_row_id": 2}, {"decidim_answer_id": 901, "body": "Often", "decidim_question_matrix_row_id": 3}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_question_matrix_rows')", "rows": [{"id": 1, "body": "Place 1"}, {"id": 2, "body": "Place 2"}, {"id": 3, "body": "Place 3"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"body": "How often do you go there ?", "answer": "Rarely", "sub_matrix_question": "Place 1", "sorting_position": -1, "decidim_questionnaire_id": 101, "custom_body": "", "question_type": "matrix_single"}, {"body": "How often do you go there ?", "answer": "Never", "sub_matrix_question": "Place 2", "sorting_position": -1, "decidim_questionnaire_id": 101, "custom_body": "", "question_type": "matrix_single"}, {"body": "How often do you go there ?", "answer": "Often", "sub_matrix_question": "Place 3", "sorting_position": -1, "decidim_questionnaire_id": 101, "custom_body": "", "question_type": "matrix_single"}], "format": "dict", "fixture": null}, "name": "answers_matrix_check", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/forms/schema.yml", "original_file_path": "models/intermediate/forms/schema.yml", "unique_id": "unit_test.demo.answers_matrix.answers_matrix_check", "fqn": ["demo", "intermediate", "forms", "answers_matrix", "answers_matrix_check"], "description": "Check if matrix answers are correctly processed", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.answers_matrix"]}, "config": {"tags": [], "meta": {}}, "checksum": "556bc9bc1bed125883a476da395cda9394c83fb1a94fc69d6fd557aeb5e8d1d7", "schema": "prod", "created_at": 1727441769.8585112, "versions": null, "version": null}, "unit_test.demo.answers_option_and_sorting.answers_option_and_sorting_check_on_question_type": {"model": "answers_option_and_sorting", "given": [{"input": "ref('int_forms_answers')", "rows": [{"id": 901, "decidim_question_id": 41}, {"id": 902, "decidim_question_id": 42}, {"id": 903, "decidim_question_id": 43}, {"id": 904, "decidim_question_id": 44}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_questions')", "rows": [{"id": 41, "question_type": "single_option"}, {"id": 42, "question_type": "multiple_option"}, {"id": 43, "question_type": "sorting"}, {"id": 44, "question_type": "matrix_single"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_answer_choices')", "rows": [{"decidim_answer_id": 901}, {"decidim_answer_id": 902}, {"decidim_answer_id": 903}, {"decidim_answer_id": 904}], "format": "dict", "fixture": null}], "expect": {"rows": [{"question_type": "single_option"}, {"question_type": "multiple_option"}, {"question_type": "sorting"}], "format": "dict", "fixture": null}, "name": "answers_option_and_sorting_check_on_question_type", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/forms/schema.yml", "original_file_path": "models/intermediate/forms/schema.yml", "unique_id": "unit_test.demo.answers_option_and_sorting.answers_option_and_sorting_check_on_question_type", "fqn": ["demo", "intermediate", "forms", "answers_option_and_sorting", "answers_option_and_sorting_check_on_question_type"], "description": "Check that question_type is correctly taken into account", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.answers_option_and_sorting"]}, "config": {"tags": [], "meta": {}}, "checksum": "29d207b693231893bc29f409bc074e036c6eb7e187e34ca9dbfc0f3e5b8f7f9e", "schema": "prod", "created_at": 1727441769.8593931, "versions": null, "version": null}, "unit_test.demo.answers_short_and_long_answer.short_and_long_answer_check_on_question_type": {"model": "answers_short_and_long_answer", "given": [{"input": "ref('int_forms_answers')", "rows": [{"id": 901, "decidim_question_id": 41}, {"id": 902, "decidim_question_id": 42}, {"id": 903, "decidim_question_id": 43}, {"id": 904, "decidim_question_id": 44}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_questions')", "rows": [{"id": 41, "question_type": "short_answer"}, {"id": 42, "question_type": "long_answer"}, {"id": 43, "question_type": "sorting"}, {"id": 44, "question_type": "matrix_single"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"question_type": "short_answer"}, {"question_type": "long_answer"}], "format": "dict", "fixture": null}, "name": "short_and_long_answer_check_on_question_type", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/forms/schema.yml", "original_file_path": "models/intermediate/forms/schema.yml", "unique_id": "unit_test.demo.answers_short_and_long_answer.short_and_long_answer_check_on_question_type", "fqn": ["demo", "intermediate", "forms", "answers_short_and_long_answer", "short_and_long_answer_check_on_question_type"], "description": "Check that question_type is correctly taken into account", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.answers_short_and_long_answer"]}, "config": {"tags": [], "meta": {}}, "checksum": "b3553f57599f4bcc0997a33d0f7158e00c4e326a0a3c9d87434041aa6783da06", "schema": "prod", "created_at": 1727441769.8597991, "versions": null, "version": null}, "unit_test.demo.answers_matrix.answers_matrix_check_on_question_type": {"model": "answers_matrix", "given": [{"input": "ref('int_forms_answers')", "rows": [{"id": 901, "decidim_question_id": 41}, {"id": 902, "decidim_question_id": 42}, {"id": 903, "decidim_question_id": 43}, {"id": 904, "decidim_question_id": 44}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_questions')", "rows": [{"id": 41, "question_type": "short_answer"}, {"id": 42, "question_type": "long_answer"}, {"id": 43, "question_type": "matrix_multiple"}, {"id": 44, "question_type": "matrix_single"}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_answer_choices')", "rows": [{"decidim_answer_id": 903, "decidim_question_matrix_row_id": 1}, {"decidim_answer_id": 904, "decidim_question_matrix_row_id": 2}], "format": "dict", "fixture": null}, {"input": "ref('stg_decidim_forms_question_matrix_rows')", "rows": [{"id": 1}, {"id": 2}, {"id": 3}], "format": "dict", "fixture": null}], "expect": {"rows": [{"question_type": "matrix_multiple"}, {"question_type": "matrix_single"}], "format": "dict", "fixture": null}, "name": "answers_matrix_check_on_question_type", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/forms/schema.yml", "original_file_path": "models/intermediate/forms/schema.yml", "unique_id": "unit_test.demo.answers_matrix.answers_matrix_check_on_question_type", "fqn": ["demo", "intermediate", "forms", "answers_matrix", "answers_matrix_check_on_question_type"], "description": "Check that question_type is correctly taken into account", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.answers_matrix"]}, "config": {"tags": [], "meta": {}}, "checksum": "824c413a3cf2f73558cf4b203a42542cdcb695fdd70abab16e1f59c644f66686", "schema": "prod", "created_at": 1727441769.860398, "versions": null, "version": null}, "unit_test.demo.int_components.test_translated_manifest_name": {"model": "int_components", "given": [{"input": "ref('stg_decidim_components')", "rows": [{"id": 1, "manifest_name": "accountability"}, {"id": 2, "manifest_name": "pages"}, {"id": 3, "manifest_name": "budgets"}, {"id": 4, "manifest_name": "meetings"}, {"id": 5, "manifest_name": "proposals"}, {"id": 6, "manifest_name": "surveys"}, {"id": 7, "manifest_name": "blogs"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "translated_manifest_name": "Suivi"}, {"id": 2, "translated_manifest_name": "Page"}, {"id": 3, "translated_manifest_name": "Budgets"}, {"id": 4, "translated_manifest_name": "Rencontres"}, {"id": 5, "translated_manifest_name": "Propositions"}, {"id": 6, "translated_manifest_name": "Enqu\u00eates"}, {"id": 7, "translated_manifest_name": "Blogs"}], "format": "dict", "fixture": null}, "name": "test_translated_manifest_name", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/components/schema.yml", "original_file_path": "models/intermediate/components/schema.yml", "unique_id": "unit_test.demo.int_components.test_translated_manifest_name", "fqn": ["demo", "intermediate", "components", "int_components", "test_translated_manifest_name"], "description": "", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_components"]}, "config": {"tags": [], "meta": {}}, "checksum": "ef0147cb1b03f6ccaab1db45b7b72dc773046c25fab2a661f02e72b1161d22c6", "schema": "prod", "created_at": 1727441769.863044, "versions": null, "version": null}, "unit_test.demo.int_users.deleted_users_check": {"model": "int_users", "given": [{"input": "ref('stg_decidim_users')", "rows": [{"id": 1, "deleted_at": "2024-07-17", "type": "Decidim::User"}, {"id": 2, "deleted_at": null, "type": "Decidim::User"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 2}], "format": "dict", "fixture": null}, "name": "deleted_users_check", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/users/schema.yml", "original_file_path": "models/intermediate/users/schema.yml", "unique_id": "unit_test.demo.int_users.deleted_users_check", "fqn": ["demo", "intermediate", "users", "int_users", "deleted_users_check"], "description": "Check that no deleted users are retrieved", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_users"]}, "config": {"tags": [], "meta": {}}, "checksum": "d9c03269fac281530a3935d59e3433f531d771356b3e28f1ddc2910a1d9d0d76", "schema": "prod", "created_at": 1727441769.866791, "versions": null, "version": null}, "unit_test.demo.int_users.type_check": {"model": "int_users", "given": [{"input": "ref('stg_decidim_users')", "rows": [{"id": 1, "type": "Decidim::User"}, {"id": 2, "type": "Decidim::Admin"}, {"id": 3, "type": "Decidim::Admin, Decidim::User"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1}], "format": "dict", "fixture": null}, "name": "type_check", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/users/schema.yml", "original_file_path": "models/intermediate/users/schema.yml", "unique_id": "unit_test.demo.int_users.type_check", "fqn": ["demo", "intermediate", "users", "int_users", "type_check"], "description": "Check that the type contains Decidim::User", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_users"]}, "config": {"tags": [], "meta": {}}, "checksum": "70fed1350b42b9929a9a7f7584487c58e07b99c676aac775602ff673a788ed71", "schema": "prod", "created_at": 1727441769.8673239, "versions": null, "version": null}, "unit_test.demo.int_users.sign_in_frequency_check": {"model": "int_users", "given": [{"input": "ref('stg_decidim_users')", "rows": [{"sign_in_count": 0, "type": "Decidim::User"}, {"sign_in_count": 1, "type": "Decidim::User"}, {"sign_in_count": 2, "type": "Decidim::User"}, {"sign_in_count": 3, "type": "Decidim::User"}, {"sign_in_count": 4, "type": "Decidim::User"}, {"sign_in_count": 5, "type": "Decidim::User"}, {"sign_in_count": 6, "type": "Decidim::User"}, {"sign_in_count": 7, "type": "Decidim::User"}, {"sign_in_count": 8, "type": "Decidim::User"}, {"sign_in_count": 9, "type": "Decidim::User"}, {"sign_in_count": 10, "type": "Decidim::User"}, {"sign_in_count": 11, "type": "Decidim::User"}, {"sign_in_count": 100, "type": "Decidim::User"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"sign_in_frequency": "Jamais"}, {"sign_in_frequency": "Une seule fois"}, {"sign_in_frequency": "Deux fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Entre 2 et 10 fois"}, {"sign_in_frequency": "Plus de 10 fois"}, {"sign_in_frequency": "Plus de 10 fois"}], "format": "dict", "fixture": null}, "name": "sign_in_frequency_check", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/users/schema.yml", "original_file_path": "models/intermediate/users/schema.yml", "unique_id": "unit_test.demo.int_users.sign_in_frequency_check", "fqn": ["demo", "intermediate", "users", "int_users", "sign_in_frequency_check"], "description": "Check that the sign in frequency is properly calculated", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_users"]}, "config": {"tags": [], "meta": {}}, "checksum": "6a820ca405c9eb1ea0e0eff4a300a42d2bfad0ae5c2985c25021b2310682354d", "schema": "prod", "created_at": 1727441769.868347, "versions": null, "version": null}, "unit_test.demo.int_budgets_orders.vote_finished_test": {"model": "int_budgets_orders", "given": [{"input": "ref('stg_decidim_budgets_orders')", "rows": [{"id": 1, "checked_out_at": "2024-04-03"}, {"id": 2, "checked_out_at": null}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "vote_finished": true}, {"id": 2, "vote_finished": false}], "format": "dict", "fixture": null}, "name": "vote_finished_test", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/budgets/schema.yml", "original_file_path": "models/intermediate/budgets/schema.yml", "unique_id": "unit_test.demo.int_budgets_orders.vote_finished_test", "fqn": ["demo", "intermediate", "budgets", "int_budgets_orders", "vote_finished_test"], "description": "Checks that the boolean is properly set to True only if there is a checked_out_at timestamp", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_budgets_orders"]}, "config": {"tags": [], "meta": {}}, "checksum": "d70b7d78fdbe2bccee166df639e81431ddea02bdb41280ef3df91af064e17737", "schema": "prod", "created_at": 1727441769.869021, "versions": null, "version": null}, "unit_test.demo.int_budgets_projects.is_selected_test": {"model": "int_budgets_projects", "given": [{"input": "ref('stg_decidim_budgets_projects')", "rows": [{"id": 1, "selected_at": "2024-04-03"}, {"id": 2, "selected_at": null}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "is_selected": true}, {"id": 2, "is_selected": false}], "format": "dict", "fixture": null}, "name": "is_selected_test", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/budgets/schema.yml", "original_file_path": "models/intermediate/budgets/schema.yml", "unique_id": "unit_test.demo.int_budgets_projects.is_selected_test", "fqn": ["demo", "intermediate", "budgets", "int_budgets_projects", "is_selected_test"], "description": "Checks that the boolean is properly set to True only if there is a selected_at timestamp", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_budgets_projects"]}, "config": {"tags": [], "meta": {}}, "checksum": "bc0d0eda2b984b5fd6a997d8d00cefff68cb7df81fd8735d7bc1d3581e93f8b0", "schema": "prod", "created_at": 1727441769.869627, "versions": null, "version": null}, "unit_test.demo.int_proposals.test_default_state": {"model": "int_proposals", "given": [{"input": "ref('stg_decidim_proposals')", "rows": [{"id": 1, "published_at": "2024-08-12", "state": null}, {"id": 2, "published_at": "2024-08-12", "state": "rejected"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "state": "Pas d'\u00e9tat", "translated_state": "Pas d'\u00e9tat"}, {"id": 2, "state": "rejected", "translated_state": "Rejet\u00e9e"}], "format": "dict", "fixture": null}, "name": "test_default_state", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/proposals/schema.yml", "original_file_path": "models/intermediate/proposals/schema.yml", "unique_id": "unit_test.demo.int_proposals.test_default_state", "fqn": ["demo", "intermediate", "proposals", "int_proposals", "test_default_state"], "description": "Test that the state column correctly defaults to 'Pas d'\u00e9tat' if null", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "99d1bb435590a321f2dfe40852c9fc9f2ce8248a328ce6b64f8008bcc17f0e24", "schema": "prod", "created_at": 1727441769.8711412, "versions": null, "version": null}, "unit_test.demo.int_proposals.test_translated_state": {"model": "int_proposals", "given": [{"input": "ref('stg_decidim_proposals')", "rows": [{"id": 1, "published_at": "2024-08-12", "state": "evaluating"}, {"id": 2, "published_at": "2024-08-12", "state": "rejected"}, {"id": 3, "published_at": "2024-08-12", "state": "accepted"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "translated_state": "En cours d'\u00e9valuation"}, {"id": 2, "translated_state": "Rejet\u00e9e"}, {"id": 3, "translated_state": "Accept\u00e9e"}], "format": "dict", "fixture": null}, "name": "test_translated_state", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/proposals/schema.yml", "original_file_path": "models/intermediate/proposals/schema.yml", "unique_id": "unit_test.demo.int_proposals.test_translated_state", "fqn": ["demo", "intermediate", "proposals", "int_proposals", "test_translated_state"], "description": "Test that the state column is correctly translated", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "46e7cf3cc02dd0af985de431a877d98a41bf18854a1fd4de9dfd1b9a3def31d4", "schema": "prod", "created_at": 1727441769.871907, "versions": null, "version": null}, "unit_test.demo.int_proposals.test_default_address": {"model": "int_proposals", "given": [{"input": "ref('stg_decidim_proposals')", "rows": [{"id": 1, "published_at": "2024-08-12", "address": ""}, {"id": 2, "published_at": "2024-08-12", "address": "1 Place Hannah Arendt"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "address": "Pas d'adresse"}, {"id": 2, "address": "1 Place Hannah Arendt"}], "format": "dict", "fixture": null}, "name": "test_default_address", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/proposals/schema.yml", "original_file_path": "models/intermediate/proposals/schema.yml", "unique_id": "unit_test.demo.int_proposals.test_default_address", "fqn": ["demo", "intermediate", "proposals", "int_proposals", "test_default_address"], "description": "Test that the address column correctly defaults to 'Pas d'adresse' if empty", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "4b15bb31bd37d801158ffb6821c2efb44897a972db9e9fd773b47e756ed2ddc1", "schema": "prod", "created_at": 1727441769.872523, "versions": null, "version": null}, "unit_test.demo.int_proposals.test_published_at_not_null": {"model": "int_proposals", "given": [{"input": "ref('stg_decidim_proposals')", "rows": [{"id": 1, "published_at": "2023-01-01"}, {"id": 2, "published_at": null}, {"id": 3, "published_at": "2023-02-01"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "published_at": "2023-01-01"}, {"id": 3, "published_at": "2023-02-01"}], "format": "dict", "fixture": null}, "name": "test_published_at_not_null", "resource_type": "unit_test", "package_name": "demo", "path": "intermediate/proposals/schema.yml", "original_file_path": "models/intermediate/proposals/schema.yml", "unique_id": "unit_test.demo.int_proposals.test_published_at_not_null", "fqn": ["demo", "intermediate", "proposals", "int_proposals", "test_published_at_not_null"], "description": "Test that only rows with non-null published_at are included", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.demo.int_proposals"]}, "config": {"tags": [], "meta": {}}, "checksum": "e0807cc7eb3d4c87115af2388bd7d58ada8368b6a782f0e8b6ae5c0d2f8fb0e5", "schema": "prod", "created_at": 1727441769.87285, "versions": null, "version": null}, "unit_test.test_lyon.int_decidim_awesome_proposal_extra_fields.testing_that_the_correct_xml_information_are_parsed": {"model": "int_decidim_awesome_proposal_extra_fields", "given": [{"input": "ref('stg_decidim_awesome_proposal_extra_fields')", "rows": [{"id": 1, "proposal_id": 101, "private_body_clear": "
Cette id\u00e9e est d\u00e9pos\u00e9e \u00e0 titre :
Individuel
Votre tranche d'\u00e2ge :
16-25 ans
"}], "format": "dict", "fixture": null}], "expect": {"rows": [{"id": 1, "proposal_id": 101, "private_field_description": "Cette id\u00e9e est d\u00e9pos\u00e9e \u00e0 titre :", "private_field_content": "Individuel"}, {"id": 1, "proposal_id": 101, "private_field_description": "Votre tranche d'\u00e2ge :", "private_field_content": "16-25 ans"}], "format": "dict", "fixture": null}, "name": "testing_that_the_correct_xml_information_are_parsed", "resource_type": "unit_test", "package_name": "test_lyon", "path": "intermediate/decidim_awesome/schema.yml", "original_file_path": "models/intermediate/decidim_awesome/schema.yml", "unique_id": "unit_test.test_lyon.int_decidim_awesome_proposal_extra_fields.testing_that_the_correct_xml_information_are_parsed", "fqn": ["test_lyon", "intermediate", "decidim_awesome", "int_decidim_awesome_proposal_extra_fields", "testing_that_the_correct_xml_information_are_parsed"], "description": "Checks that age matching fetches the correct infos ", "overrides": null, "depends_on": {"macros": [], "nodes": ["model.test_lyon.int_decidim_awesome_proposal_extra_fields"]}, "config": {"tags": [], "meta": {}}, "checksum": "e0b27182953e4023551ddfadb365b30f131b958c51aff139d3210bf258637f2e", "schema": "prod", "created_at": 1727446205.904194, "versions": null, "version": null}}} \ No newline at end of file diff --git a/projects/test_lyon/target/partial_parse.msgpack b/projects/test_lyon/target/partial_parse.msgpack deleted file mode 100644 index b170e3683b414af1e412186a9814ebeb27eef846..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1023822 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 bbJ@s z12px|JorG7Nf*_P2d9+IdU}37iMKJ+U~X@_H3m)kQ@_~H)THlmY0|kFqoGaT_SZjs z;o>Je9(_QX-89n-J&!Bd-U*MiMN;B;lj)Mc^U|y*|4jE4RA~Q7Gv4*<$7YTlJ7y^F zQb(2glSENcpD+{SC)Z{BJ0yVX6<=t?u>Gvx-C(EX*MeyiEi1KF;CC_CyV})o=Wd!c z=E9(JO`C9+H)49RSY}*Z`?5SneEJzBKu*Y+r%HLY0cl|!LZ5nia39}eUVq5+#wZ0p zd!XS@B@a$RdYDkaSe0^N=f+r|#GLQfm;8+Q zGJG+nPAQgS=t|?>=qwFtxD6HB)Nq|6n$?Xq^2(`aUsY<+k0tn+UZZ$d#?dQ&zuxTS zcR8^S|9lw0GHCYpZk~Vi(T5*>mGZ#CgcPr=y`!`$7?PhQP z1!{^^@vRy>KK*uY`ozq0yMDJ_X*O=$e#R?5A9TAE@5_H3qL1gvm_z3?TMuT5p?&3* z8I0`!w18F~w{RtoPK~0=N`W?lK{q_}HIEfyAt8e@*E=jrIaL(cF(ad_h|!82X_xaj z_UBS!OL8;*c{w7DUYC|N)n;|4;w&LD z%vK5!GE7$`EVyYt5g>H9GWsEbLxAl5dI144ra-_$5Fe?Lf}^n7p?#YlB;k=OEb)Lu z$7dp7+K+waSCHq>vfWm1pp^DzvrUC{D0q$qc4hZ6oL%Ga zmXgr;hkBc$M})(8dSBwZ!vfc2|2M=lBP!&p&$c>#J?MV*#bzBb9!(s@bO!}Ki40-- zRrR%17?lBW9}Y3%xcjfM(a3ks161INq9CU>Vv4@>BJ)7`4TM)cb(6WJ_Mb%zRkKsy ze~J5}obR5+cSD!`=Mfngbnzkg%>$okG?LsF7ShEXTf$lQMdhk9Ly}(ax4XFh2;W&< zL|8>G5e?4TXCMr-^Trb~7vNOH=k?~5*eAWaxR(C4x3pL**MlJ(SSng3sQ#z+Jp#Z(uqJL znFHC6{aPVp_royQhWH2&{+mrUf9b`5QU>>0?ex5|O+e`P<4 z>`Q5!eFsJCnzbghl1_JzVi76&wgBe8E02Z~039_l7-loFX(DSEMj((Z&=YD|O&1Lb zi0L4mAO4q7(pf7^I?$(ro&17ha7QZraA-%3hKAjhY&y!d9U~A^F8C9Qirim_S{zP_ z;;8DNsvj9dsp|GLs$%Ihaw}f1Nb+IbjvAq4FEpDZ>=llH`!=8nlHZvwHW)%V(D|>% zgv5LrI?Hnu<5EU$oqZU>N~hU!H(Asg}2RzCt6q=B6f#bP>9I1tf6B0u`iqa1%G zjYMi4o{NfQu*^*yZ%N{?x*s*N$iMJxf^e^R1X6GVoDjimIuTe1=Rp4-`@f^;UrIxN z3VGvqYV(^7DrcL~`KY0O-bH64zH7B3puG#+1nEztBfWuW4wV0Ee;!5osWg-iYaJw; z$j$0;6Ord?;QfvoqUTs@HjYQuI0AY{AWbm)csgctq;eqjfAp`TNS(^ks;$l@w0vY? z$dB2I6&an68hYnlbT*E=RyzWsyTDDbJ%f)Mh~_}~AOGVh%AZW*_R$edZaG4Ov zM8bZnfPVBnNgHlBM~y&+*otf_$=HJtNF@XEgkDzC>BWtd4x;(V8&RT3Wu*vaqFiqw z;sN;|#bt@?sX!bxQYp3p*;Jy~er)9<5J)o632kJ^lGtZ(ki}2^gD6>?PLn12@By*D zEx+0!uj$pGQtu*cH^0q2xJwF^bbv>VVn*1TZ1TywDI*Y5-XSKWbtYZxq@%5a&i+O_ zN@vq)bcSg3P8T7tB!Y5Fo;M{?nZ1u13FTgPHo-X8I|6k$;Y~>4WI8FB$mT%&zxfMM z#J?jA@f#2;o!$I6ud)@3jz&>YoO6qTfy@!EYg?$l zIH;pW4MXimHfdyU#0Z3v4SYg2Yw6~-#BY5$hoh&1hW_q<9i^ev!(Mfi-VHWUqN!+n zw>p`1!#Qf?GsIS86Hmq-j6gXVkSAo5aqjI#N(a&W%-d0-Nxcu#>2CV%=I2=rn*44m zb&JL7UWi1J${kn`jS}y!%riw{7zv*8ZwgV(KXRs`dBvKm%sAuTn-NII4e+Q_%-{qs zazb^+PzMQddY-vmC~(5dY@qg0D9f3M;&O7Y#+S}1<93lbvCu(N-tR?es+^|G(Za$C zuP=g{eVr!qd*oK+z9SFyTu=&8Scxb0o{whtXMi&(D{o(eq6%+GGGX0hQNcOKbc-CB4^$acJ~tPzqf9G9?oVFA z$+JBpkWn7+6QbJ4BWzrV>!7f^?u}Ad4%I}$Zu?CH%nz%r*-(x$Q5D{jyyO(os_Y#Z zfsRt)P6#NMwq}0}2kDez!s%pw;gp|h)KQx)kiw%(Fhw>ZFRdi)!w6)O1ad+l8K;;L zRCEx>v=@~tskz2{RFKS15-L*|>oyibV33Bi^P_zYJ3o8TDd^AOO2gh>^9V?91Dc?E zMw&JD5gZ6U^P^D&PtDd%U|5t_ek|8Hn^oVVjOsa;pBLX9s~-XB9ndD2pOwW~p`8o; z|00V1vuVmtwO`*1aA6P!nx6}51+HzpEj_$Z2!%*tCc(QafM)Rh{Jjm%UuZj$iQ+ji zMJWan_hSU&NQ5~dk@<8}JBpMJLOJm#Q9?PHhfoCM+_tq+W#yE_zek-+ifl%HDoNUn z5r`xSi45cSE_YdLz1{nRKY87mZ1zv-M0`?%qCbQ8eE1^QV4)ym*m`tWU_cs zPf;2rj?EZ>Djd)z6p>-8>u=(qhPmI2Qp3qKQ6XU!jdN5QasPRx#I?&9PY7NnZ0loL8fS3B|zO4Glq1a5XQm z*;T^FTZ41gj(hBvm$J6$8Sm8b>&HC&*Y502&m6mU{FH}u7`)^0>o3-W9sCR{o%R>S z9)H;?TY7^>wAMSd@TnW&R%iFU7u(20kAz{ZPIup|Q2K)3-R!d)a9@rU6214r=e{2H zcXm469_p92{Pt$w-weY2!7`gj(#H(j{tm{Z>Z4sm<5v8TeOLZT2e<2WCp5gJUv{Xa z8Q=F+$M;QG=d{8@{kiEwhe6NdxfH!K-c)JI`xQ^M#NSh;)2H?C-DYpA)9v!AJ9NLU`{rauKqzA6KF)5vp)W*U8ZQzi>7Gf=KDe@Ftje#~{8rsO! zE4F|y8{?RGdHs4SX5{$xPk&oc_FQa)gWxa^{<#}3Hq<=xS68Vs(*{<|^H3J(2?wm@)omi(^ib5kV*}$aV%7sa>^=pKhj$xGN8&9~3Nm9 z1ijjpNHl%sVz(dgZcJ0Yb_e^%^DZ>J-d5mIjX!V854~+)nWaM{OO6KHvcZFAFP?w&!r2Ed{Nnj@Uc7bC!gng&d-k#O-o>-`K5$;c zf;FXAK@v<)5OYHfjIcIG|I=;m(Dex2R;0q!&0%8AA!CDFGJf{A+m*ohr1IJ#r)-Db7l3uq?@gxC<^T(b^(A&9bjD`u||58%=DO^hQuK&zpu%Am~mT9AE}}%^wmAk>KYz zJ0MO1tg%U(w>G|b0tjOg1ctAWCPA|$dbX!F#LUD#35acQX=}M+SK6JP*Xne3=76w0 zXwbN0j46;>Y_(^zYS(GQ<;3Ka30(*Z2%rhi4GD@0B;1aWg={;4V3261SUcaNx5$It z-6Jx9xP**oK|Ik7=UxXJ%3wf5gdtdxScX7Kq9c5x5a}sM;Lt~(F6}^qmiqV>7~#^+ zzwy6ZKikCZ{hYDlf9Rkml-$pEk>{H})96kMYr5VpD?d>4!zgoqunNO?nUG|@$lyZIi zEvG(yi?s0Eb2oJF+h)>rZ>Pr1SxIQ>+uY$O6mf9!OP2-nB8(wcCfE;{i0G}D8?|6M zYJYos4_zhe59fT~ce_4)t;D;OPK&$TNA-bufhGa}emf z`KxYpK9PyeYRw#>ziIEAdOHM4zbOn$1tY<00fMkQjO6_sOt1mngjwC z+lLw6U%^bBhXQF2iZx5)%C@R#Q1OzR510>UJ~04HRl#e^;FJ?)voohFai_ND+B>ff zC9Bys%xId3LK@QJ<=)uy&`lIZVoLa%jZHx0jQ9l1DG82@_NiNlA(RgV>3}L)f;YY$bPq<@k((g1sn;a{0eUY(M79y1(x{E=4UI%xe+cf!yu%rwMpEE zo#LH+447vxOGDx)JV#UaGTMl3&1ei5Or*ib<8z>Nn8y^wzpobS9 zSAD$L8~yzxriX-tv}O~d2q`0vbWgoBJ~cI3^o8zX52o9(UBOuP6Shf=%Ub=|WA-7F z@yw)QzA_D3VWRPM#R^PcmIiL@fOu$dh}gbq@Ueap6F0k^{tk>rb8mS!rvI2yamhNd}+Vm1$|qWqs&D0XyR$Ot{Cl-3Tz7h5(fsE{XPV z*v?K^{E*|oI|>J)?}tDGP5|M&I1x&UcXKr}jJQIp(0K6vN0#G=5M9)?a&qd!z*!HG za;BSrJPdv5nLGoJS-a8PoC8ixm*is@K=q*EJEsNt-!|x4tOa{ z0Qv<$wBc&hmgP0G7u>wMDOr`I#!`EVsse}PACr8-XsH&Z93|=rnleXR3(e%@RV(>G zHe%joIGY)YaBm$~=x9&^#GEgb`LgTRpa8Iqi7ZgQh5wZu5%L+zr=rhXKv^V*ScVqn?Y;l?&{((cBu@kjD$}qxXc_0c)4G}`Mt?3dC!ohO`iQLqP z7cI>&;0!d^gQSBC%f-G@H?9()d`1dke#)l2$nJl02Gr{sN;3y`7l1bq_=3mPOK9< z+8~e;cQ_FG9d!*`lcKX%A(i-Zb);h=zlq{=!bJ^t3Zy-Y0+^negPW6%gH!Frqp!kRXi37zG7U@FwC?iei>OOH3OxAI(X6V$~Tj{ZIOBUH@KCEp)m8v1k1!ds}831fn1eriQFgL9IyvK(3cS?pDA(x#Bd*&|<*NVe=uf5S?WZQc37$ zAUej=$;RTx58RRv+L;yQr6mOV=#WZ$1yk;EWk8yj1eb*>G2e%HhqEJddg5sWreRGH z5apJ{9|$XIk!ip}hPa23j4$><*@wZD$QQt^=`)DuGGbnmKC|#R3fo!5%fPxI?GzGQ z8j>LtWkqJwY>b@lt7lw(%E62>cj)XrZLotd!v5?h-Aw0hH7l19)`AYL_8_cC9iryf zwxA6Q-ZQQ3vGn%0j0KIdNP`o7VVd%4$)j> zRIQ|f_~?Wt8vf0&oACm?q<@-{+V4z1{B*hlWmE>L{b#gC}-W;(Ng7*)#Nc2-7n3d!e3-F^Y8YE=% zaK(Zx_MJfvNAuk1FaF5QWYblkxY%Ys%(!Nk(D0VA)uEQ9`RU+o2Rltzqq0z?;ft=& zMkF6&8>UQRaF!$s-0F~EeaEMe!=-y5_x1n3@4E3xs}hMqo3m1J2Bps-D~zth%Ugyx z`RA{(<^9_};XoI2IR=hM?a)AxBG{3D7#QCvwZ(S2Wb~}(_j{d66@?|+(zzmR3NFu7 zw3!O0l0jl5qFCG;GiLKMO*xw*$s+IjP~DBvuHNj6dRT0?r=4t94IDn_Gt9 zg;!(Z`6~`QcP!2sHO)W1%_QUeOzVSEgG^zWDc$qaiDUl5kxQ-9$6@7(85K*Z$VAw+ zGAfZ9pL{=rMu~mRqk6dJdNhgY2lm{=w3Uby{Rc}5*)%G+S`A1>J6^J6(EIOhIl4-5%(4;3>jc z-gF83V~_nSUddC=x^QOBdyxC3!+cPtY$EFku)d*zFq5d={907m_`i6)|qQldc>*I2)~xcMBa7o z_EKsHV=frrkg`_Y_ah1SY1Xp29O6iDD>A4zu}nq8g3a9-VRO#5w~WsXyEx7025$h# z__xZlQa7VhEJou|1en52at;bX;)bP|rci{L_JBEpFj7$J>A{dJ{{XzG_xkQG@Xf7YiVxu(5NQ7`sRi~BtdMx^9Z zoY9&bory;|BiACq6)8SYx<5$@<@s+)`W!@m!A?I|i2viuZp2TId19ZQQhD{GsBgq@ zxfD}tBv%vZR=8TB@9f%dZy81xSb>Sk4&}jK5HiQM!||#)=+renK6@ znR2z&sa?6VBwT{j2mN^$Tsf9&P`(ko&ol3fxb7$Y+>EX*wGG_YR5RUZDzIp)62>vLu3&Y0t@lqH)}2W@7q3ojHv}&C(tHy ze02sTat%bBN3tCXkX~!2+q?=_>LxBU^5`CRFvk%w#q z;2Y>qlnJ0t%v(wJG=&k0NqD%_p4f&DA`W=6Lk)FwB4ZA~T(&d#3LZ>~`pq3y=ITZYlOXRlFt@N*79WvsqD^-B2<0;rdonZ-SEF0@Ig77Hf7kav;&KwYmS=D%rgX%Du$y$k#Hcyj4;P7R z^t|mke>-PiikL(Jj;)T7lBW3t*dOknii>Hf6F~PV-fl`e5B+Y}->V=tgqw`h{I|ck zIql1QvopBFIt%_u;~Ns4$KS~?5r#Bg^9ja3S&j=N3F4V*nu@1F;b^jaLAZ#=CLTP2 ztuu31pp(DtZJRx|smB?%$v%H!gV%Y60lsH}j{~Qz=2@I%W=nPnuPwUuL_*#(-r0wKVVbY{O0dUo0gDiLIVc)gk?Ij?z&|cQ zZL1W?ksel@0kvo1hTuoC`pASnDxt^1thYGpEwRa~;CK1(*08aePr2DxwqC-n`S3fG ziit&ZEW61qV_`+tq8ZrWcaJ6OSoZ1^2a|Voi3+602X{s2`jepFhPbfGuB!rV*ul9@ zxH~oHxW*dQQVvT;Igy~FtfxAFh{fYklhd`EmlTc$fuWt zT&jRGPMLNt{GB3fAP&40;4qyhY9Lib4hX8`kQ$^^HEdUNJNt^y zu}l2IlSaVD_zmNm4h57iN^Efs5B-7Iyz2=U3)2ryn4YAiF|v%%wWIiHkh|S5oQ)^a z3FoD5W%4*N{5*}8#M+AVH+b7H+o1W|;7bnn=H3&fYew`-bCX$meR3nmZ`u=wk(cK! zz4Gwl{5JkOw`fcch2x(3YJgx-soUAuWW@O;w;cwfxY)|TD4YnOqDhd1RYhSKm^JLS zXzX%plgXQ8pqSu!$bwD$4)M$0=lVFbfsAGOvzbv7P&p)I>SpDY+5t|!DYZ89xu6gI z%@S^Tdja<(0M$ua^87@|#*OUr{dR>XU!G^AR4Ga=Vhk_8f z>LpNQt4C9elpb_w-r!b~_@1pZMyGQS+Txkp-6WA75{WFLs1Ul9ND)SWe`3>N2!fZ( zOeY92U=lqP1YwZFkXxduVbFK*+Qj{d(}HMIKzcPAyJjo!c6Qt5IKF%AG%TL zjKXTyT|%NeWb1<4B92Yk3>loTE%&q@!ywivHpeW)qFE;4RWS$#T8*|n26iQ7F-hAi zg=ENN8SJvV7K+uekc3QR1L84;%hM@JAh!++KmHvz7Je)f3wa2JNnA{2q-xa493ITt zc$nU27)<1;Q`0e#jhcjrg#Z|MIO+yzOnm>tryPuq2t9qfc&svO&&)gM8*tB{)}rq2pCJn#zY zEh!rT&$o}IvakutFdLaCyz@wZO7-dq7T6qz1^qx+!SD$1^rhWkr-j0IOzDU(M=^Ji z=N2qpPL@^l+Qr2rF>NR$I8?9q{T5v_f*H+{_}kN!zB6+Y8m+mRE!7zmjF0nWgKIdy z4;@^QTEy;Ouu+7^+ZvLJ2ri|-*=qhQID1a;(PFMmqcO0?2rGi*_qzw6Xw6~CVfwf}wMN(AU zJ%huIQ55gN`+&;qmdFf7d2Y@izbcvbQ+5|N)HNeOmN+$Y0q|`ApEb6ILuPdqG0&)Y@SFm&*&l*Wy<&v%I!{_LgR_=I%cBsOaBm9Z0T;qNb|&%x+EiGgHuzas+c^A zK9XQk%-zPg4S(W_(RpT&?p%&<<{&$`A-ev9;8>6TuA5_hB9*<;a^fnIQwj*qwW38! zfzBT&4mP$eGdS68|0qF+%DMZ~4mETU9DXtp@L26;jkibIN z7)~q!_*hRS@?#SbQx~k0B7&(985rAiML~#l;&u%mc@FpE1C$BSOV`JS0(eA$V{J2) zm8S>8ddd!hu0Q#{o37KvERm+*IMP~K&d+H@7LLDCMHvbq?gkatZQ;|Et9B1$x; zlR3H>2ri@ z=YcIC_AsfU4gn{#i>WwZq6O;esIHh!q-U(U4sWacMR}_1$S$fAM?@ZZ5LOUBN=gsK zq`@i1Yvd@85cMUCRctquH2PFL_Q6%ihL43^uyW8q_~>GzN(`|iNx(k8x6xlZcpSPX~!Pfy$lXge6^Z^41O(>KQad znwpW(!$66g>oM@4>A(Y~WYDD4$B*b3^zO)prEKmF&m8!%0WD7-QpK2q-Dn657{tk( zp+JUyk=@I{ggnf_UWi7D_iy{U11n7JLhg`4kfWtsF#LpsG!$PYi?K2i!x0SuA{kFq zRYUm}5u?Jr!9}<@n=-YM@#z-&R7Z?CvcP{jx4=IL^KSbqZbD2?w#w0r2_cDP+|Dyn z$2!^!Lxx;|j&Wix{*$!)%uWUo7G9~QL1!ePW8DS?Cdg+8F&s7V-1&7krs$}Dry~G? zJAS>+vEy|^IP>R2V8q)(Y3uizt#FK~Z!qPhzy-}1f{5oMBZz>L3qg#wxe-M4(FpSXhfg{% zL^PY;4*am+MJ52a<(u1-I;p~A``IwiLcL)}bR_hm z_gG1LC34|jATZaO!sC4m7DQ%2#Fe>3K0%5tfMi*Q_@ORhIudH$ z>09j!u3#Hp#Vvami_d>y(Ov)tns@p}>w=T7`+N4(6FxV-Hr}{^Ggby1jepwRAh==! z&$ll$C-zzAy*2C#Zl&ntFvO~G+pTSW?0RPxm+|7$GZdJQB89rf4%H!w*hUXrPtb`9 zXjJ--roxA}_re4G2$|6RhPGGcH(^gLkmpq~eF8<{E!Kmf-~%oR7z|^8$KNRgx7Fzn zMQ!SxD+UU|Y2te^`$N7M;)B{Ig#?uFJ(C+7pEKVY z^w)gvt)iu3Sg!9_*P zhyI%}yaw>3)1syP1DcW=Cf9ZC8iN@${C=xfN!ly{PFv&gux9tE`|CDm!;;^$pYWA% z`lhqUIhkrlPURpN;mw3R0O^5B;SO?gGoy{ujS+mMUkyPy-?mtx29-cNY0VAl$-5Sl zeq0_lJ)dde6ylCG+oOaOoIrhYt5t)pbi#rfL085L@18Tz|7FlD3}@qeSB4shAttlv zwB#qt4S)@Rm3FX+YhPD`0!vVk4Hr|^O>83?M53`V3nR+Vc&g@h5QzT5KXyv|uWK5l z8{=D@&J|I8^9A)g6OsP_n|y=HF{vY69Z)JVRx!W{Xq=;$#%9-q4aEKMPbj}HDsN|Oj= zq(79%%}}3YL%bEsx5qAzFqKwzp)e^}?YJoj&ppb#pkBeWQIInZ$2y;-bj{7)-9iEo zMVQ6s8EiZOIqC`0Q83Q?>OmK(FA^BAKiRfX)ckY_acw2&v|sRg-R8E@4?uA8Ci)=* zcF^AJZOwT1Xwn{SDWG2kUdgen74i4p9^szov*?ekfr>o@2~nG0D#y5^%J^>Gc-HRou2T1~oUgP}icfmG&)O}gLt z7tSwh;6Jn=igy&(00imU4-0(VI~cb&^R)?8m`B(pW^2vUPpiX;(>K2HFDdf17lR5U z{GK!S0DwjF2Xkn~bUv{YP;f~Z4Z72^M%pcLaQ#zv4pPI?LT;;mt8V4R;9v3UjyFf{ zQ>HIOf6w=C`;h*i@fFJo189TqC_bsRCy^*mGmVIh^h9Uq_8cATzN{)(+f0+2JW8YG zZ-#UCfAWC`DvzGO|Izc0eS+H#fNoeI_@%GRI)-FA1n-if#~+9y_lLjYv~{X3ZZZ6EQV#~F1NBd$rpuMxnRj_Z|S?wsCqG{a@GtZpaNI&$Srsn2I#++;cW zLR7JX(~P3)QyPKCvlAaWTVlio-wRLE$5UM+JsJ4}(F_r8IB>F3Ri8Wm*hS`-?1z-- z2=taKQ8>~JSztu=ai*}cHL|N~JYhHu8%b79qf(7JaY@x~%+vI+;4C<;Yg-}#8}rOs zgSw!o9N-v~6eA>L<8D`~qhj?o5~dqTv9WhL2RU&So_$=O-m!2jo@Pp&=+U>0tj3&2 zWby93GCCL=Ku+rPO-NXV&g!jZ$!5;cR|L@8m`q3IghTWniz&dhUaTsL@Zv;0L*=q^mt4JXb~(1`Ib_{x z8;{uu1NGcN#daSl{;3Bt^yuz$>^yNA#b{=|1>undFn0JYz07=Y69kRjk$NUImuDtG zTRs)5wc9R|O~8R!S~YgRj{PNgKighWVXXi zt^;%OyN|497QN6wax}S*R9nh~i_0*=4^a1Zo4qZ1Z+$E@U=+>wioS@Pes=7Yo)Y_i5LMuHr zu^ig8i&QjwC#W?WO`Mp?p@eOOjiFg!KfGN?KpLgd>0@W{WyOxN!d>R>LTnxA?qNBq z-k=;;toM?!CCJQ^OKm+6Yy1EG*G@A>91n9gDpkuZADO~Y9i>l)qr%|+rsR7S`|Ssa zrRG?x=B$HjAT?o*yZ42P9H~k%K!6nM#@;e*;&2GLkmBiqE~V|T7wi!ZLJa@AKXM~b zfoXBEJisj}9tNdVVSD-?B%CU+d;__@uaGNiFDxvBRZw4=A~j=>KcI(Uc$6aY4Jfq#C&VkIQae#>f#0| zTQE&YTXB<2@IZubBLNno3RDed`oYpPiol9lQSFMScm#u#D02rB>}FF4>@H+Ej{Lae z5!i?P*If@6Nb9p+wU4Nt5N$&IWQgA0+x7Pt>f?kE9;9ZqiBQ44IqwdB2^3h$bXCOB z_}x7!U>9+S@`|hULOMg0Cc^E&dc~)DSP(gvAQxBRDgkl%>?3jf~RZ2_% z39SGP)YI^d+n{3p!j!hbjKjBpFTs__JLXTYKa{p5zAgfSc$G#1pNy;S+MByv~bX{W9DDwJX1jz!UG66;1x~ocC!12s?No zG(b{!I0H}dOo4T5D|sXs24GP91Qv9gh+iS}peJ&8H6P}P!P}7T*?XM^ye45EvE`d+ zj!#W}FiiIpg%-C+-Ha|%LE6Rb6|Wkg26_-eEs`T{;Q}}`b)4Z*_^&_5cbGQzu^{la zdcB?S^!)rLbozc3381&e4O$?tcV}^MK==a{AP2CB$)DosyM9*dBRl|bD^>cT-1A$-u#1v zlEpVeW9Iw+;b#?U=G;kPcJN~_zRxHf$hQ-ljRQL?yo%I#cDs!5&gx`Y#@Ft^{jzpP zq0PSQ3HFLY3{SUC7mHcF%8YD zsmwrzcB~Hc*x)D{Qg4wyy$3~OE7`g*ek3$livC8&UUZ|KCpIW)`%N;BkF*{;>S>G<4O*yRsXhw(_~PtWB-J%0LV7ilf>S+d z3*T5Tn#4nM_s%i%cXtb`!68*GfGt5I(9uRv!}V8KtTYw>YNuKEg8C-R8%iy~j01iq zfY~vJtUW6=2JDT~g$$0>we^KKEWSEsAdsO(-%?VWUFRBh1hXf!OrWXIe^6tb9~@?e z(%q@u3^u;{xOzkw1*a0(8iW|sg8l>RphvmzEcMe^CWm=IB}PG@TulB6lSsNNo6y-_iH=F&WB_%*L{&Q~$+k_yP!ooXJn(=Mj9^h%+bQw}f{}D~$Y5sYQoin^ zQAfjsg-eXEf(xkZvJ-c27-TN1se`1E9f21)Ld^nedbF#6Ll(CE(QT|?{9d%P_s?v{ zzb!J2bO29}I)|EZ_!QG}qlp{9VcKbdg`3?OPMQ~a2_F3?u(BOSmy9dJDu9zWG$n!Y zgqA6X0>wzV5`jqfcl5OL#t6qsEpYjy81g~r@;~j4=X4sZoJ62GvQxyUiDmeov$(G2R37RL-qTZJJs;bV$Qjlj1q$@a*tG3${zGmbjN6jS1Yoj4$A zW+r2oY>RO-UJsMl9xH|^q6@fevvVK-lEK?GCa4hwJh|eSJCoebw^Lp%^Y}q~J5Bwf z(^U$Dt)NV&I!tKmTw1GV!L)@dQFf<<-O!+%+7<39Mv1p5Wgx!@gwLf#fVk8N$2{ z3FD3$gCdC3DU4Z{L`f*lY((VAtMVPaN7E72QsW6=13R?fU_tj2eX(~XN2;T&8N6r9Jjv}5m zQA4>A?LiI#HU8ckPSnUT8=*WV%=H6-Ejd=H@y5KNmayn#4B}}xI7X0tC2&KX(Z@1l z2-G7PmQaetj!8$lCINklgeF5hR(clLH^l@ue?)$&3b}vroM+SEsL2v@Fl(9rCVc@v zv+?$jGEJO&>d&2s`b|bt>>P|vR8(XW$Ie%*XCDZhOj?je#DSd#Of4D7e|$t4Zz>mM z8vC*~Msu$?h&b@hz+5o%F_ z(M(GkNi!q$v>=Gy=Jl(pS5;3_^8fF)#Uu@MqNX!L`mK^h6k zfWdej-rz5w%EShS*fn0Wv4+^SabPd|opbW%WZuks@2l=RRi&UIM)mH^n|U(xJ15UM zdGe&=ji8A(WY>57b`lZ?wZsTGK9Q#MRG_53j|wl3gNtS9N%uGh9ISkI!=ZQ%z9_ij zYehjTdqm&;hsin4=vOkaKciKyQ!$;H?x;Du;^t6yPHf(chN2644mYvTWRFy-BkBOH z1C6e*4SxOy-=3W7I#OiPKb|D>RLp)|2Neun?_iMZuEhf*!Z$^F=Ei#s@CqZzGe;03&TOE{$x(sdXKPBG z4jeY`wF2aCI6&5nK}ziG(`j-_tUO%nA)Vj_K3(pA%V~4-o3=B<68yxJk-$Lv-uyD} zlvmiapq?NKunAII5qdwkTMNG$rZDiUDRt`LSJNL4zr!!__gB_@G@E3^;wU@Y)(8(b zN-89R>^wAL26pN4&aJCY0wVb0Kj$Kcl=iZm(8_NX7Uh5Kr{s?(!<~+vcYUCPeq=U|>MPIC;)(j$!-;$?{2F#5&|g``At_0q@lQh44>G^7Mt$X)-5RXp$UdTZCY`s8;jFbib7C0hUgBpWKt@9dd2{|r)f~Na4T(sttIEn% z8V&Og&e?Etm7X`L2YZt~pNFZ8(t4C@)8JM+)sQ2OeEQyRf8vq|eqh!vBPSY6u#}u} zf}^=tr{rjTiBI9=r zX5++gqNq>t_A0CgQBLr(yt=V$NiD}ss|h6Y?NWn4(U=z7A1fW2VlV#AjWvrOhFeCS zD|mM9uqYD00<%!4Dmv|sd7NoAF${=Nv5_rSA(i-4FLb#$)J_nKC>s717Bzh6szsem z7CoY+s#-ICu3Ene8QLp6ptGC}s|p@y!?*FyaniU{7ci{s4v{m|LJT3&2;&xm@?)u2 zr^1S?>7KV7Rc7{7XSKCR$-G4#LipI2RGZDHJD>VI=`Evrn)n)mTicygn`)*F+`Q{n z5;yuL`AV7uL7%BCb1I>8c{9gRvX-SMl|kA9Z|P)%}pI6WcB!pW}j?9T$j!U}C-}B6w(W zX1YSbDH#f1Hk_;ik%K8~LXgpX;%j%}b8b+^ zf$k$VrI3YV6&KGL&JnBM#uZsgd{XS-Yi>}!sL;uNSmn$u4`}^nTPjvbuIeKTeJSc? z8*KXC52jb(g>YBO%Tl`|MJhSRZK++Uic+V8S)2D-@#|eT9KVvBtr&!^(|?0YTg3UV z-`PPnCqwmF%AP#y(IR2aRO&AsqktyjSvH!S+m@a75^aYwU-11}wlbyf>{&1-0H>Jh zXt4G_h%l!DD7TC9bMbuqZswa&b(u(#ZE^P#>fxcQLn1%;aQ^unYih!nL4l5 z8$x3+Y6>)M$dV6!X;PM`Xc9T;L5E{J5^Wy;jD!&!hvKo2WQ*gbXBMc$Cu+vO*eJu~FjrM#}>%MBT^qF_~}IPH_Ihj|Wk zu_#a{cW?A3Bi|*L9mP{n2(Lq-pno%c>1BC&F!|nCy%4y?(kLTLtC9}*?S9GM6-r0R z5md3_Wb+A?iEcw8eB_@dC4$ai86C;+(`9U0Q7=f9!uH1y(Hq~!7yOjU%^)e3cyOyT zIvaTBu3DI}3V$ACmaZ$g@uea+f+27`2)IceO+qvDTJj~*s%7@hSxF|1AGsE`X*k#hVbP-#a_DK(HIRC-JkPVKI}>L+ zvGgqsk#>u-WhnhB%4}eg{Pk{3kZ+Oo!q^BzSd(qhNLhU-kkJM;#@=b$MNT}q-8OaG zq`GpDrlI+F?jk!sdlq{=5tOh=P5gpO{qD?BhOW`-5I=qySzUM*C=Ch0W&Wy4Kk0LE zjLS(VDFY=XKtR%#Wd2FX)`vD8o^noV+% zl}^V3%#<@ihhS`oG+qn%td^0xv+VbGGoxsU^1&D_I;s*(C^kJA1io_o9hXOnbtJc! zQjrzi<=gX0y{0syOsY|uq~|s{2!5#!ic%e=_jDs~yb?z9=FA#R@B9$?%`JKFzc?YC zZY1KN%%_GZ)-XbHrDO5nxeBebh51~~4MwjtO3pZPGZTF6=ftXq!RscK8`7~ZOp#F& z%l@7@@c|GLS6JDKJRSqd`aZ!8(L+Rn$pAo$+riD#SSI`+KDA^%uXnDW#lXM=>#{(lheMOm3NRqxntX!^rP6Jj_$d=wiVeLgdbk z@?Rk04j_V-aZWOX?Qn^1@bilNM|vfTykTK!SCB<9L|n4crCfR=a+VR}dw&<#12fdP zsJ!?jiuHo(Rt|sdTflQ7@URv{k}s5^(s`5$~UI7R8h@mJ#+urp$qcy}%)nNlW7V7E@e@VT$Ow!D zuSHSLyy28XyTnFjFP2_P$!`TidN@MDGRItIF!V|8NV-Z{lye>&Kr%FLstIO&)IrWU zh4<&JI4^M2aM{CBd&k?`M9eZ_hD zZ_aPm@KfclQ~N1Z<~9(>AhcBVgI4`*Up{eGUx1_&(}yuA(G}otkWLD7Q{AhHe4%J z%HNRx0(y+7AgH{W4CVEbL(4_yQS4^mzB^Q79Ab9(X_A6_skxu-T01lBi6XWlEFdW4 zRu8jMCab09u`hbXkN`5T4+l5kz;f#qFFk4_W6~cM14vW$uh`_JOu9AX=H@9?X_>ya zcII#gpqSWwN^^>AwD>P_T9Sg880MwUTv+h~tE&U#`8J;wxP1tDX|K!=cHjv`BHt|v zTomV`>xi$x?36H;+}PMLCyg{(5DCjW!=+2crDVhOZ?2rBE!HWfqEFE)u^m{9+l_4M}Q)f zc;;zTRxUp*6}FG1w2&OZKH<~8?$*=*!Ync9x5>*$>oI}B4i3JueOiRO z8e65q^~H{DbWuiT0X7Y{%x-@L64G!vUwSuGR2^uXg34dU%OR-y>9ql6-Yt6L(RaL8 zw&Z?TsanaEFQsZJC5d!e4|}Cl@ph*ffEG47FaFiv$?8ZMDnuoc%rJ(q8C0N!+!m&& zKsCwint$yTp-eZt-gEFQI7N12^k~lrH@lPQdEN)V>uP<_`)qKQC>jIF)yWuACV|6S z3Wr98?eRSiG`z$_ZD8mtel>-m&()D4K#H=>oCZYIb<9KS@XWV3Y$d1TXdt85E{YI^ zeB*Txt{f{60TYTSr{BAfs@8J_p%)avZ!72J10%HPVZ}FA#+p{lNBop&2?D^;hK0CY zBUz@;$;w5_oBW0KL;gUh49DJ>xYq>^oZ;l*v?)dqhTEWy1=>hLaq)#OOhQ~a7>LK= z%tv^Vfv~{)BcJ*Bq)#-BXChmK8vXj0@|-CvicE$+F{~iuYJD#JE6= zocIieHYGz{wM`o1h{QS|-8y&?uL>N|9B^+yOdAsQ?p_jZ%?J|UeJW4!iAG?vK6)%3 zzQ8Bf$#?m7Pzj^^RkXw2>90>mtDTME^#KL@?(9yBvz(uV!u*`H@)$9n@u}cI za)XJ;B6Y}B3_-?n>N&;z?eC}F+$38Zl9ViMpEMiV>LQ+7JJd)|YL(uQh7F>Z5RpN< zxVVXwtlRFKP>j8QcbeFGTjY`nQ-Hj%mJ}|GH9)NZCHcS5=~WKVS!8Q*gKaA|!+kdM zr7L!9!>i4+hU06Az5^p{tI{%7R@?k&+i%V;&~U$5P7@2Z$s=W7n~^WhT1!|aH!~4} znX`bsIh)+*E8A9sb^VqymqNg{A%PeE_oM_??si)FIPFA_t^nE{O!h?Zezg2z27!BD zwS5#em~$4-T#2`qDm&<JG%ffRPlFY(qcm;K&){qNR+ zx<@)#5yBSQK+RHe$Ki7gDH8lVS3&bB0#d_1dq^Fg*>qZE#So;yMGi5Z-q>wLskR79 z)^Wv9#4;&`mAj9CMYXICx3CJr_e*Xlv9IL6-B6%mb+gE%Wm4+HL;2$-oJb@nt!QvH z8T?X9x&ic@{g%uhmIUQig{~T3;S_vgNeMq0t)ZvXOg-1MVl}<=Wl14gwfV+slbL?u zhtlSoE;0i{)a;;9tvPwx@KY~EoAywl{|o+rCMotd5>>Nqz7e+Uy4pj+p?LEucxU+n zXbQd~?{nw@cAw!@^c9)BF!NjqrN~m_?l}>2<-V&+xV^r>Rv^IH4c^gBZ-ddsbQAaL zy|QzkV4l_&sjzUDf7#PU#?@|lH}=dUkO!fdOT!T^Dc>1W%GYi=7M&!5Id-5=;ezh+ z!Ps~|VnKM=up)xVSr6zk$>Bj?c3>wD`%+;vJl%7`g3Dr*7i@@=B~T56Wq6Qjb@OPT zY>94kJlK*feO6P2N}inIF}z3I+Y}2l^@!uCUCAIxdHbl-ci7-t)r+ z)ZA6M$P_&;pr#Ey^WtYy3#&x7e5EHnT1|TXH>5Rfz=vTj6xkHUx%l7F2Q#d@a#MRE z=!K&_^mEfjZWTUKMQTkx%E0IadK>)c2ZRsvso#cpzgQdf(Fh55y{8q+5ENVEJ}wgO zBf8T^wsdL5Qd%6Z%1zfbUhN)nb2wQ0M$Bjjdh@(_8)r(bG15( zy6!JpKCTrsxqvjLr;$!^`=N8F35C^N5%9QNTu5(^1 zliaMhKVDHU^TN$~G3??|N5$ z@m06ymixeiCq^y8U}KW`?P*+B>-(%$(YtM?6L0#H4mrrMF#?=7$OBEmB8KhER#AbgVp{ne&M8SpQQfv z;dr;8!^J4o=c~~vm~eMwO@OUEuG1_8_`r#_nEH&85EYA;cwJ+<@0og&h5eF&L7*T& z9v!j}oCge{t$fJQj-VaS)JQ@=29bma-ZF6P9F) ziN>j5yqTEI^)q=0N}VaH<+itJUFDeB>HB{@%}y|>vDRgjnm|<&op^$Y-rx;&xhS{OE@DmP-^|8VO{lb#jiZ4KD?_zYl0hvEm5D4a zL#vP5N3v1&re0!0T(uGq%Lh7fLp&=_ZppT;4NBlrYRek!6=Y5ZJ6nCZjIGg}f^@C< zSSynUjhew!p!e`8b8emS&J>{ug?nqpYCJMWOn0$AfC4=^D~^%VCv7sN>^=y!=0;z> z3#+4T5Soe7up}EVQr(woy)tH6#LT1{w2l-74@IPgh(TPLxUyYuS0+;v10ypw>`dUJ zf@P0_Fqfu*28XX_E>nSHNokZO`^`s0lFou?VXJbGQ1|Gc#eP*6K?PhhyMrdZoG%yJ zhYdlejR>1d6n@*CdyoNZ0MrpY77!mKJ=SoTd$>M?IYFU1*D{1%<19WTz@QmivlL#F z15gxr8~f%a&}#=1h%p?Vx@Kd!cnBJe0mT;AbWP54aS-x)AF=2hG<@g#N)61`Pc0Cv z2$7!4e<4LUq04x*wb$9?tOVBF>A>ilz~CES$GqT}m^o%PhS;Bw={M?JV+Oc}0EFU+ z;SL2N@KCunsR<}n3IfSbNMzEHjNX~P8jv0prb&S)KB?0C)U zj6tc-JDoA;o!1!;eh`wJ4ge z%bJWGVJA!koy3f>NmD9%8X-EHzuLp}@UHJ~fKxY$x3dLe)itbP*Isq;H4i^}&8=V* z7oR(^TUN(%EQtcq?3B%oQ;vGRdmQgh5Al*v(3 zvQR?POVZN>r;$M?R!5!aA{H4($WOx^K(#tiM!DJ`Lk(*OYIdrfC(-oyvot{tnOc$Z zBPk!GdgekKR5FiX0@RU9J%sA99)dQO*7yA5^wL_96r&suQHng&MP`s#IO_}_kdAa< zOA`+$v2Agls?7yGH2qe^IW+8}5=dY2VT$nbVp?Jwh%6t@Kw(%A7d8~F#8NPDQyy;< z&)|c&*eH=ChSpzzPcw0PL;`H=@av?v5p|#gPYmP$PP`W%bD30$?yz!CP8ssp#4!G}<#SFmYsdn2{p7~+lsIcLrpIAl`^n?b8cue;QFj7)?Z$Z&xJ>;v{v^xb9(Sq_M1 zMqWr55aiaB8aa0`w)qE$fg8~4DRQ&IyrYdLHc&{CI&bgl?gTa+F5d*F@pP)W)7vcR zo@eGVS=dg``Fqg>{#~Z*mv%5ZSWw0*NankTcxdFk9L@7~STXJF4W>(-hu5*I#xG|b%IZQyFr4H^nFBJ49qy~AxYrCWPTod;kG z!y5;yh_>lyz@*v;^)w&krgL>-6lq-P+qn|x=eSksurtgjM%g3s@X;u)&k%>ckKjOq z(M?qlaytc%NYcDQ+;ejXTAe^8M7n6&S(LRJ<7@Wdh&4J(OH0xV_n6a?@N;?bP2~88 zw*ZYW=b;-MLSx3jPZSEQNH_g^3|Bek0uCpPEx)kGi|G&>g{RLEQFCQmMQN~Q z`@6y#m|*q~&Txb3v-h&)hq0DHXH#>LD zTFK%-%N3;Dg18I?gpiqMQF9Rp^d4T<&fnX42ulpDAxPVdgi^e`u0w*-0^y?=mXMD) zmS*$t+U?>5@h0ujt_&c=2t+%BHK`i)BaQN^h~MkjEaL37^!e`d6u-v$9ZANS zK{XA5@Fe0>sh9GxktRoj^&g300uhpkz4@`a*qb1}BWEe7N>XdAvVxseK3f!mGoIr^ z2xgO3Ny3wBUjNFEr_5_Pe;^iX6!E|lXYLmWPWNFWA(-5-%nU|0GCWio*{m4ntn9`g zD>J)kKb4(*wgA6J9mZB1!U?^deH>=CBj-S3>wlZv1H%!#1V9=mV^|@*C$MlDn=yin3O(U3>=+(oJ3UZDpI?B-CkaRCir?Ad8jUuEq>i-cdV-`NbMCtovlbOlGiWux2#Y)BnOqY1c?0oAC}> zDKIFE+E;a}fHdm#&8|P>l;jZ&Xkh2gZ;y%5qIY)6MvL~u0P8JW-T=vW?ZL+$dF0{C z;ihIdMUkV2a9b?ByS@=G;R^$E3>Fe`A1#M))jRC=ef za#CKp@DRWeO{Lk)B8P5eVR=(Y9h*>2BQ0!Ia;T7_POcI4NB=x)M5*3Tf6e_dtHpH* zsdy%QID?h6Tw^7{3pL>jWBOa?O#+9Sl)SfBqqnEBT~_wfnJ)v#CBP>f0dqUH%_S)| z6g!(p`pNJ?-S)Q>p&paaf;Q$s?9 z-JS@^w1EggPGnN_FpnU{Q1w*jE!e*5QfQ#6#yLuYufzdk8J*71CE2@;kf2w;U@3*x zBqBpX_{nOX#=KcgRgUZ6D7U4_xRzQkcv_r4omndQ!J3-si~KP@k^UYit?9{e_a(lrLMQzqJq%Ie$oL7c7@2O4QS6h+_6Qfb?dCT0zsyk^I`KrxN&)WPg zC+w0cj*~n8N;+Mk_Ax3nsx&{ssGmr`{Jdb<`Y}-4d*Ar>% zPf89tzWs8J7>q8-HMd{lPXl_#?N6EgBLjHU49-BsjsfHeJ|lLMy=&y)p6cJUi%vHE=ZOhCY8He2QTr!3G!s7T5ch>^3{L+i_(Ceg)S2s{=(W0e12ejmZ9-rKYYQD zI<(gg)a}C_rVFWswk5C#>6n^9Vx@3-PK+2FJ~H|x*+Hzv@-1j7L~>Y`yoi|58&UNK zqDb%LfAfz}3@wF9@*;%`2Zrl=hS@`5ns0ci^G2MMNBo+6AVDk?F~>PQ=-3y9;K^yj zd2X357os(Y(z0SnP4-ipgfy-ZHHhJ2i4;ASucDf>17)Txs)Nl2-8?OfBJoIX4rbIA z;}sQMkzz}xG-j3ZGFmM8*JDAzqD7|-;aU<`U|{Ls*Z`O4`I^R$GP)# z^$>QqHe5v@La|Ku&o~sqTTCutFva!`VpWNaaP3{^2^`bi=#cixLV%@ax;kKw3m0;2 zq;CiMLi!7@gH$OWm~5|ch>>vgJ{!HmgxX}iO1A<-O0GwhyQM@dfTlLIjp?5zd7z#c zYuP3#J%wyh-($rfU;KTJLF{_Y*MPaHy2G5pYay+29^$}0{H<70(m)Txpi%NAxq`8H zx9gX6q>==X<%2w{UHh6e`m(~pMswt_CAwu`LeY;N$f7UYn<}Dxwq`MwV)2rlswygz zsH;Semv-T++tL2w@dYFIHjxeu>wZYJe*xj+1tn`lfE%XTi`&2(5Whq0zC`6CN5%JCr9QEh4!c4%Jm<*3DN~Y0!e7ddLT*HsZkX5EHtDD`wq&>(7P{iz0UsrT$hfSd!#_n@ir3lZ(^A) z{uh}%7Um@2pJA6|PdMyHU^alC&Ir*Dkt+le*CIyHTM+EOV+PxS)6jWRoD%Nvw{L6- z`Jl`w9#LWf*mAB}fi@eGWZU^mt@!3Dvc2qdxi;mY;slKku9!Pa)dig%j*!U1cesoB zu*-<7GPuu!Kj(X-eGZ{?L0q>XTk%<4>TTKG&L(cbHq@-|`-QZcrS8(9wFkB~l3O93 zk;cpTEWs9{Ydu#{;xsB;&HC=Ou7f|r#CzvtW~^>o^Rng%K$^A@G7TSt#juodRc0t` z1K9uL-%0~}M$(MK@-(+y^5d2vhTZd05t0mLgkt_mJ z>m5~P)5@wqM{d;H-*?Ia6JVFKvThK(mYb%0ZW{X;rlYYQ%xkPtKD_1%y;f^6{zX88 zYjeLdM~cTB4PCHWyB$1R)at-$mG-Z!rjoH4BW2cpXL{_^AyQ9ftAT1F`q5=yOM-MN zht~XNBR$anRh^tkzm-~N0xnXBwP1-{=`(0+ydi|0=N=0c+Oprf&h zpVkAZRzC-3>@lXHxKb!f5BkE{2KTq=+c86jNE?glJ2K%Wa*m46ei0EyO{7E)Hzv4T zHdYvazPiw9Tt^#^fL}om{v1H_YGZ!TN=v5&l5Ax=!G&#Y@FMSXdy{o}y$_*Nt2^df z&#RBKkkQ!Le1ArD%oErK(BJiU(%R$f)ENbGKG2c!ojHxzpM6j~6CA$aj~o{?9HQG| z2g?Xp&hN%H&t)9z=LDbAA(Fk6xre;fbgtq8LLDU(QNDZCaN|vM^)Gv`*(P?vt^>sn z4w4OeH%FoD!_~RYPJc2Ta;{h7T8`>Nx)zgn1D@vsNo6L67|wG7BEirdYwXO^$@TigSm2V$ZJz^PYd56zs|`hn)eX(TezfCVV)9ke=n3MA%4f zm;Lr?^xN&(E-T@D=69WN4vCY*_k=7Kqj2Dp@kbe~pd=&b9pZ7O$e)D64ui=MG3&5O zAOhLvZN(^W4$)U8DX8_wbEPgQ!{?FU=VcQL1k%Qa%}D~;VVz^7WZK7^j*g>US19=t zZvZV7@P2Ri%@00QGk@{c&v7L^O@mJy0CN2xQ#ImZX0ZYWbd zTroB!0-W;nsluVeAK8|Cdo+ONl%39E(#2M%F)*|!kiSLeOh*}h#;ae6YTHn?e&!F7 z9I4NuiMin8Hn2$uOPrF!3wwSlUtk7SeK~hMpRQ5O#(A^G1KK$@J$h}PMVpO*=huT< zj$QL3(nSzU4`DA;20L&G%hY6Nv78gey{dlq{K$K=z}3f)tKS5i_JpT01^vq|P8iOVe^YqEuoo+4Gj=uu_9<;PZ1IN#pZK1RBA5Z}Tpl zZp0pGkUVq`&-}LzyUmBJ4B}YahQN^kH;57U;nBse--W0W$6AJKEyNqdGl=YiX50F0 z@WwCQo8}F5T}do*++YhUd@}p~bOXQ12zZ2RiF#eMc<4s1%LH8(Fqde1;py zp|fQFkYk0J32g&}zxGXO5UM594j&(*%aCRSau_6>DSNtcIpe@6fPSX~Xp<2wBeg7b zQ+oyeJ5fT=D0Ye%a@b!?WRJhqY>%Z4@cqWi)8H$KW#7^5A&!=;(6JrA`DKFXa)nMe z-WrdELfShV(qd5<4xh&gZ9UJp5f)Z;I|4BuJ(Zi%Ho*8>H_~97ojM~7V3f4Qt%fc?g?0C`@olEgbz6j#yI^Mx>6@I?^b%Egz9~q@eqtuQq6g zWAE!!2NgjT_PGrKefZI|fL2@cK7L59T}f!5MmVdhnX^S_;EW41M9wIpa-lP~QJspN znQdScv;4Kc!OUV~v3P(ec+@6HCVpU3h|fMlZ$KQejXR(t!j>;=dT|fl%=Mad%-_Z( z+mEAo286XysU?sxp6rY%z_?4Yc-e%Pl|I)DjF0(FqX6kK(=SMnuWcXvm$(_#RFr&K zQ(<&5n7c4h!sF;1QF*+ApybkP39$>wj#{xjj~>UQR^6B=^D7a0dUpK|CK}P{Li`Jt z*uxI0j?m+K#_(x35oU+zO571z9*`vjVbVQO@obMrJ&9%Pt#0;58V6o(y~5%!E=hrZ1J9znd%^@vW{rLVd2|3{3+oL5-5+0TX z*lo0zoJid&MLC;p&|Sv8;zoZ5-I(G$js%M{Sw7bdej*T^rjWwU_qw_M(t)0mj!T_2 zy>+cZJYv#UDS;r#Nwlp6rhOZvlEFGg63@P~UqYHE9xn~(x~^43d+T9DAFR1$vo0f) zk>-w**Ye6)cvaWLgwq*Pr)ew)OTD@4*c8P709RIFS&n914?&P;h2#9+I2o@F3S@EO z$oY<}HpNos65sAvbSSKtu3|PX2&%>IDt!XvEOp+DxiSZfr7yVX6eF{{LnawcI-RGT z6FTwa4_gT%=v@%Z0`3;4I>SY;=*BBpX^x%PwY}H9H8U49rKg1$GI$xDG%y{)*%3Fk z<*P<@dv0{W)j%AbMtcqMJeEeicv};ljw#TgFUl>0C5Td#(%8{MUxZE|$c4Q899$od zWUA^2*Qp}FI2yA)oq3B_!=3sI$W4<|F{;+TfVWJth@nc&Q0Z!1X)_t7P1|XbU`P;! zVd<^!jwpG$WgcP~U8VbiOOx(19XvVZGqYB;@7XeXqG;mn^PUYVMmyboDBsMO7EYAj zJbZ#Q=K(8H39Xvrz0wyisMGm)qtS*B^-sLjT~lLwAwZ9R(Lrv2a0Keqc@y38_dv$myMm(HSlphd=yaiuTF0;Y^HFd1AQKQSoFkHt=D z1vb>6dRjMjcDD9YW)F6_xSB(XTbhnMU$tBqgu|Nia)#5TB3>4NbzVR~(?x1>1r89IQ zP*45&p8a_%sS3!G8E;=sZlC?`U;5ITJH znVzoqha6jCyiHe)10DPqCLxK+5*6Kh;98~Q$iwyF zU~LK4Cr`=Ja4uZ=6ei0(#S+xoPQK%Q*_VX~v~(3c{F+sHb)eFWnH-FiZrBu1anYFa z;2XD=p=m4%GLcDv+{T{UYevHq?|x3_tmNCedYFR9C=*uwx!mi|ALdlo+2lH_`0)$< zNrqf$d*hT{vS9#*wuMEU;f=rpjPv6iRsyW@VD{?7`nEh58A~Y>)_h=zu+Bm2(KaMm zYd$o-QuUSk5c=;;bMTdrAuWYLrMjl9u;XHCcf(?SXDBo^8t+3?W7rFuQQwY|)aZ3~ zzPC!Ig0^7zvJ`&>;*stQgZxbP9G7w-7mHCGbMs6ZtCS(>K=+cE{)By&x*#J<^dGU6 zJ5i4lY)-@**Absk$IS1uoSYBA4dpd_AReyy)EH7(z7(PtfXaN48Yz5{dK|W4(B^Bm za1?q&MEM%SQt=3)T>J>t-E=(6PT}oh!y@8gN(pU=wJZux_ys0{+)9r_x@`B2KW^;; z6%R+wZg_KH9w)eD_>L^QfJ;~8)5JjP3NABO#1+W!a|Nk!)fGHCxM9BLJ0J`GC>|2| zKvqJsp^bUO1{p2N7$7GaU3{yCRl__5Z&PZs7C>5MSI-sWx1m4Zd|Pr2*2WL%Su%NM z5iU&J3u|EEo6nntw|W5dlKWvmMl`3ycqH^b16IpdSQeO>%pPkI=Fl+fYk!UINHhx< zoP~6iLgF(h#R*oLziJ~2Xn9TP)RYt^p*q|ATu_twyD}BH&}lH*m~M7n*||@rY^M*% zZ?uKoe&@ID(f4qPBBhyK1Ix~&QXAH(8xSKtLV5&|WS6H{)#Y3_B`d)SIqnqkxuJ+R zI?UWu3~)-+m;okP=V~oUm&}C4<@{uEWi(x-A)(vR{IIh}hzB+9LQu@C_J+heHaY3h zv)YpML1s%P%k?VmcqdR7q!^iAqbWiNN2LYKO(RMY0%#_UD55)Az#sVVin*{@E(vuS z4}D_4VKSg@*$?b*%!3~>F71ZQG{Z5AC1zGM0J-KWQg7pNP2T@zDbXV&D-h=0p_}>^ zaJw^B4T&=@*yPWhjQgvbybhMw#w2(m+8#7(HXt~VWxfo?L~#Lye2@l+UY#GZcQY4( zLQw*Ua_*`EhaPkCp})tdbYvaRlNga9q~FLVS-)u?ul zZuCT86&8E!&#n%)5F3F-r9f`eNq?(zqrX>p9dnC0)9Dri%JVj1QihZMUAVVWgDs~xIN=Yh2~ zPDG2*M54ysm8}7G5XS5iH9O+v0q#65lWoTfmNdKFZkCosPk!t4F~br zDx;5ROKELoI=^5}EY*VNmfq2DXR@MN+knTre=!M1K_p(gq%r_g_k#cai=#!07%^g zuWhw(yLE7{$AE`)y6HBA(og(h8k#eZB^W)hyX`$2e*XE4))|IJ!S-1P+q$W4h+jcJ znKnjhKwXEj&l^T``>jRi5~3+_-2`MKj#jc@p&}t-b(!Ni_WPQj{G&7&=RJ?a#~($T zGQ%lIgyI(*>oXdcDKmr2lsp)5qCZ)9p@q>CFdn zWLSjI26q%Wc=e_(44(v9gdt|sE(1&(yx$~K8fN&~*ceTK8Ex0iJ&H3MgDtUa*2lYW zD3HaEi&F+5cr;ue6jP4vp_^|dU%m;M9+yr=-0-)@@0M z^Pm)!iasaLV3A~30Rg<-QvR5{A~YoHTm6k<>D6z3!y9^+F24HG#m8S856gJRdO_@P zT(V<9{Vi9G>wUxXbj92q8wE@f8LCeX3-Sjz5s@2ujy z7@1c97YKNadU9iEuX^bCLUevo1z<HDmcn ztY_oV3gdl18x3mh8DL|8gDcB3$tP;3z$UKxu^=s#qKIr+EY!}5h37*!U&mLpTiya5 z6FBut1_5?uu-c~+D?|8=;BLcA(@swMLwaS{)vAlJskOiVy0v4&NWUfH=HyrA!i9c#9%-SQ=nE-Kc!y#Upr;SxmIq$vle+~ ziQ@`v$zh}WiJ{D~3<2%#*^e*qtVJ}t$yUQpM9>r@ZoI?`ToRsEWXl`PVJ{OcIOmY` zTjpJzDlwF>Z~nHATbQ-RjWt>$MBKr17p@nmS4V4?M}`+e?MTG1n#&TR^*Wlbt8O2I zgc?tgSr28bW)wdpQh{w%1sH8IAciMQ(d$_CFi1tY%a1+u7(%pmcaYTpC&gFcV&6i% zU$H}3u6W&#wH7f~RSh_z`2;H$!__AS(+i!=>2#;KaQ^%TyzaXzxLs%aJlsI%w)!gt z|A7<=gY(0p*c}w-U-q(>zuZ)Xsbq`{`V-{WGMm%zCWaa#^`=LX%bJC}z3j|J2E9>; z3RM$S8slCM`E-Ux!3h1`t?8VvK%g!n&cTNI5EIQqMr)g#dAp)0Q`_f;7R&0S_a!Ux zeiY_p13C8@vna-tvBk{E$S^;n8VNOtv}|uzXFgJTSl*kcy#<+NBXy!ef0hwVcjnMV z8r&KpPt9kes368i{;bwaf3A~Tpr(rCgwqWX&S^xvFW)bLYf4mIqd zvWEWhTLAT_tKj_s>P5#qO1PB-Q8_*c>8o3)rco-s7uI z@!m)I+J&_uW^@B7fF8>7x>%`plvTFuExX2dujDa?H^zJf4dF1~BZp#lk~9g6xtB z!_tEaRywP@6L>&y?wV~6dN!IOzD0J8N%Nr%y#8cZU>6v30|X$MhnaA!(8Uys38t-p zWbV$ZhTsgu(;eLAi6lLby&gZ+%VqVq?=n{JlaYP`V19E+6=H^gbQss z%Q~-SW4uPuaPtpdy7<85i}N)8W$DAp-TcFkK7R4iWpivF1d^nhjBjA3*4J@UBV9Mx z>8f^@=%tHZ^c|z`a6%lVWl_d(QAs;mss^i;qA^y*N8|AhPS=Bhw!v*kN=Ww5BA5$( zcq>v2&f~uUMe+_zq{(z@79hokEI|P1>BbWZsYtm?Zr*%_3>QXE83bkkBBdCesxhxI z7k>1EbC>uw_#J>Wfg(Smci4Ck`ew5nFdRwfK=u(!=2;2Nn1Mg`)7bk?9d}2uB~Xh@ zA}>^{kAC~TKpMswZ7GZ*P!=l{N#*vPI{rW`Qq8zZJ$0ljeK(R+pYr-$EKrof8nCN6 z_Zzb1$9-LjyHqs+$kp)(ZU3sr+I&@whM;LdA%5+DlT0qp3US4Fi4OeXco=8Udlz^B zvwH95V2g$%r}{Sk+H1cR-SGP5$>w4SM~J>E4wFTYSihMO1*vtkBo z0C>=ueU!K+$qu&;)Gbg(|8_ftj?gw>@{R9H*-f8oM2~>wlUaICG-?|4(BtRu1ziWA zY=?77fY;1T^fiu^OeU~RuxJ`nO0@0ytD@JNV&qq$v*HwV8`@Z$T((E5qKV+l)g%RN zOxa@RQMkRmx^3J&P-l#)CX65MlR6EPwnu%^Ekd;z2V3GPf`3OLA3i5KL&vWQL%ld? zw1W+MR~QNOg1zD1;=^!Yh^G8lYh{bjy2d;3|E~?6yw46wxmr_OG}=72c*ZpGj*)LW zUzh3!1{pb%On0B6j7adgCBF1hqcl(Sy&aZC+zmd4p{Ayh6gFCSxdZek1{s=!+?LL@WQV{!rFjv+bUF)8|0C7aDR8lOzUQn+UieAH)%%57cXVoj(J<@x z!*8ht-D$vWh_n9RO^UO;?jSPkLy<;tq9s?pGhSRBeAY>;sB2b6X?3g8qN`X5qpC{_ zVdFL$E|My))yd$9hBiR8`o~F7C4=)Kas*yKm!tMXa z!qongJOy)8^PyReX~#u>>DOgHOxj1H4Y=l#xlY;<33jlgd`U+p$z*A{w+@s9fCu(@SL^g1)tdym&nDBW^MeRyC zHdigSfsrRZmBdI5B?6X@rHDMysHy3eg3r6k0$0t%j5taI#P|<6ZUh_1;+#Hr4k{%} z7Y|8N7C{dCf3o0dBYga|+x;XulpLc$S%Jww0bNLfF%e{ZIDUMhQBlzyg@}PeMBF*I z>7y2=P-N&4@^XWhCu3EJ`(y?OModH-!eRWElGC3w?_+ud2;PAazdzB4Xw*Z6jn_MD z1R_ySyNzn_j^Fuv3fP6m#@jn@Oir$Hr1F%>ZE(YHGY3MR2_K&5SYNd4y8%*+-I%l0Ih+tVuGTjAdh%d$>UEGxh8p4OXESe4G#VQ8PT}Hp4i}le zmihVq`|$4=8M^pDdRAW)Zo4Rtn7T(xCiYXr1nB}Ndu|)`(NFK;8J{3A-(_o-Dz_qn z^VvM0Rh!J_l9O?EUooqDVuW*Tv{@cx1?gI3yD3-^bIORSk zS~ZfMDo5B6%X4mnR}^|l|1f3Y?%(OE5Z7}~XX+ylnqKu-^*ytv9e|i7RJtbkUy$G1Q_BbWLs2Qf9;Z!oCW8 z+&*Aobph?!WUzo*J5EBohZEAp$c;;#$KUh@WMZO}F*r|#fKxikOJS3gWr-0*2QW+u znzhb4644YLP8Z{?Tu;iC`y}m(G*{v9csgsi=?fk5dRv7*r;Qcl`~H1WrBG2=av%)5 z6dcseTja8O;L2b+Di*w%Vd;1Y4`OkihGKOWvBKM2xBks7<|2Y-`QFC_Rd>uU9S1%m zYNDH6L$Du`WjZ!UX+GBm{HIbQSteGP;iWK ztRMQ0B(j>4BpCa271bvmY)$*>VRv}uO^`4$rBz*T3P2XVW`QVyiH$I~n9x!xZ0J#q zFlU6aY|}dCYT_7j!ub*caSB}DS*pfhoy+i1F&uO4U8h~jZt&ex5Xzjir8~ETgW7Yw zxdk9QYzx8Sv|MW{eZ4_Z7xK~|tge;)h9CYvlYm#-HjeX5nlBn0!THBhuV%paV!bex zHgnQ+rV6|`t?8Txc1oVAQLuPck18apGt8}eqP?0%oT{2i@>IQZ0u@-QUE6ORsPqzL z_EgojAyD7>jwHSs(%n(;=DrH4s-`UgLjw>mg-Du`s%*zmK8JxO zXC{`+Z);?P!dJEBE`E#UTU2o%jm0Nm+pwi^1-Le zP_~5efLIU*4=dDzh6YzqT}ej>-a0J-s%R6lYk}3V&>5T_hBg$1_x{^7@|sg6V)e6j zCF-SVKP^~n-fs`e!!s{&sH_==nc*4g4;E-%gK$sMI)r`Ayiuz~*wXcOl@Y}D1F1gH zK8{_czW-k(k*$u^k+9>aUib_J#XqATHHWMO(--G$Y%bEHAiGmWQ05DJk(eRUL+;>x zBwEDw*EG|;x10e^`IPq0!IiqvoqvFm>rj4|hb}$#MjQ^mAcuwh2be$d74PGNl(FOo z%L_o&92-S^oJ7dtwfk%$C&{hPCMBM)z709|(LYI|p^g-R#m5y_doqs^A9ZAVpd6kt z84D?%GTDs?GR}7cr@5V7ceS(?G6IthGY@4bP;~@CfKmwPN+gLusuq6Jv>Jap7>B+% zLqe*`QmJh9#!#{wCDbiBw=BFQdFODD3cZn2+`(JD$+X%pR{Lv%dfhV19Z#!MPHucZ zrZ@(~Np1zLH*v{QhudJJXKy4KNo~h7Eq2z0fj$^KJ4VLIk?9%c;7Pxh(@@)vDDYUY z`MsaAxC}a+keAIOLv96gEP1PXvSwMj+L+@{j+1j-PmIjA4;2VT;TWgAo^l0%#1W*R zA1Nf16BP!Z008}6+-J8k*cgtMO@0ImBO^>R%eY;XvD{-<(w?9MM)6A)+GH&C+msk_ zJChl;q74W=mvKPqI8e=AJ{hH8=-FWW{M+LMQ9bPnML(PtBfcjJM!dO>@@lmdUEO3D z<@cnRdA&@JovMk^BH%z}Y=PDQrIqcC&-_ACfT%;Kgm#;T->Kgpik>!~Y$RNRf}=HX zQ+Y-SuPpEN@I1k4rvHPR>4^MtT2*(+vX$N@!H%2YSXIAt@r`eI;K7SdTW9ryj-c2I zpyyi&kyYE(IQx~TR8x*Ns$URQA#Tz)enjKZhMf78Ur!<}dF(VIM+A*ORvW!OcJMXn zgNNbaUw(nZVW8)$*`EoJVhG&bIe%}5GLYi(W6m_IGvT|1g(TO`xG08{8UNn%6dGgf z2;TnSH2J)H%c=91MT^!jcB!4CWKxpSfl~RF@VZ2qpI7KWEZ4l|;*l^6ASY@wT?Gp1 z1Z!#~wxdR``9Nhvn9GdiI?8+9OFOd2fHfJIF11aRq_nXx#ci!*?I8VKw@;ugs94a#8)x%3w7PqLd!b}MBC zjAcROJ~C`L<4iZ`sa>WYejn}&E%BFmYTKc;cNZ%B!3nZ6^gL}NEiVA0h zS=44pV#U>D*dPedG>%yhv5d7F#oYRFZ$mx(t&At7*)WNQ`dr08Hdj&)x+N1SF*zA? zsrkp=c8cdP(HbpIUV}aO-@-kO%m>ceH4?x|Y1+03_c{hV6{q z_V_(K^UWT>O-3PwWLD-Vr#7O-XhnubJX-5d=q@Lv&61)P7+C71(>1Y4yxo5yQs^vH zUE6%x#GRU~^( zIQSpDD}o%ADqd@?tA4nXUQn5`haO5p;N)&6sEhDcuMOSOsBuhMYNHJ~`+I*ciGpSX z2_8O`r}&tG(X1B=BL05Se4m2(6;B0##RnRNRjf3FsO#?xmoAxDh9!|S=5uqU1IMTs z!~t(^%gzJTHfL*XhNxB?=)eEpC$Unk@Crt7)T*QkHwTB=Dbr$unM2g-jO?iY$V-sw zE+~K?(ytWZ;+1=~e&rQF4s?0d0}sCb&9@Qn;@fnBM>jr$uBRe*9p)30)rRc(KNgaB z${ac>;YX0A4_K9ooFIrb?Ue%C?|ZOSO^u#-?Achgsidq4W;(H&W}sx{i&fB~$F32& z`9wvacug(#Fhmuw+-jmiy-m3WSc8fx%IHpQ0Q3)clK_p3b>jzs1}TW-Bu)Nda}1WX z9jPTF;Hrvy(Uv7v0qvi9pb_hP+SRO&u;oC|sfyvdbn(##9yyvh>)R{~Gz2gE#%B<1 zdTZQQV?2659WxMG_h?n=gXJNn6h^(x-t;jaf$3?kFrN6y{`~bNBcQP4Ix^vf5yAWL0I-9sV zm2$DK3w2)4oF|MBi5kE_TG(;qu%!rDm2&VaH{kC~thB=lOA}; z9G);FqWK?4j>b_< zpfA29A|g052b{#FZ78$aO)t+12)z*(=L#>G-K@LoojNpCu92oG8KC&pT<7oSG8`y5_y} z@H;&7u*Y9@ZzCYGCYIWwk(q7H>PM60iYxEWNV}pSMmsYGY#zuI_oGW1Sq#{_UM`xL zC#Pd55#QLg@U&7ZXK*cKP3RVQ<>4>bOY%xYgOLvyAz=;nIrxXoS)uGikXkZwx2m|8 zw^?F6(hr{XKv&!xPC0%x5VJ=)H0Xz_ELe}QVV?6e_-5LG%Gp;Yp^~-KJv9QF(9_`G z9y59x(C=|{c-I$tAf+T`22mnznmZZH=&*eXwKGv`r5_;cVlefJWos(tqd4Brs&=4* zkT)wo$v0B6d{ce~(^jc0-4tHip(A@4Jg(aGG9>rngG?1pO;vNKp{Aseo{fWZenVUp z$qix~eEwHg(tIApYnfFuh+@FB3a@j#R;EOAeous4CF;zq9nC-XD@h!$m1vEi>*c}0 zZ+dY+)0O$a=@nJ$i*aY)cBoc{hVsfYn@XRH3Cc9r1~R{VJ&nv6NfU@hQCgX9oMf=h z*lmy6!!x`y#*!vH5T6-^2)|kFUkihh4WM5-z1r^oC10v$?M`Fp!=_~<`K4dZj-t4~ zO-FL%!>S^^(~KQxY6JU!J?%CLPW4h4M`@)Hw10vl7)mc^fVa&bYxMwqGqp)UP?hq- zgiveGONkoyy^_dkQB8Nj!}{R6y(2I=6besv`z4*|Bi&LX37U-4yLIrDZdvc)(9d)O z*IO>xKg?jSj~H^5cd5ZVRnl*-TwsC zs36b`@9q#8W4{fXU8EY)wj)QG7PSdANY!x8w zqn$JXW!V+@9cplO>)@*r@}ag1Z3wWh_(&R!M- zwV!K+=hwK|PAPxc7TXY?cV~iNC7*e?VV5P$h|M`CHnSy93r1(^z5?rW4y^TKkwR^) zWSqN}9ov}%;W5g<7kw@*17`@TGJvZMUz-7L;%BYX9w`naClP0>K?%eeIA1lL>SMmfvh34UH_VQ+Tqy&Etx#?scms~}&#c++Sb2)Kv3H8;i~T*VBv5S36q6#ip7&pFrM`7dh0PtvKZ&L)M81^*16oHFpw&@%=8 z7rfMge})RmX}CnWm!Ws75ON^y-_6Uy!_)Z!$1-uqXB*oQ*vFV|_NU>p&@qc5rLDt} z9?a{M(!mw@L7AnB3tZ9u+}BCD-YSs2F`n$ba_&Os%Klt`l};1k@42rd_3f2(+a1W6 z;(}Z}Tv}SXdDWb-dNq>d4W8`N2_jRcTe;?Nx9s4_K|xizhqR37`e{=ptX)3q^;cHs zZp!jZ-_Sq(orD>MU+#m(t=;Vrw`l(E-7jV6dGDojSJ9E_-p+u!hBHu`^m2DJ#8t6) za(S{lxT)H_D$SdoUPMYa91OV8-&^ePd8&rYat+5B2WthL6Tr69#;C)&{q%=lgLbwW zltnvR_Z1}H?;zP=ER=@@#+nF4mdM%c*)@af<*&0A$qcmST3yt_t%GlHqAMqFYba<# z&c5P5r7`Mvb3!>=L!treVjweWzBwJJJ>q~U`2K-|?<}K}$8oLbbo!udIM+x4@C}Kr|&W*y_LxMdz+geOaQgHdJofgIj0-oG2!gb}nl-JFbfH#X@G zj7bj{7hgw;16nWG*+Gs4SwA}uJ@f|gF3_Er9rAM^lQ{0JP%8^vi(##QN@6(a-!K*F z^+%;%Kvex2TJ_~P34>jzy6XAz_IPcub!FbrHGkC#Wq58N%57_0s=l#OG1HV=BYku3 zk#164${26BzdEbf)W~(!Mxs+_Cko!YiT{~foTIp4%8)}7u(Z`j3U<^(y)6+&IX`7c z$*)1p*}eX#@$#3x?b_B$jo5D&>K!Vrgx0<3%WCBS*+TsSpoMuTVC@aQb$58Zzcm<5 zjU1>fbIRmEWna7;IQV`^F3d(3$JAs8sjCdctZtM2+Uqr34ImVRu;*2q`Yssb&~d;RUL4%wi?^&z&Su>aIKcaF6ct39y#W4^Tu3Y}k!)DCkN zp1v|`c=AKLe)7tjaP^L0i?2>i2E8lTIJyFbhF4)DL{T|QP}AMVR;IAsxude!btKC; z^4N>QMmOF-4&&CFt-+G$VYX*@+@r^3oqEubZ=KHYh$ zX>)+098-vkcf;pkvs79Un!S>D+ec>|m9j1iy zWO3(tI7F<@JwUK)91ThdjK#C(vIWQ9#KK-R~*FyX9# zH0GPoaVI8CYARC?Qq5dlnHN+ef&gQwuyp0VtKmD_Rn)1v<5&uUe>|F>(izOvP2nOt zR_*kJhFr};y`l89PTNi5Mi|M;8!vcOW~r1^QYX_xiO_~Fv-*QcJvmE*=r7NNgq;GV zCEFpTsGRW;IAQ;~MkHF#ie#H~z;?ofMUOaNjP))&3H~!RcFz3%_=Cb|=Cu(Ra`-Sjj}&yG4J2=5qSR`M5lH(x z-vdfd0knfG682zw&t$)fy=@1(eY%sF&y=+2HBr( z)_vkP-IByA3~hT1xxTpVT#Fnm@NGl?&CLNz4>l1;WD4<^5s1Wh)lZ)qe2K4HeDl80MmI+<2;jfu@^DU`6Jm$z0~TC}{ea3@j;7{!Wq^FeF)O%L<0H zmW%SK|H@0EnrXZVDzxt{9`sd3K~rhe67sw73GOX9;U2R#SwP zq!PXZP?B0_6-xdqFO(YeMu8|y2$twucZw~C@uWY&u^(&XSRKcjzGZ(;W}v)?%GcV^ zd{Rj)0{ADo(1wKi&TmLVX$G>qge9nuM!5Wd)2HSk^Z>I&XxDY~zeMF8hkiT^-dVQieDR~E3M6lwiyZ$@J zQ*JekN~f6%khbnlyA6#;CWL~$;G^~7MlQC3H*hJ;V4pWjCGdjSM%6JCCZkvk3Limf zAq?BzRMIH|7pOA#%WPdTGR5`Ab}<^VO32c1w7RvsHt3RTeWhOvmb=8vu7(9@DI7Nt zKljilmp>ir=0F!YNE~(9zEwA=fh7AB5{XA=FoKX-r32>Jsg9^ntV~K#P52NC0Ul2( zEIOvycZ<)+U^Bv&Ht_=(bdXOU7K5z;Vt0z&6&EJsH~t*Mcj!R8i4*1tlnNJK(LfSB ztu2i397hpJG8=q1usNpm$?W@+B~hC6NQsm) zKH*!ogFaB7(qA@-)W;B-oiWbOUvwnI4Ujh==6EI>GN!hrGf{5xA+7O4iV;bFZB|p? z2qqDnk}P~>=tFOU4|vM)l{I$wPDa{mv@tacB+l?#geAX**x=<{mC`XUh_@eaNxdfQ z9(#+ZB#gUPT&{vSAU*Mmy)_Uq&)44Ik6uc0OEufdy8E*UhCWdYQr!v983#UsIMF2+ z1`6=FFa(R4@JwDLrMOE+OB4H`%cO65XcxWXgG=>im@W!7|#EmP|{>t~&RdWpAe=?Vh@()-=-=BN<|zTP6B`l><@YQFGpxD=rZ8Bcg*Pyhlo z>m0RKAtwoPE&&7AQ9u7yDQ+Hq@M1TRDMQXR(Zs7rE>^(< ziCCfrUwLM(>4uu&?{zawg5GX{+x|KhpEcmXR#4`6>x+k$h^DJm!dnMTw)et$XhQ(} z)UPMOqD@N2=&4~8VGwWcg>;`N{50;FLeeieBvp<@7E-hC?1ck(s&@8%dOM9M6*+6% zVPl--9{8RLls=Jud9pB6+ZPX>!!P(fhn{rToaJuJZk(teO>y!JC)C`DGNkM47dY}j z#~R4VXNr!u)?89yWe*FZZt=-A?~}96Ip>TMpWI@{H@NKow3?4?N9O)PyRRVwnQ{fQ=(dayHGx-<~Vmt?raD~4RaZdeqRrM}osF55qB-bM;A zUY;j1{6>XD-fv9$BXTB@{}3b?MPF$GRzFTM-fBIyL-&p<3A;Vi?(? zVlq3ceGF$YMP59lCdFKC<4B~NdY((do?%H|)XinY5h^hzBn<77 z!SykQ6lc7oFY;T`{1ujW7I~&^7deT;GUfa9Zebij!ojbty`JE&TcSuq7WC=HmV;kh zCyhsdT--VsLYH0-rn{3-cYog6F9pKjuS6|hm2mia_2wTco6E6`iWW^GKzV&kCo~pR zjc!);VTJT;KI<)+U|>GspX;G+L&f^UHzpUvy3vs3@Z-smI#H`(T}S*{c;G`^lHKa+ z`Hnf?c#Z+pvNtAKn^(}Qs%@sMcRgI33YcuP4FLVzQ%L|NgJzRN36y+DaI(;e!c_CV zDRlkcPSL8KqlPfs8gF#x9)jJ!Lx;_+SmYx|dQDoAv_$4W(#l}9kF~NhoYJy5hCV?3#xaKgQasK^OIP}5#1Ed7eZk`q&jnW+ZV>>h=HIZu^C;j@`A zBV~ls_?0zzLDDDEFK-`1(%_6z$baOeP`wtb&=a1cDtB7phV2$HyYv!ctU6e?$x%xQ zB5MH|`-hdG^j7z+gN1~uly0dF;qyzMObegpR0(SQrRHhcPZE5Z_f6sG$+Q%j0Z?J+ zud$#b_%+j7ZmE0?EQ*x6hzB8%N{Q8Z}e&9!gEpUW{B9QSIUmtshb4)2_W4I@UKcapz9 zdSItcOhA!r`H0mvc;(l=I?XHhB-Z!o03Jnaw-lSh9TSiFoC8(4#0)$m3tVxYbH5E& zdt4cycRpw`r-?QHTB&5sdZ{_dpDV5CbeA2}lqb)H4lTly50~(8u(c-MTFwWzx=HSA zhaDe^q`rhtn(xsqwM0?o505dL}Ju9?2T1?Ti91g|ZI=eMkpLX6dMv$nq$7PXZk>4(HYAb1O z*%VlEEuNL0$an5BZ$VHW>OIq~cu0QhN}5-ci4uYW`z5^*2sS24`sEB9@*-x+1c%s$ za?H`_L&X=hJ@PD(x*Ul)*V2?=2H^m#Npc>5nPh8-jMvMZ`FrPS=gD~Si|H8qZ|nWx z7E*c^aK72#UK^3e$7o7y!*v0s3`Wf)RSeP$ShtiPJV|65Li%@pAPGDbBojhQE|?S4 zeJu5A2F%$^Atk9SjpPv5;4_c6nvN*2{YhDoVXz4?S*R&tRhEtrzw)`rFxg68MH0km z_g)U*9AVL09Z%MZv$G+Jc1sCW8%U2a1SLJJfUQ>m zI`;}scv8*Utw`Xw0jL4N4GH|7PLRk5s8bpgen4vg4@vNR9th%pw0nKJt-RfmZAU>2({2RV7B!$wJ@RP z?R)79^%_G7n}max{1GcNMqzWoK>IN_bF!>w#)gwwrUYdHDLZ@9O=RSC#&`mee}d4DfI_RwP&I^RT>5{ph|Iwp4!cceNQ>f-Bdl6TAdG#GXq z2y2cw=KoNxfZ@}LgM)-pa}L3xM+%&?I--(O`a6>;$wT;r^tT zlyJ%gI>OnyZ!NCM5-lgs9)HstG6Id=5Lf1tVhpv35CbU&cp=IR z>?}PgoO_hxLZkrcc96{flG6p_B$+G1aSDDxs41pEjcLk`i2?rf?MVhut0;xr@lkWL z#Jk_e2Ky9o9`Ogi?Evpc)h9Rai6c4ZTrtn*xIA62Hp^4QQwFQkIw=NTo~pBWqN;@< zoe-+prKP zJs_1t(DLEr7H-)_qfRD){<#>jtXnQKY zC0fW>{BcBeZ@buV%X$Yv(*u7;3Ve)HXl?LIQVkt4F>Iyqbk1YFH%V*c5&??w9z2Ol zV<=~}XmkD>G*937Wt0Rk5W^3c9AFI6cskkZ;aG%G>L%vO7e^{iBY4d-e zuRHX_bQnLE=+2NGilGjMfHeaHZ!6yFq1(oC{<<%_nv`a0og~VO-Vlx!WCSuGeI|T( zOc2cysQ~(d|JMODq`3?3H_Rs>g|*16NWYdTk{-u0MughsxqH6(p6z?qAmPTl)8L60 zX9m%#4pNzeCTLODjfm0+rIsD1!5hJ)V-#NxsSAukaQ*b=ZIPb)Ea{D^c&6=|b)o%j%7e?YVAYerO*3^(ju| zFqh+e3r%OI%gTqHNHF*!Dcz2`n>QE0-}29>3!d%GV-&ZS`S`nT0-FIe8e>rD=F|xK z7tItA)idsLTw8;;)CwR-jtNf6!Cch6k0gQ}&zE%Wce7=Rv*EKjU_jD%Lx&564#^o@ zusQ8R%(j=;<-Z);yU?xZd?nCtM?{`F>XajHb%3fy?tEP=hD{LcITgxrBgEm#q57R8QwA z0G)2)T39M}kkqb=`&k2F1+aJhCsNZ>9l8B#fxIsFd&C*YdKrc`qi=DsQK`HWFw1i0 z%JcbPtG4--cf=AykcY%^7YW81NjLZK2tM55njeD>t2mvDp;~pJv;R1W z{mw&}kegQ)_b);q^WRsOIPGX*z{45I;1h2au1)mT-ZpD>|J z^LypT?DM)i9d5zWV}7o&@#3Q1#w!t}Cej;r(ukb~ND*VXln;SPNgtRf?(*7sxTO{w zw<9ifwZWH*|2R2Ac_L)0J`|C5OmmheQ%&B>9T!GK%Pg`YB?Ej+8)dIM_g%?JP?Cni z?S><0{8*6+Y$Z)^3SE95KtCXR0dhnW>I+H9g+Joa{(u z%_BN#xwl?q$j}O2OxEmK)2keMS#?dA^^^~JSLxKrQ-aB++u-D{c|#IJ&505?`D2+$ z%8waW&3oe!c6is9mnA^5bIq}aU5WTWf3ikkEN}$7gZ0i5_c38>D^qr#QF4S@N)R+= ztZ9ZN6BBF$lL^5g2-X7Eu46uHQ<5hp9f7MC%Dbw8QYrYKSNPsKlLCZ{Q~F0<1=lY5 z4-@5|!dBx>w?Bo|vVvXi<@*+3!?2UU>E@c3xrPE}htihO<8ZfAe*o`+3&IZ4GSu&o zye;Jp|ESkhNFdPUw86b!_j5_^)wk7=de4$s81<*Us6J+lXC8vuyGM=@1bF9F3CR5b!bZ_;|xd_^wvv6j2Bl2Q!lMRT6b^I$ByncE(+M> zJq)vK)h$|Xx$2Z_Fe_Azx8{~gBor)AZA{s#|6Ov*awN#yeJ~*F7$z}Co|?`7=x0-} zJ>^Mpd-7Jp&3oz^d^{}1y|4Y6`|j__wme0q6VRbAYd;?L1M#&kIZ&48QKJ%+NR>XsC8Qy%J;rVP? z&-P`)6juCsI@3;<&xA=@sMXE>1W~G#ZiWAB=9MrNDQQquWkbQBHuf9`nugkt4Uc>< zImZ=L$Yg&wChpi~y@FIV{qHG@ibgnqQOl};E$s9HaIihY=rvJ1q`XXwA=^qZ_t~}_7%UJDCWvbsRKblXljmHv?q>ReIJ)FqGqN+ZJ3 zh_IBf?W$#5K5(pSziet>DlN@1f>hZClV1ADkV zGvk+V!+6D0bmX@?-+Ah(4whJ01N9!FRyN5V|MBGPh@;(Ij6(2a2?pdF~%Xv(hq zct9arJvu@t@ow-I-G3ka-rnJzB<`i1d+(K#e#6n);7Jts;O7H?{FoZnZ8DQE4K`3r z-m-0sI-aNdpkB9{-qTdVJd!zP&553#AhhO5_Xs`s4ve-8b<~j(D(j`$XfT0UXgq?q zC(BZIU`7PCA;|{sNG@&3D=Z^&1P=a6&gk_C!bOwbc!V6@mAL99>RbscR)W#y+KBuF z>@kiO|MXYvdEOECB|(n<8SmnK^wc)JW}LB5TN21aPMBcCE@buumrNgPv2nT($_YaP4%jGe}2RQZ88i%V0& zzGAg>nWe_L%i|9k*oC*M^s_cZ!4v6At(AEuL8-#`@0B0TxjZxkV={J(^$K)T1%DBoH)nv0bfBw)l{uSP7RW3+nBl0-%bkgJP~Fk zk4QVFxy+NPCe=FvBBJ%=IE~IsJaa6IAyOVK2&^8+Sr=5u5L^n+m+CcsQ*y$Tdz0MF z*x!+fdY}2#e1bw>s`)&_ZP~J(-O7ZisZkdt3ejp$*ha7*$cB=R5g~M3O~Qx!+dB=n zV=xkq9cQV%A-5_kCzS@<3|||ZTl}pg5K+~V}nKosR|?i%*kZOzJ~Bw zrql7a{Z=zLJ)=!yuy^2Az2+LIpo@rwSY$6*#=#{cer} znKNwkVK!tC+XALypR(!Zmo=ftS$`>~%R{J|J=5baFcTI81D3gio zW2sloXXik2gIZQgRhHqphF^LPtm%%Lw;yoxmZB%tsz@AGE6u4|9K#+(g-+&AOSRGl zAMgLoBw8BNBs}di*rn(`kpODkLj@&uAF>V7NcA_s6z$)!OV?@TPvM{r-|g6)o5vZ+ z`FZi!9@Cc3Q}0Rw;6rR!@{Yq~xUp%L-=E~ao6o1*C1<f1D8jnUbF2V}jJQ{D|Xl zZUK>qbPN@_ke@_IuUJU9QO}NlGt-!BQfysQXG8s4ERb*?hg)icwZHv$k~5p7L0I`2 zx4JQ5$1>Mh64j)?!%ccfaP92d%@DzgR;<+=$2xQgMOJ-2M%(&3z9l)o%7mq}4E>D_ znb`N4U(IJUw3p528UD?d^&DI#Oikx+y6H6Sbhiin0vU`E%!sqw$Z&`KSK{d9x%owi z%?^7Udn-81x<%KDnam(ulHAAqyBVvS1{Jesnl3d8=|YrIdsb0bZkD8%O~O5!DD*BUAWINk&|kB<#O6{LD79p3eA4ogln7|L^?s+?I4*I+q;df|L`bME3e z`jZKgh9DwRB#4h!mlws>aCP7xl7cBOz?ED91A0gjSA%!}8uP!!t zB^50tVu?Snn;Z56qj~tv4Etj7J|`aO(IV>domVmI$d7M7L6MMObtmkeia9l9Hl6L< z=sNre%v3c|Q9nqu57l^pN`n(TIIcjQAN;~3FDFij2@n4iIgRMRSaaSLZ?)Ck?DrY* zpD*m?e}XvAwFmF=OlwF*xYPufXHd&HLWOMNCW(_IEFlkAL#HbB+e!BZwKi1djLk~g zT+W%=))BoQ`gC&o)kd0=e0Jgl2OlXtKSn@Qk*kpLtVf2mx@@N!Os1FK?jtQ|=wZs4 z>aiEAf(nVDY&$Ml@V4(ufQ<-=I;bGH01M?gV0sohNAW(A4pDUB^|=v-nZ%qJk}|$ zBw5Y%&z4!-bs(5B+8E(Q{%#y~LfjkJx4+UakRfsnIkH`=Y~&QB$$PN^l-F+_cjx5&67?}O2zO3#~5 zp$XBmdUdI$3wrB6!iO6pOq%+wB%C5N<9tmy;+^OBzkB zSzqbT<`Ww(oAhmlyVC_dKS#uiM0s;&nj?@1@rSJqvBv?o_`$&|d`{cb)Tp+V^? z$gopIY0pzB0@bAKx=C@ZmG*Vn5~(mi-It2V)J9}O9y@rk+lx*4nOq}n@Z9^ZCxv6m zu5)zAEPGSby*SqCt|VE_yN}&+%;-8$0sxzg{xxK+pI&G`@#bK1N2rxW?Wf+JoHyly zmE&S#lezJy?9b+N6uNxv_Zg1N7xoO9AWqGT-{iMVb#e2R+OnlITW;UqnwZt0Jhmpq zo>g@=9Rb&W@dS|dD?-*ylid+Q)pZlUTw$*rmA;a8iyXrUI zz_sD5gLCPGBt7?tvcBG!r=Q1Q`e$~M6Rn~p486#{j`Mov3gu_Qhs~!r-qPnfGyI(` z>)AU?rkdR+X>(1Ew1iZ5Ir*aH>MET!{7!MU)L?j6ZPQbL*4e~)h+79QbnC9S1H8e$J11hHD5{Q@v5pkK}Zc7|`=l+MVy?z>~<-e2e^xmTrm<|$i8 zMsee!{b~Q;nCCA^q?)mf6322knsX}`KN_c|k|O(oYlBID=_`^mSxt!Wr%x*FNj&Dc zttMMda^g6*@5GEO$@6`z?D)?PlanZiH@uqr|FictP?9BAc_2L!0yozFnIHSGaGt6e zXI4*jcK1jKxlzd;Ni&kn{D_$rg3}tZvnpRz=X6$PP5yLGP0b7lj?LdLc1yAV!vVYq zfutFUk!JJ@5=LvZTCWYpULb3M1+)IyUA*`#Yks`=u;0Bmer~)M@8!$td6PMNs3T2R zy%#UyM#LBQ-nen&Uid>Jp7XZM-jm#4^JvM_RzRqludBI5X(+G0EX@bUTbL>`a;WQ? zTI*PvpZkgEtj;4vruW$>nMU|Crh5cIGJkJ@*7g2yZS1X^2b}Gg}W)Kw2n3UkK?w# zIh4r6W;UcNF~f5RS5sZIA$1d8wmvg{M{DxYQf25riD%bPryndZ-Lm{?`{$C^WQ0I9 zOWQfQi4Ig>jVOG)r5HOlume`dI{c^qG0IoV$dE25l5i%%J9i%fsDScHE0-O(w`>W1X@mv+qgs3@`K(UK>wfKWAOc_r3RUVTBD z501Ae3)L@EYaI*oSMHC_>O4}SO6+RP^E}ekgv0n_t@Gg`Et&V?g=#)p`a=B|FNsd6 z!oOUjl#t*ulTYeL)fcMl=k2kIuA|^!rThbbv{FE^Aj4&Eo*tz_MqLR{E8#mIF) zcYe*JIUqcd1Sg-oRnAYh1F+MJeBOdBOZQ=UxhQ`(E1DTtLmtBPJLs}&2QUI9c%EncdD*IOGRc4+Q&BuUy zRH+&NWo=Qgve1^xO}@CH82@-)mBN5^YDnY>KA^cjbH3rDO6UUiGC0bhh)XNko{Vsl zRK@S4a=5leEzl2Tw3OcaQw68qT*gcBjMBPzO5xkKc--BX*|k2@#n1qj>*j$#^LzTLI^D z4mfsABZs+N1&bkw*}eMMv45z53M#bw(yv0`WZx>7;+6Z39nO~#c;NT`MHD9LAniS=XISV>G!OWNm$X!ANrf~?iq&G`;V1$qld(OWG7_Z7Un87G0yAjuS0VE!3U!(shp6kabX~=Ok-~4n^skmmDheW(^#gRIyk_e+#Ll@6>@|R_%v=AYF7wLReGaP^?8RX z#~w0$i%hhE4P-tCH5L3lCMrYn8lR4mYq~_z-V`yZYGEUxy-xBVs|Khf?IVQSPv=gS4*$lbgt#EXt$mU=b#7_sB9YQbz&P zDgVGToC0DMF22X%LN_ZXNRlBw?WcR`0C6;{@(`iiGZ3ygtn21a7p0LpxW}J;adh5` zkLQFG;T+!6RS)M1AYmT)3KG{HBr>c*I$DAad%kE2f*%0 ztHZbF8@}K>q7$rwuxyV~GOLcaucUh&nb@a-XVoWEjC$jfjXr)h|RRKOP-3+iQV= ziusu>uo8Hv))$2gf1>KRWNt1TLZDWrk8G#=q-u^^qfT#}wvivb-P_xj&1Bk@&`OP5 z9ma-9+0<2OPStK8mo#v&VBtsiBw}$wqDn+9yNNG-C<+#};KqZ_{`d;IzncoXFq|Uy zd?k=kM!3R55K1D~6NiKXUXlBt4qlOKqz+#3W&b`p{n7Q6BPh!&as^fb5!L#lun~z> zn(G-5;_u|;xB%W(+GHxQ=IW?pw!h-bI+B-Yrb^u!B&^VpCiy6?t~2?wO2A24$^8%>YZvyxz_Dy&r#0u<$Y9IUKd3}Q^!*M z%J;;Vsv;@JGTK|6?W^0vJs84do&IcDk=0nF75n2?=*(XxD(jtEoeo%5>+%b-tOm6< zt6}fP?5{aK8uNH7Ypf0kebrtZLT4S7&hxWfMw?)1c5AWbtbn%~s9Lm(3SQfe|5xg- z$60O&FI*r_26Nxu{(K8zEz12@zafr*Gadmss@uImdpg-xQ)=e_RE46eG5d>kPtCoL zyj!8Ke&(@XEc8pLP|-0M&EIenSdG!-=ClrelYCJeZLf61mhqb$i3WBXCCf1P&1&H9 zm>pI?^pU_9>HTpL>D7jXq4*9Jxxbaiy03Y~WaG>JNffKfEX}&G9HjOJ-SiPs!3C1f z#9mcLo@l7bOv=@#MK;p1;@&_yhj0b0A93<6)(v->vH@Qh>UFobUCDPMR+&eWJy8p4 zt*TX>cl;y9>|zbq!QF0)CqbL}TMnMP#b^@j{G40Qu`){rQRTiUI7LDi#d=nbt6P!U z(2CG|d9PRHP_-77>CAUV8G{N>YmTAKs+DQ|VEAy!^H@l%nm2#DJ0#srlszab^RX~v zkYDF!Y0q`9j>dlt394f)pM7<7k}FUn)9vHWhqNwv-Yd}W5pZA0%QX+l5QplOtRD4CG$wL;o)E^gs-o_NRCQ(V9JqCS*%b33RhET{nB(8+t(bf zqUzOVDI|Q))n%IE(_7*@(?MG-T-lPkB6xe)H$X5JyQJn1A_q zMKP~(2GI!fQ8~|}*LOagf3aksmlEwEKJ)vzd>0(JtxhuN?7_%ry#u0bFJDWZ^@Y{( zF~EE_=ACQGG;3FL!l?)f|l>qd>G}9 zlF35b>!+i3IvNc}&9%$zRQA=9K{AJM1rDD&lx8p64Tp*f3?=(*o~2Zr;TyC0JEd%6buf}weIg2q z!reudrr1s?TV}~PsoWQZm=EXGt?JOJ#zeBC^g>}H7rr!(n6Gg=f4Eg$O~FIp>b;kC zd*t43Z3+SxxSkgksE!rUE0k%*wo%~kURvH8XS4@GF_{V~{tjJn@#a z?DQVlY_!{S2t3)_hpQuNx@Fes;_5vYine1f(apKEe`EG_ZVF?XO>z5mFs6$KahR#| z0;j(eQzm$uovKiD`N&(WYYKvYKhLd-ha`?gzkPD&BjK3A4SwGtxS)=zM#5Vi&b*e& z1P6`OfvRtMa}-r-kCLZDFobYm;8_8IOGiv8*$N*&>F|;7M0_fb!~ozr%2%AH(U7w|1k5i|)K)Gzs?nd0VW^(m`0c zHy(~hC*JMw81l)?eChZvBich=1%}FX zA!lhT+wSJR_KeiZ`N~{U*(TgF%++59W8D7r==^IVLoq?Z75(+D9K}nAM74e>aJ(aM7LmrOca{gi@1SiH1wi?XZlh4W$0>Rk*^|Mxg*fOv@ZZi+?O^m%t&hY%)dR z{b8skJF)mraJAw_LIHJj50I|seiPxPC0xkvtS$MzAFQY)W}VvJn1{Y2s!ujbEvtU? z9~5@0Iq1qx2VuS>;FG0JI)Waf8@%MuulILTikvlW4+n35FFzdDvh^PPWOS9O{VOs< zciYbbI+^KtPRg+meBaDtGnPFwEP2q z5L!mInqPkfH`j^gcsLzxgFDlNg57n{@m|{RZX`RsJ`RViz;P!|mJN7=TCPs7na!)5 zvS7?z**Bs)m|UxMpym1`ik4~w32yw>Fh}tU0H|6|Je2fxZl{CgI#v}_`8{K;O{+l{wv z_sVKBD4x4@gKIztT8c01h2{w_6mEp>bJO-!kS?*z*bx@WnXDjtl5+h@I^vzKdCXzY zxTsU*>|b`bn`5{#2#CX$01 zG$Es|w2le>wmYK}9E&-sNfCzWL#FC?D>UWvx}oMi5+zA@DgZ&A8S0|Sc7}X${SI9H ziR&PW1@jRRqI3C1SYt&5#aKoisCoN)qo`3)47Z2-2kqTaXD~5J*$32MDtIwttt|9y0V)hGa zD>UVEI-%zNjZPlKdK&`)={(ieYAyDXAN-Q&w9UTO+e*jNeRyt6+IvvZdWh*Ji!@Eg z?R~iAcend(r)&t5pWU{=Co43~$LzG4{-1EuzrYB@P?6t=El}YxSjTJpbUWZK&|)17 z<%fPFj?9}R)j;$W$LZ!OVf7}5L4o$+SYFNc0<#YQtBYX91wipNb)$k7y9x1Njyw zghO1=N<_O$CPQ3=-9Jc%*V0jP=FBOd+Rks5%+6o!qx-b!&e9yEWVrPZ#eM6IaUl$S zPVT?+&3E7Nx;tNwwi0aAC)lf7QaaeRgO*;}6>7{WMKT;DD3(B_o~FrgCz+1%jojWX zqFAXeCP*m{PnZWKGGdO*y%eWZ-Lunuv;`x?+1@~YA+pWLUGMe#=oC)lMb z(;~9fB>sb7@w<+>X+x&sQSTaVKkwoUhhJmYWe#n$`8dZ68o{9W{eV5oj8|NhIVdk8 zr$q-1*1-+lGl+sCnkFS6Mi_xl@e;gTA-v4*i9*g(QJp>L+B_6lm7Q@#oWNm?4n&HX z1F3H)ZQ+70kbInCw7BM-5E!M$C-nSNoNHiEwNR99jAIvCxyF#d`&=-ZDrwciWUnldh zWLb%Pu?R1*C#DQBMbxv&~_jDY$I{vFINdDb9dsdiZx8+-UJ-ft`g$ml1HB521BI{y_t73fi0)G~B z_~P|09KIy(-~|eOXFR4Dab&h4CIoVPOO)x)u~_=h>3SQKF`x<48Vr5we9IQwL72P- zsjoZWu_u!f6n%r^|`8Ri#J^h!**^tXCXtU#4dHk(V-;nOx3M{8O<2s3vkj6~Ny&mockNruD*u>6IHp9gX-8A8@5epxxjSQxa zWY8I~J%z^zvEF>{D}rlo*!7mlvx=u-dDgcn)pDL18XQ9`L8E|fq1}#lHPSDcx~$K- z5Plr;+0YCpDWX;Pz-%KhLH4P6q6>O^aX46p_p6Oa)C2v-F;D#J5Ck8+KPm{sS(I-a zkpoDmZ5T(1k3`NLQmCRc^n2uE?1Z9 z2}7JaSaBqjf(N{;t*zS16fpUq5X@6wZ>ZJ6!x}VJG}rK_UKL%m%EeT>oXHw}Qa@Uu zHCaHkUxKp_xfQ6ppwu9Sh}$CuNA8u_x~|sqb8p`+tG^CX6s<>KlfA=CG$uT zxOnGUP38*WW?nZufR0}BIfo#}!*#E!LCL!`Fbg7Ag*WX48w2tZIE1--lu#&r+{py* zq-Py))H6tV><-sK4s=lsE6u0mZ2)8a+O_^xX1Rl_;P2_R-f%jW8tJ~m0pd?yD?8eE zl{`R)c;+I5{hszEP(QY(ynVy%(VelU-EmUMJZJAf2%B!pE&WXu+MD(+bW-Tg+T3u% z8Pzb_@=7TahPr19={V?iM%~_{#(i+iLCu>nQi@t2;WZYLXwSTvP%qoVo%ZDVkZT(^ z_4I7mA(Bs|!ScFUlo!>VA(c944&@9Ri`5OtkYsLVXb0TniET0WEl)PxZrN=%?i+9p zL(AO!N$nGj3&|Z;6#-_UJ3yksft>Dq!QX~z-|kRiUII7|4)uKlai7)$R=`-Y+vaNw%Kzg3v_^-XwV)ktq4-7 z{=YfhL(cIDQVQ>0K_kY0h`zpV)FtuDq43YL&7Y3YuSjiz`*6qsAT0cBzjR4AVA#!* zU%Ishsc&d_tY3{CO5p|bX1t(f1_Z9gOrR<5QOa?)<#=;K_`)qqx`0iq!{SNIuC_9| zjiQJ)b4}(I=~q~(vH*lHa;@0`lGaRJ#f=48ob8yUG3@Ydamw5qIISR}A8yp2BdhKKOk1&Taftui^iA9g_0dSYZX7J&D z`wF}q(-Cgi_V#){^%E?C0H%LW8U@J#O3iBQS=iO6_vW4t8>}n?rbBiJVy+qPxLcfd zgO07UbeOhL$6V;$$Ra6UdmUK$r|*tpWj-;Y*m69bJf%wm(0sZTmfp@D5gtwXe$Y*^ zEP@X0&b{UDVkt zlcsR+F2_^iMFSMD00RREIF7pw2oAw03fKyNB9HN*{E}fSgoe2+q88V_U-|pdiB}h^ zIuwuqjI}@A8{nTkQhsFCpNYMyKIdk!D(QjatT9f=+TG!HQ69nhA9-;yrxOYSKk6V5 z>ylEh%rI0qjN|CpD1M?5L1Q!tl6-vASeX@q zRONmtaQzPsT#moQdN~(mx#Ss8T-v=oT>PUYnRX@0R3lcm(V0loQ6KObt+7KVjoYlV zDn*qt7bTX%lYZk}aZE`s_{dE>RH&#-wt!SLIYMXB~^?EtWhZPCy;J>bHI|j;nP?pHI3Fr%Je$cj<|jS|y}a@0)_$ zKXZ`FaI7o@s$p*-#+7a2g~hsl`$wV>QyW{Y;|QFd)Q?sOI|W25ocw~riSB{|1>Ii6 z4hrXs?tbIugkuTOBhh-s{GA>>g+w&}`+7@zCxA4rz37!-#@V z7;ley`)sb~%^aU@Q;bHJb2Tmqvb5@&?0F4(>kQQ}`r}V*BGu}Mk!rUKSwaoYtw|Ym zMTj&Xo1I*aM88&KtE?XQS_`FE_C$t9|cYI)U;%=@eK_OUwK1u3BVK0{tSJJ&mdKhOb;Vo4o-LxW@-n zZ5v|Ot`FRE6UVF}6Cy28mHI-JD%I3F;gkTj2Gvg11XYScM)alzopwSwVkX1_R^nQKmW-RN*<2buX^Eot?d+R81;q zuMST1U&lQYW~Uv2UQsF_OK>x@j^Ax0Q_iZYjIZS*Xn{^CD1E{~$uX>g9x6;3eO#Oy zEIgd*1F*Sgk3Zge)4g}ycmF+iTzu1g_qHE+-5c+`=MH9a(6;qmrQ%ZTT_XpU^EC8Y zbepgKK$PbwYZZBBnQe>Nu|26DEgc#Kq$(6l911ky`57;<>+271f_JRDr5V#)bR%^z zj3n-!qISA&m1t6gNqDQ6ez)}5pGUlh!O@8m4hPYG<^draA2^;^8<0e1hes|&nSavU!*Ayok8S)r&$#ItOs3OL+M2b1RMb>?LByqFKdtDhbBBW<>?_0sE` z4a*jBuZ|5yR9}ogZW3qAzs?GGJ5D0aKJ>W-G$adt-QV7a&bt2oSjrf|RgEFT-Q3vDvN$&ZbKJE^X~+2%CwS)1iQm32pdj}Z5LIQS```o5WGXWkZ!(T4OhN5+FqN0bPmQ$$PrxMH*a!;=Bl)_QOP}-k z^sCu_kDL8?R}~Bv-~nzhURW#s6$K8{UlR&?+q-tZ1H(If<`9f8?FuM9sZkpiSUxZ+ z^+SQfAI=o_Dq<$sfcL$`a9W%R1Z5v9cv~G4}d8gE5kPrkr7*5l>5 zmF0ew^`LTxg#w!E;7=EyjHAUXYMEVNei#gM@(v3H)gvdEw@3jb%?pQ zeN`Mx)u|Fx`HQjfDOonWs`tm^?C8XoIiSs%no5XsY)B#zWpNoq4zUN<*e-gQ835a( z=6pDADVm&?Gi`|qKxfK9E%tNVa~mh^Hr>r0Z#}FWdv-c-2jsscV#&GX1Sq-tTQ5bi zsa(Jn*5E3z*P&G|czh=IYRMp+L%0Xt>^mIpV%Ha`C^0NByNN}2eTDblV&%f zAuwVT*1@SR|IH{GD$^vm@Zm;cbT1homHXnMa`fVh4l6Mp1ZS> zlw&(4Zvwp>bgrh|_F#%!s7SOCWP1>P!>j^Skhat#t;@j5IwI25R!PHv7pTCzzSQ$+ zBcuqfzvA7c2Kg+v>54_;LCX};x84Aew=IFp)le&Lx#AP*fKA50HIPqY1BnoPan6bR zrX2|;D-<9uCN)A$JTygij)v)DgTiJGk{+k4-Rq6%OqPPfZuiCr+j(}3n1zTm$Ctkl zllFRNG@t@5Dy{S-rQEpL-n0-ov$x+|Z}o@Q(-92H7_6pi7TMamXk@R$fy6+}Ryu-X zk?(`lY`Ppw%e>BGq~xlxuM87rr$2L_?&0Zhk`i7nHS9P_U+8SN+2Gfpi=D<*DK*^` z*Kv%Z1LOt9rZ^?cB8S7~n=&EZvwiZU`4gFlhEu`S@u^}Uh?YFEEs`=m#x-7`4MDR8pnEzI+PvIZ*; zNMj(OE*lBEepB3Ex)_JNMq|2*E7Z`ErboNIYha&VZS@%oHW=~n-a}|yN~O?4gjwR9 z9loZ5YC40KPhmjp2?`y^qoK<0hswKbHuA(XEu*7VZ%Fl5`O2n&;{W-2+*UEbUsc^{ z?gqDx1+^bHJ!Lde!;Z*=tJV>#(Aif@UO#gP_seGX-I#V}SPY(QHxzWNfQ5`GjFjau z!gg*RB(Ft#q*vbbH#{#5w6-jrbzou?$3&s>nWZVFNN39|877tc;sJAX;tq$H(kTg` z<8)~bWbGMUle0Z%M+K1CNhjM^aIiE+?l{hbu#t48lVN)+-R%uF@1mWz1te)6;9e4O zxRm=TkxoLKVrpAu%%i$L>~u}T1=Ov#*j(B&WJ9&t>+Cl>6X>j4(@DB1+Tc2=Jh)R- zjqklfIg-2R*xD^4&f4q1{k7Yp8%Q~2Q=tW=`>Y-c)Ss5vHR}12;ax_uNA&EI4$!#{ zxFZ=CfRr?SidcW$YFDI=S}1xH<*lT-x;=TtYL*O`hBF>2M!u!C*V!Tw1g@>P^@-@$y#k`VkVxkaEiR@JQ#hbz?8H zjd<}dlWJbkO755VGE`X6fZ8&jqH5Mvt#MqIFkhkG>AQ&5mqJRyKLwlYaTp?k8b&w4#d?v9Y=ExOC*nk$HDNbKqrQJ zq*C!)B9aukMBt<$=4dVqVo_ISxo~!tTy>d3@fw9ZYds>H7oOmUp&ZCHHo1y4v~bX} z&Sv-IuSs6h35O9Cu-xmunO;jt{x9CzvXB|_Rf`oEY0x}zXB`lVDA(9%6dJ&7Q=2`rcoP%F$1FF-p7Io!%o8BtP?K(jUq^t#b&N(+(S9K=HBPTaYXd)gYINUFFG}?z+ny@O7?rdi~B8 z@&c2;7?l3K&Y-u0A?EPA4LWbZl0-I0a}dbk0;n8yXRAX=-p^nkKon7o0kVqs#%)~X z%(RHyh#?7daFuyP>sFQz+iFC`Z&HPj;e6i4$3L`Ee0wqgfdeiE%4+|Fkw^)yG*6|d zC%MXFqsw#QDG6C)q(wg+7b%}7=f9wab}r3BX`PwvV|>zj!SY`R!N;YiGKz+q+Rlh*Vs=y+XT;xtV0FqE z4Gy|?FA&RML(efahORNM09xGG=h8_uo!_a|fP=e+`1CjcQwatG-eC;4J5wN$VChP9 zhv}FyLGrd$j{T@Rncn$%;}La>mPMmG%a4tA57`hYS~d+7cOR95a|6;H7&qHkubBzq zN-iYLac2kH2|6HNqXS|b`pSf{$&Jj5FgWfd>uQSB1f9evU+eUHn90B)avAw}^L)V_6~@D@XpOKd4GaTpn*4LK#klB?nssFL^f@ z^vDdCz%Cpt{=|-0K$Em%d@bZt>X8{VqRSD9k(n|hQ?noy+u6F6_x|QvDNdFHdl+w5 z7HK1_mW9$BbG^ad9D*Xphs*@IzrowW5Ag=@#%hLb8goK;391NY7*j*ck>|>vuWxRu zGyTBxKq8sYj~>bk12+>12OwgS73 zR9vy>(s;%zCLY{%C`Qk8ql(cdefuPi(nt2$4Z>?iKa+jD!m3e8XOwPqi;v%y?OP?~ zi1}8vMPS`M$&r&>K}Lg4zwH&p&h}*5=`)88uxLX*5{8ML5cA72NaAV%D_WdADz-J3 zX$4I^hs!k2vHTjP?$6~`D2_6QyP0pJ+QOVwedBpsiJ$zQ=t_*XF9wqL%jlEbTjA9g z?SNW$FZsfgymW-M`Yu%x<;1Uf!?2qU(h(WKb9$+RD6bdi^Jn%d?yXTJd@^gh%1VVc zhTfsxYE?{A;K9QCBkM)U;!c!YW0|23=x~8yt(s$jT&B=j%Z*fEMgp*hVmUgqKN?=^ ziH{i_%M2zRXzNA=kz<(&<^K+pPj1nab^elr1iqSJH*V-$bJ9t>i!{Alv%(^Q*Ur=9M9M_FWHt|Uo>vww=>T0-D_#@iyOS?fyTUzx#Yy%>gU3>?-ND&Q5-03&z5t0aX;A?7PJ4r9>>~ICx z-G}QP18@9?Ng;PMsa(}|l7#+3io^vsU%T`B^s`~66-=mYjsUU6SCe-Eb7ePfdN5^# z-4=xK02t+(#BL{Gk9Mo$+w+4!Q=-HykGpfv3Tk1%n&QIq8LN>D@9&f>VVPbzaR=Dm55{xQ35ERk|;{~3L~p}PZh@A z;W1`SC&YI1OR5-brxG@7LUcghbhf}_u=Pri;Ook;%hKMMWZ64q1Z4^Z#SRLwZY;=P zdX9@lcvvm>iT}sH90iP|9%FV%npPh!0IYYh#wi&2aQ;PgTnN`4pWQ#e01c#W^GCr! z#+)zw=|w5&YSM2&ZI|KBcLZTnpl+%zJFT&dtK{qPEG1W=VJY+WjI&#rMxF_W&3r?3 z@RHy9!6-B;QY0YxR0+*1ftHHBQMmbDy~ix+UIar{%>#&_(S`_v<=ZHok3nupX-ZP5)ADnr`yBr}umqBXSDJnfp_NUm-A z<`JTVZb3F8Tb6(TS1#BH$SBY;k*mIyK0?>mnwQqD(RP@gUuxK|AH*F_wOKd#M?-cU zp+b6y3h^Bex!qSBx)!jm9vb!r%|@%SegWmO!VI1-(sg^}Bvb}lkds*EGA=YD8_DU@ zS8=Crcf5Xq=N*mHG_hzfGmm4e;X`zOX#&Gz&y5nGp~b}T$Na77D_%;KJb@UD^#o7} z9?8(JiKi+C!F(ws5Yg1eZ8*VNYh61uFCQ0k0vU(-9HHyiXQsti5!04v(MhZX25)D4 z2@OBEPF!)GFjK28KM{3^uz&lnql`;!KV(%KTT;loo{hd+3HCLw1B!#4_*902W%^pg z#7wagJ|-nRE0e#o+|05>$6urvSd9GQ_x*O^VL8jI%!-zW&)IsmbjXs9q1!BPDQH%> zqKwX}t1a@f6=Z5(;YIZC?uafTbq_@risaSiNfY7!bnf{|ES@sL)xx>uEt!R*`ll9+ zMXea&20OjosO&dJQ+W?|47)lB+eZ-)KokL~9oMh82-#@4%!bhuBCn0^34bcNlVxQk zi9}K~P{)RK$e>kf>9?&bDM}ZAucy5c?v#@`o!n69mIU8WPhnQU)!pH=-z9gQz3KLq zB<+lQ>4+S7u8&~q6kil%%tnX^H1uZP)V)kDNYMB=Gb@QG*y`8%ox$!DdW>9$kRrAi z4J0<-@MJ(i*&l|*qIv);0{YWnRB;O1)WZ>FI(B@Zxj8igA6*b?j6;g0QW+@KcOV&B zfPMh^KUXf+qOno7Z2BlvKpAG90X1OC*h>e7Ux^hH-4s1Nc{A z9PM8%7}*9B3Q0Xe8KJ^DZGy94MCluygh>jy7y+(`dGff?rhUD{p=>?ssVxX35=WwD zupJQ(9yXxiyS)A@o}QM8%gDnJFft>bA1KNy6{#Crj>btlP8f{)wjL^+%?dt2R(fB;8Ad<5GxkU(3xUB+gv1)d0k3s+2l4{P4md>dpvfK|3JqvWQ8>e#mZaXfWS85ud*Wd?k8WtSn) z%dXk!LoxOyxj}BOv-^=fAc#5*)}lrH$@fLIh-bY~n(rgP!2w}0WDY){o>U+GPtaFm zTxx*tO>g@wp&lw|!C63YVSfw|CsB>|yTG2QQS#0J@gfM_K{mNEIO~&Pk)p9xYwDrE-tq<%>htzKOc{ zRPbzxQ(r`;n*1NMlW)5aogHI*tTz3&rsp02I$}nM0NZ8_7`W$_?~g8hg+`w5j`2+r zKNXYx=b6~6B_d)D(Fzz8k(!84GX09+1Ez7>rotY~PCXpZWkHsaX=D-TWLj6piA;W+ zl|)11#OA6FKz-pKL;QDdq~+~vxDV4poo zx82&kF4uI|{rBBt4#}Epz64L$8umrHbu*9r-CN&y=lyp&y389j^Vw%I_dStWcO%KM~GQJ98UzqPwGc=q5D4C zBy&}aU)eZ~&t6Zr_}Z|ox&XLk#XVw6iS}5XU2{;?U1%D1XN}O%k_)}{^mm5IN#`2t zrWz&vWK|T1KkrOq2HL4px{W%R*neJ->be?5f`MnF)UE^=lz1o`Sr3b&6Tjea5$%=+ z2v(~cBf@gZ=O)Y-fbrINAFkGIGN}4^_eIai=tS?Vca39j^n!j$UuFw1ei5;_fot2N zVXu1ze(4v^o^4PR<3=Oz#!uhFYh$f(Wilx(=n9RCs^b#e(s|bhe)iX?b$N#Kcv@Ow zkHzBRL2(}3?lT!s&*`ZcanQE-A}MR63m_O8YFFew2UK1`3Ei={{PEWn3t@d|vHiuwf?;lorwFEfH@6+TSg)y;>gjXGxj zE6+w}z5@Ruii-F!y;}(|RP2X`#nCO^KP1P8saqN#%r-19CJuotN?lS^l1;}^3Yn;W z;h1NJ8Af@Z*yNd;F+z_&uFwIdb_#=;A5r?p+o=}{^d*_9dOJF*cTqn-tHA8_oOi#tf+|zJ3uAqLkU{n)CJe!eYbW-uA~Ly>L%7!pBa?3hLSq2 z41eXjIY<6*$33Y;VqOSU6hJ?amo*<|oseCq?c7DB)Q5bz5e@Cn_`hYuVwZuQKcTf& zkgdt5ur#Wd)n$PySh3wc`03p9MOl_HM1~s)*GhpDoBxrQWo{R2w=Zrd_sMP0V)syh&$Zm~#DcI4I}{%-w=xcFOuERlgeq-}2O zR}WPS^v=WU=)_-e_=-qI1CA1)xm}CDvlze;$H{a>`L+ z0fFX&LGU(bimPR=a&08LNEx%=-a4=$!T_*K*5$s8L&nBA%Ou%{icV8YThzfxnegbI z^2W?3&(3nq7%g>x@Ridz2p6MFc&AT87NdUkVYyhJJwA`Vc$(*^u_364S3WEu*EsR& zY3?AFAI#Bx%2U=DPxo-k-fRQtD(^P(BTW#OuRrOKYQHX*s>l$G%M{tA@R(7NC6^SN z(NU0eclZUt<*&U9!}qXHenYuW<+@3-fd+0vNYA7po&e^1dh5RS2h8LF$j-Cb>Z}_9 zBA6mRV5fC>xD8YJX0j!}nJt;UFmEY^k%ox1f70(tpkvFTTwr#8>j}< zqfU$zem}`!Qr=3wz;sZGP^X<_2YKT7q77d|A#Y;}j)-@>$Aa$^w?$6H*AUr{jsV7P#|rOhYk-zh{NtD+q(1g$vooiE{=z;d79IV%F2VUpj@bx zhB%TY)~-0)nnv(<7N%r&#FlgGd8b!I7X_h=ksSy&asi|Ft+0? zfOJ8-wFVzBJb=UYff=+rcF?Je;R`fe%qrSj{;e!xT0^voZH<}f@x|pub{zOSp1qFz z>K55nf@Q|fI&i)%2RU=Fd4;$x3~InL4Iq#a5?mz*;?s(Ja3HS1b`*=ALz55kfVD;FeB0$@fJ7uC6*?F#-@X9dI_^J}mp9wFSZfJ_Nmx=tx1 zGvkV^gz*8T#*hgzTl`Exaqpr^{fhMo^&K#CB{G@CNo0)qB$9(HNy+S-3yJ=;!L&>s z-#k=yG^s%z4T_;7wib+Sv)4*n=6H{b3po(N0Yx0*_8dQgsG+INh;4qw$YUzuY>u6Z zVO}QdF{7fwRm3`+CGWYTAXCgKXGhW-l~BrvX7~}-hQc=s>w}VBEW1q!D=pfkRQ*wvR=2qwgE2??sG@_}ts-=c&q)Vo93$j-4d8APVEjt$B;d^Wy8S%@$};m?-Q zzUpvXsJ|YUM_+UgfGPHlvhG*Jso9#4o_R0s4S`E?tZP!=5GW6uaEjO5qu9M$DdcfV za>&S*Mgz}C*A+#w!tMrY`HpOFf{hI|{^n7Nbet1-D5j$W(!Qa?cDG2$B^u}f$+i}h zVK8jEc{Enxr18iMh*iQx-G(GQ;Ot1apD}LP=rs_gq|B#}q}#|B=Z<3_zKvrC3`?Xa zg*%Cwc3;?a{rT?eg}M96?1t*!er3c&y}PgHcJmdIZdG5_j)J{cr*zMi*>aJB{hV&O zs#3WXQdzLYicpLFVSGEl8lzJ(!Fh_!EYHUtOKsFd&sKXg#0)cAfDR6j&1>F1d-g7S zw)ozQdpR8NKauTMI0y0FS6GH?Iy}^SFG0pi>D=G^`MBC6=5{*s)jD_JFWts2ZDcMj zeVnzl$m@mG9nn9s+IOVpA{Bh03X~pRxyN4Vnf<9%#v}B3O@~9XlF#o3)EMKaj(;fg zx-+?LuASdJ5AQQ%ddWO9F6~|qu*pd>*QX*R6sqi1C<a>w=yl{ZN_#k-1AKmi%1!{g|NS@Ob0Hb+w@yr9?csJ}#WYJExhC>cc zOj&6p?8X@3G*YrcCs<3#^(#F@+7R7&oLs#BEqAh}eF~3u67riO|4>}C-@b|jjiVjx z7!W*U?`-Gn*PZ{mb6@whFF*V8SH0r)SDrsdUy04PpY9-k6epmub~CY_7*?;s{Yq94 zIPT*W%bUYPHiD4^NI)7GCz%%|YBRA0e1Po&Z2;&Oo z%Z^Yn8HOa-a`DDBH?mFpEIrP8s7Aq$5lon(P$^pRjO|k79Yog}?CAKf=n?%T#}4XK z9ul@h!bs}NQ;moQz!gdYZmCv=IDF0{Orx8(d-+Z+%lOrObyN`NZV4DcyA8wYfiR~h z^`nK^kZe)&@|GJYlCg6?@^ZDb1D>(W{>+O~ZrU;r_&hh=f!dwI=OojXhv6-1jD4}*ts-Y z&3YrT#6GVM0h#?QjSW9K#<{$Rd9(PPbmLGflrNoR6a7FH507~5`6b2aqC>Ix@To&c zp1i%zBjiiX+yphqUKKOIzwF`W8iL*cPLhS4s;0aKP;OK`u__9_bj}CV1EZ4o!(;9l zh{+Bn3w^s`mHrp@UNtO&A0<6xMHg{@pFGJln6W-7;#$>^yqbpD6{it4mQOLMMjf5r zseG5sl29>Ea`;#AT0%tE!BD61kPvx~UFMY(n1DPZCY^z~!1#3T`NE7;q)ArP>!yn2 zeYG#W(67)d&rWBbu%cg+V&%Wmk@M^ki@o}Bmae@(vX?eiRcIG`%jTxA4xl|6zau+a zfGiQ;-bFb__bNkgfqr@n9^LYa0+Fs!Qwfvi=&GiJnIgBiEaSczDX6w{*mT2t>ms(@ z8+2KnkHHdLd>^H|kW?_Uk|jyJU1A`*ZQ_;zEQ8QZwEYA?>RU*@gP+v3v9)ALSvmG>6@PuCOc{ zoxPOPn;WNJ?04vjq%i;FG=9zP63Ft1RYQ4waPhOvxd@F@X8yylc2vhYKK^B=y8-+v z5C9pA%f(n`ClB}zrhEI71FW<$5@D0ecq_T{5%7L~jTGlom`=%o0>;{{A^BsF)7<6Z z=yHPit1$kO2L`!+jHigK1=kU7k(`%rr~M1&{tS!3ONk3Vt8hmkdX6J2A)2 z%qo)CY^v|b`FcMc?e!@6H93HQ2hzfiyF_M77tm{k8mUk^a6K{dM0x zkNu^sUvYmOMfv_JcShM>=D@lv0sejeCe9z@hmNFkx`of!Gl9J1m^JcxVZInYC5_Zv zB+nPBKneBAJ@(wu`#eVIi?T!+vq)gMxgtE$LKQh4G+0$?&pC*TkWz=}e#gZ)G#95% zi12^$h@J_Zk1T9kiZ4(!z~ki!+ zH-ya-%U(|2^HC#;#RNXrt#*pkOuR;1G%}R(H)85jMai4e2WP;Lk&_X>r#Jjd7@dN9 z#QSRw9O+yo={fySU~l=}1~QZ9MmpNu?e-!4tG;l9#?Q&<%HlNiZ<4Bv%VvK#+;1U{ z1_!3tU^}gqz_tzZ&|Dp{Pa&^XS7g0A9>27}wAVrGa%8obw4p}{9}t73e!lRskDDEJ zl||C2+LuZ!<$^%4%}Y1s7q&N8>i5wV%m#zbg95W48@h)aBkDy90qh_u zY-)0e@yUfzRAdPL%DL~WF;bPGo9eH})Rkze!|l;oVvFo#rNDf{_wd+7NhD21Ohee2 zSy64!37eG8sR8m>ty*T z5%kIVW((Iz*(fxmt2BHnV73Em^GhzwonOh+WKS|nsVUMFj#-sb9gZj#{DGQGtxA>c`h-p%q#{OX;gaANk;4i7$bh zq0_8|+ZO2B3wu%A%wYM|arB})u{?waE--Y*T`eS>&7O{TmUcl|!!YgQNM0Kap%1I{ zW}NrY7bNx(FHy1^RH^DxCbh8Kwqa&UN=QLV`Hg9oMko`CVymYhxJYLou9PkAs!?0k zkqwP?7Lr}05V<_QwnN?l3DV5F&9+9J-dNl)dpPTrvjM-WU%MO(=w)25-b>?HZ|1UI#7Ojvjq#efQ{x#9Ps6XC~Sxz?!xp<6@ zIz;-XzBP`^V~}UH+W8%MAwl&R1K}}ybjybdq;zb4D`42)^>N{=`VhO6N|bK*Nca;z zcn0%epCi7PD%%co%jY6|k2dI@(3;C)aemF;<>9*`Z4<@GZBHE+mNb)y<_M-Pu0axt z2~BfsL^)nWapzx@=j65ywxUaWCJK{o&$|E4Z3&0T*i`Cf?5Es-h+^9#yXE%h_@=|? z52z+5Zuvm+FBTQw(p4Mci_0!lb%(2l-Tgzzyv3dWQnv z-qU)3Gk>nTAwU6;5l#lEx$rt>#0H&p)K=m6BQR6f^>FO_0%7P`jU zMr6+Y;fU;_vP8W9PUiK(E2G%`CR1|}>t3h=#k(u_*sqD%r`?iZ!9^Y+87l2kVD;v> z=cSQ)3%GZ-8J{#;GjOpx73^#(c!p&9SO+eDX+4h1#i=tqJQL_3GNdmYs4hMT9<#-F zJR?I=gx(kjXP&y5T)j?t*(p6kv!OU7@T%XSOaq7%+Z$OP?cpv=dOufjya^oE&=S1qBr=#BW)1AZPy%Ryy?<%RMt3mK`d-=EF8@(rt9y9iw0lyfrJk)d?KV-LmDHFOd0BYCJ7@ zGDHe~z2OvxM{+7Gth$OWCcp-H{8Qx zL}OsNeI55_hS#lykOiCC(2DRj_CVLJ5#Q#e9z`+e(hGPgb#`eR8@^soC>WG-N2Zd8 zhprp84b=pdz+EAHrH}EflE4&G5tjRC&&^`kFqg|I0HqhM0u_duIPEL3!^Tg5E9h>P z>Du#MC*YC98mdZeC`eDj!&tlz+VJB{*?dMNOtgha0FsSpkLmbmP6IaUUl8=d6P>4b zlgKR?USx#8OB*_f4Hh(F7#Zi8m$Myvb;u}L6|Bhb{8&~NnB`d*YvO75fgQv;#KZ4> zQB*wqoNHW1c?{2DpJKJfK3kaci(_?Go3YguDKYcE^14fTCp=T1{Sl^{<+yF#^X?$a z5*#hC;K`YR{n(6_fVqiBO1FElZ{ z$b=4Uz$jB%atdE4=PZ3SfbrfJy*&!XSw)hJwjHN;1@T$6UmmGPU;ZBeRbHD}n>wY| zfty5K$c56t_hU0lfOB_bFz2q_0PAvKhE*_*`vI-Jc8JWZ9dco!mBrQJrmw_Fg1<0! z5lFa(3$>%+wO$v}9*3QLt=GcvvW!M6xo?21MdSnow_{Fely=vQFM__QL&}eMRwHE< z!n<3c=gx9(11%=G6-5qqVmjROa|}tT07myt8<%aNmu)p<%a6T2-6g`#pSJvGD%G)N z>gdGk;2Mx*5Q#lRGEo=EhR+G3>Ij672Dp1Xgwo8LS3KlB60@@d*L0u33MYK83)5+t z4Mb{}NF$J62y0IcbL3%gr`#n6&IpnCKb!^9M*AUg8^VuLS zs97zrsklP+TkDobMRGKz`&Uv}gF5|EB1JA|AtCpo9!}V>5tAGGvuA+`|qyxq#pX zT8~~co1xTGk_3XjrXQLMqCVToX70&j;5YltHN+7}N8m4y36CP+NKL5gRB~6Z5C6$z zIF+0Hrq(W+7x(}muC!^HZ|{300wb1n`Vs2a$8ZF4SDoe6T2Zy`O%W`q4{yI^M_RD+SXc(=_2 z-H9|7ykERYp3m&<+AIzEuHIy;0?87#q&gZMh+}rt-3m7ROTZWG9Ju9|k@vOI<}HBv zB{+&(4fEBgpdNTRb0}i*5kKP zc3GR{Tqat%`csnh!j9s%z(;VqGoa5P(v0|a(ww5pSkY^SsM(#O%R>&ml2V)*iUwu` ze{TRrw8!_FlJPeB)qz3AwnYCT;yC(31BQV^W=)&t$LO)pbHP!OdwLu9;aJP16qrUj zAXGU!wR035+oA|Iu;Q^N)U}wACpV#05bXsEvw{$3Y^~EoInvB*WdP!~2-F_^upWC; zBAjahZk{VKE>tZd$~6U9E}a$UwrpIUStMAALH2eO|ty3wC24YiB0Jw_Fu-LG{Ww;H^Oe%bPub?jrN;%klk?# zqKI1|)1xW6K^YJR2zx~=%`!j=ZVO*%Vpfao5YtEHA(Br&*;RI!58;_L%6! z{CyzQA0tJq!EZ5ta`v4CJdFK=uA3{VIbU~N=Z@B&VXR@|PpaQ<(QIp2FRw>xj4k*a zAS+#WI7QBA$&+DjZ13X*fHK{ug9}bcH{IKU6eGAGQFBV4q5IffTL8MMF~Fi~x3J+x z>Wt0=UWXV88azBPt`7bgjt4qzu6Gl56rrV&lMYlpt#X_zXiO(YLL(pQ1c65-ONO}_ z#cO~kyJNfPRSCH#kR_g55eOS(FoLXh-{30cOoXDMQ}-3Bw7exO?U*fhq~+img&tRJvjh;mJ#!;*KcPk7mJNM)*+wsB^IAUt?1}l38 zwHyM?`D%D*l_jN)!?v&eJ8>W`NSYw>)8+KP5TLnWzdc5eZh0{j&)A_{b{ZGPEW9my zlPk=2`9D5lo{}UamyIOCopk!k{(vm9LWGMVfu=<_#^kue7PbFU;k?U-^-)oajbvb^ zF|VtHZ>VmpzPTS;Wx&!x|GFmfY5=_^KN$K~M;vyagers|J6AxQMslQKSK4Suz3}~@ z>cg6(F>AAuiH~{!))9#3-dFu@#dXW9b#FSs!Ehh<=*cmF0++Wr_`7jU{d9Suh1acI z7tV^5LL!P}%Q31^LMFG8%R8x7@`(qqWT-SOa0TOL*D&w%+FP{MHip{`?3fVvIrGeW zh;1EMx7N=7c(Y*+sUc+^O-DlnNgV7>uE^xH%{xh1R@HN)kmLeEcAOr-85YEskX+Tv zU}0bCkc8dC_=-9%jUp0fjZh{QcIkz=$c{TWYPJ2vS%KUv9I7QPK9Qq@d=j1w z66<#LTK^FgA^RpjZd1wj5WJv+3z(aY&Bpvvbhdt-BFk?!*tMlS8S+=CmtzIF#usV$ z)eE*vCq`{LDQXW9sE0g?3dyi`#R^^9Y`nTcDK!9&3_k*F1Z7bSX)W9EVy7Y}-`6hF zu=&#{wg(l0%QAj&e-%$Cm~B{Q?fBzYHwHS;5KmNDoFM@dFjUOg{{qtJH@QSD+-dX zVsp(sAv-Lc-MR<32uqrM@Hg8D8@y!1nkKH^?VTxdBhg|}TL#f*-8vCS2DRzK7C28k z7k)G>4%+$=DM0@GlUP<(mB*^hs~e^!^+Hv07}2K82TIK{>Obk|ILz+S&P7#c6f=BQ z;J&XqCWDTmZd9mJ?Y|$bc!PE}iXh*ltA{sF12~YiRSk-81Z5?|I4taB7mwXCxOp<+ zEjr#Vrj=hSf|1gS&;pwoMK7mxlNbou3g!1Ftgwwe1Vunfn6v|rQLa3*8cwUZLA!V1_#*9a#&GJu z1r4x7;tY_yc(q1>btNW0MQTQX+in5})mgUT}&=jcsvZPv=@40#z-KyetX~mA^ zqlI?Rf~zn#|lX~%ucP4k; zclX`*z4cA^z9D(wjrYCf?$;-;y)(IZ|6A?^$8be&8cVJwOs_`qvBrv~XkCYol5>jO z5E;Mh=i3-G`Gfe@HJ7yjXO9y^Q|u3S+c*J->ym6zpUypBcsFXV6+hG)Jk)7lN&DFM zjL+ukEi&~i@VPSa%7D`*Ez$Asm$CvAT_825I0IP zujZPn!|w6Om&Cy%Q=*QdoFOAemY~SzSI8B3VZdpD9xGfOLerJ`Egql}fT`;VX4oim zI&?sCCqU#2{OiyOwN%vVGCcW|*5*)2Ra*ys4rWpOlpf3qV4l=xwF^VU=5Pr)j;^wZ z*;M<|^O@4FcqAO1XgDZnGMdA!hbVvN_GswbuZ@Ed?f>aD`Ln=pXrJ7*NM7NQ#D3XJ zC%A$!>43)^KE5u`$WexPPGh|V)-tBEp=RU$w9k&H6b~lr$pmk#dB&2pdx$*VUJAD0 z8ce>a$ZHQDpiW||PvBinI(&*F1UQjFN#YO}7x+t1?Hi{a$_9|gnG4%m4oRMPe-xT! zD@2g_0kvip2IklB2#(K&z*IFB;j+?)9+qX@@Ti=9y91>np()~jvvKPiFWh?1g`O;t5yrJhu%4gUh9=#kisne??px)2wvgI&G-qfty$BS_HkOqS6Ttt$(Y zYCThc`CAS!v3^!U4qUE~w{*-`)@gA3FN5Lr=6VZmEITab7D7!eJmNclA&LioA>T+* z(wWKOUm)<)_Roc<-CkV}xr42)h&9ar%JYRn($yS4?B>|ET%w}bOMu85xZjy=8J$apwn?F9KV@~q~Hxk(^5f|myYD4El zxQhUtala4uyM&$aV4{Rx+wF|6z(bqeeBm+y69J5=co3`9%8*go!qu^6<5F_w!P|)8 zwDBKBD>cQ}{wJNQu-U=Dfoc)joo(s(h3!9!w)L%@GmoA-^VizaV!pvQk5bC!Hcr;s zoOaucz*f53!x4*dV-^xBb?#d)p|uC4ci8nwb(hXP81(d{SIuny$^8nmQEpYbNR9l(xqDyoQXz#%r*2E1z?;bSh+&j5^e}AOCOS09%kW5l`NWJxc%b zA-7U)K23;HzXpZRJ)WaIZ{4*x%iw8B*U_f#GPB^T*DYTAumkZh`kr+M$vz8J}l^N z^+92rx2WIo5nl0Ro+GV6d@4TdpV`T&V=ce;pGVj7Ctd6It_;W$_ASfy{X~>JSo#tz zA=a{Mh$EaatAyseGwfsI zKE81Bq#qNx`o7lf9IS~a%GzYeliO^ZJAW4cyZzkxR}#GT_Re;@XAkhxShqzj|HdAr z2@UQl@&q6a(sVR}XBJnozJ{dMFeI28zoX7|v~04i3DZ4vnhFlR2INDHwT%GzNMPew zoh}m58|O(5u4kRZ2l=i+hPC0d&>Lb?k1=VATrx7rw|RKznkN>ldm6mpmv*(~-mFEu z{hX5_`1YCPyctWX$Nu;=8&v51z0emb%g$Ilm4}D)53P9fihXp6}3BF~yLX5Sq&-{cI0 ztaVk}wgg{iWtXa~sx7%VVr}k_fAhI$;&OToHU!?Tbgs(JkLZ ztKNbo-n$%X_zP&@9sp!=A=e4`^^Q6ew*(fI@U5}O=AK(83*I0QC1h&}EGKmB^W#-EmsF`Lg+Rlw-yeBoLBybky!JbSxSJu@^kVLfFRq)K~~%*R<~@9L_` z>T`ML9COLER0p&F8E z#RoPZnfV2WApTKMfwTO(_DXADCWt#0!~*R;o2*;r+66h-TS{Do!p>Z@05NA7_0`cz zam2>PK4b3E*ouU|%{kJ0XQ@wOPIC*6q{OVPT(2Beb*zm~zpvujpmDWh0NeioncyMc zZEDP-*Nd)=nPe9hZMmq@0)ATgThCeZ>!qkozg}j4=$1=S;ikkJwPS>sH>3yoKRM1r z7jb~WSZQm$g%GcsF!`W9vaIsomH2cK0a=D!jUG>owKdJb`Hfj|mc}B|>Ok=?zB7*E z#i3nn-jtE znPOLM?7}NjtX2bSwPd?7nr-|PgBvS6#V|cEdjVS+G1{t3vcA!^o0lwGI2X(>rt@$95Z}ABJC=d3W0% zTc5Y{>u;^_5e!vH)2ks{OUL9Nnt~o(1~lQFL_T4hN$^4hLw+;mHV6Iu=*R zAnX4*>$n8IHTTXDf17adEQxiG3-pNMi!71X(t->D#1=s@vB@?`9S-Nw#Oc!cb2vWt zPE#n8C+_y-^l7-L4)WNc5Frz?cqc^&X*oqZSPL2Q1R?&J{4IB`;}Fs z2dh?}GY87&=&2p!t_l2-xS-0gJN0q(GC9vQAmv+81ZO#=M&F1x^*l!$IA*wic-VXV zad(LB+BywZ3;n2hJH>-R371b5T#wFHm?3fm4CEa^dekzGNS(XQ5F6>25J_gP3gptj z2+el zK6;ih`&Gv=3VLjI`J7x84*D+ZY8^&59*(S(GTU3qD4^R{W`(M{`nl|`PBFK-2lIGoX--S%M$#__|qD5+>Q6PmKF$)_HF z_Q%on@Jv=|C;xCk{CnuvMKLXRevBJ2zAxasv0|RdMv3xRoc((TMIy0D+wcv#cgvn* zh&0{nj3wUzZ>NxFYx5E=!ON`k#%es>!Dfel<-BWcf0#Emm&%|4ywswxFq9EBpJk*m zYAhX=2wa_E3O15l^X${`(h7LW`RBN0NmSLqQt$iEJ`;sdIU$0jrvl=Z0;+N{J-Uuw z@;V2vfa;Ea9b{nH{}neQmi{hLRWlyd?MrlSM8T@Fv< z?iShqaM^=glG(GEJdMepcsN3?#;tU_Bl(;0NVuI#NG!VsTw^~#cF^lsk2~;EK4n)C z2sJji^pSKM>BY&zPKaR@h7-PEzy_3%U&RX^J9~>1dF4Tgg400~}ycs1(c3;0K+K2Mu_bQ|9R8 z05!h!Bn-85U)Dx$=1PpzLM1$51QqgeA0jq20#{G=5p=IRrOa;$D!`E8YbIQxn{e%% zWBY2F?k5j?6+m7G4C>l-G8x)b zo9XdPNS{n>U|<@2F@R5P`3gaH=FEf|*BYrdfSD;!q5QDf_>Q|x) zKrT|$bg0LLBlglhj_k-aO*LQHc~-crI@)nsk)f#$sGa##6l$}%#E8E6 zGg%s!h`#wWD;$2|XTepBVr6e-F9(pa`C%6rI?A;`gY0t~Z}3ggq>2+Lt=&nPDJ~$l z#O{=GY9yC!MI7_U<~`!0=gX#}=5}1G(0zw^EvX)6{rMd`shIX5R3D<77O!XW)r5AD!gz*RZqnF+q|I&QEpu%F-tisca2CzNPKQ{jhxZ!qUe8X?m=%Zy0mm@buG zTA_wXP@*htCb$-;K?YD(&u&RoEe`hwU5@W!!WoO1)?>J1NfAP!*n&Tj!!b%1d|@U$ z{KU3LBTl2BC(Jt1qDtrCKs1Z4!-SeYt+SSyIMpd#pSde!Z|iVBWv1x^LmrJBjfRD% z84sf-=|Yb`ZVgWvDnzv+In-=m>G=_X+QPZA@es2uiKykmD8`jC7K!rbXpD7S1+ z%<$QUGA<+Lv2@6YWYtA4UGY#nHfYBuM>wLcyB7ckx*WQxc-S~M8UtH{4k@4}h8~1h zNu%b!o5?Z$EXxCqqeJsz@^|~l-T7&#Ln6QC15t_W$uI_6zUbWTU4uzYWbp^olSRd_ z#K1A;L<)Hz6&EOiC8fPGSVpiH#IwKW!vRTZO>1yVMRnNdI*sGAMvy29^w1m}UXw0%3TXUXdinPsot=dH9 z=`;jY-aqC}%-sUX5LyR|y85apR7?DSGeik!{jK`U>m{MLI{gaA|HU_orjpxUViEaO zx)ewoC5!h4RzoJO-{8?{*rfge`Y3`^y^>w$Ylo9798i~1)pt|gLD;%D$_iV|_eVog zQ*fIRJ2DFW%ad!jpArz9wvX6K!rG3_NLO!3?S_FhKql<@I#i)Z=iDIJl2Kvpp-Q-| zu;(e*Lm8iAXf@8HEBZ0X-BgvVNY~{!Ez_QZw>Y&i;uVwsv>?xMX?bX(kAu_9qd`gV8;OnvuF=(C>9P> zlSXr9HXU&mbXABmhMY#&0J|fcsJ5T0)Xl``9hf`L>i{!yEqh(mT`O9&a z>`1u~xV#!^{OE_$LWptBjW->VOJ!ynFdY`8!T9s{;BA;5``#{xOZLHoc7>uwXEq5I zg{?(+uPI}oMC{skNH0VBihe9_9b=OUG3Qvi{pyl$Hw-;2pGyU%X=E92HYJ)Vsgsfq z1dpjkdC(sB9;F2$gYEqg?N%LP#IXaqBVIQn;jT_V{f|$(`|?B z=34hH2ZWVBj)({Q$jJxdMto-|?HVNUzJbJCcCfCd2V)F95nww-UlUWrssA3$-)7** zz@(b8BVQAo{-%fNSJ0`XX)Sus-+OUp%?xUb&KW2M3CLaK| ze5%hOAp1_mpq?3%Ih9g2*T9?}Y1^CCZF3G5AXfL%z6Y9USg;g$EfZ&tE^#-I_CxzG z4J^$iYRK~e;_qCqTd?*s`>*=k82#67m9j}>|r~HKO}GmD7HfTudbM^8z9b} zBeB~HofI%>>tK0SerDB+i z*oqGpd{kZ-^*%elg(nY|SZPo$jb<0VJVi(37qx)tYZ_hQLJH#RewoC&l5IhF2h=Lp zr+iOMJC>(~2OX#|5;OB=PC9(n!OYr>AA!_iFuL)EsKLlnX8qDf!|6UkHi>=cr+3Yt zi`s*f>EGX$MnuR2K6VPmzCRFS{mf|L^d0S|(P$XBxrd_Mv0mYWjniB_= z4S~7PG|muc>#k!$-}Up+3C-W1&QT*%>k~CvDwjCN6{uFT{bNykpY4X7cr1T@lx!Uk z3#7HKf&d^a%7E_Wdys(p9HImQoWN~vqmk#CV5PVb;kncz+@qHBiXV793W3~7AWVVN z{eEv7&KNTHz@vMz=&b9*NL5Y2>MkkmS9lr0YT7^G7rAQKsW-TUfLQ(rkOQml*1?A8 z8~Dx7a2Xp=HD)=172Jglu*xVxMtD$EfZWIjUE zowlAT^3+!WWt?p*OG`W(#!*EHbkPxdz)UcjaQN(Zeu7pM!iuKSQWq7RqQdk*02zd;`V*avMO<7#(& zrMCma;zb0;CmK)$9C6gc#i~b9;PrU4HR^3&9ow4jKuCGC_5j8mX<8nDC9I$gKDLX`Bm{Ks@4m|j841+azlhhv{Q?)qI?V=7I@A*jMnjF!q9kl z3efKy@bAP~JV@f)XA#abkL#>k2+~fkL|)bczxV!HMfgQUvw>gq-AckQN~wq6>^FJm zE0Yi{yEy(Frkq4T%2={oI1GstT2Bgv1XrP9l=&2uk%In2Ak=bu_~(zOz3=uosB$TG z#)IK?T(i5HMwr@1<1beMRu%i7 zDL$g*L@@ZVg14&x!m2&dDEwlD!h){-ISgsT{NwN0ODCOge@}O~J^qgOjIRu@fA;+Y zWK|+t^>Fm_??<``WT&OP&p-b@d*x;Pci%5pqr2_ScY-S^}_i^DLd7j5-+ z`FeH)gwICbtpWtA^+E%1R{=2Etz*Cs_H7KE-eUQkVrElDs$FL^>KwE?yStGMrA_PY zWHx<3KU(+}?Hs9Gzqg0f@DhoW{-&SxOT(QVY*?D-)*qyUJP_;ZkL?I^M0l%RPHEtZ zumLspdr@5C_WD}X#}9ryitk(uhB5Ma4tKG;Y~#dQw8p1`XN$r)NK2?IFR;6nmiLyo za>6~5XP@!5x1b-ngmi=eY-#A|Zf7)wYXpLq40hWO^#%`h+B-;JFhyJdO8GnjAEA5c zJf*x*DKO9n?PYCqa`#6ZhEAJGD;w@}dW|!c2W{42ko(BjMuAk8Hc-#HKuV=R)Gt>A zTUGnwQFe68H%Co#!EEFZ$IO86798UPV=7hQW%B!&PI~=uE2!);;y_UJkCZ(B_WPY} z*zaIVd)rC%fsJAdmmRgJFSlUyNjV~jaG?q1=78HMvfIgRIrl3l;ktu~lm;z0$eXga17FVzHSEsSj}zr;m!b4Menn6IdtN?GLx` z6maixhDRK(Q~%&t_YeXjw+{CDoW%uwK}Q0r+e{_QME(A_-5Ix;AmivXzDy(@Q2QV} zQy+qlq_E79_p$VjXuLRr9716lh}BHl_`C~BdOkDM0;e`PEo?Bjr~X1n zP)oUPn}Jl5vrMc0VpQ44VD&AEhhZ)UkV&7GDxFdD$dd<_ngagL=xR7a;WsW5({qrJ z_O|6Gq`mLwUlLuW#VH?$c>$Ax7*KQ1QJFUQ%QJ3nwOn*5m+ zRBQK1mK9^$Kd#J#*I3G`qZ_A2yZYRyX^=Ws(&&in(9a zBk1-laNIgB9Hu&0>HqZ~?g++Wd~JKGcuVeTDg3zS?1a{$Nyu*!=V<4z$J_ zz@Eao=cM#Wm?jA)ZEgfu$5?SYV>Z9-6e3piDw=<4%;;|zde0xv%2m_UW$cy74>S|+n7R+Kff)5`e&6<=5* zUP33@!WhlYi^aVB6py-`wil17@5G$4%zX(S>YjUhrV%1~VK1<=aF0epIDi33qbH-cMx&<# zS&0_}+gXldj?5w~JF!=6R#*fa3?U)EZ`W&AovL$AU1@X=iN#{N`&8Ag+WXtzx4-BA zt8Xat7OVWfioQi56>j}D&D*kDTaQKvpOL&5Y8E12*ibw&>X+Ix3S(}nC!W=@@W(f8 zcq}x*?X}0k2DknhJQg;Xm3AyV^|(G3HhA!Bek|ZPq(z8013Iix`i#n*t42oU%u8S&#D+-|Wn(3>|Gf zTm{7-%|wqQ{V0@at`e?tz0muLaoRd?b5#W7^0m#>+GH>vOM^nHq`9r-?xAI?#H%1^%E`3VJLp=0ltuGNs-8_P2 z#sW+}v+H|lxe;6BdLp*yx5xckbi`*Bd-Zd}-@SdCcEs$O-TReqdPco{hbKFF?p~kqSt~jlVyMe+aF;zWHX5Pywv;+kEN`V@1Q1~f!l07o+NZ^w^I66=5#H9S) zukJdb@|84tit4y5h6mlk1Yz?;wHuS;oxHuWRm7a;VZ|wS%g%i-yYpqY@4Vn@ba18U zjzt>&)fpgU(<`dB6O2xP>~``Kl{RZ!dhn9LDF<>re(-7(;-s?DbdHiaSMy=T)nqiN zqFZV&{oX7}n>z&t6kM4Dnx;*&gM>W4BdK0h#jDY^*_4z>LC2DbMyyO(Plzl%*m(e4 zx;<7Qy-p$}O($f|^>?Yys=fzr4;8|aopQeQc9^2|-DDl`Jz^bHNJr&~-``5RB?Xbr zc_xJlg}!n5nEb?!Qo&-CyRiFVV%k(YQ+)wbspH_XY1q^2p`>oU`(S5j>z%)FyHHKV zD|T+CZmlzCez}=SW@?&c-bFt&`5ch3sxMM!|IPyhTPpa(vWCc8 zcIEudHIX;_Sm75*-j*FAd8@6DzFo~&XY2Zt)ryu%Tkj3+i~{Ys%5HD{RFbIJ5}3yl z*;4CPINlTq`A?;1cZom&eQP)*535Ok`JuN)Y{PVTv#1R5UU;CKR-YL?h=l&mIzK7?@!8n=%Adp=)E(ma+G#%_c zfz$|d?EuoUTB_A-j17I?%GLg~mBP&Ig#~%XQVoVQ!l{8>n;u_ul+mQNW~k6K@Hmqu zL{Eekcvbe;=#b>A3c4fB_Sv_rAvJ=>ITHReSRP%x*5|pu6->GP!{wgA&CI~*uP4&eOBjo)L>t*ONAXL8rj+{hCxUV8Kj>wg zHD6L#OplgQWinBpcSfwV=2JDEdg?1{o@#&je_*as0#tug8@I(=ES}g5O5%vZUx=RS zbmFX$>diO3sVej2b`+CpByMZ|&ZXK~DqaaLXjOixGV)+skn8&5pDAdG$SVAU3g9;Z=FO;aM)1qDr~uxYqEncI}|RrYS-T#Y~i7sAj7y zN2a$VteP8&iS^|j)%{hArL0@OHt&}O>O`K3ftv8veDCB6*eFf2)|G=*wyAtnclC?u zbt4_OwQno_CGOxiSR?Oy!kZ{jl^h&tph>93QtGZWL@rZTz zjg^CoUA2;pi*waS45%BU$7ocM@e9$2)Wt{H3dKHHw<=}-b^>nn4xtCnW_Wk&M(v*F zVl}DuIlN@kQ+E*#9=q#a|3vK9=X?G8_4Hp^Zrls?p|@^Yf7W*J>6fP2%3pcvpRf1w z#tXG#Q)4DlvDC=xR^QNKn<_(d6|<9(R9TT?uq};On_uO3Y&xJi0pEDb4v=ubx8YDb z<{-{;mGk*!ThyXsDRoKzoM!+ zKFV_3l(nm^_G(oT$ZB@#SgJL5DcvZK>Efi}pykvlzPhyDOJF()IyJRq#pzZfa?6Fv z3Xm;dXcY5S_f(-odzHmEP)I2rFaJ{5<~OUH0-6xD?Q$WF9E=Pv>!!Y_H8HL;1AZ?f zi$79iGsua{{pBn4C(2X0K@C*X?CVycy9RhoORFkv{PN5$R4I8HoiHW_1zSQyL)v!YBLXZ!|tM3Y4!F+`l}9{{HASQ z^=o|yAgV-CmjbXdI(Otu10O=gympSK1S^z1i2=A1?Mob9JkMG5pg>&!%qqVZf?+4S zl2#_@j`T5T{vqO6Mp5sUe^meDXl!0w{V0F(;hg-JRNcI4c~S7E{HFR@s9vMfgj^Eg zlqKJm8fs~bY8~+_^^ddkeS%?Ww0>0vaT^Fp8Jf*qtgCwB!p^hGCt1-u4z3q1t`y{N zL%Ayw4U#py=UHaCj_M%^{T(+;lVsDq=3g>9L0XhG5t=U1{=zO-tJ!i#J%bC)N^wVL zYk-noeE23OneLYsNB|*H0r9VrYIGt!5z^=TUe+&tmeAugP(ocI7V_t@fvejgfi|5> zBZC%?)*@(NW}6G4QZDF=rtLZEcH82n_(79M>W9t_JEMlb_kRCg|8BX^wOd8WRf>EW zT2|mW=`<;|9#zlVdwuMVSt`lx9d$q<+Wg^0J?gLL?R~4ZpMJ95PlGFSUX8I)_+W61 zj+#^sxv37cx_q;Dicf?{`oVwIzsXMVd8NOhU0mBck?r4irISW1-y2*^sD_FYwWibJM7DAX0Xj$ZS0JjJ@=KTT)$v_`%hU`2xuT3&yzx;;Y_YX zY-9tzusJa*;U?C5MFauxDV+hAcW%B}c?y*KQi7nBXH{K8MN^P@MPyHJ#eYlp9VEHvrHZ|g6S>r3Bx^SO)X zaAfOC%lW}D_591zsQ7o`&H#k;>UsHSvT*6rRcwzEfU9kE^Hfi#mUlE+PkLL=M{6_Y zlDy$#%|DCxJQ2d=4Ik(iCYw|+7XsvyqQ|M+)WpzjU(kb9P|LlJ&gm ziP$d>{AvGwxvl$Ul|-BLd|0t@zOd?+?c715X4!0|uRQtH{pL@HZHkgQk($;2#Qj>WzyGc~cV2b(U9Ya*ML~Jhl`FkA%^p}DKzUa6I%IJxwyTwqva67d8d!?L zJ}4NaSGYbAK=Suqe^>vuAIFfzzW-v=xu=IWwsYf;o2S0>zqj7`E2sT++WOSr-*xwk z?y0u!f7tU?k<)T>kbB?wZT)+GS?kt%)b#A=%FbAQ*LLpvv2)dT{=N0iSBMa*RpF%X zI6Up%f9W0f-0`Bj?yNSmI!u;@@2QT6|6dFHA9)oVN&e$k9B_@ zyS2ZpPPaxG)?YE839oxZ(}LH|qS?cXhwCleom1hXt!t&rBJI+Tw@xM2C)Cx4mCv#s zx6+Q+IrWyqA}!@of8i6M6~FbT`*+NRm0Gd>RmIkMeDJHcYY%NcuVyoS<*DCN@20_N zcD9xB3=hNrB-(!7xNV2>umVFs{1Z{(d%taGdWl>;xh0<-Q8`A#%sNh>ekkGuqoM)q z)a78n&etd!pj;QazrR-XSv2v@9IbQkpX>PdUu(3HIw~80@o;Y(N$y^DaD@&bm&uLL zJ@9fPH{mKdr11%5fZr=Akvp%K4vs}+<41SSy}mShDU_z{mE|S9@s+Zn)uNa5Eh-~! z-;pQFpIW~D@=Y?m#*xoFtH(QGfleX7(9=iET%QkfDO@_*aB6kMzE`G6VaONF;$>8s z{<@E9Mrhnc<)f@z=@DpVRqkZqC#!km`TAma0q7CyjI+z!t z3N-fag|RZKY-CX!bW)EldA8X^DrF+-+6Ruh4W80YyA9^kh^WPDAbdfc<=LGtf2#aG zv}#Lc^Ya%?I-?TwE3cBqv%6ykM%xYe^)po8ePKhoF0Xe<*X0X;Cg{5S*&1CxUek5? zw(}JFo3{}>J&^xK$Cmm#{{`Xf`0}~^sh)hk!q>Mva#yucFH-MOui}W#rJ7 zty!IO<$m5lA2Re#*tmHoQl#@vH89`SrH!PAC=Fy~y22CU z&HRNQ?C0Yp_jZFEy3D2pBY$DlE!)V+qvoiw@>4I=th{QG(+CLQ_Jezv%+5Mb>qBAXCxngm;VwJyNwSL=dIUj5aHu^WA@ zlDhW86QQzv@Za}}I@LM*EuW%)wn}rKOeCLQf>)Et-+Zqm4}L`dsV&Fe!&4tQjFS7K zE160(d=ISmUZ6Fuez+Rt(ti4hs!y_%QfI0c_s67N_pWwNW2f|f$)oY!EV-Yf6+p9t z356rt)u6<{_RA@kCs#5?BDonk6TKGE=}>O7pOED1cMj@@ zBs@9ia97{3m*v><)0ES`=!yEk^dOZ6el$~k@Q~i*C2Sg{lza1=aM-ACsyd;n@41Ci zO!av?_eHVlRoZ+6ucA1Hbep51+9I9e`Z=EAogj1MBvGhqytq5jOFMVV=TY#&0Jq6y zHOYAozzgGs9}Ys;!Wy~0~!itG#QWZXL4?dO090OHRhMf z=~Ro>%%}Q=4z5gyj3Bi-vpF>+>XpUNw^2x<3L^oOQ|(ij0+l*@vl+Fg`?8b@5t>}s zk}A~_A6+VPW@SI$B+cRH_#-$aL|r2%R(jBqLMvcR+(0Ru!nRT~hD`Nf1?DSmoqGV4 zC|+Hc*;bPm4892oH?o%_uUauS=XG%>NoG!gmZt6lc&z;JVx@Lo z1diR+ox9XNDfZ)QN=hYr)8u}JrbcP+1du&gqS|rs?D%-Lf05R^SC7%Lj>y8R_TC{3 zDmzc6sUF^gu=3j#^`dH{6syfQyzHQu7Ztx(G7xZ}#W`p#+eBVH-3JzMDrz+q!NQPg z4Z%|1OZjK@QZ<@-l(i}LJYKO&JI}uk9wD=+Tx73jp3va+H$miMrc>5n9nTKSxhMu= z%T^!F-7IJMO{mkVl`ykw@8XIwYO4r&;AC3lPzWZNfVbU*7?5A(U()egKmufL179s` z0>B{C;8U}-@Ab8$xOlO^W-mp>#f#VodnYNfq8Plm${yUAUq>oEC?8eSe9IS9+*j@l zMWIVOFXVI8PS@Im2;n;;lB|3+V}l6Dqs->D!iFMjUw8iM@$upO_T63i*Cm1&Tp?>~ zU;TSm4O4zLA9k_$unTO3X3w+WN?0f^RlDqBu^X$;K&Z?R7Hs&4l=N#E^>pR5gvE*- zP;8)LQa9an@#4io^1f7B@<3xI8CjOu{LSwNaFaml{LPOjp*4T=2a9dRf$-+{$w52+ zttam+?ga(sc(MniCzMx2#>aRZk+FYeH_ei1I^E~rS0?4(C(#4hoFi2_a`U2SPgSi;mc8sXERdDMm&)kkz_YobijxU)75~&Y07DN>U;7o*Ym2 zvtPSo@x@2;@BhkQ`$&08PL5`?Ti`Uf;H8fXTSqkln@D;Ilx%h-^fbag=y|sTgeCQXF@E_O9`}Nrk zabUYn;AV~uu>;#Sz0^-kGc(M@42>`dB0sks(@h;a_3X$CZk-}sK-`selRzfQ!8>?k+FC=N_Bcg)c7 zg3Qk|C$jz2b?m^k{V279$jMUEiJUNSUEA;z{x8T3!_Mo^T}`Y<3Jvi+X@31}?^nT_ z*}+rZKcAf(A$D%OUCEXAmm>B9m8$m`)@gQdjU0C}=kI*}J$JnHE(LN@4))05NsN~C zNTHjGH&&BiZQ`(gnO~gR2DV?u88;b1pxtIr~ z;&ien5W4DA*(pzwOYbk@%ky^>-|>snR3HB%_a066rF8B7?E0k-$F>V57*~XdzgiFcUq~P)h+6ys&6h5?F$|9ex(NLZ@W>ytvCZ9yPE1Go~76I z&t3e$^ZBKE6A?gsuULGAfmgk&`ha=0K*fE$HNLJs3Pn*FCWPb*YliRozL&m4|Dv~) z)O*WfbGp4_@iL*ic4ky-IN6x?lWBS>ic&iY(=ZMeFYOFi&|=(hW^QOGBNzKNo1m_C5krE9$V2>!VfrwCk0-nRp66|^cR9cy1n z-7LLSjQ;8N=%tIWHS$~UW8upSVv+8(MX{n$v@<{CQ6?)H9S{7`BgLdDy;VdwELa(+^_s1TV(A=*3Ym0NYk_2o1bHP7cEy9QvbT$ z6te9K@gBij!G3=0(jIu|?Mr)LSV$~x-DL6m#lVM}1swCr&-AZd|2sZduY#t(zFBAZ z#T#nw*YuK&Sx`MQQc$#2kT)-G#SJp4%1*>B5G6-5oFKSWu;ca*SNV3-t!>}VqwNO= zG>0Gmn}7G2^--)ehjf&$<`RGR@sNhzl3XnA2RmJGd{DcXhX# zUhTRm4v1xkPHdQA;CXm!j4aL!&xm47dK(SZ3KCQeGt6xl>psbiJj<=rcjDB@EGG_Q z*Gep}o|6cUkLWAA?9-9Od!$(HcP=h9SxeQ&UaI~wnIu$C<4jk+E=81uv-1A=L3Bv4 zfy8?pft(`|sfo~Y&0FfHB#&L)uR*0&AG7MKCNWVR9F~On7SCJxflCt-n9Y;pL?7X4 z`tmg!6SrSPLzfjE$DUpJVeP5GE%~nhy(ZrlZOJV5P;_$#Cu0x<9{Vk@*qWi41d$cF zUT8W_mKkp7=85kmw&z;8>p4z}Z^?+lwxeS6E&0$w1GDKNzU+~5QNdU#17{^zldAq$ z{mkN)e(KgkjiYZVgCx}oPxK&#-~HBYq_FK~G1g3!#EI$prt7&z;KaURW^wG`jk06g zcA_9;CxjmVLiC`0_(pD6Zf>MzJ*RO(=b?qx7jA%BH97R!k>z`3Gc>o}+)vsPJ#^%G z@)7;9LBhWCQoRUU#JV{C69bdf;#1@LkSND$2z=1O6$SRJDhG#oV0?7;~vwr1~? zFDRT6YotPo)3EHbz2;a`AEL0UTCmKE?^^l!(iN%Mos+WB9l}d>_+Il$-PkH-qq136 zvxDjrRZeNHBj)#!LM*lN-m;(E!dp3?{pkLzo{yRi7$$i>eQ@Ege-70$J1V0+^&n+G zfFZH1UI>`gVe`Q14Wk|qUEoA}WTmhvTXaaU6Fp~Pubc?B5IMA!ypgP0_0Z~XDjq74 z&#FhX%GDmy$aa&IjR`SnlrP!!=U0AMGCRCp+`I`(si74^Q8^-mum2jwDh&_b(JyEl ztbrn(MbzLU)l7@1EgB(=d~5BQN@J5BUOVidoc@`YZ=;+}QS>=oLt=Hl z5xHiTx*o@|g_!nZ1hnaAi4`NPeWQ&wWyhUsPGtroeJ>ZIRX?Ygn%*iyoKiD--GoPy5EeH@Qv=kqIRt&KTI z@Aq_~^xNUIiL4~g9V3oh$IPK*mO74~WKN!WJ_$LI;hT{gl3{__WLPO)9LM*_!f?#U zG-B`cJiS`qDxCarHd&_msE~@!z&-ck8;mFdFg55_9cWI!-i`Ra_(lb&3lTWXlVBASu zIJp`fkepAw~*$KTiyrdCT#g~n&3$zDOB>{DJ+K1 z4h=C#+YkSxdL6b%zT~brVKMzO-wA@$kD~}p5$!Qd$P+?GBxlGWjmGgq4-LXjTx^Ok z&0HdauG>l09iu{MolbguPRdA7v{{(zPLG0wN7>;XMMUEm_VZmTYNHGi^3l(4BO#qU zA}njUlsq5z9t<{#gN@W2C4X|e^bwRi>Qd}+YW3J3UWVA zLdkO>%hn|i*GAgfp~^_`yxjLaBA5{#anHA+#1ZMsIqJ2OZpWOJn=qt0{gnSxF{I@E z^rSO&*s0*-acAb^gJTSm^OH~8MsgY=PRYB+b%KuJO8SyvL$?6+7K1vl0>?1IH1#=F zqtN6?#W5P;HWx8V(m_3^u}o>KwQEZGD*U3TIdEQ{98dS=yJaHtMACC7X}Txme0zWL zd*69EJjftDKl@Gf+_#85$t%F}i-eYgn=Et8%<&v@3T!8# znh6PP#(v;hF?CJ#oHnHA;#@zE6$>inZIq_tc ziay6O464Ma_aw#yOL;CO2oXL>Kk}0ppr+JLAyDEaDMbshAD!L@ed|h|Dv7b0Vv-;c zT^X5CS5i!Sc93FU`qVa34Cxl*LN?tjbmAl+=I6L3rhee&z6mqMwrToloQAF!ON7v& zFc3GCXIT;yOir8Xd1JAfV&#G^q;*QqIo9wACD8deCi}$l!-F*Y{6E}Ano-aLAzaR< zz=_ZnQ|RJHre%^gMLwKG96z=>-mD~uDgJVN-^Zjkhyp+|4!C+w8%nw|J-5|*x=)=% zqH$FFWI?so(}QGt%&w=nMZz(2h`m_o7paq@R`{_Q;xXgUvZB~` zd^C(S3bG8^X88HzJd3uD&7@|NQgY7to)!ECnWJGMb6E~uL@?dIN=hcc*@Vr7o&JXvfs-iTCzS@J(6g^turwVRsKR!sfzrVYUgo{%zhR;$1 zp%-&l#YE0bENu=iFZ2`ASuE6*D0Kpe7jU-&^ZDQt*d!DO;py3JwQI9kQ>BhHPU*&p zT_%=Y74)WYbo<=!AVbtU`G=3UsrN%qWC_ZZy;)59U71?4wh)CJ1~U#)6Sj(RkGOck zY&YP%!_66>s9=m4{4>pQP1{M3i3Wqa+RY4`$b{F<2^Z|O)%7PDqW00r!9)>&C8a_| z*pT8BQcmT^GR&kkKaVrY__Cta>t~xMDCdy+vbn(h%nr2sqg;|VB>{7Ktj^07`=E$v zjob-eSlS8NFoS#H*S~#x_d;OAm}{mNS~)&Z;AF5gf=nV%$XOBraeNw~Br4*7$?e4E zsKv#`zllu2({0;g?Ou3?MnzCC#SEWZMc8LYUu?)r?&`^2I?1IIW102v<)y0>VX`yw zXu2n`L<>o1TS4q91r8LVs(R@(Ig2!5s?y?0X;KZ>H}K$o`2BC*-u+;4%%V0?p%&sr zC9{bW*zhH(Epa_Eni3Z{lPtBUllPDkF%AIKC^wA=nR6Dj59YP|;UO5Rk^|LJP84O7 zho(8Kfl7R7jc0>`rK(D0)m!1+Ulgky+I;Am%8)H4&)XD!j+{dtY(#o}F;o&!|&C0EPl z0_tR_NiEGdDM!De;56r2c}UN;=-jJqp?bKwinK~tzux=SPJLrjW6<-~&b^Iq`BME> zh4(c9*-dqzQZS5CK3O^%d%vJ~q|BBA8wP%<6*GpNl0*=OrHp+Oq^2k=n>O(6E{g+iXRh$IBsBt5w1+vNhpgX;fp}N z_}oVB@SoF;xw2ZRhs?D|Yv1x%!yV!ds0H2vpoL0S){nOC&@>^5Cj!Vyi}5$?X@_V1 zoPJ#&xZbVewNu640`{R*BnfRewriy~VpodAPT&H#@lKv00b^^-$AUp!ziN$fLLLm1b!gC)7Dc zD4>2j^=a*Kb3;EbI?LK@xpJ>AZd*-Q0Z%DF9LEuq4b`D%d!#`+{!u5vX`6(q?-@xH z=hQ6)$jN|wCJYEWhk&UqUQ*0OGN)4vhbYIwFsL23@b?f0G$XuralJz~QX6i_0aXdW z&T=Y<8z6p^j<}F8?FwU{Sb6P4+dS+pAnLtz)J7X5WaTBp}xk$qi~CR>K4aQbg}H=SvBw= zf&Ygs*1l{5wCI#1jVuX#vLSKKXM{2>EPXdmZO_SL>Y6BVBzK2WD96FTC;ipTNu5Lq zYsWd)YG3ct3Kwzpwj|@E`FB}mS|8z0>pSYJoA4Z-9BQF%ZQSY>(nOAEdvTzfBg=0S zQBhh9#UyO4C=4L*kMrGX ztic`nPoGsY>ed}G8IcAHBy&}InFC%EBaSlPjY!5O3y_)}#1I*QDSMKdODBuaIng@} zAMaI|e=YS&l`K|?AaP2qC!@;W9Z5&Fdp{lP!3GKWPnr{T>j()Txt-b}xT%5bxYz(b zSZ6@j<5adFT|`cWnIs+-0h%Z2^0^hnBn1*zv|{Xo(T1MpG3YF4>8YqF`GSooso^7( z`G5o~PUBhgI$u+>>FPHO()_pn_VzL_;Q`7g2_v{MWwJr&8*-HRFQ;4tDId$IHD}AtK4`^JIc1P(R=e|s*AoCzBa+B@+{~bcyMq1%m03R_f|^%b%aOA zp(5W7La{v}j8Mt>Cz=hAO3qFrZfP2BPLNXkNw!U%c;HcvMQvw2vyF7qcWItj*;`Fq zO5a0OT&jJCW|+tY&g4uLW&**k57ZztwztvH{S8Er+M4u#k@2LV*#k!aRBE57MIc(1 z(TYdL3&p8GW#PS6UCvaB^axkVMnZA<4TBr^Up%!Y@75iJ#Lj5t;`$CgO*bX7YFm^W z2LWlku^Sm=qDyiwN1hv#zw7uUAX0aR(j!*1Io7>$LlcVa1zbFL^ubp~pT=W40rA+c z(`Z|UCO|r3)F5sDbtj2!o4lY@=Tb3720Yeq5C}Y`>rwtdMg?V^Hq{U`HQ=<&S7yr^oW*FQ>=|TDg?t{4fwp#f`YL_Q!fWg z5)%K%CR5$$cS95)4cc7Dn%i}rSBPWleI&`= z>>%5vxdm+(_*-F}kK9~{#D1wVIQZbM`e*;HUi+<69jTd=3Os{6O_DBcDj4h>Y)D|b z^E`3cUpZkHjA;Xqkc8xw(6voc_$U{%!5r*B5UjPQA9}nwr90%&w@-D50d(6U;o^lG ziI|c?1?(?-u);D>zmMDoz{s!M2E#8I+z$WzA8qe;phcXSNWVv_A<{ernS%c>oTJpb z&_j!KZJR1HtYToF!+^*P0bS5WOwJ2NQ+h1Q z{UM@Z%S_L7M-LqvmqbOnan3BL2=V zZZ8o76I6Z30hJQ^{eZQfCYdXku>v@Vl8{@zmD5lxAo13WB4FNuATey;LbB)XXrK6s zq#0SwS~*;kG*hhn>D=GTNi$2M4U+QTH1_e<9nE2ib??M@xjiE04!O}}s3{|#IBCog zoRdcn;;&%MU=iRN$n6LuXrUyfP;CH`wfy+ATFp!;ig9xns?$Oiy*IO`0Q1T`KJ1=?`c6 zxzu`bX)?<#T0)RKtaf{u=-Gq`G#~HYEK-pJ`a3_+Qg!PWwC@lMtwz{vQX%oKx4TaiP+Bc3F~Bnub`u3kH^t`v_`w( zkb|4!AAE9qHwVb+xepqb2drfTvMNbu043%so!G*#1uQY5V~qnQBD*Mvf%&qHI8G>2 zG+b}2!|Wm5e^C>)qD!~;itZvVRngNBv;?4lOIKbzw5itM)q5pQ=#`sihG_o*q!O{!}Oi~p~(VdO1 z<)t*Ov3-MTfJicI$*2O{#dSjId@_=vEgP&niOUvlB9S#!yQXP#Z7D-7zfo7b+04jm(5Cbs|HaY!; zUAj(%WAphR?zm)1P)#ADt{v%Fam_6)50nT44(6h}YwxLCK3Lx)uyuXXxs>Lo;cE@6 zd})-y-SE^79P&1KSAvj)0)SL~no3&d7L| zJ0mLNL2eo=t2Jd?JBKx%)lytqyxm&um1l2p=Qwe#ad-3hAU&Vl!6V!zdOD&v1zA7} zK~7r|`Y_WE+)M#6rv+I+xQC2bFbe45jG}CSaR43*ZA=In`+i~ujrV-Bv$wA??tlE2?G@c2b#@sLIux$ZKF;wdmZWo7M7A>N%RvMH z1qt+kze*kece+Rq)qYxY!Z3WJQu7Kk_HeX^~^Th4_dT%xUFDcD)#W*ZEUL5 z@<6_Fqyn(A2Uu|~$%uo};5&b;UZbs}J_-OT9jJ>Lbpp~H0cVOqOQ8&4DiR57&IJP( z41hQWZRp4y22ItXQ61q@$_UKST7U**R`9jZWBD{t!k}rEu7^YFUNuYHtsZK}N>}ZL zx`E*4Znec%*OBnrU;MY*yAx8-HgocRz}Tf95y%;_iAR;LvN2_pnMs2%vc|zqA}nq@ zdB}YNRZhccSBfadhQ=RWXe=%}VNLHrci>>y{4sgS@|NlEF8G{*w{80T<^rj)5J&97 zl>(_5aZn)rm2chNZ3wgneUqfuF{x@u9J0>nbnW`!J^D2La9uLpeZl^u_jPVNz&s3}B!-`P_#F}uM9^C!07e93pR(_I zW*ey|?_PA&RfU02)o)KC3fzzwQaFf10VKYG-LU#84Jlyb8>KxJM?=A>D8!CBvXeNS@=%tnQbJS9_skJD@$6frP6(e z{N2lUN~5b))E#dnouW(Uwet_vE3kDe8UO(U&OCrrhQLPR9-{|4-cP!{q~QNpwB9k$ zRcPl)@+e^SRv>_6}&I@A8Mrz)+SCvTJ6lJxmC`D(k-gpxRSDsa=5v6 zu|(NskU_4!^&f99WxiG zTOH3G8-M;OJv6Clm<7d3tx~g!ThuMJO8s6fjM=%`8^-M3qn-QhH_i4=_77B^gI=^ZQ2SE21jKj1t}$`f$rNb3IP3` zZL-n~vK|EQFtG&K!J&+b*g7SEjSXiCGK5}y zBs_pQ?Wd^)&f!=9;&(0`5S{k0!v{p?MlBLk3J0wSRw$#X8CNlQ_Oc?qv;k!AQ#1PS z97=^MH^6u;LraC~j4`-}j4j5LifQ(35jKxWTO<5p`FRHR96;6~#dtJuj8lW!6iQNP zB$xQPYnb5PVi}M=69pu%*4(j~0;#F|n(iPAsno}zRH#zNXzp7j*o!?i&coiNYBRqB3G$jXy~G~tna^7v-wNuP>!RkG4&XoTiRuus>orQ6!7T8M+m+Z`Bw9* z)5EbPX*aJQZD_BY{PJGSCtGJ`aCR6DPzgj@=z5cTiAlsIq54)DwMJyTQnnQ005eT9 zF=$zB;_J*3KyqyoZh$(hXSR_9(EEKho+7~=uan^vaa0S!#y(tH`-9o>b7qyWF6vwF>hihLDCI)0m_6$jQDT={Wy`}~Sg2C4Qde^77Dtz$Y`dBlcC*AHTz z81jDXMP5V>vb2+mBY|kHb=(jHW`-1y=W{V2W6qzThF@_kImr$0JKz0ZAc zd#OhSm1AP%QWmQ)&U0Y34IC1HzyK(RaZB5HR2Aqdy;~E~NJtnX$6G+r-O)W6AJ#w{ z2(*DMOT|XH`Wg}CCxL&R(24a*rn$tVFY;6xvldr0Q}*yW2nk1+GV~^cl!WjwXxpSN zIwWTgintv~>h7aMq`r3Fled@DoQTxe01gZEt8IJODxT2XjBKi-1JZs&Ix2%W3J4fg zwv^8iZl@;d+x2LwRL(-VCL8i0%bsDI`FSK-8EtXUL!$2p$Sf!XGTK&JTS@cLXE+R2v#*Y z+>}(&HfLlQ@nMad#CTLG_2?vXdL$n|kYxutq-agR-aGYxWKBiQJ5fK~5b5(Rsod;< zag6$C`@un~-+j;aQXR;xJPqkXLB9!vEj4lucA{nap37G76Wb$zj1M9VX_uW7;h?4t zy~y!BPGV5{>X~iErjIskD%8*`*sDS-`Ms_66w7=nKk>(xo*kr8@`-vbTgRI~q^UVgG3&;fgO3l6F-W>s zK2lF`>zIrlfH9D_t^)^AbVmCY@LPzC&)(&S6(CBzF%O}SV%zBH%m+sPN-JxS|^tN+PAK#Myb>;Z#xKr?B#V%+b z9VGq_Y;h75ox(jSPyxpt$XUUu7I_^uh2*v0CVQ;IJv^B`HPZ7Wo_G4N|}8 zdG)p)&9}wEX|${bY;mRUER-{n{xjnURi1^~vxAhn=hy4`Y#o~hu0XDUKu(uNpG;2Z z1{_O36f~peBqgdvPI*q)lzh%Kf|NwT!c09vzlv;RTOR!^ELX1YEG#cAc6t;`rP|KP zdKgEpPZoUDdU}vxuleiSOE6Bm1eJseA2TwgD1@MchiO4QF!dh}Jw#Fuk`mU!zm4-- zlAnNy1_U_9HuOijwe|FbdhPns6Y7hLXY~**n8ggIMP}ArGkD#0}Yb$ z<#%i^DJj;XZjWA?^Z?;#gp!FQAmD^^O)$F&I}y2n$E4FdjTVVp0MLMC;RQ*Ug`=^L zG+%e$GWJ5?_1*Y|9s(atuUs9;ksmE6T0c2R!t7*wN$6%+>y}{OcoIxbXfZ{eyYwuh zohHT}$->xmfcz(UK$^S-uoBjJpgy~V`|+g z9?1-FYb=Le@f1PEWZT36zD+WHNzXmXSSKfuLXzdwd+$$>Wh6o%B#_Qq;*#MD60ntDfQ}C z)$`dpjUUCq#ptGrg-#%Lj@wJXRiT+dn<6SEq6~)^W*RsX;stYb_`R3 zbxo$3MeG11A22?EJ_ge%%|<4ZJ*07+EL$Jf$?v^KS#)r{$Y&X+e3VC7>*+yK1^;S$ zNoANoY#{Ma<^x(#(}j!FKbLx=C<1yOAQl=c5vc>Tn}$mXI=@BWof-f-Ety0O#%dqh zQC6>A-%(ay?9&$yXLA)>A4jrMU(_ESq*(Otx0hmxEzukzIHpN>hBC}711<%J7GZJ; z9uOoaC}%o!h(}4}gbTn-u)P3zYJyriwq!%o7ptYyL}jfnR@eG%F`83FBa<|1TdaO| zkXo<5yuH+l46^2hpTMZeD59a{lAJL5p?Z|hfNMr}A1*FQvA1zPQlvqR7XfpUv`KWJ zU3fjS%}z1RMlLc-CVR9*X7PK|rn|TF_&TryqRH{~!?6LLCb>a-e2{`K`jL8`TX&ez zbc0sgQq=E&?I7L_Nei<){Ky8mCyD1$H!as8FrA7i&rJOUpGS-;Lax$CALP$zEoNld zNfDC-AyZ_nJ2{Or(%m4!@J_BGL{CNVyXOho@6Q0t*j5Jr1T2_Y(pr6Df z>v=W+_n_L>GuuppX#~`luaAKG^}cgQ8B?>PacV+&?r6^rQtf%)SLwNQwo{JjFgHna&w0we(O|xpI9z!17X` zPPZr4ZyH@6N32q((;ptB)@!#ITt1=6i;n}Hy4%zNJ|1Tg<(nKdcy29PB>RbB<#Y{_ zo_J^uNrXFzz$CxN1j5phw(dJLnOZGf54oyKed4yd)|(JHKSb%6NDAyYYL+@f`|&|~ zUj5zeB42q>AHH$sr0L0ZpKb!4>yO)AE6TLah1}VZpkQO}}$WDr2DOLSUc>WKu^^&up`^ zP@`+JcztwjuJ)#C)dwZY9=qL?xqG$b?k@8wKo$GC06T zDVQg4nML@iNRqUi(6-4Uhz#&IfEl#Gh&Ro#=ChWZ(^ftHGoA* zy_8Bi94L7`v&~p>Ni8jwZ&)oYu6KNnKwDEmcSIjx)y`#{82x0=(?g^?`S=$59O1Qq zh%<;qqIRPA&~+ihcAz{f0^TU6T?32;vZ75cIogevQX)w-Aj=(&(s(4&@57ouxU3T| zR=>B1wRMMPuqs57;yLZ;tj%2Q@}iA5QxmPW$wwvwJvK1HAn8B-xq5GJ9oNzcOPX>> zlRPiMCyC8LOcdTsW15}fVzvVkOX%tldNFD+iO>eH1ct}1NTC176q29TRM&RVmAFQ< z*0?ntm+sO=m>)!k^Q%;xOE#@gvv-8$yEM=Pd2;CnDJ(0TWICkL(w9u6p-3{@Ka7qS zyIK&xN`+bZz{Tc)<@=~#J2_7D@xA8u;iZwfx6X5It+C#?bUe-;9PL5udwg)yf9Mt4 zyXkX}{?}A-$F%m8j;>sSi{1-=#wQp(u4AD zO+LwfDupuRfQ&nZKi&KM;J*CWGq-nN`m}AgsK%oi5|~l=h|sA3jwD_L<|qAE zGVB>ND6)^pO+x-+s&WGstQ!%$utwHd{){dz_oMr>qHu4Y)Gx6sD{AOK$hGVlzFpgB z>L%*j51X<2Hrn!S+D20s%g#;p7xghr-;LT?p{(TAwE9k)<-0UcEMW)`u}Z$GKSn!E z>gDObRhw4PvpquTOzXwb)FO4cenZ>lsJFXnSaFceN2)KM=^tQ_VLmY3UWQ3hpg1rp zLW%o;isw<(L7^7#H=#?m9<|6BnMBx?pg#CUXoHiLqv-;iCEnH16_46}0&7`;AJ#ko3suivp@vZE?TGDtkSqq&4?J+8e2lKBQTZItlu$Nd0=psZ)~x8*}gaHzT66l_#ZF)FVjOA=dv`=B;Y`ii+!p1XMJB0;YN zBbO3a1$Y-_BQ46`eA0iWS%%3BNQZ(3n#9$3vc9}<8@*?Ka(FlcRAT>R?|6DhoroGC z15M&EJDQ})UV{y?cuwN`4@Z_~z> zi_PQOK~{fr>kdu3l;4X_Qg0q^p($UjZqY`Uhg-`<#sj%tL&xOut(reIiT3u|gUxl5 zte!~EeHv%$9M#9!`t^3$vSw_d#W=bA@ug=68TpfsZ!aU8cItqn6xp6lAQI&Hj2H@4 zLOA-U=K>CycD$DBW@N`>H~}(19EG%A&!uZrV2m}D-l0)V_K{)%jzrxvB){)X_X%iK zz{A}gSZ@pMR%z(lilEfwfxYK!&`CN=PA#*$V+@k|(QSrfGLjrWJY7^$%Jo9Js)Td_ z%m4`isxrajt^h;`vKR(kzhX;Dr2(|ZEXExe7$Y6=@6u#*(W|FuUqO1uz93@t7KHWQ zsL7td_O#-i1qAKX(P+2Wvp0}>Fe zD#FMI!O{tVUIVuhv^)cB1$xE;P7)@BSV=V|D(7V6iO2LB1z0G=%}9+}Ef_Zn3jF4i zzEz`?a6iZu(cbJzZDY*`p=g%w)HDihByHEW#7z0P?unTm6rE25bgFPvD-`ubAEx`j zz1nt^L$n-bu1&K32>rT#f?my%`>WSy4>HKW3EFd?2Is6sulQ;{d0={s;v&nNTqPN9 zVfH9QYaY>fQd`~$OI8)?RHlMKm#BF~1Xf=B;Z zvfzPV2^|}Ut4$#}!C*mOA(R-o27sz|IYU#oXt3J*vuo5r7G&-1 z!L|OWcDrzZSP3l&3^Eknm09J}2aivVl+`niZ5K~lJJ=8tUvvM-_A)UwU&IZ85ugU$ z1HHol_c4sDoZvr+sgw}m%?4}-#A6y+03AWaCB?Kj=;+Osrq0N?|2wt(jSe}qj5)cI zJ$MLC2mVzkr{(RG-N=q+dOL&Kw^LD<%l)cC|DEj!^Wk+)$AbxHMYgwF{A1i!d2C>W zq5X04r(2xgV-YhWTL*+!Pj%#@J8a;C%_F^oiMiQ^&n}5_8j6$AOd6h3YP|%|0$Lu@px#n7F43!DGB8cWlA%)w#E2AGz4+gi^ zFSTy}rQ$4NIfz$Z{jm1%(5||+_m=IIIl3xGsA@7Tx|D_Vc5s6|u% zx$!C1PmcXdlS#E~lL;l^s1r@A0}QT2_;>{&+CYjKb1yLKviJKrZIf;Ex z8PL~Ai{bbMEf`(Rp=_m|fb5R}0?PWm?|}c#Z;(hU|Dulw^c$eWg1p{M2`D*Mvjf@Y zBkA|dRrG6*I!L|;uhp|xLh=mwFT)c{;~U5=ydd>u_S^v6_r^D$IpqQxfP!E`9XRREbP=(He4KO! z6<-0F>=cUm^rcVGQEcf)?xuvd{fw|#DsAY;iq0<$5UyOU1z;ST(yTNc#uDxPDx&FQ z4pQyf@0>Z+(EDA8B6-S`k_e23q?2&+kuC!MkeH$v1`hq;!6E`HA63SJ1rrKreG7n_ zdIFmrcwZi%TD4q@J2xlWenv-;gDZ2qSy%AZ9~J86NY3+C5pnnpgCzaYpRZTstPVko z;vb*0&dmu9K`V-9O`5`(87RJVMKj3IrTPnfGoinppU`$9^g-hmtbp7H=eM4~W+cVI z-><{;uioOW%_*!}kt9>h@Y&JzNvW)_OvaWk=@@tme-(*Wykd~XZ|kHJoq?i*CkTJP zA3ByrKYIkM34AxWz!WD?qX2u_bgRfxdIcq@uOTQ97#cBo+qe-u&=kkg_|gE42bOPP zZ%*VBG15kI?bBD0v>vdRfM5KXH#~OpL-qX6ib+8ops4{(C?pv#PyB$^b`jmt;+Q5R z^tmH#52Q;9ZQ;rQpKwN3u82km;IG8AMsIs%*6TT67@(h8tHs@$Q>&NYBz$En+fnwh z<#(;3;hNXBA(VW;70Y}o}!Y3t*^4grLJk0(C z2Pt@&c*Ln3AqhUDw{VOAF zaOY4scB#ir!_2^MXG96LKR9PGZ_?31c1XwVU%fFtS7G$inJz1RuAN~AY5C?x6+A0i z5@e#`2vqa~ddAv9#E^PgNScHDN4~|dlcQ_d^|3s;(&M8IIY_v-pMA8$vU4<4!xHRMAie_%p(#0W!PTdiWu6jv zqDI9*x3x0N6iBtKILky(_&{wSE7R|DAfvkw62UiAeXe* z)?lk&Gf3OXy=N|9ao&;09=o`Nq;EQaskD2J$a2PCPK*(hibVR&W_ZmLDp+FjS~5;g z($QkTWWvz`c1YoAE$8B%)q1OBtVo2biD;=`BspuYI-2fBKoUMUk(`y0bbek}l^y%8 zL1Mr9|2T7E0|g(`l{CYn;0IE_kkAnkAV`{HfLeX>#?eOR&u zf_63SdPXJ*w%=qKrq<$)(@{P;m`j7Pk;Jw)CAK#FAbnreX}56(3NTG-@(@fm5<3V= z(}>-OQ-UerJLSO7pdJJKPb`cSQ|hI;64@xj6ths&?`ByCaApJg4l#2<-*V9wFE|}Z zD`p-`RCiONwqDRnRxwKd>c2R1wx!rJmWqGZ2o9XSAV|6G%#RJo`iza(cD{J=S4Y@`Xo{UPl4WlnOWo!zy(AXX^)(%6 z-!tG`iw>tQ+Ayuc+{{Lw3L+4PAh_-0*LA?1r)48n4Uy4MP<*9?#G#2ePGE}6I!z!p zAn~&{B5|>Hr=@ej|C8kEY)bOY6Gi9cw+zzxzW?RSS=n&|3VUg_f_dY_0%8G^l7Rw< zrV)}ggo;hDG$yAjh%J1J5qfp*lG5dpx@QNY{Y$Iq++MrIb5`?nbd*JHtxJAci@e?E zFf_Vcyl(7Xnu>V-D?fVXG!3chv^`7E6KU_4nq*aiXdgw=KQ&4ND!4dW0k+MgDljxr zph(H5!Wj3k^c#kgCtwnEs z9!b_EEw~wJ#R~?B>VM0b6BW>JJi%x~z-Huhg9)t^VnrF)7(}|!lYlCYD9two6^hPF z^fCj~hQK+lVu!4xdIFoVDJi%8#%r^Xi_5DIOwc<>k!};T{B0yPAz3?{cg@g)biDVc z>SZ`9<^;J0e?G@wf(_#YcI4n>vVFqclr5x?m7HnHr^vV^|1XZoGIJx(208)nFcG)0 z;&#ZJSgznY1|og#!@6fb$xAaxNJ$o4;j{vUmKmGp8)+@CG`nw1uSY zF=>KELb3`ux8%oroTe7-W26ne2mCGhxKyv&`1~CYT$~JN)ab0-3j-XwOrOOIS99vB z^{)yBMzUq4!o)_!(GU~Vi2FNIn+dqXd6MQM7$ zyUw1ru}w6U8X~Y2>8C=dj*u#qhr*%KfGy7OP5?_Tt;;h!Q2?NLK;s6km*g0!W99PV z>1$|P&}H2jyJFo(GVIbByJqM?T0ZaAGp8l?i$Dk@5jaHHoRJsPxjYBpm0&7~EF=Ki zMrcX@4k9~-2O^1|a?qj*Q>tV-O{{n`U1{iyEmv@z?pqZ!byTJ1=aH0L(tVqeTDouZ zv%FxCp5NUm3Oob%AmC93XDDo!khe|tHa05U2o7pQ{ic^B8QCnUZAY%@NMmLXETSAT z(|XTxb9=NwGo<@AE4EH=YVPb^^0H=dBw?5Irp@0nNZpq_?aa9q_(n{bFu>tUq#f4+ zFpdOVsmhIQo7he2V)9VRORWW4fU}fVE%Xb(Uz}2mW;^u+Hse>)_ zD4=juk7hpo11QSyu~0c5PgN1_s5dmPvI7X)>hG)Dzf{#dp@xc;WXmHoD1x@dhb& z<6oXR#q7}YCL|;zqoeVzqB;Y3&5(l>`^o?4%qixOCFa32G>8PUl+GK-J-UJ8 z-lGvxPH3A1eV7Xxc$ZnC-i~L#UD%L#Y7(=)=mB=1;LcaNWEwVW6>3y z+HVRifUT}4u-RGm`OZ;R5=$-B=BJq4PRFX_z0u@aaf)>Y9VFV{`jdLjXLX9jpax+! z5(xwHSAhQ$!?u8%A=8>1FoX8(WaK6&CwSB`A~TTTsE$B5f);F&d0$UpGolThV%mxg zRh=!1F;!eTNhn+z$!T@f*}5?YDff3CtS5d}lp`O+BJT(L5K$*E;q+T|Y3Sfe_iEym zV3%M&g7Zww+Ql)D#MJv@C*ZyVcE}%Fbp~*1+dL@wts%nV>22w_PnTohu=KKsadZOB zt#^b$s(j~@&YUWMj`;Yr1FDTIS2TDWY-s>Yf`Igcpeu+ov^0xJbw^IxX=rgdbIAXQ zEGrnD)bm-5D6N$SW50D&6-(LF>d&_@u=H#GHCJcZJ zjFd++fmCuxJ7E@yIcE z(}0p7ikzVg$#51ihOxz5pV26xtC!k zw}*(i5|p!IFQQ9`>sp~nBnJmEl~x=ic#!co(a#Gri7t0otu~o#9xX;_80;E=2-kaR zv$Ow`8cC|PT3qa-M}e^<*gLz;U&qk|Y*?X5^SJicm2~;$|E`|anVsx-6{w5KXv6?b z1j-R7pDXyAlpND*%W(y(ot7Vj#X0k(GZ*ELiEEM{Dws<31U93~r!~4X>(wu?imEjA z-*NOP1y<+zLGJiZ&Yn9wlB7wr#l)1Z8B|8#U9mVdXwgf@a}+BZoIi_DC^_>s+Oz2s zW5Hd=-BPnSHZS30Eh5`o+=R*sCywx<T7Bbim- z@X(o)!zWY##0btXkSs;($~n0?+T8?RQ!_}AZ6vjVF+zF`s+Spn#RlNWSeryY-kbI6ddP|m-pRz+ z?fiSBFr$%*a7|~B?!Q+GwLkpJXHG6sOhIdgM7YVs-$JT|X;~m^frw|~D?=9s+S0&= zBy-%$t(>z5hi7O;sYwUiv2cf<)3~U!a$WaxvAjBx?5_Tgk<_|ngW(3*>KmJBo)uf+ zZO&*}i*--R3mM*cl_f*M1VjR3k{Bz3&Lwf!hqqEA1>yxG$A!2A(Mg9HYt1~S(MezR ze!W?F$#&I$$C0Jfn>)`B(%~;QSP5rE2f--^tPCeuVmhfWeIOhQ#1;UONK2wFk!}!C zM5!@gz39myAd(J1SwsqGQ)9$qPaR!vR;$#1{8ve}<)7n-P#*t1WAqY2w6Wj))R_w| zBX%g>cMLi);OZhQh6^$eNy`;KFh-<6G>|w3d|Uu32aSNqGBQP>CW4(r!B_)EKmMx( zTm?KYog2h;Jl`!OOtp-pZm5n3O)^$*PmM>4hdT`cXf>%6<+4m>d8}T_hz9Vav-e7p zzy)Bgjc!Ie9x4N)(8DL0U_y#*PjhCP^ccX*qoj%Uj2JV)w&qVjj`GAFTaDfFO12h# zLH|%apxIv3l28JSs|YoYY3M!BB2nLHy+jg+<$t{esX0FF86@}xb|01sRYjmq(SeoR z01_*~uZ9{R7y*yVu@WU{avt4L=mUU?MiT8>c5>zw3UijJ&3f9DKci8;d%)q((PN%zR=RJa=>4} zlfW%$)2uiXq*|XQ7?cixYD(u5au~_B0i6K4SQcp=^o=q|Z3Bxhw8s)iSC~61)$c;9 zZ)z5H9OslSw1II3N%NonTD|qoN;d=RgLa(&Fab)6ibkc`0rmwxJrJ)l|CfgJ+X5iZjAM(~BxS26RaJ0RLYp;WV+6@CS@1#Q^BjB7=!T2F z+yjS9k@u-I>ruhbVO&dRP`I|SEr4!WA_q|1L!k<^hak-JPN*Pw?rm96r{$RVsFDEdKuFQ zjc!`>KMhkW1|L78$p~JyG$#pwLMIbWqnlGUmZ9`K&m}s1AUn7=xkit*8;{+4$II`# z`vrI3d&hluzwDmLi(mGN`zH6?@zT4x%0!D2MZBy;v{PN$#!1D+EgK9sNXy@O%9+!W zc%~-}(dZ|bVkChhC|ybEdPg*xO!>e@ZW=B@YU)ktVj4Sm7o@M6>A{zH9_k5frtRs% zQD61NbK8c}idCH*Dk#wCfPS~LBk3SBl4R!S!3PQW`)A)W4W|Om9|xraTbBqB)eAsp zgLz}q6UMf2d0SBofF%B)45DTv%A=Q%?;B)bZ$x96u~pt(QE-_g-3B5nmYg#ZOxKY# zeELQM4$|%SZmRd~S*eN{g}-!@q-Ah!Q+?)`sDx_(Fp6Aq&)Keci*iah`X z5w~s*gmy*~(0T%!F`n+DsK{2V{Nni=v)-IO62}wayuI1M75*aNtRpGstf1WB_=AM} zcWXH_^9e;rVIOioK5{=J`#>93RhV~Lg zLNZ|eDB;Dw6$IcY)Dzf@@pK6)eA6udqT_~dEpHK7k_Xh^Mv`i0-B`T@5BOpbPDk+Ox};gPmN@3JgJ>i~e>qt9}Rk!Ry*q{Pqg2$@iOgac8*(2zKpkIl2w zy&?5_cfk%?>sdug~=?7js`F@x#NHhMaOKf zp1@`@QAeuKiC1DgktnD~zglZt`TEsSR{din(>-Ie5eEtOKQ`v;S;b7wDseCvlhrE?_SpY~keM+=Ag!JebH% zVwSm!ECf-+8!HfXU!{LvAf;?fX|Ws{b{To7&2JJ<9T!y~Glo<4<;Pj^ z6UUMd#se8IQ5I4OD;}~=#ezLZOpj6bd!VY*H7wcpB3E_>}TX2g?y00qph(4 zRDdO>a)|iD`zYW_fb!V*O|ZYP#3B#GbptHuko@!}J#I6)b+wKz8M^74YnHjeXBd%U zb7A8_2MPC&e&Earmr;;m;NcJ*kPJZJCHWVQViOobiU4se(<_yB@)1?dfkAi;K?;}v ziX<7h*68S3*Lp4qSAssAZz~*C!9QM@X*%8CofD9Sfe1i^r0JxGMg&_o?vxRm z^XKk-zQkwFUD$cko65l+IXnR?J$Zzi0Sx%fC;g?js9`=)4x`!JoeK?kcX8p%)e}vX zXsZQzahK$hs+~dPjz~hcQ+d%Axw!S0symexU;Os@>bF|zH}b!@2weZ0C_sd}}}S6u&6b-lk8W@iwb z9{btB@mwgO{!(0*YUpwy>s*>XFstJ3PgOVTdA-G@k5-q8Lb-YIYrRy{gXuBRS#ZtD zD>a?9D+)5HRGW(D>lG?n4Nl5GJELoLti_eZPW3s<6fSawiu>v{tk?J`yE2_0msI_b z?EVR;d&l!PR}8}5UOb~<7UezSKWYK1KeesC`o3o8FYHz0_3rR&zVJssRItV3X{#Po zT(a0*b<6US&KDO}J<#Hz#kp0tYAm(5dDV@ja=mgejo}v0S~XaQ{}vZl-CS>#>Msjx z)$RSPUgr zpP~tcg|lj6&GJ=$D@4RnSuHMAx%-m{+^zPV0qcuOTT-cp^XHy$a@&TfdOtE;q9 zRy6hJCpK1pAbY1p#n70&+7Q;o_q^^ywK8#5)&=Mk0JPXHn61>KWR$fg6n}XkiTe1c zDUKlRLHfc2A_s1Q^sTTd(@P`l4B9yv8@RELC;JEUzxP%({x43`))RC$NK$Wd@(=lyz=EQS@9ASn>?Zc zI^p9a+ROCE7q{G5T-zzGtr+Fw(Y0s_!s%XCjx%o!bm=9Wyz=4oZRL>j6=QxVIm*cT zN+(fkQj2HZH{Ivlj`k0C9=MtvEG@>)1JQh^e70Cf{af_EfBDXa#>30{(Rr544$|o8 z`a~AEJ+oV1QC-|o7gx;Zv-RXB(aAAk`>JuW{z(gWd8yiWuXw{puac>d9Zlv3)5AkL zsk8>Z^~LJqPIYm`I3GTq%_pV#ppWt8R~05jwN{dvH$L~H!r&8iK-}BQHBAcZoahheDyFfwwk|=Sm7&lna*}i&p9P0 z4`h3s%h}{$COlc(pwD|@zVQEL@6BT*xzal^c2kEn`^VbQ?#hO-cCtx!b@fpdM@D93 zk4B?rvpM8wNVeF`nU%*vZk$yqR%Mnlv%1+MYfW-ybgW@ux=BjATFX1w>HB2!zS$7r zg#^#oSit|pK$g7=*nk%{{Eq>z1+4Ag_l}77B3|TC-DKAcDU6y~5$}ER&hLHiJAU6< zu!1(Rwi9(UUQ}wRmCzjY1vJN;{98=s($0}C$w4adcOJ(B8bm7FP>&o=H#sQ=NjFVax<41ONHvA)# z{C#?|tf|r({h%LjoX+Z!;_5|bJ-C_BUqo(|4_W3Eu(bnQo*v8MM!~@>6k4?h^|3GC z^@G|2%o=R@KuvdGw+B2gf)@QSqTnDv8-|Fr$8jAZ&K zn14tX83_U9WiFs(SULq_yxJz&Y?YT}f5LYl$`N}9bLQSi4UrhOI55TY9{6y-5g@XV zI?#}fz`o_rg*PYt%^eDZwY<=NFjmxOdLguO01nK~V*V}3miUL@k|rgiKjs}PNk&(X z4tt25JJon5IkluPhcg$!U%UOywYBq`OmyP4Z_0__*+_(n%+vEs5Qm|)-2Iu z)@ISfFd?5gw0h7;hl6!ijCV(pR|j0>S*P=6apw58tRUJWye~`53hSH2E6mc2E-yM- zYV0|@36R|WcAXAQ+;m4;waWez6vnABy67Az?ml8 zdin654F~ZlmG%dR!Sm^?rScGF#bEPsR_C)ka95&DES>dknPB#n!|X+aUgV;RMz(0M zc&s!x9VSU*oIE=g=X|aWl6_OQYXilV`HiU9XH<_ zVxOVxPPKd9N*xddE{0j&jfQ>%NIq$RnhWwWu6dP@le^4xut302a6 zk^D&)<>vjzx3_uu>a47u><^90hm9V_ly*N!T(q!cqZ@dhv#q>``-xG>rAlKT1^q^t zG!{k)WJd(#3>VCV^7p)jxyqAdvhw=aZ&)8pc00K`fQ)$p3oqXRV)^ClK{lTq1ZBea z83=0?1hriCDqofey+47DAW?U>+HJU7iIt_?sw9!k4QNqkyPzpV)&krGMO8rw;W{I- zRdmOLXA+HRy?czm0guKT$zEug+fbxCXrG2Ur&i0hIp{$WJO0n_fhI#4sHVm(QTNADvre)@9JSN^NpArSn5-h8- zf8Q-_U!{ie>tX^7qKzC*E-0x(|6$$8^P+OR|K#?@n{WSf3>;hi`g_L-E?cf5t(9UO zs-@N6*?k5jgNeWoaOu`6y2ne`>jvx!gNP#G;>O9|cvWMFY#2ma-qh%mH#t+pYSi}} zr(+$*HBN1yNmpqRheb_6^7Sgol5n&4v4`dO%trDmGc3|ZEo*p|4O~e3K2!1J)kPEQ zc-n!Ps0oFUq*cS(oSA4DINVuef6~-gZyv(~CbKc=hFBPdP4VUXUOj8l*2p_`n_?vQ z!#}wb`{B+WUq-I;PMPb-`4$s$P5xb7$zPQ#S(6X;Bugtx`x~khvtN~Q@CxG%eWhSl zOG`_O;#-&2AtsTqpozFy=b^!1ErCEWUJXdXl8P*dVEFP-+d;H>aw>vsg>AlFVwvq?k z2|Gg7#7Z(X8*9=gWn>I{>N@Ww1iJ{DNNrjiYF2ld6Zik|fDjH_P;z9tw z+YOjb>9)8?X32mla-lXpl>cVdN>Up`R_*nnMkd2KDy+aZ4TU9B7H)1pOjI6XYe^40 zMm5*#3p3#)y*}^9&2m3<$?cH|T@bAoX4cKH+%Tn^@&a^*U+E_`iE|7Qu*N-PH;PXTPzIFgN=FNa>saQv!zYK|D%-vQ` zf0y|Oy$$sy^Y3Qs1AfLS^S>*Ze(b}mN%RcaAaHf1l`Cs;>kgJMImjhL@Bl_3iO;bm z_LjPKl*u`_0)OBB>2IIw^*1)h(hqSDQ0SS*?85$r{Ml7%Ei9g=lQ|fl#oc*)mb9y< zpU2MJaXxu=BZPnKPN|{WF7GfiGIkW z$H{cfmN>Qo&Pnpw;U>Cb7Ribx*4uura2+LUSf=3gbTq>B3U@pxOnS*$%pKXl$jPNI z=m%@3M!ivfHvZ*3Eu$VT+x2wCA5dCQdBaaFohAG0`LG8*Ip##pj@C9;v}1qYQ}FF# zzBl~Fq52mZ>76CpD5rLTRF7c88o>w2f`W%em9rQj(KLlr?$V(8-;_^N=dr@~v1psr zYm4#L9ES`;P^XQ$|6zzPg=JQ@R8vH;0cBoQ*l+6_d=xI%=%w~dAgHONj8v8_H5!wC6#M4|d5$lB(Z4ITHTp6l3wrX>}>li@^f&b@z zuVvbmwyE{i-`RbSkj-`;QkS7Z9dzLXvZDF9z4s^{H`wE;t+^To{XW@i%S1kSh`pGR z%tai9>jUg^tw+0s=OV;kVTvy1j-8&Y3Ll{hA=ec1rB!d|cyPkvDy$pEl?4m+33#vI z$nLJdyKzHn>w$;m%LaQn-!8tqo**=aMPaB^-+LU78|?AanYhdxhPxz=swA@ezeY~R zTx=dDYjiis-E%a4r>uVjo()$L&31xK#GW;R&A5k6lN;vblvEb#Yq{$vsr9R!%N{tY zMw`vp&9_Qa$HUENygAesaJHvJSr(c)h&QlZPeKU{hshBF;q(K{)s|yXh+XNZVn0{p z>w}`N%~yoL#z&;gsvA{SE%`HB2Yi^dv*|jI-Z47=+IpKKtX_VT6VAUgwfNe`uy+Cr zr#sp}z@)aiER8<9pXE$Z__>M74OZE-Sue4uZ(36t=?9;pjO1*oDX#m)@kKI5^*qeo zNZ7qhx0ilYKeklbFtnGj+90KrCuvue5HCo(UTK#$O;>r55raond;0ECz^BsE)M-F| zs_d!j(Q0oE-W7esGHv#?4GM<{L0=uHhFdL<+a zVOj2mnmO^qr^(%$T!zGZu29gXOyPpB6jZtcGB;{twD2T7DopvfOTvM7-S+?Hi{Co8!$eF_PZ@ z8-vZ`c)2CY*H_^2vl$u*@B2z`{3x`cTN&$jr34^O3-D;JNz#w2Y)|!=k+Oh1XP7RD zuRM*xpFas->{V?gzx56F$h^k1%GX42YW0xGcIBsxC{x+ehQ?gQRRD)m#6p9#&9(cG z@@9nV{cQ5-^={A`hNmEr1YzlHe)kZ6)2Q6a#r_0HcC;D{`9bkoPAFNYja6}rvJI{l z6dW~#I~X+gqE;h3)ezt1UwM06#LF?SF&R0;Kl^6>**@v!)(~h_`Eqmemy3$?emvWi zf8DSSnNyU04Rc5_p{h5?9zmjBX)$6MV+Lt#_#m*OR8$#>yJet54o3%=ksaWc0G|+uyYPPiz+}^k0-$h(P>Cad z0MOJT0Pc2>$<}WpPgelgF58KLS3d*l?%h;{zox3f#Wa`H;QP6z+NcIE0TJB3D*SD+ z;tw8tm}85`AL=UC)Zt&8pbi(!n^_e;WgAEo&jQ`&znDF|y|N9e)QsDJz&ii=e|*=s zfn_&+B+2Rkp^lOOryeDnw`}0Q2T7VnR_Y|k(}2Xz$ovc(G?ubY6^wF%G)tBXec{jS03R;yTNkx=|&g}R8{ z%t?J9{?^D$R>*n9>~lq|HuHiIoH?+>5zr-_68JD&7q7d)dRblb+F`;pZ>2EK%kd8BmSJ_W-g-0`#u5C; z$VkV}WOg^<3mfQhg=4O4fM7lRyqbrxtR2Ec4uQJBBhpU5aKNKDp(|$&<~*(+6BRU= z(Ohi7{fym+__Tbgz>}a+LJS*i3aAly^T;^QvQf(I@JGh&P{)o$19_cXCrL3>r2)?t ziV>&ROg#l5999q)VlQh6)0>GE!$<+~VJ+xC zBaJHTv-C-LxH67}D%CI7Z8jx*O?;!g*_7tjnf#RK6G4O-`d}>1!6D>cQK-$fq_d@B zgvH#_iBWKGMv;~hA9C*F@u6wO7N_YJm~rP2u?OJL;52580?JgeJb4Q$>s78nxddP2 zx5tuS)dYif{yjxLJuQN|`FhHEA8SHsZN6CyoLG&@;OD+`lE>-F3x$#B8|oZ6`oaeV z`IAE=0~q(#MoavzPWW75ug_F`q?i`4KF_~tetxFXc0-d?Vf@o@-kErUm#!`X7tMHe zkvvjzq1(T^yp!Ku9^%Q2;mE^ToU%A%0LJrEmj9XTONGC-n7zpx21{!RK3cZdhSP+X zJy%rEmqB;pGSEUZc~LIpZvLcLpi6D9`wF|pi(&fpWq7h~R(8E?Zch#SjyOm~&j*R-3-#64LmJ3&w>m7KCeN~Ps; zt3ubgld*aWH(*7-HHZ6o#lg);(0I2eZ_h`+dDrju9+H6(fG-36cWgM8hd?R!k(>i= zogJWLTgc>wtk`Yj?n9!0q@Cho-?7scGI-eDEE&QS71t;0gPtEy#Uzw&_438H*eN*4 z8(o$x*_2keD>ruo!fCpq`fKmu?&YcvH~iGcz@Z5@!H{`qEX0rq($}b$o+446v!oGo z#$yl{+>S40l0P%_(e6_sII#k_mmN?M_wv$>t}*g|^XWQ2L1CwtRF)ctIpl>3njv43TuE{@t|o== z{3-t793ce+71(7qz$H;E`_)OUDJpX>3wCQzThNo>YYLRF;hW_4s19HDv>NBDwX*(0 zY^HKy2pj;#9`W8AOjJMK@wcC3=#RLDF&EFJ#y6Ofg`GcGf&@x3hRqFtA6Sd* zhDx_zELnC>!ar)@#8TtY-~>&7fGA`@s>lf3bwm`C@VyEX8J@yH1;H2NQ%j9Ua4%qX zP}r*W)Ab0ZMgFz%N$d*P$a$CsT&)lDKM=pM!2MLY!L6}iTMO)(S(FG%B`mmVqosX? z2rGilL4}a^hENPJj2YHzw10_TqO|}z*%-knv{?%(JOCR7t{K?j%o&|jPA{0fB_rq-7kE=&$-l~)s^7wX zyyFpC(@6kDrB;sVX4o>sS^$d*4EEB-@q$$XHL}dYc==rAE_n|2T*FH~ za8FX@rZGog*?nb8dWBf+E#sNLdDm|lK*nw%JzNu^G8PgHBVBZgT(!vFf((qlgWQZw zM3y=D|EA|eZ4bH1oUj==3DU?R4&9$2@s4uKs0*WcRlR%j;nR+t^jP7*OUKwK;UFEvkdh*MGh~`;aoG18PYzcCfcbI&~5k7y-d7XNpWYthhLlR+f4txV7%j2NAE(*s{++SYl9;lX-LYV4)Syf%|y<+0oVZ zPNbp5q;T$Exz)U?UTV})y2k!6x_{kg7#reJbTFzUYVI$~hUyUIFlW3r6L5o#4J4YO zvt8cD$cCdXx{nUyfzg*xZNmi;5}~wJYi59_%2D9>mk%iGEEnH_!nC0rOwTblAvL99 zbyt){Hf)WvJy7OsCVI8ZE%;Y=ow*^~Y`X<_pTrMrCyJ2)6Fv_Sa7Yj< zYdPR}?M?_!qR0ynJm?_gKT0B}V}rYezU6e1yaThu2!84Tvu~*DBcGa*vR#0C7?tgL zog#11?d#hC8O2n{g`}zot?F{uRHa|qtXGxh&74t3`W#FwTH;ZF{feZyC~9D zA{ngJL@Hk#^EMLiwPGYiv=LXEcVL$F|C~CxWk$7Vni1|wi;KPrF*3X4^&X!SBbB;Y z`L%!dpz2}4L-ey8I!ZRA6YAZ9h=X4rHw zlM&LC#F3MCV3t{_6S*!I!=|2HKi=_+N0{Fde=WjZ8i@UaltK~6B}b;ETxwxgbqY-; zY&WKFfa(ZlY!=G|#ZGW)bWps-;YdK>EJgr15DLeMJ#wq>Cwn|opbSqT)517fT5M2n z}x}^?Zc7prvgitw&&`miYa0r7(G?WE(eP=xbfF_L} zoXQ{+Dm|g*1mq(DWyGEZOK*yZ6a0LdH&xsS7_`+ zof{<@3WfZJtgMmK**A-8X^Fm|Nc*_>Nh8yxkQn*FEP(a#|3208$izg|s_J_Goz_k`p%r3u!kY@whYOBc9>LhAmLwg6YvcPjM~m3WEC* zW`qC&B2&9DnV5q!j~aXE4kIu#0i`Xp-*~{m-u% zPdz4mq;PXeXyHQ@%C1*JQ7ts2#dipF9JUosi^a5Z-zlM77iiL0^H57;MUv9J2lq}% zKt}&*a6D{5tI2`2;VQ4`y{0v-fQD>oWxvl?wwX-b`u^(w@#}YeeYb5tj(saY&huvI zbs~r&K=+6u%Wk`Xo`CoQ5ye9`FBn6SGb(`8-tyqo--cxr34w1L<>pOdbluJ28XR%@ zq;KM$IVzj~fI-}_Y*$(tm|IqQ5r?z6qKrJ3$PSC!>8hek-jaFgl=r()7%pZ=+3vGD zJP2XfNTqJK|JuF(`CZ@bh(hp?2O4e+IGn<`nZT#PYgx$WleVlB&w?aL9M20Q!0yEa zT^Zpl>%iH;iaUuv-)UBOIp{Dxmy2Ojw|Vx|qh!k7pBw6`LoxXI6gAUzOP9jJ{gX9IYf#SgQfM_^&rHFW=R zicRLBk<^PxZ5C?0>v`L%{XWQmVvK~K6J+7#G{JPZ7tLeW4ne#gU1hf(gq}Bo1xpt2 zD#Ao&wx(sJNOqlws3Tf(Eq_S|l{UM14n~sF;mtx4i@Ib5g>zuvy3I7R6~(Do9m?u9 zENnsQ21w<7ESU(i{YP0!Z?1!-uyN07yBeTewAngTGCtgqQJlaxPA0JVQ zPBFWtikvCUWW!jft{0ODV-g>z${kvN?|T%7xNNPNc77O-Ugq8+SJ@dXCV`7$3VY|0 z*h@k-`k*3-iTHB3j2Psk)88RMj00_5J|yv80QO2tTqKvcjAP0@VA=Rz-5@3s%5ZPx z^V*D%R+hGKeOq?&wp=>O3pR{Rab{@B8>}U`Opz}-*PWOK;0z7G;+uLarQ6nyw@uG! zk>1Qz!gA0mL)PR&M)ddA(BD~0|AU# z(1KQX-RDcaG$zhfRp~$72tMOI-4qN5@0ZY87$q{#WoqwCwxoOpW z@@ttsz0>sRJGfw9`f1|L)R%oV=fIZFnOj74e+|{`e!9Fw`)RSVhQztaHk;`sEiihy zPkVWb9_`m2k=!D<1>cvM$2R6Tcm`-`0Br9TTN|4E7-(*)?{>ba@9?IjDVu-Oa@5+Q z!SbxnZeQZ63>p*mY_C?>V{IXvPZH&1LuQn>UZn2tt(AMKGDgkfu8yE0Z|$q4KUqkr z`Bs(B$z?@ruJ&86<}%#Z2LwY2ugaPa+*_Ffe1K-*6A|e4)=n(jR<&>WCc4S?5Yr_K zSJ}_^hvJk64McJ~`-9y_ep>d&{L7bCU~-o9-`CW;i(P+3A)$J&t~|{U#V?1r1R5eS@Kn;y65fMDchCn`t^<(D%ZA2F#;4; z@#2d7QnrsaIFIhk^JEq8vA&mJlxlkcTx|Sou_z3+1v2|6w{0rwc|JUBtu%16R#DVM zSJRm;IqeSodE7Q!&wq7ty*LjRE<9uD%WjZZ%@iv5xMGSgdZRdOy`1gN6)(K^MKNv! z5ek^BY%MXAD_w6hcM56KT_JmNN~L+_m~7t^f+|xl8+h1|z%<3ehDXcX5?gXzSFAj< zyDMbmokG5BJibTxHmj}=b+(?b{+qwP>$aZMj+!B&RAI2SI)G%e12;gbk|umW;-D3$ zVFX7smO3x65#ZX1I&mkCku?qp{#vbely`u1_-Dyzegje{(0s{W!IZ9w=Yr~vd4@wE zWG?LvXvDh|$pgbf4|u|2BmqSUA7SPQNvTP4-CGF~P|a;Z_4DW=IQ$Tl2v@Za0S8EF zJJZ3a!4Lc!@;f4MLAMB3^^mf-QTNA9q1@M64G9GU-N~L_=Sug+p)>_xlQZL&=NkvH-W_ed!zwc8a@SJ%p!!`|?JqOM zO=Yzg-v76ldd0NxOJx#P=C!XN$gbaD>cfbejz&en9Yic;1uq?iFCKte2L00OAN~dZ z*r9kG36MrG7V3p|-p+=5*|;&b>xMHnHmU5JAKm-E8TRq~{2?_^{?~Ve@(=%_O8V#j zg@N=In9s|fE#@<8Zxe;pnl@#1LgrsZv$iEw+EVO$Lks3!ZF8IeKl}@&71wp{QfDGgMbo?G6`ZsK*Y(;+3T#`gD2@D92WkJp)I*L^CrA*^(F&s=O}$RbZb$H> zOyMKkj9LNirjgy6&yUI=ThrJ8Mvy7)5bXxAKFyMUoO?{dCte*}@}(8^;Bk+OxrkO1 z2*JzbS_j8mLQ^H|1}ebv2KH6}11|FhUR5b_x%y>s0Dn{wc-68-X_v%A_{nqh7s!J< zbm+&)M-~ZtYUQ2tROa~&tInayz#3cphP>3nO%2Y|0u5nDuG3H+lL>iZ4=%0tV&EIV ziAUH2+6Nrx+vYFqyv;A%5|i|PWs>rRVCpX^z2=z|D!+w!c(>9ju_z5~I{lpJN_FxS z=TKwC+6xPFHrUDK`1jRSdmz`K7`EB3n75g>dEix#{V9`SsR+a)epkJd8|pu{=yrD{!YjMfxtM^X$>g&0+;h`e8=hoIEeX7)~iCfI*tQ`}TZ_Y6?Mk+tL_kR+7 zm}m8#G4!BzV2$7X;hz(U|5R`Od?bE!@Bh5TJ!ERWae9qS|Iv>9)b`)h+dfDAd;eu^ zyC*a5)6doJ{TCUJGqyKo?9BM;hks7*?lrzcH*4j;10`8aWj0GnA2_?o{7J>tx@AUH zmf(z$T!hK1sxxO7-9#i;nSfDdqb&1(>(*VD+0qX1HLTRLQv|ahI;%;UYkfQLBSgR0 zF@n3CPSo-p!23I%Zzo7_ks@wA^bzTZEcEl~L#u(H{BSwPMocJ9=Ru=>h7gN{TQUQl zW?`K`4g<27gt^}%GH^kDBV7r?ta^a3LulfDayCc)P5j{U3H`!hNf^&8_6vUZ42_w! zZczq+{pCH2x!1h1peqPks_c2aK=UPH+z0zy0`0BlIDPX7J(13)MagR;NSj^K6qljQ zGv|rT^^hVu)5e(c-Z1Si)dU>(N*^78ez+7b%fEh8(oBa5%s~A}40r%83)4*^xB> zarMRvSnCuP$i|B%oBb$SuC5z312FI6t3|;sWq&R^$-nuN*FWk8@7$Y8=kmzl(t>;U zC$EFDE4-7}SSJxu9adoY9@O~@76!t~MREQItt?LFhC+reV=AA@{`+kZijlm^0*?ri zpuCxmGbV#MC~%Xg8jn<&X~x!m{(*mO02R7dSUhm zwJEPWp~OoSqjsJpOV*a%J6{X>E1NiqISMZ4pNtvu245B@ae0`}9O4|4AOxe;0g|fH zjPb&(efbDam32(r~elL24`k@Zd>raS>a#V|T_&TPVLsX0hqb>kP zMi3p;y4kCkGD5oLCo!GhB}s}{4%^r3o76-`kImij1jq#R$z#dzL=Rq<)S-lyCwoDY zfcX;Nqzr^whx0>T6p(GNP{p@sF%m9^=nEeT7T2tG#W^lGDQ83c`$&O7xzrWL3DqXj z$8xk2PU=PugJBRp_Y}gXR96;=B_#F8Y0_xn8wOgt3tAh=fO0pn&hgI|Vy&bEIhnCt zB=p!Q!7nTplyWJFbsLTds6;G+WKyg?PV5pF`OD0O#Z%U7cp7qXQ{Xh-Vq3V&rWaYA z#lk8{AWwq}$q`||uV6Q{^Y=5cj`xwm6ZMa-A~GE8KoVsX_%g!!Lce$eE{Nu6vwnXa z&#AQkvZ!7jgkPqEOm9!#1BHlkgwcti4b7$e$k5vMsG)7>BOQoxz4M*N75efSn@IX{ zPL=on2c;Opx0Dz|RtE}Qa?#L3`ylq3hTL8|BB? zC;~VQi&9_}JmM-Z*Nj6iiM^=h zW?wGKY0b@vc0riXol+=9L_@nvz#am6SzyH;b0U3(bcbu)JCuDyR{)l}P|6#U?KatW zMShnpxlX<<@NhWbxI)6HA*B4CA3t~ZHH3aUvOO8CJ{;E`_iH1Kp{& z1d*2Z=?F+>gvkc!<^c8>%fuK4quxlW^iJ~~cahaB-wVG~+^zW+_y=$(KzLeNRjzpS zEq0GU!W4)XEQy@5VK}(zJIaz2jS-#F*JcfZkAN|gaMLA`5mvFG-JEzrAZj3e$x*CDjE5ni!3yrlelrmvm>|~B(139Mp3Jkv|YHp z&xfEYlN+7p!7~@-SZzT$y}(fn1qJTxM-lqvTSRFUg3D@W$NjiDR5Jts7?8mE1aZYJ zUicZ`Aq1(s|JhyQ301f9D-jX4(_mz?# zzb#QT2+xBBlH=n$bX=Oei=s_$Qr~t-UAFK_-nDq1%UWk~Egqj84o)JCUd10Ot~IBf ze*TIWDFVaDd>O97I>M2k3TP{PS+*7-CHAr$;$_>ixV_{gE&`zP2uWtFx5?&QJzIL51TAh1J{+cCYF~I$z(Ql>h&`umv8bJ zEsHpNOd^hyLscW_?1#*|T*xsIsXb+O|G#(rl<|>xBI&f7A$D2E4bsGIM))TL@E07_ zoS<#v&~cId%(lX&?I-QXjch_P4m*C!ZpC>ANCh=5Fr)$kc7}^N1WdsF&(uBq;~js8 zA0_fFWDj=5gUmychBSae$YG{Wd6`twDdosgQjGwxNnG6^Ns#fABqE$kbVED|fY^8# zoP?H8HU;>)xY9CJurQ?}dlR{6HTKY|=l65uGDGdnevXJy)EAN%5)_hQ6&GS*KZ6oV zE3XD~Q*8=XChJ+LT<&|cr~sM$5|`l0XXmb`D|y5ua*^yFuQ*RSup`V^Hg{||3O)2n(cZ*QQWgKOxhsD zkL(E_H4goww(t!dAxkVFUixe}h_xH+I}hOjRHD!38Xuj!?hvDXCi@ks&!k34-6M1t zr#7IqURyggC2tXLP+4b`S)??gbxNyL?XDErI_l1+zU?X2Fn*GbW!DNG5yr~9RTQWoMyhL__w73Go2a90+ic$>EKi<%Hw!i0zg}B%&Afpq zbYQMVzRDY^5Z4>J%p0oEMb5xN{Yht?w#`M?g=WxXrPx*27Gx>O8|1WbBCo1$Xp_wy zYDqJ(D@==FprV*MSP`u^OceobaRT#Y%&)UIWFrlFl#jTK!IT&h$DS8Q`aYU3CB!g_S-1G4~p_t-}^#9o;bAp+Dm$D zCT>kE%k&cql26u0O;2#{Jx$l-#qucgHT<5^zBAKU=-3^GI{jNMIOC2+u41bXCDcTn-J8U1xj|D9!WJd^8|DtmS~aN=`KMeXQZ_#9e!AB9 zppxO0E8g>Ot4er7d9oa&*1jR-XVV!H0a3$ zDmQ}@aHM51{=BTNwp{ue`D;V@lNS>t$u*c~nXb01POrVsppRB-S2g77n5e%$;#m<{ zk~gWEQYrCixG_rT1{w@cb!mY0o;`3(zHG3U6Z-RZ-g%)OmN0p0lQOS5RGcr%(i6UL zV-;a{$*?=>_u%PSZt0`!WkbH4K<7%0_xnd*hi?G%esZjGmt&~&$fcc+*Yz-nSAbiG z1ZBu$tvjy#q2`~+3o;FXD7@5oh*hR*jWn!4T{&1mzI0fcq(u#ugdpNRu4G~aKVBhK zIZO!sRityIeVX)F;NePspt!?uudJ0|y@$M>%*|2woW6s2vABCOS%c;_>EaHQ7tkif zeq=2`1|A;&K-5W3$1BmrDX+w(#UcjnE$+prIxTnUuu_S?^Ee*Rh%%+9T9gmxC33#) zehbkWYON1w6Ex_loD6m0DrfDP-(zg#HRc||-8(2)tjsF1hmJ#z;I~1#^RaUr7fG1S z@>p4#h+#Zp8cKdK+`y$0ZlEz+`%7H*t+LWfP*)Czi0T+Ue=+HwK>E+&==ryf9(wBd zV}~C*dg%CLPd?Fo^vPq#yH6Z?{78}DjVm-y3t7*grBr)tQjhU?bp}LRP-WgA#WR*` zjh@|GJaZ{ET)o>4mEKX5X36OIAivKB8B>@%+l|(efUf!Eu+12ZI(yk~>Z8r7u*)~Y zkzsX(?|(r+MByNWf@y$h89sXa@vk*-Fk#(c8(^(NO@_dd?KTmo3Cm!IHUN8mXIDDh zb+EDPmp6Xp8)7FxA-EgX$}ftI|I5o8zq0FhO9MS+TGVg6s?ZfA6_J|z=)BL?Id=xG zhydy?sz{%e(%frD-(gufe|Sx;nk7?~CHGB`C2@{!G1u$|XjCDSmgyKp$2UHD=ga@$ z|C38zcT041k%iMkHrb{d#tu^Ng-*v#J6?$V)uHXe)zgWC!1IAu5ZcWIxvi0(&yCuN z-3sE48_$=qS_PN-BcakG=^HT%O3GPj`6X+`Cai@OLyyB%3{34tjFunn%sRb^&L5xWi#aKc_U^%NqhHVOcVF`B4-)tN{euR(u2NTQb&X7gQrl|wZ7-DWfL|g>$ zf1wrb#f!`%=HemNx`s{VcACoVW#w+k!?9|H<4us1O~>OILN;G~Tdn|Ev=3rM#ugAhY9|ti?Q4ugVFep=Frvb5nN|>N|DnSCmB|`hArd5Ls6Z z%X?a4tlvA&CpRDM*T`#tXLs((j(z`1gh0;0dY3$vzW+**;+c=Y|5x9`VwB{EZXAV1 z9m3x5<4Z_pHcCFB?+JLW*X7a`J*x7e<$NFUB63sI?H#@)uIqI99+0W)X5RzM;P|6^ zziV3Ei?_3`nfiX(x_luV3zb(*76*A z3l*EWy63^O1{C6JSd=e*yYM97{H+&b6xe1v{}c@UYo~I@L%9a!nuLov@#qN@&OMPp z)}BIO=OhA8(wIykaIc&mK$4U^2XwZhG~75AT$HArb>Zk*5G4(s7nu!)c;ay3Tq)z$ zo=7kLKC3xtZpD@tBW>D%vL*9ub&W?%T0S#3kWb`<_BnUCeQcdfXrKFuv`N{s(rDE& zL)rm9y7%`?jFKf<|Ixj_Z+f?n*ZTw0yZv$pZ$)t6IloHFoU_L+pAh=;UcJB#8P}{7 z*{2t|Af}LN@7G`5VJ7_2^F}6YeENIFr@wD}`Umx_>G@KJwDBsvERR*`wHzn08TL!5 z%OEy?qWfSL+4ziDXtT=&Kk-{ZlY$L9L6u|a^;UO5?OMadOyg==gG%qz#>h*pWN)h6 z_=zs0J0wwl)>qCAF=3L^e)4?u%nK$y`ukJF#~sF6e=wz1p1tCBg-$ZA@1TEn(m(gk zyp77kTiQwb5v6Jx6+Pk~Wsj8X(G?BSQss$Br<5Hn(UF_hco-~Ae9JW~6`Q=Q!&g;K zLgfnCH)~o^mCN$_)mQxc6%LdAMh$Uu7mZKrNFS~tJ)y6a_La4>)&%V=3<@HBxq|R8 zd;Da!3yY%A(Hf~46}1T0|LS``xciD)Cv1CGtL>+uZ@Dp`BU-Iy6Zrpb(@ugE03AO5 zvD|jpb~-^PX}5x=XLmYHH*sAj^70Pcj*b61ZLDJGv>QQqhza`n5DWVkoF!pbB)bZX zEu^h2s#k(Wa^oZ*f<)vU0}2wRhdeOxzv5;+upYGqZyyKsB0MPnj<8ee;mc~pY(Lc; z414fS2-XOHO$p}~;TC0TZx>-vdc?R!_;Dg!lq``3SO)BV(B@)<;6l(NT-kL13}K|W zQUCD-&ZsB^yCy*m@m^P48s4Rk(5y-`X1T33*;cid?$QU(FcV@JYty`H_Z`4m__fcKtWgP*{ zgZBYJVK{^Ejwsi9Xt zqrb|d^y%Ht>hFr!AA0$7`pXL(M^x%(YD-;y3MkZr{uo@C3jS!7 zd>KoI%Kdz8xpNQEFsXtZ!;ezIdh{iwuFLF;B?&_>%8kW!3$`p-?3*B2Fb|V02^G5C zw@jy2ocLewzBm!N$iL}Ei5s<&w22(EiJt+V;rO|jL_f=*j49uEk;@F|!1?M@0>^4J1y(UDo zg9o2RcbUmmDSgXOrj~cA>2WTT-kD!Ow8`D8jKCQ4%))Sp$sup+NP4~Tw(ygySZP}w zf)|O??J#tNp6_JOujhksi10`0#l7ss2l|WsdJ89y#16hF-jaC#d0qj-u(V6VBJfxn zc^y*Dljk*ekqXwLO@_94r^e_{U(i!3++!Lpy@+u{^&)(5^%Yk75Fh4=MSf;_TYh$W zk)NAhJbuJ8V)(b*w*Kzrj5jnqib+~f^S6qV3ms~l35-fQ?SYxvpsYv z;I4g;#h?*aKtTzA)B`3cuC8{H?JY{mlT9yc+m1)lL}X{y#Io|BTnal#S|7Jt?KTq{ z)nJ+YKvPf8Y`;NXWG5PWP&rYv`)f-VhfZeI7OLULy4-0P)G}1qfeC`CxYH=2>Fi09 zKEfE~x|roEC8Kak@hoq3a@p=~IVA>OCwASyahu2{pSl53$HPf6h0kH+IgXq7o`Woy zY1$5xD2n{p@~ss4Fe%GYnnG61J1~o`OLa;VD37la_ytnWBLg&mB>_LK$Ao0xWalh- z7bEbO_r%^7NPCO$ z*99o=DgISrj~sgHsYAa3fM|;A0pJ`0yK)u%KQgN5v&Pf4!F%k}Ldl$iR;ckQ@Y~b+ za@c_WCN5e~=C44D&rw{63l|`8>@$EkB2U@?`L0EV;1@MG2V{=4K7;U&qIj_oPx(05&#@#>=;askiFsizBxo>Jx>?F zj08BNSdKK&?rV%7N69S>@O_2>W;bnUwOK7e;u4kz3_RueSvFMXC3$TQw6+11@ra__ z1hKPGDY)yS!xY?Q!WZLhP`M%#6yGQXq_AS6GUHmFz_{p&JQxLQTMQ_^Ph(ytVzvD1 zuMXt0%iZE%q2nM=C8ZV!2#~(rY9VGgw%V4Jb{xM0^j6|wp%ptoaZM6r74SPw5?Kf_ z4mwUaUqna+u~h^UBPrXsh+fyW{WqqtuzbAtQoCTG*&mIH&UL-EUc^yV$iuBz+=!{12&PS$#cM|wTei({D z3>XS%!iJHZeTv#ZU<|%W;tTZPJdmHU1Z~kjavblA3m+>WrJ*83O4P^A5WsAv3FNms zoxAB5yZ0;C5V_7x?*CjduUVwU1;jsKJLgz4Z!vZJe`OUgL=6@r5FF<6TL3r1>Rd~#={a6U2g`rgXxONSV&a6WOb zvx$>i$OOInYx=y2A~S8H$`-!U6FPY(NoMr@i4!SHy#nXY;v1k8?*lAgNdKKdeDqo%!a-6J#%ggIQ zG#reUPbT5=N&>y>#oId-QA4*O$rcJX+oyj5d}Z9z>f=lv&1KIMPonqqUTwilUcs7g)wmrT|=K zTW0Olpid>xjOZEiE@FQ$5U`6(RXW;S=W^Hi(Q4p$t^8^Bt3Hw?xk;AASg z24NF;Ssk}&+0CF$dGAuskD$+U+AYgRnk-noBCCmcZRP8bbSt+#gEVY2%pfbaKVJam zJ%}}gCcy?Y-!#6XZbXg7wx7!+!nSI5($w{vUdKU(nN|qbr4T;Qu}eAh0;dzTnof*_ zXTY^+!c7|4XaLFAY~jDHa7%NU-B;dla-Zdcm+dVVsqD$3Y|}8UD@i{=Mp34KA1$W| zK|0X6-Gu?FKi~9b_e~|X?dQ4eL;aLEVTfHD+pUgkwVal3JDs@Q?08<>wp=%E!A{uj zAlXppGy}KodI`95kaVncYg{*bpgf7}^e9b6cA#7;pK4=qcj{~>zr7i((QNai_H!Mo zSwo-fDy?ll*Dhu(XvK~fg9}^DcFT{GBnI>hLL9s>X?1{F<3l|ed%!geJwPCa;LD!h z2Ed_Zcec2v?=R0Hn>>B^vi;>k`c#)n`%`CH&&SHr9L>46AJnJ2hTyiJ^AsqR$cG$< zF*1T-_Xd7!yIwnP*~$@K(jtyGS7BwH$yEA#JLI1h+Q8FH4yzXFZd%J>}_S zb8Z;J%r2MIC*D-WbXb=sD}p`e)O<7kPA!dXKgn&F5**6{Oli`LU?z>5VbHPdIBX)! z$%9*Rr`h(c#B*IQ@cowGhP)ic$Q##k$S4tP>9DSd&SH+)&`%J&v|?zZ00}MxFMS^9 z;tksau4(=8d=vWNWJ241RCL)+l9S5X@#wz z<#oKM4Y*COWk;@KwLIN(XXdS25y9Aesk1Oa1gn;veke=zTXz`rSCaXrxO^yAX>I#i z2H*7~-?4qmw~0fy5i(#!b`l0@;Itj==`e7bsULSz$X<4{75EgT=;KI^+b}I|Y42v{ zLs=ibX@_#D^z=iS7ExY_+15vMPIu{0t|7SX=REaoFNL>VyX_>+R%}_2wpu~k@_avy z9Un7~{oHPaA#!*EMz9%Lz@v84Bxoanc_-PTAZ9+44P!X%P&QVX%E*!70DgTi3;`r| zzG*Kp@-m@qKiysslY1pF!fn6Vf;`=Bwwu`LF6P~~u&r@g z6SplOM{Z3oQoTzv=By6hG)AtKeQ4?gLmx_B%`ko%Q2yte@eJBe^_o7F^tN9Ec7zoW zM9m}s>L)gT3^j@yfRl$YGQz{REpGW%Cu&>G4*cCb4?H2UP#g-D2%aHZWb;m0x@K!& z;%H`HEZ5N`^2wDuQ&&k84B-nGP)urfu7SHNkJeIQ!Kh%&c-jeeMl4W)lF(D$2dlhJ-OY z=hPbnKm);TKlhdw$G+WkZCv5nX^=RU4=r1#>3f~F1?5{if}+L-P;@h~ytd!OVo2O} z?9$CWb<-_M1oZ-7X$)r(0LxWyNu6?&AA#Kyb_rClTN3{7*SEcq+_s;2i0_VPhf&(G z19+_i3A`2hP^<@b2T2S}1;fa`w~0wHet4y1i}2ycn8e_)(pIc`~H0q7H(m-D91Ctd!S-yhPQ58(kY zCj;N5PppaBwx3|nOR!I26a{h=a2>3s=fny0H*HwZd|c__@(p_#WP0e~k_ZM-I55~j z1U0)8#%Y>tX@aX7RknxA1DGw97lJ<1mGZwbb;j2>$1t0%L0qRmmJw2Qb5-5E%A0-q z)K4V4?bm?Sf<6W-fE2N~z(>s}j@pqE!7dJco$mrn%nP81k0G@CO~;0H#r15UgxI*$ z!;@ueYoIc@Yz@?oWY(U%80ssUPV?XD^?xhqt|n`MJQ%_82T)U|kQrfxWt<4+RL*Dj z&p>Y5uY!)}Tb2a|-+?Pjr-iUHgrhl$1FcO0ao({Z-C@V$Vh>K=ZbA>_#vLHT#BM8v zd-N6+c@-6XWiBRYcB*AfHW+1ViD@<^thXKsxX&cge2(PuRZ1d9<%bGg=nPp(u`Y4MjrbJ!y z&DIAK>1_MSiaYQn!$kN|D~fH)wOdKkhqFrRK#vMuj7dsD3zsa|QhaR6#D_l%=~&@M zh^zP3cH?_x7ORYY)z2kAjMY*mAzGga;oOI?dLMELO3H>(0c`mAK6h9 zBD<1}(=_oh!LTY?fe(iT*KUV?%WiosA8rdN8PJ?IT-V&KY`imXm*-NBdsUg9Ph?)i zXHw5EET2*+N z1wjZ%lV)JSrw~cBnjIf1@U6_@>9@*rC`LVVrt(c zYDKAs++{!j@jduf<1!Pt;H8n}0|l4dfuP-s6U*u}I|Nym&|Zupr_<^HO1J54iFcl^ zTw1kp%N{h$7<~4YV}y!#M}T&n^LTr;T6x>g3pPgB!mepHq5XviW(UG%%Yn|=g6D_h z`7z9g&B*rQBLEd5(h9VC>Rprka9JcaGTmmH0WAVT##;e2NIvXB z3H<22HnIx32`;4Y6!P1t7la5oCuqvR4`6miT!js|jL?B|uMRmmt8Y+cyK3V$LC2(* z+gme>q)}!;B3&Rg1H)i0_uRK=9t{+>{Y*Apn1CWD1*!>j2T2DWd~nHaw_zZFRS*9{Nl|%B(N9CPZ8o85 z;}k_EA%J3DgHK}`t!+QSfu9CZ3%521Aa)eOj2rm~ldw|Ea1(b)D1<^gwFn=!MQWr@ z9QlC@6s`c+^vFBEr3tQ1VBLI7u=UhdsoTL!!N(3~gjgW)@BBO1Kw;ZYu;V)L+9Hr5 zcwhQW%kp5(fd^)SECQZ~#I7AbZl^xtC}KB^V$V)v*aQL?{sTn0xm)tSeW`jQq1oCP zAe?0cbfNC}(J+2&1*==|QZ^DUB(rcm1Uiv^awCM33Y zf=EZ=?g+Mlzo!%WNDT}nA)Gql_DgtuQL_mi(So7^)?oN>yD7YZtpZPQ4tefORF!M30D8Q8k6`xJI6WmXXLw>z4_)l%lUsDt!+Q!E`s6!)(MQV#A<>;STO(kh^Om- z7o?ro3axe%S7I0w;J_VwF&sexs2!pEfRPX(uy>IEo5pYo|2I|ns78Q;kN%til2>Uv z%WB(xCgFpNsY`7r72(SXo*se8+aaRiEY}ag(j!cp4L42%SA{J|=Ix{nNLRRXg5$@f z{NA$)-LIELH5#spB%X6)dYkR4nV`-7Mi1bH^KHQ!G)GF!Z9h#g&e|=6!cY$O6nLgy zgd?{JGn|hbG3f?9+q2sqxGY?&BEN&|>vW zsFJ3YbV#Mx!4K%}0}G6_6Kw59TT$LCV?IH7ua;`m%pUw?=k;#8#&?>ix9w*vY=k>3vv!*9mF{xW+iAvVcSii+lN+hO9xv;P-Wv> z+%zW$s^yY(TykYN*xU%`RMRsqsnp!|vj@|)jjhv85#dz8r6bPnK$L z`*}lp88>Ys_#WB>==d-xf#tz{lrEW80Hr-nHn<ynMrdJ1phAlp@Vb6ecwl(fwk$aIR`+$gV7+@i6dANNhxOyUN1l}wW4$hA6I}WLkd@BZa7Rt4^c3!_zzP#jP zmhCFP$`9h-r*I}{lC=q#V!zPK z)?LH5pzvbX@Vwr(pFXI#;2;vm$RE|jVc;Ub7+_uqK50V?gBN5gga<$h%%^4u+>i)t zBXNN$LbwBPq)WGCeme6;d55#{`mp>oKNHyN?28lj9sn9)9tNx>pVtxGP4Zj)e206s zNAAUGG`IcSdQh4G!Kax}RB#*jHz>p44wTw%7{e(GM?~biA@(BffN5QBM@!PNn@FHYA1ebRTFq7&ELshJYGfGCM0&6Q(^tOsrt5`>a>X)J?&rH zg&_ezY&H@^;NlM30s=+ z!2>X&STY>BDeS>`nWi>;+F@a8!}%Gp2DrOH-vf=0wI!F?GiGtnIEYikL315bfC*>O z!1!S9BI@mYK4$;nWJ241!c!04nk{7Fv+T%$O}L4;Zx}ReiYSCfSkr<(AEF8oH`amj z9A45Lyaf(a8(~Fo0o&5HKT}nd6iyuKR7{8muBlMixe7ctK11Th$1s?Yy>4DdfcGX) z+4hr+a9U)nX*l=-1_bWbIL86f2aTCe`u700eSmQSBO=|B zuI#0%OKpCQDkfn9#+Rvd1(CJT&YFr>!^suxtEs}i2?8R)jRV7*K?lsoBi@#4r%Yno zFC3inO{9@`f$oU)0tIR_gz*ze?qG+3GQaJ(lnD>|Iyf0%#dt90KpJR5Wat17aI5IN z6_Yhhl{$9S10$CVDn(7fO*9{?!3nsk!G|9wJ)9Q$(VWJcck794|7ne*6jy5tkPiqP zwK2KCUxk2=Gao^s$omDaZ9r_J41$>e3IN0xM2&`Tzb9Ske5tc(W; z=#G2Ha#t-=ou+JGt*~z>Tmkki^fQLiPqBDr$|69=2XfURZQMHYB_fZ2NN*LKOh$wC zr2KcD-wZ+OhyuWEC0UCnIiNDydfJ5S%eVO{}8_I?Uo00JW09Rwjq(EWGXP8(2UFxC^QRLipfJB1qt($Iw|R0fbb z^X4)y!+cVzxfEy^&-L-|=yc}sbRKzWWQvY@ac{jV=FB`t7lErEkX7y*>0T zHw^ljwK^VejIbE^^AY7|K(Qr&%u#9yERKFJMK-DB6SlMTTcbh$3K0>t&)G}MP7I=eP>GO!F?%2&!3z-h2b|Pu z9{^IDf1m>ve4x{EDXu?79EJ6Rq<`YMn$fx}a$^v&212HQwTu{@AS5>=grK@^rv*Py z0Ox~|w=Ym~ZT{I9syNS04j@Xra{wwGd=YL*2U;#91-Onk5ytWE2uX0d0kX`TS|4nV zx|<^;+W;U(Fdlt;6{EQURSG-gFUkY@GK{0+?#eLOSbgpa6$DTpWljDr5*NW^cr_TU z)-9%HfB;(b7Yafk({<1Z*!keZ4y83PhM{_ZH3D(%6su`Ph(!Tg^I-HtUlAJSM%Ej0 z957ZmzNdUGf#wRnuZU5BHaxPCSODp$n{fB(KoQxY@Xi296X8zMgeinl4nS`Xm^3KR zJ$TW29(|1^`!Ia%ECwveH_!KJ-dNE|y@w|fVA#l;tOXbz2Tq#_Y-X^lx6wHpP#{25 zhNcb3>cDb@_lspY4w{dv8r)v2B)u+sPajD}-@TOYkGk;=k^2z}SSbAAkpaal3<7XZ zYX@zz;;&|F^3w?*qr-SI%CakYs1c;IJDs2Hd?{yym#gw9;u>eDgriGk= zMBx;ofX5IYnl8?!W{N5Ipb~bFZnpzOIv^KPytJP&#;3n?S84IslLm_7@VErLJsxwZvgp%l?9h&*(Y=q#lZts@S@796C$;7|+qq7as7*Mr%l3IEIpy~EjwkQyAg2%ahYF6+L4(M1{)vA$*X_eJKU5R8&yt(@ol?<^Km%#zx^ zX|9eFO?;h*@w{GFMKYc)F>^MyER#^S2sW@nIed64;D>8!5Q*Ba4u(CH1aKGIE-Yn= zC64EriChxMk>G~Yhv5h5Z}(qfZM`5qfQ&sfRyF-T2SCYSRP!?5@pUtfoI}{maBqV4 z9KiUrz5`(HQ8*>!YYT}GAg4jy;=-TCgFy~^9M~=)EeJ?!Zs$Az%G2J;U)}Rd7m_}k z>ObQRx+UiARz9V-&SKC<-#bgE-gD=eZ_}--=o$iM(1mX$@i}G~MUwSsh(KiITwNoe zB@|dWb?Yi2uRvPv#)D||+$GxM2UZ7zXTEn4a02|-h2P#Bj4`RtT^05bS_h-&uBHUL z2Pb^2kJVe0Ukj=l@>RL@3Qjw5=tjtZvXY$dt@H=OW`kU!1d`P+x0FjuA@;M;C+&ehA!bnuAgCEF5g&&V=fl{c-WM zhweRF{J93)z_sE}WZ&wZ=#6@W#N1yQuNH6c1@?kcmi8e&jgz=|xgI=Q{r)Ifq2*bW z%1IQDfQ>LH{z3s-cl<+xq0$$6LpjI3@W@k7KHm79-)V3jwg;MJ+Vczh8w(1HTv%-U z?(be)!&=>h)bj)Ir?XhtqwihdwMM7U2ws6Dl=IaK*l=+B8h!6_oNQnbAV{kJ0?JXk zweN8W_IuYLRc;_pm{>0P%KdiD%FX%8t;!m{f?=d>in(|xMagnBkL42n9_wocDt`OtFveU%&pif7>9QaCjZtAz8vPwQ@;GYc! z?)>Id2EI6jf#-Wc;o(2zJe;#mE`aB3)FA)n%#|}{{Hclh6_(7{Z4I(Ip~j;5J1Oz5_QpbKL0p;ORe?g6>p-GGu$GLXWKZ%e6f9Lr zDTL**_?WfWICQLGEXa?63NbDjA3Rv15{z;xyacZvoLJ%QgIbD)L3B@%`o$C0gyLF& zeDj<@apNdj0yW;L>HVS>8B3NsCJRmInO?+5Ks^bKqr+&Zr8pUOFi$uk+2Wb`;&P4^ z{|P<*>eTVnC#<3|R`sl>psIjZs?T#4POwTS6zfjJ=~jsnk>XsOVHj$U$C`fgL$c=O z)T0tcIYd@QUQ98)$O@7G&CiKjP)U(F5Po8?HziRE$7vhjL1b<0bUH}k3$$_AzWmP> zQORfGs7&tpyHk(KX;ukkQz!@K&nlWjq~Nd)P_XXoz!kZ=+scuTbQ7jK%$5 zfbj(;lDMEWO4eZU5kwn};?N;0$T|W*_!*lFp+M(sTYJ$54C!F_jNwf@SSN22vMa$B zRusUgOow>)WDl_gj5rQRQeqWFiu3Lc9OJCHu%56_QKQJhu$GW&zxW~@)@-<_A*^We zj!Z9k<=J{v85NVTLJiA>gu2mE#f5y5szX>;J*Qu3k(q{RY;sXTyA*4~3M)&01QlB` zXvGvt0iq<-m4qk~#f&8jl6haGK$VY&Xc(J8c32jbW-*bK+NugF^N2GvA_Xb2awkYu zT8W~?`JSr|YQ7R@m`&L7^c^c#aqWxBHp~aSTt!ifQ>RN7&b(UPW~(l}YFBe2)mOzB z%LOxGko6+PDD%Z;*6dK9@>!VDiGm_}r7iK|P2QKv2$w{E?ZculTjY$#bJOY<7Qet* zc0;g!!O>^Y5?xVFgr8JFxnWimG23-FLL$>y<>WUMZBbEs9x-`Oy~?N{SSKY**VxR~xnnRL~Px3!1%5nn5-*Cq<9ESQmXpY11axwcqp=aS+%2CL@w3q}u zv!;j~@5uF)q=L~L2OkiiC>(^>7XRTy>JGaHgpp)o#o~mk>sWEFonw@QkD1mFewb;G zrk-IyWdj0fJA!LJ@>aP3`UhaR?brY+1yq(3*lvKc4LOinfQLauhmRc4aD7LVe?(aT zJ~xPbHncn|fB4H&&#?PUXPCOrl%s3MeGNw=`|Mx$gsTm!`a;_`zFjWN|20fG@>2iTo^l%K->y|4@)PInQ0oL|Nd zd+`gu@Cyj-N*W6b^sCQQLX@XTw&fS-xSO{j%MUK6%ipvPbbfPh-YT+THx3+tEA`++ z(m?pf0T_E4E5R@X-=PCF_`=q{Rr!+AY2~Ndf3N62GXu#%pf-wOfboR1Ac#`wBi~Le z?GrGtH}Y;;>rU<##fcAu}K!|bx-aI1C zA{+6=h&=*wv;z#N2vMhq0s`^~651jS)yi{l-fTYzBtzJbdhl(N7XTB{I$rDw zUOW$-f;mqchk{LCRX-rE3C7-YzHNLpm4inJx@~pZ9r#m)%@)A~ASl6Uc@!{<1aOHD zuw4L-5E3-Vb|_CTWg zp2LTZ!GW|0AkEps5_hzrLiB&|G<~A6@c3Zdh}Iy~LiP0VrL@=YEi{hHH_7I(5hvi% z2%a6{{}tX|G!zOIS=z+RC%g_`SZ5aaenC)G&7Nc?N99cWS(E`F=zPI=To^okbQh) zK|$hV1S!Mn;l=nXLB>F&N~Qz=0QYbZ>d+40|KnQ>_rpPO10@ECkXZS1CDCU?NwoSu z{LWNvZ;VN+>`jH$-{7pCan`+DTvzP~2M-d=%X+ZZSZ?G}J#kXSdxY>D`0{N1ROT2f-+t@pp{I^NcKETQ zhmJq?J7Qh`tO`V-Lc>8Ke-82$0dee>c6iadWu;33_-N_Wx)FurfVk7lMxi*?ZhHpl==&oLpyPsQ{S~G4 zb<_mB@IZ7wNnrnv9yx-612R-ArhvI zZq>*6p9adA4#Of^-c?#I?nf`Ea2@$Eo&74%_?pPN;J_OfC^o>`i-3{ixIVJH`mqDB zAZXVB2t;_zLB|I&P^*p1%|H;bkjEXa2P&RR1!rQo?|-?7evGhDMuoceS~tO#074eP zn>I(!WnawKRdo->Nr+4G4Eygjb^nQ4rMh~S?ADaZzl-}L__F>I-6AhlS)ocQ8Lh8*3 znhZcy0ceT-X-80b0NV~(1MM(H7Ht=qmOCy0GsC6>B}WL9s1Wc?mNR*)UHZxlTkYWq zTP@s-fk}r0Z#eiZoGdf!x%bsQSFT>#dLA!qP7P#L!>2w zO^M~5NC9Wv1ZHU)NXAjijsdEIyiy+FmIv{~tvUKH|GOEs=9eaHO_B}VX(Y{?w=N1ljz7pH8>GVaf$`pUMv zy_u}vj|42nhtE98cX=z89cn9!aLOJ8;B%|hgu>rKA~zp+i*6K0@OOlum7(Z_MlzbgNhiv#PF^VR!S~_0J=g1kaqu5 zFAIFPoe_7w4{^oc10)mU^-yfBGcV9Z?{zt3s_VpFdbQK|YM*iQh|k_+pUo-BO?>7% zHwVKNfX#l3W8tmhW_XGIu?dRy)eRup!@q(uBNb{`-NCOsh+}m=3l_XZeC{BU+xX4 zu4DE0o96zj*W3@-Ew}OXQ(uGckFrM^&_VQ~*>1FND(AT}N>f-z1h7@)>U5gODFW~X zpfW&X3~ZdpbHFhIWNdaixKkv}7+GWksG7qjiXtHqKrsO~8%$&!`B1MApbVjacC zI<#?>x0ReLM#AeXpa)B`5v0P*uUj3_EGk&NXuHEJhs)FmAB z^wQiWXRB>`gEfg%yv5*221;LFd{b{C=VTbFw@uG!I&MBJ6=iZ5D}xA-Z5l+Pzqf|| z&RY5(_sZ9kJ7H`r zW0_YO%Mjm~lTixyv|^s8@JZc0%~(xglQVACGH+D&tnyRqrpgb$KO4(ao#l##PvLkS zBwR_74!|5kBsBEF^;{R(76=|1*AiSwkYUqBiUnL>yugW(V+Sc0@MoK{@}%u(GROND ze=-BdE1xw*+jEXr5+&{o^ZPE=W|jG!CHdqW{d2eZAhoZ;2aD!8m0b@u{W(kACM?k) z0ADW7U&a;E$i{s5L` zU~#KL+?`>V-zJ7>;yRzAa7b;~X==kK!TDbLX%YshFZ*f)&n*kKw}|Tg8md2e;_OSr zm=`O{ONj1_Ynxuu+M}2Iw3oN&(SGd_U8X>+RyJqi?mLXZo3`<`V)0wyL$fjY`T_W~ z*gW+2NctUEVH2q45Rd}|9;R*+iC@}&irlj;*R}B$k%(#PS^&^(IZz%V-HMBJb6(_5 zmWu!Nu^HI>lT+CIICv%jVn2BW<*{eTe?&hUR9 z6658y-+DDyL417xhYNDWsQJLXmASwNXgZ8Stdf;leYZkWJdqjzcB-&-#3NPGgHwp(XB*^+GvYf-^w1HrsVzUW#VUk znwYqeiOt4ii904|$s%@5)d`!~wyp*yUDaNeEr>^Ila0-m)-sLQav=sNKW%1qI|m&v zY{vV?;)2H^pPC*#d&B>$?asK{iz6 zgGG#BD?}<$57=61tL=9tGXKpld~*io|5Taz!y#Y=xdpjVeZ&;t!0YUi!!H6&0RT!a z15^T8ii06iDhhw!+>93Ig8mIzR1nj>399BnSvBng+e$$hfGb8E{v{3@E?%|F?H-F?LnwnVBKbrhVu`rK+kb9flIe;F;O? z3m8{GNJyKehM2S!MMwLxwtdQ(bB1#nGpZtCXaK2Cn4yLdZ>@b@d#`;PkIl41LdHIO?X}nK|Nejd*JyaL0q*%rv6(Sy zut725LfRUIBk{{GUF3hE_NPh*Az{Dsg?@io&~HmeKpq-jz;exPC3B$}n6j%07iwCL zujk)#Cj1+1@LFM5t*1*rJI{YMw_OdtybB8w%FrrBww8yvCHBowsGa&nq(_6@Q)+B} zq3>T@SG)Y(jN$JF&}|+q^W>ZV_iQKYnT6Jwl8q*y;L?fbPR1P+=VcKF-Vmjlya@tR zgWfsL?j)75;Usw#Y!5m!KC2cTP5O_bzCl{wT> z_EEaqK^+W~fJbFpWC8c&YDoT-zi9x;kG6qiS|KK$;Y~o~SD6aFfXJKB`Gom#wwZoh z1kSlOgtfW!4V1edbeO5YL&73BY@zIE+}RxMEMN^c4-fnODJ7=d0DG~@q(E8Z5kW#LGmKnu49&d_6*^Oh$ zkZq=LVoM{y->Xu~?z6VmLdy);#!(QJjM1EWS9vQ--Exo zi40;IBoQW+L;du!;1nQqrtuWY}Mq7`rJ31JSNW%#AY!c$^$7}ABs)Ji2 z{8lByQcTH_ed2p?%_6$zqcA!0z^JZcm>!Jzit5@Xb>>1cVZ;bImZiaItNK29=!FL0 zY$eAfj7raremVP(rNr@dmvQ$$zcYsdfNq!P7-e36Fb`!{8e+!oK3gfE68TgEW3Ljnlls;P!KEuR?17{rS z!z$R|mue3%s~rPibG}u%ARG%jBxYe8V?vG`2+BU?Ysj(E8>Jbj$IbMgJ7iYSVG>={ zH6%_!{a+n!2{OW1)j)w_6S1lm0T;ui!ctJV1uV)`;co29uH`zOfg*?1c^#(T7&l;6 z%QG|@a5OYTQKM{0)asjY!|)pMN`%;#n83$!X+<5yMD?8T)X#w)eBrr|IxGoB zefj&vVANAAv{T?@e<9~MFUJ9;Z^G`(0zWW{xhIJY^u$mdk{Hg}`E}iXSs*Gc{ zhs8JpQ$a@|o@h=~JsT}7Gl*NUL7Yu33_E3kSK+W%;_<_1Ew98ovLZ{8aMTP+O2RQ) zg2?+(67Xn~Yoy&Uz&p0LB;y=|=vEz?*C`|Ewmgt|$Vm1r`Af-!vmmh>@u!z4Bk6|{ zUp&JaS(WI9X`uLpVG%R1X~rZ&Q8b#x5M~clzaY9J1vK=)Mqq(0nZE2Jzl4N_wnk*F zT2@`Z^%onEzfnp497S|{<8C~$M5BH!;gP8))S3mz671|i$kka|w0Oxn)R5i@ zdVS=`9(RU=PJCLM@$elGux*&Kj$$>I??|$tORi!2o+_&n+{2LvMwZ}64gyz@3`Vwm z9oj+<^=u?rLkrwIt5cw@|NMV7AYdg&z{zcVnHG5UN6vASKaW*HT>x%I9hjyC390wb zB7(Y*FmaXyKIY)!GakJ&qdDdIWEChBIh`DXUh-IPEeSKO?xg55l8$|S2m)y|mdnZb zleeSynB(96Q#5}Z*@QBAwKtg%zsxgID6#m=cQEQAS>uu}6mb_-FjFS*(D-bz01@p# z@ov`mYQq6372d`kk_t9kYzB+_axzf$Hu11Xp}4Rm!WCjL`F^tI`E%V8AwLL3nB<7m z$S`*>{vOLPqPH?a%nqnBkB=#FrhhA+I|q)T$)p3VU9wiGmX24+g;jwXs^l(bM4V&+ zYGfRgp$tsLlYEnyNU&jBzKzf_c2pEQ6-trQ|N1d=~YiG-7`{uc@)?`a5Rf>gT$k|l`|$u_W$e#Z5bi=<5ujg&M^s7Pw&1tVlk~8r@JIwG*WF;O>k{DntkT+VG2(OxH&Y zyA{A0+LjR+qZlZ{Xu`xT(=2O-hKwParJ247*F3|mc8*@(_+bO2ey|j&u>b)akCD4( zkmSnF8En7s!Y#|Abe*_e4@@@*bWgSg-BP?ba zpMx_rLCSX|cpsorkdtr|#vfu=?J-q&^lqT^?m38Ww{%srsN<3qsFvqA$cBQdi5koj z4g`DRxWv|F%SAEy0O68I7G;_!(`z`2S#6+Lf9{VO@PvH)QNmW2v-wWG@Zirh8`lZ` z^+Nl$SlX}0!yCjks{MyTRmvWN;)}&&yN4jR4Yf7FR>5pJ41FNM(1fnV;xaIEUv}m8 zF=#~Eqh`w8oe0E%>S?gac%G)ox~;n;&=CV@yHa5Lj_T8VP_iad4X_XMtOP4As>LG7 zF#J4`jUN@KLi-l0CQ~SIvHr(THUPi;eTJUpYz%5-rVVx8U3a5P?SzTyf>qh#nujWk zq^3+!XUnyYw0NPf0}B&Q^ZhadO8OhijZ1%9NPkmlPG2E36cvDT>1!;Vu<$h|%3NY* z5`M-l321f~)-kQ4$<4V&3wR*X0ygR(qY&KDMy3SD)zjo+wa3Lx7OfCRbPpaOV_Hon zDk;OJ1knUFWO@UyKSk*nT6%Ce^2bbpNQD)I3PDT>dT^4UM{GHzy5~{e(;E%P&%VCy zjKxy zO~5ZxkE%KD2z>Pq7lYB_y`9B_YlnV^^g*ah8}Suqb?v?=?aRTHwL^>FYeJU-a?XD2 zV&(%;-{s`}AtUdSh1vUbetjFiLxQhdv+PdHp5!T?EpzIh%MM}~1e!UGu&9#0-*Gnp z3ai6)I0tneIr3ZI>Y!NAnB7JYhzQ*jN-gbWP>>x|#KFzPP!UmzQougkr#vM957%u8 zpwGhBa{ zcDw`@PO%{uPXQBe>Q{>chA=Wbl?lSFL@8ieXpM^6QB*jqGdICrl7?D`JR|2$U>zfu z0vA4!o($PqcTqeChC+BtqJ)l2P;v)R;0U-f0wiiuOlTWC)i6y(2ho~{%(Cnn+u=up z1~hv(N3#*7cE|8*n6T`7{UNe-gg-A=KFv|@N0p63N{+oM(^P5P^2G$q*n5&hgnjCAEPgy14YngMevg*jU`CF)t@thG>-bi@*c2pL-l5jLE1BNs`QFcFHc*H_ z(E_~1oJ!c7WA6rPGi#DE|AjZgy-qgb5)CSa)A6YHOgEnDYiGUbcrsk=(k*-K!Wid^ zrp}1hMv7m%C&{>i|~4X6;REZ zA~mxY)*iEOX#&Fs>%7P?d@A!2dNa0P(0BsD|>Wg79<|X?IzJgi4 z25=bma4ci>)AMh~%p_b*a1pEv<0Ef8hB%J?#*gC$F_^~Sic-i_o~`KN)VEPmc2v{B zd{qa(O&6!8gN4csTPj%&!EBO6p{HYxt- zBI}}R+aqokt-Xl1#6xPs#W?m?b+Q@{Fx=XT@hPA4_}Iy*7@vAW#wR=j?3#6%N2@)` zq<4VFm25bN(ZWUG`0Pr;XG6rRc-)d^(G-wz(~_jQ?ePHRQQ3ht&HWB{odJS^p$HyM2a{$%KD$eRba}3 zWvebS4F#G6oR>^wB*!JkAg)PdBtuj+4}SA*fMW0n8Fa0H1`}55tB>FEtp=$6dnKqI zt7H6bMs>0*{I%qmCzxJ+1rA|7u7+EEUHbn6>zukvfa+O=6@9#`h|a+!RQeo!a3jk- z%Z{o75)ZUFCVLJIZyZHbVqrCv%v!DKO+~`p(gL}vuA^|bsoTIn7kSof+jLabM|p2q zN0tQ1(}=1Vj)bb-HcC~(gePgR_#u8sMQEl`4TiVgO+(EF!>R%DU%1i$$nVPm zIrS_^y_3TN#7JsA821q)?n9BBNeYw5t>^f+LI985Dg}iWhO4l{!A~Yu-~K5@t6avJ zbI~osaeMvVWP`St=QC8CT62z)F@3PWKRE49{i9^U9^J}6N)mL?*S^F*OG8`f!`t|W zr^nOLI@w@--p)Td#nLber92Ke!dbpowwkBDGwrSS*gQ+yynYx{W-~5ra{9r{mjBR49pa|%28SMGG+0vVg2+hjPV3r zb2%pga(I}YE4z{!7#?C`T%_jFbk}rItiVHzB#Oy+iXJ#Fa{8dcfus;qfx9?dR}|!% ztd>U){%QjlJ0O5DmaPLe*FK@h#r_puz!Tisq|;;%c*qLx*5k?1B)F0_;v7uits8di zOp-`u*?gVKVq0GeW0>x}_i=cTF*lP;>uo`sdhn=A+6rB3VV*5Xg?9jBGp->Lp#xa{ z#SDG4+NBbLIK}!;cTP0%?BSp7&*--hkQS{|hjqj3|04oJEzF(`UAVHb6Uq6hp%5SO z!?=;zfkSiO=qhezwhAvx6j;(!T;)(s&opHfrVEuQRv`O6^jj#viYj{uIyP%4WaC5w z3c0hCLg4OFKAg$!d9vtW-4Ic*$HKdO@VLQfD z&ZM*4b7awEYZ_8RW||xk+?^o;8oxkSgZiOPQ1xcauXQuE?oOz{lmgh~R3wJd6xX&D z+p!(^t>~79A~qh?T$uRTLl!vr8k;CcDJcO8jj4`lS;RN1GsPc&?qCBdkV>gwj7$Vw z)E5gz1X{j)@J)mS#5W0PiDxsp4~0}!+2q#xv3#k%$!+yb zZm)0hGxbe=w!X=i>zn*seG^~MLp%~c@CWCJ)5{P zaU_DggMmha`k`>~6*q8v$w6*>o%VkQEfyAP}kILYE*b z7HC!VQ5Vq(Bm?<=p;f5%)jIy?U%pO?1UmfzVtWvXhP>FgUehoio+2-2ryMuW(d3<_ zG#S6ZQRUg>OGT2*K5I;mXEUP@sWJOY1ub64y!d~U65|CfY+wx~3b(be92_P7?k-Sb zX6M_I;m0Lp7_UGLA;OKuMR;{NmY4?FuZ+liDcL1)l7CChs` z3Qm@$hIDPDad2G?#zPxgMMXyGy?|)QQl)ryfd3Saz|3gjk>wG?HMGD&4l6KQ*$gD2 zXw}O1?Z0Y3x_K9LjvxyrM7E5HOv~>`Tj~ufJ5^KW8M5y5rw$DtWJFZmIw3CFcA=&% zOq67;5zU9H(E`D~`!GF8Q{-p&fdSDthXW=v7aAwjO&>259&bLtMpH@s?=b4mpiR7YgM_NaTWAngrr9(lwaAZ8=ET z5XhFLYYzCe<`dheWpZpJX@UqX`!ytg?K=%fUT)5<9p8tQdAv&$&&p|)^6S&l$6l+X z^tjbKawiNHd&C(GoMW8_P(<9H2rs8R1E&Ny7x%IiV!p#>$&B;!@uL|N??e+XIFwr8litDPf>#Go~k=$Lkg207p z2}zhp;KBp~Cr%soa@Qty0CS+~YDf~V8>nvsb6}0}LPt?+m_6piJB~#J+@%M`Sy{dCYq8~646)w}>CDfg6 zd`ohzSR0OL?@Ni6>7x*q9Hmwp3e*a8XsYTA2RFzidFHPp3r6j#__X zIAEEO;-GHlI2j{9S#ss=l4l@zKxK@yRAB-{nka*61n~z9`{6~U`^;(|=1m${4pA6R z!-y2`t|3Jo@e}f%?WdA^qwny7`b;Y5xGF~(DZHXYZ1GKprbD^7HtMaz(~zb8V5#6n ze?RxhK@9%TLBHSe`p$TK|6*>4OHrzja0wP^;&^B2C>hY2*TYevdDH-L?qe*({fpAF zEG?^x_`rnKOuBz@x(>dl=r24+GoSY)Zh{uQl0)clh_Iy91m~&!j8a=9BM=7g79;&15-*6K9-c zrc(NDNvn-`%w_@{udg|iW3zpn!X`&NHENq>k!hs7i;VK-<^vgHSLx)rETKtKw+NV8 zVBL;3ieq?cRyhn0-VQL>JBF?A1ca7a4U-H;NDU)tFdTQ9Nux76R2wBb-kep`=#_}% zDyD2Hwyr{*1OuoJa|{fmD7mP+suai&Wl*Eac`(53K&(e!t*N| z|MX}*E8H48aLS|M?{LpUD%GI(%w&qI>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description, - secondary_hosts, - available_authorizations, - header_snippets, - tos_version, - badges_enabled, - send_welcome_notification, - users_registration_mode, - time_zone - FROM source - WHERE host = '' - -- Assumption: There is only one organization, so we select the first available host - LIMIT 1 -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/intermediate/proposals/int_proposals.sql b/projects/test_lyon/target/run/demo/models/intermediate/proposals/int_proposals.sql deleted file mode 100644 index 8fd1dafb..00000000 --- a/projects/test_lyon/target/run/demo/models/intermediate/proposals/int_proposals.sql +++ /dev/null @@ -1,37 +0,0 @@ - - - - - create table "test_lyon"."prod"."int_proposals__dbt_tmp" - - - as - - ( - - -SELECT - decidim_proposals.id, - decidim_proposals.title, - decidim_proposals.body, - decidim_proposals.resource_type, - decidim_proposals.decidim_component_id, - decidim_proposals.decidim_scope_id, - decidim_proposals.created_at, - decidim_proposals.published_at, - COALESCE(NULLIF(decidim_proposals.state, NULL), 'Pas d''état') AS state, - (CASE - WHEN decidim_proposals.state = 'evaluating' THEN 'En cours d''évaluation' - WHEN decidim_proposals.state = 'rejected' THEN 'Rejetée' - WHEN decidim_proposals.state = 'accepted' THEN 'Acceptée' - WHEN decidim_proposals.state IS NULL THEN 'Pas d''état' - ELSE decidim_proposals.state - END - ) AS translated_state, - decidim_proposals.comments_count, - decidim_proposals.endorsements_count, - COALESCE(NULLIF(decidim_proposals.address,''),'Pas d''adresse') AS address -FROM "test_lyon"."prod"."stg_decidim_proposals" AS decidim_proposals -WHERE published_at IS NOT NULL - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/intermediate/scopes/int_scopes.sql b/projects/test_lyon/target/run/demo/models/intermediate/scopes/int_scopes.sql deleted file mode 100644 index 10cc4ca8..00000000 --- a/projects/test_lyon/target/run/demo/models/intermediate/scopes/int_scopes.sql +++ /dev/null @@ -1,24 +0,0 @@ - - - - - create table "test_lyon"."prod"."int_scopes__dbt_tmp" - - - as - - ( - -- Due to ARRAY bug in test, we create an intermediate scopes without the column part_of - -SELECT - decidim_scopes.id, - decidim_scopes.decidim_organization_id, - decidim_scopes.created_at, - decidim_scopes.updated_at, - coalesce(nullif(decidim_scopes.name, ''), 'Sans secteur') as name, - decidim_scopes.scope_type_id, - decidim_scopes.parent_id, - decidim_scopes.code -FROM "test_lyon"."prod"."stg_decidim_scopes" as decidim_scopes - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/intermediate/users/int_users.sql b/projects/test_lyon/target/run/demo/models/intermediate/users/int_users.sql deleted file mode 100644 index 955cb7d9..00000000 --- a/projects/test_lyon/target/run/demo/models/intermediate/users/int_users.sql +++ /dev/null @@ -1,59 +0,0 @@ - - - - - create table "test_lyon"."prod"."int_users__dbt_tmp" - - - as - - ( - - -SELECT - decidim_users.id, - decidim_users.email, - decidim_users.sign_in_count, - (CASE - WHEN decidim_users.sign_in_count = 0 THEN 'Jamais' - WHEN decidim_users.sign_in_count = 1 THEN 'Une seule fois' - WHEN decidim_users.sign_in_count = 2 THEN 'Deux fois' - WHEN decidim_users.sign_in_count BETWEEN 2 AND 10 THEN 'Entre 2 et 10 fois' - ELSE 'Plus de 10 fois' - END - ) AS sign_in_frequency, - decidim_users.last_sign_in_at, - decidim_users.created_at, - decidim_users.updated_at, - decidim_users.invitation_created_at, - decidim_users.invitation_sent_at, - decidim_users.invitation_accepted_at, - decidim_users.invited_by_id, - decidim_users.invited_by_type, - decidim_users.decidim_organization_id, - decidim_users.confirmed_at, - decidim_users.confirmation_token, - decidim_users.unconfirmed_email, - decidim_users.name, - decidim_users.locale, - decidim_users.deleted_at, - decidim_users.admin, - decidim_users.managed, - decidim_users.roles, - decidim_users.nickname, - decidim_users.accepted_tos_version, - decidim_users.type, - decidim_users.following_count, - decidim_users.followers_count, - decidim_users.failed_attempts, - decidim_users.locked_at, - decidim_users.admin_terms_accepted_at, - decidim_users.blocked, - decidim_users.blocked_at, - (CASE WHEN decidim_users.confirmed_at IS NULL THEN false ELSE true END) AS confirmed, - decidim_users.extended_data -FROM "test_lyon"."prod"."stg_decidim_users" as decidim_users - WHERE deleted_at IS NULL - AND type LIKE 'Decidim::User' - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/attachments.sql b/projects/test_lyon/target/run/demo/models/marts/attachments.sql deleted file mode 100644 index d8f125ea..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/attachments.sql +++ /dev/null @@ -1,27 +0,0 @@ - - - - - create table "test_lyon"."prod"."attachments__dbt_tmp" - - - as - - ( - WITH org AS ( - -- Assumption: There is only one organization, so we select the first available host - SELECT host - FROM "test_lyon"."prod"."organizations" - LIMIT 1 -) -SELECT - decidim_attachments.id, - decidim_attachments.file, - decidim_attachments.attached_to_id, - decidim_attachments.attached_to_type, - concat('https://', org.host, '/uploads/decidim/attachment/file/', decidim_attachments.id, '/', decidim_attachments.file) AS url -FROM - "test_lyon"."prod"."stg_decidim_attachments" AS decidim_attachments -CROSS JOIN org - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/blogs_posts/blogs_posts.sql b/projects/test_lyon/target/run/demo/models/marts/blogs_posts/blogs_posts.sql deleted file mode 100644 index 26a0da6c..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/blogs_posts/blogs_posts.sql +++ /dev/null @@ -1,23 +0,0 @@ - - - - - create table "test_lyon"."prod"."blogs_posts__dbt_tmp" - - - as - - ( - SELECT - decidim_blogs_posts.id, - decidim_blogs_posts.title, - decidim_blogs_posts.body, - decidim_blogs_posts.decidim_component_id, - decidim_blogs_posts.created_at, - decidim_blogs_posts.decidim_author_id, - decidim_blogs_posts.resource_type, - concat('https://', decidim_components.organization_host, '/', decidim_components.ps_space_type_slug, '/', decidim_components.ps_slug, '/f/', decidim_components.id, '/posts/', decidim_blogs_posts.id) AS post_url -FROM "test_lyon"."prod"."stg_decidim_blogs_posts" AS decidim_blogs_posts -JOIN "test_lyon"."prod"."components" AS decidim_components ON decidim_components.id = decidim_component_id - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/budgets/budgets.sql b/projects/test_lyon/target/run/demo/models/marts/budgets/budgets.sql deleted file mode 100644 index 2538f2dd..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/budgets/budgets.sql +++ /dev/null @@ -1,21 +0,0 @@ - - - - - create table "test_lyon"."prod"."budgets__dbt_tmp" - - - as - - ( - SELECT - decidim_budgets_budgets.id, - decidim_budgets_budgets.title, - decidim_components.id AS decidim_component_id, - decidim_components.ps_url AS url, - decidim_components.ps_slug, - decidim_components.ps_title -FROM "test_lyon"."prod"."stg_decidim_budgets" AS decidim_budgets_budgets -JOIN "test_lyon"."prod"."components" AS decidim_components on decidim_components.id = decidim_budgets_budgets.decidim_component_id - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/budgets/budgets_projects.sql b/projects/test_lyon/target/run/demo/models/marts/budgets/budgets_projects.sql deleted file mode 100644 index d8049bf8..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/budgets/budgets_projects.sql +++ /dev/null @@ -1,45 +0,0 @@ - - - - - create table "test_lyon"."prod"."budgets_projects__dbt_tmp" - - - as - - ( - WITH categorizations AS ( - - SELECT - array_agg(category_name) AS categories, - array_agg(child_name) AS sub_categories, - categorizable_id - FROM "test_lyon"."prod"."categorizations" AS categorizations - WHERE categorizations.categorizable_type = 'Decidim::Budgets::Project' - GROUP BY categorizable_id - -) -SELECT - decidim_budgets_projects.id, - decidim_budgets_projects.title, - decidim_budgets_projects.description, - decidim_budgets_projects.created_at, - decidim_budgets_projects.decidim_scope_id, - decidim_budgets_projects.project_amount, - decidim_budgets_projects.selected_at, - decidim_budgets_projects.is_selected, - decidim_budgets_budgets.id AS budget_id, - decidim_budgets_budgets.title AS budget_title, - decidim_budgets_projects.resource_type, - decidim_budgets_budgets.decidim_component_id, - concat(decidim_components.component_url,'/', decidim_components.manifest_name,'/', decidim_budgets_budgets.id, '/projects/', decidim_budgets_projects.id) AS project_url, - categorizations.categories, - coalesce(categorizations.categories[1], 'Sans catégorie') AS first_category, - categorizations.sub_categories, - coalesce(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category -FROM "test_lyon"."prod"."int_budgets_projects" AS decidim_budgets_projects -JOIN "test_lyon"."prod"."stg_decidim_budgets" AS decidim_budgets_budgets on decidim_budgets_budgets.id = decidim_budgets_projects.decidim_budgets_budget_id -JOIN "test_lyon"."prod"."components" as decidim_components on decidim_components.id = decidim_budgets_budgets.decidim_component_id -LEFT JOIN categorizations on categorizations.categorizable_id = decidim_budgets_projects.id - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/budgets/projects_votes.sql b/projects/test_lyon/target/run/demo/models/marts/budgets/projects_votes.sql deleted file mode 100644 index 7d5b9b51..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/budgets/projects_votes.sql +++ /dev/null @@ -1,40 +0,0 @@ - - - - - create table "test_lyon"."prod"."projects_votes__dbt_tmp" - - - as - - ( - -- /!\ Warning : counts unfinished votes ! --- /!\ Warning : should be filtered on the corresponding budget to get the good values - - - -WITH budgets_projects AS ( - SELECT - decidim_budgets_line_items.decidim_order_id, - decidim_budgets_projects.id AS "project_id", - decidim_budgets_projects.title AS "project_title", - decidim_budgets_projects.decidim_component_id, - decidim_budgets_projects.project_url - from "test_lyon"."prod"."stg_decidim_budgets_line_items" AS decidim_budgets_line_items - JOIN "test_lyon"."prod"."budgets_projects" decidim_budgets_projects on decidim_budgets_projects.id = decidim_budgets_line_items.decidim_project_id -) - SELECT - decidim_budgets_orders.id as order_id, - decidim_budgets_orders.decidim_user_id, - budgets_projects.project_id, - budgets_projects.project_title, - budgets_projects.decidim_component_id, - decidim_budgets_orders.created_at, - decidim_budgets_orders.checked_out_at, - budgets_projects.project_url, - decidim_budgets_orders.vote_finished, - decidim_budgets_orders.decidim_budgets_budget_id - from "test_lyon"."prod"."int_budgets_orders" AS decidim_budgets_orders - LEFT JOIN budgets_projects on decidim_order_id = decidim_budgets_orders.id - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/categorizations/categorizations.sql b/projects/test_lyon/target/run/demo/models/marts/categorizations/categorizations.sql deleted file mode 100644 index ae4f6e37..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/categorizations/categorizations.sql +++ /dev/null @@ -1,43 +0,0 @@ - - - - - create table "test_lyon"."prod"."categorizations__dbt_tmp" - - - as - - ( - WITH main_categories AS ( - SELECT - decidim_categories.id AS id, - decidim_categories.name AS category_name, - 0 AS child_id, - '' AS child_name, - decidim_categorizations.categorizable_id, - decidim_categorizations.categorizable_type - FROM "test_lyon"."prod"."stg_decidim_categorizations" AS decidim_categorizations - JOIN "test_lyon"."prod"."stg_decidim_categories" AS decidim_categories ON decidim_categories.id = decidim_categorizations.decidim_category_id - WHERE decidim_categories.parent_id IS NULL -), -sub_categories AS ( - SELECT - parent_categories.id AS id, - parent_categories.name AS category_name, - decidim_categories.id AS child_id, - decidim_categories.name AS child_name, - decidim_categorizations.categorizable_id, - decidim_categorizations.categorizable_type - FROM "test_lyon"."prod"."stg_decidim_categorizations" AS decidim_categorizations - JOIN "test_lyon"."prod"."stg_decidim_categories" AS decidim_categories ON decidim_categories.id = decidim_categorizations.decidim_category_id - LEFT JOIN "test_lyon"."prod"."stg_decidim_categories" AS parent_categories ON decidim_categories.parent_id = parent_categories.id - WHERE decidim_categories.parent_id IS NOT NULL -), -categories AS ( - SELECT * FROM main_categories - UNION ALL - SELECT * FROM sub_categories -) -SELECT * FROM categories - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/comments/comments.sql b/projects/test_lyon/target/run/demo/models/marts/comments/comments.sql deleted file mode 100644 index 9c385428..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/comments/comments.sql +++ /dev/null @@ -1,106 +0,0 @@ - - - - - create table "test_lyon"."prod"."comments__dbt_tmp" - - - as - - ( - - - - - -WITH commentaries AS ( - - SELECT - comments.*, - "test_lyon"."prod"."stg_decidim_accountability_results".decidim_component_id AS "decidim_component_id" - FROM "test_lyon"."prod"."stg_decidim_accountability_results" - JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments - on comments.decidim_root_commentable_id = "test_lyon"."prod"."stg_decidim_accountability_results".id - and comments.decidim_root_commentable_type = 'Decidim::Accountability::Result' - union all - - SELECT - comments.*, - "test_lyon"."prod"."blogs_posts".decidim_component_id AS "decidim_component_id" - FROM "test_lyon"."prod"."blogs_posts" - JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments - on comments.decidim_root_commentable_id = "test_lyon"."prod"."blogs_posts".id - and comments.decidim_root_commentable_type = 'Decidim::Blogs::Post' - union all - - SELECT - comments.*, - "test_lyon"."prod"."budgets_projects".decidim_component_id AS "decidim_component_id" - FROM "test_lyon"."prod"."budgets_projects" - JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments - on comments.decidim_root_commentable_id = "test_lyon"."prod"."budgets_projects".id - and comments.decidim_root_commentable_type = 'Decidim::Budgets::Project' - union all - - SELECT - comments.*, - "test_lyon"."prod"."debates".decidim_component_id AS "decidim_component_id" - FROM "test_lyon"."prod"."debates" - JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments - on comments.decidim_root_commentable_id = "test_lyon"."prod"."debates".id - and comments.decidim_root_commentable_type = 'Decidim::Debates::Debate' - union all - - SELECT - comments.*, - "test_lyon"."prod"."meetings".decidim_component_id AS "decidim_component_id" - FROM "test_lyon"."prod"."meetings" - JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments - on comments.decidim_root_commentable_id = "test_lyon"."prod"."meetings".id - and comments.decidim_root_commentable_type = 'Decidim::Meetings::Meeting' - union all - - SELECT - comments.*, - "test_lyon"."prod"."proposals".decidim_component_id AS "decidim_component_id" - FROM "test_lyon"."prod"."proposals" - JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments - on comments.decidim_root_commentable_id = "test_lyon"."prod"."proposals".id - and comments.decidim_root_commentable_type = 'Decidim::Proposals::Proposal' - union all - - SELECT - comments.*, - "test_lyon"."prod"."stg_decidim_proposals_collaborative_drafts".decidim_component_id AS "decidim_component_id" - FROM "test_lyon"."prod"."stg_decidim_proposals_collaborative_drafts" - JOIN "test_lyon"."prod"."stg_decidim_comments" AS comments - on comments.decidim_root_commentable_id = "test_lyon"."prod"."stg_decidim_proposals_collaborative_drafts".id - and comments.decidim_root_commentable_type = 'Decidim::Proposals::CollaborativeDraft' - - -) - -SELECT - commentaries.id, - commentaries.decidim_commentable_id, - commentaries.decidim_commentable_type, - commentaries.decidim_author_id, - commentaries.created_at, - commentaries.depth, - commentaries.alignment, - commentaries.decidim_root_commentable_id, - commentaries.decidim_root_commentable_type, - commentaries.decidim_author_type, - commentaries.body, - commentaries.decidim_component_id, - components.ps_slug, - concat('https://', components.organization_host, '/', components.ps_space_type_slug, '/', components.ps_slug, '/f/', components.id, '/', components.manifest_name,'/', commentaries.decidim_root_commentable_id, '?commentId=', commentaries.id, '#comment_', commentaries.id) AS comment_url -FROM commentaries -JOIN "test_lyon"."prod"."components" AS components - on components.id = commentaries.decidim_component_id -LEFT JOIN "test_lyon"."prod"."stg_decidim_moderations" AS decidim_moderations - on decidim_moderations.decidim_reportable_type = 'Decidim::Comments::Comment' - and decidim_moderations.decidim_reportable_id = commentaries.id -where decidim_moderations.hidden_at is null - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/components/components.sql b/projects/test_lyon/target/run/demo/models/marts/components/components.sql deleted file mode 100644 index 32fbff7a..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/components/components.sql +++ /dev/null @@ -1,70 +0,0 @@ - - - - - create table "test_lyon"."prod"."components__dbt_tmp" - - - as - - ( - -- Warning: are not taken by default into account Conferences, Consultations, Elections, Initiatives, Votations - - - -WITH assemblies_spaces AS ( - SELECT - id AS ps_id, - published_at AS ps_published_at, - title AS ps_title, - subtitle AS ps_subtitle, - slug AS ps_slug, - decidim_organization_id, - 'Decidim::Assembly' AS ps_type, - 'assemblies' AS ps_space_type_slug - FROM "test_lyon"."prod"."stg_decidim_assemblies" -), -participatory_processes_spaces AS ( - SELECT - id AS ps_id, - published_at AS ps_published_at, - title AS ps_title, - subtitle AS ps_subtitle, - slug AS ps_slug, - decidim_organization_id, - 'Decidim::ParticipatoryProcess' AS ps_type, - 'processes' AS ps_space_type_slug - FROM "test_lyon"."prod"."stg_decidim_participatory_processes" -), -participatory_spaces AS ( - SELECT * FROM assemblies_spaces - UNION ALL - SELECT * FROM participatory_processes_spaces -), -components AS ( - SELECT - decidim_components.id, - decidim_components.manifest_name, - decidim_components.translated_manifest_name, - concat(decidim_components.name, ' (', decidim_components.translated_manifest_name, ')') AS component_name, - decidim_components.published_at, - decidim_components.created_at, - concat('https://',decidim_organizations.host,'/', participatory_spaces.ps_space_type_slug, '/', participatory_spaces.ps_slug,'/f/', decidim_components.id) AS component_url, - participatory_spaces.ps_id, - participatory_spaces.ps_published_at, - participatory_spaces.ps_title, - participatory_spaces.ps_subtitle, - participatory_spaces.ps_slug, - participatory_spaces.ps_type, - participatory_spaces.ps_space_type_slug, - concat('https://',decidim_organizations.host,'/', participatory_spaces.ps_space_type_slug, '/', participatory_spaces.ps_slug,'/') AS ps_url, - decidim_organization_id, - decidim_organizations.host AS organization_host - FROM "test_lyon"."prod"."int_components" AS decidim_components - JOIN participatory_spaces ON participatory_spaces.ps_type = decidim_components.participatory_space_type AND decidim_components.participatory_space_id = participatory_spaces.ps_id - JOIN "test_lyon"."prod"."int_organizations" AS decidim_organizations ON decidim_organizations.id = participatory_spaces.decidim_organization_id - WHERE participatory_spaces.ps_published_at IS NOT NULL -) -SELECT * FROM components - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/debates/debates.sql b/projects/test_lyon/target/run/demo/models/marts/debates/debates.sql deleted file mode 100644 index 471cff5f..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/debates/debates.sql +++ /dev/null @@ -1,54 +0,0 @@ - - - - - create table "test_lyon"."prod"."debates__dbt_tmp" - - - as - - ( - WITH categorizations AS ( - - SELECT - array_agg(category_name) AS categories, - array_agg(child_name) AS sub_categories, - categorizable_id - FROM "test_lyon"."prod"."categorizations" AS categorizations - WHERE categorizations.categorizable_type = 'Decidim::Debates::Debate' - GROUP BY categorizable_id - -) -SELECT - decidim_debates_debates.id, - decidim_debates_debates.title, - decidim_debates_debates.description, - decidim_debates_debates.start_time, - decidim_debates_debates.end_time, - decidim_debates_debates.decidim_component_id, - decidim_debates_debates.decidim_author_id, - decidim_debates_debates.created_at, - decidim_debates_debates.closed_at, - decidim_components.ps_slug, - concat( - 'https://', - decidim_components.organization_host, - '/', - decidim_components.ps_space_type_slug, - '/', - decidim_components.ps_slug, - '/f/', - decidim_components.id, - '/debates/', - decidim_debates_debates.id - ) AS debate_url, - decidim_debates_debates.resource_type, - categorizations.categories, - coalesce(categorizations.categories[1], 'Sans catégorie') AS first_category, - categorizations.sub_categories, - coalesce(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category -FROM "test_lyon"."prod"."stg_decidim_debates" AS decidim_debates_debates - JOIN "test_lyon"."prod"."components" decidim_components on decidim_components.id = decidim_component_id - LEFT JOIN categorizations on categorizations.categorizable_id = decidim_debates_debates.id - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/endorsements/endorsements.sql b/projects/test_lyon/target/run/demo/models/marts/endorsements/endorsements.sql deleted file mode 100644 index 7575f8aa..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/endorsements/endorsements.sql +++ /dev/null @@ -1,55 +0,0 @@ - - - - - create table "test_lyon"."prod"."endorsements__dbt_tmp" - - - as - - ( - - -WITH endorsements_proposals AS ( - SELECT - decidim_endorsements.*, - decidim_component_id - FROM "test_lyon"."prod"."stg_decidim_endorsements" AS decidim_endorsements - JOIN "test_lyon"."prod"."stg_decidim_proposals" decidim_proposals_proposals on decidim_endorsements.resource_id = decidim_proposals_proposals.id - and decidim_proposals_proposals.resource_type = decidim_endorsements.resource_type -), endorsements_debates AS ( - SELECT - decidim_endorsements.*, - decidim_component_id - FROM "test_lyon"."prod"."stg_decidim_endorsements" AS decidim_endorsements - JOIN "test_lyon"."prod"."stg_decidim_debates" AS decidim_debates_debates on decidim_endorsements.resource_id = decidim_debates_debates.id - and decidim_debates_debates.resource_type = decidim_endorsements.resource_type -), endorsements_blogs_posts AS ( - SELECT - decidim_endorsements.*, - decidim_component_id - FROM "test_lyon"."prod"."stg_decidim_endorsements" AS decidim_endorsements - JOIN "test_lyon"."prod"."stg_decidim_blogs_posts" AS decidim_blogs_posts on decidim_endorsements.resource_id = decidim_blogs_posts.id - and decidim_blogs_posts.resource_type = decidim_endorsements.resource_type -), endorsements as ( - SELECT * FROM endorsements_proposals union all - SELECT * FROM endorsements_debates union all - SELECT * FROM endorsements_blogs_posts -) - -SELECT - endorsements.id, - endorsements.resource_type, - endorsements.resource_id, - endorsements.decidim_author_type, - endorsements.decidim_author_id, - endorsements.created_at, - endorsements.updated_at, - endorsements.decidim_component_id -FROM endorsements -LEFT JOIN "test_lyon"."prod"."stg_decidim_moderations" AS decidim_moderations - ON decidim_moderations.decidim_reportable_type = endorsements.resource_type - AND decidim_moderations.decidim_reportable_id = endorsements.resource_id -WHERE decidim_moderations.hidden_at IS NULL - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/followings/followings.sql b/projects/test_lyon/target/run/demo/models/marts/followings/followings.sql deleted file mode 100644 index ce8f6b0c..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/followings/followings.sql +++ /dev/null @@ -1,132 +0,0 @@ - - - - - create table "test_lyon"."prod"."followings__dbt_tmp" - - - as - - ( - - - -WITH followings_proposals AS ( - SELECT - decidim_follows.*, - decidim_proposals_proposals.decidim_component_id, - url AS followable_url, - title AS followable_title - FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows - JOIN "test_lyon"."prod"."proposals" decidim_proposals_proposals - ON decidim_proposals_proposals.id = decidim_follows.decidim_followable_id - AND decidim_proposals_proposals.resource_type = decidim_follows.decidim_followable_type - ), followings_components AS ( - SELECT - distinct decidim_follows.*, - -1 AS "decidim_components.id", - ps_url AS followable_url, - ps_title AS followable_title - FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows - JOIN "test_lyon"."prod"."components" decidim_components - ON decidim_components.ps_id = decidim_followable_id - AND ps_type = decidim_followable_type - ), followings_debates AS ( - SELECT - decidim_follows.*, - decidim_debates_debates.decidim_component_id, - debate_url AS followable_url, - title AS followable_title - FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows - JOIN "test_lyon"."prod"."debates" decidim_debates_debates ON decidim_debates_debates.id = decidim_followable_id - AND resource_type = decidim_followable_type - ), followings_blogs_posts AS ( - SELECT - decidim_follows.*, - decidim_blogs_posts.decidim_component_id, - post_url AS followable_url, - title AS followable_title - FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows - JOIN "test_lyon"."prod"."blogs_posts" decidim_blogs_posts - ON decidim_blogs_posts.id = decidim_followable_id - AND resource_type = decidim_followable_type - ), followings_users AS ( - SELECT - decidim_follows.*, - -1 AS decidim_component_id, - '' AS followable_url, - '' AS followable_title - FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows - JOIN "test_lyon"."prod"."int_users" decidim_users - ON decidim_users.id = decidim_followable_id - where decidim_followable_type = 'Decidim::UserBaseEntity' - ), followings_meetings AS ( - SELECT - decidim_follows.*, - decidim_component_id, - meeting_url AS followable_url, - title AS followable_title - FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows - JOIN "test_lyon"."prod"."meetings" decidim_meetings - ON decidim_meetings.id = decidim_followable_id - AND resource_type = decidim_followable_type - ), followings_budgets_projects AS ( - SELECT - decidim_follows.*, - decidim_component_id, - project_url AS followable_url, - title AS followable_title - FROM "test_lyon"."prod"."stg_decidim_follows" AS decidim_follows - join "test_lyon"."prod"."budgets_projects" decidim_budgets_projects - ON decidim_budgets_projects.id = decidim_followable_id - AND resource_type = decidim_followable_type - ), followings AS ( - SELECT * FROM followings_proposals union all - SELECT * FROM followings_components union all - SELECT * FROM followings_debates union all - SELECT * FROM followings_blogs_posts union all - SELECT * FROM followings_users union all - SELECT * FROM followings_meetings union all - SELECT * FROM followings_budgets_projects - ), real_follow AS ( - SELECT - followings.*, - 'real_follow' AS "following_way", - decidim_followable_id AS "root_decidim_followable_id", - decidim_followable_type AS "root_decidim_followable_type", - followable_url AS "root_following_url", - followable_title AS "root_followable_title" - FROM followings, - lateral (SELECT (case array_length(array_remove(string_to_array(decidim_followable_type, ':', ''),null),1) when 2 then 'Ancestor' else 'Child' end) AS followable_meta_type) p_is_ps - where followable_meta_type != 'Ancestor' - ), ancestor_follow AS ( - SELECT - distinct - followings.*, - 'ancestor_follow' AS "following_way", - real_follow.decidim_followable_id AS "root_decidim_followable_id", - real_follow.decidim_followable_type AS "root_decidim_followable_type", - real_follow.followable_url AS "root_following_url", - real_follow.followable_title AS "root_followable_title" - FROM real_follow - join "test_lyon"."prod"."components" AS components ON components.id = real_follow.decidim_component_id - join followings ON followings.decidim_followable_id = components.ps_id AND followings.decidim_followable_type = components.ps_type - ), follows AS ( - SELECT * FROM real_follow union all - SELECT * FROM ancestor_follow - ) -SELECT id, - decidim_component_id, - decidim_user_id, - root_decidim_followable_id, - root_decidim_followable_type, - root_followable_title, - created_at, - root_following_url, - decidim_followable_id, - decidim_followable_type, - followable_url, - following_way -FROM follows - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/forms/forms.sql b/projects/test_lyon/target/run/demo/models/marts/forms/forms.sql deleted file mode 100644 index 38998771..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/forms/forms.sql +++ /dev/null @@ -1,39 +0,0 @@ - - - - - create table "test_lyon"."prod"."forms__dbt_tmp" - - - as - - ( - - -WITH forms_meetings AS ( - SELECT decidim_forms_questionnaires.id AS questionnaire_id, - decidim_forms_questionnaires.title, - decidim_meetings_meetings.decidim_component_id - FROM "test_lyon"."prod"."stg_decidim_forms_questionnaires" decidim_forms_questionnaires - JOIN "test_lyon"."prod"."stg_decidim_meetings" decidim_meetings_meetings ON decidim_meetings_meetings.id = decidim_forms_questionnaires.questionnaire_for_id - WHERE questionnaire_for_type = 'Decidim::Meetings::Meeting' -), forms_surveys AS ( - SELECT decidim_forms_questionnaires.id AS questionnaire_id, - decidim_forms_questionnaires.title, - decidim_surveys_surveys.decidim_component_id - FROM decidim_forms_questionnaires - JOIN "test_lyon"."prod"."stg_decidim_surveys" decidim_surveys_surveys ON decidim_surveys_surveys.id = questionnaire_for_id - WHERE questionnaire_for_type = 'Decidim::Surveys::Survey' -), forms AS ( - SELECT * FROM forms_meetings UNION ALL - SELECT * FROM forms_surveys -) -SELECT - forms.questionnaire_id AS id, - title::jsonb->>'fr' AS title, - decidim_components.id AS decidim_component_id, - concat ('https://',organization_host, '/', ps_space_type_slug,'/', ps_slug, '/f/', decidim_component_id) AS "questionnaire_url" -FROM forms -JOIN "test_lyon"."prod"."components" decidim_components ON decidim_components.id = forms.decidim_component_id - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/forms/forms_answers.sql b/projects/test_lyon/target/run/demo/models/marts/forms/forms_answers.sql deleted file mode 100644 index 86f65482..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/forms/forms_answers.sql +++ /dev/null @@ -1,64 +0,0 @@ - - - - - create table "test_lyon"."prod"."forms_answers__dbt_tmp" - - - as - - ( - - -WITH answers_short_and_long_answer AS ( - SELECT * FROM "test_lyon"."prod"."answers_short_and_long_answer" -), answers_option_and_sorting AS ( - SELECT * FROM "test_lyon"."prod"."answers_option_and_sorting" -), answers_matrix AS ( - SELECT * FROM "test_lyon"."prod"."answers_matrix" -), answers_file AS ( - SELECT * FROM "test_lyon"."prod"."answers_file" -), answers AS ( - SELECT * FROM answers_short_and_long_answer - UNION ALL - SELECT * FROM answers_option_and_sorting - UNION ALL - SELECT * FROM answers_matrix - UNION ALL - SELECT * FROM answers_file -) - -SELECT - answers.decidim_user_id, - answers.session_token, - answers.ip_hash, - answers.question_type, - answers.body AS question_title, - btrim(answers.answer, '"') AS answer, - answers.sub_matrix_question, - answers.custom_body, - answers.sorting_position, - answers.decidim_questionnaire_id, - decidim_forms_questionnaires.title AS form_title, - decidim_forms_questionnaires.decidim_component_id, - (CASE answers.sorting_position - WHEN 0 THEN 10 - WHEN 1 THEN 9 - WHEN 2 THEN 8 - WHEN 3 THEN 7 - WHEN 4 THEN 6 - WHEN 5 THEN 5 - WHEN 6 THEN 4 - WHEN 7 THEN 3 - WHEN 8 THEN 2 - WHEN 9 THEN 1 - ELSE -1 - END) AS sorting_points, - answers.position, - answers.created_at, - answers.author_status -FROM answers -JOIN "test_lyon"."prod"."forms" AS decidim_forms_questionnaires ON decidim_forms_questionnaires.id = answers.decidim_questionnaire_id -ORDER BY session_token, position - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/meetings/meetings.sql b/projects/test_lyon/target/run/demo/models/marts/meetings/meetings.sql deleted file mode 100644 index 52b17abc..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/meetings/meetings.sql +++ /dev/null @@ -1,60 +0,0 @@ - - - - - create table "test_lyon"."prod"."meetings__dbt_tmp" - - - as - - ( - WITH categorizations AS ( - - SELECT - array_agg(category_name) AS categories, - array_agg(child_name) AS sub_categories, - categorizable_id - FROM "test_lyon"."prod"."categorizations" AS categorizations - WHERE categorizations.categorizable_type = 'Decidim::Meetings::Meeting' - GROUP BY categorizable_id - -) -SELECT - decidim_meetings_meetings.id, - decidim_meetings_meetings.title, - decidim_meetings_meetings.description, - decidim_meetings_meetings.address, - decidim_meetings_meetings.attendees_count, - decidim_meetings_meetings.created_at, - decidim_meetings_meetings.decidim_scope_id, - decidim_meetings_meetings.decidim_component_id, - decidim_meetings_meetings.start_time, - decidim_meetings_meetings.end_time, - decidim_meetings_meetings.registration_url, - decidim_meetings_meetings.type_of_meeting, - decidim_meetings_meetings.translated_type_of_meeting, - decidim_meetings_meetings.private_meeting, - decidim_meetings_meetings.decidim_author_id, - decidim_meetings_meetings.resource_type, - concat( - 'https://', - decidim_components.organization_host, - '/', - decidim_components.ps_space_type_slug, - '/', - decidim_components.ps_slug, - '/f/', - decidim_meetings_meetings.decidim_component_id, - '/meetings/', - decidim_meetings_meetings.id - ) AS meeting_url, - categorizations.categories, - coalesce(categorizations.categories[1], 'Sans catégorie') AS first_category, - categorizations.sub_categories, - coalesce(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category -FROM "test_lyon"."prod"."int_meetings" AS decidim_meetings_meetings -JOIN "test_lyon"."prod"."components" decidim_components on decidim_components.id = decidim_component_id -LEFT JOIN categorizations on categorizations.categorizable_id = decidim_meetings_meetings.id -where manifest_name like 'meetings' - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/organizations.sql b/projects/test_lyon/target/run/demo/models/marts/organizations.sql deleted file mode 100644 index d185dd53..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/organizations.sql +++ /dev/null @@ -1,15 +0,0 @@ - - - - - create table "test_lyon"."prod"."organizations__dbt_tmp" - - - as - - ( - SELECT -* -FROM "test_lyon"."prod"."int_organizations" AS decidim_organizations - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/participations.sql b/projects/test_lyon/target/run/demo/models/marts/participations.sql deleted file mode 100644 index 11362871..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/participations.sql +++ /dev/null @@ -1,96 +0,0 @@ - - - - - create table "test_lyon"."prod"."participations__dbt_tmp" - - - as - - ( - WITH participations_proposals AS ( - SELECT decidim_users.id, - decidim_proposals_proposals.decidim_component_id, - 'Decidim::Proposals::Proposal' AS "participation_type", - decidim_proposals_proposals.id::text AS "participation_id", - decidim_proposals_proposals.created_at AS participation_date - FROM "test_lyon"."prod"."proposals" AS decidim_proposals_proposals - JOIN decidim_coauthorships on decidim_coauthorships.coauthorable_id = decidim_proposals_proposals.id - JOIN decidim_users on decidim_users.id = decidim_coauthorships.decidim_author_id - where coauthorable_type = 'Decidim::Proposals::Proposal' - ), participations_endorsements as ( - SELECT decidim_users.id, - decidim_endorsements.decidim_component_id, - 'Decidim::Endorsements::Endorsement' as "participation_type", - decidim_endorsements.id::text as "participation_id", - decidim_endorsements.created_at as participation_date - FROM "test_lyon"."prod"."endorsements" as decidim_endorsements - JOIN decidim_users on decidim_users.id = decidim_endorsements.decidim_author_id - ), participations_comments as ( - SELECT decidim_users.id, - decidim_component_id, - 'Decidim::Comments::Comment' as "participation_type", - decidim_comments_comments.id::text as "participation_id", - decidim_comments_comments.created_at as contribution_date - FROM "test_lyon"."prod"."comments" decidim_comments_comments - JOIN decidim_users on decidim_users.id = decidim_comments_comments.decidim_author_id - ), participations_proposal_votes as ( - SELECT decidim_users.id, - decidim_proposals_proposals.decidim_component_id, - 'Decidim::Proposals::ProposalVote' as "participation_type", - decidim_proposals_proposal_votes.id::text as "participation_id", - decidim_proposals_proposal_votes.created_at as participation_date - FROM "test_lyon"."prod"."proposals_votes" as decidim_proposals_proposal_votes - JOIN decidim_users on decidim_users.id = decidim_author_id - JOIN "test_lyon"."prod"."proposals" as decidim_proposals_proposals on decidim_proposals_proposal_votes.decidim_proposal_id = decidim_proposals_proposals.id - ), participations_answers as ( - SELECT distinct - decidim_user_id, - decidim_component_id, - 'Decidim::Forms::Answer' as "participation_type", - ('x'||lpad(decidim_forms_answers.session_token,16,'0'))::bit(64)::bigint::text as "participation_id", - decidim_forms_answers.created_at::date as participation_date - FROM "test_lyon"."prod"."forms_answers" as decidim_forms_answers - ), participations_debates as ( - SELECT decidim_author_id as decidim_user_id, - decidim_component_id, - 'Decidim::Debates::Debate' as "participation_type", - id::text as participation_id, - created_at as participation_date - FROM "test_lyon"."prod"."debates" decidim_debates_debates - ), participations_budgets_projects_votes as ( - SELECT - decidim_user_id, - decidim_component_id, - 'Decidim::Budgets::Project::Vote' as participation_type, - order_id::text as participation_id, - created_at as participation_date - FROM "test_lyon"."prod"."projects_votes" decidim_bugdets_projects_votes - ), participations_meetings_registrations as ( - SELECT - decidim_user_id, - decidim_component_id, - 'Decidim::Meetings::Registration' as participation_type, - decidim_meetings_meetings.id::text as participation_id, - decidim_meetings_registrations.created_at as participation_date - FROM "test_lyon"."prod"."meetings" decidim_meetings_meetings - join decidim_meetings_registrations on decidim_meetings_registrations.decidim_meeting_id = decidim_meetings_meetings.id - ), participations as ( - SELECT * FROM participations_proposals union all - SELECT * FROM participations_endorsements union all - SELECT * FROM participations_comments union all - SELECT * FROM participations_proposal_votes union all - SELECT * from participations_answers union all - SELECT * from participations_debates union all - SELECT * from participations_budgets_projects_votes union all - SELECT * from participations_meetings_registrations - ) - SELECT - distinct participations.id as "user_id", - substr(participation_id,1,10)::bigint as participation_id, - decidim_component_id, - participation_type, - participation_date - from participations - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/proposals/proposals.sql b/projects/test_lyon/target/run/demo/models/marts/proposals/proposals.sql deleted file mode 100644 index bfa7990b..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/proposals/proposals.sql +++ /dev/null @@ -1,81 +0,0 @@ - - - - - create table "test_lyon"."prod"."proposals__dbt_tmp" - - - as - - ( - - -WITH coauthorships AS ( - SELECT - array_agg(decidim_users.id) AS authors_ids, - decidim_coauthorships.coauthorable_id - FROM "test_lyon"."prod"."int_users" AS decidim_users - JOIN "test_lyon"."prod"."stg_decidim_coauthorships" AS decidim_coauthorships on decidim_users.id = decidim_coauthorships.decidim_author_id - WHERE coauthorable_type = 'Decidim::Proposals::Proposal' - GROUP BY coauthorable_id -), -categorizations AS ( - - SELECT - array_agg(category_name) AS categories, - array_agg(child_name) AS sub_categories, - categorizable_id - FROM "test_lyon"."prod"."categorizations" AS categorizations - WHERE categorizations.categorizable_type = 'Decidim::Proposals::Proposal' - GROUP BY categorizable_id - -), -votes AS ( - SELECT - decidim_proposal_id, - COUNT(id) AS votes_count - FROM "test_lyon"."prod"."stg_decidim_proposals_votes" - GROUP BY decidim_proposal_id -), -proposals AS ( - SELECT - decidim_proposals.id, - decidim_components.ps_id AS decidim_participatory_space_id, - decidim_components.ps_slug AS decidim_participatory_space_slug, - decidim_scopes.name AS decidim_scope_name, - decidim_proposals.title, - decidim_proposals.body, - decidim_proposals.resource_type, - concat('https://', decidim_components.organization_host, '/', decidim_components.ps_space_type_slug, '/', decidim_components.ps_slug, '/f/', decidim_proposals.decidim_component_id, '/proposals/', decidim_proposals.id) AS url, - decidim_proposals.decidim_component_id, - decidim_proposals.created_at, - decidim_proposals.published_at, - decidim_proposals.state, - decidim_proposals.translated_state, - coauthorships.authors_ids, - COALESCE(coauthorships.authors_ids[1], -1) AS first_author_id, - decidim_proposals.address, - categorizations.categories, - COALESCE(categorizations.categories[1], 'Sans catégorie') AS first_category, - categorizations.sub_categories, - COALESCE(categorizations.sub_categories[1], 'Sans sous-catégorie') AS first_sub_category, - decidim_proposals.comments_count, - decidim_proposals.endorsements_count, - COALESCE(votes.votes_count,0) AS votes_count - FROM "test_lyon"."prod"."int_proposals" AS decidim_proposals - JOIN "test_lyon"."prod"."components" AS decidim_components ON decidim_components.id = decidim_component_id - LEFT JOIN coauthorships ON decidim_proposals.id = coauthorships.coauthorable_id - LEFT JOIN "test_lyon"."prod"."stg_decidim_moderations" AS decidim_moderations - ON decidim_moderations.decidim_reportable_id = decidim_proposals.id - AND decidim_moderations.decidim_reportable_type = 'Decidim::Proposals::Proposal' - LEFT JOIN "test_lyon"."prod"."int_scopes" AS decidim_scopes ON decidim_scopes.id = decidim_proposals.decidim_scope_id - LEFT JOIN votes ON decidim_proposals.id = votes.decidim_proposal_id - LEFT JOIN categorizations ON categorizations.categorizable_id = decidim_proposals.id - WHERE decidim_moderations.hidden_at IS NULL - AND decidim_proposals.published_at IS NOT NULL - AND (decidim_proposals.state NOT LIKE '%withdrawn' OR decidim_proposals.state IS NULL) -) - -SELECT * FROM proposals - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/proposals/proposals_votes.sql b/projects/test_lyon/target/run/demo/models/marts/proposals/proposals_votes.sql deleted file mode 100644 index 32e4efac..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/proposals/proposals_votes.sql +++ /dev/null @@ -1,24 +0,0 @@ - - - - - create table "test_lyon"."prod"."proposals_votes__dbt_tmp" - - - as - - ( - - -SELECT - proposals_votes.id, - proposals_votes.created_at, - proposals_votes.decidim_author_id, - proposals_votes.decidim_proposal_id, - proposals.decidim_component_id, - proposals.title AS proposal_title, - proposals.url AS proposal_url -FROM "test_lyon"."prod"."stg_decidim_proposals_votes" AS proposals_votes -JOIN "test_lyon"."prod"."proposals" AS proposals on proposals_votes.decidim_proposal_id = proposals.id - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/marts/users/users.sql b/projects/test_lyon/target/run/demo/models/marts/users/users.sql deleted file mode 100644 index 5da57503..00000000 --- a/projects/test_lyon/target/run/demo/models/marts/users/users.sql +++ /dev/null @@ -1,121 +0,0 @@ - - - - - create table "test_lyon"."prod"."users__dbt_tmp" - - - as - - ( - WITH endorsements AS ( - SELECT - decidim_author_id, - MAX(1) AS is_endorsing - FROM "test_lyon"."prod"."endorsements" - GROUP BY decidim_author_id -), - -comments AS ( - SELECT - decidim_author_id, - MAX(1) AS has_authored_comment - FROM "test_lyon"."prod"."comments" - GROUP BY decidim_author_id -), - -forms_answers AS ( - SELECT - decidim_user_id, - MAX(1) AS has_answered_survey - FROM "test_lyon"."prod"."forms_answers" - GROUP BY decidim_user_id -), - -proposal_votes AS ( - SELECT - decidim_author_id, - MAX(1) AS has_voted_on_proposal - FROM "test_lyon"."prod"."proposals_votes" - GROUP BY decidim_author_id -), - -project_votes AS ( - SELECT - decidim_user_id, - MAX(1) AS has_voted_on_project - FROM "test_lyon"."prod"."projects_votes" - GROUP BY decidim_user_id -), - -participations_proposals AS ( - SELECT - decidim_coauthorships.decidim_author_id, - MAX(1) AS has_authored_proposal - FROM "test_lyon"."prod"."proposals" AS decidim_proposals_proposals - JOIN "test_lyon"."prod"."stg_decidim_coauthorships" AS decidim_coauthorships - ON decidim_coauthorships.coauthorable_id = decidim_proposals_proposals.id - WHERE coauthorable_type = 'Decidim::Proposals::Proposal' - GROUP BY decidim_coauthorships.decidim_author_id -), - -followings AS ( - SELECT DISTINCT decidim_user_id - FROM "test_lyon"."prod"."followings" -) - -SELECT - decidim_users.id, - decidim_users.email, - decidim_users.sign_in_count, - decidim_users.sign_in_frequency, - decidim_users.last_sign_in_at, - decidim_users.created_at, - decidim_users.updated_at, - decidim_users.invitation_created_at, - decidim_users.invitation_sent_at, - decidim_users.invitation_accepted_at, - decidim_users.invited_by_id, - decidim_users.invited_by_type, - decidim_users.decidim_organization_id, - decidim_users.confirmed_at, - decidim_users.confirmation_token, - decidim_users.unconfirmed_email, - decidim_users.name, - decidim_users.locale, - decidim_users.deleted_at, - decidim_users.admin, - decidim_users.managed, - decidim_users.roles, - decidim_users.nickname, - decidim_users.accepted_tos_version, - decidim_users.type, - decidim_users.following_count, - decidim_users.followers_count, - decidim_users.failed_attempts, - decidim_users.locked_at, - decidim_users.admin_terms_accepted_at, - decidim_users.blocked, - decidim_users.blocked_at, - COALESCE(endorsements.is_endorsing, 0)::boolean AS is_endorsing, - (CASE WHEN followings.decidim_user_id IS NULL THEN false ELSE true END) AS is_following, - COALESCE(comments.has_authored_comment, 0)::boolean AS has_authored_comment, - COALESCE(proposal_votes.has_voted_on_proposal, 0)::boolean AS has_voted_on_proposal, - COALESCE(project_votes.has_voted_on_project, 0)::boolean AS has_voted_on_project, - COALESCE(participations_proposals.has_authored_proposal, 0)::boolean AS has_authored_proposal, - COALESCE(forms_answers.has_answered_survey, 0)::boolean AS has_answered_survey, - decidim_users.confirmed, - CONCAT('https://', decidim_organizations.host, '/profiles/', decidim_users.nickname, '/activity') AS url, - decidim_users.extended_data -FROM "test_lyon"."prod"."int_users" AS decidim_users -LEFT JOIN followings ON followings.decidim_user_id = decidim_users.id -LEFT JOIN endorsements ON endorsements.decidim_author_id = decidim_users.id -LEFT JOIN comments ON comments.decidim_author_id = decidim_users.id -LEFT JOIN forms_answers ON forms_answers.decidim_user_id = decidim_users.id -LEFT JOIN proposal_votes ON proposal_votes.decidim_author_id = decidim_users.id -LEFT JOIN project_votes ON project_votes.decidim_user_id = decidim_users.id -LEFT JOIN participations_proposals ON participations_proposals.decidim_author_id = decidim_users.id -JOIN "test_lyon"."prod"."int_organizations" AS decidim_organizations - ON decidim_organizations.id = decidim_users.decidim_organization_id - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_area_types.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_area_types.sql deleted file mode 100644 index e33f9850..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_area_types.sql +++ /dev/null @@ -1,24 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_area_types__dbt_tmp" - - - as - - ( - WITH source as ( - SELECT * FROM "test_lyon"."public"."decidim_area_types" -), -renamed as ( - SELECT - id, - decidim_organization_id, - name, - plural - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_areas.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_areas.sql deleted file mode 100644 index fbb8eced..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/areas/stg_decidim_areas.sql +++ /dev/null @@ -1,26 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_areas__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_areas" -), -renamed as ( - select - id, - name, - area_type_id, - decidim_organization_id, - created_at, - updated_at - FROM source -) -select * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql deleted file mode 100644 index 313ff0d9..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/assemblies/stg_decidim_assemblies.sql +++ /dev/null @@ -1,70 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_assemblies__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_assemblies" -), -renamed AS ( - SELECT - id, - slug, - hashtag, - decidim_organization_id, - created_at, - updated_at, - title::jsonb->>'fr' AS title, - subtitle::jsonb->>'fr' AS subtitle, - short_description, - description, - hero_image, - banner_image, - promoted, - published_at, - developer_group, - meta_scope, - local_area, - target, - participatory_scope, - participatory_structure, - show_statistics, - decidim_scope_id, - scopes_enabled, - private_space, - reference, - decidim_area_id, - parent_id, - parents_path, - children_count, - purpose_of_action, - composition, - creation_date, - created_by, - created_by_other, - duration, - included_at, - closing_date, - closing_date_reason, - internal_organisation, - is_transparent, - special_features, - twitter_handler, - instagram_handler, - facebook_handler, - youtube_handler, - github_handler, - decidim_assemblies_type_id, - weight, - follows_count - - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql deleted file mode 100644 index 1c0ce72c..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/blogs_posts/stg_decidim_blogs_posts.sql +++ /dev/null @@ -1,27 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_blogs_posts__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_blogs_posts" -), -renamed AS ( - SELECT - id, - title::jsonb->>'fr' AS title, - regexp_replace(body::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') AS body, - decidim_component_id, - created_at, - decidim_author_id, - 'Decidim::Blogs::Post' AS resource_type - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql deleted file mode 100644 index 7b7f8510..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets.sql +++ /dev/null @@ -1,23 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_budgets__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_budgets_budgets" -), -renamed AS ( - SELECT - id, - title::jsonb->>'fr' as title, - decidim_component_id - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql deleted file mode 100644 index 010f414a..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_line_items.sql +++ /dev/null @@ -1,23 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_budgets_line_items__dbt_tmp" - - - as - - ( - WITH source as ( - SELECT * FROM "test_lyon"."public"."decidim_budgets_line_items" -), -renamed as ( - select - id, - decidim_order_id, - decidim_project_id - FROM source -) -select * from renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql deleted file mode 100644 index 738387c7..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_orders.sql +++ /dev/null @@ -1,26 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_budgets_orders__dbt_tmp" - - - as - - ( - WITH source as ( - SELECT * FROM "test_lyon"."public"."decidim_budgets_orders" -), -renamed as ( - select - id, - decidim_user_id, - checked_out_at, - created_at, - updated_at, - decidim_budgets_budget_id - FROM source -) -select * from renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql deleted file mode 100644 index 054f54f0..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/budgets/stg_decidim_budgets_projects.sql +++ /dev/null @@ -1,29 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_budgets_projects__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_budgets_projects" -), -renamed AS ( - SELECT - id, - title::jsonb->>'fr' as title, - regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description, - created_at, - decidim_scope_id, - budget_amount as project_amount, - selected_at, - decidim_budgets_budget_id, - 'Decidim::Budgets::Project' as resource_type - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categories.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categories.sql deleted file mode 100644 index 2cb51081..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categories.sql +++ /dev/null @@ -1,27 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_categories__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_categories" -), -renamed AS ( - SELECT - id, - name::jsonb->>'fr' AS name, - description, - parent_id, - decidim_participatory_space_id, - decidim_participatory_space_type, - weight - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql deleted file mode 100644 index 75aebd31..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/categories/stg_decidim_categorizations.sql +++ /dev/null @@ -1,26 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_categorizations__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_categorizations" -), -renamed AS ( - SELECT - id, - decidim_category_id, - categorizable_type, - categorizable_id, - created_at, - updated_at - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/debates/stg_decidim_debates.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/debates/stg_decidim_debates.sql deleted file mode 100644 index 2dde98d6..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/debates/stg_decidim_debates.sql +++ /dev/null @@ -1,30 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_debates__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_debates_debates" -), -renamed AS ( - SELECT - id, - title::jsonb->>'fr' as title, - regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as description, - start_time, - end_time, - decidim_component_id, - decidim_author_id, - created_at, - closed_at, - 'Decidim::Debates::Debate' as resource_type - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql deleted file mode 100644 index dacf92aa..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answer_choices.sql +++ /dev/null @@ -1,27 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_forms_answer_choices__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_forms_answer_choices" -), -renamed AS ( - SELECT - id, - decidim_answer_id, - decidim_answer_option_id, - position, - body::text AS body, - custom_body, - decidim_question_matrix_row_id - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql deleted file mode 100644 index d029888e..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_answers.sql +++ /dev/null @@ -1,29 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_forms_answers__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_forms_answers" -), -renamed AS ( - SELECT - id, - body, - decidim_user_id, - decidim_questionnaire_id, - decidim_question_id, - created_at, - updated_at, - session_token, - ip_hash - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql deleted file mode 100644 index c571ff4c..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_question_matrix_rows.sql +++ /dev/null @@ -1,24 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_forms_question_matrix_rows__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_forms_question_matrix_rows" -), -renamed AS ( - SELECT - id, - decidim_question_id, - position, - TRIM(body::jsonb->>'fr') AS body - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql deleted file mode 100644 index ac0d68c4..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questionnaires.sql +++ /dev/null @@ -1,30 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_forms_questionnaires__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_forms_questionnaires" -), -renamed AS ( - SELECT - id, - title, - description, - tos, - questionnaire_for_type, - questionnaire_for_id, - published_at, - created_at, - updated_at, - salt - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql deleted file mode 100644 index 313f291c..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/forms/stg_decidim_forms_questions.sql +++ /dev/null @@ -1,33 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_forms_questions__dbt_tmp" - - - as - - ( - - -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_forms_questions" -), -renamed AS ( - SELECT - id, - decidim_questionnaire_id, - position, - question_type, - mandatory, - body::jsonb->>'fr' AS body, - description, - max_choices, - created_at, - updated_at, - max_characters - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql deleted file mode 100644 index 96d51656..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/organizations/stg_decidim_organizations.sql +++ /dev/null @@ -1,35 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_organizations__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_organizations" -), -renamed AS ( - SELECT - id, - name, - host, - default_locale, - available_locales::text as available_locales, - created_at, - description, - secondary_hosts::text as secondary_hosts, - available_authorizations::text as available_authorizations, - header_snippets, - tos_version, - badges_enabled, - send_welcome_notification, - users_registration_mode, - time_zone - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql deleted file mode 100644 index 4ae14e89..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals.sql +++ /dev/null @@ -1,26 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_proposals__dbt_tmp" - - - as - - ( - SELECT - id, - regexp_replace(title::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as title, - regexp_replace(body::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') as body, - 'Decidim::Proposals::Proposal' as resource_type, - decidim_component_id, - decidim_scope_id, - created_at, - published_at, - state, - comments_count, - endorsements_count, - address -FROM "test_lyon"."public"."decidim_proposals_proposals" - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql deleted file mode 100644 index 4d1768f1..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_collaborative_drafts.sql +++ /dev/null @@ -1,40 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_proposals_collaborative_drafts__dbt_tmp" - - - as - - ( - WITH source as ( - SELECT * FROM "test_lyon"."public"."decidim_proposals_collaborative_drafts" -), -renamed as ( - select - id, - title, - body, - decidim_component_id, - decidim_scope_id, - state, - reference, - address, - latitude, - longitude, - published_at, - authors_count, - versions_count, - contributions_count, - created_at, - updated_at, - coauthorships_count, - comments_count, - follows_count - - from source -) -select * from renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql deleted file mode 100644 index 24f0f26c..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/proposals/stg_decidim_proposals_votes.sql +++ /dev/null @@ -1,27 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_proposals_votes__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_proposals_proposal_votes" -), -renamed AS ( - SELECT - id, - decidim_proposal_id, - decidim_author_id, - created_at, - updated_at, - weight, - temporary - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql deleted file mode 100644 index 7ded8f15..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/scopes/stg_decidim_scopes.sql +++ /dev/null @@ -1,29 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_scopes__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_scopes" -), -renamed AS ( - SELECT - id, - decidim_organization_id, - created_at, - updated_at, - name::jsonb->>'fr' AS name, - scope_type_id, - parent_id, - code, - part_of - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_accountability_results.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_accountability_results.sql deleted file mode 100644 index ecfae97e..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_accountability_results.sql +++ /dev/null @@ -1,37 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_accountability_results__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_accountability_results" -), -renamed as ( - select - id, - title, - description, - reference, - start_date, - end_date, - progress, - parent_id, - decidim_accountability_status_id, - decidim_component_id, - decidim_scope_id, - created_at, - updated_at, - children_count, - weight, - external_id, - comments_count - FROM source -) -select * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_attachments.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_attachments.sql deleted file mode 100644 index 4d321dd7..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_attachments.sql +++ /dev/null @@ -1,32 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_attachments__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_attachments" -), -renamed as ( - SELECT - id, - title, - description, - file, - content_type, - file_size, - attached_to_id, - created_at, - updated_at, - attached_to_type, - weight, - attachment_collection_id - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_coauthorships.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_coauthorships.sql deleted file mode 100644 index 2081cdcf..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_coauthorships.sql +++ /dev/null @@ -1,30 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_coauthorships__dbt_tmp" - - - as - - ( - - -WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_coauthorships" -), -renamed AS ( - SELECT - id, - decidim_author_id, - decidim_user_group_id, - coauthorable_type, - coauthorable_id, - created_at, - updated_at, - decidim_author_type - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_comments.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_comments.sql deleted file mode 100644 index cc2e4895..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_comments.sql +++ /dev/null @@ -1,34 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_comments__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_comments_comments" -), -renamed as ( - SELECT - id, - decidim_commentable_type, - decidim_commentable_id, - decidim_author_id, - created_at, - updated_at, - depth, - alignment, - decidim_user_group_id, - decidim_root_commentable_type, - decidim_root_commentable_id, - decidim_author_type, - body::jsonb->>'fr' as body, - comments_count - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_components.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_components.sql deleted file mode 100644 index 085a86ae..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_components.sql +++ /dev/null @@ -1,31 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_components__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_components" -), -renamed AS ( - SELECT - id, - manifest_name, - name::jsonb->>'fr' AS name, - participatory_space_id, - participatory_space_type, - settings, - weight, - permissions, - published_at, - created_at, - updated_at - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_endorsements.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_endorsements.sql deleted file mode 100644 index a6ac65a7..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_endorsements.sql +++ /dev/null @@ -1,22 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_endorsements__dbt_tmp" - - - as - - ( - SELECT - id, - resource_type, - resource_id, - decidim_author_type, - decidim_author_id, - decidim_user_group_id, - created_at, - updated_at -FROM "test_lyon"."public"."decidim_endorsements" - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_follows.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_follows.sql deleted file mode 100644 index e0122d04..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_follows.sql +++ /dev/null @@ -1,26 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_follows__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_follows" -), -renamed as ( - SELECT - id, - decidim_user_id, - updated_at, - created_at, - decidim_followable_type, - decidim_followable_id - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings.sql deleted file mode 100644 index 156ef2bc..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings.sql +++ /dev/null @@ -1,35 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_meetings__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_meetings_meetings" -), -renamed AS ( - SELECT - id, - title::jsonb->>'fr' AS title, - regexp_replace(description::jsonb->>'fr', E'(<[^>]+>)|(&[a-z]+;)', '', 'gi') AS description, - coalesce(nullif(address,''), 'Pas d''adresse') as address, - coalesce(attendees_count, 0) as attendees_count, - created_at, - decidim_scope_id, - decidim_component_id, - start_time, - end_time, - registration_url, - type_of_meeting, - private_meeting, - decidim_author_id, - 'Decidim::Meetings::Meeting' as resource_type - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql deleted file mode 100644 index 41281f25..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_meetings_registrations.sql +++ /dev/null @@ -1,28 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_meetings_registrations__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_meetings_registrations" -), -renamed AS ( - select - id, - decidim_user_id, - decidim_meeting_id, - created_at, - updated_at, - code, - validated_at, - decidim_user_group_id - FROM source -) -select * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_moderations.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_moderations.sql deleted file mode 100644 index 47a87d15..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_moderations.sql +++ /dev/null @@ -1,30 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_moderations__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_moderations" -), -renamed AS ( - SELECT - id, - decidim_participatory_space_id, - decidim_reportable_type, - decidim_reportable_id, - report_count, - hidden_at, - created_at, - updated_at, - decidim_participatory_space_type, - reported_content - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql deleted file mode 100644 index 784a460d..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_process_steps.sql +++ /dev/null @@ -1,33 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_participatory_process_steps__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_participatory_process_steps" -), -renamed AS ( - select - id, - title::jsonb->>'fr' as title, - title::jsonb->>'fr' as description, - start_date, - end_date, - decidim_participatory_process_id, - created_at, - updated_at, - active, - position, - cta_text, - cta_path - - FROM source -) -select * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_processes.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_processes.sql deleted file mode 100644 index c6590459..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_participatory_processes.sql +++ /dev/null @@ -1,28 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_participatory_processes__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_participatory_processes" -), -renamed AS ( - SELECT - id, - published_at, - title::jsonb->>'fr' AS title, - subtitle::jsonb->>'fr' as subtitle, - slug, - 'Decidim::ParticipatoryProcess' as type, - 'processes' as space_type_slug, - decidim_organization_id - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_surveys.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_surveys.sql deleted file mode 100644 index a1e2c372..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_surveys.sql +++ /dev/null @@ -1,24 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_surveys__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_surveys_surveys" -), -renamed as ( - SELECT - id, - decidim_component_id, - created_at, - updated_at - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_users.sql b/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_users.sql deleted file mode 100644 index 8e95e476..00000000 --- a/projects/test_lyon/target/run/demo/models/staging/decidim/stg_decidim_users.sql +++ /dev/null @@ -1,53 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_users__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_users" -), -renamed AS ( - SELECT - id, - email, - sign_in_count, - last_sign_in_at, - created_at, - updated_at, - invitation_created_at, - invitation_sent_at, - invitation_accepted_at, - invited_by_id, - invited_by_type, - decidim_organization_id, - confirmed_at, - confirmation_token, - unconfirmed_email, - name, - locale, - deleted_at, - admin, - managed, - roles::text AS roles, - nickname, - accepted_tos_version, - type, - following_count, - followers_count, - failed_attempts, - locked_at, - admin_terms_accepted_at, - blocked, - blocked_at, - (CASE WHEN confirmed_at IS NULL THEN false ELSE true END) AS "confirmed", - extended_data - FROM source -) -SELECT * FROM renamed - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql b/projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql deleted file mode 100644 index 98dbd1d8..00000000 --- a/projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/int_decidim_awesome_proposal_extra_fields.sql +++ /dev/null @@ -1,31 +0,0 @@ - - - - - create table "test_lyon"."prod"."int_decidim_awesome_proposal_extra_fields__dbt_tmp" - - - as - - ( - WITH parsed_data AS ( - SELECT - decidim_awesome_proposal_extra_fields.id, - decidim_awesome_proposal_extra_fields.proposal_id, - xpath('//text()', unnest(xpath('//dt', xml_data)))::text AS private_field_description, - unnest(xpath('//dd/div/text()', unnest(xpath('//dd', xml_data))))::text AS private_field_content - FROM - "test_lyon"."prod"."stg_decidim_awesome_proposal_extra_fields" AS decidim_awesome_proposal_extra_fields, - LATERAL xmlparse(document private_body_clear) AS xml_data -) -SELECT - parsed_data.id, - parsed_data.proposal_id, - replace(replace(private_field_description, '{"', ''), '"}', '') AS private_field_description, - parsed_data.private_field_content -FROM - parsed_data -WHERE - private_field_content IS NOT NULL - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql b/projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql deleted file mode 100644 index ed4d9982..00000000 --- a/projects/test_lyon/target/run/test_lyon/models/intermediate/decidim_awesome/schema.yml/models/intermediate/decidim_awesome/testing_that_the_correct_xml_information_are_parsed.sql +++ /dev/null @@ -1,77 +0,0 @@ --- Build actual result given inputs -with dbt_internal_unit_test_actual as ( - select - id,proposal_id,private_field_description,private_field_content, 'actual' as "actual_or_expected" - from ( - WITH __dbt__cte__stg_decidim_awesome_proposal_extra_fields as ( - --- Fixture for stg_decidim_awesome_proposal_extra_fields -select - - cast(1 as bigint) - as id, - - cast(101 as bigint) - as proposal_id, cast(null as timestamp without time zone) as updated_at, cast(null as timestamp without time zone) as created_at, - - cast('
Cette idée est déposée à titre :
Individuel
Votre tranche d''âge :
16-25 ans
' as text) - as private_body_clear -), parsed_data AS ( - SELECT - decidim_awesome_proposal_extra_fields.id, - decidim_awesome_proposal_extra_fields.proposal_id, - xpath('//text()', unnest(xpath('//dt', xml_data)))::text AS private_field_description, - unnest(xpath('//dd/div/text()', unnest(xpath('//dd', xml_data))))::text AS private_field_content - FROM - __dbt__cte__stg_decidim_awesome_proposal_extra_fields AS decidim_awesome_proposal_extra_fields, - LATERAL xmlparse(document private_body_clear) AS xml_data -) -SELECT - parsed_data.id, - parsed_data.proposal_id, - replace(replace(private_field_description, '{"', ''), '"}', '') AS private_field_description, - parsed_data.private_field_content -FROM - parsed_data -WHERE - private_field_content IS NOT NULL - ) _dbt_internal_unit_test_actual -), --- Build expected result -dbt_internal_unit_test_expected as ( - select - id, proposal_id, private_field_description, private_field_content, 'expected' as "actual_or_expected" - from ( - select - - cast(1 as bigint) - as id, - - cast(101 as bigint) - as proposal_id, - - cast('Cette idée est déposée à titre :' as text) - as private_field_description, - - cast('Individuel' as text) - as private_field_content -union all -select - - cast(1 as bigint) - as id, - - cast(101 as bigint) - as proposal_id, - - cast('Votre tranche d''âge :' as text) - as private_field_description, - - cast('16-25 ans' as text) - as private_field_content - ) _dbt_internal_unit_test_expected -) --- Union actual and expected results -select * from dbt_internal_unit_test_actual -union all -select * from dbt_internal_unit_test_expected \ No newline at end of file diff --git a/projects/test_lyon/target/run/test_lyon/models/marts/participations_with_extended_data.sql b/projects/test_lyon/target/run/test_lyon/models/marts/participations_with_extended_data.sql deleted file mode 100644 index de8ca5d6..00000000 --- a/projects/test_lyon/target/run/test_lyon/models/marts/participations_with_extended_data.sql +++ /dev/null @@ -1,21 +0,0 @@ - - - - - create table "test_lyon"."prod"."participations_with_extended_data__dbt_tmp" - - - as - - ( - SELECT - DISTINCT ON (user_id, ps_title) - user_id, - users.age_category AS age_category, - decidim_component_id, - components.ps_title AS ps_title -FROM "test_lyon"."prod"."participations" participations - JOIN "test_lyon"."prod"."components" components ON participations.decidim_component_id = components.id - JOIN "test_lyon"."prod"."users" users ON participations.user_id = users.id - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql b/projects/test_lyon/target/run/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql deleted file mode 100644 index 525004c8..00000000 --- a/projects/test_lyon/target/run/test_lyon/models/staging/decidim/stg_decidim_awesome_proposal_extra_fields.sql +++ /dev/null @@ -1,23 +0,0 @@ - - - - - create table "test_lyon"."prod"."stg_decidim_awesome_proposal_extra_fields__dbt_tmp" - - - as - - ( - WITH source AS ( - SELECT * FROM "test_lyon"."public"."decidim_awesome_proposal_extra_fields_test" -) - -SELECT - id, - decidim_proposal_id AS proposal_id, - updated_at, - created_at, - private_body_clear -FROM source - ); - \ No newline at end of file diff --git a/projects/test_lyon/target/run_results.json b/projects/test_lyon/target/run_results.json deleted file mode 100644 index fe8fbd94..00000000 --- a/projects/test_lyon/target/run_results.json +++ /dev/null @@ -1 +0,0 @@ -{"metadata": {"dbt_schema_version": "https://schemas.getdbt.com/dbt/run-results/v6.json", "dbt_version": "1.8.7", "generated_at": "2024-09-27T14:10:06.935490Z", "invocation_id": "abd1849f-2f07-41b8-9fd3-963d4daf1290", "env": {}}, "results": [{"status": "pass", "timing": [{"name": "compile", "started_at": "2024-09-27T14:10:06.469911Z", "completed_at": "2024-09-27T14:10:06.469921Z"}, {"name": "execute", "started_at": "2024-09-27T14:10:06.470529Z", "completed_at": "2024-09-27T14:10:06.820048Z"}], "thread_id": "Thread-1 (worker)", "execution_time": 0.36307215690612793, "adapter_response": {"_message": "SELECT 4", "code": "SELECT", "rows_affected": 4}, "message": null, "failures": 0, "unique_id": "unit_test.test_lyon.int_decidim_awesome_proposal_extra_fields.testing_that_the_correct_xml_information_are_parsed", "compiled": true, "compiled_code": "WITH __dbt__cte__stg_decidim_awesome_proposal_extra_fields as (\n\n-- Fixture for stg_decidim_awesome_proposal_extra_fields\nselect \n \n cast(1 as bigint)\n as id, \n \n cast(101 as bigint)\n as proposal_id, cast(null as timestamp without time zone) as updated_at, cast(null as timestamp without time zone) as created_at, \n \n cast('
Cette id\u00e9e est d\u00e9pos\u00e9e \u00e0 titre :
Individuel
Votre tranche d''\u00e2ge :
16-25 ans
' as text)\n as private_body_clear\n), parsed_data AS (\n SELECT\n decidim_awesome_proposal_extra_fields.id,\n decidim_awesome_proposal_extra_fields.proposal_id,\n xpath('//text()', unnest(xpath('//dt', xml_data)))::text AS private_field_description,\n unnest(xpath('//dd/div/text()', unnest(xpath('//dd', xml_data))))::text AS private_field_content\n FROM\n __dbt__cte__stg_decidim_awesome_proposal_extra_fields AS decidim_awesome_proposal_extra_fields,\n LATERAL xmlparse(document private_body_clear) AS xml_data\n)\nSELECT\n parsed_data.id,\n parsed_data.proposal_id,\n replace(replace(private_field_description, '{\"', ''), '\"}', '') AS private_field_description,\n parsed_data.private_field_content\nFROM\n parsed_data\nWHERE\n private_field_content IS NOT NULL", "relation_name": null}], "elapsed_time": 0.8687701225280762, "args": {"indirect_selection": "eager", "log_path": "/Users/uosp/Documents/osp_dev/dbt-processing/projects/test_lyon/logs", "defer": false, "log_file_max_bytes": 10485760, "require_resource_names_without_spaces": false, "use_colors_file": true, "enable_legacy_logger": false, "log_level": "info", "partial_parse": true, "profiles_dir": "/Users/uosp/Documents/osp_dev/dbt-processing/projects/test_lyon", "require_explicit_package_overrides_for_builtin_materializations": true, "which": "test", "log_format_file": "debug", "exclude": [], "favor_state": false, "project_dir": "/Users/uosp/Documents/osp_dev/dbt-processing/projects/test_lyon", "log_level_file": "debug", "write_json": true, "select": ["path:models/intermediate/decidim_awesome"], "cache_selected_only": false, "quiet": false, "warn_error_options": {"include": [], "exclude": []}, "populate_cache": true, "send_anonymous_usage_stats": true, "printer_width": 80, "version_check": true, "use_colors": true, "macro_debugging": false, "vars": {}, "print": true, "static_parser": true, "partial_parse_file_diff": true, "invocation_command": "dbt test --select path:models/intermediate/decidim_awesome", "strict_mode": false, "log_format": "default", "introspect": true, "show_resource_report": false, "source_freshness_run_project_hooks": false}} \ No newline at end of file diff --git a/projects/test_lyon/target/semantic_manifest.json b/projects/test_lyon/target/semantic_manifest.json deleted file mode 100644 index a40b829c..00000000 --- a/projects/test_lyon/target/semantic_manifest.json +++ /dev/null @@ -1 +0,0 @@ -{"semantic_models": [], "metrics": [], "project_configuration": {"time_spine_table_configurations": [], "metadata": null, "dsi_package_version": {"major_version": "0", "minor_version": "5", "patch_version": "1"}}, "saved_queries": []} \ No newline at end of file From e990f2bda75fd4f50331342d907d5df303ff018e Mon Sep 17 00:00:00 2001 From: fujistone Date: Mon, 30 Sep 2024 00:53:15 +0200 Subject: [PATCH 3/3] adding private fields models to lyon project --- .../intermediate/decidim_awesome/schema.yml | 32 +++++++++++++++++++ ..._decidim_awesome_proposal_extra_fields.sql | 19 +++++++++++ .../decidim_awesome_proposal_extra_fields.sql | 11 +++++++ .../models/staging/decidim_awesome/schema.yml | 25 +++++++++++++++ ..._decidim_awesome_proposal_extra_fields.sql | 12 +++++++ 5 files changed, 99 insertions(+) create mode 100644 projects/lyon/models/intermediate/decidim_awesome/schema.yml create mode 100644 projects/lyon/models/intermediate/int_decidim_awesome_proposal_extra_fields.sql create mode 100644 projects/lyon/models/marts/decidim_awesome/decidim_awesome_proposal_extra_fields.sql create mode 100644 projects/lyon/models/staging/decidim_awesome/schema.yml create mode 100644 projects/lyon/models/staging/decidim_awesome/stg_decidim_awesome_proposal_extra_fields.sql diff --git a/projects/lyon/models/intermediate/decidim_awesome/schema.yml b/projects/lyon/models/intermediate/decidim_awesome/schema.yml new file mode 100644 index 00000000..1552b69e --- /dev/null +++ b/projects/lyon/models/intermediate/decidim_awesome/schema.yml @@ -0,0 +1,32 @@ +version: 2 + +models: + - name: int_decidim_awesome_private_proposal_fields + description: "Model for parsing the information in the private proposals fields and unnest the XML data into readable questions and answers columns." + columns: + - name: id + description: "Primary key." + - name: proposal_id + description: "Id of the proposal the private field is linked to." + - name: private_field_description + description: "Description of the private field to be answered." + - name: private_field_content + description: "The content filled by the user for a specific private field. There can be multiple content for the same private field description." + + +unit_tests: + + - name: testing_that_the_correct_xml_information_are_parsed + description: "Checks that age matching fetches the correct infos " + model: int_decidim_awesome_proposal_extra_fields + given: + - input: ref('stg_decidim_awesome_proposal_extra_fields') + format: dict + rows: + - {id: 1, proposal_id: 101, private_body_clear: "
Cette idée est déposée à titre :
Individuel
Votre tranche d'âge :
16-25 ans
"} + expect: + format: dict + rows: + - {id: 1, proposal_id: 101, private_field_description: "Cette idée est déposée à titre :", private_field_content: "Individuel"} + - {id: 1, proposal_id: 101, private_field_description: "Votre tranche d'âge :", private_field_content: "16-25 ans"} + \ No newline at end of file diff --git a/projects/lyon/models/intermediate/int_decidim_awesome_proposal_extra_fields.sql b/projects/lyon/models/intermediate/int_decidim_awesome_proposal_extra_fields.sql new file mode 100644 index 00000000..968e239c --- /dev/null +++ b/projects/lyon/models/intermediate/int_decidim_awesome_proposal_extra_fields.sql @@ -0,0 +1,19 @@ +WITH parsed_data AS ( + SELECT + decidim_awesome_proposal_extra_fields.id, + decidim_awesome_proposal_extra_fields.proposal_id, + xpath('//text()', unnest(xpath('//dt', xml_data)))::text AS private_field_description, + unnest(xpath('//dd/div/text()', unnest(xpath('//dd', xml_data))))::text AS private_field_content + FROM + {{ ref ("stg_decidim_awesome_proposal_extra_fields")}} AS decidim_awesome_proposal_extra_fields, + LATERAL xmlparse(document private_body_clear) AS xml_data +) +SELECT + parsed_data.id, + parsed_data.proposal_id, + replace(replace(private_field_description, '{"', ''), '"}', '') AS private_field_description, + parsed_data.private_field_content +FROM + parsed_data +WHERE + private_field_content IS NOT NULL \ No newline at end of file diff --git a/projects/lyon/models/marts/decidim_awesome/decidim_awesome_proposal_extra_fields.sql b/projects/lyon/models/marts/decidim_awesome/decidim_awesome_proposal_extra_fields.sql new file mode 100644 index 00000000..116eedcf --- /dev/null +++ b/projects/lyon/models/marts/decidim_awesome/decidim_awesome_proposal_extra_fields.sql @@ -0,0 +1,11 @@ +SELECT + decidim_awesome_proposal_extra_fields.id, + decidim_awesome_proposal_extra_fields.proposal_id, + decidim_awesome_proposal_extra_fields.private_field_description, + decidim_awesome_proposal_extra_fields.private_field_content, + decidim_proposals_proposals.decidim_component_id, + components.ps_title +FROM + {{ ref ("int_decidim_awesome_proposal_extra_fields")}} AS decidim_awesome_proposal_extra_fields +JOIN {{ ref ("stg_decidim_proposals")}} AS decidim_proposals_proposals ON decidim_awesome_proposal_extra_fields.proposal_id = decidim_proposals_proposals.id +JOIN {{ ref ("components")}} AS components ON decidim_proposals_proposals.decidim_component_id = components.id \ No newline at end of file diff --git a/projects/lyon/models/staging/decidim_awesome/schema.yml b/projects/lyon/models/staging/decidim_awesome/schema.yml new file mode 100644 index 00000000..826f0346 --- /dev/null +++ b/projects/lyon/models/staging/decidim_awesome/schema.yml @@ -0,0 +1,25 @@ +version: 2 + + +sources: + - name: decidim + database: "{{ env_var('DBNAME') }}" + schema: public + tables: + - name: decidim_awesome_proposal_extra_fields_test + +models: + - name: stg_decidim_awesome_proposal_extra_fields + description: "Table for private proposal fields in the module decidim awesome." + columns: + - name: id + description: "Primary key." + data_tests: + - not_null + - unique + - name: proposal_id + description: "Id of the proposal the private field is linked to." + data_tests: + - not_null + - name: private_body + description: "Body of the answers of the private proposals fields answered by the user. The format is XML." \ No newline at end of file diff --git a/projects/lyon/models/staging/decidim_awesome/stg_decidim_awesome_proposal_extra_fields.sql b/projects/lyon/models/staging/decidim_awesome/stg_decidim_awesome_proposal_extra_fields.sql new file mode 100644 index 00000000..af850121 --- /dev/null +++ b/projects/lyon/models/staging/decidim_awesome/stg_decidim_awesome_proposal_extra_fields.sql @@ -0,0 +1,12 @@ +WITH source AS ( + SELECT * FROM {{ source('decidim', 'decidim_awesome_proposal_extra_fields_test') }} +) + + +SELECT + id, + decidim_proposal_id AS proposal_id, + updated_at, + created_at, + replace(private_body_clear, ' ', '') AS private_body_clear +FROM source \ No newline at end of file