@@ -32,7 +32,6 @@ so the code split as much as possible into small modules
3232 lang = require (' ../lang' )
3333 compat = require (' ../compat' )
3434
35-
3635For every search type we have dedicated module,
3736with indexing and building search expression implementation.
3837
@@ -101,27 +100,36 @@ Then we are returning resulting Bundle.
101100
102101 resource_rows = utils .exec (plv8, honey)
103102 resources = resource_rows .map ((x )-> compat .parse (plv8, x .resource ))
104- count = utils .exec (plv8, countize_query (honey))[0 ].count
103+
104+ should_include_total = (expr .total_method != " no" )
105+
106+ if should_include_total
107+ count = get_count (plv8, honey, expr)
105108
106109 base_url = " #{ query .resourceType } /#{ query .queryString } "
107110
108111 if expr .summary or expr .elements
109112 resources = mask_resources (plv8, expr, idx_db, resources)
110113
111- if expr .include && count > 0
114+ if expr .include && ( count > 0 || ! should_include_total)
112115 includes = search_include .load_includes (plv8, expr .include , resources)
113116 resources = resources .concat (includes)
114117
115- if expr .revinclude && count > 0
118+ if expr .revinclude && ( count > 0 || ! should_include_total)
116119 includes = search_include .load_revincludes (plv8, expr .revinclude , resources)
117120 resources = resources .concat (includes)
118121
122+ if should_include_total
123+ resourceType : ' Bundle'
124+ type : ' searchset'
125+ total : count
126+ link : helpers .search_links (query, expr, count)
127+ entry : resources .map (to_entry)
128+ else
129+ resourceType : ' Bundle'
130+ type : ' searchset'
131+ entry : resources .map (to_entry)
119132
120- resourceType : ' Bundle'
121- type : ' searchset'
122- total : count
123- link : helpers .search_links (query, expr, count)
124- entry : resources .map (to_entry)
125133
126134Helper function to convert resource into entry bundle:
127135TODO: add links
@@ -388,6 +396,27 @@ we just strip limit, offset, order and rewrite select clause:
388396 q .select = [' :count(*) as count' ]
389397 q
390398
399+ get_count = (plv8 , honey , query_obj ) ->
400+ if ! query_obj .total_method || query_obj .total_method is " std"
401+ query_obj .total_method = " std"
402+
403+ utils .exec (plv8, countize_query (honey))[0 ].count
404+ else if query_obj .total_method is " improved"
405+ sql_query = sql (honey)
406+ query = sql_query[0 ].replace / \$ (\d + )/ g , (match , number ) ->
407+ if typeof sql_query[number] is " string"
408+ return ' \' ' + sql_query[number]+ ' \' '
409+ else if typeof sql_query[number] isnt ' undefined'
410+ return sql_query[number]
411+ else
412+ return match
413+ query = query .replace / LIMIT \d + / , " "
414+ query = query .replace / \' / g , ' \'\' '
415+ query = " SELECT count_estimate('#{ query} ');"
416+ tmp = plv8 .execute (query)
417+ tmp[0 ].count_estimate
418+ else
419+ throw new Error (" Invalid value of totalMethod. only 'std', 'improved' and 'no' allowed." )
391420
392421We cache FHIR meta-data index per connection using plv8 object:
393422
0 commit comments