@@ -33,15 +33,6 @@ def _get_sk_ids_for_type(pointer_type: str) -> tuple:
3333 return category_id , type_id
3434
3535
36- def _get_sk_id_for_category (category : str ) -> tuple :
37- category_system , category_code = category .split ("|" )
38- if category_system not in SYSTEM_SHORT_IDS :
39- raise ValueError (f"Unknown system for category: { category_system } " )
40- category_id = SYSTEM_SHORT_IDS [category_system ] + "-" + category_code
41-
42- return category_id
43-
44-
4536class Repository (ABC , Generic [RepositoryModel ]):
4637 ITEM_TYPE : Type [RepositoryModel ]
4738
@@ -249,14 +240,26 @@ def search(
249240 key_conditions .append ("begins_with(patient_sort, :patient_sort)" )
250241 expression_values [":patient_sort" ] = patient_sort
251242
252- if len (categories ) == 1 :
253- # Optimisation for single category
254- category_id = _get_sk_id_for_category (categories [0 ])
243+ # Handle multiple categories and pointer types with filter expressions
244+ if len (pointer_types ) > 1 :
245+ expression_names ["#pointer_type" ] = "type"
246+ types_filters = [
247+ f"#pointer_type = :type_{ i } " for i in range (len (pointer_types ))
248+ ]
249+ types_filter_values = {
250+ f":type_{ i } " : pointer_types [i ] for i in range (len (pointer_types ))
251+ }
252+ filter_expressions .append (f"({ ' OR ' .join (types_filters )} )" )
253+ expression_values .update (types_filter_values )
254+
255+ # if pointer_types then category filter is not needed
256+ if not pointer_types and len (categories ) == 1 :
257+ category_id = categories [0 ].replace ("|" , "-" )
255258 patient_sort = f"C#{ category_id } "
256259 key_conditions .append ("begins_with(patient_sort, :patient_sort)" )
257260 expression_values [":patient_sort" ] = patient_sort
258261
259- if len (categories ) > 1 :
262+ if not pointer_types and len (categories ) > 1 :
260263 expression_names ["#category" ] = "category"
261264 category_filters = [
262265 f"#category = :category_{ i } " for i in range (len (categories ))
@@ -267,18 +270,6 @@ def search(
267270 filter_expressions .append (f"({ ' OR ' .join (category_filters )} )" )
268271 expression_values .update (caetgory_filter_values )
269272
270- # Handle multiple categories and pointer types with filter expressions
271- if len (pointer_types ) > 1 :
272- expression_names ["#pointer_type" ] = "type"
273- types_filters = [
274- f"#pointer_type = :type_{ i } " for i in range (len (pointer_types ))
275- ]
276- types_filter_values = {
277- f":type_{ i } " : pointer_types [i ] for i in range (len (pointer_types ))
278- }
279- filter_expressions .append (f"({ ' OR ' .join (types_filters )} )" )
280- expression_values .update (types_filter_values )
281-
282273 if custodian :
283274 logger .log (
284275 LogReference .REPOSITORY016 ,
0 commit comments