conceptql 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1192) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/CHANGELOG.md +32 -104
  4. data/Gemfile +2 -0
  5. data/README.md +43 -21
  6. data/Rakefile +34 -0
  7. data/conceptql.gemspec +3 -4
  8. data/config/provenance.yml +454 -0
  9. data/doc/converter.rb +33 -0
  10. data/doc/metadata.md +89 -0
  11. data/doc/spec.md +1775 -861
  12. data/doc/spec.md.cql +1930 -0
  13. data/doc/spec/02f44ad35d266ddd0a4df1691d26bf4a297b30604fc3f44b0391d6d852d23a9f.png +0 -0
  14. data/doc/spec/0360fc0c2b7a88fd82ffc4d13387b76766649d5d42aa8f9349bbf60a81ac6119.png +0 -0
  15. data/doc/spec/04491942fcbd741982514f9eb12aeecf3d54b5b69a2b50c8331f7700169d5521.png +0 -0
  16. data/doc/spec/05f9b844571ffceeed2def3025fb60c68552817b8b73d3c8a76939dbc08b7c65.png +0 -0
  17. data/doc/spec/067241a3579767a802d4f8e20fd35b60adbe377c9a6512ef135f164a5accfb27.png +0 -0
  18. data/doc/spec/1102fa717b1c2df67af5220bf3ae219afafd79be7bba0c117e301983385ada52.png +0 -0
  19. data/doc/spec/11f57941951bad5a75f9a16f38a31a3c6bf3046a475aac6e398e780892fab4ad.png +0 -0
  20. data/doc/spec/15268bc45993d3f57ccf915877f91e48bdee684f24faa614249915833cac4af9.png +0 -0
  21. data/doc/spec/253845fe6162621af407ebd110296ff4f6d8a3f23ec75dfb4ea8cda30be71262.png +0 -0
  22. data/doc/spec/26fd52b5ac55438dd9f81b4a3f3913f1058c9f225c8a5e129007c1e9413d5881.png +0 -0
  23. data/doc/spec/2b57886a9cba66bb696e4b399c51ad0dc95cd64b952709fafc819a79d573f09e.png +0 -0
  24. data/doc/spec/307a8b5a7edd6e42f8be16523a4c939faf1a0533385c861d7004b6af8addd7d1.png +0 -0
  25. data/doc/spec/328467a6a419c7c05e299b8097e5e000686068ded8dc6d5f2e2de6f51976c315.png +0 -0
  26. data/doc/spec/39d6a8eb71cae51b1d6937c97134e51f04fd47c54535ff0915fe6a8b4f197fb2.png +0 -0
  27. data/doc/spec/3f46dee4d775d1a29d52b68af6552f8ea3abd8303094e749714fc77bd7958155.png +0 -0
  28. data/doc/spec/44ec6743d5d77d15b8a487c2058bf3e455d34adc91c46ea05767f6e0e471a75e.png +0 -0
  29. data/doc/spec/462153be527b28dc2cb5259c0aec62e1f529e8b60dc6e9c23fd1e06e8be933c9.png +0 -0
  30. data/doc/spec/4a3b47ed1c54f96ebdae693d41c36c51884c4546ef799a4108085708fb7b964e.png +0 -0
  31. data/doc/spec/514f263e976d07c0d9e0a86c79bcbdcddc7d444d7b72135294ad78758effd28f.png +0 -0
  32. data/doc/spec/58113a57a37431a402d2547369eba3a481bf1dbbfd82dc384406a5c91f6df01f.png +0 -0
  33. data/doc/spec/5d331d74c460d75814b2d3138a9b7d90b5ddb2dcd85e1f5f260d183745fc3a1e.png +0 -0
  34. data/doc/spec/5d6ff62038b75d6f240d65f35d1520a131c221f47d3801554c8c2be5d528ebb0.png +0 -0
  35. data/doc/spec/62323426e381ec21c967971a67e1f4a6d89dae92154bd937284e00b67f67fdd3.png +0 -0
  36. data/doc/spec/6705af65d728c0d5c50d6c4d46253017a91eb459dbb1f40f92449f05d5562f4a.png +0 -0
  37. data/doc/spec/68fac940a32c7e40caacf8e560c61da552d57633d015ba98f2e98ec040a00c5b.png +0 -0
  38. data/doc/spec/6a34c0ef589c9c976fe41f3e67e799e198499f5b9c3ebfd240fb91f73e893573.png +0 -0
  39. data/doc/spec/6b48534236697d1ccfa1f5403764782f9d228f9eb706789cfa80203882b7b13a.png +0 -0
  40. data/doc/spec/7aa76b4d29874719466c2cbafc9936e9f12e504bf31e1a09d26ca3fffa8ba1a6.png +0 -0
  41. data/doc/spec/7b9db2986ab9ada45cfb9451ef87ff1a2d99c908083334b7ccdceb8a92387fa9.png +0 -0
  42. data/doc/spec/8101d9b89d9ba8070d585432707b43a8acdb4c2a3e9d37c3f7114b5e3ea9e800.png +0 -0
  43. data/doc/spec/886bf85249a704668a55c5161bceaac10be4a41a94b91606f49851dfa017526c.png +0 -0
  44. data/doc/spec/8ed478d8c81a58a202d0c51348fca246df206fc24a0567b163d4e0bdab56ca46.png +0 -0
  45. data/doc/spec/9139440329dcb815df89bc70182c3827868402a74ff64d0253706dcaff723dca.png +0 -0
  46. data/doc/spec/99392f56dfb0e5be3f45a12a7f1ba846d094e430f526dfeaa30b606837cd34c0.png +0 -0
  47. data/doc/spec/a4450e8c0fe0e2fde92fe9bd61952f907b1976c1aa3ba963b809bed079d42b09.png +0 -0
  48. data/doc/spec/a4bc7382a1154ea9856544fd48418f3dd9ce474ca94b8859fc323749c6cc1f55.png +0 -0
  49. data/doc/spec/a79274742cf6fac6f6c9f4a0eb651aeb452f9c43b537c8e6ccaefecd05b7105c.png +0 -0
  50. data/doc/spec/a9b4528726adec2a90f3f00139d8d0492f13c51f03c2f9ed6a5134b1b26b44a9.png +0 -0
  51. data/doc/spec/af5ae3787e80bf0771f18f1a04fe4c5d9291e1e0f963ac408a7bc198d2f1ee28.png +0 -0
  52. data/doc/spec/ba572c4f4dbade65be55f141df16cf7b3e7d09e0aec4e4e5debc4f2075277371.png +0 -0
  53. data/doc/spec/ba90ef705f7be91c53c5eb4a81a439fa0f7c48532214bd3db3cc5c069160543e.png +0 -0
  54. data/doc/spec/c1d0402862221d85aceedc7d76b3f82149b612cbd972f14d0ca9011e1e2c455c.png +0 -0
  55. data/doc/spec/c2157d8a6b73abe4f22ba5042159f32502c74bf6d762be28d2df6831586822c7.png +0 -0
  56. data/doc/spec/c5329a7f4937096a57b2e01efb9d542f84a4e2329a1e9381d08c630583ccad37.png +0 -0
  57. data/doc/spec/c82077b9455d0f9abc2c45ee1a298e38b99c9ce9cd685f65d87b376d7718d7ad.png +0 -0
  58. data/doc/spec/c93dd18894a245a5647f99e1867d3779e4cd34c9c8f8860600ff0c837a5ffa53.png +0 -0
  59. data/doc/spec/cc960a268d51ccf2ebde657d36848f780213834844900018bce3d111843f7b0f.png +0 -0
  60. data/doc/spec/d39452b58257c95a7cba07afed4877417b0c227f3690e2bff22c9eca89eac845.png +0 -0
  61. data/doc/spec/d64993258ffbef9406d9ab9136de7af530626b3a69e9eeb75835e11f11dabf62.png +0 -0
  62. data/doc/spec/da450cdd0c94a1301bd98560339a45caa8041e09974352a56ecfb144e9a5e4d4.png +0 -0
  63. data/doc/spec/dbc66b3ae6bd7123d77dd04b64f8a24498d048725a55c5340b15f5ae0a1ff307.png +0 -0
  64. data/doc/spec/de589af36fa854e006a1563c93e644e2210f2a5616babb779f7f38aadb6c1ed7.png +0 -0
  65. data/doc/spec/defbd0b853d895802663f507761ad297d82e167f516c6082686a2a19b76012c5.png +0 -0
  66. data/doc/spec/e1cb0863b21e14256d61a54200316791f6547c78ba2f0156c110f4500f9bbd49.png +0 -0
  67. data/doc/spec/e8630103287f7c9d28eff40b3b1826e24846e776b877f7b8554257acbe621e1c.png +0 -0
  68. data/doc/spec/e9b384fa7dec5f1a06479c4b289e06b1e60e4f23f7630aff6d03c52595f500f8.png +0 -0
  69. data/doc/spec/ea935ac31f3b57ff373646780a1fba34a38c9e086dc771eb7fc16c65a7e20cfc.png +0 -0
  70. data/doc/spec/eb8f5511f7d88bd0f8ba73420fc10f7c78405db7f4373d778a827058707f888e.png +0 -0
  71. data/doc/spec/ebacbd092e3d1a3c7b745a381e51e8ff9d63a21db23a16940193e18e57bc866f.png +0 -0
  72. data/doc/spec/ed039f82867241393b1a6a7153d3690461103934c72c1f3eaa3d99a12bb40885.png +0 -0
  73. data/doc/spec/ee283d6a4b69cf10da2df703be3a16830be9cd8cd4f68c5f7afdf558ea28fa76.png +0 -0
  74. data/doc/spec/f0c734b099841a754ae0366afb00e992ad4814479b65e4a7de23c6e3dd85c09a.png +0 -0
  75. data/doc/spec/f6b4fc31703cfb6327bbbd4614af8bb72da6d39fa3d53ada63a70157f2fad80e.png +0 -0
  76. data/doc/spec/f766f2e3aa13420e3ba0f823ac7956b311ed7c6c20be26b72324fadd87f36712.png +0 -0
  77. data/doc/spec/ff7d5b5573d09bd7c4cdd3aeda124d18bf82ec46673a62881b399a75d69f3f53.png +0 -0
  78. data/lib/conceptql.rb +21 -1
  79. data/lib/conceptql/annotate_grapher.rb +127 -0
  80. data/lib/conceptql/behaviors/drugish.rb +12 -0
  81. data/lib/conceptql/behaviors/labish.rb +13 -0
  82. data/lib/conceptql/behaviors/metadatable.rb +156 -71
  83. data/lib/conceptql/behaviors/provenanceable.rb +30 -0
  84. data/lib/conceptql/cli.rb +81 -37
  85. data/lib/conceptql/database.rb +42 -0
  86. data/lib/conceptql/date_adjuster.rb +22 -4
  87. data/lib/conceptql/fake_annotater.rb +129 -0
  88. data/lib/conceptql/knitter.rb +221 -0
  89. data/lib/conceptql/nodifier.rb +34 -23
  90. data/lib/conceptql/operators/after.rb +20 -3
  91. data/lib/conceptql/operators/any_overlap.rb +3 -1
  92. data/lib/conceptql/operators/before.rb +19 -3
  93. data/lib/conceptql/operators/binary_operator_operator.rb +24 -20
  94. data/lib/conceptql/operators/casting_operator.rb +39 -31
  95. data/lib/conceptql/operators/co_reported.rb +42 -0
  96. data/lib/conceptql/operators/complement.rb +21 -16
  97. data/lib/conceptql/operators/concurrent_within.rb +57 -0
  98. data/lib/conceptql/operators/condition_occurrence_source_vocabulary_operator.rb +34 -0
  99. data/lib/conceptql/operators/condition_occurrence_source_vocabulary_operator_union.rb +28 -0
  100. data/lib/conceptql/operators/condition_type.rb +12 -4
  101. data/lib/conceptql/operators/contains.rb +6 -2
  102. data/lib/conceptql/operators/count.rb +10 -2
  103. data/lib/conceptql/operators/cpt.rb +5 -2
  104. data/lib/conceptql/operators/cpt_or_hcpcs.rb +27 -0
  105. data/lib/conceptql/operators/date_range.rb +20 -8
  106. data/lib/conceptql/operators/death.rb +4 -2
  107. data/lib/conceptql/operators/drg.rb +42 -0
  108. data/lib/conceptql/operators/drug_type_concept.rb +11 -2
  109. data/lib/conceptql/operators/during.rb +4 -2
  110. data/lib/conceptql/operators/equal.rb +4 -1
  111. data/lib/conceptql/operators/except.rb +16 -4
  112. data/lib/conceptql/operators/filter.rb +6 -3
  113. data/lib/conceptql/operators/first.rb +3 -1
  114. data/lib/conceptql/operators/from.rb +32 -5
  115. data/lib/conceptql/operators/from_seer_visits.rb +11 -5
  116. data/lib/conceptql/operators/gender.rb +9 -2
  117. data/lib/conceptql/operators/hcpcs.rb +5 -2
  118. data/lib/conceptql/operators/icd10.rb +6 -15
  119. data/lib/conceptql/operators/icd10_pcs.rb +28 -0
  120. data/lib/conceptql/operators/icd9.rb +6 -15
  121. data/lib/conceptql/operators/icd9_procedure.rb +5 -2
  122. data/lib/conceptql/operators/intersect.rb +15 -10
  123. data/lib/conceptql/operators/invalid.rb +36 -0
  124. data/lib/conceptql/operators/last.rb +3 -1
  125. data/lib/conceptql/operators/loinc.rb +5 -2
  126. data/lib/conceptql/operators/medcode.rb +5 -16
  127. data/lib/conceptql/operators/medcode_procedure.rb +3 -2
  128. data/lib/conceptql/operators/ndc.rb +5 -2
  129. data/lib/conceptql/operators/numeric.rb +30 -11
  130. data/lib/conceptql/operators/observation_by_enttype.rb +5 -2
  131. data/lib/conceptql/operators/observation_period.rb +6 -4
  132. data/lib/conceptql/operators/occurrence.rb +47 -11
  133. data/lib/conceptql/operators/one_in_two_out.rb +96 -33
  134. data/lib/conceptql/operators/operator.rb +628 -95
  135. data/lib/conceptql/operators/overlapped_by.rb +8 -5
  136. data/lib/conceptql/operators/overlaps.rb +7 -5
  137. data/lib/conceptql/operators/pass_thru.rb +12 -2
  138. data/lib/conceptql/operators/person.rb +7 -5
  139. data/lib/conceptql/operators/person_filter.rb +5 -1
  140. data/lib/conceptql/operators/place_of_service_code.rb +12 -5
  141. data/lib/conceptql/operators/place_of_service_filter.rb +47 -0
  142. data/lib/conceptql/operators/procedure_occurrence.rb +4 -2
  143. data/lib/conceptql/operators/prodcode.rb +5 -2
  144. data/lib/conceptql/operators/provenance.rb +66 -0
  145. data/lib/conceptql/operators/provider_filter.rb +36 -0
  146. data/lib/conceptql/operators/race.rb +11 -4
  147. data/lib/conceptql/operators/read.rb +149 -0
  148. data/lib/conceptql/operators/recall.rb +42 -7
  149. data/lib/conceptql/operators/revenue_code.rb +40 -0
  150. data/lib/conceptql/operators/rxnorm.rb +5 -1
  151. data/lib/conceptql/operators/snomed.rb +3 -2
  152. data/lib/conceptql/operators/source_vocabulary_operator.rb +44 -14
  153. data/lib/conceptql/operators/standard_vocabulary_operator.rb +36 -15
  154. data/lib/conceptql/operators/started_by.rb +2 -1
  155. data/lib/conceptql/operators/sum.rb +7 -1
  156. data/lib/conceptql/operators/temporal_operator.rb +75 -9
  157. data/lib/conceptql/operators/time_window.rb +13 -23
  158. data/lib/conceptql/operators/to_seer_visits.rb +6 -1
  159. data/lib/conceptql/operators/trim_date_end.rb +20 -12
  160. data/lib/conceptql/operators/trim_date_start.rb +22 -12
  161. data/lib/conceptql/operators/union.rb +39 -2
  162. data/lib/conceptql/operators/visit_occurrence.rb +5 -3
  163. data/lib/conceptql/operators/vocabulary_operator.rb +45 -0
  164. data/lib/conceptql/query.rb +68 -22
  165. data/lib/conceptql/query_modifiers/drug_query_modifier.rb +45 -0
  166. data/lib/conceptql/query_modifiers/pos_query_modifier.rb +31 -0
  167. data/lib/conceptql/query_modifiers/query_modifier.rb +16 -0
  168. data/lib/conceptql/scope.rb +169 -31
  169. data/lib/conceptql/sql_formatter.rb +22 -0
  170. data/lib/conceptql/version.rb +1 -1
  171. data/test/all.rb +3 -0
  172. data/test/all_operations_test.rb +45 -0
  173. data/test/code_list_test.rb +23 -0
  174. data/test/data/omopv4/care_site.csv +0 -0
  175. data/test/data/omopv4/cohort.csv +0 -0
  176. data/test/data/omopv4/condition_era.csv +0 -0
  177. data/test/data/omopv4/condition_occurrence.csv +34044 -0
  178. data/test/data/omopv4/death.csv +1 -0
  179. data/test/data/omopv4/drug_cost.csv +0 -0
  180. data/test/data/omopv4/drug_era.csv +0 -0
  181. data/test/data/omopv4/drug_exposure.csv +2 -0
  182. data/test/data/omopv4/location.csv +0 -0
  183. data/test/data/omopv4/observation.csv +2 -0
  184. data/test/data/omopv4/observation_period.csv +1 -0
  185. data/test/data/omopv4/organization.csv +0 -0
  186. data/test/data/omopv4/payer_plan_period.csv +0 -0
  187. data/test/data/omopv4/person.csv +250 -0
  188. data/test/data/omopv4/procedure_cost.csv +0 -0
  189. data/test/data/omopv4/procedure_occurrence.csv +35099 -0
  190. data/test/data/omopv4/provider.csv +0 -0
  191. data/test/data/omopv4/visit_occurrence.csv +14931 -0
  192. data/test/data/omopv4_plus/care_site.csv +0 -0
  193. data/test/data/omopv4_plus/cohort.csv +0 -0
  194. data/test/data/omopv4_plus/concept.csv +352 -0
  195. data/test/data/omopv4_plus/condition_era.csv +0 -0
  196. data/test/data/omopv4_plus/condition_occurrence.csv +46673 -0
  197. data/test/data/omopv4_plus/death.csv +9 -0
  198. data/test/data/omopv4_plus/drug_cost.csv +13921 -0
  199. data/test/data/omopv4_plus/drug_era.csv +0 -0
  200. data/test/data/omopv4_plus/drug_exposure.csv +13921 -0
  201. data/test/data/omopv4_plus/headers/care_site.csv +1 -0
  202. data/test/data/omopv4_plus/headers/cohort.csv +1 -0
  203. data/test/data/omopv4_plus/headers/concept.csv +1 -0
  204. data/test/data/omopv4_plus/headers/condition_era.csv +1 -0
  205. data/test/data/omopv4_plus/headers/condition_occurrence.csv +1 -0
  206. data/test/data/omopv4_plus/headers/death.csv +1 -0
  207. data/test/data/omopv4_plus/headers/drug_cost.csv +1 -0
  208. data/test/data/omopv4_plus/headers/drug_era.csv +1 -0
  209. data/test/data/omopv4_plus/headers/drug_exposure.csv +1 -0
  210. data/test/data/omopv4_plus/headers/location.csv +1 -0
  211. data/test/data/omopv4_plus/headers/observation.csv +1 -0
  212. data/test/data/omopv4_plus/headers/observation_period.csv +1 -0
  213. data/test/data/omopv4_plus/headers/organization.csv +1 -0
  214. data/test/data/omopv4_plus/headers/payer_plan_period.csv +1 -0
  215. data/test/data/omopv4_plus/headers/person.csv +1 -0
  216. data/test/data/omopv4_plus/headers/procedure_cost.csv +1 -0
  217. data/test/data/omopv4_plus/headers/procedure_occurrence.csv +1 -0
  218. data/test/data/omopv4_plus/headers/provider.csv +1 -0
  219. data/test/data/omopv4_plus/headers/source_to_concept_map.csv +1 -0
  220. data/test/data/omopv4_plus/headers/visit_occurrence.csv +1 -0
  221. data/test/data/omopv4_plus/headers/vocabulary.csv +1 -0
  222. data/test/data/omopv4_plus/location.csv +0 -0
  223. data/test/data/omopv4_plus/observation.csv +0 -0
  224. data/test/data/omopv4_plus/observation_period.csv +147 -0
  225. data/test/data/omopv4_plus/organization.csv +736 -0
  226. data/test/data/omopv4_plus/payer_plan_period.csv +808 -0
  227. data/test/data/omopv4_plus/person.csv +250 -0
  228. data/test/data/omopv4_plus/procedure_cost.csv +20123 -0
  229. data/test/data/omopv4_plus/procedure_occurrence.csv +27273 -0
  230. data/test/data/omopv4_plus/provider.csv +10193 -0
  231. data/test/data/omopv4_plus/source_to_concept_map.csv +285 -0
  232. data/test/data/omopv4_plus/visit_occurrence.csv +45125 -0
  233. data/test/data/omopv4_plus/vocabulary.csv +60 -0
  234. data/test/db.rb +15 -0
  235. data/test/db_setup.rb +408 -0
  236. data/test/db_teardown.rb +33 -0
  237. data/test/fake_annotater_test.rb +31 -0
  238. data/test/helper.rb +129 -0
  239. data/test/knitter/conceptql.md.cql +39 -0
  240. data/test/knitter/conceptql.md.expect +43 -0
  241. data/test/knitter/empty.md.cql +0 -0
  242. data/test/knitter/except.md.cql +13 -0
  243. data/test/knitter/except.md.expect +14 -0
  244. data/test/knitter/fake.md.cql +10 -0
  245. data/test/knitter/fake.md.expect +13 -0
  246. data/test/knitter/many.md.cql +7 -0
  247. data/test/knitter/many.md.expect +14 -0
  248. data/test/knitter/no_conceptql.md.cql +36 -0
  249. data/test/knitter/title.md.cql +12 -0
  250. data/test/knitter/title.md.expect +15 -0
  251. data/test/knitter/union.md.cql +11 -0
  252. data/test/knitter/union.md.expect +14 -0
  253. data/test/knitter_test.rb +69 -0
  254. data/test/query_test.rb +36 -0
  255. data/test/results/omopv4/after/anno_1 +25 -0
  256. data/test/results/omopv4/after/anno_2 +48 -0
  257. data/test/results/omopv4/after/anno_3 +34 -0
  258. data/test/results/omopv4/after/anno_4 +60 -0
  259. data/test/results/omopv4/after/anno_5 +68 -0
  260. data/test/results/omopv4/after/anno_6 +60 -0
  261. data/test/results/omopv4/after/crit_at_least +7 -0
  262. data/test/results/omopv4/after/crit_basic +32 -0
  263. data/test/results/omopv4/after/crit_occurrences +12 -0
  264. data/test/results/omopv4/after/crit_within +6 -0
  265. data/test/results/omopv4/any_overlap/crit_basic1 +15 -0
  266. data/test/results/omopv4/any_overlap/crit_basic2 +15 -0
  267. data/test/results/omopv4/any_overlap/crit_occurrences1 +2 -0
  268. data/test/results/omopv4/any_overlap/crit_occurrences2 +15 -0
  269. data/test/results/omopv4/any_overlap/crit_within +8 -0
  270. data/test/results/omopv4/before/crit_at_least +6 -0
  271. data/test/results/omopv4/before/crit_basic1 +48 -0
  272. data/test/results/omopv4/before/crit_basic2 +7 -0
  273. data/test/results/omopv4/before/crit_occurrences +13 -0
  274. data/test/results/omopv4/before/crit_within +18 -0
  275. data/test/results/omopv4/co_reported/anno_1 +43 -0
  276. data/test/results/omopv4/co_reported/anno_2 +66 -0
  277. data/test/results/omopv4/complement/anno_duplicate_params +52 -0
  278. data/test/results/omopv4/complement/anno_invalid_params +37 -0
  279. data/test/results/omopv4/complement/anno_no_params +18 -0
  280. data/test/results/omopv4/complement/count_3way_intersect +4 -0
  281. data/test/results/omopv4/complement/count_3way_union +4 -0
  282. data/test/results/omopv4/complement/count_intersect +3 -0
  283. data/test/results/omopv4/complement/count_union +3 -0
  284. data/test/results/omopv4/complement/count_union_and_intersect +4 -0
  285. data/test/results/omopv4/complement/crit_3way_intersect +1 -0
  286. data/test/results/omopv4/complement/crit_3way_union +1 -0
  287. data/test/results/omopv4/complement/crit_basic1 +33998 -0
  288. data/test/results/omopv4/complement/crit_icd9_selector +54 -0
  289. data/test/results/omopv4/complement/crit_intersect +1 -0
  290. data/test/results/omopv4/complement/crit_union +1 -0
  291. data/test/results/omopv4/complement/crit_union_and_intersect +1 -0
  292. data/test/results/omopv4/complex/anno_1 +85 -0
  293. data/test/results/omopv4/complex/crit_1 +2 -0
  294. data/test/results/omopv4/complex/crit_2 +2 -0
  295. data/test/results/omopv4/complex/crit_3 +2 -0
  296. data/test/results/omopv4/complex/crit_4 +5 -0
  297. data/test/results/omopv4/complex/crit_5 +6 -0
  298. data/test/results/omopv4/complex/crit_6 +28 -0
  299. data/test/results/omopv4/complex/crit_7 +46 -0
  300. data/test/results/omopv4/complex/crit_out_of_order_ctes +7 -0
  301. data/test/results/omopv4/complex/scanno_1 +3 -0
  302. data/test/results/omopv4/concurrent_within/crit_icd9 +54 -0
  303. data/test/results/omopv4/concurrent_within/crit_icd9_and_place_of_service +23 -0
  304. data/test/results/omopv4/concurrent_within/crit_negative_start +5 -0
  305. data/test/results/omopv4/condition_type/anno_icd9 +39 -0
  306. data/test/results/omopv4/condition_type/count_condition_era +2 -0
  307. data/test/results/omopv4/condition_type/count_condition_era_30_day_window +2 -0
  308. data/test/results/omopv4/condition_type/count_ehr_problem_list +2 -0
  309. data/test/results/omopv4/condition_type/count_era_0 +2 -0
  310. data/test/results/omopv4/condition_type/count_inpatient +3 -0
  311. data/test/results/omopv4/condition_type/count_inpatient_detail +2 -0
  312. data/test/results/omopv4/condition_type/count_inpatient_header +3 -0
  313. data/test/results/omopv4/condition_type/count_inpatient_header_2 +3 -0
  314. data/test/results/omopv4/condition_type/count_inpatient_header_3 +3 -0
  315. data/test/results/omopv4/condition_type/count_inpatient_header_4 +3 -0
  316. data/test/results/omopv4/condition_type/count_inpatient_header_5 +3 -0
  317. data/test/results/omopv4/condition_type/count_inpatient_outpatient_detail +3 -0
  318. data/test/results/omopv4/condition_type/count_inpatient_primary +2 -0
  319. data/test/results/omopv4/condition_type/count_inpatient_primary_or_first +3 -0
  320. data/test/results/omopv4/condition_type/count_outpatient +3 -0
  321. data/test/results/omopv4/condition_type/count_outpatient_detail +3 -0
  322. data/test/results/omopv4/condition_type/count_outpatient_header +2 -0
  323. data/test/results/omopv4/condition_type/count_outpatient_primary +3 -0
  324. data/test/results/omopv4/condition_type/count_primary +3 -0
  325. data/test/results/omopv4/condition_type/crit_condition_era +1 -0
  326. data/test/results/omopv4/condition_type/crit_condition_era_30_day_window +1 -0
  327. data/test/results/omopv4/condition_type/crit_ehr_problem_list +1 -0
  328. data/test/results/omopv4/condition_type/crit_era_0 +1 -0
  329. data/test/results/omopv4/condition_type/crit_inpatient +1 -0
  330. data/test/results/omopv4/condition_type/crit_inpatient_detail +1 -0
  331. data/test/results/omopv4/condition_type/crit_inpatient_header +1 -0
  332. data/test/results/omopv4/condition_type/crit_inpatient_header_2 +1 -0
  333. data/test/results/omopv4/condition_type/crit_inpatient_header_3 +1 -0
  334. data/test/results/omopv4/condition_type/crit_inpatient_header_4 +1 -0
  335. data/test/results/omopv4/condition_type/crit_inpatient_header_5 +1 -0
  336. data/test/results/omopv4/condition_type/crit_inpatient_primary +1 -0
  337. data/test/results/omopv4/condition_type/crit_inpatient_primary_or_first +1 -0
  338. data/test/results/omopv4/condition_type/crit_outpatient +1 -0
  339. data/test/results/omopv4/condition_type/crit_outpatient_detail +1 -0
  340. data/test/results/omopv4/condition_type/crit_outpatient_header +1 -0
  341. data/test/results/omopv4/condition_type/crit_outpatient_primary +1 -0
  342. data/test/results/omopv4/condition_type/crit_primary +1 -0
  343. data/test/results/omopv4/contains/crit_1 +5 -0
  344. data/test/results/omopv4/contains/crit_2 +2 -0
  345. data/test/results/omopv4/contains/crit_3 +2 -0
  346. data/test/results/omopv4/count/anno_multiple_upstreams +52 -0
  347. data/test/results/omopv4/count/anno_no_upstream1 +18 -0
  348. data/test/results/omopv4/count/anno_no_upstream2 +25 -0
  349. data/test/results/omopv4/count/crit_icd9_ndc +8 -0
  350. data/test/results/omopv4/count/crit_ndc +5 -0
  351. data/test/results/omopv4/count/crit_person +254 -0
  352. data/test/results/omopv4/cpt/anno_icd9_upstream +40 -0
  353. data/test/results/omopv4/cpt/anno_invalid_code +22 -0
  354. data/test/results/omopv4/cpt/count_1 +3 -0
  355. data/test/results/omopv4/cpt/crit_1 +174 -0
  356. data/test/results/omopv4/cpt/crit_2 +1 -0
  357. data/test/results/omopv4/cpt/scanno_1 +17 -0
  358. data/test/results/omopv4/cpt_or_hcpcs/anno_bad_format +25 -0
  359. data/test/results/omopv4/cpt_or_hcpcs/count_1 +3 -0
  360. data/test/results/omopv4/cpt_or_hcpcs/crit_1 +179 -0
  361. data/test/results/omopv4/cpt_or_hcpcs/crit_2 +1 -0
  362. data/test/results/omopv4/date_range/anno_1 +15 -0
  363. data/test/results/omopv4/date_range/anno_extra_argument +24 -0
  364. data/test/results/omopv4/date_range/anno_invalid_argument +25 -0
  365. data/test/results/omopv4/date_range/anno_missing_argument1 +20 -0
  366. data/test/results/omopv4/date_range/anno_missing_argument2 +20 -0
  367. data/test/results/omopv4/date_range/anno_no_upstreams +38 -0
  368. data/test/results/omopv4/date_range/count_1 +3 -0
  369. data/test/results/omopv4/date_range/count_2 +3 -0
  370. data/test/results/omopv4/date_range/crit_1 +1 -0
  371. data/test/results/omopv4/date_range/crit_2 +1 -0
  372. data/test/results/omopv4/death/anno_multiple_upstreams +50 -0
  373. data/test/results/omopv4/death/anno_no_upstreams +22 -0
  374. data/test/results/omopv4/death/crit_basic +5 -0
  375. data/test/results/omopv4/death/crit_person +5 -0
  376. data/test/results/omopv4/drug_type_concept/anno_has_upstreams +37 -0
  377. data/test/results/omopv4/drug_type_concept/anno_no_arguments +18 -0
  378. data/test/results/omopv4/drug_type_concept/crit_basic1 +5 -0
  379. data/test/results/omopv4/drug_type_concept/crit_basic2 +2 -0
  380. data/test/results/omopv4/during/crit_1 +15 -0
  381. data/test/results/omopv4/during/crit_2 +2 -0
  382. data/test/results/omopv4/equal/crit_1 +5 -0
  383. data/test/results/omopv4/equal/crit_2 +5 -0
  384. data/test/results/omopv4/except/anno_1 +42 -0
  385. data/test/results/omopv4/except/anno_2 +43 -0
  386. data/test/results/omopv4/except/count_complex +5 -0
  387. data/test/results/omopv4/except/crit_412_cpt +54 -0
  388. data/test/results/omopv4/except/crit_412_inpatient +46 -0
  389. data/test/results/omopv4/except/crit_complex +1 -0
  390. data/test/results/omopv4/filter/crit_1 +54 -0
  391. data/test/results/omopv4/first/anno_argument +25 -0
  392. data/test/results/omopv4/first/anno_no_upstream +18 -0
  393. data/test/results/omopv4/first/crit_cpt +207 -0
  394. data/test/results/omopv4/first/crit_icd9 +42 -0
  395. data/test/results/omopv4/first/crit_union +45 -0
  396. data/test/results/omopv4/from/anno_has_upstreams +39 -0
  397. data/test/results/omopv4/from/anno_multiple_arguments +24 -0
  398. data/test/results/omopv4/from/count_condition_occurrence +3 -0
  399. data/test/results/omopv4/from/count_observation_period +3 -0
  400. data/test/results/omopv4/from/count_person +3 -0
  401. data/test/results/omopv4/from_seer_visits/anno_multiple_upstreams +78 -0
  402. data/test/results/omopv4/from_seer_visits/anno_no_upstream +18 -0
  403. data/test/results/omopv4/from_seer_visits/crit_1 +6 -0
  404. data/test/results/omopv4/from_seer_visits/crit_2 +5 -0
  405. data/test/results/omopv4/from_seer_visits/crit_3 +5 -0
  406. data/test/results/omopv4/from_seer_visits/crit_4 +6 -0
  407. data/test/results/omopv4/gender/anno_has_upstreams +39 -0
  408. data/test/results/omopv4/gender/crit_male +130 -0
  409. data/test/results/omopv4/hcpcs/anno_bad_format +24 -0
  410. data/test/results/omopv4/hcpcs/crit_A0382 +9 -0
  411. data/test/results/omopv4/icd10/anno_bad_format +22 -0
  412. data/test/results/omopv4/icd10/anno_has_upstreams +40 -0
  413. data/test/results/omopv4/icd10/crit_1 +5 -0
  414. data/test/results/omopv4/icd10pcs/anno_bad_format +28 -0
  415. data/test/results/omopv4/icd10pcs/anno_has_upstreams +40 -0
  416. data/test/results/omopv4/icd10pcs/crit_1 +2 -0
  417. data/test/results/omopv4/icd9/anno_empty_label +15 -0
  418. data/test/results/omopv4/icd9/anno_invalid_code +21 -0
  419. data/test/results/omopv4/icd9/crit_1 +54 -0
  420. data/test/results/omopv4/icd9_procedure/crit_1 +5 -0
  421. data/test/results/omopv4/intersect/anno_412_inpatient +42 -0
  422. data/test/results/omopv4/intersect/anno_has_arguments +25 -0
  423. data/test/results/omopv4/intersect/anno_no_upstream +18 -0
  424. data/test/results/omopv4/intersect/crit_412_inpatient +12 -0
  425. data/test/results/omopv4/intersect/crit_412_male +182 -0
  426. data/test/results/omopv4/intersect/crit_complex +118 -0
  427. data/test/results/omopv4/invalid/anno_bad_op +55 -0
  428. data/test/results/omopv4/invalid/scanno_1 +23 -0
  429. data/test/results/omopv4/last/crit_icd9 +42 -0
  430. data/test/results/omopv4/loinc/crit_basic +5 -0
  431. data/test/results/omopv4/ndc/crit_basic +5 -0
  432. data/test/results/omopv4/numeric/anno_multiple_upstreams +59 -0
  433. data/test/results/omopv4/numeric/num_values_1 +254 -0
  434. data/test/results/omopv4/numeric/num_values_2 +5 -0
  435. data/test/results/omopv4/numeric/num_values_3 +5 -0
  436. data/test/results/omopv4/observation_period/anno_has_arguments +36 -0
  437. data/test/results/omopv4/observation_period/anno_multiple_upstreams +51 -0
  438. data/test/results/omopv4/observation_period/count_all_periods +3 -0
  439. data/test/results/omopv4/observation_period/crit_female +2 -0
  440. data/test/results/omopv4/observation_period/crit_icd9 +5 -0
  441. data/test/results/omopv4/observation_period/crit_male +5 -0
  442. data/test/results/omopv4/occurrence/anno_no_upstream +22 -0
  443. data/test/results/omopv4/occurrence/cc_412_410 +1 -0
  444. data/test/results/omopv4/occurrence/count_412_410 +3 -0
  445. data/test/results/omopv4/occurrence/crit_1 +16 -0
  446. data/test/results/omopv4/occurrence/crit_2 +2 -0
  447. data/test/results/omopv4/occurrence/crit_3 +42 -0
  448. data/test/results/omopv4/one_in_two_out/anno_has_arguments +27 -0
  449. data/test/results/omopv4/one_in_two_out/anno_multiple_upstreams +54 -0
  450. data/test/results/omopv4/one_in_two_out/anno_no_upstream +20 -0
  451. data/test/results/omopv4/one_in_two_out/count_1 +3 -0
  452. data/test/results/omopv4/one_in_two_out/crit_hcpcs +7 -0
  453. data/test/results/omopv4/one_in_two_out/crit_icd9 +21 -0
  454. data/test/results/omopv4/overlapped_by/crit_1 +5 -0
  455. data/test/results/omopv4/overlapped_by/crit_2 +2 -0
  456. data/test/results/omopv4/overlapped_by/crit_3 +5 -0
  457. data/test/results/omopv4/overlapped_by/crit_4 +2 -0
  458. data/test/results/omopv4/overlaps/crit_1 +5 -0
  459. data/test/results/omopv4/overlaps/crit_2 +2 -0
  460. data/test/results/omopv4/overlaps/crit_3 +5 -0
  461. data/test/results/omopv4/overlaps/crit_4 +2 -0
  462. data/test/results/omopv4/person/anno_has_arguments +22 -0
  463. data/test/results/omopv4/person/anno_multiple_upstreams +52 -0
  464. data/test/results/omopv4/person/count_2 +3 -0
  465. data/test/results/omopv4/person/crit_1 +42 -0
  466. data/test/results/omopv4/person/crit_2 +1 -0
  467. data/test/results/omopv4/person_filter/count_1 +4 -0
  468. data/test/results/omopv4/person_filter/crit_1 +54 -0
  469. data/test/results/omopv4/person_filter/crit_2 +5 -0
  470. data/test/results/omopv4/person_filter/crit_3 +32 -0
  471. data/test/results/omopv4/person_filter/crit_4 +52 -0
  472. data/test/results/omopv4/person_filter/crit_5 +1 -0
  473. data/test/results/omopv4/place_of_service_code/anno_has_upstreams +37 -0
  474. data/test/results/omopv4/place_of_service_code/anno_no_arguments +18 -0
  475. data/test/results/omopv4/place_of_service_code/crit_basic +174 -0
  476. data/test/results/omopv4/place_of_service_filter/anno_1 +29 -0
  477. data/test/results/omopv4/procedure_occurrence/anno_has_arguments +37 -0
  478. data/test/results/omopv4/procedure_occurrence/anno_multiple_upstreams +51 -0
  479. data/test/results/omopv4/procedure_occurrence/count_gender +3 -0
  480. data/test/results/omopv4/procedure_occurrence/count_icd9 +3 -0
  481. data/test/results/omopv4/procedure_occurrence/count_started_by +3 -0
  482. data/test/results/omopv4/procedure_occurrence/crit_gender +1 -0
  483. data/test/results/omopv4/procedure_occurrence/crit_icd9 +1 -0
  484. data/test/results/omopv4/procedure_occurrence/crit_started_by +1 -0
  485. data/test/results/omopv4/provenance/anno_1 +29 -0
  486. data/test/results/omopv4/provider_filter/anno_1 +29 -0
  487. data/test/results/omopv4/race/anno_1 +37 -0
  488. data/test/results/omopv4/race/anno_2 +18 -0
  489. data/test/results/omopv4/race/crit_1 +28 -0
  490. data/test/results/omopv4/read/anno_1 +21 -0
  491. data/test/results/omopv4/read/crit_1 +2 -0
  492. data/test/results/omopv4/recall/anno_1 +54 -0
  493. data/test/results/omopv4/recall/anno_2 +66 -0
  494. data/test/results/omopv4/recall/anno_3 +20 -0
  495. data/test/results/omopv4/recall/anno_4 +18 -0
  496. data/test/results/omopv4/recall/anno_5 +24 -0
  497. data/test/results/omopv4/recall/anno_6 +270 -0
  498. data/test/results/omopv4/recall/crit_1 +21 -0
  499. data/test/results/omopv4/recall/crit_2 +54 -0
  500. data/test/results/omopv4/recall/crit_3 +2 -0
  501. data/test/results/omopv4/recall/crit_cte_1 +42 -0
  502. data/test/results/omopv4/recall/crit_cte_2 +42 -0
  503. data/test/results/omopv4/recall/crit_nested_perm_0 +54 -0
  504. data/test/results/omopv4/revenue_code/crit_1 +2 -0
  505. data/test/results/omopv4/revenue_code/crit_basic +2 -0
  506. data/test/results/omopv4/revenue_code/domains_1 +3 -0
  507. data/test/results/omopv4/revenue_code/domains_drg100 +3 -0
  508. data/test/results/omopv4/rxnorm/crit_1 +5 -0
  509. data/test/results/omopv4/snomed/crit_1 +84 -0
  510. data/test/results/omopv4/started_by/crit_1 +5 -0
  511. data/test/results/omopv4/started_by/crit_2 +2 -0
  512. data/test/results/omopv4/started_by/crit_3 +2 -0
  513. data/test/results/omopv4/sum/anno_1 +18 -0
  514. data/test/results/omopv4/sum/anno_2 +36 -0
  515. data/test/results/omopv4/sum/num_1 +5 -0
  516. data/test/results/omopv4/sum/num_2 +8 -0
  517. data/test/results/omopv4/sum/num_3 +254 -0
  518. data/test/results/omopv4/time_window/anno_1 +20 -0
  519. data/test/results/omopv4/time_window/anno_2 +40 -0
  520. data/test/results/omopv4/time_window/anno_3 +36 -0
  521. data/test/results/omopv4/time_window/anno_4 +39 -0
  522. data/test/results/omopv4/time_window/anno_5 +57 -0
  523. data/test/results/omopv4/time_window/crit_1 +54 -0
  524. data/test/results/omopv4/time_window/crit_2 +174 -0
  525. data/test/results/omopv4/time_window/crit_3 +54 -0
  526. data/test/results/omopv4/time_window/crit_4 +174 -0
  527. data/test/results/omopv4/trim_date_end/crit_1 +5 -0
  528. data/test/results/omopv4/trim_date_end/crit_2 +2 -0
  529. data/test/results/omopv4/trim_date_end/crit_3 +6 -0
  530. data/test/results/omopv4/trim_date_end/crit_at_least +5 -0
  531. data/test/results/omopv4/trim_date_end/crit_occurrences_1 +2 -0
  532. data/test/results/omopv4/trim_date_end/crit_occurrences_2 +6 -0
  533. data/test/results/omopv4/trim_date_end/crit_within +5 -0
  534. data/test/results/omopv4/trim_date_start/crit_1 +5 -0
  535. data/test/results/omopv4/trim_date_start/crit_2 +2 -0
  536. data/test/results/omopv4/trim_date_start/crit_3 +6 -0
  537. data/test/results/omopv4/trim_date_start/crit_at_least +5 -0
  538. data/test/results/omopv4/trim_date_start/crit_occurrences_1 +2 -0
  539. data/test/results/omopv4/trim_date_start/crit_occurrences_2 +6 -0
  540. data/test/results/omopv4/trim_date_start/crit_within +5 -0
  541. data/test/results/omopv4/union/anno_1 +43 -0
  542. data/test/results/omopv4/union/anno_2 +74 -0
  543. data/test/results/omopv4/union/anno_3 +18 -0
  544. data/test/results/omopv4/union/anno_4 +25 -0
  545. data/test/results/omopv4/union/anno_5 +33 -0
  546. data/test/results/omopv4/union/anno_6 +46 -0
  547. data/test/results/omopv4/union/cc_1 +1 -0
  548. data/test/results/omopv4/union/cc_2 +1 -0
  549. data/test/results/omopv4/union/cc_3 +1 -0
  550. data/test/results/omopv4/union/cc_4 +1 -0
  551. data/test/results/omopv4/union/cc_5 +1 -0
  552. data/test/results/omopv4/union/count_1 +3 -0
  553. data/test/results/omopv4/union/count_2 +3 -0
  554. data/test/results/omopv4/union/count_3 +3 -0
  555. data/test/results/omopv4/union/count_4 +3 -0
  556. data/test/results/omopv4/union/count_5 +4 -0
  557. data/test/results/omopv4/union/scanno_1 +22 -0
  558. data/test/results/omopv4/union/scanno_2 +36 -0
  559. data/test/results/omopv4/visit_occurrence/anno_1 +52 -0
  560. data/test/results/omopv4/visit_occurrence/anno_2 +37 -0
  561. data/test/results/omopv4/visit_occurrence/crit_1 +54 -0
  562. data/test/results/omopv4/visit_occurrence/crit_2 +7566 -0
  563. data/test/results/omopv4/visit_occurrence/crit_3 +14935 -0
  564. data/test/results/omopv4_plus/after/anno_1 +25 -0
  565. data/test/results/omopv4_plus/after/anno_2 +48 -0
  566. data/test/results/omopv4_plus/after/anno_3 +34 -0
  567. data/test/results/omopv4_plus/after/anno_4 +60 -0
  568. data/test/results/omopv4_plus/after/anno_5 +68 -0
  569. data/test/results/omopv4_plus/after/anno_6 +60 -0
  570. data/test/results/omopv4_plus/after/crit_at_least +7 -0
  571. data/test/results/omopv4_plus/after/crit_basic +32 -0
  572. data/test/results/omopv4_plus/after/crit_occurrences +12 -0
  573. data/test/results/omopv4_plus/after/crit_within +5 -0
  574. data/test/results/omopv4_plus/any_overlap/crit_basic1 +14 -0
  575. data/test/results/omopv4_plus/any_overlap/crit_basic2 +14 -0
  576. data/test/results/omopv4_plus/any_overlap/crit_occurrences1 +2 -0
  577. data/test/results/omopv4_plus/any_overlap/crit_occurrences2 +14 -0
  578. data/test/results/omopv4_plus/any_overlap/crit_within +8 -0
  579. data/test/results/omopv4_plus/before/crit_at_least +6 -0
  580. data/test/results/omopv4_plus/before/crit_basic1 +48 -0
  581. data/test/results/omopv4_plus/before/crit_basic2 +8 -0
  582. data/test/results/omopv4_plus/before/crit_occurrences +13 -0
  583. data/test/results/omopv4_plus/before/crit_within +17 -0
  584. data/test/results/omopv4_plus/co_reported/anno_1 +43 -0
  585. data/test/results/omopv4_plus/co_reported/anno_2 +66 -0
  586. data/test/results/omopv4_plus/co_reported/anno_3 +47 -0
  587. data/test/results/omopv4_plus/complement/anno_duplicate_params +52 -0
  588. data/test/results/omopv4_plus/complement/anno_invalid_params +37 -0
  589. data/test/results/omopv4_plus/complement/anno_no_params +18 -0
  590. data/test/results/omopv4_plus/complement/count_3way_intersect +4 -0
  591. data/test/results/omopv4_plus/complement/count_3way_union +4 -0
  592. data/test/results/omopv4_plus/complement/count_intersect +3 -0
  593. data/test/results/omopv4_plus/complement/count_union +3 -0
  594. data/test/results/omopv4_plus/complement/count_union_and_intersect +4 -0
  595. data/test/results/omopv4_plus/complement/crit_basic1 +52483 -0
  596. data/test/results/omopv4_plus/complement/crit_icd9_selector +52 -0
  597. data/test/results/omopv4_plus/complex/anno_1 +85 -0
  598. data/test/results/omopv4_plus/complex/crit_1 +2 -0
  599. data/test/results/omopv4_plus/complex/crit_2 +2 -0
  600. data/test/results/omopv4_plus/complex/crit_3 +2 -0
  601. data/test/results/omopv4_plus/complex/crit_4 +2 -0
  602. data/test/results/omopv4_plus/complex/crit_5 +2 -0
  603. data/test/results/omopv4_plus/complex/crit_6 +24 -0
  604. data/test/results/omopv4_plus/complex/crit_7 +45 -0
  605. data/test/results/omopv4_plus/complex/crit_out_of_order_ctes +15 -0
  606. data/test/results/omopv4_plus/complex/scanno_1 +108 -0
  607. data/test/results/omopv4_plus/concurrent_within/crit_icd9 +52 -0
  608. data/test/results/omopv4_plus/concurrent_within/crit_icd9_and_place_of_service +21 -0
  609. data/test/results/omopv4_plus/concurrent_within/crit_negative_start +5 -0
  610. data/test/results/omopv4_plus/condition_type/anno_icd9 +39 -0
  611. data/test/results/omopv4_plus/condition_type/count_condition_era +2 -0
  612. data/test/results/omopv4_plus/condition_type/count_condition_era_30_day_window +2 -0
  613. data/test/results/omopv4_plus/condition_type/count_ehr_problem_list +2 -0
  614. data/test/results/omopv4_plus/condition_type/count_era_0 +2 -0
  615. data/test/results/omopv4_plus/condition_type/count_inpatient +3 -0
  616. data/test/results/omopv4_plus/condition_type/count_inpatient_detail +2 -0
  617. data/test/results/omopv4_plus/condition_type/count_inpatient_header +3 -0
  618. data/test/results/omopv4_plus/condition_type/count_inpatient_header_2 +3 -0
  619. data/test/results/omopv4_plus/condition_type/count_inpatient_header_3 +3 -0
  620. data/test/results/omopv4_plus/condition_type/count_inpatient_header_4 +3 -0
  621. data/test/results/omopv4_plus/condition_type/count_inpatient_header_5 +3 -0
  622. data/test/results/omopv4_plus/condition_type/count_inpatient_outpatient_detail +3 -0
  623. data/test/results/omopv4_plus/condition_type/count_inpatient_primary +3 -0
  624. data/test/results/omopv4_plus/condition_type/count_inpatient_primary_or_first +3 -0
  625. data/test/results/omopv4_plus/condition_type/count_outpatient +3 -0
  626. data/test/results/omopv4_plus/condition_type/count_outpatient_detail +2 -0
  627. data/test/results/omopv4_plus/condition_type/count_outpatient_header +3 -0
  628. data/test/results/omopv4_plus/condition_type/count_outpatient_primary +3 -0
  629. data/test/results/omopv4_plus/condition_type/count_primary +3 -0
  630. data/test/results/omopv4_plus/contains/crit_1 +5 -0
  631. data/test/results/omopv4_plus/contains/crit_2 +2 -0
  632. data/test/results/omopv4_plus/contains/crit_3 +2 -0
  633. data/test/results/omopv4_plus/count/anno_multiple_upstreams +52 -0
  634. data/test/results/omopv4_plus/count/anno_no_upstream1 +18 -0
  635. data/test/results/omopv4_plus/count/anno_no_upstream2 +25 -0
  636. data/test/results/omopv4_plus/count/crit_icd9_ndc +5 -0
  637. data/test/results/omopv4_plus/count/crit_ndc +2 -0
  638. data/test/results/omopv4_plus/count/crit_person +254 -0
  639. data/test/results/omopv4_plus/cpt/anno_icd9_upstream +40 -0
  640. data/test/results/omopv4_plus/cpt/anno_invalid_code +22 -0
  641. data/test/results/omopv4_plus/cpt/count_1 +3 -0
  642. data/test/results/omopv4_plus/cpt/crit_1 +158 -0
  643. data/test/results/omopv4_plus/cpt/scanno_1 +17 -0
  644. data/test/results/omopv4_plus/cpt_or_hcpcs/anno_bad_format +25 -0
  645. data/test/results/omopv4_plus/cpt_or_hcpcs/count_1 +3 -0
  646. data/test/results/omopv4_plus/cpt_or_hcpcs/crit_1 +161 -0
  647. data/test/results/omopv4_plus/date_range/anno_1 +15 -0
  648. data/test/results/omopv4_plus/date_range/anno_extra_argument +24 -0
  649. data/test/results/omopv4_plus/date_range/anno_invalid_argument +25 -0
  650. data/test/results/omopv4_plus/date_range/anno_missing_argument1 +20 -0
  651. data/test/results/omopv4_plus/date_range/anno_missing_argument2 +20 -0
  652. data/test/results/omopv4_plus/date_range/anno_no_upstreams +38 -0
  653. data/test/results/omopv4_plus/date_range/count_1 +3 -0
  654. data/test/results/omopv4_plus/date_range/count_2 +3 -0
  655. data/test/results/omopv4_plus/death/anno_multiple_upstreams +50 -0
  656. data/test/results/omopv4_plus/death/anno_no_upstreams +22 -0
  657. data/test/results/omopv4_plus/death/crit_basic +14 -0
  658. data/test/results/omopv4_plus/death/crit_person +14 -0
  659. data/test/results/omopv4_plus/drug_type_concept/anno_has_upstreams +37 -0
  660. data/test/results/omopv4_plus/drug_type_concept/anno_no_arguments +18 -0
  661. data/test/results/omopv4_plus/drug_type_concept/crit_basic1 +2 -0
  662. data/test/results/omopv4_plus/drug_type_concept/crit_basic2 +2 -0
  663. data/test/results/omopv4_plus/during/crit_1 +14 -0
  664. data/test/results/omopv4_plus/during/crit_2 +2 -0
  665. data/test/results/omopv4_plus/equal/crit_1 +2 -0
  666. data/test/results/omopv4_plus/equal/crit_2 +2 -0
  667. data/test/results/omopv4_plus/except/anno_1 +42 -0
  668. data/test/results/omopv4_plus/except/anno_2 +43 -0
  669. data/test/results/omopv4_plus/except/count_complex +5 -0
  670. data/test/results/omopv4_plus/except/crit_412_cpt +52 -0
  671. data/test/results/omopv4_plus/except/crit_412_inpatient +45 -0
  672. data/test/results/omopv4_plus/filter/crit_1 +52 -0
  673. data/test/results/omopv4_plus/first/anno_argument +25 -0
  674. data/test/results/omopv4_plus/first/anno_no_upstream +18 -0
  675. data/test/results/omopv4_plus/first/crit_cpt +180 -0
  676. data/test/results/omopv4_plus/first/crit_icd9 +41 -0
  677. data/test/results/omopv4_plus/first/crit_union +52 -0
  678. data/test/results/omopv4_plus/from/anno_has_upstreams +39 -0
  679. data/test/results/omopv4_plus/from/anno_multiple_arguments +24 -0
  680. data/test/results/omopv4_plus/from/count_condition_occurrence +3 -0
  681. data/test/results/omopv4_plus/from/count_observation_period +3 -0
  682. data/test/results/omopv4_plus/from/count_person +3 -0
  683. data/test/results/omopv4_plus/from_seer_visits/anno_multiple_upstreams +78 -0
  684. data/test/results/omopv4_plus/from_seer_visits/anno_no_upstream +18 -0
  685. data/test/results/omopv4_plus/from_seer_visits/crit_1 +2 -0
  686. data/test/results/omopv4_plus/from_seer_visits/crit_2 +2 -0
  687. data/test/results/omopv4_plus/from_seer_visits/crit_3 +2 -0
  688. data/test/results/omopv4_plus/from_seer_visits/crit_4 +2 -0
  689. data/test/results/omopv4_plus/gender/anno_has_upstreams +39 -0
  690. data/test/results/omopv4_plus/gender/crit_male +128 -0
  691. data/test/results/omopv4_plus/hcpcs/anno_bad_format +24 -0
  692. data/test/results/omopv4_plus/hcpcs/crit_A0382 +7 -0
  693. data/test/results/omopv4_plus/icd10/anno_bad_format +22 -0
  694. data/test/results/omopv4_plus/icd10/anno_has_upstreams +40 -0
  695. data/test/results/omopv4_plus/icd10/crit_1 +2 -0
  696. data/test/results/omopv4_plus/icd10pcs/anno_bad_format +28 -0
  697. data/test/results/omopv4_plus/icd10pcs/anno_has_upstreams +40 -0
  698. data/test/results/omopv4_plus/icd10pcs/crit_1 +2 -0
  699. data/test/results/omopv4_plus/icd9/anno_empty_label +15 -0
  700. data/test/results/omopv4_plus/icd9/anno_invalid_code +21 -0
  701. data/test/results/omopv4_plus/icd9/anno_valid_code +3 -0
  702. data/test/results/omopv4_plus/icd9/crit_1 +52 -0
  703. data/test/results/omopv4_plus/icd9_procedure/crit_1 +5 -0
  704. data/test/results/omopv4_plus/intersect/anno_412_inpatient +42 -0
  705. data/test/results/omopv4_plus/intersect/anno_has_arguments +25 -0
  706. data/test/results/omopv4_plus/intersect/anno_no_upstream +18 -0
  707. data/test/results/omopv4_plus/intersect/crit_412_inpatient +11 -0
  708. data/test/results/omopv4_plus/intersect/crit_412_male +178 -0
  709. data/test/results/omopv4_plus/intersect/crit_complex +110 -0
  710. data/test/results/omopv4_plus/invalid/anno_bad_op +55 -0
  711. data/test/results/omopv4_plus/invalid/scanno_1 +23 -0
  712. data/test/results/omopv4_plus/last/crit_icd9 +41 -0
  713. data/test/results/omopv4_plus/loinc/crit_basic +2 -0
  714. data/test/results/omopv4_plus/ndc/crit_basic +2 -0
  715. data/test/results/omopv4_plus/ndc/results_1 +41 -0
  716. data/test/results/omopv4_plus/numeric/anno_multiple_upstreams +59 -0
  717. data/test/results/omopv4_plus/numeric/num_values_1 +254 -0
  718. data/test/results/omopv4_plus/numeric/num_values_2 +5 -0
  719. data/test/results/omopv4_plus/numeric/num_values_3 +5 -0
  720. data/test/results/omopv4_plus/observation_period/anno_has_arguments +36 -0
  721. data/test/results/omopv4_plus/observation_period/anno_multiple_upstreams +51 -0
  722. data/test/results/omopv4_plus/observation_period/count_all_periods +3 -0
  723. data/test/results/omopv4_plus/observation_period/crit_female +87 -0
  724. data/test/results/omopv4_plus/observation_period/crit_icd9 +28 -0
  725. data/test/results/omopv4_plus/observation_period/crit_male +75 -0
  726. data/test/results/omopv4_plus/occurrence/anno_no_upstream +22 -0
  727. data/test/results/omopv4_plus/occurrence/count_412_410 +3 -0
  728. data/test/results/omopv4_plus/occurrence/crit_1 +15 -0
  729. data/test/results/omopv4_plus/occurrence/crit_2 +2 -0
  730. data/test/results/omopv4_plus/occurrence/crit_3 +41 -0
  731. data/test/results/omopv4_plus/one_in_two_out/anno_has_arguments +27 -0
  732. data/test/results/omopv4_plus/one_in_two_out/anno_multiple_upstreams +54 -0
  733. data/test/results/omopv4_plus/one_in_two_out/anno_no_upstream +20 -0
  734. data/test/results/omopv4_plus/one_in_two_out/count_1 +3 -0
  735. data/test/results/omopv4_plus/one_in_two_out/count_same_as_1 +3 -0
  736. data/test/results/omopv4_plus/one_in_two_out/crit_hcpcs +2 -0
  737. data/test/results/omopv4_plus/one_in_two_out/crit_icd9 +19 -0
  738. data/test/results/omopv4_plus/one_in_two_out/results_1 +803 -0
  739. data/test/results/omopv4_plus/one_in_two_out/results_2 +803 -0
  740. data/test/results/omopv4_plus/overlapped_by/crit_1 +5 -0
  741. data/test/results/omopv4_plus/overlapped_by/crit_2 +2 -0
  742. data/test/results/omopv4_plus/overlapped_by/crit_3 +5 -0
  743. data/test/results/omopv4_plus/overlapped_by/crit_4 +2 -0
  744. data/test/results/omopv4_plus/overlaps/crit_1 +5 -0
  745. data/test/results/omopv4_plus/overlaps/crit_2 +2 -0
  746. data/test/results/omopv4_plus/overlaps/crit_3 +5 -0
  747. data/test/results/omopv4_plus/overlaps/crit_4 +2 -0
  748. data/test/results/omopv4_plus/person/anno_has_arguments +22 -0
  749. data/test/results/omopv4_plus/person/anno_multiple_upstreams +52 -0
  750. data/test/results/omopv4_plus/person/count_2 +3 -0
  751. data/test/results/omopv4_plus/person/crit_1 +41 -0
  752. data/test/results/omopv4_plus/person_filter/count_1 +4 -0
  753. data/test/results/omopv4_plus/person_filter/crit_1 +52 -0
  754. data/test/results/omopv4_plus/person_filter/crit_2 +10 -0
  755. data/test/results/omopv4_plus/person_filter/crit_3 +32 -0
  756. data/test/results/omopv4_plus/person_filter/crit_4 +50 -0
  757. data/test/results/omopv4_plus/place_of_service_code/anno_has_upstreams +37 -0
  758. data/test/results/omopv4_plus/place_of_service_code/anno_no_arguments +18 -0
  759. data/test/results/omopv4_plus/place_of_service_code/crit_basic +157 -0
  760. data/test/results/omopv4_plus/place_of_service_filter/anno_1 +29 -0
  761. data/test/results/omopv4_plus/procedure_occurrence/anno_has_arguments +37 -0
  762. data/test/results/omopv4_plus/procedure_occurrence/anno_multiple_upstreams +51 -0
  763. data/test/results/omopv4_plus/procedure_occurrence/count_gender +3 -0
  764. data/test/results/omopv4_plus/procedure_occurrence/count_icd9 +3 -0
  765. data/test/results/omopv4_plus/procedure_occurrence/count_started_by +3 -0
  766. data/test/results/omopv4_plus/provenance/anno_1 +29 -0
  767. data/test/results/omopv4_plus/provenance/anno_bad_keyword +38 -0
  768. data/test/results/omopv4_plus/provenance/count_1 +3 -0
  769. data/test/results/omopv4_plus/provenance/count_2 +3 -0
  770. data/test/results/omopv4_plus/provider_filter/anno_1 +29 -0
  771. data/test/results/omopv4_plus/race/anno_1 +37 -0
  772. data/test/results/omopv4_plus/race/anno_2 +18 -0
  773. data/test/results/omopv4_plus/race/crit_1 +32 -0
  774. data/test/results/omopv4_plus/read/anno_1 +15 -0
  775. data/test/results/omopv4_plus/read/crit_1 +2 -0
  776. data/test/results/omopv4_plus/recall/anno_1 +54 -0
  777. data/test/results/omopv4_plus/recall/anno_2 +66 -0
  778. data/test/results/omopv4_plus/recall/anno_3 +20 -0
  779. data/test/results/omopv4_plus/recall/anno_4 +18 -0
  780. data/test/results/omopv4_plus/recall/anno_5 +24 -0
  781. data/test/results/omopv4_plus/recall/anno_6 +270 -0
  782. data/test/results/omopv4_plus/recall/crit_1 +19 -0
  783. data/test/results/omopv4_plus/recall/crit_2 +52 -0
  784. data/test/results/omopv4_plus/recall/crit_3 +2 -0
  785. data/test/results/omopv4_plus/recall/crit_cte_1 +41 -0
  786. data/test/results/omopv4_plus/recall/crit_cte_2 +41 -0
  787. data/test/results/omopv4_plus/recall/crit_nested_perm_0 +52 -0
  788. data/test/results/omopv4_plus/revenue_code/crit_1 +2 -0
  789. data/test/results/omopv4_plus/revenue_code/crit_basic +2 -0
  790. data/test/results/omopv4_plus/revenue_code/domains_1 +3 -0
  791. data/test/results/omopv4_plus/revenue_code/domains_drg100 +3 -0
  792. data/test/results/omopv4_plus/rxnorm/crit_1 +2 -0
  793. data/test/results/omopv4_plus/snomed/crit_1 +2 -0
  794. data/test/results/omopv4_plus/started_by/crit_1 +5 -0
  795. data/test/results/omopv4_plus/started_by/crit_2 +2 -0
  796. data/test/results/omopv4_plus/started_by/crit_3 +2 -0
  797. data/test/results/omopv4_plus/sum/anno_1 +18 -0
  798. data/test/results/omopv4_plus/sum/anno_2 +36 -0
  799. data/test/results/omopv4_plus/sum/num_1 +2 -0
  800. data/test/results/omopv4_plus/sum/num_2 +5 -0
  801. data/test/results/omopv4_plus/sum/num_3 +254 -0
  802. data/test/results/omopv4_plus/time_window/anno_1 +20 -0
  803. data/test/results/omopv4_plus/time_window/anno_2 +40 -0
  804. data/test/results/omopv4_plus/time_window/anno_3 +36 -0
  805. data/test/results/omopv4_plus/time_window/anno_4 +39 -0
  806. data/test/results/omopv4_plus/time_window/anno_5 +57 -0
  807. data/test/results/omopv4_plus/time_window/crit_1 +52 -0
  808. data/test/results/omopv4_plus/time_window/crit_2 +157 -0
  809. data/test/results/omopv4_plus/time_window/crit_3 +52 -0
  810. data/test/results/omopv4_plus/time_window/crit_4 +157 -0
  811. data/test/results/omopv4_plus/trim_date_end/crit_1 +5 -0
  812. data/test/results/omopv4_plus/trim_date_end/crit_2 +2 -0
  813. data/test/results/omopv4_plus/trim_date_end/crit_3 +6 -0
  814. data/test/results/omopv4_plus/trim_date_end/crit_at_least +5 -0
  815. data/test/results/omopv4_plus/trim_date_end/crit_occurrences_1 +2 -0
  816. data/test/results/omopv4_plus/trim_date_end/crit_occurrences_2 +6 -0
  817. data/test/results/omopv4_plus/trim_date_end/crit_within +5 -0
  818. data/test/results/omopv4_plus/trim_date_start/crit_1 +5 -0
  819. data/test/results/omopv4_plus/trim_date_start/crit_2 +2 -0
  820. data/test/results/omopv4_plus/trim_date_start/crit_3 +6 -0
  821. data/test/results/omopv4_plus/trim_date_start/crit_at_least +5 -0
  822. data/test/results/omopv4_plus/trim_date_start/crit_occurrences_1 +2 -0
  823. data/test/results/omopv4_plus/trim_date_start/crit_occurrences_2 +6 -0
  824. data/test/results/omopv4_plus/trim_date_start/crit_within +5 -0
  825. data/test/results/omopv4_plus/union/anno_1 +43 -0
  826. data/test/results/omopv4_plus/union/anno_2 +74 -0
  827. data/test/results/omopv4_plus/union/anno_3 +18 -0
  828. data/test/results/omopv4_plus/union/anno_4 +25 -0
  829. data/test/results/omopv4_plus/union/anno_5 +33 -0
  830. data/test/results/omopv4_plus/union/anno_6 +46 -0
  831. data/test/results/omopv4_plus/union/count_1 +3 -0
  832. data/test/results/omopv4_plus/union/count_2 +3 -0
  833. data/test/results/omopv4_plus/union/count_3 +3 -0
  834. data/test/results/omopv4_plus/union/count_4 +3 -0
  835. data/test/results/omopv4_plus/union/count_5 +4 -0
  836. data/test/results/omopv4_plus/union/optcc_1 +3 -0
  837. data/test/results/omopv4_plus/union/optcc_2 +3 -0
  838. data/test/results/omopv4_plus/union/optcc_3 +3 -0
  839. data/test/results/omopv4_plus/union/optcc_4 +3 -0
  840. data/test/results/omopv4_plus/union/optcc_5 +3 -0
  841. data/test/results/omopv4_plus/union/optcc_6 +3 -0
  842. data/test/results/omopv4_plus/union/scanno_1 +22 -0
  843. data/test/results/omopv4_plus/union/scanno_2 +36 -0
  844. data/test/results/omopv4_plus/visit_occurrence/anno_1 +52 -0
  845. data/test/results/omopv4_plus/visit_occurrence/anno_2 +37 -0
  846. data/test/results/omopv4_plus/visit_occurrence/crit_1 +52 -0
  847. data/test/results/omopv4_plus/visit_occurrence/crit_2 +22945 -0
  848. data/test/results/omopv4_plus/visit_occurrence/crit_3 +46851 -0
  849. data/test/statements/after/anno_1 +7 -0
  850. data/test/statements/after/anno_2 +16 -0
  851. data/test/statements/after/anno_3 +9 -0
  852. data/test/statements/after/anno_4 +19 -0
  853. data/test/statements/after/anno_5 +21 -0
  854. data/test/statements/after/anno_6 +16 -0
  855. data/test/statements/after/crit_at_least +21 -0
  856. data/test/statements/after/crit_basic +20 -0
  857. data/test/statements/after/crit_occurrences +21 -0
  858. data/test/statements/after/crit_within +21 -0
  859. data/test/statements/any_overlap/crit_basic1 +16 -0
  860. data/test/statements/any_overlap/crit_basic2 +16 -0
  861. data/test/statements/any_overlap/crit_occurrences1 +17 -0
  862. data/test/statements/any_overlap/crit_occurrences2 +17 -0
  863. data/test/statements/any_overlap/crit_within +17 -0
  864. data/test/statements/before/crit_at_least +14 -0
  865. data/test/statements/before/crit_basic1 +13 -0
  866. data/test/statements/before/crit_basic2 +16 -0
  867. data/test/statements/before/crit_occurrences +14 -0
  868. data/test/statements/before/crit_within +14 -0
  869. data/test/statements/co_reported/anno_1 +13 -0
  870. data/test/statements/co_reported/anno_2 +21 -0
  871. data/test/statements/co_reported/anno_3 +14 -0
  872. data/test/statements/complement/anno_duplicate_params +11 -0
  873. data/test/statements/complement/anno_invalid_params +8 -0
  874. data/test/statements/complement/anno_no_params +3 -0
  875. data/test/statements/complement/count_3way_intersect +24 -0
  876. data/test/statements/complement/count_3way_union +18 -0
  877. data/test/statements/complement/count_intersect +17 -0
  878. data/test/statements/complement/count_union +14 -0
  879. data/test/statements/complement/count_union_and_intersect +27 -0
  880. data/test/statements/complement/crit_basic1 +7 -0
  881. data/test/statements/complement/crit_icd9_selector +10 -0
  882. data/test/statements/complex/anno_1 +29 -0
  883. data/test/statements/complex/crit_1 +278 -0
  884. data/test/statements/complex/crit_2 +43 -0
  885. data/test/statements/complex/crit_3 +54 -0
  886. data/test/statements/complex/crit_4 +17 -0
  887. data/test/statements/complex/crit_5 +17 -0
  888. data/test/statements/complex/crit_6 +20 -0
  889. data/test/statements/complex/crit_7 +14 -0
  890. data/test/statements/complex/crit_out_of_order_ctes +39 -0
  891. data/test/statements/complex/scanno_1 +1508 -0
  892. data/test/statements/concurrent_within/crit_icd9 +11 -0
  893. data/test/statements/concurrent_within/crit_icd9_and_place_of_service +15 -0
  894. data/test/statements/concurrent_within/crit_negative_start +15 -0
  895. data/test/statements/condition_type/anno_icd9 +7 -0
  896. data/test/statements/condition_type/count_condition_era +4 -0
  897. data/test/statements/condition_type/count_condition_era_30_day_window +4 -0
  898. data/test/statements/condition_type/count_ehr_problem_list +4 -0
  899. data/test/statements/condition_type/count_era_0 +4 -0
  900. data/test/statements/condition_type/count_inpatient +4 -0
  901. data/test/statements/condition_type/count_inpatient_detail +4 -0
  902. data/test/statements/condition_type/count_inpatient_header +4 -0
  903. data/test/statements/condition_type/count_inpatient_header_2 +4 -0
  904. data/test/statements/condition_type/count_inpatient_header_3 +4 -0
  905. data/test/statements/condition_type/count_inpatient_header_4 +4 -0
  906. data/test/statements/condition_type/count_inpatient_header_5 +4 -0
  907. data/test/statements/condition_type/count_inpatient_outpatient_detail +5 -0
  908. data/test/statements/condition_type/count_inpatient_primary +4 -0
  909. data/test/statements/condition_type/count_inpatient_primary_or_first +4 -0
  910. data/test/statements/condition_type/count_outpatient +4 -0
  911. data/test/statements/condition_type/count_outpatient_detail +4 -0
  912. data/test/statements/condition_type/count_outpatient_header +4 -0
  913. data/test/statements/condition_type/count_outpatient_primary +4 -0
  914. data/test/statements/condition_type/count_primary +4 -0
  915. data/test/statements/contains/crit_1 +16 -0
  916. data/test/statements/contains/crit_2 +16 -0
  917. data/test/statements/contains/crit_3 +16 -0
  918. data/test/statements/count/anno_multiple_upstreams +11 -0
  919. data/test/statements/count/anno_no_upstream1 +3 -0
  920. data/test/statements/count/anno_no_upstream2 +4 -0
  921. data/test/statements/count/crit_icd9_ndc +15 -0
  922. data/test/statements/count/crit_ndc +11 -0
  923. data/test/statements/count/crit_person +7 -0
  924. data/test/statements/cpt/anno_icd9_upstream +7 -0
  925. data/test/statements/cpt/anno_invalid_code +5 -0
  926. data/test/statements/cpt/count_1 +4 -0
  927. data/test/statements/cpt/crit_1 +4 -0
  928. data/test/statements/cpt/scanno_1 +4 -0
  929. data/test/statements/cpt_or_hcpcs/anno_bad_format +7 -0
  930. data/test/statements/cpt_or_hcpcs/count_1 +5 -0
  931. data/test/statements/cpt_or_hcpcs/crit_1 +5 -0
  932. data/test/statements/date_range/anno_1 +7 -0
  933. data/test/statements/date_range/anno_extra_argument +8 -0
  934. data/test/statements/date_range/anno_invalid_argument +7 -0
  935. data/test/statements/date_range/anno_missing_argument1 +6 -0
  936. data/test/statements/date_range/anno_missing_argument2 +6 -0
  937. data/test/statements/date_range/anno_no_upstreams +11 -0
  938. data/test/statements/date_range/count_1 +7 -0
  939. data/test/statements/date_range/count_2 +7 -0
  940. data/test/statements/death/anno_multiple_upstreams +10 -0
  941. data/test/statements/death/anno_no_upstreams +4 -0
  942. data/test/statements/death/crit_basic +3 -0
  943. data/test/statements/death/crit_person +7 -0
  944. data/test/statements/drug_type_concept/anno_has_upstreams +8 -0
  945. data/test/statements/drug_type_concept/anno_no_arguments +3 -0
  946. data/test/statements/drug_type_concept/crit_basic1 +4 -0
  947. data/test/statements/drug_type_concept/crit_basic2 +4 -0
  948. data/test/statements/during/crit_1 +16 -0
  949. data/test/statements/during/crit_2 +16 -0
  950. data/test/statements/equal/crit_1 +17 -0
  951. data/test/statements/equal/crit_2 +21 -0
  952. data/test/statements/except/anno_1 +13 -0
  953. data/test/statements/except/anno_2 +14 -0
  954. data/test/statements/except/count_complex +31 -0
  955. data/test/statements/except/crit_412_cpt +13 -0
  956. data/test/statements/except/crit_412_inpatient +13 -0
  957. data/test/statements/filter/crit_1 +15 -0
  958. data/test/statements/first/anno_argument +4 -0
  959. data/test/statements/first/anno_no_upstream +3 -0
  960. data/test/statements/first/crit_cpt +7 -0
  961. data/test/statements/first/crit_icd9 +7 -0
  962. data/test/statements/first/crit_union +14 -0
  963. data/test/statements/from/anno_has_upstreams +7 -0
  964. data/test/statements/from/anno_multiple_arguments +5 -0
  965. data/test/statements/from_seer_visits/anno_multiple_upstreams +17 -0
  966. data/test/statements/from_seer_visits/anno_no_upstream +3 -0
  967. data/test/statements/from_seer_visits/crit_1 +10 -0
  968. data/test/statements/from_seer_visits/crit_2 +11 -0
  969. data/test/statements/from_seer_visits/crit_3 +11 -0
  970. data/test/statements/from_seer_visits/crit_4 +12 -0
  971. data/test/statements/gender/anno_has_upstreams +7 -0
  972. data/test/statements/gender/crit_male +4 -0
  973. data/test/statements/hcpcs/anno_bad_format +6 -0
  974. data/test/statements/hcpcs/crit_A0382 +4 -0
  975. data/test/statements/icd10/anno_bad_format +5 -0
  976. data/test/statements/icd10/anno_has_upstreams +7 -0
  977. data/test/statements/icd10/crit_1 +4 -0
  978. data/test/statements/icd10pcs/anno_bad_format +6 -0
  979. data/test/statements/icd10pcs/anno_has_upstreams +7 -0
  980. data/test/statements/icd10pcs/crit_1 +4 -0
  981. data/test/statements/icd9/anno_empty_label +7 -0
  982. data/test/statements/icd9/anno_invalid_code +4 -0
  983. data/test/statements/icd9/anno_valid_code +4 -0
  984. data/test/statements/icd9/crit_1 +4 -0
  985. data/test/statements/icd9_procedure/crit_1 +4 -0
  986. data/test/statements/intersect/anno_412_inpatient +11 -0
  987. data/test/statements/intersect/anno_has_arguments +4 -0
  988. data/test/statements/intersect/anno_no_upstream +3 -0
  989. data/test/statements/intersect/crit_412_inpatient +11 -0
  990. data/test/statements/intersect/crit_412_male +11 -0
  991. data/test/statements/intersect/crit_complex +19 -0
  992. data/test/statements/invalid/anno_bad_op +13 -0
  993. data/test/statements/invalid/scanno_1 +7 -0
  994. data/test/statements/last/crit_icd9 +7 -0
  995. data/test/statements/loinc/crit_basic +4 -0
  996. data/test/statements/ndc/crit_basic +4 -0
  997. data/test/statements/ndc/results_1 +4 -0
  998. data/test/statements/numeric/anno_multiple_upstreams +11 -0
  999. data/test/statements/numeric/num_values_1 +4 -0
  1000. data/test/statements/numeric/num_values_2 +8 -0
  1001. data/test/statements/numeric/num_values_3 +8 -0
  1002. data/test/statements/observation_period/anno_has_arguments +8 -0
  1003. data/test/statements/observation_period/anno_multiple_upstreams +11 -0
  1004. data/test/statements/observation_period/count_all_periods +4 -0
  1005. data/test/statements/observation_period/crit_female +7 -0
  1006. data/test/statements/observation_period/crit_icd9 +7 -0
  1007. data/test/statements/observation_period/crit_male +7 -0
  1008. data/test/statements/occurrence/anno_no_upstream +3 -0
  1009. data/test/statements/occurrence/count_412_410 +17 -0
  1010. data/test/statements/occurrence/crit_1 +8 -0
  1011. data/test/statements/occurrence/crit_2 +11 -0
  1012. data/test/statements/occurrence/crit_3 +11 -0
  1013. data/test/statements/one_in_two_out/anno_has_arguments +8 -0
  1014. data/test/statements/one_in_two_out/anno_multiple_upstreams +15 -0
  1015. data/test/statements/one_in_two_out/anno_no_upstream +7 -0
  1016. data/test/statements/one_in_two_out/count_1 +10 -0
  1017. data/test/statements/one_in_two_out/count_same_as_1 +11 -0
  1018. data/test/statements/one_in_two_out/crit_hcpcs +10 -0
  1019. data/test/statements/one_in_two_out/crit_icd9 +11 -0
  1020. data/test/statements/one_in_two_out/results_1 +9 -0
  1021. data/test/statements/one_in_two_out/results_2 +9 -0
  1022. data/test/statements/overlapped_by/crit_1 +16 -0
  1023. data/test/statements/overlapped_by/crit_2 +16 -0
  1024. data/test/statements/overlapped_by/crit_3 +16 -0
  1025. data/test/statements/overlapped_by/crit_4 +16 -0
  1026. data/test/statements/overlaps/crit_1 +16 -0
  1027. data/test/statements/overlaps/crit_2 +16 -0
  1028. data/test/statements/overlaps/crit_3 +16 -0
  1029. data/test/statements/overlaps/crit_4 +16 -0
  1030. data/test/statements/person/anno_has_arguments +4 -0
  1031. data/test/statements/person/anno_multiple_upstreams +11 -0
  1032. data/test/statements/person/count_2 +3 -0
  1033. data/test/statements/person/crit_1 +7 -0
  1034. data/test/statements/person_filter/count_1 +20 -0
  1035. data/test/statements/person_filter/crit_1 +20 -0
  1036. data/test/statements/person_filter/crit_2 +13 -0
  1037. data/test/statements/person_filter/crit_3 +13 -0
  1038. data/test/statements/person_filter/crit_4 +13 -0
  1039. data/test/statements/place_of_service_code/anno_has_upstreams +8 -0
  1040. data/test/statements/place_of_service_code/anno_no_arguments +3 -0
  1041. data/test/statements/place_of_service_code/crit_basic +4 -0
  1042. data/test/statements/place_of_service_filter/anno_1 +8 -0
  1043. data/test/statements/procedure_occurrence/anno_has_arguments +8 -0
  1044. data/test/statements/procedure_occurrence/anno_multiple_upstreams +11 -0
  1045. data/test/statements/procedure_occurrence/count_gender +7 -0
  1046. data/test/statements/procedure_occurrence/count_icd9 +7 -0
  1047. data/test/statements/procedure_occurrence/count_started_by +19 -0
  1048. data/test/statements/provenance/anno_1 +8 -0
  1049. data/test/statements/provenance/anno_bad_keyword +10 -0
  1050. data/test/statements/provenance/count_1 +8 -0
  1051. data/test/statements/provenance/count_2 +8 -0
  1052. data/test/statements/provider_filter/anno_1 +10 -0
  1053. data/test/statements/race/anno_1 +8 -0
  1054. data/test/statements/race/anno_2 +3 -0
  1055. data/test/statements/race/crit_1 +4 -0
  1056. data/test/statements/read/anno_1 +4 -0
  1057. data/test/statements/read/crit_1 +8 -0
  1058. data/test/statements/recall/anno_1 +16 -0
  1059. data/test/statements/recall/anno_2 +18 -0
  1060. data/test/statements/recall/anno_3 +4 -0
  1061. data/test/statements/recall/anno_4 +3 -0
  1062. data/test/statements/recall/anno_5 +5 -0
  1063. data/test/statements/recall/anno_6 +107 -0
  1064. data/test/statements/recall/crit_1 +17 -0
  1065. data/test/statements/recall/crit_2 +14 -0
  1066. data/test/statements/recall/crit_3 +16 -0
  1067. data/test/statements/recall/crit_cte_1 +17 -0
  1068. data/test/statements/recall/crit_cte_2 +17 -0
  1069. data/test/statements/recall/crit_nested_perm_0 +28 -0
  1070. data/test/statements/revenue_code/crit_1 +4 -0
  1071. data/test/statements/revenue_code/crit_basic +4 -0
  1072. data/test/statements/revenue_code/domains_1 +4 -0
  1073. data/test/statements/revenue_code/domains_drg100 +4 -0
  1074. data/test/statements/rxnorm/crit_1 +4 -0
  1075. data/test/statements/snomed/crit_1 +4 -0
  1076. data/test/statements/started_by/crit_1 +16 -0
  1077. data/test/statements/started_by/crit_2 +16 -0
  1078. data/test/statements/started_by/crit_3 +16 -0
  1079. data/test/statements/sum/anno_1 +3 -0
  1080. data/test/statements/sum/anno_2 +8 -0
  1081. data/test/statements/sum/num_1 +11 -0
  1082. data/test/statements/sum/num_2 +15 -0
  1083. data/test/statements/sum/num_3 +7 -0
  1084. data/test/statements/time_window/anno_1 +7 -0
  1085. data/test/statements/time_window/anno_2 +11 -0
  1086. data/test/statements/time_window/anno_3 +11 -0
  1087. data/test/statements/time_window/anno_4 +12 -0
  1088. data/test/statements/time_window/anno_5 +15 -0
  1089. data/test/statements/time_window/crit_1 +11 -0
  1090. data/test/statements/time_window/crit_2 +11 -0
  1091. data/test/statements/time_window/crit_3 +11 -0
  1092. data/test/statements/time_window/crit_4 +11 -0
  1093. data/test/statements/trim_date_end/crit_1 +16 -0
  1094. data/test/statements/trim_date_end/crit_2 +16 -0
  1095. data/test/statements/trim_date_end/crit_3 +16 -0
  1096. data/test/statements/trim_date_end/crit_at_least +17 -0
  1097. data/test/statements/trim_date_end/crit_occurrences_1 +17 -0
  1098. data/test/statements/trim_date_end/crit_occurrences_2 +17 -0
  1099. data/test/statements/trim_date_end/crit_within +17 -0
  1100. data/test/statements/trim_date_start/crit_1 +16 -0
  1101. data/test/statements/trim_date_start/crit_2 +16 -0
  1102. data/test/statements/trim_date_start/crit_3 +16 -0
  1103. data/test/statements/trim_date_start/crit_at_least +17 -0
  1104. data/test/statements/trim_date_start/crit_occurrences_1 +17 -0
  1105. data/test/statements/trim_date_start/crit_occurrences_2 +17 -0
  1106. data/test/statements/trim_date_start/crit_within +17 -0
  1107. data/test/statements/union/anno_1 +11 -0
  1108. data/test/statements/union/anno_2 +18 -0
  1109. data/test/statements/union/anno_3 +3 -0
  1110. data/test/statements/union/anno_4 +4 -0
  1111. data/test/statements/union/anno_5 +7 -0
  1112. data/test/statements/union/anno_6 +10 -0
  1113. data/test/statements/union/count_1 +11 -0
  1114. data/test/statements/union/count_2 +11 -0
  1115. data/test/statements/union/count_3 +15 -0
  1116. data/test/statements/union/count_4 +18 -0
  1117. data/test/statements/union/count_5 +18 -0
  1118. data/test/statements/union/scanno_1 +3 -0
  1119. data/test/statements/union/scanno_2 +18 -0
  1120. data/test/statements/visit_occurrence/anno_1 +11 -0
  1121. data/test/statements/visit_occurrence/anno_2 +8 -0
  1122. data/test/statements/visit_occurrence/crit_1 +7 -0
  1123. data/test/statements/visit_occurrence/crit_2 +7 -0
  1124. data/test/statements/visit_occurrence/crit_3 +3 -0
  1125. metadata +2016 -150
  1126. data/lib/conceptql/behaviors/debuggable.rb +0 -70
  1127. data/lib/conceptql/behaviors/dottable.rb +0 -103
  1128. data/lib/conceptql/behaviors/preppable.rb +0 -20
  1129. data/lib/conceptql/converter.rb +0 -65
  1130. data/lib/conceptql/debugger.rb +0 -48
  1131. data/lib/conceptql/fake_grapher.rb +0 -20
  1132. data/lib/conceptql/graph.rb +0 -52
  1133. data/lib/conceptql/graph_nodifier.rb +0 -203
  1134. data/lib/conceptql/operators/concept.rb +0 -70
  1135. data/lib/conceptql/operators/snomed_condition.rb +0 -26
  1136. data/lib/conceptql/operators/visit.rb +0 -15
  1137. data/lib/conceptql/tree.rb +0 -53
  1138. data/lib/conceptql/utils/temp_table.rb +0 -72
  1139. data/spec/conceptql/behaviors/dottable_spec.rb +0 -99
  1140. data/spec/conceptql/converter_spec.rb +0 -51
  1141. data/spec/conceptql/date_adjuster_spec.rb +0 -68
  1142. data/spec/conceptql/operators/after_spec.rb +0 -16
  1143. data/spec/conceptql/operators/before_spec.rb +0 -16
  1144. data/spec/conceptql/operators/casting_operator_spec.rb +0 -68
  1145. data/spec/conceptql/operators/complement_spec.rb +0 -15
  1146. data/spec/conceptql/operators/concept_spec.rb +0 -40
  1147. data/spec/conceptql/operators/condition_type_spec.rb +0 -128
  1148. data/spec/conceptql/operators/contains_spec.rb +0 -19
  1149. data/spec/conceptql/operators/cpt_spec.rb +0 -29
  1150. data/spec/conceptql/operators/date_range_spec.rb +0 -33
  1151. data/spec/conceptql/operators/death_spec.rb +0 -10
  1152. data/spec/conceptql/operators/during_spec.rb +0 -30
  1153. data/spec/conceptql/operators/except_spec.rb +0 -15
  1154. data/spec/conceptql/operators/first_spec.rb +0 -35
  1155. data/spec/conceptql/operators/from_spec.rb +0 -13
  1156. data/spec/conceptql/operators/gender_spec.rb +0 -27
  1157. data/spec/conceptql/operators/hcpcs_spec.rb +0 -29
  1158. data/spec/conceptql/operators/icd10_spec.rb +0 -34
  1159. data/spec/conceptql/operators/icd9_procedure_spec.rb +0 -29
  1160. data/spec/conceptql/operators/icd9_spec.rb +0 -34
  1161. data/spec/conceptql/operators/intersect_spec.rb +0 -28
  1162. data/spec/conceptql/operators/last_spec.rb +0 -36
  1163. data/spec/conceptql/operators/loinc_spec.rb +0 -29
  1164. data/spec/conceptql/operators/medcode_procedure_spec.rb +0 -34
  1165. data/spec/conceptql/operators/medcode_spec.rb +0 -34
  1166. data/spec/conceptql/operators/observation_period_spec.rb +0 -10
  1167. data/spec/conceptql/operators/occurrence_spec.rb +0 -87
  1168. data/spec/conceptql/operators/overlapped_by_spec.rb +0 -32
  1169. data/spec/conceptql/operators/overlaps_spec.rb +0 -21
  1170. data/spec/conceptql/operators/person_filter_spec.rb +0 -15
  1171. data/spec/conceptql/operators/person_spec.rb +0 -10
  1172. data/spec/conceptql/operators/place_of_service_code_spec.rb +0 -24
  1173. data/spec/conceptql/operators/procedure_occurrence_spec.rb +0 -10
  1174. data/spec/conceptql/operators/prodcode_spec.rb +0 -35
  1175. data/spec/conceptql/operators/query_double.rb +0 -20
  1176. data/spec/conceptql/operators/query_double_spec.rb +0 -7
  1177. data/spec/conceptql/operators/race_spec.rb +0 -21
  1178. data/spec/conceptql/operators/rxnorm_spec.rb +0 -29
  1179. data/spec/conceptql/operators/snomed_spec.rb +0 -29
  1180. data/spec/conceptql/operators/source_vocabulary_operator_spec.rb +0 -35
  1181. data/spec/conceptql/operators/standard_vocabulary_operator_spec.rb +0 -35
  1182. data/spec/conceptql/operators/started_by_spec.rb +0 -22
  1183. data/spec/conceptql/operators/temporal_operator_spec.rb +0 -51
  1184. data/spec/conceptql/operators/time_window_spec.rb +0 -77
  1185. data/spec/conceptql/operators/union_spec.rb +0 -21
  1186. data/spec/conceptql/operators/visit_occurrence_spec.rb +0 -10
  1187. data/spec/conceptql/query_spec.rb +0 -22
  1188. data/spec/conceptql/tree_spec.rb +0 -50
  1189. data/spec/doubles/stream_for_casting_double.rb +0 -9
  1190. data/spec/doubles/stream_for_occurrence_double.rb +0 -25
  1191. data/spec/doubles/stream_for_temporal_double.rb +0 -6
  1192. data/spec/spec_helper.rb +0 -102
@@ -0,0 +1,30 @@
1
+ module ConceptQL
2
+ module Provenanceable
3
+ def to_concept_id(ctype)
4
+ ctype = ctype.to_s.downcase
5
+ return ctype.to_i unless ctype.to_i.zero?
6
+ position = nil
7
+ if ctype =~ /(\d|_primary)$/ && ctype.count('_') > 1
8
+ parts = ctype.split('_')
9
+ position = parts.pop.to_i
10
+ position -= 1 if needs_adjustment?(ctype)
11
+ ctype = parts.join('_')
12
+ end
13
+ retval = concept_ids[ctype.to_sym]
14
+ return retval[position] if position
15
+ return retval
16
+ end
17
+
18
+ def concept_ids
19
+ @concept_ids ||= Psych.load_file(config_dir + 'provenance.yml')
20
+ end
21
+
22
+ def config_dir
23
+ Pathname.new(__FILE__).dirname + '..' + '..' + '..' + 'config'
24
+ end
25
+
26
+ def needs_adjustment?(ctype)
27
+ ctype =~ /^outpatient/ || ctype =~ /^carrier/
28
+ end
29
+ end
30
+ end
data/lib/conceptql/cli.rb CHANGED
@@ -1,9 +1,12 @@
1
+ $: << "lib"
2
+
1
3
  require 'thor'
2
4
  require 'sequelizer'
3
- require 'psych'
4
5
  require 'json'
5
6
  require 'pp'
7
+ require 'csv'
6
8
  require_relative 'query'
9
+ require_relative 'knitter'
7
10
 
8
11
  module ConceptQL
9
12
  class CLI < Thor
@@ -36,16 +39,23 @@ module ConceptQL
36
39
 
37
40
  desc 'run_statement statement_file', 'Reads the ConceptQL statement from the statement file and executes it against the DB'
38
41
  def run_statement(statement_file)
39
- q = ConceptQL::Query.new(db(options), criteria_from_file(statement_file))
42
+ q = cdb(options).query(criteria_from_file(statement_file))
40
43
  puts q.sql
41
- puts q.statement.to_yaml
42
- pp q.all
44
+ puts JSON.pretty_generate(q.statement)
45
+ pp q.query.all
46
+ end
47
+
48
+ desc "annotate_statement", "Reads in a statement and annotates it"
49
+ def annotate_statement(statement_file)
50
+ q = ConceptQL::Query.new(db(options), criteria_from_file(statement_file))
51
+ pp q.annotate
43
52
  end
44
53
 
45
54
  desc 'show_graph statement_file', 'Reads the ConceptQL statement from the file and shows the contents as a ConceptQL graph'
46
55
  option :watch_file
47
56
  def show_graph(file)
48
57
  graph_it(criteria_from_file(file))
58
+ system('open /tmp/graph.pdf')
49
59
  end
50
60
 
51
61
  desc 'show_and_tell_file statement_file', 'Reads the ConceptQL statement from the file and shows the contents as a ConceptQL graph, then executes the statement against the DB'
@@ -57,26 +67,68 @@ module ConceptQL
57
67
 
58
68
  desc 'fake_graph file', 'Reads the ConceptQL statement from the file and shows the contents as a ConceptQL graph'
59
69
  def fake_graph(file)
60
- require_relative 'fake_grapher'
61
- ConceptQL::FakeGrapher.new.graph_it(criteria_from_file(file), '/tmp/graph')
70
+ require_relative 'fake_annotater'
71
+ annotated = ConceptQL::FakeAnnotater.new(criteria_from_file(file)).annotate
72
+ pp annotated
73
+ ConceptQL::AnnotateGrapher.new.graph_it(annotated, '/tmp/graph.pdf')
62
74
  system('open /tmp/graph.pdf')
63
75
  end
64
76
 
65
77
  desc 'metadata', 'Generates the metadata.js file for the JAM'
66
78
  def metadata
67
- File.write('/tmp/metadata.js', "var metadata = #{ConceptQL::Nodifier.new.to_metadata.to_json};")
68
- end
69
-
70
- desc 'convert', 'Converts from hash-based syntax to list-based syntax'
71
- def convert(file)
72
- require 'conceptql/converter'
73
- require 'json'
74
- begin
75
- puts JSON.pretty_generate(ConceptQL::Converter.new.convert(criteria_from_file(file)))
76
- rescue
77
- puts "Couldn't convert #{file}"
78
- puts $!.message
79
- puts $!.backtrace.join("\n")
79
+ File.write('metadata.js', "$metadata = #{ConceptQL.metadata(warn: true).to_json};")
80
+ File.write('metadata.json', ConceptQL.metadata.to_json)
81
+ if system("which", "json_pp", out: File::NULL, err: File::NULL)
82
+ system("cat metadata.json | json_pp", out: "metadata_pp.json")
83
+ end
84
+ end
85
+
86
+ desc 'selection_operators', 'Generates a TSV of all the selection operators'
87
+ def selection_operators
88
+ require 'csv'
89
+ CSV.open('selection_operators.tsv', 'w', col_sep: "\t") do |csv|
90
+ csv << ["name"]
91
+ ConceptQL.metadata[:operators].values.select { |v| v[:basic_type] == :selection }.map { |v| v[:preferred_name] }.each do |name|
92
+ csv << [name]
93
+ end
94
+ end
95
+
96
+ CSV.open('domains.tsv', 'w', col_sep: "\t") do |csv|
97
+ csv << ["name"]
98
+ ConceptQL::Operators::TABLE_COLUMNS.each do |domain, columns|
99
+ next unless columns.include?(:person_id)
100
+ next if domain.to_s =~ /era\Z/
101
+ csv << [domain]
102
+ end
103
+ end
104
+ end
105
+
106
+ desc 'knit', 'Processes ConceptQL fenced code segments and produces a Markdown file'
107
+ option :ignore_cache, type: :boolean
108
+ def knit(file)
109
+ opts = {}
110
+ if options[:ignore_cache]
111
+ opts[:cache_options] = { ignore: true }
112
+ end
113
+ ConceptQL::Knitter.new(ConceptQL::Database.new(db), file, opts).knit
114
+ end
115
+
116
+ desc 'dumpit', 'Dumps out test data into CSVs'
117
+ def dumpit(path)
118
+ path = Pathname.new(path)
119
+ path.mkpath unless path.exist?
120
+ headers_path = path + 'headers'
121
+ headers_path.mkpath unless headers_path.exist?
122
+ db.tables.each do |table|
123
+ puts "Dumping #{table}..."
124
+ ds = db[table]
125
+ rows = ds.select_map(ds.columns)
126
+ CSV.open(path + "#{table}.csv", "wb") do |csv|
127
+ rows.each { |row| csv << row }
128
+ end
129
+ CSV.open(headers_path + "#{table}.csv", "wb") do |csv|
130
+ csv << ds.columns
131
+ end
80
132
  end
81
133
  end
82
134
 
@@ -93,7 +145,7 @@ module ConceptQL
93
145
  desc 'show_db_graph conceptql_id', 'Shows a graph for the conceptql statement represented by conceptql_id in the db specified by db_url'
94
146
  def show_db_graph(conceptql_id)
95
147
  result = fetch_conceptql(conceptql_id, options)
96
- graph_it(result[:statement].to_hash, db, result[:label])
148
+ graph_it(result[:statement], db, result[:label])
97
149
  end
98
150
 
99
151
  def fetch_conceptql(conceptql_id)
@@ -105,10 +157,9 @@ module ConceptQL
105
157
  def show_and_tell(statement, options, title = nil)
106
158
  my_db = db(options)
107
159
  q = ConceptQL::Query.new(my_db, statement)
108
- puts 'YAML'
109
- puts q.statement.to_yaml
160
+ statement = q.annotate
110
161
  puts 'JSON'
111
- puts JSON.pretty_generate(q.statement)
162
+ puts JSON.pretty_generate(statement)
112
163
  graph_it(statement, title)
113
164
  STDIN.gets
114
165
  puts q.sql
@@ -123,20 +174,9 @@ module ConceptQL
123
174
  end
124
175
 
125
176
  def graph_it(statement, title = nil)
126
- require_relative 'graph'
127
- require_relative 'tree'
128
- conn = db(options)
129
- ConceptQL::Graph.new(statement,
130
- dangler: true,
131
- title: title,
132
- db: conn
133
- ).graph_it('/tmp/graph')
134
- system('open /tmp/graph.pdf')
135
- if options[:watch_file]
136
- require_relative 'debugger'
137
- debugger = ConceptQL::Debugger.new(statement, db: conn, watch_ids: File.readlines(options[:watch_file]).map(&:to_i))
138
- debugger.capture_results('/tmp/debug.xlsx')
139
- end
177
+ my_db = db(options)
178
+ q = ConceptQL::Query.new(my_db, statement).annotate
179
+ ConceptQL::AnnotateGrapher.new.graph_it(q, '/tmp/graph.pdf')
140
180
  end
141
181
 
142
182
  def criteria_from_file(file)
@@ -151,6 +191,10 @@ module ConceptQL
151
191
  def filtered(results)
152
192
  results.each { |r| r.delete_if { |k,v| v.nil? } }
153
193
  end
194
+
195
+ def cdb(options)
196
+ ConceptQL::Database.new(db(options))
197
+ end
154
198
  end
155
199
  end
156
200
 
@@ -0,0 +1,42 @@
1
+ require 'facets/hash/revalue'
2
+
3
+ module ConceptQL
4
+ class Database
5
+ attr :db, :opts
6
+
7
+ def initialize(db, opts={})
8
+ @db = db
9
+ db_type = :impala
10
+ if db
11
+ extensions.each do |extension|
12
+ db.extension extension
13
+ end
14
+ db_type = db.database_type.to_sym
15
+ end
16
+
17
+ @opts = opts.revalue { |v| v ? v.to_sym : v }
18
+ @opts[:data_model] ||= :omopv4
19
+ @opts[:database_type] ||= db_type
20
+ db.set(db_opts) if db.respond_to?(:set)
21
+ end
22
+
23
+ def query(statement, opts={})
24
+ Query.new(db, statement, @opts.merge(opts))
25
+ end
26
+
27
+ def db_opts
28
+ db_opts = {}
29
+ if opts[:database_type] == :impala
30
+ db_opts.merge!(runtime_filter_mode: "OFF")
31
+ if mem_limit = (opts[:impala_mem_limit] || ENV['IMPALA_MEM_LIMIT'])
32
+ db_opts.merge!(mem_limit: mem_limit)
33
+ end
34
+ end
35
+ db_opts
36
+ end
37
+
38
+ def extensions
39
+ [:date_arithmetic, :error_sql]
40
+ end
41
+ end
42
+ end
@@ -3,9 +3,13 @@ require_relative '../conceptql'
3
3
  module ConceptQL
4
4
  # Used to translate a string of terse date adjustments into a set of adjustments that are compatible with most RDBMSs
5
5
  class DateAdjuster
6
- attr :str
7
- def initialize(str)
8
- @str = str
6
+
7
+ VALID_INPUT = /\A#{Regexp.union([/START/i, /END/i, /\d{4}-\d{2}-\d{2}/, /([-+]?\d+[dmy]?)+/, /\s*/])}\z/
8
+
9
+ attr :str, :manipulator
10
+ def initialize(str, opts = {})
11
+ @str = str || ""
12
+ @manipulator = opts[:manipulator] || Sequel
9
13
  end
10
14
 
11
15
  # Returns an array of strings that represent date modifiers
@@ -13,6 +17,21 @@ module ConceptQL
13
17
  @adjustments ||= parse(str)
14
18
  end
15
19
 
20
+ def adjust(column, reverse=false)
21
+ return Sequel.expr(:end_date) if str.downcase == 'end'
22
+ return Sequel.expr(:start_date) if str.downcase == 'start'
23
+ return Sequel.cast(Date.parse(str).strftime('%Y-%m-%d'), Date) if str =~ /^\d{4}-\d{2}-\d{2}$/
24
+ adjusted_date = adjustments.inject(Sequel.expr(column)) do |sql, (units, quantity)|
25
+ quantity *= -1 if reverse
26
+ if quantity > 0
27
+ manipulator.date_add(sql, units => quantity)
28
+ else
29
+ manipulator.date_sub(sql, units => quantity.abs)
30
+ end
31
+ end
32
+ Sequel.cast(adjusted_date, Date)
33
+ end
34
+
16
35
  private
17
36
  def lookup
18
37
  {
@@ -23,7 +42,6 @@ module ConceptQL
23
42
  end
24
43
 
25
44
  def parse(str)
26
- ConceptQL.logger.debug(str)
27
45
  return [] if str.nil? || str.empty?
28
46
  return [[lookup['d'], str.to_i]] if str.match(/^[-+]?\d+$/)
29
47
  str.downcase.scan(/([-+]?\d*[dmy])/).map do |adjustment|
@@ -0,0 +1,129 @@
1
+ require 'facets/array/recurse'
2
+ require 'facets/hash/deep_rekey'
3
+
4
+ module ConceptQL
5
+ class FakeAnnotater
6
+ attr :statement
7
+
8
+ DOMAINS = {
9
+ # Conditions
10
+ condition: :condition_occurrence,
11
+ primary_diagnosis: :condition_occurrence,
12
+ icd9: :condition_occurrence,
13
+ icd10: :condition_occurrence,
14
+ condition_type: :condition_occurrence,
15
+ medcode: :condition_occurrence,
16
+
17
+ # Procedures
18
+ procedure: :procedure_occurrence,
19
+ cpt: :procedure_occurrence,
20
+ drg: :procedure_occurrence,
21
+ hcpcs: :procedure_occurrence,
22
+ icd9_procedure: :procedure_occurrence,
23
+ medcode_procedure: :procedure_occurrence,
24
+
25
+ # Procedure Cost
26
+ procedure_cost: :procedure_cost,
27
+
28
+ # Visits
29
+ visit_occurrence: :visit_occurrence,
30
+ place_of_service_code: :visit_occurrence,
31
+
32
+ # Person
33
+ person: :person,
34
+ gender: :person,
35
+ race: :person,
36
+
37
+ # Payer
38
+ payer: :payer_plan_period,
39
+
40
+ # Death
41
+ death: :death,
42
+
43
+ # Observation
44
+ loinc: :observation,
45
+ from_seer_visits: :observation,
46
+ to_seer_visits: :observation,
47
+
48
+ # Drug
49
+ drug_exposure: :drug_exposure,
50
+ rxnorm: :drug_exposure,
51
+ drug_cost: :drug_cost,
52
+ drug_type_concept_id: :drug_exposure,
53
+ drug_type_concept: :drug_exposure,
54
+ prodcode: :drug_exposure,
55
+
56
+ # Date Operators
57
+ date_range: :date,
58
+
59
+ # Miscelaneous operators
60
+ concept: :misc,
61
+ vsac: :misc,
62
+ numeric: :person,
63
+ algorithm: :misc,
64
+ }
65
+
66
+ def initialize(statement)
67
+ @statement = statement
68
+ end
69
+
70
+ def annotate
71
+ traverse(statement)
72
+ end
73
+
74
+ def traverse(stmt)
75
+ stmt.recurse(Array, Hash) do |arr_or_hash|
76
+ if arr_or_hash.is_a?(Array)
77
+ arr_or_hash.unshift(arr_or_hash.shift.to_sym)
78
+ domains = DOMAINS[arr_or_hash.first.to_sym]
79
+ unless domains
80
+ domains = previous_domains(arr_or_hash)
81
+ else
82
+ domains = [domains].flatten
83
+ end
84
+ annotate_hash = if arr_or_hash.last.is_a?(Hash)
85
+ arr_or_hash.last[:annotation] ||= {}
86
+ else
87
+ annotate_hash = {}
88
+ arr_or_hash.push(annotation: annotate_hash)
89
+ annotate_hash
90
+ end
91
+ annotate_hash[:counts] = {}
92
+ domains.each do |domain|
93
+ annotate_hash[:counts][domain] = {}
94
+ end
95
+ save_domains(arr_or_hash)
96
+ else
97
+ arr_or_hash.deep_rekey!
98
+ arr_or_hash[:annotation] ||= {}
99
+ end
100
+ arr_or_hash
101
+ end
102
+ end
103
+
104
+ def previous_domains(arr)
105
+ extract = if arr.first == :recall
106
+ [fetch_domains(arr[1])].compact
107
+ elsif arr.last.is_a?(Hash) && arr.last[:left]
108
+ [arr.last[:left]]
109
+ else
110
+ arr.select { |e| e.is_a?(Array) }
111
+ end
112
+ extract.map { |e| e.last[:annotation][:counts].keys }.flatten.compact.uniq
113
+ end
114
+
115
+ def fetch_domains(label)
116
+ recorded_domains[label]
117
+ end
118
+
119
+ def save_domains(op)
120
+ label = op.last[:label]
121
+ return unless label
122
+ recorded_domains[label] = op
123
+ end
124
+
125
+ def recorded_domains
126
+ @recorded_domains ||= {}
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,221 @@
1
+ require 'digest'
2
+ require 'json'
3
+ require_relative 'annotate_grapher'
4
+ require_relative 'fake_annotater'
5
+
6
+ module ConceptQL
7
+ class Knitter
8
+ attr :file, :db, :options
9
+ CONCEPTQL_CHUNK_START = /```ConceptQL/
10
+ RESULT_KEYS = %i(person_id criterion_id criterion_domain start_date end_date source_value)
11
+
12
+ def initialize(db, file, options = {})
13
+ @file = Pathname.new(file)
14
+ raise "File must end in .md.cql!" unless file =~ /\.md\.cql$/
15
+ @db = db
16
+ @options = options.dup
17
+ end
18
+
19
+ def knit
20
+ lines = file.readlines
21
+ chunks = lines.slice_before { |l| l =~ CONCEPTQL_CHUNK_START }.to_a
22
+ outputs = []
23
+ outputs << chunks.shift unless chunks.first =~ CONCEPTQL_CHUNK_START
24
+ outputs += chunks.map do |chunk|
25
+ cql, *remainder = chunk.slice_after { |l| l =~ /^```\n$/ }.to_a
26
+ cql = ConceptQLChunk.new(cql, cache, self)
27
+ [cql.output, remainder].flatten
28
+ end.flatten
29
+ File.write(file.to_s.sub(/.cql$/, ''), outputs.join)
30
+ end
31
+
32
+ def diagram_dir
33
+ @diagram_dir ||= (dir + file.basename('.md.cql')).tap { |d| d.rmtree if d.exist? ; d.mkpath }
34
+ end
35
+
36
+ def diagram_relative_path
37
+ @diagram_relative_path ||= diagram_dir.basename
38
+ end
39
+
40
+ def diagram_path(stmt, &block)
41
+ png_contents = cache.fetch_or_create(stmt.inspect, &block)
42
+ file_name = (cache.hash_it(stmt) + ".png")
43
+ new_path = (diagram_dir + file_name)
44
+ new_path.write(png_contents)
45
+ diagram_relative_path + file_name
46
+ end
47
+
48
+ private
49
+ class ConceptQLChunk
50
+ attr :lines, :cache, :knitter
51
+ def initialize(lines, cache, knitter)
52
+ @cache = cache
53
+ @lines = lines.to_a
54
+ @knitter = knitter
55
+ end
56
+
57
+ def output
58
+ diagram_markup
59
+ cache.fetch_or_create(lines.join) do
60
+ create_output
61
+ end
62
+ end
63
+
64
+ def titleize(title)
65
+ return '' unless title
66
+ title.map(&:strip).join(" ").gsub('#', '')
67
+ end
68
+
69
+ def make_statement_and_title
70
+ lines.shift
71
+ lines.pop
72
+ title, statement = lines.slice_before { |l| l =~ /^\s*#/ }.to_a
73
+ if statement.nil?
74
+ statement = title
75
+ title = nil
76
+ end
77
+ @statement = eval(statement.join)
78
+ @title = titleize(title)
79
+ end
80
+
81
+ def statement
82
+ @statement || make_statement_and_title
83
+ @statement
84
+ end
85
+
86
+ def title
87
+ @title || make_statement_and_title
88
+ @title
89
+ end
90
+
91
+ def create_output
92
+ output = []
93
+ output << title unless title.empty?
94
+ output << '' unless title.empty?
95
+ output << "```JSON"
96
+ output << ''
97
+ output << statement.to_json
98
+ output << ''
99
+ output << "```"
100
+ output << ''
101
+ output << diagram_markup
102
+ output << ''
103
+ output << table
104
+ output << ''
105
+ output.compact.join("\n")
106
+ end
107
+
108
+ def diagram_markup
109
+ diagram_path = diagram(statement)
110
+ return "![#{title}](#{diagram_path})" if diagram_path
111
+ nil
112
+ end
113
+
114
+ def table
115
+ results = nil
116
+ begin
117
+ results = query(statement).query.limit(10).all
118
+ rescue
119
+ puts $!.message
120
+ puts $!.backtrace.join("\n")
121
+ end
122
+
123
+ if results.nil?
124
+ "```No Results. Statement is experimental.```"
125
+ else
126
+ if results.empty?
127
+ "```No Results found.```"
128
+ else
129
+ resultify(results)
130
+ end
131
+ end
132
+ end
133
+
134
+ def resultify(results)
135
+ rows = []
136
+ rows << rowify(RESULT_KEYS)
137
+ rows << rowify(RESULT_KEYS.map { |c| c.to_s.gsub(/./, '-')})
138
+ results.each do |result|
139
+ rows << rowify(result.values_at(*RESULT_KEYS))
140
+ end
141
+ rows.join("\n")
142
+ end
143
+
144
+ def rowify(columns)
145
+ "| #{columns.join(" | ")} |"
146
+ end
147
+
148
+ def diagram(stmt)
149
+ knitter.diagram_path(stmt) do |path_name|
150
+ annotated = nil
151
+ begin
152
+ annotated = query(stmt).annotate
153
+ rescue
154
+ puts $!.message
155
+ puts $!.backtrace.join("\n")
156
+ p stmt
157
+ annotated = FakeAnnotater.new(stmt).annotate
158
+ end
159
+ ConceptQL::AnnotateGrapher.new.graph_it(annotated, path_name, output_type: 'png')
160
+ end
161
+ end
162
+
163
+ def query(stmt)
164
+ knitter.db.query(stmt)
165
+ end
166
+ end
167
+
168
+ class Cache
169
+ attr :db, :options, :file
170
+
171
+ def initialize(db, file, options = {})
172
+ @db = db
173
+ @file = file
174
+ @options = options.nil? ? {} : options.dup
175
+ remove_cache if @options[:ignore]
176
+ end
177
+
178
+ def remove_cache
179
+ cache_dir.rmtree
180
+ @cache_dir = nil
181
+ end
182
+
183
+ def cache_file_path(str)
184
+ cache_dir + hash_it(str)
185
+ end
186
+
187
+ def fetch_or_create(str, &block)
188
+ cache_file = cache_file_path(str)
189
+ return cache_file.read if cache_file.exist?
190
+ #p ["cache miss for", str, cache_file]
191
+ output = block.call(cache_file)
192
+ cache_file.write(output) unless cache_file.exist?
193
+ cache_file.read
194
+ end
195
+
196
+ def cache_dir
197
+ @cache_dir ||= (file.dirname + ".#{hash_it(hash_fodder)}").tap { |d| d.mkpath }
198
+ end
199
+
200
+ def hash_fodder
201
+ (db_opts.inspect + file.basename.to_s)
202
+ end
203
+
204
+ def db_opts
205
+ db.opts.values_at(*%i(adapter user password host database search_path))
206
+ end
207
+
208
+ def hash_it(str)
209
+ Digest::SHA256.hexdigest("#{str}")
210
+ end
211
+ end
212
+
213
+ def dir
214
+ file.dirname
215
+ end
216
+
217
+ def cache
218
+ @cache ||= Cache.new(db.db, file, options[:cache_options])
219
+ end
220
+ end
221
+ end