lib/measures/loading/cql_loader.rb in bonnie_bundler-2.0.1 vs lib/measures/loading/cql_loader.rb in bonnie_bundler-2.0.2
- old
+ new
@@ -40,14 +40,30 @@
# Create CQL Measure
hqmf_model.backfill_patient_characteristics_with_codes(cql_artifacts[:all_codes_and_code_names])
json = hqmf_model.to_json
json.convert_keys_to_strings
+ # Set the code list ids of data criteria and source data criteria that use direct reference codes to GUIDS.
+ json['source_data_criteria'], json['data_criteria'] = set_data_criteria_code_list_ids(json, cql_artifacts)
+
+ # Create CQL Measure
+ measure = Measures::Loader.load_hqmf_cql_model_json(json, user, cql_artifacts[:all_value_set_oids], main_cql_library, cql_artifacts[:cql_definition_dependency_structure],
+ cql_artifacts[:elms], cql_artifacts[:elm_annotations], files[:CQL], nil, cql_artifacts[:value_set_oid_version_objects])
+ measure['episode_of_care'] = measure_details['episode_of_care']
+ measure['type'] = measure_details['type']
+
+ # Create, associate and save the measure package.
+ measure.package = CqlMeasurePackage.new(file: BSON::Binary.new(zip_file.read()))
+ measure.package.save
+
+ measure
+ end
+
+ def self.set_data_criteria_code_list_ids(json, cql_artifacts)
# Loop over data criteria to search for data criteria that is using a single reference code.
# Once found set the Data Criteria's 'code_list_id' to our fake oid. Do the same for source data criteria.
json['data_criteria'].each do |data_criteria_name, data_criteria|
- # We do not want to replace an existing code_list_id. Skip.
unless data_criteria['code_list_id']
if data_criteria['inline_code_list']
# Check to see if inline_code_list contains the correct code_system and code for a direct reference code.
data_criteria['inline_code_list'].each do |code_system, code_list|
# Loop over all single code reference objects.
@@ -62,22 +78,11 @@
end
end
end
end
end
-
- # Create CQL Measure
- measure = Measures::Loader.load_hqmf_cql_model_json(json, user, cql_artifacts[:all_value_set_oids], main_cql_library, cql_artifacts[:cql_definition_dependency_structure],
- cql_artifacts[:elms], cql_artifacts[:elm_annotations], files[:CQL], nil, cql_artifacts[:value_set_oid_version_objects])
- measure['episode_of_care'] = measure_details['episode_of_care']
- measure['type'] = measure_details['type']
-
- # Create, associate and save the measure package.
- measure.package = CqlMeasurePackage.new(file: BSON::Binary.new(zip_file.read()))
- measure.package.save
-
- measure
+ return json['source_data_criteria'], json['data_criteria']
end
def self.load(file, user, measure_details, vsac_user=nil, vsac_password=nil, overwrite_valuesets=false, cache=false, includeDraft=false, ticket_granting_ticket=nil)
measure = nil
Dir.mktmpdir do |dir|
@@ -243,20 +248,21 @@
code_system_name = code_system_def['id']
code_system_version = code_system_def['version']
code_sets[code_system_name] ||= []
code_sets[code_system_name] << code_reference['id']
- # Generate a unique number as our fake "oid"
- code_guid = SecureRandom.uuid
- # Keep a list of generated_guids and a hash of guids with code system names and codes.
- single_code_references << { guid: code_guid, code_system_name: code_system_name, code: code_reference['id'] }
-
- all_codes_and_code_names[code_guid] = code_sets
- # Create a new "ValueSet" and "Concept" object and save.
- valueSet = HealthDataStandards::SVS::ValueSet.new({oid: code_guid, display_name: code_reference['name'], version: '' ,concepts: [], user_id: user.id})
- concept = HealthDataStandards::SVS::Concept.new({code: code_reference['id'], code_system_name: code_system_name, code_system_version: code_system_version, display_name: code_reference['name']})
- valueSet.concepts << concept
- valueSet.save!
+ # Generate a unique number as our fake "oid" based on parameters that identify the DRC
+ code_hash = "drc-" + Digest::SHA2.hexdigest("#{code_system_name} #{code_reference['id']} #{code_reference['name']} #{code_system_version}") # Keep a list of generated_guids and a hash of guids with code system names and codes.
+ single_code_references << { guid: code_hash, code_system_name: code_system_name, code: code_reference['id'] }
+ all_codes_and_code_names[code_hash] = code_sets
+ # code_hashs are unique hashes, there's no sense in adding duplicates to the ValueSet collection
+ if !HealthDataStandards::SVS::ValueSet.all().where(oid: code_hash, user_id: user.id).first()
+ # Create a new "ValueSet" and "Concept" object and save.
+ valueSet = HealthDataStandards::SVS::ValueSet.new({oid: code_hash, display_name: code_reference['name'], version: '' ,concepts: [], user_id: user.id})
+ concept = HealthDataStandards::SVS::Concept.new({code: code_reference['id'], code_system_name: code_system_name, code_system_version: code_system_version, display_name: code_reference['name']})
+ valueSet.concepts << concept
+ valueSet.save!
+ end
end
end
end
# Returns a list of single code objects and a complete list of code systems and codes for all valuesets on the measure.
return single_code_references, all_codes_and_code_names