|
8 | 8 |
|
9 | 9 |
|
10 | 10 | # Add helper class stubs below |
11 | | -class LatestEpisodeHasDataset: |
12 | | - """ |
13 | | - Maps dataset status descriptions to filter interpretations. |
14 | | - """ |
15 | | - |
16 | | - NO = "no" |
17 | | - YES_INCOMPLETE = "yes_incomplete" |
18 | | - YES_COMPLETE = "yes_complete" |
19 | | - PAST = "past" |
| 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" |
20 | 19 |
|
21 | 20 | _mapping = { |
22 | | - "no": NO, |
23 | | - "yes_incomplete": YES_INCOMPLETE, |
24 | | - "yes_complete": YES_COMPLETE, |
25 | | - "past": PAST, |
| 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, |
26 | 28 | } |
27 | 29 |
|
28 | 30 | @classmethod |
29 | 31 | def from_description(cls, description: str) -> str: |
30 | 32 | key = description.strip().lower() |
31 | 33 | if key not in cls._mapping: |
32 | | - raise ValueError(f"Unknown dataset filter type: '{description}'") |
| 34 | + raise ValueError(f"Unknown investigation dataset filter: '{description}'") |
33 | 35 | return cls._mapping[key] |
34 | 36 |
|
35 | 37 |
|
@@ -96,49 +98,73 @@ def _dataset_source_for_criteria_key(self) -> dict: |
96 | 98 | # Replace this with the one you want to test, |
97 | 99 | # then use utils/oracle/test_subject_criteria_dev.py to run your scenarios |
98 | 100 |
|
99 | | - def _add_criteria_latest_episode_has_dataset(self) -> None: |
| 101 | + def _add_criteria_latest_episode_latest_investigation_dataset(self) -> None: |
100 | 102 | """ |
101 | | - Filters based on presence or completion status of a dataset in the latest episode. |
| 103 | + Filters subjects based on their latest investigation dataset in their latest episode. |
| 104 | + Supports colonoscopy and radiology variations. |
102 | 105 | """ |
103 | 106 | try: |
104 | 107 | self._add_join_to_latest_episode() |
| 108 | + value = LatestEpisodeLatestInvestigationDataset.from_description(self.criteria_value) |
105 | 109 |
|
106 | | - dataset_info = self._dataset_source_for_criteria_key() |
107 | | - dataset_table = dataset_info["table"] |
108 | | - alias = dataset_info["alias"] |
109 | | - |
110 | | - clause = "AND EXISTS ( " |
111 | | - value = self.criteria_value.strip().lower() |
112 | | - status = LatestEpisodeHasDataset.from_description(value) |
113 | | - filter_clause = "" |
114 | | - |
115 | | - if status == LatestEpisodeHasDataset.NO: |
116 | | - clause = "AND NOT EXISTS ( " |
117 | | - elif status == LatestEpisodeHasDataset.YES_INCOMPLETE: |
118 | | - filter_clause = f"AND {alias}.dataset_completed_date IS NULL" |
119 | | - elif status == LatestEpisodeHasDataset.YES_COMPLETE: |
120 | | - filter_clause = f"AND {alias}.dataset_completed_date IS NOT NULL" |
121 | | - elif status == LatestEpisodeHasDataset.PAST: |
122 | | - filter_clause = ( |
123 | | - f"AND TRUNC({alias}.dataset_completed_date) < TRUNC(SYSDATE)" |
| 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)" |
124 | 115 | ) |
125 | | - else: |
126 | | - raise SelectionBuilderException( |
127 | | - self.criteria_key_name, self.criteria_value |
| 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')" |
128 | 123 | ) |
129 | | - |
130 | | - self.sql_where.append( |
131 | | - "".join( |
132 | | - [ |
133 | | - clause, |
134 | | - f"SELECT 1 FROM {dataset_table} {alias} ", |
135 | | - f"WHERE {alias}.episode_id = ep.subject_epis_id ", |
136 | | - f"AND {alias}.deleted_flag = 'N' ", |
137 | | - filter_clause, |
138 | | - ")", |
139 | | - ] |
| 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')" |
140 | 131 | ) |
141 | | - ) |
| 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) |
142 | 168 |
|
143 | 169 | except Exception: |
144 | 170 | raise SelectionBuilderException(self.criteria_key_name, self.criteria_value) |
0 commit comments