Class: HealthDataStandards::CQM::Measure

Inherits:
Object
  • Object
show all
Includes:
Mongoid::Document, Mongoid::Timestamps
Defined in:
lib/health-data-standards/models/cqm/measure.rb

Constant Summary collapse

MSRPOPL =
'MSRPOPL'

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.all_by_measureObject

Finds all measures and groups the sub measures

Returns:

  • Array - This returns an Array of Hashes. Each Hash will represent a top level measure with an ID, name, and category. It will also have an array called subs containing hashes with an ID and name for each sub-measure.



101
102
103
104
105
106
107
108
# File 'lib/health-data-standards/models/cqm/measure.rb', line 101

def self.all_by_measure
  reduce = 'function(obj,prev) {
              if (obj.sub_id != null)
                prev.subs.push({id : obj.id + obj.sub_id, name : obj.subtitle});
            }'

  self.moped_session.command( :group=> {:ns=>"measures", :key => {:id=>1, :name=>1, :category=>1}, :initial => {:subs => []}, "$reduce" => reduce})["retval"]
end

.categoriesObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/health-data-standards/models/cqm/measure.rb', line 49

def self.categories
  pipeline = []
  pipeline << {'$group' => {_id: "$id",
                            name: {"$first" => "$name"},
                            description: {"$first" => "$description"},
                            subs: {'$push' => {"sub_id" => "$sub_id", "short_subtitle" => "$short_subtitle"}},
                            sub_ids: {'$push' => "$sub_id"},
                            nqf_id: {"$first" => "$nqf_id"},
                            cms_id: {"$first" => "$cms_id"},
                            continuous_variable: {"$first" => "$continuous_variable"},
                            category: {'$first' => "$category"}}}

  pipeline << {'$group' => {_id: "$category",
                            measures: {'$push' => {"id" => "$_id",
                                       'name' => "$name",
                                       'description' => "$description",
                                       'subs' => "$subs",
                                       'sub_ids' => "$sub_ids",
                                       'nqf_id' => "$nqf_id",
                                       'cms_id' => "$cms_id",
                                       'continuous_variable' => "$continuous_variable"
                                      }}}}

  pipeline << {'$project' => {'category' => '$_id', 'measures' => 1, '_id' => 0}}

  pipeline << {'$sort' => {"category" => 1}}
  Mongoid.default_session.command(aggregate: 'measures', pipeline: pipeline)['result']
end

.installedObject



93
94
95
# File 'lib/health-data-standards/models/cqm/measure.rb', line 93

def self.installed
  Measure.order_by([["id", :asc],["sub_id", :asc]]).to_a
end

Instance Method Details

#all_data_criteriaObject



131
132
133
134
135
136
137
138
139
140
# File 'lib/health-data-standards/models/cqm/measure.rb', line 131

def all_data_criteria
  return @crit if @crit
  @crit = []
  self.data_criteria.each do |dc|
    dc.each_pair do |k,v|
      @crit << HQMF::DataCriteria.from_json(k,v)
    end
  end
  @crit
end

#as_hqmf_modelObject

Returns the hqmf-parser’s ruby implementation of an HQMF document. Rebuild from population_criteria, data_criteria, and measure_period JSON



81
82
83
# File 'lib/health-data-standards/models/cqm/measure.rb', line 81

def as_hqmf_model
  @hqmf ||=  HQMF::Document.from_json(self.hqmf_document)
end

#build_pre_filters!Object



168
169
170
171
172
173
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
# File 'lib/health-data-standards/models/cqm/measure.rb', line 168

def build_pre_filters!
  dc = self.data_criteria.inject({}) do |all_dc, single_dc|
    key = single_dc.keys.first
    value = single_dc.values.first
    all_dc[key] = value
    all_dc
  end
  dc.each_pair do |criteria_name, data_criteria|
    if data_criteria['definition'] == 'patient_characteristic_birthdate'
      if data_criteria_in_population?(self.ipp_id, criteria_name)
        prefilter = Prefilter.new(record_field: 'birthdate',
                                  effective_time_based: true)
        if data_criteria['temporal_references']
          data_criteria['temporal_references'].each do |tr|
            if tr['type'] == 'SBS' && tr['reference'] == 'MeasurePeriod'
              years = nil
              if tr['range']['high']
                prefilter.comparison = '$gte'
                years = tr['range']['high']['value'].to_i
              elsif tr['range']['low']
                prefilter.comparison = '$lte'
                years = tr['range']['low']['value'].to_i
              end

              prefilter.effective_time_offset = 1 + years
              self.prefilters << prefilter
            end
          end
        end
      end
    end
  end
end

#continuous?Boolean

Returns:

  • (Boolean)


123
124
125
# File 'lib/health-data-standards/models/cqm/measure.rb', line 123

def continuous?
  population_ids[MSRPOPL]
end

#display_nameObject



110
111
112
# File 'lib/health-data-standards/models/cqm/measure.rb', line 110

def display_name
  "#{self['cms_id']}/#{self['nqf_id']} - #{name}"
end

#ipp_idObject

For submeasures, this will return something like IPP_1



160
161
162
163
164
165
166
# File 'lib/health-data-standards/models/cqm/measure.rb', line 160

def ipp_id
  ipp_hqmf_id = self.population_ids['IPP']
  pop_id, pop_criteria = hqmf_document['population_criteria'].find do |population_id, population_criteria|
    population_criteria['hqmf_id'] == ipp_hqmf_id
  end
  pop_id
end

#is_cv?Boolean

Returns:

  • (Boolean)


89
90
91
# File 'lib/health-data-standards/models/cqm/measure.rb', line 89

def is_cv?
  ! population_ids[MSRPOPL].nil?
end

#keyObject



85
86
87
# File 'lib/health-data-standards/models/cqm/measure.rb', line 85

def key
  "#{self['id']}#{sub_id}"
end

#measure_idObject



119
120
121
# File 'lib/health-data-standards/models/cqm/measure.rb', line 119

def measure_id
  self['id']
end

#prefilter_query!(effective_time) ⇒ Object

Builds the query hash to pass to MongoDB Calling this method will create Prefilters if they do not exist on the measure



145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/health-data-standards/models/cqm/measure.rb', line 145

def prefilter_query!(effective_time)
  self.build_pre_filters! if self.prefilters.empty?

  if self.prefilters.count == 1
    self.prefilters.first.build_query_hash(effective_time)
  else
    self.prefilters.inject({}) do |query, pf|
      query.merge(pf.build_query_hash(effective_time)) do |key, new_val, old_val|
        new_val.merge(old_val)
      end
    end
  end
end

#set_idObject



115
116
117
# File 'lib/health-data-standards/models/cqm/measure.rb', line 115

def set_id
  self.hqmf_set_id
end

#titleObject



127
128
129
# File 'lib/health-data-standards/models/cqm/measure.rb', line 127

def title
  self.name
end