Class: QDM::DataElement
- Inherits:
-
Object
- Object
- QDM::DataElement
- Includes:
- Mongoid::Document
- Defined in:
- app/models/qdm/basetypes/data_element.rb
Overview
Represents QDM datatype (parent class of all generated QDM datatype models)
Direct Known Subclasses
AdverseEvent, AllergyIntolerance, AssessmentOrder, AssessmentPerformed, AssessmentRecommended, CareGoal, CommunicationPerformed, DeviceOrder, DeviceRecommended, Diagnosis, DiagnosticStudyOrder, DiagnosticStudyPerformed, DiagnosticStudyRecommended, EncounterOrder, EncounterPerformed, EncounterRecommended, FamilyHistory, ImmunizationAdministered, ImmunizationOrder, InterventionOrder, InterventionPerformed, InterventionRecommended, LaboratoryTestOrder, LaboratoryTestPerformed, LaboratoryTestRecommended, MedicationActive, MedicationAdministered, MedicationDischarge, MedicationDispensed, MedicationOrder, Participation, PatientCareExperience, PatientCharacteristic, PatientCharacteristicBirthdate, PatientCharacteristicClinicalTrialParticipant, PatientCharacteristicEthnicity, PatientCharacteristicExpired, PatientCharacteristicPayer, PatientCharacteristicRace, PatientCharacteristicSex, PhysicalExamOrder, PhysicalExamPerformed, PhysicalExamRecommended, ProcedureOrder, ProcedurePerformed, ProcedureRecommended, ProviderCareExperience, RelatedPerson, SubstanceAdministered, SubstanceOrder, SubstanceRecommended, Symptom
Class Method Summary collapse
-
.demongoize(object) ⇒ Object
Get the object as it was stored in the database, and instantiate this custom class from it.
-
.mongoize(object) ⇒ Object
Takes any possible object and converts it to how it would be stored in the database.
Instance Method Summary collapse
-
#code_system_pairs ⇒ Object
Returns all of the codes on this datatype in a way that is typical to the CQL execution engine.
-
#codes ⇒ Object
Helper method that returns the codes on this data element as QDM::Code objects.
-
#get(attribute) ⇒ Object
Returns the attribute requested on the datatype.
-
#initialize(options = {}) ⇒ DataElement
constructor
A new instance of DataElement.
- #mongoize ⇒ Object
-
#shift_dates(seconds) ⇒ Object
Shift all fields that deal with dates by the given value.
- #shift_facility_location_dates(facility_location, seconds) ⇒ Object
- #shift_facility_location_years(facility_location, year_shift) ⇒ Object
-
#shift_years(year_shift) ⇒ Object
The necessary reason for this function is to avoid a problem when shifting past a year that is a leap year.
-
#to_json(options = nil) ⇒ Object
Include ‘_type’ in any JSON output.
Constructor Details
#initialize(options = {}) ⇒ DataElement
Returns a new instance of DataElement.
19 20 21 22 23 24 25 26 27 28 |
# File 'app/models/qdm/basetypes/data_element.rb', line 19 def initialize( = {}) # class is reserved word. changed to clazz if ['class'] ['clazz'] = ['class'] .delete('class') end super() # default id to the mongo ObjectId for this DataElement if it isnt already defined self.id = _id.to_s unless id? end |
Class Method Details
.demongoize(object) ⇒ Object
Get the object as it was stored in the database, and instantiate this custom class from it.
155 156 157 158 159 160 161 162 163 164 165 166 167 |
# File 'app/models/qdm/basetypes/data_element.rb', line 155 def demongoize(object) return nil unless object object = object.symbolize_keys if object.is_a?(Hash) data_element = QDM.const_get(object[:_type]) data_element.attribute_names.each do |field| data_element.send(field + '=', object[field.to_sym]) end data_element else object end end |
.mongoize(object) ⇒ Object
Takes any possible object and converts it to how it would be stored in the database.
171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
# File 'app/models/qdm/basetypes/data_element.rb', line 171 def mongoize(object) case object when nil then nil when QDM::DataElement then object.mongoize when Hash object = object.symbolize_keys data_element = QDM.const_get(object[:_type]) data_element.attribute_names.each do |field| data_element.send(field + '=', object[field.to_sym]) end data_element.mongoize else object end end |
Instance Method Details
#code_system_pairs ⇒ Object
Returns all of the codes on this datatype in a way that is typical to the CQL execution engine.
37 38 39 40 41 |
# File 'app/models/qdm/basetypes/data_element.rb', line 37 def code_system_pairs codes.collect do |code| { code: code.code, system: code.system } end end |
#codes ⇒ Object
Helper method that returns the codes on this data element as QDM::Code objects.
45 46 47 |
# File 'app/models/qdm/basetypes/data_element.rb', line 45 def codes dataElementCodes.collect { |code| QDM::Code.demongoize(code) } end |
#get(attribute) ⇒ Object
Returns the attribute requested on the datatype.
31 32 33 |
# File 'app/models/qdm/basetypes/data_element.rb', line 31 def get(attribute) send(attribute) if has_attribute?(attribute) end |
#mongoize ⇒ Object
49 50 51 52 53 54 55 |
# File 'app/models/qdm/basetypes/data_element.rb', line 49 def mongoize json_representation = {} attribute_names.each do |field| json_representation[field] = send(field).mongoize end json_representation end |
#shift_dates(seconds) ⇒ Object
Shift all fields that deal with dates by the given value. Given value should be in seconds. Positive values shift forward, negative values shift backwards.
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'app/models/qdm/basetypes/data_element.rb', line 65 def shift_dates(seconds) fields.keys.each do |field| send(field + '=', (send(field).to_time + seconds.seconds).to_datetime) if send(field).is_a? DateTime send(field + '=', (send(field).to_time + seconds.seconds).to_datetime) if send(field).is_a? Time send(field + '=', send(field).shift_dates(seconds)) if (send(field).is_a? Interval) || (send(field).is_a? DataElement) # Special case for facility locations if field == 'facilityLocations' send(field).each do |facility_location| shift_facility_location_dates(facility_location, seconds) end elsif field == 'facilityLocation' facility_location = send(field) unless facility_location.nil? # Guessing something changed in mongoid such that facility_location gets typed to an Object # but this method (I think) expects a Hash. shift_facility_location_dates(facility_location.attributes, seconds) send(field + '=', facility_location) end end end end |
#shift_facility_location_dates(facility_location, seconds) ⇒ Object
88 89 90 91 |
# File 'app/models/qdm/basetypes/data_element.rb', line 88 def shift_facility_location_dates(facility_location, seconds) facility_location['locationPeriod'][:low] = (facility_location['locationPeriod'][:low].to_time + seconds).to_datetime facility_location['locationPeriod'][:high] = (facility_location['locationPeriod'][:high].to_time + seconds).to_datetime end |
#shift_facility_location_years(facility_location, year_shift) ⇒ Object
147 148 149 |
# File 'app/models/qdm/basetypes/data_element.rb', line 147 def shift_facility_location_years(facility_location, year_shift) facility_location.locationPeriod = facility_location.locationPeriod.shift_years(year_shift) end |
#shift_years(year_shift) ⇒ Object
The necessary reason for this function is to avoid a problem when shifting past a year that is a leap year. February 29th dates are handled by moving back to the 28th in non leap years
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'app/models/qdm/basetypes/data_element.rb', line 96 def shift_years(year_shift) fields.keys.each do |field| if send(field).is_a?(QDM::Date) || send(field).is_a?(DateTime) # Do not shift Time values. They are stored as DateTimes with year 0. next if send(field).year.zero? raise RangeError, 'Year was shifted after 9999 or before 0001' if send(field).year + year_shift > 9999 || send(field).year + year_shift < 1 if send(field).month == 2 && send(field).day == 29 && !::Date.leap?(year_shift + send(field).year) if send(field).is_a?(QDM::Date) shifted_date = send(field) shifted_date.year = shifted_date.year + year_shift shifted_date.day = 28 send(field + '=', shifted_date) else send(field + '=', send(field).change(year: year_shift + send(field).year, day: 28)) end elsif send(field).is_a?(QDM::Date) shifted_date = send(field) shifted_date.year = shifted_date.year + year_shift send(field + '=', shifted_date) else send(field + '=', send(field).change(year: year_shift + send(field).year)) end end if send(field).is_a? FacilityLocation facility_location = send(field) unless facility_location.nil? shift_facility_location_years(facility_location, year_shift) send(field + '=', facility_location) end end if field == 'facilityLocations' facilityLocations = send(field) unless facilityLocations.nil? shiftedFacilityLocations = [] facilityLocations.each do |location| # Need to convert to a QDM::FacilityLocation because it is being passed in as a Hash facilityLocation = QDM::FacilityLocation.new(location) shift_facility_location_years(facilityLocation, year_shift) shiftedFacilityLocations << facilityLocation end send(field + '=', shiftedFacilityLocations) end end send(field + '=', send(field).shift_years(year_shift)) if (send(field).is_a? Interval) || (send(field).is_a? DataElement) end end |
#to_json(options = nil) ⇒ Object
Include ‘_type’ in any JSON output. This is necessary for deserialization.
58 59 60 |
# File 'app/models/qdm/basetypes/data_element.rb', line 58 def to_json( = nil) serializable_hash(methods: :_type).to_json() end |