|
5 | 5 | sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../.."))) |
6 | 6 | from classes.selection_builder_exception import SelectionBuilderException |
7 | 7 | from classes.subject_selection_criteria_key import SubjectSelectionCriteriaKey |
| 8 | +from classes.intended_extent_type import IntendedExtentType |
8 | 9 |
|
9 | 10 |
|
10 | 11 | # Add helper class stubs below |
11 | | -class LatestEpisodeLatestInvestigationDataset: |
12 | | - NONE = "none" |
13 | | - COLONOSCOPY_NEW = "colonoscopy_new" |
14 | | - LIMITED_COLONOSCOPY_NEW = "limited_colonoscopy_new" |
15 | | - FLEXIBLE_SIGMOIDOSCOPY_NEW = "flexible_sigmoidoscopy_new" |
16 | | - CT_COLONOGRAPHY_NEW = "ct_colonography_new" |
17 | | - ENDOSCOPY_INCOMPLETE = "endoscopy_incomplete" |
18 | | - RADIOLOGY_INCOMPLETE = "radiology_incomplete" |
19 | | - |
20 | | - _mapping = { |
21 | | - "none": NONE, |
22 | | - "colonoscopy_new": COLONOSCOPY_NEW, |
23 | | - "limited_colonoscopy_new": LIMITED_COLONOSCOPY_NEW, |
24 | | - "flexible_sigmoidoscopy_new": FLEXIBLE_SIGMOIDOSCOPY_NEW, |
25 | | - "ct_colonography_new": CT_COLONOGRAPHY_NEW, |
26 | | - "endoscopy_incomplete": ENDOSCOPY_INCOMPLETE, |
27 | | - "radiology_incomplete": RADIOLOGY_INCOMPLETE, |
| 12 | +class SurveillanceReviewStatusType: |
| 13 | + """ |
| 14 | + Maps descriptive surveillance review statuses to valid value IDs. |
| 15 | + """ |
| 16 | + |
| 17 | + _label_to_id = { |
| 18 | + "awaiting review": 9301, |
| 19 | + "in progress": 9302, |
| 20 | + "completed": 9303, |
| 21 | + # Extend as needed |
28 | 22 | } |
29 | 23 |
|
30 | 24 | @classmethod |
31 | | - def from_description(cls, description: str) -> str: |
| 25 | + def get_id(cls, description: str) -> int: |
32 | 26 | key = description.strip().lower() |
33 | | - if key not in cls._mapping: |
34 | | - raise ValueError(f"Unknown investigation dataset filter: '{description}'") |
35 | | - return cls._mapping[key] |
| 27 | + if key not in cls._label_to_id: |
| 28 | + raise ValueError(f"Unknown review status: '{description}'") |
| 29 | + return cls._label_to_id[key] |
36 | 30 |
|
37 | 31 |
|
38 | 32 | class MockSelectionBuilder: |
@@ -94,77 +88,24 @@ def _dataset_source_for_criteria_key(self) -> dict: |
94 | 88 | return {"table": "ds_mdt_t", "alias": "mdt"} |
95 | 89 | raise SelectionBuilderException(self.criteria_key_name, self.criteria_value) |
96 | 90 |
|
| 91 | + def _add_join_to_surveillance_review(self): |
| 92 | + self.sql_from.append("-- JOIN to surveillance review placeholder") |
| 93 | + |
97 | 94 | # === Example testable method below === |
98 | 95 | # Replace this with the one you want to test, |
99 | 96 | # then use utils/oracle/test_subject_criteria_dev.py to run your scenarios |
100 | 97 |
|
101 | | - def _add_criteria_latest_episode_latest_investigation_dataset(self) -> None: |
| 98 | + def _add_criteria_surveillance_review_status(self) -> None: |
102 | 99 | """ |
103 | | - Filters subjects based on their latest investigation dataset in their latest episode. |
104 | | - Supports colonoscopy and radiology variations. |
| 100 | + Filters subjects based on the review_status_id in their surveillance review dataset. |
105 | 101 | """ |
106 | 102 | try: |
107 | | - self._add_join_to_latest_episode() |
108 | | - value = LatestEpisodeLatestInvestigationDataset.from_description(self.criteria_value) |
109 | | - |
110 | | - if value == "none": |
111 | | - self.sql_where.append( |
112 | | - "AND NOT EXISTS (SELECT 'dsc1' FROM v_ds_colonoscopy dsc1 " |
113 | | - "WHERE dsc1.episode_id = ep.subject_epis_id " |
114 | | - "AND dsc1.confirmed_type_id = 16002)" |
115 | | - ) |
116 | | - elif value == "colonoscopy_new": |
117 | | - self.sql_where.append( |
118 | | - "AND EXISTS (SELECT 'dsc2' FROM v_ds_colonoscopy dsc2 " |
119 | | - "WHERE dsc2.episode_id = ep.subject_epis_id " |
120 | | - "AND dsc2.confirmed_type_id = 16002 " |
121 | | - "AND dsc2.deleted_flag = 'N' " |
122 | | - "AND dsc2.dataset_new_flag = 'Y')" |
123 | | - ) |
124 | | - elif value == "limited_colonoscopy_new": |
125 | | - self.sql_where.append( |
126 | | - "AND EXISTS (SELECT 'dsc3' FROM v_ds_colonoscopy dsc3 " |
127 | | - "WHERE dsc3.episode_id = ep.subject_epis_id " |
128 | | - "AND dsc3.confirmed_type_id = 17996 " |
129 | | - "AND dsc3.deleted_flag = 'N' " |
130 | | - "AND dsc3.dataset_new_flag = 'Y')" |
131 | | - ) |
132 | | - elif value == "flexible_sigmoidoscopy_new": |
133 | | - self.sql_where.append( |
134 | | - "AND EXISTS (SELECT 'dsc4' FROM v_ds_colonoscopy dsc4 " |
135 | | - "WHERE dsc4.episode_id = ep.subject_epis_id " |
136 | | - "AND dsc4.confirmed_type_id = 16004 " |
137 | | - "AND dsc4.deleted_flag = 'N' " |
138 | | - "AND dsc4.dataset_new_flag = 'Y')" |
139 | | - ) |
140 | | - elif value == "ct_colonography_new": |
141 | | - self.sql_where.append( |
142 | | - "AND EXISTS (SELECT 'dsr1' FROM v_ds_radiology dsr1 " |
143 | | - "WHERE dsr1.episode_id = ep.subject_epis_id " |
144 | | - "AND dsr1.confirmed_type_id = 16087 " |
145 | | - "AND dsr1.deleted_flag = 'N' " |
146 | | - "AND dsr1.dataset_new_flag = 'Y')" |
147 | | - ) |
148 | | - elif value == "endoscopy_incomplete": |
149 | | - self.sql_where.append( |
150 | | - "AND EXISTS (SELECT 'dsei' FROM v_ds_colonoscopy dsei " |
151 | | - "WHERE dsei.episode_id = ep.subject_epis_id " |
152 | | - "AND dsei.deleted_flag = 'N' " |
153 | | - "AND dsei.dataset_completed_flag = 'N' " |
154 | | - "AND dsei.dataset_new_flag = 'N' " |
155 | | - "AND dsei.confirmed_test_date >= TO_DATE('01/01/2020','dd/mm/yyyy'))" |
156 | | - ) |
157 | | - elif value == "radiology_incomplete": |
158 | | - self.sql_where.append( |
159 | | - "AND EXISTS (SELECT 'dsri' FROM v_ds_radiology dsri " |
160 | | - "WHERE dsri.episode_id = ep.subject_epis_id " |
161 | | - "AND dsri.deleted_flag = 'N' " |
162 | | - "AND dsri.dataset_completed_flag = 'N' " |
163 | | - "AND dsri.dataset_new_flag = 'N' " |
164 | | - "AND dsri.confirmed_test_date >= TO_DATE('01/01/2020','dd/mm/yyyy'))" |
165 | | - ) |
166 | | - else: |
167 | | - raise SelectionBuilderException(self.criteria_key_name, self.criteria_value) |
| 103 | + self._add_join_to_surveillance_review() |
| 104 | + status_id = SurveillanceReviewStatusType.get_id(self.criteria_value) |
| 105 | + |
| 106 | + self.sql_where.append( |
| 107 | + f"AND sr.review_status_id {self.criteria_comparator} {status_id}" |
| 108 | + ) |
168 | 109 |
|
169 | 110 | except Exception: |
170 | 111 | raise SelectionBuilderException(self.criteria_key_name, self.criteria_value) |
0 commit comments