From 1086154f1f27b59b8725b485bc364d103e49f4ed Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 5 Sep 2025 15:56:03 +0200 Subject: [PATCH 01/64] initial version --- demos/dqx_demo_tool.py | 4 +- demos/dqx_multi_table_demo.py | 297 +++++ docs/dqx/docs/guide/quality_checks_apply.mdx | 73 ++ src/databricks/labs/dqx/checks_storage.py | 35 +- src/databricks/labs/dqx/config_loader.py | 13 +- src/databricks/labs/dqx/engine.py | 328 ++---- src/databricks/labs/dqx/io.py | 146 +++ src/databricks/labs/dqx/profiler/profiler.py | 51 +- .../labs/dqx/profiler/profiler_runner.py | 2 +- .../labs/dqx/quality_checker/e2e_workflow.py | 3 +- .../quality_checker/quality_checker_runner.py | 2 +- src/databricks/labs/dqx/utils.py | 192 +-- tests/conftest.py | 2 +- tests/e2e/test_run_demos.py | 25 + .../test_apply_checks_and_save_in_table.py | 1033 +++++++++++++++++ tests/integration/test_config.py | 19 + tests/integration/test_io.py | 217 ++++ .../integration/test_save_results_in_table.py | 590 +--------- tests/integration/test_utils.py | 225 +--- tests/unit/test_storage_factory.py | 101 ++ tests/unit/test_utils.py | 3 +- 21 files changed, 2157 insertions(+), 1204 deletions(-) create mode 100644 demos/dqx_multi_table_demo.py create mode 100644 src/databricks/labs/dqx/io.py create mode 100644 tests/integration/test_apply_checks_and_save_in_table.py create mode 100644 tests/integration/test_io.py create mode 100644 tests/unit/test_storage_factory.py diff --git a/demos/dqx_demo_tool.py b/demos/dqx_demo_tool.py index c730d8056..8e8cf98e0 100644 --- a/demos/dqx_demo_tool.py +++ b/demos/dqx_demo_tool.py @@ -152,7 +152,7 @@ from databricks.labs.dqx.engine import DQEngine from databricks.labs.dqx.config import InstallationChecksStorageConfig, WorkspaceFileChecksStorageConfig from databricks.labs.dqx.config_loader import RunConfigLoader -from databricks.labs.dqx.utils import read_input_data +from databricks.labs.dqx.io import read_input_data from databricks.sdk import WorkspaceClient @@ -258,7 +258,7 @@ # COMMAND ---------- from databricks.labs.dqx.engine import DQEngine -from databricks.labs.dqx.utils import read_input_data +from databricks.labs.dqx.io import read_input_data from databricks.sdk import WorkspaceClient from databricks.labs.dqx.config import InstallationChecksStorageConfig, WorkspaceFileChecksStorageConfig from databricks.labs.dqx.config_loader import RunConfigLoader diff --git a/demos/dqx_multi_table_demo.py b/demos/dqx_multi_table_demo.py new file mode 100644 index 000000000..a7e3b0e93 --- /dev/null +++ b/demos/dqx_multi_table_demo.py @@ -0,0 +1,297 @@ +# Databricks notebook source +# MAGIC %md +# MAGIC # DQX Multi-Table Data Quality Checks Demo +# MAGIC +# MAGIC This notebook demonstrates how to apply data quality checks to multiple tables using DQX. + +# COMMAND ---------- + +# MAGIC %md +# MAGIC ## Installing DQX + +# COMMAND ---------- + +dbutils.widgets.text("test_library_ref", "", "Test Library Ref") + +if dbutils.widgets.get("test_library_ref") != "": + %pip install '{dbutils.widgets.get("test_library_ref")}' +else: + %pip install databricks-labs-dqx + +%restart_python + +# COMMAND ---------- + +# MAGIC %md +# MAGIC ## Setup and Configuration + +# COMMAND ---------- + +from databricks.labs.dqx.config import InputConfig, OutputConfig, RunConfig +from databricks.labs.dqx.engine import DQEngine +from databricks.labs.dqx.rule import DQRowRule +from databricks.labs.dqx import check_funcs +from databricks.sdk import WorkspaceClient + +# Default configuration values +default_catalog = "main" +default_schema = "default" + +# Create widgets for configuration +dbutils.widgets.text("demo_catalog_name", default_catalog, "Catalog Name") +dbutils.widgets.text("demo_schema_name", default_schema, "Schema Name") + +# Get configuration values +demo_catalog_name = dbutils.widgets.get("demo_catalog_name") +demo_schema_name = dbutils.widgets.get("demo_schema_name") + +print(f"Using catalog: {demo_catalog_name}") +print(f"Using schema: {demo_schema_name}") + +# Initialize the DQX engine +ws = WorkspaceClient() +dq_engine = DQEngine(ws) + +# COMMAND ---------- + +# MAGIC %md +# MAGIC ## Checking multiple tables using Dictionary-Based Checks (Metadata) + +# COMMAND ---------- + +# Create a sample users table +users_data = [ + [1, "john@email.com", "John Doe", "2023-01-01"], + [2, "invalid-email", "Jane Smith", "2023-02-01"], + [3, "bob@email.com", "Bob Wilson", "2023-03-01"], + [None, "alice@email.com", "Alice Brown", "2023-04-01"] +] + +users_df = spark.createDataFrame( + users_data, + schema="user_id int, email string, name string, created_on string" +) +users_df.write.mode("overwrite").saveAsTable(f"{demo_catalog_name}.{demo_schema_name}.users") + +# Create a sample orders table +orders_data = [ + [1, 1, 100.50, "2023-01-15"], + [2, 2, -10.00, "2023-02-15"], + [3, 3, 75.25, "2023-03-15"], + [None, 4, 50.00, "2023-04-15"] +] + +orders_df = spark.createDataFrame( + orders_data, + schema="order_id int, user_id int, total_amount double, order_on string" +) +orders_df.write.mode("overwrite").saveAsTable(f"{demo_catalog_name}.{demo_schema_name}.orders") + +# Define checks for different tables using dictionaries +user_checks = [ + { + "criticality": "error", + "check": { + "function": "is_not_null", + "arguments": {"column": "user_id"} + } + }, + { + "criticality": "warn", + "check": { + "function": "regex_match", + "arguments": { + "column": "email", + "regex": r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$" + } + } + } +] + +order_checks = [ + { + "criticality": "error", + "check": { + "function": "is_not_null", + "arguments": {"column": "order_id"} + } + }, + { + "criticality": "error", + "check": { + "function": "is_not_less_than", + "arguments": {"column": "total_amount", "limit": 0} + } + } +] + +# Define the configs +configs = [ + RunConfig( + input_config=InputConfig(location=f"{demo_catalog_name}.{demo_schema_name}.users"), + output_config=OutputConfig( + location=f"{demo_catalog_name}.{demo_schema_name}.users_checked", + mode="overwrite" + ), + quarantine_config=OutputConfig( + location=f"{demo_catalog_name}.{demo_schema_name}.users_quarantine", + mode="overwrite" + ), + checks=user_checks + ), + RunConfig( + input_config=InputConfig(location=f"{demo_catalog_name}.{demo_schema_name}.orders"), + output_config=OutputConfig( + location=f"{demo_catalog_name}.{demo_schema_name}.orders_checked", + mode="overwrite" + ), + quarantine_config=OutputConfig( + location=f"{demo_catalog_name}.{demo_schema_name}.orders_quarantine", + mode="overwrite" + ), + checks=order_checks + ) +] + +# Apply checks to multiple tables and save the results +dq_engine.apply_checks_and_save_in_tables( + configs=configs, max_parallelism=4 +) + +display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_checked")) +display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.orders_checked")) + +# COMMAND ---------- + +# MAGIC %md +# MAGIC ## Checking multiple tables using DQRule Objects + +# COMMAND ---------- + +# Define checks using DQRule objects +user_rule_checks = [ + DQRowRule( + criticality="error", + check_func=check_funcs.is_not_null, + column="user_id" + ), + DQRowRule( + criticality="warn", + check_func=check_funcs.regex_match, + column="email", + check_func_kwargs={ + "regex": r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$" + } + ) +] + +order_rule_checks = [ + DQRowRule( + criticality="error", + check_func=check_funcs.is_not_null, + column="order_id" + ), + DQRowRule( + criticality="error", + check_func=check_funcs.is_not_less_than, + column="total_amount", + check_func_kwargs={"limit": 0} + ) +] + +# Define the configs +configs = [ + ApplyChecksConfig( + input_config=InputConfig(location=f"{demo_catalog_name}.{demo_schema_name}.users"), + output_config=OutputConfig( + location=f"{demo_catalog_name}.{demo_schema_name}.users_validated", + mode="overwrite" + ), + quarantine_config=OutputConfig( + location=f"{demo_catalog_name}.{demo_schema_name}.users_issues", + mode="overwrite" + ), + checks=user_rule_checks + ), + ApplyChecksConfig( + input_config=InputConfig(location=f"{demo_catalog_name}.{demo_schema_name}.orders"), + output_config=OutputConfig( + location=f"{demo_catalog_name}.{demo_schema_name}.orders_validated", + mode="overwrite" + ), + quarantine_config=OutputConfig( + location=f"{demo_catalog_name}.{demo_schema_name}.orders_issues", + mode="overwrite" + ), + checks=order_rule_checks + ) +] + +# Apply checks to multiple tables and save the results +dq_engine.apply_checks_and_save_in_tables( + configs=configs, max_parallelism=4 +) + +display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_validated")) +display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.orders_validated")) + + + +# COMMAND ---------- + +# MAGIC %md +# MAGIC ## Bulk processing of many tables + +# COMMAND ---------- + +# Create sample tables for bulk processing demonstration +for i in range(1, 6): # Create 5 sample tables + sample_data = [ + [i, f"Item {i}", "2023-01-01"], + [i+10, f"Item {i+10}", "2023-02-01"], + [None, f"Item missing", "2023-03-01"] # Missing ID + ] + + sample_df = spark.createDataFrame( + sample_data, + schema="id int, name string, created_on string" + ) + sample_df.write.mode("overwrite").saveAsTable(f"{demo_catalog_name}.{demo_schema_name}.demo_table_{i}") + +# Create a configs for multiple tables in a list +configs = [ + ApplyChecksConfig( + input_config=InputConfig(location=f"{demo_catalog_name}.{demo_schema_name}.demo_table_{i}"), + output_config=OutputConfig( + location=f"{demo_catalog_name}.{demo_schema_name}.demo_table_{i}_validated", + mode="overwrite" + ), + checks=[ + { + "criticality": "error", + "check": { + "function": "is_not_null", + "arguments": {"column": "id"} + } + }, + { + "criticality": "warn", + "check": { + "function": "sql_expression", + "arguments": { + "expression": "cast(created_on as date) <= current_date()", + "msg": "Created on should not be in the future" + } + } + } + ] + ) + for i in range(1, 6) +] + +# Apply checks to multiple tables and save the results +dq_engine.apply_checks_and_save_in_tables( + configs=configs, max_parallelism=3 +) + +display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.demo_table_5_validated")) \ No newline at end of file diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index 6b1e4959e..6f0bb81f1 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -195,6 +195,79 @@ Alternatively, `for_each_column` can be used to define a list of columns that th For details on each check, please refer to the documentation [here](/docs/reference/quality_checks). +### Applying checks on multiple tables + +Applying checks on multiple tables can be performed by executing the same methods as described above in a loop. +However, DQX provides a convenient method to handle multiple tables in a single method call. +Use `apply_checks_and_save_in_tables` to perform end-to-end quality checking for multiple tables. + + + + ```python + import yaml + from databricks.labs.dqx.config import ApplyChecksConfig, InputConfig, OutputConfig + from databricks.labs.dqx.engine import DQEngine + from databricks.sdk import WorkspaceClient + + dq_engine = DQEngine(WorkspaceClient()) + + # Define some checks using DQRule classes + rule_checks = [ + DQRowRule( + name="id_not_null", + criticality="error", + check_func=check_funcs.is_not_null, + column="id", + ), + DQRowRule( + name="amount_positive", + criticality="warn", + check_func=check_funcs.is_greater_than, + column="amount", + limit=0, + ), + ] + + # Define checks using YAML + metadata_checks = yaml.safe_load(""" + - name: id_is_null + criticality: error + check: + function: is_not_null + arguments: + column: id + - name: email_invalid_format + criticality: warn + check: + function: regex_match + arguments: + column: email + pattern: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ + """) + + # Define configuration to check multiple tables + configs = [ + ApplyChecksConfig( + input_config=InputConfig("catalog.schema.input_data_001"), + output_config=OutputConfig("catalog.schema.output_data_001"), + checks=rule_checks + ), + ApplyChecksConfig( + input_config=InputConfig("catalog.schema.input_data_002"), + output_config=OutputConfig("catalog.schema.output_data_002"), + checks=metadata_checks + ), + ] + + # Check each input table and write data to the corresponding output tables + dq_engine.apply_checks_and_save_in_tables( + configs=configs, max_parallelism=2 + ) + ``` + + + + ### Applying checks in Lakeflow Pipelines Lakeflow Pipelines (formerly DLT - Delta Live Tables) provides [expectations](https://docs.databricks.com/en/delta-live-tables/expectations.html) to enforce data quality constraints. diff --git a/src/databricks/labs/dqx/checks_storage.py b/src/databricks/labs/dqx/checks_storage.py index 65b65fc0b..606716646 100644 --- a/src/databricks/labs/dqx/checks_storage.py +++ b/src/databricks/labs/dqx/checks_storage.py @@ -28,7 +28,7 @@ get_file_deserializer, ) from databricks.labs.dqx.config_loader import RunConfigLoader -from databricks.labs.dqx.utils import TABLE_PATTERN +from databricks.labs.dqx.io import TABLE_PATTERN from databricks.labs.dqx.checks_serializer import FILE_SERIALIZERS @@ -351,6 +351,18 @@ def create(self, config: BaseChecksStorageConfig) -> ChecksStorageHandler: An instance of the corresponding BaseChecksStorageHandler. """ + @abstractmethod + def create_for_location(self, location: str) -> tuple[ChecksStorageHandler, BaseChecksStorageConfig]: + """ + Abstract method to create a handler and config based on checks location. + + Args: + location: location of the checks (file path, table name, volume, etc.) + + Returns: + An instance of the corresponding BaseChecksStorageHandler. + """ + class ChecksStorageHandlerFactory(BaseChecksStorageHandlerFactory): def __init__(self, workspace_client: WorkspaceClient, spark: SparkSession): @@ -382,3 +394,24 @@ def create(self, config: BaseChecksStorageConfig) -> ChecksStorageHandler: return VolumeFileChecksStorageHandler(self.workspace_client) raise ValueError(f"Unsupported storage config type: {type(config).__name__}") + + def create_for_location( + self, location: str, run_config_name: str = "default" + ) -> tuple[ChecksStorageHandler, BaseChecksStorageConfig]: + if TABLE_PATTERN.match(location) and not location.lower().endswith(tuple(FILE_SERIALIZERS.keys())): + return ( + TableChecksStorageHandler(self.workspace_client, self.spark), + TableChecksStorageConfig(location=location, run_config_name=run_config_name), + ) + if location.startswith("/Volumes/"): + return ( + VolumeFileChecksStorageHandler(self.workspace_client), + VolumeFileChecksStorageConfig(location=location), + ) + if location.startswith("/"): + return ( + WorkspaceFileChecksStorageHandler(self.workspace_client), + WorkspaceFileChecksStorageConfig(location=location), + ) + + return FileChecksStorageHandler(), FileChecksStorageConfig(location=location) diff --git a/src/databricks/labs/dqx/config_loader.py b/src/databricks/labs/dqx/config_loader.py index b42d7fd0f..dd3703f6d 100644 --- a/src/databricks/labs/dqx/config_loader.py +++ b/src/databricks/labs/dqx/config_loader.py @@ -6,12 +6,23 @@ class RunConfigLoader: """ - Class to handle loading of run configurations from the installation. + Class to handle loading of configuration from the installation. """ def __init__(self, workspace_client: WorkspaceClient): self.ws = workspace_client + def load_config(self, assume_user: bool = True, product_name: str = "dqx") -> WorkspaceConfig: + """ + Load workspace configuration from the installation. The workspace config contains all run configs. + + Args: + assume_user: if True, assume user installation + product_name: name of the product + """ + installation = self.get_installation(assume_user, product_name) + return installation.load(WorkspaceConfig) + def load_run_config( self, run_config_name: str | None, assume_user: bool = True, product_name: str = "dqx" ) -> RunConfig: diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index 5734f99ac..fb8c2d0f0 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -1,7 +1,9 @@ +import os import logging -import warnings +from concurrent import futures from collections.abc import Callable from datetime import datetime +from typing import Any import pyspark.sql.functions as F from pyspark.sql import DataFrame, SparkSession @@ -19,9 +21,6 @@ OutputConfig, FileChecksStorageConfig, BaseChecksStorageConfig, - WorkspaceFileChecksStorageConfig, - TableChecksStorageConfig, - InstallationChecksStorageConfig, RunConfig, ExtraParams, ) @@ -34,7 +33,8 @@ ) from databricks.labs.dqx.checks_validator import ChecksValidator, ChecksValidationStatus from databricks.labs.dqx.schema import dq_result_schema -from databricks.labs.dqx.utils import read_input_data, save_dataframe_as_table +from databricks.labs.dqx.io import read_input_data, save_dataframe_as_table +from databricks.labs.dqx.utils import list_tables from databricks.sdk import WorkspaceClient logger = logging.getLogger(__name__) @@ -544,6 +544,88 @@ def apply_checks_by_metadata_and_save_in_table( checked_df = self.apply_checks_by_metadata(df, checks, custom_check_functions, ref_dfs) save_dataframe_as_table(checked_df, output_config) + def apply_checks_and_save_in_tables( + self, + run_configs: list[RunConfig], + custom_check_functions: dict[str, Any] | None = None, + ref_dfs: dict[str, Any] | None = None, + max_parallelism: int | None = os.cpu_count(), + ) -> None: + """ + Apply data quality checks to multiple tables or views and write the results to output table(s). + + If quarantine tables are provided in the run configuration, the data will be split into + good and bad records, with good records written to the output table and bad records to the + quarantine table. If quarantine tables are not provided, all records (with error/warning + columns) will be written to the output table. + + Args: + run_configs (list[RunConfig]): List of run configurations containing input configs, output configs, + quarantine configs, and a checks file. + max_parallelism (int, optional): Maximum number of tables to check in parallel. Defaults to the + number of CPU cores. + custom_check_functions (dict[str, Any], optional): Dictionary with custom check functions + (e.g., *globals()* of the calling module). If not specified, only built-in functions are used + for the checks. + ref_dfs (dict[str, Any], optional): Reference DataFrames to use in the checks, if applicable. + + Returns: + None + """ + logger.info(f"Applying checks to {len(run_configs)} tables with parallelism {max_parallelism}") + with futures.ThreadPoolExecutor(max_workers=max_parallelism) as executor: + apply_checks_runs = [ + executor.submit(self._apply_checks_for_run_config, run_config, custom_check_functions, ref_dfs) + for run_config in run_configs + ] + futures.wait(apply_checks_runs) + + def apply_checks_and_save_in_tables_from_patterns( + self, + patterns: list[str], + exclude_matched: bool = False, + max_parallelism: int | None = os.cpu_count(), + custom_check_functions: dict[str, Any] | None = None, + ref_dfs: dict[str, Any] | None = None, + ) -> None: + """ + Apply data quality checks to multiple tables or views and write the results to output table(s). + + Tables and checks will be associated by run config name. If a run config matches a supplied + pattern, checks will be applied to any tables which also match the pattern. + + If quarantine tables are provided in the table configuration, the data will be split into + good and bad records, with good records written to the output table and bad records to the + quarantine table. If quarantine tables are not provided, all records (with error/warning + columns) will be written to the output table. + + Args: + patterns (list[str]): An optional list of table names or filesystem-style wildcards + (e.g., 'schema.*') to validate. + exclude_matched (bool): Specifies whether to include tables matched by the pattern. + If True, matched tables are excluded. If False, matched tables are included. + max_parallelism (int): Maximum number of tables to check in parallel. + custom_check_functions (dict[str, Callable], optional): Dictionary with custom check functions + (e.g., globals() of the calling module). If not specified, only built-in functions are used + for the checks. + ref_dfs (dict[str, Any], optional): Reference DataFrames to use in the checks, if applicable. + + Returns: + None + """ + tables = list_tables(self.ws, patterns, exclude_matched) + + configs = [ + RunConfig( + name=f"{table}_config", + input_config=InputConfig(table), + output_config=OutputConfig(f"{table}_dq"), + checks_location=f"{table}.yml", + ) + for table in tables + ] + self.apply_checks_and_save_in_tables(configs, custom_check_functions, ref_dfs, max_parallelism) + @staticmethod def validate_checks( checks: list[dict], @@ -687,224 +769,38 @@ def save_checks(self, checks: list[dict], config: BaseChecksStorageConfig) -> No handler = self._checks_handler_factory.create(config) handler.save(checks, config) - # - # Deprecated methods for loading and saving checks - # - @staticmethod - def load_checks_from_local_file(filepath: str) -> list[dict]: - """Deprecated: Use *load_checks* with *FileChecksStorageConfig* instead. - - Load DQ rules (checks) from a local JSON or YAML file. - - Args: - filepath: Path to a file containing checks definitions. - - Returns: - List of DQ rules (checks) represented as dictionaries. - """ - warnings.warn( - "Use `load_checks` method with `FileChecksStorageConfig` instead. " - "This method will be removed in future versions.", - category=DeprecationWarning, - stacklevel=2, - ) - return DQEngineCore.load_checks_from_local_file(filepath) - - @staticmethod - def save_checks_in_local_file(checks: list[dict], path: str): - """Deprecated: Use *save_checks* with *FileChecksStorageConfig* instead. - - Save DQ rules (checks) to a local YAML or JSON file. - - Args: - checks: List of DQ rules (checks) to save. - path: File path where the checks definitions will be saved. - - Returns: - None - """ - warnings.warn( - "Use `save_checks` method with `FileChecksStorageConfig` instead. " - "This method will be removed in future versions.", - category=DeprecationWarning, - stacklevel=2, - ) - return DQEngineCore.save_checks_in_local_file(checks, path) - - def load_checks_from_workspace_file(self, workspace_path: str) -> list[dict]: - """Deprecated: Use *load_checks* with *WorkspaceFileChecksStorageConfig* instead. - - Load checks stored in a Databricks workspace file. - - Args: - workspace_path: Path to the workspace file containing checks definitions. - - Returns: - List of DQ rules (checks) represented as dictionaries. - """ - warnings.warn( - "Use `load_checks` method with `WorkspaceFileChecksStorageConfig` instead. " - "This method will be removed in future versions.", - category=DeprecationWarning, - stacklevel=2, - ) - return self.load_checks(WorkspaceFileChecksStorageConfig(location=workspace_path)) - - def save_checks_in_workspace_file(self, checks: list[dict], workspace_path: str): - """Deprecated: Use *save_checks* with *WorkspaceFileChecksStorageConfig* instead. - - Save checks to a Databricks workspace file. - - Args: - checks: List of DQ rules (checks) to save. - workspace_path: Path to the workspace file where checks will be saved. - - Returns: - None - """ - warnings.warn( - "Use `save_checks` method with `WorkspaceFileChecksStorageConfig` instead. " - "This method will be removed in future versions.", - category=DeprecationWarning, - stacklevel=2, - ) - return self.save_checks(checks, WorkspaceFileChecksStorageConfig(location=workspace_path)) - - def load_checks_from_table(self, table_name: str, run_config_name: str = "default") -> list[dict]: - """Deprecated: Use *load_checks* with *TableChecksStorageConfig* instead. - - Load checks from a table. - - Args: - table_name: Fully qualified table name where checks are stored. - run_config_name: Name of the run configuration (used by the storage handler if needed). - - Returns: - List of DQ rules (checks) represented as dictionaries. - """ - warnings.warn( - "Use `load_checks` method with `TableChecksStorageConfig` instead. " - "This method will be removed in future versions.", - category=DeprecationWarning, - stacklevel=2, - ) - return self.load_checks(TableChecksStorageConfig(location=table_name, run_config_name=run_config_name)) - - def save_checks_in_table( - self, checks: list[dict], table_name: str, run_config_name: str = "default", mode: str = "append" - ): - """Deprecated: Use *save_checks* with *TableChecksStorageConfig* instead. - - Save checks to a table. - - Args: - checks: List of DQ rules (checks) to save. - table_name: Fully qualified table name where checks will be written. - run_config_name: Name of the run configuration (used by the storage handler if needed). - mode: Write mode, e.g., "append" or "overwrite". - - Returns: - None - """ - warnings.warn( - "Use `save_checks` method with `TableChecksStorageConfig` instead. " - "This method will be removed in future versions.", - category=DeprecationWarning, - stacklevel=2, - ) - return self.save_checks( - checks, TableChecksStorageConfig(location=table_name, run_config_name=run_config_name, mode=mode) - ) - - def load_checks_from_installation( + def _apply_checks_for_run_config( self, - run_config_name: str = "default", - method: str = "file", - product_name: str = "dqx", - assume_user: bool = True, - ) -> list[dict]: - """Deprecated: Use *load_checks* with *InstallationChecksStorageConfig* instead. - - Load checks from the installation directory. - - Args: - run_config_name: Named run configuration to resolve installation paths and defaults. - method: Deprecated parameter; ignored. - product_name: Product/installation identifier (e.g., "dqx"). - assume_user: Whether to assume a per-user installation layout. - - Returns: - List of DQ rules (checks) represented as dictionaries. + run_config: RunConfig, + custom_check_functions: dict[str, Any] | None = None, + ref_dfs: dict[str, Any] | None = None, + ) -> None: """ - warnings.warn( - "Use `load_checks` method with `InstallationChecksStorageConfig` instead. " - "This method will be removed in future versions.", - category=DeprecationWarning, - stacklevel=2, - ) - logger.warning(f"'method' parameter is deprecated: {method}") - return self.load_checks( - InstallationChecksStorageConfig( - run_config_name=run_config_name, product_name=product_name, assume_user=assume_user - ) - ) - - def save_checks_in_installation( - self, - checks: list[dict], - run_config_name: str = "default", - method: str = "file", - product_name: str = "dqx", - assume_user: bool = True, - ): - """Deprecated: Use *save_checks* with *InstallationChecksStorageConfig* instead. + Applies checks based on a given RunConfig. - Save checks to the installation directory. + This method loads checks from the specified location, reads input data using the input config, + and writes results using the output and optionally quarantine configs. Args: - checks: List of DQ rules (checks) to save. - run_config_name: Named run configuration to resolve installation paths and defaults. - method: Deprecated parameter; ignored. - product_name: Product/installation identifier (e.g., "dqx"). - assume_user: Whether to assume a per-user installation layout. - - Returns: - None + run_config (RunConfig): Specifies the inputs, outputs, and checks file. + custom_check_functions (dict[str, Any], optional): Dictionary with custom check functions + (e.g., globals() of the calling module). If not specified, only built-in functions are used for the checks. + ref_dfs (dict[str, Any], optional): Reference DataFrames to use in the checks, if applicable. """ - warnings.warn( - "Use `save_checks` method with `InstallationChecksStorageConfig` instead. " - "This method will be removed in future versions.", - category=DeprecationWarning, - stacklevel=2, - ) - logger.warning(f"'method' parameter is deprecated: {method}") - return self.save_checks( - checks, - InstallationChecksStorageConfig( - run_config_name=run_config_name, product_name=product_name, assume_user=assume_user - ), - ) + if not run_config.input_config: + raise ValueError("Input configuration not provided") - def load_run_config( - self, run_config_name: str = "default", assume_user: bool = True, product_name: str = "dqx" - ) -> RunConfig: - """Deprecated: Use *RunConfigLoader.load_run_config* directly. + if not run_config.output_config: + raise ValueError("Output configuration not provided") - Load a run configuration by name. This wrapper will be removed in a future version. - - Args: - run_config_name: Name of the run configuration to load. - assume_user: Whether to assume a per-user installation when resolving paths. - product_name: Product/installation identifier (e.g., "dqx"). + storage_handler, storage_config = self._checks_handler_factory.create_for_location(run_config.checks_location) + checks = storage_handler.load(storage_config) - Returns: - Loaded *RunConfig* instance. - """ - warnings.warn( - "Use `RunConfigLoader.load_run_config` method instead. This method will be removed in future versions.", - category=DeprecationWarning, - stacklevel=2, - ) - return RunConfigLoader(self.ws).load_run_config( - run_config_name=run_config_name, assume_user=assume_user, product_name=product_name + self.apply_checks_by_metadata_and_save_in_table( + checks=checks, + input_config=run_config.input_config, + output_config=run_config.output_config, + quarantine_config=run_config.quarantine_config, + custom_check_functions=custom_check_functions, + ref_dfs=ref_dfs, ) diff --git a/src/databricks/labs/dqx/io.py b/src/databricks/labs/dqx/io.py new file mode 100644 index 000000000..e77f2c71c --- /dev/null +++ b/src/databricks/labs/dqx/io.py @@ -0,0 +1,146 @@ +import logging +import re + +from typing import Any +from pyspark.sql import SparkSession +from pyspark.sql.dataframe import DataFrame +from databricks.labs.dqx.config import InputConfig, OutputConfig + +logger = logging.getLogger(__name__) + +STORAGE_PATH_PATTERN = re.compile(r"^(/|s3:/|abfss:/|gs:/)") +# catalog.schema.table or schema.table or database.table +TABLE_PATTERN = re.compile(r"^(?:[a-zA-Z0-9_]+\.)?[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$") + + +def read_input_data( + spark: SparkSession, + input_config: InputConfig, +) -> DataFrame: + """ + Reads input data from the specified location and format. + + Args: + spark: SparkSession + input_config: InputConfig with source location/table name, format, and options + + Returns: + DataFrame with values read from the input data + """ + if not input_config.location: + raise ValueError("Input location not configured") + + if TABLE_PATTERN.match(input_config.location): + return _read_table_data(spark, input_config) + + if STORAGE_PATH_PATTERN.match(input_config.location): + return _read_file_data(spark, input_config) + + raise ValueError( + f"Invalid input location. It must be a 2 or 3-level table namespace or storage path, given {input_config.location}" + ) + + +def _read_file_data(spark: SparkSession, input_config: InputConfig) -> DataFrame: + """ + Reads input data from files (e.g. JSON). Streaming reads must use auto loader with a 'cloudFiles' format. + + Args: + spark: SparkSession + input_config: InputConfig with source location, format, and options + + Returns: + DataFrame with values read from the file data + """ + if not input_config.is_streaming: + return spark.read.options(**input_config.options).load( + input_config.location, format=input_config.format, schema=input_config.schema + ) + + if input_config.format != "cloudFiles": + raise ValueError("Streaming reads from file sources must use 'cloudFiles' format") + + return spark.readStream.options(**input_config.options).load( + input_config.location, format=input_config.format, schema=input_config.schema + ) + + +def _read_table_data(spark: SparkSession, input_config: InputConfig) -> DataFrame: + """ + Reads input data from a table registered in Unity Catalog. + + Args: + spark: SparkSession + input_config: InputConfig with source location, format, and options + + Returns: + DataFrame with values read from the table data + """ + if not input_config.is_streaming: + return spark.read.options(**input_config.options).table(input_config.location) + return spark.readStream.options(**input_config.options).table(input_config.location) + + +def save_dataframe_as_table(df: DataFrame, output_config: OutputConfig): + """ + Helper method to save a DataFrame to a Delta table. + + Args: + df: The DataFrame to save + output_config: Output table name, write mode, and options + """ + logger.info(f"Saving data to {output_config.location} table") + + if df.isStreaming: + if not output_config.trigger: + query = ( + df.writeStream.format(output_config.format) + .outputMode(output_config.mode) + .options(**output_config.options) + .toTable(output_config.location) + ) + else: + trigger: dict[str, Any] = output_config.trigger + query = ( + df.writeStream.format(output_config.format) + .outputMode(output_config.mode) + .options(**output_config.options) + .trigger(**trigger) + .toTable(output_config.location) + ) + query.awaitTermination() + else: + ( + df.write.format(output_config.format) + .mode(output_config.mode) + .options(**output_config.options) + .saveAsTable(output_config.location) + ) + + +def get_reference_dataframes( + spark: SparkSession, reference_tables: dict[str, InputConfig] | None = None +) -> dict[str, DataFrame] | None: + """ + Get reference DataFrames from the provided reference tables configuration. + + Args: + spark: SparkSession + reference_tables: A dictionary mapping of reference table names to their input configurations. + + Examples: + ``` + reference_tables = { + "reference_table_1": InputConfig(location="db.schema.table1", format="delta"), + "reference_table_2": InputConfig(location="db.schema.table2", format="delta") + } + ``` + + Returns: + A dictionary mapping reference table names to their DataFrames. + """ + if not reference_tables: + return None + + logger.info("Reading reference tables.") + return {name: read_input_data(spark, input_config) for name, input_config in reference_tables.items()} diff --git a/src/databricks/labs/dqx/profiler/profiler.py b/src/databricks/labs/dqx/profiler/profiler.py index f61bbf146..e9f99b169 100644 --- a/src/databricks/labs/dqx/profiler/profiler.py +++ b/src/databricks/labs/dqx/profiler/profiler.py @@ -15,10 +15,10 @@ import pyspark.sql.types as T from pyspark.sql import DataFrame -from databricks.labs.blueprint.limiter import rate_limited from databricks.labs.dqx.base import DQEngineBase from databricks.labs.dqx.config import InputConfig -from databricks.labs.dqx.utils import read_input_data +from databricks.labs.dqx.io import read_input_data +from databricks.labs.dqx.utils import list_tables logger = logging.getLogger(__name__) @@ -154,54 +154,9 @@ def profile_tables( if not tables: if not patterns: raise ValueError("Either 'tables' or 'patterns' must be provided") - tables = self._get_tables(patterns=patterns, exclude_matched=exclude_matched) + tables = list_tables(client=self.ws, patterns=patterns, exclude_matched=exclude_matched) return self._profile_tables(tables=tables, columns=columns, options=options) - @rate_limited(max_requests=100) - def _get_tables(self, patterns: list[str] | None, exclude_matched: bool = False) -> list[str]: - """ - Gets a list table names from Unity Catalog given a list of wildcard patterns. - - Args: - patterns: A list of wildcard patterns to match against the table name. - exclude_matched: Specifies whether to include tables matched by the pattern. If True, matched tables - are excluded. If False, matched tables are included. - - Returns: - A list of table names. - """ - tables = [] - for catalog in self.ws.catalogs.list(): - if not catalog.name: - continue - for schema in self.ws.schemas.list(catalog_name=catalog.name): - if not schema.name: - continue - table_infos = self.ws.tables.list_summaries(catalog_name=catalog.name, schema_name_pattern=schema.name) - tables.extend([table_info.full_name for table_info in table_infos if table_info.full_name]) - - if patterns and exclude_matched: - tables = [table for table in tables if not DQProfiler._match_table_patterns(table, patterns)] - if patterns and not exclude_matched: - tables = [table for table in tables if DQProfiler._match_table_patterns(table, patterns)] - if len(tables) > 0: - return tables - raise ValueError("No tables found matching include or exclude criteria") - - @staticmethod - def _match_table_patterns(table: str, patterns: list[str]) -> bool: - """ - Checks if a table name matches any of the provided wildcard patterns. - - Args: - table: The table name to check. - patterns: A list of wildcard patterns (e.g. 'catalog.schema.*') to match against the table name. - - Returns: - True if the table name matches any of the patterns, False otherwise. - """ - return any(fnmatch(table, pattern) for pattern in patterns) - def _profile_tables( self, tables: list[str] | None = None, diff --git a/src/databricks/labs/dqx/profiler/profiler_runner.py b/src/databricks/labs/dqx/profiler/profiler_runner.py index 7626eee60..3776f9bb1 100644 --- a/src/databricks/labs/dqx/profiler/profiler_runner.py +++ b/src/databricks/labs/dqx/profiler/profiler_runner.py @@ -7,7 +7,7 @@ from databricks.labs.dqx.config import InputConfig, ProfilerConfig, BaseChecksStorageConfig from databricks.labs.dqx.engine import DQEngine -from databricks.labs.dqx.utils import read_input_data +from databricks.labs.dqx.io import read_input_data from databricks.labs.dqx.profiler.generator import DQGenerator from databricks.labs.dqx.profiler.profiler import DQProfiler from databricks.labs.blueprint.installation import Installation diff --git a/src/databricks/labs/dqx/quality_checker/e2e_workflow.py b/src/databricks/labs/dqx/quality_checker/e2e_workflow.py index 12c26598f..baedf4d1c 100644 --- a/src/databricks/labs/dqx/quality_checker/e2e_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/e2e_workflow.py @@ -30,7 +30,8 @@ def prepare(self, ctx: WorkflowContext): """ Initialize end-to-end workflow and emit a log record for traceability. - :param ctx: Runtime context. + Args: + ctx (WorkflowContext): Runtime context. """ logger.info(f"End-to-end: prepare start for run config: {ctx.run_config.name}") diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py b/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py index 79d5511e3..99a58ad92 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py @@ -4,7 +4,7 @@ from databricks.labs.dqx.checks_resolver import resolve_custom_check_functions_from_path from databricks.labs.dqx.config import InputConfig, OutputConfig from databricks.labs.dqx.engine import DQEngine -from databricks.labs.dqx.utils import get_reference_dataframes +from databricks.labs.dqx.io import get_reference_dataframes logger = logging.getLogger(__name__) diff --git a/src/databricks/labs/dqx/utils.py b/src/databricks/labs/dqx/utils.py index a6424fc17..c2d1bc66a 100644 --- a/src/databricks/labs/dqx/utils.py +++ b/src/databricks/labs/dqx/utils.py @@ -1,20 +1,18 @@ +import datetime import json import logging import re from typing import Any -import datetime +from fnmatch import fnmatch -from pyspark.sql import Column, SparkSession -from pyspark.sql.dataframe import DataFrame +from pyspark.sql import Column from pyspark.sql.connect.column import Column as ConnectColumn -from databricks.labs.dqx.config import InputConfig, OutputConfig +from databricks.sdk import WorkspaceClient +from databricks.labs.blueprint.limiter import rate_limited logger = logging.getLogger(__name__) -STORAGE_PATH_PATTERN = re.compile(r"^(/|s3:/|abfss:/|gs:/)") -# catalog.schema.table or schema.table or database.table -TABLE_PATTERN = re.compile(r"^(?:[a-zA-Z0-9_]+\.)?[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$") COLUMN_NORMALIZE_EXPRESSION = re.compile("[^a-zA-Z0-9]+") COLUMN_PATTERN = re.compile(r"Column<'(.*?)(?: AS (\w+))?'>$") INVALID_COLUMN_NAME_PATTERN = re.compile(r"[\s,;{}\(\)\n\t=]+") @@ -158,136 +156,6 @@ def normalize_col_str(col_str: str) -> str: return re.sub(COLUMN_NORMALIZE_EXPRESSION, "_", col_str[:max_chars].lower()).rstrip("_") -def read_input_data( - spark: SparkSession, - input_config: InputConfig, -) -> DataFrame: - """ - Reads input data from the specified location and format. - - Args: - spark: SparkSession - input_config: InputConfig with source location/table name, format, and options - - Returns: - DataFrame with values read from the input data - """ - if not input_config.location: - raise ValueError("Input location not configured") - - if TABLE_PATTERN.match(input_config.location): - return _read_table_data(spark, input_config) - - if STORAGE_PATH_PATTERN.match(input_config.location): - return _read_file_data(spark, input_config) - - raise ValueError( - f"Invalid input location. It must be a 2 or 3-level table namespace or storage path, given {input_config.location}" - ) - - -def _read_file_data(spark: SparkSession, input_config: InputConfig) -> DataFrame: - """ - Reads input data from files (e.g. JSON). Streaming reads must use auto loader with a 'cloudFiles' format. - Args: - spark: SparkSession - input_config: InputConfig with source location, format, and options - - Returns: - DataFrame with values read from the file data - """ - if not input_config.is_streaming: - return spark.read.options(**input_config.options).load( - input_config.location, format=input_config.format, schema=input_config.schema - ) - - if input_config.format != "cloudFiles": - raise ValueError("Streaming reads from file sources must use 'cloudFiles' format") - - return spark.readStream.options(**input_config.options).load( - input_config.location, format=input_config.format, schema=input_config.schema - ) - - -def _read_table_data(spark: SparkSession, input_config: InputConfig) -> DataFrame: - """ - Reads input data from a table registered in Unity Catalog. - Args: - spark: SparkSession - input_config: InputConfig with source location, format, and options - - Returns: - DataFrame with values read from the table data - """ - if not input_config.is_streaming: - return spark.read.options(**input_config.options).table(input_config.location) - return spark.readStream.options(**input_config.options).table(input_config.location) - - -def get_reference_dataframes( - spark: SparkSession, reference_tables: dict[str, InputConfig] | None = None -) -> dict[str, DataFrame] | None: - """ - Get reference DataFrames from the provided reference tables configuration. - - Args: - spark: SparkSession - reference_tables: A dictionary mapping of reference table names to their input configurations. - - Examples: - ``` - reference_tables = { - "reference_table_1": InputConfig(location="db.schema.table1", format="delta"), - "reference_table_2": InputConfig(location="db.schema.table2", format="delta") - } - ``` - - Returns: - A dictionary mapping reference table names to their DataFrames. - """ - if not reference_tables: - return None - - logger.info("Reading reference tables.") - return {name: read_input_data(spark, input_config) for name, input_config in reference_tables.items()} - - -def save_dataframe_as_table(df: DataFrame, output_config: OutputConfig): - """ - Helper method to save a DataFrame to a Delta table. - Args: - df: The DataFrame to save - output_config: Output table name, write mode, and options - """ - logger.info(f"Saving data to {output_config.location} table") - - if df.isStreaming: - if not output_config.trigger: - query = ( - df.writeStream.format(output_config.format) - .outputMode(output_config.mode) - .options(**output_config.options) - .toTable(output_config.location) - ) - else: - trigger: dict[str, Any] = output_config.trigger - query = ( - df.writeStream.format(output_config.format) - .outputMode(output_config.mode) - .options(**output_config.options) - .trigger(**trigger) - .toTable(output_config.location) - ) - query.awaitTermination() - else: - ( - df.write.format(output_config.format) - .mode(output_config.mode) - .options(**output_config.options) - .saveAsTable(output_config.location) - ) - - def is_sql_query_safe(query: str) -> bool: # Normalize the query by removing extra whitespace and converting to lowercase normalized_query = re.sub(r"\s+", " ", query).strip().lower() @@ -326,3 +194,53 @@ def safe_json_load(value: str): return json.loads(value) # load as json if possible except json.JSONDecodeError: return value + + +@rate_limited(max_requests=100) +def list_tables(client: WorkspaceClient, patterns: list[str] | None, exclude_matched: bool = False) -> list[str]: + """ + Gets a list of table names from Unity Catalog given a list of wildcard patterns. + + Args: + client (WorkspaceClient): Databricks SDK WorkspaceClient. + patterns (list[str] | None): A list of wildcard patterns to match against the table name. + exclude_matched (bool): Specifies whether to include tables matched by the pattern. + If True, matched tables are excluded. If False, matched tables are included. + + Returns: + list[str]: A list of table names. + + Raises: + ValueError: If no tables are found matching the include or exclude criteria. + """ + tables = [] + for catalog in client.catalogs.list(): + if not catalog.name: + continue + for schema in client.schemas.list(catalog_name=catalog.name): + if not schema.name: + continue + table_infos = client.tables.list_summaries(catalog_name=catalog.name, schema_name_pattern=schema.name) + tables.extend([table_info.full_name for table_info in table_infos if table_info.full_name]) + + if patterns and exclude_matched: + tables = [table for table in tables if not match_table_patterns(table, patterns)] + if patterns and not exclude_matched: + tables = [table for table in tables if match_table_patterns(table, patterns)] + if len(tables) > 0: + return tables + raise ValueError("No tables found matching include or exclude criteria") + + +def match_table_patterns(table: str, patterns: list[str]) -> bool: + """ + Checks if a table name matches any of the provided wildcard patterns. + + Args: + table (str): The table name to check. + patterns (list[str]): A list of wildcard patterns (e.g., 'catalog.schema.*') to match against the table name. + + Returns: + bool: True if the table name matches any of the patterns, False otherwise. + """ + return any(fnmatch(table, pattern) for pattern in patterns) diff --git a/tests/conftest.py b/tests/conftest.py index 8f044c429..7070e709d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -22,7 +22,7 @@ @pytest.fixture def debug_env_name(): - return "ws2" # Specify the name of the debug environment from ~/.databricks/debug-env.json + return "ws" # Specify the name of the debug environment from ~/.databricks/debug-env.json @pytest.fixture diff --git a/tests/e2e/test_run_demos.py b/tests/e2e/test_run_demos.py index a8d1054de..46e611272 100644 --- a/tests/e2e/test_run_demos.py +++ b/tests/e2e/test_run_demos.py @@ -261,6 +261,31 @@ def test_run_dqx_demo_asset_bundle(make_schema, make_random, library_ref): subprocess.run([cli_path, "bundle", "destroy", "--auto-approve"], check=True, capture_output=True, cwd=path) +def test_run_dqx_multi_table_demo(make_notebook, make_schema, make_job, library_ref): + + ws = WorkspaceClient() + path = Path(__file__).parent.parent.parent / "demos" / "dqx_multi_table_demo.py" + with open(path, "rb") as f: + notebook = make_notebook(content=f, format=ImportFormat.SOURCE) + + catalog = "main" + schema = make_schema(catalog_name=catalog).name + notebook_path = notebook.as_fuse().as_posix() + notebook_task = NotebookTask( + notebook_path=notebook_path, + base_parameters={"demo_catalog_name": catalog, "demo_schema_name": schema, "test_library_ref": library_ref}, + ) + job = make_job(tasks=[Task(task_key="dqx_multi_table_demo", notebook_task=notebook_task)]) + + waiter = ws.jobs.run_now_and_wait(job.job_id) + run = ws.jobs.wait_get_run_job_terminated_or_skipped( + run_id=waiter.run_id, + timeout=timedelta(minutes=30), + callback=lambda r: validate_run_status(r, ws), + ) + logging.info(f"Job run {run.run_id} completed successfully for dqx_multi_table_demo") + + def validate_run_status(run: Run, client: WorkspaceClient) -> None: """ Validates that a job task run completed successfully. diff --git a/tests/integration/test_apply_checks_and_save_in_table.py b/tests/integration/test_apply_checks_and_save_in_table.py new file mode 100644 index 000000000..1dee8a2fd --- /dev/null +++ b/tests/integration/test_apply_checks_and_save_in_table.py @@ -0,0 +1,1033 @@ +from pyspark.sql.functions import col, lit, when +from pyspark.sql import Column +from chispa.dataframe_comparer import assert_df_equality # type: ignore + +from databricks.labs.dqx import check_funcs +from databricks.labs.dqx.config import InputConfig, OutputConfig, RunConfig, WorkspaceFileChecksStorageConfig +from databricks.labs.dqx.engine import DQEngine +from databricks.labs.dqx.rule import DQRowRule +from tests.integration.conftest import EXTRA_PARAMS, RUN_TIME, REPORTING_COLUMNS + + +def test_apply_checks_and_save_in_table_single_table(ws, spark, make_schema, make_random): + """Test apply_checks_and_save_in_table method with single table.""" + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + + # Create test data and save to source table + test_schema = "a: int, b: int, c: string" + test_df = spark.createDataFrame([[1, 2, "valid"], [None, 3, "error"], [4, None, "warn"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + # Create checks + checks = [ + DQRowRule( + name="a_is_null", + criticality="error", + check_func=check_funcs.is_not_null, + column="a", + ), + DQRowRule( + name="b_is_null", + criticality="warn", + check_func=check_funcs.is_not_null, + column="b", + ), + ] + + # Apply checks and write to table (no quarantine table) + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + engine.apply_checks_and_save_in_table( + checks=checks, + input_config=InputConfig(location=input_table), + output_config=OutputConfig(location=output_table, mode="overwrite"), + ) + + # Verify the table was created and contains the expected data + actual_df = spark.table(output_table) + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, 2, "valid", None, None], + [ + None, + 3, + "error", + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ], + [ + 4, + None, + "warn", + None, + [ + { + "name": "b_is_null", + "message": "Column 'b' value is null", + "columns": ["b"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + ], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + +def test_apply_checks_and_save_in_table_split_tables(ws, spark, make_schema, make_random): + """Test apply_checks_and_save_in_table method with split tables.""" + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + quarantine_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + + # Create test data and save to source table + test_schema = "a: int, b: int, c: string" + test_df = spark.createDataFrame([[1, 2, "valid"], [None, 3, "invalid"], [4, 5, "good"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + # Create checks + checks = [ + DQRowRule( + name="a_is_null", + criticality="error", + check_func=check_funcs.is_not_null, + column="a", + ), + ] + + # Apply checks, split, and write to tables (with quarantine table) + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + engine.apply_checks_and_save_in_table( + checks=checks, + input_config=InputConfig(location=input_table), + output_config=OutputConfig(location=output_table, mode="overwrite", options={"overwriteSchema": "true"}), + quarantine_config=OutputConfig( + location=quarantine_table, mode="overwrite", options={"overwriteSchema": "true"} + ), + ) + + # Verify the tables were created and contain the expected data + actual_validated_df = spark.table(output_table) + actual_quarantine_df = spark.table(quarantine_table) + expected_validated_df = spark.createDataFrame([[1, 2, "valid"], [4, 5, "good"]], schema=test_schema) + quarantine_schema = test_schema + REPORTING_COLUMNS + expected_quarantine_df = spark.createDataFrame( + [ + [ + None, + 3, + "invalid", + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ] + ], + schema=quarantine_schema, + ) + + assert_df_equality(actual_validated_df, expected_validated_df, ignore_nullable=True) + assert_df_equality(actual_quarantine_df, expected_quarantine_df, ignore_nullable=True) + + +def test_apply_checks_by_metadata_and_save_in_table_single_table(ws, spark, make_schema, make_random): + """Test apply_checks_by_metadata_and_save_in_table method with single table.""" + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + + # Create test data and save to source table + test_schema = "a: int, b: int, c: string" + test_df = spark.createDataFrame([[1, 2, "valid"], [None, 3, "error"], [4, None, "warn"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + # Create metadata checks + checks = [ + { + "name": "a_is_null", + "criticality": "error", + "check": {"function": "is_not_null", "arguments": {"column": "a"}}, + }, + { + "name": "b_is_null", + "criticality": "warn", + "check": {"function": "is_not_null", "arguments": {"column": "b"}}, + }, + ] + + # Apply checks and write to table (no quarantine table) + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + engine.apply_checks_by_metadata_and_save_in_table( + checks=checks, + input_config=InputConfig(location=input_table), + output_config=OutputConfig(location=output_table, mode="overwrite"), + ) + + # Verify the table was created and contains the expected data + actual_df = spark.table(output_table) + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, 2, "valid", None, None], + [ + None, + 3, + "error", + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ], + [ + 4, + None, + "warn", + None, + [ + { + "name": "b_is_null", + "message": "Column 'b' value is null", + "columns": ["b"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + ], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + +def test_apply_checks_by_metadata_and_save_in_table_split_tables(ws, spark, make_schema, make_random): + """Test apply_checks_by_metadata_and_save_in_table method with split tables.""" + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + quarantine_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + + # Create test data and save to source table + test_schema = "a: int, b: int, c: string" + test_df = spark.createDataFrame([[1, 2, "valid"], [None, 3, "invalid"], [4, 5, "good"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + # Create metadata checks + checks = [ + { + "name": "a_is_null", + "criticality": "error", + "check": {"function": "is_not_null", "arguments": {"column": "a"}}, + }, + ] + + # Apply checks, split, and write to tables (with quarantine table) + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + engine.apply_checks_by_metadata_and_save_in_table( + checks=checks, + input_config=InputConfig(location=input_table), + output_config=OutputConfig(location=output_table, mode="overwrite", options={"overwriteSchema": "true"}), + quarantine_config=OutputConfig( + location=quarantine_table, mode="overwrite", options={"overwriteSchema": "true"} + ), + ) + + # Verify the tables were created and contain the expected data + actual_validated_df = spark.table(output_table) + actual_quarantine_df = spark.table(quarantine_table) + expected_validated_df = spark.createDataFrame([[1, 2, "valid"], [4, 5, "good"]], schema=test_schema) + quarantine_schema = test_schema + REPORTING_COLUMNS + expected_quarantine_df = spark.createDataFrame( + [ + [ + None, + 3, + "invalid", + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ] + ], + schema=quarantine_schema, + ) + + assert_df_equality(actual_validated_df, expected_validated_df, ignore_nullable=True) + assert_df_equality(actual_quarantine_df, expected_quarantine_df, ignore_nullable=True) + + +def test_apply_checks_and_save_in_table_with_options(ws, spark, make_schema, make_random): + """Test apply_checks_and_save_in_table with custom options.""" + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + + # Create test data and save to source table + test_schema = "a: int, b: int" + test_df = spark.createDataFrame([[1, 2], [3, 4]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + # Create checks + checks = [ + DQRowRule( + name="a_is_positive", + criticality="warn", + check_func=check_funcs.is_not_less_than, + column="a", + check_func_kwargs={"limit": 0}, + ), + ] + + # Apply checks and write to table with custom options + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + engine.apply_checks_and_save_in_table( + checks=checks, + input_config=InputConfig(location=input_table), + output_config=OutputConfig(location=output_table, mode="overwrite", options={"overwriteSchema": "true"}), + ) + + # Verify the table was created and contains the expected data + actual_df = spark.table(output_table) + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, 2, None, None], + [3, 4, None, None], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + # Add more data with different schema to test schema evolution + new_test_schema = "a: int, b: int, d: string" + new_test_df = spark.createDataFrame([[5, 6, "new"]], new_test_schema) + new_input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + new_test_df.write.format("delta").mode("overwrite").saveAsTable(new_input_table) + + engine.apply_checks_and_save_in_table( + checks=checks, + input_config=InputConfig(location=new_input_table), + output_config=OutputConfig(location=output_table, mode="append", options={"mergeSchema": "true"}), + ) + + # Verify schema was merged + actual_df = spark.table(output_table).orderBy(["a"]) + expected_schema = new_test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, 2, None, None, None], + [3, 4, None, None, None], + [5, 6, "new", None, None], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True, ignore_column_order=True) + + +def test_apply_checks_and_save_in_table_with_different_modes(ws, spark, make_schema, make_random): + """Test apply_checks_and_save_in_table with different write modes.""" + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + + # Create test data and save to source table + test_schema = "a: int, b: int" + test_df = spark.createDataFrame([[1, 2], [None, 4]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + # Create checks + checks = [ + DQRowRule( + name="a_is_null", + criticality="error", + check_func=check_funcs.is_not_null, + column="a", + ), + ] + + # First write with overwrite mode + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + engine.apply_checks_and_save_in_table( + checks=checks, + input_config=InputConfig(location=input_table), + output_config=OutputConfig(location=output_table, mode="overwrite"), + ) + + # Verify initial data + actual_df = spark.table(output_table) + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, 2, None, None], + [ + None, + 4, + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + # Second write with append mode + new_test_df = spark.createDataFrame([[None, 4], [5, 6]], test_schema) + new_input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + new_test_df.write.format("delta").mode("overwrite").saveAsTable(new_input_table) + + engine.apply_checks_and_save_in_table( + checks=checks, + input_config=InputConfig(location=new_input_table), + output_config=OutputConfig(location=output_table, mode="overwrite"), + ) + + # Verify appended data + actual_df = spark.table(output_table) + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [ + None, + 4, + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ], + [5, 6, None, None], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + +def test_apply_checks_by_metadata_and_save_in_table_with_custom_functions(ws, spark, make_schema, make_random): + """Test apply_checks_by_metadata_and_save_in_table with custom check functions.""" + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + + # Create test data and save to source table + test_schema = "a: int, b: string" + test_df = spark.createDataFrame([[1, "test"], [2, "custom"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + # Define custom check function + def custom_string_check(column: str) -> Column: + """Custom check function for testing.""" + return when(col(column).contains("custom"), lit("Contains custom text")).otherwise(lit(None)) + + # Create metadata checks with custom function + checks = [ + { + "name": "custom_string_check", + "criticality": "warn", + "check": {"function": "custom_string_check", "arguments": {"column": "b"}}, + }, + ] + + # Apply checks with custom functions + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + engine.apply_checks_by_metadata_and_save_in_table( + checks=checks, + input_config=InputConfig(location=input_table), + output_config=OutputConfig(location=output_table, mode="overwrite"), + custom_check_functions={"custom_string_check": custom_string_check}, + ) + + # Verify the table was created + actual_df = spark.table(output_table) + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, "test", None, None], + [ + 2, + "custom", + None, + [ + { + "name": "custom_string_check", + "message": "Contains custom text", + "columns": ["b"], + "filter": None, + "function": "custom_string_check", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + ], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + +def test_apply_checks_and_save_in_table_streaming_write(ws, spark, make_schema, make_random, make_volume): + """Test writing streaming DataFrames to Delta tables.""" + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + volume = make_volume(catalog_name=catalog_name, schema_name=schema.name) + checkpoint_location = f"/Volumes/{volume.catalog_name}/{volume.schema_name}/{volume.name}/{make_random(8).lower()}" + + # Create source table for streaming + test_schema = "a: int, b: int" + test_df = spark.createDataFrame([[1, 2], [None, 4]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + # Create checks + checks = [ + DQRowRule( + name="a_is_null", + criticality="error", + check_func=check_funcs.is_not_null, + column="a", + ), + ] + + # Apply checks and write streaming DataFrame + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + engine.apply_checks_and_save_in_table( + checks=checks, + input_config=InputConfig(location=input_table, is_streaming=True), + output_config=OutputConfig( + location=output_table, options={"checkPointLocation": checkpoint_location}, trigger={"availableNow": True} + ), + ) + + # Verify the table was created with streaming data + actual_df = spark.table(output_table) + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, 2, None, None], + [ + None, + 4, + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + +def test_apply_checks_and_save_in_tables(ws, spark, make_schema, make_random, make_directory): + """Test apply_checks_and_save_in_tables method with a single table.""" + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + + # Create test data and save to source table + test_schema = "a: int, b: int, c: string" + test_df = spark.createDataFrame([[1, 2, "valid"], [None, 3, "error"], [4, None, "warn"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + # Create checks + checks = [ + { + "name": "a_is_null", + "criticality": "error", + "check": {"function": "is_not_null", "arguments": {"column": "a"}}, + }, + { + "name": "b_is_null", + "criticality": "warn", + "check": {"function": "is_not_null", "arguments": {"column": "b"}}, + }, + ] + + # Save the checks to a workspace file: + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + workspace_folder = str(make_directory().absolute()) + checks_location = f"{workspace_folder}/{input_table}.yml" + engine.save_checks(checks, config=WorkspaceFileChecksStorageConfig(location=checks_location)) + + # Configure table checks + run_configs = [ + RunConfig( + input_config=InputConfig(location=input_table), + output_config=OutputConfig(location=output_table, mode="overwrite"), + checks_location=checks_location, + ) + ] + + # Apply checks and write to table + engine.apply_checks_and_save_in_tables(run_configs=run_configs, max_parallelism=1) + + # Verify the table was created and contains the expected data + actual_df = spark.table(output_table) + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, 2, "valid", None, None], + [ + None, + 3, + "error", + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ], + [ + 4, + None, + "warn", + None, + [ + { + "name": "b_is_null", + "message": "Column 'b' value is null", + "columns": ["b"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + ], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + +def test_apply_checks_and_save_in_tables_multiple_tables(ws, spark, make_schema, make_random, make_directory): + """Test apply_checks_and_save_in_tables method with multiple tables.""" + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + + # Create multiple input and output tables + input_tables = [f"{catalog_name}.{schema.name}.{make_random(8).lower()}" for _ in range(2)] + output_tables = [f"{catalog_name}.{schema.name}.{make_random(8).lower()}" for _ in range(2)] + + # Create test data for both tables + test_schema = "a: int, b: string" + test_df1 = spark.createDataFrame([[1, "valid"], [None, "invalid"]], test_schema) + test_df2 = spark.createDataFrame([[100, "test"], [200, None]], test_schema) + + test_df1.write.format("delta").mode("overwrite").saveAsTable(input_tables[0]) + test_df2.write.format("delta").mode("overwrite").saveAsTable(input_tables[1]) + + # Create different checks for each table + table1_checks = [ + { + "name": "a_is_null", + "criticality": "error", + "check": {"function": "is_not_null", "arguments": {"column": "a"}}, + } + ] + table2_checks = [ + { + "name": "b_is_null", + "criticality": "warn", + "check": {"function": "is_not_null", "arguments": {"column": "b"}}, + } + ] + + # Save the checks to workspace files: + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + workspace_folder = str(make_directory().absolute()) + checks_location1 = f"{workspace_folder}/{input_tables[0]}.yml" + checks_location2 = f"{workspace_folder}/{input_tables[1]}.yml" + engine.save_checks(table1_checks, config=WorkspaceFileChecksStorageConfig(location=checks_location1)) + engine.save_checks(table2_checks, config=WorkspaceFileChecksStorageConfig(location=checks_location2)) + + # Configure multiple table checks + run_configs = [ + RunConfig( + input_config=InputConfig(location=input_tables[0]), + output_config=OutputConfig(location=output_tables[0], mode="overwrite"), + checks_location=checks_location1, + ), + RunConfig( + input_config=InputConfig(location=input_tables[1]), + output_config=OutputConfig(location=output_tables[1], mode="overwrite"), + checks_location=checks_location2, + ), + ] + + # Apply checks and write to tables + engine.apply_checks_and_save_in_tables(run_configs=run_configs, max_parallelism=2) + + # Verify both tables were created and contain the expected data + actual_df1 = spark.table(output_tables[0]) + actual_df2 = spark.table(output_tables[1]) + + expected_schema = test_schema + REPORTING_COLUMNS + expected_df1 = spark.createDataFrame( + [ + [1, "valid", None, None], + [ + None, + "invalid", + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ], + ], + schema=expected_schema, + ) + + expected_df2 = spark.createDataFrame( + [ + [100, "test", None, None], + [ + 200, + None, + None, + [ + { + "name": "b_is_null", + "message": "Column 'b' value is null", + "columns": ["b"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + ], + ], + schema=expected_schema, + ) + + assert_df_equality(actual_df1, expected_df1, ignore_nullable=True) + assert_df_equality(actual_df2, expected_df2, ignore_nullable=True) + + +def test_apply_checks_and_save_in_tables_with_quarantine(ws, spark, make_schema, make_random, make_directory): + """Test apply_checks_and_save_in_tables method with quarantine tables.""" + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + + input_tables = [f"{catalog_name}.{schema.name}.{make_random(8).lower()}" for _ in range(2)] + output_tables = [f"{catalog_name}.{schema.name}.{make_random(8).lower()}" for _ in range(2)] + quarantine_tables = [f"{catalog_name}.{schema.name}.{make_random(8).lower()}" for _ in range(2)] + + # Create test data + test_schema = "a: int, b: string" + test_df1 = spark.createDataFrame([[1, "valid"], [None, "invalid"], [3, "good"]], test_schema) + test_df2 = spark.createDataFrame([[100, "test"], [200, "check"]], test_schema) + + test_df1.write.format("delta").mode("overwrite").saveAsTable(input_tables[0]) + test_df2.write.format("delta").mode("overwrite").saveAsTable(input_tables[1]) + + # Create checks + checks = [ + { + "name": "a_is_null", + "criticality": "error", + "check": {"function": "is_not_null", "arguments": {"column": "a"}}, + } + ] + + # Save the checks to workspace files: + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + workspace_folder = str(make_directory().absolute()) + for input_table in input_tables: + engine.save_checks(checks, config=WorkspaceFileChecksStorageConfig(location=f"{workspace_folder}/{input_table}.yml")) + + # Configure mixed table setups (one with quarantine, one without) + run_configs = [ + RunConfig( + input_config=InputConfig(location=input_tables[0]), + output_config=OutputConfig(location=output_tables[0], mode="overwrite"), + quarantine_config=OutputConfig(location=quarantine_tables[0], mode="overwrite"), + checks_location=f"{workspace_folder}/{input_tables[0]}.yml", + ), + RunConfig( + input_config=InputConfig(location=input_tables[1]), + output_config=OutputConfig(location=output_tables[1], mode="overwrite"), + # Skip the `quarantine_config` for this input table + checks_location=f"{workspace_folder}/{input_tables[1]}.yml", + ), + ] + + # Apply checks and write to tables + engine.apply_checks_and_save_in_tables(run_configs=run_configs, max_parallelism=2) + + # Verify first table was split correctly + actual_validated_dfs = [spark.table(output_table) for output_table in output_tables] + actual_quarantine_df1 = spark.table(quarantine_tables[0]) + expected_validated_df1 = spark.createDataFrame([[1, "valid"], [3, "good"]], schema=test_schema) + expected_quarantine_df1 = spark.createDataFrame( + [ + [ + None, + "invalid", + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ] + ], + schema=test_schema + REPORTING_COLUMNS, + ) + + # Verify second table includes all records with reporting columns + expected_df2 = spark.createDataFrame( + [ + [100, "test", None, None], + [200, "check", None, None], + ], + schema=test_schema + REPORTING_COLUMNS, + ) + + assert_df_equality(actual_validated_dfs[0], expected_validated_df1, ignore_nullable=True) + assert_df_equality(actual_validated_dfs[1], expected_df2, ignore_nullable=True) + assert_df_equality(actual_quarantine_df1, expected_quarantine_df1, ignore_nullable=True) + + +def test_apply_checks_and_save_in_tables_custom_parallelism(ws, spark, make_schema, make_random, make_directory): + """Test apply_checks_and_save_in_tables method with custom parallelism settings.""" + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + + # Create 4 tables to test parallelism + run_configs = [] + input_tables = [] + output_tables = [] + + for i in range(4): + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + + input_tables.append(input_table) + output_tables.append(output_table) + + # Create test data + test_schema = "a: int, b: string" + test_df = spark.createDataFrame([[i, f"test_{i}"], [i + 10, f"data_{i}"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + # Create simple checks + checks = [ + { + "name": "a_is_positive", + "criticality": "warn", + "check": {"function": "is_not_less_than", "arguments": {"column": "a", "limit": 0}}, + }, + ] + + # Save the checks to workspace files: + workspace_folder = str(make_directory().absolute()) + for input_table in input_tables: + engine.save_checks(checks, config=WorkspaceFileChecksStorageConfig(location=f"{workspace_folder}/{input_table}.yml")) + + run_configs.append( + RunConfig( + input_config=InputConfig(location=input_table), + output_config=OutputConfig(location=output_table, mode="overwrite"), + checks_location=f"{workspace_folder}/{input_table}.yml", + ) + ) + + # Apply checks with limited parallelism + engine.apply_checks_and_save_in_tables(run_configs=run_configs, max_parallelism=2) + + # Verify all tables were processed correctly + for i, output_table in enumerate(output_tables): + actual_df = spark.table(output_table) + test_schema = "a: int, b: string" + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [i, f"test_{i}", None, None], + [i + 10, f"data_{i}", None, None], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + +def test_apply_checks_and_save_in_tables_empty_configs(ws, spark, make_schema, make_random): + """Test apply_checks_and_save_in_tables method with empty table configurations.""" + # Test with empty list of table configs + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + + # This should not raise an error + engine.apply_checks_and_save_in_tables(run_configs=[], max_parallelism=1) + + +def test_apply_checks_and_save_in_tables_with_custom_functions(ws, spark, make_schema, make_random, make_directory): + """Test apply_checks_and_save_in_tables method with custom check functions.""" + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + + # Create test data + test_schema = "a: int, b: string" + test_df = spark.createDataFrame([[1, "test"], [2, "custom"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + # Define custom check function + def custom_string_check(column: str) -> Column: + """Custom check function for testing.""" + return when(col(column).contains("custom"), lit("Contains custom text")).otherwise(lit(None)) + + # Create metadata checks with custom function + checks = [ + { + "name": "custom_string_check", + "criticality": "warn", + "check": {"function": "custom_string_check", "arguments": {"column": "b"}}, + }, + ] + + # Save the checks to a workspace file: + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + workspace_folder = str(make_directory().absolute()) + checks_location = f"{workspace_folder}/{input_table}.yml" + engine.save_checks(checks, config=WorkspaceFileChecksStorageConfig(location=checks_location)) + + # Configure table checks + run_configs = [ + RunConfig( + input_config=InputConfig(location=input_table), + output_config=OutputConfig(location=output_table, mode="overwrite"), + checks_location=checks_location, + ) + ] + + # Apply checks and write to table + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + engine.apply_checks_and_save_in_tables( + run_configs=run_configs, custom_check_functions={"custom_string_check": custom_string_check}, max_parallelism=1 + ) + + # Verify the table was created + actual_df = spark.table(output_table) + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, "test", None, None], + [ + 2, + "custom", + None, + [ + { + "name": "custom_string_check", + "message": "Contains custom text", + "columns": ["b"], + "filter": None, + "function": "custom_string_check", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + ], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) diff --git a/tests/integration/test_config.py b/tests/integration/test_config.py index 9d5daffa6..97e28e8c9 100644 --- a/tests/integration/test_config.py +++ b/tests/integration/test_config.py @@ -4,6 +4,25 @@ from databricks.labs.dqx.config_loader import RunConfigLoader +def test_load_workspace_config_from_user_installation(ws, serverless_installation_ctx, spark): + serverless_installation_ctx.installation.save(serverless_installation_ctx.config) + product_name = serverless_installation_ctx.product_info.product_name() + config = RunConfigLoader(ws).load_config(assume_user=True, product_name=product_name) + expected_config = serverless_installation_ctx.config + assert config == expected_config + + +def test_load_workspace_config_from_global_installation(ws, serverless_installation_ctx): + product_name = serverless_installation_ctx.product_info.product_name() + expected_config = serverless_installation_ctx.config + + with patch.object(Installation, '_global_installation', return_value=f"/Shared/{product_name}"): + serverless_installation_ctx.installation = Installation.assume_global(ws, product_name) + serverless_installation_ctx.installation.save(serverless_installation_ctx.config) + config = RunConfigLoader(ws).load_config(assume_user=False, product_name=product_name) + assert config == expected_config + + def test_load_run_config_from_user_installation(ws, installation_ctx, spark): installation_ctx.installation.save(installation_ctx.config) product_name = installation_ctx.product_info.product_name() diff --git a/tests/integration/test_io.py b/tests/integration/test_io.py new file mode 100644 index 000000000..d9c1e6e56 --- /dev/null +++ b/tests/integration/test_io.py @@ -0,0 +1,217 @@ +import pytest +from chispa.dataframe_comparer import assert_df_equality # type: ignore +from databricks.labs.dqx.config import InputConfig, OutputConfig +from databricks.labs.dqx.io import read_input_data, save_dataframe_as_table, get_reference_dataframes + + +def test_read_input_data_no_input_format(spark, make_schema, make_volume): + catalog_name = "main" + schema_name = make_schema(catalog_name=catalog_name).name + info = make_volume(catalog_name=catalog_name, schema_name=schema_name) + input_location = info.full_name + + schema = "a: int, b: int" + input_df = spark.createDataFrame([[1, 2]], schema) + input_df.write.format("delta").saveAsTable(input_location) + + input_config = InputConfig(location=input_location) + actual_df = read_input_data(spark, input_config) + + assert_df_equality(actual_df, input_df) + + +def test_read_invalid_input_location(spark): + input_location = "invalid/location" + input_config = InputConfig(location=input_location) + + with pytest.raises( + ValueError, + match="Invalid input location. It must be a 2 or 3-level table namespace or storage path, given invalid/location", + ): + read_input_data(spark, input_config) + + +def test_read_invalid_input_table(spark): + input_location = "table" # not a valid 2 or 3-level namespace + input_config = InputConfig(location=input_location) + + with pytest.raises( + ValueError, + match="Invalid input location. It must be a 2 or 3-level table namespace or storage path, given table", + ): + read_input_data(spark, input_config) + + +def test_read_input_data_from_table(spark, make_schema, make_random): + catalog_name = "main" + schema_name = make_schema(catalog_name=catalog_name).name + input_location = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + input_config = InputConfig(location=input_location) + + schema = "a: int, b: int" + input_df = spark.createDataFrame([[1, 2]], schema) + input_df.write.format("delta").saveAsTable(input_location) + + result_df = read_input_data(spark, input_config) + assert_df_equality(input_df, result_df) + + +def test_read_input_data_from_table_with_schema_and_spark_options(spark, make_schema, make_random): + catalog_name = "main" + schema_name = make_schema(catalog_name=catalog_name).name + input_location = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + input_format = None + input_read_options = {"versionAsOf": "0"} + input_schema = "a int, b int" + input_config = InputConfig( + location=input_location, format=input_format, schema=input_schema, options=input_read_options + ) + + schema = "a: int, b: int" + input_df_ver0 = spark.createDataFrame([[1, 2]], schema) + input_df_ver0.write.format("delta").saveAsTable(input_location) + input_df_ver1 = spark.createDataFrame([[0, 0]], schema) + input_df_ver1.write.format("delta").insertInto(input_location) + + result_df = read_input_data(spark, input_config) + assert_df_equality(input_df_ver0, result_df) + + +def test_read_input_data_from_workspace_file(spark, make_schema, make_volume): + catalog_name = "main" + schema_name = make_schema(catalog_name=catalog_name).name + info = make_volume(catalog_name=catalog_name, schema_name=schema_name) + input_location = info.full_name + input_format = "delta" + input_config = InputConfig(location=input_location, format=input_format) + + schema = "a: int, b: int" + input_df = spark.createDataFrame([[1, 2]], schema) + input_df.write.format("delta").saveAsTable(input_location) + + result_df = read_input_data(spark, input_config) + assert_df_equality(input_df, result_df) + + +def test_read_input_data_from_workspace_file_with_spark_options(spark, make_schema, make_volume): + catalog_name = "main" + schema_name = make_schema(catalog_name=catalog_name).name + info = make_volume(catalog_name=catalog_name, schema_name=schema_name) + input_location = info.full_name + input_format = "delta" + input_read_options = {"versionAsOf": "0"} + input_config = InputConfig(location=input_location, format=input_format, options=input_read_options) + + schema = "a: int, b: int" + input_df_ver0 = spark.createDataFrame([[1, 2]], schema) + input_df_ver0.write.format("delta").saveAsTable(input_location) + input_df_ver1 = spark.createDataFrame([[0, 0]], schema) + input_df_ver1.write.format("delta").insertInto(input_location) + + result_df = read_input_data(spark, input_config) + assert_df_equality(input_df_ver0, result_df) + + +def test_read_input_data_from_workspace_file_in_csv_format(spark, make_schema, make_volume): + catalog_name = "main" + schema_name = make_schema(catalog_name=catalog_name).name + info = make_volume(catalog_name=catalog_name, schema_name=schema_name) + input_location = f"/Volumes/{info.catalog_name}/{info.schema_name}/{info.name}" + input_format = "csv" + + input_read_options = {"header": "true"} + input_schema = "a int, b int" + input_config = InputConfig( + location=input_location, format=input_format, schema=input_schema, options=input_read_options + ) + + schema = "a: int, b: int" + input_df_ver0 = spark.createDataFrame([[1, 2]], schema) + input_df_ver0.write.options(**input_read_options).format("csv").mode("overwrite").save(input_location) + + result_df = read_input_data(spark, input_config) + + assert_df_equality(input_df_ver0, result_df) + + +def test_save_dataframe_as_table(spark, make_schema, make_random): + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + table_name = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" + mode = "overwrite" + output_config = OutputConfig(location=table_name, mode=mode) + + data_schema = "a: int, b: int" + input_df = spark.createDataFrame([[1, 2]], data_schema) + save_dataframe_as_table(input_df, output_config) + + result_df = spark.table(table_name) + assert_df_equality(input_df, result_df) + + output_config.mode = "append" + output_config.options = {"mergeSchema": "true"} + changed_df = input_df.selectExpr("*", "1 AS c") + save_dataframe_as_table(changed_df, output_config) + + result_df = spark.table(table_name) + expected_df = changed_df.union(input_df.selectExpr("*", "NULL AS c")) + + # Sorting is necessary because row order is not guaranteed after union/append operations in Spark. + # This ensures a deterministic comparison for the test. + assert_df_equality(expected_df.sort("c"), result_df.sort("c")) + + +def test_save_streaming_dataframe_in_table(spark, make_schema, make_random, make_volume): + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + table_name = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" + random_name = make_random(6).lower() + result_table_name = f"{catalog_name}.{schema.name}.{random_name}" + volume = make_volume(catalog_name=catalog_name, schema_name=schema.name) + options = {"checkpointLocation": f"/Volumes/{volume.catalog_name}/{volume.schema_name}/{volume.name}/{random_name}"} + trigger = {"availableNow": True} + output_config = OutputConfig(location=result_table_name, options=options, trigger=trigger) + + data_schema = "a: int, b: int" + input_df = spark.createDataFrame([[1, 2]], data_schema) + input_df.write.format("delta").mode("overwrite").saveAsTable(table_name) + streaming_input_df = spark.readStream.table(table_name) + + save_dataframe_as_table( + streaming_input_df, + output_config, + ) + + result_df = spark.table(result_table_name) + assert_df_equality(input_df, result_df) + + save_dataframe_as_table( + streaming_input_df, + output_config, + ) + + result_df = spark.table(result_table_name) + assert_df_equality(input_df, result_df) # no new records + + +def test_get_reference_dataframes(spark, make_schema, make_random): + catalog_name = "main" + schema_name = make_schema(catalog_name=catalog_name).name + input_location_1 = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + input_location_2 = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + + schema = "a: int, b: int" + input_df_1 = spark.createDataFrame([[1, 2]], schema) + input_df_2 = spark.createDataFrame([[3, 4]], schema) + + input_df_1.write.format("delta").saveAsTable(input_location_1) + input_df_2.write.format("delta").saveAsTable(input_location_2) + + reference_tables = { + "ref_1": InputConfig(location=input_location_1), + "ref_2": InputConfig(location=input_location_2), + } + + result = get_reference_dataframes(spark, reference_tables) + assert_df_equality(input_df_1, result["ref_1"]) + assert_df_equality(input_df_2, result["ref_2"]) diff --git a/tests/integration/test_save_results_in_table.py b/tests/integration/test_save_results_in_table.py index f8d9c6602..732b2be9b 100644 --- a/tests/integration/test_save_results_in_table.py +++ b/tests/integration/test_save_results_in_table.py @@ -1,14 +1,9 @@ import pyspark.errors.exceptions.connect import pytest -from pyspark.sql.functions import col, lit, when -from pyspark.sql import Column from chispa.dataframe_comparer import assert_df_equality # type: ignore -from databricks.labs.dqx import check_funcs -from databricks.labs.dqx.config import InputConfig, OutputConfig +from databricks.labs.dqx.config import OutputConfig from databricks.labs.dqx.engine import DQEngine -from databricks.labs.dqx.rule import DQRowRule -from tests.integration.conftest import EXTRA_PARAMS, RUN_TIME, REPORTING_COLUMNS def test_save_results_in_table(ws, spark, make_schema, make_random): @@ -317,586 +312,3 @@ def test_save_streaming_results_in_table(ws, spark, make_schema, make_random, ma output_df_loaded = spark.table(output_table) assert_df_equality(input_df, output_df_loaded) - - -def test_apply_checks_and_save_in_table_single_table(ws, spark, make_schema, make_random): - """Test apply_checks_and_save_in_table method with single table.""" - catalog_name = "main" - schema = make_schema(catalog_name=catalog_name) - input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - - # Create test data and save to source table - test_schema = "a: int, b: int, c: string" - test_df = spark.createDataFrame([[1, 2, "valid"], [None, 3, "error"], [4, None, "warn"]], test_schema) - test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) - - # Create checks - checks = [ - DQRowRule( - name="a_is_null", - criticality="error", - check_func=check_funcs.is_not_null, - column="a", - ), - DQRowRule( - name="b_is_null", - criticality="warn", - check_func=check_funcs.is_not_null, - column="b", - ), - ] - - # Apply checks and write to table (no quarantine table) - engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) - engine.apply_checks_and_save_in_table( - checks=checks, - input_config=InputConfig(location=input_table), - output_config=OutputConfig(location=output_table, mode="overwrite"), - ) - - # Verify the table was created and contains the expected data - actual_df = spark.table(output_table) - expected_schema = test_schema + REPORTING_COLUMNS - expected_df = spark.createDataFrame( - [ - [1, 2, "valid", None, None], - [ - None, - 3, - "error", - [ - { - "name": "a_is_null", - "message": "Column 'a' value is null", - "columns": ["a"], - "filter": None, - "function": "is_not_null", - "run_time": RUN_TIME, - "user_metadata": {}, - } - ], - None, - ], - [ - 4, - None, - "warn", - None, - [ - { - "name": "b_is_null", - "message": "Column 'b' value is null", - "columns": ["b"], - "filter": None, - "function": "is_not_null", - "run_time": RUN_TIME, - "user_metadata": {}, - } - ], - ], - ], - schema=expected_schema, - ) - assert_df_equality(actual_df, expected_df, ignore_nullable=True) - - -def test_apply_checks_and_save_in_table_split_tables(ws, spark, make_schema, make_random): - """Test apply_checks_and_save_in_table method with split tables.""" - catalog_name = "main" - schema = make_schema(catalog_name=catalog_name) - input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - quarantine_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - - # Create test data and save to source table - test_schema = "a: int, b: int, c: string" - test_df = spark.createDataFrame([[1, 2, "valid"], [None, 3, "invalid"], [4, 5, "good"]], test_schema) - test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) - - # Create checks - checks = [ - DQRowRule( - name="a_is_null", - criticality="error", - check_func=check_funcs.is_not_null, - column="a", - ), - ] - - # Apply checks, split, and write to tables (with quarantine table) - engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) - engine.apply_checks_and_save_in_table( - checks=checks, - input_config=InputConfig(location=input_table), - output_config=OutputConfig(location=output_table, mode="overwrite", options={"overwriteSchema": "true"}), - quarantine_config=OutputConfig( - location=quarantine_table, mode="overwrite", options={"overwriteSchema": "true"} - ), - ) - - # Verify the tables were created and contain the expected data - actual_validated_df = spark.table(output_table) - actual_quarantine_df = spark.table(quarantine_table) - expected_validated_df = spark.createDataFrame([[1, 2, "valid"], [4, 5, "good"]], schema=test_schema) - quarantine_schema = test_schema + REPORTING_COLUMNS - expected_quarantine_df = spark.createDataFrame( - [ - [ - None, - 3, - "invalid", - [ - { - "name": "a_is_null", - "message": "Column 'a' value is null", - "columns": ["a"], - "filter": None, - "function": "is_not_null", - "run_time": RUN_TIME, - "user_metadata": {}, - } - ], - None, - ] - ], - schema=quarantine_schema, - ) - - assert_df_equality(actual_validated_df, expected_validated_df, ignore_nullable=True) - assert_df_equality(actual_quarantine_df, expected_quarantine_df, ignore_nullable=True) - - -def test_apply_checks_by_metadata_and_save_in_table_single_table(ws, spark, make_schema, make_random): - """Test apply_checks_by_metadata_and_save_in_table method with single table.""" - catalog_name = "main" - schema = make_schema(catalog_name=catalog_name) - input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - - # Create test data and save to source table - test_schema = "a: int, b: int, c: string" - test_df = spark.createDataFrame([[1, 2, "valid"], [None, 3, "error"], [4, None, "warn"]], test_schema) - test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) - - # Create metadata checks - checks = [ - { - "name": "a_is_null", - "criticality": "error", - "check": {"function": "is_not_null", "arguments": {"column": "a"}}, - }, - { - "name": "b_is_null", - "criticality": "warn", - "check": {"function": "is_not_null", "arguments": {"column": "b"}}, - }, - ] - - # Apply checks and write to table (no quarantine table) - engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) - engine.apply_checks_by_metadata_and_save_in_table( - checks=checks, - input_config=InputConfig(location=input_table), - output_config=OutputConfig(location=output_table, mode="overwrite"), - ) - - # Verify the table was created and contains the expected data - actual_df = spark.table(output_table) - expected_schema = test_schema + REPORTING_COLUMNS - expected_df = spark.createDataFrame( - [ - [1, 2, "valid", None, None], - [ - None, - 3, - "error", - [ - { - "name": "a_is_null", - "message": "Column 'a' value is null", - "columns": ["a"], - "filter": None, - "function": "is_not_null", - "run_time": RUN_TIME, - "user_metadata": {}, - } - ], - None, - ], - [ - 4, - None, - "warn", - None, - [ - { - "name": "b_is_null", - "message": "Column 'b' value is null", - "columns": ["b"], - "filter": None, - "function": "is_not_null", - "run_time": RUN_TIME, - "user_metadata": {}, - } - ], - ], - ], - schema=expected_schema, - ) - assert_df_equality(actual_df, expected_df, ignore_nullable=True) - - -def test_apply_checks_by_metadata_and_save_in_table_split_tables(ws, spark, make_schema, make_random): - """Test apply_checks_by_metadata_and_save_in_table method with split tables.""" - catalog_name = "main" - schema = make_schema(catalog_name=catalog_name) - input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - quarantine_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - - # Create test data and save to source table - test_schema = "a: int, b: int, c: string" - test_df = spark.createDataFrame([[1, 2, "valid"], [None, 3, "invalid"], [4, 5, "good"]], test_schema) - test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) - - # Create metadata checks - checks = [ - { - "name": "a_is_null", - "criticality": "error", - "check": {"function": "is_not_null", "arguments": {"column": "a"}}, - }, - ] - - # Apply checks, split, and write to tables (with quarantine table) - engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) - engine.apply_checks_by_metadata_and_save_in_table( - checks=checks, - input_config=InputConfig(location=input_table), - output_config=OutputConfig(location=output_table, mode="overwrite", options={"overwriteSchema": "true"}), - quarantine_config=OutputConfig( - location=quarantine_table, mode="overwrite", options={"overwriteSchema": "true"} - ), - ) - - # Verify the tables were created and contain the expected data - actual_validated_df = spark.table(output_table) - actual_quarantine_df = spark.table(quarantine_table) - expected_validated_df = spark.createDataFrame([[1, 2, "valid"], [4, 5, "good"]], schema=test_schema) - quarantine_schema = test_schema + REPORTING_COLUMNS - expected_quarantine_df = spark.createDataFrame( - [ - [ - None, - 3, - "invalid", - [ - { - "name": "a_is_null", - "message": "Column 'a' value is null", - "columns": ["a"], - "filter": None, - "function": "is_not_null", - "run_time": RUN_TIME, - "user_metadata": {}, - } - ], - None, - ] - ], - schema=quarantine_schema, - ) - - assert_df_equality(actual_validated_df, expected_validated_df, ignore_nullable=True) - assert_df_equality(actual_quarantine_df, expected_quarantine_df, ignore_nullable=True) - - -def test_apply_checks_and_save_in_table_with_options(ws, spark, make_schema, make_random): - """Test apply_checks_and_save_in_table with custom options.""" - catalog_name = "main" - schema = make_schema(catalog_name=catalog_name) - input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - - # Create test data and save to source table - test_schema = "a: int, b: int" - test_df = spark.createDataFrame([[1, 2], [3, 4]], test_schema) - test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) - - # Create checks - checks = [ - DQRowRule( - name="a_is_positive", - criticality="warn", - check_func=check_funcs.is_not_less_than, - column="a", - check_func_kwargs={"limit": 0}, - ), - ] - - # Apply checks and write to table with custom options - engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) - engine.apply_checks_and_save_in_table( - checks=checks, - input_config=InputConfig(location=input_table), - output_config=OutputConfig(location=output_table, mode="overwrite", options={"overwriteSchema": "true"}), - ) - - # Verify the table was created and contains the expected data - actual_df = spark.table(output_table) - expected_schema = test_schema + REPORTING_COLUMNS - expected_df = spark.createDataFrame( - [ - [1, 2, None, None], - [3, 4, None, None], - ], - schema=expected_schema, - ) - assert_df_equality(actual_df, expected_df, ignore_nullable=True) - - # Add more data with different schema to test schema evolution - new_test_schema = "a: int, b: int, d: string" - new_test_df = spark.createDataFrame([[5, 6, "new"]], new_test_schema) - new_input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - new_test_df.write.format("delta").mode("overwrite").saveAsTable(new_input_table) - - engine.apply_checks_and_save_in_table( - checks=checks, - input_config=InputConfig(location=new_input_table), - output_config=OutputConfig(location=output_table, mode="append", options={"mergeSchema": "true"}), - ) - - # Verify schema was merged - actual_df = spark.table(output_table).orderBy(["a"]) - expected_schema = new_test_schema + REPORTING_COLUMNS - expected_df = spark.createDataFrame( - [ - [1, 2, None, None, None], - [3, 4, None, None, None], - [5, 6, "new", None, None], - ], - schema=expected_schema, - ) - assert_df_equality(actual_df, expected_df, ignore_nullable=True, ignore_column_order=True) - - -def test_apply_checks_and_save_in_table_with_different_modes(ws, spark, make_schema, make_random): - """Test apply_checks_and_save_in_table with different write modes.""" - catalog_name = "main" - schema = make_schema(catalog_name=catalog_name) - input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - - # Create test data and save to source table - test_schema = "a: int, b: int" - test_df = spark.createDataFrame([[1, 2], [None, 4]], test_schema) - test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) - - # Create checks - checks = [ - DQRowRule( - name="a_is_null", - criticality="error", - check_func=check_funcs.is_not_null, - column="a", - ), - ] - - # First write with overwrite mode - engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) - engine.apply_checks_and_save_in_table( - checks=checks, - input_config=InputConfig(location=input_table), - output_config=OutputConfig(location=output_table, mode="overwrite"), - ) - - # Verify initial data - actual_df = spark.table(output_table) - expected_schema = test_schema + REPORTING_COLUMNS - expected_df = spark.createDataFrame( - [ - [1, 2, None, None], - [ - None, - 4, - [ - { - "name": "a_is_null", - "message": "Column 'a' value is null", - "columns": ["a"], - "filter": None, - "function": "is_not_null", - "run_time": RUN_TIME, - "user_metadata": {}, - } - ], - None, - ], - ], - schema=expected_schema, - ) - assert_df_equality(actual_df, expected_df, ignore_nullable=True) - - # Second write with append mode - new_test_df = spark.createDataFrame([[None, 4], [5, 6]], test_schema) - new_input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - new_test_df.write.format("delta").mode("overwrite").saveAsTable(new_input_table) - - engine.apply_checks_and_save_in_table( - checks=checks, - input_config=InputConfig(location=new_input_table), - output_config=OutputConfig(location=output_table, mode="overwrite"), - ) - - # Verify appended data - actual_df = spark.table(output_table) - expected_schema = test_schema + REPORTING_COLUMNS - expected_df = spark.createDataFrame( - [ - [ - None, - 4, - [ - { - "name": "a_is_null", - "message": "Column 'a' value is null", - "columns": ["a"], - "filter": None, - "function": "is_not_null", - "run_time": RUN_TIME, - "user_metadata": {}, - } - ], - None, - ], - [5, 6, None, None], - ], - schema=expected_schema, - ) - assert_df_equality(actual_df, expected_df, ignore_nullable=True) - - -def test_apply_checks_by_metadata_with_custom_functions(ws, spark, make_schema, make_random): - """Test apply_checks_by_metadata_and_save_in_table with custom check functions.""" - catalog_name = "main" - schema = make_schema(catalog_name=catalog_name) - input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - - # Create test data and save to source table - test_schema = "a: int, b: string" - test_df = spark.createDataFrame([[1, "test"], [2, "custom"]], test_schema) - test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) - - # Define custom check function - def custom_string_check(column: str) -> Column: - """Custom check function for testing.""" - return when(col(column).contains("custom"), lit("Contains custom text")).otherwise(lit(None)) - - # Create metadata checks with custom function - checks = [ - { - "name": "custom_string_check", - "criticality": "warn", - "check": {"function": "custom_string_check", "arguments": {"column": "b"}}, - }, - ] - - # Apply checks with custom functions - engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) - engine.apply_checks_by_metadata_and_save_in_table( - checks=checks, - input_config=InputConfig(location=input_table), - output_config=OutputConfig(location=output_table, mode="overwrite"), - custom_check_functions={"custom_string_check": custom_string_check}, - ) - - # Verify the table was created - actual_df = spark.table(output_table) - expected_schema = test_schema + REPORTING_COLUMNS - expected_df = spark.createDataFrame( - [ - [1, "test", None, None], - [ - 2, - "custom", - None, - [ - { - "name": "custom_string_check", - "message": "Contains custom text", - "columns": ["b"], - "filter": None, - "function": "custom_string_check", - "run_time": RUN_TIME, - "user_metadata": {}, - } - ], - ], - ], - schema=expected_schema, - ) - assert_df_equality(actual_df, expected_df, ignore_nullable=True) - - -def test_streaming_write(ws, spark, make_schema, make_random, make_volume): - """Test writing streaming DataFrames to Delta tables.""" - catalog_name = "main" - schema = make_schema(catalog_name=catalog_name) - input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" - volume = make_volume(catalog_name=catalog_name, schema_name=schema.name) - checkpoint_location = f"/Volumes/{volume.catalog_name}/{volume.schema_name}/{volume.name}/{make_random(8).lower()}" - - # Create source table for streaming - test_schema = "a: int, b: int" - test_df = spark.createDataFrame([[1, 2], [None, 4]], test_schema) - test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) - - # Create checks - checks = [ - DQRowRule( - name="a_is_null", - criticality="error", - check_func=check_funcs.is_not_null, - column="a", - ), - ] - - # Apply checks and write streaming DataFrame - engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) - engine.apply_checks_and_save_in_table( - checks=checks, - input_config=InputConfig(location=input_table, is_streaming=True), - output_config=OutputConfig( - location=output_table, options={"checkPointLocation": checkpoint_location}, trigger={"availableNow": True} - ), - ) - - # Verify the table was created with streaming data - actual_df = spark.table(output_table) - expected_schema = test_schema + REPORTING_COLUMNS - expected_df = spark.createDataFrame( - [ - [1, 2, None, None], - [ - None, - 4, - [ - { - "name": "a_is_null", - "message": "Column 'a' value is null", - "columns": ["a"], - "filter": None, - "function": "is_not_null", - "run_time": RUN_TIME, - "user_metadata": {}, - } - ], - None, - ], - ], - schema=expected_schema, - ) - assert_df_equality(actual_df, expected_df, ignore_nullable=True) diff --git a/tests/integration/test_utils.py b/tests/integration/test_utils.py index 192e77f67..5dd1bd60c 100644 --- a/tests/integration/test_utils.py +++ b/tests/integration/test_utils.py @@ -1,217 +1,34 @@ import pytest -from chispa.dataframe_comparer import assert_df_equality # type: ignore -from databricks.labs.dqx.config import InputConfig, OutputConfig -from databricks.labs.dqx.utils import read_input_data, save_dataframe_as_table, get_reference_dataframes +from databricks.labs.dqx.utils import list_tables -def test_read_input_data_no_input_format(spark, make_schema, make_volume): +def test_list_tables(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - info = make_volume(catalog_name=catalog_name, schema_name=schema_name) - input_location = info.full_name + table1_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table2_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" - schema = "a: int, b: int" - input_df = spark.createDataFrame([[1, 2]], schema) - input_df.write.format("delta").saveAsTable(input_location) + input_schema = "col1: int" + input_df = spark.createDataFrame([[1]], input_schema) + input_df.write.format("delta").saveAsTable(table1_name) + input_df.write.format("delta").saveAsTable(table2_name) - input_config = InputConfig(location=input_location) - actual_df = read_input_data(spark, input_config) + tables = list_tables(ws, patterns=[table1_name, table2_name]) + assert set(tables) == {table1_name, table2_name} - assert_df_equality(actual_df, input_df) + tables = list_tables(ws, patterns=[table1_name]) + assert set(tables) == {table1_name} + tables = list_tables(ws, patterns=[f"{catalog_name}.{schema_name}.*"]) + assert set(tables) == {table1_name, table2_name} -def test_read_invalid_input_location(spark): - input_location = "invalid/location" - input_config = InputConfig(location=input_location) + tables = list_tables(ws, patterns=None) + assert len(tables) > 0 - with pytest.raises( - ValueError, - match="Invalid input location. It must be a 2 or 3-level table namespace or storage path, given invalid/location", - ): - read_input_data(spark, input_config) + tables = list_tables(ws, patterns=[table1_name, table2_name], exclude_matched=True) + assert not {table1_name, table2_name} & set(tables) -def test_read_invalid_input_table(spark): - input_location = "table" # not a valid 2 or 3-level namespace - input_config = InputConfig(location=input_location) - - with pytest.raises( - ValueError, - match="Invalid input location. It must be a 2 or 3-level table namespace or storage path, given table", - ): - read_input_data(spark, input_config) - - -def test_read_input_data_from_table(spark, make_schema, make_random): - catalog_name = "main" - schema_name = make_schema(catalog_name=catalog_name).name - input_location = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" - input_config = InputConfig(location=input_location) - - schema = "a: int, b: int" - input_df = spark.createDataFrame([[1, 2]], schema) - input_df.write.format("delta").saveAsTable(input_location) - - result_df = read_input_data(spark, input_config) - assert_df_equality(input_df, result_df) - - -def test_read_input_data_from_table_with_schema_and_spark_options(spark, make_schema, make_random): - catalog_name = "main" - schema_name = make_schema(catalog_name=catalog_name).name - input_location = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" - input_format = None - input_read_options = {"versionAsOf": "0"} - input_schema = "a int, b int" - input_config = InputConfig( - location=input_location, format=input_format, schema=input_schema, options=input_read_options - ) - - schema = "a: int, b: int" - input_df_ver0 = spark.createDataFrame([[1, 2]], schema) - input_df_ver0.write.format("delta").saveAsTable(input_location) - input_df_ver1 = spark.createDataFrame([[0, 0]], schema) - input_df_ver1.write.format("delta").insertInto(input_location) - - result_df = read_input_data(spark, input_config) - assert_df_equality(input_df_ver0, result_df) - - -def test_read_input_data_from_workspace_file(spark, make_schema, make_volume): - catalog_name = "main" - schema_name = make_schema(catalog_name=catalog_name).name - info = make_volume(catalog_name=catalog_name, schema_name=schema_name) - input_location = info.full_name - input_format = "delta" - input_config = InputConfig(location=input_location, format=input_format) - - schema = "a: int, b: int" - input_df = spark.createDataFrame([[1, 2]], schema) - input_df.write.format("delta").saveAsTable(input_location) - - result_df = read_input_data(spark, input_config) - assert_df_equality(input_df, result_df) - - -def test_read_input_data_from_workspace_file_with_spark_options(spark, make_schema, make_volume): - catalog_name = "main" - schema_name = make_schema(catalog_name=catalog_name).name - info = make_volume(catalog_name=catalog_name, schema_name=schema_name) - input_location = info.full_name - input_format = "delta" - input_read_options = {"versionAsOf": "0"} - input_config = InputConfig(location=input_location, format=input_format, options=input_read_options) - - schema = "a: int, b: int" - input_df_ver0 = spark.createDataFrame([[1, 2]], schema) - input_df_ver0.write.format("delta").saveAsTable(input_location) - input_df_ver1 = spark.createDataFrame([[0, 0]], schema) - input_df_ver1.write.format("delta").insertInto(input_location) - - result_df = read_input_data(spark, input_config) - assert_df_equality(input_df_ver0, result_df) - - -def test_read_input_data_from_workspace_file_in_csv_format(spark, make_schema, make_volume): - catalog_name = "main" - schema_name = make_schema(catalog_name=catalog_name).name - info = make_volume(catalog_name=catalog_name, schema_name=schema_name) - input_location = f"/Volumes/{info.catalog_name}/{info.schema_name}/{info.name}" - input_format = "csv" - - input_read_options = {"header": "true"} - input_schema = "a int, b int" - input_config = InputConfig( - location=input_location, format=input_format, schema=input_schema, options=input_read_options - ) - - schema = "a: int, b: int" - input_df_ver0 = spark.createDataFrame([[1, 2]], schema) - input_df_ver0.write.options(**input_read_options).format("csv").mode("overwrite").save(input_location) - - result_df = read_input_data(spark, input_config) - - assert_df_equality(input_df_ver0, result_df) - - -def test_save_dataframe_as_table(spark, make_schema, make_random): - catalog_name = "main" - schema = make_schema(catalog_name=catalog_name) - table_name = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" - mode = "overwrite" - output_config = OutputConfig(location=table_name, mode=mode) - - data_schema = "a: int, b: int" - input_df = spark.createDataFrame([[1, 2]], data_schema) - save_dataframe_as_table(input_df, output_config) - - result_df = spark.table(table_name) - assert_df_equality(input_df, result_df) - - output_config.mode = "append" - output_config.options = {"mergeSchema": "true"} - changed_df = input_df.selectExpr("*", "1 AS c") - save_dataframe_as_table(changed_df, output_config) - - result_df = spark.table(table_name) - expected_df = changed_df.union(input_df.selectExpr("*", "NULL AS c")) - - # Sorting is necessary because row order is not guaranteed after union/append operations in Spark. - # This ensures a deterministic comparison for the test. - assert_df_equality(expected_df.sort("c"), result_df.sort("c")) - - -def test_save_streaming_dataframe_in_table(spark, make_schema, make_random, make_volume): - catalog_name = "main" - schema = make_schema(catalog_name=catalog_name) - table_name = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" - random_name = make_random(6).lower() - result_table_name = f"{catalog_name}.{schema.name}.{random_name}" - volume = make_volume(catalog_name=catalog_name, schema_name=schema.name) - options = {"checkpointLocation": f"/Volumes/{volume.catalog_name}/{volume.schema_name}/{volume.name}/{random_name}"} - trigger = {"availableNow": True} - output_config = OutputConfig(location=result_table_name, options=options, trigger=trigger) - - data_schema = "a: int, b: int" - input_df = spark.createDataFrame([[1, 2]], data_schema) - input_df.write.format("delta").mode("overwrite").saveAsTable(table_name) - streaming_input_df = spark.readStream.table(table_name) - - save_dataframe_as_table( - streaming_input_df, - output_config, - ) - - result_df = spark.table(result_table_name) - assert_df_equality(input_df, result_df) - - save_dataframe_as_table( - streaming_input_df, - output_config, - ) - - result_df = spark.table(result_table_name) - assert_df_equality(input_df, result_df) # no new records - - -def test_get_reference_dataframes(spark, make_schema, make_random): - catalog_name = "main" - schema_name = make_schema(catalog_name=catalog_name).name - input_location_1 = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" - input_location_2 = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" - - schema = "a: int, b: int" - input_df_1 = spark.createDataFrame([[1, 2]], schema) - input_df_2 = spark.createDataFrame([[3, 4]], schema) - - input_df_1.write.format("delta").saveAsTable(input_location_1) - input_df_2.write.format("delta").saveAsTable(input_location_2) - - reference_tables = { - "ref_1": InputConfig(location=input_location_1), - "ref_2": InputConfig(location=input_location_2), - } - - result = get_reference_dataframes(spark, reference_tables) - assert_df_equality(input_df_1, result["ref_1"]) - assert_df_equality(input_df_2, result["ref_2"]) +def test_list_tables_no_matching(spark, ws, make_random): + with pytest.raises(ValueError, match="No tables found matching include or exclude criteria"): + list_tables(ws, patterns=[f"non_existent_catalog_{make_random(6).lower()}.*"]) diff --git a/tests/unit/test_storage_factory.py b/tests/unit/test_storage_factory.py new file mode 100644 index 000000000..0d90d2376 --- /dev/null +++ b/tests/unit/test_storage_factory.py @@ -0,0 +1,101 @@ +from unittest.mock import create_autospec + +import pytest + +from databricks.labs.dqx.checks_storage import ( + ChecksStorageHandlerFactory, + TableChecksStorageHandler, + VolumeFileChecksStorageHandler, + WorkspaceFileChecksStorageHandler, + FileChecksStorageHandler, + TableChecksStorageConfig, + VolumeFileChecksStorageConfig, + WorkspaceFileChecksStorageConfig, + FileChecksStorageConfig, + InstallationChecksStorageHandler, +) +from databricks.labs.dqx.config import InstallationChecksStorageConfig, BaseChecksStorageConfig + + +workspace_client_mock = create_autospec(ChecksStorageHandlerFactory, instance=True) +spark_mock = create_autospec(ChecksStorageHandlerFactory, instance=True) +STORAGE_FACTORY = ChecksStorageHandlerFactory(workspace_client_mock, spark_mock) + + +def test_create_file_checks_storage_handler(): + config = FileChecksStorageConfig(location="path/to/file.yaml") + handler = STORAGE_FACTORY.create(config) + assert isinstance(handler, FileChecksStorageHandler) + + +def test_create_installation_checks_storage_handler(): + config = InstallationChecksStorageConfig(run_config_name="test_run_config", product_name="test_product") + handler = STORAGE_FACTORY.create(config) + assert isinstance(handler, InstallationChecksStorageHandler) + + +def test_create_workspace_file_checks_storage_handler(): + config = WorkspaceFileChecksStorageConfig(location="/Workspace/path/to/file.yaml") + handler = STORAGE_FACTORY.create(config) + assert isinstance(handler, WorkspaceFileChecksStorageHandler) + + +def test_create_table_checks_storage_handler(): + config = TableChecksStorageConfig(location="delta.`/path/to/table`", run_config_name="test_run_config") + handler = STORAGE_FACTORY.create(config) + assert isinstance(handler, TableChecksStorageHandler) + + +def test_create_volume_file_checks_storage_handler(): + config = VolumeFileChecksStorageConfig(location="/Volumes/my_volume/path/to/file.yaml") + handler = STORAGE_FACTORY.create(config) + assert isinstance(handler, VolumeFileChecksStorageHandler) + + +def test_create_unsupported_config(): + class UnsupportedConfig(BaseChecksStorageConfig): + pass + + config = UnsupportedConfig() + with pytest.raises(ValueError, match="Unsupported storage config type"): + STORAGE_FACTORY.create(config) + + +def test_create_for_location_table(): + location = "catalog.schema.table" + + handler, config = STORAGE_FACTORY.create_for_location(location) + + assert isinstance(handler, TableChecksStorageHandler) + assert isinstance(config, TableChecksStorageConfig) + assert config.location == location + + +def test_create_for_location_volume(): + location = "/Volumes/my_volume/path/to/file.yaml" + + handler, config = STORAGE_FACTORY.create_for_location(location) + + assert isinstance(handler, VolumeFileChecksStorageHandler) + assert isinstance(config, VolumeFileChecksStorageConfig) + assert config.location == location + + +def test_create_for_location_workspace(): + location = "/Workspace/my_workspace/path/to/file.yaml" + + handler, config = STORAGE_FACTORY.create_for_location(location) + + assert isinstance(handler, WorkspaceFileChecksStorageHandler) + assert isinstance(config, WorkspaceFileChecksStorageConfig) + assert config.location == location + + +def test_create_for_location_file(): + location = "relative/path/to/file.yaml" + + handler, config = STORAGE_FACTORY.create_for_location(location) + + assert isinstance(handler, FileChecksStorageHandler) + assert isinstance(config, FileChecksStorageConfig) + assert config.location == location diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 1d61cf6db..f589e47d1 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -6,7 +6,6 @@ from pyspark.sql import Column from databricks.labs.dqx.utils import ( - read_input_data, get_column_name_or_alias, is_sql_query_safe, normalize_col_str, @@ -14,8 +13,8 @@ get_columns_as_strings, is_simple_column_expression, normalize_bound_args, - get_reference_dataframes, ) +from databricks.labs.dqx.io import read_input_data, get_reference_dataframes from databricks.labs.dqx.config import InputConfig From b8f97b9fb3710a418b746c8899d7dc731ba6aa05 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 5 Sep 2025 15:58:21 +0200 Subject: [PATCH 02/64] fmt --- tests/integration/test_apply_checks_and_save_in_table.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/integration/test_apply_checks_and_save_in_table.py b/tests/integration/test_apply_checks_and_save_in_table.py index 1dee8a2fd..d20c4a3d4 100644 --- a/tests/integration/test_apply_checks_and_save_in_table.py +++ b/tests/integration/test_apply_checks_and_save_in_table.py @@ -825,7 +825,9 @@ def test_apply_checks_and_save_in_tables_with_quarantine(ws, spark, make_schema, engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) workspace_folder = str(make_directory().absolute()) for input_table in input_tables: - engine.save_checks(checks, config=WorkspaceFileChecksStorageConfig(location=f"{workspace_folder}/{input_table}.yml")) + engine.save_checks( + checks, config=WorkspaceFileChecksStorageConfig(location=f"{workspace_folder}/{input_table}.yml") + ) # Configure mixed table setups (one with quarantine, one without) run_configs = [ @@ -921,7 +923,9 @@ def test_apply_checks_and_save_in_tables_custom_parallelism(ws, spark, make_sche # Save the checks to workspace files: workspace_folder = str(make_directory().absolute()) for input_table in input_tables: - engine.save_checks(checks, config=WorkspaceFileChecksStorageConfig(location=f"{workspace_folder}/{input_table}.yml")) + engine.save_checks( + checks, config=WorkspaceFileChecksStorageConfig(location=f"{workspace_folder}/{input_table}.yml") + ) run_configs.append( RunConfig( From e186ad49ffb5e2673875d167a2a5a000d60300b4 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 5 Sep 2025 16:02:11 +0200 Subject: [PATCH 03/64] increase allowed local vars due to tests --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2e0eff867..92f7c7be1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -481,7 +481,7 @@ max-bool-expr = 5 max-branches = 20 # Maximum number of locals for function / method body. -max-locals = 21 +max-locals = 24 # Maximum number of parents for a class (see R0901). max-parents = 7 From 4e4df419e560e26e09fc5382029371aa705b2a26 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Tue, 23 Sep 2025 12:24:44 +0200 Subject: [PATCH 04/64] fix import issues --- src/databricks/labs/dqx/utils.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/databricks/labs/dqx/utils.py b/src/databricks/labs/dqx/utils.py index 994e68e83..a75009b63 100644 --- a/src/databricks/labs/dqx/utils.py +++ b/src/databricks/labs/dqx/utils.py @@ -4,10 +4,7 @@ import re from typing import Any from fnmatch import fnmatch -from databricks.sdk import WorkspaceClient -from databricks.labs.blueprint.limiter import rate_limited -from pyspark.sql import Column, SparkSession -from pyspark.sql.dataframe import DataFrame +from pyspark.sql import Column # Import spark connect column if spark session is created using spark connect try: @@ -15,7 +12,9 @@ except ImportError: ConnectColumn = None # type: ignore -from databricks.labs.dqx.config import InputConfig, OutputConfig +from databricks.sdk import WorkspaceClient +from databricks.labs.blueprint.limiter import rate_limited + logger = logging.getLogger(__name__) From 4d5e317461d6bd7b11e990ce5b772eaadb4ee551 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Tue, 23 Sep 2025 15:29:43 +0200 Subject: [PATCH 05/64] added telemetry added integration tests updated docstrings --- src/databricks/labs/dqx/engine.py | 44 +++- .../labs/dqx/quality_checker/e2e_workflow.py | 3 +- .../test_apply_checks_and_save_in_table.py | 237 ++++++++++++++++-- 3 files changed, 251 insertions(+), 33 deletions(-) diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index 8a98e1fa6..157f4df46 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -494,6 +494,8 @@ def apply_checks_and_save_in_table( quarantine_config: Optional configuration for writing invalid records. ref_dfs: Optional reference DataFrames used by checks. """ + logger.info(f"Applying checks to data from {input_config.location}") + # Read data from the specified table df = read_input_data(self.spark, input_config) @@ -539,6 +541,8 @@ def apply_checks_by_metadata_and_save_in_table( to callables/modules (e.g., globals()). ref_dfs: Optional reference DataFrames used by checks. """ + logger.info(f"Applying checks to data from {input_config.location}") + # Read data from the specified table df = read_input_data(self.spark, input_config) @@ -552,6 +556,7 @@ def apply_checks_by_metadata_and_save_in_table( checked_df = self.apply_checks_by_metadata(df, checks, custom_check_functions, ref_dfs) save_dataframe_as_table(checked_df, output_config) + @telemetry_logger("engine", "apply_checks_and_save_in_tables") def apply_checks_and_save_in_tables( self, run_configs: list[RunConfig], @@ -569,7 +574,7 @@ def apply_checks_and_save_in_tables( Args: run_configs (list[RunConfig]): List of run configurations containing input configs, output configs, - quarantine configs, and a checks file. + quarantine configs, and a checks file location. max_parallelism (int, optional): Maximum number of tables to check in parallel. Defaults to the number of CPU cores. custom_check_functions (dict[str, Any], optional): Dictionary with custom check functions @@ -588,30 +593,33 @@ def apply_checks_and_save_in_tables( ] futures.wait(apply_checks_runs) + @telemetry_logger("engine", "apply_checks_and_save_in_tables_from_patterns") def apply_checks_and_save_in_tables_from_patterns( self, patterns: list[str], exclude_matched: bool = False, + quarantine: bool = False, max_parallelism: int | None = os.cpu_count(), custom_check_functions: dict[str, Any] | None = None, ref_dfs: dict[str, Any] | None = None, ) -> None: """ - Apply data quality checks to multiple tables or views and write the results to output table(s). + Apply data quality checks to tables or views matching a pattern and write the results to output table(s). - Tables and checks will be associated by run config name. If a run config matches a supplied - pattern, checks will be applied to any tables which also match the pattern. + If quarantine option is enabled the data will be split into + good and bad records, with good records written to the output table + (under the same name as input table and "_dq" suffix) and bad records to the + quarantine table (under the same name as input table and "_quarantine" suffix). + If quarantine is not enabled, all records (with error/warning columns) will be written to the output table. - If quarantine tables are provided in the table configuration, the data will be split into - good and bad records, with good records written to the output table and bad records to the - quarantine table. If quarantine tables are not provided, all records (with error/warning - columns) will be written to the output table. + Checks are expected to be available under the same name as the table, with a .yml extension. Args: patterns (list[str]): An optional list of table names or filesystem-style wildcards (e.g., 'schema.*') to validate. exclude_matched (bool): Specifies whether to include tables matched by the pattern. If True, matched tables are excluded. If False, matched tables are included. + quarantine (bool): If True, split the data into good and bad records and write to separate tables. max_parallelism (int): Maximum number of tables to check in parallel. custom_check_functions (dict[str, Callable], optional): Dictionary with custom check functions (e.g., globals() of the calling module). If not specified, only built-in functions are used @@ -624,11 +632,21 @@ def apply_checks_and_save_in_tables_from_patterns( tables = list_tables(self.ws, patterns, exclude_matched) configs = [ - RunConfig( - name=f"{table}_config", - input_config=InputConfig(table), - output_config=OutputConfig(f"{table}_dq"), - checks_location=f"{table}.yml", + ( + RunConfig( + name=f"{table}_config", + input_config=InputConfig(table), + output_config=OutputConfig(f"{table}_dq"), + quarantine_config=OutputConfig(f"{table}_quarantine"), + checks_location=f"{table}.yml", + ) + if quarantine + else RunConfig( + name=f"{table}_config", + input_config=InputConfig(table), + output_config=OutputConfig(f"{table}_dq"), + checks_location=f"{table}.yml", + ) ) for table in tables ] diff --git a/src/databricks/labs/dqx/quality_checker/e2e_workflow.py b/src/databricks/labs/dqx/quality_checker/e2e_workflow.py index baedf4d1c..2c38f4063 100644 --- a/src/databricks/labs/dqx/quality_checker/e2e_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/e2e_workflow.py @@ -62,7 +62,8 @@ def finalize(self, ctx: WorkflowContext): """ Finalize end-to-end workflow and emit a log record for traceability. - :param ctx: Runtime context. + Args: + ctx (WorkflowContext): Runtime context. """ logger.info(f"End-to-end: finalize complete for run config: {ctx.run_config.name}") logger.info("For more details please check the run logs of the profiler and quality checker jobs.") diff --git a/tests/integration/test_apply_checks_and_save_in_table.py b/tests/integration/test_apply_checks_and_save_in_table.py index d20c4a3d4..c68a770bf 100644 --- a/tests/integration/test_apply_checks_and_save_in_table.py +++ b/tests/integration/test_apply_checks_and_save_in_table.py @@ -5,12 +5,11 @@ from databricks.labs.dqx import check_funcs from databricks.labs.dqx.config import InputConfig, OutputConfig, RunConfig, WorkspaceFileChecksStorageConfig from databricks.labs.dqx.engine import DQEngine -from databricks.labs.dqx.rule import DQRowRule +from databricks.labs.dqx.rule import DQRowRule, DQDatasetRule from tests.integration.conftest import EXTRA_PARAMS, RUN_TIME, REPORTING_COLUMNS -def test_apply_checks_and_save_in_table_single_table(ws, spark, make_schema, make_random): - """Test apply_checks_and_save_in_table method with single table.""" +def test_apply_checks_and_save_in_single_table(ws, spark, make_schema, make_random): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" @@ -91,8 +90,7 @@ def test_apply_checks_and_save_in_table_single_table(ws, spark, make_schema, mak assert_df_equality(actual_df, expected_df, ignore_nullable=True) -def test_apply_checks_and_save_in_table_split_tables(ws, spark, make_schema, make_random): - """Test apply_checks_and_save_in_table method with split tables.""" +def test_apply_checks_and_save_in_single_table_with_quarantine(ws, spark, make_schema, make_random): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" @@ -157,8 +155,7 @@ def test_apply_checks_and_save_in_table_split_tables(ws, spark, make_schema, mak assert_df_equality(actual_quarantine_df, expected_quarantine_df, ignore_nullable=True) -def test_apply_checks_by_metadata_and_save_in_table_single_table(ws, spark, make_schema, make_random): - """Test apply_checks_by_metadata_and_save_in_table method with single table.""" +def test_apply_checks_by_metadata_and_save_in_single_table(ws, spark, make_schema, make_random): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" @@ -237,8 +234,7 @@ def test_apply_checks_by_metadata_and_save_in_table_single_table(ws, spark, make assert_df_equality(actual_df, expected_df, ignore_nullable=True) -def test_apply_checks_by_metadata_and_save_in_table_split_tables(ws, spark, make_schema, make_random): - """Test apply_checks_by_metadata_and_save_in_table method with split tables.""" +def test_apply_checks_by_metadata_and_save_in_single_table_with_quarantine(ws, spark, make_schema, make_random): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" @@ -303,7 +299,6 @@ def test_apply_checks_by_metadata_and_save_in_table_split_tables(ws, spark, make def test_apply_checks_and_save_in_table_with_options(ws, spark, make_schema, make_random): - """Test apply_checks_and_save_in_table with custom options.""" catalog_name = "main" schema = make_schema(catalog_name=catalog_name) input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" @@ -372,7 +367,6 @@ def test_apply_checks_and_save_in_table_with_options(ws, spark, make_schema, mak def test_apply_checks_and_save_in_table_with_different_modes(ws, spark, make_schema, make_random): - """Test apply_checks_and_save_in_table with different write modes.""" catalog_name = "main" schema = make_schema(catalog_name=catalog_name) input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" @@ -468,7 +462,6 @@ def test_apply_checks_and_save_in_table_with_different_modes(ws, spark, make_sch def test_apply_checks_by_metadata_and_save_in_table_with_custom_functions(ws, spark, make_schema, make_random): - """Test apply_checks_by_metadata_and_save_in_table with custom check functions.""" catalog_name = "main" schema = make_schema(catalog_name=catalog_name) input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" @@ -530,8 +523,163 @@ def custom_string_check(column: str) -> Column: assert_df_equality(actual_df, expected_df, ignore_nullable=True) +def test_apply_checks_and_save_in_table_with_custom_functions(ws, spark, make_schema, make_random): + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + + # Create test data and save to source table + test_schema = "a: int, b: string" + test_df = spark.createDataFrame([[1, "test"], [2, "custom"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + # Define custom check function + def custom_string_check(column: str) -> Column: + """Custom check function for testing.""" + return when(col(column).contains("custom"), lit("Contains custom text")).otherwise(lit(None)) + + # Create metadata checks with custom function + checks = [ + DQRowRule( + name="custom_string_check", + criticality="warn", + check_func=custom_string_check, + column="b", + ), + ] + + # Apply checks with custom functions + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + engine.apply_checks_and_save_in_table( + checks=checks, + input_config=InputConfig(location=input_table), + output_config=OutputConfig(location=output_table, mode="overwrite"), + ) + + # Verify the table was created + actual_df = spark.table(output_table) + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, "test", None, None], + [ + 2, + "custom", + None, + [ + { + "name": "custom_string_check", + "message": "Contains custom text", + "columns": ["b"], + "filter": None, + "function": "custom_string_check", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + ], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + +def test_apply_checks_and_save_in_table_with_ref_df(ws, spark, make_schema, make_random): + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + + # Create test data and save to source table + test_schema = "a: int, b: string" + test_df = spark.createDataFrame([[1, "test"], [2, "custom"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + ref_dfs = {"ref_df_key": test_df} + + # Create checks + checks = [ + DQDatasetRule( + criticality="error", + check_func=check_funcs.foreign_key, + columns=["a"], + check_func_kwargs={ + "ref_columns": ["a"], + "ref_df_name": "ref_df_key", + }, + ), + ] + + # Apply checks + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + engine.apply_checks_and_save_in_table( + checks=checks, + input_config=InputConfig(location=input_table), + output_config=OutputConfig(location=output_table, mode="overwrite"), + ref_dfs=ref_dfs, + ) + + # Verify the table was created + actual_df = spark.table(output_table) + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, "test", None, None], + [2, "custom", None, None], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + +def test_apply_checks_by_metadata_and_save_in_table_with_ref_df(ws, spark, make_schema, make_random): + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + + # Create test data and save to source table + test_schema = "a: int, b: string" + test_df = spark.createDataFrame([[1, "test"], [2, "custom"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + ref_dfs = {"ref_df_key": test_df} + + # Create checks + checks = [ + { + "criticality": "error", + "check": { + "function": "foreign_key", + "arguments": {"columns": ["a"], "ref_columns": ["a"], "ref_df_name": "ref_df_key"}, + }, + }, + ] + + # Apply checks + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + engine.apply_checks_by_metadata_and_save_in_table( + checks=checks, + input_config=InputConfig(location=input_table), + output_config=OutputConfig(location=output_table, mode="overwrite"), + ref_dfs=ref_dfs, + ) + + # Verify the table was created + actual_df = spark.table(output_table) + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, "test", None, None], + [2, "custom", None, None], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + def test_apply_checks_and_save_in_table_streaming_write(ws, spark, make_schema, make_random, make_volume): - """Test writing streaming DataFrames to Delta tables.""" catalog_name = "main" schema = make_schema(catalog_name=catalog_name) input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" @@ -593,7 +741,6 @@ def test_apply_checks_and_save_in_table_streaming_write(ws, spark, make_schema, def test_apply_checks_and_save_in_tables(ws, spark, make_schema, make_random, make_directory): - """Test apply_checks_and_save_in_tables method with a single table.""" catalog_name = "main" schema = make_schema(catalog_name=catalog_name) input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" @@ -621,6 +768,7 @@ def test_apply_checks_and_save_in_tables(ws, spark, make_schema, make_random, ma # Save the checks to a workspace file: engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) workspace_folder = str(make_directory().absolute()) + # should work for any storage type, using workspace path as an example checks_location = f"{workspace_folder}/{input_table}.yml" engine.save_checks(checks, config=WorkspaceFileChecksStorageConfig(location=checks_location)) @@ -683,7 +831,6 @@ def test_apply_checks_and_save_in_tables(ws, spark, make_schema, make_random, ma def test_apply_checks_and_save_in_tables_multiple_tables(ws, spark, make_schema, make_random, make_directory): - """Test apply_checks_and_save_in_tables method with multiple tables.""" catalog_name = "main" schema = make_schema(catalog_name=catalog_name) @@ -796,7 +943,6 @@ def test_apply_checks_and_save_in_tables_multiple_tables(ws, spark, make_schema, def test_apply_checks_and_save_in_tables_with_quarantine(ws, spark, make_schema, make_random, make_directory): - """Test apply_checks_and_save_in_tables method with quarantine tables.""" catalog_name = "main" schema = make_schema(catalog_name=catalog_name) @@ -889,7 +1035,6 @@ def test_apply_checks_and_save_in_tables_with_quarantine(ws, spark, make_schema, def test_apply_checks_and_save_in_tables_custom_parallelism(ws, spark, make_schema, make_random, make_directory): - """Test apply_checks_and_save_in_tables method with custom parallelism settings.""" catalog_name = "main" schema = make_schema(catalog_name=catalog_name) engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) @@ -954,7 +1099,6 @@ def test_apply_checks_and_save_in_tables_custom_parallelism(ws, spark, make_sche def test_apply_checks_and_save_in_tables_empty_configs(ws, spark, make_schema, make_random): - """Test apply_checks_and_save_in_tables method with empty table configurations.""" # Test with empty list of table configs engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) @@ -963,7 +1107,6 @@ def test_apply_checks_and_save_in_tables_empty_configs(ws, spark, make_schema, m def test_apply_checks_and_save_in_tables_with_custom_functions(ws, spark, make_schema, make_random, make_directory): - """Test apply_checks_and_save_in_tables method with custom check functions.""" catalog_name = "main" schema = make_schema(catalog_name=catalog_name) input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" @@ -1035,3 +1178,59 @@ def custom_string_check(column: str) -> Column: schema=expected_schema, ) assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + +def test_apply_checks_and_save_in_tables_with_ref_df(ws, spark, make_schema, make_random, make_directory): + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + + # Create test data + test_schema = "a: int, b: string" + test_df = spark.createDataFrame([[1, "test"], [2, "custom"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + ref_dfs = {"ref_df_key": test_df} + + # Create checks + checks = [ + { + "criticality": "error", + "check": { + "function": "foreign_key", + "arguments": {"columns": ["a"], "ref_columns": ["a"], "ref_df_name": "ref_df_key"}, + }, + }, + ] + + # Save the checks to a workspace file: + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + workspace_folder = str(make_directory().absolute()) + checks_location = f"{workspace_folder}/{input_table}.yml" + engine.save_checks(checks, config=WorkspaceFileChecksStorageConfig(location=checks_location)) + + # Configure table checks + run_configs = [ + RunConfig( + input_config=InputConfig(location=input_table), + output_config=OutputConfig(location=output_table, mode="overwrite"), + checks_location=checks_location, + ) + ] + + # Apply checks and write to table + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + engine.apply_checks_and_save_in_tables(run_configs=run_configs, ref_dfs=ref_dfs, max_parallelism=1) + + # Verify the table was created + actual_df = spark.table(output_table) + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, "test", None, None], + [2, "custom", None, None], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) From 09953acc9f1d041224971e2d3eb1f86ce8f6db32 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Tue, 23 Sep 2025 17:36:11 +0200 Subject: [PATCH 06/64] added integration tests --- src/databricks/labs/dqx/checks_storage.py | 5 +- src/databricks/labs/dqx/engine.py | 37 +- src/databricks/labs/dqx/utils.py | 2 +- .../test_apply_checks_and_save_in_table.py | 682 +++++++++++++++++- 4 files changed, 711 insertions(+), 15 deletions(-) diff --git a/src/databricks/labs/dqx/checks_storage.py b/src/databricks/labs/dqx/checks_storage.py index e401b72be..336283587 100644 --- a/src/databricks/labs/dqx/checks_storage.py +++ b/src/databricks/labs/dqx/checks_storage.py @@ -367,12 +367,15 @@ def create(self, config: BaseChecksStorageConfig) -> ChecksStorageHandler: """ @abstractmethod - def create_for_location(self, location: str) -> tuple[ChecksStorageHandler, BaseChecksStorageConfig]: + def create_for_location( + self, location: str, run_config_name: str = "default" + ) -> tuple[ChecksStorageHandler, BaseChecksStorageConfig]: """ Abstract method to create a handler and config based on checks location. Args: location: location of the checks (file path, table name, volume, etc.) + run_config_name: the name of the run configuration to use for checks (default is 'default'). Returns: An instance of the corresponding BaseChecksStorageHandler. diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index 157f4df46..5e42ba825 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -33,7 +33,7 @@ ) from databricks.labs.dqx.checks_validator import ChecksValidator, ChecksValidationStatus from databricks.labs.dqx.schema import dq_result_schema -from databricks.labs.dqx.io import read_input_data, save_dataframe_as_table +from databricks.labs.dqx.io import read_input_data, save_dataframe_as_table, TABLE_PATTERN from databricks.labs.dqx.utils import list_tables from databricks.labs.dqx.telemetry import telemetry_logger, log_telemetry from databricks.sdk import WorkspaceClient @@ -591,15 +591,20 @@ def apply_checks_and_save_in_tables( executor.submit(self._apply_checks_for_run_config, run_config, custom_check_functions, ref_dfs) for run_config in run_configs ] - futures.wait(apply_checks_runs) + for future in futures.as_completed(apply_checks_runs): + # Retrieve the result to propagate any exceptions + future.result() @telemetry_logger("engine", "apply_checks_and_save_in_tables_from_patterns") def apply_checks_and_save_in_tables_from_patterns( self, patterns: list[str], + checks_location: str, exclude_matched: bool = False, quarantine: bool = False, max_parallelism: int | None = os.cpu_count(), + output_table_suffix: str = "_dq_output", + quarantine_table_suffix: str = "_dq_quarantine", custom_check_functions: dict[str, Any] | None = None, ref_dfs: dict[str, Any] | None = None, ) -> None: @@ -616,11 +621,15 @@ def apply_checks_and_save_in_tables_from_patterns( Args: patterns (list[str]): An optional list of table names or filesystem-style wildcards - (e.g., 'schema.*') to validate. + (e.g., 'catalog.schema.*') to validate. + checks_location: Location of the checks files (e.g., absolute workspace or volume directory, or delta table). + For file based locations, checks are expected to be found under {checks_location}/{table_name}.yml. exclude_matched (bool): Specifies whether to include tables matched by the pattern. If True, matched tables are excluded. If False, matched tables are included. quarantine (bool): If True, split the data into good and bad records and write to separate tables. max_parallelism (int): Maximum number of tables to check in parallel. + output_table_suffix (str): Suffix to append to the output table name. + quarantine_table_suffix (str): Suffix to append to the quarantine table name. custom_check_functions (dict[str, Callable], optional): Dictionary with custom check functions (e.g., globals() of the calling module). If not specified, only built-in functions are used for the checks. @@ -634,18 +643,22 @@ def apply_checks_and_save_in_tables_from_patterns( configs = [ ( RunConfig( - name=f"{table}_config", + name=f"{table}", input_config=InputConfig(table), - output_config=OutputConfig(f"{table}_dq"), - quarantine_config=OutputConfig(f"{table}_quarantine"), - checks_location=f"{table}.yml", + output_config=OutputConfig(f"{table}{output_table_suffix}"), + quarantine_config=OutputConfig(f"{table}{quarantine_table_suffix}"), + checks_location=( + checks_location if TABLE_PATTERN.match(checks_location) else f"{checks_location}/{table}.yml" + ), ) if quarantine else RunConfig( - name=f"{table}_config", + name=f"{table}", input_config=InputConfig(table), - output_config=OutputConfig(f"{table}_dq"), - checks_location=f"{table}.yml", + output_config=OutputConfig(f"{table}{output_table_suffix}"), + checks_location=( + checks_location if TABLE_PATTERN.match(checks_location) else f"{checks_location}/{table}.yml" + ), ) ) for table in tables @@ -832,7 +845,9 @@ def _apply_checks_for_run_config( if not run_config.output_config: raise ValueError("Output configuration not provided") - storage_handler, storage_config = self._checks_handler_factory.create_for_location(run_config.checks_location) + storage_handler, storage_config = self._checks_handler_factory.create_for_location( + run_config.checks_location, run_config.name + ) checks = storage_handler.load(storage_config) self.apply_checks_by_metadata_and_save_in_table( diff --git a/src/databricks/labs/dqx/utils.py b/src/databricks/labs/dqx/utils.py index a75009b63..6ebe3402b 100644 --- a/src/databricks/labs/dqx/utils.py +++ b/src/databricks/labs/dqx/utils.py @@ -221,7 +221,7 @@ def list_tables(client: WorkspaceClient, patterns: list[str] | None, exclude_mat If True, matched tables are excluded. If False, matched tables are included. Returns: - list[str]: A list of table names. + list[str]: A list of fully qualify table names. Raises: ValueError: If no tables are found matching the include or exclude criteria. diff --git a/tests/integration/test_apply_checks_and_save_in_table.py b/tests/integration/test_apply_checks_and_save_in_table.py index c68a770bf..8b2531c34 100644 --- a/tests/integration/test_apply_checks_and_save_in_table.py +++ b/tests/integration/test_apply_checks_and_save_in_table.py @@ -1,9 +1,16 @@ +import pytest from pyspark.sql.functions import col, lit, when from pyspark.sql import Column from chispa.dataframe_comparer import assert_df_equality # type: ignore from databricks.labs.dqx import check_funcs -from databricks.labs.dqx.config import InputConfig, OutputConfig, RunConfig, WorkspaceFileChecksStorageConfig +from databricks.labs.dqx.config import ( + InputConfig, + OutputConfig, + RunConfig, + WorkspaceFileChecksStorageConfig, + TableChecksStorageConfig, +) from databricks.labs.dqx.engine import DQEngine from databricks.labs.dqx.rule import DQRowRule, DQDatasetRule from tests.integration.conftest import EXTRA_PARAMS, RUN_TIME, REPORTING_COLUMNS @@ -830,6 +837,82 @@ def test_apply_checks_and_save_in_tables(ws, spark, make_schema, make_random, ma assert_df_equality(actual_df, expected_df, ignore_nullable=True) +def test_apply_checks_and_save_in_tables_streaming_write( + ws, spark, make_schema, make_random, make_directory, make_volume +): + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + volume = make_volume(catalog_name=catalog_name, schema_name=schema.name) + checkpoint_location = f"/Volumes/{volume.catalog_name}/{volume.schema_name}/{volume.name}/{make_random(8).lower()}" + + # Create test data and save to source table + test_schema = "a: int, b: int, c: string" + test_df = spark.createDataFrame([[1, 2, "valid"], [None, 3, "error"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + # Create checks + checks = [ + { + "name": "a_is_null", + "criticality": "error", + "check": {"function": "is_not_null", "arguments": {"column": "a"}}, + }, + ] + + # Save the checks to a workspace file: + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + workspace_folder = str(make_directory().absolute()) + # should work for any storage type, using workspace path as an example + checks_location = f"{workspace_folder}/{input_table}.yml" + engine.save_checks(checks, config=WorkspaceFileChecksStorageConfig(location=checks_location)) + + # Configure table checks + run_configs = [ + RunConfig( + input_config=InputConfig(location=input_table, is_streaming=True), + output_config=OutputConfig( + location=output_table, + options={"checkPointLocation": checkpoint_location}, + trigger={"availableNow": True}, + ), + checks_location=checks_location, + ) + ] + + # Apply checks and write to table + engine.apply_checks_and_save_in_tables(run_configs=run_configs) + + # Verify the table was created and contains the expected data + actual_df = spark.table(output_table) + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, 2, "valid", None, None], + [ + None, + 3, + "error", + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + def test_apply_checks_and_save_in_tables_multiple_tables(ws, spark, make_schema, make_random, make_directory): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) @@ -1103,7 +1186,25 @@ def test_apply_checks_and_save_in_tables_empty_configs(ws, spark, make_schema, m engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) # This should not raise an error - engine.apply_checks_and_save_in_tables(run_configs=[], max_parallelism=1) + engine.apply_checks_and_save_in_tables(run_configs=[]) + + +def test_apply_checks_and_save_in_tables_missing_input_config(ws, spark): + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + + run_config = RunConfig() + + with pytest.raises(ValueError, match="Input configuration not provided"): + engine.apply_checks_and_save_in_tables(run_configs=[run_config]) + + +def test_apply_checks_and_save_in_tables_missing_output_config(ws, spark): + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + + run_config = RunConfig(input_config=InputConfig(location="some_table")) + + with pytest.raises(ValueError, match="Output configuration not provided"): + engine.apply_checks_and_save_in_tables(run_configs=[run_config]) def test_apply_checks_and_save_in_tables_with_custom_functions(ws, spark, make_schema, make_random, make_directory): @@ -1234,3 +1335,580 @@ def test_apply_checks_and_save_in_tables_with_ref_df(ws, spark, make_schema, mak schema=expected_schema, ) assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + +def test_apply_checks_and_save_in_tables_from_patterns(ws, spark, make_schema, make_random, make_directory): + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + + # Create multiple input and output tables + input_tables = [f"{catalog_name}.{schema.name}.{make_random(8).lower()}" for _ in range(2)] + output_tables = [f"{table}_dq_output" for table in input_tables] + + # Create test data for both tables + test_schema = "a: int, b: string" + test_df1 = spark.createDataFrame([[1, "valid"], [None, "invalid"]], test_schema) + test_df2 = spark.createDataFrame([[100, "test"], [200, None]], test_schema) + + test_df1.write.format("delta").mode("overwrite").saveAsTable(input_tables[0]) + test_df2.write.format("delta").mode("overwrite").saveAsTable(input_tables[1]) + + # Create different checks for each table + table1_checks = [ + { + "name": "a_is_null", + "criticality": "error", + "check": {"function": "is_not_null", "arguments": {"column": "a"}}, + } + ] + table2_checks = [ + { + "name": "b_is_null", + "criticality": "warn", + "check": {"function": "is_not_null", "arguments": {"column": "b"}}, + } + ] + + # Save the checks to workspace files: + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + workspace_folder = str(make_directory().absolute()) + checks_location1 = f"{workspace_folder}/{input_tables[0]}.yml" + checks_location2 = f"{workspace_folder}/{input_tables[1]}.yml" + engine.save_checks(table1_checks, config=WorkspaceFileChecksStorageConfig(location=checks_location1)) + engine.save_checks(table2_checks, config=WorkspaceFileChecksStorageConfig(location=checks_location2)) + + # Apply checks and write to tables + engine.apply_checks_and_save_in_tables_from_patterns( + patterns=[f"{catalog_name}.{schema.name}.*"], + checks_location=workspace_folder, + ) + + # Verify both tables were created and contain the expected data + actual_df1 = spark.table(output_tables[0]) + actual_df2 = spark.table(output_tables[1]) + + expected_schema = test_schema + REPORTING_COLUMNS + expected_df1 = spark.createDataFrame( + [ + [1, "valid", None, None], + [ + None, + "invalid", + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ], + ], + schema=expected_schema, + ) + + expected_df2 = spark.createDataFrame( + [ + [100, "test", None, None], + [ + 200, + None, + None, + [ + { + "name": "b_is_null", + "message": "Column 'b' value is null", + "columns": ["b"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + ], + ], + schema=expected_schema, + ) + + assert_df_equality(actual_df1, expected_df1, ignore_nullable=True) + assert_df_equality(actual_df2, expected_df2, ignore_nullable=True) + + +def test_apply_checks_and_save_in_tables_from_patterns_checks_in_table(ws, spark, make_schema, make_random): + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + + # Create multiple input and output tables + input_tables = [f"{catalog_name}.{schema.name}.{make_random(8).lower()}" for _ in range(2)] + output_tables = [f"{table}_dq_output" for table in input_tables] + + # Create test data for both tables + test_schema = "a: int, b: string" + test_df1 = spark.createDataFrame([[1, "valid"], [None, "invalid"]], test_schema) + test_df2 = spark.createDataFrame([[100, "test"], [200, None]], test_schema) + + test_df1.write.format("delta").mode("overwrite").saveAsTable(input_tables[0]) + test_df2.write.format("delta").mode("overwrite").saveAsTable(input_tables[1]) + + # Create different checks for each table + table1_checks = [ + { + "name": "a_is_null", + "criticality": "error", + "check": {"function": "is_not_null", "arguments": {"column": "a"}}, + } + ] + table2_checks = [ + { + "name": "b_is_null", + "criticality": "warn", + "check": {"function": "is_not_null", "arguments": {"column": "b"}}, + } + ] + + # Save the checks to workspace files: + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + + checks_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + engine.save_checks( + table1_checks, config=TableChecksStorageConfig(location=checks_table, run_config_name=input_tables[0]) + ) + engine.save_checks( + table2_checks, config=TableChecksStorageConfig(location=checks_table, run_config_name=input_tables[1]) + ) + + # Apply checks and write to tables + engine.apply_checks_and_save_in_tables_from_patterns( + patterns=[input_tables[0], input_tables[1]], + checks_location=checks_table, + ) + + # Verify both tables were created and contain the expected data + actual_df1 = spark.table(output_tables[0]) + actual_df2 = spark.table(output_tables[1]) + + expected_schema = test_schema + REPORTING_COLUMNS + expected_df1 = spark.createDataFrame( + [ + [1, "valid", None, None], + [ + None, + "invalid", + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ], + ], + schema=expected_schema, + ) + + expected_df2 = spark.createDataFrame( + [ + [100, "test", None, None], + [ + 200, + None, + None, + [ + { + "name": "b_is_null", + "message": "Column 'b' value is null", + "columns": ["b"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + ], + ], + schema=expected_schema, + ) + + assert_df_equality(actual_df1, expected_df1, ignore_nullable=True) + assert_df_equality(actual_df2, expected_df2, ignore_nullable=True) + + +def test_apply_checks_and_save_in_tables_from_patterns_with_quarantine( + ws, spark, make_schema, make_random, make_directory +): + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + + # Create multiple input and output tables + input_tables = [f"{catalog_name}.{schema.name}.{make_random(8).lower()}" for _ in range(2)] + output_tables = [f"{table}_dq_output" for table in input_tables] + quarantine_tables = [f"{table}_dq_quarantine" for table in input_tables] + + # Create test data for both tables + test_schema = "a: int, b: string" + test_df1 = spark.createDataFrame([[1, "valid"], [None, "invalid"]], test_schema) + test_df2 = spark.createDataFrame([[100, "test"], [200, None]], test_schema) + + test_df1.write.format("delta").mode("overwrite").saveAsTable(input_tables[0]) + test_df2.write.format("delta").mode("overwrite").saveAsTable(input_tables[1]) + + # Create different checks for each table + table1_checks = [ + { + "name": "a_is_null", + "criticality": "error", + "check": {"function": "is_not_null", "arguments": {"column": "a"}}, + } + ] + table2_checks = [ + { + "name": "b_is_null", + "criticality": "warn", + "check": {"function": "is_not_null", "arguments": {"column": "b"}}, + } + ] + + # Save the checks to workspace files: + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + workspace_folder = str(make_directory().absolute()) + engine.save_checks( + table1_checks, config=WorkspaceFileChecksStorageConfig(location=f"{workspace_folder}/{input_tables[0]}.yml") + ) + engine.save_checks( + table2_checks, config=WorkspaceFileChecksStorageConfig(location=f"{workspace_folder}/{input_tables[1]}.yml") + ) + + # Apply checks and write to tables + engine.apply_checks_and_save_in_tables_from_patterns( + patterns=[f"{catalog_name}.{schema.name}.*"], + checks_location=workspace_folder, + max_parallelism=2, + quarantine=True, + ) + + # Verify both tables were created and contain the expected data + expected_valid_df1 = spark.createDataFrame( + [ + [1, "valid"], + ], + schema=test_schema, + ) + + expected_valid_df2 = spark.createDataFrame( + [ + [100, "test"], + [200, None], + ], + schema=test_schema, + ) + + expected_schema = test_schema + REPORTING_COLUMNS + expected_quarantine_df1 = spark.createDataFrame( + [ + [ + None, + "invalid", + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ], + ], + schema=expected_schema, + ) + + expected_quarantine_df2 = spark.createDataFrame( + [ + [ + 200, + None, + None, + [ + { + "name": "b_is_null", + "message": "Column 'b' value is null", + "columns": ["b"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + ], + ], + schema=expected_schema, + ) + + assert_df_equality(spark.table(output_tables[0]), expected_valid_df1, ignore_nullable=True) + assert_df_equality(spark.table(output_tables[1]), expected_valid_df2, ignore_nullable=True) + assert_df_equality(spark.table(quarantine_tables[0]), expected_quarantine_df1, ignore_nullable=True) + assert_df_equality(spark.table(quarantine_tables[1]), expected_quarantine_df2, ignore_nullable=True) + + +def test_apply_checks_and_save_in_tables_from_patterns_no_tables_matching(ws, spark): + # Test with empty list of table configs + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + + # This should not raise an error + with pytest.raises(ValueError, match="No tables found matching include or exclude criteria"): + engine.apply_checks_and_save_in_tables_from_patterns( + patterns=["main.non_existent_schema.*"], checks_location="some/location" + ) + + +def test_apply_checks_and_save_in_tables_from_patterns_exclude_no_tables_matching(ws, spark): + # Test with empty list of table configs + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + + # This should not raise an error + with pytest.raises(ValueError, match="No tables found matching include or exclude criteria"): + engine.apply_checks_and_save_in_tables_from_patterns( + patterns=["*"], checks_location="some/location", exclude_matched=True + ) + + +def test_apply_checks_and_save_in_tables_from_patterns_with_custom_suffix( + ws, spark, make_schema, make_random, make_directory +): + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + + # Create multiple input and output tables + output_table_suffix = "_dq_output_custom" + quarantine_table_suffix = "_dq_quarantine_custom" + input_tables = [f"{catalog_name}.{schema.name}.{make_random(8).lower()}" for _ in range(2)] + output_tables = [f"{table}{output_table_suffix}" for table in input_tables] + quarantine_tables = [f"{table}{quarantine_table_suffix}" for table in input_tables] + + # Create test data for both tables + test_schema = "a: int, b: string" + test_df1 = spark.createDataFrame([[1, "valid"], [None, "invalid"]], test_schema) + test_df2 = spark.createDataFrame([[100, "test"], [200, None]], test_schema) + + test_df1.write.format("delta").mode("overwrite").saveAsTable(input_tables[0]) + test_df2.write.format("delta").mode("overwrite").saveAsTable(input_tables[1]) + + # Create different checks for each table + table1_checks = [ + { + "name": "a_is_null", + "criticality": "error", + "check": {"function": "is_not_null", "arguments": {"column": "a"}}, + } + ] + table2_checks = [ + { + "name": "b_is_null", + "criticality": "warn", + "check": {"function": "is_not_null", "arguments": {"column": "b"}}, + } + ] + + # Save the checks to workspace files: + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + workspace_folder = str(make_directory().absolute()) + engine.save_checks( + table1_checks, config=WorkspaceFileChecksStorageConfig(location=f"{workspace_folder}/{input_tables[0]}.yml") + ) + engine.save_checks( + table2_checks, config=WorkspaceFileChecksStorageConfig(location=f"{workspace_folder}/{input_tables[1]}.yml") + ) + + # Apply checks and write to tables + engine.apply_checks_and_save_in_tables_from_patterns( + patterns=[f"{catalog_name}.{schema.name}.*"], + checks_location=workspace_folder, + quarantine=True, + output_table_suffix=output_table_suffix, + quarantine_table_suffix=quarantine_table_suffix, + ) + + # Verify both tables were created and contain the expected data + expected_valid_df1 = spark.createDataFrame( + [ + [1, "valid"], + ], + schema=test_schema, + ) + + expected_valid_df2 = spark.createDataFrame( + [ + [100, "test"], + [200, None], + ], + schema=test_schema, + ) + + expected_schema = test_schema + REPORTING_COLUMNS + expected_quarantine_df1 = spark.createDataFrame( + [ + [ + None, + "invalid", + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ], + ], + schema=expected_schema, + ) + + expected_quarantine_df2 = spark.createDataFrame( + [ + [ + 200, + None, + None, + [ + { + "name": "b_is_null", + "message": "Column 'b' value is null", + "columns": ["b"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + ], + ], + schema=expected_schema, + ) + + assert_df_equality(spark.table(output_tables[0]), expected_valid_df1, ignore_nullable=True) + assert_df_equality(spark.table(output_tables[1]), expected_valid_df2, ignore_nullable=True) + assert_df_equality(spark.table(quarantine_tables[0]), expected_quarantine_df1, ignore_nullable=True) + assert_df_equality(spark.table(quarantine_tables[1]), expected_quarantine_df2, ignore_nullable=True) + + +def test_apply_checks_and_save_in_tables_with_patterns_and_custom_functions( + ws, spark, make_schema, make_random, make_directory +): + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{input_table}_dq_output" + + test_schema = "a: int, b: string" + test_df = spark.createDataFrame([[1, "test"], [2, "custom"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + def custom_string_check(column: str) -> Column: + """Custom check function for testing.""" + return when(col(column).contains("custom"), lit("Contains custom text")).otherwise(lit(None)) + + checks = [ + { + "name": "custom_string_check", + "criticality": "warn", + "check": {"function": "custom_string_check", "arguments": {"column": "b"}}, + }, + ] + + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + workspace_folder = str(make_directory().absolute()) + checks_location = f"{workspace_folder}/{input_table}.yml" + engine.save_checks(checks, config=WorkspaceFileChecksStorageConfig(location=checks_location)) + + engine.apply_checks_and_save_in_tables_from_patterns( + patterns=[f"{catalog_name}.{schema.name}.*"], + checks_location=workspace_folder, + custom_check_functions={"custom_string_check": custom_string_check}, + ) + + actual_df = spark.table(output_table) + + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, "test", None, None], + [ + 2, + "custom", + None, + [ + { + "name": "custom_string_check", + "message": "Contains custom text", + "columns": ["b"], + "filter": None, + "function": "custom_string_check", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + ], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) + + +def test_apply_checks_and_save_in_tables_with_patterns_and_ref_df(ws, spark, make_schema, make_random, make_directory): + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + output_table = f"{input_table}_dq_output" + + test_schema = "a: int, b: string" + test_df = spark.createDataFrame([[1, "test"], [2, "custom"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + ref_dfs = {"ref_df_key": test_df} + + checks = [ + { + "criticality": "error", + "check": { + "function": "foreign_key", + "arguments": {"columns": ["a"], "ref_columns": ["a"], "ref_df_name": "ref_df_key"}, + }, + }, + ] + + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + workspace_folder = str(make_directory().absolute()) + checks_location = f"{workspace_folder}/{input_table}.yml" + engine.save_checks(checks, config=WorkspaceFileChecksStorageConfig(location=checks_location)) + + engine.apply_checks_and_save_in_tables_from_patterns( + patterns=[f"{catalog_name}.{schema.name}.*"], checks_location=workspace_folder, ref_dfs=ref_dfs + ) + + actual_df = spark.table(output_table) + + expected_schema = test_schema + REPORTING_COLUMNS + expected_df = spark.createDataFrame( + [ + [1, "test", None, None], + [2, "custom", None, None], + ], + schema=expected_schema, + ) + assert_df_equality(actual_df, expected_df, ignore_nullable=True) From 899f10660a1047bc7c6fff896a8815943971438f Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Tue, 23 Sep 2025 23:41:52 +0200 Subject: [PATCH 07/64] updated demo and docs --- demos/dqx_multi_table_demo.py | 224 +++++++----------- docs/dqx/docs/guide/data_profiling.mdx | 13 +- .../dqx/docs/guide/quality_checks_storage.mdx | 12 +- src/databricks/labs/dqx/engine.py | 4 +- src/databricks/labs/dqx/profiler/profiler.py | 9 +- tests/integration/test_profiler.py | 21 +- 6 files changed, 118 insertions(+), 165 deletions(-) diff --git a/demos/dqx_multi_table_demo.py b/demos/dqx_multi_table_demo.py index a7e3b0e93..d405cf443 100644 --- a/demos/dqx_multi_table_demo.py +++ b/demos/dqx_multi_table_demo.py @@ -2,7 +2,7 @@ # MAGIC %md # MAGIC # DQX Multi-Table Data Quality Checks Demo # MAGIC -# MAGIC This notebook demonstrates how to apply data quality checks to multiple tables using DQX. +# MAGIC This notebook demonstrates how to apply data quality checks to multiple tables at once using DQX. # COMMAND ---------- @@ -28,6 +28,7 @@ # COMMAND ---------- from databricks.labs.dqx.config import InputConfig, OutputConfig, RunConfig +from databricks.labs.dqx.config import TableChecksStorageConfig from databricks.labs.dqx.engine import DQEngine from databricks.labs.dqx.rule import DQRowRule from databricks.labs.dqx import check_funcs @@ -50,12 +51,12 @@ # Initialize the DQX engine ws = WorkspaceClient() -dq_engine = DQEngine(ws) +dq_engine = DQEngine(ws, spark) # COMMAND ---------- # MAGIC %md -# MAGIC ## Checking multiple tables using Dictionary-Based Checks (Metadata) +# MAGIC ## Checking multiple tables by providing specific configuration (run configs) # COMMAND ---------- @@ -64,14 +65,15 @@ [1, "john@email.com", "John Doe", "2023-01-01"], [2, "invalid-email", "Jane Smith", "2023-02-01"], [3, "bob@email.com", "Bob Wilson", "2023-03-01"], - [None, "alice@email.com", "Alice Brown", "2023-04-01"] + [None, "alice@email.com", "Alice Brown", "2023-04-01"], ] users_df = spark.createDataFrame( users_data, schema="user_id int, email string, name string, created_on string" ) -users_df.write.mode("overwrite").saveAsTable(f"{demo_catalog_name}.{demo_schema_name}.users") +users_table = f"{demo_catalog_name}.{demo_schema_name}.users" +users_df.write.mode("overwrite").saveAsTable(users_table) # Create a sample orders table orders_data = [ @@ -85,7 +87,8 @@ orders_data, schema="order_id int, user_id int, total_amount double, order_on string" ) -orders_df.write.mode("overwrite").saveAsTable(f"{demo_catalog_name}.{demo_schema_name}.orders") +orders_table = f"{demo_catalog_name}.{demo_schema_name}.users_orders" +orders_df.write.mode("overwrite").saveAsTable(orders_table) # Define checks for different tables using dictionaries user_checks = [ @@ -125,173 +128,130 @@ } ] -# Define the configs -configs = [ +# Save checks in a table +checks_table = f"{demo_catalog_name}.{demo_schema_name}.checks" +dq_engine.save_checks(user_checks, config=TableChecksStorageConfig(location=checks_table, run_config_name=users_table, mode="overwrite")) +dq_engine.save_checks(order_checks, config=TableChecksStorageConfig(location=checks_table, run_config_name=orders_table, mode="overwrite")) +display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.checks")) + +# Define the run configs +run_configs = [ RunConfig( - input_config=InputConfig(location=f"{demo_catalog_name}.{demo_schema_name}.users"), + name=users_table, + input_config=InputConfig(location=users_table), output_config=OutputConfig( location=f"{demo_catalog_name}.{demo_schema_name}.users_checked", mode="overwrite" ), + # quarantine bad data quarantine_config=OutputConfig( location=f"{demo_catalog_name}.{demo_schema_name}.users_quarantine", mode="overwrite" ), - checks=user_checks + checks_location=checks_table ), RunConfig( - input_config=InputConfig(location=f"{demo_catalog_name}.{demo_schema_name}.orders"), + name=orders_table, + input_config=InputConfig(location=orders_table), + # don't quarantine bad data output_config=OutputConfig( - location=f"{demo_catalog_name}.{demo_schema_name}.orders_checked", - mode="overwrite" - ), - quarantine_config=OutputConfig( - location=f"{demo_catalog_name}.{demo_schema_name}.orders_quarantine", + location=f"{demo_catalog_name}.{demo_schema_name}.users_orders_checked", mode="overwrite" ), - checks=order_checks + checks_location=checks_table ) ] # Apply checks to multiple tables and save the results -dq_engine.apply_checks_and_save_in_tables( - configs=configs, max_parallelism=4 -) +dq_engine.apply_checks_and_save_in_tables(run_configs=run_configs) display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_checked")) -display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.orders_checked")) +display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_quarantine")) +display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_orders_checked")) + +# COMMAND ---------- + +# clean up tables +spark.sql(f"drop table {demo_catalog_name}.{demo_schema_name}.users_checked") +spark.sql(f"drop table {demo_catalog_name}.{demo_schema_name}.users_quarantine") +spark.sql(f"drop table {demo_catalog_name}.{demo_schema_name}.users_orders_checked") # COMMAND ---------- # MAGIC %md -# MAGIC ## Checking multiple tables using DQRule Objects +# MAGIC ## Checking multiple tables using wildard pattern # COMMAND ---------- -# Define checks using DQRule objects -user_rule_checks = [ - DQRowRule( - criticality="error", - check_func=check_funcs.is_not_null, - column="user_id" - ), - DQRowRule( - criticality="warn", - check_func=check_funcs.regex_match, - column="email", - check_func_kwargs={ - "regex": r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$" - } - ) -] +# apply checks to multiple tables using patterns +dq_engine.apply_checks_and_save_in_tables_from_patterns( + patterns=[f"{demo_catalog_name}.{demo_schema_name}.users*"], # apply quality checks for all tables matching the pattern, can use wildcards + checks_location=checks_table, # run config name must be equal to the input table name + quarantine=True, + output_table_suffix="_checked", # default _dq_output + quarantine_table_suffix="_quarantine" # default _dq_quarantine +) -order_rule_checks = [ - DQRowRule( - criticality="error", - check_func=check_funcs.is_not_null, - column="order_id" - ), - DQRowRule( - criticality="error", - check_func=check_funcs.is_not_less_than, - column="total_amount", - check_func_kwargs={"limit": 0} - ) -] +display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_checked")) +display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_quarantine")) +display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_orders_checked")) +display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_orders_quarantine")) -# Define the configs -configs = [ - ApplyChecksConfig( - input_config=InputConfig(location=f"{demo_catalog_name}.{demo_schema_name}.users"), - output_config=OutputConfig( - location=f"{demo_catalog_name}.{demo_schema_name}.users_validated", - mode="overwrite" - ), - quarantine_config=OutputConfig( - location=f"{demo_catalog_name}.{demo_schema_name}.users_issues", - mode="overwrite" - ), - checks=user_rule_checks - ), - ApplyChecksConfig( - input_config=InputConfig(location=f"{demo_catalog_name}.{demo_schema_name}.orders"), - output_config=OutputConfig( - location=f"{demo_catalog_name}.{demo_schema_name}.orders_validated", - mode="overwrite" - ), - quarantine_config=OutputConfig( - location=f"{demo_catalog_name}.{demo_schema_name}.orders_issues", - mode="overwrite" - ), - checks=order_rule_checks - ) -] -# Apply checks to multiple tables and save the results -dq_engine.apply_checks_and_save_in_tables( - configs=configs, max_parallelism=4 -) +# COMMAND ---------- -display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_validated")) -display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.orders_validated")) +# clean up tables +spark.sql(f"drop table {demo_catalog_name}.{demo_schema_name}.users_checked") +spark.sql(f"drop table {demo_catalog_name}.{demo_schema_name}.users_quarantine") +spark.sql(f"drop table {demo_catalog_name}.{demo_schema_name}.users_orders_checked") +spark.sql(f"drop table {demo_catalog_name}.{demo_schema_name}.users_orders_quarantine") +spark.sql(f"drop table {checks_table}") +# COMMAND ---------- +# MAGIC %md +# MAGIC ## End-to-End approach: generate and apply checks based on wildcard patterns # COMMAND ---------- # MAGIC %md -# MAGIC ## Bulk processing of many tables +# MAGIC Profile input tables, generate and save checks # COMMAND ---------- -# Create sample tables for bulk processing demonstration -for i in range(1, 6): # Create 5 sample tables - sample_data = [ - [i, f"Item {i}", "2023-01-01"], - [i+10, f"Item {i+10}", "2023-02-01"], - [None, f"Item missing", "2023-03-01"] # Missing ID - ] - - sample_df = spark.createDataFrame( - sample_data, - schema="id int, name string, created_on string" - ) - sample_df.write.mode("overwrite").saveAsTable(f"{demo_catalog_name}.{demo_schema_name}.demo_table_{i}") +from databricks.labs.dqx.profiler.profiler import DQProfiler, DQProfile +from databricks.labs.dqx.profiler.generator import DQGenerator -# Create a configs for multiple tables in a list -configs = [ - ApplyChecksConfig( - input_config=InputConfig(location=f"{demo_catalog_name}.{demo_schema_name}.demo_table_{i}"), - output_config=OutputConfig( - location=f"{demo_catalog_name}.{demo_schema_name}.demo_table_{i}_validated", - mode="overwrite" - ), - checks=[ - { - "criticality": "error", - "check": { - "function": "is_not_null", - "arguments": {"column": "id"} - } - }, - { - "criticality": "warn", - "check": { - "function": "sql_expression", - "arguments": { - "expression": "cast(created_on as date) <= current_date()", - "msg": "Created on should not be in the future" - } - } - } - ] - ) - for i in range(1, 6) -] +profiler = DQProfiler(ws, spark) +generator = DQGenerator(ws) -# Apply checks to multiple tables and save the results -dq_engine.apply_checks_and_save_in_tables( - configs=configs, max_parallelism=3 +patterns = [f"{demo_catalog_name}.{demo_schema_name}.users*"] +results = profiler.profile_tables(patterns=patterns) + +for table, (summary_stats, profiles) in results.items(): + checks = generator.generate_dq_rules(profiles) + print(f"Generated checks: {checks}") + # run config name must be equal to the input table name + dq_engine.save_checks(checks, config=TableChecksStorageConfig(location=checks_table, run_config_name=table, mode="overwrite")) + +# COMMAND ---------- + +display(spark.table(checks_table)) + +# COMMAND ---------- + +# MAGIC %md +# MAGIC Apply the generated checks + +# COMMAND ---------- + + +# apply checks to multiple tables using patterns +dq_engine.apply_checks_and_save_in_tables_from_patterns( + patterns=patterns, + checks_location=checks_table, + output_table_suffix="_checked", ) -display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.demo_table_5_validated")) \ No newline at end of file +display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_checked")) +display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_orders_checked")) \ No newline at end of file diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index 0118c9371..604fe60b7 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -114,11 +114,12 @@ The profiler can discover and profile multiple tables accessible via Unity Catal # Profile several tables by name results = profiler.profile_tables( - tables=["main.data.table_001", "main.data.table_002"] + patterns=["main.data.table_001", "main.data.table_002"] ) # Process results for each table - for summary_stats, profiles in results: + for table, (summary_stats, profiles) in results.items(): + print(f"Table: {table}") print(f"Table statistics: {summary_stats}") print(f"Generated profiles: {profiles}") @@ -128,7 +129,8 @@ The profiler can discover and profile multiple tables accessible via Unity Catal ) # Process results for each table - for summary_stats, profiles in results: + for table, (summary_stats, profiles) in results.items(): + print(f"Table: {table}") print(f"Table statistics: {summary_stats}") print(f"Generated profiles: {profiles}") @@ -139,7 +141,8 @@ The profiler can discover and profile multiple tables accessible via Unity Catal ) # Process results for each table - for summary_stats, profiles in results: + for table, (summary_stats, profiles) in results.items(): + print(f"Table: {table}") print(f"Table statistics: {summary_stats}") print(f"Generated profiles: {profiles}") ``` @@ -383,7 +386,7 @@ Wildcard patterns are supported, allowing you to match table names and apply spe ] # Profile multiple tables using custom options - results = profiler.profile_tables(tables=tables, options=custom_table_options) + results = profiler.profile_tables(patterns=tables, options=custom_table_options) # Profile multiple tables by wildcard patterns using custom options results = profiler.profile_tables( diff --git a/docs/dqx/docs/guide/quality_checks_storage.mdx b/docs/dqx/docs/guide/quality_checks_storage.mdx index 0bf7c7a8f..f9d5a2142 100644 --- a/docs/dqx/docs/guide/quality_checks_storage.mdx +++ b/docs/dqx/docs/guide/quality_checks_storage.mdx @@ -202,23 +202,23 @@ If you create checks as a list of DQRule objects, you can convert them using the # load checks from a local file using relative or absolute path # also works for absolute and relative workspace paths if invoked from Databricks notebook or job - checks: list[dict] = dq_engine.load_checks(checks, config=FileChecksStorageConfig(location="checks.yml")) + checks: list[dict] = dq_engine.load_checks(config=FileChecksStorageConfig(location="checks.yml")) # load checks from arbitrary workspace location using absolute path - checks: list[dict] = dq_engine.load_checks(checks, config=WorkspaceFileChecksStorageConfig(location="/Shared/App1/checks.yml")) + checks: list[dict] = dq_engine.load_checks(config=WorkspaceFileChecksStorageConfig(location="/Shared/App1/checks.yml")) # load checks from a Delta table and default run config name - checks: list[dict] = dq_engine.load_checks(checks, config=TableChecksStorageConfig(location="catalog.schema.checks_table")) + checks: list[dict] = dq_engine.load_checks(config=TableChecksStorageConfig(location="catalog.schema.checks_table")) # load checks from a Delta table with specific run config for filtering - checks: list[dict] = dq_engine.load_checks(checks, config=TableChecksStorageConfig(location="catalog.schema.checks_table", run_config_name="workflow_001")) + checks: list[dict] = dq_engine.load_checks(config=TableChecksStorageConfig(location="catalog.schema.checks_table", run_config_name="workflow_001")) # load checks from a Unity Catalog volume - checks: list[dict] = dq_engine.load_checks(checks, config=VolumeFileChecksStorageConfig(location="/Volumes/dq/config/checks_volume/App1/checks.yml")) + checks: list[dict] = dq_engine.load_checks(config=VolumeFileChecksStorageConfig(location="/Volumes/dq/config/checks_volume/App1/checks.yml")) # load checks from a file or table defined in the run config ('checks_location' field) # only works if DQX is installed in the workspace - checks: list[dict] = dq_engine.load_checks(checks, config=InstallationChecksStorageConfig(run_config_name="default")) + checks: list[dict] = dq_engine.load_checks(config=InstallationChecksStorageConfig(run_config_name="default")) # validate loaded checks assert not dq_engine.validate_checks(checks).has_errors diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index 5e42ba825..90be83dee 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -620,8 +620,8 @@ def apply_checks_and_save_in_tables_from_patterns( Checks are expected to be available under the same name as the table, with a .yml extension. Args: - patterns (list[str]): An optional list of table names or filesystem-style wildcards - (e.g., 'catalog.schema.*') to validate. + patterns: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include. + If None, all tables are included. By default, tables matching the pattern are included. checks_location: Location of the checks files (e.g., absolute workspace or volume directory, or delta table). For file based locations, checks are expected to be found under {checks_location}/{table_name}.yml. exclude_matched (bool): Specifies whether to include tables matched by the pattern. diff --git a/src/databricks/labs/dqx/profiler/profiler.py b/src/databricks/labs/dqx/profiler/profiler.py index bb2090370..5e410fdde 100644 --- a/src/databricks/labs/dqx/profiler/profiler.py +++ b/src/databricks/labs/dqx/profiler/profiler.py @@ -137,7 +137,6 @@ def profile_table( @telemetry_logger("profiler", "profile_tables") def profile_tables( self, - tables: list[str] | None = None, patterns: list[str] | None = None, exclude_matched: bool = False, columns: dict[str, list[str]] | None = None, @@ -147,8 +146,7 @@ def profile_tables( Profiles Delta tables in Unity Catalog to generate summary statistics and data quality rules. Args: - tables: An optional list of table names to include. - patterns: An optional list of table names or filesystem-style wildcards (e.g. 'schema.*') to include. + patterns: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include. If None, all tables are included. By default, tables matching the pattern are included. exclude_matched: Specifies whether to include tables matched by the pattern. If True, matched tables are excluded. If False, matched tables are included. @@ -160,10 +158,7 @@ def profile_tables( Returns: A dictionary mapping table names to tuples containing summary statistics and data quality profiles. """ - if not tables: - if not patterns: - raise ValueError("Either 'tables' or 'patterns' must be provided") - tables = list_tables(client=self.ws, patterns=patterns, exclude_matched=exclude_matched) + tables = list_tables(client=self.ws, patterns=patterns, exclude_matched=exclude_matched) return self._profile_tables(tables=tables, columns=columns, options=options) def _profile_tables( diff --git a/tests/integration/test_profiler.py b/tests/integration/test_profiler.py index c842dccc4..54d324920 100644 --- a/tests/integration/test_profiler.py +++ b/tests/integration/test_profiler.py @@ -719,7 +719,7 @@ def test_profile_tables(spark, ws, make_schema, make_random): {"table": table1_name, "options": {"sample_fraction": None}}, {"table": table2_name, "options": {"sample_fraction": None}}, ] - profiles = profiler.profile_tables(tables=[table1_name, table2_name], options=options) + profiles = profiler.profile_tables(patterns=[table1_name, table2_name], options=options) expected_rules = { table1_name: [ DQProfile(name='is_not_null', column='col1', description=None, parameters=None), @@ -861,7 +861,7 @@ def test_profile_tables_with_no_options(spark, ws, make_schema, make_random): {"table": table1_name, "options": {}}, {"table": table2_name, "options": None}, ] - profiles = profiler.profile_tables(tables=[table1_name, table2_name], options=options) + profiles = profiler.profile_tables(patterns=[table1_name, table2_name], options=options) for table_name, (stats, _) in profiles.items(): assert len(stats.keys()) > 0, f"Stats did not match expected for {table_name}" @@ -889,7 +889,7 @@ def test_profile_tables_with_no_matched_options(spark, ws, make_schema, make_ran {"table": table1_name, "options": {"sample_fraction": 1.0}}, {"table": table2_name, "options": {"sample_fraction": 1.0}}, ] - profiles = profiler.profile_tables(tables=[table1_name, table2_name], options=options) + profiles = profiler.profile_tables(patterns=[table1_name, table2_name], options=options) expected_rules = { table1_name: [ DQProfile(name='is_not_null', column='col1', description=None, parameters=None), @@ -944,7 +944,7 @@ def test_profile_tables_with_common_opts(spark, ws, make_schema, make_random): }, } ] - profiles = profiler.profile_tables(tables=[table1_name, table2_name], options=options) + profiles = profiler.profile_tables(patterns=[table1_name, table2_name], options=options) expected_rules = { table1_name: [ DQProfile( @@ -1122,7 +1122,7 @@ def test_profile_tables_with_partial_opts_match(spark, ws, make_schema, make_ran }, }, ] - profiles = profiler.profile_tables(tables=[table1_name, table2_name], options=table_opts) + profiles = profiler.profile_tables(patterns=[table1_name, table2_name], options=table_opts) expected_rules = { table1_name: [ DQProfile( @@ -1196,7 +1196,9 @@ def test_profile_tables_with_selected_columns(spark, ws, make_schema, make_rando {"table": table2_name, "options": {"sample_fraction": None}}, ] - profiles = profiler.profile_tables(tables=[table1_name, table2_name], columns=table_columns, options=table_options) + profiles = profiler.profile_tables( + patterns=[table1_name, table2_name], columns=table_columns, options=table_options + ) expected_rules = { table1_name: [ DQProfile(name="is_not_null", column="col1", description=None, parameters=None), @@ -1247,10 +1249,3 @@ def test_profile_tables_with_selected_columns(spark, ws, make_schema, make_rando assert "active" not in stats assert rules == expected_rules[table_name], f"Rules did not match expected for {table_name}" - - -def test_profile_tables_no_tables_or_patterns(ws): - profiler = DQProfiler(ws) - - with pytest.raises(ValueError, match="Either 'tables' or 'patterns' must be provided"): - profiler.profile_tables() From 1ac1e71ddd3879f8807efda7739b26ed60e65803 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Tue, 23 Sep 2025 23:44:50 +0200 Subject: [PATCH 08/64] updated docs --- docs/dqx/docs/demos.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/dqx/docs/demos.mdx b/docs/dqx/docs/demos.mdx index 5577d5825..5a85aa60a 100644 --- a/docs/dqx/docs/demos.mdx +++ b/docs/dqx/docs/demos.mdx @@ -10,6 +10,7 @@ Import the following notebooks in the Databricks workspace to try DQX out: ## Use as Library * [DQX Quick Start Demo Notebook](https://github.com/databrickslabs/dqx/blob/v0.9.2/demos/dqx_quick_start_demo_library.py) - quickstart on how to use DQX as a library. * [DQX Demo Notebook](https://github.com/databrickslabs/dqx/blob/v0.9.2/demos/dqx_demo_library.py) - demonstrates how to use DQX as a library. +* [DQX Demo Notebook for Applying Checks at Scale on Multiple Tables](https://github.com/databrickslabs/dqx/blob/v0.9.2/demos/dqx_multi_table_demo.py) - demonstrates how to use DQX as a library at scale to apply checks on multiple tables. * [DQX Demo Notebook for Spark Structured Streaming (Native End-to-End Approach)](https://github.com/databrickslabs/dqx/blob/v0.9.2/demos/dqx_streaming_demo_native.py) - demonstrates how to use DQX as a library with Spark Structured Streaming, using the built-in end-to-end method to handle both reading and writing. * [DQX Demo Notebook for Spark Structured Streaming (DIY Approach)](https://github.com/databrickslabs/dqx/blob/v0.9.2/demos/dqx_streaming_demo_diy.py) - demonstrates how to use DQX as a library with Spark Structured Streaming, while handling reading and writing on your own outside DQX using Spark API. * [DQX Demo Notebook for Lakeflow Pipelines (formerly DLT)](https://github.com/databrickslabs/dqx/blob/v0.9.2/demos/dqx_dlt_demo.py) - demonstrates how to use DQX as a library with Lakeflow Pipelines. From c918534edb55f66f3a2804546791807277b18074 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Wed, 24 Sep 2025 10:26:30 +0200 Subject: [PATCH 09/64] updated demo and docs --- demos/dqx_multi_table_demo.py | 82 +++++------ docs/dqx/docs/dev/contributing.mdx | 13 +- docs/dqx/docs/guide/quality_checks_apply.mdx | 135 +++++++++++------- src/databricks/labs/dqx/checks_storage.py | 2 +- src/databricks/labs/dqx/engine.py | 10 +- .../test_save_and_load_checks_from_table.py | 2 +- 6 files changed, 143 insertions(+), 101 deletions(-) diff --git a/demos/dqx_multi_table_demo.py b/demos/dqx_multi_table_demo.py index d405cf443..77b82b635 100644 --- a/demos/dqx_multi_table_demo.py +++ b/demos/dqx_multi_table_demo.py @@ -2,7 +2,7 @@ # MAGIC %md # MAGIC # DQX Multi-Table Data Quality Checks Demo # MAGIC -# MAGIC This notebook demonstrates how to apply data quality checks to multiple tables at once using DQX. +# MAGIC This notebook demonstrates how to apply data quality checks to multiple tables in a single method call. # COMMAND ---------- @@ -27,11 +27,10 @@ # COMMAND ---------- +import yaml from databricks.labs.dqx.config import InputConfig, OutputConfig, RunConfig from databricks.labs.dqx.config import TableChecksStorageConfig from databricks.labs.dqx.engine import DQEngine -from databricks.labs.dqx.rule import DQRowRule -from databricks.labs.dqx import check_funcs from databricks.sdk import WorkspaceClient # Default configuration values @@ -90,43 +89,34 @@ orders_table = f"{demo_catalog_name}.{demo_schema_name}.users_orders" orders_df.write.mode("overwrite").saveAsTable(orders_table) -# Define checks for different tables using dictionaries -user_checks = [ - { - "criticality": "error", - "check": { - "function": "is_not_null", - "arguments": {"column": "user_id"} - } - }, - { - "criticality": "warn", - "check": { - "function": "regex_match", - "arguments": { - "column": "email", - "regex": r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$" - } - } - } -] - -order_checks = [ - { - "criticality": "error", - "check": { - "function": "is_not_null", - "arguments": {"column": "order_id"} - } - }, - { - "criticality": "error", - "check": { - "function": "is_not_less_than", - "arguments": {"column": "total_amount", "limit": 0} - } - } -] +# Define checks +user_checks = yaml.safe_load(""" + - criticality: error + check: + function: is_not_null + arguments: + column: user_id + - criticality: warn + check: + function: regex_match + arguments: + column: email + regex: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$ + """) + +order_checks = yaml.safe_load(""" + - criticality: error + check: + function: is_not_null + arguments: + column: order_id + - criticality: warn + check: + function: is_not_less_than + arguments: + column: total_amount + limit: 0 + """) # Save checks in a table checks_table = f"{demo_catalog_name}.{demo_schema_name}.checks" @@ -134,7 +124,7 @@ dq_engine.save_checks(order_checks, config=TableChecksStorageConfig(location=checks_table, run_config_name=orders_table, mode="overwrite")) display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.checks")) -# Define the run configs +# Define run configs run_configs = [ RunConfig( name=users_table, @@ -171,7 +161,7 @@ # COMMAND ---------- -# clean up tables +# Clean up tables spark.sql(f"drop table {demo_catalog_name}.{demo_schema_name}.users_checked") spark.sql(f"drop table {demo_catalog_name}.{demo_schema_name}.users_quarantine") spark.sql(f"drop table {demo_catalog_name}.{demo_schema_name}.users_orders_checked") @@ -183,10 +173,10 @@ # COMMAND ---------- -# apply checks to multiple tables using patterns +# Apply checks to multiple tables using patterns dq_engine.apply_checks_and_save_in_tables_from_patterns( patterns=[f"{demo_catalog_name}.{demo_schema_name}.users*"], # apply quality checks for all tables matching the pattern, can use wildcards - checks_location=checks_table, # run config name must be equal to the input table name + checks_location=checks_table, # run config of the saved checks name must be equal to the input table name quarantine=True, output_table_suffix="_checked", # default _dq_output quarantine_table_suffix="_quarantine" # default _dq_quarantine @@ -219,7 +209,7 @@ # COMMAND ---------- -from databricks.labs.dqx.profiler.profiler import DQProfiler, DQProfile +from databricks.labs.dqx.profiler.profiler import DQProfiler from databricks.labs.dqx.profiler.generator import DQGenerator profiler = DQProfiler(ws, spark) @@ -246,7 +236,7 @@ # COMMAND ---------- -# apply checks to multiple tables using patterns +# Apply checks on multiple tables using patterns dq_engine.apply_checks_and_save_in_tables_from_patterns( patterns=patterns, checks_location=checks_table, diff --git a/docs/dqx/docs/dev/contributing.mdx b/docs/dqx/docs/dev/contributing.mdx index 4c058b416..cd9ff476a 100644 --- a/docs/dqx/docs/dev/contributing.mdx +++ b/docs/dqx/docs/dev/contributing.mdx @@ -225,11 +225,16 @@ However, manual testing may still be useful before creating or merging a PR. To test DQX from your feature branch, you can install it directly as follows: ```commandline -pip install git+https://github.com/databrickslabs/dqx.git@feature_barnch_name +pip install git+https://github.com/databrickslabs/dqx.git@feature_branch_name ``` Replace `feature_branch_name` with the name of your branch. +If you contribute from a fork, install it from the fork branch: +```commandline +pip install git+https://github.com/your-username/dqx.git@feature_branch_name +``` + ## Manual testing of the CLI commands from the current codebase Once you clone the repo locally and install Databricks CLI you can run labs CLI commands from the root of the repository. @@ -256,6 +261,12 @@ Install dqx: databricks labs install . ``` +You can use the uploaded wheel to install dqx inside a notebook: +```commandline +%pip install /Workspace/Users//.dqx/wheels/databricks_labs_dqx--py3-none-any.whl +%restart_python +``` + Show current installation username: ```commandline databricks labs dqx me diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index ace75960f..d73c60922 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -199,74 +199,113 @@ For details on each check, please refer to the documentation [here](/docs/refere Applying checks on multiple tables can be performed by executing the same methods as described above in a loop. However, DQX provides a convenient method to handle multiple tables in a single method call. -Use `apply_checks_and_save_in_tables` to perform end-to-end quality checking for multiple tables. +Use `apply_checks_and_save_in_tables` or `apply_checks_and_save_in_tables_from_patterns` to perform end-to-end quality checking for multiple tables. +Use explicit configuration for each table: ```python import yaml - from databricks.labs.dqx.config import ApplyChecksConfig, InputConfig, OutputConfig + from databricks.labs.dqx.config import InputConfig, OutputConfig, RunConfig + from databricks.labs.dqx.config import TableChecksStorageConfig from databricks.labs.dqx.engine import DQEngine from databricks.sdk import WorkspaceClient dq_engine = DQEngine(WorkspaceClient()) - # Define some checks using DQRule classes - rule_checks = [ - DQRowRule( - name="id_not_null", - criticality="error", - check_func=check_funcs.is_not_null, - column="id", - ), - DQRowRule( - name="amount_positive", - criticality="warn", - check_func=check_funcs.is_greater_than, - column="amount", - limit=0, - ), - ] - - # Define checks using YAML - metadata_checks = yaml.safe_load(""" - - name: id_is_null - criticality: error - check: - function: is_not_null - arguments: - column: id - - name: email_invalid_format - criticality: warn - check: - function: regex_match - arguments: - column: email - pattern: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ + # Define checks + checks = yaml.safe_load(""" + - criticality: error + check: + function: is_not_null + arguments: + column: user_id + - criticality: warn + check: + function: regex_match + arguments: + column: email + regex: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$ """) + # Save checks in a table + checks_table = "catalog.schema.checks" + dq_engine.save_checks(checks, config=TableChecksStorageConfig(location=checks_table, run_config_name=checks_table, mode="overwrite")) + # Define configuration to check multiple tables - configs = [ - ApplyChecksConfig( - input_config=InputConfig("catalog.schema.input_data_001"), - output_config=OutputConfig("catalog.schema.output_data_001"), - checks=rule_checks - ), - ApplyChecksConfig( - input_config=InputConfig("catalog.schema.input_data_002"), - output_config=OutputConfig("catalog.schema.output_data_002"), - checks=metadata_checks + run_configs = [ + RunConfig( + name=users_table, + input_config=InputConfig(location="catalog.schema.input_data_001"), + output_config=OutputConfig( + location="catalog.schema.output_data_001", + mode="overwrite" + ), + # quarantine bad data + quarantine_config=OutputConfig( + location="catalog.schema.quarantine_data_001", + mode="overwrite" + ), + checks_location=checks_table ), + RunConfig( + name=orders_table, + input_config=InputConfig(location="catalog.schema.input_data_002"), + # don't quarantine bad data + output_config=OutputConfig( + location="catalog.schema.output_data_002", + mode="overwrite" + ), + checks_location=checks_table + ) ] - # Check each input table and write data to the corresponding output tables - dq_engine.apply_checks_and_save_in_tables( - configs=configs, max_parallelism=2 - ) + # Apply checks + dq_engine.apply_checks_and_save_in_tables(run_configs=run_configs) ``` +Apply checks on tables using wildcard patterns: + + + ```python + import yaml + from databricks.labs.dqx.config import InputConfig, OutputConfig, RunConfig + from databricks.labs.dqx.profiler.profiler import DQProfiler + from databricks.labs.dqx.profiler.generator import DQGenerator + from databricks.labs.dqx.config import TableChecksStorageConfig + from databricks.labs.dqx.engine import DQEngine + from databricks.sdk import WorkspaceClient + + dq_engine = DQEngine(WorkspaceClient()) + + # Perform quality checking on all tables matching the patterns + patterns = ["catalog.schema.*", "catalog.schema2.input_data_003"] + + # (Optional step) profile input data and generate quality rules candidates + profiler = DQProfiler(ws, spark) + generator = DQGenerator(ws) + + results = profiler.profile_tables(patterns=patterns) + + # Save quality checks in a table + for table, (summary_stats, profiles) in results.items(): + checks = generator.generate_dq_rules(profiles) + # run config name must be equal to the input table name + dq_engine.save_checks(checks, config=TableChecksStorageConfig(location=checks_table, run_config_name=table, mode="overwrite")) + + # Apply checks on multiple tables using patterns + dq_engine.apply_checks_and_save_in_tables_from_patterns( + patterns=patterns, + checks_location=checks_table, # run config of the saved checks name must be equal to the input table name + quarantine=True, + output_table_suffix="_checked", # default _dq_output + quarantine_table_suffix="_quarantine", # default _dq_quarantine + ) + ``` + + ### Applying checks in Lakeflow Pipelines diff --git a/src/databricks/labs/dqx/checks_storage.py b/src/databricks/labs/dqx/checks_storage.py index 336283587..a0ccdcccb 100644 --- a/src/databricks/labs/dqx/checks_storage.py +++ b/src/databricks/labs/dqx/checks_storage.py @@ -83,7 +83,7 @@ def load(self, config: TableChecksStorageConfig) -> list[dict]: """ logger.info(f"Loading quality rules (checks) from table '{config.location}'") if not self.ws.tables.exists(config.location).table_exists: - raise NotFound(f"Table {config.location} does not exist in the workspace") + raise NotFound(f"Checks table {config.location} does not exist in the workspace") rules_df = self.spark.read.table(config.location) return serialize_checks_from_dataframe(rules_df, run_config_name=config.run_config_name) or [] diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index 90be83dee..0d8f6bd55 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -494,7 +494,7 @@ def apply_checks_and_save_in_table( quarantine_config: Optional configuration for writing invalid records. ref_dfs: Optional reference DataFrames used by checks. """ - logger.info(f"Applying checks to data from {input_config.location}") + logger.info(f"Applying checks to {input_config.location}") # Read data from the specified table df = read_input_data(self.spark, input_config) @@ -541,7 +541,7 @@ def apply_checks_by_metadata_and_save_in_table( to callables/modules (e.g., globals()). ref_dfs: Optional reference DataFrames used by checks. """ - logger.info(f"Applying checks to data from {input_config.location}") + logger.info(f"Applying checks to {input_config.location}") # Read data from the specified table df = read_input_data(self.spark, input_config) @@ -643,7 +643,7 @@ def apply_checks_and_save_in_tables_from_patterns( configs = [ ( RunConfig( - name=f"{table}", + name=table, input_config=InputConfig(table), output_config=OutputConfig(f"{table}{output_table_suffix}"), quarantine_config=OutputConfig(f"{table}{quarantine_table_suffix}"), @@ -653,7 +653,7 @@ def apply_checks_and_save_in_tables_from_patterns( ) if quarantine else RunConfig( - name=f"{table}", + name=table, input_config=InputConfig(table), output_config=OutputConfig(f"{table}{output_table_suffix}"), checks_location=( @@ -848,6 +848,8 @@ def _apply_checks_for_run_config( storage_handler, storage_config = self._checks_handler_factory.create_for_location( run_config.checks_location, run_config.name ) + # if checks are not found, return empty list87 + # raise an error if checks location not found checks = storage_handler.load(storage_config) self.apply_checks_by_metadata_and_save_in_table( diff --git a/tests/integration/test_save_and_load_checks_from_table.py b/tests/integration/test_save_and_load_checks_from_table.py index 391c8c3ed..66fbc8e78 100644 --- a/tests/integration/test_save_and_load_checks_from_table.py +++ b/tests/integration/test_save_and_load_checks_from_table.py @@ -69,7 +69,7 @@ def test_load_checks_when_checks_table_does_not_exist(ws, make_schema, make_rand schema_name = make_schema(catalog_name=catalog_name).name table_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" - with pytest.raises(NotFound, match=f"Table {table_name} does not exist in the workspace"): + with pytest.raises(NotFound, match=f"Checks table {table_name} does not exist in the workspace"): engine = DQEngine(ws, spark) config = TableChecksStorageConfig(location=table_name) engine.load_checks(config=config) From e391bdfca1a04ab0239d5190ef110b4923fe5319 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Wed, 24 Sep 2025 12:49:51 +0200 Subject: [PATCH 10/64] refactor --- demos/dqx_multi_table_demo.py | 11 +++- docs/dqx/docs/guide/quality_checks_apply.mdx | 19 +++++- src/databricks/labs/dqx/engine.py | 62 +++++++++++-------- .../test_apply_checks_and_save_in_table.py | 17 ++++- 4 files changed, 75 insertions(+), 34 deletions(-) diff --git a/demos/dqx_multi_table_demo.py b/demos/dqx_multi_table_demo.py index 77b82b635..afef8a706 100644 --- a/demos/dqx_multi_table_demo.py +++ b/demos/dqx_multi_table_demo.py @@ -177,7 +177,14 @@ dq_engine.apply_checks_and_save_in_tables_from_patterns( patterns=[f"{demo_catalog_name}.{demo_schema_name}.users*"], # apply quality checks for all tables matching the pattern, can use wildcards checks_location=checks_table, # run config of the saved checks name must be equal to the input table name - quarantine=True, + run_config_template=RunConfig( + # auto-created if not provided; location skipped and derived from patterns + input_config=InputConfig(""), + # auto-created if not provided; location skipped and derived from patterns + output_table_suffix + output_config=OutputConfig(location="", mode="overwrite"), + # quarantine bad data; location skipped and derived from patterns + quarantine_table_suffix + quarantine_config=OutputConfig(location="", mode="overwrite"), + ), output_table_suffix="_checked", # default _dq_output quarantine_table_suffix="_quarantine" # default _dq_quarantine ) @@ -187,7 +194,6 @@ display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_orders_checked")) display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_orders_quarantine")) - # COMMAND ---------- # clean up tables @@ -241,6 +247,7 @@ patterns=patterns, checks_location=checks_table, output_table_suffix="_checked", + # run_config_template with quarantine_config not provided - don't quarantine bad data ) display(spark.table(f"{demo_catalog_name}.{demo_schema_name}.users_checked")) diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index d73c60922..0324f0141 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -289,7 +289,7 @@ Apply checks on tables using wildcard patterns: results = profiler.profile_tables(patterns=patterns) - # Save quality checks in a table + # Save quality checks to a table for table, (summary_stats, profiles) in results.items(): checks = generator.generate_dq_rules(profiles) # run config name must be equal to the input table name @@ -299,9 +299,22 @@ Apply checks on tables using wildcard patterns: dq_engine.apply_checks_and_save_in_tables_from_patterns( patterns=patterns, checks_location=checks_table, # run config of the saved checks name must be equal to the input table name - quarantine=True, + ) + + # Apply checks on multiple tables using patterns and options + dq_engine.apply_checks_and_save_in_tables_from_patterns( + patterns=patterns, + checks_location=checks_table, + run_config_template=RunConfig( + # auto-created if not provided; location skipped and derived from patterns + input_config=InputConfig(""), + # auto-created if not provided; location skipped and derived from patterns + output_table_suffix + output_config=OutputConfig(location="", mode="overwrite"), + # quarantine bad data; location skipped and derived from patterns + quarantine_table_suffix + quarantine_config=OutputConfig(location="", mode="overwrite"), + ), output_table_suffix="_checked", # default _dq_output - quarantine_table_suffix="_quarantine", # default _dq_quarantine + quarantine_table_suffix="_quarantine" # default _dq_quarantine ) ``` diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index 0d8f6bd55..34bd563b1 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -1,5 +1,6 @@ import os import logging +import copy from concurrent import futures from collections.abc import Callable from datetime import datetime @@ -598,10 +599,10 @@ def apply_checks_and_save_in_tables( @telemetry_logger("engine", "apply_checks_and_save_in_tables_from_patterns") def apply_checks_and_save_in_tables_from_patterns( self, - patterns: list[str], - checks_location: str, + patterns: list[str], # can use wildcard e.g. catalog.schema.* + checks_location: str, # use as prefix for checks defined in files exclude_matched: bool = False, - quarantine: bool = False, + run_config_template: RunConfig = RunConfig(), max_parallelism: int | None = os.cpu_count(), output_table_suffix: str = "_dq_output", quarantine_table_suffix: str = "_dq_quarantine", @@ -626,7 +627,9 @@ def apply_checks_and_save_in_tables_from_patterns( For file based locations, checks are expected to be found under {checks_location}/{table_name}.yml. exclude_matched (bool): Specifies whether to include tables matched by the pattern. If True, matched tables are excluded. If False, matched tables are included. - quarantine (bool): If True, split the data into good and bad records and write to separate tables. + run_config_template: Run configuration template to use for all tables. + Skip location in the input_config, output_config, and quarantine_config as it is derived from patterns. + Autogenerate input_config and output_config autogenerated if not provided. max_parallelism (int): Maximum number of tables to check in parallel. output_table_suffix (str): Suffix to append to the output table name. quarantine_table_suffix (str): Suffix to append to the quarantine table name. @@ -638,32 +641,37 @@ def apply_checks_and_save_in_tables_from_patterns( Returns: None """ + if run_config_template.input_config is None: + run_config_template.input_config = InputConfig(location="") # location derived from patterns + + if run_config_template.output_config is None: + run_config_template.output_config = OutputConfig(location="") # location derived from patterns + tables = list_tables(self.ws, patterns, exclude_matched) - configs = [ - ( - RunConfig( - name=table, - input_config=InputConfig(table), - output_config=OutputConfig(f"{table}{output_table_suffix}"), - quarantine_config=OutputConfig(f"{table}{quarantine_table_suffix}"), - checks_location=( - checks_location if TABLE_PATTERN.match(checks_location) else f"{checks_location}/{table}.yml" - ), - ) - if quarantine - else RunConfig( - name=table, - input_config=InputConfig(table), - output_config=OutputConfig(f"{table}{output_table_suffix}"), - checks_location=( - checks_location if TABLE_PATTERN.match(checks_location) else f"{checks_location}/{table}.yml" - ), - ) + run_configs = [] + for table in tables: + run_config = copy.deepcopy(run_config_template) + + assert run_config.input_config + assert run_config.output_config + + run_config.name = table + run_config.input_config.location = table + run_config.output_config.location = f"{table}{output_table_suffix}" + + if run_config.quarantine_config: + run_config.quarantine_config.location = f"{table}{quarantine_table_suffix}" + + run_config.checks_location = ( + # for file based checks expecting a file per table + checks_location + if TABLE_PATTERN.match(checks_location) + else f"{checks_location}/{table}.yml" ) - for table in tables - ] - self.apply_checks_and_save_in_tables(configs, custom_check_functions, ref_dfs, max_parallelism) + run_configs.append(run_config) + + self.apply_checks_and_save_in_tables(run_configs, custom_check_functions, ref_dfs, max_parallelism) @staticmethod def validate_checks( diff --git a/tests/integration/test_apply_checks_and_save_in_table.py b/tests/integration/test_apply_checks_and_save_in_table.py index 8b2531c34..5a2712574 100644 --- a/tests/integration/test_apply_checks_and_save_in_table.py +++ b/tests/integration/test_apply_checks_and_save_in_table.py @@ -1592,7 +1592,7 @@ def test_apply_checks_and_save_in_tables_from_patterns_with_quarantine( patterns=[f"{catalog_name}.{schema.name}.*"], checks_location=workspace_folder, max_parallelism=2, - quarantine=True, + run_config_template=RunConfig(quarantine_config=OutputConfig(location="")), ) # Verify both tables were created and contain the expected data @@ -1735,7 +1735,20 @@ def test_apply_checks_and_save_in_tables_from_patterns_with_custom_suffix( engine.apply_checks_and_save_in_tables_from_patterns( patterns=[f"{catalog_name}.{schema.name}.*"], checks_location=workspace_folder, - quarantine=True, + run_config_template=RunConfig(quarantine_config=OutputConfig(location="")), + output_table_suffix=output_table_suffix, + quarantine_table_suffix=quarantine_table_suffix, + ) + + # Overwrite results to test that options are properly passed + engine.apply_checks_and_save_in_tables_from_patterns( + patterns=[input_tables[0], input_tables[1]], + checks_location=workspace_folder, + run_config_template=RunConfig( + input_config=InputConfig(location="", format="delta"), + output_config=OutputConfig(location="", mode="overwrite"), + quarantine_config=OutputConfig(location="", mode="overwrite"), + ), output_table_suffix=output_table_suffix, quarantine_table_suffix=quarantine_table_suffix, ) From 8f30e040a34fec6c3ffff6dea5edec3d704c2ebe Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Wed, 24 Sep 2025 12:53:51 +0200 Subject: [PATCH 11/64] refactor --- docs/dqx/docs/guide/quality_checks_apply.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index 0324f0141..8e7aad19e 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -301,7 +301,7 @@ Apply checks on tables using wildcard patterns: checks_location=checks_table, # run config of the saved checks name must be equal to the input table name ) - # Apply checks on multiple tables using patterns and options + # Apply checks on multiple tables using patterns and prefilled configs dq_engine.apply_checks_and_save_in_tables_from_patterns( patterns=patterns, checks_location=checks_table, From 6c108748a6c31788bbd3687ee5a3524cd7aaf33a Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Wed, 24 Sep 2025 12:54:19 +0200 Subject: [PATCH 12/64] refactor --- docs/dqx/docs/guide/quality_checks_apply.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index 8e7aad19e..dd28cc711 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -301,7 +301,7 @@ Apply checks on tables using wildcard patterns: checks_location=checks_table, # run config of the saved checks name must be equal to the input table name ) - # Apply checks on multiple tables using patterns and prefilled configs + # Apply checks on multiple tables using patterns and prefilled run config parameters dq_engine.apply_checks_and_save_in_tables_from_patterns( patterns=patterns, checks_location=checks_table, From 53514f399138b02711254b9dd1e2c8da9a42b710 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Wed, 24 Sep 2025 14:49:04 +0200 Subject: [PATCH 13/64] refactor --- demos/dqx_multi_table_demo.py | 1 + docs/dqx/docs/guide/quality_checks_apply.mdx | 1 + docs/dqx/docs/reference/engine.mdx | 39 +++++++++++++------- docs/dqx/docs/reference/profiler.mdx | 2 +- src/databricks/labs/dqx/engine.py | 5 ++- 5 files changed, 31 insertions(+), 17 deletions(-) diff --git a/demos/dqx_multi_table_demo.py b/demos/dqx_multi_table_demo.py index afef8a706..f98c5f532 100644 --- a/demos/dqx_multi_table_demo.py +++ b/demos/dqx_multi_table_demo.py @@ -184,6 +184,7 @@ output_config=OutputConfig(location="", mode="overwrite"), # quarantine bad data; location skipped and derived from patterns + quarantine_table_suffix quarantine_config=OutputConfig(location="", mode="overwrite"), + # skip checks_location of the run config as it is derived separately ), output_table_suffix="_checked", # default _dq_output quarantine_table_suffix="_quarantine" # default _dq_quarantine diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index dd28cc711..979cd0923 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -312,6 +312,7 @@ Apply checks on tables using wildcard patterns: output_config=OutputConfig(location="", mode="overwrite"), # quarantine bad data; location skipped and derived from patterns + quarantine_table_suffix quarantine_config=OutputConfig(location="", mode="overwrite"), + # skip checks_location of the run config as it is derived separately ), output_table_suffix="_checked", # default _dq_output quarantine_table_suffix="_quarantine" # default _dq_quarantine diff --git a/docs/dqx/docs/reference/engine.mdx b/docs/dqx/docs/reference/engine.mdx index 8195a433b..88c9c2be9 100644 --- a/docs/dqx/docs/reference/engine.mdx +++ b/docs/dqx/docs/reference/engine.mdx @@ -49,23 +49,34 @@ The following table outlines the available methods of the `DQEngine` and their f
**Available DQX engine methods** -| Method | Description | Arguments | Supports local execution | -| ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | -| `apply_checks` | Applies quality checks to the DataFrame and returns a DataFrame with result columns. | `df`: DataFrame to check; `checks`: List of checks defined using DQX classes, each check is an instance of the DQRule class; `ref_dfs`: Reference dataframes to use in the checks, if applicable. | Yes | -| `apply_checks_and_split` | Applies quality checks to the DataFrame and returns valid and invalid (quarantine) DataFrames with result columns. | `df`: DataFrame to check; `checks`: List of checks defined using DQX classes, each check is an instance of the DQRule class; `ref_dfs`: Reference dataframes to use in the checks, if applicable. | Yes | -| `apply_checks_and_save_in_table` | Applies quality checks using DQRule objects and writes results to valid and invalid Delta table(s) with result columns. | `input_config`: `InputConfig` object with the table name and options for reading the input data; `checks`: List of checks defined using DQX classes, each check is an instance of the DQRule class; `output_config`: `OutputConfig` object with the table name, output mode, and options for the output data; `quarantine_config`: `OutputConfig` object with the table name, output mode, and options for the quarantine data - if provided, data will be split; `ref_dfs`: Reference dataframes to use in the checks, if applicable. | No | -| `apply_checks_by_metadata` | Applies quality checks defined as a dictionary to the DataFrame and returns a DataFrame with result columns. | `df`: DataFrame to check; `checks`: List of checks defined as dictionary; `custom_check_functions`: (optional) dictionary with custom check functions (e.g., globals() of the calling module); `ref_dfs`: Reference dataframes to use in the checks, if applicable. | Yes | -| `apply_checks_by_metadata_and_split` | Applies quality checks defined as a dictionary and returns valid and invalid (quarantine) DataFrames. | `df`: DataFrame to check; `checks`: List of checks defined as dictionary; `custom_check_functions`: (optional) dictionary with custom check functions (e.g., globals() of the calling module); `ref_dfs`: Reference dataframes to use in the checks, if applicable. | Yes | -| `apply_checks_by_metadata_and_save_in_table` | Applies quality checks defined as a dictionary and writes results to valid and invalid Delta table(s) with result columns. | `input_config`: `InputConfig` object with the table name and options for reading the input data; `checks`: List of checks defined as dictionary; `output_config`: `OutputConfig` object with the table name, output mode, and options for the output data; `quarantine_config`: `OutputConfig` object with the table name, output mode, and options for the quarantine data - if provided, data will be split; `custom_check_functions`: (optional) dictionary with custom check functions; `ref_dfs`: Reference dataframes to use in the checks, if applicable. | No | -| `validate_checks` | Validates the provided quality checks to ensure they conform to the expected structure and types. | `checks`: List of checks to validate; `custom_check_functions`: (optional) dictionary of custom check functions that can be used; `validate_custom_check_functions`: (optional) if set to True, validates custom check functions (defaults to True). | Yes | -| `get_invalid` | Retrieves records from the DataFrame that violate data quality checks (records with warnings and errors). | `df`: Input DataFrame. | Yes | -| `get_valid` | Retrieves records from the DataFrame that pass all data quality checks. | `df`: Input DataFrame. | Yes | -| `load_checks` | Loads quality rules (checks) from storage backend. Multiple storage backends are supported including tables, files or workspace files, installation-managed sources where the location is inferred automatically from run config. | `config`: Configuration for loading checks from a storage backend, i.e. `FileChecksStorageConfig`: file in a local filesystem (YAML or JSON), or workspace files if invoked from Databricks notebook or job; `WorkspaceFileChecksStorageConfig`: file in a workspace (YAML or JSON) using absolute paths; `VolumeFileChecksStorageConfig`: file in a Unity Catalog Volume (YAML or JSON); `TableChecksStorageConfig`: a table; `InstallationChecksStorageConfig`: installation-managed storage backend, using the `checks_location` field from the run configuration. See more details below. | Yes (only with `FileChecksStorageConfig`) | -| `save_checks` | Saves quality rules (checks) to storage backend. Multiple storage backends are supported including tables, files or workspace files, installation-managed targets where the location is inferred automatically from run config. | `checks`: List of checks defined as dictionary; `config`: Configuration for saving checks in a storage backend, i.e. `FileChecksStorageConfig`: file in a local filesystem (YAML or JSON), or workspace files if invoked from Databricks notebook or job; `WorkspaceFileChecksStorageConfig`: file in a workspace (YAML or JSON); `VolumeFileChecksStorageConfig`: file in a Unity Catalog Volume (YAML or JSON); `TableChecksStorageConfig`: a table; `InstallationChecksStorageConfig`: storage defined in the installation context, using the `checks_location` field from the run configuration. See more details below. | Yes (only with `FileChecksStorageConfig`) | -| `save_results_in_table` | Save quality checking results in delta table(s). | `output_df`: (optional) Dataframe containing the output data; `quarantine_df`: (optional) Dataframe containing the output data; `output_config`: `OutputConfig` object with the table name, output mode, and options for the output data; `quarantine_config`: `OutputConfig` object with the table name, output mode, and options for the quarantine data - if provided, data will be split; `run_config_name`: Name of the run config to use; `install_folder`: (optional) installation folder where DQX is installed, only required when custom installation folder is used; `assume_user`: (optional) If True, assume user installation, otherwise global installation (skipped if `install_folder` is provided). | No | +| Method | Description | Arguments | Supports local execution | +| ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | +| `apply_checks` | Applies quality checks to the DataFrame and returns a DataFrame with result columns. | `df`: DataFrame to check; `checks`: List of checks defined using DQX classes, each check is an instance of the DQRule class; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | +| `apply_checks_and_split` | Applies quality checks to the DataFrame and returns valid and invalid (quarantine) DataFrames with result columns. | `df`: DataFrame to check; `checks`: List of checks defined using DQX classes, each check is an instance of the DQRule class; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | +| `apply_checks_and_save_in_table` | Applies quality checks using DQRule objects and writes results to valid and invalid Delta table(s) with result columns. | `input_config`: `InputConfig` object with the table name and options for reading the input data; `checks`: List of checks defined using DQX classes, each check is an instance of the DQRule class; `output_config`: `OutputConfig` object with the table name, output mode, and options for the output data; `quarantine_config`: `OutputConfig` object with the table name, output mode, and options for the quarantine data - if provided, data will be split; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | No | +| `apply_checks_by_metadata` | Applies quality checks defined as a dictionary to the DataFrame and returns a DataFrame with result columns. | `df`: DataFrame to check; `checks`: List of checks defined as dictionary; `custom_check_functions`: (optional) Dictionary with custom check functions (e.g., globals() of the calling module); `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | +| `apply_checks_by_metadata_and_split` | Applies quality checks defined as a dictionary and returns valid and invalid (quarantine) DataFrames. | `df`: DataFrame to check; `checks`: List of checks defined as dictionary; `custom_check_functions`: (optional) Dictionary with custom check functions (e.g., globals() of the calling module); `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | +| `apply_checks_by_metadata_and_save_in_table` | Applies quality checks defined as a dictionary and writes results to valid and invalid Delta table(s) with result columns. | `input_config`: `InputConfig` object with the table name and options for reading the input data; `checks`: List of checks defined as dictionary; `output_config`: `OutputConfig` object with the table name, output mode, and options for the output data; `quarantine_config`: `OutputConfig` object with the table name, output mode, and options for the quarantine data - if provided, data will be split; `custom_check_functions`: (optional) Dictionary with custom check functions; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | No | +| `apply_checks_and_save_in_tables` | Applies quality checks persisted in a storage to multiple tables and writes results to valid and invalid Delta table(s) with result columns. | `run_configs`: list of run config objects (`RunConfig`) containing input config (`InputConfig`), output config (`OutputConfig`), quarantine config (`OutputConfig`, if provided data will be split), and `checks_location`; `custom_check_functions`: (optional) Dictionary with custom check functions; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable; `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores). | No | +| `apply_checks_and_save_in_tables_from_patterns` | Applies quality checks persisted in a storage to multiple tables matching provided wildcard patterns and writes results to valid and invalid Delta table(s) with result columns. | `patterns`: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include (if None, all tables are included); `checks_location`: Location of the checks files (e.g. absolute workspace or volume directory or delta table), for file based locations, checks are expected to be found under `checks_location/input_table>.yml`; `exclude_matched`:(optional) Whether to exclude matched tables (default False); `run_config_template`: (optional) Run configuration template to use for all tables (skip location in the `input_config`, `output_config`, and `quarantine_config` as it is derived from patterns, skip `checks_location` of the run config as it is derived separately, autogenerate `input_config` and `output_config` if not provided; `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores); `output_table_suffix`: (optional) Suffix to append to the output table name; `quarantine_table_suffix`: (optional) Suffix to append to the quarantine table name; `custom_check_functions`: (optional) Dictionary with custom check functions; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | No | +| `validate_checks` | Validates the provided quality checks to ensure they conform to the expected structure and types. | `checks`: List of checks to validate; `custom_check_functions`: (optional) Dictionary of custom check functions that can be used; `validate_custom_check_functions`: (optional) If set to True, validates custom check functions (defaults to True). | Yes | +| `get_invalid` | Retrieves records from the DataFrame that violate data quality checks (records with warnings and errors). | `df`: Input DataFrame. | Yes | +| `get_valid` | Retrieves records from the DataFrame that pass all data quality checks. | `df`: Input DataFrame. | Yes | +| `load_checks` | Loads quality rules (checks) from storage backend. Multiple storage backends are supported including tables, files or workspace files, installation-managed sources where the location is inferred automatically from run config. | `config`: Configuration for loading checks from a storage backend, i.e. `FileChecksStorageConfig`: file in a local filesystem (YAML or JSON), or workspace files if invoked from Databricks notebook or job; `WorkspaceFileChecksStorageConfig`: file in a workspace (YAML or JSON) using absolute paths; `VolumeFileChecksStorageConfig`: file in a Unity Catalog Volume (YAML or JSON); `TableChecksStorageConfig`: a table; `InstallationChecksStorageConfig`: installation-managed storage backend, using the `checks_location` field from the run configuration. See more details below. | Yes (only with `FileChecksStorageConfig`) | +| `save_checks` | Saves quality rules (checks) to storage backend. Multiple storage backends are supported including tables, files or workspace files, installation-managed targets where the location is inferred automatically from run config. | `checks`: List of checks defined as dictionary; `config`: Configuration for saving checks in a storage backend, i.e. `FileChecksStorageConfig`: file in a local filesystem (YAML or JSON), or workspace files if invoked from Databricks notebook or job; `WorkspaceFileChecksStorageConfig`: file in a workspace (YAML or JSON); `VolumeFileChecksStorageConfig`: file in a Unity Catalog Volume (YAML or JSON); `TableChecksStorageConfig`: a table; `InstallationChecksStorageConfig`: storage defined in the installation context, using the `checks_location` field from the run configuration. See more details below. | Yes (only with `FileChecksStorageConfig`) | +| `save_results_in_table` | Save quality checking results in delta table(s). | `output_df`: (optional) Dataframe containing the output data; `quarantine_df`: (optional) Dataframe containing the output data; `output_config`: `OutputConfig` object with the table name, output mode, and options for the output data; `quarantine_config`: `OutputConfig` object with the table name, output mode, and options for the quarantine data - if provided, data will be split; `run_config_name`: Name of the run config to use; `install_folder`: (optional) installation folder where DQX is installed, only required when custom installation folder is used; `assume_user`: (optional) If True, assume user installation, otherwise global installation (skipped if `install_folder` is provided). | No | The 'Supports local execution' in the above table indicates which methods can be used for local testing without a Databricks workspace (see the usage in [local testing section](/docs/reference/testing/#local-execution-and-testing-with-dqengine)). +`RunConfig` support the following parameters: +* `name`: The name of the run config. +* `input_config` (`InputConfig`): Configuration of the input data. +* `output_config` (`OutputConfig`): Configuration of the output data. +* `quarantine_config` (`OutputConfig`): Configuration of the quarantine data (if provided, data will be split). +* `checks_location`: Location of the checks. +* `reference_tables` (`dict[str, InputConfig]`): Reference DataFrames to use in the checks, if applicable (e.g. \{"my_func": "/Workspace/my_repo/my_module.py"\}). +* `custom_check_functions` (`dict[str, str]`): Dictionary of custom check functions that can be used. + `InputConfig` support the following parameters: * `location`: The location of the input data source (e.g. table name or file path). * `format`: The format of the input data (default is `delta`). diff --git a/docs/dqx/docs/reference/profiler.mdx b/docs/dqx/docs/reference/profiler.mdx index 6ec62e2ec..572fa88ff 100644 --- a/docs/dqx/docs/reference/profiler.mdx +++ b/docs/dqx/docs/reference/profiler.mdx @@ -44,7 +44,7 @@ The `DQProfiler` class provides methods to analyze datasets and generate data qu | -------------------------- | --------------------------------------------------------------------------------------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `profile` | Profiles a DataFrame to generate summary statistics and data quality rules. | `df`: DataFrame to profile; `columns`: Optional list of column names to include (default: all columns); `options`: Optional dictionary of profiling options (merged with defaults). | | `profile_table` | Profiles a table to generate summary statistics and data quality rules. | `table`: Fully-qualified table name to profile (e.g. 'catalog.schema.table'); `columns`: Optional list of column names to include (default: all columns); `options`: Optional dictionary of profiling options (merged with default options); | -| `profile_tables` | Profiles multiple tables in Unity Catalog with pattern matching. | `tables`: Optional list of table names to profile; `patterns`: Optional list of wildcard patterns to match tables to profile (either `tables` or `patterns` must be provided); `exclude_matched`: Whether to exclude matched tables (default False); `columns`: Optional dictionary with table names as keys and lists of column names to include as values (default: all columns); `options`: Optional list of dictionaries with table names (or table wildcard patterns) as key and profiling options as values (merged with default options). | +| `profile_tables` | Profiles multiple tables in Unity Catalog with pattern matching. | `patterns`: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include (if None, all tables are included); `exclude_matched`: Whether to exclude matched tables (default False); `columns`: Optional dictionary with table names as keys and lists of column names to include as values (default: all columns); `options`: Optional list of dictionaries with table names (or table wildcard patterns) as key and profiling options as values (merged with default options). |
diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index 34bd563b1..f9837f23c 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -629,7 +629,8 @@ def apply_checks_and_save_in_tables_from_patterns( If True, matched tables are excluded. If False, matched tables are included. run_config_template: Run configuration template to use for all tables. Skip location in the input_config, output_config, and quarantine_config as it is derived from patterns. - Autogenerate input_config and output_config autogenerated if not provided. + Skip checks_location of the run config as it is derived separately. + Autogenerate input_config and output_config if not provided. max_parallelism (int): Maximum number of tables to check in parallel. output_table_suffix (str): Suffix to append to the output table name. quarantine_table_suffix (str): Suffix to append to the quarantine table name. @@ -856,7 +857,7 @@ def _apply_checks_for_run_config( storage_handler, storage_config = self._checks_handler_factory.create_for_location( run_config.checks_location, run_config.name ) - # if checks are not found, return empty list87 + # if checks are not found, return empty list # raise an error if checks location not found checks = storage_handler.load(storage_config) From 023fdd44247277a690f230b4725b67acebbbbc01 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Wed, 24 Sep 2025 15:59:08 +0200 Subject: [PATCH 14/64] refactor --- docs/dqx/docs/guide/quality_checks_apply.mdx | 14 +++++ docs/dqx/docs/reference/engine.mdx | 11 ++-- src/databricks/labs/dqx/engine.py | 34 +++-------- .../test_apply_checks_and_save_in_table.py | 60 +++++++++++++------ 4 files changed, 70 insertions(+), 49 deletions(-) diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index 979cd0923..e1edf6bc4 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -247,6 +247,13 @@ Use explicit configuration for each table: mode="overwrite" ), checks_location=checks_table + + # optional dictionary of reference DataFrames stored in tables/views to use in the checks + #reference_tables={"ref_df_key": InputConfig(location="catalog.ref_schema.reference")}, + + # optional mapping of fully qualified custom check function name to the module location + # (absolute or relative workspace path or volume path) + #custom_check_functions={"custom_check_func": "/Workspace/my_repo/my_module.py"}, ), RunConfig( name=orders_table, @@ -313,6 +320,13 @@ Apply checks on tables using wildcard patterns: # quarantine bad data; location skipped and derived from patterns + quarantine_table_suffix quarantine_config=OutputConfig(location="", mode="overwrite"), # skip checks_location of the run config as it is derived separately + + # optional dictionary of reference DataFrames stored in tables/views to use in the checks + #reference_tables={"ref_df_key": InputConfig(location="catalog.ref_schema.reference")}, + + # optional mapping of fully qualified custom check function name to the module location + # (absolute or relative workspace path or volume path) + #custom_check_functions={"custom_check_func": "/Workspace/my_repo/my_module.py"}, ), output_table_suffix="_checked", # default _dq_output quarantine_table_suffix="_quarantine" # default _dq_quarantine diff --git a/docs/dqx/docs/reference/engine.mdx b/docs/dqx/docs/reference/engine.mdx index 88c9c2be9..74e7f7013 100644 --- a/docs/dqx/docs/reference/engine.mdx +++ b/docs/dqx/docs/reference/engine.mdx @@ -57,8 +57,8 @@ The following table outlines the available methods of the `DQEngine` and their f | `apply_checks_by_metadata` | Applies quality checks defined as a dictionary to the DataFrame and returns a DataFrame with result columns. | `df`: DataFrame to check; `checks`: List of checks defined as dictionary; `custom_check_functions`: (optional) Dictionary with custom check functions (e.g., globals() of the calling module); `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | | `apply_checks_by_metadata_and_split` | Applies quality checks defined as a dictionary and returns valid and invalid (quarantine) DataFrames. | `df`: DataFrame to check; `checks`: List of checks defined as dictionary; `custom_check_functions`: (optional) Dictionary with custom check functions (e.g., globals() of the calling module); `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | | `apply_checks_by_metadata_and_save_in_table` | Applies quality checks defined as a dictionary and writes results to valid and invalid Delta table(s) with result columns. | `input_config`: `InputConfig` object with the table name and options for reading the input data; `checks`: List of checks defined as dictionary; `output_config`: `OutputConfig` object with the table name, output mode, and options for the output data; `quarantine_config`: `OutputConfig` object with the table name, output mode, and options for the quarantine data - if provided, data will be split; `custom_check_functions`: (optional) Dictionary with custom check functions; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | No | -| `apply_checks_and_save_in_tables` | Applies quality checks persisted in a storage to multiple tables and writes results to valid and invalid Delta table(s) with result columns. | `run_configs`: list of run config objects (`RunConfig`) containing input config (`InputConfig`), output config (`OutputConfig`), quarantine config (`OutputConfig`, if provided data will be split), and `checks_location`; `custom_check_functions`: (optional) Dictionary with custom check functions; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable; `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores). | No | -| `apply_checks_and_save_in_tables_from_patterns` | Applies quality checks persisted in a storage to multiple tables matching provided wildcard patterns and writes results to valid and invalid Delta table(s) with result columns. | `patterns`: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include (if None, all tables are included); `checks_location`: Location of the checks files (e.g. absolute workspace or volume directory or delta table), for file based locations, checks are expected to be found under `checks_location/input_table>.yml`; `exclude_matched`:(optional) Whether to exclude matched tables (default False); `run_config_template`: (optional) Run configuration template to use for all tables (skip location in the `input_config`, `output_config`, and `quarantine_config` as it is derived from patterns, skip `checks_location` of the run config as it is derived separately, autogenerate `input_config` and `output_config` if not provided; `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores); `output_table_suffix`: (optional) Suffix to append to the output table name; `quarantine_table_suffix`: (optional) Suffix to append to the quarantine table name; `custom_check_functions`: (optional) Dictionary with custom check functions; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | No | +| `apply_checks_and_save_in_tables` | Applies quality checks persisted in a storage to multiple tables and writes results to valid and invalid Delta table(s) with result columns. | `run_configs`: list of run config objects (`RunConfig`) containing input config (`InputConfig`), output config (`OutputConfig`), quarantine config (`OutputConfig`, if provided data will be split), 'checks_location', and if provided 'reference_tables' and 'custom_check_functions'; `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores). | No | +| `apply_checks_and_save_in_tables_from_patterns` | Applies quality checks persisted in a storage to multiple tables matching provided wildcard patterns and writes results to valid and invalid Delta table(s) with result columns. | `patterns`: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include (if None, all tables are included); `checks_location`: Location of the checks files (e.g. absolute workspace or volume directory or delta table), for file based locations, checks are expected to be found under 'checks_location/<input_table>.yml'; `exclude_matched`:(optional) Whether to exclude matched tables (default False); `run_config_template`: (optional) Run configuration template to use for all tables (skip location in the 'input_config', 'output_config', and 'quarantine_config' fields as it is derived from patterns, skip 'checks_location' of the run config as it is derived separately, autogenerate 'input_config' and 'output_config' if not provided, use 'reference_tables' and 'custom_check_functions' if provided; `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores); `output_table_suffix`: (optional) Suffix to append to the output table name; `quarantine_table_suffix`: (optional) Suffix to append to the quarantine table name; | No | | `validate_checks` | Validates the provided quality checks to ensure they conform to the expected structure and types. | `checks`: List of checks to validate; `custom_check_functions`: (optional) Dictionary of custom check functions that can be used; `validate_custom_check_functions`: (optional) If set to True, validates custom check functions (defaults to True). | Yes | | `get_invalid` | Retrieves records from the DataFrame that violate data quality checks (records with warnings and errors). | `df`: Input DataFrame. | Yes | | `get_valid` | Retrieves records from the DataFrame that pass all data quality checks. | `df`: Input DataFrame. | Yes | @@ -74,8 +74,11 @@ The 'Supports local execution' in the above table indicates which methods can be * `output_config` (`OutputConfig`): Configuration of the output data. * `quarantine_config` (`OutputConfig`): Configuration of the quarantine data (if provided, data will be split). * `checks_location`: Location of the checks. -* `reference_tables` (`dict[str, InputConfig]`): Reference DataFrames to use in the checks, if applicable (e.g. \{"my_func": "/Workspace/my_repo/my_module.py"\}). -* `custom_check_functions` (`dict[str, str]`): Dictionary of custom check functions that can be used. +* `reference_tables` (`dict[str, InputConfig]`): Dictionary of reference DataFrames stored in tables/views to use in the checks. +* `custom_check_functions` (`dict[str, str]`): Mapping of fully qualified custom check function name to the module location, such as: + * absolute workspace path: \{"my_func", e.g. "/Workspace/my_repo/my_module.py"\} + * relative workspace path (installation folder prefix applied), e.g. \{"my_func": "my_module.py"\} + * UC volume path, e.g. \{"my_func": "/Volumes/main/default/my_repo/my_module.py"\} `InputConfig` support the following parameters: * `location`: The location of the input data source (e.g. table name or file path). diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index f9837f23c..f7d7815bd 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -4,12 +4,12 @@ from concurrent import futures from collections.abc import Callable from datetime import datetime -from typing import Any import pyspark.sql.functions as F from pyspark.sql import DataFrame, SparkSession from databricks.labs.dqx.base import DQEngineBase, DQEngineCoreBase +from databricks.labs.dqx.checks_resolver import resolve_custom_check_functions_from_path from databricks.labs.dqx.checks_serializer import deserialize_checks from databricks.labs.dqx.config_loader import RunConfigLoader from databricks.labs.dqx.checks_storage import ( @@ -34,7 +34,7 @@ ) from databricks.labs.dqx.checks_validator import ChecksValidator, ChecksValidationStatus from databricks.labs.dqx.schema import dq_result_schema -from databricks.labs.dqx.io import read_input_data, save_dataframe_as_table, TABLE_PATTERN +from databricks.labs.dqx.io import read_input_data, save_dataframe_as_table, TABLE_PATTERN, get_reference_dataframes from databricks.labs.dqx.utils import list_tables from databricks.labs.dqx.telemetry import telemetry_logger, log_telemetry from databricks.sdk import WorkspaceClient @@ -561,8 +561,6 @@ def apply_checks_by_metadata_and_save_in_table( def apply_checks_and_save_in_tables( self, run_configs: list[RunConfig], - custom_check_functions: dict[str, Any] | None = None, - ref_dfs: dict[str, Any] | None = None, max_parallelism: int | None = os.cpu_count(), ) -> None: """ @@ -578,10 +576,6 @@ def apply_checks_and_save_in_tables( quarantine configs, and a checks file location. max_parallelism (int, optional): Maximum number of tables to check in parallel. Defaults to the number of CPU cores. - custom_check_functions (dict[str, Any], optional): Dictionary with custom check functions - (e.g., *globals()* of the calling module). If not specified, only built-in functions are used - for the checks. - ref_dfs (dict[str, Any], optional): Reference DataFrames to use in the checks, if applicable. Returns: None @@ -589,8 +583,7 @@ def apply_checks_and_save_in_tables( logger.info(f"Applying checks to {len(run_configs)} tables with parallelism {max_parallelism}") with futures.ThreadPoolExecutor(max_workers=max_parallelism) as executor: apply_checks_runs = [ - executor.submit(self._apply_checks_for_run_config, run_config, custom_check_functions, ref_dfs) - for run_config in run_configs + executor.submit(self._apply_checks_for_run_config, run_config) for run_config in run_configs ] for future in futures.as_completed(apply_checks_runs): # Retrieve the result to propagate any exceptions @@ -606,8 +599,6 @@ def apply_checks_and_save_in_tables_from_patterns( max_parallelism: int | None = os.cpu_count(), output_table_suffix: str = "_dq_output", quarantine_table_suffix: str = "_dq_quarantine", - custom_check_functions: dict[str, Any] | None = None, - ref_dfs: dict[str, Any] | None = None, ) -> None: """ Apply data quality checks to tables or views matching a pattern and write the results to output table(s). @@ -634,10 +625,6 @@ def apply_checks_and_save_in_tables_from_patterns( max_parallelism (int): Maximum number of tables to check in parallel. output_table_suffix (str): Suffix to append to the output table name. quarantine_table_suffix (str): Suffix to append to the quarantine table name. - custom_check_functions (dict[str, Callable], optional): Dictionary with custom check functions - (e.g., globals() of the calling module). If not specified, only built-in functions are used - for the checks. - ref_dfs (dict[str, Any], optional): Reference DataFrames to use in the checks, if applicable. Returns: None @@ -672,7 +659,7 @@ def apply_checks_and_save_in_tables_from_patterns( ) run_configs.append(run_config) - self.apply_checks_and_save_in_tables(run_configs, custom_check_functions, ref_dfs, max_parallelism) + self.apply_checks_and_save_in_tables(run_configs, max_parallelism) @staticmethod def validate_checks( @@ -830,12 +817,7 @@ def save_checks(self, checks: list[dict], config: BaseChecksStorageConfig) -> No handler = self._checks_handler_factory.create(config) handler.save(checks, config) - def _apply_checks_for_run_config( - self, - run_config: RunConfig, - custom_check_functions: dict[str, Any] | None = None, - ref_dfs: dict[str, Any] | None = None, - ) -> None: + def _apply_checks_for_run_config(self, run_config: RunConfig) -> None: """ Applies checks based on a given RunConfig. @@ -844,9 +826,6 @@ def _apply_checks_for_run_config( Args: run_config (RunConfig): Specifies the inputs, outputs, and checks file. - custom_check_functions (dict[str, Any], optional): Dictionary with custom check functions - (e.g., globals() of the calling module). If not specified, only built-in functions are used for the checks. - ref_dfs (dict[str, Any], optional): Reference DataFrames to use in the checks, if applicable. """ if not run_config.input_config: raise ValueError("Input configuration not provided") @@ -861,6 +840,9 @@ def _apply_checks_for_run_config( # raise an error if checks location not found checks = storage_handler.load(storage_config) + custom_check_functions = resolve_custom_check_functions_from_path(run_config.custom_check_functions) + ref_dfs = get_reference_dataframes(self.spark, run_config.reference_tables) + self.apply_checks_by_metadata_and_save_in_table( checks=checks, input_config=run_config.input_config, diff --git a/tests/integration/test_apply_checks_and_save_in_table.py b/tests/integration/test_apply_checks_and_save_in_table.py index 5a2712574..4f6e59453 100644 --- a/tests/integration/test_apply_checks_and_save_in_table.py +++ b/tests/integration/test_apply_checks_and_save_in_table.py @@ -1,3 +1,4 @@ +import tempfile import pytest from pyspark.sql.functions import col, lit, when from pyspark.sql import Column @@ -1218,11 +1219,6 @@ def test_apply_checks_and_save_in_tables_with_custom_functions(ws, spark, make_s test_df = spark.createDataFrame([[1, "test"], [2, "custom"]], test_schema) test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) - # Define custom check function - def custom_string_check(column: str) -> Column: - """Custom check function for testing.""" - return when(col(column).contains("custom"), lit("Contains custom text")).otherwise(lit(None)) - # Create metadata checks with custom function checks = [ { @@ -1238,20 +1234,34 @@ def custom_string_check(column: str) -> Column: checks_location = f"{workspace_folder}/{input_table}.yml" engine.save_checks(checks, config=WorkspaceFileChecksStorageConfig(location=checks_location)) + custom_function_content = ''' +from databricks.labs.dqx.check_funcs import make_condition, register_rule +from pyspark.sql import functions as F +from pyspark.sql import Column + +@register_rule("row") +def custom_string_check(column: str) -> Column: + return F.when(F.col(column).contains("custom"), F.lit("Contains custom text")).otherwise(F.lit(None)) + ''' + + # Save the custom function content to a temporary file + with tempfile.NamedTemporaryFile(delete=False, suffix=".py") as temp_file: + temp_file.write(custom_function_content.encode()) + custom_check_function_location = temp_file.name + # Configure table checks run_configs = [ RunConfig( input_config=InputConfig(location=input_table), output_config=OutputConfig(location=output_table, mode="overwrite"), checks_location=checks_location, + custom_check_functions={"custom_string_check": custom_check_function_location}, ) ] # Apply checks and write to table engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) - engine.apply_checks_and_save_in_tables( - run_configs=run_configs, custom_check_functions={"custom_string_check": custom_string_check}, max_parallelism=1 - ) + engine.apply_checks_and_save_in_tables(run_configs=run_configs, max_parallelism=1) # Verify the table was created actual_df = spark.table(output_table) @@ -1292,8 +1302,6 @@ def test_apply_checks_and_save_in_tables_with_ref_df(ws, spark, make_schema, mak test_df = spark.createDataFrame([[1, "test"], [2, "custom"]], test_schema) test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) - ref_dfs = {"ref_df_key": test_df} - # Create checks checks = [ { @@ -1317,12 +1325,13 @@ def test_apply_checks_and_save_in_tables_with_ref_df(ws, spark, make_schema, mak input_config=InputConfig(location=input_table), output_config=OutputConfig(location=output_table, mode="overwrite"), checks_location=checks_location, + reference_tables={"ref_df_key": InputConfig(location=input_table)}, ) ] # Apply checks and write to table engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) - engine.apply_checks_and_save_in_tables(run_configs=run_configs, ref_dfs=ref_dfs, max_parallelism=1) + engine.apply_checks_and_save_in_tables(run_configs=run_configs, max_parallelism=1) # Verify the table was created actual_df = spark.table(output_table) @@ -1832,10 +1841,6 @@ def test_apply_checks_and_save_in_tables_with_patterns_and_custom_functions( test_df = spark.createDataFrame([[1, "test"], [2, "custom"]], test_schema) test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) - def custom_string_check(column: str) -> Column: - """Custom check function for testing.""" - return when(col(column).contains("custom"), lit("Contains custom text")).otherwise(lit(None)) - checks = [ { "name": "custom_string_check", @@ -1849,10 +1854,25 @@ def custom_string_check(column: str) -> Column: checks_location = f"{workspace_folder}/{input_table}.yml" engine.save_checks(checks, config=WorkspaceFileChecksStorageConfig(location=checks_location)) + custom_function_content = ''' +from databricks.labs.dqx.check_funcs import make_condition, register_rule +from pyspark.sql import functions as F +from pyspark.sql import Column + +@register_rule("row") +def custom_string_check(column: str) -> Column: + return F.when(F.col(column).contains("custom"), F.lit("Contains custom text")).otherwise(F.lit(None)) + ''' + + # Save the custom function content to a temporary file + with tempfile.NamedTemporaryFile(delete=False, suffix=".py") as temp_file: + temp_file.write(custom_function_content.encode()) + custom_check_function_location = temp_file.name + engine.apply_checks_and_save_in_tables_from_patterns( patterns=[f"{catalog_name}.{schema.name}.*"], checks_location=workspace_folder, - custom_check_functions={"custom_string_check": custom_string_check}, + run_config_template=RunConfig(custom_check_functions={"custom_string_check": custom_check_function_location}), ) actual_df = spark.table(output_table) @@ -1893,8 +1913,6 @@ def test_apply_checks_and_save_in_tables_with_patterns_and_ref_df(ws, spark, mak test_df = spark.createDataFrame([[1, "test"], [2, "custom"]], test_schema) test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) - ref_dfs = {"ref_df_key": test_df} - checks = [ { "criticality": "error", @@ -1910,8 +1928,12 @@ def test_apply_checks_and_save_in_tables_with_patterns_and_ref_df(ws, spark, mak checks_location = f"{workspace_folder}/{input_table}.yml" engine.save_checks(checks, config=WorkspaceFileChecksStorageConfig(location=checks_location)) + run_config_template = RunConfig(reference_tables={"ref_df_key": InputConfig(location=input_table)}) + engine.apply_checks_and_save_in_tables_from_patterns( - patterns=[f"{catalog_name}.{schema.name}.*"], checks_location=workspace_folder, ref_dfs=ref_dfs + patterns=[f"{catalog_name}.{schema.name}.*"], + checks_location=workspace_folder, + run_config_template=run_config_template, ) actual_df = spark.table(output_table) From b52003cc8a2f3facefe92c079eadb969623976a2 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Thu, 25 Sep 2025 09:24:00 +0200 Subject: [PATCH 15/64] increase random names to 10 to minimize clashes --- tests/e2e/test_run_demos.py | 2 +- tests/integration/conftest.py | 4 +- tests/integration/test_apply_checks.py | 12 +++--- tests/integration/test_dataset_checks.py | 2 +- tests/integration/test_io.py | 14 +++---- .../test_load_checks_from_uc_volume.py | 4 +- tests/integration/test_profiler.py | 40 +++++++++---------- .../test_quality_checker_workflow.py | 2 +- .../test_save_and_load_checks_from_table.py | 16 ++++---- .../integration/test_save_results_in_table.py | 28 ++++++------- tests/integration/test_utils.py | 6 +-- tests/perf/conftest.py | 2 +- 12 files changed, 66 insertions(+), 66 deletions(-) diff --git a/tests/e2e/test_run_demos.py b/tests/e2e/test_run_demos.py index 46e611272..ff0cb8ef7 100644 --- a/tests/e2e/test_run_demos.py +++ b/tests/e2e/test_run_demos.py @@ -236,7 +236,7 @@ def test_run_dqx_demo_asset_bundle(make_schema, make_random, library_ref): path = Path(__file__).parent.parent.parent / "demos" / "dqx_demo_asset_bundle" catalog = "main" schema = make_schema(catalog_name=catalog).name - run_id = make_random(6).lower() + run_id = make_random(10).lower() try: subprocess.run([cli_path, "bundle", "validate"], check=True, capture_output=True, cwd=path) diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 4e36ec60b..74175285d 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -155,7 +155,7 @@ def _setup_workflows_deps( options={"versionAsOf": "0"} if not is_streaming else {}, is_streaming=is_streaming, ) - output_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" run_config.output_config = OutputConfig( location=output_table, trigger={"availableNow": True} if is_streaming else {}, @@ -166,7 +166,7 @@ def _setup_workflows_deps( run_config.checks_location = checks_location if quarantine: - quarantine_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}_quarantine" + quarantine_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}_quarantine" run_config.quarantine_config = OutputConfig( location=quarantine_table, trigger={"availableNow": True} if is_streaming else {}, diff --git a/tests/integration/test_apply_checks.py b/tests/integration/test_apply_checks.py index e5ff31922..518097277 100644 --- a/tests/integration/test_apply_checks.py +++ b/tests/integration/test_apply_checks.py @@ -710,7 +710,7 @@ def test_foreign_key_check_on_tables(ws, spark, make_schema, make_random): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) - ref_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" + ref_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" ref_df.write.saveAsTable(ref_table) ref_df2 = spark.createDataFrame( @@ -723,7 +723,7 @@ def test_foreign_key_check_on_tables(ws, spark, make_schema, make_random): SCHEMA, ) - ref_table2 = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" + ref_table2 = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" ref_df2.write.saveAsTable(ref_table2) checks = [ @@ -4451,8 +4451,8 @@ def test_apply_checks_with_is_unique_nulls_not_distinct(ws, spark, set_utc_timez def test_apply_checks_all_row_checks_as_yaml_with_streaming(ws, make_schema, make_random, make_volume, spark): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - input_table_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" - output_table_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + input_table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" + output_table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" volume = make_volume(catalog_name=catalog_name, schema_name=schema_name) file_path = Path(__file__).parent.parent / "resources" / "all_row_checks.yaml" @@ -4525,7 +4525,7 @@ def test_apply_checks_all_row_checks_as_yaml_with_streaming(ws, make_schema, mak mode="append", trigger={"availableNow": True}, options={ - "checkpointLocation": f"/Volumes/{volume.catalog_name}/{volume.schema_name}/{volume.name}/{make_random(6).lower()}" + "checkpointLocation": f"/Volumes/{volume.catalog_name}/{volume.schema_name}/{volume.name}/{make_random(10).lower()}" }, ), ) @@ -7140,7 +7140,7 @@ def test_compare_datasets_check_missing_records_with_partial_filter( catalog_name = "main" ref_table_schema = make_schema(catalog_name=catalog_name) - ref_table = f"{catalog_name}.{ref_table_schema.name}.{make_random(6).lower()}" + ref_table = f"{catalog_name}.{ref_table_schema.name}.{make_random(10).lower()}" ref_df.write.saveAsTable(ref_table) pk_columns = ["id"] diff --git a/tests/integration/test_dataset_checks.py b/tests/integration/test_dataset_checks.py index c3976acbb..f228516a9 100644 --- a/tests/integration/test_dataset_checks.py +++ b/tests/integration/test_dataset_checks.py @@ -853,7 +853,7 @@ def test_dataset_compare_ref_as_table_and_skip_map_col(spark: SparkSession, set_ catalog_name = "main" ref_table_schema = make_schema(catalog_name=catalog_name) - ref_table = f"{catalog_name}.{ref_table_schema.name}.{make_random(6).lower()}" + ref_table = f"{catalog_name}.{ref_table_schema.name}.{make_random(10).lower()}" df_ref.write.saveAsTable(ref_table) columns = ["id1", "id2"] diff --git a/tests/integration/test_io.py b/tests/integration/test_io.py index d9c1e6e56..c82ad571c 100644 --- a/tests/integration/test_io.py +++ b/tests/integration/test_io.py @@ -45,7 +45,7 @@ def test_read_invalid_input_table(spark): def test_read_input_data_from_table(spark, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - input_location = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + input_location = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" input_config = InputConfig(location=input_location) schema = "a: int, b: int" @@ -59,7 +59,7 @@ def test_read_input_data_from_table(spark, make_schema, make_random): def test_read_input_data_from_table_with_schema_and_spark_options(spark, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - input_location = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + input_location = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" input_format = None input_read_options = {"versionAsOf": "0"} input_schema = "a int, b int" @@ -137,7 +137,7 @@ def test_read_input_data_from_workspace_file_in_csv_format(spark, make_schema, m def test_save_dataframe_as_table(spark, make_schema, make_random): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) - table_name = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" + table_name = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" mode = "overwrite" output_config = OutputConfig(location=table_name, mode=mode) @@ -164,8 +164,8 @@ def test_save_dataframe_as_table(spark, make_schema, make_random): def test_save_streaming_dataframe_in_table(spark, make_schema, make_random, make_volume): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) - table_name = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" - random_name = make_random(6).lower() + table_name = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" + random_name = make_random(10).lower() result_table_name = f"{catalog_name}.{schema.name}.{random_name}" volume = make_volume(catalog_name=catalog_name, schema_name=schema.name) options = {"checkpointLocation": f"/Volumes/{volume.catalog_name}/{volume.schema_name}/{volume.name}/{random_name}"} @@ -197,8 +197,8 @@ def test_save_streaming_dataframe_in_table(spark, make_schema, make_random, make def test_get_reference_dataframes(spark, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - input_location_1 = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" - input_location_2 = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + input_location_1 = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" + input_location_2 = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" schema = "a: int, b: int" input_df_1 = spark.createDataFrame([[1, 2]], schema) diff --git a/tests/integration/test_load_checks_from_uc_volume.py b/tests/integration/test_load_checks_from_uc_volume.py index 81d50a5db..5e9c5368c 100644 --- a/tests/integration/test_load_checks_from_uc_volume.py +++ b/tests/integration/test_load_checks_from_uc_volume.py @@ -33,7 +33,7 @@ def test_load_checks_when_volume_checks_file_missing(ws, make_schema, make_volum def test_load_checks_when_checks_volume_path_missing_schema(ws, make_random, spark): - volume = f"/Volumes/{make_random(6).lower()}" + volume = f"/Volumes/{make_random(10).lower()}" with pytest.raises(BadRequest, match="Invalid path: Path is missing a schema name"): config = VolumeFileChecksStorageConfig(location=volume) @@ -42,7 +42,7 @@ def test_load_checks_when_checks_volume_path_missing_schema(ws, make_random, spa def test_load_checks_when_checks_volume_path_missing_volume_file(ws, make_random, spark): catalog_name = "main" - volume = f"/Volumes/{catalog_name}/{make_random(6).lower()}" + volume = f"/Volumes/{catalog_name}/{make_random(10).lower()}" with pytest.raises(BadRequest, match="Invalid path: Path is missing a volume name"): config = VolumeFileChecksStorageConfig(location=volume) diff --git a/tests/integration/test_profiler.py b/tests/integration/test_profiler.py index 54d324920..a70e15524 100644 --- a/tests/integration/test_profiler.py +++ b/tests/integration/test_profiler.py @@ -555,7 +555,7 @@ def test_profiler_sampling(spark, ws): def test_profile_table(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" input_schema = T.StructType( [ @@ -610,7 +610,7 @@ def test_profile_table(spark, ws, make_schema, make_random): def test_profile_table_non_default_opts(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" input_schema = "category: string, value: int" input_df = spark.createDataFrame( @@ -662,7 +662,7 @@ def test_profile_table_non_default_opts(spark, ws, make_schema, make_random): def test_profile_table_with_column_selection(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" input_schema = "col1: int, col2: string, col3: double, col4: boolean" input_df = spark.createDataFrame( @@ -703,8 +703,8 @@ def test_profile_table_with_column_selection(spark, ws, make_schema, make_random def test_profile_tables(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table1_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" - table2_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" + table2_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" input_schema1 = "col1: int, col2: int, col3: int, col4 int" input_df1 = spark.createDataFrame([[1, 3, 3, 1], [2, None, 4, 1], [1, 2, 3, 4]], input_schema1) @@ -770,9 +770,9 @@ def test_profile_tables(spark, ws, make_schema, make_random): def test_profile_tables_include_patterns(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - known_random = f"_data_{make_random(6).lower()}" - table1_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + known_random - table2_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + known_random = f"_data_{make_random(10).lower()}" + table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" + known_random + table2_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" input_schema1 = "col1: int, col2: int, col3: int, col4 int" input_df1 = spark.createDataFrame([[1, 3, 3, 1], [2, None, 4, 1], [1, 2, 3, 4]], input_schema1) @@ -829,7 +829,7 @@ def test_profile_tables_include_patterns(spark, ws, make_schema, make_random): def test_profile_tables_no_pattern_match(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table1_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" input_schema = "col1: int, col2: string" input_df = spark.createDataFrame([[1, "test"], [2, "data"]], input_schema) @@ -845,8 +845,8 @@ def test_profile_tables_no_pattern_match(spark, ws, make_schema, make_random): def test_profile_tables_with_no_options(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table1_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" - table2_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" + table2_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" input_schema1 = "col1: int, col2: int, col3: int, col4 int" input_df1 = spark.createDataFrame([[1, 3, 3, 1], [2, None, 4, 1], [1, 2, 3, 4]], input_schema1) @@ -871,8 +871,8 @@ def test_profile_tables_with_no_options(spark, ws, make_schema, make_random): def test_profile_tables_with_no_matched_options(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table1_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" - table2_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" + table2_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" input_schema1 = "col1: string, col2: string, col3: string" input_df1 = spark.createDataFrame([["1", None, "3"], ["2", None, "4"], ["1", None, "3"]], input_schema1) @@ -910,8 +910,8 @@ def test_profile_tables_with_no_matched_options(spark, ws, make_schema, make_ran def test_profile_tables_with_common_opts(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table1_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" - table2_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" + table2_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" input_schema = "category: string, value: int" input_df = spark.createDataFrame( @@ -991,7 +991,7 @@ def test_profile_tables_with_common_opts(spark, ws, make_schema, make_random): def test_profile_tables_with_different_opts(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table_prefix = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table_prefix = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" table1_name = f"{table_prefix}_001" table2_name = f"{table_prefix}_002" @@ -1080,8 +1080,8 @@ def test_profile_tables_with_different_opts(spark, ws, make_schema, make_random) def test_profile_tables_with_partial_opts_match(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table1_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}_001" - table2_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}_002" + table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}_001" + table2_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}_002" input_schema = "category: string, value: int" input_df = spark.createDataFrame( @@ -1161,8 +1161,8 @@ def test_profile_tables_with_partial_opts_match(spark, ws, make_schema, make_ran def test_profile_tables_with_selected_columns(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table1_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}_tbl1" - table2_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}_tbl2" + table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}_tbl1" + table2_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}_tbl2" input_schema1 = "col1: int, col2: string, col3: double, col4: boolean" input_df1 = spark.createDataFrame( diff --git a/tests/integration/test_quality_checker_workflow.py b/tests/integration/test_quality_checker_workflow.py index d6bf31827..7eb373a87 100644 --- a/tests/integration/test_quality_checker_workflow.py +++ b/tests/integration/test_quality_checker_workflow.py @@ -253,7 +253,7 @@ def is_not_null_custom_func(column: str): def _setup_ref_table(spark, installation_ctx, make_random, run_config): schema_and_catalog = run_config.input_config.location.split(".") catalog, schema = schema_and_catalog[0], schema_and_catalog[1] - ref_table = f"{catalog}.{schema}.{make_random(6).lower()}" + ref_table = f"{catalog}.{schema}.{make_random(10).lower()}" spark.createDataFrame( [ diff --git a/tests/integration/test_save_and_load_checks_from_table.py b/tests/integration/test_save_and_load_checks_from_table.py index 66fbc8e78..ac865f626 100644 --- a/tests/integration/test_save_and_load_checks_from_table.py +++ b/tests/integration/test_save_and_load_checks_from_table.py @@ -67,7 +67,7 @@ def test_load_checks_when_checks_table_does_not_exist(ws, make_schema, make_random, spark): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" with pytest.raises(NotFound, match=f"Checks table {table_name} does not exist in the workspace"): engine = DQEngine(ws, spark) @@ -78,7 +78,7 @@ def test_load_checks_when_checks_table_does_not_exist(ws, make_schema, make_rand def test_save_and_load_checks_from_table(ws, make_schema, make_random, spark): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" engine = DQEngine(ws, spark) config = TableChecksStorageConfig(location=table_name, run_config_name="default") @@ -90,7 +90,7 @@ def test_save_and_load_checks_from_table(ws, make_schema, make_random, spark): def test_save_checks_to_table_with_unresolved_for_each_column(ws, make_schema, make_random, spark): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" engine = DQEngine(ws, spark) config = TableChecksStorageConfig(location=table_name, run_config_name="default") @@ -150,7 +150,7 @@ def test_save_checks_to_table_with_unresolved_for_each_column(ws, make_schema, m def test_load_checks_from_table_saved_from_dict_with_unresolved_for_each_column(ws, make_schema, make_random, spark): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" input_checks = [ { @@ -256,7 +256,7 @@ def test_load_checks_from_table_saved_from_dict_with_unresolved_for_each_column( def test_load_checks_from_table_with_unresolved_for_each_column(ws, make_schema, make_random, spark): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" input_checks = [ [ @@ -366,7 +366,7 @@ def test_load_checks_from_table_with_unresolved_for_each_column(ws, make_schema, def test_save_and_load_checks_from_table_with_run_config(ws, make_schema, make_random, spark): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" engine = DQEngine(ws, spark) run_config_name = "workflow_001" @@ -393,7 +393,7 @@ def test_save_and_load_checks_from_table_with_run_config(ws, make_schema, make_r def test_save_and_load_checks_to_table_output_modes(ws, make_schema, make_random, spark): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" engine = DQEngine(ws, spark) engine.save_checks(INPUT_CHECKS[:1], config=TableChecksStorageConfig(location=table_name, mode="append")) @@ -408,7 +408,7 @@ def test_save_and_load_checks_to_table_output_modes(ws, make_schema, make_random def test_save_load_checks_from_table_in_user_installation(ws, installation_ctx, make_schema, make_random, spark): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" config = installation_ctx.config run_config = config.get_run_config() diff --git a/tests/integration/test_save_results_in_table.py b/tests/integration/test_save_results_in_table.py index d921996e8..4e3d3128a 100644 --- a/tests/integration/test_save_results_in_table.py +++ b/tests/integration/test_save_results_in_table.py @@ -91,8 +91,8 @@ def test_save_results_in_table_only_quarantine(ws, spark, make_schema, make_rand def test_save_results_in_table_in_user_installation(ws, spark, installation_ctx, make_schema, make_random): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) - output_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" - quarantine_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" + quarantine_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" config = installation_ctx.config run_config = config.get_run_config() @@ -124,7 +124,7 @@ def test_save_results_in_table_in_user_installation(ws, spark, installation_ctx, def test_save_results_in_table_in_user_installation_only_output(ws, spark, installation_ctx, make_schema, make_random): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) - output_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" config = installation_ctx.config run_config = config.get_run_config() @@ -152,7 +152,7 @@ def test_save_results_in_table_in_user_installation_only_quarantine( ): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) - quarantine_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" + quarantine_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" config = installation_ctx.config run_config = config.get_run_config() @@ -180,8 +180,8 @@ def test_save_results_in_table_in_user_installation_output_table_provided( ): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) - output_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" - quarantine_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" + quarantine_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" config = installation_ctx.config run_config = config.get_run_config() @@ -215,8 +215,8 @@ def test_save_results_in_table_in_user_installation_quarantine_table_provided( ): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) - output_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" - quarantine_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" + quarantine_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" config = installation_ctx.config run_config = config.get_run_config() @@ -250,8 +250,8 @@ def test_save_results_in_table_in_user_installation_missing_output_and_quarantin ): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) - output_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" - quarantine_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" + quarantine_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" config = installation_ctx.config run_config = config.get_run_config() @@ -287,8 +287,8 @@ def test_save_results_in_table_in_custom_folder_installation( ): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) - output_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" - quarantine_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" + output_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" + quarantine_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" config = installation_ctx_custom_install_folder.config run_config = config.get_run_config() @@ -322,8 +322,8 @@ def test_save_results_in_table_in_custom_folder_installation( def test_save_streaming_results_in_table(ws, spark, make_schema, make_random, make_volume): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) - input_table = f"{catalog_name}.{schema.name}.{make_random(6).lower()}" - random_name = make_random(6).lower() + input_table = f"{catalog_name}.{schema.name}.{make_random(10).lower()}" + random_name = make_random(10).lower() output_table = f"{catalog_name}.{schema.name}.{random_name}" volume = make_volume(catalog_name=catalog_name, schema_name=schema.name) diff --git a/tests/integration/test_utils.py b/tests/integration/test_utils.py index 5dd1bd60c..4021eeb23 100644 --- a/tests/integration/test_utils.py +++ b/tests/integration/test_utils.py @@ -5,8 +5,8 @@ def test_list_tables(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name - table1_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" - table2_name = f"{catalog_name}.{schema_name}.{make_random(6).lower()}" + table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" + table2_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" input_schema = "col1: int" input_df = spark.createDataFrame([[1]], input_schema) @@ -31,4 +31,4 @@ def test_list_tables(spark, ws, make_schema, make_random): def test_list_tables_no_matching(spark, ws, make_random): with pytest.raises(ValueError, match="No tables found matching include or exclude criteria"): - list_tables(ws, patterns=[f"non_existent_catalog_{make_random(6).lower()}.*"]) + list_tables(ws, patterns=[f"non_existent_catalog_{make_random(10).lower()}.*"]) diff --git a/tests/perf/conftest.py b/tests/perf/conftest.py index 59c160c9b..ca118d7fe 100644 --- a/tests/perf/conftest.py +++ b/tests/perf/conftest.py @@ -78,7 +78,7 @@ def all_dataset_checks(): def table_name(make_schema, make_random): catalog = "main" schema = make_schema(catalog_name=catalog).name - return f"{catalog}.{schema}.{make_random(6).lower()}" + return f"{catalog}.{schema}.{make_random(10).lower()}" @pytest.fixture From 857cc75e2a328b0fe5fa41d954f0cbdaeb88d78a Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Thu, 25 Sep 2025 09:26:11 +0200 Subject: [PATCH 16/64] updated docs --- docs/dqx/docs/guide/quality_checks_apply.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index e1edf6bc4..5d75e5100 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -149,7 +149,7 @@ In the example below, checks are defined in YAML syntax for convenience and then function: regex_match arguments: column: email - pattern: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ + regex: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ """) input_df = spark.read.table("catalog.schema.input") From 1c2ff2a7e61c8917575fe28a73c6fc4ac69a0055 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 26 Sep 2025 11:13:25 +0200 Subject: [PATCH 17/64] Support running workflows for multiple all run configs. Corrected docs for sql expression. --- docs/dqx/docs/guide/data_profiling.mdx | 1 + docs/dqx/docs/guide/quality_checks_apply.mdx | 7 +- docs/dqx/docs/installation.mdx | 2 + docs/dqx/docs/reference/quality_checks.mdx | 2 +- labs.yml | 25 +++--- src/databricks/labs/dqx/check_funcs.py | 4 +- src/databricks/labs/dqx/cli.py | 77 +++++++++++++----- src/databricks/labs/dqx/config.py | 3 + .../labs/dqx/contexts/workflow_context.py | 7 +- src/databricks/labs/dqx/installer/install.py | 9 +-- .../labs/dqx/installer/workflow_installer.py | 8 +- .../labs/dqx/profiler/profiler_workflow.py | 26 +++++- .../labs/dqx/quality_checker/e2e_workflow.py | 24 ++++-- .../quality_checker/quality_checker_runner.py | 55 +++---------- .../quality_checker_workflow.py | 80 +++++++++++-------- tests/conftest.py | 1 - tests/integration/test_installation.py | 1 - 17 files changed, 191 insertions(+), 141 deletions(-) diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index 604fe60b7..fe4733c4d 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -246,6 +246,7 @@ The following fields from the [configuration file](/docs/installation/#configura - `serverless_clusters`: whether to use serverless clusters for running the workflow (default: 'true'). Using serverless clusters is recommended as it allows for automated cluster management and scaling. - `profiler_spark_conf`: (optional) spark configuration to use for the profiler workflow, only applicable if `serverless_clusters` is set to 'false'. - `profiler_override_clusters`: (optional) cluster configuration to use for profiler workflow, only applicable if `serverless_clusters` is set to 'false'. +- `profiler_max_parallelism`: (optional) max parallelism for profiling multiple tables (default: 4) Example of the configuration file (relevant fields only): ```yaml diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index 5d75e5100..fe8d564a0 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -551,7 +551,8 @@ The following fields from the [configuration file](/docs/installation/#configura - `serverless_clusters`: whether to use serverless clusters for running the workflow (default: `true`). Using serverless clusters is recommended as it allows for automated cluster management and scaling. - `quality_checker_spark_conf`: (optional) spark configuration to use for the workflow, only applicable if `serverless_clusters` is set to `false`. - `quality_checker_override_clusters`: optional cluster configuration to use for the workflow, only applicable if `serverless_clusters` is set to `false`. -- `extra_params`: (optional) extra parameters to pass to the jobs such as result column names and user_metadata +- `quality_checker_max_parallelism`: (optional) max parallelism for quality checking multiple tables (default: 4). +- `extra_params`: (optional) extra parameters to pass to the jobs such as result column names and user_metadata. - `custom_check_functions`: (optional) mapping of custom check function name to Python file (module) containing check function definition. - `reference_tables`: (optional) mapping of reference table names to reference table locations. @@ -626,14 +627,16 @@ The following fields from the [configuration file](/docs/installation/#configura - `e2e_override_clusters`: (optional) cluster configuration to use for the e2e workflow, only applicable if `serverless_clusters` is set to `false`. - `quality_checker_spark_conf`: (optional) spark configuration to use for the quality checker workflow, only applicable if `serverless_clusters` is set to `false`. - `quality_checker_override_clusters`: (optional) cluster configuration to use for the quality checker workflow, only applicable if `serverless_clusters` is set to `false`. +- `quality_checker_max_parallelism`: (optional) max parallelism for quality checking multiple tables (default: 4). - `profiler_spark_conf`: (optional) spark configuration to use with the profiler workflow, only applicable if `serverless_clusters` is set to `false`. - `profiler_override_clusters`: (optional) cluster configuration to use for profiler workflow, only applicable if `serverless_clusters` is set to `false`. +- `profiler_max_parallelism`: (optional) max parallelism for profiling multiple tables (default: 4). - `profiler_config`: configuration for the profiler containing: - `summary_stats_file`: relative location within the installation folder of the summary statistics (default: `profile_summary.yml`) - `sample_fraction`: fraction of data to sample for profiling. - `sample_seed`: seed for reproducible sampling. - `limit`: maximum number of records to analyze. -- `extra_params`: (optional) extra parameters to pass to the jobs such as result column names and user_metadata +- `extra_params`: (optional) extra parameters to pass to the jobs such as result column names and user_metadata. - `custom_check_functions`: (optional) custom check functions defined in Python files that can be used in the quality checks. - `reference_tables`: (optional) reference tables that can be used in the quality checks. diff --git a/docs/dqx/docs/installation.mdx b/docs/dqx/docs/installation.mdx index 0b1854f91..967686845 100644 --- a/docs/dqx/docs/installation.mdx +++ b/docs/dqx/docs/installation.mdx @@ -151,11 +151,13 @@ profiler_override_clusters: # <- optional dictionary mapping job cluster default: 0709-132523-cnhxf2p6 # <- existing cluster Id to use profiler_spark_conf: # <- optional spark configuration to use for the profiler workflow spark.sql.ansi.enabled: true # <- example setting +profiler_max_parallelism: 4 # <- max parallelism for profiling multiple tables quality_checker_override_clusters: # <- optional dictionary mapping job cluster names to existing cluster IDs default: 0709-132523-cnhxf2p6 # <- existing cluster Id to use quality_checker_spark_conf: # <- optional spark configuration to use for the quality checker workflow spark.sql.ansi.enabled: true # <- example setting +quality_checker_max_parallelism: 4 # <- max parallelism for quality checking multiple tables e2e_override_clusters: # <- optional dictionary mapping job cluster names to existing cluster IDs default: 0709-132523-cnhxf2p6 # <- existing cluster Id to use diff --git a/docs/dqx/docs/reference/quality_checks.mdx b/docs/dqx/docs/reference/quality_checks.mdx index abcf4d0b8..05ec0de23 100644 --- a/docs/dqx/docs/reference/quality_checks.mdx +++ b/docs/dqx/docs/reference/quality_checks.mdx @@ -45,7 +45,7 @@ You can also define your own custom checks (see [Creating custom checks](#creati | `is_ipv4_address_in_cidr` | Checks whether the values in the input column have valid IPv4 address format and fall within the given CIDR block. | `column`: column to check (can be a string column name or a column expression); `cidr_block`: CIDR block string | | `is_valid_ipv6_address` | Checks whether the values in the input column have valid IPv6 address format. | `column` to check (can be a string column name or a column expression) | | `is_ipv6_address_in_cidr` | Checks whether the values in the input column have valid IPv6 address format and fall within the given CIDR block. | `column`: column to check (can be a string column name or a column expression); `cidr_block`: CIDR block string | -| `sql_expression` | Checks whether the values meet the condition provided as an SQL expression, e.g. `a = 'str1' and a > b`. SQL expressions are evaluated at runtime, so ensure that the expression is safe and that functions used within it (e.g. h3_ischildof, division) do not throw exceptions. You can achieve this by validating input arguments or columns beforehand using guards such as CASE WHEN, IS NOT NULL, RLIKE, or type try casts. | `expression`: sql expression to check on a DataFrame (fail the check if expression evaluates to True, pass if it evaluates to False); `msg`: optional message to output; `name`: optional name of the resulting column (it can be overwritten by `name` specified at the check level); `negate`: if the condition should be negated; `columns`: optional list of columns to be used for reporting and as name prefix if name not provided, unused in the actual logic | +| `sql_expression` | Checks whether the values meet the condition provided as an SQL expression, e.g. `a = 'str1' and a > b`. SQL expressions are evaluated at runtime, so ensure that the expression is safe and that functions used within it (e.g. h3_ischildof, division) do not throw exceptions. You can achieve this by validating input arguments or columns beforehand using guards such as CASE WHEN, IS NOT NULL, RLIKE, or type try casts. | `expression`: sql expression to check on a DataFrame (fail the check if expression evaluates to False, pass if it evaluates to True); `msg`: optional message to output; `name`: optional name of the resulting column (it can be overwritten by `name` specified at the check level); `negate`: if the condition should be negated; `columns`: optional list of columns to be used for reporting and as name prefix if name not provided, unused in the actual logic | | `is_data_fresh` | Checks whether the values in the input timestamp column are not older than the specified number of minutes from the base timestamp column. This is useful for identifying stale data due to delayed pipelines and helps catch upstream issues early. | `column`: column of type timestamp/date to check (can be a string column name or a column expression); `max_age_minutes`: maximum age in minutes before data is considered stale; `base_timestamp`: optional base timestamp column from which the stale check is calculated. This can be a string, column expression, datetime value or literal value ex:F.lit(datetime(2024,1,1)). If not provided current_timestamp() function is used | | `does_not_contain_pii` | Checks whether the values in the input column contain Personally Identifiable Information (PII). Uses Microsoft Presidio to detect various named entities (e.g. PERSON, ADDRESS, EMAIL_ADDRESS). Requires installation of PII detection extras: `pip install 'databricks-labs-dqx[pii-detection]'`. See more details [here](#detecting-personally-identifiable-information-pii). | `column`: column to check (can be a string column name or a column expression); `threshold`: confidence threshold for PII detection (0.0 to 1.0, default: 0.7); `language`: optional language of the text (default: 'en'); `entities`: optional list of entities to detect; `nlp_engine_config`: optional dictionary configuring the NLP engine used for PII detection, see the [Presidio documentation](https://microsoft.github.io/presidio/analyzer/customizing_nlp_models/) for more information | diff --git a/labs.yml b/labs.yml index 449f321c1..d6604eff3 100644 --- a/labs.yml +++ b/labs.yml @@ -10,11 +10,11 @@ entrypoint: src/databricks/labs/dqx/cli.py min_python: 3.10 commands: - name: open-remote-config - description: Opens remote configuration in the browser + description: Opens remote configuration in the browser. - name: open-dashboards - description: Opens remote dashboards directory + description: Opens remote dashboards directory. - name: installations - description: Show installations by different users on the same workspace + description: Show installations by different users on the same workspace. table_template: |- Path\tVersion\Input {{range .}}{{.path}}\t{{.version}}\t{{.input}} @@ -23,36 +23,37 @@ commands: description: Validate checks flags: - name: run-config - description: Run config to use + description: Run config to use. If not provided, run it for all run configs. - name: validate-custom-check-functions - description: Whether to validate custom check functions + description: Whether to validate custom check functions. default: true table_template: |- - {{range .}}{{.error}} + Run Config\tErrors + {{range .}}{{.run_config}}\t{{.error}} {{end}} - name: profile - description: Profile input data and generate quality rule (checks) candidates + description: Profile input data and generate quality rule (checks) candidates. flags: - name: run-config - description: (Optional) Selects run configuration from installation config. If not provided, the "default" run configuration will be used. + description: (Optional) Selects run configuration from installation config. If not provided, run it for all run configurations. - name: timeout-minutes description: The timeout in minutes for the cli to wait for the workflow to complete. - name: apply-checks description: Apply data quality checks to the input data, and save the results to the output table and optionally quarantine table (based on the run config). flags: - name: run-config - description: (Optional) Selects run configuration from installation config. If not provided, the "default" run configuration will be used. + description: (Optional) Selects run configuration from installation config. If not provided, run it for all run configurations. - name: timeout-minutes description: The timeout in minutes for the cli to wait for the workflow to complete. - name: e2e description: Run end to end workflow to profile input data and apply quality checks, and save the results to the output table and optionally quarantine table (based on the run config). flags: - name: run-config - description: (Optional) Selects run configuration from installation config. If not provided, the "default" run configuration will be used. + description: (Optional) Selects run configuration from installation config. If not provided, run it for all run configurations. - name: timeout-minutes description: The timeout in minutes for the cli to wait for the workflow to complete. - name: workflows - description: Show deployed workflows and their latest run state + description: Show deployed workflows and their latest run state. table_template: |- Workflow\tWorkflow ID\tState\tStarted {{range .}}{{.workflow}}\t{{.workflow_id}}\t{{.state}}\t{{.started}} @@ -61,4 +62,4 @@ commands: description: Show logs from the latest job run flags: - name: workflow - description: Name of the workflow to show logs for, e.g. profiler \ No newline at end of file + description: Name of the workflow to show logs for, e.g. profiler. \ No newline at end of file diff --git a/src/databricks/labs/dqx/check_funcs.py b/src/databricks/labs/dqx/check_funcs.py index f11872ab4..941a0018f 100644 --- a/src/databricks/labs/dqx/check_funcs.py +++ b/src/databricks/labs/dqx/check_funcs.py @@ -201,11 +201,11 @@ def sql_expression( """Checks whether the condition provided as an SQL expression is met. Args: - expression: SQL expression. Fail if expression evaluates to True, pass if it evaluates to False. + expression: SQL expression. Fail if expression evaluates to False, pass if it evaluates to True. msg: optional message of the *Column* type, automatically generated if None name: optional name of the resulting column, automatically generated if None negate: if the condition should be negated (true) or not. For example, "col is not null" will mark null - values as "bad". Although sometimes it's easier to specify it other way around "col is null" + negate set to False + values as "bad". Although sometimes it's easier to specify it other way around "col is null" + negate set to True columns: optional list of columns to be used for reporting. Unused in the actual logic. Returns: diff --git a/src/databricks/labs/dqx/cli.py b/src/databricks/labs/dqx/cli.py index 23f28db7d..e91287030 100644 --- a/src/databricks/labs/dqx/cli.py +++ b/src/databricks/labs/dqx/cli.py @@ -8,8 +8,13 @@ from databricks.sdk import WorkspaceClient from databricks.sdk.errors import NotFound -from databricks.labs.dqx.checks_storage import WorkspaceFileChecksStorageHandler -from databricks.labs.dqx.config import WorkspaceConfig, WorkspaceFileChecksStorageConfig +from databricks.labs.dqx.checks_storage import WorkspaceFileChecksStorageHandler, VolumeFileChecksStorageHandler +from databricks.labs.dqx.config import ( + WorkspaceConfig, + WorkspaceFileChecksStorageConfig, + RunConfig, + VolumeFileChecksStorageConfig, +) from databricks.labs.dqx.contexts.workspace_context import WorkspaceContext from databricks.labs.dqx.engine import DQEngine @@ -78,47 +83,79 @@ def installations(w: WorkspaceClient, *, product_name: str = "dqx") -> list[dict def validate_checks( w: WorkspaceClient, *, - run_config: str = "default", + run_config: str = "", validate_custom_check_functions: bool = True, ctx: WorkspaceContext | None = None, ) -> list[dict]: """ - Validate checks stored in the installation directory as a file. + Validate checks stored in a workspace file or volume. Args: w: The WorkspaceClient instance to use for accessing the workspace. - run_config: The name of the run configuration to use. + run_config: The name of the run configuration to use. If not provided, run it for all run configs. validate_custom_check_functions: Whether to validate custom check functions (default is True). ctx: The WorkspaceContext instance to use for accessing the workspace. """ ctx = ctx or WorkspaceContext(w) config = ctx.installation.load(WorkspaceConfig) - checks_location = f"{ctx.installation.install_folder()}/{config.get_run_config(run_config).checks_location}" - # Not using the installation method because loading from a table requires a Spark session, - # which isn't available when the CLI is invoked in the local user context. - checks = WorkspaceFileChecksStorageHandler(w).load( - config=WorkspaceFileChecksStorageConfig(location=checks_location) - ) - status = DQEngine.validate_checks(checks, validate_custom_check_functions=validate_custom_check_functions) errors_list = [] - if status.has_errors: - errors_list = [{"error": error} for error in status.errors] + if run_config: + run_config_obj = config.get_run_config(run_config) + status = _validate_checks(w, ctx, run_config_obj, validate_custom_check_functions) + if status.has_errors: + errors_list = [{"run_config": run_config_obj.name, "error": error} for error in status.errors] + else: + for run_config_obj in config.run_configs: + status = _validate_checks(w, ctx, run_config_obj, validate_custom_check_functions) + if status.has_errors: + errors_list.extend([{"run_config": run_config_obj.name, "error": error} for error in status.errors]) print(json.dumps(errors_list)) return errors_list +def _validate_checks( + w: WorkspaceClient, ctx: WorkspaceContext, run_config: RunConfig, validate_custom_check_functions: bool +): + """ + Validate checks for a given run configuration. + + This handles checks stored in a workspace file or volume. + Table storage is not supported for validation as it requires a Spark session + which is not available when the CLI is invoked in the local user context. + + Args: + w: The WorkspaceClient instance to use for accessing the workspace. + ctx: The WorkspaceContext instance to use for accessing the workspace. + run_config: The run configuration to validate checks for. + validate_custom_check_functions: Whether to validate custom check functions. + """ + checks_location = ( + run_config.checks_location + if run_config.checks_location.startswith("/") + else f"{ctx.installation.install_folder()}/{run_config.checks_location}" + ) + + if checks_location.startswith("/Volumes/"): + checks = VolumeFileChecksStorageHandler(w).load(config=VolumeFileChecksStorageConfig(location=checks_location)) + else: + checks = WorkspaceFileChecksStorageHandler(w).load( + config=WorkspaceFileChecksStorageConfig(location=checks_location) + ) + return DQEngine.validate_checks(checks, validate_custom_check_functions=validate_custom_check_functions) + + @dqx.command def profile( - w: WorkspaceClient, *, run_config: str = "default", timeout_minutes: int = 30, ctx: WorkspaceContext | None = None + w: WorkspaceClient, *, run_config: str = "", timeout_minutes: int = 30, ctx: WorkspaceContext | None = None ) -> None: """ Profile input data and generate quality rule (checks) candidates. Args: w: The WorkspaceClient instance to use for accessing the workspace. - run_config: The name of the run configuration to use. + run_config: The name of the run configuration to use. If not provided, run it for all run configs. timeout_minutes: The timeout for the workflow run in minutes (default is 30). ctx: The WorkspaceContext instance to use for accessing the workspace. """ @@ -129,14 +166,14 @@ def profile( @dqx.command def apply_checks( - w: WorkspaceClient, *, run_config: str = "default", timeout_minutes: int = 30, ctx: WorkspaceContext | None = None + w: WorkspaceClient, *, run_config: str = "", timeout_minutes: int = 30, ctx: WorkspaceContext | None = None ) -> None: """ Apply data quality checks to the input data and save the results. Args: w: The WorkspaceClient instance to use for accessing the workspace. - run_config: The name of the run configuration to use. + run_config: The name of the run configuration to use. If not provided, run it for all run configs. timeout_minutes: The timeout for the workflow run in minutes (default is 30). ctx: The WorkspaceContext instance to use for accessing the workspace. """ @@ -147,7 +184,7 @@ def apply_checks( @dqx.command def e2e( - w: WorkspaceClient, *, run_config: str = "default", timeout_minutes: int = 60, ctx: WorkspaceContext | None = None + w: WorkspaceClient, *, run_config: str = "", timeout_minutes: int = 60, ctx: WorkspaceContext | None = None ) -> None: """ Run end to end workflow to: @@ -157,7 +194,7 @@ def e2e( Args: w: The WorkspaceClient instance to use for accessing the workspace. - run_config: The name of the run configuration to use. + run_config: The name of the run configuration to use. If not provided, run it for all run configs. timeout_minutes: The timeout for the workflow run in minutes (default is 60). ctx: The WorkspaceContext instance to use for accessing the workspace. """ diff --git a/src/databricks/labs/dqx/config.py b/src/databricks/labs/dqx/config.py index d2df13989..da70a96d4 100644 --- a/src/databricks/labs/dqx/config.py +++ b/src/databricks/labs/dqx/config.py @@ -106,6 +106,9 @@ class WorkspaceConfig: quality_checker_spark_conf: dict[str, str] | None = field(default_factory=dict) e2e_spark_conf: dict[str, str] | None = field(default_factory=dict) + profiler_max_parallelism: int = 4 # max parallelism for profiling multiple tables + quality_checker_max_parallelism: int = 4 # max parallelism for quality checking multiple tables + def get_run_config(self, run_config_name: str | None = "default") -> RunConfig: """Get the run configuration for a given run name, or the default configuration if no run name is provided. diff --git a/src/databricks/labs/dqx/contexts/workflow_context.py b/src/databricks/labs/dqx/contexts/workflow_context.py index eba262e11..0237fe6c3 100644 --- a/src/databricks/labs/dqx/contexts/workflow_context.py +++ b/src/databricks/labs/dqx/contexts/workflow_context.py @@ -38,10 +38,15 @@ def spark(self) -> SparkSession: """Returns spark session.""" return SparkSession.builder.getOrCreate() + @cached_property + def run_config_name(self) -> str | None: + """Returns run configuration name.""" + return self.named_parameters.get("run_config_name") + @cached_property def run_config(self) -> RunConfig: """Loads and returns the run configuration.""" - run_config_name = self.named_parameters.get("run_config_name") + run_config_name = self.run_config_name if not run_config_name: raise ValueError("Run config flag is required") return self.config.get_run_config(run_config_name) diff --git a/src/databricks/labs/dqx/installer/install.py b/src/databricks/labs/dqx/installer/install.py index fb4a2239e..b525aa0aa 100644 --- a/src/databricks/labs/dqx/installer/install.py +++ b/src/databricks/labs/dqx/installer/install.py @@ -116,12 +116,8 @@ def run( config = self.configure(default_config) tasks = WorkflowsRunner.all(config).tasks() - # use "default" run config, can be overridden when running the workflow - default_run_config = config.get_run_config() - workflows_deployment = WorkflowDeployment( config, - default_run_config.name, self.installation, self.install_state, self.workspace_client, @@ -288,13 +284,10 @@ def current(cls, ws: WorkspaceClient): installation = product_info.current_installation(ws) install_state = InstallState.from_installation(installation) config = installation.load(WorkspaceConfig) - run_config_name = config.get_run_config().name prompts = Prompts() wheels = WheelsV2(installation, product_info) tasks = WorkflowsRunner.all(config).tasks() - workflow_installer = WorkflowDeployment( - config, run_config_name, installation, install_state, ws, wheels, product_info, tasks - ) + workflow_installer = WorkflowDeployment(config, installation, install_state, ws, wheels, product_info, tasks) warehouse_configurator = WarehouseInstaller(ws, prompts) return cls( diff --git a/src/databricks/labs/dqx/installer/workflow_installer.py b/src/databricks/labs/dqx/installer/workflow_installer.py index cf1e6686a..1a40b87b3 100644 --- a/src/databricks/labs/dqx/installer/workflow_installer.py +++ b/src/databricks/labs/dqx/installer/workflow_installer.py @@ -71,7 +71,7 @@ def __init__(self, ws: WorkspaceClient, install_state: InstallState): def run_workflow( self, workflow: str, - run_config_name: str, + run_config_name: str = "", # run for all defined run configs by default max_wait: timedelta = timedelta(minutes=20), ) -> int: # this dunder variable is hiding this method from tracebacks, making it cleaner @@ -344,7 +344,6 @@ class WorkflowDeployment(InstallationMixin): def __init__( self, config: WorkspaceConfig, - run_config_name: str, installation: Installation, install_state: InstallState, ws: WorkspaceClient, @@ -353,7 +352,6 @@ def __init__( tasks: list[Task], ): self._config = config - self._run_config = self._config.get_run_config(run_config_name) self._installation = installation self._ws = ws self._install_state = install_state @@ -599,7 +597,7 @@ def _add_wheel_task( ) -> jobs.Task: named_parameters = { "config": f"/Workspace{self._config_file}", - "run_config_name": self._run_config.name, + "run_config_name": "", # run for all defined run configs "product_name": self._product_info.product_name(), # non-default product name is used for testing "workflow": workflow, "task": jobs_task.task_key, @@ -641,7 +639,7 @@ def _create_run_job_task(self, task: Task) -> jobs.Task: run_job_task=jobs.RunJobTask( job_id=referenced_job_id, python_named_params={ - "run_config_name": self._run_config.name, + "run_config_name": "", # run for all defined run configs }, ), ) diff --git a/src/databricks/labs/dqx/profiler/profiler_workflow.py b/src/databricks/labs/dqx/profiler/profiler_workflow.py index d52d3cbde..976aa0457 100644 --- a/src/databricks/labs/dqx/profiler/profiler_workflow.py +++ b/src/databricks/labs/dqx/profiler/profiler_workflow.py @@ -1,6 +1,7 @@ import logging +from concurrent import futures -from databricks.labs.dqx.config import InstallationChecksStorageConfig +from databricks.labs.dqx.config import InstallationChecksStorageConfig, RunConfig from databricks.labs.dqx.contexts.workflow_context import WorkflowContext from databricks.labs.dqx.installer.workflow_task import Workflow, workflow_task @@ -15,13 +16,30 @@ def __init__(self, spark_conf: dict[str, str] | None = None, override_clusters: @workflow_task def profile(self, ctx: WorkflowContext): """ - Profile the input data and save the generated checks and profile summary stats. + Profile input data and save the generated checks and profile summary stats. Args: ctx: Runtime context. """ - run_config = ctx.run_config - logger.info(f"Running profiler workflow for run config: {run_config.name}") + if ctx.run_config_name: + self._profile_for_run_config(ctx, ctx.run_config) + else: + logger.info("Running profiler workflow for all run configs") + self._profile_for_run_configs(ctx, ctx.config.run_configs, ctx.config.profiler_max_parallelism) + + def _profile_for_run_configs(self, ctx: WorkflowContext, run_configs: list[RunConfig], max_parallelism: int): + logger.info(f"Profiling {len(run_configs)} tables with parallelism {max_parallelism}") + with futures.ThreadPoolExecutor(max_workers=max_parallelism) as executor: + apply_checks_runs = [ + executor.submit(self._profile_for_run_config, ctx, run_config) for run_config in run_configs + ] + for future in futures.as_completed(apply_checks_runs): + # Retrieve the result to propagate any exceptions + future.result() + + @staticmethod + def _profile_for_run_config(ctx, run_config): + logger.info(f"Running profiler workflow for run config: {ctx.run_config_name}") if not run_config.input_config: raise ValueError("No input data source configured during installation") diff --git a/src/databricks/labs/dqx/quality_checker/e2e_workflow.py b/src/databricks/labs/dqx/quality_checker/e2e_workflow.py index 2c38f4063..f2253b0eb 100644 --- a/src/databricks/labs/dqx/quality_checker/e2e_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/e2e_workflow.py @@ -33,7 +33,7 @@ def prepare(self, ctx: WorkflowContext): Args: ctx (WorkflowContext): Runtime context. """ - logger.info(f"End-to-end: prepare start for run config: {ctx.run_config.name}") + self._log_task_run_info(ctx, "prepare start") @workflow_task(depends_on=[prepare], run_job_name="profiler") def run_profiler(self, ctx: WorkflowContext): @@ -43,8 +43,7 @@ def run_profiler(self, ctx: WorkflowContext): Args: ctx: Runtime context. """ - run_config = ctx.run_config - logger.info(f"End-to-end: starting profiler task for run config: {run_config.name}") + self._log_task_run_info(ctx, "starting profiler task") @workflow_task(depends_on=[run_profiler], run_job_name="quality-checker") def run_quality_checker(self, ctx: WorkflowContext): @@ -54,8 +53,7 @@ def run_quality_checker(self, ctx: WorkflowContext): Args: ctx: Runtime context. """ - run_config = ctx.run_config - logger.info(f"End-to-end: starting quality_checker task for run config: {run_config.name}") + self._log_task_run_info(ctx, "starting quality_checker task") @workflow_task(depends_on=[run_quality_checker]) def finalize(self, ctx: WorkflowContext): @@ -65,5 +63,19 @@ def finalize(self, ctx: WorkflowContext): Args: ctx (WorkflowContext): Runtime context. """ - logger.info(f"End-to-end: finalize complete for run config: {ctx.run_config.name}") + self._log_task_run_info(ctx, "finalize complete") logger.info("For more details please check the run logs of the profiler and quality checker jobs.") + + @staticmethod + def _log_task_run_info(ctx: WorkflowContext, task_name: str): + """ + Log whether the workflow is running for all run configs or a specific run config. + + Args: + ctx (WorkflowContext): Runtime context. + task_name (str): Name of the task being executed. + """ + if ctx.run_config_name: + logger.info(f"End-to-end: {task_name} for run config: {ctx.run_config.name}") + else: + logger.info(f"End-to-end: {task_name} for all run configs") diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py b/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py index 99a58ad92..ee6e219cd 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py @@ -1,10 +1,10 @@ import logging +import os + from pyspark.sql import SparkSession -from databricks.labs.dqx.checks_resolver import resolve_custom_check_functions_from_path -from databricks.labs.dqx.config import InputConfig, OutputConfig +from databricks.labs.dqx.config import RunConfig from databricks.labs.dqx.engine import DQEngine -from databricks.labs.dqx.io import get_reference_dataframes logger = logging.getLogger(__name__) @@ -16,49 +16,14 @@ def __init__(self, spark: SparkSession, dq_engine: DQEngine): self.spark = spark self.dq_engine = dq_engine - def run( - self, - checks: list[dict], - input_config: InputConfig, - output_config: OutputConfig, - quarantine_config: OutputConfig | None, - custom_check_functions: dict[str, str] | None = None, - reference_tables: dict[str, InputConfig] | None = None, - ) -> None: + def run(self, run_configs: list[RunConfig], max_parallelism: int | None = os.cpu_count()) -> None: """ - Run the DQX data quality job on the input data and saves the generated results to delta table(s). + Run the DQX data quality job for the provided run configs. Args: - checks: The data quality checks to apply. - input_config: Input data configuration (e.g. table name or file location, read options). - output_config: Output data configuration (e.g. table name or file location, write options). - quarantine_config: Quarantine data configuration (e.g. table name or file location, write options). - custom_check_functions: A mapping where each key is the name of a function (e.g., "my_func") - and each value is the file path to the Python module that defines it. The path can be absolute - or relative to the installation folder, and may refer to a local filesystem location, a - Databricks workspace path (e.g. /Workspace/my_repo/my_module.py), or a Unity Catalog volume - (e.g. /Volumes/catalog/schema/volume/my_module.py). - reference_tables: Reference tables to use in the checks. + run_configs: List of RunConfig objects containing the configuration for each run. + max_parallelism: Maximum number of parallel runs. Defaults to the number of CPU cores. """ - ref_dfs = get_reference_dataframes(self.spark, reference_tables) - custom_check_functions_resolved = resolve_custom_check_functions_from_path(custom_check_functions) - - logger.info(f"Applying checks to {input_config.location}.") - - self.dq_engine.apply_checks_by_metadata_and_save_in_table( - checks=checks, - input_config=input_config, - output_config=output_config, - quarantine_config=quarantine_config, - custom_check_functions=custom_check_functions_resolved, - ref_dfs=ref_dfs, - ) - - if quarantine_config and quarantine_config.location: - logger.info( - f"Data quality checks applied, " - f"valid data saved to {output_config.location} and " - f"invalid data saved to {quarantine_config.location}." - ) - else: - logger.info(f"Data quality checks applied, output saved to {output_config.location}.") + logger.info("Data quality checker started.") + self.dq_engine.apply_checks_and_save_in_tables(run_configs=run_configs, max_parallelism=max_parallelism) + logger.info("Data quality checker completed.") diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py index a652d4b9d..f6c08a755 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py @@ -1,6 +1,6 @@ import logging -from databricks.labs.dqx.config import InstallationChecksStorageConfig +from databricks.labs.dqx.config import RunConfig from databricks.labs.dqx.contexts.workflow_context import WorkflowContext from databricks.labs.dqx.installer.workflow_task import Workflow, workflow_task @@ -20,34 +20,45 @@ def apply_checks(self, ctx: WorkflowContext): Args: ctx: Runtime context. """ - run_config = ctx.run_config - logger.info(f"Running data quality workflow for run config: {run_config.name}") - - if not run_config.input_config: - raise ValueError("No input data source configured during installation") - - if not run_config.output_config: - raise ValueError("No output storage configured during installation") - - checks = ctx.quality_checker.dq_engine.load_checks( - config=InstallationChecksStorageConfig( - location=run_config.checks_location, - run_config_name=run_config.name, - product_name=ctx.product_info.product_name(), - install_folder=ctx.installation.install_folder(), - ) - ) - - custom_check_functions = self._prefix_custom_check_paths(ctx, run_config.custom_check_functions) - - ctx.quality_checker.run( - checks, - run_config.input_config, - run_config.output_config, - run_config.quarantine_config, - custom_check_functions, - run_config.reference_tables, - ) + if ctx.run_config_name: + logger.info(f"Running data quality workflow for run config: {ctx.run_config_name}") + run_config = self._prepare_run_config(ctx, ctx.run_config) + ctx.quality_checker.run([run_config]) + else: + logger.info("Running data quality workflow for all run configs") + run_configs = [self._prepare_run_config(ctx, run_config) for run_config in ctx.config.run_configs] + ctx.quality_checker.run(run_configs, ctx.config.quality_checker_max_parallelism) + + def _prepare_run_config(self, ctx: WorkflowContext, run_config: RunConfig) -> RunConfig: + """ + Apply common path prefixing to a run configuration in-place and return it. + + Ensures custom check function paths and checks location are absolute in the Databricks Workspace. + + Args: + ctx: Runtime context. + run_config: The run configuration to prepare. + + Returns: + The prepared run configuration with absolute paths. + """ + run_config.custom_check_functions = self._prefix_custom_check_paths(ctx, run_config.custom_check_functions) + run_config.checks_location = self._prefix_checks_location(ctx, run_config.checks_location) + return run_config + + @staticmethod + def _prefix_checks_location(ctx: WorkflowContext, location: str) -> str: + """ + Prefixes the checks location with /Workspace/ if it is not an absolute path. + + Args: + ctx: Runtime context. + location: The location of the checks, either as an absolute path or relative to the installation folder. + + Returns: + The prefixed checks location. + """ + return location if location.startswith("/") else f"/Workspace/{ctx.installation.install_folder()}/{location}" @staticmethod def _prefix_custom_check_paths(ctx: WorkflowContext, custom_check_functions: dict[str, str]) -> dict[str, str]: @@ -55,16 +66,19 @@ def _prefix_custom_check_paths(ctx: WorkflowContext, custom_check_functions: dic Prefixes custom check function paths with the installation folder if they are not absolute paths. Args: - ctx: Installation context. - custom_check_functions: A dictionary mapping function names to their paths. + ctx: Runtime context. + custom_check_functions: A mapping where each key is the name of a function (e.g., "my_func") + and each value is the file path to the Python module that defines it. The path can be absolute + or relative to the installation folder, and may refer to a local filesystem location, a + Databricks workspace path (e.g. /Workspace/my_repo/my_module.py), or a Unity Catalog volume + (e.g. /Volumes/catalog/schema/volume/my_module.py). Returns: A dictionary with function names as keys and prefixed paths as values. """ if custom_check_functions: - install_folder = f"/Workspace/{ctx.installation.install_folder()}" return { - func_name: path if path.startswith("/") else f"{install_folder}/{path}" + func_name: path if path.startswith("/") else f"/Workspace/{ctx.installation.install_folder()}/{path}" for func_name, path in custom_check_functions.items() } return custom_check_functions diff --git a/tests/conftest.py b/tests/conftest.py index 5766c0846..edda96265 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -129,7 +129,6 @@ def tasks(self) -> list[Task]: def workflows_deployment(self) -> WorkflowDeployment: return WorkflowDeployment( self.config, - self.config.get_run_config().name, self.installation, self.install_state, self.workspace_client, diff --git a/tests/integration/test_installation.py b/tests/integration/test_installation.py index b88508a46..05b6514f9 100644 --- a/tests/integration/test_installation.py +++ b/tests/integration/test_installation.py @@ -504,7 +504,6 @@ def test_workflows_deployment_creates_jobs_with_remove_after_tag(): tasks = [Task("workflow", "task", "docs", lambda *_: None)] workflows_deployment = WorkflowDeployment( config, - config.get_run_config().name, mock_installation, install_state, ws, From 5416895885c42a437834f9dcd712ce27cac43ce9 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 26 Sep 2025 11:15:22 +0200 Subject: [PATCH 18/64] Support running workflows for multiple all run configs. Corrected docs for sql expression. --- tests/integration/test_cli.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/tests/integration/test_cli.py b/tests/integration/test_cli.py index e7d97ed80..6b0b64a6b 100644 --- a/tests/integration/test_cli.py +++ b/tests/integration/test_cli.py @@ -245,20 +245,6 @@ def test_quality_checker_no_input_configured(ws, spark, setup_serverless_workflo ) -def test_quality_checker_no_output_config_configured(ws, spark, setup_serverless_workflows): - installation_ctx, run_config = setup_serverless_workflows(checks=True) - - config = installation_ctx.config - run_config = config.get_run_config() - run_config.output_config = None # Simulate no output storage configured - installation_ctx.installation.save(config) - - with pytest.raises(ManyError, match="No output storage configured during installation"): - apply_checks( - installation_ctx.workspace_client, run_config=run_config.name, ctx=installation_ctx.workspace_installer - ) - - def test_e2e_workflow(ws, spark, setup_workflows, caplog): installation_ctx, run_config = setup_workflows() e2e(installation_ctx.workspace_client, run_config=run_config.name, ctx=installation_ctx.workspace_installer) From 04eace23ed0040da5bdfe2c3b75c2822d7fbf192 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 26 Sep 2025 12:31:59 +0200 Subject: [PATCH 19/64] fixed tests updated demo --- demos/dqx_demo_tool.py | 21 ++++++-- src/databricks/labs/dqx/engine.py | 2 +- src/databricks/labs/dqx/utils.py | 2 +- tests/integration/test_e2e_workflow.py | 51 +++++++++++++++++++ tests/integration/test_profiler_runner.py | 4 +- tests/integration/test_profiler_workflow.py | 47 +++++++++++++++++ .../test_quality_checker_workflow.py | 26 ++++++++++ tests/unit/test_utils.py | 2 +- 8 files changed, 145 insertions(+), 10 deletions(-) diff --git a/demos/dqx_demo_tool.py b/demos/dqx_demo_tool.py index bc2ad36d1..ac3bd9fd7 100644 --- a/demos/dqx_demo_tool.py +++ b/demos/dqx_demo_tool.py @@ -7,7 +7,7 @@ # MAGIC # MAGIC Run in your terminal: `databricks labs install dqx` # MAGIC -# MAGIC When prompt provide the following: +# MAGIC When prompt provide the following and leave other options as default: # MAGIC * Input data location: `/databricks-datasets/delta-sharing/samples/nyctaxi_2019` # MAGIC * Input format: `delta` # MAGIC * Output table: valid fully qualified table name (catalog.schema.table when using Unity Catalog or schema.table). The output data will be saved there as part of the demo. @@ -24,6 +24,8 @@ # MAGIC log_level: INFO # MAGIC version: 1 # MAGIC serverless_clusters: true # optional +# MAGIC profiler_max_parallelism: 4 +# MAGIC quality_checker_max_parallelism: 4 # MAGIC run_configs: # MAGIC - name: default # MAGIC checks_location: checks.yml @@ -68,10 +70,13 @@ # MAGIC # MAGIC Run in the terminal: # MAGIC ``` +# MAGIC # run for all configured run configs (default) +# MAGIC databricks labs dqx profile +# MAGIC # or run for a specific run config # MAGIC databricks labs dqx profile --run-config "default" # MAGIC ``` # MAGIC -# MAGIC This will profile the data defined in the `input_config` field of the config. The generated quality rule candidates and summary statistics are saved in the installation folder as per the `checks_location`, `profiler_config` fields. +# MAGIC This will profile the data defined in the `input_config` field of the run config. The generated quality rule candidates and summary statistics are saved in the installation folder as per the `checks_location`, `profiler_config` fields. # COMMAND ---------- @@ -80,20 +85,26 @@ # MAGIC # MAGIC Run in the terminal: # MAGIC ``` +# MAGIC # run for all configured run configs (default) +# MAGIC databricks labs dqx apply-checks +# MAGIC # or run for a specific run config # MAGIC databricks labs dqx apply-checks --run-config "default" # MAGIC ``` # MAGIC -# MAGIC This will apply quality checks defined in the `checks_location` field of the config to the data defined in the `input_config`. The results are written to the output as defined in the `output_config` and `quarantine_config` fields. +# MAGIC This will apply quality checks defined in the `checks_location` field of the run config to the data defined in the `input_config`. The results are written to the output as defined in the `output_config` and `quarantine_config` fields. # COMMAND ---------- # MAGIC %md # MAGIC ### Run end-to-end (e2e) workflow # MAGIC -# MAGIC You can optionally, run both profiler and quality checker in a sequency using the e2e workflow. +# MAGIC You can optionally, run both profiler and quality checker in a sequence using the e2e workflow. # MAGIC # MAGIC Run in the terminal: # MAGIC ``` +# MAGIC # run for all configured run configs (default) +# MAGIC databricks labs dqx e2e +# MAGIC # or run for a specific run config # MAGIC databricks labs dqx e2e --run-config "default" # MAGIC ``` # MAGIC @@ -108,7 +119,7 @@ # MAGIC %md # MAGIC ### Installation of DQX in the Databricks cluster -# MAGIC Once DQX is installed in the workspace, we install it in the DQX library in the cluster. +# MAGIC Once DQX is installed in the workspace as a tool, it must be installed in the cluster. # COMMAND ---------- diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index f7d7815bd..2f71a0f57 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -1,6 +1,6 @@ +import copy import os import logging -import copy from concurrent import futures from collections.abc import Callable from datetime import datetime diff --git a/src/databricks/labs/dqx/utils.py b/src/databricks/labs/dqx/utils.py index 6ebe3402b..042a4932f 100644 --- a/src/databricks/labs/dqx/utils.py +++ b/src/databricks/labs/dqx/utils.py @@ -1,5 +1,5 @@ -import datetime import json +import datetime import logging import re from typing import Any diff --git a/tests/integration/test_e2e_workflow.py b/tests/integration/test_e2e_workflow.py index 29dd4498d..cc107d04c 100644 --- a/tests/integration/test_e2e_workflow.py +++ b/tests/integration/test_e2e_workflow.py @@ -1,3 +1,4 @@ +import copy from databricks.labs.dqx.config import InstallationChecksStorageConfig from databricks.labs.dqx.engine import DQEngine @@ -19,9 +20,58 @@ def test_e2e_workflow(ws, spark, setup_workflows, expected_quality_checking_outp input_df = spark.table(run_config.input_config.location) # this is sanity check only, we cannot predict the exact output as it depends on the generated rules + assert checked_df.count() > 0, "Output table is empty" assert checked_df.count() == input_df.count(), "Output table is empty" +def test_e2e_workflow_for_multiple_run_configs(ws, spark, setup_workflows, expected_quality_checking_output): + installation_ctx, run_config = setup_workflows() + + second_run_config = copy.deepcopy(run_config) + second_run_config.name = "second" + second_run_config.checks_location = "second_checks.yml" + second_run_config.profiler_config.summary_stats_file = "second_profile_summary_stats.yml" + second_run_config.output_config.location = run_config.output_config.location + "_second" + installation_ctx.config.run_configs.append(second_run_config) + + # overwrite config in the installation folder + installation_ctx.installation.save(installation_ctx.config) + + installation_ctx.deployed_workflows.run_workflow("e2e", run_config_name="") + + dq_engine = DQEngine(ws, spark) + + # assert first run config results + config = InstallationChecksStorageConfig( + run_config_name=run_config.name, + assume_user=True, + product_name=installation_ctx.installation.product(), + ) + checks = dq_engine.load_checks(config=config) + assert checks, f"Checks from the {run_config.name} run config were not loaded correctly" + + input_df = spark.table(run_config.input_config.location) + checked_df = spark.table(run_config.output_config.location) + + # this is sanity check only, we cannot predict the exact output as it depends on the generated rules + assert checked_df.count() > 0, f"Output table from the {run_config.name} run config is empty" + assert checked_df.count() == input_df.count(), f"Output table from the {run_config.name} run config is empty" + + # assert second run config results + config = InstallationChecksStorageConfig( + run_config_name=second_run_config.name, + assume_user=True, + product_name=installation_ctx.installation.product(), + ) + checks = dq_engine.load_checks(config=config) + assert checks, f"Checks from the {second_run_config.name} run config were not loaded correctly" + + checked_df = spark.table(second_run_config.output_config.location) + + assert checked_df.count() > 0, f"Output table from the {second_run_config.name} run config is empty" + assert checked_df.count() == input_df.count(), f"Output table from the {second_run_config.name} run config is empty" + + def test_e2e_workflow_serverless(ws, spark, setup_serverless_workflows, expected_quality_checking_output): installation_ctx, run_config = setup_serverless_workflows(quarantine=True) @@ -62,4 +112,5 @@ def test_e2e_workflow_with_custom_install_folder( input_df = spark.table(run_config.input_config.location) # this is sanity check only, we cannot predict the exact output as it depends on the generated rules + assert checked_df.count() > 0, "Output table is empty" assert checked_df.count() == input_df.count(), "Output table is empty" diff --git a/tests/integration/test_profiler_runner.py b/tests/integration/test_profiler_runner.py index 4441ed89b..da244887a 100644 --- a/tests/integration/test_profiler_runner.py +++ b/tests/integration/test_profiler_runner.py @@ -82,7 +82,7 @@ def test_profiler_workflow_class(ws, spark, setup_workflows): installation_ctx, run_config = setup_workflows() sys.modules["pyspark.sql.session"] = spark - ctx = installation_ctx.replace(run_config=run_config) + ctx = installation_ctx.replace(run_config_name=run_config.name) ProfilerWorkflow().profile(ctx) # type: ignore @@ -100,7 +100,7 @@ def test_profiler_workflow_class_serverless(ws, spark, setup_serverless_workflow installation_ctx, run_config = setup_serverless_workflows() sys.modules["pyspark.sql.session"] = spark - ctx = installation_ctx.replace(run_config=run_config) + ctx = installation_ctx.replace(run_config_name=run_config.name) ProfilerWorkflow().profile(ctx) # type: ignore diff --git a/tests/integration/test_profiler_workflow.py b/tests/integration/test_profiler_workflow.py index cb426bce3..5893dfa22 100644 --- a/tests/integration/test_profiler_workflow.py +++ b/tests/integration/test_profiler_workflow.py @@ -1,3 +1,4 @@ +import copy from datetime import timedelta import pytest @@ -103,3 +104,49 @@ def test_profiler_workflow_with_custom_install_folder(ws, spark, setup_workflows install_folder = installation_ctx.installation.install_folder() status = ws.workspace.get_status(f"{install_folder}/{run_config.profiler_config.summary_stats_file}") assert status, f"Profile summary stats file {run_config.profiler_config.summary_stats_file} does not exist." + + +def test_profiler_workflow_for_multiple_run_configs(ws, spark, setup_workflows): + installation_ctx, run_config = setup_workflows() + + second_run_config = copy.deepcopy(run_config) + second_run_config.name = "second" + second_run_config.checks_location = "second_checks.yml" + second_run_config.profiler_config.summary_stats_file = "second_profile_summary_stats.yml" + installation_ctx.config.run_configs.append(second_run_config) + + # overwrite config in the installation folder + installation_ctx.installation.save(installation_ctx.config) + + # run workflow + installation_ctx.deployed_workflows.run_workflow("profiler", run_config_name="") + + dq_engine = DQEngine(ws, spark) + + # assert first run config results + config = InstallationChecksStorageConfig( + run_config_name=run_config.name, + assume_user=True, + product_name=installation_ctx.installation.product(), + ) + + checks = dq_engine.load_checks(config=config) + assert checks, f"Checks from the {run_config.name} run config were not loaded correctly" + + install_folder = installation_ctx.installation.install_folder() + status = ws.workspace.get_status(f"{install_folder}/{run_config.profiler_config.summary_stats_file}") + assert status, f"Profile summary stats file {run_config.profiler_config.summary_stats_file} does not exist." + + # assert second run config results + config = InstallationChecksStorageConfig( + run_config_name=second_run_config.name, + assume_user=True, + product_name=installation_ctx.installation.product(), + ) + + checks = dq_engine.load_checks(config=config) + assert checks, f"Checks from the {second_run_config.name} run config were not loaded correctly" + + install_folder = installation_ctx.installation.install_folder() + status = ws.workspace.get_status(f"{install_folder}/{second_run_config.profiler_config.summary_stats_file}") + assert status, f"Profile summary stats file {second_run_config.profiler_config.summary_stats_file} does not exist." diff --git a/tests/integration/test_quality_checker_workflow.py b/tests/integration/test_quality_checker_workflow.py index 7eb373a87..bae1ff767 100644 --- a/tests/integration/test_quality_checker_workflow.py +++ b/tests/integration/test_quality_checker_workflow.py @@ -1,3 +1,4 @@ +import copy from io import BytesIO import pytest @@ -20,6 +21,31 @@ def test_quality_checker_workflow(ws, spark, setup_workflows, expected_quality_c assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) +def test_quality_checker_workflow_for_multiple_run_configs( + ws, spark, setup_workflows, expected_quality_checking_output +): + installation_ctx, run_config = setup_workflows(checks=True) + + second_run_config = copy.deepcopy(run_config) + second_run_config.name = "second" + # use the same checks but different output location + second_run_config.output_config.location = run_config.output_config.location + "_second" + installation_ctx.config.run_configs.append(second_run_config) + + # overwrite config in the installation folder + installation_ctx.installation.save(installation_ctx.config) + + # run workflow + installation_ctx.deployed_workflows.run_workflow("quality-checker", run_config_name="") + + # assert results + checked_df = spark.table(run_config.output_config.location) + assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + checked_df = spark.table(second_run_config.output_config.location) + assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + def test_quality_checker_workflow_serverless(ws, spark, setup_serverless_workflows, expected_quality_checking_output): installation_ctx, run_config = setup_serverless_workflows(checks=True) diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index f589e47d1..1307bee7a 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -5,6 +5,7 @@ import pytest from pyspark.sql import Column +from databricks.labs.dqx.io import read_input_data, get_reference_dataframes from databricks.labs.dqx.utils import ( get_column_name_or_alias, is_sql_query_safe, @@ -14,7 +15,6 @@ is_simple_column_expression, normalize_bound_args, ) -from databricks.labs.dqx.io import read_input_data, get_reference_dataframes from databricks.labs.dqx.config import InputConfig From ebc36ebed027e16362e3af7b8a399c700451ed84 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 26 Sep 2025 13:26:20 +0200 Subject: [PATCH 20/64] refactor --- .../labs/dqx/quality_checker/quality_checker_workflow.py | 9 ++++++--- tests/integration/test_profiler_workflow.py | 8 ++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py index f6c08a755..f48124e4a 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py @@ -42,6 +42,9 @@ def _prepare_run_config(self, ctx: WorkflowContext, run_config: RunConfig) -> Ru Returns: The prepared run configuration with absolute paths. """ + if not run_config.input_config: + raise ValueError("No input data source configured during installation") + run_config.custom_check_functions = self._prefix_custom_check_paths(ctx, run_config.custom_check_functions) run_config.checks_location = self._prefix_checks_location(ctx, run_config.checks_location) return run_config @@ -49,7 +52,7 @@ def _prepare_run_config(self, ctx: WorkflowContext, run_config: RunConfig) -> Ru @staticmethod def _prefix_checks_location(ctx: WorkflowContext, location: str) -> str: """ - Prefixes the checks location with /Workspace/ if it is not an absolute path. + Prefixes the checks location installation folder if it is not an absolute path. Args: ctx: Runtime context. @@ -58,7 +61,7 @@ def _prefix_checks_location(ctx: WorkflowContext, location: str) -> str: Returns: The prefixed checks location. """ - return location if location.startswith("/") else f"/Workspace/{ctx.installation.install_folder()}/{location}" + return location if location.startswith("/") else f"{ctx.installation.install_folder()}/{location}" @staticmethod def _prefix_custom_check_paths(ctx: WorkflowContext, custom_check_functions: dict[str, str]) -> dict[str, str]: @@ -78,7 +81,7 @@ def _prefix_custom_check_paths(ctx: WorkflowContext, custom_check_functions: dic """ if custom_check_functions: return { - func_name: path if path.startswith("/") else f"/Workspace/{ctx.installation.install_folder()}/{path}" + func_name: path if path.startswith("/") else f"/Workspace{ctx.installation.install_folder()}/{path}" for func_name, path in custom_check_functions.items() } return custom_check_functions diff --git a/tests/integration/test_profiler_workflow.py b/tests/integration/test_profiler_workflow.py index 5893dfa22..166978d0a 100644 --- a/tests/integration/test_profiler_workflow.py +++ b/tests/integration/test_profiler_workflow.py @@ -124,13 +124,13 @@ def test_profiler_workflow_for_multiple_run_configs(ws, spark, setup_workflows): dq_engine = DQEngine(ws, spark) # assert first run config results - config = InstallationChecksStorageConfig( + storage_config = InstallationChecksStorageConfig( run_config_name=run_config.name, assume_user=True, product_name=installation_ctx.installation.product(), ) - checks = dq_engine.load_checks(config=config) + checks = dq_engine.load_checks(config=storage_config) assert checks, f"Checks from the {run_config.name} run config were not loaded correctly" install_folder = installation_ctx.installation.install_folder() @@ -138,13 +138,13 @@ def test_profiler_workflow_for_multiple_run_configs(ws, spark, setup_workflows): assert status, f"Profile summary stats file {run_config.profiler_config.summary_stats_file} does not exist." # assert second run config results - config = InstallationChecksStorageConfig( + storage_config = InstallationChecksStorageConfig( run_config_name=second_run_config.name, assume_user=True, product_name=installation_ctx.installation.product(), ) - checks = dq_engine.load_checks(config=config) + checks = dq_engine.load_checks(config=storage_config) assert checks, f"Checks from the {second_run_config.name} run config were not loaded correctly" install_folder = installation_ctx.installation.install_folder() From f172cd61a3f54404713ea64c7749bff8690067db Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 26 Sep 2025 15:52:29 +0200 Subject: [PATCH 21/64] updated docs --- docs/dqx/docs/guide/data_profiling.mdx | 10 ++++++- docs/dqx/docs/guide/index.mdx | 14 ++++----- docs/dqx/docs/guide/quality_checks_apply.mdx | 29 +++++++++++++++---- .../docs/guide/quality_checks_definition.mdx | 8 +++-- .../dqx/docs/guide/quality_checks_storage.mdx | 6 ++-- 5 files changed, 48 insertions(+), 19 deletions(-) diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index fe4733c4d..1079c6590 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -218,10 +218,17 @@ Profiling is typically done as a one-time action for the input dataset to discov You can run the profiler workflow from Databricks UI or by using Databricks CLI: ```commandline +# run for all defined run configs +databricks labs dqx profile + +# run for specific run config databricks labs dqx profile --run-config "default" ``` You can also provide `--timeout-minutes` option. +By default, running the profiler workflow from the Databricks UI executes it across all defined run configurations. +To run the workflow for a specific configuration, update the `run_config_name` field in the job settings. + Execution logs from the profiler are printed in the console and saved in the installation folder. You can display the logs from the latest profiler workflow run by executing: ```commandline @@ -250,7 +257,8 @@ The following fields from the [configuration file](/docs/installation/#configura Example of the configuration file (relevant fields only): ```yaml - serverless_clusters: true # default is true, set to false to use standard clusters + serverless_clusters: true # default is true, set to false to use standard clusters + profiler_max_parallelism: 4 # <- max parallelism for profiling multiple tables run_configs: - name: default checks_location: catalog.table.checks # can be a table or file diff --git a/docs/dqx/docs/guide/index.mdx b/docs/dqx/docs/guide/index.mdx index 8a1ead03a..3d315bffa 100644 --- a/docs/dqx/docs/guide/index.mdx +++ b/docs/dqx/docs/guide/index.mdx @@ -26,12 +26,12 @@ For more details, see the [Installation Guide](/docs/installation/). **Integration options:** -| Task | Integration with processing pipelines | Execution | Description | -|-------------------------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Profiling and quality checks generation** | Programmatic approach (Code-level integration) | Use methods of `DQXProfiler` and `DQGenerator` or `DQDltGenerator` classes. | Profile input data and generate quality rules candidates. `DQEngine` can be used to save the generated checks to a storage. For more details, see the [Profiling Guide](/docs/guide/data_profiling/#programmatic-approach). | -| **Profiling and quality checks generation** | No-code approach (Workflow). Requires installation as a workspace tool. | Use `profiler` workflow (triggered from Databricks CLI or Databricks UI). | Profile input data and generate quality rules candidates. Input data and quality checks storage configured in the [configuration file](/docs/installation/#configuration-file). For more details, see the [Profiling Guide](/docs/guide/data_profiling/#no-code-approach-profiler-workflow). | -| **Quality Checking** | Programmatic approach (Code-level integration) | Use methods of `DQEngine` class. | Offers loading checks from various storage backends, applying quality checks, saving results, as well as end-to-end methods running all the steps in a single method call (load checks > apply checks > save results). For more details, see the [Applying Checks Guide](/docs/guide/quality_checks_apply/). | -| **Quality Checking** | No-code approach (Workflow). Requires installation as a workspace tool. | Use `quality-checker` and `e2e` workflows (triggered from Databricks CLI or Databricks UI). | Offers quality checker workflow (load checks > apply checks > save results) and e2e (end-to-end) workflow (profile input data and generate quality checks > apply checks > save results). Input and output data, and quality checks storage configured in the [configuration file](/docs/installation/#configuration-file). For more details, see the [Applying Checks Guide](/docs/guide/quality_checks_apply/#no-code-approach-workflows). | +| Task | Integration with processing pipelines | Execution | Description | +|-------------------------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Profiling and quality checks generation** | Programmatic approach (Code-level integration) | Use methods of `DQXProfiler` and `DQGenerator` or `DQDltGenerator` classes. | Profile input data and generate quality rules candidates. `DQEngine` can be used to save the generated checks to a storage. For more details, see the [Profiling Guide](/docs/guide/data_profiling/#programmatic-approach). | +| **Profiling and quality checks generation** | No-code approach (Workflow). Requires installation as a workspace tool. | Use `profiler` workflow (triggered from Databricks CLI or Databricks UI). | Profile input data and generate quality rules candidates. Input data and quality checks storage configured in the [configuration file](/docs/installation/#configuration-file). By default, the workflow runs for all defined run configs, but it can be parameterized to target a specific run config. For more details, see the [Profiling Guide](/docs/guide/data_profiling/#no-code-approach-profiler-workflow). | +| **Quality Checking** | Programmatic approach (Code-level integration) | Use methods of `DQEngine` class. | Offers loading checks from various storage backends, applying quality checks, saving results, as well as end-to-end methods running all the steps in a single method call (load checks > apply checks > save results). For more details, see the [Applying Checks Guide](/docs/guide/quality_checks_apply/). | +| **Quality Checking** | No-code approach (Workflow). Requires installation as a workspace tool. | Use `quality-checker` and `e2e` workflows (triggered from Databricks CLI or Databricks UI). | Offers quality checker workflow (load checks > apply checks > save results) and e2e (end-to-end) workflow (profile input data and generate quality checks > apply checks > save results). Input and output data, and quality checks storage configured in the [configuration file](/docs/installation/#configuration-file). By default, the workflow runs for all defined run configs, but it can be parameterized to target a specific run config. For more details, see the [Applying Checks Guide](/docs/guide/quality_checks_apply/#no-code-approach-workflows). | The no-code approach using Workflows will be preferred for less technical users wanting to run quality checks on existing data stored in tables. It provides a user-friendly interface to execute quality checks without needing to write any code. The code-level approach is more flexible and allows for more complex scenarios, such as integrating quality checks directly into data processing pipelines. @@ -39,7 +39,7 @@ The code-level approach is more flexible and allows for more complex scenarios, ## Defining quality rules (checks) Quality rules can be defined in the following ways: -- As YAML or JSON files stored locally, in a Databricks workspace, or in a Unity Catalog volume, or as rows stored in a table. See more details in [Quality Checks Storage Guide](/docs/guide/quality_checks_storage). +- As YAML or JSON files stored locally, in a Databricks Workspace, or in a Unity Catalog Volume, or as rows stored in a table. See more details in [Quality Checks Storage Guide](/docs/guide/quality_checks_storage). - Programmatically as a list of dictionary objects (can also be loaded from YAML or JSON definitions). - Programmatically as a list of `DQRule` objects. diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index fe8d564a0..22eea4509 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -252,7 +252,7 @@ Use explicit configuration for each table: #reference_tables={"ref_df_key": InputConfig(location="catalog.ref_schema.reference")}, # optional mapping of fully qualified custom check function name to the module location - # (absolute or relative workspace path or volume path) + # (absolute or relative Workspace path or Volume path) #custom_check_functions={"custom_check_func": "/Workspace/my_repo/my_module.py"}, ), RunConfig( @@ -325,7 +325,7 @@ Apply checks on tables using wildcard patterns: #reference_tables={"ref_df_key": InputConfig(location="catalog.ref_schema.reference")}, # optional mapping of fully qualified custom check function name to the module location - # (absolute or relative workspace path or volume path) + # (absolute or relative Workspace path or Volume path) #custom_check_functions={"custom_check_func": "/Workspace/my_repo/my_module.py"}, ), output_table_suffix="_checked", # default _dq_output @@ -533,10 +533,17 @@ Quality checker workflow performs the following: To run the workflows manually, you can use Databricks UI or Databricks CLI: ```commandline +# run for all defined run configs +databricks labs dqx apply-checks + +# run for specific run config databricks labs dqx apply-checks --run-config "default" ``` You can also provide `--timeout-minutes` option. +By default, running the quality checker workflow from the Databricks UI executes it across all defined run configurations. +To run the workflow for a specific configuration, update the `run_config_name` field in the job settings. + Execution logs are printed in the console and saved in the installation folder. You can display the logs from the latest run by executing the following command: ```commandline @@ -558,7 +565,8 @@ The following fields from the [configuration file](/docs/installation/#configura Example of the configuration file (relevant fields only): ```yaml - serverless_clusters: true # default is true, set to false to use standard clusters + serverless_clusters: true # default is true, set to false to use standard clusters + quality_checker_max_parallelism: 4 # <- max parallelism for quality checking multiple tables run_configs: - name: default checks_location: catalog.table.checks # can be a table or file @@ -583,7 +591,7 @@ Example of the configuration file (relevant fields only): custom_check_functions: # optional my_func: custom_checks/my_funcs.py # relative workspace path (installation folder prefix applied) my_other: /Workspace/Shared/MyApp/my_funcs.py # absolute workspace path - email_mask: /Volumes/main/dqx_utils/custom/email.py # UC volume path + email_mask: /Volumes/main/dqx_utils/custom/email.py # UC Volume path reference_tables: # optional reference_vendor: input_config: @@ -604,10 +612,17 @@ End-to-end (e2e) workflow performs the following: To run the workflows manually, you can use Databricks UI or Databricks CLI: ```commandline +# run for all defined run configs +databricks labs dqx e2e + +# run for specific run config databricks labs dqx e2e --run-config "default" ``` You can also provide `--timeout-minutes` option. +By default, running the e2e workflow from the Databricks UI executes it across all defined run configurations. +To run the workflow for a specific configuration, update the `run_config_name` field in the job settings. + Execution logs are printed in the console and saved in the installation folder. You can display the logs from the latest run by executing the following command: ```commandline @@ -642,7 +657,9 @@ The following fields from the [configuration file](/docs/installation/#configura Example of the configuration file (relevant fields only): ```yaml - serverless_clusters: true # default is true, set to false to use standard clusters + serverless_clusters: true # default is true, set to false to use standard clusters + profiler_max_parallelism: 4 # <- max parallelism for profiling multiple tables + quality_checker_max_parallelism: 4 # <- max parallelism for quality checking multiple tables run_configs: - name: default checks_location: catalog.table.checks # can be a table or file @@ -671,7 +688,7 @@ Example of the configuration file (relevant fields only): custom_check_functions: # optional my_func: custom_checks/my_funcs.py # relative workspace path (installation folder prefix applied) my_other: /Workspace/Shared/MyApp/my_funcs.py # absolute workspace path - email_mask: /Volumes/main/dqx_utils/custom/email.py # UC volume path + email_mask: /Volumes/main/dqx_utils/custom/email.py # UC Volume path reference_tables: # optional reference_vendor: input_config: diff --git a/docs/dqx/docs/guide/quality_checks_definition.mdx b/docs/dqx/docs/guide/quality_checks_definition.mdx index 78ec8206b..72b02cae7 100644 --- a/docs/dqx/docs/guide/quality_checks_definition.mdx +++ b/docs/dqx/docs/guide/quality_checks_definition.mdx @@ -605,10 +605,14 @@ When checks are defined programmatically with DQX classes, syntax validation is For checks defined in storage, you can use the Databricks CLI to validate them. - This requires the DQX to be installed in the workspace as a tool. - Execute the following command to validate the checks: + This requires the DQX to be installed in the workspace as a tool. Checks defined as workspace or Volume file are supported. + Execute the following command to validate the checks: ```commandline + # run for all defined run configs + databricks labs dqx validate-checks + + # run for specific run config databricks labs dqx validate-checks --run-config "default" ``` diff --git a/docs/dqx/docs/guide/quality_checks_storage.mdx b/docs/dqx/docs/guide/quality_checks_storage.mdx index f9d5a2142..58fc63988 100644 --- a/docs/dqx/docs/guide/quality_checks_storage.mdx +++ b/docs/dqx/docs/guide/quality_checks_storage.mdx @@ -20,7 +20,7 @@ Saving and loading methods accept a storage backend configuration as input. The * `location`: table fully qualified name. * `run_config_name`: (optional) run configuration name to load (use "default" if not provided). * `mode`: (optional) write mode for saving checks (`overwrite` or `append`, default is `overwrite`). The `overwrite` mode will only replace checks for the specific run config and not all checks in the table. -* `VolumeFileChecksStorageConfig`: Unity Catalog volumes (JSON/YAML file). Containing fields: +* `VolumeFileChecksStorageConfig`: Unity Catalog Volume (JSON/YAML file). Containing fields: * `location`: Unity Catalog Volume file path (JSON or YAML). * `InstallationChecksStorageConfig`: installation-managed location from the run config, ignores location and infers it from `checks_location` in the run config. Containing fields: * `location` (optional): automatically set based on the `checks_location` field from the run configuration. @@ -78,7 +78,7 @@ If you create checks as a list of `DQRule` objects, you can convert them to meta # save checks in a Delta table with specific run config for filtering (overwrite checks) dq_engine.save_checks(checks, config=TableChecksStorageConfig(location="catalog.schema.checks_table", run_config_name="workflow_001", mode="overwrite")) - # save checks as a YAML in a Unity Catalog volume location (overwrite the file) + # save checks as a YAML in a Unity Catalog Volume location (overwrite the file) dq_engine.save_checks(checks, config=VolumeFileChecksStorageConfig(location="/Volumes/dq/config/checks_volume/App1/checks.yml")) # save checks as a YAML file or table defined in 'checks_location' of the run config @@ -213,7 +213,7 @@ If you create checks as a list of DQRule objects, you can convert them using the # load checks from a Delta table with specific run config for filtering checks: list[dict] = dq_engine.load_checks(config=TableChecksStorageConfig(location="catalog.schema.checks_table", run_config_name="workflow_001")) - # load checks from a Unity Catalog volume + # load checks from a Unity Catalog Volume checks: list[dict] = dq_engine.load_checks(config=VolumeFileChecksStorageConfig(location="/Volumes/dq/config/checks_volume/App1/checks.yml")) # load checks from a file or table defined in the run config ('checks_location' field) From 6b36ca3b617fa071bdf6fe9b8250c6d3bc9f5eb5 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 26 Sep 2025 15:56:19 +0200 Subject: [PATCH 22/64] updated docs --- docs/dqx/docs/guide/data_profiling.mdx | 4 ++-- docs/dqx/docs/guide/quality_checks_apply.mdx | 8 ++++---- docs/dqx/docs/guide/quality_checks_definition.mdx | 4 ++-- src/databricks/labs/dqx/installer/workflow_installer.py | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index 1079c6590..1b63cf6bf 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -218,10 +218,10 @@ Profiling is typically done as a one-time action for the input dataset to discov You can run the profiler workflow from Databricks UI or by using Databricks CLI: ```commandline -# run for all defined run configs +# run for all run configs databricks labs dqx profile -# run for specific run config +# run for a specific run config databricks labs dqx profile --run-config "default" ``` You can also provide `--timeout-minutes` option. diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index 22eea4509..fae23c432 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -533,10 +533,10 @@ Quality checker workflow performs the following: To run the workflows manually, you can use Databricks UI or Databricks CLI: ```commandline -# run for all defined run configs +# run for all run configs databricks labs dqx apply-checks -# run for specific run config +# run for a specific run config databricks labs dqx apply-checks --run-config "default" ``` You can also provide `--timeout-minutes` option. @@ -612,10 +612,10 @@ End-to-end (e2e) workflow performs the following: To run the workflows manually, you can use Databricks UI or Databricks CLI: ```commandline -# run for all defined run configs +# run for all run configs databricks labs dqx e2e -# run for specific run config +# run for a specific run config databricks labs dqx e2e --run-config "default" ``` You can also provide `--timeout-minutes` option. diff --git a/docs/dqx/docs/guide/quality_checks_definition.mdx b/docs/dqx/docs/guide/quality_checks_definition.mdx index 72b02cae7..5ce963c6a 100644 --- a/docs/dqx/docs/guide/quality_checks_definition.mdx +++ b/docs/dqx/docs/guide/quality_checks_definition.mdx @@ -609,10 +609,10 @@ When checks are defined programmatically with DQX classes, syntax validation is Execute the following command to validate the checks: ```commandline - # run for all defined run configs + # run for all run configs databricks labs dqx validate-checks - # run for specific run config + # run for a specific run config databricks labs dqx validate-checks --run-config "default" ``` diff --git a/src/databricks/labs/dqx/installer/workflow_installer.py b/src/databricks/labs/dqx/installer/workflow_installer.py index 1a40b87b3..2dd3a216f 100644 --- a/src/databricks/labs/dqx/installer/workflow_installer.py +++ b/src/databricks/labs/dqx/installer/workflow_installer.py @@ -71,7 +71,7 @@ def __init__(self, ws: WorkspaceClient, install_state: InstallState): def run_workflow( self, workflow: str, - run_config_name: str = "", # run for all defined run configs by default + run_config_name: str = "", # run for all run configs by default max_wait: timedelta = timedelta(minutes=20), ) -> int: # this dunder variable is hiding this method from tracebacks, making it cleaner @@ -597,7 +597,7 @@ def _add_wheel_task( ) -> jobs.Task: named_parameters = { "config": f"/Workspace{self._config_file}", - "run_config_name": "", # run for all defined run configs + "run_config_name": "", # run for all run configs by default "product_name": self._product_info.product_name(), # non-default product name is used for testing "workflow": workflow, "task": jobs_task.task_key, @@ -639,7 +639,7 @@ def _create_run_job_task(self, task: Task) -> jobs.Task: run_job_task=jobs.RunJobTask( job_id=referenced_job_id, python_named_params={ - "run_config_name": "", # run for all defined run configs + "run_config_name": "", # run for all run configs by default }, ), ) From 7f67d53053608c0b2fcd4fabd9f129a17c2deb36 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 26 Sep 2025 15:57:15 +0200 Subject: [PATCH 23/64] updated docs --- docs/dqx/docs/guide/data_profiling.mdx | 2 +- docs/dqx/docs/guide/quality_checks_apply.mdx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index 1b63cf6bf..b0f35ef64 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -227,7 +227,7 @@ databricks labs dqx profile --run-config "default" You can also provide `--timeout-minutes` option. By default, running the profiler workflow from the Databricks UI executes it across all defined run configurations. -To run the workflow for a specific configuration, update the `run_config_name` field in the job settings. +To run the workflow for a specific configuration, update the `run_config_name` parameter in the job settings. Execution logs from the profiler are printed in the console and saved in the installation folder. You can display the logs from the latest profiler workflow run by executing: diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index fae23c432..851a7e215 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -542,7 +542,7 @@ databricks labs dqx apply-checks --run-config "default" You can also provide `--timeout-minutes` option. By default, running the quality checker workflow from the Databricks UI executes it across all defined run configurations. -To run the workflow for a specific configuration, update the `run_config_name` field in the job settings. +To run the workflow for a specific configuration, update the `run_config_name` parameter in the job settings. Execution logs are printed in the console and saved in the installation folder. You can display the logs from the latest run by executing the following command: @@ -621,7 +621,7 @@ databricks labs dqx e2e --run-config "default" You can also provide `--timeout-minutes` option. By default, running the e2e workflow from the Databricks UI executes it across all defined run configurations. -To run the workflow for a specific configuration, update the `run_config_name` field in the job settings. +To run the workflow for a specific configuration, update the `run_config_name` parameter in the job settings. Execution logs are printed in the console and saved in the installation folder. You can display the logs from the latest run by executing the following command: From 31ca824881e543d7a7046c247d987096862a8b3f Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Sat, 27 Sep 2025 11:18:55 +0200 Subject: [PATCH 24/64] updated docs --- demos/dqx_multi_table_demo.py | 4 +- docs/dqx/docs/guide/data_profiling.mdx | 4 + docs/dqx/docs/guide/quality_checks_apply.mdx | 14 ++- docs/dqx/docs/reference/cli.mdx | 29 ++++- docs/dqx/docs/reference/engine.mdx | 2 +- docs/dqx/docs/reference/profiler.mdx | 10 +- labs.yml | 6 ++ src/databricks/labs/dqx/cli.py | 36 +++++-- .../labs/dqx/contexts/workflow_context.py | 5 + src/databricks/labs/dqx/engine.py | 4 +- .../labs/dqx/installer/workflow_installer.py | 10 +- src/databricks/labs/dqx/profiler/profiler.py | 12 ++- .../labs/dqx/profiler/profiler_runner.py | 86 +++++++++++++-- .../labs/dqx/profiler/profiler_workflow.py | 34 +++--- .../labs/dqx/quality_checker/e2e_workflow.py | 6 +- .../quality_checker/quality_checker_runner.py | 21 ++++ .../quality_checker_workflow.py | 26 ++++- .../test_apply_checks_and_save_in_table.py | 30 +++--- tests/integration/test_profiler_runner.py | 25 ----- tests/integration/test_profiler_workflow.py | 86 ++++++++++++++- .../test_quality_checker_workflow.py | 102 +++++++++++++++++- 21 files changed, 452 insertions(+), 100 deletions(-) diff --git a/demos/dqx_multi_table_demo.py b/demos/dqx_multi_table_demo.py index f98c5f532..dc280f9c6 100644 --- a/demos/dqx_multi_table_demo.py +++ b/demos/dqx_multi_table_demo.py @@ -174,7 +174,7 @@ # COMMAND ---------- # Apply checks to multiple tables using patterns -dq_engine.apply_checks_and_save_in_tables_from_patterns( +dq_engine.apply_checks_and_save_in_tables_for_patterns( patterns=[f"{demo_catalog_name}.{demo_schema_name}.users*"], # apply quality checks for all tables matching the pattern, can use wildcards checks_location=checks_table, # run config of the saved checks name must be equal to the input table name run_config_template=RunConfig( @@ -244,7 +244,7 @@ # Apply checks on multiple tables using patterns -dq_engine.apply_checks_and_save_in_tables_from_patterns( +dq_engine.apply_checks_and_save_in_tables_for_patterns( patterns=patterns, checks_location=checks_table, output_table_suffix="_checked", diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index b0f35ef64..88b5545ed 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -223,11 +223,15 @@ databricks labs dqx profile # run for a specific run config databricks labs dqx profile --run-config "default" + +# run for wildcard patterns (use run config as a template for all fields except location) +databricks labs dqx profile --run-config "default" --patterns "main.product001.*;main.product002" ``` You can also provide `--timeout-minutes` option. By default, running the profiler workflow from the Databricks UI executes it across all defined run configurations. To run the workflow for a specific configuration, update the `run_config_name` parameter in the job settings. +To run the workflow for all tables/views matching wildcard patterns, update the `patterns` parameter in the job settings. Execution logs from the profiler are printed in the console and saved in the installation folder. You can display the logs from the latest profiler workflow run by executing: diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index 851a7e215..bd4fe6c01 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -199,7 +199,7 @@ For details on each check, please refer to the documentation [here](/docs/refere Applying checks on multiple tables can be performed by executing the same methods as described above in a loop. However, DQX provides a convenient method to handle multiple tables in a single method call. -Use `apply_checks_and_save_in_tables` or `apply_checks_and_save_in_tables_from_patterns` to perform end-to-end quality checking for multiple tables. +Use `apply_checks_and_save_in_tables` or `apply_checks_and_save_in_tables_for_patterns` to perform end-to-end quality checking for multiple tables. Use explicit configuration for each table: @@ -303,13 +303,13 @@ Apply checks on tables using wildcard patterns: dq_engine.save_checks(checks, config=TableChecksStorageConfig(location=checks_table, run_config_name=table, mode="overwrite")) # Apply checks on multiple tables using patterns - dq_engine.apply_checks_and_save_in_tables_from_patterns( + dq_engine.apply_checks_and_save_in_tables_for_patterns( patterns=patterns, checks_location=checks_table, # run config of the saved checks name must be equal to the input table name ) # Apply checks on multiple tables using patterns and prefilled run config parameters - dq_engine.apply_checks_and_save_in_tables_from_patterns( + dq_engine.apply_checks_and_save_in_tables_for_patterns( patterns=patterns, checks_location=checks_table, run_config_template=RunConfig( @@ -538,11 +538,15 @@ databricks labs dqx apply-checks # run for a specific run config databricks labs dqx apply-checks --run-config "default" + +# run for tables/views matching wildcard patterns (use run config as a template for all fields except location) +databricks labs dqx apply-checks --run-config "default" --patterns "main.product001.*;main.product002" ``` You can also provide `--timeout-minutes` option. By default, running the quality checker workflow from the Databricks UI executes it across all defined run configurations. To run the workflow for a specific configuration, update the `run_config_name` parameter in the job settings. +To run the workflow for all tables/views matching wildcard patterns, update the `patterns` parameter in the job settings. Execution logs are printed in the console and saved in the installation folder. You can display the logs from the latest run by executing the following command: @@ -617,11 +621,15 @@ databricks labs dqx e2e # run for a specific run config databricks labs dqx e2e --run-config "default" + +# run for tables/views matching wildcard patterns (use run config as a template for all fields except location) +databricks labs dqx e2e --run-config "default" --patterns "main.product001.*;main.product002" ``` You can also provide `--timeout-minutes` option. By default, running the e2e workflow from the Databricks UI executes it across all defined run configurations. To run the workflow for a specific configuration, update the `run_config_name` parameter in the job settings. +To run the workflow for all tables/views matching wildcard patterns, update the `patterns` parameter in the job settings. Execution logs are printed in the console and saved in the installation folder. You can display the logs from the latest run by executing the following command: diff --git a/docs/dqx/docs/reference/cli.mdx b/docs/dqx/docs/reference/cli.mdx index 5c885c4f7..dd49c850b 100644 --- a/docs/dqx/docs/reference/cli.mdx +++ b/docs/dqx/docs/reference/cli.mdx @@ -52,20 +52,41 @@ databricks labs dqx logs --workflow quality-checker ## Running workflows ```bash -# Run profiler: profile data and generate quality check candidates +# Run profiler for all run configs: profile data and generate quality check candidates +databricks labs dqx profile --timeout-minutes 20 + +# Run profiler for a single run config: profile data and generate quality check candidates databricks labs dqx profile --run-config default --timeout-minutes 20 -# Run quality checker: apply quality checks and write results and optionally quarantine +# Run profiler for for wildcard patterns: profile all tables/views matching pattern and use run config as a template for all fields except location +databricks labs dqx profile --run-config "default" --patterns "main.product001.*;main.product002" --timeout-minutes 20 + +# Run quality checker for all run configs: apply quality checks and write results and optionally quarantine +databricks labs dqx apply-checks --timeout-minutes 20 + +# Run quality checker for a single run config: apply quality checks and write results and optionally quarantine databricks labs dqx apply-checks --run-config default --timeout-minutes 20 -# Run e2e (end-to-end) workflows: profile data > generate quality checks > apply checks > write results and optionally quarantine +# Run quality checker for tables/views matching wildcard patterns (use run config as a template for all fields except location) +databricks labs dqx apply-checks --run-config "default" --patterns "main.product001.*;main.product002" --timeout-minutes 20 + +# Run e2e (end-to-end) workflows for all run configs: profile data > generate quality checks > apply checks > write results and optionally quarantine +databricks labs dqx e2e --timeout-minutes 20 + +# Run e2e (end-to-end) workflows for a single run config: profile data > generate quality checks > apply checks > write results and optionally quarantine databricks labs dqx e2e --run-config default --timeout-minutes 20 + +# Run e2e (end-to-end) workflows for tables/views matching wildcard patterns (use run config as a template for all fields except location) +databricks labs dqx e2e --run-config "default" --patterns "main.product001.*;main.product002" --timeout-minutes 20 ``` ## Validating checks ```bash -# Validate checks stored in the installation (file/workspace file/table/volume per config) +# Validate checks stored in the installation (defined in `checks_location`) for a single run config: +databricks labs dqx validate-checks + +# Validate checks stored in the installation (defined in `checks_location`) for all run configs: databricks labs dqx validate-checks --run-config default ``` diff --git a/docs/dqx/docs/reference/engine.mdx b/docs/dqx/docs/reference/engine.mdx index 74e7f7013..fa3ba43cb 100644 --- a/docs/dqx/docs/reference/engine.mdx +++ b/docs/dqx/docs/reference/engine.mdx @@ -58,7 +58,7 @@ The following table outlines the available methods of the `DQEngine` and their f | `apply_checks_by_metadata_and_split` | Applies quality checks defined as a dictionary and returns valid and invalid (quarantine) DataFrames. | `df`: DataFrame to check; `checks`: List of checks defined as dictionary; `custom_check_functions`: (optional) Dictionary with custom check functions (e.g., globals() of the calling module); `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | | `apply_checks_by_metadata_and_save_in_table` | Applies quality checks defined as a dictionary and writes results to valid and invalid Delta table(s) with result columns. | `input_config`: `InputConfig` object with the table name and options for reading the input data; `checks`: List of checks defined as dictionary; `output_config`: `OutputConfig` object with the table name, output mode, and options for the output data; `quarantine_config`: `OutputConfig` object with the table name, output mode, and options for the quarantine data - if provided, data will be split; `custom_check_functions`: (optional) Dictionary with custom check functions; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | No | | `apply_checks_and_save_in_tables` | Applies quality checks persisted in a storage to multiple tables and writes results to valid and invalid Delta table(s) with result columns. | `run_configs`: list of run config objects (`RunConfig`) containing input config (`InputConfig`), output config (`OutputConfig`), quarantine config (`OutputConfig`, if provided data will be split), 'checks_location', and if provided 'reference_tables' and 'custom_check_functions'; `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores). | No | -| `apply_checks_and_save_in_tables_from_patterns` | Applies quality checks persisted in a storage to multiple tables matching provided wildcard patterns and writes results to valid and invalid Delta table(s) with result columns. | `patterns`: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include (if None, all tables are included); `checks_location`: Location of the checks files (e.g. absolute workspace or volume directory or delta table), for file based locations, checks are expected to be found under 'checks_location/<input_table>.yml'; `exclude_matched`:(optional) Whether to exclude matched tables (default False); `run_config_template`: (optional) Run configuration template to use for all tables (skip location in the 'input_config', 'output_config', and 'quarantine_config' fields as it is derived from patterns, skip 'checks_location' of the run config as it is derived separately, autogenerate 'input_config' and 'output_config' if not provided, use 'reference_tables' and 'custom_check_functions' if provided; `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores); `output_table_suffix`: (optional) Suffix to append to the output table name; `quarantine_table_suffix`: (optional) Suffix to append to the quarantine table name; | No | +| `apply_checks_and_save_in_tables_for_patterns` | Applies quality checks persisted in a storage to multiple tables matching provided wildcard patterns and writes results to valid and invalid Delta table(s) with result columns. | `patterns`: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include (if None, all tables are included); `checks_location`: Location of the checks files (e.g. absolute workspace or volume directory or delta table), for file based locations, checks are expected to be found under 'checks_location/<input_table>.yml'; `exclude_matched`:(optional) Whether to exclude matched tables (default False); `run_config_template`: (optional) Run configuration template to use for all tables (skip location in the 'input_config', 'output_config', and 'quarantine_config' fields as it is derived from patterns, skip 'checks_location' of the run config as it is derived separately, autogenerate 'input_config' and 'output_config' if not provided, use 'reference_tables' and 'custom_check_functions' if provided; `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores); `output_table_suffix`: (optional) Suffix to append to the output table name; `quarantine_table_suffix`: (optional) Suffix to append to the quarantine table name; | No | | `validate_checks` | Validates the provided quality checks to ensure they conform to the expected structure and types. | `checks`: List of checks to validate; `custom_check_functions`: (optional) Dictionary of custom check functions that can be used; `validate_custom_check_functions`: (optional) If set to True, validates custom check functions (defaults to True). | Yes | | `get_invalid` | Retrieves records from the DataFrame that violate data quality checks (records with warnings and errors). | `df`: Input DataFrame. | Yes | | `get_valid` | Retrieves records from the DataFrame that pass all data quality checks. | `df`: Input DataFrame. | Yes | diff --git a/docs/dqx/docs/reference/profiler.mdx b/docs/dqx/docs/reference/profiler.mdx index 572fa88ff..ae038edad 100644 --- a/docs/dqx/docs/reference/profiler.mdx +++ b/docs/dqx/docs/reference/profiler.mdx @@ -40,11 +40,11 @@ The `DQProfiler` class provides methods to analyze datasets and generate data qu
**Available DQProfiler methods** -| Method | Description | Arguments | -| -------------------------- | --------------------------------------------------------------------------------------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `profile` | Profiles a DataFrame to generate summary statistics and data quality rules. | `df`: DataFrame to profile; `columns`: Optional list of column names to include (default: all columns); `options`: Optional dictionary of profiling options (merged with defaults). | -| `profile_table` | Profiles a table to generate summary statistics and data quality rules. | `table`: Fully-qualified table name to profile (e.g. 'catalog.schema.table'); `columns`: Optional list of column names to include (default: all columns); `options`: Optional dictionary of profiling options (merged with default options); | -| `profile_tables` | Profiles multiple tables in Unity Catalog with pattern matching. | `patterns`: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include (if None, all tables are included); `exclude_matched`: Whether to exclude matched tables (default False); `columns`: Optional dictionary with table names as keys and lists of column names to include as values (default: all columns); `options`: Optional list of dictionaries with table names (or table wildcard patterns) as key and profiling options as values (merged with default options). | +| Method | Description | Arguments | +| -------------------------- | --------------------------------------------------------------------------------------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `profile` | Profiles a DataFrame to generate summary statistics and data quality rules. | `df`: DataFrame to profile; `columns`: Optional list of column names to include (default: all columns); `options`: Optional dictionary of profiling options (merged with defaults). | +| `profile_table` | Profiles a table to generate summary statistics and data quality rules. | `table`: Fully-qualified table name to profile (e.g. 'catalog.schema.table'); `columns`: Optional list of column names to include (default: all columns); `options`: Optional dictionary of profiling options (merged with default options); | +| `profile_tables` | Profiles multiple tables in Unity Catalog with pattern matching. | `patterns`: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include (if None, all tables are included); `exclude_matched`: Whether to exclude matched tables (default False); `columns`: Optional dictionary with table names as keys and lists of column names to include as values (default: all columns); `options`: Optional list of dictionaries with table names (or table wildcard patterns) as key and profiling options as values (merged with default options); `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores). |
diff --git a/labs.yml b/labs.yml index d6604eff3..5f42d9c98 100644 --- a/labs.yml +++ b/labs.yml @@ -36,6 +36,8 @@ commands: flags: - name: run-config description: (Optional) Selects run configuration from installation config. If not provided, run it for all run configurations. + - name: patterns + description: (Optional) Comma separated list of location patterns to profile. If provided, location fields in the run config are ignored. Requires a run config to be provided which is used as a template for other fields. - name: timeout-minutes description: The timeout in minutes for the cli to wait for the workflow to complete. - name: apply-checks @@ -43,6 +45,8 @@ commands: flags: - name: run-config description: (Optional) Selects run configuration from installation config. If not provided, run it for all run configurations. + - name: patterns + description: (Optional) Comma separated list of location patterns to use. If provided, location fields in the run config are ignored. Requires a run config to be provided which is used as a template for other fields. - name: timeout-minutes description: The timeout in minutes for the cli to wait for the workflow to complete. - name: e2e @@ -50,6 +54,8 @@ commands: flags: - name: run-config description: (Optional) Selects run configuration from installation config. If not provided, run it for all run configurations. + - name: patterns + description: (Optional) Comma separated list of location patterns to use. If provided, location fields in the run config are ignored. Requires a run config to be provided which is used as a template for other fields. - name: timeout-minutes description: The timeout in minutes for the cli to wait for the workflow to complete. - name: workflows diff --git a/src/databricks/labs/dqx/cli.py b/src/databricks/labs/dqx/cli.py index e91287030..c0564431c 100644 --- a/src/databricks/labs/dqx/cli.py +++ b/src/databricks/labs/dqx/cli.py @@ -148,7 +148,12 @@ def _validate_checks( @dqx.command def profile( - w: WorkspaceClient, *, run_config: str = "", timeout_minutes: int = 30, ctx: WorkspaceContext | None = None + w: WorkspaceClient, + *, + run_config: str = "", + patterns: str = "", + timeout_minutes: int = 30, + ctx: WorkspaceContext | None = None, ) -> None: """ Profile input data and generate quality rule (checks) candidates. @@ -156,17 +161,25 @@ def profile( Args: w: The WorkspaceClient instance to use for accessing the workspace. run_config: The name of the run configuration to use. If not provided, run it for all run configs. + patterns: Semicolon-separated list of location patterns (with wildcards) to profile. + If provided, location fields in the run config are ignored. + Requires a run config to be provided which is used as a template for other fields. timeout_minutes: The timeout for the workflow run in minutes (default is 30). ctx: The WorkspaceContext instance to use for accessing the workspace. """ timeout = timedelta(minutes=timeout_minutes) ctx = ctx or WorkspaceContext(w) - ctx.deployed_workflows.run_workflow("profiler", run_config, timeout) + ctx.deployed_workflows.run_workflow("profiler", run_config, patterns, timeout) @dqx.command def apply_checks( - w: WorkspaceClient, *, run_config: str = "", timeout_minutes: int = 30, ctx: WorkspaceContext | None = None + w: WorkspaceClient, + *, + run_config: str = "", + patterns: str = "", + timeout_minutes: int = 30, + ctx: WorkspaceContext | None = None, ) -> None: """ Apply data quality checks to the input data and save the results. @@ -174,17 +187,25 @@ def apply_checks( Args: w: The WorkspaceClient instance to use for accessing the workspace. run_config: The name of the run configuration to use. If not provided, run it for all run configs. + patterns: Semicolon-separated list of location patterns (with wildcards) to profile. + If provided, location fields in the run config are ignored. + Requires a run config to be provided which is used as a template for other fields. timeout_minutes: The timeout for the workflow run in minutes (default is 30). ctx: The WorkspaceContext instance to use for accessing the workspace. """ timeout = timedelta(minutes=timeout_minutes) ctx = ctx or WorkspaceContext(w) - ctx.deployed_workflows.run_workflow("quality-checker", run_config, timeout) + ctx.deployed_workflows.run_workflow("quality-checker", run_config, patterns, timeout) @dqx.command def e2e( - w: WorkspaceClient, *, run_config: str = "", timeout_minutes: int = 60, ctx: WorkspaceContext | None = None + w: WorkspaceClient, + *, + run_config: str = "", + patterns: str = "", + timeout_minutes: int = 60, + ctx: WorkspaceContext | None = None, ) -> None: """ Run end to end workflow to: @@ -195,12 +216,15 @@ def e2e( Args: w: The WorkspaceClient instance to use for accessing the workspace. run_config: The name of the run configuration to use. If not provided, run it for all run configs. + patterns: Semicolon-separated list of location patterns (with wildcards) to profile. + If provided, location fields in the run config are ignored. + Requires a run config to be provided which is used as a template for other fields. timeout_minutes: The timeout for the workflow run in minutes (default is 60). ctx: The WorkspaceContext instance to use for accessing the workspace. """ timeout = timedelta(minutes=timeout_minutes) ctx = ctx or WorkspaceContext(w) - ctx.deployed_workflows.run_workflow("e2e", run_config, timeout) + ctx.deployed_workflows.run_workflow("e2e", run_config, patterns, timeout) @dqx.command diff --git a/src/databricks/labs/dqx/contexts/workflow_context.py b/src/databricks/labs/dqx/contexts/workflow_context.py index 0237fe6c3..71b56cbd1 100644 --- a/src/databricks/labs/dqx/contexts/workflow_context.py +++ b/src/databricks/labs/dqx/contexts/workflow_context.py @@ -43,6 +43,11 @@ def run_config_name(self) -> str | None: """Returns run configuration name.""" return self.named_parameters.get("run_config_name") + @cached_property + def patterns(self) -> str | None: + """Returns semicolon delimited list of location patterns to use.""" + return self.named_parameters.get("patterns") + @cached_property def run_config(self) -> RunConfig: """Loads and returns the run configuration.""" diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index 2f71a0f57..bcb0a99a4 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -589,8 +589,8 @@ def apply_checks_and_save_in_tables( # Retrieve the result to propagate any exceptions future.result() - @telemetry_logger("engine", "apply_checks_and_save_in_tables_from_patterns") - def apply_checks_and_save_in_tables_from_patterns( + @telemetry_logger("engine", "apply_checks_and_save_in_tables_for_patterns") + def apply_checks_and_save_in_tables_for_patterns( self, patterns: list[str], # can use wildcard e.g. catalog.schema.* checks_location: str, # use as prefix for checks defined in files diff --git a/src/databricks/labs/dqx/installer/workflow_installer.py b/src/databricks/labs/dqx/installer/workflow_installer.py index 2dd3a216f..b9feb3bc5 100644 --- a/src/databricks/labs/dqx/installer/workflow_installer.py +++ b/src/databricks/labs/dqx/installer/workflow_installer.py @@ -72,6 +72,7 @@ def run_workflow( self, workflow: str, run_config_name: str = "", # run for all run configs by default + patterns: str = "", max_wait: timedelta = timedelta(minutes=20), ) -> int: # this dunder variable is hiding this method from tracebacks, making it cleaner @@ -81,7 +82,9 @@ def run_workflow( job_id = int(self._install_state.jobs[workflow]) logger.debug(f"starting {workflow} workflow: {self._ws.config.host}#job/{job_id}") - job_initial_run = self._ws.jobs.run_now(job_id, python_named_params={"run_config_name": run_config_name}) + job_initial_run = self._ws.jobs.run_now( + job_id, python_named_params={"run_config_name": run_config_name, "patterns": patterns} + ) run_id = job_initial_run.run_id run_url = f"{self._ws.config.host}#job/{job_id}/runs/{run_id}" logger.info(f"Started {workflow} workflow: {run_url}") @@ -598,6 +601,7 @@ def _add_wheel_task( named_parameters = { "config": f"/Workspace{self._config_file}", "run_config_name": "", # run for all run configs by default + "patterns": "", "product_name": self._product_info.product_name(), # non-default product name is used for testing "workflow": workflow, "task": jobs_task.task_key, @@ -638,9 +642,7 @@ def _create_run_job_task(self, task: Task) -> jobs.Task: depends_on=[jobs.TaskDependency(task_key=d) for d in task.dependencies()], run_job_task=jobs.RunJobTask( job_id=referenced_job_id, - python_named_params={ - "run_config_name": "", # run for all run configs by default - }, + python_named_params={}, # don't change existing job parameters ), ) diff --git a/src/databricks/labs/dqx/profiler/profiler.py b/src/databricks/labs/dqx/profiler/profiler.py index 5e410fdde..2f22678c9 100644 --- a/src/databricks/labs/dqx/profiler/profiler.py +++ b/src/databricks/labs/dqx/profiler/profiler.py @@ -141,6 +141,7 @@ def profile_tables( exclude_matched: bool = False, columns: dict[str, list[str]] | None = None, options: list[dict[str, Any]] | None = None, + max_parallelism: int | None = os.cpu_count(), ) -> dict[str, tuple[dict[str, Any], list[DQProfile]]]: """ Profiles Delta tables in Unity Catalog to generate summary statistics and data quality rules. @@ -154,19 +155,20 @@ def profile_tables( names (e.g. *catalog.schema.table*) and values should be lists of column names to include in profiling. options: A dictionary with options for profiling each table. Keys should be fully-qualified table names (e.g. *catalog.schema.table*) and values should be options for profiling. + max_parallelism: An optional concurrency limit for profiling concurrently Returns: A dictionary mapping table names to tuples containing summary statistics and data quality profiles. """ tables = list_tables(client=self.ws, patterns=patterns, exclude_matched=exclude_matched) - return self._profile_tables(tables=tables, columns=columns, options=options) + return self._profile_tables(tables=tables, columns=columns, options=options, max_parallelism=max_parallelism) def _profile_tables( self, tables: list[str] | None = None, columns: dict[str, list[str]] | None = None, options: list[dict[str, Any]] | None = None, - max_workers: int | None = os.cpu_count(), + max_parallelism: int | None = os.cpu_count(), ) -> dict[str, tuple[dict[str, Any], list[DQProfile]]]: """ Profiles a list of tables to generate summary statistics and data quality rules. @@ -177,7 +179,7 @@ def _profile_tables( names (e.g. *catalog.schema.table*) and values should be lists of column names to include in profiling. options: A dictionary with options for profiling each table. Keys should be fully-qualified table names (e.g. *catalog.schema.table*) and values should be options for profiling. - max_workers: An optional concurrency limit for profiling concurrently + max_parallelism: An optional concurrency limit for profiling concurrently Returns: A dictionary mapping table names to tuples containing summary statistics and data quality profiles. @@ -196,8 +198,8 @@ def _profile_tables( } ) - logger.info(f"Profiling tables with {max_workers} workers") - with futures.ThreadPoolExecutor(max_workers=max_workers) as executor: + logger.info(f"Profiling tables with {max_parallelism} workers") + with futures.ThreadPoolExecutor(max_workers=max_parallelism) as executor: results = executor.map(lambda arg: self.profile_table(**arg), args) return dict(zip(tables, results)) diff --git a/src/databricks/labs/dqx/profiler/profiler_runner.py b/src/databricks/labs/dqx/profiler/profiler_runner.py index 3776f9bb1..fb036df41 100644 --- a/src/databricks/labs/dqx/profiler/profiler_runner.py +++ b/src/databricks/labs/dqx/profiler/profiler_runner.py @@ -5,9 +5,15 @@ from databricks.sdk import WorkspaceClient from databricks.sdk.service.workspace import ImportFormat -from databricks.labs.dqx.config import InputConfig, ProfilerConfig, BaseChecksStorageConfig +from databricks.labs.dqx.checks_storage import ChecksStorageHandlerFactory +from databricks.labs.dqx.config import ( + InputConfig, + ProfilerConfig, + BaseChecksStorageConfig, + InstallationChecksStorageConfig, +) from databricks.labs.dqx.engine import DQEngine -from databricks.labs.dqx.io import read_input_data +from databricks.labs.dqx.io import read_input_data, TABLE_PATTERN from databricks.labs.dqx.profiler.generator import DQGenerator from databricks.labs.dqx.profiler.profiler import DQProfiler from databricks.labs.blueprint.installation import Installation @@ -37,15 +43,21 @@ def __init__( def run( self, + run_config_name: str, input_config: InputConfig, profiler_config: ProfilerConfig, - ) -> tuple[list[dict], dict[str, Any]]: + product: str, + install_folder: str, + ) -> None: """ - Run the DQX profiler on the input data and return the generated checks and profile summary stats. + Run the DQX profiler for the given run configuration and save the generated checks and profile summary stats. Args: - input_config: Input data configuration (e.g. table name or file location, read options). + run_config_name: Name of the run configuration (used in storage config). + input_config: Input data configuration. profiler_config: Profiler configuration. + product: Product name for the installation (used in storage config). + install_folder: Installation folder path (used in storage config). Returns: A tuple containing the generated checks and profile summary statistics. @@ -60,16 +72,70 @@ def run( }, ) checks = self.generator.generate_dq_rules(profiles) # use default criticality level "error" - logger.info(f"Generated checks:\n{checks}") - logger.info(f"Generated summary statistics:\n{summary_stats}") - return checks, summary_stats + logger.info(f"Generated checks: \n{checks}") + logger.info(f"Generated summary statistics: \n{summary_stats}") + + storage_config = InstallationChecksStorageConfig( + run_config_name=run_config_name, + assume_user=True, + product_name=product, + install_folder=install_folder, + ) + self.save(checks, summary_stats, storage_config, profiler_config.summary_stats_file) + + def run_for_patterns( + self, + patterns: list[str], + profiler_config: ProfilerConfig, + checks_location: str, + install_folder: str, + max_parallelism: int, + ) -> None: + """ + Run the DQX profiler for the given table patterns and save the generated checks and profile summary stats. + + Args: + patterns: List of table patterns to profile (e.g. ["catalog.schema.table*"]). + profiler_config: Profiler configuration. + checks_location: Delta table to save the generated checks, + otherwise checks are saved under checks/{table_name}.yml. + install_folder: Installation folder path (used in storage config). + max_parallelism: Maximum number of parallel threads to use for profiling. + """ + options = [ + { + "table": "*", # Matches all tables + "options": { + "sample_fraction": profiler_config.sample_fraction, + "sample_seed": profiler_config.sample_seed, + "limit": profiler_config.limit, + }, + } + ] + results = self.profiler.profile_tables(patterns=patterns, options=options, max_parallelism=max_parallelism) + storage_handler_factory = ChecksStorageHandlerFactory(self.ws, self.spark) + + for table, (summary_stats, profiles) in results.items(): + checks = self.generator.generate_dq_rules(profiles) # use default criticality level "error" + logger.info(f"Generated checks: \n{checks}") + logger.info(f"Generated summary statistics: \n{summary_stats}") + + checks_location_resolved = ( + # for file based checks expecting a file per table + checks_location + if TABLE_PATTERN.match(checks_location) + else f"{install_folder}/checks/{table}.yml" + ) + + _, storage_config = storage_handler_factory.create_for_location(checks_location_resolved, table) + self.save(checks, summary_stats, storage_config, profiler_config.summary_stats_file) def save( self, checks: list[dict], summary_stats: dict[str, Any], storage_config: BaseChecksStorageConfig, - profile_summary_stats_file: str | None, + profile_summary_stats_file: str, ) -> None: """ Save the generated checks and profile summary statistics to the specified files. @@ -83,7 +149,7 @@ def save( self.dq_engine.save_checks(checks, storage_config) self._save_summary_stats(profile_summary_stats_file, summary_stats) - def _save_summary_stats(self, profile_summary_stats_file, summary_stats): + def _save_summary_stats(self, profile_summary_stats_file: str, summary_stats: dict[str, Any]) -> None: install_folder = self.installation.install_folder() summary_stats_file = f"{install_folder}/{profile_summary_stats_file}" diff --git a/src/databricks/labs/dqx/profiler/profiler_workflow.py b/src/databricks/labs/dqx/profiler/profiler_workflow.py index 976aa0457..24ceaa53f 100644 --- a/src/databricks/labs/dqx/profiler/profiler_workflow.py +++ b/src/databricks/labs/dqx/profiler/profiler_workflow.py @@ -1,7 +1,7 @@ import logging from concurrent import futures -from databricks.labs.dqx.config import InstallationChecksStorageConfig, RunConfig +from databricks.labs.dqx.config import RunConfig from databricks.labs.dqx.contexts.workflow_context import WorkflowContext from databricks.labs.dqx.installer.workflow_task import Workflow, workflow_task @@ -18,10 +18,26 @@ def profile(self, ctx: WorkflowContext): """ Profile input data and save the generated checks and profile summary stats. + Logic: + * If location patterns are provided, only those patterns will be profiled, the provided run config name + will be used as a template for all fields except the location. + * If no location patterns are provided, but a run config name is given, only that run config will be profiled. + * If neither location patterns nor a run config name are provided, all run configs will be profiled. + Args: ctx: Runtime context. """ - if ctx.run_config_name: + if ctx.patterns and ctx.run_config_name: + logger.info(f"Running profiler workflow for patterns: {ctx.patterns}") + patterns = [pattern.strip() for pattern in ctx.patterns.split(';')] + ctx.profiler.run_for_patterns( + patterns=patterns, + profiler_config=ctx.run_config.profiler_config, + checks_location=ctx.run_config.checks_location, + install_folder=ctx.installation.install_folder(), + max_parallelism=ctx.config.profiler_max_parallelism, + ) + elif ctx.run_config_name: self._profile_for_run_config(ctx, ctx.run_config) else: logger.info("Running profiler workflow for all run configs") @@ -44,16 +60,10 @@ def _profile_for_run_config(ctx, run_config): if not run_config.input_config: raise ValueError("No input data source configured during installation") - checks, profile_summary_stats = ctx.profiler.run( - run_config.input_config, - run_config.profiler_config, - ) - - storage_config = InstallationChecksStorageConfig( + ctx.profiler.run( run_config_name=run_config.name, - assume_user=True, - product_name=ctx.installation.product(), + input_config=run_config.input_config, + profiler_config=run_config.profiler_config, + product=ctx.installation.product(), install_folder=ctx.installation.install_folder(), ) - - ctx.profiler.save(checks, profile_summary_stats, storage_config, run_config.profiler_config.summary_stats_file) diff --git a/src/databricks/labs/dqx/quality_checker/e2e_workflow.py b/src/databricks/labs/dqx/quality_checker/e2e_workflow.py index f2253b0eb..2b8a338e4 100644 --- a/src/databricks/labs/dqx/quality_checker/e2e_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/e2e_workflow.py @@ -69,13 +69,15 @@ def finalize(self, ctx: WorkflowContext): @staticmethod def _log_task_run_info(ctx: WorkflowContext, task_name: str): """ - Log whether the workflow is running for all run configs or a specific run config. + Log whether the workflow is running for patterns, all run configs or a specific run config. Args: ctx (WorkflowContext): Runtime context. task_name (str): Name of the task being executed. """ - if ctx.run_config_name: + if ctx.patterns and ctx.run_config_name: + logger.info(f"End-to-end: {task_name} for patterns: {ctx.patterns}") + elif ctx.run_config_name: logger.info(f"End-to-end: {task_name} for run config: {ctx.run_config.name}") else: logger.info(f"End-to-end: {task_name} for all run configs") diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py b/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py index ee6e219cd..1ed32edf9 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py @@ -27,3 +27,24 @@ def run(self, run_configs: list[RunConfig], max_parallelism: int | None = os.cpu logger.info("Data quality checker started.") self.dq_engine.apply_checks_and_save_in_tables(run_configs=run_configs, max_parallelism=max_parallelism) logger.info("Data quality checker completed.") + + def run_for_patterns( + self, patterns: list[str], run_config_template: RunConfig, checks_location: str, max_parallelism: int + ) -> None: + """ + Run the DQX data quality job for the provided location patterns using a run config template. + + Args: + patterns: List of location patterns (with wildcards) to apply the data quality checks to. + run_config_template: A RunConfig object to be used as a template for each pattern, except location. + checks_location: Location to read the checks from. + max_parallelism: Maximum number of parallel runs. Defaults to the number of CPU cores. + """ + logger.info(f"Data quality checker started for patterns {patterns}.") + self.dq_engine.apply_checks_and_save_in_tables_for_patterns( + patterns=patterns, + checks_location=checks_location, + run_config_template=run_config_template, + max_parallelism=max_parallelism, + ) + logger.info(f"Data quality checker started {patterns}.") diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py index f48124e4a..f73dab99a 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py @@ -3,7 +3,7 @@ from databricks.labs.dqx.config import RunConfig from databricks.labs.dqx.contexts.workflow_context import WorkflowContext from databricks.labs.dqx.installer.workflow_task import Workflow, workflow_task - +from databricks.labs.dqx.io import TABLE_PATTERN logger = logging.getLogger(__name__) @@ -17,10 +17,32 @@ def apply_checks(self, ctx: WorkflowContext): """ Apply data quality checks to the input data and save the results. + Logic: + * If location patterns are provided, only tables matching the patterns will be used, + the provided run config name will be used as a template for all fields except the location. + * If no location patterns are provided, but a run config name is given, only that run config will be used. + * If neither location patterns nor a run config name are provided, all run configs will be used. + Args: ctx: Runtime context. """ - if ctx.run_config_name: + if ctx.patterns and ctx.run_config_name: + logger.info(f"Running data quality workflow for patterns: {ctx.patterns}") + patterns = [pattern.strip() for pattern in ctx.patterns.split(';')] + + checks_location = ( + ctx.run_config.checks_location + if TABLE_PATTERN.match(ctx.run_config.checks_location) + else f"{ctx.installation.install_folder()}/checks/" + ) + + ctx.quality_checker.run_for_patterns( + patterns=patterns, + run_config_template=ctx.run_config, + checks_location=checks_location, + max_parallelism=ctx.config.quality_checker_max_parallelism, + ) + elif ctx.run_config_name: logger.info(f"Running data quality workflow for run config: {ctx.run_config_name}") run_config = self._prepare_run_config(ctx, ctx.run_config) ctx.quality_checker.run([run_config]) diff --git a/tests/integration/test_apply_checks_and_save_in_table.py b/tests/integration/test_apply_checks_and_save_in_table.py index 4f6e59453..d925b842f 100644 --- a/tests/integration/test_apply_checks_and_save_in_table.py +++ b/tests/integration/test_apply_checks_and_save_in_table.py @@ -1346,7 +1346,7 @@ def test_apply_checks_and_save_in_tables_with_ref_df(ws, spark, make_schema, mak assert_df_equality(actual_df, expected_df, ignore_nullable=True) -def test_apply_checks_and_save_in_tables_from_patterns(ws, spark, make_schema, make_random, make_directory): +def test_apply_checks_and_save_in_tables_for_patterns(ws, spark, make_schema, make_random, make_directory): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) @@ -1387,7 +1387,7 @@ def test_apply_checks_and_save_in_tables_from_patterns(ws, spark, make_schema, m engine.save_checks(table2_checks, config=WorkspaceFileChecksStorageConfig(location=checks_location2)) # Apply checks and write to tables - engine.apply_checks_and_save_in_tables_from_patterns( + engine.apply_checks_and_save_in_tables_for_patterns( patterns=[f"{catalog_name}.{schema.name}.*"], checks_location=workspace_folder, ) @@ -1447,7 +1447,7 @@ def test_apply_checks_and_save_in_tables_from_patterns(ws, spark, make_schema, m assert_df_equality(actual_df2, expected_df2, ignore_nullable=True) -def test_apply_checks_and_save_in_tables_from_patterns_checks_in_table(ws, spark, make_schema, make_random): +def test_apply_checks_and_save_in_tables_for_patterns_checks_in_table(ws, spark, make_schema, make_random): catalog_name = "main" schema = make_schema(catalog_name=catalog_name) @@ -1491,7 +1491,7 @@ def test_apply_checks_and_save_in_tables_from_patterns_checks_in_table(ws, spark ) # Apply checks and write to tables - engine.apply_checks_and_save_in_tables_from_patterns( + engine.apply_checks_and_save_in_tables_for_patterns( patterns=[input_tables[0], input_tables[1]], checks_location=checks_table, ) @@ -1551,7 +1551,7 @@ def test_apply_checks_and_save_in_tables_from_patterns_checks_in_table(ws, spark assert_df_equality(actual_df2, expected_df2, ignore_nullable=True) -def test_apply_checks_and_save_in_tables_from_patterns_with_quarantine( +def test_apply_checks_and_save_in_tables_for_patterns_with_quarantine( ws, spark, make_schema, make_random, make_directory ): catalog_name = "main" @@ -1597,7 +1597,7 @@ def test_apply_checks_and_save_in_tables_from_patterns_with_quarantine( ) # Apply checks and write to tables - engine.apply_checks_and_save_in_tables_from_patterns( + engine.apply_checks_and_save_in_tables_for_patterns( patterns=[f"{catalog_name}.{schema.name}.*"], checks_location=workspace_folder, max_parallelism=2, @@ -1671,29 +1671,29 @@ def test_apply_checks_and_save_in_tables_from_patterns_with_quarantine( assert_df_equality(spark.table(quarantine_tables[1]), expected_quarantine_df2, ignore_nullable=True) -def test_apply_checks_and_save_in_tables_from_patterns_no_tables_matching(ws, spark): +def test_apply_checks_and_save_in_tables_for_patterns_no_tables_matching(ws, spark): # Test with empty list of table configs engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) # This should not raise an error with pytest.raises(ValueError, match="No tables found matching include or exclude criteria"): - engine.apply_checks_and_save_in_tables_from_patterns( + engine.apply_checks_and_save_in_tables_for_patterns( patterns=["main.non_existent_schema.*"], checks_location="some/location" ) -def test_apply_checks_and_save_in_tables_from_patterns_exclude_no_tables_matching(ws, spark): +def test_apply_checks_and_save_in_tables_for_patterns_exclude_no_tables_matching(ws, spark): # Test with empty list of table configs engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) # This should not raise an error with pytest.raises(ValueError, match="No tables found matching include or exclude criteria"): - engine.apply_checks_and_save_in_tables_from_patterns( + engine.apply_checks_and_save_in_tables_for_patterns( patterns=["*"], checks_location="some/location", exclude_matched=True ) -def test_apply_checks_and_save_in_tables_from_patterns_with_custom_suffix( +def test_apply_checks_and_save_in_tables_for_patterns_with_custom_suffix( ws, spark, make_schema, make_random, make_directory ): catalog_name = "main" @@ -1741,7 +1741,7 @@ def test_apply_checks_and_save_in_tables_from_patterns_with_custom_suffix( ) # Apply checks and write to tables - engine.apply_checks_and_save_in_tables_from_patterns( + engine.apply_checks_and_save_in_tables_for_patterns( patterns=[f"{catalog_name}.{schema.name}.*"], checks_location=workspace_folder, run_config_template=RunConfig(quarantine_config=OutputConfig(location="")), @@ -1750,7 +1750,7 @@ def test_apply_checks_and_save_in_tables_from_patterns_with_custom_suffix( ) # Overwrite results to test that options are properly passed - engine.apply_checks_and_save_in_tables_from_patterns( + engine.apply_checks_and_save_in_tables_for_patterns( patterns=[input_tables[0], input_tables[1]], checks_location=workspace_folder, run_config_template=RunConfig( @@ -1869,7 +1869,7 @@ def custom_string_check(column: str) -> Column: temp_file.write(custom_function_content.encode()) custom_check_function_location = temp_file.name - engine.apply_checks_and_save_in_tables_from_patterns( + engine.apply_checks_and_save_in_tables_for_patterns( patterns=[f"{catalog_name}.{schema.name}.*"], checks_location=workspace_folder, run_config_template=RunConfig(custom_check_functions={"custom_string_check": custom_check_function_location}), @@ -1930,7 +1930,7 @@ def test_apply_checks_and_save_in_tables_with_patterns_and_ref_df(ws, spark, mak run_config_template = RunConfig(reference_tables={"ref_df_key": InputConfig(location=input_table)}) - engine.apply_checks_and_save_in_tables_from_patterns( + engine.apply_checks_and_save_in_tables_for_patterns( patterns=[f"{catalog_name}.{schema.name}.*"], checks_location=workspace_folder, run_config_template=run_config_template, diff --git a/tests/integration/test_profiler_runner.py b/tests/integration/test_profiler_runner.py index da244887a..10f2d05b4 100644 --- a/tests/integration/test_profiler_runner.py +++ b/tests/integration/test_profiler_runner.py @@ -1,7 +1,5 @@ import sys from databricks.labs.dqx.config import ( - InputConfig, - ProfilerConfig, InstallationChecksStorageConfig, WorkspaceFileChecksStorageConfig, ) @@ -55,29 +53,6 @@ def test_profiler_runner_raise_error_when_profile_summary_stats_file_missing(ws, ), f"Profile summary stats not uploaded to {install_folder}/{profile_summary_stats_file}." -def test_profiler_runner(ws, spark, installation_ctx, make_schema, make_table): - profiler = DQProfiler(ws) - generator = DQGenerator(ws) - dq_engine = DQEngine(ws, spark) - runner = ProfilerRunner(ws, spark, dq_engine, installation_ctx.installation, profiler, generator) - - # prepare test data - catalog_name = "main" - schema = make_schema(catalog_name=catalog_name) - table = make_table( - catalog_name=catalog_name, - schema_name=schema.name, - ctas="SELECT * FROM VALUES (1, 'a'), (2, 'b'), (3, NULL) AS data(id, name)", - ) - input_config = InputConfig(location=table.full_name) - profiler_config = ProfilerConfig(sample_fraction=1.0) - - checks, summary_stats = runner.run(input_config=input_config, profiler_config=profiler_config) - - assert checks, "Checks were not generated correctly" - assert summary_stats, "Profile summary stats were not generated correctly" - - def test_profiler_workflow_class(ws, spark, setup_workflows): installation_ctx, run_config = setup_workflows() diff --git a/tests/integration/test_profiler_workflow.py b/tests/integration/test_profiler_workflow.py index 166978d0a..16cae130a 100644 --- a/tests/integration/test_profiler_workflow.py +++ b/tests/integration/test_profiler_workflow.py @@ -4,7 +4,11 @@ import pytest from databricks.labs.blueprint.parallel import ManyError -from databricks.labs.dqx.config import InstallationChecksStorageConfig +from databricks.labs.dqx.config import ( + InstallationChecksStorageConfig, + WorkspaceFileChecksStorageConfig, + TableChecksStorageConfig, +) from databricks.labs.dqx.engine import DQEngine @@ -150,3 +154,83 @@ def test_profiler_workflow_for_multiple_run_configs(ws, spark, setup_workflows): install_folder = installation_ctx.installation.install_folder() status = ws.workspace.get_status(f"{install_folder}/{second_run_config.profiler_config.summary_stats_file}") assert status, f"Profile summary stats file {second_run_config.profiler_config.summary_stats_file} does not exist." + + +def test_profiler_workflow_for_patterns(ws, spark, setup_workflows, make_table): + installation_ctx, run_config = setup_workflows() + + first_table = run_config.input_config.location + catalog_name, schema_name, _ = first_table.split('.') + second_table = make_table( + catalog_name=catalog_name, + schema_name=schema_name, + ctas="SELECT * FROM VALUES " + "(1, 'a'), (2, 'b'), (3, NULL), (NULL, 'c'), (3, NULL), (1, 'a'), (6, 'a'), (2, 'c'), (4, 'a'), (5, 'd') " + "AS data(id, name)", + ) + + # run profiler for all tables in the schema + installation_ctx.deployed_workflows.run_workflow( + "profiler", run_config_name=run_config.name, patterns=f"{catalog_name}.{schema_name}.*" + ) + + dq_engine = DQEngine(ws, spark) + + # assert checks for first table + storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml", + ) + checks = dq_engine.load_checks(config=storage_config) + assert checks, f"Checks for {first_table} were not generated" + + # assert checks for second table + storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{second_table.full_name}.yml", + ) + checks = dq_engine.load_checks(config=storage_config) + assert checks, f"Checks for {second_table.full_name} were not generated" + + +def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_workflows, make_table): + installation_ctx, run_config = setup_workflows() + + first_table = run_config.input_config.location + catalog_name, schema_name, _ = first_table.split('.') + + # update run config to use table storage for checks + config = installation_ctx.config + run_config = config.get_run_config() + run_config.checks_location = f"{catalog_name}.{schema_name}.checks" + installation_ctx.installation.save(config) + + # create second table + second_table = make_table( + catalog_name=catalog_name, + schema_name=schema_name, + ctas="SELECT * FROM VALUES " + "(1, 'a'), (2, 'b'), (3, NULL), (NULL, 'c'), (3, NULL), (1, 'a'), (6, 'a'), (2, 'c'), (4, 'a'), (5, 'd') " + "AS data(id, name)", + ) + + # run profiler for all tables in the schema + installation_ctx.deployed_workflows.run_workflow( + "profiler", run_config_name=run_config.name, patterns=[f"{catalog_name}.{schema_name}.*"] + ) + + dq_engine = DQEngine(ws, spark) + + # assert checks for first table + storage_config = TableChecksStorageConfig( + location=run_config.checks_location, + run_config_name=first_table, + ) + checks = dq_engine.load_checks(config=storage_config) + assert checks, f"Checks for {first_table} were not generated" + + # assert checks for second table + storage_config = TableChecksStorageConfig( + location=run_config.checks_location, + run_config_name=second_table.full_name, + ) + checks = dq_engine.load_checks(config=storage_config) + assert checks, f"Checks for {second_table.full_name} were not generated" diff --git a/tests/integration/test_quality_checker_workflow.py b/tests/integration/test_quality_checker_workflow.py index bae1ff767..8b802913e 100644 --- a/tests/integration/test_quality_checker_workflow.py +++ b/tests/integration/test_quality_checker_workflow.py @@ -7,7 +7,12 @@ from databricks.sdk.service.workspace import ImportFormat from databricks.labs.dqx.checks_storage import InstallationChecksStorageHandler -from databricks.labs.dqx.config import InstallationChecksStorageConfig, InputConfig +from databricks.labs.dqx.config import ( + InstallationChecksStorageConfig, + InputConfig, + WorkspaceFileChecksStorageConfig, + TableChecksStorageConfig, +) from databricks.labs.dqx.engine import DQEngine from tests.integration.conftest import RUN_TIME, REPORTING_COLUMNS @@ -246,6 +251,101 @@ def test_quality_checker_workflow_with_ref( assert_df_equality(checked, expected, ignore_nullable=True) +def test_quality_checker_workflow_for_patterns( + ws, spark, make_table, setup_workflows, expected_quality_checking_output +): + installation_ctx, run_config = setup_workflows(checks=True) + + first_table = run_config.input_config.location + catalog_name, schema_name, _ = first_table.split('.') + second_table = make_second_input_table(catalog_name, make_table, schema_name) + + dq_engine = DQEngine(ws, spark) + checks = dq_engine.load_checks( + config=WorkspaceFileChecksStorageConfig(location=f"{installation_ctx.installation.install_folder()}/checks.yml") + ) + dq_engine.save_checks( + checks=checks, + config=WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml" + ), + ) + dq_engine.save_checks( + checks=checks, + config=WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{second_table}.yml" + ), + ) + ws.workspace.delete(f"{installation_ctx.installation.install_folder()}/checks.yml") + + # run workflow + installation_ctx.deployed_workflows.run_workflow( + "quality-checker", run_config_name=run_config.name, patterns=f"{catalog_name}.{schema_name}.*" + ) + + # assert first table + checked_df = spark.table(first_table) + assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + # assert second table + checked_df = spark.table(second_table) + assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + +def test_quality_checker_workflow_for_patterns_table_checks_storage( + ws, spark, make_table, setup_workflows, expected_quality_checking_output +): + installation_ctx, run_config = setup_workflows(checks=True) + + first_table = run_config.input_config.location + catalog_name, schema_name, _ = first_table.split('.') + + # update run config to use table storage for checks + checks_table = f"{catalog_name}.{schema_name}.checks" + config = installation_ctx.config + run_config = config.get_run_config() + run_config.checks_location = checks_table + installation_ctx.installation.save(config) + + second_table = make_second_input_table(catalog_name, make_table, schema_name) + + dq_engine = DQEngine(ws, spark) + checks = dq_engine.load_checks( + config=WorkspaceFileChecksStorageConfig(location=f"{installation_ctx.installation.install_folder()}/checks.yml") + ) + dq_engine.save_checks( + config=TableChecksStorageConfig(location=checks_table, run_config_name=first_table), checks=checks + ) + dq_engine.save_checks( + config=TableChecksStorageConfig(location=checks_table, run_config_name=second_table), checks=checks + ) + ws.workspace.delete(f"{installation_ctx.installation.install_folder()}/checks.yml") + + # run workflow + installation_ctx.deployed_workflows.run_workflow( + "quality-checker", run_config_name=run_config.name, patterns=f"{catalog_name}.{schema_name}.*" + ) + + # assert first table + checked_df = spark.table(first_table) + assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + # assert second table + checked_df = spark.table(second_table) + assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + +def make_second_input_table(catalog_name, make_table, schema_name): + second_table = make_table( + catalog_name=catalog_name, + schema_name=schema_name, + ctas="SELECT * FROM VALUES " + "(1, 'a'), (2, 'b'), (3, NULL), (NULL, 'c'), (3, NULL), (1, 'a'), (6, 'a'), (2, 'c'), (4, 'a'), (5, 'd') " + "AS data(id, name)", + ) + return second_table.full_name + + def _setup_custom_check_func(ws, installation_ctx, custom_checks_funcs_location): content = '''from databricks.labs.dqx.check_funcs import make_condition, register_rule from pyspark.sql import functions as F From 2edab9a198c4638cff82a733bbe06b6f563f2a74 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Sun, 28 Sep 2025 09:29:41 +0200 Subject: [PATCH 25/64] fix tests --- tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index edda96265..2c2b2e211 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -22,7 +22,7 @@ @pytest.fixture def debug_env_name(): - return "ws" # Specify the name of the debug environment from ~/.databricks/debug-env.json + return "ws2" # Specify the name of the debug environment from ~/.databricks/debug-env.json @pytest.fixture From 3293b75565dc2fd9e8c60a1f6d9e288098f5f6a1 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Sun, 28 Sep 2025 09:30:13 +0200 Subject: [PATCH 26/64] fix tests --- tests/conftest.py | 2 +- tests/unit/test_workflow_installer.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 2c2b2e211..edda96265 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -22,7 +22,7 @@ @pytest.fixture def debug_env_name(): - return "ws2" # Specify the name of the debug environment from ~/.databricks/debug-env.json + return "ws" # Specify the name of the debug environment from ~/.databricks/debug-env.json @pytest.fixture diff --git a/tests/unit/test_workflow_installer.py b/tests/unit/test_workflow_installer.py index ef2871cd0..ec9db5cb4 100644 --- a/tests/unit/test_workflow_installer.py +++ b/tests/unit/test_workflow_installer.py @@ -26,7 +26,9 @@ def test_run_workflow(): run_id = deployed_workflows.run_workflow('test_workflow', 'test_run_config') assert run_id == 456 - mock_ws.jobs.run_now.assert_called_once_with(123, python_named_params={"run_config_name": "test_run_config"}) + mock_ws.jobs.run_now.assert_called_once_with( + 123, python_named_params={"run_config_name": "test_run_config", "patterns": ""} + ) mock_ws.jobs.wait_get_run_job_terminated_or_skipped.assert_called_once_with( run_id=456, timeout=timedelta(minutes=20) ) From b05549e6781b7dd8529fedb91cc3d1e7c5085c62 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Sun, 28 Sep 2025 12:07:15 +0200 Subject: [PATCH 27/64] refactor --- src/databricks/labs/dqx/engine.py | 3 +- .../labs/dqx/installer/workflow_installer.py | 2 +- .../labs/dqx/profiler/profiler_runner.py | 19 ++-- .../quality_checker_workflow.py | 4 +- tests/integration/test_e2e_workflow.py | 103 +++++++++++++++++- tests/integration/test_profiler_workflow.py | 59 +++++----- 6 files changed, 147 insertions(+), 43 deletions(-) diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index bcb0a99a4..9eb61bf39 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -10,7 +10,7 @@ from databricks.labs.dqx.base import DQEngineBase, DQEngineCoreBase from databricks.labs.dqx.checks_resolver import resolve_custom_check_functions_from_path -from databricks.labs.dqx.checks_serializer import deserialize_checks +from databricks.labs.dqx.checks_serializer import deserialize_checks, FILE_SERIALIZERS from databricks.labs.dqx.config_loader import RunConfigLoader from databricks.labs.dqx.checks_storage import ( FileChecksStorageHandler, @@ -655,6 +655,7 @@ def apply_checks_and_save_in_tables_for_patterns( # for file based checks expecting a file per table checks_location if TABLE_PATTERN.match(checks_location) + and not checks_location.lower().endswith(tuple(FILE_SERIALIZERS.keys())) else f"{checks_location}/{table}.yml" ) run_configs.append(run_config) diff --git a/src/databricks/labs/dqx/installer/workflow_installer.py b/src/databricks/labs/dqx/installer/workflow_installer.py index b9feb3bc5..efe01e199 100644 --- a/src/databricks/labs/dqx/installer/workflow_installer.py +++ b/src/databricks/labs/dqx/installer/workflow_installer.py @@ -642,7 +642,7 @@ def _create_run_job_task(self, task: Task) -> jobs.Task: depends_on=[jobs.TaskDependency(task_key=d) for d in task.dependencies()], run_job_task=jobs.RunJobTask( job_id=referenced_job_id, - python_named_params={}, # don't change existing job parameters + python_named_params=None, # don't change existing job parameters ), ) diff --git a/src/databricks/labs/dqx/profiler/profiler_runner.py b/src/databricks/labs/dqx/profiler/profiler_runner.py index fb036df41..c306dc216 100644 --- a/src/databricks/labs/dqx/profiler/profiler_runner.py +++ b/src/databricks/labs/dqx/profiler/profiler_runner.py @@ -5,12 +5,14 @@ from databricks.sdk import WorkspaceClient from databricks.sdk.service.workspace import ImportFormat -from databricks.labs.dqx.checks_storage import ChecksStorageHandlerFactory +from databricks.labs.dqx.checks_serializer import FILE_SERIALIZERS from databricks.labs.dqx.config import ( InputConfig, ProfilerConfig, BaseChecksStorageConfig, InstallationChecksStorageConfig, + TableChecksStorageConfig, + WorkspaceFileChecksStorageConfig, ) from databricks.labs.dqx.engine import DQEngine from databricks.labs.dqx.io import read_input_data, TABLE_PATTERN @@ -113,21 +115,22 @@ def run_for_patterns( } ] results = self.profiler.profile_tables(patterns=patterns, options=options, max_parallelism=max_parallelism) - storage_handler_factory = ChecksStorageHandlerFactory(self.ws, self.spark) for table, (summary_stats, profiles) in results.items(): checks = self.generator.generate_dq_rules(profiles) # use default criticality level "error" logger.info(f"Generated checks: \n{checks}") logger.info(f"Generated summary statistics: \n{summary_stats}") - checks_location_resolved = ( + storage_config: BaseChecksStorageConfig + if TABLE_PATTERN.match(checks_location) and not checks_location.lower().endswith( + tuple(FILE_SERIALIZERS.keys()) + ): + # for table based checks, use the provided table name + storage_config = TableChecksStorageConfig(location=checks_location, run_config_name=table) + else: # for file based checks expecting a file per table - checks_location - if TABLE_PATTERN.match(checks_location) - else f"{install_folder}/checks/{table}.yml" - ) + storage_config = WorkspaceFileChecksStorageConfig(location=f"{install_folder}/checks/{table}.yml") - _, storage_config = storage_handler_factory.create_for_location(checks_location_resolved, table) self.save(checks, summary_stats, storage_config, profiler_config.summary_stats_file) def save( diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py index f73dab99a..dff938839 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py @@ -1,5 +1,6 @@ import logging +from databricks.labs.dqx.checks_serializer import FILE_SERIALIZERS from databricks.labs.dqx.config import RunConfig from databricks.labs.dqx.contexts.workflow_context import WorkflowContext from databricks.labs.dqx.installer.workflow_task import Workflow, workflow_task @@ -33,7 +34,8 @@ def apply_checks(self, ctx: WorkflowContext): checks_location = ( ctx.run_config.checks_location if TABLE_PATTERN.match(ctx.run_config.checks_location) - else f"{ctx.installation.install_folder()}/checks/" + and not ctx.run_config.checks_location.lower().endswith(tuple(FILE_SERIALIZERS.keys())) + else f"{ctx.installation.install_folder()}/checks/" # prefix/directory for file based checks ) ctx.quality_checker.run_for_patterns( diff --git a/tests/integration/test_e2e_workflow.py b/tests/integration/test_e2e_workflow.py index cc107d04c..6ffc091f3 100644 --- a/tests/integration/test_e2e_workflow.py +++ b/tests/integration/test_e2e_workflow.py @@ -1,5 +1,10 @@ import copy -from databricks.labs.dqx.config import InstallationChecksStorageConfig +from chispa.dataframe_comparer import assert_df_equality # type: ignore +from databricks.labs.dqx.config import ( + InstallationChecksStorageConfig, + WorkspaceFileChecksStorageConfig, + TableChecksStorageConfig, +) from databricks.labs.dqx.engine import DQEngine @@ -114,3 +119,99 @@ def test_e2e_workflow_with_custom_install_folder( # this is sanity check only, we cannot predict the exact output as it depends on the generated rules assert checked_df.count() > 0, "Output table is empty" assert checked_df.count() == input_df.count(), "Output table is empty" + + +def test_e2e_workflow_for_patterns(ws, spark, make_table, setup_workflows, expected_quality_checking_output): + installation_ctx, run_config = setup_workflows() + + first_table = run_config.input_config.location + catalog_name, schema_name, _ = first_table.split('.') + second_table = make_table( + catalog_name=catalog_name, + schema_name=schema_name, + ctas="SELECT * FROM VALUES " + "(1, 'a'), (2, 'b'), (3, NULL), (NULL, 'c'), (3, NULL), (1, 'a'), (6, 'a'), (2, 'c'), (4, 'a'), (5, 'd') " + "AS data(id, name)", + ).full_name + + installation_ctx.deployed_workflows.run_workflow( + "e2e", run_config_name=run_config.name, patterns=[f"{catalog_name}.{schema_name}.*"] + ) + + dq_engine = DQEngine(ws, spark) + + # assert checks for first table + storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml", + ) + checks = dq_engine.load_checks(config=storage_config) + assert checks, f"Checks for {first_table} were not generated" + + # assert checks for second table + storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{second_table}.yml", + ) + checks = dq_engine.load_checks(config=storage_config) + assert checks, f"Checks for {second_table} were not generated" + + # assert first table + checked_df = spark.table(first_table) + assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + # assert second table + checked_df = spark.table(second_table) + assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + +def test_e2e_workflow_for_patterns_table_checks_storage( + ws, spark, make_table, setup_workflows, expected_quality_checking_output +): + installation_ctx, run_config = setup_workflows() + + first_table = run_config.input_config.location + catalog_name, schema_name, _ = first_table.split('.') + + # update run config to use table storage for checks + config = installation_ctx.config + run_config = config.get_run_config() + run_config.checks_location = f"{catalog_name}.{schema_name}.checks" + installation_ctx.installation.save(config) + + # create second table + second_table = make_table( + catalog_name=catalog_name, + schema_name=schema_name, + ctas="SELECT * FROM VALUES " + "(1, 'a'), (2, 'b'), (3, NULL), (NULL, 'c'), (3, NULL), (1, 'a'), (6, 'a'), (2, 'c'), (4, 'a'), (5, 'd') " + "AS data(id, name)", + ).full_name + + installation_ctx.deployed_workflows.run_workflow( + "e2e", run_config_name=run_config.name, patterns=[f"{catalog_name}.{schema_name}.*"] + ) + + dq_engine = DQEngine(ws, spark) + + # assert checks for first table + storage_config = TableChecksStorageConfig( + location=run_config.checks_location, + run_config_name=first_table, + ) + checks = dq_engine.load_checks(config=storage_config) + assert checks, f"Checks for {first_table} were not generated" + + # assert checks for second table + storage_config = TableChecksStorageConfig( + location=run_config.checks_location, + run_config_name=second_table, + ) + checks = dq_engine.load_checks(config=storage_config) + assert checks, f"Checks for {second_table} were not generated" + + # assert first table + checked_df = spark.table(first_table) + assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + # assert second table + checked_df = spark.table(second_table) + assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) diff --git a/tests/integration/test_profiler_workflow.py b/tests/integration/test_profiler_workflow.py index 16cae130a..948636f60 100644 --- a/tests/integration/test_profiler_workflow.py +++ b/tests/integration/test_profiler_workflow.py @@ -161,13 +161,7 @@ def test_profiler_workflow_for_patterns(ws, spark, setup_workflows, make_table): first_table = run_config.input_config.location catalog_name, schema_name, _ = first_table.split('.') - second_table = make_table( - catalog_name=catalog_name, - schema_name=schema_name, - ctas="SELECT * FROM VALUES " - "(1, 'a'), (2, 'b'), (3, NULL), (NULL, 'c'), (3, NULL), (1, 'a'), (6, 'a'), (2, 'c'), (4, 'a'), (5, 'd') " - "AS data(id, name)", - ) + second_table = create_second_table(catalog_name, make_table, schema_name) # run profiler for all tables in the schema installation_ctx.deployed_workflows.run_workflow( @@ -177,25 +171,35 @@ def test_profiler_workflow_for_patterns(ws, spark, setup_workflows, make_table): dq_engine = DQEngine(ws, spark) # assert checks for first table - storage_config = WorkspaceFileChecksStorageConfig( + workspace_file_storage_config = WorkspaceFileChecksStorageConfig( location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml", ) - checks = dq_engine.load_checks(config=storage_config) + checks = dq_engine.load_checks(config=workspace_file_storage_config) assert checks, f"Checks for {first_table} were not generated" # assert checks for second table - storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{second_table.full_name}.yml", + workspace_file_storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{second_table}.yml", ) - checks = dq_engine.load_checks(config=storage_config) - assert checks, f"Checks for {second_table.full_name} were not generated" + checks = dq_engine.load_checks(config=workspace_file_storage_config) + assert checks, f"Checks for {second_table} were not generated" + + +def create_second_table(catalog_name, make_table, schema_name) -> str: + return make_table( + catalog_name=catalog_name, + schema_name=schema_name, + ctas="SELECT * FROM VALUES " + "(1, 'a'), (2, 'b'), (3, NULL), (NULL, 'c'), (3, NULL), (1, 'a'), (6, 'a'), (2, 'c'), (4, 'a'), (5, 'd') " + "AS data(id, name)", + ).full_name def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_workflows, make_table): installation_ctx, run_config = setup_workflows() - first_table = run_config.input_config.location - catalog_name, schema_name, _ = first_table.split('.') + first_table_full_name = run_config.input_config.location + catalog_name, schema_name, _ = first_table_full_name.split('.') # update run config to use table storage for checks config = installation_ctx.config @@ -203,14 +207,7 @@ def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_wo run_config.checks_location = f"{catalog_name}.{schema_name}.checks" installation_ctx.installation.save(config) - # create second table - second_table = make_table( - catalog_name=catalog_name, - schema_name=schema_name, - ctas="SELECT * FROM VALUES " - "(1, 'a'), (2, 'b'), (3, NULL), (NULL, 'c'), (3, NULL), (1, 'a'), (6, 'a'), (2, 'c'), (4, 'a'), (5, 'd') " - "AS data(id, name)", - ) + second_table_name = create_second_table(catalog_name, make_table, schema_name) # run profiler for all tables in the schema installation_ctx.deployed_workflows.run_workflow( @@ -220,17 +217,17 @@ def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_wo dq_engine = DQEngine(ws, spark) # assert checks for first table - storage_config = TableChecksStorageConfig( + table_storage_config = TableChecksStorageConfig( location=run_config.checks_location, - run_config_name=first_table, + run_config_name=first_table_full_name, ) - checks = dq_engine.load_checks(config=storage_config) - assert checks, f"Checks for {first_table} were not generated" + checks = dq_engine.load_checks(config=table_storage_config) + assert checks, f"Checks for {first_table_full_name} were not generated" # assert checks for second table - storage_config = TableChecksStorageConfig( + workspace_file_storage_config = TableChecksStorageConfig( location=run_config.checks_location, - run_config_name=second_table.full_name, + run_config_name=second_table_name, ) - checks = dq_engine.load_checks(config=storage_config) - assert checks, f"Checks for {second_table.full_name} were not generated" + checks = dq_engine.load_checks(config=workspace_file_storage_config) + assert checks, f"Checks for {second_table_name} were not generated" From 26a40088458595f79530bf9926f958be7b50f7fe Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Mon, 29 Sep 2025 14:29:56 +0200 Subject: [PATCH 28/64] updated tests --- tests/conftest.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index edda96265..8fe3f8e69 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -68,6 +68,14 @@ def config(self) -> WorkspaceConfig: run_configs=[RunConfig()], ) + @cached_property + def run_config_name(self) -> str | None: + return self.config.get_run_config().name + + @cached_property + def patterns(self) -> str | None: + return "" + class MockInstallationContext(MockWorkflowContext): __test__ = False From 95f551cbd36c241b028cadd84184a40bf1779c14 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Mon, 29 Sep 2025 15:05:17 +0200 Subject: [PATCH 29/64] fixed tests --- tests/integration/test_e2e_workflow.py | 31 +++++++++++++-------- tests/integration/test_profiler_workflow.py | 2 +- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/tests/integration/test_e2e_workflow.py b/tests/integration/test_e2e_workflow.py index 6ffc091f3..378275d01 100644 --- a/tests/integration/test_e2e_workflow.py +++ b/tests/integration/test_e2e_workflow.py @@ -1,5 +1,4 @@ import copy -from chispa.dataframe_comparer import assert_df_equality # type: ignore from databricks.labs.dqx.config import ( InstallationChecksStorageConfig, WorkspaceFileChecksStorageConfig, @@ -135,7 +134,7 @@ def test_e2e_workflow_for_patterns(ws, spark, make_table, setup_workflows, expec ).full_name installation_ctx.deployed_workflows.run_workflow( - "e2e", run_config_name=run_config.name, patterns=[f"{catalog_name}.{schema_name}.*"] + "e2e", run_config_name=run_config.name, patterns=f"{catalog_name}.{schema_name}.*" ) dq_engine = DQEngine(ws, spark) @@ -154,13 +153,18 @@ def test_e2e_workflow_for_patterns(ws, spark, make_table, setup_workflows, expec checks = dq_engine.load_checks(config=storage_config) assert checks, f"Checks for {second_table} were not generated" - # assert first table checked_df = spark.table(first_table) - assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + input_df = spark.table(run_config.input_config.location) + + # this is sanity check only, we cannot predict the exact output as it depends on the generated rules + assert checked_df.count() > 0, "First output table is empty" + assert checked_df.count() == input_df.count(), "First output table is empty" - # assert second table checked_df = spark.table(second_table) - assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + # this is sanity check only, we cannot predict the exact output as it depends on the generated rules + assert checked_df.count() > 0, "Second output table is empty" + assert checked_df.count() == input_df.count(), "Second output table is empty" def test_e2e_workflow_for_patterns_table_checks_storage( @@ -187,7 +191,7 @@ def test_e2e_workflow_for_patterns_table_checks_storage( ).full_name installation_ctx.deployed_workflows.run_workflow( - "e2e", run_config_name=run_config.name, patterns=[f"{catalog_name}.{schema_name}.*"] + "e2e", run_config_name=run_config.name, patterns=f"{catalog_name}.{schema_name}.*" ) dq_engine = DQEngine(ws, spark) @@ -208,10 +212,15 @@ def test_e2e_workflow_for_patterns_table_checks_storage( checks = dq_engine.load_checks(config=storage_config) assert checks, f"Checks for {second_table} were not generated" - # assert first table checked_df = spark.table(first_table) - assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + input_df = spark.table(run_config.input_config.location) + + # this is sanity check only, we cannot predict the exact output as it depends on the generated rules + assert checked_df.count() > 0, "First output table is empty" + assert checked_df.count() == input_df.count(), "First output table is empty" - # assert second table checked_df = spark.table(second_table) - assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + # this is sanity check only, we cannot predict the exact output as it depends on the generated rules + assert checked_df.count() > 0, "Second output table is empty" + assert checked_df.count() == input_df.count(), "Second output table is empty" diff --git a/tests/integration/test_profiler_workflow.py b/tests/integration/test_profiler_workflow.py index 948636f60..58a096757 100644 --- a/tests/integration/test_profiler_workflow.py +++ b/tests/integration/test_profiler_workflow.py @@ -211,7 +211,7 @@ def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_wo # run profiler for all tables in the schema installation_ctx.deployed_workflows.run_workflow( - "profiler", run_config_name=run_config.name, patterns=[f"{catalog_name}.{schema_name}.*"] + "profiler", run_config_name=run_config.name, patterns=f"{catalog_name}.{schema_name}.*" ) dq_engine = DQEngine(ws, spark) From bc57613bb619a6ef4310052080b537b72e6e80c4 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Mon, 29 Sep 2025 19:19:05 +0200 Subject: [PATCH 30/64] fixed tests, updated docs --- docs/dqx/docs/guide/data_profiling.mdx | 20 +++++-- docs/dqx/docs/guide/quality_checks_apply.mdx | 50 ++++++++++++------ docs/dqx/static/img/e2e_params.png | Bin 0 -> 286692 bytes docs/dqx/static/img/profiler_params.png | Bin 0 -> 125467 bytes .../dqx/static/img/quality_checker_params.png | Bin 0 -> 127106 bytes .../labs/dqx/installer/workflow_installer.py | 5 +- tests/integration/test_e2e_workflow.py | 37 ++++++------- tests/integration/test_profiler_workflow.py | 30 +++++------ .../test_quality_checker_workflow.py | 32 ++++++----- tests/unit/test_workflow_installer.py | 2 +- 10 files changed, 98 insertions(+), 78 deletions(-) create mode 100644 docs/dqx/static/img/e2e_params.png create mode 100644 docs/dqx/static/img/profiler_params.png create mode 100644 docs/dqx/static/img/quality_checker_params.png diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index 88b5545ed..b783247b4 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -5,6 +5,7 @@ sidebar_position: 4 import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; +import useBaseUrl from '@docusaurus/useBaseUrl'; # Profiling and Quality Checks Generation @@ -229,9 +230,18 @@ databricks labs dqx profile --run-config "default" --patterns "main.product001.* ``` You can also provide `--timeout-minutes` option. -By default, running the profiler workflow from the Databricks UI executes it across all defined run configurations. -To run the workflow for a specific configuration, update the `run_config_name` parameter in the job settings. -To run the workflow for all tables/views matching wildcard patterns, update the `patterns` parameter in the job settings. +When running the profiler workflow using Databricks API or UI, you can also provide the same parameters: +* By default, the workflow executes across all defined run configs within the configuration file. +* To execute the workflow for a specific run config, specify the `run_config_name` parameter during execution. +* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution: + - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., `catalog.schema1.*;catalog.schema2.table1`. + - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. + If the `checks_location` in the run config points to a table, the checks will be directly saved to that table. Otherwise, they will be stored in workspace files located in the installation directory under `install_folder/checks/.yml`. Other storage types are not supported. + +See the relevant params in red: +
+ Profiler Workflow Parameters +
Execution logs from the profiler are printed in the console and saved in the installation folder. You can display the logs from the latest profiler workflow run by executing: @@ -247,8 +257,8 @@ databricks labs dqx open-remote-config ``` The following fields from the [configuration file](/docs/installation/#configuration-file) are used by the profiler workflow: -- `input_config`: configuration for the input data. -- `checks_location`: absolute or relative location (relative to the installation folder) to the generated quality rule candidates as 'yaml' or 'json' file (default: 'checks.yml'). +- `input_config`: configuration for the input data. 'location' is skipped when the workflow is executed for patterns. +- `checks_location`: absolute or relative location (relative to the installation folder) to the generated quality rule candidates as 'yaml' or 'json' file (default: 'checks.yml'). Skipped for non-table based locations when the workflow is executed for patterns. - `profiler_config`: configuration for the profiler containing: - `summary_stats_file`: relative location within the installation folder of the summary statistics (default: 'profile_summary.yml') - `sample_fraction`: fraction of data to sample for profiling. diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index bd4fe6c01..886a541df 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -5,7 +5,7 @@ sidebar_position: 7 import Admonition from '@theme/Admonition'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - +import useBaseUrl from '@docusaurus/useBaseUrl'; # Applying Quality Checks @@ -544,9 +544,19 @@ databricks labs dqx apply-checks --run-config "default" --patterns "main.product ``` You can also provide `--timeout-minutes` option. -By default, running the quality checker workflow from the Databricks UI executes it across all defined run configurations. -To run the workflow for a specific configuration, update the `run_config_name` parameter in the job settings. -To run the workflow for all tables/views matching wildcard patterns, update the `patterns` parameter in the job settings. +When running the quality checker workflow using Databricks API or UI, you can also provide the same parameters: +* By default, the workflow executes across all defined run configs within the configuration file. +* To execute the workflow for a specific run config, specify the `run_config_name` parameter during execution. +* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution: + - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., `catalog.schema1.*;catalog.schema2.table1`. + - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. + The output and quarantine table names are derived by appending the `_dq_output` and `_dq_quarantine` suffixes, respectively, to the input table name. + If the `checks_location` in the run config points to a table, the checks will be directly loaded from that table. Otherwise, they will be loaded from workspace files located in the installation directory under `install_folder/checks/.yml`. Other storage types are not supported. + +See the relevant params in red: +
+ Quality-Checker Workflow Parameters +
Execution logs are printed in the console and saved in the installation folder. You can display the logs from the latest run by executing the following command: @@ -555,10 +565,10 @@ databricks labs dqx logs --workflow quality-checker ``` The following fields from the [configuration file](/docs/installation/#configuration-file) are used by the quality checker workflow: -- `input_config`: configuration for the input data. -- `output_config`: configuration for the output data. -- `quarantine_config`: (optional) configuration for the quarantine data. -- `checks_location`: location of the quality checks in storage. +- `input_config`: configuration for the input data. 'location' is skipped when the workflow is executed for patterns. +- `output_config`: configuration for the output data. 'location' is skipped when the workflow is executed for patterns. +- `quarantine_config`: (optional) configuration for the quarantine data. 'location' is skipped when the workflow is executed for patterns. +- `checks_location`: location of the quality checks in storage. Skipped for non-table based locations when the workflow is executed for patterns. - `serverless_clusters`: whether to use serverless clusters for running the workflow (default: `true`). Using serverless clusters is recommended as it allows for automated cluster management and scaling. - `quality_checker_spark_conf`: (optional) spark configuration to use for the workflow, only applicable if `serverless_clusters` is set to `false`. - `quality_checker_override_clusters`: optional cluster configuration to use for the workflow, only applicable if `serverless_clusters` is set to `false`. @@ -627,9 +637,19 @@ databricks labs dqx e2e --run-config "default" --patterns "main.product001.*;mai ``` You can also provide `--timeout-minutes` option. -By default, running the e2e workflow from the Databricks UI executes it across all defined run configurations. -To run the workflow for a specific configuration, update the `run_config_name` parameter in the job settings. -To run the workflow for all tables/views matching wildcard patterns, update the `patterns` parameter in the job settings. +When running the e2e workflow using Databricks API or UI, you can also provide the same parameters: +* By default, the workflow executes across all defined run configs within the configuration file. +* To execute the workflow for a specific run config, specify the `run_config_name` parameter during execution. +* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution: + - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., `catalog.schema1.*;catalog.schema2.table1`. + - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. + The output and quarantine table names are derived by appending the `_dq_output` and `_dq_quarantine` suffixes, respectively, to the input table name. + If the `checks_location` in the run config points to a table, the checks will be directly saved to or loaded from that table. Otherwise, they will be stored in workspace files located in the installation directory under `install_folder/checks/.yml`. Other storage types are not supported. + +See the relevant params in red: +
+ e2e Workflow Parameters +
Execution logs are printed in the console and saved in the installation folder. You can display the logs from the latest run by executing the following command: @@ -641,10 +661,10 @@ databricks labs dqx logs --workflow quality-checker ``` The following fields from the [configuration file](/docs/installation/#configuration-file) are used by e2e workflow: -- `input_config`: configuration for the input data. -- `output_config`: configuration for the output data. -- `quarantine_config`: (optional) configuration for the quarantine data. -- `checks_location`: location of the quality checks in storage. +- `input_config`: configuration for the input data. 'location' is skipped when the workflow is executed for patterns. +- `output_config`: configuration for the output data. 'location' is skipped when the workflow is executed for patterns. +- `quarantine_config`: (optional) configuration for the quarantine data. 'location' is skipped when the workflow is executed for patterns. +- `checks_location`: location of the quality checks in storage. Skipped for non-table based locations when the workflow is executed for patterns. - `serverless_clusters`: whether to use serverless clusters for running the workflow (default: `true`). Using serverless clusters is recommended as it allows for automated cluster management and scaling. - `e2e_spark_conf`: (optional) spark configuration to use for the e2e workflow, only applicable if `serverless_clusters` is set to `false`. - `e2e_override_clusters`: (optional) cluster configuration to use for the e2e workflow, only applicable if `serverless_clusters` is set to `false`. diff --git a/docs/dqx/static/img/e2e_params.png b/docs/dqx/static/img/e2e_params.png new file mode 100644 index 0000000000000000000000000000000000000000..5069805cb209a7159ca9b69fce68300c9bee47ab GIT binary patch literal 286692 zcmeFZg^tN3?(2rlyr9w z-OYQv@836`_xau5`~3r6IegCcoU?oHwXSvTweWv0D}E3EDLxh!);)=LZxyhx?igcX zVF%#e0iFyyHMnA7-S}iIBJy5BMCAE<8%qOYGkq*9x-j$5MwXlM_gfnjjQieEQ&GJP zA_xy3XP#4~e&?bp+Be})S&>z}wZtWx}EGhk%_JTos{9Gc;@7dQ!%)(WJ1?GJk!KYQuE{d)WDEAdmL$M*McdA+Zt zb8_x{8yCanar}JrMhWAQzMY5_^Dsi@)UZ^r&9boNR)|L6>wz##J@ZXZ;Z)ac)VAmd zQwnwv(W1TJjoA`dI<_LSFEHqz^i?GcWMr`Dfix}__Kk;FH-Xd*;0Mdk80*%*(pXqD zz#R+gX1FgF4sd@6{Ju}c{^RW(ZN^(}0TEbaVS%(H=s z7Bv2#YNskA&8KH+&a4Zw{G`w9WN!643zmQrACNTHx6^&@WNv0*%jX28`qvkHK>GJ% z7OLm}`ozu@N~J3E{<(;yjs9~kW>#iaDnb0`&z}p}zzp~l-irNCcHn>I8ll#`oUXN#9KEt+6>UszB2Oxj0z`{#DKY_2#dJ{yV3Vt-g(jr8$t%PVld3 z`Jc>xfBFB;_^&Ee|EiLWi-Ya&b^h(u-?IMh1D~9YF;JcE??Ds<^88=V{^xrEmfs`% zw-NvMbpGopFrR|>0xW;74MF_PXE-rfSg)}p-U@$ky0MXjQ~S8(u&oy!GD3%+o}T(q zIHE!8tzJ>_Pm2Ph@P_NrPlG?7)U+}`C8#jkc)XFD%Z9Cd|7~&QD8mu*o!i94QoK;C|8{+* z{vq*{9{az2hJ|N`bwjq_4$F>4;=k9Qn3+cS->ZI&bAR@w49;uA@c-JOmwkQXr6V0b z-@|X69b#x#lHti_l~WE7`}Gf}yKR*FPf8rO1tCs5HYKa+m$2ztXNcR`L9K4U;d>n& z76xQhxJ-shk@j9U_sl4rFCm4=e$8HIe)~d*kj21=_3_$(IMe z9#gcicXT*Y<>VV>4Ria`tMl!pn(g|a4rc`|?5tHCd)xNGcb{+l$18OKZ;)xQ=(_ez ziS@xRadgFmMa&S!amJ0dsQxTKVD~36#Gos-z}=}BbqiU$M}In0-~rk{5_*jNJDV3O7z?8@-oWpIJtOpeVn+Um4=)nQM0irylQh zVmi_5Zz)pQ@BV2{DWpB77L!ir*P$YW9m`oF$feG0>oy9?gjC_>1N@W+VCDdszSL2n>kC`I$h10t zWX+b#TwOKLvx#R~HO(t%xp?L!RLW-0Bk=PZ5C7xk`IM@!FtVhqyqkTw)cw0~LV`wS zb@eNRK~|JifiVNJlQBZ%jKDV1+RBxhkY&2jV$WpIL*RXYlf&IKq@=ilT z!>N#gg0Xn<;ar`uiOJSZ!M_{b-$2Oni2WZoXVTZ#5)m9M^(S5zb3_e9fyHO*B8vs3 zJ>gfE=M$!*wzu+)J10LozsK_R1;7(kr{Vx_T8p zHaPeaSUGzVKi#GLi%2g6sg-}=@iZ^#ZD!C@UkjSm&wM&4igi(ztWjW$an;XA{LkzA z^Q}(N)J%zZ*nBVaxL_82YKp8L4p?7*JFMg3R&zr@+LY=05A36}VE!$-fo#!d_1h(A zq|KnbxY`&noJJ}Vv(!g=Ay8&}nupTC8x<2so86X}_I@cAb6V*g?6a&G?Qn0xGuu`I zcv2C3t6JrWj;l3%?ek5-P++CEZFoRFpd7a?xUxu27YF1PS^UTuEo*mu2@RH5i#hGO zIrWR(1LHcf`AYGiN0ZJ<%ncV1=dJ3Mf@?H$jpneb-aWYMkdjKrW0eaA#7g}+h?Rlr zN%0D8l3lvM$*gzU#%>$!J1MEsj%I-|vr-xM&i6>CVtRc)3Wx7&)9`KR-cEB!`_~8H zw?%!bhDrANosl_95psfT?v+IQt3*emda)aoGwvljO-M!^_fsED=cOncG*d=xOk%@F zx1B~mT$+vV{rKm-h-ci&7Ij0L;t_Y9Cd@0*3Q|n^ER@cR4-ABo%JoOI961Zr-xTGf zxT6wnI$uGY_h5~S-9SksomQ;Qdx}RFO$01=kIOtID!aMP%kMtrc=z<_)5Y`ch8PuX z=a$vMmc2bRi_e_yH%mY^RIYGO*+nqcY?PEtyI`Ja2ieT|fEU;Eiz-UqEHEfv)5y5c zS5Or?Zr|Rl^Gr4?`{m0^OA9~V(nDiE=`-hv^@d{#D;Mu)%*?p%2h}ZKf0Rr0Cgf99 z)^^r6MOkf4R`1REQFdm82vV)2c+?-$7@sy?eOO7fmHoy{;c8<4@gA{GWxyjfc4pJxk0%-u}eW?oQkve>^<;E|(&B zB+9Q{QCT6zGWkN&D9z_hoX2TE(KN8HH|;k(ygC z6*Fo&S_{%|y4JZq8##J2tyLp zkP>IMK2=jGGZKThHb;7@^ODtLdH?f_ezcl0u$y?)U}2(NU*blud0NY7E(}aJITuLb zk8~GKUWoX9Ats957Wc9i56p^fp~jd`PrM zwd-fS9vFlhdniWhZ```aJnz1sJ#E!|5745stUL$3elzBkQ?Ljbu3}=2ommykBVwK6 zvylvO$NULh->w^b-l$m>FC((xu=w5ot&1rxDR9K2L1y`D9`)E=9;vJ*?c$-X31YG+boGJ$kCE zGIQ$08pmxm%F26rz+T{Sy#g%s@F~ZcDQOh*lYth7qS|q3Y$WM)Wj#T)l1hus?%Gbw zKMAXEGO1<}93Cgl*W)C)^;mkXlNh3j!@!u18Ta$T+T&?>vBY!fl8^IQ_bYdr+`7Ld zs_iW&Shh+F&)q&`Ya@RqW{qa594Be4`iz$YDDe?wVjL7+ad`8ZwVLze53KW+2BNP@ zPp5UuKRY;iZY3pmIbR-*TrQ2WC_i*k>2aEI!N|k`x_xg!PUv)X$&b?g`v~abxS`qf z3ajhK?B(%H<<*7##U~|^_?orsu(?d!i@7T|05@<63X#P;0hP2-dQ2|MBy63{dJ}Dw zUkjXAI?sBZZx#pREH!(?%JN_AGkztA(SAohi^D_BWAtoW!+lmNgA0Gvr zSl6b-t}^3+ML^2Ge;Bq|F)@uyZfvPLo}MUpIZhWTLis)4V zf0?+KwuY+m#m$8LE;pV0)J@_YuEa z6e~j2DK4eAQFClL;d;D&!*?xncY(5Ex#T{f&O!4Wb%nOt4PuoM%>`*qU4`ZP^Q}r^ zBB$zxa}d1!bR~&4wziR;pw>#vNm}gVZC{6~V1KNF_}|d*&9Bj7y=FZ(tWuMxuOtRj zKX!GlQBBB~!ttzZjkrEqLAKhvEM!WjO zF?NuzH#W_yS&~Zn%V`wxv|NQwtWoo|IHg+`vdW7xR=s8=xkhhV$CVADwtRRC)B`=P z?VF*F(R>)6(QNW6cDC8Au``INVzf!RszpUVZNrb^NJWooYmSvL_IeLFdV>F}LFjS~ zYplEA32$R8p7%K*l||}~*JwOORP~IU)>5u(2MfZh8&6c%)rV^rZXD zbl1IgIylWnlMUv(Wt7vk7u=W7a%?CVd+1WH(A91TYwv_*gSVQnE$YyxBW6hkzITQx z>X7BXJr`(fdjJq-B)cfXAKuE zEKN!r=H~kdvW(T+&TzC{>spSFyzBWUcQMpFG~~_XX5|bBDQ0A98Yr{zgZ$ZKc7nxI zF`t-qcdt7n#o_awI3V05)4SI2U$cSk+pZ^%l~sRf_vcgn#;Qk8yJVbW63uo-b~W;x z?4O-?ydvb%(-|Q;jWMeO7fKL_UcgyDckel_EsY53&NgFH1+d z=pC+KN*l~xPs6W^4sQ}$PS+XJY$&Vg4~60>OF6I5&R#fYxf^!JQ^@u`4?5p^1~%fa z_4eoEX()OW+{LIL6yT^QLQJzgLKazs=uWEkq(N6F%p&(kwMvblYO`#Cop$ zaAf8OvS&BqCikROlGcNpM69;HB$stAhb33V^LMh#Y^o(&5*X^tMvCKV9a7wm;$~Y= zjzK{(SFA@h<0kojD;+$~Kc6BcYck1d0d1;za9uvE$=(Iv?SlKD^P5l!U(?MXKn(30 zlkCG!mtuUfJHMx!0(hrKblQ+}nWW5Qp3a{CC|}+I zDE8^bJ)6}ukMiqcAs@%?ZYD1!Iv>=VE^X?Cc)z#=DlLtPNmbm-mU(wYcV41}v*x?QKlDhA z@fg-bBVIRrNZ~Y9Rv_2F3wyyh;Ik;mJ~|_MecUk{KV#Xh)69Z29hn9;u~3qBT3d*~ z-d9eEE|1#@ zqU=rka*nG0zjYpJymN@+#_^Ge$Dwp>kLPbj&$0IkC|+Hx+$?=^LudcopTJ4gY`3NK z4D&Tmb#6{Y`Y!4Bw_;C}wd{v>;&onl)j58rx|0xdj2U5>47oFsBbUMqH2eG1{v8|3 zy}Mx_v1z-N=%>p#(A3QVV9PzT4(gb$uMVqyMwC%^b>o<4sV_TdQ$Fc6ucrV8Z5hL| zP1^{v>m{~c@AHecxBb8lH#pKBpDe)Fko)fVa1vy2omtuoV&1OZueeJ#&jUc~#|FLe zfy8X~^#i=N%eY6qYhxLH-Q=APheIlUWTJ5-n%^CrkVN=P>CHR;P1R&ZaqvZ?xbFEo zOI$cP;TbgFAtWbF)+@E#u9$I$dl-3ePr*t@oyC(8ltO~i?sGoponp_-$&;Hm`T+x< zBw6U%6?V4KLZVYP!X{k4{w;rO0nn4fSL^rIxTl?n;r9q|LGC<~Xzi}O9EIKW%(J7- zd^xm@fb-rWE9hqfAPId|Mz0NHv>fjBGT83`Y(;xloW)}~Ma2v@?n-CISFtw$6&!il zutcH71N;1-4I}rpM(yo1vi*)gl1Xgpk{`H$uaWNxeH0DK+V>`Hk$OwOx$i z0ecG|8Ya*abW2;e&ObrzRa|W9!b}N+gP+85todRfb{2QchSb1s9s_zzZcqn6fSQtV z6N^1;2F6xIwOqDrk_nA47lb8*L|SY}cV!^kjS)a&TCq6<%vG;jgPs{4*Ny_VPBY0! zEQ}25Vi((s1FF&))|oLE4B2beCAQ<)Sn!gd-%wo8e}@A%UbKx0INtBg=w6P|xgxP? z!lR9qsKDDB)eBihD+t?cGnrz2QY}FVfKfB$X zeCazxATt%~7kvO(L<1H}WMLI`YJcH@x6mjV2?*U*%`qEA183K-L}cO&~vF-#PVNYmAN_M&La?VTmSa z>I?e^I`6gkgRdU4I-i)o_s^#JT@m}Xf*3~=$+u7#P^z5YF!MpYrOW%EXj3G;{ovf?w`?D0LCPfZ{0da? zV0gSeT1@1#_G#V-;NN0OeTj&Q%8#*#-?KWdRFXGJ;=~4czvA6^HLp@t#+~Fk7v^_7 z<1ynR!kcF6G}nMZ*7y>00Gl^h&ELkYKDVHDa#vsK;B+OW^lU*twq0N?GolIajmOlr zw*64lRbPR&hC+|fHFotvF#qPQT#`wMNhH+u`to?O9UOwYO|U*Ub9KbcF5&nIP?T_o zE;jM=)NmG|s9|c@;+SDh=gyp=k8{(F16&tQz1F*@ixF~qkiSYf1)Q}KgN3` zAd#Ws0h@SzHK-`(FN3}hwuhHi&-;jb##PY*pd7yEj?LfoS$};#;H;p% zF(<%gnRt`i(ZY2pV7h%uj^+o0@*RNQu<)u~ySFrl1KFs|Q2F)zE*JOp!N97hwM|x+ z#}%=RcH{NxFUL9BB2&xS_#i>|i`}++$IqHO=#n06%2C3F_LoJ;IYn5G8x*qzr~$$u z+x2uw49@Mn5JAAS7PRb>815AvOl&KvDHb*jo8J z4c1>zqS)~j&0OUXKI@dq-^m>(i^(QkLE#O6=tv@WKhbrViO#&s@F|#gnY4N}oj~MQ zm9^gO{ON2mVxNzx6n0Jxmq$T`xt%d7pX^_?Dyh^y2dg9Ff}V2r$97N1ThyP@coNnf z4r|z)Z&oJwH{8oidtuUak!e}1$$8YXCPes=5t~ zO_iXT8Aio#!@E{V+LNF&KFdT)rWO`l5!gE861i`hA1_#X-hL7aU_D`Nk4t+!2h7AL zujrv|szAn1d&TLsmq!|Vzr@4TiWP`oIl6YZ9$-d#k+WXLMSva0{i=t@(!>P68^39B zvMY|A{bH41G~y1Nj+4uQc*En1(ko+TKq_WQoo{=*uA<*=#G&L^?%5(N_2&=|3GQJF z+XrlZKO6E#XzC}iwEu+6-s@s3C1vJWsgXkQLSF|xI6>=N(VuVCSgL-Lh@j~JxYd_{ zQCm__+}dXq0xmdHgKz5iTsi$Co2cc9MQe;|()t9F_$WyI`LU2*TX2l%6Ez;%8?iJ3 z8{b84FORJLM}`_8uTvQweC4uRm8>?-)c# z^|v~faj+9J<0!Wv=zpZae^=SJhHDj`Juvmq;Ol>AR9umJ00zR zAKTa1Ndd1bQ#{V(m%B|%~%tQ7wklSDbb-88<@IZ|#x!(wX& zfA8;zeR?)#j8I1%hpq{^Tkf|C{k72FOWj(3vOY2s)NYdZfsx>UJF$D+egE_0`?CFm zU7IlBKiB;uPnUDi4_0aQX^rG_4C?zMu1T1N#71XL5bjeak*U_FHls zPtvnl$&~x6hRAROi!NPxE}k$-MJu(bAsAJyVfzmWR2VZp!yCyp$4d7ZyhNThs5*bA ze{IboHrzr==93OmYmu~hZy$;9`ldo7R>Aba+;Rw`USd%*AC=QBrja#2Vy?;N@?jrg zBS2)DD6eK$K!Ny#QtPsn!Pqfs)*Ci_BjD1!LJj{yNV*@Xggw~G*e39zJM*1>%$RQt zrH=(Flx@i!wGJ5gT6Pvm!w{>J^C_|)6j$%uW34Ue_6;i5vMztMtM11NalwgUdlC#y z;cHf9_JDQ)gwNdzslSf7%EeRbh3igC%*>k3jWMj%>9ndS{q}T{ds8UUx%(*~a!1TC zDPiKXr>IwINp_|P*rC`m4#Db2F1zMxw6u3nbJhw>o@bLN&eG^TgxG^)?So~f-uzvf zG`sq~II-zk9TiXvS7&$!U1(HP*aFD#rB=#=1L3-_or4*xqLS`VdRj0WU$&j-TEb9q zq63-^aa3dOC(awi`5 zWze&}Nw}Re(NuOsN11V_C5=Z61r6C^pARfw>ENn)E@srLl(=5?9NO91UaQ$TWZ-Ba zCP8>s9qqczI|byR+k6QgVHUUVUJK(dDg(_4QVChb>E9-1l7jS?92w1u4CmWM|+(q$Buh_af?*B`Ynk=5I~7~3;Ng)t>8-;d(dnR(?MwoRGmLU^@{ zdSYGS0-GS82~K0lJ;=Q!W@NeJ)l>6^Y;47b8R&XOz-kzSxrx?*+fFbHX7_SBS^P}- z5*3}}q2>jO%0en3!c6iD1S8*%l!3-p;3Y_2EygnFn`aLP{N7;Hb3T120NqBIK|i?3 z4O#F(@nLvk6@~PR)yj!A2Xoa zLJ*osH|EUD8jCP&{pO*9ThcC>_7tc6r-N-2F9tS^AS~7TOGT!zMU1v2^nE~46oROojvZC1w^Ju0Z^wOyKx>WUifb3O z)1@FY*X0XjTQNqp^~yTg`$=6=7HX#x8?u)h+{Z;H){-N-gX0+_-AUE>J%3S2oMNBh z{ez?T^sWDt8Gj{GhjFds;?-+17>WK6IiG3Y&x{TtdQ&%?rH(<%eN1YtHu|y0Ryx%F zKVi$Lh-xEs^$e>Z88L$yPv|1wD3U~fsrXqt%pt@T!Wi3#=c3k$-?F3pUm&=8H~{N9YV4d`0Y4if`(| z#tEjBIUONT$>H+wi46$k4P4s@{vimZj0G0(_^3d4Zp*aW#gGS;T$N8lbnR#7%_9cc zS(d7mAAv6g7^}LO!C+Gp^rrJ8(-?cW#l=rpo_U4thaaUL^@bm|P{WT8=*Aj8xZJW$ zK&5;&lo)MbOhr1g*Y3JIq(kXRz_Hkf!xvgQB=#>&dP~d1eFn?%A@sT3vbuxmDcjjv zvfDb*KiYTp4OFbR^~{4ULP{Vu2F2s~;z=R$S{K#I^k8;nM9@vCx(?stt3HDF>Yk&^AX=0m8)k zX`BQ)0V+%jr5Eu^p|3Frhdqk1R}!-(^nvv2kF=F{@9%0uVzjW;RIj}0^Jt4tyN zXK5i3oAR2`8X>77Co1XBjz)nAd&b2G$b9AR{gb{M3$0D>zBENLbkm)WzL#pJYxe$ zsT4$WF8j*95Ep8)`72_%r(k&Z&&~0=@Ih*I>Ho1`{sx%`NpHmS=NCWgod44R{c@|T z4SLeq!W&y?qca<8Y1efa+ZA7Kt&=V6dp*rdj3?{Mdh)Qnh9i#s-fT1H7h`Y%_p{j$ zxB8tHLuRszldRbeD+#i_r3JeZr)01i4UTIRfyy}|9Uk6ORLYKT*ASmr2dL<#_DJ?T zJ#ET8!4b*f3yT2W!fHMLR;p){C1L>JWVurI8g z&h+sCZm%-W!A(8;?)Wi$*eY%IP!30&Nxr6<8=P>8B^7CJAl7nFx}qX>dtH9|NOMin zyO2anE+oC8z6_;&Hv_3Y!WS&>%9z;EyY}pik}b}~H-pK(gnZN4v$wXkw;X$7Llv$q zt?@YDlyzwtqn?Ji;P-r<=n~8e`9IXW$Pd+(#=v_cyT(RekHS62K(w|#_QX6}q!gU( zbpwzuzbL9*_{rv*MOZ+mvs#FMNYIAZSP*2j@Ja3t@o2 zANiIhey>kaCnfQoV`eak91^MkaWqPi={OQFf$x`zQ)A@$$>JcW3I;l&WM|>(I?yQ* z&LsO}j$!9O9%-JScOiR~#@14xC0uG4%v!>yLMV2lf$&#`0|cTrV*cKHlfQcJwc*}c z*hs!pLn;q+FE5RfG~YBkh(S&ZQ-JuO!#C{LWfo!sfw<*_hHb`tEBWRyc2uf34xYm4 zHH*<&&$I7#k{AFNs#t5`oy`iLKZ+3!>HP5yBaaVWbwOGOMCBQ3*98xh#oaC!r-tlZ zdQI9hb(PIuS5TFh6+7Rg4_ZD09S)vzG~S-0dQ4t1)(Y6yu3U z@rPo=!W*Q&p|@rBnJpf($3$+;!U`S#QqCf!}R6Aa6&Ue$wVHL+bx=v}@??~mbr$bM(JA(Bz!G=M22O|eN_A!ykS%om{wH+^ zBrQ5Zd00Vzw~RjlB+58{iaR1Mez17JpHGgQZD)% zOblPbjQ_+CRM>|>GTjcMcbLnMR>_#%wueXQf`Yo2>FZe`C0o!Sp~^3H8hR144Kd|* z+YdVL>u|@`;A={mY8uGs3LDhtnpkXtd`(R(iqZ2)?d|H31zDWoan#q{%j7z8jdP^v zyt$o;!2%e~)q8_zCGb5;!qYuSY`=+_0z?sH$&7v4{qa$(gb^ip$CkN+Zc#;6%wY}A zPiE{s^buyyNCeJEA#-^Y`?Rr+Su$iC-5$GR%;+nxn)1-Td$8FH6K@b%3Np}JT+h|d z#OT(e3}l#Yy8x*)`$8x}dSZTpyiBRQi*8u?vEqp2r^Si=ROHeicwpK@OE`g|>@W)> zU&rydKwKV9H~_lM4(Vl{NuJ=UX##A#TVR3x!BQP|{A6dJq4Hc17uRE?_-%Ht;M?Ye z(uFTmF13BnHQb?{y|_Anxlt*;Pm~eO=rXuQ8n=QR2CvGza`{rhx*?KXA#M%*CYX^+ zWN|)LJ#MBo5}*q^TTi~(6}RS4orvhV+2Cbg_(6;`=dE5?qRR(rF+rA&qg*yFZH97a z0BKrE!v0uFn)rhZnAX7IeYe9ZkUk~avv`;dA#}Mv6||JTqCSj@774Lo3uvuTzRaB6 zwfKdYJV7b4cJ6ATd)tS6_SpCIcu9mvfBi-Eye@p0i>VpK(rf8r@)5_WE;L6nU>)J?RGtJ&(_9em~?Uu74!@Ar1ch6~h#?!sUV+&G4es$1;uW(?%% zFK5X{8jkD+?rGBdm09uC^)%DNtpBqvD@9tzLhhc zju$e%By80a8ysp+{S@^1pb(p5p1cHWF_cc~b}4^0$kW?kuzFqHaE*jiEE~FKpu64lQ$3tJfb0wJNGtNF5+VH7?N_4 zVPTuw8M1~&6K182H2ZFz$O$|#(Q@(X^V_js6R#GI-z5kC#V(lyV09-A4Q|48|J+Z1 zB~p)Y`zF;krxc_AXLa44`3xL`MAa* z{o=XycB1j;=j5;>DTQ|!?0w=m$fBHIvvsT?Smfz+R;P4whE=uzUt)BY6~;9M%LIhV=>wys+MbkY2Yna0vY z#y2(_CItry0vM{Bjc?p|JVO>u_iNbHeaNB|{R6kR_hM7N`1hLBb?fYB!PVci3_)># zZ9V2np!odMKp>FswaM38H<2|l*Voj?3{7$Qm7oRV-3dUdT+1E;T#sT4HTfk1g zxjGQuEQlVB&;Ed8qm_Z;bHkj!q~zS4`$2U?0bKfiw_wr?nkYXs1o8q>7yTvM|mC6 z^|MVH=j&}n=dhO?59u?OclY#xhkA=k$jQylpIU!i(}9zoR)C4X(C7hshS$xMe;uLb zl3}yi8m^8y*VJ@8Y}H@=$vZKzqw*kb?Ync$0&)SAmD9UmJTdvjnIYxwE?*2;PRxg| zA{)sst4P{$Z-PdxLo^@B88}Nu<&Ek&2O}5g*z4YbVnk2d@2Y%3AQ)#qRKPxPi7neF znp74n#|t61TDFDZFs_;-IfKNk_JCZuVpI|?2?Jd7iD{|c)p+v@$qWH)GN>t&IVJmb& zPUBqM%W{TBy%_@G4{&)%8g$Cr+haJ?Skf^(0k-cVlw!h=j?60ZXK~KVN>8G=*?Vlz z=>k;CPA)#^dCmE`vI5sjFB{vh^QJ_8PNz1uSP@%LxV2n7k3;gGYGn}DbM&Q5P^5p$ z|LPf@`{Fk+@wK1{eDen|xexwLRhTtgH4Y7f>b#Z)sivML+=3iG4vBD9r1?!zET$E} z<%s<>?gX*oVzdB0Bds8>S`-xrm6+XWk(bI3FE1O1TGtj-m%~YsWDq?|5<;ou1dZp- zDqK`MD%<)7)!Y{@Wb?<_x9-;iREBi@o4DeUz}izQ05|zU7AuP-(EVh*inl*Cy(Ep} z3Dk#S|0IhOXiDZK--{1?5Zy*gCVF8KD*vV}05IX7FcRqAintxs4|Wy3lY`N7#Do*{Cg`U?S;OU$YysmLlP<9FZ$G4^<$=2jCDILH2M1ZV zo0UdMmya23M{GI+rou-kJ#hwLK2Mmf#?IXr5HiyWT$6{BNzj8Yy9RnWCk$db-wEya zC!0zD%o&{v$i&?VsT3j~;c`UM+|w7SHUuNpn^gpvOB^1%coX6V(QbHZ`mLuIFL|apT((E8T_~}Cx@2q z)K!yWkZWV#Tap0GTL!PNYDe?AI@_e}rju?Vmq#NlHf;1^Iveix$tW=~WRD49wr}e= zz4TVJ@`$8)n?e)y-h6ylut{mgQLUYr@!>0(=!CHPn5{T(TE#YY$z}BNw~SQtftN zeneQDQ~yG(>=;NmkdGM5LD$HxTuHLUV_vIKU94$10JaONJ>9cmYif%e@VEdSto;o+ zWdBAEGE=foeE-54f4(*ec`Y8x-%S7Og~)K|QnZFF5EBD-w&{Nv#}0ScY}EJv^Gm+S z&!=>SFS@Y06i-;Ne~~qkm`=Co-?NTW3n%ww-*vVn!6n$IsD`mdEz}nhn}**spetb4 zndBrTh8@|y+9z4&+c~^PJ|ED5XaHD`GAo9sW*4mu1S*vAmp`1PeM_>f-$g`q(S6F_ z_i{CI4~@efho}-h)`yMWp%D(y{c;}NS#%e%wh~_gVh=>mj6Rwk7DGE3g zdXq~i;E%hsmXp)TIid+}1HlV4Z91~{HU~S7yemPi$Z&_+geq+jg6UrFLF4AO?bg|tl?nj>8z9M@Ei89Q(-h7rU;Am#n#mkW7k&&pieR`Ijx3(y=7O4csHX98BPSf|;+S z7RiAmS??fket9b$D=!n<>7#pbmx`~U;D{KyNGTRjPRFgi2N$-6(>hkZ0uv{b)#yMW zu~$?vY2xp{{%C=TLc;lOPQTSZRf-5htt2a`CQ}`>`!!l3Qs($rXu;sX9sQvUKK7HJ z)0{3|GC4!9f{QOjnN_|qs<>($^6@S<*k(Z_31WnXkW1jgf~-!|6VHokrYI5hs*5}a zCQ3jjDh-$8F7}$|k@q(($(1Xf#u|3f_9l$c*sk>0L*E?;-OM@XU5#ix5Bdc6DK zgP%xj)4BM!qGuSLc-1cFq&1OrAtfiu{=<{`C1J~Pu}=%TkeRl&YSGy%)rMks7P`ov z?X3tQ;216Lq?U{xS8q-D2}UHF?alP$Nd}$RAx$VH$(W!uCz+_8x;IyvUfA8GS0rFZ z9IKSaELN5J$9m(rpelH{xBMH*fB|r1Zw^V+W9|pnwF4+GbTw>Acd=@8(M^lJ;l1!; z`?6@zk}D{G7e4L0f(9JjlR5K5Nwhv}RXZX!8m{YssJg)dchqW68q<+s?jw16K#tf?~JM zG$~gigts)+o#|g-0ucRsh#nNE$_aT=h}$p<9myMe)J<8$-?Hj`lpiudY#3Q7Y4t9U zU7ID{wF<0N&&My}AC&iZsRhREioH^-BFUB$Dojx$_N**0|p(uqzZUX#~s3qMv$!RV>Hf%aggOI4JPG65%x@}&R<a{7Vf#Jsw*%r;hCY;9j6I3~<$?g3sG?QVKp z|8`R_@%w!C<<36im8he^jR9CStx<6z2h0z(u;!BDeVA-=lO z!@pIwcjFRg)D#LoiX>pEeFyURh5jIB-} zE!%$m-J>te%}gqEY=no$!Qpc*dSLB6)Nkw+&ok*t1Op(Q>G3O>X!ugwbyg8`UdfyprOqdWN3oJtJ z*yWZL@FB3>lj7xn7Tp)SQ(L!PDA`s3B6IUU$W?LD*~iF}=)n%OF=5O1hs#YMB@W0< zrn$eveZCt9-NnbB3OrzK&*Uj!d&P7+STX*Prv)LZ zZWAQhWE~(?(}FNu_ZEzKma|&??o(nvc?W9+ejDo&?3Q9}YjrXCS$`BPv(?6>c6f~J zajJNb{y>KM$ILdHUsVl^h_1TV6nonQtXoCV8t&Cg<_bXcUwEl+8!gXsp3}$%^kPTE z=JnOhGmVB=E8hJsc74DXn|)hyQt*u%$rgi#MRitORW;bPx8&sWjsEd*`p_izGqV01 zN6TmRziJ(MWs1i9(>dK)9pSc zux0uA*o%Hag2Q5CCXjT+=$EdPtH9&R5fY8El)6F3G#?okr(}4cKrc+3n-vb`!5o*$M zGO<3t&pO43AEZ6L`+U*jA{zrNNyg#Id$JZijDeL2ihekpZOno(b~&Hti)a^Vp|)b3g{M0Aj+ zWs%{Uhx*;Kg>b98-qr!2z_+^-?w=B(MK9|R){=e@dMm~eB{I)K%A47%54Mck*5x^9 z(4^bS0D2}}a-n^HM=YC=7W1@~wbZb?z)8w}bWVKKKO{sbnFcIAoftMvqT~8PuN6^z zEd+!=8$(V}0PHi51QcHD&(zTL5bQ z2-ZHO*mm5=G|Dp&-D_tUV5@O#`K(ZPmNMPC{`2fF6o`SR%VtR$ccd>Cda}*maxT6U zvjhr!#3}pAno%KH5T>qENq)f>D~~@>CHNs;#0HTz7R?hqa8p-tL=mHi4-le51|RZh z2$q}HF;n!VazdAxsW7fdBQXCOc5jTfi~pqa3I*5XwtHoaG=#x|HEuV*e7N(gX|Hbc zVuED@8!^3H`*6e9I8yTza1USXYbGpr*Ks>kieuGHhh8nQc*H%pDjSdu`;{@ZNI>HN za$l5BI0j-3VJ9**J6G^+w2F=!nTzv&VPzB4c$l=rx9+Mq?mgdTnc^nf(dyVo?|U2T z@%qtPG{y~0t_T$Ay9b1qwrT^ITuq3=IwNcDCQxn^zDHj#@eY){cbO^EWY1VmY z8_a;Wh`ZbXTeZ|^^y7VGWBa<-(&<-%><1TnuH@&`eX_oLRaSiNU&IA?^`pIsa(H8{ z0LQG4RQWE5yKfdgonch~M<-Je>4&+Dh(u@HRp2aW{Q{v$c>1?!LB3$Dvnyk__QaC( zR;t@aFE)8v4v$~oqKR*2Lp;ryjgRtKh+I^C`821B$CdJ-UaTZSRFWLs(rUV72x~J+ z`Vuw_F8H}~%(?AUiH~62@NrbiVEALo2Xiqmiowk?mx8n3udi1rPwR7J}|)v86r|0Wydi>7}r z@E34N4(J?2yyOY#DDYbi!KkBbzp%|5zimpjMKb4#EN~w@ZJ7_gA7aZzdG%8>z_m4G zO3flK;`}R>$FH!6H5bi5-(+Ccv6_&&V}r=_G@QEY7G|e7a&}pd=iv0Skyzm zgM!ai-xMP_qB+F)Sh&ice~h#dVoFK=D4opoAQ!UKcvH~jp%roAFDThi#M|XJdatI>$ytOb5fE&9b4{RWy_^(5p8ap z>3w^^tSqz{MRh%jdgud0Z6}VEW)LhJ4U;==9hdGly?qaB1-$9m!jN_D*Udy}*C2=M z8JE+!Hp+rHPU(k#9i&9crcP+;sSNXvzC46lZfvG&ed}@{)ZCV6^V>l#y#LI&`u;g$ z)2d5YJ24^RMIay8)-0#3C4_p|cI7R)(SCfiK@X{pD%7_ab9iJ?aXL@Ecz-nP$XQ}3 zw6&-U!D^B?@R;;*a}gCHl|fbrI6%?6R$WURj+#H9lYGY2R}OGQ@r-Ij=+;~%L%+5^ z?Z=nz?XmSS-ud-#8%9V?AHV}q4GHhC2zj$1)=5y-_^ooc4_K7ODFkIDbTiLU67Fnd zWNL@Gf*J2-_)0-h$|DcA2_Wn7pyS?Xn!Fy;Wgym~ID(_Fu&@LO0hzeex4Y@Q{wk+4 zJHgz5WfO>qfSh(nlng~{jQu}Uopn@OefIUMP>L0YVx_ng3GOWvDDGBVf(3U^DOMmz zaF^ol?(T#_aVzfb{@(s(=9zgH|FBkASwQYR_k7RU`?F8aC-w9I*|f}7GxV{0|Cm6} zn@pFn_bH9nB#7pBj!c4KrY|1cJETD}TYi{~!`Az!n`C8esB`n}*<>zJuk56K5PL{q zj9@c?w!)(4>4zD&%@okx$v^m$k8ZC%LvE}*t;^toI~Ic#o9|C8s!t~p#s;(C_fn<< z4yFSkITHyds{2i57y>l^T?&M~SJ)R)pdK6FW59xb=#mr<`#9T7MJby;+Y1!Pn0s5? zZ8FcJcKgv!$kJ(xUN0EU0Eb`};6KD6)Q~&{+zfu20uNWK*?O(sJ<&$K$@V+>W0?|| zj2`Y~Eye04`1A;ti+pn6*ex^Uiuo5>!1vc&xWiMl$Nv)Q*<0<1`K{QJhkgPBaI zXFD-)f1Bs6Z}!+M5eg3*#5U8b>#@X4S~kt0g4Q6DlhVcmqy)Zm-UJ>yrLDOC+BCCq z@@ygv!`m1vWJf0wdc z$rSBzW9<; zgVMbd?OGR%JyA*dK@WTVE7KBC0~UQF(_G*9pO$;;4h4s10I;B1l-5=cM^%mpjFTDJBq&l!%o@oIz)1P!{+_dD%q411)&K{2Gyt5K z85q1qHeYaEmE~%VQP-Uj7aY{MnB$KF`;uSHs{$>?YIi^no*fC1`!y)VMEVLY8=3mPW?&y_RE>_K(Vr}|Q;$z2h+(y&I+^x@8d(E6e% zq33fPduafN>Bx`4rXc!0lZ3Eu@;0$EpAjsK5)UTBenZ*lP%EE)KyqdW4AD(;Hr`e$ zR+@?}N3gI!*pn_OY=q>ZIoI@8n3I3W8>F`PB}_4-z=MjY#98}eqTp=B*wM zsUu)OeXI-!kS<|udhCe_V&P4aueRb_OLgE_j!d+fS!DF$qf1JJ8FDHj;lY-)TPgpY zdk)Aw0U7`=TXvJaE&i8ASX08mLpZ&?^p(aXAa*WxUOB~$=+|VqdF4O$O$pfLP;O>w zF!Os@-I*fyOeqm9Pz;>kVr;L6_&1HRhM&Zx!0Y9K35z}30O6pR5j>LUKACqhw1@tf zt(ZJXcQ%=9o5Bb5trI_eI^ zOz{D5+`Y01B5bJB<8Ucnm9{frpBYoYwzZYY6kS-_y7`>z*kerJ@C6PpdDElM-9;_` zKW9-I&doa;Tl}V_kHk^K)TIbEBLo(uczn5`vD$4RODiaf^)_UQd?P+HJofQn zs@U(?4glX2a>?^xRvL!2au)|NI)Cm-2Ob$Zz8^1BQ5{2Jptye?Ae_?rH{nZD zmNOcx*zbH!aM}oSX7`bbWB~)r+lnF3-~dqADR5|IUa7~fF&Hehcx5jchV&PfHbo9f z_fM5_nhZ}8g1Y1)(TFM%tF75wkMt8R`Z=zD6;1bVB*J1ai>ll%Q(QVxk}V(ZIOEwn zMZ}5*eqqFNyg^JYc~X*lANk<_7d()j@?vPf!?YIn*evRqMr0a|?>v8eaYx*H+gF)j zR*5$QLm)`2Bf0k~$P>Q2;s^cE8EI$pb+G?!Cr|mORPHo?z1pVv_3rNFq1bi~ANJfF z@ByJ+=URf^PRXFJKsGSIHpk$T1HG;zCJkl}mN|4{qRfOkCp1sSjQo^XH}JcW_@`z2 z_>5HYT_q;jxx=W0%&zHXB=v0sk=K!alaKxGF;dSnZ>H~TpR{95nXuytD_3#PD17Y{ zEtw2^=o5_Kd-u{Qn=0beVaf#~eXQ*oXd~<$EZX)=>RPZ!zSy4HEGdC(-+L>s*@1oKepMH?pc}Yy`!zHh%bu$mSlJJ_vf^I+PKWHCr@XWZ!oo` zkkGWh-muh1{~@%VMLz7W!d!~Vr4=wlTnGNQI4Ge^9|YeUHP9VQ-Eapsq>=8ne$3(f z#HIb_x9-%hwo<>$Y1I)$nEwbpR!$jBNA~%6UgoJv|XLyCGPSM zVFM`*Q>ZDd>J0KlV@YA*&XEUzRlvSOF%(Dh{e;_~>82ZDnl$tEAmaf&1r?UTwm*vR zLj6X!KdKwy&d)NfKNUbwIFqm*Rit3g=)S!JHAehWEaDJF%t znH-uy{Z9S*<|Jdr>-3f$!zsn}4>Tah=1^t!)1fX2Ud+bVAs3w1DiKAbAI!mJ4~ZQ9<8ISQ`}p;d zPImHKTGth24EXh5%V+G~QU%^!M!-(kcX-GTTW(AK2>f zTEJb?zdWlxg`1gt&Kjlot$Hg>gx1WnD?aa2yoippbjY1`Y4h5=!w4KFOjwRE4n=YJwW)_jZ!D%`Ws=*wi;RnHNMy? z^RgAj4+>RI9O8ND^^RNZBTuUY^~G|VF6$y5pIo^S)*h`9$;~~{{h&U%eAakT4?SVX z)x907_ebb>IPo8rDUBD$9tr!RJ9bi*OyBLKzAKisqTY1s_`nZ*H%+syoTw->MYFdQ zDSN7@w-lWSw~tHmAt-{NV92?!(4uTU1kcoXC!+wO|M`DPTD4SqJDRrKMNR1DNP^K& zTg^geq;_ zh^+oNbb|hlD_?=zldUU*L3}$`O#!_gjFQ;lpcBjSkbXW!%I;EZ7`EkRY!JM0GiH)9 zH+(cup|^tV_1WZZ%M>8i$jcvVo=!L98qdmMa==JD(9XrXot(!NM!zo+i& zW${klA%v;o$GqFERYm*F?qHkG^S@)!xMA+cYBaK@WEioq(1*O3;>wHJzZ|Ur01HBo zDSYxp_tBh;Rgq)m`{_PSEkgKFM6J~5pkCr)79vl?YoVg%#zt^C>maXb-%oA4(iL<9 zaK!L%I5sZ7pN>RjhTkN~BywoB+}!NO!~SC=9i4eKl*&uFD2xE%vo$*=?E_PY#XyyN zhcll&p6(d6OUyV}NBr3C^Q~CDaMm1uj5_y>Rrwu_yOxb9N|?v; z>k`PmA#O9vDEP+|Cjt>yJuD-|)xW37ZYA`;_0b~eWAovk3?NP-+22`Zy zGsfO0Ij%$^JOl{o-$A|{>Mdj7`a$2jjbNN9z)%(g-)-V^*9nCC>{eQ0WZv$@$1$L0 z4q@lUg2Ty$>=#ZsbR?syCBhko>E1_rN7uYZiekM=8$>6pb7WR@^=kFHjL~g&?>9|@ zG6#~|Wof(q5*sr)Gg=MhiUw9$9B1mGzTPy=2MdkTtzx(9G9`b9mZKu5>(MTL`p4Y_ zwb$Z{|5+=gSK^q-Khmk|4eKBldk0xUet<8e9r}MhFnX>Hs5dZOx@IcfOGg=Mqz_f( z^mpjH-OOMSkV5$aIlL!KUtBD1gB**>hUOI7&j)PT% zF>ZeW;?8o_{AVmq?XqU9URA$tX%A?=4j}fMh)bj)gZK z)QQq0;L*wpT*PZTt>g8~2eHc<3g!vR<~)dEK##(0rCCU2@%JlEM^65T@Y+*J8x%?%}Pb#Qm~T! zs}LJgD`=3z=Gsa%^p(!#Kt7qY&;%r0sSx!HG!zuSbhY0rFyJvwE2k z|B@PY2+0qXcqn^1PT%2pB8*X}q}P}sx%oiw{f3`RAcWoAqm)lBi83Z2gz}33Y&>PI z6yiyhLqZoW|NQv2qCKRM%#Z#0HTacj>sXNS!7E+uIDGMY$|f>dxkENFUHT*=>&dbL^M`Tw zHKOYZE%B$Waj}LuSE^}nX3U}YT|_g)+H2(T9|qSCh@6W5K$+w4Cj;HqC#Lq6;SwYi z@vQAxZK9Z=F`}5l+PVPGWqYPFSKDKFVyyLX1#}F6%7Ez*JVs4hv84Wnfn03w@&-~` zeR8=7m8X%3*YDJU?sJ+frPDM{4Fhk-jLKB@O@I>|3?R`kD<;1}2F!C)-y;Mcn>-(8 zOu0$`_@+pztDy*!ZgLw_!Z-_DGK#hz`gp5HRMSgVv5ucKC_kP%coj%qep9tjGuJ0h zY;D$=#(u}7Y3uWH9l!xbZ>D)H%A_&@90s?5m~G+scRu;GrfD8(59VQkX>K`appB)} ziMi=tyUg42npZ3^Jcst`meLT*qr(pe+lCeZIo^5-;G9w09TWBFM*Jr_+ zwtH-qrjTAeoUw8pl_#2ub)FA%FGT?07-e^29Oux`g`xA*j43rEO7Ewum?h!;m}^>= zE%i+%WB%r$z&j1kx9W&K{%29@WBFoq6L#5dM|Q=5Y@NI^66KYUw-g|xgUh@VUT<3> zPe5`TSS$bjm+jylTuyU=XT2Md7m(GXieR>r zbgxuW+$2of*U60G!cR?EPGR%)WWMdS2U-vsHIsVeWlPUb$tdEpS)@&H_{-fLFb$w%`YSjr!wCR`|mm;!!7~yO^&*#L2V+m7qa^?^KCoCF> zQH?_r&%t|E3XP$cmxs5KxyM^p9QQbX2Pk>M(TeRttOPndBC*5*JVqTE+1cH4-`ghd zeqa&IcA%4RjLJC|H6HL)tYYv_L)5k1vb9|n&YwM+CP_xyv|OtJEE|@>lBVFjhF#{9 zwWz4IJqHl&=P=>p&k1F}#7)5Z%_L4|Y+NPkLsWf60Fjv1Qy=Lsh7%l0A-bmCdJ`jH zKoeBf&Zax$X?g*8cV(J}QU$e4hJ$BSKihXL2lfMSL?(nxip3xd(tKOzEjLw4+z4@bx1f6h055>ylONs+bHf#O{dvvYS}p%RmBju2ml?-#+4Y898#*ew z`+wEIq1+ds+dsb?%JYO=iF)YWJ$>fjg@?eh+u|;xGdo;t#fWf0p2<2H^vF7P`3cu|T<)ka1EvPqIPn+l9!h<|@s{-O zEQJE&*aG7viQ-v0{f4;aEI&XJgZ%W0t7G?gE#sLgVeF~_C`j?AV+RB#>p{+iB^AMf zR;)Q!k=}ttEe#1pM8@j?NW}_j3P5({g120QdCAPw8k0@c>hw$B?(gjG?n&jqO$^Pa z%LI*=ye`Tgp*Q9Y$!?RHCKJP*87?xTZGtvxr>>Xb04|6fpe5GK+oRq>!!+~lH+5VF zUbe4AUB>OZOsJ9uPU*T7M*rCa?&FFm4$+|(N;Q&iWh}2z5-sgE8ZKscOSOK5urwP( z*^b5jr(gbOO7ib-BIME+5Aw05#jUp&$Kz|AZeeZA>=)}t9yV2k>^vDmKojwml4x(` zeUZy>4^tRsVAcF0%a0nlM6LHkmPf=u144C zA|DtUoQ)p>4m-==9TyhgGdJU_lI>M1X~Ei9X8CiIVYc$ih7C#)WHb6d>j{b^#9gYx zx*e(0$jnKB<-j%J1oAok@61Rd@Qz77tgKXt-g-9hFa~=lfSzhE!8Dm!UE909_!5wN zKxk$4bI>qwI9QusA}bpbTUM3dw=VZ2y?VGsdA8er=Tpy8$I^Pk(0TX+fPIGNdReY} z$Gn>T?)%`GzE=a8|4aY~<$kBQ-W@xC->3ohyGsWZh4Wqr!SZwhJ^LU_vlB1aOfC}5 zr2E+xFnHwU+SmjjlwA_O6$tW6EaCQNNOY?YP`=Tgpdi}#@0}JY+87N_FP9!$44`pe zE$DAUgr%A5{RF+wtJOOp=Ex4iYee(d(sj0i?tte2&8IZupMH_>nfW~>jOZ6qrJ!?s)UTfl0BefeKM zisffx8GN(Z=Ro1rcfn@w^>VGz3pPK^76T`0RP}=|qpR}@GQ_}%QFC_{?VC`=671Y1orYUj%4##d2r`7irGx%EfBOP>LL7aA*yI2BBwe36LN4)of7u(d z-10^ejqA9=&5F8K!iSQv`Zox1gyc-bK!ctcVe8wrTpw6CS}TVhP;|LGCS@GQCc`nqDOfqAow1k@0gl?)048)BL4N!uP;sv}5V46&)}_&_W`iL7vMjpLA`}Ts+d} zso6-C`GY`>(JU2g@WOke^{Lt6=};P_S6{BgQ#FDTI>CxhL*$u^QoW8dCp+*7;Zlhh zu%8zn&_NH;>1!d0JILtxZWkLa^pZC*icZb(K*~r1?)4^jA6CY3$c_Vfq2;yx424CO zT=lIwWOoSBNo@dlTLQUXdTeW52S}=MqL}xEoZIKs37!d7vl)UzLagy5ZCRnt(?&=* z9H^Iotq;Mctm}P^H{*aX7#rM!I2=(x;Xn)UiKwCHEztWRCrO4-gU=__qS}4q@QRAs zsRkPln@uz4EXQTn04z}iRL3qmY>`Yp?ICJmeB3300D0CcU;6}+cv5IIe=m1Lf9_y4)_;`R6yZv!55p{1P zd@(v)(Gd#jX|!lE*-a!G@Hg@hTtt_>b;1x|7<%#HpUDp3zkKiGE`0TI*^_pTRD$>l z9CaJOY{na;cbW!jNB?bRYaiVm3K2vIip6O3sRkI$-a=ZcDIgUH~JoaX~N~|1A=u z%%b-#X(R36;l=E@jJ+kL(*|mPVM&X4s>cEEHGnx?KcWnaCNlZ?`nJ36#cWYRLD-wjpC=gipl zgm?nH-e(S`gc@WfG>H$Fn5}W-LsWw(v?+vFb~k}dM)vDqcDAvxF{Zf3(=_{lnO2h= zw|?IfGN(28X_BTs+Q?0R~T=Szj9&J9z zCg?Vl@^|$vLxlXFCa0%?2b-Zo5u+L|+YqIYBb9JOBljQVb51q{y~WSt!7yL$psTc<0{!0$cHX3ebn3eE=X6Wm z$KxbFPqwQ-yr0d%13!6y`M@sDj-Q;cW~ve}acDG7-UgAszIhWPze!nHr1(|QjO-sH zNW@30H+fpdZRu{-qAhNdXp@$w-!Vz4A?`y=$Ct!hhA54XH^|ZhzsOGusa8OzP9a2Z zT#01-uUW>AzGLel&8QLt=xI+Hml}zo#s+lyeZpm?hj4(3rV~t8Kaydw=x)7V;<*HE zmJTP9w_%?sOj@3BqCUKXlo5YJBv`c!u)lOzw<9UzAm2dRm@fUXQc=MMvMg_S>K2e+ z#}$=(0F5OK-x2?YT})9R1IyJOw{?RTr_B!E?I5$R zR^G+~^L3 zgm|O`&K1e$nQKIApvDbbj{p`hUwy16pC9w6wcGb+8>u;EWSeqcyf5Af6pTN>=30ADT!E)!X$?qlbP{h3AgJ#RllbB z8(h?`hngo=7nBI|U7q>x!0SsT1v@0tu56?KchL~~aY5w%rjbm&I0m*(@f5pHvQ1`W zBN~sgtswD1ni)@STK}0T&;X)bl(w_|Pg!4k-^Q}y0AF?jwtbc_SOW|i;h|`y|J=@w zPS1MCp0vmZwZM+``s=>0M=tYe$J$;9iDeIe1>}a9)`~ zt!d2AGLi!@6oMI)O-)`b{{M&9opKi+DAxS^?84dZjuo##IN@NBsHQa4t_fGfL4cR} zv#H->Zv%XbO(BERgNc+xmRxgQ+V9v&KTSuA(Y}!zv_*Fg02U9MXdWH5(=JFJGoLH) z8*|Z&r-elZ-?T0%KU+3f=?{b`U5lhfc+)Ab`{-U( zOsU6uuOIDSk+^zxz@( z+x8>9gMT4~I6f0m_I7*<2}f;HqWfP65^lu*T-kiEwli`lT`{IE4)E7q&|5J@mO^LF zdm%BVe#;uSw|^9c&ad$Cq|DNP1=&b)(<~Aq{kXGyG(KYH7f_@$jp?z^O+YH4+m=rggLG z2$_)fUtNdXpTMSQIF-Y*c0H9hp1*C}LvG($@XXS$S>*B-#B0o2khS<6;1BfTll@q>K(aVxM zog0>yc_*=K63*i+ILVsHrpcPW>YqLMb0lE|c?GyH>pVfVY(E)&>8+w;2$7}V2M)Px z>5!m!^NDDs(lrmAWcB~-V((P_ioebX>;jqC5sJy{QL2fexX_#jv46Si$OGwE670mm zUj~{UPX0%rSsCFCmmR}`)JRk&P5v!Zp1vln9QcN6c%Ldks75?jD%z6=_dBescV z7+((xivr7UWJg*}lnGu|{X!(LPZbS8B07g=_zzns`5!N8K`saLk&!|d(?&pQi*Sr$ zEsTl&?(VHw5Or*{)=<`vkIAz&Ac3ZWuz?7bp}nL2XW4Jg-_oKfS_>K~Z33xrS`P#j zu!OAqn%!1csHSImcZeK5Ik86wy%=&y#uJZ&>bSkzUN7+YFc*Ej%4V8N%h}$9^u-di zHF7miyiLg|`>mUF4!nuw|2~_fP7Fb9Bn)k(+1ZVm@MH|(yH^S9reVovmr-jiY}R89 zB>VG!)?=gAi46?A|!J9 z^*5vktMZ>P9fq+ShsEAe!nl#Y@fZ#MnZULYP>re>&C(unmbh6K6D6cVepjO_kB~HEg0s6u(A}85PxybH_&zV1cvqBe{?y+{SSSCK zVWr0zVD(q)F-8znJf-uu?5k;l2z5}%kP|Ng3P!#q9%wx*hMfW5oqZVCY zfhrsq{j%txP4E$z#R5WRi8$QeySI6!2(pTAZYV8n&rrXU{gS^yrR$Fuj!>l z-15RsuSg$h1R6R%IcZ|D`JO2D+I>dAVWD4}eq+{_8H0fNCYXkXT`%SH@`j`m7a|KK zu+;d-Klt&h$-z9GUPR;RJHcI+FPO`Yy1&^@7IRirz$vDD1`%!;4Mma|Vr&(5?|W$w zv3eA+HbL%IB|_fVdZG-R*T{=*L@)K2dx*NPv)O|WzyV~c-xP}kq{0;pive8dUrL4%Rv_0_P65QhL;^H_m^b1oXm6J@RSjr*xs##)SV6y}KS!x*#XJC&-e%W8 zdAZf~_?n?>x7s!GMLk#!!&7I=JbjMu9m18djj-79%}{Sfh*pX5pwvC|fc)B?74$Jn zHYS5kyhff377__#g3ykyHb}7s_qfIU%A}&?W=82jx;~?8?+XtpCR0toI_qwp)^y{yhJN5To$n{OLO2X({jZMP?!BVRPDXus`RVN|ZFN9ashC zte~7Gva$^gUC(1`NMg4xu|q4mFC>aaHdfE3rCvbb0jvF*9U&6~B)8EF^#b$Z0YJQJ z3XV!mrXsefDv$YBDAo^D@xI^rh=Ef?D;-FWV74vI>lBN)Iy zUexCXqM>Sv{#-on=^&@$R*z$b>xylwDwYv+1(5E&#KS8`Rl>dd+!dV80XI}nl)}S$ ziiL$m{PTStl##(%OlD;JKA7I=jLjOCPN6E$`ssU zUdJp4A_t6xZle#=bt`R?2ptT#2yjZ2n}D@+RC)g2XMW zgMaO*9U2+ObcE;B*J=y6$RY2>ha*1MSJ!(Jw`xu^;JES=++{`GI+cC#SoFKGEJ-8P zS~=2@=R2l*({}TzGBj2qg`p&uvg{O+*OfaU8#JIp2dotYdz|&tOjcVb$ zzfHm8ZEIoFWXPJjpX5YZdP}D*-27*&m)UPo72yy<(W8aM+r3WRZ#EjOFEAAc$R_1; zw75Zt6EdUt>(kA`N`&=rqd5ST|4K9HJ)$N~45j$_>?@1!4Kg&N_2Zn(hVgxs)m&^V zV;kl^`aSPZDN*3zP?2fsI*-q-Rqgrmg+Ysa4|xeq$(#*&pB+UDy>d=N(<@;E&!i$2 zk)_#eX#(rhE8UCTC2~cL+xb72BoE`;<5q-$)dosqUnoqTj~VA8UwjvTF1GrnhYs}! zBWj_?D(6!&mSN=hSvo(SRV6G6>Cj$3xIM|v{wJw-M2j6CP&w8(_M?#RQI@G>|CF(z z!^}<=>dsgz{7;WUg0b$dkEH1!LTo2Tj3ne@oqd6ge<)wQhzzgrRRletE@#S;VFXzX zXRg1d?2J3+6o2=mKR&`G#2rY0HZVqZ*7I_~r2z0$aeS)& za@?3gTyVMQrM_U>d0sTyo;7nz-c(w$Jt=!%>(1Hj#2DC{cn=j-~vcrffupfONsPhTjlclFR zfa8qq69CHG%kB>z0J1VimOH$EMmuflIOhO7NDeosZz8u1SyEkL5Ar0+HD`a zbE3HRd?Pfj4_a@(&LjB;eNP-l_-VkuQPmge+)ed*i_PeFaqWc~|0qUsi`PxXQh{n= z!GP-7Oi{DP($A8H0>(#lkE2gL#_iv^rq4{*{9( zYka8`g>p$5E)aa`NB+lhReFkYL8V9|$k};^G&g`8gZD~*rCRF?%GGy1IIe!)rWQS^ z{@-wfBR~3;k8bHjp1Z@`37B!ESH3h~ZIppT&_?@JzO^?mWjq$flu183jpxdfSMT*^ z7xX#_nsq>h=y90A{vD?dshbP_q+hnd^W`7D=7kGAd?B@Mds<-A>TS_qD^0k07|XQm zda>wXbMbny7vnoBGf$e^QPsG-`f$>1jM@>8xRrSmgR5Eo2m^7iJu^Y?56V-8@g0_?s)5 z|M(@rbHAE(D6h_H+SOk$h+M1jK+;Jg+aAw}ARBeP1ITcZaf5#O=;% zFLs_QX7duZPCuPrR5MH3l3ymH^>^{w$pnHXWDmpQC_0e2HdQwdI@b5yCeJ4>T*5%m&^5#(^ouaPlVt(OPvyqiE*Z{yO0XzD}n`R zM{B;qKX6MR`)d*dWLNRi$EED0& zw$Q?2vM8ShMqGH1t*Xxw@y5WRlg#y_7eMCUdHR-VcAn@Az9p_D z&XR+9K@Pn$I8BV^N<(0wb82v2oZUxBuSH!&qoJU9*mO>>^{4Zw2p=czP zh=MC9p-+9%7@n-Z7UKghD>7P}cxobFgAcm{Sv{eYU1O$Jv<5#BHN!H7JF;R6#Evps zHW_9D$r__~gl^|WY$&}x?fsqdPd`uyomY*!I)T(y$R%;yY;kCX3KGW;Uec*II5mE~ zuiB&iiggF)OQnI22vl;?Ymym2$-V1-s10JSdE9v(EhBqAZs&$f09M!b#;*erk(qcx?g2NR#yGd1|STGe&bTxQzRiodoC&AP<_2#TT)LbKfp+tv2 zRmNJBpD6Z&Rt}BO4c)kPtJjl5fi}OJTIm+*mz}(Ki+4jF>v*%~qo1=G7)Kt=Jsz$t zDEHOegPc)GM$eu&ne0~nzCu|g((Aeee46=xV}w^h$4QK85aEmI&)$|x2lmw`2;qtN zUk%K&zZ`(DE|~gdu=_XPlkIlozX9-lK7*9$D7@|`RJk7DfShMzs5G2 zPR-OO#GTkuOrL?Tv}a}gNLjcDIH9?Kr3nq=08+*Esp{nUh<4FTc6N9Ot~rRq&GkB0U* z=6l8Sy?mF{CUJfb88Y$=N%^|v&H%fGWwOF8#nw1&dz97lf%*EZZ{`DqkBX+`UR7U! z6usjnE%ZRQOc2pf_o#OoKk^WQ&Ks2eZ&CIj5)S zaOo~TS?QfD`PC};asOwp(^UROAZbp^)g3CQ5AIjn8fU{@2_D-%1WW5fqyozrqw`eu zj(mr$+hMZ{SfyY`&izt3{fppt zsb1Rk84zS!ei_54e#HGb0DVzURO%RrJqgt7+}o1OqVuaYZbat?BJ}rH(Vrxz~tec2A>bO{B zM78sBWfp*xtOB)Bske2{_~Nml`PvLn(1?oN%oZ0K()bQss_JI}vDXvS)v|8y+J#rU z0JYUz{L8>O_8NIyMEkHKwszT=<7|;#M`P5Eg0w=sJkbc!XQMuM+T@v2zD6w?g%RyGcL(wOv##n47U|ukLcmiDg1Lns7pvnD& zPcLC)9*%@#I{nGFhGrd?J|vxK**;hg|CfCPWyq-OQ?L|Gu5mEdAiausT9e5UC9LdX zSb}}^ri%4@Q>-*B4+GW|%LyC6Aus*~de;Nj?ESH(1FGGOGp`I%{J02q<9kbPaJM(m z$g#cIf8Smc`vE4h@xlyyQs3{G*VwsV!ocB~8RXhg)n(cTm)NvW_P6j~abA_O5s&Op z(_x7kxu82NiS!H=GFfDo7ROS{a$({A$7lXfzq-~ggn)%c43XgY%8lB)I?*^IU8{0d z+K6-*63>MOjo-_#EQ8F~1$FrG$`pSI^n4pADY*J@b?>4YD8tpRI+xFPsL#eBGiq=` zP$EA3*0bBV-Vq2V5>E2n{Uutu#$DBF?tfWAMV=mB9do{<`pD;i!be3j4T!dFaAXG< zX>MS1pHD>!)pvs&n&v+8#+6cBNn{!9XT7)J;b zRm_IEvi+D+vXH;sZ)CakF~qr3ZS{Vx1}f1g|33JG>lrwIjdRU_VDm1n<^CpOC5K@D zMbgK8{V4a-Vs6z-NJBZV61QDL{c+Fk1l`w9!hl#->BT}utY__Kor!El`FGOLy6`b; zkn-n|K);%>fDZ{znH_b2Bxu>2b&uI)Ij@#sxpwem%^qy1YBvo-)XaY5X&vI!X1Tn;;}7om@Wac6A%YMmn_drjrb zmeCyfvxUV7&LEoGREd9zT?te8*!C3K?+BvlfC)L5XF_kG??^y8lck*>)o*=2Qr)1d ze|o-TqL3$QZHLDplR2``Ayj9b@~cCAQQ6+@I9L+ga|foD#Iz*YR-D%#6S54|6ymU6ORl> z+*f>2kV7HTdrc$~PI2DF7g-+4vQ9Y0oO=bv;`Q#%a{S5k^E828+*23LC=2RY0ibT? zSj4}6dahDcZ-kk(r@t18aOjkvs(h_08yK!Z##K?4SthzoaTxpNq(srsCl&&0`=Mka zKQWmuGaT5NP^_FQr|64}DfQ(56=d@g@G5@5qlsp>OY^#*m#>>F1xO;d=0p-cD26gz zgOW)yE8_7_pWmEX++6I>!J8j3RdPqv%OtDlj_<`96`alMLU!>6nlr=rf?e$Ou}=fD zrB!b);_4mU#*1crPT+@jspvFuR^Vb89M`dloaYPbNM+rAUNxj6y7^kQVSG_Eo#)?` zvs)gQJ>)i8JPw^)eES>?Y9MhsVX>tu`(OR_-ub_JeAs1~_@;7hOgz5-c#@Xv~;ZoA~?xX8L(%SqRRIk#6jh0rRvs%PRXIAEGNtcihgaU^s*WhRgKZ8ld zF!b{qPL|SAGw>#-V0VKn5BogAXSjAuM%D!fckK(`5FFr!sjZ-?u;u0u-J~kPa zssHBexw3ELVL9@L_ear0J>kW${3}%cIt3QOzz)uLVmo@!2k=k1+u()Rs~STr5@(qX z9ot|2^s6&bvxBB--UAQLHa}aV6v$?57vVz~;&wGc+)`I6-bx0^OrGud64y_DCfrSs zQ4qR{z_JY5wsR$+`DT31cRQ|Ul}!lYPz770B0eiYl!G-iqKVowM!Qi$s$44@Le1mB z_;Bs%=jW>i7~~ICA(8lNlnHU~KC~IZ*-kq8?Fo>OG1q@K^SAE1RV9}D?RbI-)JETN zFEMM1kPmp6uNb1v7%aBOeX?BE`8ao|#W(9o=VmhED%D(VOVJ87``wo{x4dk#I3G77 zSHdFV&XZDe)4FU42`pCW5;i{4cfU+@k3x!==F(FoK|@)`x}%h>%wFtr>)o#%Z}(H? zSvqo{m>J~6;177iEmK1T4KN9D=sGfJaZK+L5xCN5*AbaJ(4*uZv1zT3IGx|$DU_|s zn36OueB0<$HcVhg`lZmdOw0TvtG8~5Zcb+QKrbm8+m`SL5a`%!K{11aw9osNakC$vy{3iMA^&7Fq^9#Z^4eiSg8X=J zolcZkCKaMhc#Iq4jx%;Iz8yW%B4YKcmqCQL(8(#Jn=w!`SaD=^@|Kx%2R;^8wyN!X-xTpYx$ z+0Z|0tOsg+YN^1|CqZ)#8SCQIY^dS-=8U>1ezQeDGqwXdBltwH2eEWw=*;P0WFiZ~ zyLx$#?~3l$B`CxAHqhI0Cz`en?N4ZuO+%0yX%y=xf}TTu_#exwH=ggVrzdN^AFtLU ztZG5w?@Pl4&LZa2KBDdtjJAvt5Cz)2n4P_L)Th?g5Y{gvlG}Wij?peZw(y1P4@=V@ z5$tqaqp?mlN`qa!&YjOaA-6up_()#pYCK3O=B52NBvFCInMFfaSysP*l+=)4-t7v|5-n zry@KW9+qz#3k_oN?f%T;#`AuEzX}W$6_-5s_lxLd>ZM|SuL{Z-b7mfX>ct>^FLAj8 zDa{wWoQ+bCUG)e{A?geaSBPO$GpRI3j@)L6SM6Nm!7%JuM({LJ42jV*j_iKq`%-$# zxo|Czs%~C{d^uOzdR#s1W;G$lf6#R~^Z(d7%c!`Tbz3Jm2{Z)PGy&3B0*yD;1PJc# zPH=*|LvRQl+=7MR9^BpCU4pyoUEkj4+_SHY8jSA24+gz@)myb@&H21Hb-|kusX+th zE|Pg|)rd{-fkFE>YNu|8ragN2Ir0}kf90NG9{2oVgxAXjyCA-8+WMh$6nfOY{n~g} zPXs-$8JpAPRqPx8P#LN{zA^<1aOZOJ=8u%R>qYLp#1G> zwNwZKk=Lc`ecb^pTk^AqFJkR&>^MnVGBdawjxa&=L6qpY9cm{HPKVr(>~v;*FUF)( zfAuP<`Jqt!0cGimE8j|IXjaoV$j>&(UZ(!J!t3Hxf^p^&tA*E-r!=XpCIV}gAX@%1 z!}mLCwgUFia^@6~v*iR`zLA!VIN^v-9rNr?k!!100h1<6A||~07-5J@iq$}IHt6Th ze14%^`jrnJm40dqeKj36XdUeid(Ih(L4Tcg231vvZX8DBGHu|B`J-$`pt_Yp4D-H50 z+xxwQIvOZ2w|}lifoeXd*qoS{Vw1gz%*Y!+rFwY0h0Q{-D0Z=Bve=} zJ4CKGx&HFI2I0}$%tIe>oQFi^p?(FgBEfpwA93OIB}7?ixk1s}&fc1monllvjb86E z^}>u#J`fdw_&16w7wyfYO2$y2QT~D8SWTD_2(iwWZ8Tjh=$O3h`K9@2t8X`tE;Bm2 zZ9CE>U?~250d{eM%Mx$XA&2gP0eL{xePHV2M8n2RyetqW(PAs{}!SW7d09(N8fM+l;{zCF)QE9-_B z8m-U@2AKroF|;&Z;B6k_}%vkolp&wLs5< z7*A_|bdw!gDa;hFzf>O!-l}7pNUf6TDXaN-FHbD5Ixc|jW7jC--vvtJE-Y<+2zALu zmDTECdtu4a@ww|`lUwXT`k+3C7sJB!8Q;Vn4$FIv%<<-20y~ItThW~i ztaCefZCAHGDSR;a$)o;=v{9l|K$)=nM!|?rOtWi$s!$a7u(m+7PvrKHO${mIDo5x8 zkbz>@kpA(t0{Dy!J@PznKfh8sctQHu+rdK8EUVnY@~OhX%4+rM=~1~@gFWdP72{9Z zkjn$Ons3+7Goo1L3v6-Wq@s(eeEd4MkGiMCA<+U{f&auve&LD(-V0^x9?!x4_Va$X zk+Et^v9}p|r${zW?4bY947ByOYao_-L_!jvrC1$rTh0l1s+V2y8jJ+QVZ-AjMWxL~0`Q0{RTHOShlOu`mUS5gK?^<3YG%_zGn zt>I?2T@S59|4t=LdzS(zX=*Vy%hP{nZ9eH$_4p@~e=cm!|LtzN#iU~ObHqnd1xS7h z{rroqQahT}T5$K_d+%-eWy`qkq&w@d3^z*92f+<{Rf0Dg2M*n$Pp7$@GN0dW5s?}9 z7a5Ah5Uv&(p5#;ngA$}%Dt&g||?2HhpdWZd#xR~)NEZe86%1lwc z?+U;Xj~yjNhj&pYBcgGqvMNPxmL%w=51g)IBsD)?Afyq?^5s6=Uh8iA0{^4@ZVhS9 zmrbceZHwgx8xqx(u7~gkKj)`+Nd&`s{_f$3$GHK&B4Z2q!X+D=nquzI_?J(D&e=%V zEL*LLIs1BA9?n>GDqrtoweA(Tbam>N)HpptlcYbB?%8T%!81&mlT!BPDihjekTrSA zFR6ZMb|O|Pk4&i3+yg&y8j6Ccxq3}v2MU)o99mMYLyky&UC`Zt^5+HX=Sb(!#L7Rb zJ=08c|6V8c);?_33Smh%`(xbt9h_n(o%qL`eZ!Smy-l$n;ZuFQN>MSDY_$ARbxJty zOWa{TxssWtD|8NrDHbygxf7!ntr@v(r=1#>Y`Z%$(B0X1;l&m17&3b!n>6!xw=^0I z8?p2m(lQN(J093@#ah8qc>9{sd)-n2YA2 z{InD_2DXVrWwMaE&Dz0G?_qi6+YdZ`6=peS#Hcysv$+4 zSVZN#*1=ty8fl>F&NkPiKOJJx3ME?Vj=~9yC22ZjDC$X;6(m6~KZ0l;;%X#x#5J>| zQ=k`R``J|!NU>fvG-)mfbjIJ;#CLyu)BsLfwSS^u61TGzwYvxxp{*wjk0`RHZ}*85 zt+xGG?xz0sX&2XFx04v7Ayo>2%yv_rS0CLMEB0?<4*x}z&?IXW4&9(9a2R^=QfJ5r z?X%6yiVc-+){73Km9wn@aoAkI%Db;HDTNk6#DfV_)hLJeW`5?~iW9CCwU}0PJ)7R6 z?Ptih*b=vk{&k0)dKf#JS zeOccOVK(t6Bwi@-#cv7)oXHIGGNY@CtJOw zdppe4z%IQWTc%OVn32yG@1)f#ARguvGZ=7sf6exe)#IDW-C?7>5WyrgDH(JHX-cuK z3pljNmNm1rd|iR%`J$Fjv&APqWwyx?r`S)Jy!Cj-Xu*5xw=%s1|7Zwa<_@Pn$VDF+ zoVtr^3!ZLS$9Vb2=rA7rf;E@`OD}(ny$bfJ+ia(G=$}Oo`bc$<7)i|YJ$uo;v}uwq zKfV20|1t<2fp%xL%%5I4qwDQ%&-611|E|{U2Vs&02)TbH08){zV0O8=2_9l`5fT&4 zLn8&d8k@gioF`&|U3Df(_Q-M)s8fG3#2w=%>z;#Mx35xc;f1S8_!!$@vxEa{p8n=4 zP5ayyfGHa95R2qX<5f(5*pS3Rr3@G!@9GVosi6sPMO|aD@)7aa?CE7fBw2R&QYUyG z&8ZuO2}j`nb}mneDe=qWPoDI3Ed=pB${dDn7_F|8M}{2!f$gskS;O>5Q$eZ zyrvCN#1pP}H?h|Au3pb>@Mh`N!x~Awf2opDj;!!RCq^&@a4KNH+q_*8!oeU|>&SEW zLu|-KN@+`0`LufDs^|}XbuBbRT%#NRTV>X0%k_4A+g@&VHd?!rpa5aDUb=-|ISo^P z{=~74TS9>kQe?Ay{`{+TPD2{1=t$h_JbS%VE`*qn=eB{}D$>rE%OXT4ujZK-$3)5d z8qB80h!+y$IENGUl6hTmk|++uAe~N9zYI4BRa24AcREG;sCD@+S@o$GG|KpWc7;Rq z>2;!aSK&q48Qub#88cyG+p)vbGM0~M>upE5c3T4lTizcMO3HkdwwQL7n@PxgxUX|6BxQ_Kx+}0`8{RUriwmNkx>~x)~yR$ z>4P0$__w3H`nW-@eMN%{k)q)8^gHdI=>YLedUk)WXP=yAY*sse6PIKI_PFugr*WCc z5^^ueMu=(IswH@8w*l>k1;&0Mc@Q_*xA%YKY)AgzO9>u|Ww+JOmw~p%pG?v{+1{Wy zh{uwnnkLF|GWvG^O*Ezd#)GK5!07A#cQn@kx!tsM$?E~M9}bPVA``cg_C?@XiLae+%5k18A6jJ#(` zwDCaM-K)h&kN%VtJL4g&LWBmTSD1*az<8eVoL*iGzY zeKSUDx_VqW!mpa2=0uMra{2(qlxZhx=VLcSnd^Zo^07aP598J_3!T>RTiG*Z4)&eB zD}^Zv*Na4uoNgqUR2d+H-mYSS8ou~k)8x3YfF!b+4SSM$#Af2z%B{)fC->NOlH|Ns z{k8r?!f$6I2vBd@UnY2)y-&5RxnuXTRMjNik>&|}OTnu7X!`z*%88z;V&r~_;TN=Z zsp*;7y~!Vu6d#vdGHrZ>9*eS-o8_RytPaM7upM2mUDcB{ZTg_6QJ7f}FYduubNGEE z=)Q|l00z`u`@YeU)S0{pw|nnr!`Sd_k=>=QHD0Ybu~Gttrfr4A-Vq8ki7$LQu4$4a zr~aw1r%CnQ=i}gnGw1Hn80{~&*%#^%kmj?+Lyo;PS2JF8pRK{wX51zVa!mY&i7Qsy zC-}hqMfaS}yb~Gk7Umf~G3o$Jv){W7=5I({rziFUe+{_*BAF4m=f$-)n=rGhHnqz$ zEfzMYNF#~AgU(Xvyog!TfNax=ZT>xvUBeHzF72S(8q;if&}O-q6P>QeY$wO|il)q{Z|(h0GBy{q3|s$mr=Q%3^&RwdyU@O8L@R4d zZq2uuYzkxBs^ia)v?-4|McIS_O?#LhWS0FH2A>u^ZYng_It3Z*-EmCRQD>K z(Hms)^h3@CN!$zFxl+NQ? z6{ND?uB+r@UjmD(Qx_zfQOoH5UJy80F??aNmU7X zKr@0TGj2q7(qX2zjdA<)&=La5DYV)qA>$?KU++Py`q}Fr z)t|#LO1gHreIcb~$=*nFIsuf3vFmE@BKj02L#*uXi)&Z5(aYAV7!ZPHYc0q8K#1OP zQsJ)TPx(2$b;Yu}={`ZlV*pWx@b^twPdK^(83Z$6lxSXmy-axA#Wqj`aCYuIglfko za|>lE*&0-H*9aqmr7$*pEMO;8ai49}zNiFQCM^qH*<^DcxD@C#p`;M`WolIzy_6=3 z;lfm)UzKw!IM`b$%}D0F{=%JMVvUTeo`?~@Fz}p<&kPeq;}Q7I{{*|nKGxImGiy(W z#!0o}_H&S>f7kvrGUN&;QkpwE+19ikQ#pRzT|GW`{lW)Y=x*C-)7I$aIeWy$#B%}; z*HVf7g+`+pRd^o$9EftP1=t74J@v&x=n5P(BvHfHDO3uG*ocMSVsipEtX@DUAX{@m zNwUA6b}849%@aDcdBN?Zqd#zNz%qtfn=U2rBJ#}PE86h0PapjW!h?=m-}`2md|-z6 zQ^3f!j~)6}#?1~ABNgwuk7nHc+0|hk28;=nS24s%qZN5SNZ0traAQF)PJWy(0W@tj zwysu^uplnish`rl85c65($XE-h%!-K{qo>zvV`VQIRi3Bbu`?mfGDA;w0x=n-K2!0 zaXh4_GvVN_{hTQ(q>!qPEHd`-==Cr^e-h_)TEvRB?67qGENaKV-+xa*kMXNU4)b@H z@4AH#QNy2C@vTrFx$gKUEC00?T93+fqFK5d^|Gt3e7_ELf(2m}+$Nj9-tQr9Dv{Ov-?&JCr&!ZK^ezsYn3uPAi< z5vBWy+y+g%qrA9~pKLN&$eaZFPjksy&Te9CY?9=M1(9Cr!RvR$vmc(g^!|z|6)C(T%I^V${gYvao~ia|PQ>FvAVeGmCubgi_k= zh=+Q3Pdkk)v=%7KKUwFF8{1BoY6{`n8!d;C4HwV;8Dmw3n7Lr_)O8o@*8ZTmaDe?p zpHL#5mYhcsSop~i6(J&p)NV!X9%anKxBPyT%-*yY{7}C}3#xP^i&cop+Zf&Q1%o5b z4@Q4gc5-pfI)U;BHda4Xt^2>3Bg=be-9n}+X`t*BJ5hsyqcJtX;9URcRsJ?n=*zVY z{7%{9Rh%2zLL%a)*hA<)llXQ%%hDo*$W}je4ol^FBMNZ5^!RQtjlMW>}BRcysJaw`DT)9 z5Mw);`E-U;h#tb@-gAQl-{}oC$2(+2^*pRxQcj|;%Mf9lI62aSQrF$B1is{x1o~lA zG2ehCj#d*A^3)K2(Ap??)np4vts*gj=;k-7=R4UgBMyxr^;-v{1a@t2MXAF`~4(ZZerwG9(p!WzHJOkpANwc>O zprKYfIBCY|zsnoZ5WgyUa=_-*5?zno8hDm-29f`?$#izDNN`7_!-(+5`E4ALY~H`w z>5I7D?VF)oc$5hl)vrJdQMHj7j@K?-U-c;YB&OYps1o5*Te5HakxoxXu~@TK1;&H4 z9j>PWdNpJSSahYcdhkJit6r(iTOnEzisDiMo0?m^ZCU;z3bQk(RVT^fTnN zo0x)1(&BHJw&axEj>b8hlv5|#Y6#@UmK z)4)!N<$;@_wk|{z&}Lx0^`^<$k3&v6GS;H^yU4HF@FKYJIXBoeBTT8yn z!k@n3*Tb}?VVeAU>l|LO+P2>b2mdaOpBp=RM!ubXno^-*`ARF;9g&d<;@Z^XKB@4h zK5Z%<5f4C25T6VxFo_i_d-8iyyi_NP1f;)b_T60jrO$tdbKaWpY)~nDPqF^+uS(HJ z3Ihv9?mNnGsP%~Iz`ilFU_j3znW*~d#Ji*Nyd~)J=OkYg}+&!9A-Ke=|D4VTW=SQdS^Q= zzs8L7po&D4bQfI8jPRdhfdt{b({E)}sX|MOuCM`IDr~AK4BuDrzp34|EtlIiah%Ls zkw_qsQDh`ABGvmeqLFF*Lfi>C!nB-HJe_g;UB1-iYaH2tPC+*y4{%R zZPed+Cpt$Rwd1nxq&sm7_fJhW*gG+$n3GaVgcjK?rgO-d`DrjUg7A521N3ydR3O6)`+aYbI#d`s@6EB$}k$C0gDpe7&&-K>jQ+aB`RAL88s?wXGhEo}~` zmKKOpA+lMC>{cS(_)ZzWffFB6o!w5V4Yq5cAdKziYTf6T53l;+2mRa|MblY{l+q7# zH%pz?CGzE*PaP${!hSvag(I&0yh3CFcpZ!+9{y5bgMHoCnlun;&5T$&P%w}Aqwry+ z8OL^`*d%n~m*3rj{a^7-Om0u-rcIIwHAdb-C4Ik%S;wFO?JQlgmf( zs)*s?P?k83qjy@Q=T^o+NN3f)X93FD&;rCtbVlhoeB*3Azt+_#)$m>i0b*_p-fN<< zy-%y6FujHPFrjWDWeWH>&nvrbQKfu0WW7Kl`7}Rp_PIPvB(MedM6z9U)v$>7gJ=~r zoVr-fN?K3p$4zh1i_e-Jx(EODsUb)?G28eotON~%Z+0fjsgm0FTl40zUl0HI=TTL0 z=IRgQx!6V&GXgP1+1DZSw=F_>tv6!*cs0y0DN2DK&<%THP+lx8i>wTtC`)){B?4Pc ztdVC(bm!+vmojBcs62(8rvu$-~Sl~k)QhP@aZpE z7t;0L0xV=Jnb#6TR_o%{Rc%eo%%3VE+#_-B%z`^uODh95CP%PC+f6^8Ol-0)r6`A| zG6@K!%0Y?p&kfE#v`3?wc_H7%81rHCulvPrt$9T2x(%>>_kXC!Rz0yWWdQ&^3Cin) zv=%DRc`4WqZ(d|{kgf_8r!j^V&f@su0@+JTH|80sG)feU>RYx+?Xcn*@C{U?E1pJ+ z%ic>4i^izX!YlMTaft>yPi4bD0i$)=xApFl)UyS0* zbc`V@u?eO0jWn7`7J5rCt|6z>@Xbp2HQNxW&|P=B5(g(4^7KYa=h>&>Ub5_iemX50 zyHs*pjC62#=bvSoFdu85!fp=vW#LEab(yJp%rp7V;jJqo%_yM3l`cf8UZ|Q8VZ;Ai z{(s(CVfxN4&ef=7+qxPcQBue)4y6gx3Ld=wkEEdZ)&IHj{~Ge|d`|0>3CbfzCP@7EapsNQkbbO4jTt72={Zeb+=|s7j}{hWuIRP+ zru{3`Bw9EWiK-p1L~X!M5E91xD%vb5U$M4B$x6Bh`?(vf^FM~AI~rab9s+@C4h7x+~zh>Vru94&zaZECH)DGaw8?X^q(A?m(Zb(3CN zdY;JwK|9%~N7X?L0s1O@x{xfVL2h3S&sxYWDE#szI#7I_-OGIo1n$gQmR7U*|Xvx`l z72n&;q^yRy1bFQ*hSy+kMG4**dUOtL4A9z17=>f!e<;MHiX_0NdI91>*jlgHewFQ$ zYOqP5UV6Kh?Etm2S$PYkCuX7XsY9BZMzBYCj}ZZtFb(=q(>+)d|2PSFQk%;4vdpLU z!mI4zMkm0STiIeQva#9MV63wQk@y9=N7itmOE35aHfh=GQMd0_ zv16{?wo2z0!RH}At!6*HV*}Oma+95DIuIqX?0CFv8H!Vd@rd-DNPZs^so1qRaQcfx zr8mIaJ?Df~+A{$;c@^LHXYhtrl<3V!9q(a>Y2`5MDXo?RoCQX0W>MD~d^2ZZ0m*m^ zCLY}QfA4tPVrz_M5K92DKMg5QQaQ#Z9&_NPO`vhKFo&8c`i5nAv}0=2J6?6_IoLw@ zNXHglDpyB^SOqinCSJw|%I?1b?P9$~D&f59Ull)xqmkuq1wZKL>}%zlko)I%iPp9D zhE&o*`#HhrT(bRk1-HE&Vl!XZ;Pk(n>C+tcXRI>`K6oe|0;J!sWeRdHEIjk>8T+Nt z75w5qtkG#^e-qy}xjNwbZ81~ASYSj~i9O{RpO7MD+bg+Ukt)Ul7vl^GV{A^O5uU&# zoO*7$UMzg;YE-q)r}?lglGv3ZXi2BeCp+|@~}6- z|1oIkks6s5N_u1*$m&a@SomDAWY5%>|As<(9NRA1&DOS}_5ECH#(?Ax4xwx08Sn?q z7KlasdLChx?nJiLgdG`xwfHxEJVPP9veW7!VC_!gegKxh{@o$Yr8xONdYRmgd%xT+ z_ZmuNc@CAX;kujwZSQnl2aUM};JwsG+|~QP%%=*!;IJtqra7DC(Brg_Bz*K@J^gZ? zOgA#@;uhGhTcgdf$GPAdN}~I(xm2iHn77@;Ez5VZiYQ-+Kc^dIO@$i1!#s1yXux4$ zy+Di*c>GEtfo?zfE4^yg&xUxgX0JYX>xbKuv7M$ov&sJW>-Km?A+}c*T61Uki?C<{ zsTXBbhmLc0ekwJohISZpFN+%+Je$LF#^~c%z92_DBo$BoX)m2~iiByASk*CVi;U9h zc3-g$l2TYhQa@k~;@y}EhrU@8bp^T*QmxY1&?1Q#3k$9>k24TcAFY;(d3LZH^2TEbV}hp|7Q*FM8kWBP{T}Zgp$}N%@~#wr5N5QkmX+y?CC+QpDJx9kpxt; z!BBx3G;$M~Ub^%TekTgcpVGCtx+udoQL>c`Pbfs(0xD#62IxiH2-~IuqJKE^xqjpe z*K3wOdvh}sZx(wdj}-2ARuW~#4jxPOshsLyy3RMXSQK%jQ5dGV&R@?SgpSi~J=NN7 zK=uL%brry#7v*lxk62T)wj0{G%UHZ86e*{!dj;1qG0|zJSGju^IaJvYg{|v7A67OZ|EV&)j+W%#k)U|i+K28YZ_9+xiKzH#?H6jSlv&_D&q5%sxYH?D-JI@-l+`o*oAohKn)=I8z(cxM zF~GRt3f{a23^*!4nq-}~BQDMs8WvzbYwPEPQY^s21CNBTe8T0HAGX1 zvgo#s04)9Rq{S$7B-bM&LcC**c?M zt^PJKCh{^j9Xxus)0)=y_kMH`-fTF~zs>>Vyq#pi!gM0Eiu&N&NQu$!w&XZdiPdop zB@M8nBHwM_o9R|%;XN9A`_^0QoZ{p&N!}9bBarPuOvPekI5iG4)GQ-Rr1^)8p+y+H z0iZtUI!NWq!;`V*yrN+@j)RHi=4f0{=FTUTs$Sbe+tXwnW0z?;@LmDNGebn))m zL996V_zRI9GW&269w)MM`f*>OjPLb;UxM#e{fuEboBZ8KQVma>Zr<@)eegc&Bj)mZ zdwmbI7LHVbV*qw?&fkyuv{L?ChwO#M==(y%5TUZApX9BJd1l9)i#FLz5*I^DrMpMX zLb_;PP|zc+*`$|ro?5D$ST*(j#t4?=ky2P}S#v6+))42R`a;pbIH>Qgdc4zzSvXe} zd}~^@rJGC?WjxM-Qrla4UbAmV`fObJK3U~lveJNbrj+Jfs$1#B7%WxB9dY8~hiM|) zxm5^6Q7MIU-v&zcqQ!U$`+=AwMKHUfo-Gvow6==s%F3qx)+(^=_1_L(sjNP$Yq-Wc zsNIm#dp#sv6=J>4FYH7wolAKG+Dt1AzyCZT;^Ku!<6>w0fyt4Zd5vCnd2A+6zCMcv zXJ5+S(vtu0$`TI#|5cVvV-7BiSmQpUHw#3I@W6{mCcZh;4ar3JKz}KUEzFN$Xc~GR zA$F}+%Vh9jnK;Gi`ikHmioEJb8#<~o`t~Nvv)cWnb#1i4y7b`}H@wb7Tz_I0AzRgp zhDb^6%zeU+`w7B;TcWp^5u6(YtXJT+qSR=!*z^A?I`{t+olo;tm{urON<1H(iCsT( z5+zmHxpsY?2Y^gUw`W_*$IDGq9axbHs9=XE3j%Xgg%<~n1H){t&B8#VJxufEM%Ukt z`_r#*t-=UCDhLIc=eGS9^ul;al}@21*`63E1D&T4M9hLq_9IKb1^n;!zWX}=8Z+$v zrD=Uw?376k^Sr;eRAn~v7?GnyFRL*OL}j~d1b52MZFH^@M2CtcH8mTtC$q)y>LSM8M=t z+jzuUR-JL!&wJ8rN}fL|M$4mDDe9Dv@WSSovvg{yL6!dG-Kjt7v`}k3($C#-9Ykgq zEU3Bf7{*x_P8(BW?`FNh5Y4tCI9ELazqfmEUSy7%_r$-P?dv#hSG=ZZJ`=n>K9(fZ~$VZ1cc>O0HsTB z8MPSjzuxxx16$UV;|TA*6&Di=EPdYCaO)&635VQ@=XKiNR3YJvtg-^NziI@7VjuyT zoNgfh$v*C6k7|*c{1SlV$QdOrOqSPm;5?PfJ1o(sctoFUzMi*WqTfh+2zoMJyg7yN z98Glxofvfxn|$~e&*k~idC|nlfy#h3Zc?`-SxR%j@heZ%XaR@ZBb18AXCst9&vW)h=4^7O!_(aqXzQ{m7v zC*}WEE!pRs8*YGrp3(+B+Pc3mb<+!k+C0Jh*^cLCGp4g>Q?p;R+DAb$B3@*7jG=gv zV35+7-8JRxwtaZW%S$5i-#T6Q$MROUVk=z?S@UB%R{xRGA>1W))3NIA-Y#YUIrh!) z`0-HFq>uE$fDjNf|7S#5BW)()nTdiW|LUh6e%Kal-b`e^Imi!)tbEPc{Q38M7tt47 zR8sJqX}U+?;?0-g9kxE6v*m6E4h{39X$D27o8B_K-E_&CZ zU(Kt2uO~TIJcdHpEdQ_;5AqL5V@pKV{LL5%?MN_1?R_bYC1+9t4^uIW{41{O@^CRR zG6`%&x@_xSrjZuSdmk`2-Di0=3{3U&KPwrE@V8GoU1*i+H0fbq0_*w-&jF6>Nt^y& z2Nu5)03!gmG~7LxtTW&Vu$xaSwLG6T%*Q)vw>AOiKOdd}szhnk??+EB8gChE$9mwK zur}o!ec{EI;WXX|up?ffmP8WsC9gyfvuX@cZoOPA_$D;)qo>?2L>I>YQKM=TeN>XE zN$I2J6;+GXC)|Ym^cYi(!wAl0xk59_CO*0vx$iP*+^2Q;_S?KYJciKRiH4bvWT=qG zzr4?l=F+cxfvFG>u;myKgaeBJUIl0s%eWAM-1m9Y{)~i8o5xM)En) zyhnG+(N19bI0zwr_ zkCsiIsVpH>$JQs*6P^d4yF4X(FytWO{!}!A3evFVWP@iBn0{csA-xN3yj}VId=np{ zJ3i!@|DAji@NgIO<62`9b1N;mOkfU%wLD!FCUYE$R|DT+C?NulAQU9^oQ%_H%lcYnPrtZr$Q{3cVmkTvlEh&JuOgItiVyOD1frr%l~ z@)EE7lu?uaf>WtA){|XoIdjCKP_*YJu%Zxvx8Cw_7uKJ%ggmk0yz)3Zxa^@I)5^|Q zR=~Yw)FdQtJk%Woc)sy_^kKDJ#{k@da~xC~=1RtLy_JCPBsia1gm?gZWl?KrI`%1B zo8%Xqz(Odx$`;f0nxV}CT;%PM(?jUqStR7YSpYmD zpvbLnku@^miM|^d|EHu#`T0{M)1#qH_~jaf?2XZz7{%~Ky;xz(s?S{SX~SGx(GwIE zdMQ7w*t}6QJ~ayE?WN;trF|1bluZG?Wj-5d_e!SW^hxlnO6{d1?r(SrKdbJbOu{`e z;##V(yI+V?Q4(7Fg2yI?8Ed5G8?i)b^IUS5fY0{uiC@xN?Kkk4|K+Wsj%tb4+TGme zhE$c(>DVooI$tM^L|~Ig{S^`&lEcoXK3%RTdR@$%fMU;HnUN;l@N)0>t11cJ(83x; z$IGEw4PxZy+1>KJ7UdFkipKk=`(s=E>z?D538ehm*p9{(tC^*nX)uWuvJ|-IX`?>x#3l;#~ntVmEqz`(v z`oJr~gH_h>Cib$}EFT;GFQ% z8TsjfNO>VvY~L^Iln!b>DLH)>0?3`78>qxc{Fw9_AU2#f(DFx&uQF_0`(stped@%@ zCC1YbK%EeW8eYDnbJEAb1~>*M!@>F;>U|+gYO8dKJgj-6KlPGi;C{D&!JrCv;Lox5 zjqjOJdW^3BgOvrAylZz()m_WfHpkY~#VL@ue^EMq%QX^Z$D~Lz!Rh&Kum3_{P9=Ld z( zSt;Y(rRmWg$yC2DGRhnaH}51Ga;R7-QcYDWjLhr{ZGHqsiumJ9>_FvMO{^$qnW#@#vuxeD+=M%8kB`L0p?-?^4<#x14J|j)g&)l`(IT;61@Bs{u<77dKb|-qj1jXUSPM!(BqYIw zyaD4RGkPN`b87S^B0^UNIR1+gR+C|_gAj}GYJPc>kt$e$pKFaW3g<$$BkbDE=eliQ zhvfk@SG%vSMMMDuc4CqSn_;n#QVbC>v5nQuE}8*+5Y;Ny-yQ(=)w_{xN@Vsxy`m?O z>2bBO+S?%VbqEpMCvHS{y|9hs=b_YUC6W-o5X(cOw?V~^nYh{Ec{P`> zM50_se+qyQDSy#8Wzs&Jcbx3UPhUr7qa~?0JbGu(3p{|x6Y9ET$%;?@t%2`h%@g}9 z!BNS|_)E{8|E_p@_7Nryw_U45@0PVF`QKf7TI+WkqaR*~^#CExlml`TA0p>=beg1v zZ~L^|`$)KPYTDXKak?ErSSI`#6QNE;5~5s#E5Pi{FZuJ6b;5-IzKHv*w_~?4EVh?- z{)6M-m}sncZVCFS&>Vo&37c&kzO@=rUGcidOtHIv3OZItuLYQ6fAq^QUa$?b2 zB66a#E5Dm@#@j;k@wdy)w=(@fIa3FO1>ojq0d3bUfTTZi!|5Rhpi4Nk*{|d4jDGIf zFfJssr~hobsnzC;QkVHt@3>#L3~=05mp34VcECYY$8M>Hg_((T31*ejTWwpvp$a4F^BsJnc` zt3Ja)H!2>I9o)rJ;NyqRaUd59GH#bU*3<+u4fwcg&M8EIe^w13Kuc}!fYxTtpFtch zxe@AS3B*^)o*Zs{G9}A8(rdJEu$8~)f*6}&C9&BmFBvW<*}C$OW2{B7=ZcVAqYqPBQh-|5Xz5n~n z`QNXh*e|V9t-7Pq7c;*^L%9Ns-mKhceapUvt5ZV*&I^pR!TsDsP`45^LkG8>Jf7027e(s?R} z^zq`%SU0J1RpXvYC}eX+qh_9s$2igsy|kz@H$QD z&Afoz+SsrRQ@H>gp^`xMj5b!ii?1O%m0OIIu^cq%ETLb8L%2;1EgkCLL$g=O2iysi0JWyt&aXW4!c3&@8^Rpy5m1@ZT9d5r! zW;SF8^4;(ZBojkDK|+a{%#O8-Uedko0jB00<-g#{giDK=N_8+V5u8@L9&dsJ*E-9i zc6mNX8uN4@3cQJHmMxyXd}z$Gr8Vn%UdQ|eB=R#vo%O^E~%!wSQo4OjZL_6}|UJT~nN)^gG$PhO(sOm0Bx23KE%F93=YwZuX&X1YJ zh5jGr4|)~}fyXTHEMrx>MXsYz&%x4!-1JMW_|AZjC7b z%Uy9(PEYvi@qay~G9mE_`*1c#z@5(8DO#Rv=JIbhuJaQJKGGP9l{P*#x*VVTMbm0R z`MjGCZu-itp;}jFuH9n21x4D_%(t&5 zi8W&_e#uTJ3*4pLqT>m$r2#JA=^PX`dLJvhL*d%PHe%e?&>Q>AtD1&E(3S42Lz*1k zkPNv1$!B;xpcliuehi0<^5`uN2B#D_%<_(>isQOo)sIz%T6o&q&GutZSXN z194S(L|HOVIUV7R)P9Zk{Yp*e$f3W}d&hKWj8>8A^{u4TF*y5lQe$t=VX2`NpPtuA zDCouZPL1u1GW>^}U+IZaqe}s2MwB37p_`EH&Pouz<%F|AlgDKb2!d{+cv`PYKG(=u z=OkR-ddu?VIkFffgytr1xXg78`F+RsC36*8&=C|?^snaD`5k1Y9$_ycd>ZwBnO@5w zYqn5=X?V!cw54Mq52mbYl>rG2wBZ**Y2Q@C7##+XimxR*Jfd%FPZO~Q>rttEv1wNu zZp+-kWGgRfsMm2HgLd0Jn2DVp@y}jZyh(^|0CKwoiyZv!+VN#A`x=}}n1ULo@MuaX z`Uh&Gq~BUw0F$x#`d{Vv8#uA*|G4itWtqG> zj$|!Y?J7cKoOQqcX%=|jOX;w3=e9t-CvW;qmLqp5S|dASD{C%@4;9I28Ey19drk02 z4E_6Z zIHcz5YJXm|%N@!?`Ia{nCdQL?egi5ns5dlFe&sG2cU_G_VwR3K0$(^fJz?SZG{W%L zx?d1U77todO3uy~tTqwVQt-{2YE>jue3mOK78=Mv!T``5p|(mi5wb9ltntb>g8f%)|(h>7h|$PI(7Px+AIKe4Uff8W0TX5B{q#D zYjb3r%?3W}=$m1aCU=B1C(p!ooJ-Nf0HfL-uzA) zG3K%ifeTTd^?LJ4v#H| z{<&DfZmfOs+SF(+oe^>?neHOK0b2lTA3$egDZ}_vmKUhDIh_UwIpZ)lcd#WtS4(q6 zi{+NjAbw}4U2)6gXh7=GS*lwbIcmclp^VB+;kWzyH4%jJ(*6`sc0VK|_&BRidMV8% zmw+Gkh-vxT|0gv|40q5g9;>%|VO+7v!?eEcA|E!82!9o@^35yOyl-&ceB5ujXrjE9 z5)Zf)2M){kzY|vDAw@EqHz`_myU)GGJPzV^%1qzFYAxkh5geV~!{1eHUTKlhg=oZh$D-&psUG~09m66mBW zFt-uaI7oL(*-~IAZ}DGD2G^oIqkyNV-eLd_y~xI)U~c-O!tJc?tyiiQ#F3TK2`3t; z_*t)sO|8sBd@sJngBj0%Fjo=|M|wN;-+iD=lCP% zVbCd5EAZTY4ZWHI{O0A$&7a$OV?GVm7E8Tcbc=9#fPrVvi#)W+@FHTh0~JAwNO?p*atuOw!{&30ybt{;9$somoj^7Bm+bsS7!W z(fX|q(XZ!qM$ytbpl_yQxx9qYejmE7;xcp6(4u@Lp!>_&gS#_)!|Fchd?;})*@i)- zAPI%qgN0)@e}oSg#xd$-Gc$F@kJWE`wqtCYwcmf%QTJbIes#c=#$_V4Y=TNui0?ci z7@Lt<0W5r;r2IpV{+0 ziLKjavmEbD3Z&5Bm3lhw7I-3detsjlcM$sfdm%)dK5=F0VZb_EFLa{mpA0c#Jew3J zEsD)lvArsFVI29vs+Vam!rZudc2Pp3hMf_Pmq8!?X=5|ahe(_5pMK_%7{mgdWN&aM z!xCWHDNj_od=i8BVBuBJm$244QnT*F0l&o6#AcI?i}*>z?jxRN{6k%x`?=a5fX>N~ zXLjZb2`N4JqbIuxpz-kSKtp>0Nvq`iFK!o4)@{Q3k!7)#6Gl9w!y_K7T9Xd{KbbFg;eda*-s!CFRd^*?kqZx35V-p}dXdB^I z$8DdL9@LHZSX?gobk7T1$r?ml$s7G~EA~d|g|4Ca%wHl0A5g(3d#I#zwWs@ZYmbtm zvxI#&v*ls_PUri7@7JCe-|TB)Oyan8HMUHcVXA+PzglPHn+)+kLc1Uwy-aor)hFu& zwNg@&P8sDY^AyTKYVpD3|8z1f?^-cYVSnlcPP`r6B7bBKzLMqCxpv8Fc~7%OPqD3Y zH}$Ca`wd=vF%7#OpwXEJOe9(1+t@C-vXl?I+DP=X?Z!G3%zP~R3y64x-Ms?((30KzBiFGeKH{({ZSJaG7*5Bc>Lq)OFFa(;qlWQbuORcfCwFL+dr{X~y41$e=&D|&jB*yvXfX*3{eUL-BGx^_T*t*kP zM9z#hwjzB$?NH>eP&FP29$bX>g<3E6H0xva&j`JyD49NQCai_Vns`ECOOC47_1O!GvH`(G7hW3m z%uB~U4X)xsQSAI+5&fg<{-NZGD4ti3$7zIAbmxS(iQxd7*3&a0a?sX;8`rr1r773| zyPb5G9EI-p`OwyM8k@H(5`*IV{;$&TyNq^)*E954n$95^TTymsN2cK_dVp}w*jM=M zO$fo8iTKgS8eze5#K9Org-3)lg?zNr$y5XolR{ah6N{MCvLH_5<)58f1vXeR*t>>{ zsu|g!0G-IYvoVw)>MD5uo!j(l*=#Ss0uL0BZaz|w-B5OOYX@wzHv-(;nFdIr)+d|* zh<(};$vs|l?fm-^e#uCu7h7#%%`%lmVu$mr~3{E^BE+_{`h zASNeb%=zRuYW#-Upg<|l4#`*32A1)83B$ImsgV-~G zWC0m*NiC-ZZ}EDLhN_Vgm13#m_nW7MWIt|tL;cgbpCL(DG&x*ct^7Z(75?{_{@~4u z#<)4tpit6(zy5z89nh*$jpPp)+N`Dg_s~NO{a;ep5Ub6}FW;WQW`1g9fqb&skKHNO zADS+Tqs-nae7Q|EFB6$xwct^h5KK3qsNR46ZS#uNfA=Z9DzQQF#wM;6slv4Cd|wFa z&$(<;H_dqO`_8%iFiDJ3KhbWl^Sbo#z2@iZc2v|hRzR`x1Hm^gHs;3w2=8h`X*4$4 zM!g%kT(!xkIk>9;S8o4VBw^h;*;{b8+3p#k+3S@`X5V1;hcp-;A`muQ7jPmi1T6SQ zSc?PeQ$LUG3+Og;@OfENtH?e0qs$^wP1pA|IcP=3kEFsyd0czou|G1l&#X$4*(CJjKn|TOd#uK}G+g>x2e+C_v z!^yXf#$NdOHt&-?I~0ail`+K1@oEIAdKRnj0hT#ymHtSzu9eM3X4dUBaB86r)z=XM z`qF!`6*p7vRDZ_->TsFH{NKorJ;67ksV_4i94l`H3G@(nx}Y;RJh)PZ_09ZNjST@t zogMe;a0j#({hbIOH6~9CpfG3bH3uHY!!ARi36XDgIw$*&kF2(8X6A!tT^(SB=O7|J z-r{rpli0S_$TXO7RG$rRPdF@+3~VTRv2APn#kOeucPop$D0F%H-cPrVYp}H9Y`dUn zL090qe;Q^H8k=2c2E9PhLF@kv;o7Q%*xQb^K_359Zsm13 z?elVydwOyl(j?f~nAP?l$w7YbfRiAi%jv#~LBrhEH&st!kO0KYw;NC+!G!7idS~4f zstOyslMHA}{i1I?4~^2c<5SRMwe$@(so^%tVu$`tak>0;xc$cKaivG{KfA4k7ig7@ z)rYxh>r($sKL1Y=qg@MD_tr?=@}KXnH2=~57|VPmEl70pYafo#;SWB%{ak68k*zhZ zlE*&aAQU;8qV)cAN>}ALl?GsT3*VLTzCQqVB-bTGYbxX~4OrR0E8Mq+W0DOS0W)Xc zVh{SR7l72D3GKvuryXF_kR%wuYt3}`H^I;2lSCX~EM-uzoJb7Mzb+~>5YV`uQR;se zU(bK?%ejXn&m3i)k>6%(m>oYmZ3?{y4O0;?pThr6|tipL(dSyFSXkWf}M zNaOT}MeV25yvh1M|K1P&=r5rsp)(BfUc_vG*Qw8{e?sD!@0ZCHd6g7@JNX7OVixPB z=3=g5Y5x;20$SsPbg*9YODL#vEMbO)o;ZQuuZx9jrD92>aTK^ z#!1H9bk*ll-slrDGW1equ|C-ryXES%y(Zyvg?T+dPWN6tYk17)E|A=in{dl-^?kAa z+I_@1vOB)7m^h)v*TnqC^sev={G>jt=ZXSC{bEh;tb)}fuKWAUY|h56A_(^;i?#oJ z2r$n|(avBpe%=a~1d9l^dKZX68YgeY^&@i$dd%a1Egso_${H)L8H?O}F%mmX%uQqc z{y9+@u3qO=rAaB~dDSy{YTbqn2w7asl2nSh)zFKMI8XJlQg!IW4#tMU% z8{Rwv>CmjO41rn+2d?|sh3AuqRr`(;4J4Z+o?k;AS3VTxJjgHq(;t`AFJt)AHJXsO zoLS`~RFx(umP3W{K}`gJt?0xGsBJL)NUhD?F1xOEz{NAw7-jO>ZlU9GYFDeF<7O}T zX6|d?F~udrh*{2j8W}@n9@6+2mM=LmeIaU;)v;7XO*h&*=2IWA!rUw&S^^N>z2RE( zl|F#|ML>G+p!}*dVc}=tRaK=sKjAOj9!RaAi)Wv?q$0>wG%lKrH%_Csl<*gQ&trig zPWQ<+lV@b0c%{=NH^a>Xv`xtbd=MD=>ECg@$bM<{6bJ@IF@;W3l_rmrJhuN~kdJfG9&wh2F-}@N+~T2j z-j2T>t`;~aRV1*htwz;Q1GK0FbCZ*=RV7AGk9(-}Rdp0!F3#I&_P6N-%^4gS+patj zU&cOXZNnJ9f+F1i%b~B}DmU)C{k8UXrX-MsABR|pN&uw~`bxlDYcl~R3y-3lZmf$D zbR4&u0Ic=m?Hi=wKEK7t6%OsxM6(wk%W$O@uwOLJUEdGI^Rj%t{$(A!@d43Aa}JhU zFwTQGudt;>QHrN;@Isi-UFe%+_&X zc(4h@hFz!k0Vn}PSG{i%66HnCaFuAHV=pvotp@_viBX!gf0%5lUX6JRH`+GTy;VN@ z+Kj1*(pu<`xkU?I`JSg#lp0E0WU@6iZ)dz5z4-wduo%Qo4IPq{loi|bV_7tV@}Uv& zLXKCvWJzuGaJCdAhI~ef`@QO{>EsoFF*fOyq1E}@PyXg5r93o{?3W8Ddl$Tgd!*(V z*V#-7?g!!Mg&Yj}QK8vhGgO~G$Fb@6Rh!LEM)|rw&JY^gRmTm+4NiQDd<(9VXqO+7 zHnQmG&rUXedXv2={!1ElEqGJot@y$3tuLsQH~klQk(78pvks}L zhqNOH(%gT9zRX;v+n(gB%f*EV2z|R{Vc845sXeuC#*0cj2FKRfAUpvchB5Yt#5Ml zLM{vAojZ7DmtUX;;lG;xC>yzr^=wH>o@W2tq2iF(N-;x0;T|+bp1qF#W_1Yvus6}` z(RXo;C!ODgB^pXPuO9Jz|2Cf`R%|3%Jze*`*b+a6;AeXVWFeck$us(X;n!2&?W&~n zj^5{q;`$q1*bm9_g00-VCVtcWz2$6lObzcH|Qa^zE(#pYW6N4w$mjp zvMP)0noD%ElxX;$d{~yre7L>fjl0)3j($Qo#`=IOtHz|?wK4Z0TRn+p@CT!v^z2*s zjaDtl;_jv7_w#EOqrXqS-SBjCi-wH2W|_rU*%eVv^6n8i-yc6^#cWBR{nKZ3f6rI0 zvhiHs@HA4}g=$W+>8MUL`xfpPkRB;svoZTCE)rYmFlOmKGnPX2=0%Wz7MuWRvi79;|uQfOF|dx_#*x9 znAqxZa2YMC7r>Mb-IpGyMxqLfgJ5hVOXtu7>Jw&C+zB#+SBIFv>aV7_NpnDk}f*sWZNxfX!X8l zYR7b`uX8(Lv0VqH zGS|7$wR81}y(BN?W7Cv)Mmn+?KQ+YhhA><2WUnH9?t7#*+G#DPP-y2_?@`WESPrw9UOEFU$hmvhax-w6mLTOnTWqs80r7bUV?sy%6XXqmq7Lmvr^~p2g zoe~ghVrJU*CLe)CM^8YQ())&LooUUn_Ui`Ta(>V~ zv5LmCQC5U2bww#D&O1s8&E+RYsVEjmgs%qL`ns^-h52n~16uQ)%TPX_o{tD;yz!GN zh#?q(9YbZOV_*34>6iL6B^bM{)pFxT)8yky<1$l7bR|t}tCx6M_Oz|7I0Y9tAE^$b z534D=j8XghDyR;87~^Lgj}wzs!=EFg2@p;v-ifW%%$&|+fv$YXo1_^-GMQdki+zDL zm!)MaM8;NY=D?Hcz9e8oSZmmG(_QJLFByPWwuKc{jpF8A>*fr#($&VNDR^^5oE@YZ zjEMaVImzcFMqRCk!|#w#8cp+!#V|;ECXj4{9NYg>-#3~F=VyD_Z6q(?WfRl=KZOl! z2C;TA1e)@o4WfL17hJ^SstkG0?oV2RE1fIMs>plBXHiNCkd~M8Pi;aoX?~^nAieIS6o(g$@|P_qgT^6du>7ENTNVZ zuVf(nEDT;>d$db9cr@?f)HZz#CGvFP2IpC;bZX^1xm#>XRBZSQE=-38#Zno0zoItz z=pJif?(_HPvFG_Tp^Kgu>Y24oByxX3HWoY-aB}mu>iK!kmzQG085uRKep};SmI+xP zyV^@FzHcYouJ@;X>A9|s-V^C?9HVQxEL?A(AEjx6+qMtlj;8Op9DxeGg10^0H4SG! zospdnTZs=HpkzT?dan_{#}iEd_iJ!R|9IimVB)~$$GzmXwaUNyMo)h(?rAZBrW}nI z;}^4s2dGfYdw8avL+e2E`i|${uG{JzlLyvu%&YS)cpm1{UHY* zy0iqD*u%rz=+65cFl7O;(1KkPUfIcKJO7)ZiE-P-5$-j4Srr%G{uxZki)UFMg>N?Ei;tM#m=Y(?(h_dd=3ptE z;)Y{aOUM4B2jF;`r^^D)RFxPG_BSoUr=m<}1x&to=p6f266ZFzS3`yH5z*r>k4Qa) zY3e#1N}iY(otrpr3x{lHTK&MBmH2><)E;B8nB1&?iwZMZm}y?cb2LufcowbaSY3Ow zEm@Hx*BT%QV>9@&j4F~R?sJlDB8Pms`Sm0B2Udj?iZoPL356*ZLrG&Bb4a)!648gN zeEW!m3oW@y!76VLUW^8OgRD~``qkct{hK~|Uag^GaiuJ2q(F?};B(f2nU3n9i#+r> zn(v~xeHoObOn5LvkfDOA^OG-V?gq?+nHeK!d{^F|k0;Y~*b~^Z-%+z9xNi<7Zl#X; zl7@BABd91?^Gav4&NH^p?i6PXJ=trM;~O5MMUTF3`lmFBFs1%R?s}t0=ThBCh9*gbk^H1U)9y8QaUtb?XRA( zR>(4i5Z+Yw`S-GUPtsYQci{WC+qHFFYt=(!V8ikrT2F* zc$cJ?r?-P!AyYcZc9u2G%?;CVe<%C!q=^iPCC;jhr&plPRZ~S;L80Fu)UK{2^)6Q> zWz*`hUgvflUsZ%Mz4(LuY{Ub;ATi7@Rp$nl?V`I+(>gOOdaq%56{;7L6_Yzm!)wMj zchSFV#5bgTmmiT>!o};Yj{S+A%j%M)Ed$b1CDVUB&SNv5VatP@9va*<4BZ^_sIJ~( z?SI!b1rTU*n@0uw^|)|W+vt!lf6{IAg-|%~lZ%pJ4rzJK{Yqq2CqJwI5+a#&H(@I$ zfR_qSh6b=VE_L!aa-QFG@;KZpSggb(U=CHzr12M*YCty>-djMK$0RIkN=ZQpFBar; z%yh&9hj;%OvLkpUcmnOe#8_-V7fG_W6}K>7rITb0s@qyHahy;4iz?o6p~QP*U#1C> zKMk~C!4!$}d24mkX@vU8vXt~l6UWlSs#CsNnekSsFx@@1PT6^u{b=+QJHt0P^SV+5 zk_Glror65x_H{FPLZG$2tCsLFzBxOa(H6L+56$dBns-7?Eg-Ly2Kys;I^tl)NhwPW zdBKd>hJYvBx=62V3BkDmDtC{OP<^A++HGgBM79-G(?~z8t;(DJd{GWua3u@nJhxZcA=JO67g?|cJ8d&9=pF-veK>^M zue@z*c>qE9bf5;&t3%a!JF61?wqE4hHN$T89h$tv|F_=T3~_5M)7;c0wWt)A%kYyk zn2q)dq#vqDB_}9dL3GmDhiIZgx@5a>VOw%Nu_l<{MsBf#Bkvh^|wyT{)FCBgj$DMGP`Y&w(3p zb5*Z%bqWg@_C5XHN3O`+aEQk@=5j|}pN@Dq@~lbQLUX-d4Lk21MY)d-C*OxKI#yBA zj2kK9H{%OmaJde1_nmZYMMPkq*H-v5_!JA@_k^7XJtnu^Z{D-*c-H8eqAI5Vr&q^0 zJc7wTtfDP}(X;icw&GMm3rFm3&SUc{^x&X+RA8tW-nuu1T5LgWsWYut?iHX66lBL7$w?^qB`q?-Z!l?~bYIiLA$qPtg$($yCnhP5NR% zTB`@ONW-nh(E!7}NY)nBgXW9yWEbGgGhMl+{PXLR`U8;w%)sV2mHT5 zx7uyDiM|;RK@lkZ{GV_YBagYwEtL1a0H)-Pu_6EIcyen3lh~U@?|u87_m8~Q9X4xr z-3K-2$`}7UHQ5+)pSp4>sTwb!l)A$zkH<_~rIL@aFqD6S<2kfYG6=Z@ESBV3@4h-i zRkJrsLfM=s^8}`IPDVV(h9mD^VKZqhR~NS%YaPcg_l8jAx&E{`3}`s$-i)HjPDJLO zZ&++iFE|v)H6@SHPhvvO{((qQ`##+vT?L< zfTbyJ4;5Lf$RtE~gObu&XPqT$ywu7#AMhR>vkg@BUj|i>1 zx%Sgy7QR1q>6^V~PF{D-zANo$%f-8VO7WxV%6B9`Q|MYv{rNxGmv;llHg!3iUa3i0wwG@I75QI`T=|QI9nA-36n2Y{pGy)^4JFBx0&!vzYb#M^#ON#4{ArIwyzvRYU- zChA=rSKEp;i0)Mz5$plqT^j{-e~c7x*EJL|1+$7_U4tHNy9ImG<71+LY`NVvE~9t zzV}k^q>z6H43lFS1O?qKcsO}rWoJa8C4;oR6#?Wu4PjKBBG?v#MY4j4ghl2H()E|j z=~2?3d8w^C0>*ckx*(GT^JWe&$`FE8L8xn$zeJ z?)a!efeY!&&s;ca+;*rRYD;PE=mzSab-*cFZJ)n#NR-cP(C;n-_;0qg+Fkv`mMvxL zWXbk9ZcNr{q%s@1Ur((W-0R|VM*5$ZIcByKs|MVjXZL5W>NPGkUZ47~lwquqSfo3G z%R5QaX2$b3o*pg=^#kV*F(PBc-x(cIy{fceqX zhHj;`ZGj`^L}X)C-Q^C$!sh&KS^e^tIfQt1>CmkF@J57AfXrCw^r}9-=7})e#4s7_`x?}HpQ9J!@Ps8`qo=?ECOeG zHRP`aejIBp_4s}v@JfV=U7JD*wU_ln+rTzgrg%A2XCU*BHZ46{(imi09-Rz*)un2T zPdT3?l$b~NC`=INH!Z$Xz}gv_C#7|bvgK0t@S52{7*9gqpgC0o#%VrJTCwM8-UQ1w zL42+8r_}6G1x;`QWQh4KD=*RgpFU<2${qP^UOKH=@4oPOoCWDmeIf-itq;@FAd8Qe z4D&g^Wo+~`z~ZJGc7Boz2Zr^vYCJ4eMkQU=KkYoE!D1Z0H*G4)%9xSWkk9{)ZG$dRu_>F1% zgclW4EwTpbO86p!ZUx+V2Yy)qARcqx*`z#MqYL*dv)kBi087Vp@z=Xwe; zF+G##Z-K5Ca{5eQ!Cybh?HGyLTjYn;*j}4J1QL(q6$W%q(!U{Eek?mam_rJ0eLxx~xYDZnTPia|~Jh z04ZtmJ1jBULe2hDZQs@cugF0Ec7kCV6%oJWxy0T=iVzmw`N8xXm#OXK zX0#9z%&~%ajxP~|suH|$HH3;@%_&;ohbzxEhI&KTy4S`>Ikj1qZNtYi?G&?UVaAq= z(&~}50ql%f+fi|N;)VduLQWVB(Z)mj^K%5p8qV%$<91fp<+Ehpl#QFWN^ZusL}Zxx zk}KcKptM>kEqj_3`4?BTWP!&5uDxIlK_6=%CSi4<23_5&PL=-;V$aKm}Al>8h%o=szRbT_O44>E$t#nX!r zVI09N9S;_`=rZ{m+e=%vLp!g{Hd%0gFeSc|MjMDH^r>yC+y?ErE+Va+sQRzbjd}v? zkmfK8fG1;%x?xK21*d{V@Z^|~j({?xU{NOeu#LVazgj*{-uwto4IDq7b29PH;ahn} z2eE&nP_^P8xG$8g9Ejk;d;4wJIcCNgi%Xtk>w4)uW3TVQnxZ{efKZ1fmD8MQ<(=Gs z?Q@+tPb9H^vKigk0a|_=JAgso{2q(NEa6T-*ZHSFo<45sHUaa^#&PVJ_S+ZE|Sl_RZPo&~dufhhw4f=WCk=X7mTpp%!@2 z3<@gi_bu=AVq9D|3tRA^Q$@I(sJ0r-H=+x_%sKy`fDF zeKK|x}xdM+=*$hneTNXy|_Q@bdN|hCoioXyo?qUIFey0o@-;dL8TtA~)my%sd?5}9n zJra#=5dgh!cN=m&(Z=KnNb5pzX*iT7szgnFU+c?amd)!DX%Ik1Ui7`s{6JUWf{57T zks9z5%QV?oua>6r1=mr@*_daVN3z_=m1B_`Qqa5@&tN{7sbcS??i-KSsk0gQxY0UP z^nEI+ai@aKHYVUBE%7jz)4Wp5Y8^LPSecN!XZN;zMI`w&Uufpjy^&45cW7YW_HzhBHuQrifPY1d8F$`+bnptJKCe4NE>zXh; zV+5a6y89kbBlK-*SMj_iNm{=@6O@)-a2#+aml%Jgt&UJ!RJN!Py`0P@Z=eoJ=g+^J zu78w#bjQ!Dp6QFOr+`a3>>)+A|`t@eSxmEwvx``!1MfQohu?_ zigLDZV_Z|)P#OVlOj-Y2YpTgnE_&P$KiYDAk_=G%jgkooi+#I*KivR>ju+mvar&;} zz$I}OH%<6oYdy3xP-#)1lH_PERG*l(suP&{RSO-x&(k5}81Bx4ZzXdb(KF*wX@iv+ zi}y#K?T^EzZm&7f{>lrxNQYMWp9BH7rsU6V8Shd)ch<-Mmd8XK&wbf1gBM1NC*|Gt z*c6g0&bL3zVIyt@0yHo=CSs1)VNVEam%l2L?2LlZlFQ|tHWXw;UwTe7vPGuvQQIw( z7AcX>OF`H=rCuUW_W>!R{#ULTB{eG;xO!vgWQ*Yl-*fiGtI@lCqnkgd|12HGy&D-J zoD7?3d&Fzr!@7hX50}y*o97&dozT}tQ?0V(5K%V)8!mRd=kB^waZ9@Y4#*$wYm83l z_niCuA}%-mj(sE>DQik@Vn#T3^|T5f54J5)YTu1lN4TcdY5Hqr8*I(HN{&1z1XW!? zwBs}b?#bm^H_PxKSk+-^c}dbH2qL~XOf78gfes_Op@$dr)vKZbHoZuCi&m9v+ z`WNxwi`#z8;T6f4CFNrAOwg4qd-EXpZj&%jpqe?Lq+Fzgi*n3`B=m2*{11w6!q=_e z7PR8WoCNhwD%k6baEH3%()q}NoePe%v#}&1CXFFH-6n!=Xv^9>J@2EY?b(R?xPEci zv%w6TdYf2cPS=~TYZ!aeUZSgv z!`M+P8G!TwWZCkrCNcKVF)?$iJv}u}#K`03-ThNn{z!u?SRZCgcleSe4aAq+SP2ql7xTQH ztjy*KxShzpzRv6OoxCUW(?A1;hxs+%ppw8zzth-((n`fJ=mlXlxWgl%#g?z7RIF7t7)pCjBFxPORiCc*F;(wx%It7Gb^OsI`V1SMCHAw{#Zp6U0O?Jnh zBG-X89r((tW|MPw@yAbZs8dOe-UVd%8$x;#EqBKYeCN-KfXUw_drw#|;OWn8H0MzB zo8*bkeC)IEh(rzLn{UEr{mG~Fl)+>ZAD28;*ie&fnehVc<~5QnnVK&c3j?1pQ@UM< z8-$QmAQ&H$Muripk#e#=foE&Co{=;kpNSZtr8)gRrooh~EZ4)Y*lg>}npx z5rRmOd6V0@A)@V%st=J_8Muge$Tbs?XUHE(!h5qZlN#Y?)Ss()(UO{&d_Oo$k;%92 zBRMoIc^~gfGqb>6Y4W~tO*TKphG#woh*#ap#XYPm-)Q|(jd zUXq-Sn%qWej}KF1+vas$4%FRleODOTEFUvs_#50_8YO_BD?}>MjdRJr!)AWQ@B=;J zE0HSNe;n*!d@F`frdTKd_rQ|{&PRV194t4_NDiipcIXtV7M;l&W!L3yb6It>gDAy( z$<_qYN`Di7DeG!r{T+#c@9@3z@L%X8Dhi3Z*ApesqBV(}kkcbq{h=8 zh=e=WK^GV!+sT}a(_X{6iOs1wB@pVzv&v+9Nc<$WX5`^|RN)vA<>Z|HD$G=gr zA|qQPf@}q71*2K}w;CgO$zFL+CuOGB$LiGIzkgi*{++mOm%e{cW@9&Xt`K{H(8X1t zh3&{x)zTq9U;m6^NgGWQ8w!ncc2P)U+8$APpy@p37>eszig(=}a|cl!GrP;iG;Q|B zYp4rk_1lp${@nVx+S@NwX`~ZOznPtaYjGvYq9q_9oES=(oub%A{yd0B;#sPJJaiu% zXW?=(0JY7;Jrxb;IH?vD;4n|9_yiuZh!rGzWg#sx8-v(`ZWTf>^2P+n)y$&+9YE)| zptCY69y))wSCk@4gV3T8YS5$}E4a8kCR$FMf)D(+k`elAM~x8V5ayRJGh)Q=_EQnI z$18sUyOgc_U;}&U##Sk#L>~3h2mMM%Pty|C8!XQ9#rC1QzqXbtuRSYy;h>z0?#`e$ z{19Ra`}0f2rfusm)`Cwt>F*W0Np`XY{cZC*nBpfGFH+iz7@(V zst0@l8ZvbIGHlSA%;AE4WgV$S_kCPz8!^;Nf5l$e0PH{fuI|fU@`1{DDqyWKpTO45 z3$wzHFf_1(e#q(Oj^chS^}0#v#vx&^vVTTOwTu)7^_5wn6K?8M-uS7-48X+Kq25l< z^^o9_2-;EokoH^Cudhf;ulfqjeeL$cY`w7Sy!l5+IHJ%^7bZo$@2$6woj2T)ad2m$ zH?%YaNhhwW6#(RnmMkEH2w|h?HT(-eDW-MrNo;VZR?m^A-dtW1RDNDp13ZwD6Ru{u z?0x$@+2H!<<6J1_?V(u1$L5s$cVaG8xoj;55HVTymzdi2eZVL7N5fuDx)NP;-$RMX zr^{Wdlw=y`;G4_cHisM4v?1RicnHK3()luMw##49^iwK<^J$}zSO&+-Fz-^H_d#C2 zUxFz6P|#Vj==S*Vqp4|`bs)yfdo6d=R}jJ>5TkF_v7Uoa#iOhH#iDzn(%%(tuJ9=x zfst8fQRg0jR7E7Cbqv{LKp~?w0dS8_KqtaB&B5Y!`j`ECLxJ}}&5Iup-v^cduJ|r^ zIPCg0VpDWCMKfBRRB#IDrfOIPVnDJu-f9~q$nbJIpD+WE z&BP6&XRGL)mbc8ScDC$F9P+&vzzbko4jFeg^IEOoh^m32?qlX5Sy?32ZZL zJCSpVy>kZFJ?e{@G+^azd^1pMU;~j`iB`E7IQxGeae3EH;w*lj>`g zxqs!EbuCVtUdfV^ET~@4D%m~U{*vLQE&+W%-~ZUAB~ZQx6^~4;Ro3g$D;_D35f~8y zP3zyUVxIXA?+q>K3$Q^&a%BA3SoWEwJ$uaEdn3Gr`^CfU$Q{6!)?9!}fmv{(4R2ZR zoVA=*a{jCSha4MQ=H1_1d(#gNumuXnw>~X#7`I~K3kpWJDE?R+3Pb*wrMe?c9xZX3 zxwU6oE^v+IGl7Tr4p}44wr+iTh<};aj#L(yHE#W;Ah7hmr5cy`nY*WeVr{X7+J9E= z|1INO!RVHqOLGLKlXP$YPlflB{VFy%ELY87pw%&@sEE5G8D<2cKY|?*I!I}COC%xEZjf^M zqKk1T=)PB|+dM7^>S{?&sAnj}AzWGr{p?AFSuC^9395x`jK%70 zpc>D}?(lU{AN21l;$&Gs2`WC#7*+($DV1(R0e5dvm{>TJcJ->t7kAgZpSw4?74G({ zY_m5R#TY+OpA!-tlATuZ$K?R}%Y zP5sM5o0qaYfhAmIBglz|5}8A8mL`NjHhJav4)8x7n7Fjx2%A2OztySANQZTgTTq>= zJ3=aFWw^-sbe?5@WHF~=#7zm!quyTbGz7~G6kI#sWso`BjW!7xP;tBotGST{InT^b z>>5efTkx>U3$sPP9^X{oOX>=9W*j)LEk=J9#2%G2ibIRtJec2~(m#G={YDB__q~N>ia#|C0Vp|!ph>q0&z$VU>zkF~*!Cd;o&iv>RA}|C`#`H` zU7N&vN*R}7srqBO)0uJdMxEBr&4@8u}$2&L4EHl9@=D=!r@bcmN@hXIscD*_#-8!n=G;nXpzNq^o2Ojp@TJ7~%%Og@9q(tk@Ra1T_- zAEx=UBLv0iYvYk`6%eKkk;||FPt3;gQgw&AIxi^1HBkAzrB_R{($7eYFxyJ}IQ1%z z?n~3-`K%oB9t93>M!s2ezbjIW z!(LyN#0G?R-ZgJO4YPr=^Z2rrfp(R?t+8XDLg!yf?{a4+^F#`ZZ)9#@NuHUK)4G7l z;gP<<;dBw4*b~^|QVBe|A2S`)8PEF3f4-B*Sgb!4CVvW@yOMsnmj7w9hXXA+^`Q1h z%s+(9xSKAuVNu5A5pZ`Dj$C}U*4`@g6Vx_#!$;BDYheAN7)p0?_gX&~Cr~F=g@dUZ zTOyS{;{YTxXX`v-FU2^7SIH^-s`GlIwhS=vgF^?IKKN1MGdS>5Xh#2r4T5?*kk+Y~ zK%0s1lz+gV0!+1@v2b0JIN&dyhgiG)uT&+-lz%?mcj;{ILV4|4j%|j zmTiga0rZ$(s*@j-n4x~BgTuXLu@80bf4{;SHr;%i9Q#Mq*1*R*wU?B6}8!@+(cRdAUwGsxo8lwr3U17iur6PG?23S7ebFej=O z3dl<-CAPtrr{aFaJ@+G_g7^lC`lCc*uYPnB{(F-AjYzD@=HIkjo-c6OivKOVsAl?| z6*g4%X%^MG6|^3$0=?YaGSs`$`Fa(V<>ml)cOF#{#f>&X-BxXo&W_=3bLMIZx3}~+ zv^3cn@?B9;D*2BH9f4=5NY2@7EB$SpDirDc8tRy((7%$O{ce~ zc9vOi>uugPiVoay2Sm{$60IxBu)zg~zrzWAy~%32wCt65;tqd*(R+?!G4I##e+e7e znyiw!Fkq`sT=@0O;`OYBZHYSgo4BJ%H7hsI3;VKMy~$1d$E0V9@z)1a~GUwdlL z@^s3LzVo1pI?|SeT*>^7{}JQ!dp+BMet*taeuQ?(`%T8jYY)04;GOe(PvGAyG#^x& ztOZ!P&(4$sd!@axA6#c5y$`xJdf#`{+IVvP z1#Mv&Wxr;o)40=O?BU$Q~YDe4Qepp9GNdjS1 z<={bVji&oWQMg(v+^~Y&;y|s9H_q%tUvFqv%{g0J4>oV{@vu}*kCGu>=g^<*s=vN= znJW(2G>NqOf9QJes3y0qd-y08REmH~LJ4AM(g{j6prQ##GfFk|DnjT*x&jJlAasP# zG=K<%5+L;60|BImD!qgBuD|%+_nv$1_}=e722V0zJbUl8)?91OxdD-%P5YivKyJxQ zVcnAGq_sZdexBBd2FVsYB)q5My>D})x&83|`^#H4+ied|rq~_YtASu+52-E)!)Y_E zr^sBZc2fSr;7NMkYtd(4V-P@azBEZ0c-O%;8&26X$7DdC!FGWvetwGVnlD$dyQcv0 z9|&#z-$8essO z)xzlO^xQD?-AWDg)fYG^LAw;r%iB(AoA=*dzPRy^xAYItX#${Kq<-M@jS{-Q0qA|Ew@hV6&RAEa zI}g`iCVA7e!CR|suO%^BG@vd|E9sT0#0%;jt&QDsOqwOsSC`Z5b8EbJ(KAXRwe2P% z!;|B`yR|<l=Se>y_g~J#)mXK zaZnGF4PmZmUmJ)k`3>-7k1vAzlCrc~Uo1ryEI5`<*}W8k3YIQdcwY=-Dz8QpOY$VQ zPJ>s6vLKg_O4f-b&!Ee)xGkr8HOb4a?^+?eGXc5e^)isQ^*L6}Jd}Coa|L%c7IXd` zTL{PAJ96gh28oE7t1H`H&|`q)~TF_ zl}zADQfIl9qxfK`qp%CBvkVu%1+`pLOAL zKpIU+)axft8$t+)Ltx#)Eaye5XP|8VQcdO@_<3|$R}lv@=Z{YW0uMt0(wYZs(RKUc z*H0W}J`|o1leO`rS;7G=*d;957V%)+=HBu;|5eOTiEdECkSh%<9X+tEH}>MY`ThmERgQk zB4C$D)Lpa^d<%t#6ZyRA1-_bxGr39@EXZiwId?Lqkh~lYdXUe|kdz{yw)5ynvYvJ% zdKSHPYb0Z_GQu<7-vF5qx#)1EF;sa@uMx7u2adV8IeKS!zRXwdt`OJ-ec*8cXjwiA zNds7%S>&?DuC&H7_H*yKtFPluq`HCv1*C5UD#S?$&Rq=WG`$wrIv3c{m)?!r(u1k! z>({RNg)_B^SxoE2jY>H0Mht+dBdiX{S=;!ev5Tj6`jHfiqP+&taD{VJfTPV>&x8&| z$oIRjJYSXMFA$Fa#Gw1@%K|yp*f_~K))7nNOWfcj%|?dv;J+L%51ofyE9GPzzGKH3 zvXc&FMtyYQ4bQN5f^`GL#PD2FAycSzZ6~cAZ!oZuDWl?o9D3r~78t z1E4g(fe4Dh=7?ELzr?GX0OQNpu(7t9PHMmN;ST(tMF#Btcrv~IyH`&CMneAxCigGV zvHyWZc6YPq{sW6R&a8Ada4zNlT^Rg-8(#m+-kP-N0{`hI>8+;zs(!faNmHYL`8Gm9 z;_gt#qR&n24&-3G#P28SS1bS5UPtAQBY${tQRhKWeEmLt8%viuIl~g|8oK`xOIpO< zG@p408VQV#AXk_*tXye8n>r zjLfIVF`*TvrM&*a7hXJW!acYy2{sj)V}`j^E`46Ije+M_;%=vtMBz z!psaJ){f;r!vU;3lWHM*r!z~TB05^rn#xK+^R&&9>E0t!u+fcyo<7D|zg zaPoKDTg5PACkX+LP77uR;0x7e7#w0qZ&PQMYf zIUM~FTOMzl0Ve|}F+2ZU@AnvL+mls<&x0`dTUgq$1KtlvzM=;o8k;Sp=%%|e z7kUW<{adJ7W6k-Fzz6&(;IcawBND)O0cGMz-pbFe@mn}C2&e#SH6)`r>c+QoNuPfM zwCDIcmiM>4`VC=E6~}U$x-Heu--&Gnh#TscR6l+WN3<8w&CkHOUYJ8GS`@NwLht_MHZXOSJ zgzgsNoj~p2Xj~Wo6_$wF1fNQ}Zzbu2 z+x)JD?Pm?dEI&~je1;MD{$H* za^{qeEIyDK_xK-&@9!i~ca^!vp_k4y<5lE;jv?Ruob1B>;hN2t<0iZvEjHzM8`jp_g7J=N$$0!l%i8wxTd_;^+fwuwNX20F_4DzXUAry9FSZz@ z?Tn-h|c1S>M~c7{elV`i5Ii2rrJ`pyDNL$d12?$GbqA&&g>FfS z&h~&|p=;zNgfu|ActIc5JJ?N&gJ8#RfNfUR6!vXnfu5z%9*O|2>Ac1a5hi4S+_i<; z+TLwB?-;zWbr+0gW|hg?@bFwxLkh96@_6-I!p@bvBk%cIiYo~A;@HrOr*7+#voaF) zMIQkJT*gnJ4SHXmAafdNQ62li)XMn+SUQgAsnHT2>4)Dv=-t;W+_bC}|A47)tf_^< zc1K^dVc?> zqrsz*GJg~OXDM_SX>BE^w{F((XdrY(v|$F3UGxDEL6j{58g*iohDVgR)#CNBfxWwT zac*6C7OT`3AF0l;_Wg~xU=al+;XL*ZT6%#P6Ir~l7~SiK*G390Z42((TI^dIx636j zs(1L|MPS!HNg;K*KmJwHt-KSvXx`Cs{=I3f9$TZ;Wm zGPIj?q9-S;SqkLt7(S8l<^%91A@~ER(iS^+{vFy)?(_Qb+B;di;90qWR=QeriZgtCe^M|DSgczn~7RasR9|zyh z`3eYqFSM5+z!-p;Uv&F$I%si3sn@`h@aMn(k=9H;(PmW^nP#hteEh$1*jsL%9w86w zndt3KD z4u-0?-<2Al)KoWd1w;HnL+1%<9NL!kZV56gZ9lETM+sA3AZ&@{BCMiHHsKeD@P1px5WF!lOXrT&5=Ul(1rbI^!|2u{CoF;c7` zD-&rn^cT%PNfET;#6n1xg^mdQ+rhsq`>!)d5J|M8s{`b%y{0p=Wnm2~1$5ETp+}1` zYRl?UUAe*|R*xoLy;~^;g&q**A`kPy9dU3_hi}vEzARpr!>)I>!ZRGal;yl|%WYxI zoL^MJ9rF^4Fxdk_@Y3OS+f&Pgo?W{#@o@1jIYNsU&sLne7@PI&(Fw_bD^>RS>GkKx z#LD$%p&PoQ-c7kiM+A)cq`vC|LLCtLY5(uhZ~Pyr%zo-H=j{3ZhL-{Wv<@ia-t;jWDb)P(PDPk9nG|< zTJzvp{P&Q)U^#S9-hI|-uYNvoh0V)!xR&TQp;CVbq4#}z#q-G>`N=W_WB z2V|prjGl7_GXByiE+L`kc_s;kRt{>81;lK?+UDIklG6H5z5uVK=us!Wk*+KCkAz`V@kAZFpF`Zcjyyo1G7DW zmsC*hA9(IGv4|pz)Nac9@JGYua@FgO=rmeVkQ!5c%K)qv$G;?&k8>amC3*fEwBQ}j z9$X9BfE}L=9{{#1vn}UQlB964cZN6Q-WTe{Zu0Kj zhdeCLSw?We?5hkyndUAb`$6r*LC00C&a5(gtYm`+CXs?8?qo$ou2eGnC7ayQNrxw! z$5d+C3=EEWUw?0_4C(+WpGp5;$P!wYS#9 z;0uW;U(o1kwii!}_GhTG`4R)Mp_AI}&>!h|5s&YKLHd7!h5s|q8w+6 z*_~HK9VmCT)&o$$rD?|Isg?8+e3Y-hR8ou^vejp#aIar$Fi{C@EGGN9izs?pm^+lo zVKy~l&U4s)@A%ZmvqD6uw1e7C)323COp>1zMjl=5aYv2XOa^umfD%Y)GW!YFJGg9sqVDxDtb-|W!c^C}oY-mL^efdYK0EhK zU4y!mwESv$YWa`V$xnB4a`NA^;aJ)Cyc$gB6F+uIGLCucKIkNCOf~0Jrygjz%$@f) z_3$E_eSi9|s3@*{ZoVv7yRFziVwuaVyulSd@9>v}f}N3^NF!Xw(58XViva5@bnl(f zkovt>_N~)eF4d^iQlXoqyc|B8hyJi@NJVB%qxs8-INd$Hy$9-ROmx*lodsNNLzw(% zFG%V`1%p4IR|iUPr;6N5vbDwt`T04INfWH_BMI@>DAt1-kN+zJD^gHWhFFNK|8t+4BhB8Dgl!o3|+_ z;cTbm_ZjrSD*xjO!e7$avfxO>Rc$fSRr=lDEjQtaxseyYAx{ji==9*8!B(GqyRZ97 zk}!6xj(H{Fyr*1zx7dG$n5zz3g=H{~vW*_4leNB6TfX*1(Fz!J_Sz8JGQ!>9>hS7= zAzX^YlOxjNK^Cl5YTYop{(KY{*TCX&4zVQ8oPWblVzCk;Raru5k4vc2Ueq4o?#Dr2e=*=^ z|46hWBcdII-$1_<4i0le+Z7fGmDTQ^d|3Aw0z*HDo4r>0Y3=2OFF*QHn^5HM^g(u| zKicN^y`uIT$OJNRjEGn&NTk`{88YLR?hnzBLHp80PLNrag9FVlw z@j)3e$m3ff8o^y%oSQ;3T`*;!U)?!(-nsO!s)^ddhy31ya&mo*H!TnYPGxq*lIJ?O zz}?~Uq?wrqH8c!S2%W)r^wX^ZADi;y&`5mDLr$070Vp)POJHK~Vb`2j|C84AUx#~- z252A9!@9zoN1m(kZ6ms983h(e{UEnY{O%j3QJKkgyl;*zwZl7b4Rx9cuQBQv{lW?&GYb{r!MZ0k_})bSKM6=(3hvBPJYZ4dX1}mr_Zf*nTsYNy1+Ut_^2Xjtl>5l|n8(oCys5Lxg;Vc?x8CGwUU|Y=*+Mw7^I$felC0CRTGee% zzA?J~W-8NjvBq1braJYfR#E+X>?h8>iAlTCQHA*$c?aoZ&MmQf?WHeQc&&Z~gmoI0 zPP9!v7(K1ycj7?Wmlh?YZFr4q+L$2;9Y(WkDAsL(58ex{_qxVZZA6U-(Ui*zL`v5x zVPl3oj}(<)9QVgiPT%k+BuDxD0Ic`RgeUJ$-&61^ttQWZEWOM4?3WJSpi68OwA0Dj zw_#T_`b$$>)qT7}O^rO)4j%HqsaOg6d9LUbbllt2FV$J!e1&3v@m^#HaVqnpK(_}V zS4MDzIF>T~`A(f_9~@;97loB;3cTbod*%kv3F-J;p`hPr)BT0{y zQtGd)GATCHy&LD0HpD{2%+ePA1(Z!*({`qOlHUO6atzsQ6>=2xUQ%3asR8_CZFgji zuq$^&BwW#sNMWVyT$yhD<{Cjho;KCi;=8a=?g&gMv&m>`*a=btGAY}U+MI7zGrB%s zBpo#i48md&UxYvBl?6kDwP2*ISG7{BC^AMejpeN`{fOFgig&Ni`0E4nJ257JgCr4seiP1pi-B=^J0i9Gjcx-{**Bvmnn|-;;t@>fcT$me#-L=;o9* zf-ep_gKpRn63UkYYM%jrwa=ZwA@eIg@axWt4EN+3R`(ig4JjsGzoQS4b)ZSSI+{ZA z3r$dUG9|p4`(Vidik2OHmY{>zvlsn+oci*iUC^?rM`BNT0Hi3K|I2#Cq1Ugxp6aIk zaBSX8d#qcZ?I&_caf40Qa291>r916XA(A}6nhIyRKVx+~&Skz{b$G$3I`C2=y)@E7 z6n9jy635=@&eM3=JvqI7unHvfhc5CyzAgl57IsT+-`G8M0;4*SIb*&YGWLG^t*{fj z4nP!)dn1~t#vwCFub*hZ2Q>zzBXvNt(h+VUN>{Bl0kKX$JDncu*If93Fz2*wQ2yDm z{2^*(hh8BTdBlj zRtrlc*V?m(v(XB)hTkkP6<^>$zOd03*BK~&Qh;*h3#e9^F|mBBkCe z#xyxA7KPJx&4nRZ(9TCUU4{8SzRTfOsxDKH>t2_REeFW=5B`xL(p9qV+j^cB>~=0_ zW3p~rj{0Vv(gAQ2!*+_{wwjnKGH@1JMr^#C07n%;6;~&JM_4;Mt*2i+-Imh3pJOzi zDD?X+V~e82dd)81i+9efnhj-;nM%o0BmWZ5gJ0gB11x;b1tMQ3sfFv5Hn*da*OKwC zHv6*mFEV+R(+`Ve)$PhqhhSB*qL^&z9QDrZsXjf*+t7=-BlQ-Hd`IYyqGDxdaI^SR3MLOn=@CkAL4%q~;#DapDoc2jI*{(F@fZM5hQN6KV( zeZNA!g42+p2jyMT4TCyE_X*i+-9Dl;I-_ZJIlB4tDtT1%@U@2N{p>5h8iY*jE9M~z zVJf!^%9dVvtBKv~=ZIq2yfSbBh`DOPXW;AJ03uoP$htgH$DwyRCjiO-|eg z1i6iV`kCA{8JyNNWbdiiqR0G^o<{m`JV6%s^SkXucRdY3%R&GA*eSL{^;pCfdAZ?p zUpxex&%;r@_O@#CO=K@4Ny$@iCc^xhPeX`$E3|dvPZ4o!1>@bQV<4@39xpXyOiz)7CbCY2-zy@o%FQrqS$2x=)R& z$g|4~p6F#nE07yy`e!C6#cz#~Gb!@!ZW}#{ld5FGIU{3NhRz}9pZ4a@0Uu1RHL?xj zdi}yy5$B-~Q-c+Hnt^+srnOeJ^gZ`6L3uwa;Q}mt;sx(cO*4&GuHovef={N=%t+(5 zwq4I;>!89X3joT|t8egFz&msP93iL$&n|c4OM^wdDm?i%r;NZNr3kJLI8+cD+8?rt85U$>m_*ZUJbtS4eefLa zhXU`=zO;qbR&u0W?Tu2(n&h<8+to@4dV1fPXymJS^Qa^X`ovCS-biE5uzBCPx*z=8 zw{ulU7Oni5!<@s>sUAF)*8@i(cJ@^tPOpa|?@WAE35}!x zjM-jf5F+^H4&MB#^A+IpjMxhZlb%z#p}S7a|2969Yj|S2y%b0ucosqI@KyDprQ}U8A+#22zz0SuWtTZ$pRaU#%u3QT}D&7f`@C6}DXD-eY zIi~JcMY;GL;rE zZZ_Lj;Hd#Ht!tr)bqA`PMpryM;$IfBuz0l?*{x{6s5~BdytWjni4(-x^nz9M-WbDo zvXE$>%G{yBTWIC@%cIYcD6)R`Q%o*?YptLHx^?J)hbNoxtlGAYB!)qksSQ6{rOa;Z1K1*VFhc0Ukm5U{;ObC1!wjsV*w~gNV2cTmQ1YBK*2MVK za)w_aq4w0oA(mcuaOj4@=>FI)31%Yh9Y_Txl#%xcXxSQX#3hHL_N#&0cLC>TRGk>lV1-(x zN&unW0189V=?h!zI0&p*Q#_NF>2-$=JzG8Y#94RNAc8tds|{WX2St*ZDqg@bdKbs5 z3yM3+Ca<5q5Chhy4cORz(gMAwcYCWXTx#gAo+s16<@u>Q`8bE`JD}hIDO`R(fu#fF z8Nzjh`F;+dV27a>t?Y@{z+r4$kOZNz1hS<6@mja1*`*u{cbvnJ7Ny`JpZpTUf9n06 z+neI$+?7MZ85=tWzTYQbz}{U-_||!u-RF3o>BA&S`C?8)fhpwNC?QCU%XNy8FMIFx zDt8jbR_qv_cvgpA{VC|z5jHhrVJsXwmUv56=e()Vi;S7Pq5tKn05r~mw=}xx^-u^W z^B)^$GddN7qX?^hdorPj3GG|%PQv?6CHLZ}ji%V+k@GYOHM1s%ZG;h(E2;3?LKFK# zW@5q~dwTP@eS*xzgwlC5;pFL)%6FUIaS?l%Tp;-JyJy1z&YlF0^xW56Z;ykOgvCSv zv5o~k7L*n7sHqS8#~+R3BD*DJf_7J_X|@NQYyFBg&*ZzO5`jiZJb~QSESa zH%4<_vOhK}7mWxH#PqfB_X$mK-GC9R^|deWyj%nxdZ7je2f1MS*gggDtEz&hI`swo zC~XbC{Ow~}4&t_7tmUC+r5W(R=OV`^%}_O9;X0jv?feQ?1@p3Z7TgkI*_3_Ow*Gep zymx-b3F&gkNi_B`0Y%@gT=l+MdGrTQufo@R+=pFiNspT!U2H9!oS{??U0_EwOxl(Q z8`!v+x#X~HKI^&W+cEdOa{amNNTq%C+p#>6&(|Lzu@W!7zjI#m{wdl1yuATqHNc-9%&*>uLhePV~)2++c$4H0P$zG>TlgCS^9^-LFmE-HjpAOmWJ6WE{ zE6zKeMDg)?6yRUfjCC59Ni0mNN2Q+`9X@j@pgKVLDzLmDmrQ~wqRB^t$+0!FGSXb__Fir6QB4!G7P?= zdq$6W%^>9`b7zzGUzH-}2_joEZi%8Ca@;{~>~dN|OZr1%8d5?|II2e|CwTv1dz6oX zgJG@=&_JYYZX3v|Hv6!#{Rinva=9v_lMJg#8DB)`y~bvmt@-$kqph2oBw8*>I>VMW zIR_GLpumX>7TvcT86Ue6>C!smn&As2RhVYs;q4XH`YH96v*V0)$pN;uk_{nts*%tD z27RRET@`1sLGa2JPca;|$W*zhvV$?m+>K$1Yxyc_V3Ko=+5{f5wCL!&0VV*4O)z+& z@Gc13J91v{;2=LN_oGg&X%SLl%h#xMCyNG!F9gXB$sRhrwUyKcTpvx+AeMAN1Ucoe zhf`Gy1m8lkOP(>yj37wKy%R()39e$YN6ozcOxCanKvnyZG4;ssqQ}UU3{d%|CFw!T zz%oJzHZ~BE15kADp7^R#V~ z#*hnwhu$Nii-@|A^>3WP4`E&NAyUyr3vWTPu=9HYUSjZl3+c;$F7aD&3LX<`GS5gwKdhe8qyt#eZGINUF{a<^EJNm_E=RxfGA(Eds zu1EWp8hPCH-?v)u<)*8#WzlM$BnKv?OT{^2U%AK{YI&?NIF)(551bGBjt-LZN4m}jM`5Z#52*9g)|0nY`J!GmX645514eX{5#Ugoh_2`>yO(pOY|M3 zrMa`<(GP8Mbikj7R8ZiGNS?-YS~-iM+l>p~kk7F3WUI-{v=0}tA!79KR=o>J@#N`H z*4vFY&jB0mGaPDI-l1(7VC#(v%)TIw2 ztmozqp#_&e2`K6AC^t>Iz}mxXJdxXI3*X)6$mql651;`Po>BL1AbkjEH;8GXC*AMX zP>Nhrh?+?`l%L(WKgG;9W#BrO#x85DloD;=GSP5DGN+5osw$Hyz)@>0mr7rV#f zUcR;Ysl-*p(5|uq%S*pWMh~5iI4=*KGLMZN;y`%iwrZkno11AeilJKg@=%Dhv9C?C z$#>hscQ7`|O6xn{KdJ_W&~%?4+eSxquqC&s7OXxL@l4T@W)2EQwtZ2rcqJ6o;quAi zqIaojz|YWbg#f-v4eNbVlbdtvawiRWoJ+@rH?nZ z&=K7ilI=yWXlPz)Q%MY7FUs-pN<5>k_P=wM`!rNH$(a_^Yw$2?U7f>Y3`n7^O<10u zl^&0xsbb>aW^NNOmPl}kd^2fRrUjdGbr|PXL4uI(NFC$7u9$%u=n`qMQB@*sm$5$}U~uQR)^{{2EFmETkm4;%o)8yAMpi258;-33Nr ztv^whg&IA}yq&NogI6YA)I}jm$-v#okV}?3$!9m!&m0W9GwO@i(OJa6FTS%FyIZ?S$g4u0I0gQd$4_-6Gi z!H$h_eYi8GLGIHl1Eq+h=(TfxW9BGw`-hz@SzHh*gE$CVxiSWW5xX6pD^E zl`Cl6Thky_OoX4d(7Nj{8rKOp6s;^WK@+FlDeSPC?vE5OWq}ODk5C=vNBVJo);ukA zPTnz=k9;l7ie{)LZjX;jWMllY;BH5LU;X`jf)qqJFVT8Xrn zJ^ngIop5^v{dzp;l4E^#47mG)k?++H;%fGGcg99Y63c0@ts_1!ZRtU?mfBg-osA5K zid_Bb3Nza3e;=W`PL`V<)*mH{uhGtc#s+$-oul{&DS5nSFn8)9B~M)kf%!Ha^op~9p=+2*!|4^$3+98eR{0b?op9xtRgrZo*eBVL!Q8P40f>+q32Se`~T zKDxOA0h>*RFb$YOVR0e=YoM$LL{`7fln|mW z1BhKh3{lDZ<;vZAwp1M|DP%*RbX0OsowV^0ODtIh7>pc^0jeB!sMGlglt&WNQUB~j z%335Ne@9~N|pe|vxD&Ke$R`%xt)Zb)6T zug0(jed@O2sAhdrb?;Cnf}6oRIrh-J%v&IuyZ1gH#>PK!JD@3&SbO8RuTLdK)}ifd zM-eTYU_*+JY2Ue88-GaXRhfQsV3))Z+<9fAa>qx;;z0}7*7o7o5LrJDk*yzlMUbwK z7DD+M+gXaG?XL^CtY;4`fm6e%SfE4)4~NW-2pB;nsu^6+&F8Kq0uXY;=?VoJS7345 zY9)7H@h7n&R}fS_rt-4uHxLu8y=@q9jzT&?uGjc-izMX#__TGkZB}AU*WT99>{0p5 zaKvjniQ^+*{cF?s08q`dq)CX0l^mVHsA8rw>(Ke9}Rc-Pt8c~Jk zm3lKHT&hj&T@~ZCO=p*dTDUV~s_*>U3xJQMGkqd0ck9!hB^Qt7u;wAcJ&j!^m`w7a z?v$)weU7g9fww-MX<&CXt(!_9svt!nsZ((wdM&VMH{cTK<{C>ci?5T8)K&CT#ZdM8 zcPXb663#Z}X3B$s1F_8BkAPv}$&Zp=op59{tqb^4f^qaDO`HzHcn?E;8OAGHsX}JC1}# zod&P{el~t>j{ByT!eZz^tj%Y*jJ7?sok1I|n4^n#9r*HJ9C)^~%jfj?w8tn-y11&RI3N|{pXJchyNn$H6tPXYrI_gVHOs%!LbuMwn zdC5QZ;vwA}B?@b1a_W>)I0)IWxDAZd}HO3X8tv3>Yw_vG*M;^k~Ns&FVap)*^FXSKu3ZVynZ#uv7szG@+M*_U4 zm%l4uGP^=q4)ZNIb2lp+UPJ?B^MUn9ctm4SlH9nSd1a%=Q$9$nDQs5omd(7~{YzRgq!pLd*GkafNeT zBiqz?NqA4~p*>H7ceW|YtkZ#aoaQ)4mNoef%>sGwhplB~J->VI%xm8S!64(yL}!iw zKS)nuHnm!r{E9Bi-5p7^2gk%F;eN-*~;F zVWq)QQlw~3WV((wUGXu*n?*}hX#Qp&X$xz^0P!uy_>g>b<8OmIL|YtA&4NOoZTXP( z9ztI=pLsxPxck!f7MFp1!>@OT%TajdCF?$_)@)5&aGrm~946CLCT-S~k)~)_@vQR! zq}%E0VO#s7U&rcv9sRPLwmpL}Oj?0b#gk@!l%vR2=Tvj1d*0m9hh3SvqPCVfA7tAO z2$sz>rasd3D2SM|B6}VyBw@qOYmT6Ue#(rT5btuPinBBnNx)sVR92hO>V8~}70=O3 zfuUmurZ|C07i~|{K+v}xF&+Mh$xvJE4pEy`p9gvZFF^m7EEORV{!9BmYVW$MOn*q& z2+LQ9{}U(Cf&YiYJ(wM*^7je*>un^}I^S!urG_jmaW{T~nb1)&Wp=h>dW~JW5>ad7BZJuz0V@&C-Z7DPd%?q3OfhYu zIz)J{jtaJ~0d$_2Eef{I34$&oVf`0cVwm<-GfrPH0zQj%QE(3i!2}7L-xFncQ-k~F zH>Is2*2H`F_tWtRBLn}CdpZQTJ~Yu3=IEqz@BL~7*}lCkd?rA`f(h3&fN-T#5iLE7 zRX=^luGC=o>^U^i6XtHm1WCL;Vz(FxxxDeX&5FuaGA`kWWy9hvDBQ?1#)bDG?P zTdn3;O&WFHcP>9J`9jo5X43QWHtHYDT`72pT)76Wm+}^S_K|6qd$^}|xTaPR$72A) zOry`$eu9!9%rln#9+uP}%ydh1kc2-&mj7Q31EaP3ZRrbbeSNm&G3%cn`vNa~p6$#M z*NCF}NG{V#mr+$&DqdifPds9-U}&`lX;neACGewLs9MY0;4^I=k)3gH62UU8Jz{M_ z!c4)&i_?ThkKqdLX)6h+Vi8HFVi|Qe; ze5igdR-cpo8uSCDkPn65NAoRoJ@>FKi~I*^5+L^{6E9|KT}l5xGjZ7;?(|f)rbyV| znfS-0o{p^7EN%9K$?tu^7dm#$A#LM)jofq-an4w`NRt_Kht;;=r)kHBFb7Gw(ko>* zj`zrdUi+6JFX(59pX}UuIHg}YT#Eco;0T4X{4#Gf9<-s*3R4dMf zH3agHPY7__^=PQVc-t)$a^M)iG}lei%V6KP4eV%JrhlT?i8lEOWs>r)$!v`#^B-)Rx&U;zdEd7_LmFo;!@W+dpvzS5X#Wz>d^{E#X z_sdW2-4AexDs!X_tgjyZ@o}&{VlbEKcUt{KIz?zr=?psqBlwA>vO|;Rm!C=u@qe9? zg0BdxI_!)oiDPSaOOogm`sypA^|{L1fLo&|Sd_6ZOse}#?OE6oO$r+tHq2FGG3(G9 zVO{D83s243W>})CeMu{b_mPhq7&EAD>99+68YLxp;>;{@MD>cZCEo|FaLMuvJ>W`A zupm{f*Lv{w!Nt|@Kg3Ckh_hcJ5YKo|>)WjEQ0KCr;YCwiir=pfuO@*g#g#1~y{@kue^=JQB#JY8HKLme`*AUdUO+n9c=+3AxXSa6QM;q}PrmME z0jU)PO2hgJpJbQvM6E{#zTNt4xYBv=M`+jQ|41SQ%zvQ#QsCJ=?AfwHXFrcM!*nR7 z!2@}tg)3866&C2VPsZBG=x27diD#{If@^TfKJL~lJV=nI@V=~pCXoAa?K{tNwSzvS6b)CdYdwljl`42X5;V?``R=yLdslxIAx|8l4V-ink_NlqGX5he zy!St8)bHcPuhfX7I{u0LIpYToXYP8#0RWVgxQodvT9=yd@jTfklz*e!tZz;j<>OOI zaASOzMwJTwNw0Q30fu5XIVPfjsaFZ1Dq`S$#u-<%ZGq`zh4QW1n&NX_b_Q(%zo<4% zGm-DF1pCOwU)6h}D92~<{2|Qp65u>X-AfMH`6@boaAj`Qb2J}~AAW~c&Z;yQ=?Vr-4cUWv2~#*eU3Msvv;cD_cKif(~|g}3DQ(EU@kRcDew;X+`2TSd$x#k+jR zRWECAEF<95`%KebOs0MZXS1-1%8Q09BXnA`{9CAJB?-R_1Y2X0K)f?o(a8q-Gc!0* z$uAO#99$0^62%{$mKCxz4E5qn%^uA>Z9OBJ%|n%8J5PRIdJj^!7>zEb=qK3PQib~Y zfJ1i~Ih|@eb%s0kkxl>%d1xn8uGti#qZ4&ywf@d+!*3QobF{D=jrZ zlCwaE%(=d}2>2`h=ZY*?jW%kgLQDFwq4TLyuva=ffaxG+S+5&NVUH6;|BM(Ja#%L{FhQnYqUXD}0zV3f0Wtw>u#H>=ogXti*x+c~5? zKtaqJW0B(hXKlWS3~zPv;7k{{2f@%U5^r5>*q6O?+=o%HQyjdrH7vOp|6Pws%t_@q z9%$^IgmCi)&D-j={Lmg5i4cG0-L(Jcr8)JUhX<3XHo;PAr{1z^H$|w_{HT9q*{5ff z9{&;EYP-EM{lAM%u0O(CAGd7YXMYD5;WJ*L9TnUS+;In$*Y7xrJmYJ`8Xr(eqQyQV z<+gtqJ?s{*Spe)~kIzBe@i#4Yq_Cs89~o{J9k->%m@1Mb+aunOeu2!&diDVvw%%J_ zC(s60pamXuvGtO+RDqU<17;S7ZefuYLWj4(dAd|*>!vlqm%-0;2`DX+ToybJwGT%Y zt<_XONy8G%-S=?AzTG%FH zWM2q;XZ`>{D5ZLey|B_Xn^CoizwP6h8qaA={0z4jCi`Xp#5(r+-w|~>vjR^?o)+I7 z_VP>(@Q$oEpC$Ed8Rb2wrTPO1mNwcUbKJ$^OW`$P^Og!-yV%It2rA$n0KbAe`|zMd zj#&QobovvF)Xue4qRYOsFn*eHZ=okV{Xu#7K3HR`zORiI8bjE>b?1`#_ybwxdm-u; z9A7IVL;OgZ)?jGg>=HA~^Vm83cL-lf(3=7K|Fgr6WzX56Z8n?MoJ zBs>_r4ZC!~>XE+za{}QRg-!Aat{5HF_=c&Oo_PCW-p~j1SwE$Qwk5uuw%f6gC)ZVo zckM5tB)?$GGrb-Wn^7Wb2I+iA<38cD3ueCwMwlP69nBxb;wV4(u$^5TVpN21yAAy}FJtFQPBs&^Hc zYU-e^Tv|e%&JL_UC+ruWK`zq}PO0~(@QxivMVesEV`9tWdY)ngUJqJT%JuwL0mc5d zZX9@_w(F}MF>SySfY$#_2m#aSD#1#nyEe*vm8WN7T1`)q%o3?Wn~)*{fFyfv-f7tn!VP#KXKo;nlF{7K`j}Dzfj+2ayMw=S!e$|&=~#^-{>}o+|cqm zq&*OkX)|O{(9LWd@*~acBj#amlnCwBH=XNq3Qv>75hF2egvQ4!&XkQ8x;?MPskfs= z7BFwz&P;4xOD4Gt^z71WREx1`;|J~|E&%7~7 zUhmlG_<~qItez$pJ=???SRdII1k`hwvyD)1t0@hMW)nFTZLEsxFp-W|ZRgMTaZg<& zP0t6)w$GFq&u@U&0Qp_mP^BBbLME(yj=cLE* zmr0_16-_MpKN0J{QS$-m2|Dy!g(TWSdA891x#-0U5Gf`3c8$LSv0d)RnUCFrq?FuW z=lB7xempCL-`NMbSzv8R)n%~sf#!L8y^W!z?Q3%KbWW$82L9O-#=i=v7%;SL{0JJ80Y$F*(+>339Z4h(kPej$2luaEYXATjA^H>)88J1LrOWLf zp*o$Fglv2mQWCTmj`5hR0VvCiwx5%@-u|YhWSPjyraW7S4Jig1>|h{xk5s`(xvQz!#Osc{b7W2^aITk{=wdjho~g{uZ6{=)ea4<6ciOiN0Qk$D%K=CRpOy z@=l$TI6MQCi@$RZ^~N#*(o{ul!BqJ?1?RRq@Q;79mnXP!m5E~GSr3LA3kC_L5|&mF zE!7-KH9(z60cgrJt$sZ?AP*=C?!X5lc#VkmD!Iz<9kuO>`wrAr^qNMV?X#zu#jsRe zjy>4FxX2gE8hvs>2%i1xG5!kl4A+0?s9JQ7FN^M|M4a{bTnM2wR&Z+KdYMlPZv6cA zk9vim&S(}g`~x(ammnMnX0hLDzORh;+gPFcB$A^<_&tW zgrF`-4;|B&KE))+Y|8cK7VNCK=3~tGH176~9k%0v)s=IqfK*^6M3u9|a%?(U?Z(MIC3B5aq~M=9Uv~O{1uaS0@}14#-w$h4ocNi9vvJ|XyiN3dv-)KG>h05@Ak1kwvMz}d z;uJq0h_r%8e&q9kmV1I@{CXEMBm1X*_7!e2Jckpn((DtYBH!{w^+p9B8h>^g2=uBG z*cA%xu{jeWz$mBDV}6DABwE14J;5L8luN47%*=Qu5(a8xkT4_7XxwkF597?7yb&L1 zdW2-|Mo@Vs#K-;ZsUC&+xp=5__D+XP^&kuydLd_rA?x&Y3*Xu2!384%gq2m#v)%xC z)_9cce10(w8rTq-spYAX3F98Z3KyTtF4+KNsye1UVpIhB*$=66Hl5LA%7=1Sl%bRO z*{OGR9ew{lS-&--;QKAA=Tbt?sj7hTjt{vVPdvEP$({9XvOV zKQMEIELihUTKy4PntrcK%A}l$;}T_)Abhc&)i}s)1+=KHNa-mL1{XguwmrZg5C6T9 z&B1Kaxrje+Yik_{wki=c6?$Dhci-PT{UQ|ih#B*?^DUIw9FM=2rg0}TOhD?+=YC(0 zdpp%t%zMGIdd{{1mM18<77QMQ!kQy_h;jPdrvDxpN=^4k|GN&ZAHzy2eOO+!hvD+O`JcqjG7L(ZI* z{x_Bh2?bU1REFyH2;su`Uc`JKlagApb$J09uOm-)_T|^U^$$G`+)lYbh!()Bku$q>9{RyP1utY1tJk3OrzJ zIrJ+j!h{FZ^p1-Gua_Q4~F;wQEli-K2R%J=DHjUF0FvE4IRy{eN`fHA_B0nqG^w0_h>E zjcIJv*KtW=-t|cW4s>j_6vNp^N4A!wB`m|IH==b>!n@hg@_ar|{D&}54`Asv)d#+u3t=zd&q?b1>uI5b#Z=XhfAqks4kxT&Q zFF*Kacw>G+X==;;Q*o_|!2Kjla5|+`BN7`a;=Ntulx5)^f{*i-_{Y2N;(Z^}4OMau zW~3rg>gj(g>J9+u6Wsx~CUdofJ%34qI-7S|CZt@t*b9D<&^LyR>%`R1@tN(*Z@k)O z#tSAXS{$v?5pfa&qztM?VE)TD<{mOHIy3PoX;AeitNVNqmO<6{BdJ?er8j) z8OJ5u)AmSM4_EZ!{pIdpqL*F97h+|ntwFee(pGk~;zk$E3pFhp-rSn%>T$ynCBcYP z7SH1*61HILj2~Y=|JY9REPSaB2-D2ZDc%E?B3qu)<{n~HEs#Yacx%KD6 z!h$zZa_j|h+K#WHdGDV5&%BkU9i5z?rt-D<#PMPEDMm&jBMn=z&4oAWp)kWJJLjj5 zoE&)$S0%hta@#6{t)bWIZ4Z{5qz2$%?N`b$4?`l)tEydhxM>rnv*(3bi;KPAZKQu} zaI)A3;crVWUdsh>SY-3+8Tz%H{)ymW?ihVvngAul3<#o$CA}KoZSJhS z-4Bwwc8Ad2-4cPr^zf1Sr${px0XT|*1%?i;KaS68?#Nf@g*T{2U_j}ADR*;iGPg^Q ze~j4ki_8i_diiVWcG^tf{qkmSWb)OnYFe zs<~TwFxAb+*krKC>J_qlJD%+#3hU#f%8balTpXDD7i*Rk4_}hIp=Jatj+ty_wTaQ^ zis6mf<6(|Zk_b@M53$(EDgsc|_D}_+1fmch?rz@F&g>C5=46jNzU-71$?G+X{Mbzo zy?y3bO7T-L=e3|^Uo7~X)y(0WnIPn9M(^+7fX=f;&-OJBA(o%SHp8uQoQnydw>L=$ zwj@urn5-my9_rod?NmQ7Y&>m2@Vx?Oren&s&Uh6Rvr*X3lk+ZJoEVy&X}T)c5CeX7ZTn4qo!X}h`G)9E@#%eMW5d` zdx7M(@0G-EFjjijp0@{9eluMDLh-QP5%NHPsO_$BSbjb%-;=Juzl79@Q%HaC@j4dg zXzoRH8jdGfeee6V;&!euf6tvroGbPofTG3qD0>MY^*(S~ddH2}tJ(_&`+P5Hc@Vm! zImFoeR!4=NmdAJ3uiiJHhgT;ioU(xT{C(bw|F^Nx&~OsrgZNC#7$#{>6S~;gV$LkhGaGP%{%1ln#}X)o!*3*!+Y^M0cuAWkKbU`LZTvZ>(X037OYKJUHlB~qzNCb@**n|gfpRuWO+gak z70xRC0ZQGsr6mlT!CItq0tHMyT8}9_!r%;dp}U&p!=uNuYE!+Ya%p{Mw^^e8kf5mu z2kE^p*{UIM<%q(beAEUORtRKdhH7PYGsoSYg9(O~yB=R6bLewiw%Y$bDio-Sp1lCl;VWN8ztWk!uF zmSn?!0CbQsv;9eQVeZ8z-ZmY&1D#Cqf?UnqzpOSU*i_HUdS8zPRnBs1Q@VFX?hWi0 z4{Vp{!#it#z4bY8X)_FUaJ>SIVhf6^=i3cLU4EAB&1RugS-f}UENLAz0#RN+w4R`y z>(pvT9}Sn}R#++uUoy$BIP|0%{xZO%bpGlAxa(d&j3|kxx@>xdt$(~rcqgpkGV6oc z%;#j@{7rl-6`*hE4vP`~+FB9-Og}KAYZfi#F6WC%9q$VA(n3fI=<%YdL-=mzXD0a; zYzZ5L7wlT@cPP>=QmB2e7VLbxI~V^+C!H|MZ#b@lrTQ+Hy8Y}KZMXa1-H`x&$kCqn z8P7j&mV2sDri^nMH=z?3nP_e_wKt*T=5vzb?m2ERV40_fL<(DIW2{6pX_-=CA5AQ5 zJ>N;yK3`}ycDEHvR*bhRH4zdo{$se&p;OJF|Cvg0z_e9*ecX4W*Q_UW0j$?@dr*$r zTGvQ1Jw(O9JlWi@EvDwcASVkcZ||dyHn}k3a>TufMW4^*7%QU>MU+U`)_E`f3j)<= zpbSg`0Zb$h^JmGUJLXT3lZP8052lz_7A^et$%xoU#ARqIA3-%Y_UK?#r022QJCif=6LB#bOj*Jo?51Uq3!URz6(YpN!F$tg2Lr?!g?5Uljb} zSWHSh8D2Qf?@4!)Pj#P8wA^BvADRU~W}c>Tq?7=*J=CL4Isi|~Bw=BKjbrNiblrl# zpL*R%-`;d6MQ}C4HANsK>)CnwSDRR=5jIc3aQ^gI zagMm}QKQ5k<1Hr3PAu1+iG#Ux!SC#K8-|yCOw>i*7Gl{A$% zfLDE(o?@;&{(nK5zZ09*@1MhjX|0nnHR}aFJ&9ItwCWGZtD`&34t8Jr<1?!|Mc{GC zN~66x7*AXGa7uU;SREeA&ua5 zY>Hs|iCoU{gUmHH>cpNH5K~oOrq)?txYKh`SHVt1-8WCZ9P$}n;>mH)?%PE^EFWg! zwhy@obNJE_Dtg!gO*xqBoyvABzjcaHD|7po8w~I1t#%mOGKB zSI{;!%1+eOak_{Nu145W+!*WdK+D>pg5j&0>=YI8xPOeXWhji@Wyto7{G-|7{xZ?` zaxb}66}JfM;|lZi8I!tQQ?05?O*qFbD5*j`7#!^9hc`p|L-M29+dj|_1V2SChT^kM z^+z&84LfV#!Mj9SG(Fc!EBeM(bbC~=!|S6rVe&6I%Z+pgkzhslL{Q=d9|Ld#C1kCB zr#wggXGC#GLGs;DTQK+SCNmpOQt1cXN1Rb?@_QK*B+Su6Iy% zF6Cq1+x0Y1ZOq}1x)H`9xKKr@Q3}tj?-UOACq3n(B&!yFG@0~ZTj?{OBn7S!jg^X^eWgZmY&0{uE6E%&DzT_q*zpXVpNkzW%MZ?G{Eb*7N)$5dhFg6#S=d6K?icwEEKJ4O z-<`9wl!4T1l?Jayqmg9cXKh*SB=XG41f1)ip}Y93ekZN?F(vivxjn+PB=Y!22d?U` zQFoRt`J{L~cMTiBP#Q7-Z2X$3F7pUJ*=Q|* zeXQDH^@8mnnHOB|gPN;r&FypzpZam*c|;OwFydo)2g7$CAf@O<_}0syj`~ zaz?P2%3g%{QbvT(nKZA%TIaQVlIYc}&iy*|AAO+*ZNQ`cY1n%#9i64Ub(FaBGq%bX z@lz84sd84Y^k2OF-wmD&eONK+?lDBDD$q%%i;tGPzE z-Z%Lv?j5~1C8w-WR3jm$EL~ffj0;NC%d;jm0xyDWJ<}s@_vUZ2?a-U8Zj(Nzlr5<{LprG+Kb#J$ zW?oN{Ka(;2v{hWQqU?EC#l$g6bKkQueUO`M8@m75b7*7hc*%8Hb>-oT{coZu`}N@Z z6(29o2Laf2{eH>jW3ud6n;3^t+*x1W%M(dFshi}f1c*^B`*F*!=6Q=e$_{j#H&1E* zl`x=3?;zH(ylb?bj|*$7FxoKZ-L6o&p^;cGtqE%}9Ic$I5X*5EE&RfWn^2?g`I^{H z2#Qp$5Kn$NHlIM^MprpO>*yr*8);E&b69A0qzxD~xzX5KQD2 zQWi$zERr%FbYFSP)fM84l3~G=Qlky#!gJQ}N5hS@>BCDpfoc@s?^ZweqbwnGUw2qy zyA3{b2PY+K1z|u><`$E_X4ysop`n-{nc|u93-I`}-kP{F;wv2;m58mcB?ff3I!+tG z#!h?+g;i9<6TETYal(QiDd%EMq--DD0C`b|wgVPYR$C|p2wxeQ~ zET=zCQnUf8-+;&eV2mOz2x?$#?NSA*`l5r`)t9KD^r zgQ>Fm?@DCr2Nz|AQLhc&od+I$ulqm`!-Y1*WqBA)zB95VA0c1A$*F{?8h)-|;o6RW zlC|hitSOiTbBqziJZ_@6#D}_%yqek}yM*X!Zy6YGJ$7^770Hv<$#P=X+GRPr+l~?Y znk53%8m}};R%@qUAPGhs!$)~TA}e82hVP7wcej_69aXH5A|nmmQ~+?f9BG)VpH^5G zUM9&#;EbGCnC>~j-2h&^Z#NsCB5zG~{*117)t)9>%N+)<(XBJ@dH|{FIdhW3LA%k^ zxExz?n(u=y)*p~CHi?nU+oEvBB&VbN^<4q6#@ z=bGjR#kSey_rqIzy=3C;P?lfdq@?77^;;D{6lYDYSzJtA=(rJG#>FGOs^ykWvwH&&T_YhAN^q)r{ta~`BAD%zDM zb*mQf2?g|m73nLLws~7I)D7dgM??l}+i14*JZ}d?%Ql zVc;TR_A(~Hj3hQ|@~*s;ldb`y!E|ffkt)4YdVJi;-b%eNHGm0Gd<23wj6pHDgEn+- zom0IOWsK+#>%56cL7)t8!|xYEwA`HSwZZRkv#d$?TO22ak!NYH_l`WZ5W@^?-~Ttr z|2^i<-(nq&Q@NSCAcL`Pi#}s&#WQgYrEn@g)d?!lFZwklOllL!tY9|TxAS@} zfSM3yx~<6+;YLQq2+o_V6!`Ei%&}A4OKZYdqrOr=wU91%SQ_wA)Tl%{E$2Un<26gh zhU^Epl|tTzy_Z%&GqqjIr5i)2Fx;I`{_dF$nV=u$+= z9exb}JvesmQzFRbu5n!8zJLx9s+3TK7Zv=9iOZpbzJBZJj(FUc+^)vN6lso-cU*{R znP>|eT3c0tECyv((*aftYPyePvJ*V1@}u-9X4~@&=7A6P!A~R1uYbz(u{qNH*8}t^ z3+8f2`Gh73<(b#gM$=L0I8jNgXKy9>4n01@qS&c^rNl(YlS=em;9J2H@V%A$-bd%5 zcZ7N0&xF>#P%9ez>1;$qF}KLrJ&oW>5<1VxmU3p&(ta7bQMUQpUs}YdI)yC=`nYR1 zv$l?}#X(1a;M5>9gq$%G$xOIX=9^L;74C4rwHXOw;2O_i8z_Ei#-lpT%O`U)qrD^4 zV@;3aK-bCR-Pd@6`3oo9mq9KU#!nAf3sGZu1YB*nER-r!>TA-_Rww{XNzibl>fkFx zTA)hOXb2?6*UrAa8-Gv8ujMuLiy^!M`u9Q&s;qo`2d%~SHKBkb6@qv^wzaKLqb<5E zE4o4E`ft=5+!nk1TmFEOHZk}EIydTRuv=z~@v86@s`vvJt>R~TAkbkA7=BAtql+mb?m}@Vy zzPBp`jm5v|HzYdkTeYx%F^I5)!4J)!5d z00!ed0Wc1R=Ih_)yb7%4Bd)UnZnZg`qU+^haG(|Gb#-oEH68ZUU~Wuo_5xQiAuR13 zU*Z(kWLZMD`yvv8!;4SPPFJsJ@<=OMKxQK}5qTZH=0N2T?#Xy!qY!QL*!`O!QH^A! z0zV1AvledzJcXRaT&V1RpwD?e!Sx*iQm*kHnce5*rB|{3d`Eer*k6(&+#;oC2sDv0 z&Rn$m%CS>KlK$Tpx>kJ&nx99{^>{WFe7!2$&|#4-fAb%qCseE!UIHp|h(Y!+$nwaWgqvZ|{5^ySU5B{=~200614 zLi(xyl|RK}m(EqhXIQ{oeoGbNt@;O1(KQLs`Ywya~V%(;U>t zdgmo@Z7%swQf-JBMPW|YAf`;VCWY6{6Koy_ZZF^|h`FiXL|QIr+BBnKC}>YvF6<4E za8uLc>uD9`;1HOvnf`rdy+N=4xRF<7Lfebrzn?GgA07unZ{S}*0%!rz^wlgJH1jpa zTl;+A#(0tcXQhwA;*t3?O9_T`{dEhw{O7VP0awq^8>SBiW6YZI+cJP&{Dnv9n74hW{r4 zYPR$3c{JW7mziB_yqjFnH@GKjxcv*U&QI_U&Qx!XIW4FD8C#);LVQ{?=%5~{#Xg{2 z?$3U3D>hC?8UE*lujoJD#N-0a?&8eyLC-`osI;v5%1P(+isC+m}+0-m}IfdO}!dAm~3RI zjzZv=R`7~kvxAe%Nc{5E35zKzyJYGS7~=XARCXevezvVx6$LH|`r2{lz$Q6E;Arf; zAYQ`zJ|f@85f`_q2s)Ep{5l*Th}O0`tcwOKf?a(keK{SiRr^iN7S25kCfnB=e9|mQ zMjQq5Ft_^>-jf4uOz^i68%|HHs{`;w&+FEcy0DzMC0PRS=gCl3FE^M;!0mZtNX--Z zWd1ARk%p2I)iAiAPV`6vDM)H$S;mtd5_ODW-_i`qS-}P+;Cdu!r7d2rX0(xTxpiJV%a3Xy1LLuzUq0CJaw+iWB&4aZ~P3 z;sT%}azRU0sM_+K!1VP7N+G$Vfa@mOv3AZ@M*{~ZbG zbJBhlh&JWqWvgWP_x0pIF;bh~o4+Sr7@AA|8+Ovb;%N(y#U9s@B&_4*I>LElXHiiC zw_nM?u6eZ@)W|3u|9bY;rusX#(!8ZzGj4#~Bgqa?>(mH~4UZvf4W$WYoeg3%z4~_5 zu!o1(y}`Sx0gR0q+s+dkR&#Sy23*Tst3G>IV7(P2#q+bUz!oHUjZI-0f?w^$iMwiN ze_}AHf(EVykz;`@<_4p{EJl$OCi)l}1Myj`NIL5bCFSnVVmX_=^>jP2C8}&NDF{J% z-)-T-{2$J8K6Vq-?JH;7RA@F^|u078xN@u7gTy!EKnUx?#YvG(MM;O^loI$%ui0QHM1p~-L;i;NNYs;11e7*Nub@m;_ZPm3~|&mQbBMm zW`~k9ekN7WM*sYF!-Ec1;d@#K$_Q<0V+OjUp(?b)S^I%v_7DQMD`6y0f@UCFwTvLw zSzusaB>}inP%mN}M7lfXNDrY4EqLnIt*@-TYPN4YuYVb00U_k4j%PBD-RwPqHOY59 zSMm=39S3zN$;-)jNwEXV3p4*38{F-h(2~<-gXzmKF585u)Iq&y>4&c^JP$~?;rDM< z!-m#9c5l}s!U8rlM4_VC$Wag6Sk5&s__#y_JPnD)a#;Prh_Q#AZdH%Mk^vTF5oN|| zq*4+G*5J@0eTCv0KJ1&~t;7_0u9P9}%!29`AvDrO%DqCerfI7UewLN)PY=r7FG&7W zTNmd7N@aA2bg)&51>vlFn5<&TTZKm^MB957wg-PV7Ud*BNUorL0Aw5^^7HmSpc}X#dm?c%UynAX$WF+OQ4>3BqkMZg|zT|CS)$Ul*5 zyZHb6HD4TE;UHb$EPPSSP{m6O`@dYqPT|X9hS@n|-a*p_7AFlw_pAH;H3($zc?Rp@ zA4=<>S26*|TI>9zVl4~v!ptF;VdN7#@?X_tvT9EOQN3Nsnqu$IIb(HCal`jahH233 zcJnlCW=j8V^J=01UIQ>_Ce@ri&t^&y0!|!AV;5eNA#dKZ@pnTBgz9tx=98od_ z16Cmpql%(wUdR?h5AZ`mJgg5M3yNeLqMnJWpB9I-r?htU_A_<|xg9W>#PE@CFV$UP zIRzriTHqilv&Gm7Sl33rCDKpNx#V*iwQ5*os=7hM%aPRAdr6`!kJp_MSNYUNM5zs5 z1P!dT);ZU1OytNdK9jC6KwoaH4%cq&B~41gWMzO$N2 zps>>1COtxW2VzM3VCgq@!is!4o26^;&Se3^6?b`S_Pmlp^%MTC+NERmh#ff@$b#~6 zK1*I_0+fSL5IN3GoB4jIFGxoYj}Zb8jd=hJmL551ftZ#TbZ&#%Ld5y@2xK}IMS?r9u5vDgr;~~Gq0#VjQC}^Eqb5d-n z4=5wneOC64m0c1K91?K2z31@bW3I{I*{{A(l$wlMZI9E%XsMEvNmq4-2a*-#p+8A} zcZ&zTj0HYjem-)p`j0 zPIP4p>-`Y?{^;6)(;q^lMaHOFUP&+A7o22Rd<%R2llaA1%4XIg3Kb%EmA5-&{ezyv z`{L&Vevy&k5s_I_-xI0Vxjz5rXMg(1o^j~g-tcI`e;ofe{PJ83qdk%5|4y$_EFJ?- z?q-nGD0|w4no;evUjrUt_HU*|{t|v`v7twI^a}ND{?DFNOi|uYklDoYmGGZ1#Kl7` zhGr1Rx`rnedj0GO@5b^jfsl^m6NoG5|@xBLXsLKXC&a%F{ z18x4y+suCgij<@HQ2Iav%Vjs&$p54N&O@3D<>%st2)`Jpu1YDH^HRo>iO?*!!F4Xa z0@YPNEs2$Hs-(~$-(DM~LDDTGM`d~FtBj^GLHetW*ld0@Wmxem*x$V9n)A=tUxNUfT?k3|pD%3XPj z{ziI0gOTqs=j&1{cAvEE7@!g$k#!Tj^Aa= zJ$}0>yy7n^XHxyC^lxwo?UO`stNksRNtCn0^n}r3D%|R4IoPF&Q@)GGr%ZZSgpQ2S zUsTkIluD$xA{iy1_d#B=-d)sw^_z||P4Uk@p5aGHK9u_AZgq6~SRV3{?%h&aG2CI@ zv66ibzu$B0L;rE^fYmT%8bl2UfVAJux%ud8PEvK#%EB(u%XpxRR3~9>q18a;8=3Kk zw*)NZGb3Ob(roqp{slYx8(Q*0G10)|Kzm83HXc}cxEb-Y$RsrKy)gwJ1w!y`gyy>i<|E`s&CwQDV zK~mQJP19X@6cda!0b8RlO>gh4k|GB}a7AImrjL4WR#+9AbqB)O364~JG@6O?0>VZtVGyngY zmCrt{9$DL8nwcy7$M^hiQ}hWXdfU?6xBcT5=G33u1RD`Zxp3O zpv9rk>-#!AKDVeenZ^XxP0j&Zu73LcgU#hwqrmJ{uA63Xz9t`K1|9PwEHK=zMwIoj zLvsJvnl(1^z`oa$yvh4njklVZsV1!|9uhAetA&Rw>~5>(S5?mz0nccEDzm%>%WF|P`_`xH{5b3rO>oBzm_PQ{e9A`X3?ui$o*`CfZ{j% z?snYo6rsb(2^CLI&lOd=m;;*kGR-NSKQoW8tXuA{L=;)ecjyvLRLPhk#BR+m_x1iT za@*P2K3vt16o4ZH%K2IMlGN9#hlTd@J&&6C9Se#kbzGN!l4F^6AI4Ag-5^rEIsElyBWzmM`{sxPz_-ukrR;6x*K zjmRH@!%H2m8>b&aE(6TvtUM2tD4IPOaPGqY=x)GBwG`u2q1^ zzC?;~XHbFKg1iuplSwQ_tgue?pmLA}_3`Frem4l)n@j){Nd+~VGv3!^<1F{7%o!>` z;%|oe&ro46nI;nsL<(Bbma|ZKPWE3hM}f=Z$G3hIzeYxi3TLK>77~Chqp@w!F?Y<; zM2~Tx(`h6I zS3jNfB{B_FMl~+-7|n6i9+|%keNYBTm=(77rm@hLv7z85g8pJtx)Hr zYZ}{TFruIYFX&oyla>8F_K-%DZvN*29o!hFKv_;`Uh*8yg! zT6Rr3Iv%@3RYTJYqi_4v_JH=(pHleeJ{f3J?}t?I${u!z>aJ_MrfR#o1%HKV^8gje z4zTz47@r$#!pWzEYWXqNZzke_e%8y;4qsK4(nd$gd51wr&(~)y?t6trrQc=T&C(Io z?a$zZuP^6LOojM==>H*4^S%swJYHPAtO-mJU2oMdJ{q>=Bl{XMvuy#mLd@)$QC?lx z+;k1cWtc6`M`$khweIVd-L?(VWXj)s=TVgZ`15@4{Gw&r;LA(3_tz_W0i8CHQY5NI zBvf(&d+xn-VXT?mY|U|erE25!f70qi zH_~U~N-gHijuz{j=G3cxu2%<{cdYJf#gDy5=F86o-Wu`5dxLref}4wov(hyCBELdH z9^IO}F{Hn+Sk*Va94)nKipi2r-=^mrCj;$fd>djjLOE_qt1`iy`GPA2xt2*l7Dd{m zS%T<6bu!6p<|QRl)L@HW4nD1o?BxrQBDH)CLDtm(uY1_3p=!uf?-V0A28^`w*ctk< zjV)M61xCguwRGbBGX9NiQrJ6D&+Yg5z$8YZHfkk&T7P5ArrD!lTzku z_z+>$)PrTT%sJxJ|E4qFiUxq;!Y?UifME3zVV30qTytgvlQ;5H{=f)_k9&ls$8OFf zz=O!il}~Ip(Z}p8>!B(FXcjYjo-4m?b^2rF^?cV6Rm->geOkOBN~uDsKYg*tKEbn~ zg*Q-?+W8Q_?-Fg>5wq8|#TT@r{Vb*J zh*^v6R14a@8gI??2NkzDv15g$o^bNKIGVa*sn*Q1gtA!Ilc~(_nrAyBmk;YWzAD$$ zZv`=Kxos7;+VB;)@KS^#)U|Khn8Hkn+4?8GN@CVnYZ2#H<%LM%B)0g}Mp#BMmx6E* z6xtvL2ado;#%+fj$sGFG46HyBI!G22`IVHB2x0QvU4a?KT^AhCv2rFEdOKn5`8Un{ z-Aa+1RY}KpAvYrw-?;Y>0NinQp8&xQTv8r`{C<4Yoy3ej>G@?J%;=yn7M#c-Tw+qc z%u~b-v<+5v_eK`yReC>qlBHh(c1kX_(k0!GEs>I%K*dm!QZqZMh$G7ni@Vte|92tUv}7{ZihOu~JAKaqZ%{n-CPv@!dMcSWgh>UnY1 z^t?9J^?xLb0g2007N z!mF=-?9nX07a$Bt9Qd&z_Vpv3L$!$V`;@8h~)wm7!C4{dEAtP%kaURJoGYOZ!-;(l-p0DJhSrGNZx&XQH zM$8AF_8FLS*WH~2Jw(Y+bBP)j}f%YLN>U^75S52J;{py5j%T7H-GeizMSu2`H$Y_T#OdO zsBVPMJ8)kf5cso8+8+6?N>ojb%Oz({Wy?f=RBt6eIz>`#Ub^eves9)_alu`bz5c|1 z`=sR8w}8HXL~SiB)U;riJkIG}o4W^PJ(MHDnLnhl1wWNAK62r{J4N|!2xZv*$TO|c zk7K{SP&wnf>S99KqXjp=soMdj?n;UVQ2{@})@G2%LlW_o!bkmw$I?{kDxL?Yl+CKS zE9JM2$u`vnK7qbD4u$~UQTP450A_WvKdo9tKU#CnaTo~7CJD{CF;m8dFc*;v`!0nA}4QRJJ}T9)0{(Ydt6# zie9m)S&B1R?&S(?74SF~{pDcMSJoiYuspg#EJq?>Pa3@)_lRc(5wdiK66r3+kd3hw zJlPD(sbd#@6EJ{f9wLzLXWtQd6zZw6Z`bH~Z#<@mxlyyW3EY<*N# zj6*?8{ykY(Bz21y5=(p?+8U(y6x>d_kpJpU?Nh+_(6!&d_(#>z@wlV$62{GDzOPXX zi%~YYX^Y3W2{Hx}6gOV=5EcnhlmaRVS#g>M*(UWZeehSvOi^kJE!9WJ+3?WmKA$i6 z3%6@my|p~gKvGw#vnEJPk&-btzxQm=KKD=DS9s2XmLRBR?x)n$M~Pw~7hkRQ#MmI> zmeJ=~uX`Rc>(v~NR0gS3@tfQEGapkz|9?&zj;iRLc=Z#PdB4KmGb{Z(I zDO6S0QB8fvp`mwsEVl;>`Xk+RH!io=NvO2pWzRb$Z?puo#uob^j_USijUr5cedzOi z@4ndKPI3JwdF3u}xs9jD2qmnha}y+W0e9fCtIgQLd4B@G^rtUJq7-jUMh!Kvw+W835Hf^{WGCJ6QzLzIRTxb|3 z%eW+nQJ~QEYQSX0$V0%ZR`1)3Uv(q8p7*L>9zR_T;q)LnBumn3Nnlg9+aT@Zns^(A zB{xRbZR~Pi^AB6?AcqTeRn)$2FUteDMl0PYK-8qG`P5?M>iGMphI;np(+02K3wuDn z=7)GahdO}cn6;8cQpCu~KEPV6>vbx=*sWwXtP&JyO)GLbYt;DBgqZBt-Ef*V)6P3C zzY(qhcFB%85h3yQp1m~BBlv<%4J8LI-683PV@*ZThx-$lc=qGOSDmg3h*mUA&SZEt z2@sei)$eX4YxIO=2id0jKHOA(bIaAVEMS-_5EoR{aX#(ZyIw~bu__6j(rN?=y7 zW(|*S6MF>uY10~C)^T{Nt=!*jo8@X+Rr|(7!2w?v<+D6|Jlhxm3xtD zrg_~sUyaMLXGm>%-gMyg?!~+0y-G1x-K~z8lM3fF?Na=16k)cJp z8M?bWMO21Hh8~gb?(Xgwx(B3V=sZ84|K4Zs^EoeJ=H1+}*1E6jdx?pq5_SKWoQF}J z)Z()2C11QBm4veKE&71!q6ZGQ3jGEe`J7a3Mwr40_*Iaj5_oDQjVGJ~dnmSBF8y0{ zeaY@3PC=2tjh&}+NN3JEmQK6d2}ML0tz>_+aUfgMo_Qz4_l~D(^(ooOz5?%JT+c90 zM%hbNmbVR~sOU#EG?B6h>%!)*g4cgQmiWht&(6P8Kg3|RQ@<29Hrhq@lSu zQLiyTy9Zgk#I$oD6X;FmC*nFzvpHE;`~wCWT#-q8Znj_Sr5r)z4ouQ`6HYV^Z}bKL z9TR`JgeTO+^DG`Tsk%d|OVb6EE>aE!nvXK%J>S?^2Sz)Hso6u{5WEDjkk$KRG9!3j z`iZ#Up>ZlJMLfj<%LwFuQ^FUZ78vVj=vJ8{7uih58?VeP?&FB;@jIZnGcN{7Mfu9P zbPLy#z5WO@bETWw`T*w!x4U7I4k)#!5yfPDH8k0SgtPw+r47!h6bR6SNZn~mK-W$> zff1sB)eA7qZ&P;8{qB-j#kCiG(K5SJJOVA5K2CdzJ4sV?`CPl&MI7zAd@M|+z*|&r zw=^npYlVcjhe^tVa5WTvs3$TywP6IbPQ(*#=wkZ`%bRAi&4J0R`+^%>Z8I}>{s1Ky+_?oQoMLA>BuQ{{i{YJarrLm8Zz+k5Mww-Jc zkerkJ)rGS|ZUZ9@D<>irrp4~I6>q5zlau{p_1e0=f86LMd&p(2mu|?uHt5FK(Y2x{ ztoo~Y^vY{`)>7E{djxRrNwHb6sq7ZlP^PLl@;OKC_k_!C``_(izus}7_jPRN;<1x6Q^u~am2a^ODY%E1#z|-ei-x{uh(n!vQOnZxj+yr7sC4Nj)9b(T?WTvNo0E7xzvC{VE>piS6RY)b zzP?VnzQ>`z*vdLz?!a1ZX-8U)IGrnocva|A9DGt-ca3W8%mzGq&Qn@E6edP@iZwXzQrsiSGz3YTJHZnpj zc1k**wH~e!EmQI_v*mYYZohk*b+-l}yhAEKyRm9<_I_XCyX6_$w1l}?7$Tyu8vML9 z@E98hyb+{;wbr5$l_Kc!p(Md0SVNv z5ky{Pxe<|Q)pJ(XPa4n~>NblIr0LyKLV3h09EQdOgzHH-_up~kNRkp zP4XKgX1BOL0BcdIPB)DVDkiavUjL+|C)Xdnq0~g)CK5p*q?dL^jM&qCq}hAY$bTdo zBhD7BI0FLSq!qu_NlMtLDRkcp8h>O9&BBQ}4p5>owyC)J9I-iVlqT|Jqn8UqQ7lZ; zW`cWcOEg&}A$}4_!XYcRzQY1pR%CR&GhRgM=Dj7B(L));dBqbL%Yim}NtmAag}3$Y zNamRf1loewV~i8yKp>s7OW(a?slc&?{SM2 z==vEyn?YOu7t6>`>kR##+gY$)y~)E#qLxcqFL7b!dk@=7hbFn_Sf)3}zpIt6Yb=Pc z9+}|pUrINA3)Rga-*fm7&_KS&`k~eLaV@3nSL$tZU#sKy_px-T(%6nY;}Ow}ji{9p z|C@rp#+ai=5-}}}tU>l)Xqw>IZc(~%R@Y(L#{OD@D?-^hyQSd{YZIpy)I`z-q$R&_N`+o zWJCL?a^h14tUKpjqrBK*fsEGix;S*CEr8*CKk$epoFWO1SW%|2#P_ zcu&q5ujOa=cVxH!C*PyC=hZN}WitCl@q?E{TLaYp?qm3^@1b4+6p5^WCm9i}O|M))wGJ&lT0*LDy;>SG(8 zZ2xcqe66dPBu5cGye>d^_+n#b@p%+<#hB-HFi8+et(Ri#EhFw`^zS-T5Cy?;=s=CB z#&4}I1r+o9;Ib@ETTeoad}-Dqed6@HYSyaul7Da$YmV5AbS7&zU*LY!2fVmdM@Sp+3vV$ZjpC6HiM)JWae;Q10gf zw)bniTq`If3PGwrPpO`MKMDE>Vi)l$N1 zB38>#thSj%Oi5T%Df55Zs(Qs@(CN#z)rpP`ieJdZQ5Vg$31BEO6;@!PlUfNJ_4X}C zIyP~uY_jZXMQ@Jrn5l1x9X6v_{cRfoUPE3%as4=>En?Aa3wBh}bp39*C8~L@C#c)b z#h;tSD#d-t)8_$x>dNL8R@hK{*FVdy?GX4xq4Mak<^Jl?h0rjvRZi>+7J>RVRLhI~ zqgj*K@V=p+zWC(yz2Ai&Zk-vM2iU{{=PmSu*1MQ=r3^I)+LcdZwma~~+1@MQJ21IT zDDWNA5}LdS=n=iy%Q!;b000YW4KcoBv^DoTq+Pc89b>X+7{)=7k1m5SyHDTw%6Acy)4x~eT$pA8tZ(A*02#wYvk)6vl|7C1WqV3M%N+9DaMj z^!KPdRxT{)$E+)N|6Ewj9^N83*ZhMOA0WUt;v zwt9$_&A)8yKiAQ}+VsnETsuSPs|~O=q{|Gq@E`Vl(T>#lYJXB=BhY**vvirelIp&! zq?y^30Hr8l@-vjI;s_6yW2vjGUprxn(Xw*ek6jL>^7|&{Hsk+r_ewOs7HFYs7YczP z&`y1GWAhX2#NJ5`L`M$FcqX5@Zth?KuhR*I}A<=AA zh=K_bLpM?&lNK^IJ~upXsiaS!!0a@l^EPd0XswYn5Pb*GdGb#_0j+FxF#OJ9|IJd} zJ@WRtlpVaGvADryP8`4&w1=R(ZtrT7zBCSv?722J@jdFesP2-^x;4xY#Y`lYgzTtx z_r_zuH}0N-7?TJaKzMuFSm9`0gDumTsHvAc*0?%^SbX@X;kx;Qjf0p zW4!`!#8U<^82%Ikd{zC-IEky+6WN>A@l@c%Xk!MHjK`^-O1=uMwn+K(Cn?^L>#IhA zH7nRj|1&OV2BZhOHq5*-)*oFk+J~nRy=r4vR=?U;Dq=4`8O4NZKYa`yB5{^xl1dmz zj4GcEaT!X5$ZD-#nLY#Q={xzUV(ZBbvxV(yJ3$0>A9&T$5_9+d=R@kow%YEXue0d$&Zmx=~ZSJIXYdqiBn=XLwJ2DxtLj3 zt&f9oMH5Dj+em0sa`byH-;4;^w{&Q^&v_D6jRs*K8^y8tmXkZP-zA!-WtB3avwnH; zZr|ub67?l0m2G7&QIb$UVd0{XM6Bg{oJ`w(2Z!>K({C_=qcI9i-mz6MsEorW8iiqZ zZdZ4uE{aE&_}EY=ziII+1KU1gEVCB^5zeDrtiff3^({8xx)F47NuL? z3e)*K@^Y0G5^4{v6z2!MON4|aj==THLY`?T=E{GhdIO<*f!U|)DM!FYX9 zctva1k*OrjbbvAW{_Wh@4=&qM%%^;zh?s^RWH*~sb;kF(T(LL31v>Tz8ZnT)#t>}f zUP8CaHzwhWLvvk;_t)0AMS_W`+@GIQa2KhJTQJpLN~^gJM_;Wh^Y+V%C1u;Uj$~YY zz<{*4If_c`LM^2yrUdAl4+tH7#OWYn7gP^BoRB zl(UadKgOHw+Q;7zKg=}bQyQf9KG+rw+Za%KXk)O9w0Zakw2~|$<^)&S936NSj1MQu z7~*+wwLO0ym!WS!(|sQpiN75?YVN*Q0*&?@c0mSiKW1Ueso#Tl3j=&GC@=N=EZxth5Dp?M2bOE1-aUQ5A)zvN#;LyOupTbomm^O3Odzg10Zhv^kjxQvR+OEjCXo04fKdL;|TY>}9! zrSr}>NIZcVU;<<#Hm79nh%$~^InQnp-|BqPU*y=hnwWRXOb@X(+l6p+k5%@%n-#DTXc@ogc|61hb;~J5o^5qt_$2!QX zo^g`9e?Z%>HmLC*dyKx%vHy4gX6Y`Qc-s15bE`~fEj)yAFX;w&tCGiVl`3uSa3d~^ z@jZ}(Pr0|;BH1Pt{ja&sU@Z$>7AvObGO?ee-(;|ryiINO)Ztt5Aebd5Q&Uk9^4Tb9N^-pRdBh5 z1%>(6l5u`VK9-j&KJTE`WU)f*Gi@3WUxn~YN$D?E-7FasgKv(drWIoP zE%$=F{{S4H>5L6G0->EH_W9!*WqtCOAX&POh>5&od2vp%-*#MBzL(P7OLrLR#u zZg@HtV_g%3DY2nq|4YXCzjV+4kvLyd1_D?Dl?pR6s(~);Kfp z%wgS4%$N3lorP209&~B~Cd%?yx1A<)CiG&E#3G-w2i&D@dA?fm+5Vpax z>bLWUa`qnmkj6hFvO)Sl`9Y1Jx!5xBj4Fq-NAG`{-dB;`PR0j z%Wn<(XhM?U2@)QlUsJNfSIO2bj@P$htm?}qE084A`{>KRE|K#Pjel^z3HSFq8y52F zQDd$6_L;XSlIr^PR!E~v*lRPxk<5`DXNXs<;(dgkM`4n}7Li&E*{K@pXtl1M&68SR z#=I=-DO*mg?FW53^w~i^OPCQMg=I{7VHzDO**XqKzI+dT{Bj4!E9+J|_BBw^5=L%_ zEb|ARyoYTy)1VMu3$iDCh`*Q3Qrtu?meOY8K#@4nb{)wcNYJ8jfDFd9b2IDI@v)Iu$tEx5~0=4^at zNF2t20Aeu0Od||`0ek8Z=%}}PwtSc|d4J^}Z&r4v?ncqpZ{3uSXPmd|^SlIh?1@do z?`V+>cp%ccUUwfYH!ALUb~8X%!3}Tl4&QW6?kWhJm#}4xF!HQNQQW2 ze8NP+Rrr%*@tlJKqSwr)7p?%A`|nS3ViV7j^@#K`%-@2Tl+TR?e&}KYV)DvcTBP&| zbH24H$N2cdOp9hpo?GBko~|(VtF@Mzs**}f_F&wv=PaYZo4EU=b0rxaNz{mjVv1{Q z&HLDm5ZIw7n_!u9)}Kc>mjGI=Fs!jVY_-vA6?@m@#&??*LeS$WKE*ux#-H|9fkdmt zBT;W#(pz2Bx#aHxj??=kUU#PbD=@hUgUU;jMaWNU3CD0wbDPL1de46&aF9svR~}tc ziT)prQ-x_GNp<+mxcSdu^gm&}IM?~P2N@}{f?=E$b6*-4z9Jw4Ss(?@xTy&fKj-jr z)c;ry^(2=5^3p{%&0kFn`4IEJPanQmVVFwMsK4%z%q`bIi7nE zkAifEd7$E|l!7@jzOZ6b=85C#_w!%+7MK%OA^4XhY1-+oXjtS73WprBCwRn(&2gM& zCIH?`tnJ&!&Z&+sHrc16e}am{!fbh*I!T^T<%i7~2Z*(c9;|w=JEIIPv7;1Nv6}#<%xQHoUB^R3-yTlXh|R zC#wg-ZWoUN7}#0JKqcfz!;gji+uBryonF!5_y&ycq{7>BzXC2e*$%B*`(#2qy0lo!BXzlQ9ZN}y}CDOPv+|);jEvM)W&p2iJWe~B9=lfKJ=D4AAqmLl4 zl^^cLXZ)IxynrO5FUq<$rk;I{IF_bj1GUmj4gut6WYAIdQzpaSz?;nSVjObls95*Y zUx@nh9= zT{R-*{Pbytc%gL&M}7d6O*pQECIZk|BuQE-jQYM

c%Jr#++8b4n+6&C~KmhA6L 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%0D3qV% z(-IzbwAVF7_(n~ek8?|Zs`xIoMY*?-fL;Kg+^v32KMzAz4GZTzFY}Lg=21K9ec>%F z5qW{n{EJJ(?&Ztcu?&y}2t1CUui;0f%cq?Ivg$c-sksouoNVbUb0@AQZhsuLRhlFX z7HEWD4uYaWq_q_lORXrM%ta{h%^lvw*8>D9_Tmvj#pL4$I0mA*I#5_f=O;7j4K$_Y z7fM%e!`}oWAjP89T(8_6o~0#JReWC_w6@|Y3I#*!MoB>OwwUsv7oB#D$cKB(4LAP7 zVzEL`6SmQ@QmBZsni{z^UJDxp$0_bHt5+H*UqWz@7Y~kP<036v)jJ0Ug&$nOO)7xC zVlq^ooo0A=Pf#r>%7u$~hnQH5Llv1lk$CM}o>8gPDLB4}bUqDV zL8mZBR|F3dU4A0&SQx~$6NE2s$uAVW1&hPHJ^r{seupg>(OpgWsu5tkRMx3;p7Pg7 z!ssO*INRr<1t5Q%SNneOeSaTBXqb?NdMr^qSZ!c;HX!{EPMByS-|xj5tfzPp`I!WM z_SfrO)+UCdBi-XEY0ck~(H@K$BV)+hjTMjBy;VPFy=~7AQo6{B;BwT%y~`-~e*6brvFICx)Mudt4Wf ze#1zene%jVV_}^NTPKO8yb5yq=j{^%IzSw&+aLM-of!MK%>OqXV!815`D52xjrz~| zi@K7Tcx~5E$W2mXMY;oE46q~cgOkO z*bJT=5VJW{Ij!odVdIw6@pKW<(##%6l4UgJjlGiVh1G(ak6`hBSPL7NHAm1^jiyrN z4zlv|KKmSHb~yT#%-j|V`BtvgH!>f*a=Ge!z>AOkZZ)OYBd?WE6m0)rzc;gDo@R+V zI0^IHnRh#;RXc7||J1kFfwNFdT7L$$U`ld^r(;z4sO=T6r%mgUyRvJ4jmLlNw;?VB zUm0-P@of-`y)yTPsM=U#3m|uxtkl-EFqB^CY-xj4tPI{W7C+1A`Ve+AFc}-ddBg6D z3^+!HX=NN+`O6WMhJ1?=wQY2G)O@o4t)69Dzr00;oRG1KjuLMX;ES0(yXY9|umqc|j1um`Da7U+F)hS(FU0P6DRmm9U zH-B!fA2gcmSMMx_H}P!;Iv+QAtxOAIt@!trwLN>wzh`&CD8v0>V7iK#Pn#< z$M{M=tHWdv^K6}G^$n8Pk~%88H=hOLR;nRL@MOMW(UrvuLmi!lwff%&y(;O3MB7A4 zihctx1YuRUmhdr~pV&J&Ygz1OzCX}QKxErs78xbkG#qoKVR{`zsA%JNNzGM>j))Zr zFMd5clNgUgtH-wCj3(WSh)Db=gjJ)Zp&9Py$AZS?8Jr&M_U^`g2k8EX4}V%laQKf8 z#vUochL37?;C-ZxlM<*kkFUpfZoHCsVjaLv3Ws{%<~DJ|uG~!?1~2wY8cGj>d)}IN zNEC-w&dohbr_}b@L%m}qnrrX%9DlZ)@%4bihGZa41`+jz?q3PM4g2-5l0%1v=O&hD zdeG+BpDwhogcIZt;J)wSo&qgIj>+H>wH<+~hHaTgz1+jY1R2)BTFoAGFR00I*z)m+ zoov0XVEV`sb;T7{t$RvJ_JJKnr)$MslOFc&gxI*A_ZD5V`RZ1{P!eNNe~uEj_#h$6 zQgykzzJHAgXr^1qS7M_p9+{!$zb|xug-_w%`QMQD{iiI3oa=WtT{7gbA}0f3;{G{3 zwhp(-yd0Cn&ewgGoE{tG1o@%hBeg{gWbTQV4!5T1B$gN&6;J}Kq0^bzRDU1E-sRjX zx?uuj+$o$f!Ti_9^ZnfJoh0@9Z+tm?;~>`jy%uML2wQSEXQ#NHxDW77Dvfat*7D&y zbl%z`qwUnugrj?zBg5<7DIJt(4_a{${G%@r89NdCFvH9VjZhe>;bsV~boHmCj6B?Z zwomvj@w9_mN8HRwroiID{{O>YFDN+te?saFF}C~dk9~6f!-70H4VGcPa?BH3c>{S# z@ha!tc2Q-ToAvr^m6r|#jxPGY3Zb8^fls<{5I08Mu14MxPuaNHn=b=xeCg+tb))H(=5B41waUooSU@pTRm&H{0?qivGwVjA& z(-Ka3vnem*J}=P)#3!+cMNRF>m)=8CFp~L&ucWK6BjP3B$R);c`!7w42y#6P-7f?+ z3G?kO1P}meMuWs7tO=8+xn2J^yUVA*``?DdS9n^b7jE;-CxtM2Qe1XPuRMT zQH4TYi(0UJv7=Lr9(man;i7D)=Ra@_)oQBDiS8pV7WfPOm$|VVrNQcoo4DlC*@V3z z*3@7saZmCd`EsyW-|H%f;9A#JzI?M~B9;D3&~q8wWd(#z*e_pDe#<-sV*2n_{pfBE z)EB?F#jA6@V*w}3bi6q`D#P#Bmhfc4FhgecFHq_0%6FwX%BZ1YZ06f6hH96`id(hc z69FtHe1s&w$aoMA2^gY>1#+h}_E$ogPrRYfIzw#z_x5A2I%wTEc7o+++>SsRZsn6) zV_40HTF%NZ5s%w@!#~?1N7xLwUkLS$Cfm^Rd6_L{aY=$l`ecB3ywboBcRdvmf( z%(f|?_p|9?cxTZw%63htgV8+%#peW!#2zXM4oIzF3D;#;x9K^YN zGGK)?>wGFSk>Lmb-#uVle;o0Pc0Hf}wL!{K;7_=i#bK}-`yWSq?<~wT|IEO%tfm#{ zaqR`AX^qNi?cDA;I@DT1dJ%&K^egIXuDfS+jov``FGy6jX*{Nkp0?$ko|hF=yyd_H znIx02-9(DhNO}IbOhkiqHWSP7?wP5g8?hT@OT| zDeGBO=@IWhb`cpx*txS4O6Zgf{tz4w4WInTTt=vNJl&CQzsX0jX*Ol)nOD6Nl^trc zHqHV3e?U=(xK75S4Yf(b%drJ!`!aK@1Ixh>O?dRf7q(lq?k}K41l!S zTsx!B8W3;I@u&w?H*2%~>sWmBQ+~{5YDcTj#fP|9s~>F zb5UC9GGVLY5s?`AAUgnPkNs6oD&pD+!~5A;kVpWDO?1B1BH(Mt+TK?}e~dT%6YI+G zjOZ5#H&Ka)U}CCb6KQD?sODHRxU+_O4`C7JI8_S*)JLQ&jQK!b@-=mZ6|7Ly3qp~| zdbns$rP`D$fl%aJg|%Xk%uhuR^WV=zS&GV7_`waj_}y45<^sBz#7|strg>lNJoRzP zX0OJRS>5vBo%B)nxNmtQi)RN$ZUw{|DQq5khV;ifO0Cbml63VKIZXR&PV%3<&JqP@ z;|s?8q(jHmw4WTdRp4S){0E~GteTKzkMT95{kwB-K6aBv#34uCy=|BK+#)(zQ{TvG zvwV-VNJlhoOLJTp*HwtzlwAB00RelIinh3Aj_q^g7#Z2Yh*Mkir-9K6TaF5pkB}mr zoh*k22J9^l;>Fk{6#y8LISUNgQNQ*WSD@IsBGFA;_UHG1R|%UaG<5Oz8o(4XDE%

WyHw12$xvxgO0{}G^nF=Yx|VzTvEHjp26 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 z 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

a9zDT+ga06l(kYNH8b-O$y(4s7XRo3_!Pwk= zczI+dTW{%Rp#b%*YHrwAyUKhovXEEsO~`jVQ-a3#jg_^%?1HO5vvsO| zEj!G}FBgc`4Z^<(m?w!ueky4i~(%_8wn_ zp^bx56|!y#1~6~OK~r9dchS2VX@Fx2F1#(@mFIF)3%bY)7$y%W>>N_*vbXNCh$w9~ z7qa@^RF8+q;{o3$esWmScavv0KPYny%RvON)KGeiS?1EH>p3|(?RFB3{d_+3@xL~O zi%-5oDp#b=f_L%9y4QtsBwQzwG*KdT$d5ajm>zk)riRbAqFOA?7X)ihNc5AMx+*Im z9{u{v7nvVwT6XXo9$_Q|c8-pLrC|?RRW-Dwe>K53RE63OV*Yy_n9Pbb4w5r|-)>FW z4=~49d7m)8(28mPfrk4H*n)hjhX|5u^_&VwC5=c$?>5(d_Ow;?$x-n+iGzz0T>;Ea z-iQ@=>}#+@d=@IDZc7Sp4GP_HDTmet;^piQj}G=u+KEypUD0N7B2<3-z0uF=U>gqQ z(RlLO;}7ZKBh7h*sL%$oEx=wGcnP(#&cZGUPV) zA<@QJyIj!PM(&PYPa$FZUTH-i(__Pn<)5plfw4$3gDexP=mi{zYg_G8fx!_b!cr0Y zmJq^p!D@>%6_bgHsgJ`wY~$<1{4xhXr>u}jx-J6uy4Ra^;@n^KBIIJR63ge;qtu?i zeu9|PaA<0s$4m4$1qSee*oU;1srMd%PIIh%R=rJa`)0=4`%#fA#zQ6vWoo%VUoGI< z0-(P;yHzx|p7f}g7%*oLTDyGP=@1?hP^IH-C)Bh>QJBLLS7>2&XnwaxmA+8$MyU@P z;h&oi!`;bBRVEt;o;}Uq0?>FYF7;h&7t@K}RBYNlcYBXiw~M)qOo5`WQoTaBkZ$Os z>R!?d;DY0Yf!9?S!~I7TmEb##D$Y2=-#h0Ry(qVIPR zc4O*?H<#)?Q-pFL(6XfAGDLu+&#Vn#eeU&vQit|G z02Md_MABRc!8iPV|7fKBA03$MpCJyxaBCS6wcC|*%ebNH>iD8x1JeQ4f-U#7c{I## z(9ZSry&Xt-OfeDwsy17dN?*v3#E#}u#cht{jdut4qIW;xF5g zK`;_nnl$tPB^yXN7;*_3A85O;?I;*~=q+P(K0Ljv-B|HglAXc{F7YxMfA@{<*gQF_doyx z+l`FfMR1x<`Tgf#7VbXo)+!Zb!7!ShDrl z@ECT-FEr&Tb=r4|s74s2;ZU8cF~q8WI7hVL8rG$n$iO&R{zS5X7?Z3)!Eg7tLjT#? zzBZ>h<6JCGJF;pZxxMVbku%o3GI|^tJS)DVW1Ed@_Tn#^d6wE^u)e9mj}8$^oV|1V@_at^g3tPu!85j9~ImhuYOn_ zr+#M=9d7N#nrVN%<5+0%4~@Cp(su6ea&R1`WT&Udb;(oB1%-Hf+8@BcCeedLXU@5s ze`{6rU=t0L#gYK_X`XkUnN_)LZNah)iY&C(60()$Cjwks%QlXmH(URnLcV)rI$=Ie z>PbwfM7HL95<<>pmUTV4@WL72Uf~14%aojrm)xe)wE^;wb7#%9Z90IYjs#|481Iux z>EGou(Fb&arE^o!j6CSu5ThK18@_KtQ&z+7DMhqti!uPNN@=z>`BJhHYBDs^&xJGv za+gcrfh8Z#=>u)R{}sFskof)Qx+czcPt^PP=k+kA`lt^q+5^ICOEO@*hC*A^^5eGpjS>LXmAhnMw<{yALI8$qiMK-J09eh&#pP zdv3apT(ia_2X$D@tR=_l#^6z|2oFO1#)~%N#`|{*>(A2E>>ReKiO2J+J{~vvhvf?P z#P?}rbB(jaF7(3TV_5u&<~6y20gkzG5Ye4D*T?b=phAw^A~>GDk0&6hH!90nKg?@5 z{9h~p;w|?P?nkPWfWuwLP~JN61#enzl6nw7{;jWI@Ydn#)P*2AMXXYf==t98l+pd| z2uP6i(-Q4w(LCjTjwGZ$jT&BZuv^AeleyYex%Eg307RV#ojMh;otX*BN0V)yfoqW5 z4W1?)(gK)NDA-L)Vzs+~g$Wwh}Atq#1ymN2F}%P@1N(3Cp|CI#sNiYoM9$-`x=E#g^NV1SLh5VoX`c zGhNG}DxahTOt7dA5nR#Ov|rc3L3@=gF+s0e2{;s9fvk(}YKd_SgHfuvOlFhyXWWff zM&fOsZVjM1PvHTD48QVtj-1obti`f0T@6S{J&DGxt*P9NsRchjoIk|NysJ3vlZBDq zaxds68s5v~F*Gq2becp}RF)iUxrPIrVNH!;Zm%NP;?@q9BsRrMlDTty;R!FqX52+` zzNz`YrwHQ(=P8$5_zUMsCQu2-i~oS_K#hXs4Ev&i{f-I>tGy&w9(>rJLSC@Uzw3GZ zmpbY{tjijkpV(2knQlt_f-gES8wdSHl=P~idlkb2`=rN59g7ak*y%n`V;ZI)WB(OG z)r2ZhViKX=^Rs^@Q%bXgQZI%ZiPv#`6?*?bmQOyaty^dlW`mA7pEwRO?vRcDbq1j1 z{4@tBEED?R359$jTVAyHE1dhdLXv|6VB?7{ib;;p+w&Hd?XJpC_@}eL-@Yva+-V8X zVUPkzTSCXUh}5t9N|e8#kf2hZL_$k#ke=Pp$iP%rCvC3rUj^1&tD|y(y-2pT@S?NX zEKWxsy%Mog5xwqY^4(hVo$|ZVN~?s|NVjIS6?|5^;-j?;W0V$dJ_dre5^Q5c0i&v;Y3=f5|GM ze?7sPNgo7g5_&2#fJxt9K$xNj=C8;7j3D&KMbsW$)R2#23Fk7DRJwdo9i3NiBsZ;9 z9JNbfeza&z`3N5SH2tBqlc5x{h<5yhti2AH?<|)y_}<>?-28<`sxlo2jB2az0xz9W z^m~#prK!44Fn?joR@xQym7}|NmzjvKcYlSw+=xJQ0-2I?`m`xV$D#$~8_)w96D4 zGXL^DnmmTpsgne*s{R&4`7YJeL%b}#xzDr8rO$|U*|{#E&xJhYpT>`!t1rxYp-q<7 zo8Q)2TS&&)@Z%WglFG2uo1s^rJ(lT)hC;SxRX|PF_xthfMUN?R!W5Dai-GP1dX@3U zu%*l68lGqBY7HP)64srdP-A=V#L-T>Z#tlfXh;_UXOhYDkj^`@D%Xj2o?S;)@$9J2 zp*OmI5ry%yhlWF*(i-!9%kyh)&2`t0UQoSY?qsr1Aw}jKF_KQN$$6Vw<1Kai1K*uN z@$<;qQ6TaMDr#z~qq@}N`{9LJ_pPS8qbRTXSrhZi>f=75hh;wVp&25Mq1XD?hlz14 z&4-~8v;4#i!*!HLd#@cZc%PFZ)8W!GG0E-aMi4+&eQaGEH$<VWzGSJ2H$7*Mq6? zWwBQu7-lcG3M>oMQ0H$lN^W~k8*gluP(06P8|+_U8OHS22^M02T<&W=Tl5rIm#%8|C)wMeE*Z@q&R;0z9BL}ym9{WlsNmp*EgJqkHq(18P&G=c%2Ogry*p{0d zJ;ph_(dt!>=3}%Y3&mnBR3)*Xh@qReyVpMh3lp=o-!H8GqmnEC zJ1qd4e#T1|+g^?)&57Q&eR`04egfH|EzmwlQuyvb<@Wx3m`Up+&h7@A zhI~64O;WmOrsjBobi#>mGw{)T3B5kmDYD>i0!P#IW}zDCO|zE0dwf<8j^Wb2*HRT? z-!rb-vh9Je6>H35Q}xuEGP5sVqN7BY-dNV@Ia$r_eXmspgx(*s14O5xlE`czI1t zscs97=+^#d6``RoiTRw~Vv*JelaD*mBs;wCu2j+Th6`em@kb8{o)^&mema^lhGheT z?3$@@z-32myIMZ4+g+N9W$(Ki?~6g;p#V?o`v_qXvihRokQeCJ=ZjIk@dG}1{UslK zwif}?vJ(QbYn+w+EX;H0k_4Vb7rAxS2}2{s%q)21~V`-;eEdqE@VuPiH`lgJ#vC?w?wb2{Piff zy|K)CfU_zavpIwW`*h#gbp_qhLW^j-KlgM>7!O_TYvnugz9{KmojonZj)aiwLPMyG za|kX9%W@VY6n8p1oxJk2nc?JDv1Bh>*`5a81pE!0ywmvY1lvY$f#gSQ;bI73f~)MF zQXQdMAcTno8jsWY(P#Y|6FDdVhi^C$2hKL;xzh{B|A9NeOdTWX`6!+&*oO-KTVxU( z$sR2Few#@Ta~hRN=cEi%CF9ss+9J$YWV?LUV=HRYvjo5-MJnLvJbWyCM>4G5lQbSdEpDH>ybr>F8!{0(F0pBXH{7bW?JRoPW*FLG))yP2dXIq=aAu&!9kw)~aM zDR^n(CeOO&qUg35{(0N3wP-ruf(i z08jt0$#hvGQEY`yPjP}}*7EeDaGd={_jn=C6MKp#&S z7u;m}ZQ?$*F;HG2d7CAvtCLW{8r&#F-DPqpf*?#F zDAYT&)!pxCqw=A&0lx$HD0c%Hq}zS(#zeqgugMy^Rmlp@5e(g~+&}=ojlHa=f{nM{ zg>Fo_gmhkw{2An2BH*d`PsFx9{~pt!g=1St>{+1 zK)>8;VT}XMA?4`LU81>*6|G%&Y^lb&PrPEPBiDpf?H6kPm>}fh^6p)$J}2G6JWn#0 zvt}bS?Y54?MX1YF2)o07W81$*i#xY`vo@ap4ZBgJ%VI2wJTvj$AIG;?5KM z>!kF<(V-lwCr3^)`Xb$5@NAa+#H8uA-Olxq2||f(n4sqU+w(zfhTp@n9RErHU`g(7r_qe7 zsq6Me(cidir?m2MpN!YL+t;m!&ufx<4VbUIqB)q7?tZu#Hr@e%rP)=s^O{RA;akFl zbjV2tdi-N(GMh1ECHQLD2SyVlHHJBk&!iruejkMa>9n_tsgEhTCM^JkUi7WYdFeIyDDXX}APA8h62#*8^$^9%jzB1OZ) z_0Z;$mEN%(I>AX?s$+RAXB`;WxyIE?a6GfH0r&=`4x=AasrB)(8*KTA zu$i8Ln4gyo#208nf3Hs???wK^^|7wuQi73!q2FKX^%KKQ1QRLqk((s7h#gbZI z6P)TgXIgpWm9)@Ty6uM4UZ@vOPD{&x*1S%HzKs5-w@J12Ea3ga$^Mq%?NjuPi3iwn zx9ghmcOoL%nZ^wz_#gXcZ5S3nFhMYhO$qLz$NuupSwG9BUuXEm0LQRK!m`g3%1)wn zQ4UaAC7@mC!*F)IXEG&)R8QnHGv5cHe2s^Z34EQ)#bl|AApd@$G-sJ>fa;<8?P`c> z<+a8YE-eeo_9B!1*z%Kbte(g22an@M_rlLGlB?gcN6dN+fkpL4TEBh-7dPF8(gfh) zNK&w^Ih+c3T+n*#{mI<{AbG*8Kg(OuNNybsDDQv*GaFAq5Xl-1L?iDx+%*_X;r%J< zqa6EE-aLRai!vL!kFjgo{aAOs_RFF(H0Fi(NBLwan8+iquG{Rp;w0`FL zXqpoDw{ttA-I|UWvLt2N*H#*XZ9cA8bmE-2(es;22eH}WU z>Da;*7Kzq75ZtBs5~Q&wAW?ds82=0df*mnUg~!T%axPqOY2_280gXtd80Z?K4k73_ zrllOeXGDK=ph5J&H8-n_6+2^HCSaS@9}G=4I{V-z0<`u10L}C+);}_VXMD-b7#ko1sL)cE-8AO`U{1Z^?_gAfN(FYVLLTNJGbCW-R?*Vj>J zCjODQoVL)H?sL-aFEiopN4ZJk} zp+py-I(Vmei~p0tDJ;^6n|iO7QnWTI?bRl3w@EAy2t1RVi@jr|0?LaFh#v z`!Kpe45zd=(|f~qc1Asm(Uw=;Rlcxi-b9SRKplA-$dNX1_dGEO#fa6Y)FLq&C{7wS z$w3=@5wqO%dvvveI1a4m*(Wb7J{BWsBa%ZRaof(#nvh<$mdB7c%Y&n?L|Nz4aMP$Q zguf7Sq-W?SK4$SE4Gsi{mYY5r{kH6hXcbgCXH{qrlmgD9$?;Er@(QxBcwV7#u+$&0 zr`A9c$-k{2d93~Hws=6Go2jO!xGg2n*o5v}uY<>H2=ueG?dxNfAk*Z~LE6vTv;W>W zn%8+o;}JeL{b>+N2=Za|viC%}xkA1UfsTV;Pd2kB_mubDvHj>8d7b<5P)?WCJ%^3( zz-ga$3rVDlDd+cv}81rdB4SGtz?Qd z%Xo}{a{Y>cL5sAm?Rx5whE!Y|x`iS*Dw1)Y-sd=Ud+8cUsQMe)w~9ZTqUO%j3ADszJ`C#BSCHYAD}SdIcuU9Sqi-g2(zR1q#}GLpfn+%kmpam|e7a z#-jB(`?w?~k^E>xQL5yoIxwdYrI!%9$_KWyp0&ylASii1>v6mu!3@^%v4M23cUw)r zddNea1P(>RUPAtY(_21?&p=bfMy^s{$P>!?reKVupBv0ZHJYKFJ!7o_7w-|s`orAw z4LU|yuEVY*AQhHp%UT|8GJ0RaBF9+5gcCA~JN6{$_9Jo4HO$PFVV)1P5Fwe4o)JGS zRV~VYd(hKS@Y>*`wS|CXd7G@er z37md)|8{wIta4%B_Yvh=5#unwgZ6ywvK50XFPqa-siFVB(@ZSu1GIHW^}~Wq`JhIl zj+}->(V|aSIp{*b-4zJ0vI*5fmETS9}jNv(xHv| zB?d?_(QnI%DvVC6dp{=ixeg`sdDr-%1oUnJ2mjlndV{g9tLWCj0?qP20GQl6gju)l z_UhJ5KQ+WCvLC%3mcz63O?Rkhlv8%a);o@?uyQ;xtn_oCSYJ8LTspR7PFmOGM7Stl_J_e)JcoIV-4e zNpw>*Z3zo?#OvM+G?jz80Q!@4Wl>-9ZzHJdM|9e+2(5=XqL^u8INQUYq+TIdFV*xK;s&4Q-R- zI5G!_h4$}vtgSPH`mKO$jF`krciy7Men#T-=cV!3!1s|s^K-r6$?3|UInCDBp=E)~ zyW1|7ySL+~d)C%3rxW}BHWxSLXkWTK?0!RVr8u16xmn{q?KO07YTjv{PycC_jp>b| z68mwTFl!Pex3NT8(n0;pjrT1H9`ksv+;p+Bp3nWN4}0l&y}JGKak^;0!*};}AcCy0 zd(K)K)_d!Ac;KwZN&kz01>f29mTwYKIjx7s5~u6NhuE9^MdJtV&5Sv2x*Ni&TXdTr z?IN+4{g<~TNie4q=zVL=1>o^ZcgKCReDw!qzvAVsmxW6i53fl{2F_XZ8fd9r#Cr!M zaocJk4>merSUf*!+Ly0gOq5Ib;GCF4pi6x|J#*!mEc>GPL@8gdkA6-O@%LRBu~HgG zz&nYZf)}e+(L2_&vt{_fJu*!-o&1W#vc=P96OU@YjR}jj}6pgaWKq`3ei;`vyB7_LAzs`jzMFuOS1S=)T;9S2W-~cD<&-S)D z#>KLNC&|H`rmD+|H2Hjyc5LhZ?3BqraZecJf8fsdOD<)y(HlTRIa(}YHq>Ul^#ceK z5WtBwW9Tn`EGcNBv@O}V!<_N-sv!SQEWdhaU0XxWHC>0bO>m8sDZAdf$Hr+!uXRX$ z1#~~MH5j4sZu{JjXxg%voNd{#lfogwqXSV2-lI4t?)KAF76vn-t3GHCo}%AV6SCP) zSP7dDDYl>9HFPy-^qaoZTR)@JPnQ;2yVcCSVWoz(+#!;yCl_df1plstlU^Y8=nRt<0n2hUs}R+mXh*?0GN+D0aJ2nI{2f{hQnz7YaP9!3-F*dF{DV`H)HQ z479kFO$Q6DIn*Cymz?7&`f1qM5-aJa=Ub+A7P9Wgh%5Z67ryrU%?EYfNA{e_l7cff z_RUDD{AfLciiZpj)fPk^ciG_;tC6=dzu3s7xi&2H`mT7&R)kfioLm&gml3$G9;?O( zOSZ7VW$+xbv5)$(SmHvZY^BnyP|^aY zcIm6*vZTv!pm*q?H8$wtyv?ij6{``M_U_86M|5U$lBJLlcVK_z zBgOL-T=SEl0DU2kam1WGBfB7upXYnL7CEIqJH|j)Uv?QE%uHG-2-fo~;a-SQ*OxO- zb>uh9zGCYR&q^paD;1oq|Ev;szIe54`jo#*akcctcu4pc8Wyp5`wy%yWFt5K+9g_8 z$b{u&>?Q#{XUy7F(A&#H2IB(5S@)i#w?jL!yd5`r}kl35Rz2k1FKFoe_ z+MO2BZQuM5D;FU*m6bIO9KGB4>%nPPrPF%f$J%j(#DmG5Xcr;dx^KMS!N`IZbCT@n z>$IME^{4zDo(^;IifFir6#&^Nqa5`EksWw8B#nJ#ou8okmo6ri`A4u+{sU zF{F@)H8hgXI#|%k1KNh5BBIE#njUaiB`p<@`XgQk))v^DR6A$C0;Vw2e0&@?xC5EhIl+DdlZAM-w>` zl3Lt>1Crh-;h!qD)Yxpj*H-6i4k7T_O+WTnCUDq#C0Do-6g$-y*D8R9#O9{OZ0uVL z_OY)Kug)3&l+&IP@9;JAU%?#)>f>DTATf=G?&rAp5ws5(&+J9t5MWQwv5w8;zygHz zvrYTq4v>>lS51z;lA8S>X|~L8E{fuehHIP)^b4ku?T}a;O=A-Sk}e@W5mS8_Yh=CC zjdE+%AMe{&bMZL}FTeiCjl%wF4S=+1TmS~wSdAl#a_}YD&d*$6_+&9AA=R`$c0BFT zh1Bcm;i}>Z34Mf1U0;l%;YoN^ho~k9lVEH$7)Cj6qo`WP>yBh;p~CR}xRFQKb#l_k z8)F&Y49dOi>6}LXF8KTQzisx_^RY-SpvT29_)c9%8t6Wi^gOP%<7CpQt!3qzI@t$1;43y}P1lIXe&t=h?BgP!RflxptZ3XLj1b zp+l!oMdNH`sB1)O_!NMSlas(#X^3(d8i_VPU&0K3ZvgoOU^jpDxu_u&}c3 z`QwMA2^r2m4yETG2}KeZ3%%S|(v6&p&0)uP$(d3F>y}~ref;#PR8N@4;2p!ZVv?r5 z%HzV%GGmnduZFOtg9T1eG_7yZRi3n~YWb61Rhij~-0;1%D)3T@Cu@sC_5Lel8R2xd zI5nnp?(*i0%!FnBn-!mB@f*c?XBDj}FJ~>ax!$B9UvnA?&z^-r{=iS^b#W7n*;URT z6?-pOl08qF9Wp&FcKG9C5i|Z@qut?XsWnPNz33F|?&a82z)_`bE=INV+Wc?)8P#Nw z26g?~)a9cD#B?5?Pr7^*Ofm{24$?F!o^QOaThYC}+Ez^Ht_<;6G!L3N>{(|tI|N=5 zK+HUf8qVnVrV5jGJDc@~@|U{rAis@B zI1%Q>&5z(QgE$?h7fIsZh3SOeA#JY#-O-fuR9a)8*X70B{?ez6R!t|o$qh83q36fP zaS+>D%dz^C@ZhMemW%b*C7*t|E6|`U{xaNT6C}>|*Yfri9?e2$$Tg?8JFao1&5_q4zwTmYXyh)RVFws$*$?SaI z`l6YE^SCLGEPG@i@%-zrfV7}4vD6?Nx2z^?Jju`>YWwMil|`Xx?nnUjD|vWJ*Cw%# z<134Q__x5?z^;`A^RS@OKM<+za7`-MxA2DEY;R@D|kXmb^6$5 zd7ew}t3G>-0jHUeI-1~?x}Z;FELK`e5Y|mLoU8bY_nU){Y4LJD5*$v7k5sbOxW3D_ ztSFJQ_*$#Z53kB4M2rx;=!F|`2T#3mAM-pPe4a{MoMT(P2xjfQ+s=IB&{-;?c-weLo`V&r!@LekXLB0;JD+ zW4vYq@uNGOzrjZsg)jZKwqk5rk{iOO|$*z6i6aOe$PKIMJ4 zsq+=^ks$LJt7t`c?6%~0eb}_^D=x13?SzBv=SuFUnKt@+h-CEOv0lm2TPQ{W@W#rR zI7ke!H_|h*-l~xa zE8{H)wBC*OKm*dbE0T|)zN{ej5xEoV5vaC^-Ej&N>=mqr>vvgOX-JDW)=)qJ8K>$; z3w}ATq`AQ-;kSO@T`&snFkF&v=mrm~Nq}L7WHeQw7CeseyjU7trqmbh1}CvSDAux+ z8?zTA?}I2FINQ&BUkHccRb+0U%K<`Ekbe6xfvzWR<5?d=*idI)WH&cIHh~{-31j7T z556Ce3!%386p`XTJzk6})P@dquD{mU#-&|B@njj#R=s>4a~mK{B7pL(&*gKqamkl)^q2|?Vfk_mw@O(NFtnkPgCmaoS%MF&JixT(Tc3EJfK@yWmfby6Q9ae4ZD&%Oc;_54KD4F}85P|goY~WM6AA9G z4QTxS{oo;=s95ai^==skkIOkKwHy6k#tz~-<7@0>%wLELznWV!X+UFauMlti1R5$6 zbHPB^^gY`l?Y%%QKa}jz=>Z*FFl|m=+6uU4OFvv@yOlR(VLLZX5xJ@df6D*-OyEmD zfkL)v3QyMknVV|W3XOtr9+~4akh`bF70(zE-ly9-uegR!;X9fM7{qQ9lT)0B{zGnz z00IiaG!P*M!_Ec0KqTcB21O)kyQDv1p3^!q}L3cCx92P>iqho^8WMR!z#ZMv~PjI z)L~BDr+KTkg|%VyFeVE8%bCPJf=Aix$)9fE=|rPCDF1UO-%s<*7003Tk~m!@K?3Vh|%eOkBG*b3C1KL+s1vqS7t8OiA>BCIL&biUZiV?3M@n|N6ooFwN9yKHg zo!R=5!b40(z#u7YI%}v+PoebVfzpD=gOs<=^#Ng2U3I97)h+@0BI&Q{-yBP%y>$<7 zh{g+Gr&uaO*kotEv&Qttd|M^_I%wR8tUIWv2y-ZKh zWb!6cGpcz7&~5JRnZ@Y_)Lr7GOzsem$7T_k>8e6SX(;}_ZvX1$LTnso4 znuVNV#%v-%5*Z)O{81Bs22i5sTRP>2Cd7-bmnI{A0&ni0nsBU9C2>iG{v9a@E^ifo z7Lt7%5T8i(=}>M+D0WP7Jd2ljJmFE66CV!ecfW;jJB?@PZCe91%wd_?h^$gCCpen^k8g{kGK>S=C&3jhG z2AlJrY8ae_7M}-%fKA>mPg@V~FaoRfY~I-*1jJLBoDLngF0i{h(JGjx9FzURhW^zm zmslY`6;aXkhw_Qqp$`89g4ZaPa8Z4Z_uF9_A+Puq@`ou4Ns2LsIm0lv@So+yj_1v}Q6H{Vv(|-DXr0Ub<8jWUp=SP+Mplk7lc%+4>sIOdkrozK~;ueou1_ zDt&gT1!Lc^3Ivv#FdS(p*&0FHT-Vcs2A})mkx7=jUm*L7q25lX%s@WgR%Da^Jz2_s zf`XIK@27vM;+8C^_8@T}B}W9<2W(WxYX}l$t!?fVgR<)6deJ)^dH0@~Y%ZzE)8*_c z1ZwQIggu;7GuyJEBg2&$^srg}k3f0pFAJ_ga2l0!R-D!JTVvRzIDDflv*@CMe0T`o6+DbI;>k|05C~L{>m&aw^|XA8Gzw z%kDo&DWQD(CL<^H;~(ffYI=ayZJW8$aPa=$Db%=?C@^7YtjwLm?X~-xAC}2QWRjql zqo)PUiZ7#Sp3_T&s%Q|btCC4(6KsZ(_u%Za|9dtphqX>0fq{H8n)z{kH~NE zV+l+a9!*V9N{Z;%)#&Za#hqtT)*DSb46Ii2Fh71V`Y>wBCnwFW_U|oyN!QMeUX9L; zQOyt^kb$oU%7Y*7{`<>=GVQB~Kqrg*Aw#;u3F}}Uc39VMqWrMDX-iMoYuDp4dkodX zrDvLD=Ord7@DU+keKfHOiJqO(*|b~h=vbTg6tVPsYcLLN&Kx=D?Cn`Hho#%Wof2tw@cY+Kq@^!u4>fE4!&`}0QFU-(-rR1SW&PZH=B6LXERL@iDKI!B^t zvY6LsL4RkFgv7ubKECeF?Yk_wD_0hbk;!nG^~GVKNk*+Ewa;euQ}fw#ao9}_Kzj0b zp+Qb)nxjS~NBtB#&@pPm82P?q6ZjsbGDkDR^+C^9q03S{CU7@V!--Y>x9<|h+tnnw zX^va|PXhdx<$*8#|K`L0{OGUkhlC-&GnzW{Old!K7ud8gXS7sNt3AWMt%^6a8nup4 zNl2~hQq7-)i^WxV7ST)rt@x(4s} z7aTC3;$M0}#&7Ol#ws{ej8^;G`x_3oy~*1`4j+Y8LQ*-{ei}(E!vrGXo1Wa5JLAAn zvbA-<=^&cG%q-9OPZs7Rm+y@jNez|Qk$O&%?E?Q)i3NeMh5sFHPPhP7OpWsp_a^ImvgklRM*L0c zdGld)LAUn@tH3J{GTyv>MmO(sQmQz8h1n?L&OL^+KL3dFbp`#>Zkw>O$+s4H}*hkNYVLX_lArWX6;q*UZpcBhT zJSXo_rheQz!@jj^6frkaYWqQ_La%>YCe9K$Q9y&?=al#^P^sYRvDpRStB`!qLFa82 z7*3r2@DZ^Vm0-v3e-t;Rt-~|CU_m{S1Rzf^E3_Aeeugh9-oT9$XN!s5RnK>=xDl0g z`SSwNXpbdaH)GjVimyxO$3#OtZD)|oiB@$ctyCz0f#|>r+sbF9tG@a%ban%B%_3z{ze-9fS} zFX@Eto?l1$f7e;>T+jRSE1FwdU$H?dE}d+%h$6D7_bsr8WOLX9)qhvJBww^xIZ7dD zs0xC|S|X`sCMWn=n=;Mix<3v*@lUtJBL2cx)m|DW)7TgHaT^NH8LS+)TsNDAp$RO! zIU8rXvLT@sQz?xUr&$v?9~Lq~XFmv9-ibK{0gK-$<%@NJlAw?eHmZHVTWrM?M%@h9 zUJ-;&(ZaFJH9vwUP6{#!Vp|lqc+^BA*oAjgC2$i_%+`UFq!)Me6OzRDR;E(Ht347j*;4@uY=cR-g(}& zgl!joV3%)r^O)^4lI@RrJANqSv^U}_E}7wts6DwpuV^Kmq$?>d-rL(T%wpPbLrO!n?* z7$=+}7Zn1je4dOw$K_=(CV&3|E4r;XQ>VFf7!t!d_xrj&Js!%v`AJ|pMT}$7 zZge=sYnUvXfbr(KR_yL7V zM&7o}a1Qtmzs2u!J{-#f*)#wUNvq&kP(P-=doMoYfE|_8?InSgJHMbK@wjD=6PbCd zu;JZS1yF&&vX6SU@JZ=pVH{V}{cQ?X^W}8?)0;z-qSC@l0&zs#*Wc%$;`PsH4)~6{ zFB3$@w3Z)MO%hO-_QERKvg%i!LcadqhQEVe+$&d9e#(Wkbg3LnZ73*$eUik}TvyB( z%P|8l?sKlgK+ZisdMBp^mYCtl#OzA*I~#*Dyg!v^dJ+33tB`@AWgILb zZinw8A2-zYr>amNL|u~m@+f9VG@sZ-o~Ukzw^JsRmPrtc4QCfOJW6i+e_K*2oY+3s zrGlVv^5}Z)?0fs}z?}&{AMf4Vn$cMI$3IONP0q)%u>~qw$`viqq^t&}d-|V~TqhFG zJI5O=P?2LZ zYe<5E=&GN%d?Wnr0=&`wzuE6UT~uKd#IA1tPn@T0;(VP6BS|wCnMy~w@edBCAm<}( zWkJ;qe1H%^$=~?n$)c9Er_0@hPc@d|x&X!88!daw2^=ze*`I%m8!Wg!X4svbTNb49R>r9t>dO_~{$IJ(8wSK;_1I)WM>~ zrExmz)H{|f7iPAOfy!3DVjpk%Ay_$HzNyZZhb8g+h>(*I>s*hDrsrI*eIZ{0cTv}i zLzMiqZjX#uB>5LY9>eT{XMM~O?c~or_A3iu_7rb40cbczh*=H$kAzY=8uz<4^&N`s z(KpJ!G<)%nim=iYM=uX1gFVhNEk8k%#^kBIkXnGKh1rk45_Z_soC?^INu69%6TE_W zoaCtQZj82OuE70H-uP<9(no2E*tM}uS1Mxm0i!DIw*q&59C~dBI!yVWJKa5fX5&8S z-+9D)x3_TOo4I4?k)+g66MC=xAx{63Uw@pY0!V7*;Y8tfRODnlz3Es*$I!9$rX%w? zgB_>l`C*%3btm9D!}0fc@47%D!DZ*!9kx^J=SvbPU;mI?&nKbJjp=1q2WUbx+2lte z7r41aX-VqmV7S@9_jl0TFPha{AzHm@BOlL?rS9(47*v)KtMt+6OO4KF0R*6ibQRDl zy8FQx>Q$^9t)Z8g|J7gX$T*Qj{smKd;p?Hv!p27Vi-@DT$MD_PQ6gh+V)}CgTe?Q6 zR!V2vGVXnch`T0zAL23N4&>Ak$H70m)HI16&MMbhuLG_Zf@x7>g;E31f5Rs?nJxw> z?Isu~ze+weUox!R&FFsxp87OL1!C9SL71+K2pjv_^r$os4Yu8@6@(XtR%IoAD4vr@|Al zLE#$#WQr@X+OGFwPN@(%eLe%myQ@7m zmk)yxZ@uZXmgR!RuITaZb~M>Ol3%G>do+u=#jX5dvv}ac3&v}Q#iVE zo|xrbmGDKo1eJ2wFIKZy+Q@NA4pBMGLopTY3pylihc7y~RN5mC>6kVvK2I_$n}o~s ztcM?VC>MO+=lLsA;jRkr5cc6BPYWUY^53MreBY$i9HO$^T>=4XrK^H*ZU|vUvy|x< z&!AcM!NY*%aJ+~oW7uk7+i^h5Z`)VUflX z`OEN>3{+W`ui2d3;?LC?dVZ!ZA$^Ct5CHPHw-k!pb^@C{0nyfvRu$3J4DuLzyqNy} zH1N!+8FK~`E?MKMyXMg zL$b~4$8)DNYzcxGOob>Ld3_hc00G%_u$+ zcu2MkUU)=Hj<(bHn+>)KVj6uirfY4-ZXh~hv>>^f?l{>(Fcg6z2Q+W)6JnZy3) zJKdKvE!H}n#}s{jA8fq^B>*Hi3J+!PT<_Kk0(WJfe-wnqsV04X`9IFvY~;vb?FeLo zX_3wZPv`b*gRc-Ny?6A@-4e`84Q@_5qu1Ii(TQ8SRgUNc>A2ZUllhu#DQ2B$c#8=s zwy$PSk+6qyji-eMN*N)mMAxXdmn7$OJ84j6+W}&>?Pp#i4S#;AQ7kpNkhB41coYuW z#7>ti7{^^CD5%kP00}TmD;N&}oaHl$+~~v|K|R0sCR+jh8B(SFCxAnhRaPa_sFIKY zf6{^GY_-hQutqUAOXTa0`eri!AyNws3YDS zz06n5Si4K>X3)|)f^|hCeRA5qxo=Y6p00+v0J#1nuIa$nxRPF z(y+ka#C>;ZN%b+m{L%SNl$TzOX>}{|n=}lNRim%v-`x0u%qUfgI?R|y-$dORm#T_) zv}A4INI*xo#q5E-e)j=3CoUJ|lYJPHL#Mg*yvs6lU+Zad&xT>U*lX#M&NJ@t-!yX!-_7w3uLh@jm4ci))2=&&WEHQ1t)wWK7M zys>6hY73Icu>G4M>uJk#y@2{AhRD&BFQ77vr{Ws3%3BZ%So7K;|AQ^x%`aOG9`!G? z;bS+=$a6InW#hc!o}uT+poAJuUHo0AVx`R?=E$C%&o5p`mKQp)sv!KFZ0xUo)`{4T zyW4Y1RQO?TeE1|K^XRyCG1AVSCNenS{D-_wC$c}uX3?+J+p^QQ?N=seMo>q8VZ-)_ zq2$5YX2o7*HP!aZNtZ#LQlnU9;(I4MXTd})$MQ?s%-<-@xg)6>O-k)Mt7eI09ps9R z{4dT+PwU3jx`LWVtqo3wuc&u={Z8)dR;F-t4Oe?aGV_YaGRrUt_DSj-;8;6fr)B%; z#bq$hBtacg8Cd6)gw^*Q5#2y0yUS8m7Gevi;3gqBCu5E32KjvV(&`a@W&rq(Wly5| zUioZ0%qP-zeD9Ow4+}~|cEBg@Y4LEqZut=RE6lRsN%gkhm#h_G7L*L@6!PBwYP{=z zhj&+&T7~}b-Xw&YOZgWD!|Yc|&x%8po+SQXpWWy)E(PRVhmGog?u~({eGj9zS==&E zklAQf%NiPfBECXR7cx?3Gcz`*l$NeaoVK#(eg0_n;$*)lle{1)BirS<&{&}>8GBTy zd!TE{JOdtX_r(uf737aIn}z)1l*??ateI85cM_d{-vgZ0uhOzvXMl6(#Xv68`xO^g zWL1nTJYfm)0&{j8~%w?5UeSdx|S1EH-=6nRyS4t&yt%P z1(66b-jIz^5R(eP#GRP&B<6LWA?B6d;N0E}NY7N1li3*(X!@g+vfoGd!4;onY1EXM zLNFL(hkJGPNMHp|J78aTk1_9FL3yywb|Dg9z+9~p=0X}IZuTxj0UlJSvvj-tvzBysu6 z38U9_K%&+{#4uV%>R7nWV|;p}#LKxKc!wbXGnUN4`BzUTxL@NV@0!fXP@;#p3^QLv zk)Qe9vR_?>S(v%3GRLYEu^2Sq#jt(R7SI?}QGZDvQ7Jk>%$xZM9x|A>N%WRV4I{{w zm^CzJiNke$eatRZ44Js7#q(;2{T0WHp}fwaIY5aZIu8Wkz9NY|D#l3eaS>;Xoij9h zYyvA=UQ} zlrumG@x6BIPqOL^83MgqGQs!j3tiKdza_-ze(=1B8OVtO8x4?<7Y-|djH`Z3=)C3` zK8?jY0WO){a>Q6l#NmkbsBr6UtZO9~*JV+YKERz`UT2f^fBdcIwYP`9oUNKw1&;c- zFxq@@eJAv4y0yerL=7~Zy(|*n_PC23H*NPYA)>4ZTR&Jo=@eSu{?H|FE zWYRto-243zIwVdrHA$@lKU+OL`!|;#x&!1Y+Ai52T(7e(?oF;IC(H)FpTwd|&TF!m z<=m?y%qW&Tn}kg%x%Uon*u&xS94%KgT(++Nr1offe4=wP6B>8f5tA|GZ!#aIQ&#Pr zFT>ee_l0jUX?DZ?HA=simX&SPFifq@3*)=le#T0?w>ei4Zr+}*;hVckK`49$$`SEQ zOF$Q7`xx5uuq=Kh-gr7{F-GrI{>&MrFT@ld@ob0f@EY+8oK;r8`0des&R!hNOR%>- zwYa#rTR&CQ(>J5%J53k2Cs9GBwT) z@u(o?1_(Uty9f0p{r&#qXBje&ok>Y>3ikr8FQ91LEG8c8bu`(<&k6<{Bs3jo1%{DL zZq2T!>|}Tgi#@E0Ne8g!o)>MjBm969f3!+6&8WrrPu~Ys3Pdjv@BX_(4+f8`?q84u zxBPJYjq)Tqqk-@CX~2LI&s-zG^pZ5rZF~3eZ>gxsbWriOGz^jzO0J;ARqzy6r=!lf zr(sO>?OMq&WaIM1VrSs$Aa_umGg5yKYH4=ebVlX z+>~jkLN(`K2vP4fo*jM;@*3ZnPUVEZ6~2!OfQ+L0aX(sFZbLNomfw>+q)QL|fxGSf= zERb*vJtgvZ%==|x_IG1cT%E@EDsZzvRW4Aa`rT{GM_5s5Zu7n9U}_S6=n_|AGd6*{ zwZ{|*G(*G}Bm!U%68kxAI#8FO@rDdnA?J)^@s>WP&uOOnv4GC*0-R#k@}< z&qwnY<5xLlz1Mj44@xJe^FDyfVjq3+>O4CDEvc(fb{_ujmT3-IcB)m&Vt=BA>|HE^+2PY@%V~y9A|F!P_TX8^s zV7(}gsL{(pL07Jb@K?QSHd+gPYnY6YH$V&Jy~H>(HqsU$DNrzR!el7(#|*%$5PsJ) z>&yrtbXaVEtL-cQ+w>&oe*LonMSo|*H9j&WayQQ^A8s3iztP=JN#< zyxWe3mnzrA?6AfcoA1s6xg)lWQpoT6UcRk4j^ivZz1J}neHDCa4vxE5WQ&ZV+#=&z z1v$(kG~;?6%&VPpVzy+s$u)b3b?se%YmJkLdwY}isow$hORB@V!xw3rzi_jQo5`p3 z{*+CGY{U8&+-hSBux$@9FIK$`!qMQ>(zn2{S1Y|OL$U>7VZGyHK_%zKesWY5Qln${ zX#8r$WbYPeV8i)s_6r1BX2~Z+^?mf}@^8sk&%`#PPaU&|`c*)C7jRRlM75^h2U7ga zDXftW+^;^pyk4e@Vh70gx2-Zy)FLq32ZQs%rJ4Er!RoGeV^%9BcTE0|?cX|Mgz8G4 z4dw_lXFsQxb36DSBGQtSAEV_EvXOTXdI?0M^rz!KHJ^JPgDXn*GG7iv%F8_>pULSB z16v4NOOu457t{l!b@L7S%{S7QFOWmQ6|0mS&2(Zi|{P4N_wN3*)RL^8Dx^Pve*PR7$8L@cfJ`=x=C=)e@%@6Qpn(Eu&mbQ`#HT+vy)#R z#$hQN0l=iskx#RjFm1pAdoiY>#Zc8ZHgzXSwGaLyM%$=W$nhxdc!BX95fv_^72ddcf(HT9-LBfv&2<~>87swv;Zvs&-pH{7Isv3!vcn+zyN~_&&siyu-{gUIWwwYFl4{jYk(=F{ z|F9T8X~{DcRKXUcooOh(#a~EL0HQj=^; zyY=1QfPn%fN;qwi=ogBS41b)>XwixMg~NBKK{mOd|1d(U^qE_z;1|kw+0L`fP$_)hBdD$IECj9B35NVnN7_ z>$)daLagublJj_SUlLbdqU5v@eZ2$rZJnrN#`yn`IT}MHv*t%iRZu?YlzllzvijIy z!rwWVjt z&D(6m(JIjCvY~hv(;rwwixC>sH!LqAGV3tz55}$R2@4xB+h!?7w_6g8OMv+|XJJXv zdWl-^&k_+aPOmAxU6jG?Kb_+eW2QA-(%$=?JBfe9>~?m;_t%c}TW3uK1$rS#FunT% z9ku~jpmX;rtCgxdl&4VA860Q5cjN1ZLWERy@g+q;;#uo{=~=+|x$`1|XFZ-bz(6H8 z!Qa`I(C>`dYM(tdet}wc7xwNeOV66D-n_pCNODZV(?9-kx$^UF9}6#_cwP|LNsrhN z9Yc=U)Kv=He=GX?+#JY^nOLGXFT|6Ur9Jxwb%skFz-Mvae*eWqaWhwS+n95@n_A)o`0bcMe3OU>>OUOQ((Kr{f{SLQ{)6)FqO?UxQpc(?_ zI4AvVLOMnwu7rt7g} zqV{s~Lysc~cbTNzC}b^=psko%Kc>o9dl9vWvcCG+XGLlhCc<|1=lbHA<9PFkPm=|= zT)TJMHh0ktY2Zwvykw{FnYk+A6)#)ry=v+LzA#g}cxuvI*Q@*fhyL z!=AF%Kvi7?0Vg>6bofE)#ZfKKnm_USl2%}hr~OJT*nH&-Y?en$J>rnp=7&nLq>95U$~f2>{{+WR|dzt=mi@RMSU z43=*Gc%K>1g~#%V!YfwxRzoULwCEB7RGwSK%lZ$I$S+#BNiB^@()E@wh*joV7ro{h z;;2xp2~a}0+JkRqo6X_IC>7W=#hTsbW>b=pWt$cSBGM)j%OZrWeQl)k%F z6_acSMg@VraeT@u%3?_>pqy?!`2@UpXB!|98>26|I!~9c(~n#3G)H|7xK_?3ah}kL zxny5befzLt{hs?m3tVb;zg#g_~1Vt(bJKbOCPvi7rkW&*&^*5co4Up)wMyeYY z*sC>Y7{d+|ok2*CZQFN~^jb@F6-^O$4VzdDC;3#|a~|y$g>hXJ_gF=9@sEO$3|mYZ z!YB$DJWOLkuc;P?bOUcNg z07P$$jO&(?6}1wQ6X8Oz*^>M7j%j&BA{QN+>q?pO5I0@jfO-ZrZS1jLziJ;YYIuH} zQ&DW#Av$2&a;hhOo-Dv%be0SvMp9*aF>Zpgi(~Xv0kHcnC-^)&c>0nS@E{wB&1vTp z6#BRH%b5DwBgVBRZ9w)dQ=g2M$YEv&+A#bLPKq!SSsM_0WAlVYNhM}DrmDq1$Zk5& z!tp2PR~@%puu3nnO#99Q@#Z>N_etEG|G+}@I)bDOwx+5n%!-F{jH6^*NI5P`$M!z* zX%q?)v`$iUH*3IX!77`HJ`a+|J#=IHL>emJ{okL4yOIJRoa)UO4kPcd^~*n4LwFsz z{@XgvLmyI^Q`Z$q@MD?x|K^<0{=moVLC1^bv`-A#n<=SSG-LEADvy>5w_86x4dtU!^EIb_ehMxku- zqZ1n3wHY=cX5UJ};D&M@vMu{lwd=KNYaAv#OQ+5M`7cXtRd55~8D>#HihZe7a4+d( zp+@$}zvBbv*T>$IZn)m{vUi|@=LNZB$!`L`E9xf?hrsmq4wUkwNuPu|>f3+>u2nl_ z3qoqc{+E5kU+2BajjkvwHFAt={{oTmB5{tSD$7(MO<*rTooZJeG<*{F_IH7qE=vV| z`3=558d`Jy+&(21jg$T%7gfq@9pX|fs-M_}g#Zy1iM@Lx$p_WHyd&}bW_~4C%7q-! zp8Lt0Xzb@B9z>9=q=;H2wI4q@U#+kE1PCyg9$Es&XIbjTi+7)Vq7}Yksw$1GPLw>4yZWFOVcsb z6nD#WEh-u-u$E?0bG}aYfh-_@fLh9frlmwPjVm#pbp5UI7Efh|bZA=HG$VHI1b>x^ zT4j>b#e20QT~xHGWKG-FhlP!d1A|3Lkxyg#Yx2F2*Z@p;_t4%$gZEp4%Yxk?Ga#_O z7`hM6uuWz!i6L;36TesaNL~M)+~psi??+3B`yUDTFs9x{jrcbK7>0&6v5Al_g-uhFwIH{|A+~r=?S5j8-heP1~K0fA3EQCJvV+)fo^-lx{O}3;CtvXeROB% zI{!KOfz53({A#P4vZkPG<;9uE-K=HnW5vZc+9MmlgtgYZu9Wnj4Hy-IbW;RAAfQ7; zVOP+Zv+1mN{^e#=hW>%~{s;d5Z{2jjj1oBD1FMz@lPQ9gSyEnM_0{{7;JR5CY)P3(C}1%gUa?W<7m7j;s8%dAV{1Wj-HY#kZu$ooGkwR@>l6ANJONB=>l-J^{9KC}u%8H{ELWIA z%?6lr@hApPQh~%4MdhC@o%#mz+<1tGm8EiDj2Ilis>vNR8oZju3CTGtUATVod5pHY zlK`*<#6?QlRa78FBFrB@i_w>ZU%>*9vm$5;T=AAg)Slo27NX#_UELL$TJYU2@b) zs7q-}OC8=$!{DGji(x)LU;bL=`H^v)O*hn+=7+g|1i%?eVcA;7ne%P3JorV z!Fe)+UNvegXsAG#p~-tzwD48!B?@1EcAG!-NP>d4M^BP2mi6`|jE?~EW#GA%Hac&- z@I`QC5=j~d&>@1Eqlr4u5>Cy0aR`#`5)t++CWlN5$@;PF=}LPR^?9H8bT%DYz=mvgsRiISqI+G5=3o+(|Ljyw zqQWAs+lN)DSOSC%ON+_KVK8lTcaHA6EM1-K2-~|Bxs+2#I9V=$Rl~7joBw}=_kg^& zsUW|P=zP58gu}SR_!hm!y@2v+ng6s6E)QjvJg!J9h~4ul zfRnKc339CZkZ0U1z>07Qncx?Hw`9=Xo3Qb9uoOs`aYy*U@u;e~KEf=OC7y1m*$nHZ zSgV`duu6Hb61^;!bNv2M3Ca|%Yn^)scJ9G=i=?8^n$ZxG_)om)F#mu@e_s&}Jq|(+ z%SrxuE0ML69|K=fo~3r2@B>gZkHts~q4^UEhtJmaU;^79E&t9m-557f$PQmDH0C^u zTH(AeKH*3HU_1~5|Iet_L$5KGFHLcyH~wb`%P#E7GEb^O zn%~oOK9!A$jaZAJw64nXMgAGh3t^iQ_8sJy>QJTRzm`tLx;Mn}A2`&SWNjBW^e2mX#~M{gU#9;MPOLY1&4HT87&#+Iq04n8T>C7v z%aZ5ABl}Ay;g+ZI0__VOurvEn?E*V&r(9(4Ng>0VJ^!`(OX!OMfWW6>tz5_p3K_`&jK*a1ksHhIL@Q=KU$fiLY^8b z$fny6k|2-E@Nf`)2dN1c$o=d(rv~SG(BUh>TYQ2ps9t2at(o@ymD6jJ6qyaOON5g6se73txZ6yxSAx)Ff3JfbOpSo=&&iSd} zMLNGtIr`hE}@}vVIkRP(LtMSTq1)~yXc{Nf3i^2J*-fw~f zf9k@F(m5z;87HC%f~jE=pFQ^iVQZ_G*j`R6)B-ph{=pU_>0P!D&-k~q3aUVRLpgYYTeM_Ug~AE@Vk zgL}3WYLejrw4U048St}doKbWp*-E$*oZZ;A<&n)DdB%w*BL+vgiFj<`krxP0y9xN4 zutMA5h>2~2d5Dvt;oe^hzg<>AvI?>%RG(eWx$Ybl1{NM0B~XzaaUWN9D=KEqV~x;o zF?+6|^ z9qg_7&PT#7d3iWHd}hztzy62elHBV{cD~O=HDijLEzDtk?oH-M>Gv3Lyz%DN-Y%H} zc~^edPWDph)Hd`Fu3*o8nsSh2x%-<>_rKjU)Id1Xq~_BdMOzWU%k!m}8l1mTEGFWZ zcrU@@acQ25DQ8T2gp3fWybb?1qiX#3d^3CTUp*{Th0nHX-p}Re*XM#O8csR5-+Ior z5Xj!{Ei^F>r?k<=%UL!fP&~+qJ-9&%<$tJ?UV&M#R6L^5FJjUvV&@ zBuyzid@xX*1{qgAK?jz#93YTeF6N=t%l=u69i|##+@9%~;p6is-?CcBMhUISq}`5F zpMPg|@3Ecnd-Jx8fvS^CXU?*uRU(FO;~EAYs)TU5Fz9{~wPas~d9GbOj{0S8nKdV5 z+W#=>6g>YnE{Q|bVqKe6U;5xo392$RlqB@|+x|3MS4x7Bq1wmWgUJ060ARE9%YUab z4-C5dIWPbo5RrN7`YdN)T5Z4IevvPQ+-S=UHw!P+nOt4;{;1q@w_68X&~m+)R^Ebe zWeLm@IhKqRe<*z_Psf}X6?!n8hu+!lb@XN=G@JlFfad}XvRBk~j7QMb6YnRWnMSH! z$68QDAj*28CUmU(kA#1Y!O5te#C*a@I~8m;v8y$ju=5af)J;sKWoEAfekqYA;u_WQ zH+`vTl0+2hf8Tm`)#Tj1+yxnHM|Pe%A-J5J|HfFzDfAtiM&;fH0DKz{8z~%lT6RGJeU!T;(v13|IA;Tm6h=9#XlN(ldHlD&PW zbqOAL0~xQ)yZ1HLIYo*8`mD_gWy4o)BCgkCQ-0yi+Pne2CJR3N!Rr<=GR#^9%s!Kw zKVpRZ4K#%VbU;_-rr(s>(vNnnp)WSyK8W<8s?4Ztr|~u9hZB1M1W-xMF_7U0p*@8H}!_IsY zOQ3llrkMDayl4>n5!?XbYI$-C&h=xFxW>X;;ed0J^^`bKVysyLIGGadym$HH)p|R?U~rAGNOg z=fY}!nbXR@swt;M-DAJN!GIk*KtCJ^O-Fp%wiVGd;PetT z6`Hg4(wXt5yJ=*}BXrhrd#gEqO(RLdWP(9!w#Y5tE5w8A)n z#J!}U4+4D&m`w*eC~uk=h-cZ0lEGi2UTV7qniQ2?yX#>b(Ta7-91kolH(%CKs8?#5 z`YHU&>X(z%#J4`o2UVol))kSAqJcH=K#0Q{^}X}aX~Bdox?qC9My>CHl$=rPLg!-O z?uq7)6{o)lM>5e-nFkDhfTrXcdK#S>E$kEDYPVkPk9Q@Dc7)zM_+IOO8a|(!e9AV= zSKpbgqWoV(eRWimfBY}y0BKR_MiA+c8ZZzPkrGk5yBkIh5D<|T=?(z}=>}=(7~NeX z2O|c9jl1vf-ru?Zan3kepA>^bRzJQ2Mr8_1W<4 zQ9Tg7QMDlgJKKvEDE!xkU?{7rCfVrG1Qq^in9q{CM=>z>J}&{fwxulU=pY_0_<2n( z?A^Rx#iB#K&^t6!wB#TxsL1yp_RK#jHLiKG{Jl6}XzwV^bZckvJyJRI!S9bGE^R*F z8_sj)Ho*<Fs@6x<(hjf=Ds<{ttPAaeUD`oqWTxF> zmsk4gAXHuLetyTAMzFNvu?VgEfP&YNimj6M#9v1OEDAO4A3iy)&_A;`^RNGs+!BKb z152NCv1B0MPGLKT%g(4cAT|Bwi~ys?gv^cE0LL+Cg%@CCzDpWbnO2_OL-^D(m5R&N zZ1cHsqW5PtePM7?~|dOF2m`G=Gd2Y5dHMc6mN9Db^b5xy_;seWts{ z3O`f#uQg(5zi-Ec6jQQ8){(gsvRpqL-wCn~2&+vp`amIpL7ITv%W&vWavAK*Hm9Vr z$^5g74&_)8T~g&hd^(NjeUum}#;#;XYwMD5fbg!;Og}`$u<0SBFTA2nQ$(TA z)563SAs{lUDkyV>bKIR2nm$ap>3{e8G%bz+=w5}7be~nGzXn<;3ve-L4-$sQZ(4qg zz#^uhm#M~_EnhUa4>HuSrJkz@9o-Yx-(UtZx{(%5=FuErd}oqBp8eV8Gy6fp-gx5U z{1_%_$*+e$JO%Qq8;vw?&k1Ojv1qx>vDP~WdT66&kp>|sO{V{3a1BuuNLP8%j{Z{S zI|&nz4g>2kdraH;=DTakDJf(2#Y_c;RWYHAES?8ZJ8S1`BcHh@tse`Q2Z#EsC~u5IgShC4@^VqvW$KDxYaTCtQZsPl(?iL_o}<5N;P zs$N^v;O^>jY=%QkF=(!ANq?^IBr_uV>BP4uzhfD08yS4}R6#t*2dSpR{#VcUHD&zn z^`rx*qaGJ)?i$P7Jh%xrc7{m=BL1a%O(f4Hx}-{<6F{l@vpJpVt_i$PzyT-NImAi8 z1u^|SD)_FTAUHG|6x?yYQHR2n#^wxMFj9R^#qc3|OR{qGXrYiHHW)?KAol*b{{;2D zzrxe(qJ!4FpnnxLZuhE4;6ZaXj?I>7a1shj)!MPP{$OMF-&KbSsIw)&qhxqp+a#Vb zr?#CEm(6y!e^m^!4Yj#?8_^Emxv_dF@pTkn<4j7}N|}T#W;@9X?L9ZqJ zKRN7m;A?m-EeA+1k8DbQ?;cZiAk36 zU<*`q91}ezi5AO{6b?Ehc0?F5f|uQ=%fRq?m5eD3VD_r-mUnuQRQB*}Sigr!(B(_% z&mA+P5-Z!b_rFSVEc~S6O#F6UVqK$tWEPzz4jzwUL%nA1838G#hn!lBJ2z0o`R}N> z*D_4Y+(RSRuT5|*p0aGNDuawXd#TReNrR0jRnYv|BTOg{-mw`M?wNz_yWD$dzBlWxVcC6Ur67sPjHG=fN6!MHGI?8x}uJVrqr6h3#e}=YOtO20!*=UIe@9K zdDu*|WEi_~q=>~6Ai$(gh^6a-4FIf~yd6c#ofh6;iErAGSI2jIr({B1N_ZHSX5~MW z{Q|8_4GS42x4~Bx_?_Pi?B-6K+XI)~qnidu9U$;4> zh(EJRp*u=BUq2(hW7R@1^{==~9XX>8%W`slckUp*OEA`TogA>=5-=3GU zVCc`i?0?jG6Ar{_ioorVpomf20JQw}7-AWc=?Yb29%%Ze3xy;f?;6ex@@BEMMzYj_ zV(FL$B@obF{5RJ<;`&<-RuarQU6uW11Q~inkk!d_ondjw9+&f8Xy})sxhjM4iV>9ntWi9WL=- zEv|_9Mn)}vFd~81^^EDL#TAU0ZPtH8hg@TSS>f*itO4Ma`#i4<=HPXKmi?jVX8wss zCr+c26!so5l4I@b9}EIU1&7EVqyLmcI%k?*p+k@=h|FRR{5Q{x&2}kmelYLg?#lX| zMSIgeZa`7*KA&P7$ulom6}V-7p2Pti)YF^lj@UVrSrnci_8u1+1~eyI{pT&J@t`z`cP(gy@W5iM9>X0ITN&&nmt1;|dcn0;3v zb1WX2u6`SAf@K%f^)=^>U1v<*>28|p&=9T9_uQ>6&2@e z=5oV$!f|@XP5Xk%NNe(cZM0@496QygPOWyAq93 zg5Ae%ns0H%`7Y=W9E%u=^}zEfG&R+VYi98*Os|wNcORwg?*Hx>=d_cc9;u)Om*De$ zaQq_Idi-pXVdQ;(DM7<3>=f#bO@rvKuW%yhu@1kxdDLb;FQHW_p~d4MT3ey_&z zi8%_>@7}zVQeum_0vp&efuFgV4%#!#Nhx^Nv#NMsdW-pw*cphIf=FbpX_#^22{f)TN2W|cCNQySw%UCwf$cD%+9A6R*==f+RO0ZoUrX@yX7&67;L z^nYba)$g93DC98x-Tl7y)y>3xB^DuY$j!g$2FqtRe*$0A;G!w)7ne-8GoXOMWn664(2h|W(XXglGrFVs6)EWxR~W)?@u-(CDFSDmir{Ptlg{5=?`x$ znL@}Jq}_!40NIva%6XpGL1dZaj&Rb+k-Nlp4@NG_Dt6|uN?Kp0?%lT zYu~tNPLppgu@+&QI~EpbX}=kMCh{Ip_&1ofE|QE*tI7t~tZIU*<2iH9t?eqY zC)Q^-%JlB2{ubGTtC{u7ld}ZB%EWua&*Ov~@WW*r3-s*x(xnQ^EiQiJCwJGB&s1qy2mz;{?=>ZB0pzsh;`UFP?+J5Fr&6;AT%DQf z=V+5`(`))JTZI)ri*ES7e?6G5jZ`FW4r%i4aHi=!fSevFt;C~bO^_UNsDo`*Lcbk56`j0(Mr7Tdv z=UYfz=sXj0Sx^g9H0YWUN6_(MWsa*-(DtkjQ6ZTYRg?5ai1)TuTZ6`jWO_l@9iu0Y ze_rFcH$*Mex>0mZ&-AKcsM14tu8Gf6Qqzy+i?RZOCf|v+iy&9rSB6PAHH6e#=9a68d$#Z0ySnpbB zTMyGE`@zeBX)O>)-Dj&y&8!*{qC|POZq)u4y!P4$P%xr6yLTEsgY~Y=Nv`%02NF*W z_@M+^1kG+JQHtKqamaPll7FnW3TqHNA}m zFiQ^WbpnkeMgA>3IOI({GY2|Cs*UI_%`z@O7=4(_7H#WSz1>3rQd)BDkR`L04R>3+ z8EdqUeL0(l6`}v!SH%-NO@dqv5X|=5rF(SJu;h~3Vz-m5yDRx+QdRKpbNtPD?;BWQ zyb7&v8)B%;SJ#8)?`ik>MN%%~u=WeCB1aktIDjVV#SN#Xt!YLSl!He z_mUpz^3w37;Bi@Bw=D}{!H{##azk#ISg7u-0CU!!8F>7taqq+_Zp*P7FH*N>BTpj@ zud}O1ul_1BfF(h3Fd_|+lzdWI+e|K*#f{rKBV_2dDAkd|BqCH>$Iqg~43-QAka?AF z{ySlDRAq?#Y&g;|Z?z>vt3z&?K!`u@GZXaoLSjX!b4Xix{tQ=<-|?8wHc@6{xpbhR zj@L0l%yAPZ*`u{aCAN#vF%E}1#m23_=wH5j#4md;7Y-UCtg*ZcZ(w9!wt%RLxo^fD zfpp|~7^=q-qZdl#K}Z1VLuYH=T6tOd|y>)W%0mVn35#Do}8L7O=iG@ z1wlZFVcl}mV|zFynN}`^UM3;hZFPDbE6TI#kL>Uo{kJ!~z;9!bsV;IBj;9tPuW20A z^M~<@Y|(Sh?w{0kPQZk9&7(kllL!EqB-gKY1&RCt!lDc}mdu2n?j2@<&vp>xyij<+ zweUv3%S;jg|!4Z*rnlI6_hFVut|d1nxKbYRKGdDm&u z4&z>pAPS1;Vn5Dvlvq6FMLgWQlE1f>>W%EGQjC|3X!&4xRPxIK!2>r%&jZMSozVPeF-fssx5+W@GP_RYX?0oBiRn+D zzh<#-27AT9UXWrw7fR)Fxd{Aw|LxwQk<@3lOF_a8U3IcO2_TnCNBkO?WF}-O_W%|7p97i@32tKzyo$46hc@eU9HkQ{}GoHkH$9 z#4+|AKqL8M`v-2r@R-A8o>SptFz`q&9~n-#up>V zGm)!-Smj#6VB66Q>RFIoaL@6;-iWybjgM|u_?hig35iWTmZ{4r-90lm6LIW5oeW2i zPjf~Rcbo;bGcHohv)Rxvt}~dr-OOAZPH841{ZP0W_iVRtj-+PbQMKm03oeuGf<7IV zX|$150x!6I)Nua<4(@EhVcf<++)r?8!?rEseta z=gVQ^gi$N2kmgZC{G%~thnOv47CJzxhEDAfP^bAd%#}kv=n8bt3kR>-+xj2u+Y(`N zA-k>@XgGZHy5qVa+OG=n8YPkIh-_V3=_65oGx?uY5!N3q^15~N8}B{^_^H6i;{wzI zRtP;Ow8Y*@&5{(3_!q%!s?yl)DM%(p;5ajB{Tc9$}!i zqUKVINxJitpqe+s7lq__ug3h`Sk7>eHhJnuum6>REPr7C_D(Dyq-3Yi?;rrWH7>69 zvQo0>7CC3C5|2LfG5OT;wjg7ywx>4dwc^w>Gy1w#<_(kN)|fS;J4#}=$SNi)Hd z!iiZpx|NZH&v)j0i1|n-)YFVKt?Odpb%%7e*$^Sq0-8cLqtbX;Ka!?vRpG6Z%pR>M!~1u}H#CA-dwN5y>SWTTw%0<~vI|$-61j+((`cTt+lY z@g1*^`c1uiM#DcHT`z-{y=~J;Yk;;wZ?F3eD=E0aluui5lXxUNQIm{b@jkR4dr#6y zDw_;UdN61TKLp_}bTVuAEK^jIV?HUe7WiNbZua{DHJfYudBt@PodoT5#1iE2k8ihw zXmjwD>3CE#tKZw}uDDp`lXi8llNF@w;~SzHFM&*xaJkRToTQTSbMN#$YWd25p--0o zfS37goy<3>!<>+^7o}}*4Z6nw+0(+QQg|3?IFFmX0PRe1^IdCMd`l%ul_S6wYDO6A ztpk#GCEa~uL^7}Tp;ufNZ6{mu%{Sd&Wop-!STFexeK$SiKK{LPD?CPHbhl#QST0~|uYl|{2eXXjwP3&< zG@>y&C7UA;)xJKHf;~Qx^xdvlvJR=_pxwS@fcy55D+BOupNoAAE z9r$*?2qqQS$a=;1Ud2P=?u5K0W$P8t^@ZTWS3q^(TjoW#d8#OtbP_+j6A^K6^Gzc- zg-L(j-FbX-Vq@s`+MTsESf9T#o$F@8R_1^eNON~vKNM~L;ee0e(tR*b8HZhaCT zzY~H_C!!KZAF#{#AU8)E1S@M(egvoKjZRTiA>vnlMS4m_=+6Q)!kY5NdMj8j0+>;` zpuug2oc8Dw)p-n!@4Jq$@rSR2$VkZD($c!{NX*WmOpVZkB%PlUYY=5SOo<24N5xq& z&7k;?hqgg$Oa?npm|TfM8v}7z{u=5E4Ex3_u=iRKeRdQHI;yi9y?cs^c2Cb1kskvbx>$tu6FdR92TrPdAuamA9VzA`& z_xbRC6nD<^jOH%>u%Cj}GJ?}GTQQ=rHNn5V_P6SswiEUGioXSf*wThUUuVt zUKoTgo!n(S|f{%Z+PqF1No2P6M`gJNzW6cqmvCBq(saFYUaf&VOJ|n$PYp;6& zM%bCSFZ+Rc3%1DjZJgk^i(Q7}1>0tObD4KzSnjX6(P(&ZNf-qticCYoC>Y@il=hCW~you8KUv1pqVP zsqphoj_3^sLu|48QL^<>V|8;xN|in_F(JLgX7zVwjj00$`k!0hK1m39i(72l(F@zi z$V%7?(w|=yig}F%JmMOsXjnA=XZ1a^!>nDcoO9v`=u{nFNz^~ocm3O`{Ate%HPT)4 zm(QeiV1bU@aKG+;@@sp8J7!4qpT{gC4@qsL%_d>~Cr!OfvAC4Ec&*Lv7M_q2y<*_h~;+ec)JGCv_w;Sz#T0Nm1b4B3JYUoKrAfqWRNr zIkB;3wzp>1;Cs0OxnpVK@Z_TkGuA@($Tkb|vemQfL%;fJ2-* zK8JPuAJw;HWlL4xUS&RWurkQ}dB%!j75B3M!{iA=K-+*_o!)KY%5X(Ob-S!w4Go$R znkXKzUF~5H36BdsdSM5#zkeqie>wKuiaEU7e^P^Cx9n5T6Sm}rdWnaLptZFp99#Z& z-27IBjW3sWaoQWP=z*@j4Ze%f@9cdmMP62_yG>4|lh(KMhY^B)MyivR+qJulxr*O| z6)%m3(;xtb7$FMqvc2s)om!zV=9#dXe^p(LcDvb0|1La*(Z#D$Pp{UHLjWu(VRpnBAP!IO zIH6d4kfqVeE>{ts7k2c*SefPQx99b1OrGMGS{FT=5lNI&va{Vmn|Q|QRoKdBW@=F= zg&Vx%*5*ZJPjDd4pN0dP-oRfk!D+kAtti|;Hj*m!mWh9NE!h$Mbc}{>RM0Wv7_V->8ehT$ z*?Nq}Y(=2cRbetEAOv(~tu4K$zSJr=h8A7C^Fx(JFHyA7dn_v%)FJvV97ey@O-9fC zz~lJSkN@c04{7i{;MTYn${J;}_N@NW`F07_HIu@>%srv{E7gp?=g2Bvtfc+kUwSUWyX@Ot435{@zt@v|AnZ3JB&YT#()Qa8LFIGP>hx+yC z7VjrDl#s2qC(GSl2koy37=?IdeioOUtA%(Y7HeG zbZfXYEDB-vyU=P$qDW{z_{Q6NzmsbEX3og+g2894lf4T(Kl#9?^=^X#Jjm7`e7huS zeqEP|_7gg@6NlH%NHi4D$=Hz~`$4O`Nn*f2BoNWIo8dUg1YTANIJv<`g^x0`SK6Pc zhWucGy*Lt+-rr7wQ8CN(aZZm)tnnp@5g}IKkW@mR@nULC$h z#C23*=+)wGrmF@BH4$2)xMNtZjCDQUf--RF`z%<~U`@-j^^}d@%^3$czXj%U+cnNx zs4kj?RSvZNy;{uV&WhjL8=O=Q#9EU7M2j5Pj+Z9x&;ecLd#nJQ`Er-5Tj}GMy z$>pxiR&hOPgHF2$uab>&x6VOhl3QM%F&S6;CHeM3y`jX}SgZ9{cd=&ZZ^W@-lGBQ0eDZlyJ(y&ESo>M*AHUD&vR7g04fV4I(cFuT341c2x%2R$ z-kp@f7%`S3Or0+8X&{Cr2Ap%O>&dc%7?VDXQF2$C(E;DvNq=qt6p##pzYHU z&D^Z&Wz*nue*N_JTaC43QM;qtB1iBgzOM$^2nW|0ODWvU=SeZCd&;NpwH`6G=1!U1 zDlB@zDl!+qB`)dBb^QHtO}Qi~g)p}Q)oZm_3v$f*=A6aGyL<*uTQ24mK%~jr)R&FM zAyH3w9nV@!8%bCT4Q$+9d(wRrzR7Jyu$i!ePk)@5Fvyk*eU$VUy zSlY7neJF)LI-`=`&^J{{@TbX;w%~y;27TZd6-1g%UNlZxdHAuGJT){BnVnp15kxb( z=23Ol)@ggHwxK`|{~ax#=ikKtB>h>kxTJ#3BP)J^$mT;#;PK}sIgwqcy0rWh`Z0_n zo%XkY(#mFB=<7qwllg{wk;=|Dx0e}ZmH88)QWl4V)LOGaB0JOps#qIwP9b4Srn`#X z-Kg?_do=QxUwsdE>MXFz2b`6iH#l6_dKSDvQZ|q$=tHiLWQ3O@$2iuhV9a=Sy6DTw z;NR=zU1&hNAw{4V>3>EH#9pOA%iK0 zu1#88rr$It8QFm@-)?w8FWZ);eZF-nf$c7CC+$uIs8dURruTh4Zu92GM@#WZ+rpGS z^>jh%WElz{W3Fxbv;E)jD73A)u;NJ7W%E?2q;OL!h>s32gF8N}P-XJ*N4jS~W--vH zDd|^JBLUipPmAf`wRS}2mx?#|eCr=7S~puVhsX|kJ`shU3pBGQQjhelj|0O(CMXh} zTBY;S%AX`DQY*8K69uI{{fRF(RPs8o4kIk1P>W(i5E^Jo9a+o(^#fj*uxN(k_(&C} zhs6eJ*?rdOI2=PyPF_WEwx%(@5&6OA2;evF(5*a)|8RT|2b2Afl>0>`_ayKb!}64* z^7lkPOk-`Qq4i|{z7v_xxSPtYo3`wh$gD8?-}MlOg>nSN?}liw<+PmMEyS;O*1&Q2 z64VwADEk)~Ppffz+$dNHfh3aOohf+rY6ky))zU~5mOMvG8VfvH9NZEb)UN31&SDE3 zOZG0j8TtCI6$$b+)vFM0r90YV|JB|%U13j-&bRD zz_VWJe{Bm`BQ?`SEGA_?NL)Kh+`h1fBRdVY>N(CbM4lPZMmyx3>#%ln;;u7>^?MxO zLzF84kE+7bVn%6d0!`t6k<88==&QD=GmX_JkJE*x7^`c2=`+J^*u)%-Vpj1xAc14=8-`=fz9_vEKF|lHXba#>$p;q^n0^>jmrp+VltiHJ*hT- zgDMg*ja*y6^nh0SSrOI!?Hc%B4At1AzWdK73o;8ln=@C)$?jwXGf)PUeZ`aO?#`O) zSIrZ&!)uy973}whhp)}_zxf{#URqI?{&N-bR*}9Kx-D4nbx+09H0Czs>aA5Hu^L0S zanPl!A9ufzaHIE%_Z-%Z*te1fzDWnHtPguql%ydYMbVZk4_-qn=afRC;!+O^9SGrl#TN(@<~TbHmce7jrNJFA=LcsE zrM~Q;u!oB@<;Etm*TXoN~h$aXOYp>z{002I#DevlaL#jJ4!0(Lt#jjNcov!L(Ur?> zRx=dFCxDh)!z2-t_r3%&c;tBA_2twK3!Y39K|`4fb6U%Vd4{+u5Bugf$n7XEE{xV86CZ7YE8K=Oyx61 zxxXt7OB=~qJ08@z`l3!SA-`En7rt#^_h^Q!DnOxe*@DC%dz`<@mYqm=gV4FB33xBD zH#O(Cxm`D+o>O#jaJ|)5lY_+8aV=rv3(cDkJ;^)Qa{RuukL?N1w^>D8 ziv9NlNa6*frtT+^?MPV^vcuH8))qJ!(3aWL(t3izhcim%f=k*)cIyR-4=X!N-jY1! z%j3tQlDWY;CHHrGpn@LxwBfx|mzI4l?5roSZ{cD;5MsJDs#p=Po@=O<_(8xINI7D4NkR zjGaQH^Z;yoVV)M`pgW=by(sFv`y#2VGEqMS>OoWYePwWv9Q>u6nJti zyBh0P+}5+*0ZvxN;o8mF>R|Ad82zMc{4e-qK};yphUrdcY9@vrnCNJ&EnMhs!)sh_ z@KPYwX0=DtyvaiBWc#dZJq+vKIzg>dw5Pk2+1G}CPL_RcLRr$`O8^kSgI5Mq{+YVO zec5&{#&UNnJenD{fEXIg=dG-`(~0Rr^@v|@$;7&-3{kWK5*iLJV(q0kKu`vv0RiSM5ze(E~v6eXLq0fIE3=3 z(j>A7XSkd-lh#_2i-Qqz_Gq(^D663v;)#IkGJ-!qRH@(TdjrW}mrotmIblIt#395r z+1Nt~wKyTWyT;&jvNt{~udssqF;C=O&OUj)zH-LeaC?Dj72N+dI!ELR7^R z!eZXQcX;$R%vnnTqi$CnSb$c@n><9#?vRvf%Xeq&Bo<~HWcs7{LRltjmVZ#p3$W6( z^IypGC3r;n)k~>HCY?1o|FwH)*>J5)#&FM0y4pF4EuZpQmpN34ppFy^>+4>O)h?Yw`o7SPei@#`d^?X480S{Fr78Z+245aGd_#-GM_N*>|I8l!lM$1 zfn8s*-Xtg;p&~38;~bs7?5I(B%ly4B{04LL9ci~c3Mg;jofg_9(B9Stu~@H$h;eDO?Ses)Ge4DkZ!BzRJ=o5EJ- zJMpR=UW5(BUp@&`nSUMApq?^N%vjL*0{EIwX0ymnOb8M3hOUy+YiWy4JyjNSvhPvw zY9o!LpI>Fx+49|^Iwk6*67s;6>NTw?e_2)T{Uq^aiegIjo0R%zZ9CL8E6{mPk@<-U z0mK}1K+L51qkIy7Q7rBsRo^=IXXH~~<`49B*WNm-QpVYj@=wn$I@mcq{Ff#Y+KfNT zq=p|nAg9JVjW7)`ly{^X**CDVbLz&~rOA(9@0>b}^ld&JXU0t-d#Hwoy|$Rx#Ae(B zKF2pU<&3+@FB7#Y)>7Tj3!74h`U1vnsO1t``~)K_(;sk$LzRuVn_EMQ*-b_-x} z2K>5h&R*kk{-W2)s)IcA!M&gw$!s`taGDZWZ|SJ7I*~wqwO=kFx}+MG8j-YkKX+VG zw9g@4J9Ny|yO*up$?^Vc$gzK6j!B&vb7NQRg7!e;G?vYnL3o~q1GlTP#G8MXI!&_? zN)W|be%oxEE5`-xw!|y$&>EL6PEs$VnNzl-5tBld3MmI|jT*_7;M&-k_-;hBC$c7g zLnD`TWj`UWmOaOx-TD1@PJG!!GKhhm@Q(HqA@_XlRDbrrf2nLWw}<;D8YxR_sm0!= zWUF=kRV!NO(t8pa`cZ6p9hxUHR-P~+wiH4l^Ok$$3qBc>kb9u>p2EuM0^n2^o4`V_ zhmR*EhOn_7^>V>UOsps3BlWe@-y&4pb~J?Ybd#vn={5JvXh4<3IQD2i8W&hiFEh|f zd-+to?iLPq1kz?#h&L#@ZdFl>okkKfdqO__U~!Co9HzWm&Un4;^}A`5;rk80i2yp!U%4o zvG$P0}!tFJe~UF2~U-=k^F}?D;Qn zVDF$Ak3!xUc@g_xTA6x{4nYmkY>DgIu-=q-W~C@Qo9tYs>3Xa%HMUuBqY7bM9DDqH zK_r6>t9#7rtK{*O8z}`M+ZSPyI(4&_db2gieCS0>oLcIMhc@$%K8n3runta1?C>W5 z@Zs@+*#r1!u1lysV;Tc~B1NcXAw^w@IrmWFVuVjY;+CI$Oe;<;v z^hddUam8}0GJI3?d#F}m=*bUq4eVqO5_P`soU6lX`!YMh#Xv_$>9blT|ULCUiGJgM&TalKYm$7!`K=bAdTm2q#O5ZhpCB=p){V*onh@Da`C%WY|lbN zfW?aI;)4g$+-1h^se(R^d#nlgsZJ_?x2a>1WU>P$AATWcde?I;I2a^i{ch6nevG4P znvL?3=Y2`RTIC_eNxydML6iq=9I;z4$Db416#}N@RhnwCid%g``=GjM++*sa|9=c2 z%B#n>Bgay_)hJspuJr8`f(fq<&TLom7NsHLnlG1Ouk;R~JauAX+d@Q+OaSwl z!l3NKZ{$C`(|%M3D@Kx6S4NvK(9^@fb4ED_mCemjE;q;4UN<*;MW`t1hE)q~>7Dt) z?aO&#%c4SBAJp{K*zTxUsgu1g8q8Pgl@xi%oOs7hK1>}ZyMYhh z7V08lm~mTog-6)ps<#olPUVYk)QxrJmCY!_rt@pR*8WM+zvJO&tQO&SVzx}XHjVGZ zd2Kc}FjHCx5sEdE{4@qhRMAR&iT^cG(UU@Iwnk_8vd-IJ_H-;!@u@HLkEeZg3k&M` z>B9x@14xN6W#ui$UyDWhFDf;15ACv8VT>>i7~!3(ZPJ@U8i*PbSs3v=Hr>$<5aq=w z8B0OVlnYpdCJYJ>!L!8X3|S8booVD7>dIdqdvbuk076q+K)%!7pm5Pv19B+CDF$)~;AK}3|3<+-fB~Ppcj37+yr=L3#-H(dx^)%bTUG}IeHU6xeM`mT)x)qc;s3>-PV9pT6C|2; zFswnv5YLCkIZbUbMh`Ia>C{TrVbwiC*lq2e1EHu92GY{`ndVc+vC=MMB%{x$5?1$6 zv}`A3?Yi1h8|~UKF=scB(B;*8#$AFv`Zt2Lq<^ZGmHdLvT?O-#b&c3g{(%ArJXkw9 z5{_aRGoBp#`fO9~%~%a)lz)Exe89l#jaq;qXC&?Rj2H}`xA4o;g_yqZC}ZOIWLMN3 zPfyR$V%Lk?R~ds8zF5UlBHsIhJF`zFrSX!+(KLcZ|D31;2Fk(q%@uTFmNU+1B{I2U zF#e;^X6!BqtJ|mUNL9I+15_tpbKde?bsG!!Hb~j3nXNdmSDux0%V%8lv^O$PSgBlk z(B?5aqx^d`qy?nT^2>!8BrEDM*R5VT({=Ha@4%xL)w(ahN*WBu&_B5%{62XaX6#dd z1*Ck*3Etn~^w?~TqVA)5nihmKT$+s7yAzp+58kI5h?dW+BZ+~R`-JXC7uAuxc#ka9 z%v%z451O8>KnX3A!>9IbX3vVe^>KI%P1Wh`dI6 zd}+SJ<86K4iB%s0!`kqU_F!>D8h2_p!bIwL4YPKS%6VbO_N zdiON!MyOliqLbrZ5sUP1l#vh@hgObD#xe&U1@HG32EV&>>fV`|yH`}sy&zdN_Y_B; zg+}gIYTjpS$e!5w-}l6qs!Qi{nrCKa?AMs)zHU9bwKQmQ)B50nErPLxi;r(+CwJy{ z;)`BG0>0R6hQH{x`oK%kJ(ejNt;2wLG!tW#D`()S>yVC?n-N4Ut1!I6Rz0wIBCoRp z8j=qt+p_mX9hVolSTT16MR2eMwB9w z)dODAS`E3z&!M#zm%W}qLVr0eBE8*SIVH2W;$%n(9t@ln2 z+t~uS;~B59o&67@c)1JKMVCW^5_(q7b+bK+SFg6q2eqvVhZ!LsTxtpD$*gcd`>80?O@$imUL0Z}3q3QuqhXPV&T%~bpgscOppZ{3Lj035 zzC`>c17$jX>xDT$BAWz)GX0j)U)EnqY3U3KNtexDlNxCcn-%kacO#2cugTESnLOwF zV5uG5%f>u>ePcEBk@%$(EKpd%EVufAfAsh^Y{i$oIIaP+>f!~31WcR&(~SkW(MLq- zzBi{^ny{QTW6h3^TRGHmY$FuhaLdIMaIjx@PQF%jdd9s1&0`;I_;vHuhgii@Qh_@HM#v^xNhKp09yV9~zWrge`=9 z`NCx|`OVFky)wZOYUYpQZ>GZAE&QiBV$s0RdIqTWbb99H=|P}k7&%UG`PWFaW12`c zuSq^I#jS<(j|qTd#6f!VI)kX}Zg(_&6sc{0yhvj=dAhT|CA?+l!;q^*?KNG;6G193 zJNRGv$64t99R1_~Xy>$a_)%gjC^7QE`R)haVdjH1|C9+OeM_mZwx7d`th2l}jU)$P zHI$h=4GLfrzW6@U^X}DFOGlD-Tpfv|&e6KUa`Posqi7Y0<^@%xlf$l$LgNLMR!|;I zK1*J-&hLQqJ_^G)Ii{B>Hsol$l2i_hz00t!uKOzx!HAh1O{^p9EQPDq`5qjarJp-h z@ZkJ4$jn;iz-9$7=N-&3hx}vj4Qga_YQ@1o0m9zF{KJNp{ww1_kqvpqI8w?C3I|BM zpzQ_{Gj<+TmW5AOSP`ZH^pE!}XPn6w5?-JO{?!T>ERG>HptfUewe2mz;~-%h>=;b% zKgJt13P(sC&^R>2i`}x{0gmhDFm+e-j?jH>Ce@{&V9iA=4IKuxgb0wdHSA)#U2a*F zsJUZGNX9YG(B}~}_SaPd<({glwWr;hyvX5-)*W%wtVAP%T8!-lruZ=dv?4^2sU15K zO_>mIY4ltfKZYpJT3BN1xT~U*N?2ORezchys}l{Zov2Znz6q3fnaJ5b1oE_jys=C* zeQl8r0;kkP{$~7X3&)mUq>l;oh%KvpdehFtjtjxjyYwi#tQlpGb6#I6GL zNdU5mfOI1=E@4*3hAsSz6vctU<7=W=Zi8|@%lDs#OPk}>Qu(MlbO_T_m``Cxu%d>s zfoUo)9Kc7?SoMS|QhiyR6?66P>q2HZ{lxZZkN*!}Um4cq--azADJ3;p9NjG)0vnPd z($X!R(nv^-lI{-a?rt_3q`SMjeCPj(_j$j(A9w87cHi4?SDfd0omc!BVT9iTU241< zDc3h_FN1*xVT(yCtIx1G5*OUQ+#jW1t4+CX#$PDdYXOpSr?xa@svp-#ypJ3oDKFP+ z93~eh;rktuIgx zstLvkzyO{{yISuJuB6E6Nq*yAbvMX&33B3a^#EnHCil=lK~j8rYey{$1a`$P?B+X1 zvuf`|s#i5Gf$*l>?aTBba`@P~vk!+GQu40@>!rxL=AxCjcE2VnOb)9hz0AnBY5sh^ zHpC5Hct(bUbtD1t`H}k1AI&|}DGtbM7_-kKQa8WNN^{d{pap)c^YMM|qqnl>vgVwf zHR&HiYHyT!>wa!KIVy;dB-BOfs>c!O4~V{qaaf#OH4>tpBFN9k1Ca(LACE!>tJ{j;rB4q2+~xJ|KLOd3U=sWBk~cN|u^FB)9C&V$9qZvc6=&|nQpM*%vwp@W2t6wkrOYj$h&(v;Z$tXN(SP}#)Tm6pow zVs<8RZ}hRrowVKf;#15wCcZcy0e)nIk1Q@EA>s%{g+5r3)K;NnoRWzgJe*s|s83xu zxHa(z$r!DNcC899ivd#mzP8g^skA%lCOGX9or?3i%<4<~I2HaHr(cC*Lz#cx=o`Ou z_>NBUs?cx@S;%|{8H-LoYC$F+8drPRBqoS22NO0N`Kgycv`6*9{^cd!?Tp>Dv=|3& zhcSYZuG`a#fYyUQXq&%rq7NIdoEnc1>%G6ZHPxJ7MJqbyuAC}VJI9eJ@+!+RVef)F zvZxG*0uU$OB=Yj5B?FB2=eD$7cjLUUc`Iz)h zs^ZF$kzNFBHV>QRo-9(F4$*WSp$bK!u1bv|sMmP-m6rH4$86a9@WF6J_$nH<_&}_6 z$3(jUHvC=!5@TWtnnd*XkFT+Lwhh#qw{wyRE3{BMAg|Txg9O2Qgo&CjR-)8KEw%?$ zgfDavwTAY(Uhqz=bX+ehXcdZ6b*55Jknb^tE61Ylimu}AF(m|^q5yxk6d3k+zSkNA zylfC!TL(zredrt5u2pL@(@;YelXG--spnX)LZm=@g!UIUn+)|1Fs6iT4Xlp^aWX~m z`r~cBb_g9r8$hCCQ)X*)g^COz4`OIs$I)71vqnV!l$^AKw=Zx4Iw8lkSsbPk?Se2e zxu+Z^h%j#$KESeGlIPJr)q>D4?X$mBtY8Y!xVTa zj@RZ@eE#Tz7zmeiiaKjV_bVrtwcW11Q95o+{jGNi;N!Os4}@2B(aJ3h+GYt57A5 z`NY}%;^^C6WwULb8 zgUzbi&Z_2|RNt;XCc5?)#FG^aTiwi2UXtKM>Tre;b+)of`iK4p5Kk4Rr<QOM+`AWW<#_lbMN#`X%pauZC>gY^NXB?Xgo%Z46^8a}y zhX4YY7czf}$mYt2;>~o|ekmu#4=fZq>OfDZ{8B}vzd2w~Lav&990^MfWiNWbTzIKP zg$|OwRL(8_;)T3K+vHDQnHf1GWsL|@)U3QO#EA#SDWbLuZ=v0%{xR7D1`)A?nT}o!Y-K~VO}O2UC4@|q9;V4TIIBY%JAB1SXVH;(Y`BKTF52U zp_LV%lQf4%KuTbuil}@BzD~;EQ-oA{!!gq|Td+~?IvWER8|z-iAlJeka$7>~F`_0R zfYFT?4&Y7hgJj5rwVyh>*P2Re?e$t>kZCj8T8VWjLT8^*S{6c5cw(UOwD*{2ZBqC| z33h+XLsAb6yg=%S%IQKgA}ZW_X;{9ZVXH)!^@kqt0xp-D!}b=+<27;3b62WuaZi5& z!*({Ro04DO_ZAz8W@WQ9wI|*V2zQgH*I_q8bi2f>cic=BfD20|!0~i=pC zzyA}XPth*lA%6vhr@c8iisF0)HT0t$j8oVMBo=h*Gk|A@;r*xh&TjLe9>Tr5-?AyW z=!th>;7q-@`g9hes~?gJ_Np1F1|`-&HdQ7BNU1Cx2y|-GEK=}MApf$AD=!mslYF#Iidvd}LMGx+7Ugpk^bc2i4kKUcXw@*!nY_IDZ?i~0~@ zkKZt5Q<2Xht}x_!=#eCQ@I?*=J(ZS;7G-61gU71y;|pkuZM4p5!WDAhxY<1!;@O8} zX)7X{MPFi=m8x;9v*KFf_i+Ap(XS+2Q%VyWvyXrA`hTO{zTQ8+8`-j0SG*KpOCeGm zLrVa-x`+#0&x`$q;6l)h2Myp9W~Tkz#OS@~as7Es2~UC|_a5d>_Un&K3Gp38{km}} z+v(UdM&D_q3D}dNN=h41gc-7GaW)&`g*%XdI5tbVyEycM2?i^8N<~$MPtJTYfBoTH zDK+mr4k4phR~4|R2K>SjO6fK9y^zU`mAIYqB`uL=M%TaxZDAAm7X*xg!}@Rr)W1>@ zaVv|~06ck*g4<1Y~KCW@9@HA_``=hk-bKezOkwtyEXAH!I?HCT~?;utwTyg;1< zai|8y+1U;I14);=hXOR+Q0H;C4Z40`xOfNDmL(l^X_Bt{xxM7?nVVgF-DmyuPz=`Z z0Cv1J+rld zlrw~-=tsYHkzx$*j{beZ*}zv8R&^f^$ak^j{B6c+Kr?9Rb z^25JCV#z~GRH=Z8)B$0a(bn8O`_EOJ81t`8pjsbj_S}bS@@hq8ZTyKR!5n+UwV0nZ z5wI<`%zyP1>dI%#UrT*ze$(aqz?dcab=3uXI*Y{1ST^R*U#;19@iAmW{1xRDN;*jc z(*`Ha?nLn_(W3GIQNtvcd&WiLv%k8{|KV7qGfk81@!cvRni4@0njXuc*122R_DDrB zIHW-_c0(g&nUeivW*i#HI-DWg7AQC*iaGQptHWvNg3tXxecZ9_k$j~mjgj0BaKD2^ z@xq@b!vl44VaBgHeEZf;~O{&|yjk0*&ECqt0dRVc1AX(792UpKc0M zj;Dl;fyHI^ib`ycIc0xdB#MqQ;B2kWR9C5$kkih%y|wtw1|~Ug=Fvx%m^|{^hiYMA zk#YVUPGbd^7P~r{6*j|h*%!VIjn%zjM5m41*7AEl`9vNAtOL2O+>~~KEJJ5z6RVd0 zP@?}P;lzC;Ge`LPqBw;l{5_u97+3)VvKVHl_BzQ&vnhjQWB+i%7;yRx#gXIv(9dyW zO>SYGWae*M<56tf=0N}+9H(o7!K^(FG&A~dSdqaQW4BR;2N+#(A13!87fu$+i*(lG z)z=9M2i<_UlIr1vF}InUIsS$%pijeVsB+R4wOo1?G=D@=j}?sjo>f`%Zm=gy-pYe0 zr-UnBIpTX1;-FFNn;lL_Rh#7>cCfO6yQ_Y~4R6 zg$MCT!tCHN*0FsqlW*SYV{SckZLRyijAI9I>;})ZC?_y|pM!|u-r?&3N@ZhgL%H{&SOv-SFODNJaA9PJq1# zb6#kJ*}oy>R5`n-=N?Q#@qAJx7=%c+3h}SRdtu5yIGLKsx4O}s(+B)kKc<(E2=G)b zZd9phOJS#R5hd{ch@L<%BcBcq$@Tod{N`M5l0GOJa%W`+72>F-C1^yHh@JxoYcRW- z+CM{PQ{UE0zdpE`a*#SN{V3Y{cQkGSudvuse@=_WIdVV_uB+R4`SQt|H~yn|m{X4S z4e`F!rR2w*xi*=pK&OaFh0!mH7}VFPFO~QBZ{?SH`Q2v25vJ5DdO&b4OtymWSj1e4%%rr@(pYRt@ zM`09M2tv;CMfPVqBquLLWaa>b@hII3AuDTCVM-?AhVdCMfYOd!Oe}_bpS^jp>3GM> z^93xBm3k#tWXM@;iBXS}KOi$6t1n|<_vIhLMv zA_$@ux!G`D6p=ElUk1k${D{1zA?W;Q|CoKUX2@(npgkjBI{&Sk2`NlGX>^+PM*jru% zLsvoHBUDBmiZkw(r`;;;WD02aocK$g{Qq5b{qraG_5LoNrZXPVQp2j*)t*mctX?`N z{52UHxHg|{XRqavQt6E8W9m$QET2=-ip5;~&r!s{3*N*n?k$DIchhKcQ|kx>h;39@ zDo)P(>u_gcgnygXM0KmZ&x#`I4gYORQMJAhF!g9c+mOBYIGg6iCmKX_xXTk_QF+5;Wgq1bd<8xRgDV+SimciG{^8T6T^IFso?6 zm#%2NIyh|E3YM#W9yyZDNGOeD`W!(H@mtze zVPMC@su`(k zmXN?pE1f?c17n>*Zq4AO%3n<3Uup3P*>^U5t%Nb=>v(o&jJMyf(LiwK16ptc?ckRQ zAu=6W^SD*`jDPu4xS6mRyf9jLTqrIep%KQelWI^84{Q78H5W2*t9|iBmtROi! znF3gKOG}gRx`5)&9%q$Cp3!Hvx>mBX_N{(zdXG}6XQs~X{C-^zKl*;^apPW-$qhJo z<{R++$ir+9WIM5L51$bhi)u?6E&iXYL_$CieVrYmPF@F&{N+53Scwo;{kEcY zw(Jmp{(b(LY~wwOZg-b8O*2!g+bOPAiyigFi&9RFE5A4%DFs&lB>KZ8mrs&LF|%=f zOn}2Y3-hnpY;EOc9u3wCz~F5e+&>$5fC{vl8Jzr)dBLw=&5~B*YWR0@(ydo^Vrr@3 zDk^NC=0@BuOTWS}YXtdv3!p?l2=b1PSLI;6_iau?|5v^eNVgl-YIV;=!s=QB<>8Hbx#%XsAmFPx|IpUGLxs|L;RB zbrP?hCMJ!ww9-guZ}6G6)ujd(DAQTlh!Id3VO@P2_kH|LUmL5WnGirgusH=#Ic@WG zkO|z&fdSRv<@maG0$u5k2d35%#c}GC|8`6&=QWXrQcWU4az{3VU5d#ow?k*#%1Trb zbBN+=)dq_Pw3Zz{zXcstbrEsRdqMU!Bc0A7Iq#(ryu3{{by~BHujh@RXTT-k;K$`9>uhD+3%rqD0*LC-BnEU7Q zIA6ROi^7HXX)%nJbYinxz8CYEk>qgkm_NNiK$R&#pPcw2aT2{TZlqmX-W-NijFi=R zROW=Ie^z@{M3J%cmxlOH^<#oJn>w1S~BmW@SVIQtv zj{~n>pp#83o*j%&J5m-XiMb}24&OqE98jT9gDPQ@K`qkZ7BKdg^k^31g3fIpYM)mS zaW9&Q#23RqrNR#4=3k}7NIPB_jnXp6)33|TsOGKW-u<>W+fb*5z_T%mLV=2%xFLR< z2_IJab)-Q}G$g7>GE3236*iU{OwiSuGo72hg{Y)tp11I;{x zwEESk!)G0c(;Q33=mD_s1+=KSYJOF7w$EbkN~`vu#Yq!3q59G!Z^79I3yV@P78Fh* zXQY0MC?e`LcOUk>YcaHTK3D$q}c1)8ySXB1`mB-g~GWZ?k-zn*sms-;`8ouQ5 znbp2#TFq^w_h@02L?ap6(W9=i-LD0c>0@e|gNc8p)%K97PA1;|bwl}Am|{^tV;R2k zD7F5KVE4BiZTV*2NhAMySaD2)G_a~fE|1fv#I*lgj`w4B zm2ZVjLrV>1$3XPOMbm3~T0^%73XZ#_B;-WL`&S+qP_6FWcXFw2KS)pVGx1A?KJlt2C=L_`X(EmA>C63%nl zO=xPiN=};Mzq`)*J2ML>LRF|VjCkVbs94rj&{N8@h@sBC-R&}uabL>k`dlt%V;Veo zuQV2fw_9SJ+1s5^&@0(DK3|(LF{^1iUej1DIcYNMY-)m)->M%`LZB%*J-Lait-G(m zR{2xWb^5nl0hYgXl+rj(=9yTc>7IGeA*mLt6Y3<#8{=Dl)JfMXilMAVo*2^-0u%~Q zT*Vz!16;G@k-_3f9;I9Btb&={K(Nyxc1kcl^4E^nPY6~}xi{Q7f2~a5etJ8?5coZz<&JWSmvB1>gaCiQi ze8KtKh1Agw?F0@>iUG%#IUw7PjZ~i}r4QI$L*{opnVvAGLdFm{EF(nSI5iy?R+aUT zub5NgBuoFCN1(rH!7r0(MfvmJYWbi45M1*yC6E+Kv|=D1-P9mKELgKz1M{8|%{!xK zr-7iOxuh+MTWzJdIhsy#WjqJ*k%K_skjUZ__AgE$ulW-MABRC7NQ?3cBX`EC=_>E7dEfoGq2)zf}Rq zly>8z^JFVzwT6%Tt_t#iCd^d2s+*R38B}~li7Jd)s7C@IFnsb>AeR&9h0}Jn!@<^w zzCI>w&+dzujP-ryaYsMb9D&z82e|#cH86UUe&AD-U>Z+LsMvx$0C}jK(Q03m9=?WS zT@^f3q60Cc_A5M7L&et%-5%R&m3!6wmGt-yu8La6t-4K^O{KaJd;^tU!t7qv{Lw|G z6G8CnRE<9LS7IzyT2tJ&eN8ZHIU$y}k(FdTwgPI8$e%sCdr`&7R|-?xGc;liI6#$A z3GtRaJV@6qf1d_d>f_7jL)zRAiErMp$)j0pkE1Ylu)poeo)+$n;h0|TuK(S^!20y* z+OLF&hHg!I0K5aP`iTRicy*XoxFMA#D4I<`cpEOWJrdB}6X=pul`p)nPuPjplJu)v zoj&}8RY8}T)P@z##5Vm{Q=qmG{%k1!<7_~4z1y`>JvRAXDm{CE)f5EG)^?O=yg16a&bx)Uqm2=GRvX})=+&8nNlFCVVUHrbD zWWLO%Oe08;b4=vN(cq0F&F1Eyzjrf`{ zx-q;f|BW`266MS;HmgbJk1kAIZTIY%l-ilu1=m!#5;9O>vo&+o$j6hdOoS;rKw-Vq z%wHVjMK1W5b-Y5Rxy@<%Clc%iWaS+8J+`gk1atBbK8W<$^&)PxeAun z$xg#1!Dpl(mh`-WiW^Det%8S|wuN?vmv_e-9|77#qwiO|{wSz<7fBpE1kVzHp2E}w z7G5_)F&>CdOCJDyJY` z?`B=%Y63~mHQ88Oh4p)1p=6nGBva{swO;ePo0^@XSx85Hsa^PV9_RE*#KZ#BF+d>S zmU+10nLjO!Y4U?CeHd9m*e5Qb+x1nP58Jz85sI>Nfzi>*f(tDh&pXG@ZW&wojRoDR zqC0m2*G{_C>#&Ud^sA(}?ezRBs}W}Wl>S2g2+Ex0zJVL|P#=Vo95JB2)5o*tA2X^J zc`t;_js5y?g7YOd|GCMnw;kaGLUV{Z+(yu#q}0`Zr7`38n;~#HUATA%*C?Gn@L?9N zlp0(Af$7$4Uyz8p>cuwI=ii%{X>Wmrh&a;sqV$)EjH@@wt-+O|M|0)P;uKe+MOXm6 zsc$pKo8h`C1CO>}zcf+uIRQEA|`~^N zbb>T#dfZ~9QXfJpa3aT__PVT68Rggj3@AqS#XQ$Hr_8Z2>Me)gQ()}3W zx}$EbgT56E^Jg@&I)#{+awhnAYRi90KEWUxW&wPPup$W?OpeW=flHQR9gI!FVRRR$ zAgnJoWA@!iC=6gM7W%r!wKo5)c_^t%BkP)uC_{O;yuWA#;J3YiO*Id#QWR|}v4Kg= zFSm-*3V=lZd(wjlT2HpP&aCvxpps6}x^aQhl1NC&Z`3NaKvCIl87D$xtl28jb>T|| z2te%Fr8N?d6I3z^=ac3e$ZNw&RP)KNP$8KI)H$H(k7DB3)cDR{)SB5Xr8(Bo4P!ZX z$yLf#<))idBHUjCr*{_f?JnV&P$6tyQFlK~owAG=VM74g&}X;BxQ8!T6(Yf6YBBT!t{pz^XllmPnY|a%Hkuk*BXYcpafzs* z_P_zwTy(ogNG$0YKpI$mU3~TcXLs&jB2JeU1hw;)!qbp3x7QxtIqq%f3@tAES#G+d z4&v00axcs+qU>B;S_vRxtC{BN5MHWCnH_k`O6bw-7rZ%sv>uS5%4+rF2^-nwi_`Bp z54cBqB3L5k+#0x)mKW;3mVN~a@xqJcEW;VPlWz^js~7Qa`*P+|*U!*}=7oQmMb>C5 zmcc2NlF?B9iT%iR!3VBGu31nJ2%TST(q%4-v=WoPdVo#OEh?dJq95VqR4X(}>*dmu z%cl+}-YY9fZEgJRLr@qHXY=0u{5DD8m>n4^ze%vMw)aYQ z8#Bl%xwB`Jw@ccm*^2yC--o>}@vDxmLh{F=?|4x3=LSiuHcTj3RA7jWnF0L=moYSh z9o)Oc!4C4uC6{nL>s83o*PPyi=Bu`mXT93#Wj`;TT>NvT9Bb?OF72C_t$DOwg4#>3 zsRF3-=RgsV#W_J7R%CR4;iG%$4HSb6sS{shg3{2t_Hiap zUZ8iQ+Mas(v8JIc^mIxXS~e4<`)oUz@1};5liPxb08}}UlYg3Ql z3N-GfVyB6*r5lZ72Q$!p@VfrG2V^1F;rC(dIH{B44sy5%J@`SV(nJwr_AlJy6CBD< z`qc7~Qp~~t?z`9_{$3m=tM%kP{kl4{s@`tgLS9ZX&BlDe*T8l9WVo7yr;KmdrAUx5 zG;*ekdY)j%0tFB$>3}fauX@@^y&9wpugTq7d2Fy8e5Ymyjz?NObJx6k?o{r z5-QU@+d|XmviNe@nkB8#T;r6saTVQxVXSiHKs0=CNPcVogE(%;m1H{B!9u4c=fx3! z5{832F`aXq`G%@rP%l*Xfo$|Sp6Vg(u=e#`F)~g{`Ymr1E$yc!N)2}>)hX=YoiVuh z{4byN??y{w9$|O6RB?L0+GC3da2g&C%FUZCu}W#@Dp@0 z^pqz9lAK7bhFe$Fts$hRX%GCMM+F4|ra(OVxsrgAEMW#sOqdW%jlt5CmU2P(m2u}l z8l%w%o@;s&d>+0|8WWZ8J07RvaLvnu1i2^uD4kd!%CbL(c^}n;<>tpAOmo$7@E(9V zoJedpWVwG}y`IOw7^+9@jpa)TQ;!%TwH%QC-1ifv%x*{{s2JK@q&-_AGw$%21o9S+ z!6}ne<Gp8ZlbbiG+(Ut!-MvPh?4@to7ogHXD14jYY@Z&_ z?g>af3%d{`kZY?q&4P&KPVryUd;8nHX2?A2J;gD%(t-wdr;u*V!1BOP$EV(RFX!hpEPiVu1&hqyXQ7+-{n_O`Ko){pBov z=Y^Bx`5!!+?hq8lbs&g+bQ%bCuf-;#NF$>W1{tZ&u@39^F#$<6t6@n>Hj{lb!BaU~ zXz1uLyr0ygq;e@7V_(v&yFYk`?gE*~ZbkX38yubLveA`7=6l%fleE!o?x^z=ld&pX zS-A511!+b;1yy_km_nB^+KI zs3U_o;-E|4$t{@)t0WE)ET923KY*@JuV<>qEZsTD&lW!;Z;doyBdm{wET`}&;54}V zJh}l7j~wm+Gn8|`O;;9dK4Fzk8;h~aiD5Us@&&`UOQ|*zdEv_z+6uN0f)A~jtC4wN zVmmoWx`Eq3EU&5!jo3cPUe(;>jZA_{1Wn#_K}yC~eHzyvj0eh)?-pOCKlddOi3$Kn z0B^G|hMnJFr?XnxkO@D&N1%(3V|ynP?afw8PF->u90$Bup2&7kApowKdOHae34+d# zPM`c5kcO-rUV#{E#$Hu*zIG!ZKCM`xE~}p8c>RYn&3e)o8D&v{Kz7<4F-LJQW|;Cc z^b>wRgM4-S-;w422C=bG+(LMl@qP+p-z@23?*Do2KY;f?r(1syoM|$^;X^k(@rT3< z`|lfo-i+Q6xIMaZz=u8%)YId)xh){W7=NVyKKw5f^*^8W|GeLS@N{S&>J2=aV)G*+oDXj3-!(P7A|eRhMfCfHr22|cvvxk z`5_AWVaf!0kw#OWMM1TlBs5F?g%yys$B^eA$}NyzReoIC1IgKE9;xL~G(mCQXk1!F zC6(k~HH&2g_N5^jqZVGD;ey$71LP%wee&I+KAA|~_yFbHez=HM^FRSocw#t}`a?Na zFH5C}+EPnBPCFu1kiDAx7nfR%uF4h~z&RSf}>S6WJBrscw z_~O;4bzLiqreW!n*_*H18jhZK-Hg?&1Cng_Y9bpH;c6c_T2SEy1Qw}0)y88zK#;bi z$MMre;!nTKe8N?932*;Bqs0+0y4Hc?(^KpOELwn@PKAp0S|z(pMpAN5aG|cVRCJ#L za=xGAz{#~^lhvNTkUoavwqM&8rd-kvb8Z*8sJ(PB=IFZPe4+qqi{1V&tpHc;Qgguf z`!ziWlI_K*>$2*Hd@mwGmtf5*%ktj^Rf$T*X=y%b1gnN zp7p`Oh(Jj~w|41jU!P#BoC~0u1tIJ%-``?j2SvAcam6R}y^hOHsD@It>8J_3{w2d` z^t=258eOZ)0DiSPp}G^Nt_H8*xnPNm#-Fg|CRMe}zz$VY`#E`KQRTqtnbt;b0LeSSZV64Q!Juhf!4E(#Fp~p3ZKu zTv88~jE#7&)dNgX%P(V6i-;G5K)b0`GH!$*?h;h2&Rd1V9Q)jY3vj2QvT!l81IO~} z4cE0su|`bxhN!Z}?RgG47;C+-$VGkoq~Jjbe%r;n{|PytDG{0_x9@h+bKv+=aaq$( z?A4GIELZyQEA6|_fQZ^z#E3X=J5vv*nj=a&<&sJ5g0p3teiVv)-$N$aQ%7?v!Hx-i zDAGbj>EyPWzV2``x}Q(N^y-*?U&ndCAbs=i)mUo<0_reIk)qbDp zEmp7>Vh;J0mRAmw5y=)q;|TYb0#w7NJ9vSz4(qcZXo&@Uu7GI8Ol!GFSLL2(ShWpr z3U%$h2;y=GAP)8HIefX%wK5=5#<9-({OOHs0vqgO0hPU;hZY6Me=vc_Nifnh6(RkKP& zyeZ^!bB7TP7b3+LR7cjn6!ONKa$Qv`+J&iT(8PjkOXO5M45x(QFxerLTNnGpOH)2%f# z_;>_;)AG&LrRX-GAOr_T4>GF>RCeK_S*%9F1gO65wOHeHVY zt%Ey>2o~utNd#gW);GpI(1CoHJTZt>?W^JpZEIvq`ON}G0mkz3>$G`flf#+6k=Mow zJLTNrvD}ZZKsf1A_g^2GLId=U$HYltq!zaaoBG zDtj!%z|x#(oF~Z1*9+6FUsZrPE|k66D@Y?)xJehrVuXSEi`l=5O_*@FH+bv4kK9=S zv<9PqlQBX$aKr@~JrR?-T;pJTp!`5VPTu4nZKG7!a*Yh~GmB_ym)qmle*QuZ`62~K zs#4(t35x3f3{^f{Fp10IAFZ%*k(}nYCJJh~FJu4-mjBEU$IkQq&%9``}8~z2`pC944iobWT zPt5ngu&H)6?6i}4EcgikF0Bmg7JNnrYTNvTMzg*n0zMpiBGJW{R?Bq_Kn;|P2=*Fi zAPvSJx{CajbA@n2az-&P@u13E9Ei+2LPAx2v=XqGpGj4m>yNSO5k(L@pA{aj*nsFe zM6Z)?vlRxH@V&3&0%jSKa0?j3*2i<^%i9f~d{y-{0=jGXQ+Q$=zs?U=GV)mYR^FR` zTk*nCNUmX00Ep@CJ{;FmEqOmsy#M#Qfo0kotd_Ao_+}R~u|M(c3%2cPr`X3o<=FCq zDBY#jk^czAiJJnnjmztTq%D0sjB$AVNuaMO7i{MmIcw2izMh zNM8@BU~5_rg<14L_M9Hi=w;g8{m0iEzHLz!z9$CQde-N&d%K~SNi7*P7D#3z4tJ3z z)p4KOn(7gX#ibDLf9(YL1%@#!$%Q;Q)HiKgN%RqKIxI1p^xe_l#GZ z@RmpvQANUMD_FLqpp z5=?VSpnu0igz_cDF#XQsY@Y9#EnErQiayY8ab9z2un8@f6+17wC_4!o=W>n+1&-i* zBJJeE+IVM{^L||d1r#Z{%p=6m2gJ5wa~L9)dlB4%Q&Zv@!q>Y8Jy3?vf})_dz2+7c z5zBHz-_LrwM9I)6>tFLl@^>8%L+_1>^@`zOxAF{a=z-vQUx)D(+Q=r zEf9~NBV~^W9X~WQpR{@G!hhuG&m;GqL`rR6K$c~VbW2`0I_Id>fkyEp3Q8gu1V=5C zBZi0od=AWQ_9%`&xBX(9_vbKn*j4R}ZUQ=~a7pX6pwnpU&6tXkC}RzK`HjiE&BD

zk6rlaYsCxO)hwR6=wa4RTjA*+B@ zIHUjHM7?W|{MBCV`<^^5FJHZ#(7-Hdefx}^&|f!2dIMjBo-J> zWw$DJ0PTlE06g>DFl7W#bohDTPmWNl%>$l(SoCvQ9r>J-DKyzXx_2~lDv>%!u&v7> zm(x(7=A0l#azIHYrs}6}w4hSf$7wjIV60Fe&?6&gRwfE%0}}yNP@uhqS)3C_XAZf} zs;V684UR_0PczJbwM8zSh%aeJ`aLE<7I29fwO-vJQu{~t90)wwzXV9{$P&cn*cePv zXdW0qzABe9Y9fIkjEk88f}_(XZ!O6q#6oX>bE$Y~9v}hWjv^x*A@!K+fH{W+A$a4E z^eYk?%UgfMGY~B~(D)ntXLLEGW5Gey`T1e_;rMnLcKY7*4YE{kFc%HOI_d&?f!acd z64D==ZEEUSEWcdsp6}zweRQ)vBw8Tl)tp@_i#!QCKeSMElu zjm&vq0M)zl@EovC>WS>1e(%N~l)p`4MOU!A>U8|Ih3X-XP2zPVM))Ic&x^}toxN`D z!o(q?TLDyIqZV6k%4U$Blb0Hj*j^7~L87tm&gNO_o{%VS#j!oE)qU<}w(oItZI|!L zzMZ`!rExld2&?ptcpZCD#jkdaEUcViKi>ew9)YQUYE+br=0b#&2pp&iFu83WZs|q) znhR1LrabpmGI-kmp!$d_jR^O&JRRBY*qJH$+;6e{dR9f06-Q@4ptXC0wi=Rnz%WGe z{(HoH6pGSf4SbH~^PHl$xtUqY_0f`S%C{xyca^gZlg-USb2CYYxlzjLkEX=X)(_vz zH}Brg#YY`k*(x_3jxgLe*M@jrYd}wz>Y}V|t+)4ZGt?bMq7I+LCn7h8q{nF5R;&jtW%uaaTdYM-*uYfxc6xH z$?R+7GXH$Ap^34MZbGD8nh&t48wal39DyJ$qEMG!cY*;fP+3|fr7HJ)R+|ah-l%C8 zwuzSl-~&a>wUKox7BF;9XL8y&C5^IicH^hARwQ}OxC_GpGuL~)()K7Wh~_)U>*wI7 zw2Rg(v7grIY(RXw!r|aV*@vHk@z>yJN(D%CZM|vTwl&XIB-2$PE3iey(~_~y zhhT2`$Xsr7Z0#>16K?6)y)knJ&Ps92lbp zxho}N<%~erVpp#k;OLCGa8NGTL$wa{yjY~G;xnZfxz8n=andKMUB;f03L9+9m`=~X z_na9~R52uYqI+X|dQrV?cYXY={lUJ0vt~CttSyf0dX(y^&}|JN~{vH`y@4P)|PV<>v?jv79Szy zdHKCsaGt{g{I*dQP@U2?JiFKh8i<|G&NMdRBLsF*J)9TZ#@~rY~w}oBySA`E7 zUvDn`W`IR|NqZC<%To*4*Em0L2`I@4a zZEf;1gQfcfC_P(N$0a8EtC5*j1!U9mx+&W|R^k(gNQyTow=_I)=6%Mh^@8__mlU_y z_GNSH=o#%Rvyr}7-twfuf3Clw!52yL zg;Khrp>~Zy{UHVE8E~ABTs#Ew{`*>`dHouv^GzWe)G@M2l5&6nr8t%q=1Fjk5ovBD zsmT?9NtxiXW*^EGFj5)mx-o7iJaRm52pgdMLq~GlV$Zd}_Q#wbR^?%Y$>p8e8h|9i zCn^Ntsx#t(+B^*Psh*Mz1_wL}Bv-Dn)md1Kv!MXK<@LI>T0o@vj437VYE`N0P(tySdvj|*l> ze$g6wd>3H69JQTh{n#}6cZM`GiV9X(-pn<%TJBTvcn|K)lx8By96%3{z~U&`u3`Ug z_O|(!vv6B3GBPp((XC&X#uw>#wtt>x?htQNRvv@4oy#9695>pR2h!|_J9MA+)z3JM zSMJhqcUx4z2M@a$Gwb};l(hvsYmEVhAk|F zZFU{j_2XE?LjvpOd)q~tkE!T&r4OIF@D0X=FOK)vt6c0T)3&(>bhe~yFy z`xi>1Z#L&F_big(t0+sxj%HRFQ{>pzPKwiO7>&Q)^-{Bta{Mq_$g4m+#s)mY^b!Ve zp}~%`I4Psv{^yH^-3dv9xQdv?epZr&sNaUx`WjdpQu+YcO7VHp0LB?MwwOqrq$m@U zi4~mypTP(dl3PVe7~jdHpNVb8xd3*yXFThxfaullY$#87RSuvz9VPgQasJVbG|Qy| zx!zTr`C;YSp!2E!ehk=Ya1GG>=u1HaK!38av=rf-hY>%cYr_sJS}A#rXu8YXo~ljk z08|Vg>RvuG=o4Il2clHxvzCbK`Yd$3(2PuPVxAdH31(l_=50i92 zrx}1`f#gEXC_!m*Nwp8A?ldC?q(hcftb@;J8R0eqH7+Z6MP~qkx+H&XF5U&)ki$a^3qw5Fp!nb0aI@ZLMEjnit zpDuS~&~rR+u4wJBeNVwQ^P{N}Pk%(3jm`7n8TaS;9mnr4_27-bo9jAX=Xt)yMV(UB(Di3_4-7*4jQi(!2KCl_ z09iH%r@@YYGjBI%0b%I#^NN`bxy^>h6Vx+~ZZ-A#6D_%3$aagQxpqAm^F3wALYJ-< z|93r7;fbdk@<_d7WWTHS;nMy+)|D%4&Y4?5t#niS&P7gZYvhtQ_2`-M=l=~t|0X>D ziAdBxsI@w?1c8O7KME~Eyd5XC2_od@-hIXnV%eTTb*CTbQaKbUERKh(-is4Ooe@z@Zsy2A+H+Xa6K)m?{t~d`6vEgjP z>x5PtLtb`xjJBx}nM9)z)$zpOW+!)o@0*loA3YK)e$)~lQ1Xt{610axJzke1ZtJHi zdrct}MqO>%a6f-RT)O8NN{UWOCjR*Ou0i|!xD)#$i3xqNw1~pDuA1mqsM;&@+6nS% zLni1~c0TYYJfRJEZzcghp!`+kis1SFeF6QOG?%;>D6t@2Lw&q6LIOBNMeth{h4z%r zYd}Rm70%TdQ);2*F29|nwgTlS9{dIV)aUZ5=WDpaR>s4`qjkiK9ez7Zz9RMQ2c8n8 zft%gG?lkk<3-qhTCKq6d33B$}S5Wp#@&)XUUgLva;VUuow@V_|7T=E;XtpXbwTDH5 zN*bdz`!cOEVBH^tx4bnQ|7(YWma0cSVOp z2dhhNwFGp{Zk0T*Eex4@YB{C#{(|xG%hWI7o_)7xJmm@d51S+!u|zzBGJ$`{;gpG9 zkfS(u!oskn5n31U-0A&u7d_*#PoTArZa`?sa|@FQmJ_GJaLqT=abfJ!8RvEZmylsQ zsw?c1wyd>cIc!j+vrn*R9&6$u&6O+C?1;_R0{s|XU_09i%P3-u=Hkz*y#vm&+i3AGSX5*T~0RyB4$5n34+I6CIW@al%$lb1!jN!cKs_3h&gg!)^ z_ZM|Ww(Fvcxt{9FdCGGNWeulewIu~dQ|E>!hko*# z>bALev3s*FC6}$!)B`NyjeD4OvTtHQ;PAB~5#Zi;QnlcpD2b88(r@>@S!>6_4sWGL z5M-1ug5MIBt{wsXMQ;~Hc5A_r)HP$lI%-~}c8jA z1b{;M8#BCFH_C%(Z{}#1{9!k*3^(Ex%ZYAv@!u|a%On65p3SVr;|3)P75e9+Z(T>6 zuWP#Bs=9$5NC@H_jnziy9kYxG0O5#GwRDoKACh*Cqa%sHo0{ zadqC@(ig+gM6|%bbhLp&TlEP9ZPHV~)8^|BU7@mv_{^HTweJexZOgm6UV7fFlCcjs zJAD0Lq1K*qd6Qb0>@&?JK2Pe5B2!t!fE``I`jizA_1dxCdzjru7#(2a3Uc7Z-zuyp z=ut)w%)L+QyH>wofY-e{_K3vB3{Drm1a^MUfR>G;;Kg?!)2Mu*0?X8YRc^n1wbauq;T_C{cg5Qo1uT9~oz z9PYlXK-_GA)SDEsZ^@4QC40E9C_P$Lx`!Vhalb}`#NTj|cc7&HbD6_=ZqEg|1Fq~8 z-XRBH8RpJrF3IpCK7IAZR`_~&{KD^!cz2!}DmXMIQcn4S-_8Twnt$k-Nlq-saK}xr zXcAQ)y?J9B5KsdCB9{Zli(^-QLb^re8|G{JOBQq9s2 zHw#71tt-#p7s8|+0D>>w9tbEYCT-j20@${LHoxB0@6q)R^6^F)DcGmgn6WBCrs6fb z#OPtYjKH=!Jl73?Jm<4jP1Y{urCu8-MCx%0*C3T8#0^xG^8&fzK!&Sfns;BTXrkkL zYgc1-79;KKHK>yZy?WEF79VEb{owWU5Eyh=l*YI#F*-_k&9I(^oy-esaEF@}M%h@h(p z+rGp5(p%by#j-x`!2!%DivNkF4|GO0;GAR$@JrVJ0CTb;&9l`|v{A~`A7xLPjrH|W zlbMiPcuDaZV94nlNUgX&bkml=KRB6LuLYY-X}l)~;5-k?Q&3C60Wb**hseE!dc#mB}ki}uOYOsyFbN|f2!`$ z%_fkppH=Gc2(9#{OUyXme4z6yTM=q;TW`OP8yGCQugzZbb0|pBnj?T|HtPgvU$gWB zK6L^q(HWc0vA5?(NQk#pIdn(^9E{TNJ?%zEAIg=u_x*3+z)Tsf3@Jo2bbdT zmJ)z=;TEG=-0lt6J0JH-QCAYKT5MhaP-E4*v~0j$?Aa2_QRrppu{84h-ke-dMPNy} zzWLn2i=iR$km*{$(5Cx^2O<9b1He}L^{a=lRQA2cDEVEnEHeCvBR#^cF^o~rwnCb- zO(vZjq&OoJf$u9I>Xu2j5nMmrQZNsSFdH*W<9AqFpMF-ekUe9;aoJa~&TygeTc+(s zy1XF*++ zouKO5(c^~V((cB*XR`m@p8vBH{v{8u#QtoF(en1^>pa7c$tK5na>=&VdyL%y*kGuy zmyD!=y#!kgF>y;&`2I1C%aEU~^+|oP3wsI`d`)vle8;n|sMGPbOvSjHrOVHo6Tn&3 zd8I&e?kP_mW%g?o&4{5SO~3$GMOEvhvt36n&+KU!j(2pBF7$QEu6&T?wFSc~Ezbb@ z_HSD0(=CnL+}1uV$CO>4)HMurP@Q65(ql$_*jCu?xV{equl5>=ha+ER$Zy^`0&e9s zhHbnSJtW&nOPupb&BF=+xt4Oet!g+NO#-=ex-P{Ce_^&q2%PDfCMFNJ^Z`3?ZHM(D zp|A0Ww_jP3*f1{s@o!!83Xz0Y_LmUt^q7>P{iovL-RAjG&Fd@5x~~u+)u0e8;(q^P zR^fzqsr)+8mC;Wl06qL~ln0#K7T6NmlGu{Q;1u{fm%F$l)$(1a_c#RhXyn*l*54U^ z#Kcpu+qEZiZ(KIav&Ma!R}mUDf-mz0DJUrD;FL;U2q|ANdFWSK6X+W<+hjRV5J5Jv8KBh>mriMRmro$R7H0$jAu)6jcnr$=gN(4azN1R_@-;A}3>EEz(+@2j( z4c(h9wiUi&?~eWA^XbIetcg@jZch1bMnxdj!ZAt%4Bcki(qd z0p`RvwO0+j*-@&kcfq4T@P{bvWh!VgST6U9E(0&fEXBkO8ZJrNS(jl0SeB1&t__bG z*h53jOjQg6U))*naZtAl-L=R1Lve+PnoB?0PkPx=J)W0qevf>1+=9)D8?+y@?AY8x z*fxl<`Qo;;MI8=bQd?WO%FWB{_B^nP>SLoHc1g1!3(h@AjV&}ns&HDWmIKeA zX9b$Dg;kkSQ_8d?10iVHSAJ8rCT}Sf=nnomk-64GZCR5MTEwtq<+6d^wTVU9K$LQ` z+pFr;s21W^NX--K4=BVZkv+1k{M~wxd+6?)Ez7l1N$^UBrd#H#G49A8Ff3r5$#AA{HeTU)D+;V{Q8K5D;mRge(J^CUo!rSoD1ZvQ~EQ% z`;ImOKe8G!GSu~#{70S6@uJCTh0t`n0QDYu&bGCRdmsaw=_ix+dOvF{tGefjLBt8L z*4hu#;v0y{pNM*qn2&zl*XZ7QH0uche{5C?<%1jCE7(qZ z;U+9P`5O`;)#g?ec_0Z`OsZP-LEL| z)R8&%Hsq4BqW9d6l=gl;A?&KM;ArrT_eF8iDdc#TvhG(-$F+r*cinW{?hU?N5n0xx zP*_>7q|It*p%FDIW$g9%0~fPXsSww5fP28j7d@VRJ91YI%KoE7|DiDd#z=8U0DkJJ z>&XVriy16XkoM12;%Vpc)^BYH}W{l!>-cMqMbXOtV@jPub1&E zT_ND_GG~el&i2p&QLT9TOT*zT<+>qVPbKgA?S%P?K;3q`gDWnx_wKVNwNSTv(Y!bB z4qE>8k|u!=&4ra6#yl0j<`LkeHHgY{zrxdezddY?DO=DiqUUJTn{{NG-Z0KvY9HlW zS=qys5VKF(W!G1znC=>}M)v@TkCP*4OcS;iCx`69)KeUD6tD3>Y>zOhxQq49szIF3 zmo-ykvLZ4RUCikardqC<)^O#Fc3(ZV-#nuwRa4t!bB#2K(R=8xu=2Qp8&e`wf<#+5f2B~9iY18n-qhqx|DTynMD(5FF9ZZ>4IuQJE zD=nTQ8h&c`$3D10xc7{aOS0{yh}ci2(AVlFodZ2*kTw3HUOx#$`l_LQr0eutM z8@I)2tYz=pxY|N9McQ3=+x9T(0R^aEgbMk&VFq9?_YxZ3bn>G}`n#o++rut`qx?>H zZUR?v6ar5>dxMnCp}TW#9&L^QxuEQa)i>zjD&M!%mVASPYe* zA8EJbx}MY>;^Xq>3zq~iJ55Ii3%ia8`qO4dzcN3{J!T;5{kk(OGMf(iPV8<=&&pl9 zY~PGXsji_BCVBNlbt3JFq>^i0*HiFYqUu3QJT;`P03tN0ZE-1c>qOtDKj|m4-7-{ot3RP)buvyZ{PV4;qsFFRBL%wE& z3twi-r6y~;^!49q73#Vn$_DKBM=lMoF`bECVf2)l^3JXMA0_>F^5s9cL_UAW?`Qq5S301xu2F zKiNPRr4coD3yX&1aVWVgkXpg7d4uXuX}CT3v%GK_pJS*c1w)$yLwD(SKl87hV@)=2w$0HG$j zPzq31ciHrRST2zxK>1l&&lKsGW%to>K@t|+bUd}Fw|?;0*}4_tjjF6P^a&$9S9G&N zU)Z#w0(Aj^4R&*$M{&|NfYEuSqGHW*IP4@U`lb#}BbtZU2&reV44C9r-n1g&>>mq{ zPh@Zk4&(V~TaU&JjnD}sPv)K*eC>+}oI@Iu;^FN1cb-#U8R2F8E$C|sK4GQmXiZmt z5YrC$X5%`5G;$J$V0DQ`^&~~JZ~^$BJ5xLC`kc0{xw)3JE1EZeOCcZ^54{4I(^a!3 zzb}zkkr}Ywz0=$QCKv_SxSqR+9$nES{2DcwLh*a}FZ{?ieM!k9S(F8Nx*+fw>sL1! zzGGneOAMJcpM>W6ClpHB0n#bM?K|{-{rJW^>BD{AL7p9UNnN(PyY#3n2XR~5_`(~& z!(uvDuDWil`2Hg9KA_4yfbr6+^dkj0Z_BmKpMPBaC80GjTC zr);(QY%vKjks+a0P)dC!F>Jx6Dx}E(>Dh`cokrjPMWA2^Ll63Zo|zxyRihBp#p3!+ z6Se0vj7de=7&CB3bnXpy+P(o_22jYg$~%)46Pyo{X36Erfm@5$&6-Y}7t1KM_mLj* zK!3b#cd!I35%l0Snnff$kUXI*Wxd%~wV?{_rKB30j=JjAK-9)k6{mLb;(M@V^2Fd; z?Ub|L9VQoJGxuf_qm2(Sj*I-z{31@IQRy=_C56iwLz;1A?EfsaPjoa77xy(BhE-lw zmXhBzhpYTRdS6s@A$3mHX^XfnH~3Z-1#%xxgaqdZX>BNrqUTSg;FXr&s|#&3IiT~D z_?Uj??%O#zO#GNzs37|r2aI|;_O{~;hc=eBQM$P>Ir$be$$`Pmj(~bngGjSiteps= z5_xR6sXU!L7eS;W{-~5U4te=VJeDozy6+Hl2%&(L^ki^7ji$bMp(W9NlPQ2wjv{l@RVi4wUO z#dWSVq^4Cz&uXl^q&hKFuMsmU2fbydx;QBrFjDs_WZM-G{6LvglzVjE;^eN;b79xp ziA%jFqtugA#jhRn()pT3utavOi5oQk{FAH-ZkVOS2FCLkg(W!S9_b!h1QoZ)aDulF z`Q(XLfFnG?sGl;UL$#4nCFRY;MLk1~(3rt`4;&Q#w)3cXgj-)>=ahdK`1Yt>@HjbX zw@dY)c)>fKWW$m5Vs=s%^E0co`=Q z4FZSLhg&S-m-T8dCM|L(Z^N>=5;DGx>}q-=Nw3hK$?>D88R^Qc-DP(Vg)A&8U!C7n z*{b9xH{(8BJ{{_(EIs2wL1^Tnz%OIHh$aC8*C&gMqcZx;PQMLlU!Q zq!J0=4NFl5w7c!{WFQ@xR-)~{UW~gEWQTkTJ*OBSD0Addjh7rV0o*v6Jsjl*t_WTJ z_5#%4`FmMT6%cC(O&9q+iHaE(YWm@cRQav~Zg08m-p^jC;j6m1z1v0@2eMjxwG;Cw~BnIMxt#bnT{p5RLtj+vxGq1(olocU1+N07+|6 z+iuirI4y3IN1v3$fApO_uruV=Wm{sw?^{kLaCP3t_^#2%m6b=cv=NwED#}?mvfJE5Y^R@)_S_+sJ*YAFHcl%bDe7c8xI)blT01`Ig2WeC<`IE6ZL~IssH63A>5<}eG{Y&yzn_~fh z6n(SmbRHRe`qUVZZRv#{$-El-Vnj>BikBlFtAY|-|Hxj2FF8^3`&<}l_hOD?+0_@R zVyfN9tvN=UrOe~3R3AGN9UHu!`UYBTssnZ6%$I$sYqr@x1T3_q-G$Mb#UIV{905&S zi^DHGuo?ylWW~jH<|&pyZsX?dJF(9~fAJehK5-p>vTzE5&Y>^nz)D-f;zf2AgUOMH zxR8<}{i9tE_VlT4#nbw~dAqv#uJcmPRxC}Evn)e9N zt#Y_&fC4E8WGs@8*ikp<4s+?Cp%(sgYqErFBaVZ!4i{aPcQqxUI=T&BjJGWe<4{4*(@lT+Ri#G(L^|1ltLQ#d zQCHK=0(hS{q;j8t!;BDb}&6I9)#y0yr z0{wQ0Z>CUEPXKo#GjL~thP5@#E@C`XgR29X_|e5eUm?r#8Ft|>N)Y>nbSm9@W62cj zE=&#I-BM#40O!aZ2}|$z9tlK{M1~`H#`M;oyG3?!_$M36!c-a|SF+)rf8=E^0|=nS zwH;tSil-h_e;OCf>H6Sg!!UTrx40%}sz)7%1WWNcfP9giPA} z6yQlNe0+n&N1j<^^P>v!@fi~;K=`BAF&vym+LzeLa zm>5(Jc5oQ;lD)T+(BrRA$e5z3V3;O~F*ae78phaf!xU8frCy;&B`zPcP#)!jQ%7!5 zJq7>Nm0l1w^tWfRhZ^W}k)hC!;_d>AC-`=3#^+tlHT2bM!lnurRxu;iN9EU#);@wh zm-iPKo4(BGec(LeW=l9kHAq+X->A6AmlcOC9b46eq4I`)zu2*1rH1DPzaXbMX}M*= zOb1R7#`pnWgZ!03w1I@d%;^Gd=n{}4v2e{7D+$hfm?U(F`6wCQJ+HP)-MuqLQ74-B zfcY6t__T};&1wVGlJDnJiUZhx&W_Pm?*UKb-~+`x^H%V_SHKeTscgp-S;lXxb@Gt}l0qT4ET@xl9=Bb%j%OYD5+2vC|% z`x;)|@IIzP?e=z4yVGZCwVVD0-`-1XN<~lgkMLb=K%;ozdnssXb8fCskJt}O75%Tw z@t+N-&O@UG>uT1p=a_8wxy{q%!J#LVC%8T)I(yp&)28D*_b(Y-kygCxMGW<~SJm=} zK~xvZrpTL>%m9e#pX0vj<-kJqKhZg&Q9~FR*LUN?@dY{XOHlAC6}uXX%O9b=t#}uM zdcCD?LvM$av>d)#c|RT+*=|{7`umPu)g6WwIvL5^&|kNVc7E**7Bax6=KZci&GDM9 z^>E%3WnIX(0L477%)3W?`w6`oJN(iMNJ7r!km6KAwdH=zyzawq8IFdAioQAfPSyvH zch-EyTYYzhWK(86$D^8Ai6;L_75zLozqF47eoJ?FsX#U&&vPh(x0M)=d*$cQ4xx&N zqxQ4Ih4=Ua7+ZLuDgw&wdlWw-Rp|yW!^}&QgUBu5827R?xAi*SY5(nH90UDVhFmOLil7 zzJh$Fe>1(|X8Nh-yt8!_)$f{W1&ynOF-`#s$F5elb|fA!wY&lZKm9qO;=r(7OiV=Y z@kr^LSbZlZegJKs&QS#6PpLI5RqAmp%T|zufvBd--DYWX<0vW@ZYf% zcZ)^TN&&+~Yuoi5{sp#tbe^vVEmYfMY4|s_9!%eQA8vahnfkj*^%?ZbqKgF*kX|^L zailN^T)qDFI}F3#>^*lPpAqrAX~;l)rV3Q5c}urqvaw3bJHvPb{k1)8M|uy2vp(^= z+XPU2-0vuDP)!X{bjg4DUJ2E@{p&BDuANJ%EYYv?&s)8JWSsUbjO`DzD$bKWSo4@? zynPFK$FPY;Jg#?!(`zDxLGWcraDgGelF2<+z5ob!J3;Uf1oF5@TDTXlAg`k0@#jr{ zdxX5v{eA6rJAg-TxQtbd$*f_W63HK3mx4s z1T5SelGty&b#@RtkGaw;-;H~aIou8)mANn0g8W~1sunO@b5$(ld*V-{c=7(cH+#t2&0<>bdJy^l$iLA4Jj z;b2SX6P{s@&*MY+cEX0&Q8`iBkVS=0mQl0@y5(I9r>u6JI`7qMOe#)<`hmLHJ0zp~ z6p4z&L=e|?6Nb?TG|+)}3j2nnHSukT&o%0^2N6xKnOpK12UH%F9N5wW{8sTwH+4B? zU!pk5y_p|ZZYOA!fkoIRHyTP@9!`p6|C3CO0M5_>MqATKZc<&QVt~4G`tB9|2wfVw z^uK&j?t^cxy7%Qg)A&wZ4$5~l`WFPKY-NtqE?rw#W}*f@0|^3|RLwm-Oq?#b7p1&m zn^Tu3bA$_CS6YC;y)a9)O50?2=T30P*Y4c#z%##Vx98YfcLjj9lGK{}jKm|4*L6{z zeB{Gd!ljYK3W=dm*3fuiha_sbNIPMfqnGtmePh3sfc7cI2du;-FNWK{-2KK(5@)}$ z=5(K(^5?H+Ct`BNYalt^C4)usBGyiO;A(mD@BQL$%_Yl;59i`DBy4 zCVp#TB%BpzUP5(!Pnr+&b_o88jGT=Zk_4fz3d2vH?v`VTrTjy>_sH(M&FTRCz3JrF zuCQt5rDsM z1&-JBr6*{(<^CyQ@t4WS&8e0GxH-ifS^Rv((i1c_WszbJCld(!Z>-omn`#$!e+c=+ z%799UDQ0u-j&T1&JvM%zPG8RkMj{5)1hHmqH3vLQmAQoU;OmG$wWCJILkn`+<8L?N z?XixAp0{5ibR@Q?EXC|1#0td#+R3ta^3!b7i-ZeBXMWc&>U@-u-L4ZMe_?OiU4S2W z-K5?wxF70h<{L`*$mw}rRp|0@<#OgfH1^Z^g@B(k+wFo=%OAV)`y+m=&F-|^HZYNh zCe={#iQw(J+L8vU2{R_AgcynD{o6LC{+`~Uqccp*R_@Sw;@Oao4K4ZdJfsG$Gc41v&IF`yqZwrzJi{8 zFY_X{cRL6WP&)e_wtSBcl@T|c@g$p?VeIH$zU)R^zP!`463+R|$+IM$O90c08)5*K zD6m0jyo&|xu(_}XCWQf@b^Y28P*x+JS__~BzH2&v%rYT8{!wuyQgfj-_B6Li*S($K z)D*sY-pRoLBM^s6+R zu5XVp&H%(}^vj)GEhy=bzXx*>Wn-V%eR2V+)N*PQgq=r4EoAd8DxvQ;m&*Wva@uR%ArXGuaTLr(qiP)FCq7WsPgARF;-i` z#nvg4>BY3sh6WfaH|*kizU$Zcc<|<2l@SoykY#DF)6Lym{Yeeo&hC6rx900v*T5-T}9?nsM)Sw|WwAB`MT|DRY(d!!^|s1-06t%f06iIo?eW{_hpa2-dQW)7&{^;lPPrV#&97VNI)^ z#B(Hro`PiM&x&B8ZFUr6n5G!n;2HSx=x5Yg_5Cjuv=#%SL!+bSf?4sqo&4o{SB7CO z>#vQ(I%HZcGynb{+Fz*;3x9-EFPNevR|`>>cDZZ^Q$6 z*0nyCQ8+!*N7X-0DM;kNC0L*Cgh9dIfi(2ri1CZ(D_EOm@VwP8os}}@k2BRK%hk&_ z-8S@2?S)*~;CA}8udg>#sTi7fTW`Y?Xgii=vb{S#9F0Kw)$K^rr@Y4EIcJ^L3x~gSV#BX zvwz1T8VBLekLg2aSL$0$&PwjvC%&17RJ@j|%^(_|XSpz6bK*+)F_ZBcIel1YY}yFY z_#zD32rZcg#Ur@C zRCuQIWC;0}5%;xm4EC4h!erRsB7n9-4c!2iseQP7P)UIJ=i=ow7A4xs;@c5a3UPf1 z^HkD8!A(Y)=Op&{F8FOHVMum#NF!?kUSrmJeUSR-+qEB1$;$`Lc)@uzjedi*ES%TA ztUZelDI-~OT9e6@KsnT)^2Z$G_uRX~_S5OIQqUK6_ODQP{mzZWdWqC9R1IV?==*?E zt)XQ&memh!;x4DE1wRgp$_sXu?nrL?JwL2}WoVlVE4#|!$_Qbl)BR6Q>pRvB+zu{5tfruN80980hkW%6J^a z@IY|&?D$>q>?n#w&z!-&b2M1F?tMzLF0~|E(pgDOHda%|RGdy8Tr$rK_~>gQYo8Kp zI)$>E=;NkVcUr|h&4=}!HJ!w;ebPvLKE?(!*n3P+0xKOEZHg~y zrjX2KQMq#2X?=eA4u^+n65Fodgr}0;_)MWU|}#?tTEJJ=#nYspdw_~NzU1!BF`ai!vitR2hcsw|%+ zD9^UGg~_v}7|Xf5B=^M&+@CVa%caSGH<<1Kd+*WZ4v%V6V?oQkqT*t6uKmi^w4=#= zj#d#hvQR+Py)A?4M}h0r%)Xy`T6Jq@Zn(uPymDPesEZM*Pc5cLNQ?8`#+KRIyGyP} zK%$mcOszQ7$g)NS1aVzc*Rd-ttmh}&93@daJ`EM&HLTc3ClU=GBe=O87?C4~TNn-P zEVQ*vRFnWi>KfMAW!Bs=HrO7UxsWHY8sl*RV%A>rDI+^7*r+<`2F2?pITywOi{cugHX+D+Hyy7Zopu@h z8DC7TsGnW;`((Igd@}Q+GX?|e)XLnRyICb2LEY2FS98gJ;Sb(G%je^@UP^2tH;;(@ znR`;?3jZU#W}9}wd8^o;a<~tCaHp7yY?dZ}!jqErroMPJT<3CxXt?lvlhWEjWXK#Q zKZ&nepIDO z`Ca)0aAjQZV40%_d7?e6W9cil+@PtJyGdMd0qBL4&CO`Hd{1yJn-w5{J9OD)Yc`;+ zNCY1#lRzcz>HYVoyEhQ#HBYq56pZ!vk&Nyv$OL!7iH3|ZlTE}_1MYQ&{2Ir0N101K zhyIA@l!+*^4=*@4{7GcOm0mv7j;@*i7mwXy8Gv%w=<&j!)mI_>0cX1s=hEYwsEKGd z;WgXJCBFUKW|G^M z1wNhhMoxtcozuY3G(_J3H6{_S1Y{k2q&7YucXZ1N2?;G+&pLS5vr*dhpyPOBv+h^A zPgm8#-k75#-^+CIVG|#0)pon7gro0l8u9S3nzEdAD$qs#%vMKuIL9+(?za@mWiBIo zgyh!iQ3Y$zXx(v|a36k|Jyg`*oRA=mcjY#n?PA^M-_M@E5y(cK-nebI8d`T{N=&S< zui~XgPt>!=5pte$blMjc_9Q=Ie6LeijVPDQ5-ZYCW=y&Hks7<<) zO6F+%uXN9iDx;R%tv3aZ^_1ADImmIN;<(x5R)}mWwJ$BBqh>6{Q_|6^!|)0oRzLOk zv;cJd)oQ=`<9V^}!#_OaoJ0-|ox;~vQ9LosVTuJohQ zm;B>@bCm@Ti{=j=@E3n`-p$Q_F3bF=^(|W0fCeexbp~*v477Z&_a3X_s+HmV~!8jb(Zd+vQ#_YdDb@n3L8`v@B^Rc5YIW-IUs$Ak|QPen@H z0-*cAi#*4tNUBZ1E5E~Zh$5@2ew(l*Z+aaxcIsPaAx@{Jyua%k8cXXM{V}Sp+-6>w zYm0ME+O`~)&8b?+GnHmDdFMzD;(PduiqNM8UVkFazIiQom^g49W=y^DThIHkG_wFI zCtoHPqfaD_QPjGzO?AI*tsUh}#}sQYS${n0?}-EH`+r_{(Q+R=B2P@6h`VkV#4R{Z z9+}{OoXIY2oH+Xbq$OgwcKN&Z+ja3ENAw1@=!8e3mD;^|om{yH-h4B;hdb+-zA|-o zx}SEo#eItL>T=DD3stCDNUfLPK3Re-AAEOHp60>p9pU%u(34evq(oPW(a3yCu<1J- ziA0hZHulW$qTa}By4kI2W=`ivM=n1I-~beTQOao}N@k~_sY*3=(W?@c|h ze>ivZn19gt(=Yt7UpRiH!Hbiq&fkwESgcgIN?DzTmP(J4JDsaH?TI!#z>Az*}h zt>5EBA=STou9RXOyAa)1d`>de9b95v z#(ryZ^e`Qc_p*#%Qjb+`r>@SBy@3kFTZqt?S~G6uHQs+nm;B-o16|y`a|y-}>Pa^j z8~KNr<(c1`26Me=;O^wW1Z~O{o$~i#;{9zp`LkgHXKXl?QI&S9(e^xh>~Hj859T~3 zI?#!J?v@gX6%fPq)HLDNFl2{+PTU@f_alkk58&F#iGH&3!-a3i9?h)0QbL7Mmg|fa>csts;#dH82EP zWbHKZC6Cp6*XVzfIy><{W+tbb`pOs+D9Mz*qpjqw(nn0`IvR!2^H%*FSq;X67MD7sePnk2TQ}1v@6p=9R4pA)}_eQ=?~XC zoOl+x6x6ryNAJ76M*Bs9{>8u8TqgGa?vo2Ry`%vLaNudRr;F|P&oe4@y>916Gd$HI z=theyBJSR1OaCx-^0goA*bQFdLLO=Ut48S@{t4VWE-_s_W==4%Hpa)Q{Hf7 z!e9lp!3n-gkH-geC*l(4OCg4%26myvijED0uL-BV+o$}g%s&>Sx20dvy)%hmAIu_u zZK8MOI&n1=*S){smw)er?wz0IeHP z^(NoGkHn$9M0vkOXL9G%ap!FZdfO%DsjX=vKhEH@yc$x8Vg_HU0-saT790K`__*e) zLe|NeHCfoSiegoY3+ee1l0~mXkO|`R8Oy?Vru$ENSp|w-Y-41zDasfxQ(qf*`BA6g z{;)uHxeK!VSrEc)>bh}WQZ$;=2Nku+ZAAaTFM*r-g{G>3r|wZgc9 zdH7iVu4#5>@$}xr=0NBZeE9nsqGjBLOXL|Z7*2kKyOV!^5yUOqG0av5Fr|B=@<1wt zSpnX(n{8IphRb1ZF8S11a-#2_!$sjDZOozO%rsr$oF&G%g39>(lY_?3A*f0jQ!BkJ zkujuNiX8?!niM15gup2CMC>oiH4|>c=BeW%R%6}iapRYH48^7G?RkMyilmzkrEJau z+9%)PL3^H^VJUp2|r|3T+DG=|FBgo6Oa-hl$8d zW&v$uFpYE)%Z*B;;a9~E1nxGEk!wNEb4n3D`g)MO5aM!-x-P#W)y+lJ^dtxZ{5OBF zqhlm-pKyC9c-lQ+Q3e>QpQeQZ>GwEptZhNY(VuNdDr`t0*{v*rd=1iGd7(&Rvmmk8r$A#-rJM$r|zP~MVI5;6*2s>hoK0>xoPs@Y6{?9M;fPGl5>AsxBMF0|U^Tu9sts~0de+%a zpb_}4z#;LYWeOA8ZFB8F<3a$cfPFJugZ}?f_MTx)ZQc6!Rsm52L{vHmQF@Wkq$_Bs zBG~969fVM%mw*TYLLeYbx)`eT7O6q0fzV4Jw9tERA=G!d&r|lf&i~8%CD)b33Ry|k zoO8@E?)x{~P0hzz5I!1-ORJM_BtnW9+flqoP2He3N<5?YKMHHGY0JNNUxF4gfowy7 z%749{ZqVs%-&a)r;#VNgpB-e02a!cM^5;OhCEGh@5AVhlEfOWe4bwEG*4IVYz^V;P(e~>I zGx>M56bxq~3p~s-po}@AjZyte|UPn^Ac*?u+7-FcDLY1+iD!~pJ=Uo--a`2`Q0?AH>Y zz}uxGJ)X<8oRHGbr4wN7_Y%HxcsGMOw~INXe)h)*0&%Ix?$l+)uLQMnmeYe6-IwN< zpItJi4k3vC37T=^=Vt^fv|k6W53Vuu4y-A{@PuUgPE*)|10qSC`!z^Rq();p)J=N6%k4 z{`#D&WzS$8XyvPfdQz7o_p#3x61L%l>T2`>oo`n1jR#R=!qpaFscUz-;e;}Jj`L6B zXnfmyMF%e; z*m90hxBL|Z0Aw)O7Y;ePv7mUmXq{xOu&VF-V#e{L)$yzUiOTVf*|vTx+CSaz4h)Zd z(~X}bP7;$sU__6_&7Kw?&{kUF&$@Y`6e568#fn&%xD8QtO>Fw1tJlh~UGoWwfg*k< z3yx>m)yo=E&ibAW*EX*DO|1HbDA&~i3AebXR0pYDYoEQY5~@9{>tiQtchl2Jn!DW| z_2K?&^~>2J{q(Xb)$l4pQRr#Cz2L6M0ZD0aKEcGQ2z_*Kf%a^wE9KnkYW{)A`Ktew zQRHP{1&4Dx?T4G#zafn^K)aD!fu6K+<3$Z;feQfHHJfJ$J>k2D2)wVjE-zdte?5%KIt~$OAXtU%v^Udd~nQ8 zoFw2U=dQp`w{*(AhEwaJoJtoa=*6Q_<(zr4#>B7!uC!EL`5Vi@ZZ+8HyDid{Wv_&( zJorriuFV?YJ64zpq~KcSQYZbaHZLhYcCMYmg2LSihAJNlFsoy#TzlE8(YA>XRmaq& z`3brJYJ_`d-G!-YEX2~4p$%NGYaMQus)R!MeI+_yzGdb-3;S!#Fws8H;-vzX_qNpB zm|^6lQC|k^g9F)?sbZ{645R7qesYjp5gI1}TA>E zD2lw{AKMGEdW?QIM*2ZZr`{4u?a4K|sc z&}r9uD+x4$14HB%bvVYB>CyyUTqdW}n4nSTlXIjzI#6ee#iDz+hG^O5;(HHf4gWy~ z&^TRsF_p}=iUiYk&BM-9W6|%`W5uZ}g^2j}v;&X){oF9R;?%PJKAZG<^%`^7E!^$O zJ)23UX!N7u^`jfBNPRPlbS^!fdilh{a-Tlr2OVc>v~e596Yn6Gz(RF@iyoG(pf9k? z{agq-+&;Pg%K@Ac#5GMxk>+SOw%0lb3Jr1n)cs;c!r~I-w^vxoaZYQlCL*{~H4VF; zp#s1gQU~IJyxoOV`z)2ciU8xlfojV7$MT8{%bEz8x2{2e5}BivZPeoq$qQNo-$K{W zw>8x^)}EElu@mbt`+CCrM zAN?G%r;H6)^3Ax9TXOD=GAyS`odo64SDb_^Z1y@TZqxrI6h2_D{x*ti?UMyy`=a<V* zsn@<5O=Paj>@R@5^J;1hx#Fkqja2o1qy`(N2$iEd6HKw&ZDsI2@SsUSvOzGx6l;0+ z;my`EUuTmSa0}U4Uvegiz6t#s*dHV>Zlv^KMVW7Mu{4PL zI@jjk?@b0OfZDlasJwDlW#wPXqeI5_Xko6RD4y_cCnEuPs(LB-EF3x)N^|A*8xG^`= zBC59Q6QoIW=MF0Zun5SfrNj%pm#p|5{Gh}`fzy|IW9fG*Sf+JiVZ?}+Y)v`1q9R23 z%k=h|AjiB&hrLW}gi4OFLeSR^X>AkW>nXDpdk=e%3;zZ}?&Us%JSS!l|5W-j+0`Z< zr&Y*jt@VyR@qpWh-W_3U{4iKq`T72jomUd4Izo`{#i;Xk7|ostAmo-5fUm6R(HpL& z(k+`@-Zl7*0|fjR;YvO~a#V0Mr**eS4Lo?)7}9Vc;8fP6v2numSjaTjqIwgFADE3U;dn)g>ujR-V&5 zu83kcjkA1UUz%TA$R6-a3SKwSG)%E*2V$&N2wLQeA*xI#{U+wHKsI~_SJcfR4zPB? z)JQga2<~by@w0Znqi56RGI`Q8bp%TFU$&`Vo!2pbd0nFd>3JD2hS5)12Z;^@(L|iT zVNHVdyc`#3g_0I_rguBXrER0QXPH>FC3xWsW1ilz;S8u-QG8m#+V@D1;{mg|B!MyJ zwHKgWbNoWxHlBv3z)O|!&CG=AfJHQHC+y4jGfdF;V(_H{od#8YqL_0^AOadM2s-~v zEH{rH;}Phn;^cyk@TxvxFBM=m_n-&gr95Wf?zTLsjOud`7Ko+msG`G%2yqI8oHrli zOEGgXw=B65C#ac+7?35nI(35f%g*!nOf<-awl>o|ypB<}K$T#rrXjZn;mIwJER~|e zvIeiXvWSr!|LSWYg2a2xZCW?(&R!x>AIz6x=g~z`pDmn~NAJ%Vyn8wSqwAPo%q;zE z9?S}{Y;E)Ma=7eonRo(wU7|UAKxLbH=ZNK}G8kb2&aoG9i5O^Y<8nz$7zhojNXGKk zkElx(H~5gS_FU}>P1*17hII{tF{&SpZsS^wox#z{dyhT->4e}Q`|f02 zh0S?K8VIpZx_-R$Yz&;!o&lYJ9*;_zjJa!xnT(-PT~b|WRADXDWNg81tlJiN7)Ft@ zfo!|m&vm;oU+9>0m+zk!5X6s1Q5z`OI>=;9VK229fkp|HZ=$n19LE;a7B%)W9PydJ z8ECY0=KnoZA=Ci%Kf(;7Xid=>!Ln3_c`88g#v9N_wi2Z9BgV@0X_C^FPQ?KIk~kUY zwe-xqx`%-m3Tr&YBJGpH`c?c#uTcbkpUJr+q|GK zP(oo;Cz^rcJ9#<3rQIq?mg2gyUtFXy>+Dcv#7RACD7KEv@^3+2Rby_`ymD>Iwf$i5 z%)|Y+%4<^>k(!dXK?`lKzDCg)lS8l9sxKPI;C5}77G-;2A`%?sOBvCQ7Cy-cR^a3M=OPQWB=mg>%< zz_Q4PXQo_K4je#MTh8^&|57wk?%3A>OhOiSyFD)Xi}T5s*~uN+K@59_f;P3ri zV>`Q1REsBAERs>5WqlI2Bo%VawIrLT`YZDp36|1#UO_ap%04)~ulh z;Agv*@bGD}$)8df(RMcStthIYAz^*2Uz;9gU0c>*3o9 zya&s=Az-=j7%fP6P$qtPFEcD1TsBJ}2Nml+C%i-y(5kwq;!P{%yK)Ni*!7L0S?dtO z9lkXckzKWb7Si)XWi@P=Z6EJfxPaq9lDtx>NO^?;Y^as}EO1#+jdc+DgYE|@>>3lS zIGM3A#8BLoBhd994?=Vxi6U#^bQHC76bZbab=%4SZf!`~TrUVbUjdTKu1Wd=Pljmwg0~6mRig zxSmU|Zl9DnvaoDLFm$L9#ly1zL2mIL--%hf|KdS5U$WIi(fP)v_8553UD{z|Q+$kR zSP0nD+T|bnL|I(UD|YamAk@GR1MTM3n;mZcudLK~FXzxro3uaK2+12KKRGn?k#i)? z0Bc({$AC88cSV_FwxH(53!#-r@NB!`X zPTM)Xu=o~eB4Djc#a5wy1_6TC~zxPPPJUZ@M* z$(!CeseoHoP4UDSaU1%^irLHQ`w_^KyDaGcalYP{yimjLKm55k`47DdKUv^G$9T4M zb4P_`1<~4COwJqdnf^l;!7HSCUPG$i@!r9a@(=0|d(R6#i!{PCy^ezJv&J4D?AZ5q zHQa4>56yr)TJdgnUx6lT?Q~v_%9+M6yG!S8pQd=YHk2o|Ga(-0c{psjFDtIr{Nt9Go{ofX4DYUOyTme1!rUpIGL*Az&CR5Y(Z1KWx8e zpSn8mh~hWqp#6Zh!Y27X=-O)-gsTwKhU}0l7o7=kIgXe0xHb{^^m`0`(MGx8KgzlDNZe}(EH1v3V zDpcd<9X$}iCX`j8nVijg4Qg-g*@VI=4W|%fidE)oZ<*iP~rRnn;;2looX!hBtMVE+~j=P-0!jvUF>2;0>@`lf%WkbWmAguhR9S8iQ zsLE6Pq4taQDl6zlpia@H$Z*COJzOHY09r!>QQEG6R^Kxwa@bIb`yn zwY-uHG<r z3Zry^7_4%lSH{vUhL6P-2AwU{*KE!FV{iS2R&RMXm>BUFOG&Tu{==?eb-EaS zx$b-v_75%kzayLf`;Rm~{oGs#&elSlqPpc!G(dDfK9w7U{3?jVm zQSdqrbN|?}(VP3BYfcJ`eJQ#t`M_itthn-pu1kMpOVyso`>{)@Pu=a!s=Sop5su2Y zj}-*x%d<3B=*$F>@*`9E(;9$9>^JV{?aMK1+9+>!_7oa2x zWY48S&uqZ( zlpY$UmPNjgP(uKma={~QW4Rm zP(VwAexx&_<)S7~i{JuLWODo?K>e!xFOsiEB|!4MlogQ*^%s2PpKl?l;e|c`b9hnn zsGuDh5R#w3goO&YR^YPSNCMyPE37sHs>~N@G2yhe9(yW$;N}hg>vn8#d#iK#-lK!Wt$Q&c}XyRBa|6+_RA$ zO}sa;r1MU}KF=I^*eAYjHb6wGxG|AjZPVqwAa!3#Ax~UBI_9vs9K1fX;f(>B{%P{% zujczQp@hJI?I2U-rEP=47%_vz(5{Vhxkm**+9{e;SNO=oS_6^&%jUkq7~nxquFzQK z87Omi53MPA1+<*Nbsgo}`Nz&ko&Uk23^`dB^c`jVX8?4v{P9QEMdTi+{3oRU$Bq9h zUJgYSR-5Rmeh{Hutq>jyL-rkN|8zlDsoYqzh-vo39bLo9+$hgMYS#ZtvdSk?fh|-Wg zNedPG$u^o5%vAXkgXu`Ruf7w*Y84dC=3;5FUtxqedMj>gsLY5O2jEyx6O}RM`FvBm z)cYTcI~tWspu>AAC96fJ(fhBMKs)lb{*R~cmeQ` z`3>pO3d`lGii@@YRLCkyXOyPN3+h$L2a@I(g{AEV6+SgUWGeo!vxD9LNZ>7^TKJ$N zl+LyiO|8i7cCWl|k`b@{(2vb}we_f*w5wx>+4yslPZ-FcD*NF4Cpxz&uJ>D^B$MbC z(gtN}6+lU=ECs(^ApPkvMR2RTZki(o8j#;fkAU_L>=71^7dagK)Q^!gj5?nAlT6#J z(WP1Y(O{(qi=MD6=emK>MkWBxH@oE`Ax8*D~oysV$N?F zo5PK~sn~A%8UURU?c;Q^&6RY4p9cuPzPe_q1UOtxUhcrjn3AzT=MX8AuaA-S@n@<> z92IKpn{kIAr)F;HwzFJXh}$XMNzrcQCwHyT=zPU4%+HtsDp^6|B3wRY7%)&Y=gxXP zU3sdG_@?+Jd|YHj=LLW*?;ycgA&Et8-h<7!k7sKBu_cw?iyQ0KeIGs`ZieqaR!3BI zevH&leSh>0F>b&eQ<^qXBY!!e2Z2a@E%%d#?&pvm1HKm2syR zkzZ@)7A>NCvcWsmpIjlMmcJ6qW=FE(R{KY2vJ`g!S_zrLWto+vCo>NvBiW@*p3GxW zBWM80TgH?lFwS9`zz6waDG#{~`DMxvx0l^wf|oBzQD_~|E_Xa(3aY)p;zENSV&q)kc&_Ht#g5Xs(@ggLU%Yl2ovNsOc@X>=Adr+@kYF@j2OtBdiQwY78VR_-o!tS)j*uu0%qiPM` zYmNVMQ79l&NfYEQT}2IfUT?dw$;j#M_cv>h|CtB=*P?eV`eDL!ciPV~%QUrT1Izyl z^_E}{P0B~{CUyOiVoBh#%k&AVE$HH7Qo8ukAr&*TGhaHcBGBy2;}#;X;jG#o8$F*3 z2gB5ttj^&<5#OXA8Qv(n!)DznL!U6+uu!k0!0E`hnjUQfau0N;3DF5tR=<6~Gc?R@ zaX}+^Re%pu$2+v}(qydT`TjnaMz^uj;#K%_a8I#N2#Qo=diSW+IJ)gUhmvyvyexo0 z)6B0UR|>*6;b`|P&o}RA1$(203z`p-SFaQp8dk8#Lj{2?W0{^F@@(Df;0=mlBZtr2 z{E|4XBI9hti!AIMCWOdmbzEC-{~1WUdK&Y-Pq+Osci%rFgU$;9PnuKR!+#C!QyVDa zS0zJXaJ{N5@X=%|1Vx6!;b3T06u(8Nl-+C5*g-m3AJw@?|#}{ELAk1+wHv1i1!jt8&;AJV^lK% zoRo7ZJd2f1-2#@eT@CNw3*CO+R%BDqxkn2kQT2zT19e!tZV-_1s?Kt8t&4abG=0Jwt!!h z$EM$OjM&j=%a;htKLJBUXB+GZ8xSwhVkR)Y{$ZBtOs8{d4bmi(C(}8j0nqeG$BDc_ z{Bn0F?GM92p09d|i(H9&p!|go;V)kS_bv|f&YsV3L%5+ciw zHd%+@zJwJSEsmwe<9uc385xd2P;OiZ3T#5$+EYCeB`8{2n6Dbr>^4!xa0-5ZT|ZWy}O?=V-|`Gm${vxarl6=Mfn()hON(QnjH3!N;ta|BD5L{-lII}Ee>`im$ilyq5$#Ix8Jr(dn= zLdlus?(Ux3e!RDIR)e1$&#bjMu+L?#$+!Bc3E})zqMtZ@{qES_4fb(Z;LetZ2ZJS~ z%<{{+7asg+Y{Z$gM7LUBZ(RPfR>LD)$jJtox-KM4m2t)0Llv^~-9FA@?C#jCN)v4# za$MFGE;*&Mk_uhhbbfF%NK@GWvo&&faJz$tN!}n*o2FKkil!94@iqkpk&Wm0w8$7j z=UG-HZWZL4N&CEwB1dJw>ZMtTSThFCsYLr~lo`*oR`{odPc!FJ?hQl`d*7ixhsCK5 z0Y1f{0lT$Icj9FgV&8zXCN_qikc3G)@6sozk?Q_wTlmY7I^kZ0ju7|AF5I=x)f^dC zCEQEK2%2jkgU$I>{s#9Sv*iNADs!72D2)?v;ZLg`40Fb0X`OA|dd5Umz3rHkFn?B2S5=?VM-|FZc0 z%$FKLyz@AIAY}B9nZMcVs!}G72!swYBKCf0Du|D`f3%~0vufI=WT}J_6P$06cd|*%Jm^t8yxhRTZu3{!b5@%zF<- zgQVp4HF+LXeVax*fd#&Aroz#`%m%Z{y^PTBm^#{b`+lQ&K~XxjMl7WmNV~95q?$6TgZ{xq>!ZQSsZ4LJ5_YcXyqWtFw$G6)X(zHbg0pMDpXK80k9T zLPz0U<&|9Qv6^$1syxzn9u31S5>J<-e^L!fq1d0)Nb^Fv{i={<#nU5nWIX}LVhSKb zt8DX+(QL!cQ0h_23D@;KSYV;4OIft{U|6(>KdZmE4kV~$+4}`Vm?O}VI8`m%-T7!G zn(>n5oY%cYIkN?QDuQgIwMT{uqoHDa8C&!pmC=XmxXm$3XsrtbrF3WNDNc92r%96H zO!a;vBEY6npnM5|AzJxq0`;LdR#gK&<@qvbG+^^%uwe1P4);`XGYsu#myY5rLWpl7DTJzq^7-&wzcy~yomw z)6_a=85xxmGiv}Bu?GmqN>?#X)@kK*zbNya(lE>_1d9E!4y-CGba4Ww)s75gxrF7w z;TLZ>)bs_A?{Z|Hp}1xAAywLNsxo7HT9Z);+N^NT_dbdftna%v;AdqZ+3&~y z9?Uen0s3hKiE;deR|e~-|L0tw&)MryRjz*}1S~L{wf?tH7YH!!+g`NXOi7L-onBXT z3#bjUi8d-j_``^pP08>TEzueGj7Rs5q@Ksm{rWUx zUdH-mzj8p->DOy3B!~$QPe~u3NYU5hO#Z??U4&IT23a;snu(4$J7x>;$*Z>?4VL=t zsWQ<81Ql~E=NlZa;ro%LjQaPQc*ZQ3i25T+l5&PDEtnr+P>?TUGA0t|y2@e!PYG3rF|MxQGb=U;%8+4|NGc6~)01C!;fkgt*{(i}p zy1o7iu186#;ClK!n5C&Xll9kMmz5;byj%6HV6(gueiv`OyY(lReeL2L*QU(2+ismMHcgRu?}h6YyEt{aY`tu5T3P4;PZ;S5Dy zCvS)}H^LNa-EM4K)2$}5Q)P#3Z7|q-_Jk%_Ze}`z-}4&I`8sh$w8ap4y9FAGgKu{_ zNjho1wleQg4kq8-xjM-d)4ntT4h@M^$!Fl@7MtOy^_Z$6c0UaE9MK55&Vp~P`MF&p zB|Uy|GB7})x~e_&QT@Hi26IA;DItLV!20uOpdKE{RCpt#3kUCAsE?v6q+}80S~y5m zXbzp69S{N$g`;mkno-msZ_ek+^2~pM!t!ZOMFs$Rpjxd>JEcr`VOn7{n?s`?$Pgr7 zb_9rRT8Dr%fO99{yTN^>dk|F^y{YU;NjekU%!eEzf8W2M5c1%c$7|9LD{pab&`#gf z=m_QZYD(U;5E`+^>mLGn8zL{t1^XhpYPYO&2@<-yc`D5a-S!;`?c+ZQWE;MB z2r{+%og&q!TZu!mGu;{{A21K{KRw^ZQ+ot%}%A z!yiuiw_N)N_#ms7>}KsMUVx{kG7tH@-GlclqUG*~q1BenpAy8nYjf}~ z{a*%aH@vub;euCm_B+3ZcXszMV(o!7k_}733g4VJE=EkWH4capDfeuqgt51FtITLCWbYcDd~&G+kQd& zoKao`+2^>=?4%1Yx=Dyz=W0%Tb6*&QB=7~` zxwMBD80aA69*m~SRbu1qA=IW;*J&_V+$a0QxhOm}BDmI<(zbQFHwDg4-IgjoqMblR z2zpQVvAz9z8WrM&d6P$meVj5uk4ed^@W?m+O|VK;)-}s1S$oQ+4>CqD)QKjr<@AwHP8;Pj8#ipIavG)IQ>OV7@3(iWhlhdfL5{htypn4DdwFKSB`z?4^o9pT zN|gMkD-+%JM>f+J5T?sJOabg{cYqX+R9WRC(JwBO?Gz*Da?yea}$TOv``v{rY^HUET8LNcmUUd{jI z3&cCIMv{ZwzxptZj_>k}f2y(>a)BDu0qgzcXaL`2oRsNf!t=C-ERG*o*~uch_ zx1t4hYxQ~QXWs8Z6aqJXZd2VH?Xrx0>yJP?d9Y_$#9rNGa58iXxuNa^E>h2Knoz)( zMor6H9Tl()eX)jm2r;36-k!fxAFC5!B%DCMAHvLMK?nL!)WpdzHq{1=hFw4At>*+0 ztGv4@EiK?{Ndvpet4-V6wrYdaNZS>(euExyG@SYa1t*RDskB7KKzHOv2>D;+fUB-xu@&yr@NtRZuo1Thn1I_@na7nT5)r3{<*JWO10?tvp2RXf?7`oCZ2X9g zKEY5t_^F)3eTTAz&~G*mnToD-yt~Lq_M{Q^73+}^!`;Q=G

PDRD$y@An5>Ii%ozpdZ>DvsUX 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 WOAc!hk00W`^zPidU2x0h<^KR73QI)* literal 0 HcmV?d00001 diff --git a/docs/dqx/static/img/profiler_params.png b/docs/dqx/static/img/profiler_params.png new file mode 100644 index 0000000000000000000000000000000000000000..afa51928326ddb3e671567cc4dcf34f7ecf59dcc GIT binary patch literal 125467 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%0DX{UZC*f9DR=t;x%8oNGe_hi8yZcw+?OGO-H5f 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 jobs.Task: task_key=task.name, depends_on=[jobs.TaskDependency(task_key=d) for d in task.dependencies()], run_job_task=jobs.RunJobTask( - job_id=referenced_job_id, - python_named_params=None, # don't change existing job parameters + job_id=referenced_job_id, job_parameters={} # propagate params from the parent job ), ) diff --git a/tests/integration/test_e2e_workflow.py b/tests/integration/test_e2e_workflow.py index 378275d01..dd3824e23 100644 --- a/tests/integration/test_e2e_workflow.py +++ b/tests/integration/test_e2e_workflow.py @@ -120,18 +120,14 @@ def test_e2e_workflow_with_custom_install_folder( assert checked_df.count() == input_df.count(), "Output table is empty" -def test_e2e_workflow_for_patterns(ws, spark, make_table, setup_workflows, expected_quality_checking_output): +def test_e2e_workflow_for_patterns( + ws, spark, make_table, setup_workflows, expected_quality_checking_output, make_random +): installation_ctx, run_config = setup_workflows() first_table = run_config.input_config.location catalog_name, schema_name, _ = first_table.split('.') - second_table = make_table( - catalog_name=catalog_name, - schema_name=schema_name, - ctas="SELECT * FROM VALUES " - "(1, 'a'), (2, 'b'), (3, NULL), (NULL, 'c'), (3, NULL), (1, 'a'), (6, 'a'), (2, 'c'), (4, 'a'), (5, 'd') " - "AS data(id, name)", - ).full_name + second_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) installation_ctx.deployed_workflows.run_workflow( "e2e", run_config_name=run_config.name, patterns=f"{catalog_name}.{schema_name}.*" @@ -153,14 +149,14 @@ def test_e2e_workflow_for_patterns(ws, spark, make_table, setup_workflows, expec checks = dq_engine.load_checks(config=storage_config) assert checks, f"Checks for {second_table} were not generated" - checked_df = spark.table(first_table) + checked_df = spark.table(first_table + "_dq_output") input_df = spark.table(run_config.input_config.location) # this is sanity check only, we cannot predict the exact output as it depends on the generated rules assert checked_df.count() > 0, "First output table is empty" assert checked_df.count() == input_df.count(), "First output table is empty" - checked_df = spark.table(second_table) + checked_df = spark.table(second_table + "_dq_output") # this is sanity check only, we cannot predict the exact output as it depends on the generated rules assert checked_df.count() > 0, "Second output table is empty" @@ -168,7 +164,7 @@ def test_e2e_workflow_for_patterns(ws, spark, make_table, setup_workflows, expec def test_e2e_workflow_for_patterns_table_checks_storage( - ws, spark, make_table, setup_workflows, expected_quality_checking_output + ws, spark, make_table, setup_workflows, expected_quality_checking_output, make_random ): installation_ctx, run_config = setup_workflows() @@ -181,14 +177,7 @@ def test_e2e_workflow_for_patterns_table_checks_storage( run_config.checks_location = f"{catalog_name}.{schema_name}.checks" installation_ctx.installation.save(config) - # create second table - second_table = make_table( - catalog_name=catalog_name, - schema_name=schema_name, - ctas="SELECT * FROM VALUES " - "(1, 'a'), (2, 'b'), (3, NULL), (NULL, 'c'), (3, NULL), (1, 'a'), (6, 'a'), (2, 'c'), (4, 'a'), (5, 'd') " - "AS data(id, name)", - ).full_name + second_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) installation_ctx.deployed_workflows.run_workflow( "e2e", run_config_name=run_config.name, patterns=f"{catalog_name}.{schema_name}.*" @@ -212,15 +201,21 @@ def test_e2e_workflow_for_patterns_table_checks_storage( checks = dq_engine.load_checks(config=storage_config) assert checks, f"Checks for {second_table} were not generated" - checked_df = spark.table(first_table) + checked_df = spark.table(first_table + "_dq_output") input_df = spark.table(run_config.input_config.location) # this is sanity check only, we cannot predict the exact output as it depends on the generated rules assert checked_df.count() > 0, "First output table is empty" assert checked_df.count() == input_df.count(), "First output table is empty" - checked_df = spark.table(second_table) + checked_df = spark.table(second_table + "_dq_output") # this is sanity check only, we cannot predict the exact output as it depends on the generated rules assert checked_df.count() > 0, "Second output table is empty" assert checked_df.count() == input_df.count(), "Second output table is empty" + + +def make_second_input_table(spark, catalog_name, schema_name, first_table, make_random): + second_table = f"{catalog_name}.{schema_name}.dummy_t{make_random(4).lower()}" + spark.table(first_table).write.format("delta").mode("overwrite").saveAsTable(second_table) + return second_table diff --git a/tests/integration/test_profiler_workflow.py b/tests/integration/test_profiler_workflow.py index 58a096757..57a60ccbc 100644 --- a/tests/integration/test_profiler_workflow.py +++ b/tests/integration/test_profiler_workflow.py @@ -156,12 +156,12 @@ def test_profiler_workflow_for_multiple_run_configs(ws, spark, setup_workflows): assert status, f"Profile summary stats file {second_run_config.profiler_config.summary_stats_file} does not exist." -def test_profiler_workflow_for_patterns(ws, spark, setup_workflows, make_table): +def test_profiler_workflow_for_patterns(ws, spark, setup_workflows, make_table, make_random): installation_ctx, run_config = setup_workflows() first_table = run_config.input_config.location catalog_name, schema_name, _ = first_table.split('.') - second_table = create_second_table(catalog_name, make_table, schema_name) + second_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) # run profiler for all tables in the schema installation_ctx.deployed_workflows.run_workflow( @@ -185,17 +185,7 @@ def test_profiler_workflow_for_patterns(ws, spark, setup_workflows, make_table): assert checks, f"Checks for {second_table} were not generated" -def create_second_table(catalog_name, make_table, schema_name) -> str: - return make_table( - catalog_name=catalog_name, - schema_name=schema_name, - ctas="SELECT * FROM VALUES " - "(1, 'a'), (2, 'b'), (3, NULL), (NULL, 'c'), (3, NULL), (1, 'a'), (6, 'a'), (2, 'c'), (4, 'a'), (5, 'd') " - "AS data(id, name)", - ).full_name - - -def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_workflows, make_table): +def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_workflows, make_table, make_random): installation_ctx, run_config = setup_workflows() first_table_full_name = run_config.input_config.location @@ -207,7 +197,9 @@ def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_wo run_config.checks_location = f"{catalog_name}.{schema_name}.checks" installation_ctx.installation.save(config) - second_table_name = create_second_table(catalog_name, make_table, schema_name) + second_table_full_name = make_second_input_table( + spark, catalog_name, schema_name, first_table_full_name, make_random + ) # run profiler for all tables in the schema installation_ctx.deployed_workflows.run_workflow( @@ -227,7 +219,13 @@ def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_wo # assert checks for second table workspace_file_storage_config = TableChecksStorageConfig( location=run_config.checks_location, - run_config_name=second_table_name, + run_config_name=second_table_full_name, ) checks = dq_engine.load_checks(config=workspace_file_storage_config) - assert checks, f"Checks for {second_table_name} were not generated" + assert checks, f"Checks for {second_table_full_name} were not generated" + + +def make_second_input_table(spark, catalog_name, schema_name, first_table, make_random): + second_table = f"{catalog_name}.{schema_name}.dummy_t{make_random(4).lower()}" + spark.table(first_table).write.format("delta").mode("overwrite").saveAsTable(second_table) + return second_table diff --git a/tests/integration/test_quality_checker_workflow.py b/tests/integration/test_quality_checker_workflow.py index 8b802913e..3d22b0d47 100644 --- a/tests/integration/test_quality_checker_workflow.py +++ b/tests/integration/test_quality_checker_workflow.py @@ -252,13 +252,13 @@ def test_quality_checker_workflow_with_ref( def test_quality_checker_workflow_for_patterns( - ws, spark, make_table, setup_workflows, expected_quality_checking_output + ws, spark, make_table, setup_workflows, expected_quality_checking_output, make_random ): installation_ctx, run_config = setup_workflows(checks=True) first_table = run_config.input_config.location catalog_name, schema_name, _ = first_table.split('.') - second_table = make_second_input_table(catalog_name, make_table, schema_name) + second_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) dq_engine = DQEngine(ws, spark) checks = dq_engine.load_checks( @@ -284,16 +284,19 @@ def test_quality_checker_workflow_for_patterns( ) # assert first table - checked_df = spark.table(first_table) + checked_df = spark.table(first_table + "_dq_output") + expected_quality_checking_output.show(truncate=False) + checked_df.show(truncate=False) assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) # assert second table - checked_df = spark.table(second_table) + checked_df = spark.table(second_table + "_dq_output") + checked_df.show(truncate=False) assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) def test_quality_checker_workflow_for_patterns_table_checks_storage( - ws, spark, make_table, setup_workflows, expected_quality_checking_output + ws, spark, make_table, setup_workflows, expected_quality_checking_output, make_random ): installation_ctx, run_config = setup_workflows(checks=True) @@ -307,7 +310,7 @@ def test_quality_checker_workflow_for_patterns_table_checks_storage( run_config.checks_location = checks_table installation_ctx.installation.save(config) - second_table = make_second_input_table(catalog_name, make_table, schema_name) + second_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) dq_engine = DQEngine(ws, spark) checks = dq_engine.load_checks( @@ -327,23 +330,18 @@ def test_quality_checker_workflow_for_patterns_table_checks_storage( ) # assert first table - checked_df = spark.table(first_table) + checked_df = spark.table(first_table + "_dq_output") assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) # assert second table - checked_df = spark.table(second_table) + checked_df = spark.table(second_table + "_dq_output") assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) -def make_second_input_table(catalog_name, make_table, schema_name): - second_table = make_table( - catalog_name=catalog_name, - schema_name=schema_name, - ctas="SELECT * FROM VALUES " - "(1, 'a'), (2, 'b'), (3, NULL), (NULL, 'c'), (3, NULL), (1, 'a'), (6, 'a'), (2, 'c'), (4, 'a'), (5, 'd') " - "AS data(id, name)", - ) - return second_table.full_name +def make_second_input_table(spark, catalog_name, schema_name, first_table, make_random): + second_table = f"{catalog_name}.{schema_name}.dummy_t{make_random(4).lower()}" + spark.table(first_table).write.format("delta").mode("overwrite").saveAsTable(second_table) + return second_table def _setup_custom_check_func(ws, installation_ctx, custom_checks_funcs_location): diff --git a/tests/unit/test_workflow_installer.py b/tests/unit/test_workflow_installer.py index ec9db5cb4..623d405af 100644 --- a/tests/unit/test_workflow_installer.py +++ b/tests/unit/test_workflow_installer.py @@ -27,7 +27,7 @@ def test_run_workflow(): assert run_id == 456 mock_ws.jobs.run_now.assert_called_once_with( - 123, python_named_params={"run_config_name": "test_run_config", "patterns": ""} + 123, job_parameters={"run_config_name": "test_run_config", "patterns": ""} ) mock_ws.jobs.wait_get_run_job_terminated_or_skipped.assert_called_once_with( run_id=456, timeout=timedelta(minutes=20) From 241f57605070db64578a4567c276b3301552ec3f Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Mon, 29 Sep 2025 19:54:51 +0200 Subject: [PATCH 31/64] updated demos --- demos/dqx_demo_tool.py | 35 ++++++++++++++++++++++++++++++++++- demos/dqx_multi_table_demo.py | 14 +++++++------- docs/dqx/docs/demos.mdx | 2 +- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/demos/dqx_demo_tool.py b/demos/dqx_demo_tool.py index ac3bd9fd7..a84e24c70 100644 --- a/demos/dqx_demo_tool.py +++ b/demos/dqx_demo_tool.py @@ -72,8 +72,15 @@ # MAGIC ``` # MAGIC # run for all configured run configs (default) # MAGIC databricks labs dqx profile +# MAGIC # MAGIC # or run for a specific run config # MAGIC databricks labs dqx profile --run-config "default" +# MAGIC +# MAGIC # You can also run for tables/views matching wildcard patterns. Conventions: +# MAGIC # * Run config is used as a template for all relevant fields except location +# MAGIC # * Input table location is derived from the patterns +# MAGIC # * For table-based checks location, save checks to the delta table, otherwise to install_folder/checks/.yml +# MAGIC databricks labs dqx profile --run-config "default" --patterns "main.nytaxi.*;main.default.table1" # MAGIC ``` # MAGIC # MAGIC This will profile the data defined in the `input_config` field of the run config. The generated quality rule candidates and summary statistics are saved in the installation folder as per the `checks_location`, `profiler_config` fields. @@ -87,8 +94,16 @@ # MAGIC ``` # MAGIC # run for all configured run configs (default) # MAGIC databricks labs dqx apply-checks +# MAGIC # MAGIC # or run for a specific run config # MAGIC databricks labs dqx apply-checks --run-config "default" +# MAGIC +# MAGIC # You can also run for tables/views matching wildcard patterns. Conventions: +# MAGIC # * Run config is used as a template for all relevant fields except location +# MAGIC # * Input table location is derived from the patterns +# MAGIC # * For table-based checks location, load checks from the delta table, otherwise from install_folder/checks/.yml +# MAGIC # * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes +# MAGIC databricks labs dqx apply-checks --run-config "default" --patterns "main.nytaxi.*;main.default.table1" # MAGIC ``` # MAGIC # MAGIC This will apply quality checks defined in the `checks_location` field of the run config to the data defined in the `input_config`. The results are written to the output as defined in the `output_config` and `quarantine_config` fields. @@ -104,14 +119,27 @@ # MAGIC ``` # MAGIC # run for all configured run configs (default) # MAGIC databricks labs dqx e2e +# MAGIC # MAGIC # or run for a specific run config # MAGIC databricks labs dqx e2e --run-config "default" +# MAGIC +# MAGIC # You can also run for tables/views matching wildcard patterns. Conventions: +# MAGIC # * Run config is used as a template for all relevant fields except location +# MAGIC # * Input table location is derived from the patterns +# MAGIC # * For table-based checks location, save/load checks from the delta table, otherwise from install_folder/checks/.yml +# MAGIC # * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes +# MAGIC databricks labs dqx e2e --run-config "default" --patterns "main.nytaxi.*;main.default.table1" # MAGIC ``` # MAGIC # MAGIC This will use the settings from the profiler and quality checker as explained before. # COMMAND ---------- +# MAGIC %md +# MAGIC You can also profile and run quality checking across multiple tables in a single method call (see multi table demo). + +# COMMAND ---------- + # MAGIC %md # MAGIC ## Programmatic Approach @@ -354,7 +382,7 @@ # COMMAND ---------- # MAGIC %md -# MAGIC ### End-to-end programmatic approach +# MAGIC ### End-to-end programmatic approach # MAGIC # MAGIC You can use a single method call to apply checks and save the results. @@ -375,6 +403,11 @@ # COMMAND ---------- +# MAGIC %md +# MAGIC You can also profile and run quality checking across multiple tables in a single method call (see multi table demo). + +# COMMAND ---------- + # MAGIC %md # MAGIC ### View data quality in DQX Dashboard diff --git a/demos/dqx_multi_table_demo.py b/demos/dqx_multi_table_demo.py index dc280f9c6..028014f1d 100644 --- a/demos/dqx_multi_table_demo.py +++ b/demos/dqx_multi_table_demo.py @@ -2,7 +2,7 @@ # MAGIC %md # MAGIC # DQX Multi-Table Data Quality Checks Demo # MAGIC -# MAGIC This notebook demonstrates how to apply data quality checks to multiple tables in a single method call. +# MAGIC This notebook demonstrates how to profile and apply data quality checks to multiple tables in a single method call. # COMMAND ---------- @@ -169,20 +169,20 @@ # COMMAND ---------- # MAGIC %md -# MAGIC ## Checking multiple tables using wildard pattern +# MAGIC ## Checking multiple tables using wildcard patterns # COMMAND ---------- # Apply checks to multiple tables using patterns dq_engine.apply_checks_and_save_in_tables_for_patterns( - patterns=[f"{demo_catalog_name}.{demo_schema_name}.users*"], # apply quality checks for all tables matching the pattern, can use wildcards - checks_location=checks_table, # run config of the saved checks name must be equal to the input table name + patterns=[f"{demo_catalog_name}.{demo_schema_name}.users*"], # apply quality checks for all tables matching the patterns + checks_location=checks_table, # as delta table or absolute workspace or volume directory. For file based locations, checks are expected to be found under {checks_location}/{table_name}.yml. run_config_template=RunConfig( - # auto-created if not provided; location skipped and derived from patterns + # input config is auto-created if not provided; location is skipped in any case and derived from patterns input_config=InputConfig(""), - # auto-created if not provided; location skipped and derived from patterns + output_table_suffix + # input config is auto-created if not provided; location is skipped in any case and derived from patterns + output_table_suffix output_config=OutputConfig(location="", mode="overwrite"), - # quarantine bad data; location skipped and derived from patterns + quarantine_table_suffix + # (optional) quarantine bad data; location is skipped in any case and derived from patterns + quarantine_table_suffix quarantine_config=OutputConfig(location="", mode="overwrite"), # skip checks_location of the run config as it is derived separately ), diff --git a/docs/dqx/docs/demos.mdx b/docs/dqx/docs/demos.mdx index 5a85aa60a..ad8aa554e 100644 --- a/docs/dqx/docs/demos.mdx +++ b/docs/dqx/docs/demos.mdx @@ -10,7 +10,7 @@ Import the following notebooks in the Databricks workspace to try DQX out: ## Use as Library * [DQX Quick Start Demo Notebook](https://github.com/databrickslabs/dqx/blob/v0.9.2/demos/dqx_quick_start_demo_library.py) - quickstart on how to use DQX as a library. * [DQX Demo Notebook](https://github.com/databrickslabs/dqx/blob/v0.9.2/demos/dqx_demo_library.py) - demonstrates how to use DQX as a library. -* [DQX Demo Notebook for Applying Checks at Scale on Multiple Tables](https://github.com/databrickslabs/dqx/blob/v0.9.2/demos/dqx_multi_table_demo.py) - demonstrates how to use DQX as a library at scale to apply checks on multiple tables. +* [DQX Demo Notebook for Profiling and Applying Checks at Scale on Multiple Tables](https://github.com/databrickslabs/dqx/blob/v0.9.2/demos/dqx_multi_table_demo.py) - demonstrates how to use DQX as a library at scale to apply checks on multiple tables. * [DQX Demo Notebook for Spark Structured Streaming (Native End-to-End Approach)](https://github.com/databrickslabs/dqx/blob/v0.9.2/demos/dqx_streaming_demo_native.py) - demonstrates how to use DQX as a library with Spark Structured Streaming, using the built-in end-to-end method to handle both reading and writing. * [DQX Demo Notebook for Spark Structured Streaming (DIY Approach)](https://github.com/databrickslabs/dqx/blob/v0.9.2/demos/dqx_streaming_demo_diy.py) - demonstrates how to use DQX as a library with Spark Structured Streaming, while handling reading and writing on your own outside DQX using Spark API. * [DQX Demo Notebook for Lakeflow Pipelines (formerly DLT)](https://github.com/databrickslabs/dqx/blob/v0.9.2/demos/dqx_dlt_demo.py) - demonstrates how to use DQX as a library with Lakeflow Pipelines. From 2b509e20ed71240023f3207c13e8fbe8845aa4f4 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Mon, 29 Sep 2025 20:03:52 +0200 Subject: [PATCH 32/64] updated docs --- docs/dqx/docs/reference/cli.mdx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/dqx/docs/reference/cli.mdx b/docs/dqx/docs/reference/cli.mdx index dd49c850b..f365fb796 100644 --- a/docs/dqx/docs/reference/cli.mdx +++ b/docs/dqx/docs/reference/cli.mdx @@ -58,7 +58,10 @@ databricks labs dqx profile --timeout-minutes 20 # Run profiler for a single run config: profile data and generate quality check candidates databricks labs dqx profile --run-config default --timeout-minutes 20 -# Run profiler for for wildcard patterns: profile all tables/views matching pattern and use run config as a template for all fields except location +# Run profiler for all tables/views matching wildcard patterns. Conventions: +# * Run config is used as a template for all relevant fields except location +# * Input table location is derived from the patterns +# * For table-based checks location, save checks to the delta table, otherwise to install_folder/checks/.yml databricks labs dqx profile --run-config "default" --patterns "main.product001.*;main.product002" --timeout-minutes 20 # Run quality checker for all run configs: apply quality checks and write results and optionally quarantine @@ -67,7 +70,11 @@ databricks labs dqx apply-checks --timeout-minutes 20 # Run quality checker for a single run config: apply quality checks and write results and optionally quarantine databricks labs dqx apply-checks --run-config default --timeout-minutes 20 -# Run quality checker for tables/views matching wildcard patterns (use run config as a template for all fields except location) +# Run quality checker for tables/views matching wildcard patterns. Conventions: +# * Run config is used as a template for all relevant fields except location +# * Input table location is derived from the patterns +# * For table-based checks location, load checks from the delta table, otherwise from install_folder/checks/.yml +# * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes databricks labs dqx apply-checks --run-config "default" --patterns "main.product001.*;main.product002" --timeout-minutes 20 # Run e2e (end-to-end) workflows for all run configs: profile data > generate quality checks > apply checks > write results and optionally quarantine @@ -76,7 +83,11 @@ databricks labs dqx e2e --timeout-minutes 20 # Run e2e (end-to-end) workflows for a single run config: profile data > generate quality checks > apply checks > write results and optionally quarantine databricks labs dqx e2e --run-config default --timeout-minutes 20 -# Run e2e (end-to-end) workflows for tables/views matching wildcard patterns (use run config as a template for all fields except location) +# Run e2e (end-to-end) workflows for tables/views matching wildcard patterns. Conventions: +# * Run config is used as a template for all relevant fields except location +# * Input table location is derived from the patterns +# * For table-based checks location, save/load checks from the delta table, otherwise from install_folder/checks/.yml +# * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes databricks labs dqx e2e --run-config "default" --patterns "main.product001.*;main.product002" --timeout-minutes 20 ``` From f32b939f8ed53aa00ba216871b7fe68baec12127 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Mon, 29 Sep 2025 20:13:29 +0200 Subject: [PATCH 33/64] updated demo --- demos/dqx_demo_tool.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/demos/dqx_demo_tool.py b/demos/dqx_demo_tool.py index a84e24c70..bb831625e 100644 --- a/demos/dqx_demo_tool.py +++ b/demos/dqx_demo_tool.py @@ -80,7 +80,7 @@ # MAGIC # * Run config is used as a template for all relevant fields except location # MAGIC # * Input table location is derived from the patterns # MAGIC # * For table-based checks location, save checks to the delta table, otherwise to install_folder/checks/.yml -# MAGIC databricks labs dqx profile --run-config "default" --patterns "main.nytaxi.*;main.default.table1" +# MAGIC databricks labs dqx profile --run-config "default" --patterns "main.nytaxi.*;main.default.table" # MAGIC ``` # MAGIC # MAGIC This will profile the data defined in the `input_config` field of the run config. The generated quality rule candidates and summary statistics are saved in the installation folder as per the `checks_location`, `profiler_config` fields. @@ -103,7 +103,7 @@ # MAGIC # * Input table location is derived from the patterns # MAGIC # * For table-based checks location, load checks from the delta table, otherwise from install_folder/checks/.yml # MAGIC # * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes -# MAGIC databricks labs dqx apply-checks --run-config "default" --patterns "main.nytaxi.*;main.default.table1" +# MAGIC databricks labs dqx apply-checks --run-config "default" --patterns "main.nytaxi.*;main.default.table" # MAGIC ``` # MAGIC # MAGIC This will apply quality checks defined in the `checks_location` field of the run config to the data defined in the `input_config`. The results are written to the output as defined in the `output_config` and `quarantine_config` fields. @@ -128,7 +128,7 @@ # MAGIC # * Input table location is derived from the patterns # MAGIC # * For table-based checks location, save/load checks from the delta table, otherwise from install_folder/checks/.yml # MAGIC # * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes -# MAGIC databricks labs dqx e2e --run-config "default" --patterns "main.nytaxi.*;main.default.table1" +# MAGIC databricks labs dqx e2e --run-config "default" --patterns "main.nytaxi.*;main.default.table" # MAGIC ``` # MAGIC # MAGIC This will use the settings from the profiler and quality checker as explained before. From 9176d63205c9f3a2651cb639687a12099cfee27a Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Mon, 29 Sep 2025 21:14:45 +0200 Subject: [PATCH 34/64] refactor --- src/databricks/labs/dqx/checks_storage.py | 43 ++++++++++++++++--- src/databricks/labs/dqx/engine.py | 14 +++--- .../labs/dqx/profiler/profiler_runner.py | 13 +++--- .../quality_checker_workflow.py | 10 ++--- tests/unit/checks_storage.py | 31 +++++++++++++ 5 files changed, 83 insertions(+), 28 deletions(-) create mode 100644 tests/unit/checks_storage.py diff --git a/src/databricks/labs/dqx/checks_storage.py b/src/databricks/labs/dqx/checks_storage.py index a0ccdcccb..35402007c 100644 --- a/src/databricks/labs/dqx/checks_storage.py +++ b/src/databricks/labs/dqx/checks_storage.py @@ -26,12 +26,11 @@ deserialize_checks_to_dataframe, serialize_checks_to_bytes, get_file_deserializer, + FILE_SERIALIZERS, ) from databricks.labs.dqx.config_loader import RunConfigLoader -from databricks.labs.dqx.telemetry import telemetry_logger from databricks.labs.dqx.io import TABLE_PATTERN -from databricks.labs.dqx.checks_serializer import FILE_SERIALIZERS - +from databricks.labs.dqx.telemetry import telemetry_logger logger = logging.getLogger(__name__) T = TypeVar("T", bound=BaseChecksStorageConfig) @@ -273,10 +272,9 @@ def _get_storage_handler_and_config( config.location = run_config.checks_location - if TABLE_PATTERN.match(config.location) and not config.location.lower().endswith( - tuple(FILE_SERIALIZERS.keys()) - ): + if is_table_location(config.location): return self.table_handler, config + if config.location.startswith("/Volumes/"): return self.volume_handler, config @@ -416,7 +414,7 @@ def create(self, config: BaseChecksStorageConfig) -> ChecksStorageHandler: def create_for_location( self, location: str, run_config_name: str = "default" ) -> tuple[ChecksStorageHandler, BaseChecksStorageConfig]: - if TABLE_PATTERN.match(location) and not location.lower().endswith(tuple(FILE_SERIALIZERS.keys())): + if is_table_location(location): return ( TableChecksStorageHandler(self.workspace_client, self.spark), TableChecksStorageConfig(location=location, run_config_name=run_config_name), @@ -433,3 +431,34 @@ def create_for_location( ) return FileChecksStorageHandler(), FileChecksStorageConfig(location=location) + + +def is_table_location(location: str) -> bool: + """ + True if location points to a Delta table (catalog.schema.table) and is not a file path + with a known checks serializer extension. + + Args: + location (str): The checks location to validate. + + Returns: + bool: True if the location is a valid table name and not a file path, False otherwise. + """ + return bool(TABLE_PATTERN.match(location)) and not location.lower().endswith(tuple(FILE_SERIALIZERS.keys())) + + +def get_default_checks_location(base_location: str, checks_location: str) -> str: + """ + Build the checks location for table patterns. + + If the provided checks_location is a table location, it is returned as is. + If it is a file path, it is prefixed with the base_location and "checks/" directory. + + Args: + base_location (str): The base location to prefix if checks_location is a file path. + checks_location (str): The original checks location, either a table name or file path. + + Returns: + str: The constructed checks location. + """ + return checks_location if is_table_location(checks_location) else f"{base_location}/checks/" diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index 9eb61bf39..be76a459f 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -10,12 +10,13 @@ from databricks.labs.dqx.base import DQEngineBase, DQEngineCoreBase from databricks.labs.dqx.checks_resolver import resolve_custom_check_functions_from_path -from databricks.labs.dqx.checks_serializer import deserialize_checks, FILE_SERIALIZERS +from databricks.labs.dqx.checks_serializer import deserialize_checks from databricks.labs.dqx.config_loader import RunConfigLoader from databricks.labs.dqx.checks_storage import ( FileChecksStorageHandler, BaseChecksStorageHandlerFactory, ChecksStorageHandlerFactory, + is_table_location, ) from databricks.labs.dqx.config import ( InputConfig, @@ -34,11 +35,12 @@ ) from databricks.labs.dqx.checks_validator import ChecksValidator, ChecksValidationStatus from databricks.labs.dqx.schema import dq_result_schema -from databricks.labs.dqx.io import read_input_data, save_dataframe_as_table, TABLE_PATTERN, get_reference_dataframes -from databricks.labs.dqx.utils import list_tables +from databricks.labs.dqx.io import read_input_data, save_dataframe_as_table, get_reference_dataframes from databricks.labs.dqx.telemetry import telemetry_logger, log_telemetry from databricks.sdk import WorkspaceClient +from databricks.labs.dqx.utils import list_tables + logger = logging.getLogger(__name__) @@ -652,11 +654,9 @@ def apply_checks_and_save_in_tables_for_patterns( run_config.quarantine_config.location = f"{table}{quarantine_table_suffix}" run_config.checks_location = ( - # for file based checks expecting a file per table checks_location - if TABLE_PATTERN.match(checks_location) - and not checks_location.lower().endswith(tuple(FILE_SERIALIZERS.keys())) - else f"{checks_location}/{table}.yml" + if is_table_location(checks_location) + else f"{checks_location}/{table}.yml" # for file based checks expecting a file per table ) run_configs.append(run_config) diff --git a/src/databricks/labs/dqx/profiler/profiler_runner.py b/src/databricks/labs/dqx/profiler/profiler_runner.py index c306dc216..50911213f 100644 --- a/src/databricks/labs/dqx/profiler/profiler_runner.py +++ b/src/databricks/labs/dqx/profiler/profiler_runner.py @@ -5,7 +5,7 @@ from databricks.sdk import WorkspaceClient from databricks.sdk.service.workspace import ImportFormat -from databricks.labs.dqx.checks_serializer import FILE_SERIALIZERS +from databricks.labs.dqx.checks_storage import is_table_location, get_default_checks_location from databricks.labs.dqx.config import ( InputConfig, ProfilerConfig, @@ -15,12 +15,11 @@ WorkspaceFileChecksStorageConfig, ) from databricks.labs.dqx.engine import DQEngine -from databricks.labs.dqx.io import read_input_data, TABLE_PATTERN +from databricks.labs.dqx.io import read_input_data from databricks.labs.dqx.profiler.generator import DQGenerator from databricks.labs.dqx.profiler.profiler import DQProfiler from databricks.labs.blueprint.installation import Installation - logger = logging.getLogger(__name__) @@ -122,14 +121,14 @@ def run_for_patterns( logger.info(f"Generated summary statistics: \n{summary_stats}") storage_config: BaseChecksStorageConfig - if TABLE_PATTERN.match(checks_location) and not checks_location.lower().endswith( - tuple(FILE_SERIALIZERS.keys()) - ): + if is_table_location(checks_location): # for table based checks, use the provided table name storage_config = TableChecksStorageConfig(location=checks_location, run_config_name=table) else: # for file based checks expecting a file per table - storage_config = WorkspaceFileChecksStorageConfig(location=f"{install_folder}/checks/{table}.yml") + storage_config = WorkspaceFileChecksStorageConfig( + location=f"{get_default_checks_location(install_folder, checks_location)}/{table}.yml" + ) self.save(checks, summary_stats, storage_config, profiler_config.summary_stats_file) diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py index dff938839..8f9248304 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py @@ -1,10 +1,9 @@ import logging -from databricks.labs.dqx.checks_serializer import FILE_SERIALIZERS +from databricks.labs.dqx.checks_storage import get_default_checks_location from databricks.labs.dqx.config import RunConfig from databricks.labs.dqx.contexts.workflow_context import WorkflowContext from databricks.labs.dqx.installer.workflow_task import Workflow, workflow_task -from databricks.labs.dqx.io import TABLE_PATTERN logger = logging.getLogger(__name__) @@ -31,11 +30,8 @@ def apply_checks(self, ctx: WorkflowContext): logger.info(f"Running data quality workflow for patterns: {ctx.patterns}") patterns = [pattern.strip() for pattern in ctx.patterns.split(';')] - checks_location = ( - ctx.run_config.checks_location - if TABLE_PATTERN.match(ctx.run_config.checks_location) - and not ctx.run_config.checks_location.lower().endswith(tuple(FILE_SERIALIZERS.keys())) - else f"{ctx.installation.install_folder()}/checks/" # prefix/directory for file based checks + checks_location = get_default_checks_location( + ctx.installation.install_folder(), ctx.run_config.checks_location ) ctx.quality_checker.run_for_patterns( diff --git a/tests/unit/checks_storage.py b/tests/unit/checks_storage.py new file mode 100644 index 000000000..392446eba --- /dev/null +++ b/tests/unit/checks_storage.py @@ -0,0 +1,31 @@ +import pytest +from databricks.labs.dqx.checks_storage import is_table_location, get_default_checks_location + + +@pytest.mark.parametrize( + "location, expected", + [ + ("catalog.schema.table", True), # Valid table location + ("catalog/schema/table.yml", False), # File path with known extension + ("catalog.schema.table.json", False), # File path with known extension + ("", False), # Empty string + ("invalid_location", False), # Malformed input + ], +) +def test_is_table_location(location: str, expected: bool): + assert is_table_location(location) == expected + + +@pytest.mark.parametrize( + "table, install_folder, expected", + [ + ("catalog.schema.table", "/path/to/install", "catalog.schema.table"), + ("schema.table", "/install/folder", "schema.table"), + ("table", "/install", "/install/checks/"), + ("path/file.yml", "/install", "/install/checks/"), + ("/path/file.yml", "/install", "/install/checks/"), + ("", "/install", "/install/checks/"), # Edge case: empty table name + ], +) +def test_get_default_checks_location(table: str, install_folder: str, expected: str): + assert get_default_checks_location(install_folder, table) == expected From f78423651c0b63988e057d7d54c54e95faac7fd8 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Mon, 29 Sep 2025 22:57:26 +0200 Subject: [PATCH 35/64] optimize list tables logic --- .../labs/dqx/installer/workflow_installer.py | 2 +- src/databricks/labs/dqx/utils.py | 85 ++++++++++++++++--- tests/integration/test_utils.py | 8 ++ 3 files changed, 82 insertions(+), 13 deletions(-) diff --git a/src/databricks/labs/dqx/installer/workflow_installer.py b/src/databricks/labs/dqx/installer/workflow_installer.py index b1832f27a..e8c46d6db 100644 --- a/src/databricks/labs/dqx/installer/workflow_installer.py +++ b/src/databricks/labs/dqx/installer/workflow_installer.py @@ -73,7 +73,7 @@ def run_workflow( workflow: str, run_config_name: str = "", # run for all run configs by default patterns: str = "", - max_wait: timedelta = timedelta(minutes=20), + max_wait: timedelta = timedelta(minutes=60), ) -> int: # this dunder variable is hiding this method from tracebacks, making it cleaner # for the user to see the actual error without too much noise. diff --git a/src/databricks/labs/dqx/utils.py b/src/databricks/labs/dqx/utils.py index 042a4932f..15afb7871 100644 --- a/src/databricks/labs/dqx/utils.py +++ b/src/databricks/labs/dqx/utils.py @@ -209,6 +209,50 @@ def safe_json_load(value: str): return value +def _split_pattern(pattern: str) -> tuple[str, str, str]: + """ + Splits a wildcard pattern into its catalog, schema, and table components. + + Args: + pattern (str): A wildcard pattern in the form 'catalog.schema.table'. + + Returns: + tuple[str, str, str]: A tuple containing the catalog, schema, and table components. + """ + parts = pattern.split(".") + catalog = parts[0] if len(parts) > 0 else "*" + schema = parts[1] if len(parts) > 1 else "*" + table = ".".join(parts[2:]) if len(parts) > 2 else "*" + return catalog, schema, table + + +def _build_include_scope_for_patterns(patterns: list[str]) -> tuple[set[str] | None, dict[str, set[str]] | None]: + """ + Builds allowed catalogs and schemas from a list of wildcard patterns. + + Args: + patterns (list[str]): A list of wildcard patterns to match against the table name. + + Returns: + tuple[set[str] | None, dict[str, set[str]] | None]: A tuple containing: + - A set of allowed catalogs or None if no specific catalogs are constrained. + - A dictionary mapping allowed catalogs to their respective sets of allowed schemas or + None if no specific schemas are constrained. + """ + parts = [_split_pattern(p) for p in patterns] + # If any pattern uses '*' at catalog → don’t constrain catalogs + if any(cat == "*" for cat, _, _ in parts): + return None, None + allowed_catalogs: set[str] = set() + allowed_schemas: dict[str, set[str]] = {} + for catalog, schema, _ in parts: + if catalog != "*": + allowed_catalogs.add(catalog) + if schema != "*": + allowed_schemas.setdefault(catalog, set()).add(schema) + return (allowed_catalogs or None), (allowed_schemas or None) + + @rate_limited(max_requests=100) def list_tables(client: WorkspaceClient, patterns: list[str] | None, exclude_matched: bool = False) -> list[str]: """ @@ -221,26 +265,43 @@ def list_tables(client: WorkspaceClient, patterns: list[str] | None, exclude_mat If True, matched tables are excluded. If False, matched tables are included. Returns: - list[str]: A list of fully qualify table names. + list[str]: A list of fully qualified table names. Raises: ValueError: If no tables are found matching the include or exclude criteria. """ - tables = [] + tables: list[str] = [] + + allowed_catalogs, allowed_schemas = (None, None) + if patterns and not exclude_matched: + allowed_catalogs, allowed_schemas = _build_include_scope_for_patterns(patterns) + for catalog in client.catalogs.list(): - if not catalog.name: + catalog_name = catalog.name + if not catalog_name: continue - for schema in client.schemas.list(catalog_name=catalog.name): - if not schema.name: + if allowed_catalogs is not None and catalog_name not in allowed_catalogs: + continue + + schema_filter = allowed_schemas.get(catalog_name) if allowed_schemas else None + for schema in client.schemas.list(catalog_name=catalog_name): + schema_name = schema.name + if not schema_name: + continue + if schema_filter is not None and schema_name not in schema_filter: continue - table_infos = client.tables.list_summaries(catalog_name=catalog.name, schema_name_pattern=schema.name) - tables.extend([table_info.full_name for table_info in table_infos if table_info.full_name]) - if patterns and exclude_matched: - tables = [table for table in tables if not match_table_patterns(table, patterns)] - if patterns and not exclude_matched: - tables = [table for table in tables if match_table_patterns(table, patterns)] - if len(tables) > 0: + for table in client.tables.list_summaries(catalog_name=catalog_name, schema_name_pattern=schema_name): + if table.full_name: + tables.append(table.full_name) + + if patterns: + if exclude_matched: + tables = [table for table in tables if not match_table_patterns(table, patterns)] + else: + tables = [table for table in tables if match_table_patterns(table, patterns)] + + if tables: return tables raise ValueError("No tables found matching include or exclude criteria") diff --git a/tests/integration/test_utils.py b/tests/integration/test_utils.py index 4021eeb23..39a4be645 100644 --- a/tests/integration/test_utils.py +++ b/tests/integration/test_utils.py @@ -22,6 +22,14 @@ def test_list_tables(spark, ws, make_schema, make_random): tables = list_tables(ws, patterns=[f"{catalog_name}.{schema_name}.*"]) assert set(tables) == {table1_name, table2_name} + tables = list_tables(ws, patterns=[f"{catalog_name}.*"]) + assert table1_name in tables + assert table2_name in tables + + tables = list_tables(ws, patterns=["*"]) + assert table1_name in tables + assert table2_name in tables + tables = list_tables(ws, patterns=None) assert len(tables) > 0 From c9309c4093fb9dcc353d5fe6d06e6d79aec40144 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Mon, 29 Sep 2025 23:02:51 +0200 Subject: [PATCH 36/64] refactor --- src/databricks/labs/dqx/utils.py | 129 +++++++++++++++++++++++-------- 1 file changed, 98 insertions(+), 31 deletions(-) diff --git a/src/databricks/labs/dqx/utils.py b/src/databricks/labs/dqx/utils.py index 15afb7871..bd7af09b7 100644 --- a/src/databricks/labs/dqx/utils.py +++ b/src/databricks/labs/dqx/utils.py @@ -209,6 +209,34 @@ def safe_json_load(value: str): return value +@rate_limited(max_requests=100) +def list_tables(client: WorkspaceClient, patterns: list[str] | None, exclude_matched: bool = False) -> list[str]: + """ + Gets a list of table names from Unity Catalog given a list of wildcard patterns. + + Args: + client (WorkspaceClient): Databricks SDK WorkspaceClient. + patterns (list[str] | None): A list of wildcard patterns to match against the table name. + exclude_matched (bool): Specifies whether to include tables matched by the pattern. + If True, matched tables are excluded. If False, matched tables are included. + + Returns: + list[str]: A list of fully qualified table names. + + Raises: + ValueError: If no tables are found matching the include or exclude criteria. + """ + allowed_catalogs, allowed_schemas = _get_allowed_catalogs_and_schemas(patterns, exclude_matched) + tables = _get_tables_from_catalogs(client, allowed_catalogs, allowed_schemas) + + if patterns: + tables = _filter_tables_by_patterns(tables, patterns, exclude_matched) + + if tables: + return tables + raise ValueError("No tables found matching include or exclude criteria") + + def _split_pattern(pattern: str) -> tuple[str, str, str]: """ Splits a wildcard pattern into its catalog, schema, and table components. @@ -253,57 +281,96 @@ def _build_include_scope_for_patterns(patterns: list[str]) -> tuple[set[str] | N return (allowed_catalogs or None), (allowed_schemas or None) -@rate_limited(max_requests=100) -def list_tables(client: WorkspaceClient, patterns: list[str] | None, exclude_matched: bool = False) -> list[str]: +def _get_allowed_catalogs_and_schemas( + patterns: list[str] | None, exclude_matched: bool +) -> tuple[set[str] | None, dict[str, set[str]] | None]: """ - Gets a list of table names from Unity Catalog given a list of wildcard patterns. + Determines allowed catalogs and schemas based on provided patterns and exclusion flag. Args: - client (WorkspaceClient): Databricks SDK WorkspaceClient. patterns (list[str] | None): A list of wildcard patterns to match against the table name. exclude_matched (bool): Specifies whether to include tables matched by the pattern. If True, matched tables are excluded. If False, matched tables are included. Returns: - list[str]: A list of fully qualified table names. + tuple[set[str] | None, dict[str, set[str]] | None]: A tuple containing: + - A set of allowed catalogs or None if no specific catalogs are constrained. + - A dictionary mapping allowed catalogs to their respective sets of allowed schemas or + None if no specific schemas are constrained. + """ + if patterns and not exclude_matched: + return _build_include_scope_for_patterns(patterns) + return None, None - Raises: - ValueError: If no tables are found matching the include or exclude criteria. + +def _get_tables_from_catalogs( + client: WorkspaceClient, allowed_catalogs: set[str] | None, allowed_schemas: dict[str, set[str]] | None +) -> list[str]: """ - tables: list[str] = [] + Retrieves tables from Unity Catalog based on allowed catalogs and schemas. - allowed_catalogs, allowed_schemas = (None, None) - if patterns and not exclude_matched: - allowed_catalogs, allowed_schemas = _build_include_scope_for_patterns(patterns) + Args: + client (WorkspaceClient): Databricks SDK WorkspaceClient. + allowed_catalogs (set[str] | None): A set of allowed catalogs or None if no specific catalogs are constrained. + allowed_schemas (dict[str, set[str]] | None): A dictionary mapping allowed catalogs to their respective sets + of allowed schemas or None if no specific schemas are constrained. + Returns: + list[str]: A list of fully qualified table names. + """ + tables: list[str] = [] for catalog in client.catalogs.list(): catalog_name = catalog.name - if not catalog_name: - continue - if allowed_catalogs is not None and catalog_name not in allowed_catalogs: + if not catalog_name or (allowed_catalogs and catalog_name not in allowed_catalogs): continue schema_filter = allowed_schemas.get(catalog_name) if allowed_schemas else None - for schema in client.schemas.list(catalog_name=catalog_name): - schema_name = schema.name - if not schema_name: - continue - if schema_filter is not None and schema_name not in schema_filter: - continue + tables.extend(_get_tables_from_schemas(client, catalog_name, schema_filter)) + return tables - for table in client.tables.list_summaries(catalog_name=catalog_name, schema_name_pattern=schema_name): - if table.full_name: - tables.append(table.full_name) - if patterns: - if exclude_matched: - tables = [table for table in tables if not match_table_patterns(table, patterns)] - else: - tables = [table for table in tables if match_table_patterns(table, patterns)] +def _get_tables_from_schemas(client: WorkspaceClient, catalog_name: str, schema_filter: set[str] | None) -> list[str]: + """ + Retrieves tables from schemas within a specified catalog. - if tables: - return tables - raise ValueError("No tables found matching include or exclude criteria") + Args: + client (WorkspaceClient): Databricks SDK WorkspaceClient. + catalog_name (str): The name of the catalog to retrieve tables from. + schema_filter (set[str] | None): A set of allowed schemas within the catalog or None if no specific schemas are constrained. + + Returns: + list[str]: A list of fully qualified table names within the specified catalog and schemas. + """ + tables: list[str] = [] + for schema in client.schemas.list(catalog_name=catalog_name): + schema_name = schema.name + if not schema_name or (schema_filter and schema_name not in schema_filter): + continue + + tables.extend( + table.full_name + for table in client.tables.list_summaries(catalog_name=catalog_name, schema_name_pattern=schema_name) + if table.full_name + ) + return tables + + +def _filter_tables_by_patterns(tables: list[str], patterns: list[str], exclude_matched: bool) -> list[str]: + """ + Filters a list of table names based on provided wildcard patterns. + + Args: + tables (list[str]): A list of fully qualified table names. + patterns (list[str]): A list of wildcard patterns to match against the table name. + exclude_matched (bool): Specifies whether to include tables matched by the pattern. + If True, matched tables are excluded. If False, matched tables are included. + + Returns: + list[str]: A filtered list of table names based on the matching criteria. + """ + if exclude_matched: + return [table for table in tables if not match_table_patterns(table, patterns)] + return [table for table in tables if match_table_patterns(table, patterns)] def match_table_patterns(table: str, patterns: list[str]) -> bool: From ed07bfe171976f6815a98c9d648150e588194642 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Mon, 29 Sep 2025 23:03:46 +0200 Subject: [PATCH 37/64] refactor --- src/databricks/labs/dqx/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/databricks/labs/dqx/utils.py b/src/databricks/labs/dqx/utils.py index bd7af09b7..a5c4f9ccf 100644 --- a/src/databricks/labs/dqx/utils.py +++ b/src/databricks/labs/dqx/utils.py @@ -369,11 +369,11 @@ def _filter_tables_by_patterns(tables: list[str], patterns: list[str], exclude_m list[str]: A filtered list of table names based on the matching criteria. """ if exclude_matched: - return [table for table in tables if not match_table_patterns(table, patterns)] - return [table for table in tables if match_table_patterns(table, patterns)] + return [table for table in tables if not _match_table_patterns(table, patterns)] + return [table for table in tables if _match_table_patterns(table, patterns)] -def match_table_patterns(table: str, patterns: list[str]) -> bool: +def _match_table_patterns(table: str, patterns: list[str]) -> bool: """ Checks if a table name matches any of the provided wildcard patterns. From c8d6c67b25ee41447859ce20f975dca90c3a07b4 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Mon, 29 Sep 2025 23:08:02 +0200 Subject: [PATCH 38/64] fixed tests --- tests/unit/test_workflow_installer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_workflow_installer.py b/tests/unit/test_workflow_installer.py index 623d405af..35e11823f 100644 --- a/tests/unit/test_workflow_installer.py +++ b/tests/unit/test_workflow_installer.py @@ -30,7 +30,7 @@ def test_run_workflow(): 123, job_parameters={"run_config_name": "test_run_config", "patterns": ""} ) mock_ws.jobs.wait_get_run_job_terminated_or_skipped.assert_called_once_with( - run_id=456, timeout=timedelta(minutes=20) + run_id=456, timeout=timedelta(minutes=60) ) assert mock_run.state.result_state == RunResultState.SUCCESS From a8a3aa9d6ae276425e32ccbb60bb0abb995cd2c2 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Tue, 30 Sep 2025 12:56:35 +0200 Subject: [PATCH 39/64] refactor --- src/databricks/labs/dqx/contexts/global_context.py | 3 ++- src/databricks/labs/dqx/engine.py | 11 +++++------ src/databricks/labs/dqx/executor.py | 4 +++- src/databricks/labs/dqx/io.py | 7 ++++--- src/databricks/labs/dqx/llm/utils.py | 3 ++- src/databricks/labs/dqx/profiler/dlt_generator.py | 3 --- src/databricks/labs/dqx/rule.py | 2 +- src/databricks/labs/dqx/utils.py | 6 ++++-- .../test_apply_checks_and_save_in_table.py | 10 ++++++---- tests/integration/test_io.py | 5 +++-- tests/integration/test_profiler.py | 4 +++- tests/integration/test_utils.py | 4 +++- tests/unit/test_storage_factory.py | 4 ++-- 13 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/databricks/labs/dqx/contexts/global_context.py b/src/databricks/labs/dqx/contexts/global_context.py index 3c6721a17..d0509e07f 100644 --- a/src/databricks/labs/dqx/contexts/global_context.py +++ b/src/databricks/labs/dqx/contexts/global_context.py @@ -6,6 +6,7 @@ from databricks.sdk import WorkspaceClient from databricks.labs.dqx.config import WorkspaceConfig +from databricks.labs.dqx.errors import InvalidParameterError from databricks.labs.dqx.installer.workflow_installer import DeployedWorkflows @@ -35,7 +36,7 @@ def replace(self, **kwargs): @cached_property def workspace_client(self) -> WorkspaceClient: - raise ValueError("Workspace client not set") + raise InvalidParameterError("Workspace client not set") @cached_property def named_parameters(self) -> dict[str, str]: diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index ed067ddc1..cb52051ab 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -38,8 +38,7 @@ from databricks.labs.dqx.io import read_input_data, save_dataframe_as_table, get_reference_dataframes from databricks.labs.dqx.telemetry import telemetry_logger, log_telemetry from databricks.sdk import WorkspaceClient -from databricks.labs.dqx.errors import InvalidCheckError - +from databricks.labs.dqx.errors import InvalidCheckError, InvalidConfigError from databricks.labs.dqx.utils import list_tables logger = logging.getLogger(__name__) @@ -798,7 +797,7 @@ def load_checks(self, config: BaseChecksStorageConfig) -> list[dict]: List of DQ rules (checks) represented as dictionaries. Raises: - ValueError: If the configuration type is unsupported. + InvalidConfigError: If the configuration type is unsupported. """ handler = self._checks_handler_factory.create(config) return handler.load(config) @@ -826,7 +825,7 @@ def save_checks(self, checks: list[dict], config: BaseChecksStorageConfig) -> No None Raises: - ValueError: If the configuration type is unsupported. + InvalidConfigError: If the configuration type is unsupported. """ handler = self._checks_handler_factory.create(config) handler.save(checks, config) @@ -842,10 +841,10 @@ def _apply_checks_for_run_config(self, run_config: RunConfig) -> None: run_config (RunConfig): Specifies the inputs, outputs, and checks file. """ if not run_config.input_config: - raise ValueError("Input configuration not provided") + raise InvalidConfigError("Input configuration not provided") if not run_config.output_config: - raise ValueError("Output configuration not provided") + raise InvalidConfigError("Output configuration not provided") storage_handler, storage_config = self._checks_handler_factory.create_for_location( run_config.checks_location, run_config.name diff --git a/src/databricks/labs/dqx/executor.py b/src/databricks/labs/dqx/executor.py index 059e7ba33..70039dabd 100644 --- a/src/databricks/labs/dqx/executor.py +++ b/src/databricks/labs/dqx/executor.py @@ -2,6 +2,8 @@ import inspect from dataclasses import dataclass from pyspark.sql import DataFrame, Column, SparkSession + +from databricks.labs.dqx.errors import InvalidCheckError from databricks.labs.dqx.rule import DQRule, DQRowRule, DQDatasetRule @@ -165,4 +167,4 @@ def create(rule: DQRule) -> DQRuleExecutor: if isinstance(rule, DQDatasetRule): return DQDatasetRuleExecutor(rule) - raise ValueError(f"Unsupported rule type: {type(rule)}") + raise InvalidCheckError(f"Unsupported rule type: {type(rule)}") diff --git a/src/databricks/labs/dqx/io.py b/src/databricks/labs/dqx/io.py index e77f2c71c..a201c3784 100644 --- a/src/databricks/labs/dqx/io.py +++ b/src/databricks/labs/dqx/io.py @@ -5,6 +5,7 @@ from pyspark.sql import SparkSession from pyspark.sql.dataframe import DataFrame from databricks.labs.dqx.config import InputConfig, OutputConfig +from databricks.labs.dqx.errors import InvalidConfigError logger = logging.getLogger(__name__) @@ -28,7 +29,7 @@ def read_input_data( DataFrame with values read from the input data """ if not input_config.location: - raise ValueError("Input location not configured") + raise InvalidConfigError("Input location not configured") if TABLE_PATTERN.match(input_config.location): return _read_table_data(spark, input_config) @@ -36,7 +37,7 @@ def read_input_data( if STORAGE_PATH_PATTERN.match(input_config.location): return _read_file_data(spark, input_config) - raise ValueError( + raise InvalidConfigError( f"Invalid input location. It must be a 2 or 3-level table namespace or storage path, given {input_config.location}" ) @@ -58,7 +59,7 @@ def _read_file_data(spark: SparkSession, input_config: InputConfig) -> DataFrame ) if input_config.format != "cloudFiles": - raise ValueError("Streaming reads from file sources must use 'cloudFiles' format") + raise InvalidConfigError("Streaming reads from file sources must use 'cloudFiles' format") return spark.readStream.options(**input_config.options).load( input_config.location, format=input_config.format, schema=input_config.schema diff --git a/src/databricks/labs/dqx/llm/utils.py b/src/databricks/labs/dqx/llm/utils.py index 465d2d623..ea82224ef 100644 --- a/src/databricks/labs/dqx/llm/utils.py +++ b/src/databricks/labs/dqx/llm/utils.py @@ -7,6 +7,7 @@ import yaml from databricks.labs.dqx.checks_resolver import resolve_check_function +from databricks.labs.dqx.errors import InvalidParameterError from databricks.labs.dqx.rule import CHECK_FUNC_REGISTRY logger = logging.getLogger(__name__) @@ -59,6 +60,6 @@ def load_yaml_checks_examples() -> str: yaml_checks_as_text = resource.read_text(encoding="utf-8") parsed = yaml.safe_load(yaml_checks_as_text) if not isinstance(parsed, list): - raise ValueError("YAML file must contain a list at the root level.") + raise InvalidParameterError("YAML file must contain a list at the root level.") return yaml_checks_as_text diff --git a/src/databricks/labs/dqx/profiler/dlt_generator.py b/src/databricks/labs/dqx/profiler/dlt_generator.py index 6d1ec1294..bd3edee99 100644 --- a/src/databricks/labs/dqx/profiler/dlt_generator.py +++ b/src/databricks/labs/dqx/profiler/dlt_generator.py @@ -186,9 +186,6 @@ def _generate_dlt_rules_sql(self, rules: list[DQProfile], action: str | None = N Returns: A list of Lakeflow Pipelines rules. - - Raises: - ValueError: If the specified language is not supported. """ dlt_rules = [] act_str = "" diff --git a/src/databricks/labs/dqx/rule.py b/src/databricks/labs/dqx/rule.py index 83bc5fac1..fa90a6a93 100644 --- a/src/databricks/labs/dqx/rule.py +++ b/src/databricks/labs/dqx/rule.py @@ -114,7 +114,7 @@ def _validate_rule_type(self, check_func: Callable) -> None: In this context: - The **_expected_rule_type** indicates the type the check function must be registered as (e.g., "raw", "dataset"). - - If the check function is registered with a different type, a ValueError is raised. + - If the check function is registered with a different type, a InvalidCheckError is raised. - The error message advises to use the provided **_alternative_rules** (e.g., "DQRowRule", "DQDatasetRule"). Args: diff --git a/src/databricks/labs/dqx/utils.py b/src/databricks/labs/dqx/utils.py index e0fa37de1..b8cdbcaa5 100644 --- a/src/databricks/labs/dqx/utils.py +++ b/src/databricks/labs/dqx/utils.py @@ -4,6 +4,8 @@ import re from typing import Any from fnmatch import fnmatch + +from databricks.sdk.errors import NotFound from pyspark.sql import Column # Import spark connect column if spark session is created using spark connect @@ -229,7 +231,7 @@ def list_tables(client: WorkspaceClient, patterns: list[str] | None, exclude_mat DataFrame with values read from the input data Raises: - ValueError: If no tables are found matching the include or exclude criteria. + NotFound: If no tables are found matching the include or exclude criteria. """ allowed_catalogs, allowed_schemas = _get_allowed_catalogs_and_schemas(patterns, exclude_matched) tables = _get_tables_from_catalogs(client, allowed_catalogs, allowed_schemas) @@ -239,7 +241,7 @@ def list_tables(client: WorkspaceClient, patterns: list[str] | None, exclude_mat if tables: return tables - raise ValueError("No tables found matching include or exclude criteria") + raise NotFound("No tables found matching include or exclude criteria") def _split_pattern(pattern: str) -> tuple[str, str, str]: diff --git a/tests/integration/test_apply_checks_and_save_in_table.py b/tests/integration/test_apply_checks_and_save_in_table.py index d925b842f..b6b788780 100644 --- a/tests/integration/test_apply_checks_and_save_in_table.py +++ b/tests/integration/test_apply_checks_and_save_in_table.py @@ -1,5 +1,6 @@ import tempfile import pytest +from databricks.sdk.errors import NotFound from pyspark.sql.functions import col, lit, when from pyspark.sql import Column from chispa.dataframe_comparer import assert_df_equality # type: ignore @@ -13,6 +14,7 @@ TableChecksStorageConfig, ) from databricks.labs.dqx.engine import DQEngine +from databricks.labs.dqx.errors import InvalidConfigError from databricks.labs.dqx.rule import DQRowRule, DQDatasetRule from tests.integration.conftest import EXTRA_PARAMS, RUN_TIME, REPORTING_COLUMNS @@ -1195,7 +1197,7 @@ def test_apply_checks_and_save_in_tables_missing_input_config(ws, spark): run_config = RunConfig() - with pytest.raises(ValueError, match="Input configuration not provided"): + with pytest.raises(InvalidConfigError, match="Input configuration not provided"): engine.apply_checks_and_save_in_tables(run_configs=[run_config]) @@ -1204,7 +1206,7 @@ def test_apply_checks_and_save_in_tables_missing_output_config(ws, spark): run_config = RunConfig(input_config=InputConfig(location="some_table")) - with pytest.raises(ValueError, match="Output configuration not provided"): + with pytest.raises(InvalidConfigError, match="Output configuration not provided"): engine.apply_checks_and_save_in_tables(run_configs=[run_config]) @@ -1676,7 +1678,7 @@ def test_apply_checks_and_save_in_tables_for_patterns_no_tables_matching(ws, spa engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) # This should not raise an error - with pytest.raises(ValueError, match="No tables found matching include or exclude criteria"): + with pytest.raises(NotFound, match="No tables found matching include or exclude criteria"): engine.apply_checks_and_save_in_tables_for_patterns( patterns=["main.non_existent_schema.*"], checks_location="some/location" ) @@ -1687,7 +1689,7 @@ def test_apply_checks_and_save_in_tables_for_patterns_exclude_no_tables_matching engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) # This should not raise an error - with pytest.raises(ValueError, match="No tables found matching include or exclude criteria"): + with pytest.raises(NotFound, match="No tables found matching include or exclude criteria"): engine.apply_checks_and_save_in_tables_for_patterns( patterns=["*"], checks_location="some/location", exclude_matched=True ) diff --git a/tests/integration/test_io.py b/tests/integration/test_io.py index c82ad571c..d206946da 100644 --- a/tests/integration/test_io.py +++ b/tests/integration/test_io.py @@ -1,6 +1,7 @@ import pytest from chispa.dataframe_comparer import assert_df_equality # type: ignore from databricks.labs.dqx.config import InputConfig, OutputConfig +from databricks.labs.dqx.errors import InvalidConfigError from databricks.labs.dqx.io import read_input_data, save_dataframe_as_table, get_reference_dataframes @@ -25,7 +26,7 @@ def test_read_invalid_input_location(spark): input_config = InputConfig(location=input_location) with pytest.raises( - ValueError, + InvalidConfigError, match="Invalid input location. It must be a 2 or 3-level table namespace or storage path, given invalid/location", ): read_input_data(spark, input_config) @@ -36,7 +37,7 @@ def test_read_invalid_input_table(spark): input_config = InputConfig(location=input_location) with pytest.raises( - ValueError, + InvalidConfigError, match="Invalid input location. It must be a 2 or 3-level table namespace or storage path, given table", ): read_input_data(spark, input_config) diff --git a/tests/integration/test_profiler.py b/tests/integration/test_profiler.py index dc931d10b..6cb1fdaad 100644 --- a/tests/integration/test_profiler.py +++ b/tests/integration/test_profiler.py @@ -3,6 +3,8 @@ import pytest import pyspark.sql.types as T +from databricks.sdk.errors import NotFound + from databricks.labs.dqx.profiler.profiler import DQProfiler, DQProfile from databricks.labs.dqx.errors import MissingParameterError @@ -839,7 +841,7 @@ def test_profile_tables_no_pattern_match(spark, ws, make_schema, make_random): no_match_pattern = "nonexistent_catalog.*" profiler = DQProfiler(ws) options = [{"table": table1_name, "options": {"sample_fraction": None}}] - with pytest.raises(ValueError, match="No tables found matching include or exclude criteria"): + with pytest.raises(NotFound, match="No tables found matching include or exclude criteria"): profiler.profile_tables(patterns=[no_match_pattern], options=options) diff --git a/tests/integration/test_utils.py b/tests/integration/test_utils.py index 39a4be645..6def37c00 100644 --- a/tests/integration/test_utils.py +++ b/tests/integration/test_utils.py @@ -1,4 +1,6 @@ import pytest +from databricks.sdk.errors import NotFound + from databricks.labs.dqx.utils import list_tables @@ -38,5 +40,5 @@ def test_list_tables(spark, ws, make_schema, make_random): def test_list_tables_no_matching(spark, ws, make_random): - with pytest.raises(ValueError, match="No tables found matching include or exclude criteria"): + with pytest.raises(NotFound, match="No tables found matching include or exclude criteria"): list_tables(ws, patterns=[f"non_existent_catalog_{make_random(10).lower()}.*"]) diff --git a/tests/unit/test_storage_factory.py b/tests/unit/test_storage_factory.py index 0d90d2376..2f161700a 100644 --- a/tests/unit/test_storage_factory.py +++ b/tests/unit/test_storage_factory.py @@ -15,7 +15,7 @@ InstallationChecksStorageHandler, ) from databricks.labs.dqx.config import InstallationChecksStorageConfig, BaseChecksStorageConfig - +from databricks.labs.dqx.errors import InvalidConfigError workspace_client_mock = create_autospec(ChecksStorageHandlerFactory, instance=True) spark_mock = create_autospec(ChecksStorageHandlerFactory, instance=True) @@ -57,7 +57,7 @@ class UnsupportedConfig(BaseChecksStorageConfig): pass config = UnsupportedConfig() - with pytest.raises(ValueError, match="Unsupported storage config type"): + with pytest.raises(InvalidConfigError, match="Unsupported storage config type"): STORAGE_FACTORY.create(config) From 36ff06b9a84f042da36cada79ef287d4a890982a Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Tue, 30 Sep 2025 13:22:15 +0200 Subject: [PATCH 40/64] fmt --- src/databricks/labs/dqx/profiler/profiler.py | 2 +- src/databricks/labs/dqx/utils.py | 7 +++---- tests/integration/test_apply_checks_and_save_in_table.py | 3 +-- tests/integration/test_profiler.py | 1 - 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/databricks/labs/dqx/profiler/profiler.py b/src/databricks/labs/dqx/profiler/profiler.py index c1c931e8d..98bf35995 100644 --- a/src/databricks/labs/dqx/profiler/profiler.py +++ b/src/databricks/labs/dqx/profiler/profiler.py @@ -21,7 +21,7 @@ from databricks.labs.dqx.io import read_input_data from databricks.labs.dqx.utils import list_tables from databricks.labs.dqx.telemetry import telemetry_logger -from databricks.labs.dqx.errors import MissingParameterError, InvalidParameterError +from databricks.labs.dqx.errors import InvalidParameterError logger = logging.getLogger(__name__) diff --git a/src/databricks/labs/dqx/utils.py b/src/databricks/labs/dqx/utils.py index b8cdbcaa5..5a98dee69 100644 --- a/src/databricks/labs/dqx/utils.py +++ b/src/databricks/labs/dqx/utils.py @@ -5,7 +5,6 @@ from typing import Any from fnmatch import fnmatch -from databricks.sdk.errors import NotFound from pyspark.sql import Column # Import spark connect column if spark session is created using spark connect @@ -16,8 +15,8 @@ from databricks.sdk import WorkspaceClient from databricks.labs.blueprint.limiter import rate_limited -from databricks.labs.dqx.errors import InvalidParameterError, InvalidConfigError -from databricks.labs.dqx.config import InputConfig, OutputConfig +from databricks.labs.dqx.errors import InvalidParameterError +from databricks.sdk.errors import NotFound logger = logging.getLogger(__name__) @@ -134,7 +133,6 @@ def normalize_bound_args(val: Any) -> Any: Normalized value or collection. Raises: - InvalidParameterError: If a column resolves to an invalid name. TypeError: If a column type is unsupported. """ if isinstance(val, (list, tuple, set)): @@ -261,6 +259,7 @@ def _split_pattern(pattern: str) -> tuple[str, str, str]: table = ".".join(parts[2:]) if len(parts) > 2 else "*" return catalog, schema, table + def _build_include_scope_for_patterns(patterns: list[str]) -> tuple[set[str] | None, dict[str, set[str]] | None]: """ Builds allowed catalogs and schemas from a list of wildcard patterns. diff --git a/tests/integration/test_apply_checks_and_save_in_table.py b/tests/integration/test_apply_checks_and_save_in_table.py index b6b788780..661d05db0 100644 --- a/tests/integration/test_apply_checks_and_save_in_table.py +++ b/tests/integration/test_apply_checks_and_save_in_table.py @@ -1,10 +1,9 @@ import tempfile import pytest -from databricks.sdk.errors import NotFound from pyspark.sql.functions import col, lit, when from pyspark.sql import Column from chispa.dataframe_comparer import assert_df_equality # type: ignore - +from databricks.sdk.errors import NotFound from databricks.labs.dqx import check_funcs from databricks.labs.dqx.config import ( InputConfig, diff --git a/tests/integration/test_profiler.py b/tests/integration/test_profiler.py index 6cb1fdaad..47438512a 100644 --- a/tests/integration/test_profiler.py +++ b/tests/integration/test_profiler.py @@ -6,7 +6,6 @@ from databricks.sdk.errors import NotFound from databricks.labs.dqx.profiler.profiler import DQProfiler, DQProfile -from databricks.labs.dqx.errors import MissingParameterError def test_profiler(spark, ws): From 5eb4c13cbf2a2a034192995878da0ced4505b836 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Tue, 30 Sep 2025 14:17:53 +0200 Subject: [PATCH 41/64] test --- tests/integration/test_apply_checks.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/integration/test_apply_checks.py b/tests/integration/test_apply_checks.py index 796f927dc..3d57a034b 100644 --- a/tests/integration/test_apply_checks.py +++ b/tests/integration/test_apply_checks.py @@ -818,7 +818,13 @@ def test_foreign_key_check_on_tables(ws, spark, make_schema, make_random): assert_df_equality(checked, expected, ignore_nullable=True) -def test_foreign_key_check_missing_ref_df(ws, spark): +def test_foreign_key_check_missing_ref_df(ws, spark, debug_env): + if "DATABRICKS_SERVERLESS_COMPUTE_ID" in debug_env: + print("DATABRICKS_SERVERLESS_COMPUTE_ID") + cluster_id = debug_env.get("DATABRICKS_CLUSTER_ID") + if not cluster_id: + raise ValueError("DATABRICKS_CLUSTER_ID is not set in debug_env") + dq_engine = DQEngine(workspace_client=ws, extra_params=EXTRA_PARAMS) src_df = spark.createDataFrame( From ba36518096c99880d0f59036f64256500b638cbb Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Tue, 30 Sep 2025 14:21:51 +0200 Subject: [PATCH 42/64] test --- tests/integration/test_apply_checks.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/integration/test_apply_checks.py b/tests/integration/test_apply_checks.py index 3d57a034b..796f927dc 100644 --- a/tests/integration/test_apply_checks.py +++ b/tests/integration/test_apply_checks.py @@ -818,13 +818,7 @@ def test_foreign_key_check_on_tables(ws, spark, make_schema, make_random): assert_df_equality(checked, expected, ignore_nullable=True) -def test_foreign_key_check_missing_ref_df(ws, spark, debug_env): - if "DATABRICKS_SERVERLESS_COMPUTE_ID" in debug_env: - print("DATABRICKS_SERVERLESS_COMPUTE_ID") - cluster_id = debug_env.get("DATABRICKS_CLUSTER_ID") - if not cluster_id: - raise ValueError("DATABRICKS_CLUSTER_ID is not set in debug_env") - +def test_foreign_key_check_missing_ref_df(ws, spark): dq_engine = DQEngine(workspace_client=ws, extra_params=EXTRA_PARAMS) src_df = spark.createDataFrame( From 9061e130d0bd54dea5094f78c397278562723c95 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Wed, 1 Oct 2025 12:46:41 +0200 Subject: [PATCH 43/64] added exclusion pattern --- demos/dqx_multi_table_demo.py | 14 ++- docs/dqx/docs/guide/data_profiling.mdx | 22 ++++- docs/dqx/docs/guide/quality_checks_apply.mdx | 10 +- docs/dqx/docs/reference/engine.mdx | 32 +++---- docs/dqx/docs/reference/profiler.mdx | 10 +- src/databricks/labs/dqx/engine.py | 22 ++++- src/databricks/labs/dqx/profiler/profiler.py | 22 ++++- .../labs/dqx/profiler/profiler_runner.py | 6 +- src/databricks/labs/dqx/utils.py | 15 ++- tests/integration/test_apply_checks.py | 28 +++++- .../test_apply_checks_and_save_in_table.py | 93 ++++++++++++++++++ tests/integration/test_profiler.py | 95 +++++++++++++++---- tests/integration/test_utils.py | 32 +++++++ 13 files changed, 341 insertions(+), 60 deletions(-) diff --git a/demos/dqx_multi_table_demo.py b/demos/dqx_multi_table_demo.py index 028014f1d..73568e650 100644 --- a/demos/dqx_multi_table_demo.py +++ b/demos/dqx_multi_table_demo.py @@ -173,9 +173,10 @@ # COMMAND ---------- -# Apply checks to multiple tables using patterns +# Apply checks to multiple tables using patterns, but skip existing output and quarantine tables based on the suffixes dq_engine.apply_checks_and_save_in_tables_for_patterns( patterns=[f"{demo_catalog_name}.{demo_schema_name}.users*"], # apply quality checks for all tables matching the patterns + exclude_patterns=exclude_patterns, # skip existing output tables checks_location=checks_table, # as delta table or absolute workspace or volume directory. For file based locations, checks are expected to be found under {checks_location}/{table_name}.yml. run_config_template=RunConfig( # input config is auto-created if not provided; location is skipped in any case and derived from patterns @@ -212,7 +213,7 @@ # COMMAND ---------- # MAGIC %md -# MAGIC Profile input tables, generate and save checks +# MAGIC Profile input tables, generate and save checks. # COMMAND ---------- @@ -222,8 +223,14 @@ profiler = DQProfiler(ws, spark) generator = DQGenerator(ws) +# Include tables matching the patterns, but skip existing output and quarantine tables based on the suffixes patterns = [f"{demo_catalog_name}.{demo_schema_name}.users*"] -results = profiler.profile_tables(patterns=patterns) +exclude_patterns=["*_checked", "*_quarantine"] # skip existing output tables based on suffixes + +results = profiler.profile_tables_for_patterns( + patterns=patterns, + exclude_patterns=exclude_patterns, +) for table, (summary_stats, profiles) in results.items(): checks = generator.generate_dq_rules(profiles) @@ -246,6 +253,7 @@ # Apply checks on multiple tables using patterns dq_engine.apply_checks_and_save_in_tables_for_patterns( patterns=patterns, + exclude_patterns=exclude_patterns, # skip existing output tables checks_location=checks_table, output_table_suffix="_checked", # run_config_template with quarantine_config not provided - don't quarantine bad data diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index b783247b4..eb84d9176 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -114,7 +114,7 @@ The profiler can discover and profile multiple tables accessible via Unity Catal profiler = DQProfiler(ws) # Profile several tables by name - results = profiler.profile_tables( + results = profiler.profile_tables_for_patterns( patterns=["main.data.table_001", "main.data.table_002"] ) @@ -125,7 +125,7 @@ The profiler can discover and profile multiple tables accessible via Unity Catal print(f"Generated profiles: {profiles}") # Profile several tables by wildcard patterns - results = profiler.profile_tables( + results = profiler.profile_tables_for_patterns( patterns=["main.*", "data.*"] ) @@ -136,11 +136,23 @@ The profiler can discover and profile multiple tables accessible via Unity Catal print(f"Generated profiles: {profiles}") # Exclude tables matching specific patterns - results = profiler.profile_tables( + results = profiler.profile_tables_for_patterns( patterns=["sys.*", "*_tmp"], exclude_matched=True ) + # Process results for each table + for table, (summary_stats, profiles) in results.items(): + print(f"Table: {table}") + print(f"Table statistics: {summary_stats}") + print(f"Generated profiles: {profiles}") + + # Exclude tables matching specific patterns + results = profiler.profile_tables_for_patterns( + patterns=["sys.*", "*_tmp"], + exclude_patterns=["*_dq_output", "*_dq_quarantine"], # skip existing output tables using suffixes + ) + # Process results for each table for table, (summary_stats, profiles) in results.items(): print(f"Table: {table}") @@ -409,10 +421,10 @@ Wildcard patterns are supported, allowing you to match table names and apply spe ] # Profile multiple tables using custom options - results = profiler.profile_tables(patterns=tables, options=custom_table_options) + results = profiler.profile_tables_for_patterns(patterns=tables, options=custom_table_options) # Profile multiple tables by wildcard patterns using custom options - results = profiler.profile_tables( + results = profiler.profile_tables_for_patterns( patterns=["dqx.*"], options=custom_table_options ) diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index 886a541df..e1120d6e1 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -290,11 +290,18 @@ Apply checks on tables using wildcard patterns: # Perform quality checking on all tables matching the patterns patterns = ["catalog.schema.*", "catalog.schema2.input_data_003"] + # Skip output tables using suffixes + exclude_patterns=["*_dq_output", "*_dq_quarantine", "*_checked", "*_quarantine"] + # (Optional step) profile input data and generate quality rules candidates profiler = DQProfiler(ws, spark) generator = DQGenerator(ws) - results = profiler.profile_tables(patterns=patterns) + # Profile tables based on patterns and + results = profiler.profile_tables_for_patterns( + patterns=patterns, + exclude_patterns=exclude_patterns, + ) # Save quality checks to a table for table, (summary_stats, profiles) in results.items(): @@ -311,6 +318,7 @@ Apply checks on tables using wildcard patterns: # Apply checks on multiple tables using patterns and prefilled run config parameters dq_engine.apply_checks_and_save_in_tables_for_patterns( patterns=patterns, + exclude_patterns=exclude_patterns, checks_location=checks_table, run_config_template=RunConfig( # auto-created if not provided; location skipped and derived from patterns diff --git a/docs/dqx/docs/reference/engine.mdx b/docs/dqx/docs/reference/engine.mdx index fa3ba43cb..6cbfd5e72 100644 --- a/docs/dqx/docs/reference/engine.mdx +++ b/docs/dqx/docs/reference/engine.mdx @@ -49,22 +49,22 @@ The following table outlines the available methods of the `DQEngine` and their f

**Available DQX engine methods** -| Method | Description | Arguments | Supports local execution | -| ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | -| `apply_checks` | Applies quality checks to the DataFrame and returns a DataFrame with result columns. | `df`: DataFrame to check; `checks`: List of checks defined using DQX classes, each check is an instance of the DQRule class; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | -| `apply_checks_and_split` | Applies quality checks to the DataFrame and returns valid and invalid (quarantine) DataFrames with result columns. | `df`: DataFrame to check; `checks`: List of checks defined using DQX classes, each check is an instance of the DQRule class; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | -| `apply_checks_and_save_in_table` | Applies quality checks using DQRule objects and writes results to valid and invalid Delta table(s) with result columns. | `input_config`: `InputConfig` object with the table name and options for reading the input data; `checks`: List of checks defined using DQX classes, each check is an instance of the DQRule class; `output_config`: `OutputConfig` object with the table name, output mode, and options for the output data; `quarantine_config`: `OutputConfig` object with the table name, output mode, and options for the quarantine data - if provided, data will be split; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | No | -| `apply_checks_by_metadata` | Applies quality checks defined as a dictionary to the DataFrame and returns a DataFrame with result columns. | `df`: DataFrame to check; `checks`: List of checks defined as dictionary; `custom_check_functions`: (optional) Dictionary with custom check functions (e.g., globals() of the calling module); `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | -| `apply_checks_by_metadata_and_split` | Applies quality checks defined as a dictionary and returns valid and invalid (quarantine) DataFrames. | `df`: DataFrame to check; `checks`: List of checks defined as dictionary; `custom_check_functions`: (optional) Dictionary with custom check functions (e.g., globals() of the calling module); `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | -| `apply_checks_by_metadata_and_save_in_table` | Applies quality checks defined as a dictionary and writes results to valid and invalid Delta table(s) with result columns. | `input_config`: `InputConfig` object with the table name and options for reading the input data; `checks`: List of checks defined as dictionary; `output_config`: `OutputConfig` object with the table name, output mode, and options for the output data; `quarantine_config`: `OutputConfig` object with the table name, output mode, and options for the quarantine data - if provided, data will be split; `custom_check_functions`: (optional) Dictionary with custom check functions; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | No | -| `apply_checks_and_save_in_tables` | Applies quality checks persisted in a storage to multiple tables and writes results to valid and invalid Delta table(s) with result columns. | `run_configs`: list of run config objects (`RunConfig`) containing input config (`InputConfig`), output config (`OutputConfig`), quarantine config (`OutputConfig`, if provided data will be split), 'checks_location', and if provided 'reference_tables' and 'custom_check_functions'; `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores). | No | -| `apply_checks_and_save_in_tables_for_patterns` | Applies quality checks persisted in a storage to multiple tables matching provided wildcard patterns and writes results to valid and invalid Delta table(s) with result columns. | `patterns`: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include (if None, all tables are included); `checks_location`: Location of the checks files (e.g. absolute workspace or volume directory or delta table), for file based locations, checks are expected to be found under 'checks_location/<input_table>.yml'; `exclude_matched`:(optional) Whether to exclude matched tables (default False); `run_config_template`: (optional) Run configuration template to use for all tables (skip location in the 'input_config', 'output_config', and 'quarantine_config' fields as it is derived from patterns, skip 'checks_location' of the run config as it is derived separately, autogenerate 'input_config' and 'output_config' if not provided, use 'reference_tables' and 'custom_check_functions' if provided; `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores); `output_table_suffix`: (optional) Suffix to append to the output table name; `quarantine_table_suffix`: (optional) Suffix to append to the quarantine table name; | No | -| `validate_checks` | Validates the provided quality checks to ensure they conform to the expected structure and types. | `checks`: List of checks to validate; `custom_check_functions`: (optional) Dictionary of custom check functions that can be used; `validate_custom_check_functions`: (optional) If set to True, validates custom check functions (defaults to True). | Yes | -| `get_invalid` | Retrieves records from the DataFrame that violate data quality checks (records with warnings and errors). | `df`: Input DataFrame. | Yes | -| `get_valid` | Retrieves records from the DataFrame that pass all data quality checks. | `df`: Input DataFrame. | Yes | -| `load_checks` | Loads quality rules (checks) from storage backend. Multiple storage backends are supported including tables, files or workspace files, installation-managed sources where the location is inferred automatically from run config. | `config`: Configuration for loading checks from a storage backend, i.e. `FileChecksStorageConfig`: file in a local filesystem (YAML or JSON), or workspace files if invoked from Databricks notebook or job; `WorkspaceFileChecksStorageConfig`: file in a workspace (YAML or JSON) using absolute paths; `VolumeFileChecksStorageConfig`: file in a Unity Catalog Volume (YAML or JSON); `TableChecksStorageConfig`: a table; `InstallationChecksStorageConfig`: installation-managed storage backend, using the `checks_location` field from the run configuration. See more details below. | Yes (only with `FileChecksStorageConfig`) | -| `save_checks` | Saves quality rules (checks) to storage backend. Multiple storage backends are supported including tables, files or workspace files, installation-managed targets where the location is inferred automatically from run config. | `checks`: List of checks defined as dictionary; `config`: Configuration for saving checks in a storage backend, i.e. `FileChecksStorageConfig`: file in a local filesystem (YAML or JSON), or workspace files if invoked from Databricks notebook or job; `WorkspaceFileChecksStorageConfig`: file in a workspace (YAML or JSON); `VolumeFileChecksStorageConfig`: file in a Unity Catalog Volume (YAML or JSON); `TableChecksStorageConfig`: a table; `InstallationChecksStorageConfig`: storage defined in the installation context, using the `checks_location` field from the run configuration. See more details below. | Yes (only with `FileChecksStorageConfig`) | -| `save_results_in_table` | Save quality checking results in delta table(s). | `output_df`: (optional) Dataframe containing the output data; `quarantine_df`: (optional) Dataframe containing the output data; `output_config`: `OutputConfig` object with the table name, output mode, and options for the output data; `quarantine_config`: `OutputConfig` object with the table name, output mode, and options for the quarantine data - if provided, data will be split; `run_config_name`: Name of the run config to use; `install_folder`: (optional) installation folder where DQX is installed, only required when custom installation folder is used; `assume_user`: (optional) If True, assume user installation, otherwise global installation (skipped if `install_folder` is provided). | No | +| Method | Description | Arguments | Supports local execution | +| ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | +| `apply_checks` | Applies quality checks to the DataFrame and returns a DataFrame with result columns. | `df`: DataFrame to check; `checks`: List of checks defined using DQX classes, each check is an instance of the DQRule class; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | +| `apply_checks_and_split` | Applies quality checks to the DataFrame and returns valid and invalid (quarantine) DataFrames with result columns. | `df`: DataFrame to check; `checks`: List of checks defined using DQX classes, each check is an instance of the DQRule class; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | +| `apply_checks_and_save_in_table` | Applies quality checks using DQRule objects and writes results to valid and invalid Delta table(s) with result columns. | `input_config`: `InputConfig` object with the table name and options for reading the input data; `checks`: List of checks defined using DQX classes, each check is an instance of the DQRule class; `output_config`: `OutputConfig` object with the table name, output mode, and options for the output data; `quarantine_config`: `OutputConfig` object with the table name, output mode, and options for the quarantine data - if provided, data will be split; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | No | +| `apply_checks_by_metadata` | Applies quality checks defined as a dictionary to the DataFrame and returns a DataFrame with result columns. | `df`: DataFrame to check; `checks`: List of checks defined as dictionary; `custom_check_functions`: (optional) Dictionary with custom check functions (e.g., globals() of the calling module); `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | +| `apply_checks_by_metadata_and_split` | Applies quality checks defined as a dictionary and returns valid and invalid (quarantine) DataFrames. | `df`: DataFrame to check; `checks`: List of checks defined as dictionary; `custom_check_functions`: (optional) Dictionary with custom check functions (e.g., globals() of the calling module); `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | Yes | +| `apply_checks_by_metadata_and_save_in_table` | Applies quality checks defined as a dictionary and writes results to valid and invalid Delta table(s) with result columns. | `input_config`: `InputConfig` object with the table name and options for reading the input data; `checks`: List of checks defined as dictionary; `output_config`: `OutputConfig` object with the table name, output mode, and options for the output data; `quarantine_config`: `OutputConfig` object with the table name, output mode, and options for the quarantine data - if provided, data will be split; `custom_check_functions`: (optional) Dictionary with custom check functions; `ref_dfs`: (optional) Reference dataframes to use in the checks, if applicable. | No | +| `apply_checks_and_save_in_tables` | Applies quality checks persisted in a storage to multiple tables and writes results to valid and invalid Delta table(s) with result columns. | `run_configs`: list of run config objects (`RunConfig`) containing input config (`InputConfig`), output config (`OutputConfig`), quarantine config (`OutputConfig`, if provided data will be split), 'checks_location', and if provided 'reference_tables' and 'custom_check_functions'; `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores). | No | +| `apply_checks_and_save_in_tables_for_patterns` | Applies quality checks persisted in a storage to multiple tables matching provided wildcard patterns and writes results to valid and invalid Delta table(s) with result columns. Skip output and quarantine tables based on specified suffixes. | `patterns`: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include (if None, all tables are included); ; `exclude_patterns`: (optional) List of table names or filesystem-style wildcards (e.g. '*_dq_output') to exclude, useful if wanting to exclude existing output or quarantine tables; `checks_location`: Location of the checks files (e.g. absolute workspace or volume directory or delta table), for file based locations, checks are expected to be found under 'checks_location/<input_table>.yml'; `exclude_matched`:(optional) Whether to exclude matched tables (default False); `run_config_template`: (optional) Run configuration template to use for all tables (skip location in the 'input_config', 'output_config', and 'quarantine_config' fields as it is derived from patterns, skip 'checks_location' of the run config as it is derived separately, autogenerate 'input_config' and 'output_config' if not provided, use 'reference_tables' and 'custom_check_functions' if provided; `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores); `output_table_suffix`: (optional) Suffix to append to the output table name (default "_dq_output"); `quarantine_table_suffix`: (optional) Suffix to append to the quarantine table name (default "_dq_quarantine"). | No | +| `validate_checks` | Validates the provided quality checks to ensure they conform to the expected structure and types. | `checks`: List of checks to validate; `custom_check_functions`: (optional) Dictionary of custom check functions that can be used; `validate_custom_check_functions`: (optional) If set to True, validates custom check functions (defaults to True). | Yes | +| `get_invalid` | Retrieves records from the DataFrame that violate data quality checks (records with warnings and errors). | `df`: Input DataFrame. | Yes | +| `get_valid` | Retrieves records from the DataFrame that pass all data quality checks. | `df`: Input DataFrame. | Yes | +| `load_checks` | Loads quality rules (checks) from storage backend. Multiple storage backends are supported including tables, files or workspace files, installation-managed sources where the location is inferred automatically from run config. | `config`: Configuration for loading checks from a storage backend, i.e. `FileChecksStorageConfig`: file in a local filesystem (YAML or JSON), or workspace files if invoked from Databricks notebook or job; `WorkspaceFileChecksStorageConfig`: file in a workspace (YAML or JSON) using absolute paths; `VolumeFileChecksStorageConfig`: file in a Unity Catalog Volume (YAML or JSON); `TableChecksStorageConfig`: a table; `InstallationChecksStorageConfig`: installation-managed storage backend, using the `checks_location` field from the run configuration. See more details below. | Yes (only with `FileChecksStorageConfig`) | +| `save_checks` | Saves quality rules (checks) to storage backend. Multiple storage backends are supported including tables, files or workspace files, installation-managed targets where the location is inferred automatically from run config. | `checks`: List of checks defined as dictionary; `config`: Configuration for saving checks in a storage backend, i.e. `FileChecksStorageConfig`: file in a local filesystem (YAML or JSON), or workspace files if invoked from Databricks notebook or job; `WorkspaceFileChecksStorageConfig`: file in a workspace (YAML or JSON); `VolumeFileChecksStorageConfig`: file in a Unity Catalog Volume (YAML or JSON); `TableChecksStorageConfig`: a table; `InstallationChecksStorageConfig`: storage defined in the installation context, using the `checks_location` field from the run configuration. See more details below. | Yes (only with `FileChecksStorageConfig`) | +| `save_results_in_table` | Save quality checking results in delta table(s). | `output_df`: (optional) Dataframe containing the output data; `quarantine_df`: (optional) Dataframe containing the output data; `output_config`: `OutputConfig` object with the table name, output mode, and options for the output data; `quarantine_config`: `OutputConfig` object with the table name, output mode, and options for the quarantine data - if provided, data will be split; `run_config_name`: Name of the run config to use; `install_folder`: (optional) installation folder where DQX is installed, only required when custom installation folder is used; `assume_user`: (optional) If True, assume user installation, otherwise global installation (skipped if `install_folder` is provided). | No | The 'Supports local execution' in the above table indicates which methods can be used for local testing without a Databricks workspace (see the usage in [local testing section](/docs/reference/testing/#local-execution-and-testing-with-dqengine)). diff --git a/docs/dqx/docs/reference/profiler.mdx b/docs/dqx/docs/reference/profiler.mdx index ae038edad..08939992c 100644 --- a/docs/dqx/docs/reference/profiler.mdx +++ b/docs/dqx/docs/reference/profiler.mdx @@ -40,11 +40,11 @@ The `DQProfiler` class provides methods to analyze datasets and generate data qu
**Available DQProfiler methods** -| Method | Description | Arguments | -| -------------------------- | --------------------------------------------------------------------------------------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `profile` | Profiles a DataFrame to generate summary statistics and data quality rules. | `df`: DataFrame to profile; `columns`: Optional list of column names to include (default: all columns); `options`: Optional dictionary of profiling options (merged with defaults). | -| `profile_table` | Profiles a table to generate summary statistics and data quality rules. | `table`: Fully-qualified table name to profile (e.g. 'catalog.schema.table'); `columns`: Optional list of column names to include (default: all columns); `options`: Optional dictionary of profiling options (merged with default options); | -| `profile_tables` | Profiles multiple tables in Unity Catalog with pattern matching. | `patterns`: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include (if None, all tables are included); `exclude_matched`: Whether to exclude matched tables (default False); `columns`: Optional dictionary with table names as keys and lists of column names to include as values (default: all columns); `options`: Optional list of dictionaries with table names (or table wildcard patterns) as key and profiling options as values (merged with default options); `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores). | +| Method | Description | Arguments | +| ----------------------------- | ----------------------------------------------------------------------------- |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `profile` | Profiles a DataFrame to generate summary statistics and data quality rules. | `df`: DataFrame to profile; `columns`: Optional list of column names to include (default: all columns); `options`: Optional dictionary of profiling options (merged with defaults). | +| `profile_table` | Profiles a table to generate summary statistics and data quality rules. | `table`: Fully-qualified table name to profile (e.g. 'catalog.schema.table'); `columns`: Optional list of column names to include (default: all columns); `options`: Optional dictionary of profiling options (merged with default options); | +| `profile_tables_for_patterns` | Profiles multiple tables in Unity Catalog with pattern matching. | `patterns`: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include (if None, all tables are included); `exclude_matched`: Whether to exclude matched tables (default False); `columns`: Optional dictionary with table names as keys and lists of column names to include as values (default: all columns); `options`: Optional list of dictionaries with table names (or table wildcard patterns) as key and profiling options as values (merged with default options); `max_parallelism`: (optional) Maximum number of tables to check in parallel (defaults to the number of CPU cores); `exclude_patterns`: (optional) List of table names or filesystem-style wildcards (e.g. '*_dq_output') to exclude, useful if wanting to exclude existing output or quarantine tables. |
diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index cb52051ab..18012c0e9 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -38,7 +38,7 @@ from databricks.labs.dqx.io import read_input_data, save_dataframe_as_table, get_reference_dataframes from databricks.labs.dqx.telemetry import telemetry_logger, log_telemetry from databricks.sdk import WorkspaceClient -from databricks.labs.dqx.errors import InvalidCheckError, InvalidConfigError +from databricks.labs.dqx.errors import InvalidCheckError, InvalidConfigError, InvalidParameterError from databricks.labs.dqx.utils import list_tables logger = logging.getLogger(__name__) @@ -608,6 +608,7 @@ def apply_checks_and_save_in_tables_for_patterns( self, patterns: list[str], # can use wildcard e.g. catalog.schema.* checks_location: str, # use as prefix for checks defined in files + exclude_patterns: list[str] | None = None, exclude_matched: bool = False, run_config_template: RunConfig = RunConfig(), max_parallelism: int | None = os.cpu_count(), @@ -632,24 +633,37 @@ def apply_checks_and_save_in_tables_for_patterns( For file based locations, checks are expected to be found under {checks_location}/{table_name}.yml. exclude_matched (bool): Specifies whether to include tables matched by the pattern. If True, matched tables are excluded. If False, matched tables are included. + exclude_patterns: List of table names or filesystem-style wildcards to exclude. + If None, no tables are excluded. run_config_template: Run configuration template to use for all tables. Skip location in the input_config, output_config, and quarantine_config as it is derived from patterns. Skip checks_location of the run config as it is derived separately. Autogenerate input_config and output_config if not provided. max_parallelism (int): Maximum number of tables to check in parallel. - output_table_suffix (str): Suffix to append to the output table name. - quarantine_table_suffix (str): Suffix to append to the quarantine table name. + output_table_suffix: Suffix to append to the original table name for the output table. + quarantine_table_suffix: Suffix to append to the original table name for the quarantine table. Returns: None """ + if not output_table_suffix: + raise InvalidParameterError("Output table suffix cannot be empty.") + + if run_config_template.quarantine_config and not quarantine_table_suffix: + raise InvalidParameterError("Quarantine table suffix cannot be empty.") + if run_config_template.input_config is None: run_config_template.input_config = InputConfig(location="") # location derived from patterns if run_config_template.output_config is None: run_config_template.output_config = OutputConfig(location="") # location derived from patterns - tables = list_tables(self.ws, patterns, exclude_matched) + tables = list_tables( + workspace_client=self.ws, + patterns=patterns, + exclude_matched=exclude_matched, + exclude_patterns=exclude_patterns, + ) run_configs = [] for table in tables: diff --git a/src/databricks/labs/dqx/profiler/profiler.py b/src/databricks/labs/dqx/profiler/profiler.py index 98bf35995..0c787e7d4 100644 --- a/src/databricks/labs/dqx/profiler/profiler.py +++ b/src/databricks/labs/dqx/profiler/profiler.py @@ -135,10 +135,11 @@ def profile_table( df = read_input_data(spark=self.spark, input_config=InputConfig(location=table)) return self.profile(df=df, columns=columns, options=options) - @telemetry_logger("profiler", "profile_tables") - def profile_tables( + @telemetry_logger("profiler", "profile_tables_for_patterns") + def profile_tables_for_patterns( self, patterns: list[str] | None = None, + exclude_patterns: list[str] | None = None, exclude_matched: bool = False, columns: dict[str, list[str]] | None = None, options: list[dict[str, Any]] | None = None, @@ -150,6 +151,8 @@ def profile_tables( Args: patterns: List of table names or filesystem-style wildcards (e.g. 'schema.*') to include. If None, all tables are included. By default, tables matching the pattern are included. + exclude_patterns: List of table names or filesystem-style wildcards (e.g. 'schema.*') to exclude. + If None, no tables are excluded. exclude_matched: Specifies whether to include tables matched by the pattern. If True, matched tables are excluded. If False, matched tables are included. columns: A dictionary with column names to include in the profile. Keys should be fully-qualified table @@ -161,8 +164,19 @@ def profile_tables( Returns: A dictionary mapping table names to tuples containing summary statistics and data quality profiles. """ - tables = list_tables(client=self.ws, patterns=patterns, exclude_matched=exclude_matched) - return self._profile_tables(tables=tables, columns=columns, options=options, max_parallelism=max_parallelism) + tables = list_tables( + workspace_client=self.ws, + patterns=patterns, + exclude_matched=exclude_matched, + exclude_patterns=exclude_patterns, + ) + + return self._profile_tables( + tables=tables, + columns=columns, + options=options, + max_parallelism=max_parallelism, + ) def _profile_tables( self, diff --git a/src/databricks/labs/dqx/profiler/profiler_runner.py b/src/databricks/labs/dqx/profiler/profiler_runner.py index 50911213f..30013692f 100644 --- a/src/databricks/labs/dqx/profiler/profiler_runner.py +++ b/src/databricks/labs/dqx/profiler/profiler_runner.py @@ -113,7 +113,11 @@ def run_for_patterns( }, } ] - results = self.profiler.profile_tables(patterns=patterns, options=options, max_parallelism=max_parallelism) + + # Include tables matching the patterns, but skip existing output and quarantine tables. + results = self.profiler.profile_tables_for_patterns( + patterns=patterns, options=options, max_parallelism=max_parallelism + ) for table, (summary_stats, profiles) in results.items(): checks = self.generator.generate_dq_rules(profiles) # use default criticality level "error" diff --git a/src/databricks/labs/dqx/utils.py b/src/databricks/labs/dqx/utils.py index 5a98dee69..e96c6fe65 100644 --- a/src/databricks/labs/dqx/utils.py +++ b/src/databricks/labs/dqx/utils.py @@ -214,15 +214,21 @@ def safe_json_load(value: str): @rate_limited(max_requests=100) -def list_tables(client: WorkspaceClient, patterns: list[str] | None, exclude_matched: bool = False) -> list[str]: +def list_tables( + workspace_client: WorkspaceClient, + patterns: list[str] | None, + exclude_matched: bool = False, + exclude_patterns: list[str] | None = None, +) -> list[str]: """ Gets a list of table names from Unity Catalog given a list of wildcard patterns. Args: - client (WorkspaceClient): Databricks SDK WorkspaceClient. + workspace_client (WorkspaceClient): Databricks SDK WorkspaceClient. patterns (list[str] | None): A list of wildcard patterns to match against the table name. exclude_matched (bool): Specifies whether to include tables matched by the pattern. If True, matched tables are excluded. If False, matched tables are included. + exclude_patterns (list[str] | None): A list of wildcard patterns to exclude from the table names. Returns: list[str]: A list of fully qualified table names. @@ -232,11 +238,14 @@ def list_tables(client: WorkspaceClient, patterns: list[str] | None, exclude_mat NotFound: If no tables are found matching the include or exclude criteria. """ allowed_catalogs, allowed_schemas = _get_allowed_catalogs_and_schemas(patterns, exclude_matched) - tables = _get_tables_from_catalogs(client, allowed_catalogs, allowed_schemas) + tables = _get_tables_from_catalogs(workspace_client, allowed_catalogs, allowed_schemas) if patterns: tables = _filter_tables_by_patterns(tables, patterns, exclude_matched) + if exclude_patterns: + tables = _filter_tables_by_patterns(tables, exclude_patterns, exclude_matched=True) + if tables: return tables raise NotFound("No tables found matching include or exclude criteria") diff --git a/tests/integration/test_apply_checks.py b/tests/integration/test_apply_checks.py index 796f927dc..b61432868 100644 --- a/tests/integration/test_apply_checks.py +++ b/tests/integration/test_apply_checks.py @@ -9,9 +9,9 @@ from pyspark.sql import Column, DataFrame, SparkSession from chispa.dataframe_comparer import assert_df_equality # type: ignore -from databricks.labs.dqx.errors import MissingParameterError, InvalidCheckError +from databricks.labs.dqx.errors import MissingParameterError, InvalidCheckError, InvalidParameterError from databricks.labs.dqx.check_funcs import sql_query -from databricks.labs.dqx.config import OutputConfig, FileChecksStorageConfig, ExtraParams +from databricks.labs.dqx.config import OutputConfig, FileChecksStorageConfig, ExtraParams, RunConfig from databricks.labs.dqx.engine import DQEngine from databricks.labs.dqx.rule import ( DQForEachColRule, @@ -7302,3 +7302,27 @@ def test_apply_checks_with_is_data_fresh_per_time_window(ws, spark, set_utc_time expected_schema, ) assert_df_equality(checked.sort("id"), expected, ignore_nullable=True) + + +def test_apply_checks_and_save_in_tables_for_patterns_missing_output_suffix(ws, spark): + dq_engine = DQEngine(ws) + + with pytest.raises(InvalidParameterError, match="Output table suffix cannot be empty"): + dq_engine.apply_checks_and_save_in_tables_for_patterns( + patterns=["*"], + checks_location="catalog.schema.checks", + run_config_template=RunConfig(), + output_table_suffix="", + ) + + +def test_apply_checks_and_save_in_tables_for_patterns_missing_quarantine_suffix(ws, spark): + dq_engine = DQEngine(ws) + + with pytest.raises(InvalidParameterError, match="Quarantine table suffix cannot be empty"): + dq_engine.apply_checks_and_save_in_tables_for_patterns( + patterns=["*"], + checks_location="catalog.schema.checks", + run_config_template=RunConfig(quarantine_config=OutputConfig("catalog.schema.table")), + quarantine_table_suffix="", + ) diff --git a/tests/integration/test_apply_checks_and_save_in_table.py b/tests/integration/test_apply_checks_and_save_in_table.py index 661d05db0..c55d4ec15 100644 --- a/tests/integration/test_apply_checks_and_save_in_table.py +++ b/tests/integration/test_apply_checks_and_save_in_table.py @@ -1672,6 +1672,99 @@ def test_apply_checks_and_save_in_tables_for_patterns_with_quarantine( assert_df_equality(spark.table(quarantine_tables[1]), expected_quarantine_df2, ignore_nullable=True) +def test_apply_checks_and_save_in_tables_for_patterns_skip_existing_output( + ws, spark, make_schema, make_random, make_directory +): + catalog_name = "main" + schema = make_schema(catalog_name=catalog_name) + + input_table = f"{catalog_name}.{schema.name}.{make_random(8).lower()}" + test_schema = "a: int, b: string" + test_df = spark.createDataFrame([[1, "valid"], [None, "invalid"]], test_schema) + test_df.write.format("delta").mode("overwrite").saveAsTable(input_table) + + output_table_suffix = "_output" + output_table = f"{input_table}{output_table_suffix}" + # should be excluded from applying checks + existing_output_table = f"{input_table}_existing{output_table_suffix}" + test_df.write.format("delta").saveAsTable(existing_output_table) + + quarantine_table_suffix = "_quarantine" + quarantine_table = f"{input_table}{quarantine_table_suffix}" + # should be excluded from applying checks + existing_quarantine_table = f"{input_table}_existing{quarantine_table_suffix}" + test_df.write.format("delta").saveAsTable(existing_quarantine_table) + + # Create different checks for each table + checks = [ + { + "name": "a_is_null", + "criticality": "error", + "check": {"function": "is_not_null", "arguments": {"column": "a"}}, + } + ] + + # Save the checks to workspace files: + engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) + workspace_folder = str(make_directory().absolute()) + engine.save_checks( + checks, config=WorkspaceFileChecksStorageConfig(location=f"{workspace_folder}/{input_table}.yml") + ) + engine.save_checks( + checks, config=WorkspaceFileChecksStorageConfig(location=f"{workspace_folder}/{existing_output_table}.yml") + ) + engine.save_checks( + checks, config=WorkspaceFileChecksStorageConfig(location=f"{workspace_folder}/{existing_quarantine_table}.yml") + ) + + # Apply checks and write to tables + engine.apply_checks_and_save_in_tables_for_patterns( + patterns=[f"{catalog_name}.{schema.name}.*"], + exclude_patterns=[f"*{output_table_suffix}", f"*{quarantine_table_suffix}"], + checks_location=workspace_folder, + max_parallelism=2, + run_config_template=RunConfig(quarantine_config=OutputConfig(location="")), + output_table_suffix=output_table_suffix, + quarantine_table_suffix=quarantine_table_suffix, + ) + + expected_valid_df = spark.createDataFrame( + [ + [1, "valid"], + ], + schema=test_schema, + ) + + expected_schema = test_schema + REPORTING_COLUMNS + expected_quarantine_df = spark.createDataFrame( + [ + [ + None, + "invalid", + [ + { + "name": "a_is_null", + "message": "Column 'a' value is null", + "columns": ["a"], + "filter": None, + "function": "is_not_null", + "run_time": RUN_TIME, + "user_metadata": {}, + } + ], + None, + ], + ], + schema=expected_schema, + ) + + assert_df_equality(spark.table(output_table), expected_valid_df, ignore_nullable=True) + assert_df_equality(spark.table(quarantine_table), expected_quarantine_df, ignore_nullable=True) + # 1 input + 1 output + 1 quarantine + 2 existing + tables = ws.tables.list_summaries(catalog_name=catalog_name, schema_name_pattern=schema.name) + assert len(list(tables)) == 5, "Tables count mismatch" + + def test_apply_checks_and_save_in_tables_for_patterns_no_tables_matching(ws, spark): # Test with empty list of table configs engine = DQEngine(ws, spark=spark, extra_params=EXTRA_PARAMS) diff --git a/tests/integration/test_profiler.py b/tests/integration/test_profiler.py index 47438512a..14f9c60d1 100644 --- a/tests/integration/test_profiler.py +++ b/tests/integration/test_profiler.py @@ -702,7 +702,7 @@ def test_profile_table_with_column_selection(spark, ws, make_schema, make_random assert rules == expected_rules -def test_profile_tables(spark, ws, make_schema, make_random): +def test_profile_tables_for_patterns(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" @@ -721,7 +721,7 @@ def test_profile_tables(spark, ws, make_schema, make_random): {"table": table1_name, "options": {"sample_fraction": None}}, {"table": table2_name, "options": {"sample_fraction": None}}, ] - profiles = profiler.profile_tables(patterns=[table1_name, table2_name], options=options) + profiles = profiler.profile_tables_for_patterns(patterns=[table1_name, table2_name], options=options) expected_rules = { table1_name: [ DQProfile(name='is_not_null', column='col1', description=None, parameters=None), @@ -769,6 +769,69 @@ def test_profile_tables(spark, ws, make_schema, make_random): assert rules == expected_rules[table_name], f"Rules did not match expected for {table_name}" +def test_profile_tables_for_patterns_with_exclude_patterns(spark, ws, make_schema, make_random): + catalog_name = "main" + schema_name = make_schema(catalog_name=catalog_name).name + table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" + + input_schema = "col1: int, col2: int, col3: int, col4 int" + input_df = spark.createDataFrame([[1, 3, 3, 1], [2, None, 4, 1], [1, 2, 3, 4]], input_schema) + input_df.write.format("delta").saveAsTable(table_name) + + output_table_suffix = "_output" + existing_output_table = f"{table_name}{output_table_suffix}" + input_df.write.format("delta").saveAsTable(existing_output_table) + + quarantine_table_suffix = "_quarantine" + existing_quarantine_table = f"{table_name}{quarantine_table_suffix}" + input_df.write.format("delta").saveAsTable(existing_quarantine_table) + + profiler = DQProfiler(ws) + options = [ + {"table": table_name, "options": {"sample_fraction": None}}, + ] + profiles = profiler.profile_tables_for_patterns( + patterns=[table_name], + options=options, + exclude_patterns=[f"*{output_table_suffix}", f"*{quarantine_table_suffix}"], + ) + + expected_rules = { + table_name: [ + DQProfile(name='is_not_null', column='col1', description=None, parameters=None), + DQProfile( + name='min_max', + column='col1', + description='Real min/max values were used', + parameters={'max': 2, 'min': 1}, + ), + DQProfile( + name='min_max', + column='col2', + description='Real min/max values were used', + parameters={'max': 3, 'min': 2}, + ), + DQProfile(name='is_not_null', column='col3', description=None, parameters=None), + DQProfile( + name='min_max', + column='col3', + description='Real min/max values were used', + parameters={'max': 4, 'min': 3}, + ), + DQProfile(name='is_not_null', column='col4', description=None, parameters=None), + DQProfile( + name='min_max', + column='col4', + description='Real min/max values were used', + parameters={'max': 4, 'min': 1}, + ), + ], + } + for table_name, (stats, rules) in profiles.items(): + assert len(stats.keys()) > 0, f"Stats did not match expected for {table_name}" + assert rules == expected_rules[table_name], f"Rules did not match expected for {table_name}" + + def test_profile_tables_include_patterns(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name @@ -788,7 +851,7 @@ def test_profile_tables_include_patterns(spark, ws, make_schema, make_random): {"table": f"*{known_random}", "options": {"sample_fraction": None}}, {"table": table2_name, "options": {"sample_fraction": None}}, ] - profiles = DQProfiler(ws).profile_tables( + profiles = DQProfiler(ws).profile_tables_for_patterns( patterns=[f"{catalog_name}.{schema_name}.*{known_random}"], options=options ) expected_rules = { @@ -841,10 +904,10 @@ def test_profile_tables_no_pattern_match(spark, ws, make_schema, make_random): profiler = DQProfiler(ws) options = [{"table": table1_name, "options": {"sample_fraction": None}}] with pytest.raises(NotFound, match="No tables found matching include or exclude criteria"): - profiler.profile_tables(patterns=[no_match_pattern], options=options) + profiler.profile_tables_for_patterns(patterns=[no_match_pattern], options=options) -def test_profile_tables_with_no_options(spark, ws, make_schema, make_random): +def test_profile_tables_for_patterns_with_no_options(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" @@ -863,14 +926,14 @@ def test_profile_tables_with_no_options(spark, ws, make_schema, make_random): {"table": table1_name, "options": {}}, {"table": table2_name, "options": None}, ] - profiles = profiler.profile_tables(patterns=[table1_name, table2_name], options=options) + profiles = profiler.profile_tables_for_patterns(patterns=[table1_name, table2_name], options=options) for table_name, (stats, _) in profiles.items(): assert len(stats.keys()) > 0, f"Stats did not match expected for {table_name}" # not asserting rules here because of default sampling which creates non-deterministic results -def test_profile_tables_with_no_matched_options(spark, ws, make_schema, make_random): +def test_profile_tables_for_patterns_with_no_matched_options(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" @@ -891,7 +954,7 @@ def test_profile_tables_with_no_matched_options(spark, ws, make_schema, make_ran {"table": table1_name, "options": {"sample_fraction": 1.0}}, {"table": table2_name, "options": {"sample_fraction": 1.0}}, ] - profiles = profiler.profile_tables(patterns=[table1_name, table2_name], options=options) + profiles = profiler.profile_tables_for_patterns(patterns=[table1_name, table2_name], options=options) expected_rules = { table1_name: [ DQProfile(name='is_not_null', column='col1', description=None, parameters=None), @@ -909,7 +972,7 @@ def test_profile_tables_with_no_matched_options(spark, ws, make_schema, make_ran assert rules == expected_rules[table_name], f"Rules did not match expected for {table_name}" -def test_profile_tables_with_common_opts(spark, ws, make_schema, make_random): +def test_profile_tables_for_patterns_with_common_opts(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" @@ -946,7 +1009,7 @@ def test_profile_tables_with_common_opts(spark, ws, make_schema, make_random): }, } ] - profiles = profiler.profile_tables(patterns=[table1_name, table2_name], options=options) + profiles = profiler.profile_tables_for_patterns(patterns=[table1_name, table2_name], options=options) expected_rules = { table1_name: [ DQProfile( @@ -990,7 +1053,7 @@ def test_profile_tables_with_common_opts(spark, ws, make_schema, make_random): assert rules == expected_rules[table_name], f"Rules did not match expected for {table_name}" -def test_profile_tables_with_different_opts(spark, ws, make_schema, make_random): +def test_profile_tables_for_patterns_with_different_opts(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name table_prefix = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" @@ -1036,7 +1099,7 @@ def test_profile_tables_with_different_opts(spark, ws, make_schema, make_random) }, ] - profiles = profiler.profile_tables( + profiles = profiler.profile_tables_for_patterns( patterns=[f"{table_prefix}*"], # we can use patterns or provide table names (does not matter for the test) options=table_opts, ) @@ -1079,7 +1142,7 @@ def test_profile_tables_with_different_opts(spark, ws, make_schema, make_random) assert rules == expected_rules[table_name], f"Rules did not match expected for {table_name}" -def test_profile_tables_with_partial_opts_match(spark, ws, make_schema, make_random): +def test_profile_tables_for_patterns_with_partial_opts_match(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}_001" @@ -1124,7 +1187,7 @@ def test_profile_tables_with_partial_opts_match(spark, ws, make_schema, make_ran }, }, ] - profiles = profiler.profile_tables(patterns=[table1_name, table2_name], options=table_opts) + profiles = profiler.profile_tables_for_patterns(patterns=[table1_name, table2_name], options=table_opts) expected_rules = { table1_name: [ DQProfile( @@ -1160,7 +1223,7 @@ def test_profile_tables_with_partial_opts_match(spark, ws, make_schema, make_ran assert rules == expected_rules[table_name], f"Rules did not match expected for {table_name}" -def test_profile_tables_with_selected_columns(spark, ws, make_schema, make_random): +def test_profile_tables_for_patterns_with_selected_columns(spark, ws, make_schema, make_random): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name table1_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}_tbl1" @@ -1198,7 +1261,7 @@ def test_profile_tables_with_selected_columns(spark, ws, make_schema, make_rando {"table": table2_name, "options": {"sample_fraction": None}}, ] - profiles = profiler.profile_tables( + profiles = profiler.profile_tables_for_patterns( patterns=[table1_name, table2_name], columns=table_columns, options=table_options ) expected_rules = { diff --git a/tests/integration/test_utils.py b/tests/integration/test_utils.py index 6def37c00..8fb0aac19 100644 --- a/tests/integration/test_utils.py +++ b/tests/integration/test_utils.py @@ -39,6 +39,38 @@ def test_list_tables(spark, ws, make_schema, make_random): assert not {table1_name, table2_name} & set(tables) +def test_list_tables_with_exclude_patterns(spark, ws, make_schema, make_random): + catalog_name = "main" + schema_name = make_schema(catalog_name=catalog_name).name + table_name = f"{catalog_name}.{schema_name}.{make_random(10).lower()}" + + output_table_name = f"{table_name}_dq_output" + quarantine_table_name = f"{table_name}_dq_quarantine" + + input_schema = "col1: int" + input_df = spark.createDataFrame([[1]], input_schema) + input_df.write.format("delta").saveAsTable(table_name) + input_df.write.format("delta").saveAsTable(output_table_name) + input_df.write.format("delta").saveAsTable(quarantine_table_name) + + tables = list_tables(ws, patterns=[f"{catalog_name}.{schema_name}.*"]) + assert set(tables) == {table_name, output_table_name, quarantine_table_name} + + tables = list_tables( + ws, + patterns=[f"{catalog_name}.{schema_name}.*"], + exclude_patterns=[f"{catalog_name}.{schema_name}.*_dq_output", f"{catalog_name}.{schema_name}.*_dq_quarantine"], + ) + assert set(tables) == {table_name} + + tables = list_tables( + ws, + patterns=[f"{catalog_name}.{schema_name}.*"], + exclude_patterns=["*_dq_output", "*_dq_quarantine"], + ) + assert set(tables) == {table_name} + + def test_list_tables_no_matching(spark, ws, make_random): with pytest.raises(NotFound, match="No tables found matching include or exclude criteria"): list_tables(ws, patterns=[f"non_existent_catalog_{make_random(10).lower()}.*"]) From c44159ad0406fefb324914d28a70c8095b240d03 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Wed, 1 Oct 2025 17:18:38 +0200 Subject: [PATCH 44/64] added exclusion pattern to workflows --- docs/dqx/docs/guide/data_profiling.mdx | 6 + docs/dqx/docs/guide/quality_checks_apply.mdx | 14 +++ docs/dqx/docs/reference/cli.mdx | 15 ++- docs/dqx/static/img/e2e_params.png | Bin 286692 -> 329687 bytes docs/dqx/static/img/profiler_params.png | Bin 125467 -> 135237 bytes .../dqx/static/img/quality_checker_params.png | Bin 127106 -> 137516 bytes labs.yml | 18 +++ src/databricks/labs/dqx/cli.py | 45 ++++++- .../labs/dqx/contexts/workflow_context.py | 37 ++++++ .../labs/dqx/installer/workflow_installer.py | 15 ++- .../labs/dqx/profiler/profiler_runner.py | 4 +- .../labs/dqx/profiler/profiler_workflow.py | 12 +- .../quality_checker/quality_checker_runner.py | 15 ++- .../quality_checker_workflow.py | 14 ++- .../test_apply_checks_and_save_in_table.py | 2 +- tests/integration/test_e2e_workflow.py | 113 +++++++++++++++++- tests/integration/test_profiler_workflow.py | 88 +++++++++++++- .../test_quality_checker_workflow.py | 96 ++++++++++++++- tests/integration/test_utils.py | 21 ++++ tests/unit/test_workflow_installer.py | 9 +- 20 files changed, 492 insertions(+), 32 deletions(-) diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index eb84d9176..2abfe2dfc 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -239,6 +239,9 @@ databricks labs dqx profile --run-config "default" # run for wildcard patterns (use run config as a template for all fields except location) databricks labs dqx profile --run-config "default" --patterns "main.product001.*;main.product002" + +# run for wildcard patterns and exclude patterns (skip output and quarantine tables) +databricks labs dqx profile --run-config "default" --patterns "main.product001.*;main.product002" --exclude-patterns "*_output;*_quarantine" ``` You can also provide `--timeout-minutes` option. @@ -249,6 +252,9 @@ When running the profiler workflow using Databricks API or UI, you can also prov - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., `catalog.schema1.*;catalog.schema2.table1`. - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. If the `checks_location` in the run config points to a table, the checks will be directly saved to that table. Otherwise, they will be stored in workspace files located in the installation directory under `install_folder/checks/.yml`. Other storage types are not supported. + - `exclude_patterns`: (optional) Accepts a semicolon-delimited list of patterns to exclude (useful if you want to exclude output and quarantine tables), e.g., `catalog.schema1.*_output;catalog.schema1.*_quarantine`. + - By default, the profiler skips output and quarantine tables based on the `output_table_suffix` (default: "_dq_output") and `quarantine_table_suffix` (default: "_dq_quarantine") job parameters. + To disable this behavior, clear the values of `output_table_suffix` and `quarantine_table_suffix` in the job parameters. See the relevant params in red:
diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index e1120d6e1..adf412f35 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -549,6 +549,9 @@ databricks labs dqx apply-checks --run-config "default" # run for tables/views matching wildcard patterns (use run config as a template for all fields except location) databricks labs dqx apply-checks --run-config "default" --patterns "main.product001.*;main.product002" + +# run for wildcard patterns, exclude patterns (skip output and quarantine tables), and custom output and quarantine table suffixes +databricks labs dqx apply-checks --run-config "default" --patterns "main.product001.*;main.product002" --exclude-patterns "*_dq_output;*_dq_quarantine" --output-table-suffix "_output" --quarantine-table-suffix "_quarantine" ``` You can also provide `--timeout-minutes` option. @@ -560,6 +563,10 @@ When running the quality checker workflow using Databricks API or UI, you can al - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. The output and quarantine table names are derived by appending the `_dq_output` and `_dq_quarantine` suffixes, respectively, to the input table name. If the `checks_location` in the run config points to a table, the checks will be directly loaded from that table. Otherwise, they will be loaded from workspace files located in the installation directory under `install_folder/checks/.yml`. Other storage types are not supported. + - `exclude_patterns`: (optional) Accepts a semicolon-delimited list of patterns to exclude (useful if you want to exclude output and quarantine tables), e.g., `catalog.schema1.*_output;catalog.schema1.*_quarantine`. + - By default, the workflow skips output and quarantine tables based on the `output_table_suffix` and `quarantine_table_suffix` job parameters. + - `output_table_suffix`: (optional) Suffix to append to the output table names (default: "_dq_output"). + - `quarantine_table_suffix`: (optional) Suffix to append to the quarantine table names (default: "_dq_quarantine"). See the relevant params in red:
@@ -642,6 +649,9 @@ databricks labs dqx e2e --run-config "default" # run for tables/views matching wildcard patterns (use run config as a template for all fields except location) databricks labs dqx e2e --run-config "default" --patterns "main.product001.*;main.product002" + +# run for wildcard patterns, exclude patterns (skip output and quarantine tables), and custom output and quarantine table suffixes +databricks labs dqx e2e --run-config "default" --patterns "main.product001.*;main.product002" --exclude-patterns "*_dq_output;*_dq_quarantine" --output-table-suffix "_output" --quarantine-table-suffix "_quarantine" ``` You can also provide `--timeout-minutes` option. @@ -653,6 +663,10 @@ When running the e2e workflow using Databricks API or UI, you can also provide t - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. The output and quarantine table names are derived by appending the `_dq_output` and `_dq_quarantine` suffixes, respectively, to the input table name. If the `checks_location` in the run config points to a table, the checks will be directly saved to or loaded from that table. Otherwise, they will be stored in workspace files located in the installation directory under `install_folder/checks/.yml`. Other storage types are not supported. + - `exclude_patterns`: (optional) Accepts a semicolon-delimited list of patterns to exclude (useful if you want to exclude output and quarantine tables), e.g., `catalog.schema1.*_output;catalog.schema1.*_quarantine`. + - By default, the workflow skips output and quarantine tables based on the `output_table_suffix` and `quarantine_table_suffix` job parameters. + - `output_table_suffix`: (optional) Suffix to append to the output table names (default: "_dq_output"). + - `quarantine_table_suffix`: (optional) Suffix to append to the quarantine table names (default: "_dq_quarantine"). See the relevant params in red:
diff --git a/docs/dqx/docs/reference/cli.mdx b/docs/dqx/docs/reference/cli.mdx index f365fb796..fbd6c6005 100644 --- a/docs/dqx/docs/reference/cli.mdx +++ b/docs/dqx/docs/reference/cli.mdx @@ -62,7 +62,10 @@ databricks labs dqx profile --run-config default --timeout-minutes 20 # * Run config is used as a template for all relevant fields except location # * Input table location is derived from the patterns # * For table-based checks location, save checks to the delta table, otherwise to install_folder/checks/.yml -databricks labs dqx profile --run-config "default" --patterns "main.product001.*;main.product002" --timeout-minutes 20 +# * Use exclude-patterns to exclude tables matching the wildcard patterns. By default, output and quarantine tables are excluded based on suffixes. +# * Default for output table suffix is "_dq_output". +# * Default for quarantine table suffix is "_dq_quarantine". +databricks labs dqx profile --run-config "default" --patterns "main.product001.*;main.product002" --exclude-patterns "*_output;*_quarantine" --timeout-minutes 20 # Run quality checker for all run configs: apply quality checks and write results and optionally quarantine databricks labs dqx apply-checks --timeout-minutes 20 @@ -75,7 +78,10 @@ databricks labs dqx apply-checks --run-config default --timeout-minutes 20 # * Input table location is derived from the patterns # * For table-based checks location, load checks from the delta table, otherwise from install_folder/checks/.yml # * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes -databricks labs dqx apply-checks --run-config "default" --patterns "main.product001.*;main.product002" --timeout-minutes 20 +# * Use exclude-patterns to exclude tables matching the wildcard patterns. By default, output and quarantine tables are excluded based on suffixes. +# * Default for output table suffix is "_dq_output". +# * Default for quarantine table suffix is "_dq_quarantine". +databricks labs dqx apply-checks --run-config "default" --patterns "main.product001.*;main.product002" --exclude-patterns "*_dq_output;*_dq_quarantine" --output-table-suffix "_output" --quarantine-table-suffix "_quarantine" # Run e2e (end-to-end) workflows for all run configs: profile data > generate quality checks > apply checks > write results and optionally quarantine databricks labs dqx e2e --timeout-minutes 20 @@ -88,7 +94,10 @@ databricks labs dqx e2e --run-config default --timeout-minutes 20 # * Input table location is derived from the patterns # * For table-based checks location, save/load checks from the delta table, otherwise from install_folder/checks/.yml # * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes -databricks labs dqx e2e --run-config "default" --patterns "main.product001.*;main.product002" --timeout-minutes 20 +# * Use exclude-patterns to exclude tables matching the wildcard patterns. By default, output and quarantine tables are excluded based on suffixes. +# * Default for output table suffix is "_dq_output". +# * Default for quarantine table suffix is "_dq_quarantine". +databricks labs dqx e2e --run-config "default" --patterns "main.product001.*;main.product002" --exclude-patterns "*_dq_output;*_dq_quarantine" --output-table-suffix "_output" --quarantine-table-suffix "_quarantine" ``` ## Validating checks diff --git a/docs/dqx/static/img/e2e_params.png b/docs/dqx/static/img/e2e_params.png index 5069805cb209a7159ca9b69fce68300c9bee47ab..3620d07379895de76282389ada1dd961820ab511 100644 GIT binary patch literal 329687 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˜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%0DLDT*!P&Jr+S4Nkd2z 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 H%Mbqt?bxW1 literal 286692 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

c%Jr#++8b4n+6&C~KmhA6L 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%0D3qV% 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

WyHw12$xvxgO0{}G^nF=Yx|VzTvEHjp26 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 z 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

a9zDT+ga06l(kYNH8b-O$y(4s7XRo3_!Pwk= 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

PDRD$y@An5>Ii%ozpdZ>DvsUX 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 WOAc!hk00W`^zPidU2x0h<^KR73QI)* diff --git a/docs/dqx/static/img/profiler_params.png b/docs/dqx/static/img/profiler_params.png index afa51928326ddb3e671567cc4dcf34f7ecf59dcc..5a920683baeab07669513a195af775852707e29b 100644 GIT binary patch literal 135237 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�w7rIX!KZKel6xCu*%$BH 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 Cy&bjy literal 125467 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%0DX{UZC*f9DR=t;x%8oNGe_hi8yZcw+?OGO-H5f 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

@blM_;$uU)-Kxwe=Fe3m5+vcP-QPTl$h7Cz` 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 None: @@ -164,12 +165,20 @@ def profile( patterns: Semicolon-separated list of location patterns (with wildcards) to profile. If provided, location fields in the run config are ignored. Requires a run config to be provided which is used as a template for other fields. + exclude_patterns: Semicolon-separated list of location patterns to exclude. + Useful to skip existing output and quarantine tables based on suffixes. timeout_minutes: The timeout for the workflow run in minutes (default is 30). ctx: The WorkspaceContext instance to use for accessing the workspace. """ timeout = timedelta(minutes=timeout_minutes) ctx = ctx or WorkspaceContext(w) - ctx.deployed_workflows.run_workflow("profiler", run_config, patterns, timeout) + ctx.deployed_workflows.run_workflow( + workflow="profiler", + run_config_name=run_config, + patterns=patterns, + exclude_patterns=exclude_patterns, + max_wait=timeout, + ) @dqx.command @@ -178,6 +187,9 @@ def apply_checks( *, run_config: str = "", patterns: str = "", + exclude_patterns: str = "", + output_table_suffix: str = "_dq_output", + quarantine_table_suffix: str = "_dq_quarantine", timeout_minutes: int = 30, ctx: WorkspaceContext | None = None, ) -> None: @@ -190,12 +202,24 @@ def apply_checks( patterns: Semicolon-separated list of location patterns (with wildcards) to profile. If provided, location fields in the run config are ignored. Requires a run config to be provided which is used as a template for other fields. + exclude_patterns: Semicolon-separated list of location patterns to exclude. + Useful to skip existing output and quarantine tables based on suffixes. + output_table_suffix: Suffix to append to the output table names (default is "_dq_output"). + quarantine_table_suffix: Suffix to append to the quarantine table names (default is "_dq_quarantine"). timeout_minutes: The timeout for the workflow run in minutes (default is 30). ctx: The WorkspaceContext instance to use for accessing the workspace. """ timeout = timedelta(minutes=timeout_minutes) ctx = ctx or WorkspaceContext(w) - ctx.deployed_workflows.run_workflow("quality-checker", run_config, patterns, timeout) + ctx.deployed_workflows.run_workflow( + workflow="quality-checker", + run_config_name=run_config, + patterns=patterns, + exclude_patterns=exclude_patterns, + output_table_suffix=output_table_suffix, + quarantine_table_suffix=quarantine_table_suffix, + max_wait=timeout, + ) @dqx.command @@ -204,6 +228,9 @@ def e2e( *, run_config: str = "", patterns: str = "", + exclude_patterns: str = "", + output_table_suffix: str = "_dq_output", + quarantine_table_suffix: str = "_dq_quarantine", timeout_minutes: int = 60, ctx: WorkspaceContext | None = None, ) -> None: @@ -219,12 +246,24 @@ def e2e( patterns: Semicolon-separated list of location patterns (with wildcards) to profile. If provided, location fields in the run config are ignored. Requires a run config to be provided which is used as a template for other fields. + exclude_patterns: Semicolon-separated list of location patterns to exclude. + Useful to skip existing output and quarantine tables based on suffixes. + output_table_suffix: Suffix to append to the output table names (default is "_dq_output"). + quarantine_table_suffix: Suffix to append to the quarantine table names (default is "_dq_quarantine"). timeout_minutes: The timeout for the workflow run in minutes (default is 60). ctx: The WorkspaceContext instance to use for accessing the workspace. """ timeout = timedelta(minutes=timeout_minutes) ctx = ctx or WorkspaceContext(w) - ctx.deployed_workflows.run_workflow("e2e", run_config, patterns, timeout) + ctx.deployed_workflows.run_workflow( + workflow="e2e", + run_config_name=run_config, + patterns=patterns, + exclude_patterns=exclude_patterns, + output_table_suffix=output_table_suffix, + quarantine_table_suffix=quarantine_table_suffix, + max_wait=timeout, + ) @dqx.command diff --git a/src/databricks/labs/dqx/contexts/workflow_context.py b/src/databricks/labs/dqx/contexts/workflow_context.py index cf0c2216c..ae21026b6 100644 --- a/src/databricks/labs/dqx/contexts/workflow_context.py +++ b/src/databricks/labs/dqx/contexts/workflow_context.py @@ -49,6 +49,21 @@ def patterns(self) -> str | None: """Returns semicolon delimited list of location patterns to use.""" return self.named_parameters.get("patterns") + @cached_property + def exclude_patterns(self) -> str | None: + """Returns semicolon delimited list of location patterns to exclude.""" + return self.named_parameters.get("exclude_patterns") + + @cached_property + def output_table_suffix(self) -> str: + """Returns suffix to use for output tables.""" + return self.named_parameters.get("output_table_suffix", "_dq_output") + + @cached_property + def quarantine_table_suffix(self) -> str: + """Returns suffix to use for quarantine tables.""" + return self.named_parameters.get("quarantine_table_suffix", "_dq_quarantine") + @cached_property def run_config(self) -> RunConfig: """Loads and returns the run configuration.""" @@ -79,6 +94,28 @@ def installation(self) -> Installation: install_folder = self._config_path.parent.as_posix().removeprefix("/Workspace") return Installation(self.workspace_client, self.product_info.product_name(), install_folder=install_folder) + @cached_property + def get_patterns(self) -> tuple[list[str], list[str]]: + """Returns a tuple of patterns and exclude patterns lists.""" + patterns: list[str] = [] + exclude_patterns: list[str] = [] + + if self.patterns: + patterns = [pattern.strip() for pattern in self.patterns.split(';')] + + exclude_patterns = [] + for pattern in patterns: + # Exclude output and quarantine tables by default to avoid profiling them + if self.output_table_suffix: + exclude_patterns.append(pattern + self.output_table_suffix) + if self.quarantine_table_suffix: + exclude_patterns.append(pattern + self.quarantine_table_suffix) + + if self.exclude_patterns: + exclude_patterns = [pattern.strip() for pattern in self.exclude_patterns.split(';')] + + return patterns, exclude_patterns + @cached_property def profiler(self) -> ProfilerRunner: """Returns the ProfilerRunner instance.""" diff --git a/src/databricks/labs/dqx/installer/workflow_installer.py b/src/databricks/labs/dqx/installer/workflow_installer.py index 10358e4fb..6ea6b5901 100644 --- a/src/databricks/labs/dqx/installer/workflow_installer.py +++ b/src/databricks/labs/dqx/installer/workflow_installer.py @@ -73,6 +73,9 @@ def run_workflow( workflow: str, run_config_name: str = "", # run for all run configs by default patterns: str = "", + exclude_patterns: str = "", + output_table_suffix: str = "_dq_output", + quarantine_table_suffix: str = "_dq_quarantine", max_wait: timedelta = timedelta(minutes=60), ) -> int: # this dunder variable is hiding this method from tracebacks, making it cleaner @@ -83,7 +86,14 @@ def run_workflow( job_id = int(self._install_state.jobs[workflow]) logger.debug(f"starting {workflow} workflow: {self._ws.config.host}#job/{job_id}") job_initial_run = self._ws.jobs.run_now( - job_id, job_parameters={"run_config_name": run_config_name, "patterns": patterns} + job_id, + job_parameters={ + "run_config_name": run_config_name, + "patterns": patterns, + "exclude_patterns": exclude_patterns, + "output_table_suffix": output_table_suffix, + "quarantine_table_suffix": quarantine_table_suffix, + }, ) run_id = job_initial_run.run_id run_url = f"{self._ws.config.host}#job/{job_id}/runs/{run_id}" @@ -603,6 +613,9 @@ def _add_wheel_task( "config": f"/Workspace{self._config_file}", "run_config_name": "", # run for all run configs by default "patterns": "", + "exclude_patterns": "", + "output_table_suffix": "_dq_output", + "quarantine_table_suffix": "_dq_quarantine", "product_name": self._product_info.product_name(), # non-default product name is used for testing "workflow": workflow, "task": jobs_task.task_key, diff --git a/src/databricks/labs/dqx/profiler/profiler_runner.py b/src/databricks/labs/dqx/profiler/profiler_runner.py index 30013692f..79172b426 100644 --- a/src/databricks/labs/dqx/profiler/profiler_runner.py +++ b/src/databricks/labs/dqx/profiler/profiler_runner.py @@ -87,6 +87,7 @@ def run( def run_for_patterns( self, patterns: list[str], + exclude_patterns: list[str], profiler_config: ProfilerConfig, checks_location: str, install_folder: str, @@ -97,6 +98,7 @@ def run_for_patterns( Args: patterns: List of table patterns to profile (e.g. ["catalog.schema.table*"]). + exclude_patterns: List of table patterns to exclude from profiling (e.g. ["*output", "*quarantine"]). profiler_config: Profiler configuration. checks_location: Delta table to save the generated checks, otherwise checks are saved under checks/{table_name}.yml. @@ -116,7 +118,7 @@ def run_for_patterns( # Include tables matching the patterns, but skip existing output and quarantine tables. results = self.profiler.profile_tables_for_patterns( - patterns=patterns, options=options, max_parallelism=max_parallelism + patterns=patterns, exclude_patterns=exclude_patterns, options=options, max_parallelism=max_parallelism ) for table, (summary_stats, profiles) in results.items(): diff --git a/src/databricks/labs/dqx/profiler/profiler_workflow.py b/src/databricks/labs/dqx/profiler/profiler_workflow.py index 8aa4537ce..3db07e16c 100644 --- a/src/databricks/labs/dqx/profiler/profiler_workflow.py +++ b/src/databricks/labs/dqx/profiler/profiler_workflow.py @@ -18,9 +18,12 @@ def profile(self, ctx: WorkflowContext): """ Profile input data and save the generated checks and profile summary stats. - Logic: - * If location patterns are provided, only those patterns will be profiled, the provided run config name - will be used as a template for all fields except the location. + Logic:led, the provided run config name + * If location patterns are provided, only those patterns will be profiled, and the provided run config name + will be used as a template for all fields except the location. + Additionally, exclude patterns can be specified to skip profiling specific tables. + Output and quarantine tables are excluded by default based on output_table_suffix and quarantine_table_suffix + to avoid profiling them. * If no location patterns are provided, but a run config name is given, only that run config will be profiled. * If neither location patterns nor a run config name are provided, all run configs will be profiled. @@ -32,9 +35,10 @@ def profile(self, ctx: WorkflowContext): """ if ctx.patterns and ctx.run_config_name: logger.info(f"Running profiler workflow for patterns: {ctx.patterns}") - patterns = [pattern.strip() for pattern in ctx.patterns.split(';')] + patterns, exclude_patterns = ctx.get_patterns ctx.profiler.run_for_patterns( patterns=patterns, + exclude_patterns=exclude_patterns, profiler_config=ctx.run_config.profiler_config, checks_location=ctx.run_config.checks_location, install_folder=ctx.installation.install_folder(), diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py b/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py index 1ed32edf9..e6482f156 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py @@ -29,22 +29,35 @@ def run(self, run_configs: list[RunConfig], max_parallelism: int | None = os.cpu logger.info("Data quality checker completed.") def run_for_patterns( - self, patterns: list[str], run_config_template: RunConfig, checks_location: str, max_parallelism: int + self, + patterns: list[str], + exclude_patterns: list[str], + run_config_template: RunConfig, + checks_location: str, + output_table_suffix: str, + quarantine_table_suffix: str, + max_parallelism: int, ) -> None: """ Run the DQX data quality job for the provided location patterns using a run config template. Args: patterns: List of location patterns (with wildcards) to apply the data quality checks to. + exclude_patterns: List of table patterns to exclude from profiling (e.g. ["*output", "*quarantine"]). run_config_template: A RunConfig object to be used as a template for each pattern, except location. checks_location: Location to read the checks from. + output_table_suffix: Suffix to append to the output table names. + quarantine_table_suffix: Suffix to append to the quarantine table names. max_parallelism: Maximum number of parallel runs. Defaults to the number of CPU cores. """ logger.info(f"Data quality checker started for patterns {patterns}.") self.dq_engine.apply_checks_and_save_in_tables_for_patterns( patterns=patterns, + exclude_patterns=exclude_patterns, checks_location=checks_location, run_config_template=run_config_template, max_parallelism=max_parallelism, + output_table_suffix=output_table_suffix, + quarantine_table_suffix=quarantine_table_suffix, ) logger.info(f"Data quality checker started {patterns}.") diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py index 68a70fcc5..c5181b1c6 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py @@ -19,8 +19,11 @@ def apply_checks(self, ctx: WorkflowContext): Apply data quality checks to the input data and save the results. Logic: - * If location patterns are provided, only tables matching the patterns will be used, - the provided run config name will be used as a template for all fields except the location. + * If location patterns are provided, only those patterns will be used, and the provided run config name + will be used as a template for all fields except the location. + Additionally, exclude patterns can be specified to skip specific tables. + Output and quarantine tables are excluded by default based on output_table_suffix and quarantine_table_suffix + to avoid re-applying checks on them. * If no location patterns are provided, but a run config name is given, only that run config will be used. * If neither location patterns nor a run config name are provided, all run configs will be used. @@ -29,16 +32,17 @@ def apply_checks(self, ctx: WorkflowContext): """ if ctx.patterns and ctx.run_config_name: logger.info(f"Running data quality workflow for patterns: {ctx.patterns}") - patterns = [pattern.strip() for pattern in ctx.patterns.split(';')] - + patterns, exclude_patterns = ctx.get_patterns checks_location = get_default_checks_location( ctx.installation.install_folder(), ctx.run_config.checks_location ) - ctx.quality_checker.run_for_patterns( patterns=patterns, + exclude_patterns=exclude_patterns, run_config_template=ctx.run_config, checks_location=checks_location, + output_table_suffix=ctx.output_table_suffix, + quarantine_table_suffix=ctx.quarantine_table_suffix, max_parallelism=ctx.config.quality_checker_max_parallelism, ) elif ctx.run_config_name: diff --git a/tests/integration/test_apply_checks_and_save_in_table.py b/tests/integration/test_apply_checks_and_save_in_table.py index c55d4ec15..d0c03a058 100644 --- a/tests/integration/test_apply_checks_and_save_in_table.py +++ b/tests/integration/test_apply_checks_and_save_in_table.py @@ -1672,7 +1672,7 @@ def test_apply_checks_and_save_in_tables_for_patterns_with_quarantine( assert_df_equality(spark.table(quarantine_tables[1]), expected_quarantine_df2, ignore_nullable=True) -def test_apply_checks_and_save_in_tables_for_patterns_skip_existing_output( +def test_apply_checks_and_save_in_tables_for_patterns_with_exclude_patterns( ws, spark, make_schema, make_random, make_directory ): catalog_name = "main" diff --git a/tests/integration/test_e2e_workflow.py b/tests/integration/test_e2e_workflow.py index dd3824e23..cbba0521f 100644 --- a/tests/integration/test_e2e_workflow.py +++ b/tests/integration/test_e2e_workflow.py @@ -1,4 +1,8 @@ import copy + +import pytest +from databricks.sdk.errors import NotFound + from databricks.labs.dqx.config import ( InstallationChecksStorageConfig, WorkspaceFileChecksStorageConfig, @@ -93,7 +97,7 @@ def test_e2e_workflow_serverless(ws, spark, setup_serverless_workflows, expected assert output_df.count() > 0, "Output table is empty" quarantine_df = spark.table(run_config.quarantine_config.location) - assert quarantine_df.count() > 0, "Output table is empty" + assert quarantine_df.count() > 0, "Quarantine table is empty" def test_e2e_workflow_with_custom_install_folder( @@ -163,6 +167,109 @@ def test_e2e_workflow_for_patterns( assert checked_df.count() == input_df.count(), "Second output table is empty" +def test_e2e_workflow_for_patterns_exclude_patterns( + ws, spark, make_table, setup_workflows, expected_quality_checking_output, make_random +): + installation_ctx, run_config = setup_workflows() + + first_table = run_config.input_config.location + catalog_name, schema_name, _ = first_table.split('.') + exclude_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) + + installation_ctx.deployed_workflows.run_workflow( + workflow="e2e", + run_config_name=run_config.name, + patterns=f"{catalog_name}.{schema_name}.*", + exclude_patterns=exclude_table, + ) + + dq_engine = DQEngine(ws, spark) + + storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml", + ) + checks = dq_engine.load_checks(config=storage_config) + assert checks, f"Checks for {first_table} were not generated" + + storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{exclude_table}.yml", + ) + with pytest.raises(NotFound): + engine = DQEngine(ws, spark) + engine.load_checks(config=storage_config) + + checked_df = spark.table(first_table + "_dq_output") + input_df = spark.table(run_config.input_config.location) + + # this is sanity check only, we cannot predict the exact output as it depends on the generated rules + assert checked_df.count() > 0, "First output table is empty" + assert checked_df.count() == input_df.count(), "First output table is empty" + + # 1 input + 1 output + 1 existing + tables = ws.tables.list_summaries(catalog_name=catalog_name, schema_name_pattern=schema_name) + assert len(list(tables)) == 3, "Tables count mismatch" + + +def test_e2e_workflow_for_patterns_exclude_output( + ws, spark, make_table, setup_workflows, expected_quality_checking_output, make_random +): + installation_ctx, run_config = setup_workflows(quarantine=True) + + first_table = run_config.input_config.location + catalog_name, schema_name, _ = first_table.split('.') + + output_table_suffix = "_output" + quarantine_table_suffix = "_quarantine" + + existing_output_table = make_second_input_table( + spark, catalog_name, schema_name, first_table, make_random, output_table_suffix + ) + existing_quarantine_table = make_second_input_table( + spark, catalog_name, schema_name, first_table, make_random, quarantine_table_suffix + ) + + installation_ctx.deployed_workflows.run_workflow( + workflow="e2e", + run_config_name=run_config.name, + patterns=f"{catalog_name}.{schema_name}.*", + # existing output and quarantine tables are excluded by default based on suffixes + output_table_suffix=output_table_suffix, + quarantine_table_suffix=quarantine_table_suffix, + ) + + dq_engine = DQEngine(ws, spark) + + storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml", + ) + checks = dq_engine.load_checks(config=storage_config) + assert checks, f"Checks for {first_table} were not generated" + + storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{existing_output_table}.yml", + ) + with pytest.raises(NotFound): + engine = DQEngine(ws, spark) + engine.load_checks(config=storage_config) + + storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{existing_quarantine_table}.yml", + ) + with pytest.raises(NotFound): + engine = DQEngine(ws, spark) + engine.load_checks(config=storage_config) + + output_df = spark.table(first_table + output_table_suffix) + assert output_df.count() > 0, "Output table is empty" + + quarantine_df = spark.table(first_table + quarantine_table_suffix) + assert quarantine_df.count() > 0, "Quarantine table is empty" + + # 1 input + 2 outputs (output, quarantine) + 2 existing + tables = ws.tables.list_summaries(catalog_name=catalog_name, schema_name_pattern=schema_name) + assert len(list(tables)) == 5, "Tables count mismatch" + + def test_e2e_workflow_for_patterns_table_checks_storage( ws, spark, make_table, setup_workflows, expected_quality_checking_output, make_random ): @@ -215,7 +322,7 @@ def test_e2e_workflow_for_patterns_table_checks_storage( assert checked_df.count() == input_df.count(), "Second output table is empty" -def make_second_input_table(spark, catalog_name, schema_name, first_table, make_random): - second_table = f"{catalog_name}.{schema_name}.dummy_t{make_random(4).lower()}" +def make_second_input_table(spark, catalog_name, schema_name, first_table, make_random, suffix=""): + second_table = f"{catalog_name}.{schema_name}.dummy_t{make_random(4).lower()}{suffix}" spark.table(first_table).write.format("delta").mode("overwrite").saveAsTable(second_table) return second_table diff --git a/tests/integration/test_profiler_workflow.py b/tests/integration/test_profiler_workflow.py index 57a60ccbc..879743769 100644 --- a/tests/integration/test_profiler_workflow.py +++ b/tests/integration/test_profiler_workflow.py @@ -3,6 +3,7 @@ import pytest from databricks.labs.blueprint.parallel import ManyError +from databricks.sdk.errors import NotFound from databricks.labs.dqx.config import ( InstallationChecksStorageConfig, @@ -185,6 +186,85 @@ def test_profiler_workflow_for_patterns(ws, spark, setup_workflows, make_table, assert checks, f"Checks for {second_table} were not generated" +def test_profiler_workflow_for_patterns_with_exclude_patterns(ws, spark, setup_workflows, make_table, make_random): + installation_ctx, run_config = setup_workflows() + + first_table = run_config.input_config.location + catalog_name, schema_name, _ = first_table.split('.') + exclude_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) + + # run profiler for all tables in the schema + installation_ctx.deployed_workflows.run_workflow( + workflow="profiler", + run_config_name=run_config.name, + patterns=f"{catalog_name}.{schema_name}.*", + exclude_patterns=exclude_table, + ) + + dq_engine = DQEngine(ws, spark) + + workspace_file_storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml", + ) + checks = dq_engine.load_checks(config=workspace_file_storage_config) + assert checks, f"Checks for {first_table} were not generated" + + workspace_file_storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{exclude_table}.yml", + ) + with pytest.raises(NotFound): + engine = DQEngine(ws, spark) + engine.load_checks(config=workspace_file_storage_config) + + +def test_profiler_workflow_for_patterns_exclude_output(ws, spark, setup_workflows, make_table, make_random): + installation_ctx, run_config = setup_workflows() + + first_table = run_config.input_config.location + catalog_name, schema_name, _ = first_table.split('.') + + output_table_suffix = "_output" + quarantine_table_suffix = "_quarantine" + + exclude_output_table = make_second_input_table( + spark, catalog_name, schema_name, first_table, make_random, output_table_suffix + ) + exclude_quarantine_table = make_second_input_table( + spark, catalog_name, schema_name, first_table, make_random, quarantine_table_suffix + ) + + # run profiler for all tables in the schema + installation_ctx.deployed_workflows.run_workflow( + workflow="profiler", + run_config_name=run_config.name, + patterns=f"{catalog_name}.{schema_name}.*", + output_table_suffix=output_table_suffix, + quarantine_table_suffix=quarantine_table_suffix, + ) + + dq_engine = DQEngine(ws, spark) + + workspace_file_storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml", + ) + checks = dq_engine.load_checks(config=workspace_file_storage_config) + assert checks, f"Checks for {first_table} were not generated" + + workspace_file_storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{exclude_output_table}.yml", + ) + with pytest.raises(NotFound): + engine = DQEngine(ws, spark) + engine.load_checks(config=workspace_file_storage_config) + + workspace_file_storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{exclude_quarantine_table}.yml", + ) + with pytest.raises(NotFound): + engine = DQEngine(ws, spark) + engine.load_checks(config=workspace_file_storage_config) + + def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_workflows, make_table, make_random): installation_ctx, run_config = setup_workflows() @@ -225,7 +305,7 @@ def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_wo assert checks, f"Checks for {second_table_full_name} were not generated" -def make_second_input_table(spark, catalog_name, schema_name, first_table, make_random): - second_table = f"{catalog_name}.{schema_name}.dummy_t{make_random(4).lower()}" - spark.table(first_table).write.format("delta").mode("overwrite").saveAsTable(second_table) - return second_table +def make_second_input_table(spark, catalog_name, schema_name, source_table, make_random, suffix=""): + target_table = f"{catalog_name}.{schema_name}.dummy_t{make_random(4).lower()}{suffix}" + spark.table(source_table).write.format("delta").mode("overwrite").saveAsTable(target_table) + return target_table diff --git a/tests/integration/test_quality_checker_workflow.py b/tests/integration/test_quality_checker_workflow.py index 3d22b0d47..4cdba5805 100644 --- a/tests/integration/test_quality_checker_workflow.py +++ b/tests/integration/test_quality_checker_workflow.py @@ -285,16 +285,102 @@ def test_quality_checker_workflow_for_patterns( # assert first table checked_df = spark.table(first_table + "_dq_output") - expected_quality_checking_output.show(truncate=False) - checked_df.show(truncate=False) assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) # assert second table checked_df = spark.table(second_table + "_dq_output") - checked_df.show(truncate=False) assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) +def test_quality_checker_workflow_for_patterns_exclude_patterns( + ws, spark, make_table, setup_workflows, expected_quality_checking_output, make_random +): + installation_ctx, run_config = setup_workflows(checks=True) + + first_table = run_config.input_config.location + catalog_name, schema_name, _ = first_table.split('.') + exclude_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) + + dq_engine = DQEngine(ws, spark) + checks = dq_engine.load_checks( + config=WorkspaceFileChecksStorageConfig(location=f"{installation_ctx.installation.install_folder()}/checks.yml") + ) + dq_engine.save_checks( + checks=checks, + config=WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml" + ), + ) + ws.workspace.delete(f"{installation_ctx.installation.install_folder()}/checks.yml") + + # run workflow + installation_ctx.deployed_workflows.run_workflow( + workflow="quality-checker", + run_config_name=run_config.name, + patterns=f"{catalog_name}.{schema_name}.*", + exclude_patterns=exclude_table, + ) + + checked_df = spark.table(first_table + "_dq_output") + assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + # 1 input + 1 output + 1 existing + tables = ws.tables.list_summaries(catalog_name=catalog_name, schema_name_pattern=schema_name) + assert len(list(tables)) == 3, "Tables count mismatch" + + +def test_quality_checker_workflow_for_patterns_exclude_output( + ws, spark, make_table, setup_workflows, expected_quality_checking_output, make_random +): + installation_ctx, run_config = setup_workflows(quarantine=True, checks=True) + + first_table = run_config.input_config.location + catalog_name, schema_name, _ = first_table.split('.') + + output_table_suffix = "_output" + quarantine_table_suffix = "_quarantine" + + # table to skip based on suffix + make_second_input_table(spark, catalog_name, schema_name, first_table, make_random, output_table_suffix) + # table to skip based on suffix + make_second_input_table(spark, catalog_name, schema_name, first_table, make_random, quarantine_table_suffix) + + dq_engine = DQEngine(ws, spark) + checks = dq_engine.load_checks( + config=WorkspaceFileChecksStorageConfig(location=f"{installation_ctx.installation.install_folder()}/checks.yml") + ) + dq_engine.save_checks( + checks=checks, + config=WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml" + ), + ) + ws.workspace.delete(f"{installation_ctx.installation.install_folder()}/checks.yml") + + # run workflow + installation_ctx.deployed_workflows.run_workflow( + workflow="quality-checker", + run_config_name=run_config.name, + patterns=f"{catalog_name}.{schema_name}.*", + # existing output and quarantine tables are excluded by default based on suffixes + output_table_suffix=output_table_suffix, + quarantine_table_suffix=quarantine_table_suffix, + ) + + expected_output_df = dq_engine.get_valid(expected_quality_checking_output) + expected_quarantine_df = dq_engine.get_invalid(expected_quality_checking_output) + + output_df = spark.table(first_table + output_table_suffix) + assert_df_equality(output_df, expected_output_df, ignore_nullable=True) + + quarantine_df = spark.table(first_table + quarantine_table_suffix) + assert_df_equality(quarantine_df, expected_quarantine_df, ignore_nullable=True) + + # 1 input + 2 outputs (output, quarantine) + 2 existing + tables = ws.tables.list_summaries(catalog_name=catalog_name, schema_name_pattern=schema_name) + assert len(list(tables)) == 5, "Tables count mismatch" + + def test_quality_checker_workflow_for_patterns_table_checks_storage( ws, spark, make_table, setup_workflows, expected_quality_checking_output, make_random ): @@ -338,8 +424,8 @@ def test_quality_checker_workflow_for_patterns_table_checks_storage( assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) -def make_second_input_table(spark, catalog_name, schema_name, first_table, make_random): - second_table = f"{catalog_name}.{schema_name}.dummy_t{make_random(4).lower()}" +def make_second_input_table(spark, catalog_name, schema_name, first_table, make_random, suffix=""): + second_table = f"{catalog_name}.{schema_name}.dummy_t{make_random(4).lower()}{suffix}" spark.table(first_table).write.format("delta").mode("overwrite").saveAsTable(second_table) return second_table diff --git a/tests/integration/test_utils.py b/tests/integration/test_utils.py index 8fb0aac19..54658701d 100644 --- a/tests/integration/test_utils.py +++ b/tests/integration/test_utils.py @@ -70,6 +70,27 @@ def test_list_tables_with_exclude_patterns(spark, ws, make_schema, make_random): ) assert set(tables) == {table_name} + tables = list_tables( + ws, + patterns=[f"{catalog_name}.{schema_name}.*"], + exclude_patterns=[output_table_name, quarantine_table_name], + ) + assert set(tables) == {table_name} + + tables = list_tables( + ws, + patterns=[f"{catalog_name}.{schema_name}.*"], + exclude_patterns=[f"{catalog_name}.{schema_name}.*_dq_output", f"{catalog_name}.{schema_name}.*_dq_quarantine"], + ) + assert set(tables) == {table_name} + + with pytest.raises(NotFound, match="No tables found matching include or exclude criteria"): + list_tables( + ws, + patterns=[f"{catalog_name}.{schema_name}.*"], + exclude_patterns=[f"{catalog_name}.{schema_name}.*"], + ) + def test_list_tables_no_matching(spark, ws, make_random): with pytest.raises(NotFound, match="No tables found matching include or exclude criteria"): diff --git a/tests/unit/test_workflow_installer.py b/tests/unit/test_workflow_installer.py index 35e11823f..4bdec5f2c 100644 --- a/tests/unit/test_workflow_installer.py +++ b/tests/unit/test_workflow_installer.py @@ -27,7 +27,14 @@ def test_run_workflow(): assert run_id == 456 mock_ws.jobs.run_now.assert_called_once_with( - 123, job_parameters={"run_config_name": "test_run_config", "patterns": ""} + 123, + job_parameters={ + "run_config_name": "test_run_config", + "patterns": "", + "exclude_patterns": "", + "output_table_suffix": "_dq_output", + "quarantine_table_suffix": "_dq_quarantine", + }, ) mock_ws.jobs.wait_get_run_job_terminated_or_skipped.assert_called_once_with( run_id=456, timeout=timedelta(minutes=60) From 19855e477757f70015b30ddc0764d52856187a51 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Wed, 1 Oct 2025 18:02:26 +0200 Subject: [PATCH 45/64] refactor --- docs/dqx/docs/guide/data_profiling.mdx | 2 +- docs/dqx/docs/guide/quality_checks_apply.mdx | 4 +-- src/databricks/labs/dqx/checks_storage.py | 17 ------------ .../labs/dqx/contexts/workflow_context.py | 22 ++++++++++++++- .../labs/dqx/profiler/profiler_runner.py | 8 ++---- .../labs/dqx/profiler/profiler_workflow.py | 5 ++-- .../quality_checker_workflow.py | 27 ++++--------------- tests/unit/checks_storage.py | 17 +----------- 8 files changed, 34 insertions(+), 68 deletions(-) diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index 2abfe2dfc..c8f34bf13 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -248,7 +248,7 @@ You can also provide `--timeout-minutes` option. When running the profiler workflow using Databricks API or UI, you can also provide the same parameters: * By default, the workflow executes across all defined run configs within the configuration file. * To execute the workflow for a specific run config, specify the `run_config_name` parameter during execution. -* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution: +* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution. The following parameters are supported: - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., `catalog.schema1.*;catalog.schema2.table1`. - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. If the `checks_location` in the run config points to a table, the checks will be directly saved to that table. Otherwise, they will be stored in workspace files located in the installation directory under `install_folder/checks/.yml`. Other storage types are not supported. diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index adf412f35..887f07098 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -558,7 +558,7 @@ You can also provide `--timeout-minutes` option. When running the quality checker workflow using Databricks API or UI, you can also provide the same parameters: * By default, the workflow executes across all defined run configs within the configuration file. * To execute the workflow for a specific run config, specify the `run_config_name` parameter during execution. -* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution: +* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution. The following parameters are supported: - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., `catalog.schema1.*;catalog.schema2.table1`. - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. The output and quarantine table names are derived by appending the `_dq_output` and `_dq_quarantine` suffixes, respectively, to the input table name. @@ -658,7 +658,7 @@ You can also provide `--timeout-minutes` option. When running the e2e workflow using Databricks API or UI, you can also provide the same parameters: * By default, the workflow executes across all defined run configs within the configuration file. * To execute the workflow for a specific run config, specify the `run_config_name` parameter during execution. -* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution: +* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution. The following parameters are supported: - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., `catalog.schema1.*;catalog.schema2.table1`. - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. The output and quarantine table names are derived by appending the `_dq_output` and `_dq_quarantine` suffixes, respectively, to the input table name. diff --git a/src/databricks/labs/dqx/checks_storage.py b/src/databricks/labs/dqx/checks_storage.py index 78a6689b5..510c0050b 100644 --- a/src/databricks/labs/dqx/checks_storage.py +++ b/src/databricks/labs/dqx/checks_storage.py @@ -459,20 +459,3 @@ def is_table_location(location: str) -> bool: bool: True if the location is a valid table name and not a file path, False otherwise. """ return bool(TABLE_PATTERN.match(location)) and not location.lower().endswith(tuple(FILE_SERIALIZERS.keys())) - - -def get_default_checks_location(base_location: str, checks_location: str) -> str: - """ - Build the checks location for table patterns. - - If the provided checks_location is a table location, it is returned as is. - If it is a file path, it is prefixed with the base_location and "checks/" directory. - - Args: - base_location (str): The base location to prefix if checks_location is a file path. - checks_location (str): The original checks location, either a table name or file path. - - Returns: - str: The constructed checks location. - """ - return checks_location if is_table_location(checks_location) else f"{base_location}/checks/" diff --git a/src/databricks/labs/dqx/contexts/workflow_context.py b/src/databricks/labs/dqx/contexts/workflow_context.py index ae21026b6..0cfacd0b2 100644 --- a/src/databricks/labs/dqx/contexts/workflow_context.py +++ b/src/databricks/labs/dqx/contexts/workflow_context.py @@ -5,6 +5,8 @@ from databricks.labs.blueprint.wheels import ProductInfo from databricks.labs.blueprint.installation import Installation from databricks.sdk import WorkspaceClient + +from databricks.labs.dqx.checks_storage import is_table_location from databricks.labs.dqx.contexts.global_context import GlobalContext from databricks.labs.dqx.config import WorkspaceConfig, RunConfig from databricks.labs.dqx.__about__ import __version__ @@ -95,7 +97,7 @@ def installation(self) -> Installation: return Installation(self.workspace_client, self.product_info.product_name(), install_folder=install_folder) @cached_property - def get_patterns(self) -> tuple[list[str], list[str]]: + def resolved_patterns(self) -> tuple[list[str], list[str]]: """Returns a tuple of patterns and exclude patterns lists.""" patterns: list[str] = [] exclude_patterns: list[str] = [] @@ -116,6 +118,24 @@ def get_patterns(self) -> tuple[list[str], list[str]]: return patterns, exclude_patterns + @cached_property + def generic_checks_location(self) -> str: + """Build the checks location for pattern based execution making sure it is an absolute path in the workspace.""" + checks_location = self.run_config.checks_location + return ( + checks_location if is_table_location(checks_location) else f"{self.installation.install_folder()}/checks/" + ) + + @cached_property + def checks_location(self) -> str: + """Build the checks location making sure it is an absolute workspace path if a path is provided.""" + checks_location = self.run_config.checks_location + if is_table_location(checks_location): + return checks_location + if checks_location.startswith("/"): + return checks_location + return f"{self.installation.install_folder()}/{checks_location}" + @cached_property def profiler(self) -> ProfilerRunner: """Returns the ProfilerRunner instance.""" diff --git a/src/databricks/labs/dqx/profiler/profiler_runner.py b/src/databricks/labs/dqx/profiler/profiler_runner.py index 79172b426..778b002dd 100644 --- a/src/databricks/labs/dqx/profiler/profiler_runner.py +++ b/src/databricks/labs/dqx/profiler/profiler_runner.py @@ -5,7 +5,7 @@ from databricks.sdk import WorkspaceClient from databricks.sdk.service.workspace import ImportFormat -from databricks.labs.dqx.checks_storage import is_table_location, get_default_checks_location +from databricks.labs.dqx.checks_storage import is_table_location from databricks.labs.dqx.config import ( InputConfig, ProfilerConfig, @@ -90,7 +90,6 @@ def run_for_patterns( exclude_patterns: list[str], profiler_config: ProfilerConfig, checks_location: str, - install_folder: str, max_parallelism: int, ) -> None: """ @@ -102,7 +101,6 @@ def run_for_patterns( profiler_config: Profiler configuration. checks_location: Delta table to save the generated checks, otherwise checks are saved under checks/{table_name}.yml. - install_folder: Installation folder path (used in storage config). max_parallelism: Maximum number of parallel threads to use for profiling. """ options = [ @@ -132,9 +130,7 @@ def run_for_patterns( storage_config = TableChecksStorageConfig(location=checks_location, run_config_name=table) else: # for file based checks expecting a file per table - storage_config = WorkspaceFileChecksStorageConfig( - location=f"{get_default_checks_location(install_folder, checks_location)}/{table}.yml" - ) + storage_config = WorkspaceFileChecksStorageConfig(location=f"{checks_location}/{table}.yml") self.save(checks, summary_stats, storage_config, profiler_config.summary_stats_file) diff --git a/src/databricks/labs/dqx/profiler/profiler_workflow.py b/src/databricks/labs/dqx/profiler/profiler_workflow.py index 3db07e16c..7ae74e9c5 100644 --- a/src/databricks/labs/dqx/profiler/profiler_workflow.py +++ b/src/databricks/labs/dqx/profiler/profiler_workflow.py @@ -35,13 +35,12 @@ def profile(self, ctx: WorkflowContext): """ if ctx.patterns and ctx.run_config_name: logger.info(f"Running profiler workflow for patterns: {ctx.patterns}") - patterns, exclude_patterns = ctx.get_patterns + patterns, exclude_patterns = ctx.resolved_patterns ctx.profiler.run_for_patterns( patterns=patterns, exclude_patterns=exclude_patterns, profiler_config=ctx.run_config.profiler_config, - checks_location=ctx.run_config.checks_location, - install_folder=ctx.installation.install_folder(), + checks_location=ctx.generic_checks_location, max_parallelism=ctx.config.profiler_max_parallelism, ) elif ctx.run_config_name: diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py index c5181b1c6..2e681c087 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py @@ -1,6 +1,5 @@ import logging -from databricks.labs.dqx.checks_storage import get_default_checks_location from databricks.labs.dqx.config import RunConfig from databricks.labs.dqx.contexts.workflow_context import WorkflowContext from databricks.labs.dqx.installer.workflow_task import Workflow, workflow_task @@ -32,15 +31,13 @@ def apply_checks(self, ctx: WorkflowContext): """ if ctx.patterns and ctx.run_config_name: logger.info(f"Running data quality workflow for patterns: {ctx.patterns}") - patterns, exclude_patterns = ctx.get_patterns - checks_location = get_default_checks_location( - ctx.installation.install_folder(), ctx.run_config.checks_location - ) + run_config = self._prepare_run_config(ctx, ctx.run_config) + patterns, exclude_patterns = ctx.resolved_patterns ctx.quality_checker.run_for_patterns( patterns=patterns, exclude_patterns=exclude_patterns, - run_config_template=ctx.run_config, - checks_location=checks_location, + run_config_template=run_config, + checks_location=ctx.generic_checks_location, output_table_suffix=ctx.output_table_suffix, quarantine_table_suffix=ctx.quarantine_table_suffix, max_parallelism=ctx.config.quality_checker_max_parallelism, @@ -71,23 +68,9 @@ def _prepare_run_config(self, ctx: WorkflowContext, run_config: RunConfig) -> Ru raise InvalidConfigError("No input data source configured during installation") run_config.custom_check_functions = self._prefix_custom_check_paths(ctx, run_config.custom_check_functions) - run_config.checks_location = self._prefix_checks_location(ctx, run_config.checks_location) + run_config.checks_location = ctx.checks_location return run_config - @staticmethod - def _prefix_checks_location(ctx: WorkflowContext, location: str) -> str: - """ - Prefixes the checks location installation folder if it is not an absolute path. - - Args: - ctx: Runtime context. - location: The location of the checks, either as an absolute path or relative to the installation folder. - - Returns: - The prefixed checks location. - """ - return location if location.startswith("/") else f"{ctx.installation.install_folder()}/{location}" - @staticmethod def _prefix_custom_check_paths(ctx: WorkflowContext, custom_check_functions: dict[str, str]) -> dict[str, str]: """ diff --git a/tests/unit/checks_storage.py b/tests/unit/checks_storage.py index 392446eba..da9b77ebe 100644 --- a/tests/unit/checks_storage.py +++ b/tests/unit/checks_storage.py @@ -1,5 +1,5 @@ import pytest -from databricks.labs.dqx.checks_storage import is_table_location, get_default_checks_location +from databricks.labs.dqx.checks_storage import is_table_location @pytest.mark.parametrize( @@ -14,18 +14,3 @@ ) def test_is_table_location(location: str, expected: bool): assert is_table_location(location) == expected - - -@pytest.mark.parametrize( - "table, install_folder, expected", - [ - ("catalog.schema.table", "/path/to/install", "catalog.schema.table"), - ("schema.table", "/install/folder", "schema.table"), - ("table", "/install", "/install/checks/"), - ("path/file.yml", "/install", "/install/checks/"), - ("/path/file.yml", "/install", "/install/checks/"), - ("", "/install", "/install/checks/"), # Edge case: empty table name - ], -) -def test_get_default_checks_location(table: str, install_folder: str, expected: str): - assert get_default_checks_location(install_folder, table) == expected From d44a6899c230d0c8c39a0a668b1ad640ffe6c8ef Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Wed, 1 Oct 2025 18:40:59 +0200 Subject: [PATCH 46/64] fixed tests --- .../labs/dqx/contexts/workflow_context.py | 10 -- .../quality_checker_workflow.py | 44 +++++++-- tests/integration/conftest.py | 2 + .../test_quality_checker_workflow.py | 98 +++++++++++++++++-- 4 files changed, 124 insertions(+), 30 deletions(-) diff --git a/src/databricks/labs/dqx/contexts/workflow_context.py b/src/databricks/labs/dqx/contexts/workflow_context.py index 0cfacd0b2..6aeac4439 100644 --- a/src/databricks/labs/dqx/contexts/workflow_context.py +++ b/src/databricks/labs/dqx/contexts/workflow_context.py @@ -126,16 +126,6 @@ def generic_checks_location(self) -> str: checks_location if is_table_location(checks_location) else f"{self.installation.install_folder()}/checks/" ) - @cached_property - def checks_location(self) -> str: - """Build the checks location making sure it is an absolute workspace path if a path is provided.""" - checks_location = self.run_config.checks_location - if is_table_location(checks_location): - return checks_location - if checks_location.startswith("/"): - return checks_location - return f"{self.installation.install_folder()}/{checks_location}" - @cached_property def profiler(self) -> ProfilerRunner: """Returns the ProfilerRunner instance.""" diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py index 2e681c087..81226a6b2 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py @@ -1,5 +1,6 @@ import logging +from databricks.labs.dqx.checks_storage import is_table_location from databricks.labs.dqx.config import RunConfig from databricks.labs.dqx.contexts.workflow_context import WorkflowContext from databricks.labs.dqx.installer.workflow_task import Workflow, workflow_task @@ -31,7 +32,7 @@ def apply_checks(self, ctx: WorkflowContext): """ if ctx.patterns and ctx.run_config_name: logger.info(f"Running data quality workflow for patterns: {ctx.patterns}") - run_config = self._prepare_run_config(ctx, ctx.run_config) + run_config = self._prepare_run_config(ctx.installation.install_folder(), ctx.run_config) patterns, exclude_patterns = ctx.resolved_patterns ctx.quality_checker.run_for_patterns( patterns=patterns, @@ -44,21 +45,24 @@ def apply_checks(self, ctx: WorkflowContext): ) elif ctx.run_config_name: logger.info(f"Running data quality workflow for run config: {ctx.run_config_name}") - run_config = self._prepare_run_config(ctx, ctx.run_config) + run_config = self._prepare_run_config(ctx.installation.install_folder(), ctx.run_config) ctx.quality_checker.run([run_config]) else: logger.info("Running data quality workflow for all run configs") - run_configs = [self._prepare_run_config(ctx, run_config) for run_config in ctx.config.run_configs] + run_configs = [ + self._prepare_run_config(ctx.installation.install_folder(), run_config) + for run_config in ctx.config.run_configs + ] ctx.quality_checker.run(run_configs, ctx.config.quality_checker_max_parallelism) - def _prepare_run_config(self, ctx: WorkflowContext, run_config: RunConfig) -> RunConfig: + def _prepare_run_config(self, install_folder: str, run_config: RunConfig) -> RunConfig: """ Apply common path prefixing to a run configuration in-place and return it. Ensures custom check function paths and checks location are absolute in the Databricks Workspace. Args: - ctx: Runtime context. + install_folder: The installation folder path (e.g., "/Users/user@email.com/dqx"). run_config: The run configuration to prepare. Returns: @@ -67,17 +71,37 @@ def _prepare_run_config(self, ctx: WorkflowContext, run_config: RunConfig) -> Ru if not run_config.input_config: raise InvalidConfigError("No input data source configured during installation") - run_config.custom_check_functions = self._prefix_custom_check_paths(ctx, run_config.custom_check_functions) - run_config.checks_location = ctx.checks_location + run_config.custom_check_functions = self._prefix_custom_check_paths( + install_folder, run_config.custom_check_functions + ) + run_config.checks_location = self._prefix_checks_location(install_folder, run_config.checks_location) return run_config @staticmethod - def _prefix_custom_check_paths(ctx: WorkflowContext, custom_check_functions: dict[str, str]) -> dict[str, str]: + def _prefix_checks_location(install_folder: str, checks_location: str) -> str: + """ + Prefixes the checks location with the installation folder if it is not an absolute path or a table location. + + Args: + install_folder: Installation folder path (e.g., "/Users/user@email.com/dqx"). + checks_location: Checks location path from the run configuration. + + Returns: + + """ + if is_table_location(checks_location): + return checks_location + if checks_location.startswith("/"): + return checks_location + return f"{install_folder}/{checks_location}" + + @staticmethod + def _prefix_custom_check_paths(install_folder: str, custom_check_functions: dict[str, str]) -> dict[str, str]: """ Prefixes custom check function paths with the installation folder if they are not absolute paths. Args: - ctx: Runtime context. + install_folder: The installation folder path (e.g., "/Applications/dqx"). custom_check_functions: A mapping where each key is the name of a function (e.g., "my_func") and each value is the file path to the Python module that defines it. The path can be absolute or relative to the installation folder, and may refer to a local filesystem location, a @@ -89,7 +113,7 @@ def _prefix_custom_check_paths(ctx: WorkflowContext, custom_check_functions: dic """ if custom_check_functions: return { - func_name: path if path.startswith("/") else f"/Workspace{ctx.installation.install_folder()}/{path}" + func_name: path if path.startswith("/") else f"/Workspace{install_folder}/{path}" for func_name, path in custom_check_functions.items() } return custom_check_functions diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 74175285d..9977e3e34 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -160,6 +160,7 @@ def _setup_workflows_deps( location=output_table, trigger={"availableNow": True} if is_streaming else {}, options=({"checkpointLocation": f"/tmp/dqx_tests/{make_random(10)}_out_ckpt"} if is_streaming else {}), + mode="overwrite", ) if checks_location: @@ -171,6 +172,7 @@ def _setup_workflows_deps( location=quarantine_table, trigger={"availableNow": True} if is_streaming else {}, options=({"checkpointLocation": f"/tmp/dqx_tests/{make_random(10)}_qr_ckpt"} if is_streaming else {}), + mode="overwrite", ) ctx.installation.save(ctx.config) diff --git a/tests/integration/test_quality_checker_workflow.py b/tests/integration/test_quality_checker_workflow.py index 4cdba5805..76c6a32be 100644 --- a/tests/integration/test_quality_checker_workflow.py +++ b/tests/integration/test_quality_checker_workflow.py @@ -51,6 +51,49 @@ def test_quality_checker_workflow_for_multiple_run_configs( assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) +def test_quality_checker_workflow_for_multiple_run_configs_table_checks_storage( + ws, spark, setup_workflows, expected_quality_checking_output +): + installation_ctx, run_config = setup_workflows(checks=True) + + input_table = run_config.input_config.location + catalog_name, schema_name, _ = input_table.split('.') + + # update run config to use table storage for checks + checks_table = f"{catalog_name}.{schema_name}.checks" + config = installation_ctx.config + run_config = config.get_run_config() + run_config.checks_location = checks_table + + second_run_config = copy.deepcopy(run_config) + second_run_config.name = "second" + # use the same checks but different output location + second_run_config.output_config.location = run_config.output_config.location + "_second" + installation_ctx.config.run_configs.append(second_run_config) + + # overwrite config in the installation folder + installation_ctx.installation.save(installation_ctx.config) + + dq_engine = DQEngine(ws, spark) + checks = dq_engine.load_checks( + config=WorkspaceFileChecksStorageConfig(location=f"{installation_ctx.installation.install_folder()}/checks.yml") + ) + dq_engine.save_checks( + config=TableChecksStorageConfig(location=checks_table, run_config_name=run_config.name), checks=checks + ) + ws.workspace.delete(f"{installation_ctx.installation.install_folder()}/checks.yml") + + # run workflow + installation_ctx.deployed_workflows.run_workflow("quality-checker", run_config_name="") + + # assert results + checked_df = spark.table(run_config.output_config.location) + assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + checked_df = spark.table(second_run_config.output_config.location) + assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + def test_quality_checker_workflow_serverless(ws, spark, setup_serverless_workflows, expected_quality_checking_output): installation_ctx, run_config = setup_serverless_workflows(checks=True) @@ -60,6 +103,36 @@ def test_quality_checker_workflow_serverless(ws, spark, setup_serverless_workflo assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) +def test_quality_checker_workflow_table_checks_storage( + ws, spark, make_table, setup_workflows, expected_quality_checking_output, make_random +): + installation_ctx, run_config = setup_workflows(checks=True) + + input_table = run_config.input_config.location + catalog_name, schema_name, _ = input_table.split('.') + + # update run config to use table storage for checks + checks_table = f"{catalog_name}.{schema_name}.checks" + config = installation_ctx.config + run_config = config.get_run_config() + run_config.checks_location = checks_table + installation_ctx.installation.save(config) + + dq_engine = DQEngine(ws, spark) + checks = dq_engine.load_checks( + config=WorkspaceFileChecksStorageConfig(location=f"{installation_ctx.installation.install_folder()}/checks.yml") + ) + dq_engine.save_checks( + config=TableChecksStorageConfig(location=checks_table, run_config_name=run_config.name), checks=checks + ) + ws.workspace.delete(f"{installation_ctx.installation.install_folder()}/checks.yml") + + installation_ctx.deployed_workflows.run_workflow("quality-checker", run_config.name) + + checked_df = spark.table(run_config.output_config.location) + assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) + + def test_quality_checker_workflow_with_custom_install_folder( ws, spark, setup_workflows_with_custom_folder, expected_quality_checking_output ): @@ -337,14 +410,6 @@ def test_quality_checker_workflow_for_patterns_exclude_output( first_table = run_config.input_config.location catalog_name, schema_name, _ = first_table.split('.') - output_table_suffix = "_output" - quarantine_table_suffix = "_quarantine" - - # table to skip based on suffix - make_second_input_table(spark, catalog_name, schema_name, first_table, make_random, output_table_suffix) - # table to skip based on suffix - make_second_input_table(spark, catalog_name, schema_name, first_table, make_random, quarantine_table_suffix) - dq_engine = DQEngine(ws, spark) checks = dq_engine.load_checks( config=WorkspaceFileChecksStorageConfig(location=f"{installation_ctx.installation.install_folder()}/checks.yml") @@ -357,6 +422,9 @@ def test_quality_checker_workflow_for_patterns_exclude_output( ) ws.workspace.delete(f"{installation_ctx.installation.install_folder()}/checks.yml") + output_table_suffix = "_output" + quarantine_table_suffix = "_quarantine" + # run workflow installation_ctx.deployed_workflows.run_workflow( workflow="quality-checker", @@ -367,6 +435,16 @@ def test_quality_checker_workflow_for_patterns_exclude_output( quarantine_table_suffix=quarantine_table_suffix, ) + # run workflow again to verify that existing output and quarantine tables are excluded + installation_ctx.deployed_workflows.run_workflow( + workflow="quality-checker", + run_config_name=run_config.name, + patterns=f"{catalog_name}.{schema_name}.*", + # existing output and quarantine tables are excluded by default based on suffixes + output_table_suffix=output_table_suffix, + quarantine_table_suffix=quarantine_table_suffix, + ) + expected_output_df = dq_engine.get_valid(expected_quality_checking_output) expected_quarantine_df = dq_engine.get_invalid(expected_quality_checking_output) @@ -376,9 +454,9 @@ def test_quality_checker_workflow_for_patterns_exclude_output( quarantine_df = spark.table(first_table + quarantine_table_suffix) assert_df_equality(quarantine_df, expected_quarantine_df, ignore_nullable=True) - # 1 input + 2 outputs (output, quarantine) + 2 existing + # 1 input + 2 outputs (output, quarantine) tables = ws.tables.list_summaries(catalog_name=catalog_name, schema_name_pattern=schema_name) - assert len(list(tables)) == 5, "Tables count mismatch" + assert len(list(tables)) == 3, "Tables count mismatch" def test_quality_checker_workflow_for_patterns_table_checks_storage( From 6088721137d608fe694d3c2169b0977ea18bdc31 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Wed, 1 Oct 2025 18:42:47 +0200 Subject: [PATCH 47/64] updated docs --- docs/dqx/docs/guide/data_profiling.mdx | 2 +- docs/dqx/docs/guide/quality_checks_apply.mdx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index c8f34bf13..8c138f1b5 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -248,7 +248,7 @@ You can also provide `--timeout-minutes` option. When running the profiler workflow using Databricks API or UI, you can also provide the same parameters: * By default, the workflow executes across all defined run configs within the configuration file. * To execute the workflow for a specific run config, specify the `run_config_name` parameter during execution. -* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution. The following parameters are supported: +* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution. The following parameters are supported for pattern based execution: - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., `catalog.schema1.*;catalog.schema2.table1`. - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. If the `checks_location` in the run config points to a table, the checks will be directly saved to that table. Otherwise, they will be stored in workspace files located in the installation directory under `install_folder/checks/.yml`. Other storage types are not supported. diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index 887f07098..a566e4f1e 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -558,7 +558,7 @@ You can also provide `--timeout-minutes` option. When running the quality checker workflow using Databricks API or UI, you can also provide the same parameters: * By default, the workflow executes across all defined run configs within the configuration file. * To execute the workflow for a specific run config, specify the `run_config_name` parameter during execution. -* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution. The following parameters are supported: +* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution. The following parameters are supported for pattern based execution: - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., `catalog.schema1.*;catalog.schema2.table1`. - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. The output and quarantine table names are derived by appending the `_dq_output` and `_dq_quarantine` suffixes, respectively, to the input table name. @@ -658,7 +658,7 @@ You can also provide `--timeout-minutes` option. When running the e2e workflow using Databricks API or UI, you can also provide the same parameters: * By default, the workflow executes across all defined run configs within the configuration file. * To execute the workflow for a specific run config, specify the `run_config_name` parameter during execution. -* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution. The following parameters are supported: +* To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution. The following parameters are supported for pattern based execution: - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., `catalog.schema1.*;catalog.schema2.table1`. - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. The output and quarantine table names are derived by appending the `_dq_output` and `_dq_quarantine` suffixes, respectively, to the input table name. From 4dcd0157935f133ece72e4eb60f43a52ec6ef2d8 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Wed, 1 Oct 2025 19:09:14 +0200 Subject: [PATCH 48/64] updated docs --- docs/dqx/docs/guide/data_profiling.mdx | 1 + docs/dqx/docs/guide/quality_checks_apply.mdx | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index 8c138f1b5..58de47d1f 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -254,6 +254,7 @@ When running the profiler workflow using Databricks API or UI, you can also prov If the `checks_location` in the run config points to a table, the checks will be directly saved to that table. Otherwise, they will be stored in workspace files located in the installation directory under `install_folder/checks/.yml`. Other storage types are not supported. - `exclude_patterns`: (optional) Accepts a semicolon-delimited list of patterns to exclude (useful if you want to exclude output and quarantine tables), e.g., `catalog.schema1.*_output;catalog.schema1.*_quarantine`. - By default, the profiler skips output and quarantine tables based on the `output_table_suffix` (default: "_dq_output") and `quarantine_table_suffix` (default: "_dq_quarantine") job parameters. + This prevents potential profiling of the output and quarantine tables generated by the quality checker workflow. To disable this behavior, clear the values of `output_table_suffix` and `quarantine_table_suffix` in the job parameters. See the relevant params in red: diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index a566e4f1e..150814c29 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -565,6 +565,7 @@ When running the quality checker workflow using Databricks API or UI, you can al If the `checks_location` in the run config points to a table, the checks will be directly loaded from that table. Otherwise, they will be loaded from workspace files located in the installation directory under `install_folder/checks/.yml`. Other storage types are not supported. - `exclude_patterns`: (optional) Accepts a semicolon-delimited list of patterns to exclude (useful if you want to exclude output and quarantine tables), e.g., `catalog.schema1.*_output;catalog.schema1.*_quarantine`. - By default, the workflow skips output and quarantine tables based on the `output_table_suffix` and `quarantine_table_suffix` job parameters. + This prevents applying checks to the output and quarantine tables from previous runs. - `output_table_suffix`: (optional) Suffix to append to the output table names (default: "_dq_output"). - `quarantine_table_suffix`: (optional) Suffix to append to the quarantine table names (default: "_dq_quarantine"). From 64723a65e32966479c7a58421c5dc1fcd6c93e10 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Wed, 1 Oct 2025 19:22:54 +0200 Subject: [PATCH 49/64] updated docstrings --- src/databricks/labs/dqx/profiler/profiler_workflow.py | 6 +++--- .../labs/dqx/quality_checker/quality_checker_workflow.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/databricks/labs/dqx/profiler/profiler_workflow.py b/src/databricks/labs/dqx/profiler/profiler_workflow.py index 7ae74e9c5..08290d3bf 100644 --- a/src/databricks/labs/dqx/profiler/profiler_workflow.py +++ b/src/databricks/labs/dqx/profiler/profiler_workflow.py @@ -19,11 +19,11 @@ def profile(self, ctx: WorkflowContext): Profile input data and save the generated checks and profile summary stats. Logic:led, the provided run config name - * If location patterns are provided, only those patterns will be profiled, and the provided run config name - will be used as a template for all fields except the location. + * If location patterns are provided, only tables matching the patterns will be profiled, + and the provided run config name will be used as a template for all fields except location. Additionally, exclude patterns can be specified to skip profiling specific tables. Output and quarantine tables are excluded by default based on output_table_suffix and quarantine_table_suffix - to avoid profiling them. + job parameters to avoid profiling them. * If no location patterns are provided, but a run config name is given, only that run config will be profiled. * If neither location patterns nor a run config name are provided, all run configs will be profiled. diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py index 81226a6b2..f7b32490b 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py @@ -19,11 +19,11 @@ def apply_checks(self, ctx: WorkflowContext): Apply data quality checks to the input data and save the results. Logic: - * If location patterns are provided, only those patterns will be used, and the provided run config name - will be used as a template for all fields except the location. + * If location patterns are provided, only tables matching the patterns will be used, + and the provided run config name will be used as a template for all fields except location. Additionally, exclude patterns can be specified to skip specific tables. Output and quarantine tables are excluded by default based on output_table_suffix and quarantine_table_suffix - to avoid re-applying checks on them. + job parameters to avoid re-applying checks on them. * If no location patterns are provided, but a run config name is given, only that run config will be used. * If neither location patterns nor a run config name are provided, all run configs will be used. From c323c61e01ab67e3f0bffb08fa43e6027ce7682b Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Thu, 2 Oct 2025 18:41:48 +0200 Subject: [PATCH 50/64] updated docstrings --- demos/dqx_multi_table_demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/dqx_multi_table_demo.py b/demos/dqx_multi_table_demo.py index 73568e650..eafec65da 100644 --- a/demos/dqx_multi_table_demo.py +++ b/demos/dqx_multi_table_demo.py @@ -176,7 +176,7 @@ # Apply checks to multiple tables using patterns, but skip existing output and quarantine tables based on the suffixes dq_engine.apply_checks_and_save_in_tables_for_patterns( patterns=[f"{demo_catalog_name}.{demo_schema_name}.users*"], # apply quality checks for all tables matching the patterns - exclude_patterns=exclude_patterns, # skip existing output tables + exclude_patterns=["*_checked", "*_quarantine"], # skip existing output tables checks_location=checks_table, # as delta table or absolute workspace or volume directory. For file based locations, checks are expected to be found under {checks_location}/{table_name}.yml. run_config_template=RunConfig( # input config is auto-created if not provided; location is skipped in any case and derived from patterns From 694c64a7eaf6cb6a4a4994a8a2f16dd3a5c178f5 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Thu, 2 Oct 2025 20:09:31 +0200 Subject: [PATCH 51/64] refactor --- demos/dqx_demo_tool.py | 6 +- docs/dqx/docs/guide/data_profiling.mdx | 34 +++++--- docs/dqx/docs/guide/quality_checks_apply.mdx | 69 +++++++++++----- .../docs/guide/quality_checks_definition.mdx | 4 +- docs/dqx/docs/reference/cli.mdx | 46 ++++------- src/databricks/labs/dqx/checks_storage.py | 24 +++--- src/databricks/labs/dqx/config.py | 5 +- .../labs/dqx/contexts/workflow_context.py | 73 ++++++++++++++--- src/databricks/labs/dqx/engine.py | 7 +- .../labs/dqx/profiler/profiler_runner.py | 21 ++--- .../labs/dqx/profiler/profiler_workflow.py | 15 ++-- .../quality_checker/quality_checker_runner.py | 4 +- .../quality_checker_workflow.py | 78 +------------------ src/databricks/labs/dqx/utils.py | 33 ++++++++ tests/integration/conftest.py | 2 - .../test_apply_checks_and_save_in_table.py | 2 +- tests/integration/test_e2e_workflow.py | 14 ++-- .../test_load_checks_from_workspace_file.py | 17 ++++ tests/integration/test_profiler_workflow.py | 34 ++++---- .../test_quality_checker_workflow.py | 18 ++++- tests/unit/test_utils.py | 25 ++++++ 21 files changed, 323 insertions(+), 208 deletions(-) diff --git a/demos/dqx_demo_tool.py b/demos/dqx_demo_tool.py index bb831625e..17cee9294 100644 --- a/demos/dqx_demo_tool.py +++ b/demos/dqx_demo_tool.py @@ -79,7 +79,7 @@ # MAGIC # You can also run for tables/views matching wildcard patterns. Conventions: # MAGIC # * Run config is used as a template for all relevant fields except location # MAGIC # * Input table location is derived from the patterns -# MAGIC # * For table-based checks location, save checks to the delta table, otherwise to install_folder/checks/.yml +# MAGIC # * For table-based checks location, save checks to the delta table, otherwise to install_folder/checks_folder_if_any/.yml # MAGIC databricks labs dqx profile --run-config "default" --patterns "main.nytaxi.*;main.default.table" # MAGIC ``` # MAGIC @@ -101,7 +101,7 @@ # MAGIC # You can also run for tables/views matching wildcard patterns. Conventions: # MAGIC # * Run config is used as a template for all relevant fields except location # MAGIC # * Input table location is derived from the patterns -# MAGIC # * For table-based checks location, load checks from the delta table, otherwise from install_folder/checks/.yml +# MAGIC # * For table-based checks location, load checks from the delta table, otherwise from install_folder/checks_folder_if_any/.yml # MAGIC # * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes # MAGIC databricks labs dqx apply-checks --run-config "default" --patterns "main.nytaxi.*;main.default.table" # MAGIC ``` @@ -126,7 +126,7 @@ # MAGIC # You can also run for tables/views matching wildcard patterns. Conventions: # MAGIC # * Run config is used as a template for all relevant fields except location # MAGIC # * Input table location is derived from the patterns -# MAGIC # * For table-based checks location, save/load checks from the delta table, otherwise from install_folder/checks/.yml +# MAGIC # * For table-based checks location, save/load checks from the delta table, otherwise from install_folder/checks_folder_if_any/.yml # MAGIC # * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes # MAGIC databricks labs dqx e2e --run-config "default" --patterns "main.nytaxi.*;main.default.table" # MAGIC ``` diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index 58de47d1f..c20832c51 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -231,31 +231,47 @@ Profiling is typically done as a one-time action for the input dataset to discov You can run the profiler workflow from Databricks UI or by using Databricks CLI: ```commandline -# run for all run configs +# Run for all run configs in the configuration file databricks labs dqx profile -# run for a specific run config +# Run for a specific run config in the configuration file databricks labs dqx profile --run-config "default" -# run for wildcard patterns (use run config as a template for all fields except location) +# Run for all tables/views matching wildcard patterns. Conventions: +# * Run config from configuration file is used as a template for all relevant fields except location +# * Input table location is derived from the patterns +# * For table-based checks location, checks are saved to the specified table +# * For file-based checks location, file in the path is replaced with .yml. In addition, if the location is specified as a relative path, it is prefixed with the installation folder +# * By default, output and quarantine tables are excluded based on suffixes +# * Default for output table suffix is "_dq_output" +# * Default for quarantine table suffix is "_dq_quarantine" databricks labs dqx profile --run-config "default" --patterns "main.product001.*;main.product002" -# run for wildcard patterns and exclude patterns (skip output and quarantine tables) +# Run for wildcard patterns and exclude patterns databricks labs dqx profile --run-config "default" --patterns "main.product001.*;main.product002" --exclude-patterns "*_output;*_quarantine" ``` You can also provide `--timeout-minutes` option. -When running the profiler workflow using Databricks API or UI, you can also provide the same parameters: +When running the profiler workflow using Databricks API or UI, you have the same execution options: * By default, the workflow executes across all defined run configs within the configuration file. * To execute the workflow for a specific run config, specify the `run_config_name` parameter during execution. * To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution. The following parameters are supported for pattern based execution: - - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., `catalog.schema1.*;catalog.schema2.table1`. + - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., "catalog.schema1.*;catalog.schema2.table1". - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. - If the `checks_location` in the run config points to a table, the checks will be directly saved to that table. Otherwise, they will be stored in workspace files located in the installation directory under `install_folder/checks/.yml`. Other storage types are not supported. - - `exclude_patterns`: (optional) Accepts a semicolon-delimited list of patterns to exclude (useful if you want to exclude output and quarantine tables), e.g., `catalog.schema1.*_output;catalog.schema1.*_quarantine`. - - By default, the profiler skips output and quarantine tables based on the `output_table_suffix` (default: "_dq_output") and `quarantine_table_suffix` (default: "_dq_quarantine") job parameters. + - The output and quarantine table names are derived by appending the value of `output_table_suffix` and `quarantine_table_suffix` job parameters, respectively, to the input table name. + - If the `checks_location` in the run config points to a table, the checks will be directly loaded from that table. + If the `checks_location` in the run config points to a file, file name is replaced with "<input_table>.yml". In addition, if the location is specified as a relative path, it is prefixed with the workspace installation folder. + For example: + - If "checks_location=catalog.schema.table", the location will be resolved to "catalog.schema.table". + - If "checks_location=folder/checks.yml", the location will be resolved to "install_folder/folder/<input_table>.yml". + - If "checks_location=/App/checks.yml", the location will be resolved to "/App/<input_table>.yml". + - If "checks_location=/Volume/catalog/schema/folder/checks.yml", the location will be resolved to "/Volume/catalog/schema/folder/<input_table>.yml". + - `exclude_patterns`: (optional) Accepts a semicolon-delimited list of patterns to exclude, e.g., "\*_output;\*_quarantine". + - By default, the workflow skips output and quarantine tables automatically based on the `output_table_suffix` and `quarantine_table_suffix` job parameters. This prevents potential profiling of the output and quarantine tables generated by the quality checker workflow. To disable this behavior, clear the values of `output_table_suffix` and `quarantine_table_suffix` in the job parameters. + - `output_table_suffix`: (optional) Suffix used for the output table names (default: "_dq_output"). + - `quarantine_table_suffix`: (optional) Suffix used for to the quarantine table names (default: "_dq_quarantine"). See the relevant params in red:

diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index 150814c29..832e57411 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -541,30 +541,44 @@ Quality checker workflow performs the following: To run the workflows manually, you can use Databricks UI or Databricks CLI: ```commandline -# run for all run configs +# Run for all run configs in the configuration file databricks labs dqx apply-checks -# run for a specific run config +# Run for a specific run config in the configuration file databricks labs dqx apply-checks --run-config "default" -# run for tables/views matching wildcard patterns (use run config as a template for all fields except location) +# Run for tables/views matching wildcard patterns. Conventions: +# * Run config from configuration file is used as a template for all relevant fields except location +# * Input table location is derived from the patterns +# * For table-based checks location, checks are loaded from the specified table +# * For file-based checks location, file in the path is replaced with .yml. In addition, if the location is specified as a relative path, it is prefixed with the installation folder +# * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes +# * By default, output and quarantine tables are excluded based on suffixes +# * Default for output table suffix is "_dq_output" +# * Default for quarantine table suffix is "_dq_quarantine" databricks labs dqx apply-checks --run-config "default" --patterns "main.product001.*;main.product002" -# run for wildcard patterns, exclude patterns (skip output and quarantine tables), and custom output and quarantine table suffixes +# Run for wildcard patterns, exclude patterns, and custom output, and quarantine table suffixes databricks labs dqx apply-checks --run-config "default" --patterns "main.product001.*;main.product002" --exclude-patterns "*_dq_output;*_dq_quarantine" --output-table-suffix "_output" --quarantine-table-suffix "_quarantine" ``` You can also provide `--timeout-minutes` option. -When running the quality checker workflow using Databricks API or UI, you can also provide the same parameters: +When running the quality checker workflow using Databricks API or UI, you have the same execution options: * By default, the workflow executes across all defined run configs within the configuration file. * To execute the workflow for a specific run config, specify the `run_config_name` parameter during execution. * To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution. The following parameters are supported for pattern based execution: - - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., `catalog.schema1.*;catalog.schema2.table1`. + - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., "catalog.schema1.*;catalog.schema2.table1". - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. - The output and quarantine table names are derived by appending the `_dq_output` and `_dq_quarantine` suffixes, respectively, to the input table name. - If the `checks_location` in the run config points to a table, the checks will be directly loaded from that table. Otherwise, they will be loaded from workspace files located in the installation directory under `install_folder/checks/.yml`. Other storage types are not supported. - - `exclude_patterns`: (optional) Accepts a semicolon-delimited list of patterns to exclude (useful if you want to exclude output and quarantine tables), e.g., `catalog.schema1.*_output;catalog.schema1.*_quarantine`. - - By default, the workflow skips output and quarantine tables based on the `output_table_suffix` and `quarantine_table_suffix` job parameters. + - The output and quarantine table names are derived by appending the value of `output_table_suffix` and `quarantine_table_suffix` job parameters, respectively, to the input table name. + - If the `checks_location` in the run config points to a table, the checks will be directly loaded from that table. + If the `checks_location` in the run config points to a file, file name is replaced with "<input_table>.yml". In addition, if the location is specified as a relative path, it is prefixed with the workspace installation folder. + For example: + - If "checks_location=catalog.schema.table", the location will be resolved to "catalog.schema.table". + - If "checks_location=folder/checks.yml", the location will be resolved to "install_folder/folder/<input_table>.yml". + - If "checks_location=/App/checks.yml", the location will be resolved to "/App/<input_table>.yml". + - If "checks_location=/Volume/catalog/schema/folder/checks.yml", the location will be resolved to "/Volume/catalog/schema/folder/<input_table>.yml". + - `exclude_patterns`: (optional) Accepts a semicolon-delimited list of patterns to exclude, e.g., "\*_output;\*_quarantine". + - By default, the workflow skips output and quarantine tables automatically based on the `output_table_suffix` and `quarantine_table_suffix` job parameters. This prevents applying checks to the output and quarantine tables from previous runs. - `output_table_suffix`: (optional) Suffix to append to the output table names (default: "_dq_output"). - `quarantine_table_suffix`: (optional) Suffix to append to the quarantine table names (default: "_dq_quarantine"). @@ -642,30 +656,45 @@ End-to-end (e2e) workflow performs the following: To run the workflows manually, you can use Databricks UI or Databricks CLI: ```commandline -# run for all run configs +# Run for all run configs in the configuration file databricks labs dqx e2e -# run for a specific run config +# Run for a specific run config in the configuration file databricks labs dqx e2e --run-config "default" -# run for tables/views matching wildcard patterns (use run config as a template for all fields except location) +# Run for tables/views matching wildcard patterns. Conventions: +# * Run config from configuration file is used as a template for all relevant fields except location +# * Input table location is derived from the patterns +# * For table-based checks location, checks are saved/loaded from the specified table +# * For file-based checks location, file in the path is replaced with <input_table>.yml. In addition, if the location is specified as a relative path, it is prefixed with the installation folder +# * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes +# * By default, output and quarantine tables are excluded based on suffixes +# * Default for output table suffix is "_dq_output" +# * Default for quarantine table suffix is "_dq_quarantine" databricks labs dqx e2e --run-config "default" --patterns "main.product001.*;main.product002" -# run for wildcard patterns, exclude patterns (skip output and quarantine tables), and custom output and quarantine table suffixes +# Run for wildcard patterns, exclude patterns, and custom output and quarantine table suffixes databricks labs dqx e2e --run-config "default" --patterns "main.product001.*;main.product002" --exclude-patterns "*_dq_output;*_dq_quarantine" --output-table-suffix "_output" --quarantine-table-suffix "_quarantine" ``` You can also provide `--timeout-minutes` option. -When running the e2e workflow using Databricks API or UI, you can also provide the same parameters: +When running the e2e workflow using Databricks API or UI, you have the same execution options: * By default, the workflow executes across all defined run configs within the configuration file. * To execute the workflow for a specific run config, specify the `run_config_name` parameter during execution. * To execute the workflow for tables/views matching wildcard patterns, provide value for `run_config_name` and `patterns` parameters during execution. The following parameters are supported for pattern based execution: - - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., `catalog.schema1.*;catalog.schema2.table1`. + - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., "catalog.schema1.*;catalog.schema2.table1". - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. - The output and quarantine table names are derived by appending the `_dq_output` and `_dq_quarantine` suffixes, respectively, to the input table name. - If the `checks_location` in the run config points to a table, the checks will be directly saved to or loaded from that table. Otherwise, they will be stored in workspace files located in the installation directory under `install_folder/checks/.yml`. Other storage types are not supported. - - `exclude_patterns`: (optional) Accepts a semicolon-delimited list of patterns to exclude (useful if you want to exclude output and quarantine tables), e.g., `catalog.schema1.*_output;catalog.schema1.*_quarantine`. - - By default, the workflow skips output and quarantine tables based on the `output_table_suffix` and `quarantine_table_suffix` job parameters. + - The output and quarantine table names are derived by appending the value of `output_table_suffix` and `quarantine_table_suffix` job parameters, respectively, to the input table name. + - If the `checks_location` in the run config points to a table, the checks will be directly loaded from that table. + If the `checks_location` in the run config points to a file, file name is replaced with <input_table>.yml. In addition, if the location is specified as a relative path, it is prefixed with the workspace installation folder. + For example: + - If "checks_location=catalog.schema.table", the location will be resolved to "catalog.schema.table". + - If "checks_location=folder/checks.yml", the location will be resolved to "install_folder/folder/<input_table>.yml". + - If "checks_location=/App/checks.yml", the location will be resolved to "/App/<input_table>.yml". + - If "checks_location=/Volume/catalog/schema/folder/checks.yml", the location will be resolved to "/Volume/catalog/schema/folder/<input_table>.yml". + - `exclude_patterns`: (optional) Accepts a semicolon-delimited list of patterns to exclude, e.g., "\*_output;\*_quarantine". + - By default, the workflow skips output and quarantine tables automatically based on the `output_table_suffix` and `quarantine_table_suffix` job parameters. + This prevents applying checks to the output and quarantine tables from previous runs. - `output_table_suffix`: (optional) Suffix to append to the output table names (default: "_dq_output"). - `quarantine_table_suffix`: (optional) Suffix to append to the quarantine table names (default: "_dq_quarantine"). diff --git a/docs/dqx/docs/guide/quality_checks_definition.mdx b/docs/dqx/docs/guide/quality_checks_definition.mdx index 5ce963c6a..b742d03a2 100644 --- a/docs/dqx/docs/guide/quality_checks_definition.mdx +++ b/docs/dqx/docs/guide/quality_checks_definition.mdx @@ -609,10 +609,10 @@ When checks are defined programmatically with DQX classes, syntax validation is Execute the following command to validate the checks: ```commandline - # run for all run configs + # run for all run configs in the configuration file databricks labs dqx validate-checks - # run for a specific run config + # run for a specific run config in the configuration file databricks labs dqx validate-checks --run-config "default" ``` diff --git a/docs/dqx/docs/reference/cli.mdx b/docs/dqx/docs/reference/cli.mdx index fbd6c6005..65a6cdede 100644 --- a/docs/dqx/docs/reference/cli.mdx +++ b/docs/dqx/docs/reference/cli.mdx @@ -52,61 +52,49 @@ databricks labs dqx logs --workflow quality-checker ## Running workflows ```bash -# Run profiler for all run configs: profile data and generate quality check candidates +# Run profiler for all run configs in the configuration file: profile data and generate quality check candidates databricks labs dqx profile --timeout-minutes 20 -# Run profiler for a single run config: profile data and generate quality check candidates +# Run profiler for a single run config in the configuration file: profile data and generate quality check candidates databricks labs dqx profile --run-config default --timeout-minutes 20 # Run profiler for all tables/views matching wildcard patterns. Conventions: -# * Run config is used as a template for all relevant fields except location +# * Run config from configuration file is used as a template for all relevant fields except location # * Input table location is derived from the patterns -# * For table-based checks location, save checks to the delta table, otherwise to install_folder/checks/.yml -# * Use exclude-patterns to exclude tables matching the wildcard patterns. By default, output and quarantine tables are excluded based on suffixes. -# * Default for output table suffix is "_dq_output". -# * Default for quarantine table suffix is "_dq_quarantine". +# * For table-based checks location, checks are saved to the specified table +# * For file-based checks location, file in the path is replaced with .yml. In addition, if the location is specified as a relative path, it is prefixed with the installation folder +# * Use exclude-patterns to exclude tables matching the wildcard patterns +# * By default, output and quarantine tables are excluded based on suffixes +# * Default for output table suffix is "_dq_output" +# * Default for quarantine table suffix is "_dq_quarantine" databricks labs dqx profile --run-config "default" --patterns "main.product001.*;main.product002" --exclude-patterns "*_output;*_quarantine" --timeout-minutes 20 -# Run quality checker for all run configs: apply quality checks and write results and optionally quarantine +# Run quality checker for all run configs in the configuration file: apply quality checks and write results and optionally quarantine databricks labs dqx apply-checks --timeout-minutes 20 -# Run quality checker for a single run config: apply quality checks and write results and optionally quarantine +# Run quality checker for a single run config in the configuration file: apply quality checks and write results and optionally quarantine databricks labs dqx apply-checks --run-config default --timeout-minutes 20 -# Run quality checker for tables/views matching wildcard patterns. Conventions: -# * Run config is used as a template for all relevant fields except location -# * Input table location is derived from the patterns -# * For table-based checks location, load checks from the delta table, otherwise from install_folder/checks/.yml -# * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes -# * Use exclude-patterns to exclude tables matching the wildcard patterns. By default, output and quarantine tables are excluded based on suffixes. -# * Default for output table suffix is "_dq_output". -# * Default for quarantine table suffix is "_dq_quarantine". +# Run quality checker for tables/views matching wildcard patterns. Conventions are similar to the profiler. databricks labs dqx apply-checks --run-config "default" --patterns "main.product001.*;main.product002" --exclude-patterns "*_dq_output;*_dq_quarantine" --output-table-suffix "_output" --quarantine-table-suffix "_quarantine" -# Run e2e (end-to-end) workflows for all run configs: profile data > generate quality checks > apply checks > write results and optionally quarantine +# Run e2e (end-to-end) workflows for all run configs in the configuration file: profile data > generate quality checks > apply checks > write results and optionally quarantine databricks labs dqx e2e --timeout-minutes 20 -# Run e2e (end-to-end) workflows for a single run config: profile data > generate quality checks > apply checks > write results and optionally quarantine +# Run e2e (end-to-end) workflows for a single run config in the configuration file: profile data > generate quality checks > apply checks > write results and optionally quarantine databricks labs dqx e2e --run-config default --timeout-minutes 20 -# Run e2e (end-to-end) workflows for tables/views matching wildcard patterns. Conventions: -# * Run config is used as a template for all relevant fields except location -# * Input table location is derived from the patterns -# * For table-based checks location, save/load checks from the delta table, otherwise from install_folder/checks/.yml -# * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes -# * Use exclude-patterns to exclude tables matching the wildcard patterns. By default, output and quarantine tables are excluded based on suffixes. -# * Default for output table suffix is "_dq_output". -# * Default for quarantine table suffix is "_dq_quarantine". +# Run e2e (end-to-end) workflows for tables/views matching wildcard patterns. Conventions are similar to the profiler. databricks labs dqx e2e --run-config "default" --patterns "main.product001.*;main.product002" --exclude-patterns "*_dq_output;*_dq_quarantine" --output-table-suffix "_output" --quarantine-table-suffix "_quarantine" ``` ## Validating checks ```bash -# Validate checks stored in the installation (defined in `checks_location`) for a single run config: +# Validate checks stored in the installation (defined in `checks_location`) for a single run config in the configuration file: databricks labs dqx validate-checks -# Validate checks stored in the installation (defined in `checks_location`) for all run configs: +# Validate checks stored in the installation (defined in `checks_location`) for all run configs in the configuration file: databricks labs dqx validate-checks --run-config default ``` diff --git a/src/databricks/labs/dqx/checks_storage.py b/src/databricks/labs/dqx/checks_storage.py index 510c0050b..f8e308df7 100644 --- a/src/databricks/labs/dqx/checks_storage.py +++ b/src/databricks/labs/dqx/checks_storage.py @@ -269,17 +269,22 @@ def save(self, checks: list[dict], config: InstallationChecksStorageConfig) -> N def _get_storage_handler_and_config( self, config: InstallationChecksStorageConfig ) -> tuple[ChecksStorageHandler, InstallationChecksStorageConfig]: - run_config = self._run_config_loader.load_run_config( - run_config_name=config.run_config_name, - assume_user=config.assume_user, - product_name=config.product_name, - install_folder=config.install_folder, - ) + if config.overwrite_location: + checks_location = config.location + else: + run_config = self._run_config_loader.load_run_config( + run_config_name=config.run_config_name, + assume_user=config.assume_user, + product_name=config.product_name, + install_folder=config.install_folder, + ) + checks_location = run_config.checks_location + installation = self._run_config_loader.get_installation( config.assume_user, config.product_name, config.install_folder ) - config.location = run_config.checks_location + config.location = checks_location if is_table_location(config.location): return self.table_handler, config @@ -289,11 +294,8 @@ def _get_storage_handler_and_config( if not config.location.startswith("/"): # if absolute path is not provided, the location should be set relative to the installation folder - workspace_path = f"{installation.install_folder()}/{run_config.checks_location}" - else: - workspace_path = run_config.checks_location + config.location = f"{installation.install_folder()}/{config.location}" - config.location = workspace_path return self.workspace_file_handler, config diff --git a/src/databricks/labs/dqx/config.py b/src/databricks/labs/dqx/config.py index e017962ba..23ce7eb29 100644 --- a/src/databricks/labs/dqx/config.py +++ b/src/databricks/labs/dqx/config.py @@ -219,7 +219,8 @@ class InstallationChecksStorageConfig( Args: location: The installation path where the checks are stored (e.g., table name, file path). - Not used when using installation method, as it is retrieved from the installation config. + Not used when using installation method, as it is retrieved from the installation config, + unless overwrite_location is enabled. run_config_name: The name of the run configuration to use for checks (default is 'default'). product_name: The product name for retrieving checks from the installation (default is 'dqx'). assume_user: Whether to assume the user is the owner of the checks (default is True). @@ -227,6 +228,7 @@ class InstallationChecksStorageConfig( DQX will be installed in a default directory if no custom folder is provided: * User's home directory: "/Users//.dqx" * Global directory if `DQX_FORCE_INSTALL=global`: "/Applications/dqx" + overwrite_location: Whether to overwrite the location from run config if provided (default is False). """ location: str = "installation" # retrieved from the installation config @@ -234,3 +236,4 @@ class InstallationChecksStorageConfig( product_name: str = "dqx" assume_user: bool = True install_folder: str | None = None + overwrite_location: bool = False diff --git a/src/databricks/labs/dqx/contexts/workflow_context.py b/src/databricks/labs/dqx/contexts/workflow_context.py index 6aeac4439..485052ad4 100644 --- a/src/databricks/labs/dqx/contexts/workflow_context.py +++ b/src/databricks/labs/dqx/contexts/workflow_context.py @@ -17,6 +17,7 @@ from databricks.labs.dqx.quality_checker.quality_checker_runner import QualityCheckerRunner from databricks.labs.dqx.telemetry import log_telemetry from databricks.labs.dqx.errors import InvalidConfigError +from databricks.labs.dqx.utils import safe_strip_file_from_path class WorkflowContext(GlobalContext): @@ -72,7 +73,8 @@ def run_config(self) -> RunConfig: run_config_name = self.run_config_name if not run_config_name: raise InvalidConfigError("Run config flag is required") - return self.config.get_run_config(run_config_name) + raw_run_config = self.config.get_run_config(run_config_name) + return self.prepare_run_config(raw_run_config) @cached_property def product_info(self) -> ProductInfo: @@ -118,14 +120,6 @@ def resolved_patterns(self) -> tuple[list[str], list[str]]: return patterns, exclude_patterns - @cached_property - def generic_checks_location(self) -> str: - """Build the checks location for pattern based execution making sure it is an absolute path in the workspace.""" - checks_location = self.run_config.checks_location - return ( - checks_location if is_table_location(checks_location) else f"{self.installation.install_folder()}/checks/" - ) - @cached_property def profiler(self) -> ProfilerRunner: """Returns the ProfilerRunner instance.""" @@ -152,3 +146,64 @@ def quality_checker(self) -> QualityCheckerRunner: ) log_telemetry(self.workspace_client, "workflow", "quality_checker") return QualityCheckerRunner(self.spark, dq_engine) + + def prepare_run_config(self, run_config: RunConfig) -> RunConfig: + """ + Apply common path prefixing to a run configuration in-place and return it. + Ensures custom check function paths and checks location are absolute in the Databricks Workspace. + + Args: + run_config: The run configuration to prepare. + + Returns: + The prepared run configuration. + """ + if not run_config.input_config: + raise InvalidConfigError("No input data source configured during installation") + + run_config.custom_check_functions = self._get_resolved_custom_check_function(run_config.custom_check_functions) + run_config.checks_location = self._get_resolved_checks_location(run_config.checks_location) + + return run_config + + def _get_resolved_checks_location(self, checks_location: str) -> str: + """ + Prefixes the checks location with the installation folder if it is not an absolute path. + + Args: + checks_location: The original checks location. + + Returns: + The resolved checks location. + """ + if is_table_location(checks_location): + return checks_location + + if self.patterns and self.run_config_name: # don't need file name for pattern based execution + checks_location = safe_strip_file_from_path(checks_location) + + if checks_location.startswith("/") or checks_location.startswith("/Volumes/"): + return checks_location + + return f"{self.installation.install_folder()}/{checks_location}" + + def _get_resolved_custom_check_function(self, custom_check_functions: dict[str, str]): + """ + Prefixes custom check function paths with the installation folder if they are not absolute paths. + + Args: + custom_check_functions: A mapping where each key is the name of a function (e.g., "my_func") + and each value is the file path to the Python module that defines it. The path can be absolute + or relative to the installation folder, and may refer to a local filesystem location, a + Databricks workspace path (e.g. /Workspace/my_repo/my_module.py), or a Unity Catalog volume + (e.g. /Volumes/catalog/schema/volume/my_module.py). + + Returns: + A dictionary with function names as keys and prefixed paths as values. + """ + if custom_check_functions: + return { + func_name: path if path.startswith("/") else f"/Workspace{self.installation.install_folder()}/{path}" + for func_name, path in custom_check_functions.items() + } + return custom_check_functions diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index 18012c0e9..b49eb2da6 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -39,7 +39,7 @@ from databricks.labs.dqx.telemetry import telemetry_logger, log_telemetry from databricks.sdk import WorkspaceClient from databricks.labs.dqx.errors import InvalidCheckError, InvalidConfigError, InvalidParameterError -from databricks.labs.dqx.utils import list_tables +from databricks.labs.dqx.utils import list_tables, safe_strip_file_from_path logger = logging.getLogger(__name__) @@ -682,7 +682,8 @@ def apply_checks_and_save_in_tables_for_patterns( run_config.checks_location = ( checks_location if is_table_location(checks_location) - else f"{checks_location}/{table}.yml" # for file based checks expecting a file per table + # for file based checks expecting a file per table + else f"{safe_strip_file_from_path(checks_location)}/{table}.yml" ) run_configs.append(run_config) @@ -860,6 +861,8 @@ def _apply_checks_for_run_config(self, run_config: RunConfig) -> None: if not run_config.output_config: raise InvalidConfigError("Output configuration not provided") + logger.info(f"Applying checks from: {run_config.checks_location}") + storage_handler, storage_config = self._checks_handler_factory.create_for_location( run_config.checks_location, run_config.name ) diff --git a/src/databricks/labs/dqx/profiler/profiler_runner.py b/src/databricks/labs/dqx/profiler/profiler_runner.py index 778b002dd..60258ed75 100644 --- a/src/databricks/labs/dqx/profiler/profiler_runner.py +++ b/src/databricks/labs/dqx/profiler/profiler_runner.py @@ -11,8 +11,6 @@ ProfilerConfig, BaseChecksStorageConfig, InstallationChecksStorageConfig, - TableChecksStorageConfig, - WorkspaceFileChecksStorageConfig, ) from databricks.labs.dqx.engine import DQEngine from databricks.labs.dqx.io import read_input_data @@ -90,6 +88,8 @@ def run_for_patterns( exclude_patterns: list[str], profiler_config: ProfilerConfig, checks_location: str, + install_folder: str, + product: str, max_parallelism: int, ) -> None: """ @@ -101,6 +101,8 @@ def run_for_patterns( profiler_config: Profiler configuration. checks_location: Delta table to save the generated checks, otherwise checks are saved under checks/{table_name}.yml. + install_folder: Installation folder path. + product: Product name for the installation. max_parallelism: Maximum number of parallel threads to use for profiling. """ options = [ @@ -124,14 +126,13 @@ def run_for_patterns( logger.info(f"Generated checks: \n{checks}") logger.info(f"Generated summary statistics: \n{summary_stats}") - storage_config: BaseChecksStorageConfig - if is_table_location(checks_location): - # for table based checks, use the provided table name - storage_config = TableChecksStorageConfig(location=checks_location, run_config_name=table) - else: - # for file based checks expecting a file per table - storage_config = WorkspaceFileChecksStorageConfig(location=f"{checks_location}/{table}.yml") - + storage_config = InstallationChecksStorageConfig( + location=checks_location if is_table_location(checks_location) else f"{checks_location}/{table}.yml", + overwrite_location=True, + product_name=product, + install_folder=install_folder, + run_config_name=table, + ) self.save(checks, summary_stats, storage_config, profiler_config.summary_stats_file) def save( diff --git a/src/databricks/labs/dqx/profiler/profiler_workflow.py b/src/databricks/labs/dqx/profiler/profiler_workflow.py index 08290d3bf..02b62cd82 100644 --- a/src/databricks/labs/dqx/profiler/profiler_workflow.py +++ b/src/databricks/labs/dqx/profiler/profiler_workflow.py @@ -4,7 +4,6 @@ from databricks.labs.dqx.config import RunConfig from databricks.labs.dqx.contexts.workflow_context import WorkflowContext from databricks.labs.dqx.installer.workflow_task import Workflow, workflow_task -from databricks.labs.dqx.errors import InvalidConfigError logger = logging.getLogger(__name__) @@ -36,11 +35,15 @@ def profile(self, ctx: WorkflowContext): if ctx.patterns and ctx.run_config_name: logger.info(f"Running profiler workflow for patterns: {ctx.patterns}") patterns, exclude_patterns = ctx.resolved_patterns + run_config = ctx.run_config + ctx.profiler.run_for_patterns( patterns=patterns, exclude_patterns=exclude_patterns, - profiler_config=ctx.run_config.profiler_config, - checks_location=ctx.generic_checks_location, + profiler_config=run_config.profiler_config, + checks_location=run_config.checks_location, + product=ctx.installation.product(), + install_folder=ctx.installation.install_folder(), max_parallelism=ctx.config.profiler_max_parallelism, ) elif ctx.run_config_name: @@ -53,7 +56,8 @@ def _profile_for_run_configs(self, ctx: WorkflowContext, run_configs: list[RunCo logger.info(f"Profiling {len(run_configs)} tables with parallelism {max_parallelism}") with futures.ThreadPoolExecutor(max_workers=max_parallelism) as executor: apply_checks_runs = [ - executor.submit(self._profile_for_run_config, ctx, run_config) for run_config in run_configs + executor.submit(self._profile_for_run_config, ctx, ctx.prepare_run_config(run_config)) + for run_config in run_configs ] for future in futures.as_completed(apply_checks_runs): # Retrieve the result to propagate any exceptions @@ -63,9 +67,6 @@ def _profile_for_run_configs(self, ctx: WorkflowContext, run_configs: list[RunCo def _profile_for_run_config(ctx, run_config): logger.info(f"Running profiler workflow for run config: {ctx.run_config_name}") - if not run_config.input_config: - raise InvalidConfigError("No input data source configured during installation") - ctx.profiler.run( run_config_name=run_config.name, input_config=run_config.input_config, diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py b/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py index e6482f156..632dca77c 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py @@ -50,7 +50,7 @@ def run_for_patterns( quarantine_table_suffix: Suffix to append to the quarantine table names. max_parallelism: Maximum number of parallel runs. Defaults to the number of CPU cores. """ - logger.info(f"Data quality checker started for patterns {patterns}.") + logger.info(f"Data quality checker started for patterns {patterns} and checks {checks_location}") self.dq_engine.apply_checks_and_save_in_tables_for_patterns( patterns=patterns, exclude_patterns=exclude_patterns, @@ -60,4 +60,4 @@ def run_for_patterns( output_table_suffix=output_table_suffix, quarantine_table_suffix=quarantine_table_suffix, ) - logger.info(f"Data quality checker started {patterns}.") + logger.info(f"Data quality checker started {patterns} and checks {checks_location}") diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py index f7b32490b..cabc8b4e2 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py @@ -1,10 +1,7 @@ import logging -from databricks.labs.dqx.checks_storage import is_table_location -from databricks.labs.dqx.config import RunConfig from databricks.labs.dqx.contexts.workflow_context import WorkflowContext from databricks.labs.dqx.installer.workflow_task import Workflow, workflow_task -from databricks.labs.dqx.errors import InvalidConfigError logger = logging.getLogger(__name__) @@ -32,88 +29,21 @@ def apply_checks(self, ctx: WorkflowContext): """ if ctx.patterns and ctx.run_config_name: logger.info(f"Running data quality workflow for patterns: {ctx.patterns}") - run_config = self._prepare_run_config(ctx.installation.install_folder(), ctx.run_config) + run_config = ctx.run_config patterns, exclude_patterns = ctx.resolved_patterns ctx.quality_checker.run_for_patterns( patterns=patterns, exclude_patterns=exclude_patterns, run_config_template=run_config, - checks_location=ctx.generic_checks_location, + checks_location=run_config.checks_location, output_table_suffix=ctx.output_table_suffix, quarantine_table_suffix=ctx.quarantine_table_suffix, max_parallelism=ctx.config.quality_checker_max_parallelism, ) elif ctx.run_config_name: logger.info(f"Running data quality workflow for run config: {ctx.run_config_name}") - run_config = self._prepare_run_config(ctx.installation.install_folder(), ctx.run_config) - ctx.quality_checker.run([run_config]) + ctx.quality_checker.run([ctx.run_config]) else: logger.info("Running data quality workflow for all run configs") - run_configs = [ - self._prepare_run_config(ctx.installation.install_folder(), run_config) - for run_config in ctx.config.run_configs - ] + run_configs = [ctx.prepare_run_config(run_config) for run_config in ctx.config.run_configs] ctx.quality_checker.run(run_configs, ctx.config.quality_checker_max_parallelism) - - def _prepare_run_config(self, install_folder: str, run_config: RunConfig) -> RunConfig: - """ - Apply common path prefixing to a run configuration in-place and return it. - - Ensures custom check function paths and checks location are absolute in the Databricks Workspace. - - Args: - install_folder: The installation folder path (e.g., "/Users/user@email.com/dqx"). - run_config: The run configuration to prepare. - - Returns: - The prepared run configuration with absolute paths. - """ - if not run_config.input_config: - raise InvalidConfigError("No input data source configured during installation") - - run_config.custom_check_functions = self._prefix_custom_check_paths( - install_folder, run_config.custom_check_functions - ) - run_config.checks_location = self._prefix_checks_location(install_folder, run_config.checks_location) - return run_config - - @staticmethod - def _prefix_checks_location(install_folder: str, checks_location: str) -> str: - """ - Prefixes the checks location with the installation folder if it is not an absolute path or a table location. - - Args: - install_folder: Installation folder path (e.g., "/Users/user@email.com/dqx"). - checks_location: Checks location path from the run configuration. - - Returns: - - """ - if is_table_location(checks_location): - return checks_location - if checks_location.startswith("/"): - return checks_location - return f"{install_folder}/{checks_location}" - - @staticmethod - def _prefix_custom_check_paths(install_folder: str, custom_check_functions: dict[str, str]) -> dict[str, str]: - """ - Prefixes custom check function paths with the installation folder if they are not absolute paths. - - Args: - install_folder: The installation folder path (e.g., "/Applications/dqx"). - custom_check_functions: A mapping where each key is the name of a function (e.g., "my_func") - and each value is the file path to the Python module that defines it. The path can be absolute - or relative to the installation folder, and may refer to a local filesystem location, a - Databricks workspace path (e.g. /Workspace/my_repo/my_module.py), or a Unity Catalog volume - (e.g. /Volumes/catalog/schema/volume/my_module.py). - - Returns: - A dictionary with function names as keys and prefixed paths as values. - """ - if custom_check_functions: - return { - func_name: path if path.startswith("/") else f"/Workspace{install_folder}/{path}" - for func_name, path in custom_check_functions.items() - } - return custom_check_functions diff --git a/src/databricks/labs/dqx/utils.py b/src/databricks/labs/dqx/utils.py index e96c6fe65..62dcba6ab 100644 --- a/src/databricks/labs/dqx/utils.py +++ b/src/databricks/labs/dqx/utils.py @@ -1,3 +1,4 @@ +import os import json import datetime import logging @@ -213,6 +214,38 @@ def safe_json_load(value: str): return value +def safe_strip_file_from_path(path: str) -> str: + """ + Safely removes the file name from a given path, treating it as a directory if no file extension is present. + - Hidden directories (e.g., .folder) are preserved. + - Hidden files with extensions (e.g., .file.yml) are treated as files. + + Args: + path: The input path from which to remove the file name. + + Returns: + The path without the file name, or the original path if it is already a directory. + """ + if not path: + return "" + + # Remove trailing slash + path = path.rstrip("/") + + head, tail = os.path.split(path) + + if not tail: + return path # it's already a directory + + # If it looks like a file: + # - contains a dot and (doesn't start with '.' OR has another dot after the first char) + if "." in tail and (not tail.startswith(".") or tail.count(".") > 1): + return head + + # Otherwise, treat as directory + return path + + @rate_limited(max_requests=100) def list_tables( workspace_client: WorkspaceClient, diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 9977e3e34..74175285d 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -160,7 +160,6 @@ def _setup_workflows_deps( location=output_table, trigger={"availableNow": True} if is_streaming else {}, options=({"checkpointLocation": f"/tmp/dqx_tests/{make_random(10)}_out_ckpt"} if is_streaming else {}), - mode="overwrite", ) if checks_location: @@ -172,7 +171,6 @@ def _setup_workflows_deps( location=quarantine_table, trigger={"availableNow": True} if is_streaming else {}, options=({"checkpointLocation": f"/tmp/dqx_tests/{make_random(10)}_qr_ckpt"} if is_streaming else {}), - mode="overwrite", ) ctx.installation.save(ctx.config) diff --git a/tests/integration/test_apply_checks_and_save_in_table.py b/tests/integration/test_apply_checks_and_save_in_table.py index d0c03a058..c9168f4bd 100644 --- a/tests/integration/test_apply_checks_and_save_in_table.py +++ b/tests/integration/test_apply_checks_and_save_in_table.py @@ -1721,7 +1721,7 @@ def test_apply_checks_and_save_in_tables_for_patterns_with_exclude_patterns( engine.apply_checks_and_save_in_tables_for_patterns( patterns=[f"{catalog_name}.{schema.name}.*"], exclude_patterns=[f"*{output_table_suffix}", f"*{quarantine_table_suffix}"], - checks_location=workspace_folder, + checks_location=workspace_folder + "/checks.yml", # should strip the file name automatically, max_parallelism=2, run_config_template=RunConfig(quarantine_config=OutputConfig(location="")), output_table_suffix=output_table_suffix, diff --git a/tests/integration/test_e2e_workflow.py b/tests/integration/test_e2e_workflow.py index cbba0521f..7b6785bbd 100644 --- a/tests/integration/test_e2e_workflow.py +++ b/tests/integration/test_e2e_workflow.py @@ -141,14 +141,14 @@ def test_e2e_workflow_for_patterns( # assert checks for first table storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml", + location=f"{installation_ctx.installation.install_folder()}/{first_table}.yml", ) checks = dq_engine.load_checks(config=storage_config) assert checks, f"Checks for {first_table} were not generated" # assert checks for second table storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{second_table}.yml", + location=f"{installation_ctx.installation.install_folder()}/{second_table}.yml", ) checks = dq_engine.load_checks(config=storage_config) assert checks, f"Checks for {second_table} were not generated" @@ -186,13 +186,13 @@ def test_e2e_workflow_for_patterns_exclude_patterns( dq_engine = DQEngine(ws, spark) storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml", + location=f"{installation_ctx.installation.install_folder()}/{first_table}.yml", ) checks = dq_engine.load_checks(config=storage_config) assert checks, f"Checks for {first_table} were not generated" storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{exclude_table}.yml", + location=f"{installation_ctx.installation.install_folder()}/{exclude_table}.yml", ) with pytest.raises(NotFound): engine = DQEngine(ws, spark) @@ -240,20 +240,20 @@ def test_e2e_workflow_for_patterns_exclude_output( dq_engine = DQEngine(ws, spark) storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml", + location=f"{installation_ctx.installation.install_folder()}/{first_table}.yml", ) checks = dq_engine.load_checks(config=storage_config) assert checks, f"Checks for {first_table} were not generated" storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{existing_output_table}.yml", + location=f"{installation_ctx.installation.install_folder()}/{existing_output_table}.yml", ) with pytest.raises(NotFound): engine = DQEngine(ws, spark) engine.load_checks(config=storage_config) storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{existing_quarantine_table}.yml", + location=f"{installation_ctx.installation.install_folder()}/{existing_quarantine_table}.yml", ) with pytest.raises(NotFound): engine = DQEngine(ws, spark) diff --git a/tests/integration/test_load_checks_from_workspace_file.py b/tests/integration/test_load_checks_from_workspace_file.py index 753ed0c43..47594a10f 100644 --- a/tests/integration/test_load_checks_from_workspace_file.py +++ b/tests/integration/test_load_checks_from_workspace_file.py @@ -131,6 +131,23 @@ def test_load_checks_from_absolute_path(ws, installation_ctx, make_check_file_as assert checks == expected_checks, "Checks were not loaded correctly" +def test_load_checks_from_installation_overwrite_location( + ws, installation_ctx, make_check_file_as_yaml, expected_checks, spark +): + checks_location = make_check_file_as_yaml() + + config = InstallationChecksStorageConfig( + location=checks_location, + overwrite_location=True, # use the provided location instead of the one from the installation run config + run_config_name="default", + assume_user=True, + product_name=installation_ctx.installation.product(), + ) + checks = DQEngine(ws, spark).load_checks(config=config) + + assert checks == expected_checks, "Checks were not loaded correctly" + + def test_load_invalid_checks_from_user_installation( ws, installation_ctx, make_invalid_check_file_as_yaml, expected_checks, spark ): diff --git a/tests/integration/test_profiler_workflow.py b/tests/integration/test_profiler_workflow.py index 879743769..d1d769e5f 100644 --- a/tests/integration/test_profiler_workflow.py +++ b/tests/integration/test_profiler_workflow.py @@ -129,13 +129,11 @@ def test_profiler_workflow_for_multiple_run_configs(ws, spark, setup_workflows): dq_engine = DQEngine(ws, spark) # assert first run config results - storage_config = InstallationChecksStorageConfig( - run_config_name=run_config.name, - assume_user=True, - product_name=installation_ctx.installation.product(), + workspace_file_storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/{run_config.checks_location}", ) - checks = dq_engine.load_checks(config=storage_config) + checks = dq_engine.load_checks(config=workspace_file_storage_config) assert checks, f"Checks from the {run_config.name} run config were not loaded correctly" install_folder = installation_ctx.installation.install_folder() @@ -143,13 +141,11 @@ def test_profiler_workflow_for_multiple_run_configs(ws, spark, setup_workflows): assert status, f"Profile summary stats file {run_config.profiler_config.summary_stats_file} does not exist." # assert second run config results - storage_config = InstallationChecksStorageConfig( - run_config_name=second_run_config.name, - assume_user=True, - product_name=installation_ctx.installation.product(), + workspace_file_storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/{second_run_config.checks_location}", ) - checks = dq_engine.load_checks(config=storage_config) + checks = dq_engine.load_checks(config=workspace_file_storage_config) assert checks, f"Checks from the {second_run_config.name} run config were not loaded correctly" install_folder = installation_ctx.installation.install_folder() @@ -173,14 +169,14 @@ def test_profiler_workflow_for_patterns(ws, spark, setup_workflows, make_table, # assert checks for first table workspace_file_storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml", + location=f"{installation_ctx.installation.install_folder()}/{first_table}.yml", ) checks = dq_engine.load_checks(config=workspace_file_storage_config) assert checks, f"Checks for {first_table} were not generated" # assert checks for second table workspace_file_storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{second_table}.yml", + location=f"{installation_ctx.installation.install_folder()}/{second_table}.yml", ) checks = dq_engine.load_checks(config=workspace_file_storage_config) assert checks, f"Checks for {second_table} were not generated" @@ -204,13 +200,13 @@ def test_profiler_workflow_for_patterns_with_exclude_patterns(ws, spark, setup_w dq_engine = DQEngine(ws, spark) workspace_file_storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml", + location=f"{installation_ctx.installation.install_folder()}/{first_table}.yml", ) checks = dq_engine.load_checks(config=workspace_file_storage_config) assert checks, f"Checks for {first_table} were not generated" workspace_file_storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{exclude_table}.yml", + location=f"{installation_ctx.installation.install_folder()}/{exclude_table}.yml", ) with pytest.raises(NotFound): engine = DQEngine(ws, spark) @@ -223,6 +219,12 @@ def test_profiler_workflow_for_patterns_exclude_output(ws, spark, setup_workflow first_table = run_config.input_config.location catalog_name, schema_name, _ = first_table.split('.') + # update run config to test using custom path + config = installation_ctx.config + run_config = config.get_run_config() + run_config.checks_location = f"{installation_ctx.installation.install_folder()}/checks/checks.yml" + installation_ctx.installation.save(config) + output_table_suffix = "_output" quarantine_table_suffix = "_quarantine" @@ -251,14 +253,14 @@ def test_profiler_workflow_for_patterns_exclude_output(ws, spark, setup_workflow assert checks, f"Checks for {first_table} were not generated" workspace_file_storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{exclude_output_table}.yml", + location=f"{installation_ctx.installation.install_folder()}/{exclude_output_table}.yml", ) with pytest.raises(NotFound): engine = DQEngine(ws, spark) engine.load_checks(config=workspace_file_storage_config) workspace_file_storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{exclude_quarantine_table}.yml", + location=f"{installation_ctx.installation.install_folder()}/{exclude_quarantine_table}.yml", ) with pytest.raises(NotFound): engine = DQEngine(ws, spark) diff --git a/tests/integration/test_quality_checker_workflow.py b/tests/integration/test_quality_checker_workflow.py index 76c6a32be..47e1063a3 100644 --- a/tests/integration/test_quality_checker_workflow.py +++ b/tests/integration/test_quality_checker_workflow.py @@ -81,6 +81,9 @@ def test_quality_checker_workflow_for_multiple_run_configs_table_checks_storage( dq_engine.save_checks( config=TableChecksStorageConfig(location=checks_table, run_config_name=run_config.name), checks=checks ) + dq_engine.save_checks( + config=TableChecksStorageConfig(location=checks_table, run_config_name=second_run_config.name), checks=checks + ) ws.workspace.delete(f"{installation_ctx.installation.install_folder()}/checks.yml") # run workflow @@ -340,13 +343,13 @@ def test_quality_checker_workflow_for_patterns( dq_engine.save_checks( checks=checks, config=WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml" + location=f"{installation_ctx.installation.install_folder()}/{first_table}.yml" ), ) dq_engine.save_checks( checks=checks, config=WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{second_table}.yml" + location=f"{installation_ctx.installation.install_folder()}/{second_table}.yml" ), ) ws.workspace.delete(f"{installation_ctx.installation.install_folder()}/checks.yml") @@ -381,7 +384,7 @@ def test_quality_checker_workflow_for_patterns_exclude_patterns( dq_engine.save_checks( checks=checks, config=WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/checks/{first_table}.yml" + location=f"{installation_ctx.installation.install_folder()}/{first_table}.yml" ), ) ws.workspace.delete(f"{installation_ctx.installation.install_folder()}/checks.yml") @@ -407,6 +410,15 @@ def test_quality_checker_workflow_for_patterns_exclude_output( ): installation_ctx, run_config = setup_workflows(quarantine=True, checks=True) + # update run config to overwrite output and quarantine tables + config = installation_ctx.config + run_config = config.get_run_config() + run_config.output_config.mode = "overwrite" + run_config.quarantine_config.mode = "overwrite" + # test processing using absolute path + run_config.checks_location = f"{installation_ctx.installation.install_folder()}/checks/checks.yml" + installation_ctx.installation.save(config) + first_table = run_config.input_config.location catalog_name, schema_name, _ = first_table.split('.') diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index ee1e34fb2..1350ef39d 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -14,6 +14,7 @@ get_columns_as_strings, is_simple_column_expression, normalize_bound_args, + safe_strip_file_from_path, ) from databricks.labs.dqx.errors import InvalidParameterError, InvalidConfigError from databricks.labs.dqx.config import InputConfig @@ -337,3 +338,27 @@ def test_normalize_bound_args_unsupported_type(): def test_get_reference_dataframes_with_missing_ref_tables() -> None: assert get_reference_dataframes(Mock(), reference_tables={}) is None assert get_reference_dataframes(Mock(), reference_tables=None) is None + + +@pytest.mark.parametrize( + "path, expected", + [ + ("/path/to/file.txt", "/path/to"), # File with extension + ("/path/to/dir", "/path/to/dir"), # Directory path + ("folder", "folder"), # Single folder + ("folder/", "folder"), # Folder with trailing slash + ("folder/dir/", "folder/dir"), # Nested folder with trailing slash + ("folder/dir", "folder/dir"), # Nested folder + ("", ""), # Empty path + ("file.txt", ""), # File in current dir + ("/file.with.dots.ext", "/"), # File in root + ("folder/file.with.dots.ext", "folder"), # File inside folder + ("folder/.hiddenfile.yml", "folder"), # Hidden file in folder + ( + "/Users/marcin.wojtyczka@databricks.com/.corespondency-predeterminer/", + "/Users/marcin.wojtyczka@databricks.com/.corespondency-predeterminer", + ), + ], +) +def test_safe_strip_file_from_path(path: str, expected: str): + assert safe_strip_file_from_path(path) == expected From 0ad7e08984230717d0464902b10a0053728fbf04 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Thu, 2 Oct 2025 20:17:46 +0200 Subject: [PATCH 52/64] docs update --- docs/dqx/docs/guide/data_profiling.mdx | 2 +- tests/conftest.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index c20832c51..d22dd0da6 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -259,7 +259,7 @@ When running the profiler workflow using Databricks API or UI, you have the same - `patterns`: Accepts a semicolon-delimited list of patterns, e.g., "catalog.schema1.*;catalog.schema2.table1". - `run_config_name`: Specifies the run config to use as a template for all relevant settings, except location field ('input_config.location') which is derived from the patterns. - The output and quarantine table names are derived by appending the value of `output_table_suffix` and `quarantine_table_suffix` job parameters, respectively, to the input table name. - - If the `checks_location` in the run config points to a table, the checks will be directly loaded from that table. + - If the `checks_location` in the run config points to a table, the checks will be saved to that table. If the `checks_location` in the run config points to a file, file name is replaced with "<input_table>.yml". In addition, if the location is specified as a relative path, it is prefixed with the workspace installation folder. For example: - If "checks_location=catalog.schema.table", the location will be resolved to "catalog.schema.table". diff --git a/tests/conftest.py b/tests/conftest.py index 8fe3f8e69..6d990e1b0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -22,7 +22,7 @@ @pytest.fixture def debug_env_name(): - return "ws" # Specify the name of the debug environment from ~/.databricks/debug-env.json + return "ws2" # Specify the name of the debug environment from ~/.databricks/debug-env.json @pytest.fixture From 66f6c24466784df43c458affee2cd6e9c8c7aa9a Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Thu, 2 Oct 2025 20:18:15 +0200 Subject: [PATCH 53/64] docs update --- tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 6d990e1b0..8fe3f8e69 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -22,7 +22,7 @@ @pytest.fixture def debug_env_name(): - return "ws2" # Specify the name of the debug environment from ~/.databricks/debug-env.json + return "ws" # Specify the name of the debug environment from ~/.databricks/debug-env.json @pytest.fixture From 18870d7fe36b0d261b66c76a30865b3df1930c4e Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Thu, 2 Oct 2025 20:26:22 +0200 Subject: [PATCH 54/64] code review feedback implementation --- src/databricks/labs/dqx/profiler/profiler_workflow.py | 4 ++-- .../labs/dqx/quality_checker/quality_checker_runner.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/databricks/labs/dqx/profiler/profiler_workflow.py b/src/databricks/labs/dqx/profiler/profiler_workflow.py index 02b62cd82..645ad8445 100644 --- a/src/databricks/labs/dqx/profiler/profiler_workflow.py +++ b/src/databricks/labs/dqx/profiler/profiler_workflow.py @@ -17,7 +17,7 @@ def profile(self, ctx: WorkflowContext): """ Profile input data and save the generated checks and profile summary stats. - Logic:led, the provided run config name + Logic: Profile based on the provided run config name and location patterns as follows: * If location patterns are provided, only tables matching the patterns will be profiled, and the provided run config name will be used as a template for all fields except location. Additionally, exclude patterns can be specified to skip profiling specific tables. @@ -65,7 +65,7 @@ def _profile_for_run_configs(self, ctx: WorkflowContext, run_configs: list[RunCo @staticmethod def _profile_for_run_config(ctx, run_config): - logger.info(f"Running profiler workflow for run config: {ctx.run_config_name}") + logger.info(f"Running profiler workflow for run config: {run_config.name}") ctx.profiler.run( run_config_name=run_config.name, diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py b/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py index 632dca77c..fc85e89c1 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_runner.py @@ -60,4 +60,4 @@ def run_for_patterns( output_table_suffix=output_table_suffix, quarantine_table_suffix=quarantine_table_suffix, ) - logger.info(f"Data quality checker started {patterns} and checks {checks_location}") + logger.info(f"Data quality checker completed for {patterns} and checks {checks_location}") From 74d6c0d5e88f8acce0195bd1e6909251574e0cfa Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Thu, 2 Oct 2025 22:01:01 +0200 Subject: [PATCH 55/64] fixed tests --- labs.yml | 12 ++++++------ src/databricks/labs/dqx/contexts/workflow_context.py | 2 +- src/databricks/labs/dqx/engine.py | 4 ++-- tests/integration/test_runtime_context.py | 11 +++++++++-- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/labs.yml b/labs.yml index 0d93f6188..857e0c159 100644 --- a/labs.yml +++ b/labs.yml @@ -37,9 +37,9 @@ commands: - name: run-config description: (Optional) Selects run configuration from installation config. If not provided, run it for all run configurations. - name: patterns - description: (Optional) Comma separated list of location patterns to profile. If provided, location fields in the run config are ignored. Requires a run config to be provided which is used as a template for other fields. + description: (Optional) Semicolon separated list of location patterns to profile. If provided, location fields in the run config are ignored. Requires a run config to be provided which is used as a template for other fields. - name: exclude-patterns - description: (Optional) Comma separated list of location patterns to exclude from profiling. Useful if wanting to exclude existing output tables. + description: (Optional) Semicolon separated list of location patterns to exclude from profiling. Useful if wanting to exclude existing output tables. - name: timeout-minutes description: The timeout in minutes for the cli to wait for the workflow to complete. - name: apply-checks @@ -48,9 +48,9 @@ commands: - name: run-config description: (Optional) Selects run configuration from installation config. If not provided, run it for all run configurations. - name: patterns - description: (Optional) Comma separated list of location patterns to use. If provided, location fields in the run config are ignored. Requires a run config to be provided which is used as a template for other fields. + description: (Optional) Semicolon separated list of location patterns to use. If provided, location fields in the run config are ignored. Requires a run config to be provided which is used as a template for other fields. - name: exclude-patterns - description: (Optional) Comma separated list of location patterns to exclude from profiling. Useful if wanting to exclude existing output tables. + description: (Optional) Semicolon separated list of location patterns to exclude from profiling. Useful if wanting to exclude existing output tables. - name: output-table-suffix description: (Optional) Suffix to append to the output table name. default: "_dq_output" @@ -65,9 +65,9 @@ commands: - name: run-config description: (Optional) Selects run configuration from installation config. If not provided, run it for all run configurations. - name: patterns - description: (Optional) Comma separated list of location patterns to use. If provided, location fields in the run config are ignored. Requires a run config to be provided which is used as a template for other fields. + description: (Optional) Semicolon separated list of location patterns to use. If provided, location fields in the run config are ignored. Requires a run config to be provided which is used as a template for other fields. - name: exclude-patterns - description: (Optional) Comma separated list of location patterns to exclude from profiling. Useful if wanting to exclude existing output tables. + description: (Optional) Semicolon separated list of location patterns to exclude from profiling. Useful if wanting to exclude existing output tables. - name: output-table-suffix description: (Optional) Suffix to append to the output table name. default: "_dq_output" diff --git a/src/databricks/labs/dqx/contexts/workflow_context.py b/src/databricks/labs/dqx/contexts/workflow_context.py index 485052ad4..d37e7f7b5 100644 --- a/src/databricks/labs/dqx/contexts/workflow_context.py +++ b/src/databricks/labs/dqx/contexts/workflow_context.py @@ -116,7 +116,7 @@ def resolved_patterns(self) -> tuple[list[str], list[str]]: exclude_patterns.append(pattern + self.quarantine_table_suffix) if self.exclude_patterns: - exclude_patterns = [pattern.strip() for pattern in self.exclude_patterns.split(';')] + exclude_patterns.extend([pattern.strip() for pattern in self.exclude_patterns.split(';')]) return patterns, exclude_patterns diff --git a/src/databricks/labs/dqx/engine.py b/src/databricks/labs/dqx/engine.py index b49eb2da6..dba799a0f 100644 --- a/src/databricks/labs/dqx/engine.py +++ b/src/databricks/labs/dqx/engine.py @@ -669,8 +669,8 @@ def apply_checks_and_save_in_tables_for_patterns( for table in tables: run_config = copy.deepcopy(run_config_template) - assert run_config.input_config - assert run_config.output_config + assert run_config.input_config # to satisfy linter + assert run_config.output_config # to satisfy linter run_config.name = table run_config.input_config.location = table diff --git a/tests/integration/test_runtime_context.py b/tests/integration/test_runtime_context.py index 2d752f726..3cc610a26 100644 --- a/tests/integration/test_runtime_context.py +++ b/tests/integration/test_runtime_context.py @@ -12,7 +12,7 @@ def save_local(ws, make_random): temp_files = [] def _save_local(config_path): - temp_file = f"{make_random}.yml" + temp_file = f"{make_random(10)}.yml" export = ws.workspace.export(config_path) content = base64.b64decode(export.content).decode('utf-8') yaml_content = yaml.safe_load(content) @@ -33,15 +33,22 @@ def test_runtime_config(ws, installation_ctx, save_local): run_config = installation_ctx.config.get_run_config() install_config_path = f"{installation_ctx.installation.install_folder()}/{WorkspaceConfig.__file__}" + # need to bring the config locally since the context is expected to run in the workspace with local access local_config_path = save_local(install_config_path) runtime_context = WorkflowContext( - named_parameters={"config": local_config_path, "run_config_name": run_config.name} + named_parameters={ + "config": local_config_path, + "run_config_name": run_config.name, + } ) actual_config = runtime_context.config actual_run_config = runtime_context.run_config + # the actual context prefix relative path with installation folder + actual_run_config.checks_location = os.path.basename(actual_run_config.checks_location) + assert actual_config assert actual_config.get_run_config() == run_config assert actual_run_config From 36a36a9be86377f65fab66a436bcd39a910c027c Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Thu, 2 Oct 2025 22:11:27 +0200 Subject: [PATCH 56/64] fixed tests --- tests/integration/test_profiler.py | 7 ------- tests/integration/test_profiler_runner.py | 23 ----------------------- 2 files changed, 30 deletions(-) diff --git a/tests/integration/test_profiler.py b/tests/integration/test_profiler.py index 2cf67c059..cf1c7741d 100644 --- a/tests/integration/test_profiler.py +++ b/tests/integration/test_profiler.py @@ -1337,13 +1337,6 @@ def test_profile_tables_for_patterns_with_selected_columns(spark, ws, make_schem assert rules == expected_rules[table_name], f"Rules did not match expected for {table_name}" -def test_profile_tables_no_tables_or_patterns(ws): - profiler = DQProfiler(ws) - - with pytest.raises(MissingParameterError, match="Either 'tables' or 'patterns' must be provided"): - profiler.profile_tables() - - def test_profile_with_dataset_filter(spark, ws): schema = T.StructType( [ diff --git a/tests/integration/test_profiler_runner.py b/tests/integration/test_profiler_runner.py index 49d49db22..10f2d05b4 100644 --- a/tests/integration/test_profiler_runner.py +++ b/tests/integration/test_profiler_runner.py @@ -53,29 +53,6 @@ def test_profiler_runner_raise_error_when_profile_summary_stats_file_missing(ws, ), f"Profile summary stats not uploaded to {install_folder}/{profile_summary_stats_file}." -def test_profiler_runner(ws, spark, installation_ctx, make_schema, make_table): - profiler = DQProfiler(ws) - generator = DQGenerator(ws) - dq_engine = DQEngine(ws, spark) - runner = ProfilerRunner(ws, spark, dq_engine, installation_ctx.installation, profiler, generator) - - # prepare test data - catalog_name = "main" - schema = make_schema(catalog_name=catalog_name) - table = make_table( - catalog_name=catalog_name, - schema_name=schema.name, - ctas="SELECT * FROM VALUES (0, 'a'),(1, 'a'), (2, 'b'), (3, NULL) AS data(id, name)", - ) - input_config = InputConfig(location=table.full_name) - profiler_config = ProfilerConfig(sample_fraction=1.0, filter="id > 0") - - checks, summary_stats = runner.run(input_config=input_config, profiler_config=profiler_config) - - assert checks, "Checks were not generated correctly" - assert summary_stats, "Profile summary stats were not generated correctly" - - def test_profiler_workflow_class(ws, spark, setup_workflows): installation_ctx, run_config = setup_workflows() From 139f132a93b0a8a43a011213887077650c85b919 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Thu, 2 Oct 2025 22:25:22 +0200 Subject: [PATCH 57/64] added integration test --- .../labs/dqx/profiler/profiler_runner.py | 2 ++ tests/integration/test_profiler_workflow.py | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/databricks/labs/dqx/profiler/profiler_runner.py b/src/databricks/labs/dqx/profiler/profiler_runner.py index 4919d351e..dd04c7177 100644 --- a/src/databricks/labs/dqx/profiler/profiler_runner.py +++ b/src/databricks/labs/dqx/profiler/profiler_runner.py @@ -72,6 +72,7 @@ def run( }, ) checks = self.generator.generate_dq_rules(profiles) # use default criticality level "error" + logger.info(f"Using options: \n{profiler_config}") logger.info(f"Generated checks: \n{checks}") logger.info(f"Generated summary statistics: \n{summary_stats}") @@ -116,6 +117,7 @@ def run_for_patterns( }, } ] + logger.info(f"Using options: \n{options}") # Include tables matching the patterns, but skip existing output and quarantine tables. results = self.profiler.profile_tables_for_patterns( diff --git a/tests/integration/test_profiler_workflow.py b/tests/integration/test_profiler_workflow.py index d1d769e5f..618218db9 100644 --- a/tests/integration/test_profiler_workflow.py +++ b/tests/integration/test_profiler_workflow.py @@ -267,6 +267,28 @@ def test_profiler_workflow_for_patterns_exclude_output(ws, spark, setup_workflow engine.load_checks(config=workspace_file_storage_config) +def test_profiler_workflow_filter_out_all_data(ws, spark, setup_workflows, make_table, make_random): + installation_ctx, run_config = setup_workflows() + + config = installation_ctx.config + run_config = config.get_run_config() + run_config.profiler_config.filter = "id = 0" # filter that removes all data + installation_ctx.installation.save(config) + + # run profiler for all tables in the schema + installation_ctx.deployed_workflows.run_workflow( + workflow="profiler", + run_config_name=run_config.name, + ) + + workspace_file_storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/{run_config.checks_location}", + ) + engine = DQEngine(ws, spark) + checks = engine.load_checks(config=workspace_file_storage_config) + assert checks == [], "Checks should be empty when profiling an empty input dataset" + + def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_workflows, make_table, make_random): installation_ctx, run_config = setup_workflows() From b743c89d64ea93864ed72d7086eab0a4afab97a1 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 3 Oct 2025 10:14:10 +0200 Subject: [PATCH 58/64] make tests deterministic --- pyproject.toml | 2 +- tests/integration/conftest.py | 4 ++ .../test_load_checks_from_uc_volume.py | 54 +++++++++++-------- .../test_load_checks_from_workspace_file.py | 13 +++-- .../test_save_checks_to_workspace_file.py | 13 +++-- 5 files changed, 53 insertions(+), 33 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6e9468a59..894bfc18d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -106,7 +106,7 @@ path = ".venv" [tool.hatch.envs.default.scripts] test = "pytest tests/unit/ -n 10 --cov --cov-report=xml:coverage-unit.xml --timeout 30 --durations 20" coverage = "pytest tests/ -n 10 --cov --cov-report=html --timeout 600 --durations 20" -integration = "pytest tests/integration/ -n 10 --cov --cov-report=xml --timeout 600 --durations 20" +integration = "pytest tests/integration/ -n 10 --cov --cov-report=xml --timeout 1200 --durations 20" e2e = "pytest tests/e2e/ -n 10 --cov --cov-report=xml --timeout 600 --durations 20" perf = "pytest tests/perf/ -n 10 --cov --cov-report=xml --timeout 600 --durations 20" fmt = ["black .", diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 74175285d..86dfcb1e1 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -173,6 +173,10 @@ def _setup_workflows_deps( options=({"checkpointLocation": f"/tmp/dqx_tests/{make_random(10)}_qr_ckpt"} if is_streaming else {}), ) + # ensure tests are deterministic + run_config.profiler_config.sample_fraction = 1.0 + run_config.profiler_config.sample_seed = 100 + ctx.installation.save(ctx.config) return run_config diff --git a/tests/integration/test_load_checks_from_uc_volume.py b/tests/integration/test_load_checks_from_uc_volume.py index 123da41bd..f85d4a534 100644 --- a/tests/integration/test_load_checks_from_uc_volume.py +++ b/tests/integration/test_load_checks_from_uc_volume.py @@ -71,13 +71,13 @@ def test_load_checks_when_checks_volume_does_not_exist(ws, make_schema, make_vol DQEngine(ws, spark).load_checks(config=config) -def test_save_and_load_checks_from_volume(ws, make_schema, make_volume): +def test_save_and_load_checks_from_volume(ws, spark, make_schema, make_volume): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name volume_name = make_volume(catalog_name=catalog_name, schema_name=schema_name).name volume = f"/Volumes/{catalog_name}/{schema_name}/{volume_name}/checks.yml" - engine = DQEngine(ws) + engine = DQEngine(ws, spark) config = VolumeFileChecksStorageConfig(location=volume) engine.save_checks(checks=TEST_CHECKS, config=config) checks = engine.load_checks(config=config) @@ -85,7 +85,7 @@ def test_save_and_load_checks_from_volume(ws, make_schema, make_volume): def test_load_checks_from_installation_when_checks_file_does_not_exist_in_volume( - ws, installation_ctx, make_schema, make_volume + ws, spark, installation_ctx, make_schema, make_volume ): installation_ctx.installation.save(installation_ctx.config) catalog_name = "main" @@ -103,10 +103,10 @@ def test_load_checks_from_installation_when_checks_file_does_not_exist_in_volume config = InstallationChecksStorageConfig( run_config_name=run_config.name, assume_user=True, product_name=product_name ) - DQEngine(ws).load_checks(config=config) + DQEngine(ws, spark).load_checks(config=config) -def test_save_load_checks_from_volume_in_user_installation(ws, installation_ctx, make_schema, make_volume): +def test_save_load_checks_from_volume_in_user_installation(ws, spark, installation_ctx, make_schema, make_volume): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name volume_name = make_volume(catalog_name=catalog_name, schema_name=schema_name).name @@ -118,7 +118,7 @@ def test_save_load_checks_from_volume_in_user_installation(ws, installation_ctx, installation_ctx.installation.save(installation_ctx.config) product_name = installation_ctx.product_info.product_name() - dq_engine = DQEngine(ws) + dq_engine = DQEngine(ws, spark) config = InstallationChecksStorageConfig( run_config_name=run_config.name, assume_user=True, product_name=product_name ) @@ -128,41 +128,49 @@ def test_save_load_checks_from_volume_in_user_installation(ws, installation_ctx, assert checks == EXPECTED_CHECKS, "Checks were not saved correctly" -def test_load_checks_when_user_installation_missing(ws, spark): +def test_load_checks_when_user_installation_missing(ws, spark, make_random): with pytest.raises(NotFound): - config = InstallationChecksStorageConfig(run_config_name="default", assume_user=True) + config = InstallationChecksStorageConfig( + run_config_name="default", assume_user=True, product_name=make_random(10) + ) DQEngine(ws, spark).load_checks(config=config) -def test_load_checks_from_yaml_file(ws, make_schema, make_volume, make_volume_check_file_as_yaml, expected_checks): +def test_load_checks_from_yaml_file( + ws, spark, make_schema, make_volume, make_volume_check_file_as_yaml, expected_checks +): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name volume_name = make_volume(catalog_name=catalog_name, schema_name=schema_name).name install_dir = f"/Volumes/{catalog_name}/{schema_name}/{volume_name}" make_volume_check_file_as_yaml(install_dir=install_dir) - checks = DQEngine(ws).load_checks( + checks = DQEngine(ws, spark).load_checks( config=VolumeFileChecksStorageConfig(location=f"{install_dir}/checks.yaml"), ) assert checks == expected_checks, "Checks were not loaded correctly" -def test_load_checks_from_json_file(ws, make_schema, make_volume, make_volume_check_file_as_json, expected_checks): +def test_load_checks_from_json_file( + ws, spark, make_schema, make_volume, make_volume_check_file_as_json, expected_checks +): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name volume_name = make_volume(catalog_name=catalog_name, schema_name=schema_name).name install_dir = f"/Volumes/{catalog_name}/{schema_name}/{volume_name}" make_volume_check_file_as_json(install_dir=install_dir) - checks = DQEngine(ws).load_checks( + checks = DQEngine(ws, spark).load_checks( config=VolumeFileChecksStorageConfig(location=f"{install_dir}/checks.json"), ) assert checks == expected_checks, "Checks were not loaded correctly" -def test_load_invalid_checks_from_yaml_file(ws, make_schema, make_volume, make_volume_invalid_check_file_as_yaml): +def test_load_invalid_checks_from_yaml_file( + ws, spark, make_schema, make_volume, make_volume_invalid_check_file_as_yaml +): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name volume_name = make_volume(catalog_name=catalog_name, schema_name=schema_name).name @@ -170,12 +178,14 @@ def test_load_invalid_checks_from_yaml_file(ws, make_schema, make_volume, make_v volume_file_path = make_volume_invalid_check_file_as_yaml(install_dir=install_dir) with pytest.raises(InvalidCheckError, match=f"Invalid checks in file: {volume_file_path}"): - DQEngine(ws).load_checks( + DQEngine(ws, spark).load_checks( config=VolumeFileChecksStorageConfig(location=f"{install_dir}/checks.yaml"), ) -def test_load_invalid_checks_from_json_file(ws, make_schema, make_volume, make_volume_invalid_check_file_as_json): +def test_load_invalid_checks_from_json_file( + ws, spark, make_schema, make_volume, make_volume_invalid_check_file_as_json +): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name volume_name = make_volume(catalog_name=catalog_name, schema_name=schema_name).name @@ -183,18 +193,18 @@ def test_load_invalid_checks_from_json_file(ws, make_schema, make_volume, make_v volume_file_path = make_volume_invalid_check_file_as_json(install_dir=install_dir) with pytest.raises(InvalidCheckError, match=f"Invalid checks in file: {volume_file_path}"): - DQEngine(ws).load_checks( + DQEngine(ws, spark).load_checks( config=VolumeFileChecksStorageConfig(location=f"{install_dir}/checks.json"), ) -def test_save_checks_in_volume_file_as_yml(ws, make_schema, make_volume, installation_ctx): +def test_save_checks_in_volume_file_as_yml(ws, spark, make_schema, make_volume, installation_ctx): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name volume_name = make_volume(catalog_name=catalog_name, schema_name=schema_name).name install_dir = f"/Volumes/{catalog_name}/{schema_name}/{volume_name}" - dq_engine = DQEngine(ws) + dq_engine = DQEngine(ws, spark) checks_path = f"{install_dir}/{installation_ctx.config.get_run_config().checks_location}" dq_engine.save_checks(TEST_CHECKS, config=VolumeFileChecksStorageConfig(location=checks_path)) @@ -202,7 +212,7 @@ def test_save_checks_in_volume_file_as_yml(ws, make_schema, make_volume, install assert TEST_CHECKS == checks, "Checks were not saved correctly" -def test_save_checks_in_volume_file_as_json(ws, make_schema, make_volume, installation_ctx): +def test_save_checks_in_volume_file_as_json(ws, spark, make_schema, make_volume, installation_ctx): installation_ctx.config.run_configs[0].checks_location = "checks.json" installation_ctx.installation.save(installation_ctx.config) catalog_name = "main" @@ -210,7 +220,7 @@ def test_save_checks_in_volume_file_as_json(ws, make_schema, make_volume, instal volume_name = make_volume(catalog_name=catalog_name, schema_name=schema_name).name install_dir = f"/Volumes/{catalog_name}/{schema_name}/{volume_name}" - dq_engine = DQEngine(ws) + dq_engine = DQEngine(ws, spark) checks_path = f"{install_dir}/{installation_ctx.config.get_run_config().checks_location}" dq_engine.save_checks(TEST_CHECKS, config=VolumeFileChecksStorageConfig(location=checks_path)) @@ -250,14 +260,14 @@ def test_save_checks_in_volume_file_as_json(ws, make_schema, make_volume, instal ] -def test_save_and_load_checks_with_filters_from_volume(ws, make_schema, make_volume): +def test_save_and_load_checks_with_filters_from_volume(ws, spark, make_schema, make_volume): catalog_name = "main" schema_name = make_schema(catalog_name=catalog_name).name volume_name = make_volume(catalog_name=catalog_name, schema_name=schema_name).name volume = f"/Volumes/{catalog_name}/{schema_name}/{volume_name}/checks.yml" - engine = DQEngine(ws) + engine = DQEngine(ws, spark) config = VolumeFileChecksStorageConfig(location=volume) engine.save_checks(checks=TEST_CHECKS_FILTER, config=config) checks = engine.load_checks(config=config) diff --git a/tests/integration/test_load_checks_from_workspace_file.py b/tests/integration/test_load_checks_from_workspace_file.py index 47594a10f..d5312f0d2 100644 --- a/tests/integration/test_load_checks_from_workspace_file.py +++ b/tests/integration/test_load_checks_from_workspace_file.py @@ -178,13 +178,16 @@ def test_load_checks_from_global_installation(ws, installation_ctx, make_check_f assert installation_ctx.installation_service.install_folder == f"/Shared/{product_name}" -def test_load_checks_when_global_installation_missing(ws, spark): - with pytest.raises(NotInstalled, match="Application not installed: dqx"): - config = InstallationChecksStorageConfig(run_config_name="default", assume_user=False) +def test_load_checks_when_global_installation_missing(ws, spark, make_random): + product = make_random(10) + with pytest.raises(NotInstalled, match=f"Application not installed: {product}"): + config = InstallationChecksStorageConfig(run_config_name="default", assume_user=False, product_name=product) DQEngine(ws, spark).load_checks(config=config) -def test_load_checks_when_user_installation_missing(ws, spark): +def test_load_checks_when_user_installation_missing(ws, spark, make_random): with pytest.raises(NotFound): - config = InstallationChecksStorageConfig(run_config_name="default", assume_user=True) + config = InstallationChecksStorageConfig( + run_config_name="default", assume_user=True, product_name=make_random(10) + ) DQEngine(ws, spark).load_checks(config=config) diff --git a/tests/integration/test_save_checks_to_workspace_file.py b/tests/integration/test_save_checks_to_workspace_file.py index 8746600a9..796157e1f 100644 --- a/tests/integration/test_save_checks_to_workspace_file.py +++ b/tests/integration/test_save_checks_to_workspace_file.py @@ -119,9 +119,10 @@ def test_save_checks_in_global_installation_as_yaml(ws, spark, installation_ctx) assert installation_ctx.installation_service.install_folder == f"/Shared/{product_name}" -def test_save_checks_when_global_installation_missing(ws, spark): - with pytest.raises(NotInstalled, match="Application not installed: dqx"): - config = InstallationChecksStorageConfig(run_config_name="default", assume_user=False) +def test_save_checks_when_global_installation_missing(ws, spark, make_random): + product = make_random(10) + with pytest.raises(NotInstalled, match=f"Application not installed: {product}"): + config = InstallationChecksStorageConfig(run_config_name="default", assume_user=False, product_name=product) DQEngine(ws, spark).save_checks(TEST_CHECKS, config=config) @@ -146,9 +147,11 @@ def test_save_checks_in_custom_folder_installation_in_yaml_file(ws, spark, insta assert TEST_CHECKS == checks, "Checks were not saved correctly" -def test_save_checks_when_user_installation_missing(ws, spark): +def test_save_checks_when_user_installation_missing(ws, spark, make_random): with pytest.raises(NotFound): - config = InstallationChecksStorageConfig(run_config_name="default", assume_user=True) + config = InstallationChecksStorageConfig( + run_config_name="default", assume_user=True, product_name=make_random(10) + ) DQEngine(ws, spark).save_checks(TEST_CHECKS, config=config) From 8e1a6b82b3fffa8fb1065922f2dd59b9ed2c221c Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 3 Oct 2025 10:21:45 +0200 Subject: [PATCH 59/64] added instruction for installing dqx cli in windows --- docs/dqx/docs/installation.mdx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/dqx/docs/installation.mdx b/docs/dqx/docs/installation.mdx index c79d62e34..7977deaac 100644 --- a/docs/dqx/docs/installation.mdx +++ b/docs/dqx/docs/installation.mdx @@ -8,15 +8,14 @@ import Admonition from '@theme/Admonition'; The framework can be installed on a Databricks workspace as a tool or used as a standalone library. -## Prerequisites +## DQX installation as a Library + +### Prerequisites -- Python 3.10 or later. See [instructions](https://www.python.org/downloads/). - [Databricks workspace](https://docs.databricks.com/en/getting-started/index.html). -- Network access to your Databricks Workspace used for the installation process. -- (Optional if wanting to install DQX as a tool) Databricks CLI v0.241 or later. See [instructions](https://docs.databricks.com/dev-tools/cli/databricks-cli.html). - Databricks cluster with Spark 3.5.0 or higher. It is recommended to use Databricks Runtime >= 15.4. See [instructions](https://docs.databricks.com/clusters/create.html). -## DQX installation as a Library +### Installing DQX in a cluster or notebook Install the library via `pip` in a cluster or notebook: ```commandline @@ -48,6 +47,14 @@ resources: If you install DQX via PyPI and use it purely as a library, you don’t need to pre-install DQX in the workspace. However, installing DQX in the workspace offers additional benefits such as profiling and quality checker workflows allowing for no-code quality checking, a pre-configured dashboard, and convenient configuration management. +### Prerequisites + +- Python 3.10 or later. See [instructions](https://www.python.org/downloads/). +- [Databricks workspace](https://docs.databricks.com/en/getting-started/index.html). +- Network access to your Databricks Workspace used for the installation process. +- Databricks CLI v0.241 or later. See [instructions](https://docs.databricks.com/dev-tools/cli/databricks-cli.html). +- On Windows, Build Tools for Visual Studio (see [Tool for Visual Studio](https://visualstudio.microsoft.com/downloads/)). + ### Authenticate Databricks CLI Once you install Databricks CLI, authenticate your current machine to your Databricks Workspace: From da5e3850d2fe2fb73d3f8561cc3987e91aa31e6c Mon Sep 17 00:00:00 2001 From: mwojtyczka Date: Fri, 3 Oct 2025 09:07:47 +0000 Subject: [PATCH 60/64] Add pytest-benchmark performance baseline --- docs/dqx/docs/reference/benchmarks.mdx | 16 + tests/perf/.benchmarks/baseline.json | 560 +++++++++++++++++++++++++ 2 files changed, 576 insertions(+) diff --git a/docs/dqx/docs/reference/benchmarks.mdx b/docs/dqx/docs/reference/benchmarks.mdx index 019fea8fc..56a408ce0 100644 --- a/docs/dqx/docs/reference/benchmarks.mdx +++ b/docs/dqx/docs/reference/benchmarks.mdx @@ -51,7 +51,10 @@ sidebar_position: 13 | test_benchmark_foreach_sql_expression[n_rows_100000000_n_columns_5] | 0.895489 | 0.888982 | 0.853895 | 0.950998 | 0.041479 | 0.071722 | 0.858589 | 0.930311 | 5 | 0 | 2 | 1.12 | | test_benchmark_foreach_sql_query[n_rows_100000000_n_columns_5] | 4.578799 | 4.602143 | 4.442396 | 4.644892 | 0.083901 | 0.113694 | 4.530776 | 4.644470 | 5 | 0 | 1 | 0.22 | | test_benchmark_foreign_key | 31.784272 | 31.787610 | 31.414708 | 32.123221 | 0.269713 | 0.386951 | 31.597198 | 31.984149 | 5 | 0 | 2 | 0.03 | +| test_benchmark_has_dimension | 0.215338 | 0.213285 | 0.210530 | 0.223131 | 0.005056 | 0.007086 | 0.211819 | 0.218905 | 5 | 0 | 1 | 4.64 | | test_benchmark_has_valid_schema | 0.172078 | 0.172141 | 0.163793 | 0.181081 | 0.006715 | 0.009295 | 0.167010 | 0.176305 | 6 | 0 | 2 | 5.81 | +| test_benchmark_has_x_coordinate_between | 0.217192 | 0.213656 | 0.209310 | 0.236233 | 0.011150 | 0.012638 | 0.209410 | 0.222048 | 5 | 0 | 1 | 4.60 | +| test_benchmark_has_y_coordinate_between | 0.218497 | 0.219630 | 0.209352 | 0.234111 | 0.010103 | 0.013743 | 0.209584 | 0.223327 | 5 | 0 | 1 | 4.58 | | test_benchmark_is_aggr_equal | 0.304401 | 0.305693 | 0.266624 | 0.330403 | 0.026888 | 0.044641 | 0.284540 | 0.329181 | 5 | 0 | 1 | 3.29 | | test_benchmark_is_aggr_not_equal | 0.296462 | 0.296800 | 0.275119 | 0.312035 | 0.013498 | 0.013448 | 0.291054 | 0.304502 | 5 | 0 | 2 | 3.37 | | test_benchmark_is_aggr_not_greater_than | 0.307771 | 0.315185 | 0.277924 | 0.316280 | 0.016705 | 0.010701 | 0.304974 | 0.315675 | 5 | 1 | 1 | 3.25 | @@ -59,6 +62,9 @@ sidebar_position: 13 | test_benchmark_is_data_fresh | 0.279160 | 0.235545 | 0.231767 | 0.430390 | 0.085563 | 0.072198 | 0.233457 | 0.305655 | 5 | 1 | 1 | 3.58 | | test_benchmark_is_data_fresh_per_time_window | 0.259995 | 0.246444 | 0.242483 | 0.291510 | 0.022543 | 0.037112 | 0.243019 | 0.280132 | 5 | 0 | 1 | 3.85 | | test_benchmark_is_equal_to | 0.241270 | 0.241646 | 0.226919 | 0.248632 | 0.008799 | 0.010992 | 0.237380 | 0.248371 | 5 | 0 | 1 | 4.14 | +| test_benchmark_is_geography | 0.213287 | 0.212428 | 0.209852 | 0.217141 | 0.002817 | 0.004011 | 0.211498 | 0.215510 | 5 | 0 | 2 | 4.69 | +| test_benchmark_is_geometry | 0.219831 | 0.214826 | 0.212297 | 0.238342 | 0.010652 | 0.010117 | 0.213906 | 0.224022 | 5 | 0 | 1 | 4.55 | +| test_benchmark_is_geometrycollection | 0.212428 | 0.212908 | 0.210102 | 0.214169 | 0.001574 | 0.002194 | 0.211298 | 0.213491 | 5 | 0 | 2 | 4.71 | | test_benchmark_is_in_list[col1] | 0.236102 | 0.236503 | 0.227829 | 0.246569 | 0.007036 | 0.008989 | 0.230909 | 0.239897 | 5 | 0 | 2 | 4.24 | | test_benchmark_is_in_list[col2] | 0.289593 | 0.276054 | 0.232456 | 0.372550 | 0.053040 | 0.065903 | 0.255264 | 0.321166 | 5 | 0 | 2 | 3.45 | | test_benchmark_is_in_list[col3] | 0.278913 | 0.276144 | 0.261990 | 0.308485 | 0.018107 | 0.021908 | 0.265834 | 0.287742 | 5 | 0 | 1 | 3.59 | @@ -75,6 +81,13 @@ sidebar_position: 13 | test_benchmark_is_ipv6_address_in_cidr[col6_ipv6_c_mid1] | 0.197962 | 0.202916 | 0.185055 | 0.209342 | 0.010224 | 0.016226 | 0.188373 | 0.204599 | 5 | 0 | 2 | 5.05 | | test_benchmark_is_ipv6_address_in_cidr[col7_ipv6_c_mid4] | 0.215360 | 0.201467 | 0.188151 | 0.292795 | 0.038750 | 0.016073 | 0.196102 | 0.212175 | 6 | 1 | 1 | 4.64 | | test_benchmark_is_ipv6_address_in_cidr[col8_ipv6_u_prefix] | 0.196697 | 0.191199 | 0.185784 | 0.217491 | 0.012402 | 0.013114 | 0.189732 | 0.202846 | 5 | 0 | 1 | 5.08 | +| test_benchmark_is_latitude | 0.218913 | 0.212886 | 0.211322 | 0.239906 | 0.012077 | 0.012070 | 0.211787 | 0.223857 | 5 | 0 | 1 | 4.57 | +| test_benchmark_is_linestring | 0.217563 | 0.212513 | 0.206049 | 0.229266 | 0.010271 | 0.017183 | 0.210818 | 0.228001 | 5 | 0 | 2 | 4.60 | +| test_benchmark_is_longitude | 0.213168 | 0.214637 | 0.206107 | 0.218007 | 0.004528 | 0.005640 | 0.210352 | 0.215992 | 5 | 0 | 2 | 4.69 | +| test_benchmark_is_multilinestring | 0.217815 | 0.217069 | 0.213145 | 0.226632 | 0.005455 | 0.007213 | 0.213451 | 0.220663 | 5 | 0 | 1 | 4.59 | +| test_benchmark_is_multipoint | 0.213371 | 0.213224 | 0.209331 | 0.218980 | 0.003539 | 0.003609 | 0.211229 | 0.214838 | 5 | 0 | 2 | 4.69 | +| test_benchmark_is_multipolygon | 0.214107 | 0.211517 | 0.209149 | 0.220792 | 0.005071 | 0.008372 | 0.210460 | 0.218832 | 5 | 0 | 1 | 4.67 | +| test_benchmark_is_non_empty_geometry | 0.215161 | 0.214063 | 0.208045 | 0.225017 | 0.006164 | 0.005598 | 0.212088 | 0.217686 | 5 | 0 | 2 | 4.65 | | test_benchmark_is_not_empty[col1] | 0.247378 | 0.244527 | 0.234753 | 0.262444 | 0.010315 | 0.012830 | 0.241421 | 0.254251 | 5 | 0 | 2 | 4.04 | | test_benchmark_is_not_empty[col2] | 0.227237 | 0.223543 | 0.216799 | 0.239127 | 0.010264 | 0.018784 | 0.218867 | 0.237651 | 5 | 0 | 2 | 4.40 | | test_benchmark_is_not_empty[col3] | 0.224964 | 0.221986 | 0.212208 | 0.245085 | 0.012278 | 0.012591 | 0.217945 | 0.230536 | 5 | 0 | 2 | 4.45 | @@ -109,8 +122,11 @@ sidebar_position: 13 | test_benchmark_is_null_or_empty[col6] | 0.271883 | 0.288303 | 0.233084 | 0.291877 | 0.025875 | 0.038427 | 0.251213 | 0.289639 | 5 | 0 | 1 | 3.68 | | test_benchmark_is_null_or_empty[col7] | 0.255479 | 0.255281 | 0.230887 | 0.289014 | 0.022139 | 0.029264 | 0.238686 | 0.267950 | 5 | 0 | 2 | 3.91 | | test_benchmark_is_null_or_empty[col8] | 0.219256 | 0.217609 | 0.214083 | 0.226223 | 0.005137 | 0.008602 | 0.215124 | 0.223726 | 5 | 0 | 2 | 4.56 | +| test_benchmark_is_ogc_valid | 0.220708 | 0.223267 | 0.206378 | 0.235649 | 0.011210 | 0.015703 | 0.211743 | 0.227446 | 5 | 0 | 2 | 4.53 | | test_benchmark_is_older_than_col2_for_n_days | 0.235241 | 0.230978 | 0.224354 | 0.254865 | 0.011884 | 0.013734 | 0.227788 | 0.241522 | 5 | 0 | 1 | 4.25 | | test_benchmark_is_older_than_n_days | 0.246935 | 0.248889 | 0.234393 | 0.253353 | 0.007733 | 0.010372 | 0.242547 | 0.252920 | 5 | 0 | 1 | 4.05 | +| test_benchmark_is_point | 0.218492 | 0.215231 | 0.207259 | 0.239442 | 0.012283 | 0.010844 | 0.211864 | 0.222708 | 5 | 1 | 1 | 4.58 | +| test_benchmark_is_polygon | 0.210914 | 0.211234 | 0.203879 | 0.217549 | 0.005765 | 0.010068 | 0.205860 | 0.215928 | 5 | 0 | 2 | 4.74 | | test_benchmark_is_unique | 0.248614 | 0.245772 | 0.243054 | 0.259295 | 0.006731 | 0.009422 | 0.243688 | 0.253109 | 5 | 0 | 1 | 4.02 | | test_benchmark_is_valid_date | 0.242393 | 0.229097 | 0.222715 | 0.270948 | 0.022056 | 0.037082 | 0.226619 | 0.263702 | 5 | 0 | 1 | 4.13 | | test_benchmark_is_valid_ipv4_address[col1_ipv4_standard] | 0.165535 | 0.161430 | 0.158404 | 0.188479 | 0.011344 | 0.002309 | 0.160578 | 0.162887 | 6 | 1 | 1 | 6.04 | diff --git a/tests/perf/.benchmarks/baseline.json b/tests/perf/.benchmarks/baseline.json index d65319fec..b3f449bb9 100644 --- a/tests/perf/.benchmarks/baseline.json +++ b/tests/perf/.benchmarks/baseline.json @@ -1541,6 +1541,41 @@ "iterations": 1 } }, + { + "group": null, + "name": "test_benchmark_has_dimension", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_has_dimension", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.21053045000007842, + "max": 0.2231306680000671, + "mean": 0.21533803459997217, + "stddev": 0.00505613950693625, + "rounds": 5, + "median": 0.21328519799999412, + "iqr": 0.007086166249791859, + "q1": 0.2118185030000177, + "q3": 0.21890466924980956, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 0.21053045000007842, + "hd15iqr": 0.2231306680000671, + "ops": 4.64386146115652, + "total": 1.0766901729998608, + "iterations": 1 + } + }, { "group": null, "name": "test_benchmark_has_valid_schema", @@ -1576,6 +1611,76 @@ "iterations": 1 } }, + { + "group": null, + "name": "test_benchmark_has_x_coordinate_between", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_has_x_coordinate_between", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.2093095820000599, + "max": 0.2362332749999041, + "mean": 0.2171921485999519, + "stddev": 0.011149751626141588, + "rounds": 5, + "median": 0.21365571700016517, + "iqr": 0.012637736499982566, + "q1": 0.2094098022498656, + "q3": 0.22204753874984817, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 0.2093095820000599, + "hd15iqr": 0.2362332749999041, + "ops": 4.604217999803983, + "total": 1.0859607429997595, + "iterations": 1 + } + }, + { + "group": null, + "name": "test_benchmark_has_y_coordinate_between", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_has_y_coordinate_between", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.2093515749998005, + "max": 0.2341108659998099, + "mean": 0.2184973135999826, + "stddev": 0.010103270569006721, + "rounds": 5, + "median": 0.21963020200018946, + "iqr": 0.013742734500283404, + "q1": 0.209584159749852, + "q3": 0.2233268942501354, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 0.2093515749998005, + "hd15iqr": 0.2341108659998099, + "ops": 4.576715308412284, + "total": 1.092486567999913, + "iterations": 1 + } + }, { "group": null, "name": "test_benchmark_is_aggr_equal", @@ -1821,6 +1926,111 @@ "iterations": 1 } }, + { + "group": null, + "name": "test_benchmark_is_geography", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_is_geography", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.20985177200009275, + "max": 0.21714089899978717, + "mean": 0.21328680300002817, + "stddev": 0.002817250297921943, + "rounds": 5, + "median": 0.21242807400039965, + "iqr": 0.004011468749922642, + "q1": 0.21149832574997163, + "q3": 0.21550979449989427, + "iqr_outliers": 0, + "stddev_outliers": 2, + "outliers": "2;0", + "ld15iqr": 0.20985177200009275, + "hd15iqr": 0.21714089899978717, + "ops": 4.688522618063097, + "total": 1.0664340150001408, + "iterations": 1 + } + }, + { + "group": null, + "name": "test_benchmark_is_geometry", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_is_geometry", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.2122974969997813, + "max": 0.23834169100018698, + "mean": 0.2198313543999575, + "stddev": 0.010651609616053022, + "rounds": 5, + "median": 0.2148263220001354, + "iqr": 0.010116691499888475, + "q1": 0.2139057759999332, + "q3": 0.2240224674998217, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 0.2122974969997813, + "hd15iqr": 0.23834169100018698, + "ops": 4.548941631777498, + "total": 1.0991567719997875, + "iterations": 1 + } + }, + { + "group": null, + "name": "test_benchmark_is_geometrycollection", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_is_geometrycollection", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.21010197499981587, + "max": 0.21416911900041669, + "mean": 0.21242812139998932, + "stddev": 0.001573929314754156, + "rounds": 5, + "median": 0.21290821299999152, + "iqr": 0.0021935825000127807, + "q1": 0.21129758299991863, + "q3": 0.2134911654999314, + "iqr_outliers": 0, + "stddev_outliers": 2, + "outliers": "2;0", + "ld15iqr": 0.21010197499981587, + "hd15iqr": 0.21416911900041669, + "ops": 4.707474666770039, + "total": 1.0621406069999466, + "iterations": 1 + } + }, { "group": "test_benchmark_is_in_list col1", "name": "test_benchmark_is_in_list[col1]", @@ -2411,6 +2621,251 @@ "iterations": 1 } }, + { + "group": null, + "name": "test_benchmark_is_latitude", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_is_latitude", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.2113224849999824, + "max": 0.23990608399981284, + "mean": 0.21891273079991153, + "stddev": 0.012076939886975563, + "rounds": 5, + "median": 0.2128863539996928, + "iqr": 0.01206991150002068, + "q1": 0.21178688949999014, + "q3": 0.22385680100001082, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 0.2113224849999824, + "hd15iqr": 0.23990608399981284, + "ops": 4.5680303577867765, + "total": 1.0945636539995576, + "iterations": 1 + } + }, + { + "group": null, + "name": "test_benchmark_is_linestring", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_is_linestring", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.20604908399991473, + "max": 0.22926628599998367, + "mean": 0.2175632260000384, + "stddev": 0.010270540048788938, + "rounds": 5, + "median": 0.2125132900000608, + "iqr": 0.017182682499992552, + "q1": 0.21081838125007835, + "q3": 0.2280010637500709, + "iqr_outliers": 0, + "stddev_outliers": 2, + "outliers": "2;0", + "ld15iqr": 0.20604908399991473, + "hd15iqr": 0.22926628599998367, + "ops": 4.596365012531224, + "total": 1.087816130000192, + "iterations": 1 + } + }, + { + "group": null, + "name": "test_benchmark_is_longitude", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_is_longitude", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.20610718599982647, + "max": 0.21800696100035566, + "mean": 0.21316778880009224, + "stddev": 0.004528341426842079, + "rounds": 5, + "median": 0.21463668800015512, + "iqr": 0.005639922500108696, + "q1": 0.2103523480000149, + "q3": 0.2159922705001236, + "iqr_outliers": 0, + "stddev_outliers": 2, + "outliers": "2;0", + "ld15iqr": 0.20610718599982647, + "hd15iqr": 0.21800696100035566, + "ops": 4.691140277942252, + "total": 1.0658389440004612, + "iterations": 1 + } + }, + { + "group": null, + "name": "test_benchmark_is_multilinestring", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_is_multilinestring", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.2131448760001149, + "max": 0.2266321790002621, + "mean": 0.2178145704000599, + "stddev": 0.005454640066815103, + "rounds": 5, + "median": 0.21706913900015934, + "iqr": 0.007212530750280166, + "q1": 0.2134508632498182, + "q3": 0.22066339400009838, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 0.2131448760001149, + "hd15iqr": 0.2266321790002621, + "ops": 4.591061094596659, + "total": 1.0890728520002995, + "iterations": 1 + } + }, + { + "group": null, + "name": "test_benchmark_is_multipoint", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_is_multipoint", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.20933097200031625, + "max": 0.21897978400011198, + "mean": 0.21337094920008895, + "stddev": 0.003538594986259042, + "rounds": 5, + "median": 0.2132244169997648, + "iqr": 0.003609010249988387, + "q1": 0.21122917925015372, + "q3": 0.2148381895001421, + "iqr_outliers": 0, + "stddev_outliers": 2, + "outliers": "2;0", + "ld15iqr": 0.20933097200031625, + "hd15iqr": 0.21897978400011198, + "ops": 4.686673625200253, + "total": 1.0668547460004447, + "iterations": 1 + } + }, + { + "group": null, + "name": "test_benchmark_is_multipolygon", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_is_multipolygon", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.20914906900043206, + "max": 0.22079205899990484, + "mean": 0.21410681639999893, + "stddev": 0.005071140880722468, + "rounds": 5, + "median": 0.21151665899969885, + "iqr": 0.008372183750225304, + "q1": 0.21046015974991406, + "q3": 0.21883234350013936, + "iqr_outliers": 0, + "stddev_outliers": 1, + "outliers": "1;0", + "ld15iqr": 0.20914906900043206, + "hd15iqr": 0.22079205899990484, + "ops": 4.6705659203851715, + "total": 1.0705340819999947, + "iterations": 1 + } + }, + { + "group": null, + "name": "test_benchmark_is_non_empty_geometry", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_is_non_empty_geometry", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.20804529599990929, + "max": 0.22501716900023894, + "mean": 0.21516073819993836, + "stddev": 0.006163750392246963, + "rounds": 5, + "median": 0.21406286399997043, + "iqr": 0.005598494249966279, + "q1": 0.2120879467498753, + "q3": 0.21768644099984158, + "iqr_outliers": 0, + "stddev_outliers": 2, + "outliers": "2;0", + "ld15iqr": 0.20804529599990929, + "hd15iqr": 0.22501716900023894, + "ops": 4.647688088292154, + "total": 1.0758036909996918, + "iterations": 1 + } + }, { "group": "test_benchmark_is_not_empty col1", "name": "test_benchmark_is_not_empty[col1]", @@ -3655,6 +4110,41 @@ "iterations": 1 } }, + { + "group": null, + "name": "test_benchmark_is_ogc_valid", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_is_ogc_valid", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.20637762299975293, + "max": 0.23564875200008828, + "mean": 0.22070761959994342, + "stddev": 0.011210134219377985, + "rounds": 5, + "median": 0.22326748299974497, + "iqr": 0.015703149749924705, + "q1": 0.2117433120000669, + "q3": 0.2274464617499916, + "iqr_outliers": 0, + "stddev_outliers": 2, + "outliers": "2;0", + "ld15iqr": 0.20637762299975293, + "hd15iqr": 0.23564875200008828, + "ops": 4.530881180326301, + "total": 1.1035380979997171, + "iterations": 1 + } + }, { "group": null, "name": "test_benchmark_is_older_than_col2_for_n_days", @@ -3725,6 +4215,76 @@ "iterations": 1 } }, + { + "group": null, + "name": "test_benchmark_is_point", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_is_point", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.20725905900008001, + "max": 0.23944247700001142, + "mean": 0.21849202100002002, + "stddev": 0.012283499447506238, + "rounds": 5, + "median": 0.21523089299989806, + "iqr": 0.010843888499721288, + "q1": 0.21186362625019228, + "q3": 0.22270751474991357, + "iqr_outliers": 1, + "stddev_outliers": 1, + "outliers": "1;1", + "ld15iqr": 0.20725905900008001, + "hd15iqr": 0.23944247700001142, + "ops": 4.576826171606094, + "total": 1.0924601050001002, + "iterations": 1 + } + }, + { + "group": null, + "name": "test_benchmark_is_polygon", + "fullname": "tests/perf/test_apply_checks.py::test_benchmark_is_polygon", + "params": null, + "param": null, + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 0.000005, + "warmup": false + }, + "stats": { + "min": 0.20387912200021674, + "max": 0.21754917500038573, + "mean": 0.21091405199995278, + "stddev": 0.0057647828567549235, + "rounds": 5, + "median": 0.21123365499988722, + "iqr": 0.010067643249954017, + "q1": 0.20586033099982615, + "q3": 0.21592797424978016, + "iqr_outliers": 0, + "stddev_outliers": 2, + "outliers": "2;0", + "ld15iqr": 0.20387912200021674, + "hd15iqr": 0.21754917500038573, + "ops": 4.741267784283163, + "total": 1.054570259999764, + "iterations": 1 + } + }, { "group": null, "name": "test_benchmark_is_unique", From 8fd27ecb763b1dc9632364c3399b638a193f4ed2 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 3 Oct 2025 11:15:09 +0200 Subject: [PATCH 61/64] added comments --- pyproject.toml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 894bfc18d..224bc71cc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,9 +35,12 @@ dependencies = ["databricks-labs-blueprint>=0.9.1,<0.10", [project.optional-dependencies] cli = [ - # Must contain all packages required to import dqx modules such as DQEngine - # These packages are available in the Databricks workspace but not in the CLI environment - "databricks-connect~=15.4", # includes pyspark and pandas + # Must contain all packages required to import dqx modules such as DQEngine. + # These packages are available in the Databricks workspace but not in the CLI environment. + # The databricks-connect includes pyspark, pandas and numpy. + # On Windows, Build Tools for Visual Studio are required to compile numpy. + # Spark in local mode is not supported with databricks-connect. + "databricks-connect~=15.4", ] pii = [ "numpy<2.0,>=1.20", From 24f1ee3dae4b68b6ee95d62dc692004e70535437 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 3 Oct 2025 11:20:51 +0200 Subject: [PATCH 62/64] added comments --- demos/dqx_demo_tool.py | 29 +++++++--------------- src/databricks/labs/dqx/checks_resolver.py | 3 ++- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/demos/dqx_demo_tool.py b/demos/dqx_demo_tool.py index 17cee9294..f1a599e54 100644 --- a/demos/dqx_demo_tool.py +++ b/demos/dqx_demo_tool.py @@ -70,16 +70,13 @@ # MAGIC # MAGIC Run in the terminal: # MAGIC ``` -# MAGIC # run for all configured run configs (default) +# MAGIC # Run for all configured run configs (default) # MAGIC databricks labs dqx profile # MAGIC -# MAGIC # or run for a specific run config +# MAGIC # Or run for a specific run config # MAGIC databricks labs dqx profile --run-config "default" # MAGIC -# MAGIC # You can also run for tables/views matching wildcard patterns. Conventions: -# MAGIC # * Run config is used as a template for all relevant fields except location -# MAGIC # * Input table location is derived from the patterns -# MAGIC # * For table-based checks location, save checks to the delta table, otherwise to install_folder/checks_folder_if_any/.yml +# MAGIC # You can also run for tables/views matching wildcard patterns. # MAGIC databricks labs dqx profile --run-config "default" --patterns "main.nytaxi.*;main.default.table" # MAGIC ``` # MAGIC @@ -92,17 +89,13 @@ # MAGIC # MAGIC Run in the terminal: # MAGIC ``` -# MAGIC # run for all configured run configs (default) +# MAGIC # Run for all configured run configs (default) # MAGIC databricks labs dqx apply-checks # MAGIC -# MAGIC # or run for a specific run config +# MAGIC # Or run for a specific run config # MAGIC databricks labs dqx apply-checks --run-config "default" # MAGIC -# MAGIC # You can also run for tables/views matching wildcard patterns. Conventions: -# MAGIC # * Run config is used as a template for all relevant fields except location -# MAGIC # * Input table location is derived from the patterns -# MAGIC # * For table-based checks location, load checks from the delta table, otherwise from install_folder/checks_folder_if_any/.yml -# MAGIC # * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes +# MAGIC # You can also run for tables/views matching wildcard patterns. # MAGIC databricks labs dqx apply-checks --run-config "default" --patterns "main.nytaxi.*;main.default.table" # MAGIC ``` # MAGIC @@ -117,17 +110,13 @@ # MAGIC # MAGIC Run in the terminal: # MAGIC ``` -# MAGIC # run for all configured run configs (default) +# MAGIC # Run for all configured run configs (default) # MAGIC databricks labs dqx e2e # MAGIC -# MAGIC # or run for a specific run config +# MAGIC # Or run for a specific run config # MAGIC databricks labs dqx e2e --run-config "default" # MAGIC -# MAGIC # You can also run for tables/views matching wildcard patterns. Conventions: -# MAGIC # * Run config is used as a template for all relevant fields except location -# MAGIC # * Input table location is derived from the patterns -# MAGIC # * For table-based checks location, save/load checks from the delta table, otherwise from install_folder/checks_folder_if_any/.yml -# MAGIC # * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes +# MAGIC # You can also run for tables/views matching wildcard patterns. # MAGIC databricks labs dqx e2e --run-config "default" --patterns "main.nytaxi.*;main.default.table" # MAGIC ``` # MAGIC diff --git a/src/databricks/labs/dqx/checks_resolver.py b/src/databricks/labs/dqx/checks_resolver.py index 1e08ca544..0c410776b 100644 --- a/src/databricks/labs/dqx/checks_resolver.py +++ b/src/databricks/labs/dqx/checks_resolver.py @@ -32,7 +32,8 @@ def resolve_check_function( logger.debug(f"Resolving function: {function_name}") func = getattr(check_funcs, function_name, None) # resolve using predefined checks first if not func: - func = getattr(geo_check_funcs, function_name, None) # resolve using prefedined geo checks + # resolve using predefined geo checks, requires Databricks serverless or DBR >= 17.1 + func = getattr(geo_check_funcs, function_name, None) if not func and custom_check_functions: func = custom_check_functions.get(function_name) # returns None if not found if fail_on_missing and not func: From 6a5265d35be62f0ba7f602937e8cb7e33d21a9e0 Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 3 Oct 2025 11:24:02 +0200 Subject: [PATCH 63/64] updated demo --- demos/dqx_demo_tool.py | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/demos/dqx_demo_tool.py b/demos/dqx_demo_tool.py index f1a599e54..cb356e5c7 100644 --- a/demos/dqx_demo_tool.py +++ b/demos/dqx_demo_tool.py @@ -70,14 +70,11 @@ # MAGIC # MAGIC Run in the terminal: # MAGIC ``` -# MAGIC # Run for all configured run configs (default) +# MAGIC # run for all configured run configs (default) # MAGIC databricks labs dqx profile # MAGIC -# MAGIC # Or run for a specific run config +# MAGIC # or run for a specific run config # MAGIC databricks labs dqx profile --run-config "default" -# MAGIC -# MAGIC # You can also run for tables/views matching wildcard patterns. -# MAGIC databricks labs dqx profile --run-config "default" --patterns "main.nytaxi.*;main.default.table" # MAGIC ``` # MAGIC # MAGIC This will profile the data defined in the `input_config` field of the run config. The generated quality rule candidates and summary statistics are saved in the installation folder as per the `checks_location`, `profiler_config` fields. @@ -89,14 +86,11 @@ # MAGIC # MAGIC Run in the terminal: # MAGIC ``` -# MAGIC # Run for all configured run configs (default) +# MAGIC # run for all configured run configs (default) # MAGIC databricks labs dqx apply-checks # MAGIC -# MAGIC # Or run for a specific run config +# MAGIC # or run for a specific run config # MAGIC databricks labs dqx apply-checks --run-config "default" -# MAGIC -# MAGIC # You can also run for tables/views matching wildcard patterns. -# MAGIC databricks labs dqx apply-checks --run-config "default" --patterns "main.nytaxi.*;main.default.table" # MAGIC ``` # MAGIC # MAGIC This will apply quality checks defined in the `checks_location` field of the run config to the data defined in the `input_config`. The results are written to the output as defined in the `output_config` and `quarantine_config` fields. @@ -110,14 +104,11 @@ # MAGIC # MAGIC Run in the terminal: # MAGIC ``` -# MAGIC # Run for all configured run configs (default) +# MAGIC # run for all configured run configs (default) # MAGIC databricks labs dqx e2e # MAGIC -# MAGIC # Or run for a specific run config +# MAGIC # or run for a specific run config # MAGIC databricks labs dqx e2e --run-config "default" -# MAGIC -# MAGIC # You can also run for tables/views matching wildcard patterns. -# MAGIC databricks labs dqx e2e --run-config "default" --patterns "main.nytaxi.*;main.default.table" # MAGIC ``` # MAGIC # MAGIC This will use the settings from the profiler and quality checker as explained before. From b217ac9a88f92bdc5b5ae6b5cb97c0ff509dc50f Mon Sep 17 00:00:00 2001 From: Marcin Wojtyczka Date: Fri, 3 Oct 2025 13:05:56 +0200 Subject: [PATCH 64/64] refactor, updated docs --- docs/dqx/docs/guide/data_profiling.mdx | 4 +- docs/dqx/docs/guide/index.mdx | 12 ++-- docs/dqx/docs/guide/quality_checks_apply.mdx | 26 ++++----- docs/dqx/docs/installation.mdx | 4 +- docs/dqx/docs/reference/quality_checks.mdx | 4 +- .../labs/dqx/contexts/workflow_context.py | 14 ++++- .../labs/dqx/profiler/profiler_runner.py | 11 +++- .../labs/dqx/profiler/profiler_workflow.py | 4 +- .../labs/dqx/quality_checker/e2e_workflow.py | 4 +- .../quality_checker_workflow.py | 4 +- src/databricks/labs/dqx/rule.py | 2 +- tests/integration/test_e2e_workflow.py | 12 ++-- tests/integration/test_profiler_workflow.py | 56 +++++++++---------- .../test_quality_checker_workflow.py | 8 +-- tests/unit/test_utils.py | 4 ++ 15 files changed, 94 insertions(+), 75 deletions(-) diff --git a/docs/dqx/docs/guide/data_profiling.mdx b/docs/dqx/docs/guide/data_profiling.mdx index 15c62e739..ad5b00878 100644 --- a/docs/dqx/docs/guide/data_profiling.mdx +++ b/docs/dqx/docs/guide/data_profiling.mdx @@ -292,8 +292,8 @@ databricks labs dqx open-remote-config ``` The following fields from the [configuration file](/docs/installation/#configuration-file) are used by the profiler workflow: -- `input_config`: configuration for the input data. 'location' is skipped when the workflow is executed for patterns. -- `checks_location`: absolute or relative location (relative to the installation folder) to the generated quality rule candidates as 'yaml' or 'json' file (default: 'checks.yml'). Skipped for non-table based locations when the workflow is executed for patterns. +- `input_config`: configuration for the input data. 'location' is autogenerated when the workflow is executed for patterns. +- `checks_location`: location of the quality checks in storage. Autogenerated when the workflow is executed for patterns. - `profiler_config`: configuration for the profiler containing: - `summary_stats_file`: relative location within the installation folder of the summary statistics (default: 'profile_summary.yml') - `sample_fraction`: fraction of data to sample for profiling. diff --git a/docs/dqx/docs/guide/index.mdx b/docs/dqx/docs/guide/index.mdx index 3d315bffa..0d736108a 100644 --- a/docs/dqx/docs/guide/index.mdx +++ b/docs/dqx/docs/guide/index.mdx @@ -26,12 +26,12 @@ For more details, see the [Installation Guide](/docs/installation/). **Integration options:** -| Task | Integration with processing pipelines | Execution | Description | -|-------------------------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Profiling and quality checks generation** | Programmatic approach (Code-level integration) | Use methods of `DQXProfiler` and `DQGenerator` or `DQDltGenerator` classes. | Profile input data and generate quality rules candidates. `DQEngine` can be used to save the generated checks to a storage. For more details, see the [Profiling Guide](/docs/guide/data_profiling/#programmatic-approach). | -| **Profiling and quality checks generation** | No-code approach (Workflow). Requires installation as a workspace tool. | Use `profiler` workflow (triggered from Databricks CLI or Databricks UI). | Profile input data and generate quality rules candidates. Input data and quality checks storage configured in the [configuration file](/docs/installation/#configuration-file). By default, the workflow runs for all defined run configs, but it can be parameterized to target a specific run config. For more details, see the [Profiling Guide](/docs/guide/data_profiling/#no-code-approach-profiler-workflow). | -| **Quality Checking** | Programmatic approach (Code-level integration) | Use methods of `DQEngine` class. | Offers loading checks from various storage backends, applying quality checks, saving results, as well as end-to-end methods running all the steps in a single method call (load checks > apply checks > save results). For more details, see the [Applying Checks Guide](/docs/guide/quality_checks_apply/). | -| **Quality Checking** | No-code approach (Workflow). Requires installation as a workspace tool. | Use `quality-checker` and `e2e` workflows (triggered from Databricks CLI or Databricks UI). | Offers quality checker workflow (load checks > apply checks > save results) and e2e (end-to-end) workflow (profile input data and generate quality checks > apply checks > save results). Input and output data, and quality checks storage configured in the [configuration file](/docs/installation/#configuration-file). By default, the workflow runs for all defined run configs, but it can be parameterized to target a specific run config. For more details, see the [Applying Checks Guide](/docs/guide/quality_checks_apply/#no-code-approach-workflows). | +| Task | Integration with processing pipelines | Execution | Description | +|-------------------------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |d +| **Profiling and quality checks generation** | Programmatic approach (Code-level integration) | Use methods of `DQXProfiler` and `DQGenerator` or `DQDltGenerator` classes. | Profile input data and generate quality rules candidates. `DQEngine` can be used to save the generated checks to a storage. For more details, see the [Profiling Guide](/docs/guide/data_profiling/#programmatic-approach). | +| **Profiling and quality checks generation** | No-code approach (Workflow). Requires installation as a workspace tool. | Use `profiler` workflow (triggered from Databricks CLI or Databricks UI). | Profile input data and generate quality rules candidates. Input data and quality checks storage configured in the [configuration file](/docs/installation/#configuration-file). By default, the workflow runs for all defined run configs, but it can be parameterized to target a specific run config or wildcard patterns. For more details, see the [Profiling Guide](/docs/guide/data_profiling/#no-code-approach-profiler-workflow). | +| **Quality Checking** | Programmatic approach (Code-level integration) | Use methods of `DQEngine` class. | Offers loading checks from various storage backends, applying quality checks, saving results, as well as end-to-end methods running all the steps in a single method call (load checks > apply checks > save results). For more details, see the [Applying Checks Guide](/docs/guide/quality_checks_apply/). | +| **Quality Checking** | No-code approach (Workflow). Requires installation as a workspace tool. | Use `quality-checker` and `e2e` workflows (triggered from Databricks CLI or Databricks UI). | Offers quality checker workflow (load checks > apply checks > save results) and e2e (end-to-end) workflow (profile input data and generate quality checks > apply checks > save results). Input and output data, and quality checks storage configured in the [configuration file](/docs/installation/#configuration-file). By default, the workflow runs for all defined run configs, but it can be parameterized to target a specific run config or wildcard patterns. For more details, see the [Applying Checks Guide](/docs/guide/quality_checks_apply/#no-code-approach-workflows). | The no-code approach using Workflows will be preferred for less technical users wanting to run quality checks on existing data stored in tables. It provides a user-friendly interface to execute quality checks without needing to write any code. The code-level approach is more flexible and allows for more complex scenarios, such as integrating quality checks directly into data processing pipelines. diff --git a/docs/dqx/docs/guide/quality_checks_apply.mdx b/docs/dqx/docs/guide/quality_checks_apply.mdx index b6de06673..d310acd62 100644 --- a/docs/dqx/docs/guide/quality_checks_apply.mdx +++ b/docs/dqx/docs/guide/quality_checks_apply.mdx @@ -595,10 +595,10 @@ databricks labs dqx logs --workflow quality-checker ``` The following fields from the [configuration file](/docs/installation/#configuration-file) are used by the quality checker workflow: -- `input_config`: configuration for the input data. 'location' is skipped when the workflow is executed for patterns. -- `output_config`: configuration for the output data. 'location' is skipped when the workflow is executed for patterns. -- `quarantine_config`: (optional) configuration for the quarantine data. 'location' is skipped when the workflow is executed for patterns. -- `checks_location`: location of the quality checks in storage. Skipped for non-table based locations when the workflow is executed for patterns. +- `input_config`: configuration for the input data. 'location' is autogenerated when the workflow is executed for patterns. +- `output_config`: configuration for the output data. 'location' is autogenerated when the workflow is executed for patterns. +- `quarantine_config`: (optional) configuration for the quarantine data. 'location' is autogenerated when the workflow is executed for patterns. +- `checks_location`: location of the quality checks in storage. Autogenerated when the workflow is executed for patterns. - `serverless_clusters`: whether to use serverless clusters for running the workflow (default: `true`). Using serverless clusters is recommended as it allows for automated cluster management and scaling. - `quality_checker_spark_conf`: (optional) spark configuration to use for the workflow, only applicable if `serverless_clusters` is set to `false`. - `quality_checker_override_clusters`: optional cluster configuration to use for the workflow, only applicable if `serverless_clusters` is set to `false`. @@ -634,8 +634,8 @@ Example of the configuration file (relevant fields only): # availableNow: true custom_check_functions: # optional my_func: custom_checks/my_funcs.py # relative workspace path (installation folder prefix applied) - my_other: /Workspace/Shared/MyApp/my_funcs.py # absolute workspace path - email_mask: /Volumes/main/dqx_utils/custom/email.py # UC Volume path + my_other: /Workspace/Shared/MyApp/my_funcs.py # or absolute workspace path + email_mask: /Volumes/main/dqx_utils/custom/email.py # or UC Volume path reference_tables: # optional reference_vendor: input_config: @@ -666,7 +666,7 @@ databricks labs dqx e2e --run-config "default" # * Run config from configuration file is used as a template for all relevant fields except location # * Input table location is derived from the patterns # * For table-based checks location, checks are saved/loaded from the specified table -# * For file-based checks location, file in the path is replaced with <input_table>.yml. In addition, if the location is specified as a relative path, it is prefixed with the installation folder +# * For file-based checks location, file in the path is replaced with .yml. In addition, if the location is specified as a relative path, it is prefixed with the installation folder # * For output and quarantine tables location, use _dq_output and _dq_quarantine suffixes # * By default, output and quarantine tables are excluded based on suffixes # * Default for output table suffix is "_dq_output" @@ -713,10 +713,10 @@ databricks labs dqx logs --workflow quality-checker ``` The following fields from the [configuration file](/docs/installation/#configuration-file) are used by e2e workflow: -- `input_config`: configuration for the input data. 'location' is skipped when the workflow is executed for patterns. -- `output_config`: configuration for the output data. 'location' is skipped when the workflow is executed for patterns. -- `quarantine_config`: (optional) configuration for the quarantine data. 'location' is skipped when the workflow is executed for patterns. -- `checks_location`: location of the quality checks in storage. Skipped for non-table based locations when the workflow is executed for patterns. +- `input_config`: configuration for the input data. 'location' is autogenerated when the workflow is executed for patterns. +- `output_config`: configuration for the output data. 'location' is autogenerated when the workflow is executed for patterns. +- `quarantine_config`: (optional) configuration for the quarantine data. 'location' is autogenerated when the workflow is executed for patterns. +- `checks_location`: location of the quality checks in storage. Autogenerated when the workflow is executed for patterns. - `serverless_clusters`: whether to use serverless clusters for running the workflow (default: `true`). Using serverless clusters is recommended as it allows for automated cluster management and scaling. - `e2e_spark_conf`: (optional) spark configuration to use for the e2e workflow, only applicable if `serverless_clusters` is set to `false`. - `e2e_override_clusters`: (optional) cluster configuration to use for the e2e workflow, only applicable if `serverless_clusters` is set to `false`. @@ -768,8 +768,8 @@ Example of the configuration file (relevant fields only): summary_stats_file: profile_summary_stats.yml custom_check_functions: # optional my_func: custom_checks/my_funcs.py # relative workspace path (installation folder prefix applied) - my_other: /Workspace/Shared/MyApp/my_funcs.py # absolute workspace path - email_mask: /Volumes/main/dqx_utils/custom/email.py # UC Volume path + my_other: /Workspace/Shared/MyApp/my_funcs.py # or absolute workspace path + email_mask: /Volumes/main/dqx_utils/custom/email.py # or UC Volume path reference_tables: # optional reference_vendor: input_config: diff --git a/docs/dqx/docs/installation.mdx b/docs/dqx/docs/installation.mdx index 7977deaac..aba0971e5 100644 --- a/docs/dqx/docs/installation.mdx +++ b/docs/dqx/docs/installation.mdx @@ -214,8 +214,8 @@ run_configs: # <- list of run configurations, each run co custom_check_functions: # <- optional mapping of custom check function name to Python file (module) containing check function definition my_func: custom_checks/my_funcs.py # relative workspace path (installation folder prefix applied) - my_other: /Workspace/Shared/MyApp/my_funcs.py # absolute workspace path - email_mask: /Volumes/main/dqx_utils/custom/email.py # UC volume path + my_other: /Workspace/Shared/MyApp/my_funcs.py # or absolute workspace path + email_mask: /Volumes/main/dqx_utils/custom/email.py # or UC volume path reference_tables: # <- optional mapping of reference table names to reference table locations (e.g. required for foreign key check) reference_table_1: # <- name of the reference table diff --git a/docs/dqx/docs/reference/quality_checks.mdx b/docs/dqx/docs/reference/quality_checks.mdx index 1f67f8abd..ad0dbdc43 100644 --- a/docs/dqx/docs/reference/quality_checks.mdx +++ b/docs/dqx/docs/reference/quality_checks.mdx @@ -2321,8 +2321,8 @@ You need to reference the module containing custom functions in the run config o ``` custom_check_functions: my_func: custom_checks/my_funcs.py # relative workspace path (installation folder prefix applied) - my_other: /Workspace/Shared/MyApp/my_funcs.py # absolute workspace path - email_mask: /Volumes/main/dqx_utils/custom/email.py # UC volume path + my_other: /Workspace/Shared/MyApp/my_funcs.py # or absolute workspace path + email_mask: /Volumes/main/dqx_utils/custom/email.py # or UC volume path ``` ### Custom row-level checks using Window functions (for group of rows) diff --git a/src/databricks/labs/dqx/contexts/workflow_context.py b/src/databricks/labs/dqx/contexts/workflow_context.py index d37e7f7b5..e5e413483 100644 --- a/src/databricks/labs/dqx/contexts/workflow_context.py +++ b/src/databricks/labs/dqx/contexts/workflow_context.py @@ -47,6 +47,16 @@ def run_config_name(self) -> str | None: """Returns run configuration name.""" return self.named_parameters.get("run_config_name") + @cached_property + def runnable_for_patterns(self) -> bool: + """Returns run configuration name.""" + return bool(self.patterns and self.run_config_name) + + @cached_property + def runnable_for_run_config(self) -> bool: + """Returns run configuration name.""" + return bool(self.run_config_name) + @cached_property def patterns(self) -> str | None: """Returns semicolon delimited list of location patterns to use.""" @@ -173,13 +183,13 @@ def _get_resolved_checks_location(self, checks_location: str) -> str: Args: checks_location: The original checks location. - Returns: The resolved checks location. + Returns: """ if is_table_location(checks_location): return checks_location - if self.patterns and self.run_config_name: # don't need file name for pattern based execution + if self.runnable_for_patterns: # don't need file name for pattern based execution checks_location = safe_strip_file_from_path(checks_location) if checks_location.startswith("/") or checks_location.startswith("/Volumes/"): diff --git a/src/databricks/labs/dqx/profiler/profiler_runner.py b/src/databricks/labs/dqx/profiler/profiler_runner.py index dd04c7177..180c08e77 100644 --- a/src/databricks/labs/dqx/profiler/profiler_runner.py +++ b/src/databricks/labs/dqx/profiler/profiler_runner.py @@ -18,6 +18,8 @@ from databricks.labs.dqx.profiler.profiler import DQProfiler from databricks.labs.blueprint.installation import Installation +from databricks.labs.dqx.utils import safe_strip_file_from_path + logger = logging.getLogger(__name__) @@ -101,8 +103,7 @@ def run_for_patterns( patterns: List of table patterns to profile (e.g. ["catalog.schema.table*"]). exclude_patterns: List of table patterns to exclude from profiling (e.g. ["*output", "*quarantine"]). profiler_config: Profiler configuration. - checks_location: Delta table to save the generated checks, - otherwise checks are saved under checks/{table_name}.yml. + checks_location: Delta table to save the generated checks, otherwise an absolute directory. install_folder: Installation folder path. product: Product name for the installation. max_parallelism: Maximum number of parallel threads to use for profiling. @@ -130,7 +131,11 @@ def run_for_patterns( logger.info(f"Generated summary statistics: \n{summary_stats}") storage_config = InstallationChecksStorageConfig( - location=checks_location if is_table_location(checks_location) else f"{checks_location}/{table}.yml", + location=( + checks_location + if is_table_location(checks_location) + else f"{safe_strip_file_from_path(checks_location)}/{table}.yml" + ), overwrite_location=True, product_name=product, install_folder=install_folder, diff --git a/src/databricks/labs/dqx/profiler/profiler_workflow.py b/src/databricks/labs/dqx/profiler/profiler_workflow.py index 645ad8445..59ea50246 100644 --- a/src/databricks/labs/dqx/profiler/profiler_workflow.py +++ b/src/databricks/labs/dqx/profiler/profiler_workflow.py @@ -32,7 +32,7 @@ def profile(self, ctx: WorkflowContext): Raises: InvalidConfigError: If no input data source is configured during installation. """ - if ctx.patterns and ctx.run_config_name: + if ctx.runnable_for_patterns: logger.info(f"Running profiler workflow for patterns: {ctx.patterns}") patterns, exclude_patterns = ctx.resolved_patterns run_config = ctx.run_config @@ -46,7 +46,7 @@ def profile(self, ctx: WorkflowContext): install_folder=ctx.installation.install_folder(), max_parallelism=ctx.config.profiler_max_parallelism, ) - elif ctx.run_config_name: + elif ctx.runnable_for_run_config: self._profile_for_run_config(ctx, ctx.run_config) else: logger.info("Running profiler workflow for all run configs") diff --git a/src/databricks/labs/dqx/quality_checker/e2e_workflow.py b/src/databricks/labs/dqx/quality_checker/e2e_workflow.py index 2b8a338e4..ce28b26eb 100644 --- a/src/databricks/labs/dqx/quality_checker/e2e_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/e2e_workflow.py @@ -75,9 +75,9 @@ def _log_task_run_info(ctx: WorkflowContext, task_name: str): ctx (WorkflowContext): Runtime context. task_name (str): Name of the task being executed. """ - if ctx.patterns and ctx.run_config_name: + if ctx.runnable_for_patterns: logger.info(f"End-to-end: {task_name} for patterns: {ctx.patterns}") - elif ctx.run_config_name: + elif ctx.runnable_for_run_config: logger.info(f"End-to-end: {task_name} for run config: {ctx.run_config.name}") else: logger.info(f"End-to-end: {task_name} for all run configs") diff --git a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py index cabc8b4e2..cadd830d7 100644 --- a/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py +++ b/src/databricks/labs/dqx/quality_checker/quality_checker_workflow.py @@ -27,7 +27,7 @@ def apply_checks(self, ctx: WorkflowContext): Args: ctx: Runtime context. """ - if ctx.patterns and ctx.run_config_name: + if ctx.runnable_for_patterns: logger.info(f"Running data quality workflow for patterns: {ctx.patterns}") run_config = ctx.run_config patterns, exclude_patterns = ctx.resolved_patterns @@ -40,7 +40,7 @@ def apply_checks(self, ctx: WorkflowContext): quarantine_table_suffix=ctx.quarantine_table_suffix, max_parallelism=ctx.config.quality_checker_max_parallelism, ) - elif ctx.run_config_name: + elif ctx.runnable_for_run_config: logger.info(f"Running data quality workflow for run config: {ctx.run_config_name}") ctx.quality_checker.run([ctx.run_config]) else: diff --git a/src/databricks/labs/dqx/rule.py b/src/databricks/labs/dqx/rule.py index fa90a6a93..96275bc53 100644 --- a/src/databricks/labs/dqx/rule.py +++ b/src/databricks/labs/dqx/rule.py @@ -114,7 +114,7 @@ def _validate_rule_type(self, check_func: Callable) -> None: In this context: - The **_expected_rule_type** indicates the type the check function must be registered as (e.g., "raw", "dataset"). - - If the check function is registered with a different type, a InvalidCheckError is raised. + - If the check function is registered with a different type, an InvalidCheckError is raised. - The error message advises to use the provided **_alternative_rules** (e.g., "DQRowRule", "DQDatasetRule"). Args: diff --git a/tests/integration/test_e2e_workflow.py b/tests/integration/test_e2e_workflow.py index 7b6785bbd..d1a71ecd6 100644 --- a/tests/integration/test_e2e_workflow.py +++ b/tests/integration/test_e2e_workflow.py @@ -131,7 +131,7 @@ def test_e2e_workflow_for_patterns( first_table = run_config.input_config.location catalog_name, schema_name, _ = first_table.split('.') - second_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) + second_table = _make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) installation_ctx.deployed_workflows.run_workflow( "e2e", run_config_name=run_config.name, patterns=f"{catalog_name}.{schema_name}.*" @@ -174,7 +174,7 @@ def test_e2e_workflow_for_patterns_exclude_patterns( first_table = run_config.input_config.location catalog_name, schema_name, _ = first_table.split('.') - exclude_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) + exclude_table = _make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) installation_ctx.deployed_workflows.run_workflow( workflow="e2e", @@ -221,10 +221,10 @@ def test_e2e_workflow_for_patterns_exclude_output( output_table_suffix = "_output" quarantine_table_suffix = "_quarantine" - existing_output_table = make_second_input_table( + existing_output_table = _make_second_input_table( spark, catalog_name, schema_name, first_table, make_random, output_table_suffix ) - existing_quarantine_table = make_second_input_table( + existing_quarantine_table = _make_second_input_table( spark, catalog_name, schema_name, first_table, make_random, quarantine_table_suffix ) @@ -284,7 +284,7 @@ def test_e2e_workflow_for_patterns_table_checks_storage( run_config.checks_location = f"{catalog_name}.{schema_name}.checks" installation_ctx.installation.save(config) - second_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) + second_table = _make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) installation_ctx.deployed_workflows.run_workflow( "e2e", run_config_name=run_config.name, patterns=f"{catalog_name}.{schema_name}.*" @@ -322,7 +322,7 @@ def test_e2e_workflow_for_patterns_table_checks_storage( assert checked_df.count() == input_df.count(), "Second output table is empty" -def make_second_input_table(spark, catalog_name, schema_name, first_table, make_random, suffix=""): +def _make_second_input_table(spark, catalog_name, schema_name, first_table, make_random, suffix=""): second_table = f"{catalog_name}.{schema_name}.dummy_t{make_random(4).lower()}{suffix}" spark.table(first_table).write.format("delta").mode("overwrite").saveAsTable(second_table) return second_table diff --git a/tests/integration/test_profiler_workflow.py b/tests/integration/test_profiler_workflow.py index 618218db9..b07317ce2 100644 --- a/tests/integration/test_profiler_workflow.py +++ b/tests/integration/test_profiler_workflow.py @@ -158,7 +158,7 @@ def test_profiler_workflow_for_patterns(ws, spark, setup_workflows, make_table, first_table = run_config.input_config.location catalog_name, schema_name, _ = first_table.split('.') - second_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) + second_table = _make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) # run profiler for all tables in the schema installation_ctx.deployed_workflows.run_workflow( @@ -187,7 +187,7 @@ def test_profiler_workflow_for_patterns_with_exclude_patterns(ws, spark, setup_w first_table = run_config.input_config.location catalog_name, schema_name, _ = first_table.split('.') - exclude_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) + exclude_table = _make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) # run profiler for all tables in the schema installation_ctx.deployed_workflows.run_workflow( @@ -228,10 +228,10 @@ def test_profiler_workflow_for_patterns_exclude_output(ws, spark, setup_workflow output_table_suffix = "_output" quarantine_table_suffix = "_quarantine" - exclude_output_table = make_second_input_table( + exclude_output_table = _make_second_input_table( spark, catalog_name, schema_name, first_table, make_random, output_table_suffix ) - exclude_quarantine_table = make_second_input_table( + exclude_quarantine_table = _make_second_input_table( spark, catalog_name, schema_name, first_table, make_random, quarantine_table_suffix ) @@ -267,28 +267,6 @@ def test_profiler_workflow_for_patterns_exclude_output(ws, spark, setup_workflow engine.load_checks(config=workspace_file_storage_config) -def test_profiler_workflow_filter_out_all_data(ws, spark, setup_workflows, make_table, make_random): - installation_ctx, run_config = setup_workflows() - - config = installation_ctx.config - run_config = config.get_run_config() - run_config.profiler_config.filter = "id = 0" # filter that removes all data - installation_ctx.installation.save(config) - - # run profiler for all tables in the schema - installation_ctx.deployed_workflows.run_workflow( - workflow="profiler", - run_config_name=run_config.name, - ) - - workspace_file_storage_config = WorkspaceFileChecksStorageConfig( - location=f"{installation_ctx.installation.install_folder()}/{run_config.checks_location}", - ) - engine = DQEngine(ws, spark) - checks = engine.load_checks(config=workspace_file_storage_config) - assert checks == [], "Checks should be empty when profiling an empty input dataset" - - def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_workflows, make_table, make_random): installation_ctx, run_config = setup_workflows() @@ -301,7 +279,7 @@ def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_wo run_config.checks_location = f"{catalog_name}.{schema_name}.checks" installation_ctx.installation.save(config) - second_table_full_name = make_second_input_table( + second_table_full_name = _make_second_input_table( spark, catalog_name, schema_name, first_table_full_name, make_random ) @@ -329,7 +307,29 @@ def test_profiler_workflow_for_patterns_table_checks_storage(ws, spark, setup_wo assert checks, f"Checks for {second_table_full_name} were not generated" -def make_second_input_table(spark, catalog_name, schema_name, source_table, make_random, suffix=""): +def test_profiler_workflow_filter_out_all_data(ws, spark, setup_workflows, make_table, make_random): + installation_ctx, run_config = setup_workflows() + + config = installation_ctx.config + run_config = config.get_run_config() + run_config.profiler_config.filter = "id = 0" # filter that removes all data + installation_ctx.installation.save(config) + + # run profiler for all tables in the schema + installation_ctx.deployed_workflows.run_workflow( + workflow="profiler", + run_config_name=run_config.name, + ) + + workspace_file_storage_config = WorkspaceFileChecksStorageConfig( + location=f"{installation_ctx.installation.install_folder()}/{run_config.checks_location}", + ) + engine = DQEngine(ws, spark) + checks = engine.load_checks(config=workspace_file_storage_config) + assert checks == [], "Checks should be empty when profiling an empty input dataset" + + +def _make_second_input_table(spark, catalog_name, schema_name, source_table, make_random, suffix=""): target_table = f"{catalog_name}.{schema_name}.dummy_t{make_random(4).lower()}{suffix}" spark.table(source_table).write.format("delta").mode("overwrite").saveAsTable(target_table) return target_table diff --git a/tests/integration/test_quality_checker_workflow.py b/tests/integration/test_quality_checker_workflow.py index 47e1063a3..02df7cca2 100644 --- a/tests/integration/test_quality_checker_workflow.py +++ b/tests/integration/test_quality_checker_workflow.py @@ -334,7 +334,7 @@ def test_quality_checker_workflow_for_patterns( first_table = run_config.input_config.location catalog_name, schema_name, _ = first_table.split('.') - second_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) + second_table = _make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) dq_engine = DQEngine(ws, spark) checks = dq_engine.load_checks( @@ -375,7 +375,7 @@ def test_quality_checker_workflow_for_patterns_exclude_patterns( first_table = run_config.input_config.location catalog_name, schema_name, _ = first_table.split('.') - exclude_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) + exclude_table = _make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) dq_engine = DQEngine(ws, spark) checks = dq_engine.load_checks( @@ -486,7 +486,7 @@ def test_quality_checker_workflow_for_patterns_table_checks_storage( run_config.checks_location = checks_table installation_ctx.installation.save(config) - second_table = make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) + second_table = _make_second_input_table(spark, catalog_name, schema_name, first_table, make_random) dq_engine = DQEngine(ws, spark) checks = dq_engine.load_checks( @@ -514,7 +514,7 @@ def test_quality_checker_workflow_for_patterns_table_checks_storage( assert_df_equality(checked_df, expected_quality_checking_output, ignore_nullable=True) -def make_second_input_table(spark, catalog_name, schema_name, first_table, make_random, suffix=""): +def _make_second_input_table(spark, catalog_name, schema_name, first_table, make_random, suffix=""): second_table = f"{catalog_name}.{schema_name}.dummy_t{make_random(4).lower()}{suffix}" spark.table(first_table).write.format("delta").mode("overwrite").saveAsTable(second_table) return second_table diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 1350ef39d..a2acc39e9 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -358,6 +358,10 @@ def test_get_reference_dataframes_with_missing_ref_tables() -> None: "/Users/marcin.wojtyczka@databricks.com/.corespondency-predeterminer/", "/Users/marcin.wojtyczka@databricks.com/.corespondency-predeterminer", ), + ( + "/Volume/catalog/schema/dir/checks.json", + "/Volume/catalog/schema/dir", + ), ], ) def test_safe_strip_file_from_path(path: str, expected: str):