conceptql 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1210) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +208 -27
  3. data/LICENSE +21 -0
  4. data/README.md +28 -98
  5. data/bin/conceptql +2 -1
  6. data/bin/conceptql_utils +6 -0
  7. data/config/multiple_vocabularies.csv +4 -0
  8. data/config/provenance.yml +471 -436
  9. data/config/race.yml +50 -0
  10. data/config/vocabularies.csv +87 -0
  11. data/lib/conceptql/behaviors/code_lister.rb +23 -0
  12. data/lib/conceptql/behaviors/drugish.rb +13 -8
  13. data/lib/conceptql/behaviors/labish.rb +15 -9
  14. data/lib/conceptql/behaviors/metadatable.rb +102 -34
  15. data/lib/conceptql/behaviors/provenanceable.rb +15 -19
  16. data/lib/conceptql/behaviors/single_event.rb +11 -0
  17. data/lib/conceptql/behaviors/timeless.rb +11 -0
  18. data/lib/conceptql/behaviors/utilizable.rb +206 -0
  19. data/lib/conceptql/behaviors/windowable.rb +27 -0
  20. data/lib/conceptql/cli.rb +99 -134
  21. data/lib/conceptql/columnizer.rb +75 -0
  22. data/lib/conceptql/data_model/base.rb +462 -0
  23. data/lib/conceptql/data_model/gdm.rb +155 -0
  24. data/lib/conceptql/data_model/gdm_wide.rb +42 -0
  25. data/lib/conceptql/data_model/omopv4_plus.rb +12 -0
  26. data/lib/conceptql/data_model.rb +30 -0
  27. data/lib/conceptql/database.rb +195 -23
  28. data/lib/conceptql/date_adjuster.rb +57 -27
  29. data/lib/conceptql/diagram.rb +243 -0
  30. data/lib/conceptql/lexicon/lexicon_gdm.rb +47 -0
  31. data/lib/conceptql/lexicon/lexicon_no_db.rb +49 -0
  32. data/lib/conceptql/lexicon/lexicon_ohdsi.rb +63 -0
  33. data/lib/conceptql/lexicon/lexicon_strategy.rb +116 -0
  34. data/lib/conceptql/lexicon.rb +111 -0
  35. data/lib/conceptql/nodifier.rb +45 -15
  36. data/lib/conceptql/operators/after.rb +24 -21
  37. data/lib/conceptql/operators/any_overlap.rb +6 -6
  38. data/lib/conceptql/operators/before.rb +24 -16
  39. data/lib/conceptql/operators/binary_operator_operator.rb +52 -13
  40. data/lib/conceptql/operators/casting_operator.rb +24 -17
  41. data/lib/conceptql/operators/co_reported.rb +78 -9
  42. data/lib/conceptql/operators/concurrent_within.rb +29 -17
  43. data/lib/conceptql/operators/contains.rb +9 -9
  44. data/lib/conceptql/operators/count.rb +9 -9
  45. data/lib/conceptql/operators/date_range.rb +40 -18
  46. data/lib/conceptql/operators/death.rb +10 -2
  47. data/lib/conceptql/operators/dedup.rb +31 -0
  48. data/lib/conceptql/operators/during.rb +5 -12
  49. data/lib/conceptql/operators/episode.rb +146 -0
  50. data/lib/conceptql/operators/equal.rb +6 -3
  51. data/lib/conceptql/operators/ethnicity.rb +49 -0
  52. data/lib/conceptql/operators/except.rb +15 -20
  53. data/lib/conceptql/operators/filter.rb +20 -8
  54. data/lib/conceptql/operators/first.rb +14 -3
  55. data/lib/conceptql/operators/from.rb +33 -12
  56. data/lib/conceptql/operators/gender.rb +27 -11
  57. data/lib/conceptql/operators/hospice.rb +19 -0
  58. data/lib/conceptql/operators/hospitalization.rb +19 -0
  59. data/lib/conceptql/operators/information_periods.rb +36 -0
  60. data/lib/conceptql/operators/invalid.rb +4 -5
  61. data/lib/conceptql/operators/last.rb +14 -3
  62. data/lib/conceptql/operators/match.rb +91 -0
  63. data/lib/conceptql/operators/multiple_vocabularies.rb +172 -0
  64. data/lib/conceptql/operators/numeric.rb +52 -29
  65. data/lib/conceptql/operators/numeric_filter.rb +68 -0
  66. data/lib/conceptql/operators/occurrence.rb +133 -48
  67. data/lib/conceptql/operators/one_in_two_out.rb +198 -62
  68. data/lib/conceptql/operators/operator.rb +321 -408
  69. data/lib/conceptql/operators/pass_thru.rb +9 -5
  70. data/lib/conceptql/operators/person.rb +12 -2
  71. data/lib/conceptql/operators/person_filter.rb +5 -3
  72. data/lib/conceptql/operators/place_of_service_filter.rb +11 -15
  73. data/lib/conceptql/operators/provenance.rb +25 -36
  74. data/lib/conceptql/operators/provider_filter.rb +40 -14
  75. data/lib/conceptql/operators/race.rb +48 -7
  76. data/lib/conceptql/operators/read.rb +77 -58
  77. data/lib/conceptql/operators/recall.rb +20 -20
  78. data/lib/conceptql/operators/snf.rb +19 -0
  79. data/lib/conceptql/operators/sum.rb +23 -12
  80. data/lib/conceptql/operators/temporal_operator.rb +80 -54
  81. data/lib/conceptql/operators/time_window.rb +13 -15
  82. data/lib/conceptql/operators/trim_date.rb +71 -0
  83. data/lib/conceptql/operators/trim_date_end.rb +20 -40
  84. data/lib/conceptql/operators/trim_date_start.rb +20 -43
  85. data/lib/conceptql/operators/union.rb +59 -35
  86. data/lib/conceptql/operators/vocabulary.rb +151 -0
  87. data/lib/conceptql/paths.rb +41 -0
  88. data/lib/conceptql/query.rb +165 -46
  89. data/lib/conceptql/query_modifiers/gdm/admission_date_query_modifier.rb +46 -0
  90. data/lib/conceptql/query_modifiers/gdm/drug_query_modifier.rb +54 -0
  91. data/lib/conceptql/query_modifiers/gdm/lab_query_modifier.rb +57 -0
  92. data/lib/conceptql/query_modifiers/gdm/pos_query_modifier.rb +46 -0
  93. data/lib/conceptql/query_modifiers/gdm/provenance_query_modifier.rb +45 -0
  94. data/lib/conceptql/query_modifiers/gdm/provider_query_modifier.rb +53 -0
  95. data/lib/conceptql/query_modifiers/gdm_wide/admission_date_query_modifier.rb +42 -0
  96. data/lib/conceptql/query_modifiers/gdm_wide/drug_query_modifier.rb +52 -0
  97. data/lib/conceptql/query_modifiers/gdm_wide/lab_query_modifier.rb +55 -0
  98. data/lib/conceptql/query_modifiers/gdm_wide/pos_query_modifier.rb +37 -0
  99. data/lib/conceptql/query_modifiers/gdm_wide/provenance_query_modifier.rb +38 -0
  100. data/lib/conceptql/query_modifiers/omopv4_plus/admission_date_query_modifier.rb +45 -0
  101. data/lib/conceptql/query_modifiers/omopv4_plus/drug_query_modifier.rb +80 -0
  102. data/lib/conceptql/query_modifiers/omopv4_plus/pos_query_modifier.rb +47 -0
  103. data/lib/conceptql/query_modifiers/omopv4_plus/provenance_query_modifier.rb +45 -0
  104. data/lib/conceptql/query_modifiers/omopv4_plus/provider_query_modifier.rb +26 -0
  105. data/lib/conceptql/query_modifiers/query_modifier.rb +6 -2
  106. data/lib/conceptql/rdbms/duckdb.rb +25 -0
  107. data/lib/conceptql/rdbms/generic.rb +120 -0
  108. data/lib/conceptql/rdbms/postgres.rb +51 -0
  109. data/lib/conceptql/rdbms/spark.rb +22 -0
  110. data/lib/conceptql/rdbms.rb +22 -0
  111. data/lib/conceptql/scope.rb +353 -41
  112. data/lib/conceptql/sql_formatters/formatter.rb +25 -0
  113. data/lib/conceptql/sql_formatters.rb +22 -0
  114. data/lib/conceptql/utils.rb +113 -0
  115. data/lib/conceptql/utils_cli.rb +17 -0
  116. data/lib/conceptql/version.rb +3 -1
  117. data/lib/conceptql/visitors/metadata_extractor.rb +54 -0
  118. data/lib/conceptql/vocabularies/behaviors/costish.rb +24 -0
  119. data/lib/conceptql/vocabularies/behaviors/gdmish.rb +19 -0
  120. data/lib/conceptql/vocabularies/behaviors/omopish.rb +32 -0
  121. data/lib/conceptql/vocabularies/dynamic_vocabularies.rb +63 -0
  122. data/lib/conceptql/vocabularies/entry.rb +138 -0
  123. data/lib/conceptql/vocabularies/vocabulary_class_factory.rb +85 -0
  124. data/lib/conceptql/window/base.rb +26 -0
  125. data/lib/conceptql/window/date_range.rb +25 -0
  126. data/lib/conceptql/window/table.rb +116 -0
  127. data/lib/conceptql/window.rb +72 -0
  128. data/lib/conceptql.rb +53 -10
  129. data/lib/sequel/extensions/pg_ctas_explain.rb +22 -0
  130. data/lib/sequel/extensions/pg_vacuum_table.rb +23 -0
  131. data/schemas/gdm.yml +882 -0
  132. data/schemas/gdm_wide.yml +757 -0
  133. data/schemas/ohdsi_vocabs.yml +143 -0
  134. data/schemas/omopv4_plus.yml +729 -0
  135. data/schemas/omopv4_plus_more_ignorables.tsv +13 -0
  136. metadata +262 -2068
  137. data/.gitignore +0 -25
  138. data/Gemfile +0 -6
  139. data/Guardfile +0 -56
  140. data/LICENSE.txt +0 -22
  141. data/Rakefile +0 -35
  142. data/conceptql.gemspec +0 -31
  143. data/doc/ConceptQL Specification (alpha).pdf +0 -0
  144. data/doc/converter.rb +0 -33
  145. data/doc/diagram_0.png +0 -0
  146. data/doc/implementation_notes.md +0 -39
  147. data/doc/metadata.md +0 -89
  148. data/doc/spec/02f44ad35d266ddd0a4df1691d26bf4a297b30604fc3f44b0391d6d852d23a9f.png +0 -0
  149. data/doc/spec/0360fc0c2b7a88fd82ffc4d13387b76766649d5d42aa8f9349bbf60a81ac6119.png +0 -0
  150. data/doc/spec/04491942fcbd741982514f9eb12aeecf3d54b5b69a2b50c8331f7700169d5521.png +0 -0
  151. data/doc/spec/05f9b844571ffceeed2def3025fb60c68552817b8b73d3c8a76939dbc08b7c65.png +0 -0
  152. data/doc/spec/067241a3579767a802d4f8e20fd35b60adbe377c9a6512ef135f164a5accfb27.png +0 -0
  153. data/doc/spec/1102fa717b1c2df67af5220bf3ae219afafd79be7bba0c117e301983385ada52.png +0 -0
  154. data/doc/spec/11f57941951bad5a75f9a16f38a31a3c6bf3046a475aac6e398e780892fab4ad.png +0 -0
  155. data/doc/spec/15268bc45993d3f57ccf915877f91e48bdee684f24faa614249915833cac4af9.png +0 -0
  156. data/doc/spec/253845fe6162621af407ebd110296ff4f6d8a3f23ec75dfb4ea8cda30be71262.png +0 -0
  157. data/doc/spec/26fd52b5ac55438dd9f81b4a3f3913f1058c9f225c8a5e129007c1e9413d5881.png +0 -0
  158. data/doc/spec/2b57886a9cba66bb696e4b399c51ad0dc95cd64b952709fafc819a79d573f09e.png +0 -0
  159. data/doc/spec/307a8b5a7edd6e42f8be16523a4c939faf1a0533385c861d7004b6af8addd7d1.png +0 -0
  160. data/doc/spec/328467a6a419c7c05e299b8097e5e000686068ded8dc6d5f2e2de6f51976c315.png +0 -0
  161. data/doc/spec/39d6a8eb71cae51b1d6937c97134e51f04fd47c54535ff0915fe6a8b4f197fb2.png +0 -0
  162. data/doc/spec/3f46dee4d775d1a29d52b68af6552f8ea3abd8303094e749714fc77bd7958155.png +0 -0
  163. data/doc/spec/44ec6743d5d77d15b8a487c2058bf3e455d34adc91c46ea05767f6e0e471a75e.png +0 -0
  164. data/doc/spec/462153be527b28dc2cb5259c0aec62e1f529e8b60dc6e9c23fd1e06e8be933c9.png +0 -0
  165. data/doc/spec/4a3b47ed1c54f96ebdae693d41c36c51884c4546ef799a4108085708fb7b964e.png +0 -0
  166. data/doc/spec/514f263e976d07c0d9e0a86c79bcbdcddc7d444d7b72135294ad78758effd28f.png +0 -0
  167. data/doc/spec/58113a57a37431a402d2547369eba3a481bf1dbbfd82dc384406a5c91f6df01f.png +0 -0
  168. data/doc/spec/5d331d74c460d75814b2d3138a9b7d90b5ddb2dcd85e1f5f260d183745fc3a1e.png +0 -0
  169. data/doc/spec/5d6ff62038b75d6f240d65f35d1520a131c221f47d3801554c8c2be5d528ebb0.png +0 -0
  170. data/doc/spec/62323426e381ec21c967971a67e1f4a6d89dae92154bd937284e00b67f67fdd3.png +0 -0
  171. data/doc/spec/6705af65d728c0d5c50d6c4d46253017a91eb459dbb1f40f92449f05d5562f4a.png +0 -0
  172. data/doc/spec/68fac940a32c7e40caacf8e560c61da552d57633d015ba98f2e98ec040a00c5b.png +0 -0
  173. data/doc/spec/6a34c0ef589c9c976fe41f3e67e799e198499f5b9c3ebfd240fb91f73e893573.png +0 -0
  174. data/doc/spec/6b48534236697d1ccfa1f5403764782f9d228f9eb706789cfa80203882b7b13a.png +0 -0
  175. data/doc/spec/7aa76b4d29874719466c2cbafc9936e9f12e504bf31e1a09d26ca3fffa8ba1a6.png +0 -0
  176. data/doc/spec/7b9db2986ab9ada45cfb9451ef87ff1a2d99c908083334b7ccdceb8a92387fa9.png +0 -0
  177. data/doc/spec/8101d9b89d9ba8070d585432707b43a8acdb4c2a3e9d37c3f7114b5e3ea9e800.png +0 -0
  178. data/doc/spec/886bf85249a704668a55c5161bceaac10be4a41a94b91606f49851dfa017526c.png +0 -0
  179. data/doc/spec/8ed478d8c81a58a202d0c51348fca246df206fc24a0567b163d4e0bdab56ca46.png +0 -0
  180. data/doc/spec/9139440329dcb815df89bc70182c3827868402a74ff64d0253706dcaff723dca.png +0 -0
  181. data/doc/spec/99392f56dfb0e5be3f45a12a7f1ba846d094e430f526dfeaa30b606837cd34c0.png +0 -0
  182. data/doc/spec/a4450e8c0fe0e2fde92fe9bd61952f907b1976c1aa3ba963b809bed079d42b09.png +0 -0
  183. data/doc/spec/a4bc7382a1154ea9856544fd48418f3dd9ce474ca94b8859fc323749c6cc1f55.png +0 -0
  184. data/doc/spec/a79274742cf6fac6f6c9f4a0eb651aeb452f9c43b537c8e6ccaefecd05b7105c.png +0 -0
  185. data/doc/spec/a9b4528726adec2a90f3f00139d8d0492f13c51f03c2f9ed6a5134b1b26b44a9.png +0 -0
  186. data/doc/spec/af5ae3787e80bf0771f18f1a04fe4c5d9291e1e0f963ac408a7bc198d2f1ee28.png +0 -0
  187. data/doc/spec/ba572c4f4dbade65be55f141df16cf7b3e7d09e0aec4e4e5debc4f2075277371.png +0 -0
  188. data/doc/spec/ba90ef705f7be91c53c5eb4a81a439fa0f7c48532214bd3db3cc5c069160543e.png +0 -0
  189. data/doc/spec/c1d0402862221d85aceedc7d76b3f82149b612cbd972f14d0ca9011e1e2c455c.png +0 -0
  190. data/doc/spec/c2157d8a6b73abe4f22ba5042159f32502c74bf6d762be28d2df6831586822c7.png +0 -0
  191. data/doc/spec/c5329a7f4937096a57b2e01efb9d542f84a4e2329a1e9381d08c630583ccad37.png +0 -0
  192. data/doc/spec/c82077b9455d0f9abc2c45ee1a298e38b99c9ce9cd685f65d87b376d7718d7ad.png +0 -0
  193. data/doc/spec/c93dd18894a245a5647f99e1867d3779e4cd34c9c8f8860600ff0c837a5ffa53.png +0 -0
  194. data/doc/spec/cc960a268d51ccf2ebde657d36848f780213834844900018bce3d111843f7b0f.png +0 -0
  195. data/doc/spec/d39452b58257c95a7cba07afed4877417b0c227f3690e2bff22c9eca89eac845.png +0 -0
  196. data/doc/spec/d64993258ffbef9406d9ab9136de7af530626b3a69e9eeb75835e11f11dabf62.png +0 -0
  197. data/doc/spec/da450cdd0c94a1301bd98560339a45caa8041e09974352a56ecfb144e9a5e4d4.png +0 -0
  198. data/doc/spec/dbc66b3ae6bd7123d77dd04b64f8a24498d048725a55c5340b15f5ae0a1ff307.png +0 -0
  199. data/doc/spec/de589af36fa854e006a1563c93e644e2210f2a5616babb779f7f38aadb6c1ed7.png +0 -0
  200. data/doc/spec/defbd0b853d895802663f507761ad297d82e167f516c6082686a2a19b76012c5.png +0 -0
  201. data/doc/spec/e1cb0863b21e14256d61a54200316791f6547c78ba2f0156c110f4500f9bbd49.png +0 -0
  202. data/doc/spec/e8630103287f7c9d28eff40b3b1826e24846e776b877f7b8554257acbe621e1c.png +0 -0
  203. data/doc/spec/e9b384fa7dec5f1a06479c4b289e06b1e60e4f23f7630aff6d03c52595f500f8.png +0 -0
  204. data/doc/spec/ea935ac31f3b57ff373646780a1fba34a38c9e086dc771eb7fc16c65a7e20cfc.png +0 -0
  205. data/doc/spec/eb8f5511f7d88bd0f8ba73420fc10f7c78405db7f4373d778a827058707f888e.png +0 -0
  206. data/doc/spec/ebacbd092e3d1a3c7b745a381e51e8ff9d63a21db23a16940193e18e57bc866f.png +0 -0
  207. data/doc/spec/ed039f82867241393b1a6a7153d3690461103934c72c1f3eaa3d99a12bb40885.png +0 -0
  208. data/doc/spec/ee283d6a4b69cf10da2df703be3a16830be9cd8cd4f68c5f7afdf558ea28fa76.png +0 -0
  209. data/doc/spec/f0c734b099841a754ae0366afb00e992ad4814479b65e4a7de23c6e3dd85c09a.png +0 -0
  210. data/doc/spec/f6b4fc31703cfb6327bbbd4614af8bb72da6d39fa3d53ada63a70157f2fad80e.png +0 -0
  211. data/doc/spec/f766f2e3aa13420e3ba0f823ac7956b311ed7c6c20be26b72324fadd87f36712.png +0 -0
  212. data/doc/spec/ff7d5b5573d09bd7c4cdd3aeda124d18bf82ec46673a62881b399a75d69f3f53.png +0 -0
  213. data/doc/spec.md +0 -2258
  214. data/doc/spec.md.cql +0 -1930
  215. data/lib/conceptql/annotate_grapher.rb +0 -127
  216. data/lib/conceptql/fake_annotater.rb +0 -129
  217. data/lib/conceptql/knitter.rb +0 -221
  218. data/lib/conceptql/logger.rb +0 -10
  219. data/lib/conceptql/operators/complement.rb +0 -43
  220. data/lib/conceptql/operators/condition_occurrence_source_vocabulary_operator.rb +0 -34
  221. data/lib/conceptql/operators/condition_occurrence_source_vocabulary_operator_union.rb +0 -28
  222. data/lib/conceptql/operators/condition_type.rb +0 -79
  223. data/lib/conceptql/operators/cpt.rb +0 -28
  224. data/lib/conceptql/operators/cpt_or_hcpcs.rb +0 -27
  225. data/lib/conceptql/operators/drg.rb +0 -42
  226. data/lib/conceptql/operators/drug_type_concept.rb +0 -30
  227. data/lib/conceptql/operators/from_seer_visits.rb +0 -29
  228. data/lib/conceptql/operators/hcpcs.rb +0 -28
  229. data/lib/conceptql/operators/icd10.rb +0 -19
  230. data/lib/conceptql/operators/icd10_pcs.rb +0 -28
  231. data/lib/conceptql/operators/icd9.rb +0 -19
  232. data/lib/conceptql/operators/icd9_procedure.rb +0 -28
  233. data/lib/conceptql/operators/intersect.rb +0 -39
  234. data/lib/conceptql/operators/loinc.rb +0 -28
  235. data/lib/conceptql/operators/medcode.rb +0 -17
  236. data/lib/conceptql/operators/medcode_procedure.rb +0 -28
  237. data/lib/conceptql/operators/ndc.rb +0 -32
  238. data/lib/conceptql/operators/observation_by_enttype.rb +0 -32
  239. data/lib/conceptql/operators/observation_period.rb +0 -32
  240. data/lib/conceptql/operators/overlapped_by.rb +0 -26
  241. data/lib/conceptql/operators/overlaps.rb +0 -21
  242. data/lib/conceptql/operators/place_of_service_code.rb +0 -31
  243. data/lib/conceptql/operators/procedure_occurrence.rb +0 -27
  244. data/lib/conceptql/operators/prodcode.rb +0 -32
  245. data/lib/conceptql/operators/revenue_code.rb +0 -40
  246. data/lib/conceptql/operators/rxnorm.rb +0 -28
  247. data/lib/conceptql/operators/snomed.rb +0 -25
  248. data/lib/conceptql/operators/source_vocabulary_operator.rb +0 -88
  249. data/lib/conceptql/operators/standard_vocabulary_operator.rb +0 -66
  250. data/lib/conceptql/operators/started_by.rb +0 -23
  251. data/lib/conceptql/operators/to_seer_visits.rb +0 -29
  252. data/lib/conceptql/operators/visit_occurrence.rb +0 -32
  253. data/lib/conceptql/operators/vocabulary_operator.rb +0 -45
  254. data/lib/conceptql/query_modifiers/drug_query_modifier.rb +0 -45
  255. data/lib/conceptql/query_modifiers/pos_query_modifier.rb +0 -31
  256. data/lib/conceptql/sql_formatter.rb +0 -22
  257. data/test/all.rb +0 -3
  258. data/test/all_operations_test.rb +0 -45
  259. data/test/code_list_test.rb +0 -23
  260. data/test/data/omopv4/care_site.csv +0 -0
  261. data/test/data/omopv4/cohort.csv +0 -0
  262. data/test/data/omopv4/condition_era.csv +0 -0
  263. data/test/data/omopv4/condition_occurrence.csv +0 -34044
  264. data/test/data/omopv4/death.csv +0 -1
  265. data/test/data/omopv4/drug_cost.csv +0 -0
  266. data/test/data/omopv4/drug_era.csv +0 -0
  267. data/test/data/omopv4/drug_exposure.csv +0 -2
  268. data/test/data/omopv4/location.csv +0 -0
  269. data/test/data/omopv4/observation.csv +0 -2
  270. data/test/data/omopv4/observation_period.csv +0 -1
  271. data/test/data/omopv4/organization.csv +0 -0
  272. data/test/data/omopv4/payer_plan_period.csv +0 -0
  273. data/test/data/omopv4/person.csv +0 -250
  274. data/test/data/omopv4/procedure_cost.csv +0 -0
  275. data/test/data/omopv4/procedure_occurrence.csv +0 -35099
  276. data/test/data/omopv4/provider.csv +0 -0
  277. data/test/data/omopv4/visit_occurrence.csv +0 -14931
  278. data/test/data/omopv4_plus/care_site.csv +0 -0
  279. data/test/data/omopv4_plus/cohort.csv +0 -0
  280. data/test/data/omopv4_plus/concept.csv +0 -352
  281. data/test/data/omopv4_plus/condition_era.csv +0 -0
  282. data/test/data/omopv4_plus/condition_occurrence.csv +0 -46673
  283. data/test/data/omopv4_plus/death.csv +0 -9
  284. data/test/data/omopv4_plus/drug_cost.csv +0 -13921
  285. data/test/data/omopv4_plus/drug_era.csv +0 -0
  286. data/test/data/omopv4_plus/drug_exposure.csv +0 -13921
  287. data/test/data/omopv4_plus/headers/care_site.csv +0 -1
  288. data/test/data/omopv4_plus/headers/cohort.csv +0 -1
  289. data/test/data/omopv4_plus/headers/concept.csv +0 -1
  290. data/test/data/omopv4_plus/headers/condition_era.csv +0 -1
  291. data/test/data/omopv4_plus/headers/condition_occurrence.csv +0 -1
  292. data/test/data/omopv4_plus/headers/death.csv +0 -1
  293. data/test/data/omopv4_plus/headers/drug_cost.csv +0 -1
  294. data/test/data/omopv4_plus/headers/drug_era.csv +0 -1
  295. data/test/data/omopv4_plus/headers/drug_exposure.csv +0 -1
  296. data/test/data/omopv4_plus/headers/location.csv +0 -1
  297. data/test/data/omopv4_plus/headers/observation.csv +0 -1
  298. data/test/data/omopv4_plus/headers/observation_period.csv +0 -1
  299. data/test/data/omopv4_plus/headers/organization.csv +0 -1
  300. data/test/data/omopv4_plus/headers/payer_plan_period.csv +0 -1
  301. data/test/data/omopv4_plus/headers/person.csv +0 -1
  302. data/test/data/omopv4_plus/headers/procedure_cost.csv +0 -1
  303. data/test/data/omopv4_plus/headers/procedure_occurrence.csv +0 -1
  304. data/test/data/omopv4_plus/headers/provider.csv +0 -1
  305. data/test/data/omopv4_plus/headers/source_to_concept_map.csv +0 -1
  306. data/test/data/omopv4_plus/headers/visit_occurrence.csv +0 -1
  307. data/test/data/omopv4_plus/headers/vocabulary.csv +0 -1
  308. data/test/data/omopv4_plus/location.csv +0 -0
  309. data/test/data/omopv4_plus/observation.csv +0 -0
  310. data/test/data/omopv4_plus/observation_period.csv +0 -147
  311. data/test/data/omopv4_plus/organization.csv +0 -736
  312. data/test/data/omopv4_plus/payer_plan_period.csv +0 -808
  313. data/test/data/omopv4_plus/person.csv +0 -250
  314. data/test/data/omopv4_plus/procedure_cost.csv +0 -20123
  315. data/test/data/omopv4_plus/procedure_occurrence.csv +0 -27273
  316. data/test/data/omopv4_plus/provider.csv +0 -10193
  317. data/test/data/omopv4_plus/source_to_concept_map.csv +0 -285
  318. data/test/data/omopv4_plus/visit_occurrence.csv +0 -45125
  319. data/test/data/omopv4_plus/vocabulary.csv +0 -60
  320. data/test/db.rb +0 -15
  321. data/test/db_setup.rb +0 -408
  322. data/test/db_teardown.rb +0 -33
  323. data/test/fake_annotater_test.rb +0 -31
  324. data/test/helper.rb +0 -129
  325. data/test/knitter/conceptql.md.cql +0 -39
  326. data/test/knitter/conceptql.md.expect +0 -43
  327. data/test/knitter/empty.md.cql +0 -0
  328. data/test/knitter/except.md.cql +0 -13
  329. data/test/knitter/except.md.expect +0 -14
  330. data/test/knitter/fake.md.cql +0 -10
  331. data/test/knitter/fake.md.expect +0 -13
  332. data/test/knitter/many.md.cql +0 -7
  333. data/test/knitter/many.md.expect +0 -14
  334. data/test/knitter/no_conceptql.md.cql +0 -36
  335. data/test/knitter/title.md.cql +0 -12
  336. data/test/knitter/title.md.expect +0 -15
  337. data/test/knitter/union.md.cql +0 -11
  338. data/test/knitter/union.md.expect +0 -14
  339. data/test/knitter_test.rb +0 -69
  340. data/test/query_test.rb +0 -36
  341. data/test/results/omopv4/after/anno_1 +0 -25
  342. data/test/results/omopv4/after/anno_2 +0 -48
  343. data/test/results/omopv4/after/anno_3 +0 -34
  344. data/test/results/omopv4/after/anno_4 +0 -60
  345. data/test/results/omopv4/after/anno_5 +0 -68
  346. data/test/results/omopv4/after/anno_6 +0 -60
  347. data/test/results/omopv4/after/crit_at_least +0 -7
  348. data/test/results/omopv4/after/crit_basic +0 -32
  349. data/test/results/omopv4/after/crit_occurrences +0 -12
  350. data/test/results/omopv4/after/crit_within +0 -6
  351. data/test/results/omopv4/any_overlap/crit_basic1 +0 -15
  352. data/test/results/omopv4/any_overlap/crit_basic2 +0 -15
  353. data/test/results/omopv4/any_overlap/crit_occurrences1 +0 -2
  354. data/test/results/omopv4/any_overlap/crit_occurrences2 +0 -15
  355. data/test/results/omopv4/any_overlap/crit_within +0 -8
  356. data/test/results/omopv4/before/crit_at_least +0 -6
  357. data/test/results/omopv4/before/crit_basic1 +0 -48
  358. data/test/results/omopv4/before/crit_basic2 +0 -7
  359. data/test/results/omopv4/before/crit_occurrences +0 -13
  360. data/test/results/omopv4/before/crit_within +0 -18
  361. data/test/results/omopv4/co_reported/anno_1 +0 -43
  362. data/test/results/omopv4/co_reported/anno_2 +0 -66
  363. data/test/results/omopv4/complement/anno_duplicate_params +0 -52
  364. data/test/results/omopv4/complement/anno_invalid_params +0 -37
  365. data/test/results/omopv4/complement/anno_no_params +0 -18
  366. data/test/results/omopv4/complement/count_3way_intersect +0 -4
  367. data/test/results/omopv4/complement/count_3way_union +0 -4
  368. data/test/results/omopv4/complement/count_intersect +0 -3
  369. data/test/results/omopv4/complement/count_union +0 -3
  370. data/test/results/omopv4/complement/count_union_and_intersect +0 -4
  371. data/test/results/omopv4/complement/crit_3way_intersect +0 -1
  372. data/test/results/omopv4/complement/crit_3way_union +0 -1
  373. data/test/results/omopv4/complement/crit_basic1 +0 -33998
  374. data/test/results/omopv4/complement/crit_icd9_selector +0 -54
  375. data/test/results/omopv4/complement/crit_intersect +0 -1
  376. data/test/results/omopv4/complement/crit_union +0 -1
  377. data/test/results/omopv4/complement/crit_union_and_intersect +0 -1
  378. data/test/results/omopv4/complex/anno_1 +0 -85
  379. data/test/results/omopv4/complex/crit_1 +0 -2
  380. data/test/results/omopv4/complex/crit_2 +0 -2
  381. data/test/results/omopv4/complex/crit_3 +0 -2
  382. data/test/results/omopv4/complex/crit_4 +0 -5
  383. data/test/results/omopv4/complex/crit_5 +0 -6
  384. data/test/results/omopv4/complex/crit_6 +0 -28
  385. data/test/results/omopv4/complex/crit_7 +0 -46
  386. data/test/results/omopv4/complex/crit_out_of_order_ctes +0 -7
  387. data/test/results/omopv4/complex/scanno_1 +0 -3
  388. data/test/results/omopv4/concurrent_within/crit_icd9 +0 -54
  389. data/test/results/omopv4/concurrent_within/crit_icd9_and_place_of_service +0 -23
  390. data/test/results/omopv4/concurrent_within/crit_negative_start +0 -5
  391. data/test/results/omopv4/condition_type/anno_icd9 +0 -39
  392. data/test/results/omopv4/condition_type/count_condition_era +0 -2
  393. data/test/results/omopv4/condition_type/count_condition_era_30_day_window +0 -2
  394. data/test/results/omopv4/condition_type/count_ehr_problem_list +0 -2
  395. data/test/results/omopv4/condition_type/count_era_0 +0 -2
  396. data/test/results/omopv4/condition_type/count_inpatient +0 -3
  397. data/test/results/omopv4/condition_type/count_inpatient_detail +0 -2
  398. data/test/results/omopv4/condition_type/count_inpatient_header +0 -3
  399. data/test/results/omopv4/condition_type/count_inpatient_header_2 +0 -3
  400. data/test/results/omopv4/condition_type/count_inpatient_header_3 +0 -3
  401. data/test/results/omopv4/condition_type/count_inpatient_header_4 +0 -3
  402. data/test/results/omopv4/condition_type/count_inpatient_header_5 +0 -3
  403. data/test/results/omopv4/condition_type/count_inpatient_outpatient_detail +0 -3
  404. data/test/results/omopv4/condition_type/count_inpatient_primary +0 -2
  405. data/test/results/omopv4/condition_type/count_inpatient_primary_or_first +0 -3
  406. data/test/results/omopv4/condition_type/count_outpatient +0 -3
  407. data/test/results/omopv4/condition_type/count_outpatient_detail +0 -3
  408. data/test/results/omopv4/condition_type/count_outpatient_header +0 -2
  409. data/test/results/omopv4/condition_type/count_outpatient_primary +0 -3
  410. data/test/results/omopv4/condition_type/count_primary +0 -3
  411. data/test/results/omopv4/condition_type/crit_condition_era +0 -1
  412. data/test/results/omopv4/condition_type/crit_condition_era_30_day_window +0 -1
  413. data/test/results/omopv4/condition_type/crit_ehr_problem_list +0 -1
  414. data/test/results/omopv4/condition_type/crit_era_0 +0 -1
  415. data/test/results/omopv4/condition_type/crit_inpatient +0 -1
  416. data/test/results/omopv4/condition_type/crit_inpatient_detail +0 -1
  417. data/test/results/omopv4/condition_type/crit_inpatient_header +0 -1
  418. data/test/results/omopv4/condition_type/crit_inpatient_header_2 +0 -1
  419. data/test/results/omopv4/condition_type/crit_inpatient_header_3 +0 -1
  420. data/test/results/omopv4/condition_type/crit_inpatient_header_4 +0 -1
  421. data/test/results/omopv4/condition_type/crit_inpatient_header_5 +0 -1
  422. data/test/results/omopv4/condition_type/crit_inpatient_primary +0 -1
  423. data/test/results/omopv4/condition_type/crit_inpatient_primary_or_first +0 -1
  424. data/test/results/omopv4/condition_type/crit_outpatient +0 -1
  425. data/test/results/omopv4/condition_type/crit_outpatient_detail +0 -1
  426. data/test/results/omopv4/condition_type/crit_outpatient_header +0 -1
  427. data/test/results/omopv4/condition_type/crit_outpatient_primary +0 -1
  428. data/test/results/omopv4/condition_type/crit_primary +0 -1
  429. data/test/results/omopv4/contains/crit_1 +0 -5
  430. data/test/results/omopv4/contains/crit_2 +0 -2
  431. data/test/results/omopv4/contains/crit_3 +0 -2
  432. data/test/results/omopv4/count/anno_multiple_upstreams +0 -52
  433. data/test/results/omopv4/count/anno_no_upstream1 +0 -18
  434. data/test/results/omopv4/count/anno_no_upstream2 +0 -25
  435. data/test/results/omopv4/count/crit_icd9_ndc +0 -8
  436. data/test/results/omopv4/count/crit_ndc +0 -5
  437. data/test/results/omopv4/count/crit_person +0 -254
  438. data/test/results/omopv4/cpt/anno_icd9_upstream +0 -40
  439. data/test/results/omopv4/cpt/anno_invalid_code +0 -22
  440. data/test/results/omopv4/cpt/count_1 +0 -3
  441. data/test/results/omopv4/cpt/crit_1 +0 -174
  442. data/test/results/omopv4/cpt/crit_2 +0 -1
  443. data/test/results/omopv4/cpt/scanno_1 +0 -17
  444. data/test/results/omopv4/cpt_or_hcpcs/anno_bad_format +0 -25
  445. data/test/results/omopv4/cpt_or_hcpcs/count_1 +0 -3
  446. data/test/results/omopv4/cpt_or_hcpcs/crit_1 +0 -179
  447. data/test/results/omopv4/cpt_or_hcpcs/crit_2 +0 -1
  448. data/test/results/omopv4/date_range/anno_1 +0 -15
  449. data/test/results/omopv4/date_range/anno_extra_argument +0 -24
  450. data/test/results/omopv4/date_range/anno_invalid_argument +0 -25
  451. data/test/results/omopv4/date_range/anno_missing_argument1 +0 -20
  452. data/test/results/omopv4/date_range/anno_missing_argument2 +0 -20
  453. data/test/results/omopv4/date_range/anno_no_upstreams +0 -38
  454. data/test/results/omopv4/date_range/count_1 +0 -3
  455. data/test/results/omopv4/date_range/count_2 +0 -3
  456. data/test/results/omopv4/date_range/crit_1 +0 -1
  457. data/test/results/omopv4/date_range/crit_2 +0 -1
  458. data/test/results/omopv4/death/anno_multiple_upstreams +0 -50
  459. data/test/results/omopv4/death/anno_no_upstreams +0 -22
  460. data/test/results/omopv4/death/crit_basic +0 -5
  461. data/test/results/omopv4/death/crit_person +0 -5
  462. data/test/results/omopv4/drug_type_concept/anno_has_upstreams +0 -37
  463. data/test/results/omopv4/drug_type_concept/anno_no_arguments +0 -18
  464. data/test/results/omopv4/drug_type_concept/crit_basic1 +0 -5
  465. data/test/results/omopv4/drug_type_concept/crit_basic2 +0 -2
  466. data/test/results/omopv4/during/crit_1 +0 -15
  467. data/test/results/omopv4/during/crit_2 +0 -2
  468. data/test/results/omopv4/equal/crit_1 +0 -5
  469. data/test/results/omopv4/equal/crit_2 +0 -5
  470. data/test/results/omopv4/except/anno_1 +0 -42
  471. data/test/results/omopv4/except/anno_2 +0 -43
  472. data/test/results/omopv4/except/count_complex +0 -5
  473. data/test/results/omopv4/except/crit_412_cpt +0 -54
  474. data/test/results/omopv4/except/crit_412_inpatient +0 -46
  475. data/test/results/omopv4/except/crit_complex +0 -1
  476. data/test/results/omopv4/filter/crit_1 +0 -54
  477. data/test/results/omopv4/first/anno_argument +0 -25
  478. data/test/results/omopv4/first/anno_no_upstream +0 -18
  479. data/test/results/omopv4/first/crit_cpt +0 -207
  480. data/test/results/omopv4/first/crit_icd9 +0 -42
  481. data/test/results/omopv4/first/crit_union +0 -45
  482. data/test/results/omopv4/from/anno_has_upstreams +0 -39
  483. data/test/results/omopv4/from/anno_multiple_arguments +0 -24
  484. data/test/results/omopv4/from/count_condition_occurrence +0 -3
  485. data/test/results/omopv4/from/count_observation_period +0 -3
  486. data/test/results/omopv4/from/count_person +0 -3
  487. data/test/results/omopv4/from_seer_visits/anno_multiple_upstreams +0 -78
  488. data/test/results/omopv4/from_seer_visits/anno_no_upstream +0 -18
  489. data/test/results/omopv4/from_seer_visits/crit_1 +0 -6
  490. data/test/results/omopv4/from_seer_visits/crit_2 +0 -5
  491. data/test/results/omopv4/from_seer_visits/crit_3 +0 -5
  492. data/test/results/omopv4/from_seer_visits/crit_4 +0 -6
  493. data/test/results/omopv4/gender/anno_has_upstreams +0 -39
  494. data/test/results/omopv4/gender/crit_male +0 -130
  495. data/test/results/omopv4/hcpcs/anno_bad_format +0 -24
  496. data/test/results/omopv4/hcpcs/crit_A0382 +0 -9
  497. data/test/results/omopv4/icd10/anno_bad_format +0 -22
  498. data/test/results/omopv4/icd10/anno_has_upstreams +0 -40
  499. data/test/results/omopv4/icd10/crit_1 +0 -5
  500. data/test/results/omopv4/icd10pcs/anno_bad_format +0 -28
  501. data/test/results/omopv4/icd10pcs/anno_has_upstreams +0 -40
  502. data/test/results/omopv4/icd10pcs/crit_1 +0 -2
  503. data/test/results/omopv4/icd9/anno_empty_label +0 -15
  504. data/test/results/omopv4/icd9/anno_invalid_code +0 -21
  505. data/test/results/omopv4/icd9/crit_1 +0 -54
  506. data/test/results/omopv4/icd9_procedure/crit_1 +0 -5
  507. data/test/results/omopv4/intersect/anno_412_inpatient +0 -42
  508. data/test/results/omopv4/intersect/anno_has_arguments +0 -25
  509. data/test/results/omopv4/intersect/anno_no_upstream +0 -18
  510. data/test/results/omopv4/intersect/crit_412_inpatient +0 -12
  511. data/test/results/omopv4/intersect/crit_412_male +0 -182
  512. data/test/results/omopv4/intersect/crit_complex +0 -118
  513. data/test/results/omopv4/invalid/anno_bad_op +0 -55
  514. data/test/results/omopv4/invalid/scanno_1 +0 -23
  515. data/test/results/omopv4/last/crit_icd9 +0 -42
  516. data/test/results/omopv4/loinc/crit_basic +0 -5
  517. data/test/results/omopv4/ndc/crit_basic +0 -5
  518. data/test/results/omopv4/numeric/anno_multiple_upstreams +0 -59
  519. data/test/results/omopv4/numeric/num_values_1 +0 -254
  520. data/test/results/omopv4/numeric/num_values_2 +0 -5
  521. data/test/results/omopv4/numeric/num_values_3 +0 -5
  522. data/test/results/omopv4/observation_period/anno_has_arguments +0 -36
  523. data/test/results/omopv4/observation_period/anno_multiple_upstreams +0 -51
  524. data/test/results/omopv4/observation_period/count_all_periods +0 -3
  525. data/test/results/omopv4/observation_period/crit_female +0 -2
  526. data/test/results/omopv4/observation_period/crit_icd9 +0 -5
  527. data/test/results/omopv4/observation_period/crit_male +0 -5
  528. data/test/results/omopv4/occurrence/anno_no_upstream +0 -22
  529. data/test/results/omopv4/occurrence/cc_412_410 +0 -1
  530. data/test/results/omopv4/occurrence/count_412_410 +0 -3
  531. data/test/results/omopv4/occurrence/crit_1 +0 -16
  532. data/test/results/omopv4/occurrence/crit_2 +0 -2
  533. data/test/results/omopv4/occurrence/crit_3 +0 -42
  534. data/test/results/omopv4/one_in_two_out/anno_has_arguments +0 -27
  535. data/test/results/omopv4/one_in_two_out/anno_multiple_upstreams +0 -54
  536. data/test/results/omopv4/one_in_two_out/anno_no_upstream +0 -20
  537. data/test/results/omopv4/one_in_two_out/count_1 +0 -3
  538. data/test/results/omopv4/one_in_two_out/crit_hcpcs +0 -7
  539. data/test/results/omopv4/one_in_two_out/crit_icd9 +0 -21
  540. data/test/results/omopv4/overlapped_by/crit_1 +0 -5
  541. data/test/results/omopv4/overlapped_by/crit_2 +0 -2
  542. data/test/results/omopv4/overlapped_by/crit_3 +0 -5
  543. data/test/results/omopv4/overlapped_by/crit_4 +0 -2
  544. data/test/results/omopv4/overlaps/crit_1 +0 -5
  545. data/test/results/omopv4/overlaps/crit_2 +0 -2
  546. data/test/results/omopv4/overlaps/crit_3 +0 -5
  547. data/test/results/omopv4/overlaps/crit_4 +0 -2
  548. data/test/results/omopv4/person/anno_has_arguments +0 -22
  549. data/test/results/omopv4/person/anno_multiple_upstreams +0 -52
  550. data/test/results/omopv4/person/count_2 +0 -3
  551. data/test/results/omopv4/person/crit_1 +0 -42
  552. data/test/results/omopv4/person/crit_2 +0 -1
  553. data/test/results/omopv4/person_filter/count_1 +0 -4
  554. data/test/results/omopv4/person_filter/crit_1 +0 -54
  555. data/test/results/omopv4/person_filter/crit_2 +0 -5
  556. data/test/results/omopv4/person_filter/crit_3 +0 -32
  557. data/test/results/omopv4/person_filter/crit_4 +0 -52
  558. data/test/results/omopv4/person_filter/crit_5 +0 -1
  559. data/test/results/omopv4/place_of_service_code/anno_has_upstreams +0 -37
  560. data/test/results/omopv4/place_of_service_code/anno_no_arguments +0 -18
  561. data/test/results/omopv4/place_of_service_code/crit_basic +0 -174
  562. data/test/results/omopv4/place_of_service_filter/anno_1 +0 -29
  563. data/test/results/omopv4/procedure_occurrence/anno_has_arguments +0 -37
  564. data/test/results/omopv4/procedure_occurrence/anno_multiple_upstreams +0 -51
  565. data/test/results/omopv4/procedure_occurrence/count_gender +0 -3
  566. data/test/results/omopv4/procedure_occurrence/count_icd9 +0 -3
  567. data/test/results/omopv4/procedure_occurrence/count_started_by +0 -3
  568. data/test/results/omopv4/procedure_occurrence/crit_gender +0 -1
  569. data/test/results/omopv4/procedure_occurrence/crit_icd9 +0 -1
  570. data/test/results/omopv4/procedure_occurrence/crit_started_by +0 -1
  571. data/test/results/omopv4/provenance/anno_1 +0 -29
  572. data/test/results/omopv4/provider_filter/anno_1 +0 -29
  573. data/test/results/omopv4/race/anno_1 +0 -37
  574. data/test/results/omopv4/race/anno_2 +0 -18
  575. data/test/results/omopv4/race/crit_1 +0 -28
  576. data/test/results/omopv4/read/anno_1 +0 -21
  577. data/test/results/omopv4/read/crit_1 +0 -2
  578. data/test/results/omopv4/recall/anno_1 +0 -54
  579. data/test/results/omopv4/recall/anno_2 +0 -66
  580. data/test/results/omopv4/recall/anno_3 +0 -20
  581. data/test/results/omopv4/recall/anno_4 +0 -18
  582. data/test/results/omopv4/recall/anno_5 +0 -24
  583. data/test/results/omopv4/recall/anno_6 +0 -270
  584. data/test/results/omopv4/recall/crit_1 +0 -21
  585. data/test/results/omopv4/recall/crit_2 +0 -54
  586. data/test/results/omopv4/recall/crit_3 +0 -2
  587. data/test/results/omopv4/recall/crit_cte_1 +0 -42
  588. data/test/results/omopv4/recall/crit_cte_2 +0 -42
  589. data/test/results/omopv4/recall/crit_nested_perm_0 +0 -54
  590. data/test/results/omopv4/revenue_code/crit_1 +0 -2
  591. data/test/results/omopv4/revenue_code/crit_basic +0 -2
  592. data/test/results/omopv4/revenue_code/domains_1 +0 -3
  593. data/test/results/omopv4/revenue_code/domains_drg100 +0 -3
  594. data/test/results/omopv4/rxnorm/crit_1 +0 -5
  595. data/test/results/omopv4/snomed/crit_1 +0 -84
  596. data/test/results/omopv4/started_by/crit_1 +0 -5
  597. data/test/results/omopv4/started_by/crit_2 +0 -2
  598. data/test/results/omopv4/started_by/crit_3 +0 -2
  599. data/test/results/omopv4/sum/anno_1 +0 -18
  600. data/test/results/omopv4/sum/anno_2 +0 -36
  601. data/test/results/omopv4/sum/num_1 +0 -5
  602. data/test/results/omopv4/sum/num_2 +0 -8
  603. data/test/results/omopv4/sum/num_3 +0 -254
  604. data/test/results/omopv4/time_window/anno_1 +0 -20
  605. data/test/results/omopv4/time_window/anno_2 +0 -40
  606. data/test/results/omopv4/time_window/anno_3 +0 -36
  607. data/test/results/omopv4/time_window/anno_4 +0 -39
  608. data/test/results/omopv4/time_window/anno_5 +0 -57
  609. data/test/results/omopv4/time_window/crit_1 +0 -54
  610. data/test/results/omopv4/time_window/crit_2 +0 -174
  611. data/test/results/omopv4/time_window/crit_3 +0 -54
  612. data/test/results/omopv4/time_window/crit_4 +0 -174
  613. data/test/results/omopv4/trim_date_end/crit_1 +0 -5
  614. data/test/results/omopv4/trim_date_end/crit_2 +0 -2
  615. data/test/results/omopv4/trim_date_end/crit_3 +0 -6
  616. data/test/results/omopv4/trim_date_end/crit_at_least +0 -5
  617. data/test/results/omopv4/trim_date_end/crit_occurrences_1 +0 -2
  618. data/test/results/omopv4/trim_date_end/crit_occurrences_2 +0 -6
  619. data/test/results/omopv4/trim_date_end/crit_within +0 -5
  620. data/test/results/omopv4/trim_date_start/crit_1 +0 -5
  621. data/test/results/omopv4/trim_date_start/crit_2 +0 -2
  622. data/test/results/omopv4/trim_date_start/crit_3 +0 -6
  623. data/test/results/omopv4/trim_date_start/crit_at_least +0 -5
  624. data/test/results/omopv4/trim_date_start/crit_occurrences_1 +0 -2
  625. data/test/results/omopv4/trim_date_start/crit_occurrences_2 +0 -6
  626. data/test/results/omopv4/trim_date_start/crit_within +0 -5
  627. data/test/results/omopv4/union/anno_1 +0 -43
  628. data/test/results/omopv4/union/anno_2 +0 -74
  629. data/test/results/omopv4/union/anno_3 +0 -18
  630. data/test/results/omopv4/union/anno_4 +0 -25
  631. data/test/results/omopv4/union/anno_5 +0 -33
  632. data/test/results/omopv4/union/anno_6 +0 -46
  633. data/test/results/omopv4/union/cc_1 +0 -1
  634. data/test/results/omopv4/union/cc_2 +0 -1
  635. data/test/results/omopv4/union/cc_3 +0 -1
  636. data/test/results/omopv4/union/cc_4 +0 -1
  637. data/test/results/omopv4/union/cc_5 +0 -1
  638. data/test/results/omopv4/union/count_1 +0 -3
  639. data/test/results/omopv4/union/count_2 +0 -3
  640. data/test/results/omopv4/union/count_3 +0 -3
  641. data/test/results/omopv4/union/count_4 +0 -3
  642. data/test/results/omopv4/union/count_5 +0 -4
  643. data/test/results/omopv4/union/scanno_1 +0 -22
  644. data/test/results/omopv4/union/scanno_2 +0 -36
  645. data/test/results/omopv4/visit_occurrence/anno_1 +0 -52
  646. data/test/results/omopv4/visit_occurrence/anno_2 +0 -37
  647. data/test/results/omopv4/visit_occurrence/crit_1 +0 -54
  648. data/test/results/omopv4/visit_occurrence/crit_2 +0 -7566
  649. data/test/results/omopv4/visit_occurrence/crit_3 +0 -14935
  650. data/test/results/omopv4_plus/after/anno_1 +0 -25
  651. data/test/results/omopv4_plus/after/anno_2 +0 -48
  652. data/test/results/omopv4_plus/after/anno_3 +0 -34
  653. data/test/results/omopv4_plus/after/anno_4 +0 -60
  654. data/test/results/omopv4_plus/after/anno_5 +0 -68
  655. data/test/results/omopv4_plus/after/anno_6 +0 -60
  656. data/test/results/omopv4_plus/after/crit_at_least +0 -7
  657. data/test/results/omopv4_plus/after/crit_basic +0 -32
  658. data/test/results/omopv4_plus/after/crit_occurrences +0 -12
  659. data/test/results/omopv4_plus/after/crit_within +0 -5
  660. data/test/results/omopv4_plus/any_overlap/crit_basic1 +0 -14
  661. data/test/results/omopv4_plus/any_overlap/crit_basic2 +0 -14
  662. data/test/results/omopv4_plus/any_overlap/crit_occurrences1 +0 -2
  663. data/test/results/omopv4_plus/any_overlap/crit_occurrences2 +0 -14
  664. data/test/results/omopv4_plus/any_overlap/crit_within +0 -8
  665. data/test/results/omopv4_plus/before/crit_at_least +0 -6
  666. data/test/results/omopv4_plus/before/crit_basic1 +0 -48
  667. data/test/results/omopv4_plus/before/crit_basic2 +0 -8
  668. data/test/results/omopv4_plus/before/crit_occurrences +0 -13
  669. data/test/results/omopv4_plus/before/crit_within +0 -17
  670. data/test/results/omopv4_plus/co_reported/anno_1 +0 -43
  671. data/test/results/omopv4_plus/co_reported/anno_2 +0 -66
  672. data/test/results/omopv4_plus/co_reported/anno_3 +0 -47
  673. data/test/results/omopv4_plus/complement/anno_duplicate_params +0 -52
  674. data/test/results/omopv4_plus/complement/anno_invalid_params +0 -37
  675. data/test/results/omopv4_plus/complement/anno_no_params +0 -18
  676. data/test/results/omopv4_plus/complement/count_3way_intersect +0 -4
  677. data/test/results/omopv4_plus/complement/count_3way_union +0 -4
  678. data/test/results/omopv4_plus/complement/count_intersect +0 -3
  679. data/test/results/omopv4_plus/complement/count_union +0 -3
  680. data/test/results/omopv4_plus/complement/count_union_and_intersect +0 -4
  681. data/test/results/omopv4_plus/complement/crit_basic1 +0 -52483
  682. data/test/results/omopv4_plus/complement/crit_icd9_selector +0 -52
  683. data/test/results/omopv4_plus/complex/anno_1 +0 -85
  684. data/test/results/omopv4_plus/complex/crit_1 +0 -2
  685. data/test/results/omopv4_plus/complex/crit_2 +0 -2
  686. data/test/results/omopv4_plus/complex/crit_3 +0 -2
  687. data/test/results/omopv4_plus/complex/crit_4 +0 -2
  688. data/test/results/omopv4_plus/complex/crit_5 +0 -2
  689. data/test/results/omopv4_plus/complex/crit_6 +0 -24
  690. data/test/results/omopv4_plus/complex/crit_7 +0 -45
  691. data/test/results/omopv4_plus/complex/crit_out_of_order_ctes +0 -15
  692. data/test/results/omopv4_plus/complex/scanno_1 +0 -108
  693. data/test/results/omopv4_plus/concurrent_within/crit_icd9 +0 -52
  694. data/test/results/omopv4_plus/concurrent_within/crit_icd9_and_place_of_service +0 -21
  695. data/test/results/omopv4_plus/concurrent_within/crit_negative_start +0 -5
  696. data/test/results/omopv4_plus/condition_type/anno_icd9 +0 -39
  697. data/test/results/omopv4_plus/condition_type/count_condition_era +0 -2
  698. data/test/results/omopv4_plus/condition_type/count_condition_era_30_day_window +0 -2
  699. data/test/results/omopv4_plus/condition_type/count_ehr_problem_list +0 -2
  700. data/test/results/omopv4_plus/condition_type/count_era_0 +0 -2
  701. data/test/results/omopv4_plus/condition_type/count_inpatient +0 -3
  702. data/test/results/omopv4_plus/condition_type/count_inpatient_detail +0 -2
  703. data/test/results/omopv4_plus/condition_type/count_inpatient_header +0 -3
  704. data/test/results/omopv4_plus/condition_type/count_inpatient_header_2 +0 -3
  705. data/test/results/omopv4_plus/condition_type/count_inpatient_header_3 +0 -3
  706. data/test/results/omopv4_plus/condition_type/count_inpatient_header_4 +0 -3
  707. data/test/results/omopv4_plus/condition_type/count_inpatient_header_5 +0 -3
  708. data/test/results/omopv4_plus/condition_type/count_inpatient_outpatient_detail +0 -3
  709. data/test/results/omopv4_plus/condition_type/count_inpatient_primary +0 -3
  710. data/test/results/omopv4_plus/condition_type/count_inpatient_primary_or_first +0 -3
  711. data/test/results/omopv4_plus/condition_type/count_outpatient +0 -3
  712. data/test/results/omopv4_plus/condition_type/count_outpatient_detail +0 -2
  713. data/test/results/omopv4_plus/condition_type/count_outpatient_header +0 -3
  714. data/test/results/omopv4_plus/condition_type/count_outpatient_primary +0 -3
  715. data/test/results/omopv4_plus/condition_type/count_primary +0 -3
  716. data/test/results/omopv4_plus/contains/crit_1 +0 -5
  717. data/test/results/omopv4_plus/contains/crit_2 +0 -2
  718. data/test/results/omopv4_plus/contains/crit_3 +0 -2
  719. data/test/results/omopv4_plus/count/anno_multiple_upstreams +0 -52
  720. data/test/results/omopv4_plus/count/anno_no_upstream1 +0 -18
  721. data/test/results/omopv4_plus/count/anno_no_upstream2 +0 -25
  722. data/test/results/omopv4_plus/count/crit_icd9_ndc +0 -5
  723. data/test/results/omopv4_plus/count/crit_ndc +0 -2
  724. data/test/results/omopv4_plus/count/crit_person +0 -254
  725. data/test/results/omopv4_plus/cpt/anno_icd9_upstream +0 -40
  726. data/test/results/omopv4_plus/cpt/anno_invalid_code +0 -22
  727. data/test/results/omopv4_plus/cpt/count_1 +0 -3
  728. data/test/results/omopv4_plus/cpt/crit_1 +0 -158
  729. data/test/results/omopv4_plus/cpt/scanno_1 +0 -17
  730. data/test/results/omopv4_plus/cpt_or_hcpcs/anno_bad_format +0 -25
  731. data/test/results/omopv4_plus/cpt_or_hcpcs/count_1 +0 -3
  732. data/test/results/omopv4_plus/cpt_or_hcpcs/crit_1 +0 -161
  733. data/test/results/omopv4_plus/date_range/anno_1 +0 -15
  734. data/test/results/omopv4_plus/date_range/anno_extra_argument +0 -24
  735. data/test/results/omopv4_plus/date_range/anno_invalid_argument +0 -25
  736. data/test/results/omopv4_plus/date_range/anno_missing_argument1 +0 -20
  737. data/test/results/omopv4_plus/date_range/anno_missing_argument2 +0 -20
  738. data/test/results/omopv4_plus/date_range/anno_no_upstreams +0 -38
  739. data/test/results/omopv4_plus/date_range/count_1 +0 -3
  740. data/test/results/omopv4_plus/date_range/count_2 +0 -3
  741. data/test/results/omopv4_plus/death/anno_multiple_upstreams +0 -50
  742. data/test/results/omopv4_plus/death/anno_no_upstreams +0 -22
  743. data/test/results/omopv4_plus/death/crit_basic +0 -14
  744. data/test/results/omopv4_plus/death/crit_person +0 -14
  745. data/test/results/omopv4_plus/drug_type_concept/anno_has_upstreams +0 -37
  746. data/test/results/omopv4_plus/drug_type_concept/anno_no_arguments +0 -18
  747. data/test/results/omopv4_plus/drug_type_concept/crit_basic1 +0 -2
  748. data/test/results/omopv4_plus/drug_type_concept/crit_basic2 +0 -2
  749. data/test/results/omopv4_plus/during/crit_1 +0 -14
  750. data/test/results/omopv4_plus/during/crit_2 +0 -2
  751. data/test/results/omopv4_plus/equal/crit_1 +0 -2
  752. data/test/results/omopv4_plus/equal/crit_2 +0 -2
  753. data/test/results/omopv4_plus/except/anno_1 +0 -42
  754. data/test/results/omopv4_plus/except/anno_2 +0 -43
  755. data/test/results/omopv4_plus/except/count_complex +0 -5
  756. data/test/results/omopv4_plus/except/crit_412_cpt +0 -52
  757. data/test/results/omopv4_plus/except/crit_412_inpatient +0 -45
  758. data/test/results/omopv4_plus/filter/crit_1 +0 -52
  759. data/test/results/omopv4_plus/first/anno_argument +0 -25
  760. data/test/results/omopv4_plus/first/anno_no_upstream +0 -18
  761. data/test/results/omopv4_plus/first/crit_cpt +0 -180
  762. data/test/results/omopv4_plus/first/crit_icd9 +0 -41
  763. data/test/results/omopv4_plus/first/crit_union +0 -52
  764. data/test/results/omopv4_plus/from/anno_has_upstreams +0 -39
  765. data/test/results/omopv4_plus/from/anno_multiple_arguments +0 -24
  766. data/test/results/omopv4_plus/from/count_condition_occurrence +0 -3
  767. data/test/results/omopv4_plus/from/count_observation_period +0 -3
  768. data/test/results/omopv4_plus/from/count_person +0 -3
  769. data/test/results/omopv4_plus/from_seer_visits/anno_multiple_upstreams +0 -78
  770. data/test/results/omopv4_plus/from_seer_visits/anno_no_upstream +0 -18
  771. data/test/results/omopv4_plus/from_seer_visits/crit_1 +0 -2
  772. data/test/results/omopv4_plus/from_seer_visits/crit_2 +0 -2
  773. data/test/results/omopv4_plus/from_seer_visits/crit_3 +0 -2
  774. data/test/results/omopv4_plus/from_seer_visits/crit_4 +0 -2
  775. data/test/results/omopv4_plus/gender/anno_has_upstreams +0 -39
  776. data/test/results/omopv4_plus/gender/crit_male +0 -128
  777. data/test/results/omopv4_plus/hcpcs/anno_bad_format +0 -24
  778. data/test/results/omopv4_plus/hcpcs/crit_A0382 +0 -7
  779. data/test/results/omopv4_plus/icd10/anno_bad_format +0 -22
  780. data/test/results/omopv4_plus/icd10/anno_has_upstreams +0 -40
  781. data/test/results/omopv4_plus/icd10/crit_1 +0 -2
  782. data/test/results/omopv4_plus/icd10pcs/anno_bad_format +0 -28
  783. data/test/results/omopv4_plus/icd10pcs/anno_has_upstreams +0 -40
  784. data/test/results/omopv4_plus/icd10pcs/crit_1 +0 -2
  785. data/test/results/omopv4_plus/icd9/anno_empty_label +0 -15
  786. data/test/results/omopv4_plus/icd9/anno_invalid_code +0 -21
  787. data/test/results/omopv4_plus/icd9/anno_valid_code +0 -3
  788. data/test/results/omopv4_plus/icd9/crit_1 +0 -52
  789. data/test/results/omopv4_plus/icd9_procedure/crit_1 +0 -5
  790. data/test/results/omopv4_plus/intersect/anno_412_inpatient +0 -42
  791. data/test/results/omopv4_plus/intersect/anno_has_arguments +0 -25
  792. data/test/results/omopv4_plus/intersect/anno_no_upstream +0 -18
  793. data/test/results/omopv4_plus/intersect/crit_412_inpatient +0 -11
  794. data/test/results/omopv4_plus/intersect/crit_412_male +0 -178
  795. data/test/results/omopv4_plus/intersect/crit_complex +0 -110
  796. data/test/results/omopv4_plus/invalid/anno_bad_op +0 -55
  797. data/test/results/omopv4_plus/invalid/scanno_1 +0 -23
  798. data/test/results/omopv4_plus/last/crit_icd9 +0 -41
  799. data/test/results/omopv4_plus/loinc/crit_basic +0 -2
  800. data/test/results/omopv4_plus/ndc/crit_basic +0 -2
  801. data/test/results/omopv4_plus/ndc/results_1 +0 -41
  802. data/test/results/omopv4_plus/numeric/anno_multiple_upstreams +0 -59
  803. data/test/results/omopv4_plus/numeric/num_values_1 +0 -254
  804. data/test/results/omopv4_plus/numeric/num_values_2 +0 -5
  805. data/test/results/omopv4_plus/numeric/num_values_3 +0 -5
  806. data/test/results/omopv4_plus/observation_period/anno_has_arguments +0 -36
  807. data/test/results/omopv4_plus/observation_period/anno_multiple_upstreams +0 -51
  808. data/test/results/omopv4_plus/observation_period/count_all_periods +0 -3
  809. data/test/results/omopv4_plus/observation_period/crit_female +0 -87
  810. data/test/results/omopv4_plus/observation_period/crit_icd9 +0 -28
  811. data/test/results/omopv4_plus/observation_period/crit_male +0 -75
  812. data/test/results/omopv4_plus/occurrence/anno_no_upstream +0 -22
  813. data/test/results/omopv4_plus/occurrence/count_412_410 +0 -3
  814. data/test/results/omopv4_plus/occurrence/crit_1 +0 -15
  815. data/test/results/omopv4_plus/occurrence/crit_2 +0 -2
  816. data/test/results/omopv4_plus/occurrence/crit_3 +0 -41
  817. data/test/results/omopv4_plus/one_in_two_out/anno_has_arguments +0 -27
  818. data/test/results/omopv4_plus/one_in_two_out/anno_multiple_upstreams +0 -54
  819. data/test/results/omopv4_plus/one_in_two_out/anno_no_upstream +0 -20
  820. data/test/results/omopv4_plus/one_in_two_out/count_1 +0 -3
  821. data/test/results/omopv4_plus/one_in_two_out/count_same_as_1 +0 -3
  822. data/test/results/omopv4_plus/one_in_two_out/crit_hcpcs +0 -2
  823. data/test/results/omopv4_plus/one_in_two_out/crit_icd9 +0 -19
  824. data/test/results/omopv4_plus/one_in_two_out/results_1 +0 -803
  825. data/test/results/omopv4_plus/one_in_two_out/results_2 +0 -803
  826. data/test/results/omopv4_plus/overlapped_by/crit_1 +0 -5
  827. data/test/results/omopv4_plus/overlapped_by/crit_2 +0 -2
  828. data/test/results/omopv4_plus/overlapped_by/crit_3 +0 -5
  829. data/test/results/omopv4_plus/overlapped_by/crit_4 +0 -2
  830. data/test/results/omopv4_plus/overlaps/crit_1 +0 -5
  831. data/test/results/omopv4_plus/overlaps/crit_2 +0 -2
  832. data/test/results/omopv4_plus/overlaps/crit_3 +0 -5
  833. data/test/results/omopv4_plus/overlaps/crit_4 +0 -2
  834. data/test/results/omopv4_plus/person/anno_has_arguments +0 -22
  835. data/test/results/omopv4_plus/person/anno_multiple_upstreams +0 -52
  836. data/test/results/omopv4_plus/person/count_2 +0 -3
  837. data/test/results/omopv4_plus/person/crit_1 +0 -41
  838. data/test/results/omopv4_plus/person_filter/count_1 +0 -4
  839. data/test/results/omopv4_plus/person_filter/crit_1 +0 -52
  840. data/test/results/omopv4_plus/person_filter/crit_2 +0 -10
  841. data/test/results/omopv4_plus/person_filter/crit_3 +0 -32
  842. data/test/results/omopv4_plus/person_filter/crit_4 +0 -50
  843. data/test/results/omopv4_plus/place_of_service_code/anno_has_upstreams +0 -37
  844. data/test/results/omopv4_plus/place_of_service_code/anno_no_arguments +0 -18
  845. data/test/results/omopv4_plus/place_of_service_code/crit_basic +0 -157
  846. data/test/results/omopv4_plus/place_of_service_filter/anno_1 +0 -29
  847. data/test/results/omopv4_plus/procedure_occurrence/anno_has_arguments +0 -37
  848. data/test/results/omopv4_plus/procedure_occurrence/anno_multiple_upstreams +0 -51
  849. data/test/results/omopv4_plus/procedure_occurrence/count_gender +0 -3
  850. data/test/results/omopv4_plus/procedure_occurrence/count_icd9 +0 -3
  851. data/test/results/omopv4_plus/procedure_occurrence/count_started_by +0 -3
  852. data/test/results/omopv4_plus/provenance/anno_1 +0 -29
  853. data/test/results/omopv4_plus/provenance/anno_bad_keyword +0 -38
  854. data/test/results/omopv4_plus/provenance/count_1 +0 -3
  855. data/test/results/omopv4_plus/provenance/count_2 +0 -3
  856. data/test/results/omopv4_plus/provider_filter/anno_1 +0 -29
  857. data/test/results/omopv4_plus/race/anno_1 +0 -37
  858. data/test/results/omopv4_plus/race/anno_2 +0 -18
  859. data/test/results/omopv4_plus/race/crit_1 +0 -32
  860. data/test/results/omopv4_plus/read/anno_1 +0 -15
  861. data/test/results/omopv4_plus/read/crit_1 +0 -2
  862. data/test/results/omopv4_plus/recall/anno_1 +0 -54
  863. data/test/results/omopv4_plus/recall/anno_2 +0 -66
  864. data/test/results/omopv4_plus/recall/anno_3 +0 -20
  865. data/test/results/omopv4_plus/recall/anno_4 +0 -18
  866. data/test/results/omopv4_plus/recall/anno_5 +0 -24
  867. data/test/results/omopv4_plus/recall/anno_6 +0 -270
  868. data/test/results/omopv4_plus/recall/crit_1 +0 -19
  869. data/test/results/omopv4_plus/recall/crit_2 +0 -52
  870. data/test/results/omopv4_plus/recall/crit_3 +0 -2
  871. data/test/results/omopv4_plus/recall/crit_cte_1 +0 -41
  872. data/test/results/omopv4_plus/recall/crit_cte_2 +0 -41
  873. data/test/results/omopv4_plus/recall/crit_nested_perm_0 +0 -52
  874. data/test/results/omopv4_plus/revenue_code/crit_1 +0 -2
  875. data/test/results/omopv4_plus/revenue_code/crit_basic +0 -2
  876. data/test/results/omopv4_plus/revenue_code/domains_1 +0 -3
  877. data/test/results/omopv4_plus/revenue_code/domains_drg100 +0 -3
  878. data/test/results/omopv4_plus/rxnorm/crit_1 +0 -2
  879. data/test/results/omopv4_plus/snomed/crit_1 +0 -2
  880. data/test/results/omopv4_plus/started_by/crit_1 +0 -5
  881. data/test/results/omopv4_plus/started_by/crit_2 +0 -2
  882. data/test/results/omopv4_plus/started_by/crit_3 +0 -2
  883. data/test/results/omopv4_plus/sum/anno_1 +0 -18
  884. data/test/results/omopv4_plus/sum/anno_2 +0 -36
  885. data/test/results/omopv4_plus/sum/num_1 +0 -2
  886. data/test/results/omopv4_plus/sum/num_2 +0 -5
  887. data/test/results/omopv4_plus/sum/num_3 +0 -254
  888. data/test/results/omopv4_plus/time_window/anno_1 +0 -20
  889. data/test/results/omopv4_plus/time_window/anno_2 +0 -40
  890. data/test/results/omopv4_plus/time_window/anno_3 +0 -36
  891. data/test/results/omopv4_plus/time_window/anno_4 +0 -39
  892. data/test/results/omopv4_plus/time_window/anno_5 +0 -57
  893. data/test/results/omopv4_plus/time_window/crit_1 +0 -52
  894. data/test/results/omopv4_plus/time_window/crit_2 +0 -157
  895. data/test/results/omopv4_plus/time_window/crit_3 +0 -52
  896. data/test/results/omopv4_plus/time_window/crit_4 +0 -157
  897. data/test/results/omopv4_plus/trim_date_end/crit_1 +0 -5
  898. data/test/results/omopv4_plus/trim_date_end/crit_2 +0 -2
  899. data/test/results/omopv4_plus/trim_date_end/crit_3 +0 -6
  900. data/test/results/omopv4_plus/trim_date_end/crit_at_least +0 -5
  901. data/test/results/omopv4_plus/trim_date_end/crit_occurrences_1 +0 -2
  902. data/test/results/omopv4_plus/trim_date_end/crit_occurrences_2 +0 -6
  903. data/test/results/omopv4_plus/trim_date_end/crit_within +0 -5
  904. data/test/results/omopv4_plus/trim_date_start/crit_1 +0 -5
  905. data/test/results/omopv4_plus/trim_date_start/crit_2 +0 -2
  906. data/test/results/omopv4_plus/trim_date_start/crit_3 +0 -6
  907. data/test/results/omopv4_plus/trim_date_start/crit_at_least +0 -5
  908. data/test/results/omopv4_plus/trim_date_start/crit_occurrences_1 +0 -2
  909. data/test/results/omopv4_plus/trim_date_start/crit_occurrences_2 +0 -6
  910. data/test/results/omopv4_plus/trim_date_start/crit_within +0 -5
  911. data/test/results/omopv4_plus/union/anno_1 +0 -43
  912. data/test/results/omopv4_plus/union/anno_2 +0 -74
  913. data/test/results/omopv4_plus/union/anno_3 +0 -18
  914. data/test/results/omopv4_plus/union/anno_4 +0 -25
  915. data/test/results/omopv4_plus/union/anno_5 +0 -33
  916. data/test/results/omopv4_plus/union/anno_6 +0 -46
  917. data/test/results/omopv4_plus/union/count_1 +0 -3
  918. data/test/results/omopv4_plus/union/count_2 +0 -3
  919. data/test/results/omopv4_plus/union/count_3 +0 -3
  920. data/test/results/omopv4_plus/union/count_4 +0 -3
  921. data/test/results/omopv4_plus/union/count_5 +0 -4
  922. data/test/results/omopv4_plus/union/optcc_1 +0 -3
  923. data/test/results/omopv4_plus/union/optcc_2 +0 -3
  924. data/test/results/omopv4_plus/union/optcc_3 +0 -3
  925. data/test/results/omopv4_plus/union/optcc_4 +0 -3
  926. data/test/results/omopv4_plus/union/optcc_5 +0 -3
  927. data/test/results/omopv4_plus/union/optcc_6 +0 -3
  928. data/test/results/omopv4_plus/union/scanno_1 +0 -22
  929. data/test/results/omopv4_plus/union/scanno_2 +0 -36
  930. data/test/results/omopv4_plus/visit_occurrence/anno_1 +0 -52
  931. data/test/results/omopv4_plus/visit_occurrence/anno_2 +0 -37
  932. data/test/results/omopv4_plus/visit_occurrence/crit_1 +0 -52
  933. data/test/results/omopv4_plus/visit_occurrence/crit_2 +0 -22945
  934. data/test/results/omopv4_plus/visit_occurrence/crit_3 +0 -46851
  935. data/test/statements/after/anno_1 +0 -7
  936. data/test/statements/after/anno_2 +0 -16
  937. data/test/statements/after/anno_3 +0 -9
  938. data/test/statements/after/anno_4 +0 -19
  939. data/test/statements/after/anno_5 +0 -21
  940. data/test/statements/after/anno_6 +0 -16
  941. data/test/statements/after/crit_at_least +0 -21
  942. data/test/statements/after/crit_basic +0 -20
  943. data/test/statements/after/crit_occurrences +0 -21
  944. data/test/statements/after/crit_within +0 -21
  945. data/test/statements/any_overlap/crit_basic1 +0 -16
  946. data/test/statements/any_overlap/crit_basic2 +0 -16
  947. data/test/statements/any_overlap/crit_occurrences1 +0 -17
  948. data/test/statements/any_overlap/crit_occurrences2 +0 -17
  949. data/test/statements/any_overlap/crit_within +0 -17
  950. data/test/statements/before/crit_at_least +0 -14
  951. data/test/statements/before/crit_basic1 +0 -13
  952. data/test/statements/before/crit_basic2 +0 -16
  953. data/test/statements/before/crit_occurrences +0 -14
  954. data/test/statements/before/crit_within +0 -14
  955. data/test/statements/co_reported/anno_1 +0 -13
  956. data/test/statements/co_reported/anno_2 +0 -21
  957. data/test/statements/co_reported/anno_3 +0 -14
  958. data/test/statements/complement/anno_duplicate_params +0 -11
  959. data/test/statements/complement/anno_invalid_params +0 -8
  960. data/test/statements/complement/anno_no_params +0 -3
  961. data/test/statements/complement/count_3way_intersect +0 -24
  962. data/test/statements/complement/count_3way_union +0 -18
  963. data/test/statements/complement/count_intersect +0 -17
  964. data/test/statements/complement/count_union +0 -14
  965. data/test/statements/complement/count_union_and_intersect +0 -27
  966. data/test/statements/complement/crit_basic1 +0 -7
  967. data/test/statements/complement/crit_icd9_selector +0 -10
  968. data/test/statements/complex/anno_1 +0 -29
  969. data/test/statements/complex/crit_1 +0 -278
  970. data/test/statements/complex/crit_2 +0 -43
  971. data/test/statements/complex/crit_3 +0 -54
  972. data/test/statements/complex/crit_4 +0 -17
  973. data/test/statements/complex/crit_5 +0 -17
  974. data/test/statements/complex/crit_6 +0 -20
  975. data/test/statements/complex/crit_7 +0 -14
  976. data/test/statements/complex/crit_out_of_order_ctes +0 -39
  977. data/test/statements/complex/scanno_1 +0 -1508
  978. data/test/statements/concurrent_within/crit_icd9 +0 -11
  979. data/test/statements/concurrent_within/crit_icd9_and_place_of_service +0 -15
  980. data/test/statements/concurrent_within/crit_negative_start +0 -15
  981. data/test/statements/condition_type/anno_icd9 +0 -7
  982. data/test/statements/condition_type/count_condition_era +0 -4
  983. data/test/statements/condition_type/count_condition_era_30_day_window +0 -4
  984. data/test/statements/condition_type/count_ehr_problem_list +0 -4
  985. data/test/statements/condition_type/count_era_0 +0 -4
  986. data/test/statements/condition_type/count_inpatient +0 -4
  987. data/test/statements/condition_type/count_inpatient_detail +0 -4
  988. data/test/statements/condition_type/count_inpatient_header +0 -4
  989. data/test/statements/condition_type/count_inpatient_header_2 +0 -4
  990. data/test/statements/condition_type/count_inpatient_header_3 +0 -4
  991. data/test/statements/condition_type/count_inpatient_header_4 +0 -4
  992. data/test/statements/condition_type/count_inpatient_header_5 +0 -4
  993. data/test/statements/condition_type/count_inpatient_outpatient_detail +0 -5
  994. data/test/statements/condition_type/count_inpatient_primary +0 -4
  995. data/test/statements/condition_type/count_inpatient_primary_or_first +0 -4
  996. data/test/statements/condition_type/count_outpatient +0 -4
  997. data/test/statements/condition_type/count_outpatient_detail +0 -4
  998. data/test/statements/condition_type/count_outpatient_header +0 -4
  999. data/test/statements/condition_type/count_outpatient_primary +0 -4
  1000. data/test/statements/condition_type/count_primary +0 -4
  1001. data/test/statements/contains/crit_1 +0 -16
  1002. data/test/statements/contains/crit_2 +0 -16
  1003. data/test/statements/contains/crit_3 +0 -16
  1004. data/test/statements/count/anno_multiple_upstreams +0 -11
  1005. data/test/statements/count/anno_no_upstream1 +0 -3
  1006. data/test/statements/count/anno_no_upstream2 +0 -4
  1007. data/test/statements/count/crit_icd9_ndc +0 -15
  1008. data/test/statements/count/crit_ndc +0 -11
  1009. data/test/statements/count/crit_person +0 -7
  1010. data/test/statements/cpt/anno_icd9_upstream +0 -7
  1011. data/test/statements/cpt/anno_invalid_code +0 -5
  1012. data/test/statements/cpt/count_1 +0 -4
  1013. data/test/statements/cpt/crit_1 +0 -4
  1014. data/test/statements/cpt/scanno_1 +0 -4
  1015. data/test/statements/cpt_or_hcpcs/anno_bad_format +0 -7
  1016. data/test/statements/cpt_or_hcpcs/count_1 +0 -5
  1017. data/test/statements/cpt_or_hcpcs/crit_1 +0 -5
  1018. data/test/statements/date_range/anno_1 +0 -7
  1019. data/test/statements/date_range/anno_extra_argument +0 -8
  1020. data/test/statements/date_range/anno_invalid_argument +0 -7
  1021. data/test/statements/date_range/anno_missing_argument1 +0 -6
  1022. data/test/statements/date_range/anno_missing_argument2 +0 -6
  1023. data/test/statements/date_range/anno_no_upstreams +0 -11
  1024. data/test/statements/date_range/count_1 +0 -7
  1025. data/test/statements/date_range/count_2 +0 -7
  1026. data/test/statements/death/anno_multiple_upstreams +0 -10
  1027. data/test/statements/death/anno_no_upstreams +0 -4
  1028. data/test/statements/death/crit_basic +0 -3
  1029. data/test/statements/death/crit_person +0 -7
  1030. data/test/statements/drug_type_concept/anno_has_upstreams +0 -8
  1031. data/test/statements/drug_type_concept/anno_no_arguments +0 -3
  1032. data/test/statements/drug_type_concept/crit_basic1 +0 -4
  1033. data/test/statements/drug_type_concept/crit_basic2 +0 -4
  1034. data/test/statements/during/crit_1 +0 -16
  1035. data/test/statements/during/crit_2 +0 -16
  1036. data/test/statements/equal/crit_1 +0 -17
  1037. data/test/statements/equal/crit_2 +0 -21
  1038. data/test/statements/except/anno_1 +0 -13
  1039. data/test/statements/except/anno_2 +0 -14
  1040. data/test/statements/except/count_complex +0 -31
  1041. data/test/statements/except/crit_412_cpt +0 -13
  1042. data/test/statements/except/crit_412_inpatient +0 -13
  1043. data/test/statements/filter/crit_1 +0 -15
  1044. data/test/statements/first/anno_argument +0 -4
  1045. data/test/statements/first/anno_no_upstream +0 -3
  1046. data/test/statements/first/crit_cpt +0 -7
  1047. data/test/statements/first/crit_icd9 +0 -7
  1048. data/test/statements/first/crit_union +0 -14
  1049. data/test/statements/from/anno_has_upstreams +0 -7
  1050. data/test/statements/from/anno_multiple_arguments +0 -5
  1051. data/test/statements/from_seer_visits/anno_multiple_upstreams +0 -17
  1052. data/test/statements/from_seer_visits/anno_no_upstream +0 -3
  1053. data/test/statements/from_seer_visits/crit_1 +0 -10
  1054. data/test/statements/from_seer_visits/crit_2 +0 -11
  1055. data/test/statements/from_seer_visits/crit_3 +0 -11
  1056. data/test/statements/from_seer_visits/crit_4 +0 -12
  1057. data/test/statements/gender/anno_has_upstreams +0 -7
  1058. data/test/statements/gender/crit_male +0 -4
  1059. data/test/statements/hcpcs/anno_bad_format +0 -6
  1060. data/test/statements/hcpcs/crit_A0382 +0 -4
  1061. data/test/statements/icd10/anno_bad_format +0 -5
  1062. data/test/statements/icd10/anno_has_upstreams +0 -7
  1063. data/test/statements/icd10/crit_1 +0 -4
  1064. data/test/statements/icd10pcs/anno_bad_format +0 -6
  1065. data/test/statements/icd10pcs/anno_has_upstreams +0 -7
  1066. data/test/statements/icd10pcs/crit_1 +0 -4
  1067. data/test/statements/icd9/anno_empty_label +0 -7
  1068. data/test/statements/icd9/anno_invalid_code +0 -4
  1069. data/test/statements/icd9/anno_valid_code +0 -4
  1070. data/test/statements/icd9/crit_1 +0 -4
  1071. data/test/statements/icd9_procedure/crit_1 +0 -4
  1072. data/test/statements/intersect/anno_412_inpatient +0 -11
  1073. data/test/statements/intersect/anno_has_arguments +0 -4
  1074. data/test/statements/intersect/anno_no_upstream +0 -3
  1075. data/test/statements/intersect/crit_412_inpatient +0 -11
  1076. data/test/statements/intersect/crit_412_male +0 -11
  1077. data/test/statements/intersect/crit_complex +0 -19
  1078. data/test/statements/invalid/anno_bad_op +0 -13
  1079. data/test/statements/invalid/scanno_1 +0 -7
  1080. data/test/statements/last/crit_icd9 +0 -7
  1081. data/test/statements/loinc/crit_basic +0 -4
  1082. data/test/statements/ndc/crit_basic +0 -4
  1083. data/test/statements/ndc/results_1 +0 -4
  1084. data/test/statements/numeric/anno_multiple_upstreams +0 -11
  1085. data/test/statements/numeric/num_values_1 +0 -4
  1086. data/test/statements/numeric/num_values_2 +0 -8
  1087. data/test/statements/numeric/num_values_3 +0 -8
  1088. data/test/statements/observation_period/anno_has_arguments +0 -8
  1089. data/test/statements/observation_period/anno_multiple_upstreams +0 -11
  1090. data/test/statements/observation_period/count_all_periods +0 -4
  1091. data/test/statements/observation_period/crit_female +0 -7
  1092. data/test/statements/observation_period/crit_icd9 +0 -7
  1093. data/test/statements/observation_period/crit_male +0 -7
  1094. data/test/statements/occurrence/anno_no_upstream +0 -3
  1095. data/test/statements/occurrence/count_412_410 +0 -17
  1096. data/test/statements/occurrence/crit_1 +0 -8
  1097. data/test/statements/occurrence/crit_2 +0 -11
  1098. data/test/statements/occurrence/crit_3 +0 -11
  1099. data/test/statements/one_in_two_out/anno_has_arguments +0 -8
  1100. data/test/statements/one_in_two_out/anno_multiple_upstreams +0 -15
  1101. data/test/statements/one_in_two_out/anno_no_upstream +0 -7
  1102. data/test/statements/one_in_two_out/count_1 +0 -10
  1103. data/test/statements/one_in_two_out/count_same_as_1 +0 -11
  1104. data/test/statements/one_in_two_out/crit_hcpcs +0 -10
  1105. data/test/statements/one_in_two_out/crit_icd9 +0 -11
  1106. data/test/statements/one_in_two_out/results_1 +0 -9
  1107. data/test/statements/one_in_two_out/results_2 +0 -9
  1108. data/test/statements/overlapped_by/crit_1 +0 -16
  1109. data/test/statements/overlapped_by/crit_2 +0 -16
  1110. data/test/statements/overlapped_by/crit_3 +0 -16
  1111. data/test/statements/overlapped_by/crit_4 +0 -16
  1112. data/test/statements/overlaps/crit_1 +0 -16
  1113. data/test/statements/overlaps/crit_2 +0 -16
  1114. data/test/statements/overlaps/crit_3 +0 -16
  1115. data/test/statements/overlaps/crit_4 +0 -16
  1116. data/test/statements/person/anno_has_arguments +0 -4
  1117. data/test/statements/person/anno_multiple_upstreams +0 -11
  1118. data/test/statements/person/count_2 +0 -3
  1119. data/test/statements/person/crit_1 +0 -7
  1120. data/test/statements/person_filter/count_1 +0 -20
  1121. data/test/statements/person_filter/crit_1 +0 -20
  1122. data/test/statements/person_filter/crit_2 +0 -13
  1123. data/test/statements/person_filter/crit_3 +0 -13
  1124. data/test/statements/person_filter/crit_4 +0 -13
  1125. data/test/statements/place_of_service_code/anno_has_upstreams +0 -8
  1126. data/test/statements/place_of_service_code/anno_no_arguments +0 -3
  1127. data/test/statements/place_of_service_code/crit_basic +0 -4
  1128. data/test/statements/place_of_service_filter/anno_1 +0 -8
  1129. data/test/statements/procedure_occurrence/anno_has_arguments +0 -8
  1130. data/test/statements/procedure_occurrence/anno_multiple_upstreams +0 -11
  1131. data/test/statements/procedure_occurrence/count_gender +0 -7
  1132. data/test/statements/procedure_occurrence/count_icd9 +0 -7
  1133. data/test/statements/procedure_occurrence/count_started_by +0 -19
  1134. data/test/statements/provenance/anno_1 +0 -8
  1135. data/test/statements/provenance/anno_bad_keyword +0 -10
  1136. data/test/statements/provenance/count_1 +0 -8
  1137. data/test/statements/provenance/count_2 +0 -8
  1138. data/test/statements/provider_filter/anno_1 +0 -10
  1139. data/test/statements/race/anno_1 +0 -8
  1140. data/test/statements/race/anno_2 +0 -3
  1141. data/test/statements/race/crit_1 +0 -4
  1142. data/test/statements/read/anno_1 +0 -4
  1143. data/test/statements/read/crit_1 +0 -8
  1144. data/test/statements/recall/anno_1 +0 -16
  1145. data/test/statements/recall/anno_2 +0 -18
  1146. data/test/statements/recall/anno_3 +0 -4
  1147. data/test/statements/recall/anno_4 +0 -3
  1148. data/test/statements/recall/anno_5 +0 -5
  1149. data/test/statements/recall/anno_6 +0 -107
  1150. data/test/statements/recall/crit_1 +0 -17
  1151. data/test/statements/recall/crit_2 +0 -14
  1152. data/test/statements/recall/crit_3 +0 -16
  1153. data/test/statements/recall/crit_cte_1 +0 -17
  1154. data/test/statements/recall/crit_cte_2 +0 -17
  1155. data/test/statements/recall/crit_nested_perm_0 +0 -28
  1156. data/test/statements/revenue_code/crit_1 +0 -4
  1157. data/test/statements/revenue_code/crit_basic +0 -4
  1158. data/test/statements/revenue_code/domains_1 +0 -4
  1159. data/test/statements/revenue_code/domains_drg100 +0 -4
  1160. data/test/statements/rxnorm/crit_1 +0 -4
  1161. data/test/statements/snomed/crit_1 +0 -4
  1162. data/test/statements/started_by/crit_1 +0 -16
  1163. data/test/statements/started_by/crit_2 +0 -16
  1164. data/test/statements/started_by/crit_3 +0 -16
  1165. data/test/statements/sum/anno_1 +0 -3
  1166. data/test/statements/sum/anno_2 +0 -8
  1167. data/test/statements/sum/num_1 +0 -11
  1168. data/test/statements/sum/num_2 +0 -15
  1169. data/test/statements/sum/num_3 +0 -7
  1170. data/test/statements/time_window/anno_1 +0 -7
  1171. data/test/statements/time_window/anno_2 +0 -11
  1172. data/test/statements/time_window/anno_3 +0 -11
  1173. data/test/statements/time_window/anno_4 +0 -12
  1174. data/test/statements/time_window/anno_5 +0 -15
  1175. data/test/statements/time_window/crit_1 +0 -11
  1176. data/test/statements/time_window/crit_2 +0 -11
  1177. data/test/statements/time_window/crit_3 +0 -11
  1178. data/test/statements/time_window/crit_4 +0 -11
  1179. data/test/statements/trim_date_end/crit_1 +0 -16
  1180. data/test/statements/trim_date_end/crit_2 +0 -16
  1181. data/test/statements/trim_date_end/crit_3 +0 -16
  1182. data/test/statements/trim_date_end/crit_at_least +0 -17
  1183. data/test/statements/trim_date_end/crit_occurrences_1 +0 -17
  1184. data/test/statements/trim_date_end/crit_occurrences_2 +0 -17
  1185. data/test/statements/trim_date_end/crit_within +0 -17
  1186. data/test/statements/trim_date_start/crit_1 +0 -16
  1187. data/test/statements/trim_date_start/crit_2 +0 -16
  1188. data/test/statements/trim_date_start/crit_3 +0 -16
  1189. data/test/statements/trim_date_start/crit_at_least +0 -17
  1190. data/test/statements/trim_date_start/crit_occurrences_1 +0 -17
  1191. data/test/statements/trim_date_start/crit_occurrences_2 +0 -17
  1192. data/test/statements/trim_date_start/crit_within +0 -17
  1193. data/test/statements/union/anno_1 +0 -11
  1194. data/test/statements/union/anno_2 +0 -18
  1195. data/test/statements/union/anno_3 +0 -3
  1196. data/test/statements/union/anno_4 +0 -4
  1197. data/test/statements/union/anno_5 +0 -7
  1198. data/test/statements/union/anno_6 +0 -10
  1199. data/test/statements/union/count_1 +0 -11
  1200. data/test/statements/union/count_2 +0 -11
  1201. data/test/statements/union/count_3 +0 -15
  1202. data/test/statements/union/count_4 +0 -18
  1203. data/test/statements/union/count_5 +0 -18
  1204. data/test/statements/union/scanno_1 +0 -3
  1205. data/test/statements/union/scanno_2 +0 -18
  1206. data/test/statements/visit_occurrence/anno_1 +0 -11
  1207. data/test/statements/visit_occurrence/anno_2 +0 -8
  1208. data/test/statements/visit_occurrence/crit_1 +0 -7
  1209. data/test/statements/visit_occurrence/crit_2 +0 -7
  1210. data/test/statements/visit_occurrence/crit_3 +0 -3
@@ -0,0 +1,206 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module ConceptQL
6
+ module Behaviors
7
+ module Utilizable
8
+ extend ActiveSupport::Concern
9
+ include ConceptQL::Behaviors::Windowable
10
+
11
+ included do
12
+ domains :condition_occurrence
13
+ category "Select by Property"
14
+ basic_type :selection
15
+ validate_no_upstreams
16
+ validate_no_arguments
17
+
18
+ require_column :admission_date
19
+ require_column :discharge_date
20
+ require_column :length_of_stay
21
+ require_column :admission_source_value
22
+ require_column :admission_source_description
23
+ require_column :discharge_location_source_value
24
+ require_column :discharge_location_source_description
25
+ require_column :primary_concept_id
26
+ end
27
+
28
+ def column_family
29
+ "inpatient"
30
+ end
31
+
32
+ # The operators that include this register for gdm and gdm_wide only.
33
+ def query(db)
34
+ gdm_it(db)
35
+ end
36
+
37
+ def collection_type
38
+ raise NotImplementedError
39
+ end
40
+
41
+ # With the Database's share_utilization option, the list is read from a
42
+ # table that every statement on the Database shares. The WITH entry only
43
+ # carries the list to Scope#with_ctes, which takes it out of the SQL and
44
+ # creates the table when the query first reads rows.
45
+ def evaluate(db)
46
+ cdb = nodifier.cdb
47
+ return super unless cdb.opts[:share_utilization]
48
+
49
+ list = select_it(query(db))
50
+ name = cdb.shared_utilization_table(list, scope)
51
+ db[name].with(name, list, Scope::SHARED_TABLE => true)
52
+ end
53
+
54
+ def gdm_it(db)
55
+ source_type_id = dm.concept_ids(db, dm.file_provenance_types_vocab, collection_type)
56
+ all_source_type_ids = dm.descendants_of(db, source_type_id)
57
+ primary_id = dm.concept_ids(db, dm.code_provenance_types_vocab, "primary")
58
+ all_primary_ids = dm.descendants_of(db, primary_id)
59
+ # condition_vocabularies = dm.vocabularies_query.where(domain: 'condition_occurrence').select_map(:id)
60
+
61
+ return gdm_wide_it(db, all_primary_ids, all_source_type_ids) if wide?
62
+
63
+ # Get primary diagnosis codes
64
+ primary_concepts = rdbms.primary_concepts(db, all_primary_ids)
65
+
66
+ relevant_contexts = db[Sequel[:contexts].as(:cn)]
67
+ .where(Sequel[:cn][:source_type_concept_id] => all_source_type_ids)
68
+ .select(:collection_id)
69
+
70
+ db[:collections].from_self(alias: :cl)
71
+ .then { |cl| restrict_to_window_persons(cl, Sequel[:cl][:patient_id]) }
72
+ .join(:admission_details, { Sequel[:ad][:id] => Sequel[:cl][:admission_detail_id] }, table_alias: :ad)
73
+ .left_join(dm.name_concepts_table(db), { Sequel[:ad][:admit_source_concept_id] => Sequel[:asc][:id] }, table_alias: :asc)
74
+ .left_join(dm.name_concepts_table(db), { Sequel[:ad][:discharge_location_concept_id] => Sequel[:dlc][:id] }, table_alias: :dlc)
75
+ .left_join(primary_concepts, { Sequel[:pcon][:collection_id] => Sequel[:cl][:id] }, table_alias: :pcon)
76
+ .where(Sequel[:cl][:id] => relevant_contexts)
77
+ .select(
78
+ Sequel[:cl][:start_date].as(:collection_start_date),
79
+ Sequel[:cl][:end_date].as(:collection_end_date),
80
+ Sequel[:ad][:admission_date].as(:admission_date),
81
+ Sequel[:ad][:discharge_date].as(:discharge_date),
82
+ Sequel[:asc][:concept_code].as(:admission_source_value),
83
+ Sequel[:asc][:concept_text].as(:admission_source_description),
84
+ Sequel[:dlc][:concept_code].as(:discharge_location_source_value),
85
+ Sequel[:dlc][:concept_text].as(:discharge_location_source_description),
86
+ Sequel[:pcon][:concept_id].as(:primary_concept_id),
87
+ Sequel[:pcon][:concept_code].as(:source_value),
88
+ Sequel[:pcon][:vocabulary_id].as(:source_vocabulary_id),
89
+ Sequel[:cl][:patient_id].as(:patient_id),
90
+ Sequel[:cl][:id].as(:collection_id)
91
+ )
92
+ .select_append(Sequel[:ROW_NUMBER].function.over(
93
+ partition: [ :admission_detail_id ],
94
+ order: [
95
+ Sequel[:pcon][:is_primary].desc,
96
+ Sequel[:cl][:id],
97
+ Sequel[:pcon][:concept_code]
98
+ ]
99
+ ).as(:nummy))
100
+ .from_self
101
+ .where(nummy: 1)
102
+ end
103
+
104
+ def gdm_wide_it(db, all_primary_ids, all_source_type_ids)
105
+ # Emit `CASE WHEN provenance_concept_id IN (...) THEN 1 ELSE 0 END`.
106
+ # The previous multi-WHEN form (`Sequel.case({{prov=>id1}=>1, {prov=>id2}=>1, ...}, 0)`)
107
+ # is mis-evaluated by Spark 3.3.2 when its result feeds the outer
108
+ # `CASE is_primary WHEN 1 THEN col ELSE NULL END` below. See conceptql-pk7.
109
+ is_primary =
110
+ if all_primary_ids.empty?
111
+ Sequel[0]
112
+ else
113
+ Sequel.case(
114
+ [ [ { Sequel[:provenance_concept_id] => all_primary_ids }, 1 ] ],
115
+ 0
116
+ )
117
+ end
118
+
119
+ db[:observations]
120
+ .then { |observations| restrict_to_window_persons(observations, :patient_id) }
121
+ .where(source_type_concept_id: all_source_type_ids)
122
+ .exclude(admit_admission_date: nil)
123
+ .select_append(
124
+ is_primary.as(:is_primary)
125
+ )
126
+ .from_self
127
+ # One admission has many rows with the same concept on different
128
+ # line dates. The unique id ends the ORDER BY so the kept row is the
129
+ # same on every run, and admission_end_date takes the latest end_date
130
+ # over all of the admission's rows, not the kept row's. See conceptql-evk.
131
+ .select_append(
132
+ Sequel[:ROW_NUMBER].function.over(
133
+ partition: [ :admission_detail_id ],
134
+ order: [ Sequel[:is_primary].desc, Sequel[:collection_id], Sequel[:clinical_code_concept_id], Sequel[:id] ]
135
+ ).as(:nummy),
136
+ Sequel.function(:max, :end_date).over(partition: [ :admission_detail_id ]).as(:admission_end_date)
137
+ )
138
+ .from_self
139
+ .where(nummy: 1)
140
+ .from_self
141
+ .left_join(dm.name_concepts_table(db), { Sequel[:admit_source_concept_id] => Sequel[:asc][:id] }, table_alias: :asc)
142
+ .left_join(dm.name_concepts_table(db), { Sequel[:discharge_location_concept_id] => Sequel[:dlc][:id] }, table_alias: :dlc)
143
+ .select_append(
144
+ Sequel[:asc][:concept_code].as(:admission_source_value),
145
+ Sequel[:asc][:concept_text].as(:admission_source_description),
146
+ Sequel[:dlc][:concept_code].as(:discharge_location_source_value),
147
+ Sequel[:dlc][:concept_text].as(:discharge_location_source_description),
148
+ Sequel.case({ 1 => :clinical_code_concept_id }, nil, :is_primary).as(:primary_concept_id),
149
+ Sequel.case({ 1 => :clinical_code_source_value }, nil, :is_primary).as(:source_value),
150
+ Sequel.case({ 1 => :clinical_code_vocabulary_id }, nil, :is_primary).as(:source_vocabulary_id)
151
+ )
152
+ .from_self
153
+ end
154
+
155
+ # Keep only the persons that the scope's table windows cover, before the
156
+ # ROW_NUMBER over admission_detail_id. Without this, Spark numbers every
157
+ # inpatient row in the database and applies the window join afterwards.
158
+ # Output is unchanged because one admission never belongs to two persons
159
+ # (Ryan, 2026-10-14), so each ROW_NUMBER partition is kept or dropped whole.
160
+ def restrict_to_window_persons(ds, person_column)
161
+ return ds if skip_windows?
162
+
163
+ scope.windows.grep(Window::Table).inject(ds) do |restricted, window|
164
+ restricted.where(person_column => window.person_ids(restricted.db))
165
+ end
166
+ end
167
+
168
+ def table
169
+ :collections
170
+ end
171
+
172
+ def override_columns
173
+ return unless gdm?
174
+
175
+ {
176
+ length_of_stay: (rdbms.days_between(Sequel[:admission_date],
177
+ discharge_date_column) + 1).as(:length_of_stay),
178
+ criterion_table: Sequel.cast_string("collections").as(:criterion_table),
179
+ criterion_domain: Sequel.cast_string("condition_occurrence").as(:criterion_domain),
180
+ admission_source_value: Sequel[:admission_source_value],
181
+ admission_source_description: Sequel[:admission_source_description],
182
+ discharge_location_source_value: Sequel[:discharge_location_source_value],
183
+ discharge_location_source_description: Sequel[:discharge_location_source_description],
184
+ admission_date: Sequel[:admission_date],
185
+ discharge_date: discharge_date_column.as(:discharge_date),
186
+ person_id: Sequel[:patient_id].as(:person_id),
187
+ criterion_id: Sequel[:collection_id].as(:criterion_id),
188
+ start_date: Sequel[:collection_start_date].as(:start_date),
189
+ end_date: Sequel[:collection_end_date].as(:end_date),
190
+ primary_concept_id: Sequel[:primary_concept_id],
191
+ source_value: Sequel[:source_value].as(:source_value),
192
+ source_vocabulary_id: Sequel[:source_vocabulary_id].as(:source_vocabulary_id)
193
+ }
194
+ end
195
+
196
+ # gdm_wide's AdmissionDateQueryModifier falls back to the kept row's own
197
+ # end_date when the admission has no discharge date. An admission falls
198
+ # back to its latest end_date instead (Ryan, 2026-10-16). See conceptql-evk.
199
+ def discharge_date_column
200
+ return Sequel[:discharge_date] unless wide?
201
+
202
+ Sequel.function(:coalesce, :admit_discharge_date, :admission_end_date, :discharge_date)
203
+ end
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ConceptQL
4
+ module Behaviors
5
+ # Applies scope windows to Operators
6
+ module Windowable
7
+ def select_it(query, opts = {})
8
+ ds = super
9
+ return ds if skip_windows?
10
+
11
+ scope.windows.each do |window|
12
+ ds = window.call(self, ds, timeless: timeless?)
13
+ end
14
+
15
+ ds
16
+ end
17
+
18
+ def skip_windows?
19
+ false
20
+ end
21
+
22
+ def timeless?
23
+ false
24
+ end
25
+ end
26
+ end
27
+ end
data/lib/conceptql/cli.rb CHANGED
@@ -1,43 +1,46 @@
1
- $: << "lib"
1
+ # frozen_string_literal: true
2
2
 
3
- require 'thor'
4
- require 'sequelizer'
5
- require 'json'
6
- require 'pp'
7
- require 'csv'
8
- require_relative 'query'
9
- require_relative 'knitter'
3
+ $LOAD_PATH << "lib"
4
+
5
+ require "thor"
6
+ require "sequelizer"
7
+ require "json"
8
+ require "csv"
9
+ require "logger"
10
+ require "conceptql"
11
+ require_relative "query"
10
12
 
11
13
  module ConceptQL
12
14
  class CLI < Thor
13
15
  include Sequelizer
14
16
 
15
17
  class_option :adapter,
16
- aliases: :a,
17
- desc: 'adapter for database'
18
+ aliases: :a,
19
+ desc: "adapter for database"
18
20
  class_option :host,
19
- aliases: :h,
20
- banner: 'localhost',
21
- desc: 'host for database'
21
+ aliases: :h,
22
+ banner: "localhost",
23
+ desc: "host for database"
22
24
  class_option :username,
23
- aliases: :u,
24
- desc: 'username for database'
25
+ aliases: :u,
26
+ desc: "username for database"
25
27
  class_option :password,
26
- aliases: :P,
27
- desc: 'password for database'
28
+ aliases: :P,
29
+ desc: "password for database"
28
30
  class_option :port,
29
- aliases: :p,
30
- type: :numeric,
31
- banner: '5432',
32
- desc: 'port for database'
31
+ aliases: :p,
32
+ type: :numeric,
33
+ banner: "5432",
34
+ desc: "port for database"
33
35
  class_option :database,
34
- aliases: :d,
35
- desc: 'database for database'
36
+ aliases: :d,
37
+ desc: "database for database"
36
38
  class_option :search_path,
37
- aliases: :s,
38
- desc: 'schema for database (PostgreSQL only)'
39
+ aliases: :s,
40
+ desc: "schema for database (PostgreSQL only)"
39
41
 
40
- desc 'run_statement statement_file', 'Reads the ConceptQL statement from the statement file and executes it against the DB'
42
+ desc "run_statement statement_file",
43
+ "Reads the ConceptQL statement from the statement file and executes it against the DB"
41
44
  def run_statement(statement_file)
42
45
  q = cdb(options).query(criteria_from_file(statement_file))
43
46
  puts q.sql
@@ -45,79 +48,85 @@ module ConceptQL
45
48
  pp q.query.all
46
49
  end
47
50
 
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
52
- end
53
-
54
- desc 'show_graph statement_file', 'Reads the ConceptQL statement from the file and shows the contents as a ConceptQL graph'
55
- option :watch_file
56
- def show_graph(file)
57
- graph_it(criteria_from_file(file))
58
- system('open /tmp/graph.pdf')
51
+ desc "analyze statement_file",
52
+ "Reads the ConceptQL statement from the statement file and executes EXPLAIN ANALYZE against the DB"
53
+ def analyze(statement_file)
54
+ q = cdb(options).query(criteria_from_file(statement_file))
55
+ puts JSON.pretty_generate(q.statement)
56
+ puts q.sql(:formatted, :create_tables)
57
+ q.db.logger = db.loggers + [ Logger.new($stdout).tap { |l| l.level = Logger::INFO } ]
58
+ puts q.analyze
59
59
  end
60
60
 
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'
62
- option :full
63
- option :watch_file
64
- def show_and_tell_file(file)
65
- show_and_tell(criteria_from_file(file), options)
61
+ desc "sql statement_file", "Reads the ConceptQL statement from the statement file and prints the SQL out"
62
+ def sql(statement_file)
63
+ q = cdb(options).query(criteria_from_file(statement_file))
64
+ puts q.sql(:formatted, :create_tables)
66
65
  end
67
66
 
68
- desc 'fake_graph file', 'Reads the ConceptQL statement from the file and shows the contents as a ConceptQL graph'
69
- def fake_graph(file)
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')
74
- system('open /tmp/graph.pdf')
67
+ desc "code_list statement_file",
68
+ "Reads the ConceptQL statement from the statement file and prints the code list out"
69
+ def code_list(statement_file)
70
+ q = cdb(options).query(criteria_from_file(statement_file))
71
+ puts q.code_list
75
72
  end
76
73
 
77
- desc 'metadata', 'Generates the metadata.js file for the JAM'
78
- def metadata
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")
74
+ desc "annotate_statement", "Reads in a statement and annotates it"
75
+ def annotate_statement(statement_file)
76
+ q = ConceptQL::Query.new(cdb(options), criteria_from_file(statement_file))
77
+ pp q.annotate(skip_counts: true)
78
+ end
79
+
80
+ desc "scope_annotate", "Reads in a statement and annotates it"
81
+ def scope_annotate(statement_file)
82
+ q = ConceptQL::Query.new(cdb(options), criteria_from_file(statement_file))
83
+ pp q.scope_annotate(skip_counts: true)
84
+ end
85
+
86
+ desc "render_json STATEMENT_FILE",
87
+ "Prints the statement(s) as a #{ConceptQL::Diagram::FORMAT} render tree (JSON) for the diagram renderer"
88
+ long_desc <<~DESC
89
+ STATEMENT_FILE holds one ConceptQL statement or an array of them (.json, or Ruby for any other extension).
90
+ Prints {"format": "#{ConceptQL::Diagram::FORMAT}", "statements": [<node>, ...]}, one node per statement.
91
+
92
+ Without --counts no claims database is used. With --counts each node gains
93
+ "counts": {<domain>: {"rows": Integer, "n": Integer}}, computed against the database
94
+ given by the connection options (or sequelizer's configuration).
95
+ DESC
96
+ option :counts, type: :boolean, default: false, desc: "annotate with per-domain row/person counts (needs a DB)"
97
+ option :data_model, desc: "data model: gdm, gdm_wide, omopv4_plus (default: $CONCEPTQL_DATA_MODEL or gdm)"
98
+ def render_json(statement_file)
99
+ cdb = if options[:counts]
100
+ ConceptQL::Database.new(db(options.except("counts", "data_model")),
101
+ { data_model: options[:data_model] }.compact)
102
+ else
103
+ ConceptQL::Diagram.default_cdb(options[:data_model])
83
104
  end
105
+ doc = ConceptQL::Diagram.render(criteria_from_file(statement_file), cdb: cdb, counts: options[:counts])
106
+ puts JSON.pretty_generate(doc)
84
107
  end
85
108
 
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
109
+ desc "metadata", "Generates the metadata.js file for the JAM"
110
+ def metadata
111
+ json = ConceptQL.metadata(cdb(options), warn: true).to_json
112
+ File.write("metadata.js", "$metadata = #{json};")
113
+ File.write("metadata.json", json)
114
+ return unless system("which", "json_pp", out: File::NULL, err: File::NULL)
95
115
 
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
116
+ system("cat metadata.json | json_pp", out: "metadata_pp.json")
104
117
  end
105
118
 
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
119
+ desc "simple_visit STATEMENT_FILE",
120
+ "Prints the operators, depth and selection-node count of the statement in STATEMENT_FILE"
121
+ def simple_visit(statement_file)
122
+ pp cdb(options).query(criteria_from_file(statement_file)).extract_metadata
114
123
  end
115
124
 
116
- desc 'dumpit', 'Dumps out test data into CSVs'
125
+ desc "dumpit", "Dumps out test data into CSVs"
117
126
  def dumpit(path)
118
127
  path = Pathname.new(path)
119
128
  path.mkpath unless path.exist?
120
- headers_path = path + 'headers'
129
+ headers_path = path / "headers"
121
130
  headers_path.mkpath unless headers_path.exist?
122
131
  db.tables.each do |table|
123
132
  puts "Dumping #{table}..."
@@ -133,68 +142,24 @@ module ConceptQL
133
142
  end
134
143
 
135
144
  private
136
- desc 'show_and_tell_db conceptql_id', 'Fetches the ConceptQL from a DB and shows the contents as a ConceptQL graph, then executes the statement against our test database'
137
- option :full
138
- option :watch_file
139
- def show_and_tell_db(conceptql_id)
140
- result = fetch_conceptql(conceptql_id, options)
141
- puts "Concept: #{result[:label]}"
142
- show_and_tell(result[:statement].to_hash, options, result[:label])
143
- end
144
-
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'
146
- def show_db_graph(conceptql_id)
147
- result = fetch_conceptql(conceptql_id, options)
148
- graph_it(result[:statement], db, result[:label])
149
- end
150
-
151
- def fetch_conceptql(conceptql_id)
152
- my_db = db(options)
153
- my_db.extension(:pg_array, :pg_json)
154
- my_db[:concepts].where(concept_id: conceptql_id).select(:statement, :label).first
155
- end
156
-
157
- def show_and_tell(statement, options, title = nil)
158
- my_db = db(options)
159
- q = ConceptQL::Query.new(my_db, statement)
160
- statement = q.annotate
161
- puts 'JSON'
162
- puts JSON.pretty_generate(statement)
163
- graph_it(statement, title)
164
- STDIN.gets
165
- puts q.sql
166
- STDIN.gets
167
- results = q.all
168
- if options[:full]
169
- pp results
170
- else
171
- pp filtered(results)
172
- end
173
- puts results.length
174
- end
175
-
176
- def graph_it(statement, title = nil)
177
- my_db = db(options)
178
- q = ConceptQL::Query.new(my_db, statement).annotate
179
- ConceptQL::AnnotateGrapher.new.graph_it(q, '/tmp/graph.pdf')
180
- end
181
145
 
182
146
  def criteria_from_file(file)
183
147
  case File.extname(file)
184
- when '.json'
148
+ when ".json"
185
149
  JSON.parse(File.read(file))
186
150
  else
187
151
  eval(File.read(file))
188
152
  end
189
153
  end
190
154
 
191
- def filtered(results)
192
- results.each { |r| r.delete_if { |k,v| v.nil? } }
193
- end
194
-
195
155
  def cdb(options)
196
- ConceptQL::Database.new(db(options))
156
+ data_db = db(options)
157
+ cdb = ConceptQL::Database.new(data_db)
158
+ # A glob of directories, in search path order: "/data/{wide,slim}".
159
+ if (parquet_dirs = ENV["CONCEPTQL_PARQUET_TEST_DIR"])
160
+ data_db.make_ready(search_path: Dir[parquet_dirs].map { |dir| Pathname.new(dir).glob("*.parquet") })
161
+ end
162
+ cdb
197
163
  end
198
164
  end
199
165
  end
200
-
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ConceptQL
4
+ class Columnizer
5
+ class ColumnDefinition
6
+ attr_reader :name, :options
7
+
8
+ def initialize(name, options)
9
+ @name = name
10
+ @options = options
11
+ end
12
+
13
+ def grouped?
14
+ options[:grouped]
15
+ end
16
+
17
+ def sequelized
18
+ col = name
19
+ if (q = options[:qualifier])
20
+ col = Sequel.qualify(q, col)
21
+ end
22
+
23
+ if (fun = options[:function])
24
+ col = Sequel.function(fun, col)
25
+ end
26
+
27
+ unless options[:no_alias]
28
+ n = extract_name(name)
29
+ col = Sequel.expr(col).as(n) if n.present?
30
+ end
31
+
32
+ col
33
+ end
34
+
35
+ def extract_name(name)
36
+ return name if name.is_a?(Symbol)
37
+
38
+ n = nil
39
+ n = name.column if name.respond_to?(:column)
40
+ return n unless n.blank?
41
+
42
+ n = name.table if name.respond_to?(:table)
43
+ return n unless n.blank?
44
+
45
+ extract_name(name.expr) if name.respond_to?(:expr)
46
+ end
47
+ end
48
+
49
+ attr_reader :columns
50
+
51
+ def initialize
52
+ @columns = {}
53
+ end
54
+
55
+ def add_columns(*column_names)
56
+ opts = ConceptQL::Utils.extract_opts!(column_names)
57
+ column_names.each do |column_name|
58
+ columns[column_name] = ColumnDefinition.new(column_name, opts)
59
+ end
60
+ end
61
+
62
+ def apply(query)
63
+ grouped, ungrouped = columns.values.partition(&:grouped?)
64
+ select_method = :select
65
+ unless grouped.empty?
66
+ query = query.select_group(*grouped.map(&:sequelized))
67
+ select_method = :select_append
68
+ end
69
+
70
+ return query if ungrouped.empty?
71
+
72
+ query.send(select_method, *ungrouped.map(&:sequelized))
73
+ end
74
+ end
75
+ end