Skip to content

Commit a9bda7d

Browse files
feat: add error_report config to toggle record rejection reporting (#185)
1 parent 54f704b commit a9bda7d

4 files changed

Lines changed: 36 additions & 8 deletions

File tree

‎src/dve/core_engine/configuration/v1/__init__.py‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,13 +248,21 @@ class V1TransformationConfig(BaseModel):
248248
"""Complex rules."""
249249

250250

251+
class V1ErrorReportConfig(BaseModel):
252+
"""Configuration for the error report component of the dataset."""
253+
254+
record_rejection_reporting: bool = True
255+
256+
251257
class V1EngineConfig(BaseEngineConfig):
252258
"""A loader for the first version of the configuration language."""
253259

254260
contract: V1DataContractConfig
255261
"""The data contract configuration."""
256262
transformations: V1TransformationConfig = Field(default_factory=V1TransformationConfig)
257263
"""The transformation/rules configuration."""
264+
error_report: V1ErrorReportConfig = Field(default_factory=V1ErrorReportConfig)
265+
"""The error report configuration."""
258266
_rule_store_rules: dict[RuleName, BusinessComponentSpecConfigUnion] = PrivateAttr(
259267
default_factory=dict
260268
)

‎src/dve/pipeline/pipeline.py‎

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from collections import defaultdict
88
from collections.abc import Generator, Iterable, Iterator
99
from concurrent.futures import Executor, Future, ThreadPoolExecutor
10-
from functools import lru_cache
1110
from itertools import starmap
1211
from threading import Lock
1312
from typing import Any, Optional, Union
@@ -35,6 +34,7 @@
3534
from dve.core_engine.backends.readers.utilities import get_all_model_fields
3635
from dve.core_engine.backends.types import EntityType
3736
from dve.core_engine.backends.utilities import stringify_model
37+
from dve.core_engine.configuration.v1 import V1ErrorReportConfig
3838
from dve.core_engine.configuration.v1.hierarchy import EntityHierarchy
3939
from dve.core_engine.exceptions import CriticalProcessingError
4040
from dve.core_engine.loggers import get_logger
@@ -886,8 +886,7 @@ def _publish_error_aggregates(self, submission_id: str, aggregates_df: pl.DataFr
886886
aggregates_df.write_parquet(output_uri)
887887
return output_uri
888888

889-
@lru_cache() # noqa: B019
890-
def _get_error_dataframes(self, submission_id: str):
889+
def _get_error_dataframes(self, submission_id: str, include_record_rejections: bool = True):
891890
if not self.processed_files_path:
892891
raise AttributeError("processed files path not provided")
893892

@@ -935,12 +934,19 @@ def _get_error_dataframes(self, submission_id: str):
935934
errors_dfs.append(df)
936935

937936
errors_df = pl.concat(errors_dfs, how="align") # type: ignore
937+
if not include_record_rejections:
938+
errors_df = errors_df.filter(
939+
pl.col("Type") != ErrorReportCategories.RECORD_REJECTION.reporting_name
940+
)
938941
aggregates = calculate_aggregates(errors_df)
939942

940943
return errors_df, aggregates
941944

942945
def error_report(
943-
self, submission_info: SubmissionInfo, submission_status: Optional[SubmissionStatus] = None
946+
self,
947+
submission_info: SubmissionInfo,
948+
submission_status: Optional[SubmissionStatus] = None,
949+
error_report_config: Optional[V1ErrorReportConfig] = None,
944950
) -> tuple[
945951
SubmissionInfo, SubmissionStatus, Optional[SubmissionStatisticsRecord], Optional[URI]
946952
]:
@@ -962,7 +968,13 @@ def error_report(
962968
raise AttributeError("processed files path not provided")
963969

964970
self._logger.info("Reading error dataframes")
965-
errors_df, aggregates = self._get_error_dataframes(submission_info.submission_id)
971+
if error_report_config is None:
972+
_, config, _ = load_config(submission_info.dataset_id, self.rules_path)
973+
error_report_config = config.error_report
974+
errors_df, aggregates = self._get_error_dataframes(
975+
submission_info.submission_id,
976+
error_report_config.record_rejection_reporting,
977+
)
966978

967979
if not submission_status.number_of_records:
968980
sub_stats = None
@@ -993,7 +1005,12 @@ def error_report(
9931005
summary_items = er.SummaryItems(
9941006
submission_status=submission_status,
9951007
summary_dict=summary_dict,
996-
row_headings=[e.reporting_name for e in ErrorReportCategories],
1008+
row_headings=[
1009+
e.reporting_name
1010+
for e in ErrorReportCategories
1011+
if error_report_config.record_rejection_reporting
1012+
or e != ErrorReportCategories.RECORD_REJECTION
1013+
],
9971014
)
9981015

9991016
workbook = er.ExcelFormat(

‎tests/features/animals.feature‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Feature: Pipeline tests using the animal dataset
2424
And The statistics entry for the submission shows the following information
2525
| parameter | value |
2626
| record_count | 5 |
27-
| number_record_rejections | 2 |
27+
| number_record_rejections | 0 |
2828
| number_warnings | 0 |
2929

3030
Scenario: Validate XML data with a mixture of error types in (duckdb)
@@ -55,5 +55,5 @@ Feature: Pipeline tests using the animal dataset
5555
| parameter | value |
5656
| record_count | 7 |
5757
| number_submission_rejections | 1 |
58-
| number_record_rejections | 2 |
58+
| number_record_rejections | 0 |
5959
| number_warnings | 1 |

‎tests/testdata/animals/animals.dischema.json‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,5 +50,8 @@
5050
"is_informational": true
5151
}
5252
]
53+
},
54+
"error_report": {
55+
"record_rejection_reporting": false
5356
}
5457
}

0 commit comments

Comments
 (0)