61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime, timezone
|
|
from uuid import UUID, uuid4
|
|
|
|
from app.models import Metric, QualityCheck
|
|
|
|
|
|
class QualityService:
|
|
@staticmethod
|
|
def persist_quality_check(
|
|
db,
|
|
project_id: UUID,
|
|
reference_dataset_id: UUID,
|
|
check_type: str,
|
|
status: str,
|
|
score: float | None,
|
|
parameters: dict | None,
|
|
findings: dict | None,
|
|
*,
|
|
job_id: UUID | None = None,
|
|
analysis_run_id: UUID | None = None,
|
|
candidate_dataset_id: UUID | None = None,
|
|
metrics: dict[str, float | int | None] | None = None,
|
|
commit: bool = True,
|
|
) -> QualityCheck:
|
|
quality_check = QualityCheck(
|
|
id=uuid4(),
|
|
project_id=project_id,
|
|
job_id=job_id,
|
|
analysis_run_id=analysis_run_id,
|
|
candidate_dataset_id=candidate_dataset_id,
|
|
reference_dataset_id=reference_dataset_id,
|
|
check_type=check_type,
|
|
status=status,
|
|
score=score,
|
|
parameters_json=parameters or {},
|
|
findings_json=findings or {},
|
|
completed_at=datetime.now(timezone.utc),
|
|
)
|
|
db.add(quality_check)
|
|
if hasattr(db, "flush"):
|
|
db.flush()
|
|
|
|
for key, value in (metrics or {}).items():
|
|
db.add(
|
|
Metric(
|
|
id=uuid4(),
|
|
quality_check_id=quality_check.id,
|
|
analysis_run_id=analysis_run_id,
|
|
metric_key=key,
|
|
metric_value=float(value) if value is not None else None,
|
|
metadata_json={},
|
|
)
|
|
)
|
|
|
|
if commit:
|
|
db.commit()
|
|
db.refresh(quality_check)
|
|
return quality_check
|