Class: HQMF2JS::Generator::JS

Inherits:
Object
  • Object
show all
Defined in:
lib/generator/js.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(doc) ⇒ JS

Entry point to JavaScript generator



180
181
182
# File 'lib/generator/js.rb', line 180

def initialize(doc)
  @doc = doc
end

Class Method Details

.crosswalk_functionsObject

Allow crosswalk functionality to be loaded separately from main JS libraries



325
326
327
328
329
330
# File 'lib/generator/js.rb', line 325

def self.crosswalk_functions
  ctx = Sprockets::Environment.new(File.expand_path("../../..", __FILE__))
  Tilt::CoffeeScriptTemplate.default_bare = true
  ctx.append_path "app/assets/javascripts"
  ctx.find_asset('crosswalk').to_s
end

.library_functions(check_crosswalk = false, include_underscore = true) ⇒ Object



289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
# File 'lib/generator/js.rb', line 289

def self.library_functions(check_crosswalk=false, include_underscore=true)
  ctx = Sprockets::Environment.new(File.expand_path("../../..", __FILE__))
  Tilt::CoffeeScriptTemplate.default_bare = true
  ctx.append_path "app/assets/javascripts"

  libraries = []

  if include_underscore
    libraries += ["// #########################\n// ###### Underscore.js #######\n// #######################\n",
                  ctx.find_asset('underscore').to_s]
  end

  libraries += ["// #########################\n// ###### PATIENT API #######\n// #########################\n",
                HqueryPatientApi::Generator.patient_api_javascript.to_s,
                "// #########################\n// ## SPECIFIC OCCURRENCES ##\n// #########################\n",
                ctx.find_asset('specifics').to_s,
                "// #########################\n// ### LIBRARY FUNCTIONS ####\n// #########################\n",
                ctx.find_asset('hqmf_util').to_s,
                "// #########################\n// ### PATIENT EXTENSION ####\n// #########################\n",
                ctx.find_asset('patient_api_extension').to_s,
                "// #########################\n// ## CUSTOM CALCULATIONS ###\n// #########################\n",
                ctx.find_asset('custom_calculations').to_s,
                "// #########################\n// ##### LOGGING UTILS ######\n// #########################\n",
                ctx.find_asset('logging_utils').to_s]

  # check for code set crosswalks
  if (check_crosswalk)
    libraries += ["// #########################\n// ##### CROSSWALK EXTENSION ######\n// #########################\n",
                  ctx.find_asset('crosswalk').to_s]
  end

  libraries.join("\n")

end

.map_reduce_utilsObject



184
185
186
# File 'lib/generator/js.rb', line 184

def self.map_reduce_utils
  File.read(File.expand_path(File.join('..', '..', "assets",'javascripts','libraries','map_reduce_utils.js'), __FILE__))
end

Instance Method Details

#js_for(criteria_code, type = nil, when_not_found = false) ⇒ Object

Generate JS for a HQMF2::PopulationCriteria



257
258
259
260
261
262
263
264
265
266
267
268
269
270
# File 'lib/generator/js.rb', line 257

def js_for(criteria_code, type=nil, when_not_found=false)
  # for multiple populations, criteria code will be something like IPP_1 and type will be IPP
  type ||= criteria_code
  criteria = @doc.population_criteria(criteria_code)
  if criteria && criteria.preconditions && criteria.preconditions.length > 0
    if type==HQMF::PopulationCriteria::OBSERV
      HQMF2JS::Generator.render_template('observation_criteria', {'doc' => @doc, 'criteria' => criteria, 'type'=>type})
    else
      HQMF2JS::Generator.render_template('population_criteria', {'doc' => @doc, 'criteria' => criteria, 'type'=>type})
    end
  else
    "hqmfjs.#{type} = function(patient) { return new Boolean(#{when_not_found}); }"
  end
end

#js_for_data_criteria(force_sources = nil) ⇒ Object

Generate JS for a HQMF2::DataCriteria



273
274
275
# File 'lib/generator/js.rb', line 273

def js_for_data_criteria(force_sources=nil)
  HQMF2JS::Generator.render_template('data_criteria', {'all_criteria' => @doc.specific_occurrence_source_data_criteria(force_sources).concat(@doc.all_data_criteria), 'measure_period' => @doc.measure_period})
end

#js_for_variablesObject



277
278
279
280
281
282
283
284
285
286
287
# File 'lib/generator/js.rb', line 277

def js_for_variables()
  variables_js = ""
  variables_js += "hqmfjs.VARIABLES = function(patient, initialSpecificContext) {\n"
  @doc.source_data_criteria.each do |criteria|
    if criteria.variable && !criteria.specific_occurrence
      variables_js += "hqmfjs." + criteria.id + "(patient, initialSpecificContext);\n"
    end
  end
  variables_js += "return false;\n}"
  variables_js
end

#js_initialize_specifics(data_criteria) ⇒ Object



243
244
245
246
247
248
249
250
251
252
253
254
# File 'lib/generator/js.rb', line 243

def js_initialize_specifics(data_criteria)
  specific_occurrences = []
  data_criteria.each do |criteria|
    if (criteria.specific_occurrence)
      specific_occurrences << {id: "#{criteria.id}", type: "#{criteria.specific_occurrence_const}", function: "#{criteria.source_data_criteria}"}
    end
  end
  json_list = specific_occurrences.map {|occurrence| occurrence.to_json}
  specifics_list = json_list.join(',')
  specifics_list = ",#{specifics_list}" unless specifics_list.empty?
  "hqmfjs.initializeSpecifics = function(patient_api, hqmfjs) { hqmf.SpecificsManager.initialize(patient_api,hqmfjs#{specifics_list}) }"
end

#to_js(population_index = 0, codes = nil, force_sources = nil) ⇒ Object



188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
# File 'lib/generator/js.rb', line 188

def to_js(population_index=0, codes=nil, force_sources=nil)
  population_index ||= 0
  population = @doc.populations[population_index]

  if codes
    oid_dictionary = HQMF2JS::Generator::CodesToJson.hash_to_js(codes)
  else
    oid_dictionary = "<%= oid_dictionary %>"
  end

  sub_ids = ('a'..'zz').to_a
  sub_id = @doc.populations.size > 1 ? "'#{sub_ids[population_index]}'" : "null";

  stratified = !population[HQMF::PopulationCriteria::STRAT].nil?

  "
  // #########################
  // ##### DATA ELEMENTS #####
  // #########################

  hqmfjs.nqf_id = '#{@doc.id}';
  hqmfjs.hqmf_id = '#{@doc.hqmf_id}';
  hqmfjs.sub_id = #{sub_id};
  if (typeof(test_id) == 'undefined') hqmfjs.test_id = null;

  OidDictionary = #{oid_dictionary};

  #{js_for_data_criteria(force_sources)}

  // #########################
  // ##### MEASURE LOGIC #####
  // #########################

  #{js_initialize_specifics(@doc.source_data_criteria)}

  // INITIAL PATIENT POPULATION
  #{js_for(population[HQMF::PopulationCriteria::IPP], HQMF::PopulationCriteria::IPP)}
  // STRATIFICATION
  #{(stratified ? js_for(population[HQMF::PopulationCriteria::STRAT], HQMF::PopulationCriteria::STRAT, true) : 'hqmfjs.'+HQMF::PopulationCriteria::STRAT+'=null;')}
  // DENOMINATOR
  #{js_for(population[HQMF::PopulationCriteria::DENOM], HQMF::PopulationCriteria::DENOM, true)}
  // NUMERATOR
  #{js_for(population[HQMF::PopulationCriteria::NUMER], HQMF::PopulationCriteria::NUMER)}
  #{js_for(population[HQMF::PopulationCriteria::NUMEX], HQMF::PopulationCriteria::NUMEX)}
  #{js_for(population[HQMF::PopulationCriteria::DENEX], HQMF::PopulationCriteria::DENEX)}
  #{js_for(population[HQMF::PopulationCriteria::DENEXCEP], HQMF::PopulationCriteria::DENEXCEP)}
  // CV
  #{js_for(population[HQMF::PopulationCriteria::MSRPOPL], HQMF::PopulationCriteria::MSRPOPL, true)}
  #{js_for(population[HQMF::PopulationCriteria::MSRPOPLEX], HQMF::PopulationCriteria::MSRPOPLEX)}
  #{js_for(population[HQMF::PopulationCriteria::OBSERV], HQMF::PopulationCriteria::OBSERV)}
  // VARIABLES
  #{js_for_variables()}
  "
end