Skip to content

Commit 028853d

Browse files
Merge pull request #7 from KainosSoftwareLtd/VEL-1157-extension-tosort-on-conditions-on-nested-fields
bugfixes and nested sorting on location
2 parents 516dae3 + cbc609d commit 028853d

File tree

2 files changed

+52
-20
lines changed

2 files changed

+52
-20
lines changed

src/fhir/search.litcoffee

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ appropriate elements from resource by path
5555

5656
DEFAULT_RESOURCES_PER_PAGE = 10
5757
58+
special_resource_types = {
59+
"practitioner" : "'participant'",
60+
"location" : "'location'->0->'location'"
61+
}
5862
This is main function:
5963

6064
@param query [Object]
@@ -293,23 +297,50 @@ implementation based on searchType
293297
if name.split(".").length > 1
294298
return name.split(".")[0]
295299
300+
resource_type = (table_name)->
301+
if special_resource_types[table_name]
302+
return special_resource_types[table_name]
303+
return "'"+table_name+"'"
304+
305+
build_join_part = (table, nested_table, alias)->
306+
switch table
307+
when "appointment"
308+
return [[['$raw', "#{nested_table} AS #{alias}"],['$raw', "#{alias}.id = subelem_id"]]]
309+
when "encounter"
310+
resource = resource_type(nested_table)
311+
if resource == "'participant'"
312+
return [[['$raw', "#{nested_table} AS #{alias}"],['$raw', "#{alias}.id = subelem_id"]]]
313+
else
314+
return [[['$raw', "#{table}"], ['$raw', "#{alias}.id=split_part((\"#{table}\".resource->#{resource}->>'reference'), '/', 2)"]]]
315+
316+
build_from_part = (table, nested_table, alias)->
317+
switch table
318+
when "appointment"
319+
return ['$raw', "(SELECT split_part((json_array_elements((\"#{table}\".resource->'participant')::json)->'actor'->>'reference')::text, '/', 2)::text as subelem_id, \"#{table}\".* FROM \"#{table}\") AS #{table}"]
320+
when "encounter"
321+
resource = resource_type(nested_table)
322+
if resource == "'participant'"
323+
return ['$raw', "(SELECT split_part((json_array_elements((\"#{table}\".resource->'participant')::json)->'individual'->>'reference')::text, '/', 2)::text as subelem_id, \"#{table}\".* FROM \"#{table}\") AS #{table}"]
324+
else
325+
return ['$alias', ['$q', "#{nested_table}"], alias]
326+
296327
get_nested_order_query = (expr, alias)->
297-
nested_table_name = nested_table(expr.sort)
298-
table_name = namings.table_name(plv8, expr.query)
299-
if table_name == "appointment"
300-
{
301-
select: ":#{table_name}.*",
302-
from: ['$raw', "(SELECT split_part((json_array_elements((\"#{table_name}\".resource->'participant')::json)->'actor'->>'reference')::text, '/', 2)::text as subelem_id, \"#{table_name}\".* FROM \"#{table_name}\") AS #{table_name}"],
303-
join: [[["$raw", "#{nested_table_name} AS #{alias}"],["$raw", "#{alias}.id = subelem_id"]]],
304-
where: expr.where
305-
}
306-
else if table_name == "encounter"
307-
{
308-
select: ":#{table_name}.*",
309-
from: ['$alias', ['$q', "#{nested_table_name}"], alias],
310-
join: [["#{table_name}", "#{alias}.id=split_part((\"#{table_name}\".resource->'#{nested_table_name}'->>'reference'), '/', 2)"]],
311-
where: expr.where
312-
}
328+
nested_table_name = nested_table(expr.sort)
329+
table_name = namings.table_name(plv8, expr.query)
330+
if table_name == "appointment"
331+
{
332+
select: ":#{table_name}.*",
333+
from: build_from_part(table_name, nested_table_name, alias),
334+
join: build_join_part(table_name, nested_table_name, alias),
335+
where: expr.where
336+
}
337+
else if table_name == "encounter"
338+
{
339+
select: ":#{table_name}.*",
340+
from: build_from_part(table_name, nested_table_name, alias),
341+
join: build_join_part(table_name, nested_table_name, alias),
342+
where: expr.where
343+
}
313344
314345

315346
### Handling chained parameters

src/fhir/search_nested.litcoffee

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,18 @@
88
paths = {
99
"patient.given" : "\"tbl1\".resource->'name'->0->'given'->0",
1010
"patient.family" : "\"tbl1\".resource->'name'->0->'family'->0",
11-
"patient.birthDate" : "\"tbl1\".resource->'birthDate'",
12-
"practitioner.given" : "\"tbl1\".resource->'name'->0->'given'->0",
13-
"practitioner.family" : "\"tbl1\".resource->'name'->0->'family'->0",
11+
"patient.birthdate" : "\"tbl1\".resource->'birthDate'",
12+
"practitioner.given" : "\"tbl1\".resource->'name'->'given'->0",
13+
"practitioner.family" : "\"tbl1\".resource->'name'->'family'->0",
14+
"location.name" : "\"tbl1\".resource->>'name'"
1415
}
1516
1617
exports.order_expression = (tbl, meta)->
1718
elem = meta.name
1819
expression = paths[elem]
1920
if meta.operator == "desc"
2021
expression += " DESC"
21-
expression
22+
['$raw', expression]
2223
2324
exports.order_expression.plv8_signature =
2425
arguments: ['text', 'json']

0 commit comments

Comments
 (0)