Skip to content

Commit 4ac28a3

Browse files
committed
NRL-1205 dont ignore category if type is given for search
1 parent 6fb1ed1 commit 4ac28a3

File tree

2 files changed

+69
-28
lines changed

2 files changed

+69
-28
lines changed

api/consumer/searchDocumentReference/tests/test_search_document_reference_consumer.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,60 @@ def test_search_document_reference_happy_path_with_category(
247247
}
248248

249249

250+
@mock_aws
251+
@mock_repository
252+
def test_search_document_reference_happy_path_with_category_and_type(
253+
repository: DocumentPointerRepository,
254+
):
255+
doc_ref = load_document_reference("Y05868-736253002-Valid")
256+
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
257+
repository.create(doc_pointer)
258+
259+
# Second pointer different category
260+
doc_ref2 = load_document_reference("Y05868-736253002-Valid")
261+
doc_ref2.id = "Y05868-736253002-Valid2"
262+
doc_ref2.type.coding[0].code = PointerTypes.NEWS2_CHART.coding_value()
263+
doc_ref2.type.coding[0].display = TYPE_ATTRIBUTES.get(
264+
PointerTypes.NEWS2_CHART.value
265+
).get("display")
266+
doc_ref2.category[0].coding[0].code = Categories.OBSERVATIONS.coding_value()
267+
doc_ref2.category[0].coding[0].display = CATEGORY_ATTRIBUTES.get(
268+
Categories.OBSERVATIONS.value
269+
).get("display")
270+
repository.create(DocumentPointer.from_document_reference(doc_ref2))
271+
272+
event = create_test_api_gateway_event(
273+
headers=create_headers(),
274+
query_string_parameters={
275+
"subject:identifier": "https://fhir.nhs.uk/Id/nhs-number|6700028191",
276+
"category": "http://snomed.info/sct|734163000",
277+
"type": "http://snomed.info/sct|736253002",
278+
},
279+
)
280+
281+
result = handler(event, create_mock_context())
282+
body = result.pop("body")
283+
284+
assert result == {
285+
"statusCode": "200",
286+
"headers": default_response_headers(),
287+
"isBase64Encoded": False,
288+
}
289+
parsed_body = json.loads(body)
290+
assert parsed_body == {
291+
"resourceType": "Bundle",
292+
"type": "searchset",
293+
"link": [
294+
{
295+
"relation": "self",
296+
"url": "https://pytest.api.service.nhs.uk/record-locator/consumer/FHIR/R4/DocumentReference?subject:identifier=https://fhir.nhs.uk/Id/nhs-number|6700028191&type=http://snomed.info/sct|736253002&category=http://snomed.info/sct|734163000",
297+
}
298+
],
299+
"total": 1,
300+
"entry": [{"resource": doc_ref.model_dump(exclude_none=True)}],
301+
}
302+
303+
250304
@mock_aws
251305
@mock_repository
252306
def test_search_document_reference_happy_path_with_multiple_categories(

layer/nrlf/core/dynamodb/repository.py

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -226,41 +226,16 @@ def search(
226226
nhs_number=nhs_number,
227227
custodian=custodian,
228228
pointer_types=pointer_types,
229+
categories=categories,
229230
)
230231

231232
key_conditions = ["patient_key = :patient_key"]
232233
filter_expressions = []
233234
expression_names = {}
234235
expression_values = {":patient_key": f"P#{nhs_number}"}
235236

236-
if len(pointer_types) == 1:
237-
# Optimisation for single pointer type
238-
category_id, type_id = _get_sk_ids_for_type(pointer_types[0])
239-
patient_sort = f"C#{category_id}#T#{type_id}"
240-
key_conditions.append("begins_with(patient_sort, :patient_sort)")
241-
expression_values[":patient_sort"] = patient_sort
242-
else:
243-
# Handle single/multiple categories and pointer types with filter expressions
244-
if len(categories) == 1:
245-
split_category = categories[0].split("|")
246-
category_id = (
247-
SYSTEM_SHORT_IDS[split_category[0]] + "-" + split_category[1]
248-
)
249-
patient_sort = f"C#{category_id}"
250-
key_conditions.append("begins_with(patient_sort, :patient_sort)")
251-
expression_values[":patient_sort"] = patient_sort
252-
253-
if len(categories) > 1:
254-
expression_names["#category"] = "category"
255-
category_filters = [
256-
f"#category = :category_{i}" for i in range(len(categories))
257-
]
258-
category_filter_values = {
259-
f":category_{i}": categories[i] for i in range(len(categories))
260-
}
261-
filter_expressions.append(f"({' OR '.join(category_filters)})")
262-
expression_values.update(category_filter_values)
263-
237+
# Add pointer_types filter if provided
238+
if pointer_types:
264239
expression_names["#pointer_type"] = "type"
265240
types_filters = [
266241
f"#pointer_type = :type_{i}" for i in range(len(pointer_types))
@@ -271,6 +246,18 @@ def search(
271246
filter_expressions.append(f"({' OR '.join(types_filters)})")
272247
expression_values.update(types_filter_values)
273248

249+
# Add categories filter if provided
250+
if categories:
251+
expression_names["#category"] = "category"
252+
category_filters = [
253+
f"#category = :category_{i}" for i in range(len(categories))
254+
]
255+
category_filter_values = {
256+
f":category_{i}": categories[i] for i in range(len(categories))
257+
}
258+
filter_expressions.append(f"({' OR '.join(category_filters)})")
259+
expression_values.update(category_filter_values)
260+
274261
if custodian:
275262
logger.log(
276263
LogReference.REPOSITORY016,

0 commit comments

Comments
 (0)