33import os
44
55sys .path .insert (0 , os .path .abspath (os .path .join (os .path .dirname (__file__ ), "../.." )))
6- print ("PYTHONPATH set to:" , sys .path [0 ])
7- from classes .subject_selection_criteria_key import (
8- SubjectSelectionCriteriaKey ,
9- )
10- from classes .episode_type import EpisodeType
11- from classes .subject_has_episode import SubjectHasEpisode
6+ # print("PYTHONPATH set to:", sys.path[0]) # Uncomment for local debug
127from classes .selection_builder_exception import SelectionBuilderException
138
149
@@ -26,40 +21,38 @@ class MockSelectionBuilder:
2621 - Use dump_sql() to inspect the resulting SQL
2722 """
2823
29- def __init__ (self , criteria_key , criteria_value ):
24+ def __init__ (self , criteria_key , criteria_value , criteria_comparator = ">=" ):
3025 self .criteria_key = criteria_key
3126 self .criteria_key_name = criteria_key .description
3227 self .criteria_value = criteria_value
28+ self .criteria_comparator = criteria_comparator
3329 self .sql_where = []
3430
35- def _add_criteria_subject_has_episodes (self , episode_type = None ):
31+ # === Example testable method ===
32+ # Replace this with the one you want to test,
33+ # then use utils/oracle/test_subject_criteria_dev.py to run your scenarios
34+
35+ def _add_criteria_subject_lower_fobt_age (self ) -> None :
36+ """
37+ Adds a SQL constraint that compares a subject's lower FOBT age eligibility
38+ using a comparator and a value (e.g. '>= 55' or '>= default').
39+
40+ If value is 'default', it's replaced with a national parameter lookup:
41+ pkg_parameters.f_get_national_param_val(10)
42+ """
3643 try :
37- value = SubjectHasEpisode .by_description (self .criteria_value .lower ())
38- if value == SubjectHasEpisode .YES :
39- self .sql_where .append (" AND EXISTS ( SELECT 'ep' " )
40- elif value == SubjectHasEpisode .NO :
41- self .sql_where .append (" AND NOT EXISTS ( SELECT 'ep' " )
42- else :
43- raise SelectionBuilderException (
44- self .criteria_key_name , self .criteria_value
45- )
46- except Exception :
47- raise SelectionBuilderException (self .criteria_key_name , self .criteria_value )
44+ value = self .criteria_value
45+ comparator = self .criteria_comparator
4846
49- self .sql_where .append (" FROM ep_subject_episode_t ep " )
50- self .sql_where .append (
51- " WHERE ep.screening_subject_id = ss.screening_subject_id "
52- )
47+ if value .lower () == "default" :
48+ value = "pkg_parameters.f_get_national_param_val (10)"
5349
54- if episode_type is not None :
5550 self .sql_where .append (
56- f" AND ep.episode_type_id = { episode_type .valid_value_id } "
51+ f"AND pkg_bcss_common.f_get_ss_lower_age_limit (ss.screening_subject_id) "
52+ f"{ comparator } { value } "
5753 )
58-
59- if self .criteria_key == SubjectSelectionCriteriaKey .SUBJECT_HAS_AN_OPEN_EPISODE :
60- self .sql_where .append (" AND ep.episode_end_date IS NULL " )
61-
62- self .sql_where .append (" )" )
54+ except Exception :
55+ raise SelectionBuilderException (self .criteria_key_name , self .criteria_value )
6356
6457 def dump_sql (self ):
6558 return "\n " .join (self .sql_where )
0 commit comments