conceptql 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +226 -117
  3. data/LICENSE +21 -0
  4. data/README.md +35 -83
  5. data/bin/conceptql +2 -1
  6. data/bin/conceptql_utils +6 -0
  7. data/config/multiple_vocabularies.csv +4 -0
  8. data/config/provenance.yml +489 -0
  9. data/config/race.yml +50 -0
  10. data/config/vocabularies.csv +87 -0
  11. data/lib/conceptql/behaviors/code_lister.rb +23 -0
  12. data/lib/conceptql/behaviors/drugish.rb +17 -0
  13. data/lib/conceptql/behaviors/labish.rb +19 -0
  14. data/lib/conceptql/behaviors/metadatable.rb +226 -73
  15. data/lib/conceptql/behaviors/provenanceable.rb +26 -0
  16. data/lib/conceptql/behaviors/single_event.rb +11 -0
  17. data/lib/conceptql/behaviors/timeless.rb +11 -0
  18. data/lib/conceptql/behaviors/utilizable.rb +206 -0
  19. data/lib/conceptql/behaviors/windowable.rb +27 -0
  20. data/lib/conceptql/cli.rb +117 -108
  21. data/lib/conceptql/columnizer.rb +75 -0
  22. data/lib/conceptql/data_model/base.rb +462 -0
  23. data/lib/conceptql/data_model/gdm.rb +155 -0
  24. data/lib/conceptql/data_model/gdm_wide.rb +42 -0
  25. data/lib/conceptql/data_model/omopv4_plus.rb +12 -0
  26. data/lib/conceptql/data_model.rb +30 -0
  27. data/lib/conceptql/database.rb +214 -0
  28. data/lib/conceptql/date_adjuster.rb +66 -18
  29. data/lib/conceptql/diagram.rb +243 -0
  30. data/lib/conceptql/lexicon/lexicon_gdm.rb +47 -0
  31. data/lib/conceptql/lexicon/lexicon_no_db.rb +49 -0
  32. data/lib/conceptql/lexicon/lexicon_ohdsi.rb +63 -0
  33. data/lib/conceptql/lexicon/lexicon_strategy.rb +116 -0
  34. data/lib/conceptql/lexicon.rb +111 -0
  35. data/lib/conceptql/nodifier.rb +65 -24
  36. data/lib/conceptql/operators/after.rb +34 -14
  37. data/lib/conceptql/operators/any_overlap.rb +8 -6
  38. data/lib/conceptql/operators/before.rb +34 -10
  39. data/lib/conceptql/operators/binary_operator_operator.rb +66 -23
  40. data/lib/conceptql/operators/casting_operator.rb +51 -36
  41. data/lib/conceptql/operators/co_reported.rb +111 -0
  42. data/lib/conceptql/operators/concurrent_within.rb +69 -0
  43. data/lib/conceptql/operators/contains.rb +12 -8
  44. data/lib/conceptql/operators/count.rb +17 -9
  45. data/lib/conceptql/operators/date_range.rb +48 -14
  46. data/lib/conceptql/operators/death.rb +14 -4
  47. data/lib/conceptql/operators/dedup.rb +31 -0
  48. data/lib/conceptql/operators/during.rb +7 -12
  49. data/lib/conceptql/operators/episode.rb +146 -0
  50. data/lib/conceptql/operators/equal.rb +9 -3
  51. data/lib/conceptql/operators/ethnicity.rb +49 -0
  52. data/lib/conceptql/operators/except.rb +19 -12
  53. data/lib/conceptql/operators/filter.rb +23 -8
  54. data/lib/conceptql/operators/first.rb +16 -3
  55. data/lib/conceptql/operators/from.rb +52 -4
  56. data/lib/conceptql/operators/gender.rb +34 -11
  57. data/lib/conceptql/operators/hospice.rb +19 -0
  58. data/lib/conceptql/operators/hospitalization.rb +19 -0
  59. data/lib/conceptql/operators/information_periods.rb +36 -0
  60. data/lib/conceptql/operators/invalid.rb +35 -0
  61. data/lib/conceptql/operators/last.rb +16 -3
  62. data/lib/conceptql/operators/match.rb +91 -0
  63. data/lib/conceptql/operators/multiple_vocabularies.rb +172 -0
  64. data/lib/conceptql/operators/numeric.rb +65 -23
  65. data/lib/conceptql/operators/numeric_filter.rb +68 -0
  66. data/lib/conceptql/operators/occurrence.rb +153 -32
  67. data/lib/conceptql/operators/one_in_two_out.rb +237 -38
  68. data/lib/conceptql/operators/operator.rb +624 -178
  69. data/lib/conceptql/operators/pass_thru.rb +17 -3
  70. data/lib/conceptql/operators/person.rb +18 -6
  71. data/lib/conceptql/operators/person_filter.rb +9 -3
  72. data/lib/conceptql/operators/place_of_service_filter.rb +43 -0
  73. data/lib/conceptql/operators/provenance.rb +55 -0
  74. data/lib/conceptql/operators/provider_filter.rb +62 -0
  75. data/lib/conceptql/operators/race.rb +55 -7
  76. data/lib/conceptql/operators/read.rb +168 -0
  77. data/lib/conceptql/operators/recall.rb +49 -14
  78. data/lib/conceptql/operators/snf.rb +19 -0
  79. data/lib/conceptql/operators/sum.rb +29 -12
  80. data/lib/conceptql/operators/temporal_operator.rb +108 -16
  81. data/lib/conceptql/operators/time_window.rb +20 -32
  82. data/lib/conceptql/operators/trim_date.rb +71 -0
  83. data/lib/conceptql/operators/trim_date_end.rb +28 -40
  84. data/lib/conceptql/operators/trim_date_start.rb +28 -41
  85. data/lib/conceptql/operators/union.rb +67 -6
  86. data/lib/conceptql/operators/vocabulary.rb +151 -0
  87. data/lib/conceptql/paths.rb +41 -0
  88. data/lib/conceptql/query.rb +191 -26
  89. data/lib/conceptql/query_modifiers/gdm/admission_date_query_modifier.rb +46 -0
  90. data/lib/conceptql/query_modifiers/gdm/drug_query_modifier.rb +54 -0
  91. data/lib/conceptql/query_modifiers/gdm/lab_query_modifier.rb +57 -0
  92. data/lib/conceptql/query_modifiers/gdm/pos_query_modifier.rb +46 -0
  93. data/lib/conceptql/query_modifiers/gdm/provenance_query_modifier.rb +45 -0
  94. data/lib/conceptql/query_modifiers/gdm/provider_query_modifier.rb +53 -0
  95. data/lib/conceptql/query_modifiers/gdm_wide/admission_date_query_modifier.rb +42 -0
  96. data/lib/conceptql/query_modifiers/gdm_wide/drug_query_modifier.rb +52 -0
  97. data/lib/conceptql/query_modifiers/gdm_wide/lab_query_modifier.rb +55 -0
  98. data/lib/conceptql/query_modifiers/gdm_wide/pos_query_modifier.rb +37 -0
  99. data/lib/conceptql/query_modifiers/gdm_wide/provenance_query_modifier.rb +38 -0
  100. data/lib/conceptql/query_modifiers/omopv4_plus/admission_date_query_modifier.rb +45 -0
  101. data/lib/conceptql/query_modifiers/omopv4_plus/drug_query_modifier.rb +80 -0
  102. data/lib/conceptql/query_modifiers/omopv4_plus/pos_query_modifier.rb +47 -0
  103. data/lib/conceptql/query_modifiers/omopv4_plus/provenance_query_modifier.rb +45 -0
  104. data/lib/conceptql/query_modifiers/omopv4_plus/provider_query_modifier.rb +26 -0
  105. data/lib/conceptql/query_modifiers/query_modifier.rb +20 -0
  106. data/lib/conceptql/rdbms/duckdb.rb +25 -0
  107. data/lib/conceptql/rdbms/generic.rb +120 -0
  108. data/lib/conceptql/rdbms/postgres.rb +51 -0
  109. data/lib/conceptql/rdbms/spark.rb +22 -0
  110. data/lib/conceptql/rdbms.rb +22 -0
  111. data/lib/conceptql/scope.rb +481 -31
  112. data/lib/conceptql/sql_formatters/formatter.rb +25 -0
  113. data/lib/conceptql/sql_formatters.rb +22 -0
  114. data/lib/conceptql/utils.rb +113 -0
  115. data/lib/conceptql/utils_cli.rb +17 -0
  116. data/lib/conceptql/version.rb +3 -1
  117. data/lib/conceptql/visitors/metadata_extractor.rb +54 -0
  118. data/lib/conceptql/vocabularies/behaviors/costish.rb +24 -0
  119. data/lib/conceptql/vocabularies/behaviors/gdmish.rb +19 -0
  120. data/lib/conceptql/vocabularies/behaviors/omopish.rb +32 -0
  121. data/lib/conceptql/vocabularies/dynamic_vocabularies.rb +63 -0
  122. data/lib/conceptql/vocabularies/entry.rb +138 -0
  123. data/lib/conceptql/vocabularies/vocabulary_class_factory.rb +85 -0
  124. data/lib/conceptql/window/base.rb +26 -0
  125. data/lib/conceptql/window/date_range.rb +25 -0
  126. data/lib/conceptql/window/table.rb +116 -0
  127. data/lib/conceptql/window.rb +72 -0
  128. data/lib/conceptql.rb +65 -2
  129. data/lib/sequel/extensions/pg_ctas_explain.rb +22 -0
  130. data/lib/sequel/extensions/pg_vacuum_table.rb +23 -0
  131. data/schemas/gdm.yml +882 -0
  132. data/schemas/gdm_wide.yml +757 -0
  133. data/schemas/ohdsi_vocabs.yml +143 -0
  134. data/schemas/omopv4_plus.yml +729 -0
  135. data/schemas/omopv4_plus_more_ignorables.tsv +13 -0
  136. metadata +267 -207
  137. data/.gitignore +0 -23
  138. data/Gemfile +0 -4
  139. data/Guardfile +0 -56
  140. data/LICENSE.txt +0 -22
  141. data/Rakefile +0 -1
  142. data/conceptql.gemspec +0 -32
  143. data/doc/ConceptQL Specification (alpha).pdf +0 -0
  144. data/doc/diagram_0.png +0 -0
  145. data/doc/implementation_notes.md +0 -39
  146. data/doc/spec.md +0 -1344
  147. data/lib/conceptql/behaviors/debuggable.rb +0 -70
  148. data/lib/conceptql/behaviors/dottable.rb +0 -103
  149. data/lib/conceptql/behaviors/preppable.rb +0 -20
  150. data/lib/conceptql/converter.rb +0 -65
  151. data/lib/conceptql/debugger.rb +0 -48
  152. data/lib/conceptql/fake_grapher.rb +0 -20
  153. data/lib/conceptql/graph.rb +0 -52
  154. data/lib/conceptql/graph_nodifier.rb +0 -203
  155. data/lib/conceptql/logger.rb +0 -10
  156. data/lib/conceptql/operators/complement.rb +0 -38
  157. data/lib/conceptql/operators/concept.rb +0 -70
  158. data/lib/conceptql/operators/condition_type.rb +0 -71
  159. data/lib/conceptql/operators/cpt.rb +0 -25
  160. data/lib/conceptql/operators/drug_type_concept.rb +0 -21
  161. data/lib/conceptql/operators/from_seer_visits.rb +0 -23
  162. data/lib/conceptql/operators/hcpcs.rb +0 -25
  163. data/lib/conceptql/operators/icd10.rb +0 -28
  164. data/lib/conceptql/operators/icd9.rb +0 -28
  165. data/lib/conceptql/operators/icd9_procedure.rb +0 -25
  166. data/lib/conceptql/operators/intersect.rb +0 -34
  167. data/lib/conceptql/operators/loinc.rb +0 -25
  168. data/lib/conceptql/operators/medcode.rb +0 -28
  169. data/lib/conceptql/operators/medcode_procedure.rb +0 -27
  170. data/lib/conceptql/operators/ndc.rb +0 -29
  171. data/lib/conceptql/operators/observation_by_enttype.rb +0 -29
  172. data/lib/conceptql/operators/observation_period.rb +0 -30
  173. data/lib/conceptql/operators/overlapped_by.rb +0 -23
  174. data/lib/conceptql/operators/overlaps.rb +0 -19
  175. data/lib/conceptql/operators/place_of_service_code.rb +0 -24
  176. data/lib/conceptql/operators/procedure_occurrence.rb +0 -25
  177. data/lib/conceptql/operators/prodcode.rb +0 -29
  178. data/lib/conceptql/operators/rxnorm.rb +0 -24
  179. data/lib/conceptql/operators/snomed.rb +0 -24
  180. data/lib/conceptql/operators/snomed_condition.rb +0 -26
  181. data/lib/conceptql/operators/source_vocabulary_operator.rb +0 -58
  182. data/lib/conceptql/operators/standard_vocabulary_operator.rb +0 -45
  183. data/lib/conceptql/operators/started_by.rb +0 -22
  184. data/lib/conceptql/operators/to_seer_visits.rb +0 -24
  185. data/lib/conceptql/operators/visit.rb +0 -15
  186. data/lib/conceptql/operators/visit_occurrence.rb +0 -30
  187. data/lib/conceptql/tree.rb +0 -53
  188. data/lib/conceptql/utils/temp_table.rb +0 -72
  189. data/spec/conceptql/behaviors/dottable_spec.rb +0 -99
  190. data/spec/conceptql/converter_spec.rb +0 -51
  191. data/spec/conceptql/date_adjuster_spec.rb +0 -68
  192. data/spec/conceptql/operators/after_spec.rb +0 -16
  193. data/spec/conceptql/operators/before_spec.rb +0 -16
  194. data/spec/conceptql/operators/casting_operator_spec.rb +0 -68
  195. data/spec/conceptql/operators/complement_spec.rb +0 -15
  196. data/spec/conceptql/operators/concept_spec.rb +0 -40
  197. data/spec/conceptql/operators/condition_type_spec.rb +0 -128
  198. data/spec/conceptql/operators/contains_spec.rb +0 -19
  199. data/spec/conceptql/operators/cpt_spec.rb +0 -29
  200. data/spec/conceptql/operators/date_range_spec.rb +0 -33
  201. data/spec/conceptql/operators/death_spec.rb +0 -10
  202. data/spec/conceptql/operators/during_spec.rb +0 -30
  203. data/spec/conceptql/operators/except_spec.rb +0 -15
  204. data/spec/conceptql/operators/first_spec.rb +0 -35
  205. data/spec/conceptql/operators/from_spec.rb +0 -13
  206. data/spec/conceptql/operators/gender_spec.rb +0 -27
  207. data/spec/conceptql/operators/hcpcs_spec.rb +0 -29
  208. data/spec/conceptql/operators/icd10_spec.rb +0 -34
  209. data/spec/conceptql/operators/icd9_procedure_spec.rb +0 -29
  210. data/spec/conceptql/operators/icd9_spec.rb +0 -34
  211. data/spec/conceptql/operators/intersect_spec.rb +0 -28
  212. data/spec/conceptql/operators/last_spec.rb +0 -36
  213. data/spec/conceptql/operators/loinc_spec.rb +0 -29
  214. data/spec/conceptql/operators/medcode_procedure_spec.rb +0 -34
  215. data/spec/conceptql/operators/medcode_spec.rb +0 -34
  216. data/spec/conceptql/operators/observation_period_spec.rb +0 -10
  217. data/spec/conceptql/operators/occurrence_spec.rb +0 -87
  218. data/spec/conceptql/operators/overlapped_by_spec.rb +0 -32
  219. data/spec/conceptql/operators/overlaps_spec.rb +0 -21
  220. data/spec/conceptql/operators/person_filter_spec.rb +0 -15
  221. data/spec/conceptql/operators/person_spec.rb +0 -10
  222. data/spec/conceptql/operators/place_of_service_code_spec.rb +0 -24
  223. data/spec/conceptql/operators/procedure_occurrence_spec.rb +0 -10
  224. data/spec/conceptql/operators/prodcode_spec.rb +0 -35
  225. data/spec/conceptql/operators/query_double.rb +0 -20
  226. data/spec/conceptql/operators/query_double_spec.rb +0 -7
  227. data/spec/conceptql/operators/race_spec.rb +0 -21
  228. data/spec/conceptql/operators/rxnorm_spec.rb +0 -29
  229. data/spec/conceptql/operators/snomed_spec.rb +0 -29
  230. data/spec/conceptql/operators/source_vocabulary_operator_spec.rb +0 -35
  231. data/spec/conceptql/operators/standard_vocabulary_operator_spec.rb +0 -35
  232. data/spec/conceptql/operators/started_by_spec.rb +0 -22
  233. data/spec/conceptql/operators/temporal_operator_spec.rb +0 -51
  234. data/spec/conceptql/operators/time_window_spec.rb +0 -77
  235. data/spec/conceptql/operators/union_spec.rb +0 -21
  236. data/spec/conceptql/operators/visit_occurrence_spec.rb +0 -10
  237. data/spec/conceptql/query_spec.rb +0 -22
  238. data/spec/conceptql/tree_spec.rb +0 -50
  239. data/spec/doubles/stream_for_casting_double.rb +0 -9
  240. data/spec/doubles/stream_for_occurrence_double.rb +0 -25
  241. data/spec/doubles/stream_for_temporal_double.rb +0 -6
  242. data/spec/spec_helper.rb +0 -102
@@ -1,40 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/concept'
3
-
4
- describe ConceptQL::Operators::Concept do
5
- it_behaves_like(:evaluator)
6
-
7
- class ConceptDouble < ConceptQL::Operators::Concept
8
- attr_accessor :cql_query
9
-
10
- def arguments
11
- [1]
12
- end
13
-
14
- def set_statement(value)
15
- @statement = { icd9: '412' }
16
- end
17
-
18
- def set_cql_query(db)
19
- @cql_query ||= nil
20
- end
21
-
22
- def cql_query
23
- set_cql_query(nil)
24
- end
25
- end
26
-
27
- describe '#query' do
28
- it 'evaluates upstream' do
29
- cd = ConceptDouble.new(1)
30
- db = Sequel.mock
31
- cd.cql_query = double("query")
32
- expect(cd.cql_query).to receive(:query).and_return(cd.cql_query)
33
- expect(cd.cql_query).to receive(:from_self)
34
- cd.query(db)
35
- end
36
- end
37
- end
38
-
39
-
40
-
@@ -1,128 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/condition_type'
3
-
4
- describe ConceptQL::Operators::ConditionType do
5
- it_behaves_like(:evaluator)
6
-
7
- describe '#query' do
8
- it 'works for inpatient_detail_primary' do
9
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000183))"
10
- expect(ConceptQL::Operators::ConditionType.new(:inpatient_detail_primary).query(Sequel.mock).sql).to eq(correct_query)
11
- end
12
-
13
- it 'works for inpatient_detail_1' do
14
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000184))"
15
- expect(ConceptQL::Operators::ConditionType.new(:inpatient_detail_1).query(Sequel.mock).sql).to eq(correct_query)
16
- end
17
-
18
- it 'works for inpatient_detail_2' do
19
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000185))"
20
- expect(ConceptQL::Operators::ConditionType.new(:inpatient_detail_2).query(Sequel.mock).sql).to eq(correct_query)
21
- end
22
-
23
- it 'works for inpatient_header_primary' do
24
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000199))"
25
- expect(ConceptQL::Operators::ConditionType.new(:inpatient_header_primary).query(Sequel.mock).sql).to eq(correct_query)
26
- end
27
-
28
- it 'works for inpatient_header_1' do
29
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000200))"
30
- expect(ConceptQL::Operators::ConditionType.new(:inpatient_header_1).query(Sequel.mock).sql).to eq(correct_query)
31
- end
32
-
33
- it 'works for outpatient_detail_1' do
34
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000215))"
35
- expect(ConceptQL::Operators::ConditionType.new(:outpatient_detail_1).query(Sequel.mock).sql).to eq(correct_query)
36
- end
37
-
38
- it 'works for outpatient_header_1' do
39
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000230))"
40
- expect(ConceptQL::Operators::ConditionType.new(:outpatient_header_1).query(Sequel.mock).sql).to eq(correct_query)
41
- end
42
-
43
- it 'works for ehr_problem_list' do
44
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000245))"
45
- expect(ConceptQL::Operators::ConditionType.new(:ehr_problem_list).query(Sequel.mock).sql).to eq(correct_query)
46
- end
47
-
48
- it 'works for condition_era_0_day_window' do
49
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000246))"
50
- expect(ConceptQL::Operators::ConditionType.new(:condition_era_0_day_window).query(Sequel.mock).sql).to eq(correct_query)
51
- end
52
-
53
- it 'works for condition_era_30_day_window' do
54
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000247))"
55
- expect(ConceptQL::Operators::ConditionType.new(:condition_era_30_day_window).query(Sequel.mock).sql).to eq(correct_query)
56
- end
57
-
58
- describe 'with primary' do
59
- it 'works for just primary' do
60
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000183, 38000199, 38000215, 38000230))"
61
- expect(ConceptQL::Operators::ConditionType.new(:primary).query(Sequel.mock).sql).to eq(correct_query)
62
- end
63
-
64
- it 'works for inpatient_primary' do
65
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000183, 38000199))"
66
- expect(ConceptQL::Operators::ConditionType.new(:inpatient_primary).query(Sequel.mock).sql).to eq(correct_query)
67
- end
68
-
69
- it 'works for outpatient_primary' do
70
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000215, 38000230))"
71
- expect(ConceptQL::Operators::ConditionType.new(:outpatient_primary).query(Sequel.mock).sql).to eq(correct_query)
72
- end
73
- end
74
-
75
- describe 'with multiple arguments' do
76
- it 'works for inpatient_detail_1' do
77
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000184, 38000185))"
78
- expect(ConceptQL::Operators::ConditionType.new(:inpatient_detail_1, :inpatient_detail_2).query(Sequel.mock).sql).to eq(correct_query)
79
- end
80
- end
81
-
82
- describe 'with arguments as strings' do
83
- it 'works for inpatient_detail_1' do
84
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000184, 38000185))"
85
- expect(ConceptQL::Operators::ConditionType.new('inpatient_detail_1', 'inpatient_detail_2').query(Sequel.mock).sql).to eq(correct_query)
86
- end
87
- end
88
-
89
- describe 'as category' do
90
- it 'works for inpatient_detail' do
91
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000183, 38000184, 38000185, 38000186, 38000187, 38000188, 38000189, 38000190, 38000191, 38000192, 38000193, 38000194, 38000195, 38000196, 38000197, 38000198))"
92
- expect(ConceptQL::Operators::ConditionType.new('inpatient_detail').query(Sequel.mock).sql).to eq(correct_query)
93
- end
94
-
95
- it 'works for inpatient_header' do
96
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000199, 38000200, 38000201, 38000202, 38000203, 38000204, 38000205, 38000206, 38000207, 38000208, 38000209, 38000210, 38000211, 38000212, 38000213, 38000214))"
97
- expect(ConceptQL::Operators::ConditionType.new('inpatient_header').query(Sequel.mock).sql).to eq(correct_query)
98
- end
99
-
100
- it 'works for inpatient' do
101
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000183, 38000184, 38000185, 38000186, 38000187, 38000188, 38000189, 38000190, 38000191, 38000192, 38000193, 38000194, 38000195, 38000196, 38000197, 38000198, 38000199, 38000200, 38000201, 38000202, 38000203, 38000204, 38000205, 38000206, 38000207, 38000208, 38000209, 38000210, 38000211, 38000212, 38000213, 38000214))"
102
- expect(ConceptQL::Operators::ConditionType.new('inpatient').query(Sequel.mock).sql).to eq(correct_query)
103
- end
104
-
105
- it 'works for outpatient_detail' do
106
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000215, 38000216, 38000217, 38000218, 38000219, 38000220, 38000221, 38000222, 38000223, 38000224, 38000225, 38000226, 38000227, 38000228, 38000229))"
107
- expect(ConceptQL::Operators::ConditionType.new('outpatient_detail').query(Sequel.mock).sql).to eq(correct_query)
108
- end
109
-
110
- it 'works for outpatient_header' do
111
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000230, 38000231, 38000232, 38000233, 38000234, 38000235, 38000236, 38000237, 38000238, 38000239, 38000240, 38000241, 38000242, 38000243, 38000244))"
112
- expect(ConceptQL::Operators::ConditionType.new('outpatient_header').query(Sequel.mock).sql).to eq(correct_query)
113
- end
114
-
115
- it 'works for outpatient' do
116
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000215, 38000216, 38000217, 38000218, 38000219, 38000220, 38000221, 38000222, 38000223, 38000224, 38000225, 38000226, 38000227, 38000228, 38000229, 38000230, 38000231, 38000232, 38000233, 38000234, 38000235, 38000236, 38000237, 38000238, 38000239, 38000240, 38000241, 38000242, 38000243, 38000244))"
117
- expect(ConceptQL::Operators::ConditionType.new('outpatient').query(Sequel.mock).sql).to eq(correct_query)
118
- end
119
-
120
- it 'works for condition_era' do
121
- correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000246, 38000247))"
122
- expect(ConceptQL::Operators::ConditionType.new('condition_era').query(Sequel.mock).sql).to eq(correct_query)
123
- end
124
- end
125
- end
126
- end
127
-
128
-
@@ -1,19 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/contains'
3
- require_double('stream_for_temporal')
4
-
5
- describe ConceptQL::Operators::Contains do
6
- it_behaves_like(:temporal_operator)
7
-
8
- describe 'when not inclusive' do
9
- subject do
10
- described_class.new(left: StreamForTemporalDouble.new, right: StreamForTemporalDouble.new)
11
- end
12
-
13
- it 'should use proper where clause' do
14
- expect(subject.query(Sequel.mock).sql).to match('r.end_date <= l.end_date')
15
- expect(subject.query(Sequel.mock).sql).to match('l.start_date <= r.start_date')
16
- end
17
- end
18
- end
19
-
@@ -1,29 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/cpt'
3
-
4
- describe ConceptQL::Operators::Cpt do
5
- it_behaves_like(:standard_vocabulary_operator)
6
-
7
- subject do
8
- described_class.new
9
- end
10
-
11
- describe '#table' do
12
- it 'should be procedure_occurrence' do
13
- expect(subject.table).to eq(:procedure_occurrence)
14
- end
15
- end
16
-
17
- describe '#concept_column' do
18
- it 'should be procedure_concept_id' do
19
- expect(subject.concept_column).to eq(:procedure_concept_id)
20
- end
21
- end
22
-
23
- describe '#vocabulary_id' do
24
- it 'should be 4' do
25
- expect(subject.vocabulary_id).to eq(4)
26
- end
27
- end
28
- end
29
-
@@ -1,33 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/date_range'
3
-
4
- describe ConceptQL::Operators::DateRange do
5
- it_behaves_like(:evaluator)
6
-
7
- describe '#types' do
8
- it 'should be [:date]' do
9
- expect(ConceptQL::Operators::DateRange.new(start: '2004-12-13', end: '2010-03-20').types).to eq([:person])
10
- end
11
- end
12
-
13
- describe '#query' do
14
- it 'should be dates specified assigned to all persons' do
15
- expect(ConceptQL::Operators::DateRange.new(start: '2004-12-13', end: '2010-03-20').query(Sequel.mock).sql).to eq("SELECT * FROM (SELECT *, CAST('person' AS varchar(255)) AS criterion_type, person_id AS criterion_id, date '2004-12-13' AS start_date, date '2010-03-20' AS end_date FROM person) AS t1")
16
- end
17
-
18
- it 'should handle strings for option keys' do
19
- expect(ConceptQL::Operators::DateRange.new('start' => '2004-12-13', 'end' => '2010-03-20').query(Sequel.mock).sql).to eq("SELECT * FROM (SELECT *, CAST('person' AS varchar(255)) AS criterion_type, person_id AS criterion_id, date '2004-12-13' AS start_date, date '2010-03-20' AS end_date FROM person) AS t1")
20
- end
21
-
22
- it 'handles START as day before first recorded observation_period' do
23
- expect(ConceptQL::Operators::DateRange.new(start: 'START', end: '2010-03-20').query(Sequel.mock).sql).to eq("SELECT * FROM (SELECT *, CAST('person' AS varchar(255)) AS criterion_type, person_id AS criterion_id, (SELECT min(observation_period_start_date) FROM observation_period) AS start_date, date '2010-03-20' AS end_date FROM person) AS t1")
24
- end
25
-
26
- it 'handles END as last date of recorded observation_period' do
27
- expect(ConceptQL::Operators::DateRange.new(start: '2004-12-13', end: 'END').query(Sequel.mock).sql).to eq("SELECT * FROM (SELECT *, CAST('person' AS varchar(255)) AS criterion_type, person_id AS criterion_id, date '2004-12-13' AS start_date, (SELECT max(observation_period_end_date) FROM observation_period) AS end_date FROM person) AS t1")
28
- end
29
- end
30
-
31
- end
32
-
33
-
@@ -1,10 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/death'
3
- require_double('stream_for_casting')
4
-
5
- describe ConceptQL::Operators::Death do
6
- it_behaves_like(:casting_operator)
7
- end
8
-
9
-
10
-
@@ -1,30 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/during'
3
- require_double('stream_for_temporal')
4
-
5
- describe ConceptQL::Operators::During do
6
- it_behaves_like(:temporal_operator)
7
-
8
- describe 'when not inclusive' do
9
- subject do
10
- described_class.new(left: StreamForTemporalDouble.new, right: StreamForTemporalDouble.new)
11
- end
12
-
13
- it 'should use proper where clause' do
14
- expect(subject.query(Sequel.mock).sql).to match('l.end_date <= r.end_date')
15
- expect(subject.query(Sequel.mock).sql).to match('r.start_date <= l.start_date')
16
- end
17
- end
18
-
19
- describe 'when inclusive' do
20
- subject do
21
- described_class.new(left: StreamForTemporalDouble.new, right: StreamForTemporalDouble.new, inclusive: true)
22
- end
23
-
24
- it 'should use proper where clause' do
25
- expect(subject.query(Sequel.mock).sql).to match(/\(r.start_date <= l.end_date\) AND \(l.end_date <= r.end_date\)/)
26
- expect(subject.query(Sequel.mock).sql).to match(/\(r.start_date <= l.start_date\) AND \(l.start_date <= r.end_date\)/)
27
- end
28
- end
29
- end
30
-
@@ -1,15 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/except'
3
- require_relative 'query_double'
4
-
5
- describe ConceptQL::Operators::Except do
6
- it_behaves_like(:evaluator)
7
-
8
- describe '#query' do
9
- it 'uses right stream as argument to EXCEPT against left stream' do
10
- double1 = QueryDouble.new(1)
11
- double2 = QueryDouble.new(2)
12
- expect(ConceptQL::Operators::Except.new(left: double1, right: double2).query(Sequel.mock).sql).to eq("SELECT * FROM (SELECT * FROM table1 EXCEPT SELECT * FROM table2) AS t1")
13
- end
14
- end
15
- end
@@ -1,35 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/first'
3
- require_double('stream_for_occurrence')
4
-
5
- describe ConceptQL::Operators::First do
6
- it_behaves_like(:evaluator)
7
-
8
- it 'should have occurrence pegged at 1' do
9
- expect(described_class.new.occurrence).to eq(1)
10
- end
11
-
12
- describe 'occurrence set to 1' do
13
- subject do
14
- described_class.new(StreamForOccurrenceDouble.new).query(Sequel.mock(host: 'postgres')).sql
15
- end
16
-
17
- it 'should order by ascending start_date' do
18
- expect(subject).to match('ORDER BY "start_date" ASC')
19
- end
20
-
21
- it 'should partition by person_id' do
22
- expect(subject).to match('PARTITION BY "person_id"')
23
- end
24
-
25
- it 'should assign a row number' do
26
- expect(subject).to match('row_number()')
27
- end
28
-
29
- it 'should find the all rows with rn = 1' do
30
- expect(subject).to match('"rn" = 1')
31
- end
32
- end
33
- end
34
-
35
-
@@ -1,13 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/from'
3
- require_relative 'query_double'
4
-
5
- describe ConceptQL::Operators::From do
6
- it_behaves_like(:evaluator)
7
-
8
- describe '#query' do
9
- it 'works for single criteria' do
10
- expect(ConceptQL::Operators::From.new(:table1).query(Sequel.mock).sql).to eq("SELECT * FROM table1")
11
- end
12
- end
13
- end
@@ -1,27 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/gender'
3
-
4
- describe ConceptQL::Operators::Gender do
5
- it_behaves_like(:evaluator)
6
-
7
- describe '#query' do
8
- it 'works for male/MALE/Male/M/m' do
9
- correct_query = "SELECT * FROM person WHERE (gender_concept_id IN (8507))"
10
- expect(ConceptQL::Operators::Gender.new('male').query(Sequel.mock).sql).to eq(correct_query)
11
- expect(ConceptQL::Operators::Gender.new('Male').query(Sequel.mock).sql).to eq(correct_query)
12
- expect(ConceptQL::Operators::Gender.new('MALE').query(Sequel.mock).sql).to eq(correct_query)
13
- expect(ConceptQL::Operators::Gender.new('M').query(Sequel.mock).sql).to eq(correct_query)
14
- expect(ConceptQL::Operators::Gender.new('m').query(Sequel.mock).sql).to eq(correct_query)
15
- end
16
-
17
- it 'works for Female/FEMALE/female/F/f' do
18
- correct_query = "SELECT * FROM person WHERE (gender_concept_id IN (8532))"
19
- expect(ConceptQL::Operators::Gender.new('female').query(Sequel.mock).sql).to eq(correct_query)
20
- expect(ConceptQL::Operators::Gender.new('Female').query(Sequel.mock).sql).to eq(correct_query)
21
- expect(ConceptQL::Operators::Gender.new('FEMALE').query(Sequel.mock).sql).to eq(correct_query)
22
- expect(ConceptQL::Operators::Gender.new('F').query(Sequel.mock).sql).to eq(correct_query)
23
- expect(ConceptQL::Operators::Gender.new('f').query(Sequel.mock).sql).to eq(correct_query)
24
- end
25
- end
26
- end
27
-
@@ -1,29 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/hcpcs'
3
-
4
- describe ConceptQL::Operators::Hcpcs do
5
- it_behaves_like(:standard_vocabulary_operator)
6
-
7
- subject do
8
- described_class.new
9
- end
10
-
11
- describe '#table' do
12
- it 'should be procedure_occurrence' do
13
- expect(subject.table).to eq(:procedure_occurrence)
14
- end
15
- end
16
-
17
- describe '#concept_column' do
18
- it 'should be procedure_concept_id' do
19
- expect(subject.concept_column).to eq(:procedure_concept_id)
20
- end
21
- end
22
-
23
- describe '#vocabulary_id' do
24
- it 'should be 5' do
25
- expect(subject.vocabulary_id).to eq(5)
26
- end
27
- end
28
- end
29
-
@@ -1,34 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/icd10'
3
-
4
- describe ConceptQL::Operators::Icd10 do
5
- it_behaves_like(:source_vocabulary_operator)
6
-
7
- subject do
8
- described_class.new
9
- end
10
-
11
- describe '#table' do
12
- it 'should be condition_occurrence' do
13
- expect(subject.table).to eq(:condition_occurrence)
14
- end
15
- end
16
-
17
- describe '#concept_column' do
18
- it 'should be condition_concept_id' do
19
- expect(subject.concept_column).to eq(:condition_concept_id)
20
- end
21
- end
22
-
23
- describe '#source_column' do
24
- it 'should be condition_source_valuej' do
25
- expect(subject.source_column).to eq(:condition_source_value)
26
- end
27
- end
28
-
29
- describe '#vocabulary_id' do
30
- it 'should be 34' do
31
- expect(subject.vocabulary_id).to eq(34)
32
- end
33
- end
34
- end
@@ -1,29 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/icd9_procedure'
3
-
4
- describe ConceptQL::Operators::Icd9Procedure do
5
- it_behaves_like(:standard_vocabulary_operator)
6
-
7
- subject do
8
- described_class.new
9
- end
10
-
11
- describe '#table' do
12
- it 'should be procedure_occurrence' do
13
- expect(subject.table).to eq(:procedure_occurrence)
14
- end
15
- end
16
-
17
- describe '#concept_column' do
18
- it 'should be procedure_concept_id' do
19
- expect(subject.concept_column).to eq(:procedure_concept_id)
20
- end
21
- end
22
-
23
- describe '#vocabulary_id' do
24
- it 'should be 3' do
25
- expect(subject.vocabulary_id).to eq(3)
26
- end
27
- end
28
- end
29
-
@@ -1,34 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/icd9'
3
-
4
- describe ConceptQL::Operators::Icd9 do
5
- it_behaves_like(:source_vocabulary_operator)
6
-
7
- subject do
8
- ConceptQL::Operators::Icd9.new
9
- end
10
-
11
- describe '#table' do
12
- it 'should be condition_occurrence' do
13
- expect(subject.table).to eq(:condition_occurrence)
14
- end
15
- end
16
-
17
- describe '#concept_column' do
18
- it 'should be condition_concept_id' do
19
- expect(subject.concept_column).to eq(:condition_concept_id)
20
- end
21
- end
22
-
23
- describe '#source_column' do
24
- it 'should be condition_source_valuej' do
25
- expect(subject.source_column).to eq(:condition_source_value)
26
- end
27
- end
28
-
29
- describe '#vocabulary_id' do
30
- it 'should be 2' do
31
- expect(subject.vocabulary_id).to eq(2)
32
- end
33
- end
34
- end
@@ -1,28 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/intersect'
3
- require_relative 'query_double'
4
-
5
- describe ConceptQL::Operators::Intersect do
6
- it_behaves_like(:evaluator)
7
-
8
- describe '#query' do
9
- it 'works for multiple criteria of same type' do
10
- double1 = QueryDouble.new(1)
11
- double2 = QueryDouble.new(2)
12
- double3 = QueryDouble.new(3)
13
- expect(ConceptQL::Operators::Intersect.new(double1, double2, double3).query(Sequel.mock).sql).to eq("SELECT * FROM (SELECT * FROM (SELECT * FROM table1 INTERSECT SELECT * FROM table2) AS t1 INTERSECT SELECT * FROM table3) AS t1")
14
- end
15
-
16
- it 'works for multiple criteria of different type' do
17
- double1 = QueryDouble.new(1)
18
- double2 = QueryDouble.new(2, :person)
19
- double3 = QueryDouble.new(3)
20
- expect(ConceptQL::Operators::Intersect.new(double1, double2, double3).query(Sequel.mock).sql).to eq("SELECT * FROM (SELECT * FROM (SELECT * FROM table1 INTERSECT SELECT * FROM table3) AS t1 UNION ALL SELECT * FROM table2) AS t1")
21
- end
22
-
23
- it 'works for single criteria' do
24
- double1 = QueryDouble.new(1)
25
- expect(ConceptQL::Operators::Intersect.new(double1).query(Sequel.mock).sql).to eq("SELECT * FROM table1")
26
- end
27
- end
28
- end
@@ -1,36 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/last'
3
- require_double('stream_for_occurrence')
4
-
5
- describe ConceptQL::Operators::Last do
6
- it_behaves_like(:evaluator)
7
-
8
- it 'should have occurrence pegged at -1' do
9
- expect(described_class.new.occurrence).to eq(-1)
10
- end
11
-
12
- describe 'occurrence set to -1' do
13
- subject do
14
- described_class.new(StreamForOccurrenceDouble.new).query(Sequel.mock(host: 'postgres')).sql
15
- end
16
-
17
-
18
- it 'should order by descending start_date' do
19
- expect(subject).to match('ORDER BY "start_date" DESC')
20
- end
21
-
22
- it 'should partition by person_id' do
23
- expect(subject).to match('PARTITION BY "person_id"')
24
- end
25
-
26
- it 'should assign a row number' do
27
- expect(subject).to match('row_number()')
28
- end
29
-
30
- it 'should find the all rows with rn = 1' do
31
- expect(subject).to match('"rn" = 1')
32
- end
33
- end
34
- end
35
-
36
-
@@ -1,29 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/loinc'
3
-
4
- describe ConceptQL::Operators::Loinc do
5
- it_behaves_like(:standard_vocabulary_operator)
6
-
7
- subject do
8
- described_class.new
9
- end
10
-
11
- describe '#table' do
12
- it 'should be observation' do
13
- expect(subject.table).to eq(:observation)
14
- end
15
- end
16
-
17
- describe '#concept_column' do
18
- it 'should be procedure_concept_id' do
19
- expect(subject.concept_column).to eq(:observation_concept_id)
20
- end
21
- end
22
-
23
- describe '#vocabulary_id' do
24
- it 'should be 6' do
25
- expect(subject.vocabulary_id).to eq(6)
26
- end
27
- end
28
- end
29
-
@@ -1,34 +0,0 @@
1
- require 'spec_helper'
2
- require 'conceptql/operators/medcode_procedure'
3
-
4
- describe ConceptQL::Operators::MedcodeProcedure do
5
- it_behaves_like(:source_vocabulary_operator)
6
-
7
- subject do
8
- described_class.new
9
- end
10
-
11
- describe '#table' do
12
- it 'should be procedure_occurrence' do
13
- expect(subject.table).to eq(:procedure_occurrence)
14
- end
15
- end
16
-
17
- describe '#concept_column' do
18
- it 'should be procedure_concept_id' do
19
- expect(subject.concept_column).to eq(:procedure_concept_id)
20
- end
21
- end
22
-
23
- describe '#source_column' do
24
- it 'should be procedure_source_valuej' do
25
- expect(subject.source_column).to eq(:procedure_source_value)
26
- end
27
- end
28
-
29
- describe '#vocabulary_id' do
30
- it 'should be 204 (a J&J provided mapping as part of CPRD)' do
31
- expect(subject.vocabulary_id).to eq(204)
32
- end
33
- end
34
- end