|
5 | 5 | from classes.event_status_type import EventStatusType |
6 | 6 | from classes.has_gp_practice import HasGPPractice |
7 | 7 | from classes.screening_status_type import ScreeningStatusType |
| 8 | +from classes.sdd_reason_for_change_type import SDDReasonForChangeType |
| 9 | +from classes.ssdd_reason_for_change_type import SSDDReasonForChangeType |
8 | 10 | from classes.ss_reason_for_change_type import SSReasonForChangeType |
9 | 11 | from classes.subject_hub_code import SubjectHubCode |
10 | 12 | from classes.subject_screening_centre_code import SubjectScreeningCentreCode |
@@ -51,7 +53,14 @@ def build_subject_selection_query( |
51 | 53 | else: |
52 | 54 | self._end_where_clause(1) |
53 | 55 |
|
54 | | - query = " ".join(self.sql_select + self.sql_from + self.sql_where) |
| 56 | + query = " ".join( |
| 57 | + self.sql_select |
| 58 | + + self.sql_from |
| 59 | + + self.sql_from_episode |
| 60 | + + self.sql_from_genetic_condition_diagnosis |
| 61 | + + self.sql_from_cancer_audit_datasets |
| 62 | + + self.sql_where |
| 63 | + ) |
55 | 64 | logging.info("Final query: %s", query) |
56 | 65 | return query, self.bind_vars |
57 | 66 |
|
@@ -170,6 +179,60 @@ def _add_variable_selection_criteria( |
170 | 179 | self._add_criteria_date_field( |
171 | 180 | subject, "ALL_PATHWAYS", "SCREENING_STATUS_CHANGE_DATE" |
172 | 181 | ) |
| 182 | + case SubjectSelectionCriteriaKey.PREVIOUS_LYNCH_DUE_DATE: |
| 183 | + self._add_criteria_date_field( |
| 184 | + subject, "LYNCH", "PREVIOUS_DUE_DATE" |
| 185 | + ) |
| 186 | + case ( |
| 187 | + SubjectSelectionCriteriaKey.PREVIOUS_SCREENING_DUE_DATE |
| 188 | + | SubjectSelectionCriteriaKey.PREVIOUS_SCREENING_DUE_DATE_BIRTHDAY |
| 189 | + ): |
| 190 | + self._add_criteria_date_field( |
| 191 | + subject, "FOBT", "PREVIOUS_DUE_DATE" |
| 192 | + ) |
| 193 | + case SubjectSelectionCriteriaKey.PREVIOUS_SURVEILLANCE_DUE_DATE: |
| 194 | + self._add_criteria_date_field( |
| 195 | + subject, "SURVEILLANCE", "PREVIOUS_DUE_DATE" |
| 196 | + ) |
| 197 | + case ( |
| 198 | + SubjectSelectionCriteriaKey.SCREENING_DUE_DATE |
| 199 | + | SubjectSelectionCriteriaKey.SCREENING_DUE_DATE_BIRTHDAY |
| 200 | + ): |
| 201 | + self._add_criteria_date_field(subject, "FOBT", "DUE_DATE") |
| 202 | + case ( |
| 203 | + SubjectSelectionCriteriaKey.CALCULATED_SCREENING_DUE_DATE |
| 204 | + | SubjectSelectionCriteriaKey.CALCULATED_SCREENING_DUE_DATE_BIRTHDAY |
| 205 | + | SubjectSelectionCriteriaKey.CALCULATED_FOBT_DUE_DATE |
| 206 | + ): |
| 207 | + self._add_criteria_date_field( |
| 208 | + subject, "FOBT", "CALCULATED_DUE_DATE" |
| 209 | + ) |
| 210 | + case SubjectSelectionCriteriaKey.SCREENING_DUE_DATE_REASON: |
| 211 | + self._add_criteria_screening_due_date_reason(subject) |
| 212 | + case ( |
| 213 | + SubjectSelectionCriteriaKey.SCREENING_DUE_DATE_DATE_OF_CHANGE |
| 214 | + ): |
| 215 | + self._add_criteria_date_field( |
| 216 | + subject, "FOBT", "DUE_DATE_CHANGE_DATE" |
| 217 | + ) |
| 218 | + case SubjectSelectionCriteriaKey.SURVEILLANCE_DUE_DATE: |
| 219 | + self._add_criteria_date_field( |
| 220 | + subject, "SURVEILLANCE", "DUE_DATE" |
| 221 | + ) |
| 222 | + case ( |
| 223 | + SubjectSelectionCriteriaKey.CALCULATED_SURVEILLANCE_DUE_DATE |
| 224 | + ): |
| 225 | + self._add_criteria_date_field( |
| 226 | + subject, "SURVEILLANCE", "CALCULATED_DUE_DATE" |
| 227 | + ) |
| 228 | + case SubjectSelectionCriteriaKey.SURVEILLANCE_DUE_DATE_REASON: |
| 229 | + self._add_criteria_surveillance_due_date_reason(subject) |
| 230 | + case ( |
| 231 | + SubjectSelectionCriteriaKey.SURVEILLANCE_DUE_DATE_DATE_OF_CHANGE |
| 232 | + ): |
| 233 | + self._add_criteria_date_field( |
| 234 | + subject, "SURVEILLANCE", "DUE_DATE_CHANGE_DATE" |
| 235 | + ) |
173 | 236 |
|
174 | 237 | except Exception: |
175 | 238 | raise SelectionBuilderException( |
@@ -499,6 +562,87 @@ def _add_criteria_date_field( |
499 | 562 | self.criteria_value, subject, pathway, date_type, date_column_name |
500 | 563 | ) |
501 | 564 |
|
| 565 | + def _add_criteria_screening_due_date_reason(self, subject: "Subject"): |
| 566 | + due_date_reason = "ss.sdd_reason_for_change_id" |
| 567 | + try: |
| 568 | + screening_due_date_change_reason_type = ( |
| 569 | + SDDReasonForChangeType.by_description_case_insensitive( |
| 570 | + self.criteria_value |
| 571 | + ) |
| 572 | + ) |
| 573 | + self.sql_where.append(" AND ") |
| 574 | + |
| 575 | + if screening_due_date_change_reason_type is None: |
| 576 | + raise SelectionBuilderException( |
| 577 | + self.criteria_key_name, self.criteria_value |
| 578 | + ) |
| 579 | + |
| 580 | + match screening_due_date_change_reason_type: |
| 581 | + case SDDReasonForChangeType.NULL: |
| 582 | + self.sql_where.append(f"{due_date_reason}{" IS NULL "}") |
| 583 | + case SDDReasonForChangeType.NOT_NULL: |
| 584 | + self.sql_where.append(f"{due_date_reason}{" IS NOT NULL "}") |
| 585 | + case SDDReasonForChangeType.UNCHANGED: |
| 586 | + self._force_not_modifier_is_invalid_for_criteria_value() |
| 587 | + if subject is None: |
| 588 | + raise self.invalid_use_of_unchanged_exception( |
| 589 | + self.criteria_key_name, "no existing subject" |
| 590 | + ) |
| 591 | + elif subject.get_screening_due_date_change_reason_id() is None: |
| 592 | + self.sql_where.append(f"{due_date_reason}{" IS NULL "}") |
| 593 | + else: |
| 594 | + self.sql_where.append( |
| 595 | + f"{due_date_reason}{" = "}{subject.get_screening_due_date_change_reason_id()}" |
| 596 | + ) |
| 597 | + case _: |
| 598 | + self.sql_where.append( |
| 599 | + f"{due_date_reason}{self.criteria_comparator}{screening_due_date_change_reason_type.valid_value_id}" |
| 600 | + ) |
| 601 | + except SelectionBuilderException as ssbe: |
| 602 | + raise ssbe |
| 603 | + except Exception: |
| 604 | + raise SelectionBuilderException(self.criteria_key_name, self.criteria_value) |
| 605 | + |
| 606 | + def _add_criteria_surveillance_due_date_reason(self, subject: "Subject"): |
| 607 | + try: |
| 608 | + surveillance_due_date_change_reason = ( |
| 609 | + SSDDReasonForChangeType.by_description_case_insensitive( |
| 610 | + self.criteria_value |
| 611 | + ) |
| 612 | + ) |
| 613 | + self.sql_where.append(" AND ss.surveillance_sdd_rsn_change_id ") |
| 614 | + |
| 615 | + if surveillance_due_date_change_reason is None: |
| 616 | + raise SelectionBuilderException( |
| 617 | + self.criteria_key_name, self.criteria_value |
| 618 | + ) |
| 619 | + |
| 620 | + match surveillance_due_date_change_reason: |
| 621 | + case SSDDReasonForChangeType.NULL | SSDDReasonForChangeType.NOT_NULL: |
| 622 | + self.sql_where.append( |
| 623 | + f" IS {surveillance_due_date_change_reason.description}" |
| 624 | + ) |
| 625 | + case SSDDReasonForChangeType.UNCHANGED: |
| 626 | + self._force_not_modifier_is_invalid_for_criteria_value() |
| 627 | + if subject is None: |
| 628 | + raise self.invalid_use_of_unchanged_exception( |
| 629 | + self.criteria_key_name, "no existing subject" |
| 630 | + ) |
| 631 | + elif subject.get_surveillance_due_date_change_reason_id() is None: |
| 632 | + self.sql_where.append(" IS NULL ") |
| 633 | + else: |
| 634 | + self.sql_where.append( |
| 635 | + f" = {subject.get_surveillance_due_date_change_reason_id()}" |
| 636 | + ) |
| 637 | + case _: |
| 638 | + self.sql_where.append( |
| 639 | + f"{self.criteria_comparator}{surveillance_due_date_change_reason.valid_value_id}" |
| 640 | + ) |
| 641 | + except SelectionBuilderException as ssbe: |
| 642 | + raise ssbe |
| 643 | + except Exception: |
| 644 | + raise SelectionBuilderException(self.criteria_key_name, self.criteria_value) |
| 645 | + |
502 | 646 | def _get_date_field_column_name(self, pathway: str, date_type: str) -> str: |
503 | 647 | """ |
504 | 648 | Map pathway and date_type to the correct Oracle column name. |
|
0 commit comments