class HQMF2JS::Generator::JS

Public Class Methods

crosswalk_functions() click to toggle source

Allow crosswalk functionality to be loaded separately from main JS libraries

# 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) click to toggle source
# 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_utils() click to toggle source
# 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
new(doc) click to toggle source

Entry point to JavaScript generator

# File lib/generator/js.rb, line 180
def initialize(doc)
  @doc = doc
end

Public Instance Methods

js_for(criteria_code, type=nil, when_not_found=false) click to toggle source

Generate JS for a HQMF2::PopulationCriteria

# 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) click to toggle source

Generate JS for a HQMF2::DataCriteria

# 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_variables() click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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