hqmf-parser 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/Gemfile +23 -0
  2. data/README.md +903 -0
  3. data/Rakefile +19 -0
  4. data/VERSION +1 -0
  5. data/lib/hqmf-generator/hqmf-generator.rb +308 -0
  6. data/lib/hqmf-model/attribute.rb +35 -0
  7. data/lib/hqmf-model/data_criteria.rb +322 -0
  8. data/lib/hqmf-model/document.rb +172 -0
  9. data/lib/hqmf-model/population_criteria.rb +90 -0
  10. data/lib/hqmf-model/precondition.rb +85 -0
  11. data/lib/hqmf-model/types.rb +318 -0
  12. data/lib/hqmf-model/utilities.rb +52 -0
  13. data/lib/hqmf-parser.rb +54 -0
  14. data/lib/hqmf-parser/1.0/attribute.rb +68 -0
  15. data/lib/hqmf-parser/1.0/comparison.rb +34 -0
  16. data/lib/hqmf-parser/1.0/data_criteria.rb +105 -0
  17. data/lib/hqmf-parser/1.0/document.rb +209 -0
  18. data/lib/hqmf-parser/1.0/expression.rb +52 -0
  19. data/lib/hqmf-parser/1.0/population_criteria.rb +79 -0
  20. data/lib/hqmf-parser/1.0/precondition.rb +89 -0
  21. data/lib/hqmf-parser/1.0/range.rb +65 -0
  22. data/lib/hqmf-parser/1.0/restriction.rb +157 -0
  23. data/lib/hqmf-parser/1.0/utilities.rb +41 -0
  24. data/lib/hqmf-parser/2.0/data_criteria.rb +319 -0
  25. data/lib/hqmf-parser/2.0/document.rb +165 -0
  26. data/lib/hqmf-parser/2.0/population_criteria.rb +53 -0
  27. data/lib/hqmf-parser/2.0/precondition.rb +44 -0
  28. data/lib/hqmf-parser/2.0/types.rb +223 -0
  29. data/lib/hqmf-parser/2.0/utilities.rb +30 -0
  30. data/lib/hqmf-parser/converter/pass1/data_criteria_converter.rb +254 -0
  31. data/lib/hqmf-parser/converter/pass1/document_converter.rb +183 -0
  32. data/lib/hqmf-parser/converter/pass1/population_criteria_converter.rb +135 -0
  33. data/lib/hqmf-parser/converter/pass1/precondition_converter.rb +164 -0
  34. data/lib/hqmf-parser/converter/pass1/precondition_extractor.rb +159 -0
  35. data/lib/hqmf-parser/converter/pass1/simple_data_criteria.rb +35 -0
  36. data/lib/hqmf-parser/converter/pass1/simple_operator.rb +89 -0
  37. data/lib/hqmf-parser/converter/pass1/simple_population_criteria.rb +10 -0
  38. data/lib/hqmf-parser/converter/pass1/simple_precondition.rb +63 -0
  39. data/lib/hqmf-parser/converter/pass1/simple_restriction.rb +64 -0
  40. data/lib/hqmf-parser/converter/pass2/comparison_converter.rb +91 -0
  41. data/lib/hqmf-parser/converter/pass2/operator_converter.rb +169 -0
  42. data/lib/hqmf-parser/converter/pass3/specific_occurrence_converter.rb +86 -0
  43. data/lib/hqmf-parser/converter/pass3/specific_occurrence_converter_bak.rb +70 -0
  44. data/lib/hqmf-parser/parser.rb +22 -0
  45. data/lib/hqmf-parser/value_sets/value_set_parser.rb +206 -0
  46. data/lib/tasks/coverme.rake +8 -0
  47. data/lib/tasks/hqmf.rake +141 -0
  48. data/lib/tasks/value_sets.rake +23 -0
  49. metadata +159 -0
@@ -0,0 +1,172 @@
1
+ module HQMF
2
+ # Class representing an HQMF document
3
+ class Document
4
+
5
+ MEASURE_PERIOD_ID = "MeasurePeriod"
6
+
7
+ STRATIFIED_POPULATION_TEMPLATE_ID = '2.16.840.1.113883.3.100.1.2'
8
+ STRATIFIED_POPULATION_TEMPLATE_TITLE = 'Stratified'
9
+
10
+ include HQMF::Conversion::Utilities
11
+
12
+ attr_reader :id, :title, :description, :measure_period, :attributes, :populations, :source_data_criteria, :hqmf_id, :hqmf_set_id, :hqmf_version_number
13
+
14
+ # Create a new HQMF::Document which can be converted to JavaScript
15
+ # @param [String] id
16
+ # @param [String] hqmf_id
17
+ # @param [String] hqmf_set_id
18
+ # @param [String] hqmf_version_number
19
+ # @param [String] title
20
+ # @param [String] description
21
+ # @param [Array#PopulationCritera] population_criteria
22
+ # @param [Array#DataCriteria] data_criteria
23
+ # @param [Array#DataCriteria] source_data_criteria
24
+ # @param [Array#Attribute] attributes
25
+ # @param [Array#Hash] populations
26
+ # @param [Range] measure_period
27
+ def initialize(id, hqmf_id, hqmf_set_id, hqmf_version_number, title, description, population_criteria, data_criteria, source_data_criteria, attributes, measure_period, populations=nil)
28
+ @id = id
29
+ @hqmf_id = hqmf_id
30
+ @hqmf_set_id = hqmf_set_id
31
+ @hqmf_version_number = hqmf_version_number
32
+ @title = title
33
+ @description = description
34
+ @population_criteria = population_criteria
35
+ @data_criteria = data_criteria
36
+ @source_data_criteria = source_data_criteria
37
+ @attributes = attributes
38
+ @populations = populations || [
39
+ {
40
+ HQMF::PopulationCriteria::IPP => HQMF::PopulationCriteria::IPP,
41
+ HQMF::PopulationCriteria::DENOM => HQMF::PopulationCriteria::DENOM,
42
+ HQMF::PopulationCriteria::NUMER => HQMF::PopulationCriteria::NUMER,
43
+ HQMF::PopulationCriteria::EXCEP => HQMF::PopulationCriteria::EXCEP,
44
+ HQMF::PopulationCriteria::DENEX => HQMF::PopulationCriteria::DENEX
45
+ }
46
+ ]
47
+ @measure_period = measure_period
48
+ end
49
+
50
+ # Create a new HQMF::Document from a JSON hash keyed with symbols
51
+ def self.from_json(json)
52
+ id = json["id"]
53
+ hqmf_id = json["hqmf_id"]
54
+ hqmf_set_id = json["hqmf_set_id"]
55
+ hqmf_version_number = json["hqmf_version_number"]
56
+ title = json["title"]
57
+ description = json["description"]
58
+
59
+ population_criterias = []
60
+ json["population_criteria"].each do |key, population_criteria|
61
+ population_criterias << HQMF::PopulationCriteria.from_json(key.to_s, population_criteria)
62
+ end if json['population_criteria']
63
+
64
+ data_criterias = []
65
+ json["data_criteria"].each do |key, data_criteria|
66
+ data_criterias << HQMF::DataCriteria.from_json(key.to_s, data_criteria)
67
+ end
68
+
69
+ source_data_criterias = []
70
+ json["source_data_criteria"].each do |key, data_criteria|
71
+ source_data_criterias << HQMF::DataCriteria.from_json(key.to_s, data_criteria)
72
+ end
73
+
74
+ populations = json["populations"] if json["populations"]
75
+
76
+ attributes = json["attributes"].map {|attribute| HQMF::Attribute.from_json(attribute)} if json["attributes"]
77
+
78
+ measure_period = HQMF::Range.from_json(json["measure_period"]) if json["measure_period"]
79
+ HQMF::Document.new(id, hqmf_id, hqmf_set_id, hqmf_version_number, title, description, population_criterias, data_criterias, source_data_criterias, attributes, measure_period,populations)
80
+ end
81
+
82
+ def to_json
83
+ json = build_hash(self, [:id, :hqmf_id, :hqmf_set_id, :hqmf_version_number, :title, :description])
84
+
85
+ json[:population_criteria] = {}
86
+ @population_criteria.each do |population|
87
+ json[:population_criteria].merge! population.to_json
88
+ end
89
+
90
+ json[:data_criteria] = {}
91
+ @data_criteria.each do |data|
92
+ json[:data_criteria].merge! data.to_json
93
+ end
94
+
95
+ json[:source_data_criteria] = {}
96
+ @source_data_criteria.each do |data|
97
+ json[:source_data_criteria].merge! data.to_json
98
+ end
99
+
100
+ x = nil
101
+ json[:attributes] = x if x = json_array(@attributes)
102
+
103
+ json[:populations] = @populations
104
+
105
+ json[:measure_period] = @measure_period.to_json
106
+
107
+ json
108
+ end
109
+
110
+
111
+ # Get all the population criteria defined by the measure
112
+ # @return [Array] an array of HQMF::PopulationCriteria
113
+ def all_population_criteria
114
+ @population_criteria
115
+ end
116
+
117
+ # Get a specific population criteria by id.
118
+ # @param [String] id the population identifier
119
+ # @return [HQMF::PopulationCriteria] the matching criteria, raises an Exception if not found
120
+ def population_criteria(id)
121
+ find(@population_criteria, :id, id)
122
+ end
123
+
124
+ # Get all the data criteria defined by the measure
125
+ # @return [Array] an array of HQMF::DataCriteria describing the data elements used by the measure
126
+ def all_data_criteria
127
+ @data_criteria
128
+ end
129
+
130
+ # Get the source data criteria that are specific occurrences
131
+ # @return [Array] an array of HQMF::DataCriteria describing the data elements used by the measure that are specific occurrences
132
+ def specific_occurrence_source_data_criteria
133
+ return [] if @source_data_criteria.nil?
134
+ @source_data_criteria.select {|dc| !dc.specific_occurrence.nil?}
135
+ end
136
+
137
+
138
+ # @return [Array] an array of HQMF::DataCriteria ids that are actually used in the measure
139
+ def referenced_data_criteria
140
+ data_criteria_ids = []
141
+ @population_criteria.each do |population|
142
+ data_criteria_ids.concat(population.referenced_data_criteria)
143
+ end
144
+ references = []
145
+ data_criteria_ids.each do |id|
146
+ dc = data_criteria(id)
147
+ references << id
148
+ from_dc = dc.referenced_data_criteria(self)
149
+ references.concat(from_dc)
150
+ end
151
+ used_dc = []
152
+ references.uniq.each do |id|
153
+ used_dc << data_criteria(id)
154
+ end
155
+ used_dc
156
+ end
157
+
158
+
159
+ # Get a specific data criteria by id.
160
+ # @param [String] id the data criteria identifier
161
+ # @return [HQMF::DataCriteria] the matching data criteria, raises an Exception if not found
162
+ def data_criteria(id)
163
+ find(@data_criteria, :id, id)
164
+ end
165
+
166
+ private
167
+
168
+ def find(collection, attribute, value)
169
+ collection.find {|e| e.send(attribute)==value}
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,90 @@
1
+ module HQMF
2
+ # Represents an HQMF population criteria, also supports all the same methods as
3
+ # HQMF::Precondition
4
+ class PopulationCriteria
5
+
6
+ include HQMF::Conversion::Utilities
7
+
8
+ attr_reader :preconditions, :id, :type, :title, :hqmf_id
9
+
10
+ IPP = 'IPP'
11
+ DENOM = 'DENOM'
12
+ NUMER = 'NUMER'
13
+ EXCEP = 'EXCEP'
14
+ DENEX = 'DENEX'
15
+
16
+ ALL_POPULATION_CODES = [IPP, DENOM, NUMER, EXCEP, DENEX]
17
+
18
+ # Create a new population criteria
19
+ # @param [String] id
20
+ # @param [String] hqmf_id
21
+ # @param [Array#Precondition] preconditions
22
+ # @param [String] title (optional)
23
+ def initialize(id, hqmf_id, type, preconditions, title='')
24
+ @id = id
25
+ @hqmf_id = hqmf_id
26
+ @preconditions = preconditions
27
+ @type = type
28
+ @title=title
29
+ end
30
+
31
+ # Create a new population criteria from a JSON hash keyed off symbols
32
+ def self.from_json(id, json)
33
+ preconditions = json["preconditions"].map do |precondition|
34
+ HQMF::Precondition.from_json(precondition)
35
+ end if json['preconditions']
36
+ type = json["type"]
37
+ title = json['title']
38
+ hqmf_id = json['hqmf_id']
39
+
40
+ HQMF::PopulationCriteria.new(id, hqmf_id, type, preconditions, title)
41
+ end
42
+
43
+ def to_json
44
+ {self.id.to_sym => base_json}
45
+ end
46
+
47
+ def base_json
48
+ x = nil
49
+ json = build_hash(self, [:conjunction?, :type, :title, :hqmf_id])
50
+ json[:preconditions] = x if x = json_array(@preconditions)
51
+ json
52
+ end
53
+
54
+ # Return true of this precondition represents a conjunction with nested preconditions
55
+ # or false of this precondition is a reference to a data criteria
56
+ def conjunction?
57
+ true
58
+ end
59
+
60
+ # Get the conjunction code, e.g. allTrue, atLeastOneTrue
61
+ # @return [String] conjunction code
62
+ def conjunction_code
63
+
64
+ case @type
65
+ when IPP, DENOM, NUMER
66
+ HQMF::Precondition::ALL_TRUE
67
+ when EXCEP, DENEX, EXCEP
68
+ HQMF::Precondition::AT_LEAST_ONE_TRUE
69
+ else
70
+ raise "Unknown population type [#{@type}]"
71
+ end
72
+
73
+ end
74
+
75
+ # Can't have negation on population so this is the same as conjunction_code
76
+ def conjunction_code_with_negation
77
+ conjunction_code
78
+ end
79
+
80
+ def referenced_data_criteria
81
+ data_criteria_ids = []
82
+ @preconditions.each do |precondition|
83
+ data_criteria_ids.concat(precondition.referenced_data_criteria)
84
+ end if @preconditions
85
+ data_criteria_ids
86
+ end
87
+
88
+ end
89
+
90
+ end
@@ -0,0 +1,85 @@
1
+ module HQMF
2
+
3
+ class Precondition
4
+
5
+ include HQMF::Conversion::Utilities
6
+
7
+ AT_LEAST_ONE_TRUE = 'atLeastOneTrue'
8
+ AT_LEAST_ONE_FALSE = 'atLeastOneFalse'
9
+ ALL_TRUE = 'allTrue'
10
+ ALL_FALSE = 'allFalse'
11
+ NEGATIONS = {
12
+ AT_LEAST_ONE_TRUE => ALL_FALSE,
13
+ ALL_FALSE => AT_LEAST_ONE_TRUE,
14
+ ALL_TRUE => AT_LEAST_ONE_FALSE,
15
+ AT_LEAST_ONE_FALSE => ALL_TRUE
16
+ }
17
+
18
+ attr_reader :id, :preconditions, :reference, :conjunction_code
19
+ attr_accessor :negation
20
+
21
+ # Create a new population criteria
22
+ # @param [Array#Precondition] preconditions
23
+ # @param [Reference] reference
24
+ # @param [String] conjunction_code
25
+ def initialize(id, preconditions, reference, conjunction_code, negation)
26
+ @preconditions = preconditions || []
27
+ @reference = reference
28
+ @conjunction_code = conjunction_code
29
+ @negation = negation
30
+ @id = id
31
+ end
32
+
33
+ def conjunction_code_with_negation
34
+ if negation
35
+ NEGATIONS[conjunction_code]
36
+ else
37
+ conjunction_code
38
+ end
39
+ end
40
+
41
+ # Create a new population criteria from a JSON hash keyed off symbols
42
+ def self.from_json(json)
43
+ preconditions = []
44
+ id = json["id"] if json["id"]
45
+ preconditions = json["preconditions"].map {|precondition| HQMF::Precondition.from_json(precondition)} if json["preconditions"]
46
+ reference = Reference.new(json["reference"]) if json["reference"]
47
+ conjunction_code = json["conjunction_code"] if json["conjunction_code"]
48
+ negation = json["negation"] if json["negation"]
49
+
50
+ HQMF::Precondition.new(id, preconditions, reference, conjunction_code, negation)
51
+ end
52
+
53
+ def to_json
54
+ x = nil
55
+ json = {}
56
+ json[:id] = self.id
57
+ json[:reference] = self.reference.id if self.reference
58
+ json[:preconditions] = x if x = json_array(@preconditions)
59
+ json[:conjunction_code] = self.conjunction_code if self.conjunction_code
60
+ json[:negation] = self.negation if self.negation
61
+ json
62
+ end
63
+
64
+ # Return true of this precondition represents a conjunction with nested preconditions
65
+ # or false of this precondition is a reference to a data criteria
66
+ def conjunction?
67
+ @preconditions.length>0
68
+ end
69
+
70
+ def referenced_data_criteria
71
+ data_criteria_ids = []
72
+ if @preconditions.empty?
73
+ data_criteria_ids << self.reference.id
74
+ else
75
+ @preconditions.each do |precondition|
76
+ data_criteria_ids.concat(precondition.referenced_data_criteria)
77
+ end
78
+ end
79
+ data_criteria_ids
80
+ end
81
+
82
+ end
83
+
84
+
85
+ end
@@ -0,0 +1,318 @@
1
+ module HQMF
2
+
3
+ # Used to represent 'any value' in criteria that require a value be present but
4
+ # don't specify any restrictions on that value
5
+ class AnyValue
6
+ include HQMF::Conversion::Utilities
7
+ attr_reader :type
8
+
9
+ def initialize(type='ANYNonNull')
10
+ @type = type
11
+ end
12
+
13
+ def derived?
14
+ false
15
+ end
16
+
17
+ def self.from_json(json)
18
+ type = json["type"] || 'ANYNonNull'
19
+ HQMF::AnyValue.new(type)
20
+ end
21
+
22
+ def to_json
23
+ hash = build_hash(self, [:type])
24
+ hash
25
+ end
26
+ end
27
+
28
+ # Represents a bound within a HQMF pauseQuantity, has a value, a unit and an
29
+ # inclusive/exclusive indicator
30
+ class Value
31
+ include HQMF::Conversion::Utilities
32
+ attr_reader :unit,:expression
33
+ attr_accessor :type, :value, :inclusive
34
+
35
+ # Create a new HQMF::Value
36
+ # @param [String] type
37
+ # @param [String] unit
38
+ # @param [String] value
39
+ # @param [Boolean] inclusive
40
+ # @param [Boolean] derived
41
+ # @param [String] expression
42
+ def initialize(type,unit,value,inclusive,derived,expression)
43
+ @type = type || 'PQ'
44
+ @unit = unit
45
+ @value = value
46
+ @inclusive = inclusive == nil ? true : inclusive
47
+ @derived = derived || false
48
+ @expression = expression
49
+ end
50
+
51
+ def self.from_json(json)
52
+ type = json["type"] if json["type"]
53
+ unit = json["unit"] if json["unit"]
54
+ value = json["value"] if json["value"]
55
+ inclusive = json["inclusive?"] unless json["inclusive?"].nil?
56
+ derived = json["derived?"] unless json["derived?"].nil?
57
+ expression = json["expression"] if json["expression"]
58
+
59
+ HQMF::Value.new(type,unit,value,inclusive,derived,expression)
60
+ end
61
+
62
+
63
+ def inclusive?
64
+ @inclusive
65
+ end
66
+
67
+ def derived?
68
+ @derived
69
+ end
70
+
71
+ def to_json
72
+ build_hash(self, [:type,:unit,:value,:inclusive?,:derived?,:expression])
73
+ end
74
+
75
+ def stringify
76
+ "#{inclusive? ? '=' : ''}#{value}#{unit ? ' '+unit : ''}"
77
+ end
78
+
79
+ def ==(other)
80
+ check_equality(self,other)
81
+ end
82
+
83
+ end
84
+
85
+ # Represents a HQMF physical quantity which can have low and high bounds
86
+ class Range
87
+ include HQMF::Conversion::Utilities
88
+ attr_accessor :type, :low, :high, :width
89
+
90
+ # Create a new HQMF::Value
91
+ # @param [String] type
92
+ # @param [Value] low
93
+ # @param [Value] high
94
+ # @param [Value] width
95
+ def initialize(type,low,high,width)
96
+ @type = type || 'IVL_PQ'
97
+ @low = low
98
+ @high = high
99
+ @width = width
100
+ end
101
+
102
+ def self.from_json(json)
103
+ type = json["type"] if json["type"]
104
+ low = HQMF::Value.from_json(json["low"]) if json["low"]
105
+ high = HQMF::Value.from_json(json["high"]) if json["high"]
106
+ width = HQMF::Value.from_json(json["width"]) if json["width"]
107
+
108
+ HQMF::Range.new(type,low,high,width)
109
+ end
110
+
111
+ def to_json
112
+ json = build_hash(self, [:type])
113
+ json[:low] = self.low.to_json if self.low
114
+ json[:high] = self.high.to_json if self.high
115
+ json[:width] = self.width.to_json if self.width
116
+ json
117
+ end
118
+
119
+ def stringify
120
+ operator = ""
121
+ if (@high && @low)
122
+ if (@high.value == @low.value and @high.inclusive? and low.inclusive?)
123
+ "#{@low.stringify}"
124
+ else
125
+ ">#{@low.stringify} and <#{@high.stringify}}"
126
+ end
127
+ elsif (@high)
128
+ "<#{@high.stringify}"
129
+ elsif (@low)
130
+ ">#{@low.stringify}"
131
+ else
132
+ raise "cannot convert range to string"
133
+ end
134
+ end
135
+
136
+ def ==(other)
137
+ check_equality(self,other)
138
+ end
139
+
140
+
141
+ end
142
+
143
+ # Represents a HQMF effective time which is a specialization of a interval
144
+ class EffectiveTime < Range
145
+ def initialize(low,high,width)
146
+ super('IVL_TS', low, high, width)
147
+ end
148
+
149
+ def type
150
+ 'IVL_TS'
151
+ end
152
+
153
+ end
154
+
155
+ # Represents a HQMF CD value which has a code and codeSystem
156
+ class Coded
157
+ include HQMF::Conversion::Utilities
158
+ attr_reader :type, :system, :code, :code_list_id, :title
159
+
160
+ # Create a new HQMF::Coded
161
+ # @param [String] type
162
+ # @param [String] system
163
+ # @param [String] code
164
+ # @param [String] code_list_id
165
+ def initialize(type,system,code,code_list_id=nil,title=nil)
166
+ @type = type
167
+ @system = system
168
+ @code = code
169
+ @code_list_id = code_list_id
170
+ @title = title
171
+ end
172
+
173
+ def self.for_code_list(code_list_id,title=nil)
174
+ HQMF::Coded.new('CD',nil,nil,code_list_id,title)
175
+ end
176
+
177
+ def self.for_single_code(system,code,title=nil)
178
+ HQMF::Coded.new('CD',system,code,nil,title)
179
+ end
180
+
181
+ def self.from_json(json)
182
+ type = json["type"] if json["type"]
183
+ system = json["system"] if json["system"]
184
+ code = json["code"] if json["code"]
185
+ code_list_id = json["code_list_id"] if json["code_list_id"]
186
+ title = json["title"] if json["title"]
187
+
188
+ HQMF::Coded.new(type,system,code,code_list_id,title)
189
+ end
190
+
191
+ def to_json
192
+ build_hash(self, [:type,:system,:code,:code_list_id,:title])
193
+ end
194
+
195
+ def value
196
+ code
197
+ end
198
+
199
+ def derived?
200
+ false
201
+ end
202
+
203
+ def unit
204
+ nil
205
+ end
206
+
207
+ def ==(other)
208
+ check_equality(self,other)
209
+ end
210
+
211
+ end
212
+
213
+ class TemporalReference
214
+ include HQMF::Conversion::Utilities
215
+
216
+ TYPES = ['DURING','SBS','SAS','SBE','SAE','EBS','EAS','EBE','EAE','SDU','EDU','ECW','SCW','CONCURRENT']
217
+ INVERSION = {'SBS' => 'SAS','EAE' => 'EBE','SAS' => 'SBS','EBE' => 'EAE','SBE' => 'EAS','EAS' => 'SBE','SAE' => 'EBS','EBS' => 'SAE'}
218
+
219
+ attr_reader :type, :reference, :range
220
+
221
+ # @param [String] type
222
+ # @param [Reference] reference
223
+ # @param [Range] range
224
+ def initialize(type, reference, range)
225
+ @type = type
226
+ @reference = reference
227
+ if (range.is_a? HQMF::Value)
228
+ @range = HQMF::Range.new('IVL_PQ', range, range, nil)
229
+ else
230
+ @range = range
231
+ end
232
+ end
233
+
234
+ def self.from_json(json)
235
+ type = json["type"] if json["type"]
236
+ reference = HQMF::Reference.new(json["reference"]) if json["reference"]
237
+ range = HQMF::Range.from_json(json["range"]) if json["range"]
238
+
239
+ HQMF::TemporalReference.new(type,reference,range)
240
+ end
241
+
242
+
243
+ def to_json
244
+ x = nil
245
+ json = build_hash(self, [:type])
246
+ json[:reference] = @reference.to_json if @reference
247
+ json[:range] = @range.to_json if @range
248
+ json
249
+ end
250
+
251
+ def ==(other)
252
+ check_equality(self,other)
253
+ end
254
+
255
+ end
256
+
257
+ class SubsetOperator
258
+ include HQMF::Conversion::Utilities
259
+
260
+ TYPES = ['COUNT', 'FIRST', 'SECOND', 'THIRD', 'FOURTH', 'FIFTH', 'RECENT', 'LAST', 'MIN', 'MAX', 'DATEDIFF']
261
+
262
+ attr_accessor :type, :value
263
+ # @param [String] type
264
+ # @param [Value] value
265
+ def initialize(type,value)
266
+ @type = type
267
+ if (value.is_a? HQMF::Value)
268
+ value.inclusive = true
269
+ @value = HQMF::Range.new('IVL_PQ',value,value,nil)
270
+ else
271
+ @value = value
272
+ end
273
+ end
274
+
275
+ def self.from_json(json)
276
+ type = json["type"] if json["type"]
277
+ value = HQMF::Range.from_json(json["value"]) if json["value"]
278
+
279
+ HQMF::SubsetOperator.new(type,value)
280
+ end
281
+
282
+
283
+ def to_json
284
+ x = nil
285
+ json = build_hash(self, [:type])
286
+ json[:value] = @value.to_json if @value
287
+ json
288
+ end
289
+
290
+ def ==(other)
291
+ check_equality(self,other)
292
+ end
293
+
294
+ end
295
+
296
+
297
+ # Represents a HQMF reference from a precondition to a data criteria
298
+ class Reference
299
+ include HQMF::Conversion::Utilities
300
+ attr_accessor :id
301
+
302
+ # Create a new HQMF::Reference
303
+ # @param [String] id
304
+ def initialize(id)
305
+ @id = id
306
+ end
307
+
308
+ def to_json
309
+ @id
310
+ end
311
+
312
+ def ==(other)
313
+ check_equality(self,other)
314
+ end
315
+
316
+ end
317
+
318
+ end