dataops-testgen 2.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. dataops_testgen-2.2.0.dist-info/LICENSE +203 -0
  2. dataops_testgen-2.2.0.dist-info/METADATA +287 -0
  3. dataops_testgen-2.2.0.dist-info/NOTICE +5 -0
  4. dataops_testgen-2.2.0.dist-info/RECORD +270 -0
  5. dataops_testgen-2.2.0.dist-info/WHEEL +5 -0
  6. dataops_testgen-2.2.0.dist-info/entry_points.txt +2 -0
  7. dataops_testgen-2.2.0.dist-info/top_level.txt +1 -0
  8. testgen/__init__.py +0 -0
  9. testgen/__main__.py +770 -0
  10. testgen/commands/__init__.py +0 -0
  11. testgen/commands/queries/__init__.py +0 -0
  12. testgen/commands/queries/execute_cat_tests_query.py +95 -0
  13. testgen/commands/queries/execute_tests_query.py +160 -0
  14. testgen/commands/queries/generate_tests_query.py +94 -0
  15. testgen/commands/queries/profiling_query.py +366 -0
  16. testgen/commands/queries/test_parameter_validation_query.py +88 -0
  17. testgen/commands/run_execute_cat_tests.py +162 -0
  18. testgen/commands/run_execute_tests.py +168 -0
  19. testgen/commands/run_generate_tests.py +107 -0
  20. testgen/commands/run_get_entities.py +122 -0
  21. testgen/commands/run_launch_db_config.py +84 -0
  22. testgen/commands/run_observability_exporter.py +330 -0
  23. testgen/commands/run_profiling_bridge.py +495 -0
  24. testgen/commands/run_quick_start.py +168 -0
  25. testgen/commands/run_setup_profiling_tools.py +96 -0
  26. testgen/commands/run_test_definition.py +146 -0
  27. testgen/commands/run_test_parameter_validation.py +135 -0
  28. testgen/commands/run_upgrade_db_config.py +156 -0
  29. testgen/common/__init__.py +8 -0
  30. testgen/common/clean_sql.py +53 -0
  31. testgen/common/credentials.py +25 -0
  32. testgen/common/database/__init__.py +0 -0
  33. testgen/common/database/database_service.py +629 -0
  34. testgen/common/database/flavor/__init__.py +0 -0
  35. testgen/common/database/flavor/flavor_service.py +75 -0
  36. testgen/common/database/flavor/mssql_flavor_service.py +34 -0
  37. testgen/common/database/flavor/postgresql_flavor_service.py +5 -0
  38. testgen/common/database/flavor/redshift_flavor_service.py +22 -0
  39. testgen/common/database/flavor/snowflake_flavor_service.py +69 -0
  40. testgen/common/database/flavor/trino_flavor_service.py +21 -0
  41. testgen/common/date_service.py +68 -0
  42. testgen/common/display_service.py +85 -0
  43. testgen/common/docker_service.py +76 -0
  44. testgen/common/encrypt.py +55 -0
  45. testgen/common/get_pipeline_parms.py +57 -0
  46. testgen/common/logs.py +79 -0
  47. testgen/common/process_service.py +62 -0
  48. testgen/common/read_file.py +69 -0
  49. testgen/settings.py +440 -0
  50. testgen/template/dbsetup/010_create_base_schema.sql +2 -0
  51. testgen/template/dbsetup/020_create_standard_functions_sprocs.sql +179 -0
  52. testgen/template/dbsetup/030_initialize_new_schema_structure.sql +735 -0
  53. testgen/template/dbsetup/040_populate_new_schema_project.sql +59 -0
  54. testgen/template/dbsetup/050_populate_new_schema_metadata.sql +1517 -0
  55. testgen/template/dbsetup/060_create_standard_views.sql +248 -0
  56. testgen/template/dbsetup/070_create_default_users.sql +17 -0
  57. testgen/template/dbsetup/075_grant_role_rights.sql +43 -0
  58. testgen/template/dbsetup/080_set_current_revision.sql +5 -0
  59. testgen/template/dbupgrade/0100_incremental_upgrade.sql +5 -0
  60. testgen/template/dbupgrade/0101_incremental_upgrade.sql +15 -0
  61. testgen/template/dbupgrade/0102_incremental_upgrade.sql +4 -0
  62. testgen/template/dbupgrade/0103_incremental_upgrade.sql +22 -0
  63. testgen/template/dbupgrade/0104_incremental_upgrade.sql +44 -0
  64. testgen/template/dbupgrade/0105_incremental_upgrade.sql +1 -0
  65. testgen/template/dbupgrade/0106_incremental_upgrade.sql +5 -0
  66. testgen/template/dbupgrade/0107_incremental_upgrade.sql +3 -0
  67. testgen/template/dbupgrade_helpers/get_tg_revision.sql +2 -0
  68. testgen/template/exec_cat_tests/ex_cat_build_agg_table_tests.sql +116 -0
  69. testgen/template/exec_cat_tests/ex_cat_get_distinct_tables.sql +11 -0
  70. testgen/template/exec_cat_tests/ex_cat_results_parse.sql +69 -0
  71. testgen/template/exec_cat_tests/ex_cat_retrieve_agg_test_parms.sql +6 -0
  72. testgen/template/exec_cat_tests/ex_cat_test_query.sql +8 -0
  73. testgen/template/execution/ex_finalize_test_run_results.sql +37 -0
  74. testgen/template/execution/ex_get_tests_non_cat.sql +47 -0
  75. testgen/template/execution/ex_update_test_record_in_testrun_table.sql +27 -0
  76. testgen/template/execution/ex_write_test_record_to_testrun_table.sql +6 -0
  77. testgen/template/flavors/generic/exec_query_tests/ex_aggregate_match_no_drops_generic.sql +48 -0
  78. testgen/template/flavors/generic/exec_query_tests/ex_aggregate_match_num_incr_generic.sql +34 -0
  79. testgen/template/flavors/generic/exec_query_tests/ex_aggregate_match_percent_above_generic.sql +49 -0
  80. testgen/template/flavors/generic/exec_query_tests/ex_aggregate_match_percent_within_generic.sql +49 -0
  81. testgen/template/flavors/generic/exec_query_tests/ex_aggregate_match_same_generic.sql +49 -0
  82. testgen/template/flavors/generic/exec_query_tests/ex_custom_query_generic.sql +39 -0
  83. testgen/template/flavors/generic/exec_query_tests/ex_data_match_2way_generic.sql +58 -0
  84. testgen/template/flavors/generic/exec_query_tests/ex_data_match_generic.sql +44 -0
  85. testgen/template/flavors/generic/exec_query_tests/ex_prior_match_generic.sql +37 -0
  86. testgen/template/flavors/generic/exec_query_tests/ex_relative_entropy_generic.sql +53 -0
  87. testgen/template/flavors/generic/exec_query_tests/ex_window_match_no_drops_generic.sql +46 -0
  88. testgen/template/flavors/generic/exec_query_tests/ex_window_match_same_generic.sql +59 -0
  89. testgen/template/flavors/generic/profiling/contingency_counts.sql +3 -0
  90. testgen/template/flavors/generic/validate_tests/ex_get_project_column_list_generic.sql +3 -0
  91. testgen/template/flavors/mssql/exec_query_tests/ex_relative_entropy_mssql.sql +53 -0
  92. testgen/template/flavors/mssql/profiling/project_ddf_query_mssql.sql +35 -0
  93. testgen/template/flavors/mssql/profiling/project_profiling_query_mssql.yaml +246 -0
  94. testgen/template/flavors/mssql/profiling/project_secondary_profiling_query_mssql.sql +36 -0
  95. testgen/template/flavors/mssql/setup_profiling_tools/00_drop_existing_functions_mssql.sql +8 -0
  96. testgen/template/flavors/mssql/setup_profiling_tools/01_create_functions_mssql.sql +12 -0
  97. testgen/template/flavors/mssql/setup_profiling_tools/02_create_functions_mssql.sql +54 -0
  98. testgen/template/flavors/mssql/setup_profiling_tools/create_qc_schema_mssql.sql +4 -0
  99. testgen/template/flavors/mssql/setup_profiling_tools/grant_execute_privileges_mssql.sql +1 -0
  100. testgen/template/flavors/postgresql/exec_query_tests/ex_window_match_no_drops_postgresql.sql +46 -0
  101. testgen/template/flavors/postgresql/exec_query_tests/ex_window_match_same_postgresql.sql +59 -0
  102. testgen/template/flavors/postgresql/profiling/project_ddf_query_postgresql.sql +42 -0
  103. testgen/template/flavors/postgresql/profiling/project_profiling_query_postgresql.yaml +225 -0
  104. testgen/template/flavors/postgresql/profiling/project_secondary_profiling_query_postgresql.sql +28 -0
  105. testgen/template/flavors/postgresql/setup_profiling_tools/create_functions_postgresql.sql +157 -0
  106. testgen/template/flavors/postgresql/setup_profiling_tools/create_qc_schema_postgresql.sql +1 -0
  107. testgen/template/flavors/postgresql/setup_profiling_tools/grant_execute_privileges_postgresql.sql +2 -0
  108. testgen/template/flavors/redshift/profiling/project_ddf_query_redshift.sql +38 -0
  109. testgen/template/flavors/redshift/profiling/project_profiling_query_redshift.yaml +221 -0
  110. testgen/template/flavors/redshift/profiling/project_secondary_profiling_query_redshift.sql +29 -0
  111. testgen/template/flavors/redshift/setup_profiling_tools/create_functions_redshift.sql +115 -0
  112. testgen/template/flavors/redshift/setup_profiling_tools/create_qc_schema_redshift.sql +1 -0
  113. testgen/template/flavors/redshift/setup_profiling_tools/grant_execute_privileges_redshift.sql +2 -0
  114. testgen/template/flavors/snowflake/profiling/project_ddf_query_snowflake.sql +38 -0
  115. testgen/template/flavors/snowflake/profiling/project_profiling_query_snowflake.yaml +220 -0
  116. testgen/template/flavors/snowflake/profiling/project_secondary_profiling_query_snowflake.sql +29 -0
  117. testgen/template/flavors/snowflake/setup_profiling_tools/create_functions_snowflake.sql +69 -0
  118. testgen/template/flavors/snowflake/setup_profiling_tools/create_qc_schema_snowflake.sql +1 -0
  119. testgen/template/flavors/snowflake/setup_profiling_tools/grant_execute_privileges_snowflake.sql +6 -0
  120. testgen/template/flavors/trino/profiling/project_profiling_query_trino.yaml +219 -0
  121. testgen/template/flavors/trino/setup_profiling_tools/create_functions_trino.sql +92 -0
  122. testgen/template/flavors/trino/setup_profiling_tools/create_qc_schema_trino.sql +1 -0
  123. testgen/template/gen_funny_cat_tests/gen_test_constant.sql +104 -0
  124. testgen/template/gen_funny_cat_tests/gen_test_distinct_value_ct.sql +98 -0
  125. testgen/template/gen_funny_cat_tests/gen_test_row_ct.sql +57 -0
  126. testgen/template/gen_funny_cat_tests/gen_test_row_ct_pct.sql +59 -0
  127. testgen/template/generation/gen_delete_old_tests.sql +5 -0
  128. testgen/template/generation/gen_insert_test_suite.sql +5 -0
  129. testgen/template/generation/gen_retrieve_or_insert_test_suite.sql +58 -0
  130. testgen/template/generation/gen_standard_test_type_list.sql +13 -0
  131. testgen/template/generation/gen_standard_tests.sql +48 -0
  132. testgen/template/get_entities/get_connection.sql +21 -0
  133. testgen/template/get_entities/get_connections_list.sql +9 -0
  134. testgen/template/get_entities/get_latest.sql +4 -0
  135. testgen/template/get_entities/get_profile.sql +12 -0
  136. testgen/template/get_entities/get_profile_info.sql +17 -0
  137. testgen/template/get_entities/get_profile_list.sql +17 -0
  138. testgen/template/get_entities/get_profile_screen.sql +275 -0
  139. testgen/template/get_entities/get_project_list.sql +6 -0
  140. testgen/template/get_entities/get_table_group_list.sql +10 -0
  141. testgen/template/get_entities/get_test_generation_list.sql +18 -0
  142. testgen/template/get_entities/get_test_info.sql +41 -0
  143. testgen/template/get_entities/get_test_results_for_run_cli.sql +16 -0
  144. testgen/template/get_entities/get_test_run_list.sql +24 -0
  145. testgen/template/get_entities/get_test_suite.sql +13 -0
  146. testgen/template/get_entities/get_test_suite_list.sql +18 -0
  147. testgen/template/get_entities/list_test_types.sql +4 -0
  148. testgen/template/observability/get_event_data.sql +23 -0
  149. testgen/template/observability/get_test_results.sql +41 -0
  150. testgen/template/observability/update_test_results_exported_to_observability.sql +12 -0
  151. testgen/template/parms/parms_profiling.sql +34 -0
  152. testgen/template/parms/parms_test_execution.sql +13 -0
  153. testgen/template/parms/parms_test_gen.sql +23 -0
  154. testgen/template/profiling/contingency_columns.sql +7 -0
  155. testgen/template/profiling/datatype_suggestions.sql +56 -0
  156. testgen/template/profiling/functional_datatype.sql +523 -0
  157. testgen/template/profiling/functional_tabletype_stage.sql +48 -0
  158. testgen/template/profiling/functional_tabletype_update.sql +8 -0
  159. testgen/template/profiling/pii_flag.sql +133 -0
  160. testgen/template/profiling/profile_anomalies_screen_column.sql +22 -0
  161. testgen/template/profiling/profile_anomalies_screen_multi_column.sql +58 -0
  162. testgen/template/profiling/profile_anomalies_screen_table.sql +22 -0
  163. testgen/template/profiling/profile_anomalies_screen_table_dates.sql +30 -0
  164. testgen/template/profiling/profile_anomalies_screen_variants.sql +40 -0
  165. testgen/template/profiling/profile_anomaly_types_get.sql +3 -0
  166. testgen/template/profiling/project_get_table_sample_count.sql +22 -0
  167. testgen/template/profiling/project_profile_run_record_insert.sql +8 -0
  168. testgen/template/profiling/project_profile_run_record_update.sql +5 -0
  169. testgen/template/profiling/project_profile_run_record_update_status.sql +5 -0
  170. testgen/template/profiling/project_update_profile_results_to_estimates.sql +32 -0
  171. testgen/template/profiling/refresh_anomalies.sql +33 -0
  172. testgen/template/profiling/refresh_data_chars_from_profiling.sql +156 -0
  173. testgen/template/profiling/secondary_profiling_columns.sql +12 -0
  174. testgen/template/profiling/secondary_profiling_delete.sql +4 -0
  175. testgen/template/profiling/secondary_profiling_update.sql +18 -0
  176. testgen/template/quick_start/populate_target_data.sql +1077 -0
  177. testgen/template/quick_start/recreate_target_data_schema.sql +167 -0
  178. testgen/template/quick_start/update_target_data.sql +100 -0
  179. testgen/template/updates/create_tmp_test_definition.sql +19 -0
  180. testgen/template/updates/get_test_def_parms.sql +38 -0
  181. testgen/template/updates/populate_stg_test_definitions.sql +184 -0
  182. testgen/template/validate_tests/ex_disable_tests_test_definitions.sql +5 -0
  183. testgen/template/validate_tests/ex_flag_tests_test_definitions.sql +64 -0
  184. testgen/template/validate_tests/ex_get_project_column_list_generic.sql +3 -0
  185. testgen/template/validate_tests/ex_get_test_column_list_tg.sql +65 -0
  186. testgen/template/validate_tests/ex_write_test_val_errors.sql +22 -0
  187. testgen/ui/__init__.py +0 -0
  188. testgen/ui/app.py +98 -0
  189. testgen/ui/assets/dk_logo.svg +46 -0
  190. testgen/ui/assets/question_mark.png +0 -0
  191. testgen/ui/assets/scripts.js +68 -0
  192. testgen/ui/assets/style.css +140 -0
  193. testgen/ui/bootstrap.py +109 -0
  194. testgen/ui/components/__init__.py +0 -0
  195. testgen/ui/components/frontend/css/KFOlCnqEu92Fr1MmEU9fBBc4.woff2 +0 -0
  196. testgen/ui/components/frontend/css/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2 +0 -0
  197. testgen/ui/components/frontend/css/KFOmCnqEu92Fr1Mu4mxK.woff2 +0 -0
  198. testgen/ui/components/frontend/css/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 +0 -0
  199. testgen/ui/components/frontend/css/material-symbols-rounded.css +24 -0
  200. testgen/ui/components/frontend/css/material-symbols-rounded.woff2 +0 -0
  201. testgen/ui/components/frontend/css/roboto-font-faces.css +35 -0
  202. testgen/ui/components/frontend/css/shared.css +36 -0
  203. testgen/ui/components/frontend/img/dk_logo.svg +46 -0
  204. testgen/ui/components/frontend/index.html +17 -0
  205. testgen/ui/components/frontend/js/components/breadcrumbs.js +86 -0
  206. testgen/ui/components/frontend/js/components/button.js +66 -0
  207. testgen/ui/components/frontend/js/components/location.js +62 -0
  208. testgen/ui/components/frontend/js/components/select.js +75 -0
  209. testgen/ui/components/frontend/js/components/sidebar.js +358 -0
  210. testgen/ui/components/frontend/js/main.js +99 -0
  211. testgen/ui/components/frontend/js/streamlit.js +19 -0
  212. testgen/ui/components/frontend/js/van.min.js +1 -0
  213. testgen/ui/components/utils/__init__.py +0 -0
  214. testgen/ui/components/utils/callbacks.py +51 -0
  215. testgen/ui/components/utils/component.py +13 -0
  216. testgen/ui/components/widgets/__init__.py +6 -0
  217. testgen/ui/components/widgets/breadcrumbs.py +32 -0
  218. testgen/ui/components/widgets/location.py +65 -0
  219. testgen/ui/components/widgets/modal.py +97 -0
  220. testgen/ui/components/widgets/sidebar.py +69 -0
  221. testgen/ui/navigation/__init__.py +0 -0
  222. testgen/ui/navigation/menu.py +42 -0
  223. testgen/ui/navigation/page.py +20 -0
  224. testgen/ui/navigation/router.py +63 -0
  225. testgen/ui/queries/__init__.py +0 -0
  226. testgen/ui/queries/authentication_queries.py +47 -0
  227. testgen/ui/queries/connection_queries.py +121 -0
  228. testgen/ui/queries/profiling_queries.py +148 -0
  229. testgen/ui/queries/project_queries.py +9 -0
  230. testgen/ui/queries/table_group_queries.py +186 -0
  231. testgen/ui/queries/test_definition_queries.py +270 -0
  232. testgen/ui/queries/test_run_queries.py +32 -0
  233. testgen/ui/queries/test_suite_queries.py +145 -0
  234. testgen/ui/scripts/__init__.py +0 -0
  235. testgen/ui/scripts/patch_streamlit.py +111 -0
  236. testgen/ui/services/__init__.py +0 -0
  237. testgen/ui/services/authentication_service.py +119 -0
  238. testgen/ui/services/connection_service.py +220 -0
  239. testgen/ui/services/database_service.py +282 -0
  240. testgen/ui/services/form_service.py +1008 -0
  241. testgen/ui/services/javascript_service.py +44 -0
  242. testgen/ui/services/query_service.py +316 -0
  243. testgen/ui/services/string_service.py +12 -0
  244. testgen/ui/services/table_group_service.py +130 -0
  245. testgen/ui/services/test_definition_service.py +117 -0
  246. testgen/ui/services/test_run_service.py +13 -0
  247. testgen/ui/services/test_suite_service.py +76 -0
  248. testgen/ui/services/toolbar_service.py +77 -0
  249. testgen/ui/session.py +46 -0
  250. testgen/ui/views/__init__.py +0 -0
  251. testgen/ui/views/app_log_modal.py +92 -0
  252. testgen/ui/views/connections.py +72 -0
  253. testgen/ui/views/connections_base.py +367 -0
  254. testgen/ui/views/login.py +40 -0
  255. testgen/ui/views/not_found.py +16 -0
  256. testgen/ui/views/overview.py +34 -0
  257. testgen/ui/views/profiling_anomalies.py +501 -0
  258. testgen/ui/views/profiling_details.py +335 -0
  259. testgen/ui/views/profiling_modal.py +40 -0
  260. testgen/ui/views/profiling_results.py +206 -0
  261. testgen/ui/views/profiling_summary.py +177 -0
  262. testgen/ui/views/project_settings.py +74 -0
  263. testgen/ui/views/table_groups.py +530 -0
  264. testgen/ui/views/test_definitions.py +1020 -0
  265. testgen/ui/views/test_results.py +908 -0
  266. testgen/ui/views/test_runs.py +195 -0
  267. testgen/ui/views/test_suites.py +545 -0
  268. testgen/utils/__init__.py +0 -0
  269. testgen/utils/plugins.py +17 -0
  270. testgen/utils/singleton.py +14 -0
@@ -0,0 +1,37 @@
1
+ UPDATE test_results
2
+ SET test_description = COALESCE(r.test_description, d.test_description, tt.test_description),
3
+ severity = COALESCE(d.severity, s.severity, tt.default_severity),
4
+ threshold_value = COALESCE(r.threshold_value, d.threshold_value),
5
+ result_status = CASE
6
+ WHEN r.result_code = 1 THEN 'Passed'
7
+ WHEN r.result_code = 0
8
+ AND COALESCE(d.severity, s.severity, tt.default_severity) = 'Warning' THEN 'Warning'
9
+ WHEN r.result_code = 0
10
+ AND COALESCE(d.severity, s.severity, tt.default_severity) = 'Fail' THEN 'Failed'
11
+ WHEN r.result_code = 0 THEN 'Warning'
12
+ END,
13
+ observability_status = CASE
14
+ WHEN r.observability_status = 'Sent' THEN 'Sent'
15
+ WHEN COALESCE(d.export_to_observability, s.export_to_observability) = 'Y' THEN 'Queued'
16
+ WHEN COALESCE(d.export_to_observability, s.export_to_observability) = 'N' THEN 'Ignore'
17
+ END,
18
+ result_message = COALESCE(r.result_message,
19
+ tt.measure_uom || ': ' || r.result_measure::VARCHAR
20
+ || ', Threshold: ' || d.threshold_value::VARCHAR
21
+ || CASE
22
+ WHEN r.skip_errors > 0 THEN 'Errors Ignored: ' || r.skip_errors::VARCHAR
23
+ ELSE ''
24
+ END),
25
+ table_groups_id = d.table_groups_id,
26
+ test_suite_id = s.id,
27
+ auto_gen = d.last_auto_gen_date IS NOT NULL
28
+ FROM test_results r
29
+ INNER JOIN test_suites s
30
+ ON (r.project_code = s.project_code
31
+ AND r.test_suite = s.test_suite)
32
+ INNER JOIN test_definitions d
33
+ ON (r.test_definition_id = d.id)
34
+ INNER JOIN test_types tt
35
+ ON (r.test_type = tt.test_type)
36
+ WHERE r.test_run_id = '{TEST_RUN_ID}'
37
+ AND test_results.id = r.id;
@@ -0,0 +1,47 @@
1
+ SELECT tt.test_type,
2
+ s.id::VARCHAR as test_definition_id,
3
+ COALESCE(s.test_description, tt.test_description) as test_description,
4
+ COALESCE(s.test_action, g.test_action, '') as test_action,
5
+ schema_name,
6
+ table_name,
7
+ column_name,
8
+ cast(coalesce(skip_errors, 0) as varchar(50)) as skip_errors,
9
+ coalesce(baseline_ct, '') as baseline_ct,
10
+ coalesce(baseline_unique_ct, '') as baseline_unique_ct,
11
+ coalesce(baseline_value, '') as baseline_value,
12
+ coalesce(baseline_value_ct, '') as baseline_value_ct,
13
+ coalesce(threshold_value, '') as threshold_value,
14
+ coalesce(baseline_sum, '') as baseline_sum,
15
+ coalesce(baseline_avg, '') as baseline_avg,
16
+ coalesce(baseline_sd, '') as baseline_sd,
17
+ case
18
+ when nullif(subset_condition, '') is null then '1=1'
19
+ else subset_condition end as subset_condition,
20
+ coalesce(groupby_names, '') as groupby_names,
21
+ case
22
+ when having_condition is null then ''
23
+ else concat('WHERE ', having_condition) end as having_condition,
24
+ coalesce(window_date_column, '') as window_date_column,
25
+ cast(coalesce(window_days, '0') as varchar(50)) as window_days,
26
+ coalesce(match_schema_name, '') as match_schema_name,
27
+ coalesce(match_table_name, '') as match_table_name,
28
+ coalesce(match_column_names, '') as match_column_names,
29
+ case
30
+ when nullif(match_subset_condition, '') is null then '1=1'
31
+ else match_subset_condition end as match_subset_condition,
32
+ coalesce(match_groupby_names, '') as match_groupby_names,
33
+ coalesce(match_having_condition, '') as match_having_condition,
34
+ coalesce(custom_query, '') as custom_query,
35
+ coalesce(tm.template_name, '') as template_name
36
+ FROM test_definitions s
37
+ INNER JOIN test_suites g
38
+ ON (s.test_suite = g.test_suite)
39
+ INNER JOIN test_types tt
40
+ ON (s.test_type = tt.test_type)
41
+ LEFT JOIN test_templates tm
42
+ ON (s.test_type = tm.test_type
43
+ AND '{SQL_FLAVOR}' = tm.sql_flavor)
44
+ WHERE s.project_code = '{PROJECT_CODE}'
45
+ AND s.test_suite = '{TEST_SUITE}'
46
+ AND tt.run_type = 'QUERY'
47
+ AND s.test_active = 'Y';
@@ -0,0 +1,27 @@
1
+ WITH stats
2
+ AS ( SELECT r.id as test_run_id,
3
+ COALESCE(COUNT(tr.id) , 0) AS test_ct,
4
+ SUM(result_code) AS passed_ct,
5
+ COALESCE(SUM(CASE WHEN tr.result_status = 'Failed' THEN 1 END), 0) AS failed_ct,
6
+ COALESCE(SUM(CASE WHEN tr.result_status = 'Warning' THEN 1 END), 0) AS warning_ct,
7
+ COALESCE(SUM(CASE WHEN tr.result_message ILIKE 'ERROR%' THEN 1 ELSE 0 END), 0) AS error_ct
8
+ FROM test_runs r
9
+ INNER JOIN test_results tr
10
+ ON r.id = tr.test_run_id
11
+ WHERE r.id = '{TEST_RUN_ID}'::UUID
12
+ GROUP BY r.id )
13
+ UPDATE test_runs
14
+ SET status = CASE WHEN length('{EXCEPTION_MESSAGE}') = 0 then 'Complete' else 'Error' end,
15
+ test_endtime = '{NOW}',
16
+ log_message = '{EXCEPTION_MESSAGE}',
17
+ duration = TO_CHAR('{NOW}' - r.test_starttime, 'HH24:MI:SS'),
18
+ test_ct = s.test_ct,
19
+ passed_ct = s.passed_ct,
20
+ failed_ct = s.failed_ct,
21
+ warning_ct = s.warning_ct,
22
+ error_ct = s.error_ct
23
+ FROM test_runs r
24
+ LEFT JOIN stats s
25
+ ON r.id = s.test_run_id
26
+ WHERE r.id = '{TEST_RUN_ID}'::UUID
27
+ AND r.id = test_runs.id;
@@ -0,0 +1,6 @@
1
+ INSERT INTO test_runs (id, project_code, test_suite, test_starttime, process_id)
2
+ (SELECT '{TEST_RUN_ID}' :: UUID as id,
3
+ '{PROJECT_CODE}' as project_code,
4
+ '{TEST_SUITE}' as test_suite,
5
+ '{RUN_DATE}' as test_starttime,
6
+ '{PROCESS_ID}'as process_id);
@@ -0,0 +1,48 @@
1
+ SELECT '{PROJECT_CODE}' as project_code, '{TEST_TYPE}' as test_type,
2
+ '{TEST_DEFINITION_ID}' as test_definition_id,
3
+ '{TEST_SUITE}' as test_suite,
4
+ '{TEST_RUN_ID}' as test_run_id,
5
+ '{RUN_DATE}' as test_time,
6
+ '{START_TIME}' as starttime,
7
+ CURRENT_TIMESTAMP as endtime,
8
+ '{SCHEMA_NAME}' as schema_name,
9
+ '{TABLE_NAME}' as table_name,
10
+ '{COLUMN_NAME_NO_QUOTES}' as column_names,
11
+ '{SKIP_ERRORS}' as threshold_value,
12
+ {SKIP_ERRORS} as skip_errors,
13
+ '{INPUT_PARAMETERS}' as input_parameters,
14
+ CASE WHEN COUNT (*) > {SKIP_ERRORS} THEN 0 ELSE 1 END as result_code,
15
+ CASE
16
+ WHEN COUNT(*) > 0 THEN
17
+ CONCAT(
18
+ CONCAT( CAST(COUNT(*) AS VARCHAR), ' error(s) identified, ' ),
19
+ CONCAT(
20
+ CASE
21
+ WHEN COUNT(*) > {SKIP_ERRORS} THEN 'exceeding limit of '
22
+ ELSE 'within limit of '
23
+ END,
24
+ '{SKIP_ERRORS}.'
25
+ )
26
+ )
27
+ ELSE 'No errors found.'
28
+ END AS result_message,
29
+ COUNT(*) as result_measure,
30
+ '{SUBSET_DISPLAY}' as subset_condition,
31
+ NULL as result_query
32
+ FROM ( SELECT {GROUPBY_NAMES}, SUM(TOTAL) as total, SUM(MATCH_TOTAL) as MATCH_TOTAL
33
+ FROM
34
+ ( SELECT {GROUPBY_NAMES}, {COLUMN_NAME_NO_QUOTES} as total, NULL as match_total
35
+ FROM {SCHEMA_NAME}.{TABLE_NAME}
36
+ WHERE {SUBSET_CONDITION}
37
+ GROUP BY {GROUPBY_NAMES}
38
+ {HAVING_CONDITION}
39
+ UNION ALL
40
+ SELECT {MATCH_GROUPBY_NAMES}, NULL as total, {MATCH_COLUMN_NAMES} as match_total
41
+ FROM {MATCH_SCHEMA_NAME}.{MATCH_TABLE_NAME}
42
+ WHERE {MATCH_SUBSET_CONDITION}
43
+ GROUP BY {MATCH_GROUPBY_NAMES}
44
+ {MATCH_HAVING_CONDITION} ) a
45
+ GROUP BY {GROUPBY_NAMES} ) s
46
+ WHERE total < match_total
47
+ -- OR (total IS NOT NULL AND match_total IS NULL) -- New categories
48
+ OR (total IS NULL AND match_total IS NOT NULL); -- Dropped categories
@@ -0,0 +1,34 @@
1
+ SELECT '{PROJECT_CODE}' as project_code, '{TEST_TYPE}' as test_type,
2
+ '{TEST_DEFINITION_ID}' as test_definition_id,
3
+ '{TEST_SUITE}' as test_suite,
4
+ '{RUN_DATE}' as test_time, '{START_TIME}' as starttime, CURRENT_TIMESTAMP as endtime,
5
+ '{SCHEMA_NAME}' as schema_name, '{TABLE_NAME}' as table_name, '{GROUPBY_NAMES}' as column_name,
6
+ {SKIP_ERRORS} as skip_errors,
7
+ 'match_schema_name = {MATCH_SCHEMA_NAME}, match_table_name = {MATCH_TABLE_NAME}, match_groupby_names = {MATCH_GROUPBY_NAMES} ,match_column_names = {MATCH_COLUMN_NAMES}, match_subset_condition = {MATCH_SUBSET_CONDITION}, match_having_condition = {MATCH_HAVING_CONDITION}, mode = {MODE}'
8
+ as input_parameters,
9
+ CASE WHEN COUNT(*) > COALESCE(skip_errors, 0) THEN 0 ELSE 1 END as result_code,
10
+ CONCAT(
11
+ CONCAT( 'Mismatched measures: ', CAST( COALESCE(COUNT(*), 0) AS VARCHAR) ),
12
+ CONCAT( ', Threshold: ',
13
+ CONCAT( CAST(COALESCE(skip_errors, 0) AS VARCHAR), '.')
14
+ )
15
+ ) AS result_message,
16
+ COUNT(*) as result_measure,
17
+ '{TEST_ACTION}' as test_action,
18
+ '{SUBSET_CONDITION}' as subset_condition,
19
+ NULL as result_query,
20
+ '{TEST_DESCRIPTION}' as test_description
21
+ FROM (
22
+ SELECT {GROUPBY_NAMES}, {SUM_COLUMNS}
23
+ FROM {SCHEMA_NAME}.{TABLE_NAME}
24
+ WHERE {SUBSET_CONDITION}
25
+ GROUP BY {GROUPBY_NAMES}
26
+ {HAVING_CONDITION}
27
+ UNION ALL
28
+ SELECT {MATCH_GROUPBY_NAMES}, {MATCH_SUM_COLUMNS}
29
+ FROM {MATCH_SCHEMA_NAME}.{MATCH_TABLE_NAME}
30
+ WHERE {MATCH_SUBSET_CONDITION}
31
+ GROUP BY {MATCH_GROUPBY_NAMES}
32
+ {MATCH_HAVING_CONDITION}
33
+ )
34
+ ) a ;
@@ -0,0 +1,49 @@
1
+ SELECT '{PROJECT_CODE}' as project_code,
2
+ '{TEST_TYPE}' as test_type,
3
+ '{TEST_DEFINITION_ID}' as test_definition_id,
4
+ '{TEST_SUITE}' as test_suite,
5
+ '{TEST_RUN_ID}' as test_run_id,
6
+ '{RUN_DATE}' as test_time,
7
+ '{START_TIME}' as starttime,
8
+ CURRENT_TIMESTAMP as endtime,
9
+ '{SCHEMA_NAME}' as schema_name,
10
+ '{TABLE_NAME}' as table_name,
11
+ '{COLUMN_NAME_NO_QUOTES}' as column_names,
12
+ '{THRESHOLD_VALUE}' as threshold_value,
13
+ {SKIP_ERRORS} as skip_errors,
14
+ '{INPUT_PARAMETERS}' as input_parameters,
15
+ CASE WHEN COUNT (*) > {SKIP_ERRORS} THEN 0 ELSE 1 END as result_code,
16
+ CASE
17
+ WHEN COUNT(*) > 0 THEN
18
+ CONCAT(
19
+ CONCAT( CAST(COUNT(*) AS VARCHAR), ' error(s) identified, ' ),
20
+ CONCAT(
21
+ CASE
22
+ WHEN COUNT(*) > {SKIP_ERRORS} THEN 'exceeding limit of '
23
+ ELSE 'within limit of '
24
+ END,
25
+ '{SKIP_ERRORS}.'
26
+ )
27
+ )
28
+ ELSE 'No errors found.'
29
+ END AS result_message,
30
+ COUNT(*) as result_measure,
31
+ '{SUBSET_DISPLAY}' as subset_condition,
32
+ NULL as result_query
33
+ FROM ( SELECT {GROUPBY_NAMES}, SUM(TOTAL) as total, SUM(MATCH_TOTAL) as MATCH_TOTAL
34
+ FROM
35
+ ( SELECT {GROUPBY_NAMES}, {COLUMN_NAME_NO_QUOTES} as total, NULL as match_total
36
+ FROM {SCHEMA_NAME}.{TABLE_NAME}
37
+ WHERE {SUBSET_CONDITION}
38
+ GROUP BY {GROUPBY_NAMES}
39
+ {HAVING_CONDITION}
40
+ UNION ALL
41
+ SELECT {MATCH_GROUPBY_NAMES}, NULL as total, {MATCH_COLUMN_NAMES} as match_total
42
+ FROM {MATCH_SCHEMA_NAME}.{MATCH_TABLE_NAME}
43
+ WHERE {MATCH_SUBSET_CONDITION}
44
+ GROUP BY {MATCH_GROUPBY_NAMES}
45
+ {MATCH_HAVING_CONDITION} ) a
46
+ GROUP BY {GROUPBY_NAMES} ) s
47
+ WHERE NOT total BETWEEN match_total AND match_total * (1 + {BASELINE_VALUE}::FLOAT/100.0)
48
+ OR (total IS NOT NULL AND match_total IS NULL)
49
+ OR (total IS NULL AND match_total IS NOT NULL);
@@ -0,0 +1,49 @@
1
+ SELECT '{PROJECT_CODE}' as project_code,
2
+ '{TEST_TYPE}' as test_type,
3
+ '{TEST_DEFINITION_ID}' as test_definition_id,
4
+ '{TEST_SUITE}' as test_suite,
5
+ '{TEST_RUN_ID}' as test_run_id,
6
+ '{RUN_DATE}' as test_time,
7
+ '{START_TIME}' as starttime,
8
+ CURRENT_TIMESTAMP as endtime,
9
+ '{SCHEMA_NAME}' as schema_name,
10
+ '{TABLE_NAME}' as table_name,
11
+ '{COLUMN_NAME_NO_QUOTES}' as column_names,
12
+ '{THRESHOLD_VALUE}' as threshold_value,
13
+ {SKIP_ERRORS} as skip_errors,
14
+ '{INPUT_PARAMETERS}' as input_parameters,
15
+ CASE WHEN COUNT (*) > {SKIP_ERRORS} THEN 0 ELSE 1 END as result_code,
16
+ CASE
17
+ WHEN COUNT(*) > 0 THEN
18
+ CONCAT(
19
+ CONCAT( CAST(COUNT(*) AS VARCHAR), ' error(s) identified, ' ),
20
+ CONCAT(
21
+ CASE
22
+ WHEN COUNT(*) > {SKIP_ERRORS} THEN 'exceeding limit of '
23
+ ELSE 'within limit of '
24
+ END,
25
+ '{SKIP_ERRORS}.'
26
+ )
27
+ )
28
+ ELSE 'No errors found.'
29
+ END AS result_message,
30
+ COUNT(*) as result_measure,
31
+ '{SUBSET_DISPLAY}' as subset_condition,
32
+ NULL as result_query
33
+ FROM ( SELECT {GROUPBY_NAMES}, SUM(TOTAL) as total, SUM(MATCH_TOTAL) as MATCH_TOTAL
34
+ FROM
35
+ ( SELECT {GROUPBY_NAMES}, {COLUMN_NAME_NO_QUOTES} as total, NULL as match_total
36
+ FROM {SCHEMA_NAME}.{TABLE_NAME}
37
+ WHERE {SUBSET_CONDITION}
38
+ GROUP BY {GROUPBY_NAMES}
39
+ {HAVING_CONDITION}
40
+ UNION ALL
41
+ SELECT {MATCH_GROUPBY_NAMES}, NULL as total, {MATCH_COLUMN_NAMES} as match_total
42
+ FROM {MATCH_SCHEMA_NAME}.{MATCH_TABLE_NAME}
43
+ WHERE {MATCH_SUBSET_CONDITION}
44
+ GROUP BY {MATCH_GROUPBY_NAMES}
45
+ {MATCH_HAVING_CONDITION} ) a
46
+ GROUP BY {GROUPBY_NAMES} ) s
47
+ WHERE NOT total BETWEEN match_total * (1 - {BASELINE_VALUE}::FLOAT/100.0) AND match_total * (1 + {BASELINE_VALUE}::FLOAT/100.0)
48
+ OR (total IS NOT NULL AND match_total IS NULL)
49
+ OR (total IS NULL AND match_total IS NOT NULL);
@@ -0,0 +1,49 @@
1
+ SELECT '{PROJECT_CODE}' as project_code,
2
+ '{TEST_TYPE}' as test_type,
3
+ '{TEST_DEFINITION_ID}' as test_definition_id,
4
+ '{TEST_SUITE}' as test_suite,
5
+ '{TEST_RUN_ID}' as test_run_id,
6
+ '{RUN_DATE}' as test_time,
7
+ '{START_TIME}' as starttime,
8
+ CURRENT_TIMESTAMP as endtime,
9
+ '{SCHEMA_NAME}' as schema_name,
10
+ '{TABLE_NAME}' as table_name,
11
+ '{COLUMN_NAME_NO_QUOTES}' as column_names,
12
+ '{SKIP_ERRORS}' as threshold_value,
13
+ {SKIP_ERRORS} as skip_errors,
14
+ '{INPUT_PARAMETERS}' as input_parameters,
15
+ CASE WHEN COUNT (*) > {SKIP_ERRORS} THEN 0 ELSE 1 END as result_code,
16
+ CASE
17
+ WHEN COUNT(*) > 0 THEN
18
+ CONCAT(
19
+ CONCAT( CAST(COUNT(*) AS VARCHAR), ' error(s) identified, ' ),
20
+ CONCAT(
21
+ CASE
22
+ WHEN COUNT(*) > {SKIP_ERRORS} THEN 'exceeding limit of '
23
+ ELSE 'within limit of '
24
+ END,
25
+ '{SKIP_ERRORS}.'
26
+ )
27
+ )
28
+ ELSE 'No errors found.'
29
+ END AS result_message,
30
+ COUNT(*) as result_measure,
31
+ '{SUBSET_DISPLAY}' as subset_condition,
32
+ NULL as result_query
33
+ FROM ( SELECT {GROUPBY_NAMES}, SUM(TOTAL) as total, SUM(MATCH_TOTAL) as MATCH_TOTAL
34
+ FROM
35
+ ( SELECT {GROUPBY_NAMES}, {COLUMN_NAME_NO_QUOTES} as total, NULL as match_total
36
+ FROM {SCHEMA_NAME}.{TABLE_NAME}
37
+ WHERE {SUBSET_CONDITION}
38
+ GROUP BY {GROUPBY_NAMES}
39
+ {HAVING_CONDITION}
40
+ UNION ALL
41
+ SELECT {MATCH_GROUPBY_NAMES}, NULL as total, {MATCH_COLUMN_NAMES} as match_total
42
+ FROM {MATCH_SCHEMA_NAME}.{MATCH_TABLE_NAME}
43
+ WHERE {MATCH_SUBSET_CONDITION}
44
+ GROUP BY {MATCH_GROUPBY_NAMES}
45
+ {MATCH_HAVING_CONDITION} ) a
46
+ GROUP BY {GROUPBY_NAMES} ) s
47
+ WHERE total <> match_total
48
+ OR (total IS NOT NULL AND match_total IS NULL)
49
+ OR (total IS NULL AND match_total IS NOT NULL);
@@ -0,0 +1,39 @@
1
+ SELECT '{PROJECT_CODE}' as project_code,
2
+ '{TEST_TYPE}' as test_type,
3
+ '{TEST_DEFINITION_ID}' as test_definition_id,
4
+ '{TEST_SUITE}' as test_suite,
5
+ '{TEST_RUN_ID}' as test_run_id,
6
+ '{RUN_DATE}' as test_time,
7
+ '{START_TIME}' as starttime,
8
+ CURRENT_TIMESTAMP as endtime,
9
+ '{SCHEMA_NAME}' as schema_name,
10
+ '{TABLE_NAME}' as table_name,
11
+ CASE
12
+ WHEN '{COLUMN_NAME_NO_QUOTES}' = '' OR '{COLUMN_NAME_NO_QUOTES}' IS NULL THEN 'N/A'
13
+ ELSE '{COLUMN_NAME_NO_QUOTES}'
14
+ END as column_names,
15
+ '{SKIP_ERRORS}' as threshold_value,
16
+ {SKIP_ERRORS} as skip_errors,
17
+ /* TODO: 'custom_query= {CUSTOM_QUERY_ESCAPED}' as input_parameters, */
18
+ 'Skip_Errors={SKIP_ERRORS}' as input_parameters,
19
+ CASE WHEN COUNT (*) > {SKIP_ERRORS} THEN 0 ELSE 1 END as result_code,
20
+ CASE
21
+ WHEN COUNT(*) > 0 THEN
22
+ CONCAT(
23
+ CONCAT( CAST(COUNT(*) AS VARCHAR), ' error(s) identified, ' ),
24
+ CONCAT(
25
+ CASE
26
+ WHEN COUNT(*) > {SKIP_ERRORS} THEN 'exceeding limit of '
27
+ ELSE 'within limit of '
28
+ END,
29
+ '{SKIP_ERRORS}.'
30
+ )
31
+ )
32
+ ELSE 'No errors found.'
33
+ END AS result_message,
34
+ COUNT(*) as result_measure,
35
+ NULL as subset_condition,
36
+ NULL as result_query
37
+ FROM (
38
+ {CUSTOM_QUERY}
39
+ ) TEST;
@@ -0,0 +1,58 @@
1
+ SELECT '{PROJECT_CODE}' as project_code,
2
+ '{TEST_TYPE}' as test_type,
3
+ '{TEST_DEFINITION_ID}' as test_definition_id,
4
+ '{TEST_SUITE}' as test_suite,
5
+ '{TEST_RUN_ID}' as test_run_id,
6
+ '{RUN_DATE}' as test_time,
7
+ '{START_TIME}' as starttime,
8
+ CURRENT_TIMESTAMP as endtime,
9
+ '{SCHEMA_NAME}' as schema_name,
10
+ '{TABLE_NAME}' as table_name,
11
+ '{COLUMN_NAME_NO_QUOTES}' as column_names,
12
+ '{SKIP_ERRORS}' as threshold_value,
13
+ {SKIP_ERRORS} as skip_errors,
14
+ '{INPUT_PARAMETERS}' as input_parameters,
15
+ CASE WHEN COUNT (*) > {SKIP_ERRORS} THEN 0 ELSE 1 END as result_code,
16
+ CASE
17
+ WHEN COUNT(*) > 0 THEN
18
+ CONCAT(
19
+ CONCAT( CAST(COUNT(*) AS VARCHAR), ' error(s) identified, ' ),
20
+ CONCAT(
21
+ CASE
22
+ WHEN COUNT(*) > {SKIP_ERRORS} THEN 'exceeding limit of '
23
+ ELSE 'within limit of '
24
+ END,
25
+ '{SKIP_ERRORS}.'
26
+ )
27
+ )
28
+ ELSE 'No errors found.'
29
+ END AS result_message,
30
+ COUNT(*) as result_measure,
31
+ '{SUBSET_DISPLAY}' as subset_condition,
32
+ NULL as result_query
33
+ FROM (
34
+ ( SELECT {GROUPBY_NAMES}
35
+ FROM {SCHEMA_NAME}.{TABLE_NAME}
36
+ WHERE {SUBSET_CONDITION}
37
+ GROUP BY {GROUPBY_NAMES}
38
+ {HAVING_CONDITION}
39
+ EXCEPT
40
+ SELECT {MATCH_COLUMN_NAMES}
41
+ FROM {MATCH_SCHEMA_NAME}.{MATCH_TABLE_NAME}
42
+ WHERE {MATCH_SUBSET_CONDITION}
43
+ GROUP BY {MATCH_GROUPBY_NAMES}
44
+ {MATCH_HAVING_CONDITION} )
45
+ UNION
46
+ ( SELECT {MATCH_COLUMN_NAMES}
47
+ FROM {MATCH_SCHEMA_NAME}.{MATCH_TABLE_NAME}
48
+ WHERE {MATCH_SUBSET_CONDITION}
49
+ GROUP BY {MATCH_GROUPBY_NAMES}
50
+ {MATCH_HAVING_CONDITION}
51
+ EXCEPT
52
+ SELECT {GROUPBY_NAMES}
53
+ FROM {SCHEMA_NAME}.{TABLE_NAME}
54
+ WHERE {SUBSET_CONDITION}
55
+ GROUP BY {GROUPBY_NAMES}
56
+ {HAVING_CONDITION}
57
+ )
58
+ ) test;
@@ -0,0 +1,44 @@
1
+ SELECT '{PROJECT_CODE}' as project_code,
2
+ '{TEST_TYPE}' as test_type,
3
+ '{TEST_DEFINITION_ID}' as test_definition_id,
4
+ '{TEST_SUITE}' as test_suite,
5
+ '{TEST_RUN_ID}' as test_run_id,
6
+ '{RUN_DATE}' as test_time,
7
+ '{START_TIME}' as starttime,
8
+ CURRENT_TIMESTAMP as endtime,
9
+ '{SCHEMA_NAME}' as schema_name,
10
+ '{TABLE_NAME}' as table_name,
11
+ '{COLUMN_NAME_NO_QUOTES}' as column_names,
12
+ '{SKIP_ERRORS}' as threshold_value,
13
+ {SKIP_ERRORS} as skip_errors,
14
+ '{INPUT_PARAMETERS}' as input_parameters,
15
+ CASE WHEN COUNT (*) > {SKIP_ERRORS} THEN 0 ELSE 1 END as result_code,
16
+ CASE
17
+ WHEN COUNT(*) > 0 THEN
18
+ CONCAT(
19
+ CONCAT( CAST(COUNT(*) AS VARCHAR), ' error(s) identified, ' ),
20
+ CONCAT(
21
+ CASE
22
+ WHEN COUNT(*) > {SKIP_ERRORS} THEN 'exceeding limit of '
23
+ ELSE 'within limit of '
24
+ END,
25
+ '{SKIP_ERRORS}.'
26
+ )
27
+ )
28
+ ELSE 'No errors found.'
29
+ END AS result_message,
30
+ COUNT(*) as result_measure,
31
+ '{SUBSET_DISPLAY}' as subset_condition,
32
+ NULL as result_query
33
+ FROM ( SELECT {COLUMN_NAME_NO_QUOTES}
34
+ FROM {SCHEMA_NAME}.{TABLE_NAME}
35
+ WHERE {SUBSET_CONDITION}
36
+ GROUP BY {COLUMN_NAME_NO_QUOTES}
37
+ {HAVING_CONDITION}
38
+ EXCEPT
39
+ SELECT {MATCH_GROUPBY_NAMES}
40
+ FROM {MATCH_SCHEMA_NAME}.{MATCH_TABLE_NAME}
41
+ WHERE {MATCH_SUBSET_CONDITION}
42
+ GROUP BY {MATCH_GROUPBY_NAMES}
43
+ {MATCH_HAVING_CONDITION}
44
+ ) test;
@@ -0,0 +1,37 @@
1
+ SELECT '{PROJECT_CODE}' as project_code, '{TEST_TYPE}' as test_type,
2
+ '{TEST_DEFINITION_ID}' as test_definition_id,
3
+ '{TEST_SUITE}' as test_suite,
4
+ '{RUN_DATE}' as test_time, '{START_TIME}' as starttime,CURRENT_TIMESTAMP as endtime,
5
+ '{SCHEMA_NAME}' as schema_name, '{TABLE_NAME}' as table_name, '{COLUMN_NAME}' as column_names,
6
+ {SKIP_ERRORS} as skip_errors,
7
+ 'schema_name = {SCHEMA_NAME}, prior_schema = {MATCH_SCHEMA_NAME}, table_name = {TABLE_NAME}, column_name = {COLUMN_NAME}, subset_condition = {SUBSET_CONDITION}, mode = {MODE}'
8
+ as input_parameters,
9
+ CASE WHEN COUNT(*) > COALESCE(skip_errors, 0) THEN 0 ELSE 1 END as result_code,
10
+ CONCAT(
11
+ CONCAT( 'Mismatched measures: ', CAST( COALESCE(COUNT(*), 0) AS VARCHAR) ),
12
+ CONCAT( ', Threshold: ',
13
+ CONCAT( CAST(COALESCE(skip_errors, 0) AS VARCHAR), '.')
14
+ )
15
+ ) AS result_message,
16
+ COUNT(*) as result_measure,
17
+ '{TEST_ACTION}' as test_action,
18
+ '{SUBSET_CONDITION}' as subset_condition,
19
+ NULL as result_query,
20
+ '{TEST_DESCRIPTION}' as test_description
21
+ FROM (
22
+ ( SELECT {COLUMN_NAME}
23
+ FROM {SCHEMA_NAME}.{TABLE_NAME}
24
+ WHERE {SUBSET_CONDITION}
25
+ EXCEPT
26
+ SELECT {COLUMN_NAME}
27
+ FROM {MATCH_SCHEMA_NAME}.{TABLE_NAME}
28
+ WHERE {SUBSET_CONDITION} )
29
+ UNION
30
+ ( SELECT {COLUMN_NAME}
31
+ FROM {MATCH_SCHEMA_NAME}.{TABLE_NAME}
32
+ WHERE {SUBSET_CONDITION}
33
+ EXCEPT
34
+ SELECT {COLUMN_NAME}
35
+ FROM {SCHEMA_NAME}.{TABLE_NAME}
36
+ WHERE {SUBSET_CONDITION} )
37
+ );
@@ -0,0 +1,53 @@
1
+ -- Relative Entropy: measured by Jensen-Shannon Divergence
2
+ -- Smoothed and normalized version of KL divergence,
3
+ -- with scores between 0 (identical) and 1 (maximally different),
4
+ -- when using the base-2 logarithm. Formula is:
5
+ -- 0.5 * kl_divergence(p, m) + 0.5 * kl_divergence(q, m)
6
+ -- Log base 2 of x = LN(x)/LN(2)
7
+ WITH latest_ver
8
+ AS ( SELECT {CONCAT_COLUMNS} as category,
9
+ COUNT(*)::FLOAT / SUM(COUNT(*)) OVER ()::FLOAT AS pct_of_total
10
+ FROM {SCHEMA_NAME}.{TABLE_NAME} v1
11
+ WHERE {SUBSET_CONDITION}
12
+ GROUP BY {COLUMN_NAME_NO_QUOTES} ),
13
+ older_ver
14
+ AS ( SELECT {CONCAT_MATCH_GROUPBY} as category,
15
+ COUNT(*)::FLOAT / SUM(COUNT(*)) OVER ()::FLOAT AS pct_of_total
16
+ FROM {MATCH_SCHEMA_NAME}.{TABLE_NAME} v2
17
+ WHERE {MATCH_SUBSET_CONDITION}
18
+ GROUP BY {MATCH_GROUPBY_NAMES} ),
19
+ dataset
20
+ AS ( SELECT COALESCE(l.category, o.category) AS category,
21
+ COALESCE(o.pct_of_total, 0.0000001) AS old_pct,
22
+ COALESCE(l.pct_of_total, 0.0000001) AS new_pct,
23
+ (COALESCE(o.pct_of_total, 0.0000001)
24
+ + COALESCE(l.pct_of_total, 0.0000001))/2.0 AS avg_pct
25
+ FROM latest_ver l
26
+ FULL JOIN older_ver o
27
+ ON (l.category = o.category) )
28
+ SELECT '{PROJECT_CODE}' as project_code,
29
+ '{TEST_TYPE}' as test_type,
30
+ '{TEST_DEFINITION_ID}' as test_definition_id,
31
+ '{TEST_SUITE}' as test_suite,
32
+ '{TEST_RUN_ID}' as test_run_id,
33
+ '{RUN_DATE}' as test_time,
34
+ '{START_TIME}' as starttime,
35
+ CURRENT_TIMESTAMP as endtime,
36
+ '{SCHEMA_NAME}' as schema_name,
37
+ '{TABLE_NAME}' as table_name,
38
+ '{COLUMN_NAME_NO_QUOTES}' as column_names,
39
+ -- '{GROUPBY_NAMES}' as column_names,
40
+ '{THRESHOLD_VALUE}' as threshold_value,
41
+ NULL as skip_errors,
42
+ '{INPUT_PARAMETERS}' as input_parameters,
43
+ CASE WHEN js_divergence > {THRESHOLD_VALUE} THEN 0 ELSE 1 END as result_code,
44
+ CONCAT('Divergence Level: ',
45
+ CONCAT(CAST(js_divergence AS VARCHAR),
46
+ ', Threshold: {THRESHOLD_VALUE}.')) as result_message,
47
+ js_divergence as result_measure,
48
+ '{SUBSET_DISPLAY}' as subset_condition,
49
+ NULL as result_query
50
+ FROM (
51
+ SELECT 0.5 * ABS(SUM(new_pct * LN(new_pct/avg_pct)/LN(2)))
52
+ + 0.5 * ABS(SUM(old_pct * LN(old_pct/avg_pct)/LN(2))) as js_divergence
53
+ FROM dataset ) rslt;
@@ -0,0 +1,46 @@
1
+ SELECT '{PROJECT_CODE}' as project_code,
2
+ '{TEST_TYPE}' as test_type,
3
+ '{TEST_DEFINITION_ID}' as test_definition_id,
4
+ '{TEST_SUITE}' as test_suite,
5
+ '{TEST_RUN_ID}' as test_run_id,
6
+ '{RUN_DATE}' as test_time,
7
+ '{START_TIME}' as starttime,
8
+ CURRENT_TIMESTAMP as endtime,
9
+ '{SCHEMA_NAME}' as schema_name,
10
+ '{TABLE_NAME}' as table_name,
11
+ '{COLUMN_NAME_NO_QUOTES}' as column_names,
12
+ '{SKIP_ERRORS}' as threshold_value,
13
+ {SKIP_ERRORS} as skip_errors,
14
+ '{INPUT_PARAMETERS}' as input_parameters,
15
+ CASE WHEN COUNT (*) > {SKIP_ERRORS} THEN 0 ELSE 1 END as result_code,
16
+ CASE
17
+ WHEN COUNT(*) > 0 THEN
18
+ CONCAT(
19
+ CONCAT( CAST(COUNT(*) AS VARCHAR), ' error(s) identified, ' ),
20
+ CONCAT(
21
+ CASE
22
+ WHEN COUNT(*) > {SKIP_ERRORS} THEN 'exceeding limit of '
23
+ ELSE 'within limit of '
24
+ END,
25
+ '{SKIP_ERRORS}.'
26
+ )
27
+ )
28
+ ELSE 'No errors found.'
29
+ END AS result_message,
30
+ COUNT(*) as result_measure,
31
+ '{SUBSET_DISPLAY}' as subset_condition,
32
+ NULL as result_query
33
+ FROM (
34
+ SELECT {COLUMN_NAME_NO_QUOTES}
35
+ FROM {SCHEMA_NAME}.{TABLE_NAME}
36
+ WHERE {SUBSET_CONDITION}
37
+ AND {WINDOW_DATE_COLUMN} >= DATEADD("day", - 2 * {WINDOW_DAYS}, (SELECT MAX({WINDOW_DATE_COLUMN}) FROM {SCHEMA_NAME}.{TABLE_NAME}))
38
+ AND {WINDOW_DATE_COLUMN} < DATEADD("day", - {WINDOW_DAYS}, (SELECT MAX({WINDOW_DATE_COLUMN}) FROM {SCHEMA_NAME}.{TABLE_NAME}))
39
+ GROUP BY {COLUMN_NAME_NO_QUOTES}
40
+ EXCEPT
41
+ SELECT {COLUMN_NAME_NO_QUOTES}
42
+ FROM {SCHEMA_NAME}.{TABLE_NAME}
43
+ WHERE {SUBSET_CONDITION}
44
+ AND {WINDOW_DATE_COLUMN} >= DATEADD("day", - {WINDOW_DAYS}, (SELECT MAX({WINDOW_DATE_COLUMN}) FROM {SCHEMA_NAME}.{TABLE_NAME}))
45
+ GROUP BY {COLUMN_NAME_NO_QUOTES}
46
+ ) test;