|
| 1 | +{%- macro create_task(stream, target_table, sql, tmp_relation, unique_key) -%} |
| 2 | + {%- do log('Target Table is: ' ~ target_table, info = true) -%} |
| 3 | + {%- set name = config.require('task').name -%} |
| 4 | + {%- do log('Creating Task: ' ~ name, info = true) -%} |
| 5 | + {# This SQL has formatting issues think of a better way to populated and validate the config#} |
| 6 | + {%- set args_sql -%} |
| 7 | + COMMENT = '{{ config.get('stream').description or '' }}' |
| 8 | + {{ "WAREHOUSE = " ~ config.get('task').warehouse|upper if config.get('task').warehouse|upper else '' }} |
| 9 | + {{ "SCHEDULE = '" ~ config.get('task').schedule|upper ~ "'" if config.get('task').schedule|upper else '' -}} |
| 10 | + {{ "EXECUTE AS USER = '" ~ config.get('task').execute_as_user|upper ~ "'" if config.get('task').execute_as_user|upper else '' -}} |
| 11 | + {{ "ALLOW_OVERLAPPING_EXECUTION = " ~ config.get('task').allow_overlapping_execution|upper if config.get('task').allow_overlapping_execution else '' -}} |
| 12 | + {{ "USER_TASK_TIMEOUT_MS = " ~ config.get('task').user_task_timeout_ms if config.get('task').user_task_timeout_ms else '' -}} |
| 13 | + {{ "SUSPEND_TASK_AFTER_NUM_FAILURES = " ~ config.get('task').suspend_task_after_num_failures if config.get('task').suspend_task_after_num_failures else '' -}} |
| 14 | + {{ "ERROR_INTEGRATION = '" ~ config.get('task').error_integration|upper ~ "'" if config.get('task').error_integration|upper else '' -}} |
| 15 | + {{ "SUCCESS_INTEGRATION = '" ~ config.get('task').success_integration|upper ~ "'" if config.get('task').success_integration|upper else '' -}} |
| 16 | + {{ "LOG_LEVEL = '" ~ config.get('task').log_level|upper ~ "'" if config.get('task').log_level|upper else '' -}} |
| 17 | + {{ "FINALIZE = '" ~ config.get('task').finalize|upper ~ "'" if config.get('task').finalize|upper else '' -}} |
| 18 | + {{ "TASK_AUTO_RETRY_ATTEMPTS = " ~ config.get('task').task_auto_retry_attempts if config.get('task').task_auto_retry_attempts else '' -}} |
| 19 | + {{ "USER_TASK_MINIMUM_TRIGGER_INTERVAL_IN_SECONDS = " ~ config.get('task').user_task_minimum_trigger_interval_in_seconds if config.get('task').user_task_minimum_trigger_interval_in_seconds else '' -}} |
| 20 | + {{ "TARGET_COMPLETION_INTERVAL = '" ~ config.get('task').target_completion_interval|upper ~ "'" if config.get('task').target_completion_interval|upper else '' -}} |
| 21 | + {{ "SERVERLESS_TASK_MIN_STATEMENT_SIZE = '" ~ config.get('task').serverless_task_min_statement_size|upper ~ "'" if config.get('task').serverless_task_min_statement_size|upper else '' -}} |
| 22 | + {{ "SERVERLESS_TASK_MAX_STATEMENT_SIZE = '" ~ config.get('task').serverless_task_max_statement_size|upper ~ "'" if config.get('task').serverless_task_max_statement_size|upper else '' }} |
| 23 | + {{ "WHEN \n " ~ config.get('task').when|upper if config.get('task').when|upper else '' }} |
| 24 | + {%- endset -%} |
| 25 | + {%- do log('Printing Args SQL: ' ~ args_sql, info = true) -%} |
| 26 | + {%- set columns = adapter.get_columns_in_relation(tmp_relation) | rejectattr('name', 'equalto', 'METADATA$ACTION') |
| 27 | + | rejectattr('name', 'equalto', 'METADATA$ISUPDATE') |
| 28 | + | rejectattr('name', 'equalto', 'METADATA$ROW_ID') |
| 29 | + | list -%} |
| 30 | + {%- set merge_task -%} |
| 31 | + MERGE INTO {{target_table }} TARGET |
| 32 | + USING {{ stream }} SOURCE |
| 33 | + ON ({%- for key in unique_key -%} |
| 34 | + TARGET.{{ key }} = SOURCE.{{ key }}{%- if not loop.last -%} AND {%- endif -%}{%- endfor -%} |
| 35 | + ) |
| 36 | + -- Mode DELETE |
| 37 | + WHEN MATCHED AND SOURCE.METADATA$ACTION = 'DELETE' AND SOURCE.METADATA$ISUPDATE = 'FALSE' THEN |
| 38 | + DELETE |
| 39 | + -- Mode UPDATE |
| 40 | + WHEN MATCHED AND SOURCE.METADATA$ACTION = 'INSERT' THEN |
| 41 | + UPDATE SET {% for col in columns %} |
| 42 | + TARGET.{{ col.name }} = SOURCE.{{ col.name }}{%- if not loop.last -%},{%- endif -%}{%- endfor -%} |
| 43 | + -- Mode INSERT |
| 44 | + WHEN NOT MATCHED AND SOURCE.METADATA$ACTION = 'INSERT' THEN INSERT |
| 45 | + ( {%- for col in columns -%} |
| 46 | + {{- col.name -}}{%- if not loop.last -%},{%- endif -%}{%- endfor -%} |
| 47 | + ) |
| 48 | + VALUES |
| 49 | + ({%- for col in columns -%} |
| 50 | + SOURCE.{{- col.name -}}{%- if not loop.last -%},{%- endif -%}{%- endfor -%} |
| 51 | + ) |
| 52 | + {%- endset -%} |
| 53 | + {%- set run_sql -%} |
| 54 | + CREATE OR ALTER TASK {{ name }} |
| 55 | + {{ args_sql }} |
| 56 | + AS |
| 57 | + {{ merge_task }} |
| 58 | + {%- endset -%} |
| 59 | + {{ run_sql }} |
| 60 | +{%- endmacro -%} |
0 commit comments