Skip to content

Commit 5c9f51f

Browse files
Added more cases to the util and methods to go along with this
1 parent abaa425 commit 5c9f51f

File tree

2 files changed

+147
-2
lines changed

2 files changed

+147
-2
lines changed

utils/oracle/TEMP_subject_selection_query_builder.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ Returns a `SelectionBuilderException` for invalid use of "unchanged".
256256

257257
- [ ] Add additional match case in `_add_variable_selection_criteria`. This is almost a direct copy of `addVariableSelectionCriteria` in the Selenium framework.
258258
- [ ] Add any additional methods that are required by this utility: `_add_criteria_.....`.
259-
- [ ] Create any new classes needed in the classes folder
259+
- [ ] Create any new classes needed in the classes folder.
260260

261261
### General
262262

@@ -265,3 +265,4 @@ Returns a `SelectionBuilderException` for invalid use of "unchanged".
265265
- [ ] Document all enums and supporting classes used by the builder.
266266
- [ ] Add logging for all major decision points in query construction.
267267
- [ ] Review and update doc strings for clarity and completeness.
268+
- [ ] Double check `_add_criteria_date_field` against `addCriteriaDateField` to see if functionality ported over correctly. This included looking at any methods referenced in this method.

utils/oracle/subject_selection_query_builder.py

Lines changed: 145 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from classes.event_status_type import EventStatusType
66
from classes.has_gp_practice import HasGPPractice
77
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
810
from classes.ss_reason_for_change_type import SSReasonForChangeType
911
from classes.subject_hub_code import SubjectHubCode
1012
from classes.subject_screening_centre_code import SubjectScreeningCentreCode
@@ -51,7 +53,14 @@ def build_subject_selection_query(
5153
else:
5254
self._end_where_clause(1)
5355

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+
)
5564
logging.info("Final query: %s", query)
5665
return query, self.bind_vars
5766

@@ -170,6 +179,60 @@ def _add_variable_selection_criteria(
170179
self._add_criteria_date_field(
171180
subject, "ALL_PATHWAYS", "SCREENING_STATUS_CHANGE_DATE"
172181
)
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+
)
173236

174237
except Exception:
175238
raise SelectionBuilderException(
@@ -499,6 +562,87 @@ def _add_criteria_date_field(
499562
self.criteria_value, subject, pathway, date_type, date_column_name
500563
)
501564

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+
502646
def _get_date_field_column_name(self, pathway: str, date_type: str) -> str:
503647
"""
504648
Map pathway and date_type to the correct Oracle column name.

0 commit comments

Comments
 (0)