conceptql 0.3.0 → 0.4.1

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 (1208) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +228 -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 +168 -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 +21 -0
  107. data/lib/conceptql/rdbms/generic.rb +116 -0
  108. data/lib/conceptql/rdbms/postgres.rb +47 -0
  109. data/lib/conceptql/rdbms/spark.rb +18 -0
  110. data/lib/conceptql/rdbms.rb +22 -0
  111. data/lib/conceptql/scope.rb +353 -41
  112. data/lib/conceptql/utils.rb +70 -0
  113. data/lib/conceptql/utils_cli.rb +17 -0
  114. data/lib/conceptql/version.rb +3 -1
  115. data/lib/conceptql/visitors/metadata_extractor.rb +54 -0
  116. data/lib/conceptql/vocabularies/behaviors/costish.rb +24 -0
  117. data/lib/conceptql/vocabularies/behaviors/gdmish.rb +19 -0
  118. data/lib/conceptql/vocabularies/behaviors/omopish.rb +32 -0
  119. data/lib/conceptql/vocabularies/dynamic_vocabularies.rb +63 -0
  120. data/lib/conceptql/vocabularies/entry.rb +138 -0
  121. data/lib/conceptql/vocabularies/vocabulary_class_factory.rb +85 -0
  122. data/lib/conceptql/window/base.rb +26 -0
  123. data/lib/conceptql/window/date_range.rb +25 -0
  124. data/lib/conceptql/window/table.rb +116 -0
  125. data/lib/conceptql/window.rb +72 -0
  126. data/lib/conceptql.rb +53 -10
  127. data/lib/sequel/extensions/pg_ctas_explain.rb +22 -0
  128. data/lib/sequel/extensions/pg_vacuum_table.rb +23 -0
  129. data/schemas/gdm.yml +882 -0
  130. data/schemas/gdm_wide.yml +757 -0
  131. data/schemas/ohdsi_vocabs.yml +143 -0
  132. data/schemas/omopv4_plus.yml +729 -0
  133. data/schemas/omopv4_plus_more_ignorables.tsv +13 -0
  134. metadata +271 -2065
  135. data/.gitignore +0 -25
  136. data/Gemfile +0 -6
  137. data/Guardfile +0 -56
  138. data/LICENSE.txt +0 -22
  139. data/Rakefile +0 -35
  140. data/conceptql.gemspec +0 -31
  141. data/doc/ConceptQL Specification (alpha).pdf +0 -0
  142. data/doc/converter.rb +0 -33
  143. data/doc/diagram_0.png +0 -0
  144. data/doc/implementation_notes.md +0 -39
  145. data/doc/metadata.md +0 -89
  146. data/doc/spec/02f44ad35d266ddd0a4df1691d26bf4a297b30604fc3f44b0391d6d852d23a9f.png +0 -0
  147. data/doc/spec/0360fc0c2b7a88fd82ffc4d13387b76766649d5d42aa8f9349bbf60a81ac6119.png +0 -0
  148. data/doc/spec/04491942fcbd741982514f9eb12aeecf3d54b5b69a2b50c8331f7700169d5521.png +0 -0
  149. data/doc/spec/05f9b844571ffceeed2def3025fb60c68552817b8b73d3c8a76939dbc08b7c65.png +0 -0
  150. data/doc/spec/067241a3579767a802d4f8e20fd35b60adbe377c9a6512ef135f164a5accfb27.png +0 -0
  151. data/doc/spec/1102fa717b1c2df67af5220bf3ae219afafd79be7bba0c117e301983385ada52.png +0 -0
  152. data/doc/spec/11f57941951bad5a75f9a16f38a31a3c6bf3046a475aac6e398e780892fab4ad.png +0 -0
  153. data/doc/spec/15268bc45993d3f57ccf915877f91e48bdee684f24faa614249915833cac4af9.png +0 -0
  154. data/doc/spec/253845fe6162621af407ebd110296ff4f6d8a3f23ec75dfb4ea8cda30be71262.png +0 -0
  155. data/doc/spec/26fd52b5ac55438dd9f81b4a3f3913f1058c9f225c8a5e129007c1e9413d5881.png +0 -0
  156. data/doc/spec/2b57886a9cba66bb696e4b399c51ad0dc95cd64b952709fafc819a79d573f09e.png +0 -0
  157. data/doc/spec/307a8b5a7edd6e42f8be16523a4c939faf1a0533385c861d7004b6af8addd7d1.png +0 -0
  158. data/doc/spec/328467a6a419c7c05e299b8097e5e000686068ded8dc6d5f2e2de6f51976c315.png +0 -0
  159. data/doc/spec/39d6a8eb71cae51b1d6937c97134e51f04fd47c54535ff0915fe6a8b4f197fb2.png +0 -0
  160. data/doc/spec/3f46dee4d775d1a29d52b68af6552f8ea3abd8303094e749714fc77bd7958155.png +0 -0
  161. data/doc/spec/44ec6743d5d77d15b8a487c2058bf3e455d34adc91c46ea05767f6e0e471a75e.png +0 -0
  162. data/doc/spec/462153be527b28dc2cb5259c0aec62e1f529e8b60dc6e9c23fd1e06e8be933c9.png +0 -0
  163. data/doc/spec/4a3b47ed1c54f96ebdae693d41c36c51884c4546ef799a4108085708fb7b964e.png +0 -0
  164. data/doc/spec/514f263e976d07c0d9e0a86c79bcbdcddc7d444d7b72135294ad78758effd28f.png +0 -0
  165. data/doc/spec/58113a57a37431a402d2547369eba3a481bf1dbbfd82dc384406a5c91f6df01f.png +0 -0
  166. data/doc/spec/5d331d74c460d75814b2d3138a9b7d90b5ddb2dcd85e1f5f260d183745fc3a1e.png +0 -0
  167. data/doc/spec/5d6ff62038b75d6f240d65f35d1520a131c221f47d3801554c8c2be5d528ebb0.png +0 -0
  168. data/doc/spec/62323426e381ec21c967971a67e1f4a6d89dae92154bd937284e00b67f67fdd3.png +0 -0
  169. data/doc/spec/6705af65d728c0d5c50d6c4d46253017a91eb459dbb1f40f92449f05d5562f4a.png +0 -0
  170. data/doc/spec/68fac940a32c7e40caacf8e560c61da552d57633d015ba98f2e98ec040a00c5b.png +0 -0
  171. data/doc/spec/6a34c0ef589c9c976fe41f3e67e799e198499f5b9c3ebfd240fb91f73e893573.png +0 -0
  172. data/doc/spec/6b48534236697d1ccfa1f5403764782f9d228f9eb706789cfa80203882b7b13a.png +0 -0
  173. data/doc/spec/7aa76b4d29874719466c2cbafc9936e9f12e504bf31e1a09d26ca3fffa8ba1a6.png +0 -0
  174. data/doc/spec/7b9db2986ab9ada45cfb9451ef87ff1a2d99c908083334b7ccdceb8a92387fa9.png +0 -0
  175. data/doc/spec/8101d9b89d9ba8070d585432707b43a8acdb4c2a3e9d37c3f7114b5e3ea9e800.png +0 -0
  176. data/doc/spec/886bf85249a704668a55c5161bceaac10be4a41a94b91606f49851dfa017526c.png +0 -0
  177. data/doc/spec/8ed478d8c81a58a202d0c51348fca246df206fc24a0567b163d4e0bdab56ca46.png +0 -0
  178. data/doc/spec/9139440329dcb815df89bc70182c3827868402a74ff64d0253706dcaff723dca.png +0 -0
  179. data/doc/spec/99392f56dfb0e5be3f45a12a7f1ba846d094e430f526dfeaa30b606837cd34c0.png +0 -0
  180. data/doc/spec/a4450e8c0fe0e2fde92fe9bd61952f907b1976c1aa3ba963b809bed079d42b09.png +0 -0
  181. data/doc/spec/a4bc7382a1154ea9856544fd48418f3dd9ce474ca94b8859fc323749c6cc1f55.png +0 -0
  182. data/doc/spec/a79274742cf6fac6f6c9f4a0eb651aeb452f9c43b537c8e6ccaefecd05b7105c.png +0 -0
  183. data/doc/spec/a9b4528726adec2a90f3f00139d8d0492f13c51f03c2f9ed6a5134b1b26b44a9.png +0 -0
  184. data/doc/spec/af5ae3787e80bf0771f18f1a04fe4c5d9291e1e0f963ac408a7bc198d2f1ee28.png +0 -0
  185. data/doc/spec/ba572c4f4dbade65be55f141df16cf7b3e7d09e0aec4e4e5debc4f2075277371.png +0 -0
  186. data/doc/spec/ba90ef705f7be91c53c5eb4a81a439fa0f7c48532214bd3db3cc5c069160543e.png +0 -0
  187. data/doc/spec/c1d0402862221d85aceedc7d76b3f82149b612cbd972f14d0ca9011e1e2c455c.png +0 -0
  188. data/doc/spec/c2157d8a6b73abe4f22ba5042159f32502c74bf6d762be28d2df6831586822c7.png +0 -0
  189. data/doc/spec/c5329a7f4937096a57b2e01efb9d542f84a4e2329a1e9381d08c630583ccad37.png +0 -0
  190. data/doc/spec/c82077b9455d0f9abc2c45ee1a298e38b99c9ce9cd685f65d87b376d7718d7ad.png +0 -0
  191. data/doc/spec/c93dd18894a245a5647f99e1867d3779e4cd34c9c8f8860600ff0c837a5ffa53.png +0 -0
  192. data/doc/spec/cc960a268d51ccf2ebde657d36848f780213834844900018bce3d111843f7b0f.png +0 -0
  193. data/doc/spec/d39452b58257c95a7cba07afed4877417b0c227f3690e2bff22c9eca89eac845.png +0 -0
  194. data/doc/spec/d64993258ffbef9406d9ab9136de7af530626b3a69e9eeb75835e11f11dabf62.png +0 -0
  195. data/doc/spec/da450cdd0c94a1301bd98560339a45caa8041e09974352a56ecfb144e9a5e4d4.png +0 -0
  196. data/doc/spec/dbc66b3ae6bd7123d77dd04b64f8a24498d048725a55c5340b15f5ae0a1ff307.png +0 -0
  197. data/doc/spec/de589af36fa854e006a1563c93e644e2210f2a5616babb779f7f38aadb6c1ed7.png +0 -0
  198. data/doc/spec/defbd0b853d895802663f507761ad297d82e167f516c6082686a2a19b76012c5.png +0 -0
  199. data/doc/spec/e1cb0863b21e14256d61a54200316791f6547c78ba2f0156c110f4500f9bbd49.png +0 -0
  200. data/doc/spec/e8630103287f7c9d28eff40b3b1826e24846e776b877f7b8554257acbe621e1c.png +0 -0
  201. data/doc/spec/e9b384fa7dec5f1a06479c4b289e06b1e60e4f23f7630aff6d03c52595f500f8.png +0 -0
  202. data/doc/spec/ea935ac31f3b57ff373646780a1fba34a38c9e086dc771eb7fc16c65a7e20cfc.png +0 -0
  203. data/doc/spec/eb8f5511f7d88bd0f8ba73420fc10f7c78405db7f4373d778a827058707f888e.png +0 -0
  204. data/doc/spec/ebacbd092e3d1a3c7b745a381e51e8ff9d63a21db23a16940193e18e57bc866f.png +0 -0
  205. data/doc/spec/ed039f82867241393b1a6a7153d3690461103934c72c1f3eaa3d99a12bb40885.png +0 -0
  206. data/doc/spec/ee283d6a4b69cf10da2df703be3a16830be9cd8cd4f68c5f7afdf558ea28fa76.png +0 -0
  207. data/doc/spec/f0c734b099841a754ae0366afb00e992ad4814479b65e4a7de23c6e3dd85c09a.png +0 -0
  208. data/doc/spec/f6b4fc31703cfb6327bbbd4614af8bb72da6d39fa3d53ada63a70157f2fad80e.png +0 -0
  209. data/doc/spec/f766f2e3aa13420e3ba0f823ac7956b311ed7c6c20be26b72324fadd87f36712.png +0 -0
  210. data/doc/spec/ff7d5b5573d09bd7c4cdd3aeda124d18bf82ec46673a62881b399a75d69f3f53.png +0 -0
  211. data/doc/spec.md +0 -2258
  212. data/doc/spec.md.cql +0 -1930
  213. data/lib/conceptql/annotate_grapher.rb +0 -127
  214. data/lib/conceptql/fake_annotater.rb +0 -129
  215. data/lib/conceptql/knitter.rb +0 -221
  216. data/lib/conceptql/logger.rb +0 -10
  217. data/lib/conceptql/operators/complement.rb +0 -43
  218. data/lib/conceptql/operators/condition_occurrence_source_vocabulary_operator.rb +0 -34
  219. data/lib/conceptql/operators/condition_occurrence_source_vocabulary_operator_union.rb +0 -28
  220. data/lib/conceptql/operators/condition_type.rb +0 -79
  221. data/lib/conceptql/operators/cpt.rb +0 -28
  222. data/lib/conceptql/operators/cpt_or_hcpcs.rb +0 -27
  223. data/lib/conceptql/operators/drg.rb +0 -42
  224. data/lib/conceptql/operators/drug_type_concept.rb +0 -30
  225. data/lib/conceptql/operators/from_seer_visits.rb +0 -29
  226. data/lib/conceptql/operators/hcpcs.rb +0 -28
  227. data/lib/conceptql/operators/icd10.rb +0 -19
  228. data/lib/conceptql/operators/icd10_pcs.rb +0 -28
  229. data/lib/conceptql/operators/icd9.rb +0 -19
  230. data/lib/conceptql/operators/icd9_procedure.rb +0 -28
  231. data/lib/conceptql/operators/intersect.rb +0 -39
  232. data/lib/conceptql/operators/loinc.rb +0 -28
  233. data/lib/conceptql/operators/medcode.rb +0 -17
  234. data/lib/conceptql/operators/medcode_procedure.rb +0 -28
  235. data/lib/conceptql/operators/ndc.rb +0 -32
  236. data/lib/conceptql/operators/observation_by_enttype.rb +0 -32
  237. data/lib/conceptql/operators/observation_period.rb +0 -32
  238. data/lib/conceptql/operators/overlapped_by.rb +0 -26
  239. data/lib/conceptql/operators/overlaps.rb +0 -21
  240. data/lib/conceptql/operators/place_of_service_code.rb +0 -31
  241. data/lib/conceptql/operators/procedure_occurrence.rb +0 -27
  242. data/lib/conceptql/operators/prodcode.rb +0 -32
  243. data/lib/conceptql/operators/revenue_code.rb +0 -40
  244. data/lib/conceptql/operators/rxnorm.rb +0 -28
  245. data/lib/conceptql/operators/snomed.rb +0 -25
  246. data/lib/conceptql/operators/source_vocabulary_operator.rb +0 -88
  247. data/lib/conceptql/operators/standard_vocabulary_operator.rb +0 -66
  248. data/lib/conceptql/operators/started_by.rb +0 -23
  249. data/lib/conceptql/operators/to_seer_visits.rb +0 -29
  250. data/lib/conceptql/operators/visit_occurrence.rb +0 -32
  251. data/lib/conceptql/operators/vocabulary_operator.rb +0 -45
  252. data/lib/conceptql/query_modifiers/drug_query_modifier.rb +0 -45
  253. data/lib/conceptql/query_modifiers/pos_query_modifier.rb +0 -31
  254. data/lib/conceptql/sql_formatter.rb +0 -22
  255. data/test/all.rb +0 -3
  256. data/test/all_operations_test.rb +0 -45
  257. data/test/code_list_test.rb +0 -23
  258. data/test/data/omopv4/care_site.csv +0 -0
  259. data/test/data/omopv4/cohort.csv +0 -0
  260. data/test/data/omopv4/condition_era.csv +0 -0
  261. data/test/data/omopv4/condition_occurrence.csv +0 -34044
  262. data/test/data/omopv4/death.csv +0 -1
  263. data/test/data/omopv4/drug_cost.csv +0 -0
  264. data/test/data/omopv4/drug_era.csv +0 -0
  265. data/test/data/omopv4/drug_exposure.csv +0 -2
  266. data/test/data/omopv4/location.csv +0 -0
  267. data/test/data/omopv4/observation.csv +0 -2
  268. data/test/data/omopv4/observation_period.csv +0 -1
  269. data/test/data/omopv4/organization.csv +0 -0
  270. data/test/data/omopv4/payer_plan_period.csv +0 -0
  271. data/test/data/omopv4/person.csv +0 -250
  272. data/test/data/omopv4/procedure_cost.csv +0 -0
  273. data/test/data/omopv4/procedure_occurrence.csv +0 -35099
  274. data/test/data/omopv4/provider.csv +0 -0
  275. data/test/data/omopv4/visit_occurrence.csv +0 -14931
  276. data/test/data/omopv4_plus/care_site.csv +0 -0
  277. data/test/data/omopv4_plus/cohort.csv +0 -0
  278. data/test/data/omopv4_plus/concept.csv +0 -352
  279. data/test/data/omopv4_plus/condition_era.csv +0 -0
  280. data/test/data/omopv4_plus/condition_occurrence.csv +0 -46673
  281. data/test/data/omopv4_plus/death.csv +0 -9
  282. data/test/data/omopv4_plus/drug_cost.csv +0 -13921
  283. data/test/data/omopv4_plus/drug_era.csv +0 -0
  284. data/test/data/omopv4_plus/drug_exposure.csv +0 -13921
  285. data/test/data/omopv4_plus/headers/care_site.csv +0 -1
  286. data/test/data/omopv4_plus/headers/cohort.csv +0 -1
  287. data/test/data/omopv4_plus/headers/concept.csv +0 -1
  288. data/test/data/omopv4_plus/headers/condition_era.csv +0 -1
  289. data/test/data/omopv4_plus/headers/condition_occurrence.csv +0 -1
  290. data/test/data/omopv4_plus/headers/death.csv +0 -1
  291. data/test/data/omopv4_plus/headers/drug_cost.csv +0 -1
  292. data/test/data/omopv4_plus/headers/drug_era.csv +0 -1
  293. data/test/data/omopv4_plus/headers/drug_exposure.csv +0 -1
  294. data/test/data/omopv4_plus/headers/location.csv +0 -1
  295. data/test/data/omopv4_plus/headers/observation.csv +0 -1
  296. data/test/data/omopv4_plus/headers/observation_period.csv +0 -1
  297. data/test/data/omopv4_plus/headers/organization.csv +0 -1
  298. data/test/data/omopv4_plus/headers/payer_plan_period.csv +0 -1
  299. data/test/data/omopv4_plus/headers/person.csv +0 -1
  300. data/test/data/omopv4_plus/headers/procedure_cost.csv +0 -1
  301. data/test/data/omopv4_plus/headers/procedure_occurrence.csv +0 -1
  302. data/test/data/omopv4_plus/headers/provider.csv +0 -1
  303. data/test/data/omopv4_plus/headers/source_to_concept_map.csv +0 -1
  304. data/test/data/omopv4_plus/headers/visit_occurrence.csv +0 -1
  305. data/test/data/omopv4_plus/headers/vocabulary.csv +0 -1
  306. data/test/data/omopv4_plus/location.csv +0 -0
  307. data/test/data/omopv4_plus/observation.csv +0 -0
  308. data/test/data/omopv4_plus/observation_period.csv +0 -147
  309. data/test/data/omopv4_plus/organization.csv +0 -736
  310. data/test/data/omopv4_plus/payer_plan_period.csv +0 -808
  311. data/test/data/omopv4_plus/person.csv +0 -250
  312. data/test/data/omopv4_plus/procedure_cost.csv +0 -20123
  313. data/test/data/omopv4_plus/procedure_occurrence.csv +0 -27273
  314. data/test/data/omopv4_plus/provider.csv +0 -10193
  315. data/test/data/omopv4_plus/source_to_concept_map.csv +0 -285
  316. data/test/data/omopv4_plus/visit_occurrence.csv +0 -45125
  317. data/test/data/omopv4_plus/vocabulary.csv +0 -60
  318. data/test/db.rb +0 -15
  319. data/test/db_setup.rb +0 -408
  320. data/test/db_teardown.rb +0 -33
  321. data/test/fake_annotater_test.rb +0 -31
  322. data/test/helper.rb +0 -129
  323. data/test/knitter/conceptql.md.cql +0 -39
  324. data/test/knitter/conceptql.md.expect +0 -43
  325. data/test/knitter/empty.md.cql +0 -0
  326. data/test/knitter/except.md.cql +0 -13
  327. data/test/knitter/except.md.expect +0 -14
  328. data/test/knitter/fake.md.cql +0 -10
  329. data/test/knitter/fake.md.expect +0 -13
  330. data/test/knitter/many.md.cql +0 -7
  331. data/test/knitter/many.md.expect +0 -14
  332. data/test/knitter/no_conceptql.md.cql +0 -36
  333. data/test/knitter/title.md.cql +0 -12
  334. data/test/knitter/title.md.expect +0 -15
  335. data/test/knitter/union.md.cql +0 -11
  336. data/test/knitter/union.md.expect +0 -14
  337. data/test/knitter_test.rb +0 -69
  338. data/test/query_test.rb +0 -36
  339. data/test/results/omopv4/after/anno_1 +0 -25
  340. data/test/results/omopv4/after/anno_2 +0 -48
  341. data/test/results/omopv4/after/anno_3 +0 -34
  342. data/test/results/omopv4/after/anno_4 +0 -60
  343. data/test/results/omopv4/after/anno_5 +0 -68
  344. data/test/results/omopv4/after/anno_6 +0 -60
  345. data/test/results/omopv4/after/crit_at_least +0 -7
  346. data/test/results/omopv4/after/crit_basic +0 -32
  347. data/test/results/omopv4/after/crit_occurrences +0 -12
  348. data/test/results/omopv4/after/crit_within +0 -6
  349. data/test/results/omopv4/any_overlap/crit_basic1 +0 -15
  350. data/test/results/omopv4/any_overlap/crit_basic2 +0 -15
  351. data/test/results/omopv4/any_overlap/crit_occurrences1 +0 -2
  352. data/test/results/omopv4/any_overlap/crit_occurrences2 +0 -15
  353. data/test/results/omopv4/any_overlap/crit_within +0 -8
  354. data/test/results/omopv4/before/crit_at_least +0 -6
  355. data/test/results/omopv4/before/crit_basic1 +0 -48
  356. data/test/results/omopv4/before/crit_basic2 +0 -7
  357. data/test/results/omopv4/before/crit_occurrences +0 -13
  358. data/test/results/omopv4/before/crit_within +0 -18
  359. data/test/results/omopv4/co_reported/anno_1 +0 -43
  360. data/test/results/omopv4/co_reported/anno_2 +0 -66
  361. data/test/results/omopv4/complement/anno_duplicate_params +0 -52
  362. data/test/results/omopv4/complement/anno_invalid_params +0 -37
  363. data/test/results/omopv4/complement/anno_no_params +0 -18
  364. data/test/results/omopv4/complement/count_3way_intersect +0 -4
  365. data/test/results/omopv4/complement/count_3way_union +0 -4
  366. data/test/results/omopv4/complement/count_intersect +0 -3
  367. data/test/results/omopv4/complement/count_union +0 -3
  368. data/test/results/omopv4/complement/count_union_and_intersect +0 -4
  369. data/test/results/omopv4/complement/crit_3way_intersect +0 -1
  370. data/test/results/omopv4/complement/crit_3way_union +0 -1
  371. data/test/results/omopv4/complement/crit_basic1 +0 -33998
  372. data/test/results/omopv4/complement/crit_icd9_selector +0 -54
  373. data/test/results/omopv4/complement/crit_intersect +0 -1
  374. data/test/results/omopv4/complement/crit_union +0 -1
  375. data/test/results/omopv4/complement/crit_union_and_intersect +0 -1
  376. data/test/results/omopv4/complex/anno_1 +0 -85
  377. data/test/results/omopv4/complex/crit_1 +0 -2
  378. data/test/results/omopv4/complex/crit_2 +0 -2
  379. data/test/results/omopv4/complex/crit_3 +0 -2
  380. data/test/results/omopv4/complex/crit_4 +0 -5
  381. data/test/results/omopv4/complex/crit_5 +0 -6
  382. data/test/results/omopv4/complex/crit_6 +0 -28
  383. data/test/results/omopv4/complex/crit_7 +0 -46
  384. data/test/results/omopv4/complex/crit_out_of_order_ctes +0 -7
  385. data/test/results/omopv4/complex/scanno_1 +0 -3
  386. data/test/results/omopv4/concurrent_within/crit_icd9 +0 -54
  387. data/test/results/omopv4/concurrent_within/crit_icd9_and_place_of_service +0 -23
  388. data/test/results/omopv4/concurrent_within/crit_negative_start +0 -5
  389. data/test/results/omopv4/condition_type/anno_icd9 +0 -39
  390. data/test/results/omopv4/condition_type/count_condition_era +0 -2
  391. data/test/results/omopv4/condition_type/count_condition_era_30_day_window +0 -2
  392. data/test/results/omopv4/condition_type/count_ehr_problem_list +0 -2
  393. data/test/results/omopv4/condition_type/count_era_0 +0 -2
  394. data/test/results/omopv4/condition_type/count_inpatient +0 -3
  395. data/test/results/omopv4/condition_type/count_inpatient_detail +0 -2
  396. data/test/results/omopv4/condition_type/count_inpatient_header +0 -3
  397. data/test/results/omopv4/condition_type/count_inpatient_header_2 +0 -3
  398. data/test/results/omopv4/condition_type/count_inpatient_header_3 +0 -3
  399. data/test/results/omopv4/condition_type/count_inpatient_header_4 +0 -3
  400. data/test/results/omopv4/condition_type/count_inpatient_header_5 +0 -3
  401. data/test/results/omopv4/condition_type/count_inpatient_outpatient_detail +0 -3
  402. data/test/results/omopv4/condition_type/count_inpatient_primary +0 -2
  403. data/test/results/omopv4/condition_type/count_inpatient_primary_or_first +0 -3
  404. data/test/results/omopv4/condition_type/count_outpatient +0 -3
  405. data/test/results/omopv4/condition_type/count_outpatient_detail +0 -3
  406. data/test/results/omopv4/condition_type/count_outpatient_header +0 -2
  407. data/test/results/omopv4/condition_type/count_outpatient_primary +0 -3
  408. data/test/results/omopv4/condition_type/count_primary +0 -3
  409. data/test/results/omopv4/condition_type/crit_condition_era +0 -1
  410. data/test/results/omopv4/condition_type/crit_condition_era_30_day_window +0 -1
  411. data/test/results/omopv4/condition_type/crit_ehr_problem_list +0 -1
  412. data/test/results/omopv4/condition_type/crit_era_0 +0 -1
  413. data/test/results/omopv4/condition_type/crit_inpatient +0 -1
  414. data/test/results/omopv4/condition_type/crit_inpatient_detail +0 -1
  415. data/test/results/omopv4/condition_type/crit_inpatient_header +0 -1
  416. data/test/results/omopv4/condition_type/crit_inpatient_header_2 +0 -1
  417. data/test/results/omopv4/condition_type/crit_inpatient_header_3 +0 -1
  418. data/test/results/omopv4/condition_type/crit_inpatient_header_4 +0 -1
  419. data/test/results/omopv4/condition_type/crit_inpatient_header_5 +0 -1
  420. data/test/results/omopv4/condition_type/crit_inpatient_primary +0 -1
  421. data/test/results/omopv4/condition_type/crit_inpatient_primary_or_first +0 -1
  422. data/test/results/omopv4/condition_type/crit_outpatient +0 -1
  423. data/test/results/omopv4/condition_type/crit_outpatient_detail +0 -1
  424. data/test/results/omopv4/condition_type/crit_outpatient_header +0 -1
  425. data/test/results/omopv4/condition_type/crit_outpatient_primary +0 -1
  426. data/test/results/omopv4/condition_type/crit_primary +0 -1
  427. data/test/results/omopv4/contains/crit_1 +0 -5
  428. data/test/results/omopv4/contains/crit_2 +0 -2
  429. data/test/results/omopv4/contains/crit_3 +0 -2
  430. data/test/results/omopv4/count/anno_multiple_upstreams +0 -52
  431. data/test/results/omopv4/count/anno_no_upstream1 +0 -18
  432. data/test/results/omopv4/count/anno_no_upstream2 +0 -25
  433. data/test/results/omopv4/count/crit_icd9_ndc +0 -8
  434. data/test/results/omopv4/count/crit_ndc +0 -5
  435. data/test/results/omopv4/count/crit_person +0 -254
  436. data/test/results/omopv4/cpt/anno_icd9_upstream +0 -40
  437. data/test/results/omopv4/cpt/anno_invalid_code +0 -22
  438. data/test/results/omopv4/cpt/count_1 +0 -3
  439. data/test/results/omopv4/cpt/crit_1 +0 -174
  440. data/test/results/omopv4/cpt/crit_2 +0 -1
  441. data/test/results/omopv4/cpt/scanno_1 +0 -17
  442. data/test/results/omopv4/cpt_or_hcpcs/anno_bad_format +0 -25
  443. data/test/results/omopv4/cpt_or_hcpcs/count_1 +0 -3
  444. data/test/results/omopv4/cpt_or_hcpcs/crit_1 +0 -179
  445. data/test/results/omopv4/cpt_or_hcpcs/crit_2 +0 -1
  446. data/test/results/omopv4/date_range/anno_1 +0 -15
  447. data/test/results/omopv4/date_range/anno_extra_argument +0 -24
  448. data/test/results/omopv4/date_range/anno_invalid_argument +0 -25
  449. data/test/results/omopv4/date_range/anno_missing_argument1 +0 -20
  450. data/test/results/omopv4/date_range/anno_missing_argument2 +0 -20
  451. data/test/results/omopv4/date_range/anno_no_upstreams +0 -38
  452. data/test/results/omopv4/date_range/count_1 +0 -3
  453. data/test/results/omopv4/date_range/count_2 +0 -3
  454. data/test/results/omopv4/date_range/crit_1 +0 -1
  455. data/test/results/omopv4/date_range/crit_2 +0 -1
  456. data/test/results/omopv4/death/anno_multiple_upstreams +0 -50
  457. data/test/results/omopv4/death/anno_no_upstreams +0 -22
  458. data/test/results/omopv4/death/crit_basic +0 -5
  459. data/test/results/omopv4/death/crit_person +0 -5
  460. data/test/results/omopv4/drug_type_concept/anno_has_upstreams +0 -37
  461. data/test/results/omopv4/drug_type_concept/anno_no_arguments +0 -18
  462. data/test/results/omopv4/drug_type_concept/crit_basic1 +0 -5
  463. data/test/results/omopv4/drug_type_concept/crit_basic2 +0 -2
  464. data/test/results/omopv4/during/crit_1 +0 -15
  465. data/test/results/omopv4/during/crit_2 +0 -2
  466. data/test/results/omopv4/equal/crit_1 +0 -5
  467. data/test/results/omopv4/equal/crit_2 +0 -5
  468. data/test/results/omopv4/except/anno_1 +0 -42
  469. data/test/results/omopv4/except/anno_2 +0 -43
  470. data/test/results/omopv4/except/count_complex +0 -5
  471. data/test/results/omopv4/except/crit_412_cpt +0 -54
  472. data/test/results/omopv4/except/crit_412_inpatient +0 -46
  473. data/test/results/omopv4/except/crit_complex +0 -1
  474. data/test/results/omopv4/filter/crit_1 +0 -54
  475. data/test/results/omopv4/first/anno_argument +0 -25
  476. data/test/results/omopv4/first/anno_no_upstream +0 -18
  477. data/test/results/omopv4/first/crit_cpt +0 -207
  478. data/test/results/omopv4/first/crit_icd9 +0 -42
  479. data/test/results/omopv4/first/crit_union +0 -45
  480. data/test/results/omopv4/from/anno_has_upstreams +0 -39
  481. data/test/results/omopv4/from/anno_multiple_arguments +0 -24
  482. data/test/results/omopv4/from/count_condition_occurrence +0 -3
  483. data/test/results/omopv4/from/count_observation_period +0 -3
  484. data/test/results/omopv4/from/count_person +0 -3
  485. data/test/results/omopv4/from_seer_visits/anno_multiple_upstreams +0 -78
  486. data/test/results/omopv4/from_seer_visits/anno_no_upstream +0 -18
  487. data/test/results/omopv4/from_seer_visits/crit_1 +0 -6
  488. data/test/results/omopv4/from_seer_visits/crit_2 +0 -5
  489. data/test/results/omopv4/from_seer_visits/crit_3 +0 -5
  490. data/test/results/omopv4/from_seer_visits/crit_4 +0 -6
  491. data/test/results/omopv4/gender/anno_has_upstreams +0 -39
  492. data/test/results/omopv4/gender/crit_male +0 -130
  493. data/test/results/omopv4/hcpcs/anno_bad_format +0 -24
  494. data/test/results/omopv4/hcpcs/crit_A0382 +0 -9
  495. data/test/results/omopv4/icd10/anno_bad_format +0 -22
  496. data/test/results/omopv4/icd10/anno_has_upstreams +0 -40
  497. data/test/results/omopv4/icd10/crit_1 +0 -5
  498. data/test/results/omopv4/icd10pcs/anno_bad_format +0 -28
  499. data/test/results/omopv4/icd10pcs/anno_has_upstreams +0 -40
  500. data/test/results/omopv4/icd10pcs/crit_1 +0 -2
  501. data/test/results/omopv4/icd9/anno_empty_label +0 -15
  502. data/test/results/omopv4/icd9/anno_invalid_code +0 -21
  503. data/test/results/omopv4/icd9/crit_1 +0 -54
  504. data/test/results/omopv4/icd9_procedure/crit_1 +0 -5
  505. data/test/results/omopv4/intersect/anno_412_inpatient +0 -42
  506. data/test/results/omopv4/intersect/anno_has_arguments +0 -25
  507. data/test/results/omopv4/intersect/anno_no_upstream +0 -18
  508. data/test/results/omopv4/intersect/crit_412_inpatient +0 -12
  509. data/test/results/omopv4/intersect/crit_412_male +0 -182
  510. data/test/results/omopv4/intersect/crit_complex +0 -118
  511. data/test/results/omopv4/invalid/anno_bad_op +0 -55
  512. data/test/results/omopv4/invalid/scanno_1 +0 -23
  513. data/test/results/omopv4/last/crit_icd9 +0 -42
  514. data/test/results/omopv4/loinc/crit_basic +0 -5
  515. data/test/results/omopv4/ndc/crit_basic +0 -5
  516. data/test/results/omopv4/numeric/anno_multiple_upstreams +0 -59
  517. data/test/results/omopv4/numeric/num_values_1 +0 -254
  518. data/test/results/omopv4/numeric/num_values_2 +0 -5
  519. data/test/results/omopv4/numeric/num_values_3 +0 -5
  520. data/test/results/omopv4/observation_period/anno_has_arguments +0 -36
  521. data/test/results/omopv4/observation_period/anno_multiple_upstreams +0 -51
  522. data/test/results/omopv4/observation_period/count_all_periods +0 -3
  523. data/test/results/omopv4/observation_period/crit_female +0 -2
  524. data/test/results/omopv4/observation_period/crit_icd9 +0 -5
  525. data/test/results/omopv4/observation_period/crit_male +0 -5
  526. data/test/results/omopv4/occurrence/anno_no_upstream +0 -22
  527. data/test/results/omopv4/occurrence/cc_412_410 +0 -1
  528. data/test/results/omopv4/occurrence/count_412_410 +0 -3
  529. data/test/results/omopv4/occurrence/crit_1 +0 -16
  530. data/test/results/omopv4/occurrence/crit_2 +0 -2
  531. data/test/results/omopv4/occurrence/crit_3 +0 -42
  532. data/test/results/omopv4/one_in_two_out/anno_has_arguments +0 -27
  533. data/test/results/omopv4/one_in_two_out/anno_multiple_upstreams +0 -54
  534. data/test/results/omopv4/one_in_two_out/anno_no_upstream +0 -20
  535. data/test/results/omopv4/one_in_two_out/count_1 +0 -3
  536. data/test/results/omopv4/one_in_two_out/crit_hcpcs +0 -7
  537. data/test/results/omopv4/one_in_two_out/crit_icd9 +0 -21
  538. data/test/results/omopv4/overlapped_by/crit_1 +0 -5
  539. data/test/results/omopv4/overlapped_by/crit_2 +0 -2
  540. data/test/results/omopv4/overlapped_by/crit_3 +0 -5
  541. data/test/results/omopv4/overlapped_by/crit_4 +0 -2
  542. data/test/results/omopv4/overlaps/crit_1 +0 -5
  543. data/test/results/omopv4/overlaps/crit_2 +0 -2
  544. data/test/results/omopv4/overlaps/crit_3 +0 -5
  545. data/test/results/omopv4/overlaps/crit_4 +0 -2
  546. data/test/results/omopv4/person/anno_has_arguments +0 -22
  547. data/test/results/omopv4/person/anno_multiple_upstreams +0 -52
  548. data/test/results/omopv4/person/count_2 +0 -3
  549. data/test/results/omopv4/person/crit_1 +0 -42
  550. data/test/results/omopv4/person/crit_2 +0 -1
  551. data/test/results/omopv4/person_filter/count_1 +0 -4
  552. data/test/results/omopv4/person_filter/crit_1 +0 -54
  553. data/test/results/omopv4/person_filter/crit_2 +0 -5
  554. data/test/results/omopv4/person_filter/crit_3 +0 -32
  555. data/test/results/omopv4/person_filter/crit_4 +0 -52
  556. data/test/results/omopv4/person_filter/crit_5 +0 -1
  557. data/test/results/omopv4/place_of_service_code/anno_has_upstreams +0 -37
  558. data/test/results/omopv4/place_of_service_code/anno_no_arguments +0 -18
  559. data/test/results/omopv4/place_of_service_code/crit_basic +0 -174
  560. data/test/results/omopv4/place_of_service_filter/anno_1 +0 -29
  561. data/test/results/omopv4/procedure_occurrence/anno_has_arguments +0 -37
  562. data/test/results/omopv4/procedure_occurrence/anno_multiple_upstreams +0 -51
  563. data/test/results/omopv4/procedure_occurrence/count_gender +0 -3
  564. data/test/results/omopv4/procedure_occurrence/count_icd9 +0 -3
  565. data/test/results/omopv4/procedure_occurrence/count_started_by +0 -3
  566. data/test/results/omopv4/procedure_occurrence/crit_gender +0 -1
  567. data/test/results/omopv4/procedure_occurrence/crit_icd9 +0 -1
  568. data/test/results/omopv4/procedure_occurrence/crit_started_by +0 -1
  569. data/test/results/omopv4/provenance/anno_1 +0 -29
  570. data/test/results/omopv4/provider_filter/anno_1 +0 -29
  571. data/test/results/omopv4/race/anno_1 +0 -37
  572. data/test/results/omopv4/race/anno_2 +0 -18
  573. data/test/results/omopv4/race/crit_1 +0 -28
  574. data/test/results/omopv4/read/anno_1 +0 -21
  575. data/test/results/omopv4/read/crit_1 +0 -2
  576. data/test/results/omopv4/recall/anno_1 +0 -54
  577. data/test/results/omopv4/recall/anno_2 +0 -66
  578. data/test/results/omopv4/recall/anno_3 +0 -20
  579. data/test/results/omopv4/recall/anno_4 +0 -18
  580. data/test/results/omopv4/recall/anno_5 +0 -24
  581. data/test/results/omopv4/recall/anno_6 +0 -270
  582. data/test/results/omopv4/recall/crit_1 +0 -21
  583. data/test/results/omopv4/recall/crit_2 +0 -54
  584. data/test/results/omopv4/recall/crit_3 +0 -2
  585. data/test/results/omopv4/recall/crit_cte_1 +0 -42
  586. data/test/results/omopv4/recall/crit_cte_2 +0 -42
  587. data/test/results/omopv4/recall/crit_nested_perm_0 +0 -54
  588. data/test/results/omopv4/revenue_code/crit_1 +0 -2
  589. data/test/results/omopv4/revenue_code/crit_basic +0 -2
  590. data/test/results/omopv4/revenue_code/domains_1 +0 -3
  591. data/test/results/omopv4/revenue_code/domains_drg100 +0 -3
  592. data/test/results/omopv4/rxnorm/crit_1 +0 -5
  593. data/test/results/omopv4/snomed/crit_1 +0 -84
  594. data/test/results/omopv4/started_by/crit_1 +0 -5
  595. data/test/results/omopv4/started_by/crit_2 +0 -2
  596. data/test/results/omopv4/started_by/crit_3 +0 -2
  597. data/test/results/omopv4/sum/anno_1 +0 -18
  598. data/test/results/omopv4/sum/anno_2 +0 -36
  599. data/test/results/omopv4/sum/num_1 +0 -5
  600. data/test/results/omopv4/sum/num_2 +0 -8
  601. data/test/results/omopv4/sum/num_3 +0 -254
  602. data/test/results/omopv4/time_window/anno_1 +0 -20
  603. data/test/results/omopv4/time_window/anno_2 +0 -40
  604. data/test/results/omopv4/time_window/anno_3 +0 -36
  605. data/test/results/omopv4/time_window/anno_4 +0 -39
  606. data/test/results/omopv4/time_window/anno_5 +0 -57
  607. data/test/results/omopv4/time_window/crit_1 +0 -54
  608. data/test/results/omopv4/time_window/crit_2 +0 -174
  609. data/test/results/omopv4/time_window/crit_3 +0 -54
  610. data/test/results/omopv4/time_window/crit_4 +0 -174
  611. data/test/results/omopv4/trim_date_end/crit_1 +0 -5
  612. data/test/results/omopv4/trim_date_end/crit_2 +0 -2
  613. data/test/results/omopv4/trim_date_end/crit_3 +0 -6
  614. data/test/results/omopv4/trim_date_end/crit_at_least +0 -5
  615. data/test/results/omopv4/trim_date_end/crit_occurrences_1 +0 -2
  616. data/test/results/omopv4/trim_date_end/crit_occurrences_2 +0 -6
  617. data/test/results/omopv4/trim_date_end/crit_within +0 -5
  618. data/test/results/omopv4/trim_date_start/crit_1 +0 -5
  619. data/test/results/omopv4/trim_date_start/crit_2 +0 -2
  620. data/test/results/omopv4/trim_date_start/crit_3 +0 -6
  621. data/test/results/omopv4/trim_date_start/crit_at_least +0 -5
  622. data/test/results/omopv4/trim_date_start/crit_occurrences_1 +0 -2
  623. data/test/results/omopv4/trim_date_start/crit_occurrences_2 +0 -6
  624. data/test/results/omopv4/trim_date_start/crit_within +0 -5
  625. data/test/results/omopv4/union/anno_1 +0 -43
  626. data/test/results/omopv4/union/anno_2 +0 -74
  627. data/test/results/omopv4/union/anno_3 +0 -18
  628. data/test/results/omopv4/union/anno_4 +0 -25
  629. data/test/results/omopv4/union/anno_5 +0 -33
  630. data/test/results/omopv4/union/anno_6 +0 -46
  631. data/test/results/omopv4/union/cc_1 +0 -1
  632. data/test/results/omopv4/union/cc_2 +0 -1
  633. data/test/results/omopv4/union/cc_3 +0 -1
  634. data/test/results/omopv4/union/cc_4 +0 -1
  635. data/test/results/omopv4/union/cc_5 +0 -1
  636. data/test/results/omopv4/union/count_1 +0 -3
  637. data/test/results/omopv4/union/count_2 +0 -3
  638. data/test/results/omopv4/union/count_3 +0 -3
  639. data/test/results/omopv4/union/count_4 +0 -3
  640. data/test/results/omopv4/union/count_5 +0 -4
  641. data/test/results/omopv4/union/scanno_1 +0 -22
  642. data/test/results/omopv4/union/scanno_2 +0 -36
  643. data/test/results/omopv4/visit_occurrence/anno_1 +0 -52
  644. data/test/results/omopv4/visit_occurrence/anno_2 +0 -37
  645. data/test/results/omopv4/visit_occurrence/crit_1 +0 -54
  646. data/test/results/omopv4/visit_occurrence/crit_2 +0 -7566
  647. data/test/results/omopv4/visit_occurrence/crit_3 +0 -14935
  648. data/test/results/omopv4_plus/after/anno_1 +0 -25
  649. data/test/results/omopv4_plus/after/anno_2 +0 -48
  650. data/test/results/omopv4_plus/after/anno_3 +0 -34
  651. data/test/results/omopv4_plus/after/anno_4 +0 -60
  652. data/test/results/omopv4_plus/after/anno_5 +0 -68
  653. data/test/results/omopv4_plus/after/anno_6 +0 -60
  654. data/test/results/omopv4_plus/after/crit_at_least +0 -7
  655. data/test/results/omopv4_plus/after/crit_basic +0 -32
  656. data/test/results/omopv4_plus/after/crit_occurrences +0 -12
  657. data/test/results/omopv4_plus/after/crit_within +0 -5
  658. data/test/results/omopv4_plus/any_overlap/crit_basic1 +0 -14
  659. data/test/results/omopv4_plus/any_overlap/crit_basic2 +0 -14
  660. data/test/results/omopv4_plus/any_overlap/crit_occurrences1 +0 -2
  661. data/test/results/omopv4_plus/any_overlap/crit_occurrences2 +0 -14
  662. data/test/results/omopv4_plus/any_overlap/crit_within +0 -8
  663. data/test/results/omopv4_plus/before/crit_at_least +0 -6
  664. data/test/results/omopv4_plus/before/crit_basic1 +0 -48
  665. data/test/results/omopv4_plus/before/crit_basic2 +0 -8
  666. data/test/results/omopv4_plus/before/crit_occurrences +0 -13
  667. data/test/results/omopv4_plus/before/crit_within +0 -17
  668. data/test/results/omopv4_plus/co_reported/anno_1 +0 -43
  669. data/test/results/omopv4_plus/co_reported/anno_2 +0 -66
  670. data/test/results/omopv4_plus/co_reported/anno_3 +0 -47
  671. data/test/results/omopv4_plus/complement/anno_duplicate_params +0 -52
  672. data/test/results/omopv4_plus/complement/anno_invalid_params +0 -37
  673. data/test/results/omopv4_plus/complement/anno_no_params +0 -18
  674. data/test/results/omopv4_plus/complement/count_3way_intersect +0 -4
  675. data/test/results/omopv4_plus/complement/count_3way_union +0 -4
  676. data/test/results/omopv4_plus/complement/count_intersect +0 -3
  677. data/test/results/omopv4_plus/complement/count_union +0 -3
  678. data/test/results/omopv4_plus/complement/count_union_and_intersect +0 -4
  679. data/test/results/omopv4_plus/complement/crit_basic1 +0 -52483
  680. data/test/results/omopv4_plus/complement/crit_icd9_selector +0 -52
  681. data/test/results/omopv4_plus/complex/anno_1 +0 -85
  682. data/test/results/omopv4_plus/complex/crit_1 +0 -2
  683. data/test/results/omopv4_plus/complex/crit_2 +0 -2
  684. data/test/results/omopv4_plus/complex/crit_3 +0 -2
  685. data/test/results/omopv4_plus/complex/crit_4 +0 -2
  686. data/test/results/omopv4_plus/complex/crit_5 +0 -2
  687. data/test/results/omopv4_plus/complex/crit_6 +0 -24
  688. data/test/results/omopv4_plus/complex/crit_7 +0 -45
  689. data/test/results/omopv4_plus/complex/crit_out_of_order_ctes +0 -15
  690. data/test/results/omopv4_plus/complex/scanno_1 +0 -108
  691. data/test/results/omopv4_plus/concurrent_within/crit_icd9 +0 -52
  692. data/test/results/omopv4_plus/concurrent_within/crit_icd9_and_place_of_service +0 -21
  693. data/test/results/omopv4_plus/concurrent_within/crit_negative_start +0 -5
  694. data/test/results/omopv4_plus/condition_type/anno_icd9 +0 -39
  695. data/test/results/omopv4_plus/condition_type/count_condition_era +0 -2
  696. data/test/results/omopv4_plus/condition_type/count_condition_era_30_day_window +0 -2
  697. data/test/results/omopv4_plus/condition_type/count_ehr_problem_list +0 -2
  698. data/test/results/omopv4_plus/condition_type/count_era_0 +0 -2
  699. data/test/results/omopv4_plus/condition_type/count_inpatient +0 -3
  700. data/test/results/omopv4_plus/condition_type/count_inpatient_detail +0 -2
  701. data/test/results/omopv4_plus/condition_type/count_inpatient_header +0 -3
  702. data/test/results/omopv4_plus/condition_type/count_inpatient_header_2 +0 -3
  703. data/test/results/omopv4_plus/condition_type/count_inpatient_header_3 +0 -3
  704. data/test/results/omopv4_plus/condition_type/count_inpatient_header_4 +0 -3
  705. data/test/results/omopv4_plus/condition_type/count_inpatient_header_5 +0 -3
  706. data/test/results/omopv4_plus/condition_type/count_inpatient_outpatient_detail +0 -3
  707. data/test/results/omopv4_plus/condition_type/count_inpatient_primary +0 -3
  708. data/test/results/omopv4_plus/condition_type/count_inpatient_primary_or_first +0 -3
  709. data/test/results/omopv4_plus/condition_type/count_outpatient +0 -3
  710. data/test/results/omopv4_plus/condition_type/count_outpatient_detail +0 -2
  711. data/test/results/omopv4_plus/condition_type/count_outpatient_header +0 -3
  712. data/test/results/omopv4_plus/condition_type/count_outpatient_primary +0 -3
  713. data/test/results/omopv4_plus/condition_type/count_primary +0 -3
  714. data/test/results/omopv4_plus/contains/crit_1 +0 -5
  715. data/test/results/omopv4_plus/contains/crit_2 +0 -2
  716. data/test/results/omopv4_plus/contains/crit_3 +0 -2
  717. data/test/results/omopv4_plus/count/anno_multiple_upstreams +0 -52
  718. data/test/results/omopv4_plus/count/anno_no_upstream1 +0 -18
  719. data/test/results/omopv4_plus/count/anno_no_upstream2 +0 -25
  720. data/test/results/omopv4_plus/count/crit_icd9_ndc +0 -5
  721. data/test/results/omopv4_plus/count/crit_ndc +0 -2
  722. data/test/results/omopv4_plus/count/crit_person +0 -254
  723. data/test/results/omopv4_plus/cpt/anno_icd9_upstream +0 -40
  724. data/test/results/omopv4_plus/cpt/anno_invalid_code +0 -22
  725. data/test/results/omopv4_plus/cpt/count_1 +0 -3
  726. data/test/results/omopv4_plus/cpt/crit_1 +0 -158
  727. data/test/results/omopv4_plus/cpt/scanno_1 +0 -17
  728. data/test/results/omopv4_plus/cpt_or_hcpcs/anno_bad_format +0 -25
  729. data/test/results/omopv4_plus/cpt_or_hcpcs/count_1 +0 -3
  730. data/test/results/omopv4_plus/cpt_or_hcpcs/crit_1 +0 -161
  731. data/test/results/omopv4_plus/date_range/anno_1 +0 -15
  732. data/test/results/omopv4_plus/date_range/anno_extra_argument +0 -24
  733. data/test/results/omopv4_plus/date_range/anno_invalid_argument +0 -25
  734. data/test/results/omopv4_plus/date_range/anno_missing_argument1 +0 -20
  735. data/test/results/omopv4_plus/date_range/anno_missing_argument2 +0 -20
  736. data/test/results/omopv4_plus/date_range/anno_no_upstreams +0 -38
  737. data/test/results/omopv4_plus/date_range/count_1 +0 -3
  738. data/test/results/omopv4_plus/date_range/count_2 +0 -3
  739. data/test/results/omopv4_plus/death/anno_multiple_upstreams +0 -50
  740. data/test/results/omopv4_plus/death/anno_no_upstreams +0 -22
  741. data/test/results/omopv4_plus/death/crit_basic +0 -14
  742. data/test/results/omopv4_plus/death/crit_person +0 -14
  743. data/test/results/omopv4_plus/drug_type_concept/anno_has_upstreams +0 -37
  744. data/test/results/omopv4_plus/drug_type_concept/anno_no_arguments +0 -18
  745. data/test/results/omopv4_plus/drug_type_concept/crit_basic1 +0 -2
  746. data/test/results/omopv4_plus/drug_type_concept/crit_basic2 +0 -2
  747. data/test/results/omopv4_plus/during/crit_1 +0 -14
  748. data/test/results/omopv4_plus/during/crit_2 +0 -2
  749. data/test/results/omopv4_plus/equal/crit_1 +0 -2
  750. data/test/results/omopv4_plus/equal/crit_2 +0 -2
  751. data/test/results/omopv4_plus/except/anno_1 +0 -42
  752. data/test/results/omopv4_plus/except/anno_2 +0 -43
  753. data/test/results/omopv4_plus/except/count_complex +0 -5
  754. data/test/results/omopv4_plus/except/crit_412_cpt +0 -52
  755. data/test/results/omopv4_plus/except/crit_412_inpatient +0 -45
  756. data/test/results/omopv4_plus/filter/crit_1 +0 -52
  757. data/test/results/omopv4_plus/first/anno_argument +0 -25
  758. data/test/results/omopv4_plus/first/anno_no_upstream +0 -18
  759. data/test/results/omopv4_plus/first/crit_cpt +0 -180
  760. data/test/results/omopv4_plus/first/crit_icd9 +0 -41
  761. data/test/results/omopv4_plus/first/crit_union +0 -52
  762. data/test/results/omopv4_plus/from/anno_has_upstreams +0 -39
  763. data/test/results/omopv4_plus/from/anno_multiple_arguments +0 -24
  764. data/test/results/omopv4_plus/from/count_condition_occurrence +0 -3
  765. data/test/results/omopv4_plus/from/count_observation_period +0 -3
  766. data/test/results/omopv4_plus/from/count_person +0 -3
  767. data/test/results/omopv4_plus/from_seer_visits/anno_multiple_upstreams +0 -78
  768. data/test/results/omopv4_plus/from_seer_visits/anno_no_upstream +0 -18
  769. data/test/results/omopv4_plus/from_seer_visits/crit_1 +0 -2
  770. data/test/results/omopv4_plus/from_seer_visits/crit_2 +0 -2
  771. data/test/results/omopv4_plus/from_seer_visits/crit_3 +0 -2
  772. data/test/results/omopv4_plus/from_seer_visits/crit_4 +0 -2
  773. data/test/results/omopv4_plus/gender/anno_has_upstreams +0 -39
  774. data/test/results/omopv4_plus/gender/crit_male +0 -128
  775. data/test/results/omopv4_plus/hcpcs/anno_bad_format +0 -24
  776. data/test/results/omopv4_plus/hcpcs/crit_A0382 +0 -7
  777. data/test/results/omopv4_plus/icd10/anno_bad_format +0 -22
  778. data/test/results/omopv4_plus/icd10/anno_has_upstreams +0 -40
  779. data/test/results/omopv4_plus/icd10/crit_1 +0 -2
  780. data/test/results/omopv4_plus/icd10pcs/anno_bad_format +0 -28
  781. data/test/results/omopv4_plus/icd10pcs/anno_has_upstreams +0 -40
  782. data/test/results/omopv4_plus/icd10pcs/crit_1 +0 -2
  783. data/test/results/omopv4_plus/icd9/anno_empty_label +0 -15
  784. data/test/results/omopv4_plus/icd9/anno_invalid_code +0 -21
  785. data/test/results/omopv4_plus/icd9/anno_valid_code +0 -3
  786. data/test/results/omopv4_plus/icd9/crit_1 +0 -52
  787. data/test/results/omopv4_plus/icd9_procedure/crit_1 +0 -5
  788. data/test/results/omopv4_plus/intersect/anno_412_inpatient +0 -42
  789. data/test/results/omopv4_plus/intersect/anno_has_arguments +0 -25
  790. data/test/results/omopv4_plus/intersect/anno_no_upstream +0 -18
  791. data/test/results/omopv4_plus/intersect/crit_412_inpatient +0 -11
  792. data/test/results/omopv4_plus/intersect/crit_412_male +0 -178
  793. data/test/results/omopv4_plus/intersect/crit_complex +0 -110
  794. data/test/results/omopv4_plus/invalid/anno_bad_op +0 -55
  795. data/test/results/omopv4_plus/invalid/scanno_1 +0 -23
  796. data/test/results/omopv4_plus/last/crit_icd9 +0 -41
  797. data/test/results/omopv4_plus/loinc/crit_basic +0 -2
  798. data/test/results/omopv4_plus/ndc/crit_basic +0 -2
  799. data/test/results/omopv4_plus/ndc/results_1 +0 -41
  800. data/test/results/omopv4_plus/numeric/anno_multiple_upstreams +0 -59
  801. data/test/results/omopv4_plus/numeric/num_values_1 +0 -254
  802. data/test/results/omopv4_plus/numeric/num_values_2 +0 -5
  803. data/test/results/omopv4_plus/numeric/num_values_3 +0 -5
  804. data/test/results/omopv4_plus/observation_period/anno_has_arguments +0 -36
  805. data/test/results/omopv4_plus/observation_period/anno_multiple_upstreams +0 -51
  806. data/test/results/omopv4_plus/observation_period/count_all_periods +0 -3
  807. data/test/results/omopv4_plus/observation_period/crit_female +0 -87
  808. data/test/results/omopv4_plus/observation_period/crit_icd9 +0 -28
  809. data/test/results/omopv4_plus/observation_period/crit_male +0 -75
  810. data/test/results/omopv4_plus/occurrence/anno_no_upstream +0 -22
  811. data/test/results/omopv4_plus/occurrence/count_412_410 +0 -3
  812. data/test/results/omopv4_plus/occurrence/crit_1 +0 -15
  813. data/test/results/omopv4_plus/occurrence/crit_2 +0 -2
  814. data/test/results/omopv4_plus/occurrence/crit_3 +0 -41
  815. data/test/results/omopv4_plus/one_in_two_out/anno_has_arguments +0 -27
  816. data/test/results/omopv4_plus/one_in_two_out/anno_multiple_upstreams +0 -54
  817. data/test/results/omopv4_plus/one_in_two_out/anno_no_upstream +0 -20
  818. data/test/results/omopv4_plus/one_in_two_out/count_1 +0 -3
  819. data/test/results/omopv4_plus/one_in_two_out/count_same_as_1 +0 -3
  820. data/test/results/omopv4_plus/one_in_two_out/crit_hcpcs +0 -2
  821. data/test/results/omopv4_plus/one_in_two_out/crit_icd9 +0 -19
  822. data/test/results/omopv4_plus/one_in_two_out/results_1 +0 -803
  823. data/test/results/omopv4_plus/one_in_two_out/results_2 +0 -803
  824. data/test/results/omopv4_plus/overlapped_by/crit_1 +0 -5
  825. data/test/results/omopv4_plus/overlapped_by/crit_2 +0 -2
  826. data/test/results/omopv4_plus/overlapped_by/crit_3 +0 -5
  827. data/test/results/omopv4_plus/overlapped_by/crit_4 +0 -2
  828. data/test/results/omopv4_plus/overlaps/crit_1 +0 -5
  829. data/test/results/omopv4_plus/overlaps/crit_2 +0 -2
  830. data/test/results/omopv4_plus/overlaps/crit_3 +0 -5
  831. data/test/results/omopv4_plus/overlaps/crit_4 +0 -2
  832. data/test/results/omopv4_plus/person/anno_has_arguments +0 -22
  833. data/test/results/omopv4_plus/person/anno_multiple_upstreams +0 -52
  834. data/test/results/omopv4_plus/person/count_2 +0 -3
  835. data/test/results/omopv4_plus/person/crit_1 +0 -41
  836. data/test/results/omopv4_plus/person_filter/count_1 +0 -4
  837. data/test/results/omopv4_plus/person_filter/crit_1 +0 -52
  838. data/test/results/omopv4_plus/person_filter/crit_2 +0 -10
  839. data/test/results/omopv4_plus/person_filter/crit_3 +0 -32
  840. data/test/results/omopv4_plus/person_filter/crit_4 +0 -50
  841. data/test/results/omopv4_plus/place_of_service_code/anno_has_upstreams +0 -37
  842. data/test/results/omopv4_plus/place_of_service_code/anno_no_arguments +0 -18
  843. data/test/results/omopv4_plus/place_of_service_code/crit_basic +0 -157
  844. data/test/results/omopv4_plus/place_of_service_filter/anno_1 +0 -29
  845. data/test/results/omopv4_plus/procedure_occurrence/anno_has_arguments +0 -37
  846. data/test/results/omopv4_plus/procedure_occurrence/anno_multiple_upstreams +0 -51
  847. data/test/results/omopv4_plus/procedure_occurrence/count_gender +0 -3
  848. data/test/results/omopv4_plus/procedure_occurrence/count_icd9 +0 -3
  849. data/test/results/omopv4_plus/procedure_occurrence/count_started_by +0 -3
  850. data/test/results/omopv4_plus/provenance/anno_1 +0 -29
  851. data/test/results/omopv4_plus/provenance/anno_bad_keyword +0 -38
  852. data/test/results/omopv4_plus/provenance/count_1 +0 -3
  853. data/test/results/omopv4_plus/provenance/count_2 +0 -3
  854. data/test/results/omopv4_plus/provider_filter/anno_1 +0 -29
  855. data/test/results/omopv4_plus/race/anno_1 +0 -37
  856. data/test/results/omopv4_plus/race/anno_2 +0 -18
  857. data/test/results/omopv4_plus/race/crit_1 +0 -32
  858. data/test/results/omopv4_plus/read/anno_1 +0 -15
  859. data/test/results/omopv4_plus/read/crit_1 +0 -2
  860. data/test/results/omopv4_plus/recall/anno_1 +0 -54
  861. data/test/results/omopv4_plus/recall/anno_2 +0 -66
  862. data/test/results/omopv4_plus/recall/anno_3 +0 -20
  863. data/test/results/omopv4_plus/recall/anno_4 +0 -18
  864. data/test/results/omopv4_plus/recall/anno_5 +0 -24
  865. data/test/results/omopv4_plus/recall/anno_6 +0 -270
  866. data/test/results/omopv4_plus/recall/crit_1 +0 -19
  867. data/test/results/omopv4_plus/recall/crit_2 +0 -52
  868. data/test/results/omopv4_plus/recall/crit_3 +0 -2
  869. data/test/results/omopv4_plus/recall/crit_cte_1 +0 -41
  870. data/test/results/omopv4_plus/recall/crit_cte_2 +0 -41
  871. data/test/results/omopv4_plus/recall/crit_nested_perm_0 +0 -52
  872. data/test/results/omopv4_plus/revenue_code/crit_1 +0 -2
  873. data/test/results/omopv4_plus/revenue_code/crit_basic +0 -2
  874. data/test/results/omopv4_plus/revenue_code/domains_1 +0 -3
  875. data/test/results/omopv4_plus/revenue_code/domains_drg100 +0 -3
  876. data/test/results/omopv4_plus/rxnorm/crit_1 +0 -2
  877. data/test/results/omopv4_plus/snomed/crit_1 +0 -2
  878. data/test/results/omopv4_plus/started_by/crit_1 +0 -5
  879. data/test/results/omopv4_plus/started_by/crit_2 +0 -2
  880. data/test/results/omopv4_plus/started_by/crit_3 +0 -2
  881. data/test/results/omopv4_plus/sum/anno_1 +0 -18
  882. data/test/results/omopv4_plus/sum/anno_2 +0 -36
  883. data/test/results/omopv4_plus/sum/num_1 +0 -2
  884. data/test/results/omopv4_plus/sum/num_2 +0 -5
  885. data/test/results/omopv4_plus/sum/num_3 +0 -254
  886. data/test/results/omopv4_plus/time_window/anno_1 +0 -20
  887. data/test/results/omopv4_plus/time_window/anno_2 +0 -40
  888. data/test/results/omopv4_plus/time_window/anno_3 +0 -36
  889. data/test/results/omopv4_plus/time_window/anno_4 +0 -39
  890. data/test/results/omopv4_plus/time_window/anno_5 +0 -57
  891. data/test/results/omopv4_plus/time_window/crit_1 +0 -52
  892. data/test/results/omopv4_plus/time_window/crit_2 +0 -157
  893. data/test/results/omopv4_plus/time_window/crit_3 +0 -52
  894. data/test/results/omopv4_plus/time_window/crit_4 +0 -157
  895. data/test/results/omopv4_plus/trim_date_end/crit_1 +0 -5
  896. data/test/results/omopv4_plus/trim_date_end/crit_2 +0 -2
  897. data/test/results/omopv4_plus/trim_date_end/crit_3 +0 -6
  898. data/test/results/omopv4_plus/trim_date_end/crit_at_least +0 -5
  899. data/test/results/omopv4_plus/trim_date_end/crit_occurrences_1 +0 -2
  900. data/test/results/omopv4_plus/trim_date_end/crit_occurrences_2 +0 -6
  901. data/test/results/omopv4_plus/trim_date_end/crit_within +0 -5
  902. data/test/results/omopv4_plus/trim_date_start/crit_1 +0 -5
  903. data/test/results/omopv4_plus/trim_date_start/crit_2 +0 -2
  904. data/test/results/omopv4_plus/trim_date_start/crit_3 +0 -6
  905. data/test/results/omopv4_plus/trim_date_start/crit_at_least +0 -5
  906. data/test/results/omopv4_plus/trim_date_start/crit_occurrences_1 +0 -2
  907. data/test/results/omopv4_plus/trim_date_start/crit_occurrences_2 +0 -6
  908. data/test/results/omopv4_plus/trim_date_start/crit_within +0 -5
  909. data/test/results/omopv4_plus/union/anno_1 +0 -43
  910. data/test/results/omopv4_plus/union/anno_2 +0 -74
  911. data/test/results/omopv4_plus/union/anno_3 +0 -18
  912. data/test/results/omopv4_plus/union/anno_4 +0 -25
  913. data/test/results/omopv4_plus/union/anno_5 +0 -33
  914. data/test/results/omopv4_plus/union/anno_6 +0 -46
  915. data/test/results/omopv4_plus/union/count_1 +0 -3
  916. data/test/results/omopv4_plus/union/count_2 +0 -3
  917. data/test/results/omopv4_plus/union/count_3 +0 -3
  918. data/test/results/omopv4_plus/union/count_4 +0 -3
  919. data/test/results/omopv4_plus/union/count_5 +0 -4
  920. data/test/results/omopv4_plus/union/optcc_1 +0 -3
  921. data/test/results/omopv4_plus/union/optcc_2 +0 -3
  922. data/test/results/omopv4_plus/union/optcc_3 +0 -3
  923. data/test/results/omopv4_plus/union/optcc_4 +0 -3
  924. data/test/results/omopv4_plus/union/optcc_5 +0 -3
  925. data/test/results/omopv4_plus/union/optcc_6 +0 -3
  926. data/test/results/omopv4_plus/union/scanno_1 +0 -22
  927. data/test/results/omopv4_plus/union/scanno_2 +0 -36
  928. data/test/results/omopv4_plus/visit_occurrence/anno_1 +0 -52
  929. data/test/results/omopv4_plus/visit_occurrence/anno_2 +0 -37
  930. data/test/results/omopv4_plus/visit_occurrence/crit_1 +0 -52
  931. data/test/results/omopv4_plus/visit_occurrence/crit_2 +0 -22945
  932. data/test/results/omopv4_plus/visit_occurrence/crit_3 +0 -46851
  933. data/test/statements/after/anno_1 +0 -7
  934. data/test/statements/after/anno_2 +0 -16
  935. data/test/statements/after/anno_3 +0 -9
  936. data/test/statements/after/anno_4 +0 -19
  937. data/test/statements/after/anno_5 +0 -21
  938. data/test/statements/after/anno_6 +0 -16
  939. data/test/statements/after/crit_at_least +0 -21
  940. data/test/statements/after/crit_basic +0 -20
  941. data/test/statements/after/crit_occurrences +0 -21
  942. data/test/statements/after/crit_within +0 -21
  943. data/test/statements/any_overlap/crit_basic1 +0 -16
  944. data/test/statements/any_overlap/crit_basic2 +0 -16
  945. data/test/statements/any_overlap/crit_occurrences1 +0 -17
  946. data/test/statements/any_overlap/crit_occurrences2 +0 -17
  947. data/test/statements/any_overlap/crit_within +0 -17
  948. data/test/statements/before/crit_at_least +0 -14
  949. data/test/statements/before/crit_basic1 +0 -13
  950. data/test/statements/before/crit_basic2 +0 -16
  951. data/test/statements/before/crit_occurrences +0 -14
  952. data/test/statements/before/crit_within +0 -14
  953. data/test/statements/co_reported/anno_1 +0 -13
  954. data/test/statements/co_reported/anno_2 +0 -21
  955. data/test/statements/co_reported/anno_3 +0 -14
  956. data/test/statements/complement/anno_duplicate_params +0 -11
  957. data/test/statements/complement/anno_invalid_params +0 -8
  958. data/test/statements/complement/anno_no_params +0 -3
  959. data/test/statements/complement/count_3way_intersect +0 -24
  960. data/test/statements/complement/count_3way_union +0 -18
  961. data/test/statements/complement/count_intersect +0 -17
  962. data/test/statements/complement/count_union +0 -14
  963. data/test/statements/complement/count_union_and_intersect +0 -27
  964. data/test/statements/complement/crit_basic1 +0 -7
  965. data/test/statements/complement/crit_icd9_selector +0 -10
  966. data/test/statements/complex/anno_1 +0 -29
  967. data/test/statements/complex/crit_1 +0 -278
  968. data/test/statements/complex/crit_2 +0 -43
  969. data/test/statements/complex/crit_3 +0 -54
  970. data/test/statements/complex/crit_4 +0 -17
  971. data/test/statements/complex/crit_5 +0 -17
  972. data/test/statements/complex/crit_6 +0 -20
  973. data/test/statements/complex/crit_7 +0 -14
  974. data/test/statements/complex/crit_out_of_order_ctes +0 -39
  975. data/test/statements/complex/scanno_1 +0 -1508
  976. data/test/statements/concurrent_within/crit_icd9 +0 -11
  977. data/test/statements/concurrent_within/crit_icd9_and_place_of_service +0 -15
  978. data/test/statements/concurrent_within/crit_negative_start +0 -15
  979. data/test/statements/condition_type/anno_icd9 +0 -7
  980. data/test/statements/condition_type/count_condition_era +0 -4
  981. data/test/statements/condition_type/count_condition_era_30_day_window +0 -4
  982. data/test/statements/condition_type/count_ehr_problem_list +0 -4
  983. data/test/statements/condition_type/count_era_0 +0 -4
  984. data/test/statements/condition_type/count_inpatient +0 -4
  985. data/test/statements/condition_type/count_inpatient_detail +0 -4
  986. data/test/statements/condition_type/count_inpatient_header +0 -4
  987. data/test/statements/condition_type/count_inpatient_header_2 +0 -4
  988. data/test/statements/condition_type/count_inpatient_header_3 +0 -4
  989. data/test/statements/condition_type/count_inpatient_header_4 +0 -4
  990. data/test/statements/condition_type/count_inpatient_header_5 +0 -4
  991. data/test/statements/condition_type/count_inpatient_outpatient_detail +0 -5
  992. data/test/statements/condition_type/count_inpatient_primary +0 -4
  993. data/test/statements/condition_type/count_inpatient_primary_or_first +0 -4
  994. data/test/statements/condition_type/count_outpatient +0 -4
  995. data/test/statements/condition_type/count_outpatient_detail +0 -4
  996. data/test/statements/condition_type/count_outpatient_header +0 -4
  997. data/test/statements/condition_type/count_outpatient_primary +0 -4
  998. data/test/statements/condition_type/count_primary +0 -4
  999. data/test/statements/contains/crit_1 +0 -16
  1000. data/test/statements/contains/crit_2 +0 -16
  1001. data/test/statements/contains/crit_3 +0 -16
  1002. data/test/statements/count/anno_multiple_upstreams +0 -11
  1003. data/test/statements/count/anno_no_upstream1 +0 -3
  1004. data/test/statements/count/anno_no_upstream2 +0 -4
  1005. data/test/statements/count/crit_icd9_ndc +0 -15
  1006. data/test/statements/count/crit_ndc +0 -11
  1007. data/test/statements/count/crit_person +0 -7
  1008. data/test/statements/cpt/anno_icd9_upstream +0 -7
  1009. data/test/statements/cpt/anno_invalid_code +0 -5
  1010. data/test/statements/cpt/count_1 +0 -4
  1011. data/test/statements/cpt/crit_1 +0 -4
  1012. data/test/statements/cpt/scanno_1 +0 -4
  1013. data/test/statements/cpt_or_hcpcs/anno_bad_format +0 -7
  1014. data/test/statements/cpt_or_hcpcs/count_1 +0 -5
  1015. data/test/statements/cpt_or_hcpcs/crit_1 +0 -5
  1016. data/test/statements/date_range/anno_1 +0 -7
  1017. data/test/statements/date_range/anno_extra_argument +0 -8
  1018. data/test/statements/date_range/anno_invalid_argument +0 -7
  1019. data/test/statements/date_range/anno_missing_argument1 +0 -6
  1020. data/test/statements/date_range/anno_missing_argument2 +0 -6
  1021. data/test/statements/date_range/anno_no_upstreams +0 -11
  1022. data/test/statements/date_range/count_1 +0 -7
  1023. data/test/statements/date_range/count_2 +0 -7
  1024. data/test/statements/death/anno_multiple_upstreams +0 -10
  1025. data/test/statements/death/anno_no_upstreams +0 -4
  1026. data/test/statements/death/crit_basic +0 -3
  1027. data/test/statements/death/crit_person +0 -7
  1028. data/test/statements/drug_type_concept/anno_has_upstreams +0 -8
  1029. data/test/statements/drug_type_concept/anno_no_arguments +0 -3
  1030. data/test/statements/drug_type_concept/crit_basic1 +0 -4
  1031. data/test/statements/drug_type_concept/crit_basic2 +0 -4
  1032. data/test/statements/during/crit_1 +0 -16
  1033. data/test/statements/during/crit_2 +0 -16
  1034. data/test/statements/equal/crit_1 +0 -17
  1035. data/test/statements/equal/crit_2 +0 -21
  1036. data/test/statements/except/anno_1 +0 -13
  1037. data/test/statements/except/anno_2 +0 -14
  1038. data/test/statements/except/count_complex +0 -31
  1039. data/test/statements/except/crit_412_cpt +0 -13
  1040. data/test/statements/except/crit_412_inpatient +0 -13
  1041. data/test/statements/filter/crit_1 +0 -15
  1042. data/test/statements/first/anno_argument +0 -4
  1043. data/test/statements/first/anno_no_upstream +0 -3
  1044. data/test/statements/first/crit_cpt +0 -7
  1045. data/test/statements/first/crit_icd9 +0 -7
  1046. data/test/statements/first/crit_union +0 -14
  1047. data/test/statements/from/anno_has_upstreams +0 -7
  1048. data/test/statements/from/anno_multiple_arguments +0 -5
  1049. data/test/statements/from_seer_visits/anno_multiple_upstreams +0 -17
  1050. data/test/statements/from_seer_visits/anno_no_upstream +0 -3
  1051. data/test/statements/from_seer_visits/crit_1 +0 -10
  1052. data/test/statements/from_seer_visits/crit_2 +0 -11
  1053. data/test/statements/from_seer_visits/crit_3 +0 -11
  1054. data/test/statements/from_seer_visits/crit_4 +0 -12
  1055. data/test/statements/gender/anno_has_upstreams +0 -7
  1056. data/test/statements/gender/crit_male +0 -4
  1057. data/test/statements/hcpcs/anno_bad_format +0 -6
  1058. data/test/statements/hcpcs/crit_A0382 +0 -4
  1059. data/test/statements/icd10/anno_bad_format +0 -5
  1060. data/test/statements/icd10/anno_has_upstreams +0 -7
  1061. data/test/statements/icd10/crit_1 +0 -4
  1062. data/test/statements/icd10pcs/anno_bad_format +0 -6
  1063. data/test/statements/icd10pcs/anno_has_upstreams +0 -7
  1064. data/test/statements/icd10pcs/crit_1 +0 -4
  1065. data/test/statements/icd9/anno_empty_label +0 -7
  1066. data/test/statements/icd9/anno_invalid_code +0 -4
  1067. data/test/statements/icd9/anno_valid_code +0 -4
  1068. data/test/statements/icd9/crit_1 +0 -4
  1069. data/test/statements/icd9_procedure/crit_1 +0 -4
  1070. data/test/statements/intersect/anno_412_inpatient +0 -11
  1071. data/test/statements/intersect/anno_has_arguments +0 -4
  1072. data/test/statements/intersect/anno_no_upstream +0 -3
  1073. data/test/statements/intersect/crit_412_inpatient +0 -11
  1074. data/test/statements/intersect/crit_412_male +0 -11
  1075. data/test/statements/intersect/crit_complex +0 -19
  1076. data/test/statements/invalid/anno_bad_op +0 -13
  1077. data/test/statements/invalid/scanno_1 +0 -7
  1078. data/test/statements/last/crit_icd9 +0 -7
  1079. data/test/statements/loinc/crit_basic +0 -4
  1080. data/test/statements/ndc/crit_basic +0 -4
  1081. data/test/statements/ndc/results_1 +0 -4
  1082. data/test/statements/numeric/anno_multiple_upstreams +0 -11
  1083. data/test/statements/numeric/num_values_1 +0 -4
  1084. data/test/statements/numeric/num_values_2 +0 -8
  1085. data/test/statements/numeric/num_values_3 +0 -8
  1086. data/test/statements/observation_period/anno_has_arguments +0 -8
  1087. data/test/statements/observation_period/anno_multiple_upstreams +0 -11
  1088. data/test/statements/observation_period/count_all_periods +0 -4
  1089. data/test/statements/observation_period/crit_female +0 -7
  1090. data/test/statements/observation_period/crit_icd9 +0 -7
  1091. data/test/statements/observation_period/crit_male +0 -7
  1092. data/test/statements/occurrence/anno_no_upstream +0 -3
  1093. data/test/statements/occurrence/count_412_410 +0 -17
  1094. data/test/statements/occurrence/crit_1 +0 -8
  1095. data/test/statements/occurrence/crit_2 +0 -11
  1096. data/test/statements/occurrence/crit_3 +0 -11
  1097. data/test/statements/one_in_two_out/anno_has_arguments +0 -8
  1098. data/test/statements/one_in_two_out/anno_multiple_upstreams +0 -15
  1099. data/test/statements/one_in_two_out/anno_no_upstream +0 -7
  1100. data/test/statements/one_in_two_out/count_1 +0 -10
  1101. data/test/statements/one_in_two_out/count_same_as_1 +0 -11
  1102. data/test/statements/one_in_two_out/crit_hcpcs +0 -10
  1103. data/test/statements/one_in_two_out/crit_icd9 +0 -11
  1104. data/test/statements/one_in_two_out/results_1 +0 -9
  1105. data/test/statements/one_in_two_out/results_2 +0 -9
  1106. data/test/statements/overlapped_by/crit_1 +0 -16
  1107. data/test/statements/overlapped_by/crit_2 +0 -16
  1108. data/test/statements/overlapped_by/crit_3 +0 -16
  1109. data/test/statements/overlapped_by/crit_4 +0 -16
  1110. data/test/statements/overlaps/crit_1 +0 -16
  1111. data/test/statements/overlaps/crit_2 +0 -16
  1112. data/test/statements/overlaps/crit_3 +0 -16
  1113. data/test/statements/overlaps/crit_4 +0 -16
  1114. data/test/statements/person/anno_has_arguments +0 -4
  1115. data/test/statements/person/anno_multiple_upstreams +0 -11
  1116. data/test/statements/person/count_2 +0 -3
  1117. data/test/statements/person/crit_1 +0 -7
  1118. data/test/statements/person_filter/count_1 +0 -20
  1119. data/test/statements/person_filter/crit_1 +0 -20
  1120. data/test/statements/person_filter/crit_2 +0 -13
  1121. data/test/statements/person_filter/crit_3 +0 -13
  1122. data/test/statements/person_filter/crit_4 +0 -13
  1123. data/test/statements/place_of_service_code/anno_has_upstreams +0 -8
  1124. data/test/statements/place_of_service_code/anno_no_arguments +0 -3
  1125. data/test/statements/place_of_service_code/crit_basic +0 -4
  1126. data/test/statements/place_of_service_filter/anno_1 +0 -8
  1127. data/test/statements/procedure_occurrence/anno_has_arguments +0 -8
  1128. data/test/statements/procedure_occurrence/anno_multiple_upstreams +0 -11
  1129. data/test/statements/procedure_occurrence/count_gender +0 -7
  1130. data/test/statements/procedure_occurrence/count_icd9 +0 -7
  1131. data/test/statements/procedure_occurrence/count_started_by +0 -19
  1132. data/test/statements/provenance/anno_1 +0 -8
  1133. data/test/statements/provenance/anno_bad_keyword +0 -10
  1134. data/test/statements/provenance/count_1 +0 -8
  1135. data/test/statements/provenance/count_2 +0 -8
  1136. data/test/statements/provider_filter/anno_1 +0 -10
  1137. data/test/statements/race/anno_1 +0 -8
  1138. data/test/statements/race/anno_2 +0 -3
  1139. data/test/statements/race/crit_1 +0 -4
  1140. data/test/statements/read/anno_1 +0 -4
  1141. data/test/statements/read/crit_1 +0 -8
  1142. data/test/statements/recall/anno_1 +0 -16
  1143. data/test/statements/recall/anno_2 +0 -18
  1144. data/test/statements/recall/anno_3 +0 -4
  1145. data/test/statements/recall/anno_4 +0 -3
  1146. data/test/statements/recall/anno_5 +0 -5
  1147. data/test/statements/recall/anno_6 +0 -107
  1148. data/test/statements/recall/crit_1 +0 -17
  1149. data/test/statements/recall/crit_2 +0 -14
  1150. data/test/statements/recall/crit_3 +0 -16
  1151. data/test/statements/recall/crit_cte_1 +0 -17
  1152. data/test/statements/recall/crit_cte_2 +0 -17
  1153. data/test/statements/recall/crit_nested_perm_0 +0 -28
  1154. data/test/statements/revenue_code/crit_1 +0 -4
  1155. data/test/statements/revenue_code/crit_basic +0 -4
  1156. data/test/statements/revenue_code/domains_1 +0 -4
  1157. data/test/statements/revenue_code/domains_drg100 +0 -4
  1158. data/test/statements/rxnorm/crit_1 +0 -4
  1159. data/test/statements/snomed/crit_1 +0 -4
  1160. data/test/statements/started_by/crit_1 +0 -16
  1161. data/test/statements/started_by/crit_2 +0 -16
  1162. data/test/statements/started_by/crit_3 +0 -16
  1163. data/test/statements/sum/anno_1 +0 -3
  1164. data/test/statements/sum/anno_2 +0 -8
  1165. data/test/statements/sum/num_1 +0 -11
  1166. data/test/statements/sum/num_2 +0 -15
  1167. data/test/statements/sum/num_3 +0 -7
  1168. data/test/statements/time_window/anno_1 +0 -7
  1169. data/test/statements/time_window/anno_2 +0 -11
  1170. data/test/statements/time_window/anno_3 +0 -11
  1171. data/test/statements/time_window/anno_4 +0 -12
  1172. data/test/statements/time_window/anno_5 +0 -15
  1173. data/test/statements/time_window/crit_1 +0 -11
  1174. data/test/statements/time_window/crit_2 +0 -11
  1175. data/test/statements/time_window/crit_3 +0 -11
  1176. data/test/statements/time_window/crit_4 +0 -11
  1177. data/test/statements/trim_date_end/crit_1 +0 -16
  1178. data/test/statements/trim_date_end/crit_2 +0 -16
  1179. data/test/statements/trim_date_end/crit_3 +0 -16
  1180. data/test/statements/trim_date_end/crit_at_least +0 -17
  1181. data/test/statements/trim_date_end/crit_occurrences_1 +0 -17
  1182. data/test/statements/trim_date_end/crit_occurrences_2 +0 -17
  1183. data/test/statements/trim_date_end/crit_within +0 -17
  1184. data/test/statements/trim_date_start/crit_1 +0 -16
  1185. data/test/statements/trim_date_start/crit_2 +0 -16
  1186. data/test/statements/trim_date_start/crit_3 +0 -16
  1187. data/test/statements/trim_date_start/crit_at_least +0 -17
  1188. data/test/statements/trim_date_start/crit_occurrences_1 +0 -17
  1189. data/test/statements/trim_date_start/crit_occurrences_2 +0 -17
  1190. data/test/statements/trim_date_start/crit_within +0 -17
  1191. data/test/statements/union/anno_1 +0 -11
  1192. data/test/statements/union/anno_2 +0 -18
  1193. data/test/statements/union/anno_3 +0 -3
  1194. data/test/statements/union/anno_4 +0 -4
  1195. data/test/statements/union/anno_5 +0 -7
  1196. data/test/statements/union/anno_6 +0 -10
  1197. data/test/statements/union/count_1 +0 -11
  1198. data/test/statements/union/count_2 +0 -11
  1199. data/test/statements/union/count_3 +0 -15
  1200. data/test/statements/union/count_4 +0 -18
  1201. data/test/statements/union/count_5 +0 -18
  1202. data/test/statements/union/scanno_1 +0 -3
  1203. data/test/statements/union/scanno_2 +0 -18
  1204. data/test/statements/visit_occurrence/anno_1 +0 -11
  1205. data/test/statements/visit_occurrence/anno_2 +0 -8
  1206. data/test/statements/visit_occurrence/crit_1 +0 -7
  1207. data/test/statements/visit_occurrence/crit_2 +0 -7
  1208. data/test/statements/visit_occurrence/crit_3 +0 -3
@@ -1,95 +1,56 @@
1
- require 'zlib'
2
- require_relative '../behaviors/metadatable'
3
- require 'facets/array/extract_options'
4
- require 'facets/hash/deep_rekey'
5
- require 'forwardable'
6
- require_relative '../query_modifiers/pos_query_modifier'
7
- require_relative '../query_modifiers/drug_query_modifier'
1
+ # frozen_string_literal: true
2
+
3
+ require "zlib"
4
+ require_relative "../behaviors/metadatable"
5
+ require "forwardable"
8
6
 
9
7
  module ConceptQL
10
8
  module Operators
11
- OPERATORS = {:omopv4=>{}, :omopv4_plus=>{}}.freeze
12
-
13
- TABLE_VOCABULARY_ID_COLUMN = {
14
- :condition_occurrence=> :condition_source_vocabulary_id,
15
- :death=> :cause_of_death_source_vocabulary_id,
16
- :drug_exposure=> :drug_source_vocabulary_id,
17
- :observation=> :observation_source_vocabulary_id,
18
- :procedure_occurrence=> :procedure_source_vocabulary_id,
19
- :provider=> :specialty_source_vocabulary_id,
20
- :visit_occurrence=> :place_of_service_source_vocabulary_id
21
- }.freeze.each_value(&:freeze)
22
-
23
- TABLE_SOURCE_VALUE_COLUMN = {
24
- :condition_occurrence=> :condition_source_value,
25
- :death=> :cause_of_death_source_value,
26
- :drug_exposure=> :drug_source_value,
27
- :observation=> :observation_source_value,
28
- :procedure_occurrence=> :procedure_source_value,
29
- :provider=> :provider_source_value,
30
- :visit_occurrence=> :place_of_service_source_value
31
- }.freeze.each_value(&:freeze)
32
-
33
- TABLE_COLUMNS = {
34
- :care_site=>[:care_site_id, :location_id, :organization_id, :place_of_service_concept_id, :care_site_source_value, :place_of_service_source_value],
35
- :cohort=>[:cohort_id, :cohort_concept_id, :cohort_start_date, :cohort_end_date, :subject_id, :stop_reason],
36
- :concept=>[:concept_id, :concept_name, :concept_level, :concept_class, :vocabulary_id, :concept_code, :valid_start_date, :valid_end_date, :invalid_reason],
37
- :concept_ancestor=>[:ancestor_concept_id, :descendant_concept_id, :min_levels_of_separation, :max_levels_of_separation],
38
- :concept_relationship=>[:concept_id_1, :concept_id_2, :relationship_id, :valid_start_date, :valid_end_date, :invalid_reason],
39
- :concept_synonym=>[:concept_synonym_id, :concept_id, :concept_synonym_name],
40
- :condition_era=>[:condition_era_id, :person_id, :condition_concept_id, :condition_era_start_date, :condition_era_end_date, :condition_type_concept_id, :condition_occurrence_count],
41
- :condition_occurrence=>[:condition_occurrence_id, :person_id, :condition_concept_id, :condition_start_date, :condition_end_date, :condition_type_concept_id, :stop_reason, :associated_provider_id, :visit_occurrence_id, :condition_source_value],
42
- :death=>[:person_id, :death_date, :death_type_concept_id, :cause_of_death_concept_id, :cause_of_death_source_value],
43
- :drug_approval=>[:ingredient_concept_id, :approval_date, :approved_by],
44
- :drug_cost=>[:drug_cost_id, :drug_exposure_id, :paid_copay, :paid_coinsurance, :paid_toward_deductible, :paid_by_payer, :paid_by_coordination_benefits, :total_out_of_pocket, :total_paid, :ingredient_cost, :dispensing_fee, :average_wholesale_price, :payer_plan_period_id],
45
- :drug_era=>[:drug_era_id, :person_id, :drug_concept_id, :drug_era_start_date, :drug_era_end_date, :drug_type_concept_id, :drug_exposure_count],
46
- :drug_exposure=>[:drug_exposure_id, :person_id, :drug_concept_id, :drug_exposure_start_date, :drug_exposure_end_date, :drug_type_concept_id, :stop_reason, :refills, :quantity, :days_supply, :sig, :prescribing_provider_id, :visit_occurrence_id, :relevant_condition_concept_id, :drug_source_value],
47
- :drug_strength=>[:drug_concept_id, :ingredient_concept_id, :amount_value, :amount_unit, :concentration_value, :concentration_enum_unit, :concentration_denom_unit, :valid_start_date, :valid_end_date, :invalid_reason],
48
- :location=>[:location_id, :address_1, :address_2, :city, :state, :zip, :county, :location_source_value],
49
- :observation=>[:observation_id, :person_id, :observation_concept_id, :observation_date, :observation_time, :value_as_number, :value_as_string, :value_as_concept_id, :unit_concept_id, :range_low, :range_high, :observation_type_concept_id, :associated_provider_id, :visit_occurrence_id, :relevant_condition_concept_id, :observation_source_value, :unit_source_value],
50
- :observation_period=>[:observation_period_id, :person_id, :observation_period_start_date, :observation_period_end_date, :prev_ds_period_end_date],
51
- :organization=>[:organization_id, :place_of_service_concept_id, :location_id, :organization_source_value, :place_of_service_source_value],
52
- :payer_plan_period=>[:payer_plan_period_id, :person_id, :payer_plan_period_start_date, :payer_plan_period_end_date, :payer_source_value, :plan_source_value, :family_source_value, :prev_ds_period_end_date],
53
- :person=>[:person_id, :gender_concept_id, :year_of_birth, :month_of_birth, :day_of_birth, :race_concept_id, :ethnicity_concept_id, :location_id, :provider_id, :care_site_id, :person_source_value, :gender_source_value, :race_source_value, :ethnicity_source_value],
54
- :procedure_cost=>[:procedure_cost_id, :procedure_occurrence_id, :paid_copay, :paid_coinsurance, :paid_toward_deductible, :paid_by_payer, :paid_by_coordination_benefits, :total_out_of_pocket, :total_paid, :disease_class_concept_id, :revenue_code_concept_id, :payer_plan_period_id, :disease_class_source_value, :revenue_code_source_value],
55
- :procedure_occurrence=>[:procedure_occurrence_id, :person_id, :procedure_concept_id, :procedure_date, :procedure_type_concept_id, :associated_provider_id, :visit_occurrence_id, :relevant_condition_concept_id, :procedure_source_value],
56
- :provider=>[:provider_id, :npi, :dea, :specialty_concept_id, :care_site_id, :provider_source_value, :specialty_source_value],
57
- :relationship=>[:relationship_id, :relationship_name, :is_hierarchical, :defines_ancestry, :reverse_relationship],
58
- :source_to_concept_map=>[:source_code, :source_vocabulary_id, :source_code_description, :target_concept_id, :target_vocabulary_id, :mapping_type, :primary_map, :valid_start_date, :valid_end_date, :invalid_reason],
59
- :visit_occurrence=>[:visit_occurrence_id, :person_id, :visit_start_date, :visit_end_date, :place_of_service_concept_id, :care_site_id, :place_of_service_source_value],
60
- :vocabulary=>[:vocabulary_id, :vocabulary_name],
61
-
62
- # Modifier Tables
63
- :drug_appendix=>[:drug_name, :drug_amount, :drug_amount_units]
64
- }.freeze.each_value(&:freeze)
65
-
66
- def self.operators
67
- OPERATORS
9
+ # Built-in operators only: the classes that call Operator.register when
10
+ # their file loads. Vocabulary operators are not in here; each
11
+ # ConceptQL::Database builds its own from its lexicon (Database#operators).
12
+ STATIC_OPERATORS = { omopv4_plus: {}, gdm: {}, gdm_wide: {} }.freeze
13
+
14
+ SELECTED_COLUMNS = %i[person_id
15
+ criterion_id
16
+ criterion_table
17
+ criterion_domain
18
+ start_date
19
+ end_date
20
+ value_as_number
21
+ value_as_string
22
+ value_as_concept_id
23
+ units_source_value
24
+ source_value].freeze
25
+
26
+ def self.static_operators
27
+ STATIC_OPERATORS
68
28
  end
69
29
 
70
30
  class Operator
71
31
  extend Forwardable
72
32
  extend ConceptQL::Metadatable
73
33
 
74
- attr :nodifier, :values, :options, :arguments, :upstreams
34
+ attr_reader :nodifier, :values, :options, :arguments, :upstreams, :op_name, :errors, :warnings
75
35
 
76
36
  option :label, type: :string
77
37
 
78
38
  @validations = []
79
39
 
80
40
  class << self
81
- attr :validations, :codes_regexp, :required_columns
41
+ attr_reader :validations, :required_columns
82
42
 
83
43
  def register(file, *data_models)
84
- data_models = OPERATORS.keys if data_models.empty?
44
+ data_models = STATIC_OPERATORS.keys if data_models.empty?
85
45
  data_models.each do |dm|
86
- OPERATORS[dm][File.basename(file).sub(/\.rb\z/, '')] = self
46
+ op_name = File.basename(file).sub(/\.rb\z/, "").downcase
47
+ Operators.static_operators[dm][op_name] = self
87
48
  end
88
49
  end
89
50
 
90
51
  def query_columns(*tables)
91
52
  define_method(:query_cols) do
92
- table_columns(*tables)
53
+ dm.table_columns(*tables)
93
54
  end
94
55
  end
95
56
 
@@ -104,7 +65,7 @@ module ConceptQL
104
65
  @required_columns << column
105
66
  end
106
67
 
107
- validation_meths = (<<-END).split.map(&:to_sym)
68
+ validation_meths = <<-END.split.map(&:to_sym)
108
69
  no_upstreams
109
70
  one_upstream
110
71
  at_least_one_upstream
@@ -121,19 +82,21 @@ module ConceptQL
121
82
  validation_meths.each do |type|
122
83
  meth = :"validate_#{type}"
123
84
  define_method(meth) do |*args|
124
- validations << [meth, *args]
85
+ validations << [ meth, *args ]
125
86
  end
126
87
  end
127
88
 
128
- def codes_should_match(format)
129
- @codes_regexp = format
130
- validate_codes_match
89
+ # Declares inherited options that this operator does not support.
90
+ # They leave the operator's metadata, and a statement that sets one
91
+ # fails validation.
92
+ def unsupported_options(*names)
93
+ names.each { |name| remove_option(name) }
94
+ validations << [ :validate_unsupported_options, *names ]
131
95
  end
132
96
 
133
97
  def inherited(subclass)
134
98
  super
135
99
  subclass.instance_variable_set(:@validations, validations.dup)
136
- subclass.instance_variable_set(:@codes_regexp, codes_regexp.dup) if codes_regexp
137
100
  end
138
101
 
139
102
  def new(*)
@@ -143,20 +106,23 @@ module ConceptQL
143
106
  # to it use the same code.
144
107
  if operator.label && !operator.errors
145
108
  operator.scope.add_operator(operator)
146
- operator = Operators::Recall.new(operator.nodifier, operator.label, replaced: true)
109
+ operator = Operators::Recall.new(operator.nodifier, "recall", operator.label, replaced: true)
147
110
  end
148
111
 
149
112
  operator
150
113
  end
151
114
  end
152
115
 
153
- def initialize(nodifier, *args)
116
+ def initialize(nodifier, op_name, *args)
154
117
  @nodifier = nodifier
118
+
119
+ # Under what name was this operator instantiated?
120
+ # For operators like "vocabulary", this tells the instance which
121
+ # vocabulary operator to impersonate
122
+ @op_name = op_name
155
123
  @options = {}
156
- while args.last.is_a?(Hash)
157
- @options = @options.merge(args.extract_options!.deep_rekey)
158
- end
159
- args.reject!{|arg| arg.nil? || arg == ''}
124
+ @options = @options.merge(ConceptQL::Utils.rekey(args.pop)) while args.last.is_a?(Hash)
125
+ args.reject! { |arg| arg.nil? || arg == "" }
160
126
  @upstreams, @arguments = args.partition { |arg| arg.is_a?(Array) || arg.is_a?(Operator) }
161
127
  @values = args
162
128
 
@@ -166,7 +132,7 @@ module ConceptQL
166
132
  end
167
133
 
168
134
  def create_upstreams
169
- @upstreams.map!{|stmt| to_op(stmt)}
135
+ @upstreams.map! { |stmt| to_op(stmt) }
170
136
  end
171
137
 
172
138
  def to_op(stmt)
@@ -178,47 +144,54 @@ module ConceptQL
178
144
  end
179
145
 
180
146
  def required_columns
181
- self.class.required_columns
147
+ cols = self.class.required_columns || []
148
+ cols |= [ :uuid ] if options[:uuid]
149
+ cols
182
150
  end
183
151
 
184
152
  def dynamic_columns
185
153
  scope.query_columns
186
154
  end
187
155
 
156
+ def cte_name(name)
157
+ scope.cte_name(name)
158
+ end
159
+
188
160
  def annotate(db, opts = {})
189
- return @annotation if defined?(@annotation)
161
+ return @annotate if defined?(@annotate)
190
162
 
191
- scope_key = options[:id]||self.class.just_class_name.underscore
163
+ scope_key = options[:id] || op_name
192
164
  annotation = {}
193
165
  counts = (annotation[:counts] ||= {})
194
- metadata = {:annotation=>annotation}
195
- if name = self.class.preferred_name
166
+ metadata = { annotation: annotation }
167
+
168
+ if (name = preferred_name)
196
169
  metadata[:name] = name
197
170
  end
198
- res = [operator_name, *annotate_values(db, opts)]
171
+ res = [ op_name, *annotate_values(db, opts) ]
199
172
 
200
173
  if upstreams_valid?(db, opts) && scope.valid? && include_counts?(db, opts)
201
- scope.with_ctes(evaluate(db), db)
202
- .from_self
203
- .select_group(:criterion_domain)
204
- .select_append{count{}.*.as(:rows)}
205
- .select_append{count(:person_id).distinct.as(:n)}
206
- .each do |h|
207
- counts[h.delete(:criterion_domain).to_sym] = h
208
- end
174
+ scope.with_ctes(self, db)
175
+ .from_self
176
+ .select_group(:criterion_domain)
177
+ .select_append { Sequel.function(:count, 1).as(:rows) }
178
+ .select_append { count(:person_id).distinct.as(:n) }
179
+ .each do |h|
180
+ counts[h.delete(:criterion_domain).to_sym] = h
181
+ end
209
182
  elsif !errors.empty?
210
183
  annotation[:errors] = errors
211
184
  scope.add_errors(scope_key, errors)
212
185
  end
213
- scope.add_operators(self)
186
+
214
187
  domains(db).each do |domain|
215
- cur_counts = counts[domain] ||= {:rows=>0, :n=>0}
188
+ cur_counts = counts[domain] ||= { rows: 0, n: 0 }
216
189
  scope.add_counts(scope_key, domain, cur_counts)
217
190
  end
218
191
 
219
192
  if defined?(@warnings) && !warnings.empty?
220
193
  annotation[:warnings] = warnings
221
- scope.add_warnings(scope_key, warnings)
194
+ scope.add_warnings(scope_key, warnings.dup)
222
195
  end
223
196
 
224
197
  if res.last.is_a?(Hash)
@@ -227,18 +200,11 @@ module ConceptQL
227
200
  res << metadata
228
201
  end
229
202
 
230
- @annotation = res
203
+ @annotate = res
231
204
  end
232
205
 
233
206
  def code_list(db)
234
- code_lists = @upstreams.map do | upstream_op |
235
- upstream_op.code_list(db)
236
- end
237
- code_lists.flatten(1)
238
- end
239
-
240
- def dup_values(args)
241
- self.class.new(nodifier, *args)
207
+ upstreams.flat_map { |upstream_op| upstream_op.code_list(db) }
242
208
  end
243
209
 
244
210
  def inspect
@@ -246,61 +212,96 @@ module ConceptQL
246
212
  end
247
213
 
248
214
  def evaluate(db)
249
- select_it(query(db))
215
+ q = select_it(query(db))
216
+ name = cte_name(op_name)
217
+ opts = {}
218
+ opts[:materialized] = true if rdbms.supports_materialized?
219
+ db[name].with(name, q, opts)
220
+ end
221
+
222
+ def pretty_print(pp)
223
+ pp.object_group self do
224
+ unless pp_upstreams.empty?
225
+ pp.breakable
226
+ pp.text "@upstreams="
227
+ pp.pp pp_upstreams
228
+ pp.comma_breakable unless arguments.empty?
229
+ end
230
+ unless arguments.empty?
231
+ pp.breakable if pp_upstreams.empty?
232
+ pp.text "@arguments="
233
+ pp.pp arguments
234
+ end
235
+ end
250
236
  end
251
237
 
252
- def sql(db)
253
- evaluate(db).sql
238
+ def pp_upstreams
239
+ upstreams
254
240
  end
255
241
 
256
- def optimized
257
- dup_values(values.map{|x| x.is_a?(Operator) ? x.optimized : x})
242
+ def all_upstreams
243
+ upstreams
258
244
  end
259
245
 
260
- def unionable?(other)
261
- false
246
+ def sql(db)
247
+ evaluate(db).sql
262
248
  end
263
249
 
264
- def select_it(query, specific_domain = nil)
265
- if specific_domain.nil? && respond_to?(:domain) && TABLE_COLUMNS.keys.include?(domain)
266
- specific_domain = domain
250
+ def select_it(query, opts = {})
251
+ specific_table = opts[:specific_table]
252
+ specific_table ||= dm.determine_table(:source_table)
253
+ specific_table ||= dm.determine_table(:table)
254
+ specific_table ||= dm.determine_table(:domain)
255
+
256
+ dom = begin
257
+ opts[:domain] || domain
258
+ rescue StandardError
259
+ nil
267
260
  end
268
261
 
269
- q = setup_select(query, specific_domain)
262
+ opts = {
263
+ table: specific_table,
264
+ criterion_domain: dom,
265
+ query_columns: override_columns,
266
+ uuid: opts[:uuid] || options[:uuid]
267
+ }
268
+
269
+ cf = column_family || (specific_table ? ConceptQL::Scope::DEFAULT_COLUMN_FAMILY : nil)
270
+ opts[:replace] ||= {}
271
+ opts[:replace][:label] = label if label
272
+ opts[:replace][:column_family] = cf if cf
270
273
 
271
- if scope && scope.person_ids && upstreams.empty?
272
- q = q.where(person_id: scope.person_ids).from_self
273
- end
274
+ query = query.comment(comment) if comments?
274
275
 
275
- q
276
+ dm.selectify(query, opts)
276
277
  end
277
278
 
278
- def domains(db)
279
- @domains ||= determine_domains(db)
279
+ def comments?
280
+ ENV["CONCEPTQL_ENABLE_COMMENTS"] == "true"
280
281
  end
281
282
 
282
- def stream
283
- @stream ||= upstreams.first
283
+ def comment
284
+ PP.pp(self, "".dup, 10)
284
285
  end
285
286
 
286
- def setup_select(query, local_domain = nil)
287
- query = modify_query(query, local_domain)
288
- query.select(*columns(query, local_domain))
287
+ def override_columns
288
+ nil
289
+ end
290
+
291
+ def domains(db)
292
+ @domains ||= determine_domains(db)
289
293
  end
290
294
 
291
- def columns(query, local_domain)
292
- criterion_domain = :criterion_domain
295
+ def tables
296
+ @tables ||= determine_tables
297
+ end
293
298
 
294
- if local_domain
295
- criterion_domain = cast_column(:criterion_domain, local_domain.to_s)
296
- end
299
+ def stream
300
+ @stream ||= upstreams.first
301
+ end
297
302
 
298
- columns = [:person_id,
299
- domain_id(local_domain),
300
- criterion_domain]
301
- columns += date_columns(query, local_domain)
302
- columns += [ source_value(query, local_domain) ]
303
- columns += additional_columns(query, local_domain)
303
+ def columns(table = nil)
304
+ dm.columns(table: table)
304
305
  end
305
306
 
306
307
  def label
@@ -310,18 +311,15 @@ module ConceptQL
310
311
  end
311
312
  end
312
313
 
313
- attr :errors, :warnings
314
+ def column_family; end
314
315
 
315
316
  def valid?(db, opts = {})
316
- return @errors.empty? if defined?(@errors)
317
- @errors = []
318
- @warnings = []
319
317
  validate(db, opts)
320
318
  errors.empty?
321
319
  end
322
320
 
323
321
  def upstreams_valid?(db, opts = {})
324
- valid?(db, opts) && upstreams.all?{|u| u.upstreams_valid?(db, opts)}
322
+ valid?(db, opts) && upstreams.all? { |u| u.upstreams_valid?(db, opts) }
325
323
  end
326
324
 
327
325
  def scope
@@ -350,94 +348,81 @@ module ConceptQL
350
348
  end
351
349
  end
352
350
 
353
- private
354
-
355
- def annotate_values(db, opts)
356
- (upstreams.map { |op| op.annotate(db, opts) } + arguments).push(options)
351
+ def omopv4_plus?
352
+ data_model == :omopv4_plus
357
353
  end
358
354
 
359
- def criterion_id
360
- :criterion_id
355
+ def gdm?
356
+ %i[gdm gdm_wide].include?(data_model)
361
357
  end
362
358
 
363
- def domain_id(domain = nil)
364
- return :criterion_id if domain.nil?
365
- domain = :person if domain == :death
366
- Sequel.expr(make_domain_id(domain)).as(:criterion_id)
359
+ def wide?
360
+ %i[gdm_wide].include?(data_model)
367
361
  end
368
362
 
369
- def make_domain_id(domain)
370
- (domain.to_s + '_id').to_sym
363
+ def dm
364
+ @dm ||= DataModel.for(self, nodifier)
371
365
  end
372
366
 
373
- def make_table_name(table)
374
- "#{table}___tab".to_sym
367
+ def rdbms
368
+ dm.rdbms
375
369
  end
376
370
 
377
371
  def query_cols
378
372
  raise NotImplementedError, self
379
373
  end
380
374
 
381
- def query_columns(query)
382
- unless cols = query.opts[:force_columns]
383
- cols = query_cols
384
- end
385
-
386
- if ENV['CONCEPTQL_CHECK_COLUMNS']
387
- if cols.sort != query.columns.sort
388
- raise "columns don't match:\nclass: #{self.class}\nexpected: #{cols}\nactual: #{query.columns}\nvalues: #{values}\nSQL: #{query.sql}"
389
- end
375
+ def events_per_patient
376
+ if upstreams.first
377
+ upstreams.first.events_per_patient
378
+ else
379
+ :multiple
390
380
  end
391
-
392
- cols
393
- end
394
-
395
- def omopv4_plus?
396
- data_model == :omopv4_plus
397
381
  end
398
382
 
399
- def omopv4?
400
- data_model == :omopv4
401
- end
402
-
403
- def impala?
404
- database_type.to_sym == :impala
383
+ def vocabularies
384
+ if respond_to?(:vocab_entry)
385
+ [ vocab_entry.omopv5_vocabulary_id ]
386
+ elsif upstreams.any?
387
+ upstreams.flat_map(&:vocabularies).uniq
388
+ else
389
+ []
390
+ end
405
391
  end
406
392
 
407
- def table_to_sym(table)
408
- case table
409
- when Symbol
410
- table = Sequel.split_symbol(table)[1].to_sym
393
+ def multiple_vocabularies
394
+ if upstreams.any?
395
+ upstreams.first.multiple_vocabularies
396
+ else
397
+ false
411
398
  end
412
- table
413
399
  end
414
400
 
415
- def table_cols(table)
416
- table = table_to_sym(table)
417
- cols = TABLE_COLUMNS.fetch(table)
418
- if omopv4_plus?
419
- cols += Array(table_vocabulary_id(table))
420
- end
421
- cols
401
+ def accept(visitor, opts = {})
402
+ visitor.visit(self)
403
+ upstreams.each { |u| u.accept(visitor, opts) }
422
404
  end
423
405
 
424
- def table_columns(*tables)
425
- tables.map{|t| table_cols(t)}.flatten
406
+ private
407
+
408
+ def annotate_values(db, opts)
409
+ (upstreams.map { |op| op.annotate(db, opts) } + arguments).push(options)
426
410
  end
427
411
 
428
- def table_source_value(table)
429
- TABLE_SOURCE_VALUE_COLUMN.fetch(table_to_sym(table))
412
+ def make_table_name(table)
413
+ Sequel.as(table, :tab)
430
414
  end
431
415
 
432
- def table_vocabulary_id(table)
433
- TABLE_VOCABULARY_ID_COLUMN[table_to_sym(table)]
416
+ def query_columns(query)
417
+ dm.query_columns(query)
434
418
  end
435
419
 
436
- def additional_columns(query, domain)
420
+ def additional_columns(query, table)
437
421
  special_columns = {
438
- provenance_type: Proc.new { provenance_type(query, domain) },
439
- provider_id: Proc.new { provider_id(query, domain) },
440
- place_of_service_concept_id: Proc.new { place_of_service_concept_id(query, domain) }
422
+ code_provenance_type: proc { code_provenance_type(query, table) },
423
+ file_provenance_type: proc { file_provenance_type(query, table) },
424
+ provider_id: proc { provider_id(query, table) },
425
+ visit_source_concept_id: proc { dm.place_of_service_concept_id(query, table) }
441
426
  }
442
427
 
443
428
  additional_cols = special_columns.each_with_object([]) do |(column, proc_obj), columns|
@@ -449,216 +434,91 @@ module ConceptQL
449
434
 
450
435
  standard_columns.each do |column|
451
436
  additional_cols << if query_columns(query).include?(column)
452
- column
437
+ column
453
438
  else
454
- cast_column(column)
439
+ cast_column(column)
455
440
  end
456
441
  end
457
442
 
458
443
  additional_cols
459
444
  end
460
445
 
461
- def source_value(query, domain)
446
+ def source_value(query, table)
462
447
  return :source_value if query_columns(query).include?(:source_value)
463
- cast_column(:source_value, source_value_column(query, domain))
448
+
449
+ cast_column(:source_value, dm.source_value_column(query, table))
464
450
  end
465
451
 
466
- def provenance_type(query, domain)
467
- return :provenance_type if query_columns(query).include?(:provenance_type)
468
- cast_column(:provenance_type, provenance_type_column(query, domain))
452
+ def source_vocabulary_id(query, table)
453
+ return :source_vocabulary_id if query_columns(query).include?(:source_vocabulary_id)
454
+
455
+ cast_column(:source_vocabulary_id, dm.source_vocabulary_id(query, table))
469
456
  end
470
457
 
471
- def provider_id(query, domain)
472
- return :provider_id if query_columns(query).include?(:provider_id)
473
- cast_column(:provider_id, provider_id_column(query, domain))
474
- end
475
-
476
- def place_of_service_concept_id(query, domain)
477
- return :place_of_service_concept_id if query_columns(query).include?(:place_of_service_concept_id)
478
- cast_column(:place_of_service_concept_id, place_of_service_concept_id_column(query, domain))
479
- end
480
-
481
- def date_columns(query, domain = nil)
482
- return [:start_date, :end_date] if (query_columns(query).include?(:start_date) && query_columns(query).include?(:end_date))
483
- return [:start_date, :end_date] unless domain
484
-
485
- date_klass = Date
486
- if query.db.database_type == :impala
487
- date_klass = DateTime
488
- end
489
-
490
- sd = start_date_column(query, domain)
491
- sd = Sequel.cast(Sequel.expr(sd), date_klass).as(:start_date) unless sd == :start_date
492
- ed = end_date_column(query, domain)
493
- ed = Sequel.cast(Sequel.function(:coalesce, Sequel.expr(ed), start_date_column(query, domain)), date_klass).as(:end_date) unless ed == :end_date
494
- [sd, ed]
495
- end
496
-
497
- # TODO: Move these hashes into a configuration file
498
- # THey are OMOP-specific bits of information and need to be abstracted away
499
-
500
- def start_date_column(query, domain)
501
- {
502
- condition_occurrence: :condition_start_date,
503
- death: :death_date,
504
- drug_exposure: :drug_exposure_start_date,
505
- drug_cost: nil,
506
- payer_plan_period: :payer_plan_period_start_date,
507
- person: person_date_of_birth(query),
508
- procedure_occurrence: :procedure_date,
509
- procedure_cost: nil,
510
- observation: :observation_date,
511
- observation_period: :observation_period_start_date,
512
- visit_occurrence: :visit_start_date
513
- }[domain]
514
- end
515
-
516
- def end_date_column(query, domain)
517
- {
518
- condition_occurrence: :condition_end_date,
519
- death: :death_date,
520
- drug_exposure: :drug_exposure_end_date,
521
- drug_cost: nil,
522
- payer_plan_period: :payer_plan_period_end_date,
523
- person: person_date_of_birth(query),
524
- procedure_occurrence: :procedure_date,
525
- procedure_cost: nil,
526
- observation: :observation_date,
527
- observation_period: :observation_period_end_date,
528
- visit_occurrence: :visit_end_date
529
- }[domain]
530
- end
531
-
532
- def source_value_column(query, domain)
533
- {
534
- condition_occurrence: :condition_source_value,
535
- death: :cause_of_death_source_value,
536
- drug_exposure: :drug_source_value,
537
- drug_cost: nil,
538
- payer_plan_period: :payer_plan_period_source_value,
539
- person: :person_source_value,
540
- procedure_occurrence: :procedure_source_value,
541
- procedure_cost: nil,
542
- observation: :observation_source_value,
543
- observation_period: nil,
544
- visit_occurrence: :place_of_service_source_value
545
- }[domain]
546
- end
547
-
548
- def provenance_type_column(query, domain)
549
- {
550
- condition_occurrence: :condition_type_concept_id,
551
- death: :death_type_concept_id,
552
- drug_exposure: :drug_type_concept_id,
553
- observation: :observation_type_concept_id,
554
- procedure_occurrence: :procedure_type_concept_id
555
- }[domain]
556
- end
557
-
558
- def provenance_type_column(query, domain)
559
- {
560
- condition_occurrence: :condition_type_concept_id,
561
- death: :death_type_concept_id,
562
- drug_exposure: :drug_type_concept_id,
563
- observation: :observation_type_concept_id,
564
- procedure_occurrence: :procedure_type_concept_id
565
- }[domain]
566
- end
567
-
568
- def provider_id_column(query, domain)
569
- {
570
- condition_occurrence: :associated_provider_id,
571
- death: :death_type_concept_id,
572
- drug_exposure: :prescribing_provider_id,
573
- observation: :associated_provider_id,
574
- person: :provider_id,
575
- procedure_occurrence: :associated_provider_id,
576
- provider: :provider_id
577
- }[domain]
578
- end
579
-
580
- def place_of_service_concept_id_column(query, domain)
581
- return nil if domain.nil?
582
- return :place_of_service_concept_id if table_cols(domain).include?(:visit_occurrence_id)
583
- return nil
584
- end
585
-
586
- def modify_query(query, domain)
587
- {
588
- place_of_service_concept_id: ConceptQL::QueryModifiers::PoSQueryModifier,
589
- drug_name: ConceptQL::QueryModifiers::DrugQueryModifier
590
- }.each do |column, klass|
591
- #p [domain, column, table, join_id, source_column]
592
- #p dynamic_columns
593
- #p query_cols
594
- next if domain.nil?
595
- next unless dynamic_columns.include?(column)
596
- query = klass.new(query, self).modified_query
597
- end
598
-
599
- query
600
- end
601
-
602
- def person_date_of_birth(query)
603
- assemble_date(query, :year_of_birth, :month_of_birth, :day_of_birth)
604
- end
605
-
606
- def assemble_date(query, *symbols)
607
- strings = symbols.map do |symbol|
608
- sub = '2000'
609
- col = Sequel.cast_string(symbol)
610
- if symbol != :year_of_birth
611
- sub = '01'
612
- col = Sequel.function(:lpad, col, 2, '0')
613
- end
614
- Sequel.function(:coalesce, col, Sequel.expr(sub))
615
- end
458
+ def code_provenance_type(query, table)
459
+ return :code_provenance_type if query_columns(query).include?(:code_provenance_type)
460
+
461
+ cast_column(:code_provenance_type, dm.provenance_type_column(query, table))
462
+ end
616
463
 
617
- strings_with_dashes = strings.zip(['-'] * (symbols.length - 1)).flatten.compact
618
- concatted_strings = Sequel.join(strings_with_dashes)
464
+ def file_provenance_type(query, table)
465
+ return :file_provenance_type if query_columns(query).include?(:file_provenance_type)
619
466
 
620
- date = concatted_strings
621
- if query.db.database_type == :impala
622
- date = Sequel.cast(Sequel.function(:concat_ws, '-', *strings), DateTime)
623
- end
624
- cast_date(query.db, date)
467
+ cast_column(:file_provenance_type, dm.provenance_type_column(query, table))
625
468
  end
626
469
 
627
- def cast_date(db, date)
628
- case db.database_type
629
- when :oracle
630
- Sequel.function(:to_date, date, 'YYYY-MM-DD')
631
- when :mssql
632
- Sequel.lit('CONVERT(DATETIME, ?)', date)
470
+ def provider_id(query, table)
471
+ return :provider_id if query_columns(query).include?(:provider_id)
472
+
473
+ cast_column(:provider_id, dm.provider_id_column(query, table))
474
+ end
475
+
476
+ def determine_tables
477
+ if upstreams.empty?
478
+ if respond_to?(:table)
479
+ [ table ]
480
+ else
481
+ [ :invalid ]
482
+ end
633
483
  else
634
- Sequel.cast(date, Date)
484
+ tables = upstreams.compact.map(&:tables).flatten.uniq
485
+ tables.empty? ? [ :invalid ] : tables
635
486
  end
636
487
  end
637
488
 
638
489
  def determine_domains(db)
639
490
  if upstreams.empty?
640
491
  if respond_to?(:domain)
641
- [domain]
492
+ [ domain ]
642
493
  else
643
- [:invalid]
494
+ [ :invalid ]
644
495
  end
645
496
  else
646
497
  doms = upstreams.compact.flat_map { |up| up.domains(db) }.uniq
647
- doms.empty? ? [:invalid] : doms
498
+ doms.empty? ? [ :invalid ] : doms
648
499
  end
649
500
  end
650
501
 
651
502
  # Validation Related
652
503
 
653
504
  def upstream_operator_names
654
- @upstreams.map(&:operator_name)
505
+ @upstreams.map(&:op_name)
655
506
  end
656
507
 
657
508
  def validate(db, opts = {})
509
+ return if @_validated
510
+
511
+ @errors = [] unless defined?(@errors)
512
+ @warnings = [] unless defined?(@warnings)
513
+
658
514
  add_error("invalid label") if label && !label.is_a?(String)
659
515
  self.class.validations.each do |args|
660
516
  send(*args)
661
517
  end
518
+
519
+ additional_validation(db, opts)
520
+
521
+ @_validated = true
662
522
  end
663
523
 
664
524
  def validate_no_upstreams
@@ -697,37 +557,54 @@ module ConceptQL
697
557
 
698
558
  def validate_option(format, *opts)
699
559
  opts.each do |opt|
700
- if options.has_key?(opt)
701
- unless format === options[opt]
702
- add_error("wrong option format", opt.to_s)
703
- end
704
- end
560
+ next unless options.key?(opt)
561
+
562
+ add_error("wrong option format", opt.to_s, options[opt]) unless format === options[opt]
705
563
  end
706
564
  end
707
565
 
708
566
  def validate_required_options(*opts)
709
567
  opts.each do |opt|
710
- unless options.has_key?(opt)
711
- add_error("required option not present", opt.to_s)
712
- end
568
+ add_error("required option not present", opt.to_s) unless options.key?(opt)
569
+ end
570
+ end
571
+
572
+ # A blank value counts as not set, as in Occurrence#at_least_option
573
+ def validate_unsupported_options(*opts)
574
+ opts.each do |opt|
575
+ next if options[opt].to_s.strip.empty?
576
+
577
+ add_error("unsupported option", opt.to_s, options[opt])
713
578
  end
714
579
  end
715
580
 
716
581
  def bad_arguments
717
- return [] unless self.class.codes_regexp
582
+ return [] unless code_regexp
583
+ # Vocabulary#select_all? is private, so include private methods.
584
+ return [] if respond_to?(:select_all?, true) && select_all?
585
+
718
586
  @bad_arguments ||= arguments.reject do |arg|
719
- self.class.codes_regexp === arg
587
+ code_regexp === arg
720
588
  end
721
589
  end
722
590
 
591
+ # Only Vocabulary operators carry a code format (Vocabulary#code_regexp)
592
+ def code_regexp
593
+ nil
594
+ end
595
+
723
596
  def validate_codes_match
724
- unless bad_arguments.empty?
725
- add_warning("improperly formatted code", *bad_arguments)
726
- end
597
+ return if bad_arguments.empty?
598
+
599
+ add_warning("improperly formatted code", *bad_arguments)
600
+ end
601
+
602
+ def additional_validation(_db, _opts = {})
603
+ # Do nothing by default
727
604
  end
728
605
 
729
606
  def add_warnings?(db, opts = {})
730
- @errors.empty? && db && db.adapter_scheme != :mock && !opts[:skip_db]
607
+ @errors.empty? && !no_db?(db, opts)
731
608
  end
732
609
 
733
610
  def add_error(*args)
@@ -738,32 +615,68 @@ module ConceptQL
738
615
  warnings << args
739
616
  end
740
617
 
741
- def needs_arguments_cte?(args)
742
- impala? && arguments.length > 5000
618
+ def include_counts?(db, opts)
619
+ !(no_db?(db, opts) || opts[:skip_counts])
743
620
  end
744
621
 
745
- def arguments_fix(db, args = nil)
746
- args ||= arguments
747
- return args unless needs_arguments_cte?(args)
748
- args = args.dup
749
- first_arg = Sequel.expr(args.shift).as(:arg)
750
- args.unshift(first_arg)
751
- args = args.map { |v| [v] }
752
- args_cte = db.values(args)
753
- db[:args]
754
- .with(:args, args_cte)
755
- .select(:arg)
622
+ def skip_db?(opts)
623
+ opts[:skip_db]
756
624
  end
757
625
 
758
- def include_counts?(db, opts)
759
- db && !opts[:skip_db] && !opts[:skip_counts]
626
+ def no_db?(db, opts = {})
627
+ no_db = db.nil? || db.adapter_scheme == :mock || skip_db?(opts)
628
+ no_db ||= table_is_missing?(db)
629
+ no_db
630
+ end
631
+
632
+ def table_is_missing?(_db)
633
+ false
634
+ end
635
+
636
+ def preferred_name
637
+ self.class.pref_name
638
+ end
639
+
640
+ def semi_or_inner_join(ds, table, *exprs)
641
+ ds = Sequel[ds] if ds.is_a?(Symbol)
642
+ table = Sequel[table] if table.is_a?(Symbol)
643
+ expr = exprs.inject(&:&)
644
+ if use_inner_join?
645
+ ds.join(table.as(:r), expr)
646
+ .select(*query_cols.map { |c| Sequel[:l][c] })
647
+ else
648
+ rdbms.semi_join(ds, table, *exprs)
649
+ end
650
+ end
651
+
652
+ def matching_columns
653
+ if scope.opts.dig(:window_opts, :window_table)
654
+ %i[person_id window_id]
655
+ else
656
+ [ :person_id ]
657
+ end
658
+ end
659
+
660
+ def use_inner_join?
661
+ options[:inner_join]
662
+ end
663
+
664
+ # The names in an option that lists columns (join_columns, only_columns
665
+ # and so on), as symbols. A JSON statement gives them as strings, and
666
+ # Sequel renders a String as a string literal, not as a column. Call it
667
+ # only for options that name columns: other options are free-form.
668
+ #
669
+ # The value is an Array or a comma-separated String, such as
670
+ # "uuid, start_date". A blank String is an unset option, so it gives
671
+ # nil.
672
+ def column_names_option(name)
673
+ value = options[name]
674
+ if value.is_a?(String)
675
+ value = value.split(",").map(&:strip).reject(&:empty?)
676
+ return nil if value.empty?
677
+ end
678
+ value&.map(&:to_sym)
760
679
  end
761
680
  end
762
681
  end
763
682
  end
764
-
765
- # Require all operator subclasses eagerly
766
- Dir.new(File.dirname(__FILE__)).
767
- entries.
768
- each{|filename| require_relative filename if filename =~ /\.rb\z/ && filename != File.basename(__FILE__)}
769
- ConceptQL::Operators.operators.values.each(&:freeze)