From 7a6aa503317380f0f95d7e75605cae0fc53d4a4d Mon Sep 17 00:00:00 2001 From: "george.robertson1" <50412379+georgeRobertson@users.noreply.github.com> Date: Thu, 5 Mar 2026 20:03:49 +0000 Subject: [PATCH 1/2] fix: enable passing of original_entity_override to fix instance where id cannot be sourced from current entity --- .../core_engine/backends/implementations/duckdb/rules.py | 2 +- .../core_engine/backends/implementations/spark/rules.py | 2 +- src/dve/core_engine/backends/metadata/reporting.py | 7 +++++++ src/dve/core_engine/configuration/v1/filters.py | 2 ++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/dve/core_engine/backends/implementations/duckdb/rules.py b/src/dve/core_engine/backends/implementations/duckdb/rules.py index e556c6b..b366f6b 100644 --- a/src/dve/core_engine/backends/implementations/duckdb/rules.py +++ b/src/dve/core_engine/backends/implementations/duckdb/rules.py @@ -518,7 +518,7 @@ def notify(self, entities: DuckDBEntities, *, config: Notification) -> Messages: messages.append( FeedbackMessage( entity=config.reporting.reporting_entity_override or config.entity_name, - original_entity=config.entity_name, + original_entity=config.reporting.original_entity_override or config.entity_name, record=record, # type: ignore error_location=config.reporting.legacy_location, error_message=template_object(config.reporting.message, record), # type: ignore diff --git a/src/dve/core_engine/backends/implementations/spark/rules.py b/src/dve/core_engine/backends/implementations/spark/rules.py index 15afa09..abd8ea2 100644 --- a/src/dve/core_engine/backends/implementations/spark/rules.py +++ b/src/dve/core_engine/backends/implementations/spark/rules.py @@ -412,7 +412,7 @@ def notify(self, entities: SparkEntities, *, config: Notification) -> Messages: # more complex extraction done in reporting module FeedbackMessage( entity=config.reporting.reporting_entity_override or config.entity_name, - original_entity=config.entity_name, + original_entity=config.reporting.original_entity_override or config.entity_name, record=record.asDict(recursive=True), error_location=config.reporting.legacy_location, error_message=template_object( diff --git a/src/dve/core_engine/backends/metadata/reporting.py b/src/dve/core_engine/backends/metadata/reporting.py index cc0aed4..3989a13 100644 --- a/src/dve/core_engine/backends/metadata/reporting.py +++ b/src/dve/core_engine/backends/metadata/reporting.py @@ -10,6 +10,7 @@ from dve.core_engine.templating import template_object from dve.core_engine.type_hints import ( + EntityName, ErrorCategory, ErrorCode, ErrorEmitValue, @@ -102,6 +103,12 @@ class BaseReportingConfig(BaseModel): If this is not provided, the top level names from the `location` field will be used in the report. + """ + original_entity_override: Optional[EntityName] = None + """ + This should only be populated where you need to refer back to an originally defined entity that + contains the key field(s) of interest. This might be required in cases where you've created + lots of new entities during a complex rule. """ def template( diff --git a/src/dve/core_engine/configuration/v1/filters.py b/src/dve/core_engine/configuration/v1/filters.py index c25bca4..e96aad2 100644 --- a/src/dve/core_engine/configuration/v1/filters.py +++ b/src/dve/core_engine/configuration/v1/filters.py @@ -24,6 +24,7 @@ class ConcreteFilterConfig(BaseModel): reporting_field: Optional[Union[str, list[str]]] = None reporting_field_name: Optional[str] = None category: ErrorCategory = "Bad value" + original_entity_override: Optional[str] = None def to_step(self) -> AbstractStep: """Create a deferred filter from the concrete filter config.""" @@ -37,6 +38,7 @@ def to_step(self) -> AbstractStep: legacy_is_informational=self.is_informational, legacy_location=self.error_location, legacy_reporting_field=self.reporting_field, + original_entity_override=self.original_entity_override, ) return DeferredFilter( From 46afde3302cdcb20b9ebf0115e02c2b2446dea44 Mon Sep 17 00:00:00 2001 From: "george.robertson1" <50412379+georgeRobertson@users.noreply.github.com> Date: Thu, 12 Mar 2026 14:55:22 +0000 Subject: [PATCH 2/2] =?UTF-8?q?bump:=20version=200.7.0=20=E2=86=92=200.7.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 6 ++++++ pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0dfd3c7..b81b644 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## v0.7.1 (2026-03-12) + +### Fix + +- enable passing of original_entity_override to fix instance where id cannot be sourced from current entity + ## v0.7.0 (2026-03-12) ### Feat diff --git a/pyproject.toml b/pyproject.toml index 482c438..e338b23 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "data-validation-engine" -version = "0.7.0" +version = "0.7.1" description = "`nhs data validation engine` is a framework used to validate data" authors = ["NHS England "] readme = "README.md"