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



166
167
168
# File 'lib/generator/js.rb', line 166

def initialize(doc)
  @doc = doc
end

Class Method Details

.crosswalk_functionsObject

Allow crosswalk functionality to be loaded separately from main JS libraries



292
293
294
295
296
297
# File 'lib/generator/js.rb', line 292

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



256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
# File 'lib/generator/js.rb', line 256

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



170
171
172
# File 'lib/generator/js.rb', line 170

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



236
237
238
239
240
241
242
243
244
245
246
247
248
249
# File 'lib/generator/js.rb', line 236

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



252
253
254
# File 'lib/generator/js.rb', line 252

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_initialize_specifics(data_criteria) ⇒ Object



222
223
224
225
226
227
228
229
230
231
232
233
# File 'lib/generator/js.rb', line 222

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



174
175
176
177
178
179
180
181
182
183
184
185
186
187
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
# File 'lib/generator/js.rb', line 174

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";


  "
  // #########################
  // ##### 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)}
  // 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::DENEX], HQMF::PopulationCriteria::DENEX)}
  #{js_for(population[HQMF::PopulationCriteria::DENEXCEP], HQMF::PopulationCriteria::DENEXCEP)}
  // CV
  #{js_for(population[HQMF::PopulationCriteria::MSRPOPL], HQMF::PopulationCriteria::MSRPOPL)}
  #{js_for(population[HQMF::PopulationCriteria::OBSERV], HQMF::PopulationCriteria::OBSERV)}
  "
end