Skip to content

Commit 0aad46d

Browse files
authored
Merge pull request #16 from KainosSoftwareLtd/kainos-develop
Kainos develop
2 parents 381b007 + fbc4485 commit 0aad46d

File tree

3 files changed

+31
-31
lines changed

3 files changed

+31
-31
lines changed

src/fhir/search.litcoffee

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -220,13 +220,13 @@ To build search query we need to
220220
throw new Error("Expected query.resourceType attribute")
221221
222222
next_alias = mk_alias()
223-
224223
alias = next_alias()
225224
226225
expr = parser.parse(query.resourceType, query.queryString || "")
227226
expr = expand.expand(idx, expr)
228227
expr = normalize_operators(expr)
229228
229+
table_name = namings.table_name(plv8, expr.query)
230230
expr.where = to_hsql(alias, expr.where)
231231
232232
if expr.ids
@@ -255,11 +255,13 @@ To build search query we need to
255255
]
256256
)
257257
258-
if expr.sort
258+
if expr.sort && !is_nested_order(expr.sort)
259259
ordering = order_hsql(alias, expr.sort)
260260
261261
if expr.sort && is_nested_order(expr.sort)
262-
nested_order_query = get_nested_order_query(expr, alias)
262+
nested_table_alias = next_alias()
263+
ordering = order_hsql(nested_table_alias, expr.sort)
264+
nested_order_query = get_nested_order_query(expr, alias, nested_table_alias, table_name)
263265
hsql =
264266
select: nested_order_query.select,
265267
from: nested_order_query.from,
@@ -339,43 +341,42 @@ implementation based on searchType
339341
return special_resource_types[table_name]
340342
return "'"+table_name+"'"
341343
342-
build_join_part = (table, nested_table, alias)->
344+
build_join_part = (table, nested_table, main_table_alias, nested_table_alias)->
343345
switch table
344346
when "appointment"
345-
return [[['$raw', "#{nested_table} AS #{alias}"],['$raw', "#{alias}.id = subelem_id"]]]
347+
return [[['$raw', "#{nested_table} AS #{nested_table_alias}"],['$raw', "#{nested_table_alias}.id = subelem_id"]]]
346348
when "encounter"
347349
resource = resource_type(nested_table)
348350
if resource == "'participant'"
349-
return [[['$raw', "#{nested_table} AS #{alias}"],['$raw', "#{alias}.id = subelem_id"]]]
351+
return [[['$raw', "#{nested_table} AS #{nested_table_alias}"],['$raw', "#{nested_table_alias}.id = subelem_id"]]]
350352
else
351-
return [[['$raw', "#{table}"], ['$raw', "#{alias}.id=split_part((\"#{table}\".resource->#{resource}->>'reference'), '/', 2)"]]]
353+
return [[['$raw', "#{table} AS #{main_table_alias}"], ['$raw', "#{nested_table_alias}.id=split_part((\"#{main_table_alias}\".resource->#{resource}->>'reference'), '/', 2)"]]]
352354
353-
build_from_part = (table, nested_table, alias)->
355+
build_from_part = (table, nested_table, main_table_alias, nested_table_alias)->
354356
switch table
355357
when "appointment"
356-
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}"]
358+
return ['$raw', "(SELECT split_part((json_array_elements((\"#{table}\".resource->'participant')::json)->'actor'->>'reference')::text, '/', 2)::text as subelem_id, \"#{table}\".* FROM \"#{table}\") AS #{main_table_alias}"]
357359
when "encounter"
358360
resource = resource_type(nested_table)
359361
if resource == "'participant'"
360-
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}"]
362+
return ['$raw', "(SELECT split_part((json_array_elements((\"#{table}\".resource->'participant')::json)->'individual'->>'reference')::text, '/', 2)::text as subelem_id, \"#{table}\".* FROM \"#{table}\") AS #{main_table_alias}"]
361363
else
362-
return ['$alias', ['$q', "#{nested_table}"], alias]
364+
return ['$alias', ['$q', "#{nested_table}"], nested_table_alias]
363365
364-
get_nested_order_query = (expr, alias)->
366+
get_nested_order_query = (expr, main_table_alias, nested_table_alias, table_name)->
365367
nested_table_name = nested_table(expr.sort)
366-
table_name = namings.table_name(plv8, expr.query)
367368
if table_name == "appointment"
368369
{
369-
select: ":#{table_name}.*",
370-
from: build_from_part(table_name, nested_table_name, alias),
371-
join: build_join_part(table_name, nested_table_name, alias),
370+
select: ":#{main_table_alias}.*",
371+
from: build_from_part(table_name, nested_table_name, main_table_alias, nested_table_alias),
372+
join: build_join_part(table_name, nested_table_name, main_table_alias, nested_table_alias),
372373
where: expr.where
373374
}
374375
else if table_name == "encounter"
375376
{
376-
select: ":#{table_name}.*",
377-
from: build_from_part(table_name, nested_table_name, alias),
378-
join: build_join_part(table_name, nested_table_name, alias),
377+
select: ":#{main_table_alias}.*",
378+
from: build_from_part(table_name, nested_table_name, main_table_alias, nested_table_alias),
379+
join: build_join_part(table_name, nested_table_name, main_table_alias, nested_table_alias),
379380
where: expr.where
380381
}
381382
@@ -428,7 +429,6 @@ we just strip limit, offset, order and rewrite select clause:
428429
get_count = (plv8, honey, query_obj) ->
429430
if !query_obj.total_method || query_obj.total_method is "exact"
430431
query_obj.total_method = "exact"
431-
432432
utils.exec(plv8, countize_query(honey))[0].count
433433
else if query_obj.total_method is "estimated"
434434
sql_query= sql(honey)

src/fhir/search_date.litcoffee

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,16 +107,16 @@ Function to convert query parameter into range.
107107
exports.value_to_range = value_to_range
108108
109109
overlap_expr = (tbl, meta, value)->
110-
["$&&", extract_expr(meta), value_to_range(meta.operator, value.value)]
110+
["$&&", extract_expr(meta, tbl), value_to_range(meta.operator, value.value)]
111111
112112
not_overlap_expr = (tbl, meta, value)->
113-
['$not', ["$&&", extract_expr(meta), value_to_range(meta.operator, value.value)]]
113+
['$not', ["$&&", extract_expr(meta, tbl), value_to_range(meta.operator, value.value)]]
114114
115115
missing_expr = (tbl, meta, value)->
116116
if value.value == 'false'
117-
["$notnull", extract_expr(meta)]
117+
["$notnull", extract_expr(meta, tbl)]
118118
else
119-
["$null", extract_expr(meta)]
119+
["$null", extract_expr(meta, tbl)]
120120
121121
TODO = -> throw new Error("Date search: unimplemented")
122122

src/fhir/search_nested.litcoffee

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@
66
search_common = require('./search_common')
77
88
paths = {
9-
"patient.given" : "\"tbl1\".resource->'name'->0->'given'->0",
10-
"patient.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'"
9+
"patient.given" : "resource->'name'->0->'given'->0",
10+
"patient.family" : "resource->'name'->0->'family'->0",
11+
"patient.birthdate" : "resource->'birthDate'",
12+
"practitioner.given" : "resource->'name'->'given'->0",
13+
"practitioner.family" : "resource->'name'->'family'->0",
14+
"location.name" : "resource->>'name'"
1515
}
1616
1717
exports.order_expression = (tbl, meta)->
1818
elem = meta.name
19-
expression = paths[elem]
19+
expression = tbl+"."+paths[elem]
2020
if meta.operator == "desc"
2121
expression += " DESC"
2222
['$raw', expression]

0 commit comments

Comments
 (0)