Skip to content

Commit 6535b6d

Browse files
committed
Added symptomatic procedure result filter using surgery_result_id and null check
1 parent 6f5e299 commit 6535b6d

File tree

4 files changed

+71
-39
lines changed

4 files changed

+71
-39
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class SymptomaticProcedureResultType:
2+
"""
3+
Maps symptomatic surgery result labels to valid value IDs.
4+
"""
5+
6+
_label_to_id = {
7+
"normal": 9601,
8+
"inconclusive": 9602,
9+
"cancer detected": 9603,
10+
# Add more as needed
11+
}
12+
13+
@classmethod
14+
def get_id(cls, description: str) -> int:
15+
key = description.strip().lower()
16+
if key not in cls._label_to_id:
17+
raise ValueError(f"Unknown symptomatic procedure result: '{description}'")
18+
return cls._label_to_id[key]

utils/oracle/mock_selection_builder.py

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,24 @@
88

99

1010
# Add helper class stubs below
11-
class EpisodeResultType:
11+
class SymptomaticProcedureResultType:
1212
"""
13-
Represents various episode result types including special symbolic values.
13+
Maps symptom-driven surgery result descriptions to valid value IDs.
1414
"""
1515

16-
NULL = "null"
17-
NOT_NULL = "not_null"
18-
ANY_SURVEILLANCE_NON_PARTICIPATION = "any_surveillance_non_participation"
19-
2016
_label_to_id = {
21-
# Add actual mappings here, for example:
22-
"normal": 9501,
23-
"abnormal": 9502,
24-
"surveillance offered": 9503,
25-
# etc.
17+
"normal": 9601,
18+
"inconclusive": 9602,
19+
"cancer detected": 9603,
20+
# Extend as needed
2621
}
2722

2823
@classmethod
29-
def from_description(cls, description: str):
24+
def get_id(cls, description: str) -> int:
3025
key = description.strip().lower()
31-
if key in {cls.NULL, cls.NOT_NULL, cls.ANY_SURVEILLANCE_NON_PARTICIPATION}:
32-
return key
33-
if key in cls._label_to_id:
34-
return cls._label_to_id[key]
35-
raise ValueError(f"Unknown episode result type: '{description}'")
26+
if key not in cls._label_to_id:
27+
raise ValueError(f"Unknown symptomatic procedure result: '{description}'")
28+
return cls._label_to_id[key]
3629

3730

3831
class MockSelectionBuilder:
@@ -101,27 +94,21 @@ def _add_join_to_surveillance_review(self):
10194
# Replace this with the one you want to test,
10295
# then use utils/oracle/test_subject_criteria_dev.py to run your scenarios
10396

104-
def _add_criteria_latest_episode_accumulated_episode_result(self) -> None:
97+
def _add_criteria_symptomatic_procedure_result(self) -> None:
10598
"""
106-
Filters subjects based on the result of their latest episode.
99+
Filters based on symptomatic surgery result value or presence.
107100
"""
108101
try:
109-
self._add_join_to_latest_episode()
110-
value = EpisodeResultType.from_description(self.criteria_value)
111-
112-
if value == EpisodeResultType.NULL:
113-
self.sql_where.append("AND ep.episode_result_id IS NULL")
114-
elif value == EpisodeResultType.NOT_NULL:
115-
self.sql_where.append("AND ep.episode_result_id IS NOT NULL")
116-
elif value == EpisodeResultType.ANY_SURVEILLANCE_NON_PARTICIPATION:
102+
column = "xt.surgery_result_id"
103+
value = self.criteria_value.strip().lower()
104+
105+
if value == "null":
106+
self.sql_where.append(f"AND {column} IS NULL")
107+
else:
108+
result_id = SymptomaticProcedureResultType.get_id(self.criteria_value)
117109
self.sql_where.append(
118-
"AND ep.episode_result_id IN ("
119-
"SELECT snp.valid_value_id FROM valid_values snp "
120-
"WHERE snp.domain = 'OTHER_EPISODE_RESULT' "
121-
"AND LOWER(snp.description) LIKE '%surveillance non-participation')"
110+
f"AND {column} {self.criteria_comparator} {result_id}"
122111
)
123-
else:
124-
self.sql_where.append(f"AND ep.episode_result_id = {value}")
125112

126113
except Exception:
127114
raise SelectionBuilderException(self.criteria_key_name, self.criteria_value)

utils/oracle/subject_selection_query_builder.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
from classes.has_date_of_death_removal import HasDateOfDeathRemoval
4848
from classes.invited_since_age_extension import InvitedSinceAgeExtension
4949
from classes.episode_result_type import EpisodeResultType
50+
from classes.symptomatic_procedure_result_type import SymptomaticProcedureResultType
5051

5152

5253
class SubjectSelectionQueryBuilder:
@@ -496,7 +497,7 @@ def _add_variable_selection_criteria(
496497
):
497498
self._add_criteria_latest_episode_accumulated_episode_result()
498499
case SubjectSelectionCriteriaKey.SYMPTOMATIC_PROCEDURE_RESULT:
499-
self._add_criteria_symmetric_procedure_result()
500+
self._add_criteria_symptomatic_procedure_result()
500501
case SubjectSelectionCriteriaKey.SYMPTOMATIC_PROCEDURE_DATE:
501502
self._add_criteria_date_field(
502503
subject, "ALL_PATHWAYS", "SYMPTOMATIC_PROCEDURE_DATE"
@@ -2125,6 +2126,25 @@ def _add_criteria_latest_episode_accumulated_episode_result(self) -> None:
21252126
except Exception:
21262127
raise SelectionBuilderException(self.criteria_key_name, self.criteria_value)
21272128

2129+
def _add_criteria_symptomatic_procedure_result(self) -> None:
2130+
"""
2131+
Filters based on symptomatic surgery result value or presence.
2132+
"""
2133+
try:
2134+
column = "xt.surgery_result_id"
2135+
value = self.criteria_value.strip().lower()
2136+
2137+
if value == "null":
2138+
self.sql_where.append(f"AND {column} IS NULL")
2139+
else:
2140+
result_id = SymptomaticProcedureResultType.get_id(self.criteria_value)
2141+
self.sql_where.append(
2142+
f"AND {column} {self.criteria_comparator} {result_id}"
2143+
)
2144+
2145+
except Exception:
2146+
raise SelectionBuilderException(self.criteria_key_name, self.criteria_value)
2147+
21282148
# ------------------------------------------------------------------------
21292149
# 🧬 CADS Clinical Dataset Filters
21302150
# ------------------------------------------------------------------------

utils/oracle/test_subject_criteria_dev.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,18 @@ def make_builder(key, value, index=0, comparator="="):
4141
return b
4242

4343

44-
# === Test: LATEST_EPISODE_ACCUMULATED_RESULT (any_surveillance_non_participation) ===
44+
# === Test: SYMPTOMATIC_PROCEDURE_RESULT (cancer detected) ===
4545
b = make_builder(
46-
SubjectSelectionCriteriaKey.LATEST_EPISODE_ACCUMULATED_RESULT,
47-
"any_surveillance_non_participation",
46+
SubjectSelectionCriteriaKey.SYMPTOMATIC_PROCEDURE_RESULT,
47+
"cancer detected",
48+
comparator="=",
4849
)
49-
b._add_criteria_latest_episode_accumulated_episode_result()
50-
print("=== LATEST_EPISODE_ACCUMULATED_RESULT (any_surveillance_non_participation) ===")
50+
b._add_criteria_symptomatic_procedure_result()
51+
print("=== SYMPTOMATIC_PROCEDURE_RESULT (cancer detected) ===")
52+
print(b.dump_sql(), end="\n\n")
53+
54+
# === Test: SYMPTOMATIC_PROCEDURE_RESULT (null) ===
55+
b = make_builder(SubjectSelectionCriteriaKey.SYMPTOMATIC_PROCEDURE_RESULT, "null")
56+
b._add_criteria_symptomatic_procedure_result()
57+
print("=== SYMPTOMATIC_PROCEDURE_RESULT (null) ===")
5158
print(b.dump_sql(), end="\n\n")

0 commit comments

Comments
 (0)