Skip to content

Commit 6a26b7c

Browse files
Adding tests to prove the util can be used to obtain test data
1 parent 0d1ce66 commit 6a26b7c

File tree

2 files changed

+99
-32
lines changed

2 files changed

+99
-32
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from utils.oracle.subject_selection_query_builder import SubjectSelectionQueryBuilder
2+
from utils.oracle.oracle import OracleDB
3+
from classes.user import User
4+
from classes.subject import Subject
5+
from classes.screening_status_type import ScreeningStatusType
6+
from classes.subject_selection_criteria_key import SubjectSelectionCriteriaKey
7+
import logging
8+
import pytest
9+
10+
11+
def test_subject_selection_query_builder():
12+
"""
13+
This function demonstrates how to use the builder to create a query
14+
based on specified criteria and user/subject objects.
15+
"""
16+
17+
criteria = {
18+
"screening status": "Surveillance",
19+
}
20+
user = User()
21+
subject = Subject()
22+
subject.set_screening_status_id(4006)
23+
24+
builder = SubjectSelectionQueryBuilder()
25+
26+
query, bind_vars = builder.build_subject_selection_query(
27+
criteria=criteria, user=user, subject=subject, subjects_to_retrieve=1
28+
)
29+
30+
df = OracleDB().execute_query(query, bind_vars)
31+
logging.info(f"DataFrame: {df}")
32+
assert df is not None, "DataFrame should not be None"
33+
assert df.shape[0] == 1, "DataFrame should contain exactly one row"
34+
35+
criteria = {
36+
"nhs number": "9163626810",
37+
}
38+
user = User()
39+
subject = Subject()
40+
subject.set_nhs_number("9163626810")
41+
query, bind_vars = builder.build_subject_selection_query(
42+
criteria=criteria, user=user, subject=subject, subjects_to_retrieve=1
43+
)
44+
45+
df = OracleDB().execute_query(query, bind_vars)
46+
logging.info(f"DataFrame: {df}")
47+
assert df is not None, "DataFrame should not be None"
48+
assert df.shape[0] == 1, "DataFrame should contain exactly one row"
49+
assert (
50+
df.iloc[0]["subject_nhs_number"] == "9163626810"
51+
), "NHS number should match the input"

utils/oracle/subject_selection_query_builder.py

Lines changed: 48 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,28 @@ def __init__(self):
9191
self.xt = "xt"
9292
self.ap = "ap"
9393

94+
# Repeated Strings:
95+
self.c_dob = "c.date_of_birth"
96+
9497
def build_subject_selection_query(
9598
self,
9699
criteria: Dict[str, str],
97100
user: "User",
98101
subject: "Subject",
99102
subjects_to_retrieve: Optional[int] = None,
100103
) -> tuple[str, dict]:
104+
# Clear previous state to avoid duplicate SQL fragments
105+
self.sql_select = []
106+
self.sql_from = []
107+
self.sql_where = []
108+
self.sql_from_episode = []
109+
self.sql_from_genetic_condition_diagnosis = []
110+
self.sql_from_cancer_audit_datasets = []
111+
self.bind_vars = {}
112+
self.criteria_value_count = 0
113+
self.xt = "xt"
114+
self.ap = "ap"
115+
101116
self._build_select_clause()
102117
self._build_main_from_clause()
103118
self._start_where_clause()
@@ -108,39 +123,42 @@ def build_subject_selection_query(
108123
self._end_where_clause(1)
109124

110125
query = " ".join(
111-
self.sql_select
112-
+ self.sql_from
113-
+ self.sql_from_episode
114-
+ self.sql_from_genetic_condition_diagnosis
115-
+ self.sql_from_cancer_audit_datasets
116-
+ self.sql_where
126+
str(part)
127+
for part in (
128+
self.sql_select
129+
+ self.sql_from
130+
+ self.sql_from_episode
131+
+ self.sql_from_genetic_condition_diagnosis
132+
+ self.sql_from_cancer_audit_datasets
133+
+ self.sql_where
134+
)
117135
)
118136
logging.info("Final query: %s", query)
119137
return query, self.bind_vars
120138

121139
def _build_select_clause(self) -> None:
122140
columns: list[str] = [
123-
"ss.screening_subject_id,",
124-
"ss.subject_nhs_number,",
125-
"c.person_family_name,",
126-
"c.person_given_name,",
127-
"ss.datestamp,",
128-
"ss.screening_status_id,",
129-
"ss.ss_reason_for_change_id,",
130-
"ss.screening_status_change_date,",
131-
"ss.screening_due_date,",
132-
"ss.sdd_reason_for_change_id,",
133-
"ss.sdd_change_date,",
134-
"ss.calculated_sdd,",
135-
"ss.surveillance_screen_due_date,",
136-
"ss.calculated_ssdd,",
137-
"ss.surveillance_sdd_rsn_change_id,",
138-
"ss.surveillance_sdd_change_date,",
139-
"ss.lynch_screening_due_date,",
140-
"ss.lynch_sdd_reason_for_change_id,",
141-
"ss.lynch_sdd_change_date,",
142-
"ss.lynch_calculated_sdd,",
143-
"c.date_of_birth,",
141+
"ss.screening_subject_id",
142+
"ss.subject_nhs_number",
143+
"c.person_family_name",
144+
"c.person_given_name",
145+
"ss.datestamp",
146+
"ss.screening_status_id",
147+
"ss.ss_reason_for_change_id",
148+
"ss.screening_status_change_date",
149+
"ss.screening_due_date",
150+
"ss.sdd_reason_for_change_id",
151+
"ss.sdd_change_date",
152+
"ss.calculated_sdd",
153+
"ss.surveillance_screen_due_date",
154+
"ss.calculated_ssdd",
155+
"ss.surveillance_sdd_rsn_change_id",
156+
"ss.surveillance_sdd_change_date",
157+
"ss.lynch_screening_due_date",
158+
"ss.lynch_sdd_reason_for_change_id",
159+
"ss.lynch_sdd_change_date",
160+
"ss.lynch_calculated_sdd",
161+
self.c_dob,
144162
"c.date_of_death ",
145163
]
146164
self.sql_select.append("SELECT " + ", ".join(columns))
@@ -649,7 +667,7 @@ def _check_if_not_modifier_is_valid_for_criteria_key(self) -> None:
649667
)
650668

651669
def _add_criteria_nhs_number(self) -> None:
652-
self.sql_where.append(" c.nhs_number = ':nhs_number' ")
670+
self.sql_where.append(" AND c.nhs_number = :nhs_number ")
653671
self.bind_vars["nhs_number"] = self.criteria_value
654672

655673
def _add_criteria_subject_age(self) -> None:
@@ -2684,7 +2702,7 @@ def _add_criteria_date_field(
26842702
self._add_check_comparing_one_date_with_another(
26852703
date_column_name,
26862704
" = ",
2687-
self._add_years_to_oracle_date("c.date_of_birth", self.criteria_value),
2705+
self._add_years_to_oracle_date(self.c_dob, self.criteria_value),
26882706
False,
26892707
)
26902708
elif (
@@ -2695,9 +2713,7 @@ def _add_criteria_date_field(
26952713
self._add_check_comparing_one_date_with_another(
26962714
date_column_name,
26972715
" = ",
2698-
self._add_years_to_oracle_date(
2699-
"c.date_of_birth", criteria_words[0][:-2]
2700-
),
2716+
self._add_years_to_oracle_date(self.c_dob, criteria_words[0][:-2]),
27012717
False,
27022718
)
27032719
elif self._is_valid_date(self.criteria_value):

0 commit comments

Comments
 (0)