22
33from typing import Optional
44from dve .core_engine .backends .implementations .duckdb .duckdb_helpers import duckdb_get_entity_count , duckdb_write_parquet
5- from dve .core_engine .backends . utilities import dump_errors
5+ from dve .core_engine .exceptions import CriticalProcessingError
66from dve .core_engine .models import SubmissionInfo
77from dve .core_engine .type_hints import URI , Failed
88from dve .pipeline .duckdb_pipeline import DDBDVEPipeline
99from dve .pipeline .utils import SubmissionStatus
1010from dve .parser import file_handling as fh
11+ from dve .reporting .utils import dump_processing_errors
1112
13+ @duckdb_get_entity_count
14+ @duckdb_write_parquet
1215class FoundryDDBPipeline (DDBDVEPipeline ):
1316 """DuckDB pipeline for running on Foundry Platform"""
1417
@@ -27,46 +30,75 @@ def persist_audit_records(self, submission_info: SubmissionInfo) -> URI:
2730
2831 def file_transformation (
2932 self , submission_info : SubmissionInfo
30- ) -> SubmissionInfo | dict [ str , str ]:
33+ ) -> tuple [ SubmissionInfo , SubmissionStatus ]:
3134 try :
3235 return super ().file_transformation (submission_info )
3336 except Exception as exc : # pylint: disable=W0718
3437 self ._logger .error (f"File transformation raised exception: { exc } " )
3538 self ._logger .exception (exc )
36- return submission_info .dict ()
39+ dump_processing_errors (
40+ fh .joinuri (self .processed_files_path , submission_info .submission_id ),
41+ "file_transformation" ,
42+ [CriticalProcessingError .from_exception (exc )]
43+ )
44+ return submission_info , SubmissionStatus (processing_failed = True )
3745
38- def apply_data_contract (self , submission_info : SubmissionInfo ) -> tuple [SubmissionInfo | bool ]:
46+ def apply_data_contract (self , submission_info : SubmissionInfo , submission_status : SubmissionStatus ) -> tuple [SubmissionInfo | SubmissionStatus ]:
3947 try :
40- return super ().apply_data_contract (submission_info )
48+ return super ().apply_data_contract (submission_info , submission_status )
4149 except Exception as exc : # pylint: disable=W0718
4250 self ._logger .error (f"Apply data contract raised exception: { exc } " )
4351 self ._logger .exception (exc )
44- return submission_info , True
52+ dump_processing_errors (
53+ fh .joinuri (self .processed_files_path , submission_info .submission_id ),
54+ "contract" ,
55+ [CriticalProcessingError .from_exception (exc )]
56+ )
57+ return submission_info , SubmissionStatus (processing_failed = True )
4558
46- def apply_business_rules (self , submission_info : SubmissionInfo , failed : Failed ):
59+ def apply_business_rules (self , submission_info : SubmissionInfo , submission_status : SubmissionStatus ):
4760 try :
48- return super ().apply_business_rules (submission_info , failed )
61+ return super ().apply_business_rules (submission_info , submission_status )
4962 except Exception as exc : # pylint: disable=W0718
5063 self ._logger .error (f"Apply business rules raised exception: { exc } " )
5164 self ._logger .exception (exc )
52- return submission_info , SubmissionStatus (failed = True )
65+ dump_processing_errors (
66+ fh .joinuri (self .processed_files_path , submission_info .submission_id ),
67+ "business_rules" ,
68+ [CriticalProcessingError .from_exception (exc )]
69+ )
70+ return submission_info , SubmissionStatus (processing_failed = True )
71+
72+ def error_report (self , submission_info : SubmissionInfo , submission_status : SubmissionStatus ):
73+ try :
74+ return super ().error_report (submission_info , submission_status )
75+ except Exception as exc : # pylint: disable=W0718
76+ self ._logger .error (f"Error reports raised exception: { exc } " )
77+ self ._logger .exception (exc )
78+ sub_stats = None
79+ report_uri = None
80+ dump_processing_errors (
81+ fh .joinuri (self .processed_files_path , submission_info .submission_id ),
82+ "error_report" ,
83+ [CriticalProcessingError .from_exception (exc )]
84+ )
85+ return submission_info , submission_status , sub_stats , report_uri
5386
5487 def run_pipeline (self , submission_info : SubmissionInfo ) -> tuple [Optional [URI ], URI , URI ]:
5588 """Sequential single submission pipeline runner"""
5689 try :
5790 sub_id : str = submission_info .submission_id
5891 self ._audit_tables .add_new_submissions (submissions = [submission_info ])
5992 self ._audit_tables .mark_transform (submission_ids = [sub_id ])
60- sub_info = self .file_transformation (submission_info = submission_info )
61- if isinstance ( sub_info , SubmissionInfo ):
93+ sub_info , sub_status = self .file_transformation (submission_info = submission_info )
94+ if not ( sub_status . validation_failed or sub_status . processing_failed ):
6295 self ._audit_tables .mark_data_contract (submission_ids = [sub_id ])
63- sub_info , failed = self .apply_data_contract (submission_info = submission_info )
64- self ._audit_tables .mark_business_rules (submissions = [(sub_id , failed )])
96+ sub_info , sub_status = self .apply_data_contract (submission_info = sub_info , submission_status = sub_status )
97+ self ._audit_tables .mark_business_rules (submissions = [(sub_id , sub_status . validation_failed )])
6598 sub_info , sub_status = self .apply_business_rules (
66- submission_info = submission_info , failed = failed
99+ submission_info = submission_info , submission_status = sub_status
67100 )
68- else :
69- sub_status = SubmissionStatus (failed = True )
101+
70102 self ._audit_tables .mark_error_report (
71103 submissions = [(sub_id , sub_status .submission_result )]
72104 )
@@ -78,15 +110,20 @@ def run_pipeline(self, submission_info: SubmissionInfo) -> tuple[Optional[URI],
78110 self ._logger .error (
79111 f"During processing of submission_id: { sub_id } , the following exception was raised: { err } "
80112 )
113+ dump_processing_errors (
114+ fh .joinuri (self .processed_files_path , submission_info .submission_id ),
115+ "run_pipeline" ,
116+ [CriticalProcessingError .from_exception (err )]
117+ )
81118 self ._audit_tables .mark_failed (submissions = [sub_id ])
82119 finally :
83120 audit_files_uri = self .persist_audit_records (submission_info = submission_info )
84- return (
85- (
86- None
87- if sub_status .failed
88- else fh .joinuri (self .processed_files_path , sub_id , "business_rules" )
89- ),
90- report_uri ,
91- audit_files_uri ,
92- )
121+ return (
122+ (
123+ None
124+ if ( sub_status . validation_failed or sub_status .processing_failed )
125+ else fh .joinuri (self .processed_files_path , sub_id , "business_rules" )
126+ ),
127+ report_uri ,
128+ audit_files_uri ,
129+ )
0 commit comments