diff --git a/execution_engine/converter/criterion.py b/execution_engine/converter/criterion.py index b70b7b98..a88c9c84 100644 --- a/execution_engine/converter/criterion.py +++ b/execution_engine/converter/criterion.py @@ -99,10 +99,14 @@ def parse_value( eps = float(value_numeric) / 1e5 match value.comparator: case "<=" | "<": - value_max = value_numeric - (eps if value.comparator == "<" else 0) + value_max = float(value_numeric) - ( + eps if value.comparator == "<" else 0 + ) value_numeric = None case ">=" | ">": - value_min = value_numeric + (eps if value.comparator == "<" else 0) + value_min = float(value_numeric) + ( + eps if value.comparator == "<" else 0 + ) value_numeric = None case _: raise ValueError(f'Unknown quantity operator: "{value.comparator}"') diff --git a/execution_engine/converter/parser/fhir_parser_v1.py b/execution_engine/converter/parser/fhir_parser_v1.py index 40b21d7d..bd4bd277 100644 --- a/execution_engine/converter/parser/fhir_parser_v1.py +++ b/execution_engine/converter/parser/fhir_parser_v1.py @@ -79,6 +79,9 @@ def parse_time_from_event( new_combo = converter.to_temporal_combination(combo) + if not isinstance(new_combo, CriterionCombination): + raise ValueError(f"Expected CriterionCombination, got {type(new_combo)}") + return new_combo def parse_characteristics(self, ev: EvidenceVariable) -> CriterionCombination: diff --git a/execution_engine/omop/sqlclient.py b/execution_engine/omop/sqlclient.py index eace72ae..b5488029 100644 --- a/execution_engine/omop/sqlclient.py +++ b/execution_engine/omop/sqlclient.py @@ -4,7 +4,7 @@ import pandas as pd import sqlalchemy -from sqlalchemy import and_, bindparam, event, func, select, text +from sqlalchemy import NullPool, and_, bindparam, event, func, select, text from sqlalchemy.engine.interfaces import DBAPIConnection from sqlalchemy.pool import ConnectionPoolEntry from sqlalchemy.sql import Insert, Select @@ -83,6 +83,7 @@ def __init__( result_schema: str, timezone: str = "Europe/Berlin", disable_triggers: bool = False, + null_pool: bool = False, ) -> None: """Initialize the OMOP SQL client.""" @@ -97,6 +98,9 @@ def __init__( connection_string, connect_args={"options": "-csearch_path={}".format(self._data_schema)}, future=True, + poolclass=( + NullPool if null_pool else None + ), # <--- ensures no persistent pool ) if disable_triggers: diff --git a/execution_engine/omop/vocabulary.py b/execution_engine/omop/vocabulary.py index 8c212ee1..d55156f9 100644 --- a/execution_engine/omop/vocabulary.py +++ b/execution_engine/omop/vocabulary.py @@ -110,6 +110,15 @@ class ICD10GM(AbstractStandardVocabulary): omop_vocab_name = "ICD10GM" +class ICD10CM(AbstractStandardVocabulary): + """ + ICD10 Clinical Modification + """ + + system_uri = "http://hl7.org/fhir/sid/icd-10-cm" + omop_vocab_name = "ICD10CM" + + class UCUM(AbstractStandardVocabulary): """ UCUM vocabulary. @@ -232,6 +241,7 @@ def init(self) -> None: self.register(UCUM) self.register(ATCDE) self.register(ICD10GM) + self.register(ICD10CM) self.register(CODEXCELIDA) def register(self, vocabulary: Type[AbstractVocabulary]) -> None: diff --git a/execution_engine/task/task.py b/execution_engine/task/task.py index 0968fbda..adcd8451 100644 --- a/execution_engine/task/task.py +++ b/execution_engine/task/task.py @@ -27,6 +27,7 @@ def get_engine() -> OMOPSQLClient: return OMOPSQLClient( **get_config().omop.model_dump(by_alias=True), timezone=get_config().timezone, + null_pool=get_config().multiprocessing_use, ) diff --git a/execution_engine/util/value/value.py b/execution_engine/util/value/value.py index bc6c8f93..72c892c7 100644 --- a/execution_engine/util/value/value.py +++ b/execution_engine/util/value/value.py @@ -314,9 +314,6 @@ class ValueScalar(ValueNumeric[float, None]): unit: None = None - _validate_value = field_validator("value", mode="before")(check_int) - _validate_value_min = field_validator("value_min", mode="before")(check_int) - _validate_value_max = field_validator("value_max", mode="before")(check_int) _validate_no_unit = field_validator("unit", mode="before")(check_unit_none) def supports_units(self) -> bool: