@@ -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)
0 commit comments