conceptql 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +208 -27
- data/LICENSE +21 -0
- data/README.md +28 -98
- data/bin/conceptql +2 -1
- data/bin/conceptql_utils +6 -0
- data/config/multiple_vocabularies.csv +4 -0
- data/config/provenance.yml +471 -436
- data/config/race.yml +50 -0
- data/config/vocabularies.csv +87 -0
- data/lib/conceptql/behaviors/code_lister.rb +23 -0
- data/lib/conceptql/behaviors/drugish.rb +13 -8
- data/lib/conceptql/behaviors/labish.rb +15 -9
- data/lib/conceptql/behaviors/metadatable.rb +102 -34
- data/lib/conceptql/behaviors/provenanceable.rb +15 -19
- data/lib/conceptql/behaviors/single_event.rb +11 -0
- data/lib/conceptql/behaviors/timeless.rb +11 -0
- data/lib/conceptql/behaviors/utilizable.rb +206 -0
- data/lib/conceptql/behaviors/windowable.rb +27 -0
- data/lib/conceptql/cli.rb +99 -134
- data/lib/conceptql/columnizer.rb +75 -0
- data/lib/conceptql/data_model/base.rb +462 -0
- data/lib/conceptql/data_model/gdm.rb +155 -0
- data/lib/conceptql/data_model/gdm_wide.rb +42 -0
- data/lib/conceptql/data_model/omopv4_plus.rb +12 -0
- data/lib/conceptql/data_model.rb +30 -0
- data/lib/conceptql/database.rb +195 -23
- data/lib/conceptql/date_adjuster.rb +57 -27
- data/lib/conceptql/diagram.rb +243 -0
- data/lib/conceptql/lexicon/lexicon_gdm.rb +47 -0
- data/lib/conceptql/lexicon/lexicon_no_db.rb +49 -0
- data/lib/conceptql/lexicon/lexicon_ohdsi.rb +63 -0
- data/lib/conceptql/lexicon/lexicon_strategy.rb +116 -0
- data/lib/conceptql/lexicon.rb +111 -0
- data/lib/conceptql/nodifier.rb +45 -15
- data/lib/conceptql/operators/after.rb +24 -21
- data/lib/conceptql/operators/any_overlap.rb +6 -6
- data/lib/conceptql/operators/before.rb +24 -16
- data/lib/conceptql/operators/binary_operator_operator.rb +52 -13
- data/lib/conceptql/operators/casting_operator.rb +24 -17
- data/lib/conceptql/operators/co_reported.rb +78 -9
- data/lib/conceptql/operators/concurrent_within.rb +29 -17
- data/lib/conceptql/operators/contains.rb +9 -9
- data/lib/conceptql/operators/count.rb +9 -9
- data/lib/conceptql/operators/date_range.rb +40 -18
- data/lib/conceptql/operators/death.rb +10 -2
- data/lib/conceptql/operators/dedup.rb +31 -0
- data/lib/conceptql/operators/during.rb +5 -12
- data/lib/conceptql/operators/episode.rb +146 -0
- data/lib/conceptql/operators/equal.rb +6 -3
- data/lib/conceptql/operators/ethnicity.rb +49 -0
- data/lib/conceptql/operators/except.rb +15 -20
- data/lib/conceptql/operators/filter.rb +20 -8
- data/lib/conceptql/operators/first.rb +14 -3
- data/lib/conceptql/operators/from.rb +33 -12
- data/lib/conceptql/operators/gender.rb +27 -11
- data/lib/conceptql/operators/hospice.rb +19 -0
- data/lib/conceptql/operators/hospitalization.rb +19 -0
- data/lib/conceptql/operators/information_periods.rb +36 -0
- data/lib/conceptql/operators/invalid.rb +4 -5
- data/lib/conceptql/operators/last.rb +14 -3
- data/lib/conceptql/operators/match.rb +91 -0
- data/lib/conceptql/operators/multiple_vocabularies.rb +172 -0
- data/lib/conceptql/operators/numeric.rb +52 -29
- data/lib/conceptql/operators/numeric_filter.rb +68 -0
- data/lib/conceptql/operators/occurrence.rb +133 -48
- data/lib/conceptql/operators/one_in_two_out.rb +198 -62
- data/lib/conceptql/operators/operator.rb +321 -408
- data/lib/conceptql/operators/pass_thru.rb +9 -5
- data/lib/conceptql/operators/person.rb +12 -2
- data/lib/conceptql/operators/person_filter.rb +5 -3
- data/lib/conceptql/operators/place_of_service_filter.rb +11 -15
- data/lib/conceptql/operators/provenance.rb +25 -36
- data/lib/conceptql/operators/provider_filter.rb +40 -14
- data/lib/conceptql/operators/race.rb +48 -7
- data/lib/conceptql/operators/read.rb +77 -58
- data/lib/conceptql/operators/recall.rb +20 -20
- data/lib/conceptql/operators/snf.rb +19 -0
- data/lib/conceptql/operators/sum.rb +23 -12
- data/lib/conceptql/operators/temporal_operator.rb +80 -54
- data/lib/conceptql/operators/time_window.rb +13 -15
- data/lib/conceptql/operators/trim_date.rb +71 -0
- data/lib/conceptql/operators/trim_date_end.rb +20 -40
- data/lib/conceptql/operators/trim_date_start.rb +20 -43
- data/lib/conceptql/operators/union.rb +59 -35
- data/lib/conceptql/operators/vocabulary.rb +151 -0
- data/lib/conceptql/paths.rb +41 -0
- data/lib/conceptql/query.rb +165 -46
- data/lib/conceptql/query_modifiers/gdm/admission_date_query_modifier.rb +46 -0
- data/lib/conceptql/query_modifiers/gdm/drug_query_modifier.rb +54 -0
- data/lib/conceptql/query_modifiers/gdm/lab_query_modifier.rb +57 -0
- data/lib/conceptql/query_modifiers/gdm/pos_query_modifier.rb +46 -0
- data/lib/conceptql/query_modifiers/gdm/provenance_query_modifier.rb +45 -0
- data/lib/conceptql/query_modifiers/gdm/provider_query_modifier.rb +53 -0
- data/lib/conceptql/query_modifiers/gdm_wide/admission_date_query_modifier.rb +42 -0
- data/lib/conceptql/query_modifiers/gdm_wide/drug_query_modifier.rb +52 -0
- data/lib/conceptql/query_modifiers/gdm_wide/lab_query_modifier.rb +55 -0
- data/lib/conceptql/query_modifiers/gdm_wide/pos_query_modifier.rb +37 -0
- data/lib/conceptql/query_modifiers/gdm_wide/provenance_query_modifier.rb +38 -0
- data/lib/conceptql/query_modifiers/omopv4_plus/admission_date_query_modifier.rb +45 -0
- data/lib/conceptql/query_modifiers/omopv4_plus/drug_query_modifier.rb +80 -0
- data/lib/conceptql/query_modifiers/omopv4_plus/pos_query_modifier.rb +47 -0
- data/lib/conceptql/query_modifiers/omopv4_plus/provenance_query_modifier.rb +45 -0
- data/lib/conceptql/query_modifiers/omopv4_plus/provider_query_modifier.rb +26 -0
- data/lib/conceptql/query_modifiers/query_modifier.rb +6 -2
- data/lib/conceptql/rdbms/duckdb.rb +25 -0
- data/lib/conceptql/rdbms/generic.rb +120 -0
- data/lib/conceptql/rdbms/postgres.rb +51 -0
- data/lib/conceptql/rdbms/spark.rb +22 -0
- data/lib/conceptql/rdbms.rb +22 -0
- data/lib/conceptql/scope.rb +353 -41
- data/lib/conceptql/sql_formatters/formatter.rb +25 -0
- data/lib/conceptql/sql_formatters.rb +22 -0
- data/lib/conceptql/utils.rb +113 -0
- data/lib/conceptql/utils_cli.rb +17 -0
- data/lib/conceptql/version.rb +3 -1
- data/lib/conceptql/visitors/metadata_extractor.rb +54 -0
- data/lib/conceptql/vocabularies/behaviors/costish.rb +24 -0
- data/lib/conceptql/vocabularies/behaviors/gdmish.rb +19 -0
- data/lib/conceptql/vocabularies/behaviors/omopish.rb +32 -0
- data/lib/conceptql/vocabularies/dynamic_vocabularies.rb +63 -0
- data/lib/conceptql/vocabularies/entry.rb +138 -0
- data/lib/conceptql/vocabularies/vocabulary_class_factory.rb +85 -0
- data/lib/conceptql/window/base.rb +26 -0
- data/lib/conceptql/window/date_range.rb +25 -0
- data/lib/conceptql/window/table.rb +116 -0
- data/lib/conceptql/window.rb +72 -0
- data/lib/conceptql.rb +53 -10
- data/lib/sequel/extensions/pg_ctas_explain.rb +22 -0
- data/lib/sequel/extensions/pg_vacuum_table.rb +23 -0
- data/schemas/gdm.yml +882 -0
- data/schemas/gdm_wide.yml +757 -0
- data/schemas/ohdsi_vocabs.yml +143 -0
- data/schemas/omopv4_plus.yml +729 -0
- data/schemas/omopv4_plus_more_ignorables.tsv +13 -0
- metadata +262 -2068
- data/.gitignore +0 -25
- data/Gemfile +0 -6
- data/Guardfile +0 -56
- data/LICENSE.txt +0 -22
- data/Rakefile +0 -35
- data/conceptql.gemspec +0 -31
- data/doc/ConceptQL Specification (alpha).pdf +0 -0
- data/doc/converter.rb +0 -33
- data/doc/diagram_0.png +0 -0
- data/doc/implementation_notes.md +0 -39
- data/doc/metadata.md +0 -89
- data/doc/spec/02f44ad35d266ddd0a4df1691d26bf4a297b30604fc3f44b0391d6d852d23a9f.png +0 -0
- data/doc/spec/0360fc0c2b7a88fd82ffc4d13387b76766649d5d42aa8f9349bbf60a81ac6119.png +0 -0
- data/doc/spec/04491942fcbd741982514f9eb12aeecf3d54b5b69a2b50c8331f7700169d5521.png +0 -0
- data/doc/spec/05f9b844571ffceeed2def3025fb60c68552817b8b73d3c8a76939dbc08b7c65.png +0 -0
- data/doc/spec/067241a3579767a802d4f8e20fd35b60adbe377c9a6512ef135f164a5accfb27.png +0 -0
- data/doc/spec/1102fa717b1c2df67af5220bf3ae219afafd79be7bba0c117e301983385ada52.png +0 -0
- data/doc/spec/11f57941951bad5a75f9a16f38a31a3c6bf3046a475aac6e398e780892fab4ad.png +0 -0
- data/doc/spec/15268bc45993d3f57ccf915877f91e48bdee684f24faa614249915833cac4af9.png +0 -0
- data/doc/spec/253845fe6162621af407ebd110296ff4f6d8a3f23ec75dfb4ea8cda30be71262.png +0 -0
- data/doc/spec/26fd52b5ac55438dd9f81b4a3f3913f1058c9f225c8a5e129007c1e9413d5881.png +0 -0
- data/doc/spec/2b57886a9cba66bb696e4b399c51ad0dc95cd64b952709fafc819a79d573f09e.png +0 -0
- data/doc/spec/307a8b5a7edd6e42f8be16523a4c939faf1a0533385c861d7004b6af8addd7d1.png +0 -0
- data/doc/spec/328467a6a419c7c05e299b8097e5e000686068ded8dc6d5f2e2de6f51976c315.png +0 -0
- data/doc/spec/39d6a8eb71cae51b1d6937c97134e51f04fd47c54535ff0915fe6a8b4f197fb2.png +0 -0
- data/doc/spec/3f46dee4d775d1a29d52b68af6552f8ea3abd8303094e749714fc77bd7958155.png +0 -0
- data/doc/spec/44ec6743d5d77d15b8a487c2058bf3e455d34adc91c46ea05767f6e0e471a75e.png +0 -0
- data/doc/spec/462153be527b28dc2cb5259c0aec62e1f529e8b60dc6e9c23fd1e06e8be933c9.png +0 -0
- data/doc/spec/4a3b47ed1c54f96ebdae693d41c36c51884c4546ef799a4108085708fb7b964e.png +0 -0
- data/doc/spec/514f263e976d07c0d9e0a86c79bcbdcddc7d444d7b72135294ad78758effd28f.png +0 -0
- data/doc/spec/58113a57a37431a402d2547369eba3a481bf1dbbfd82dc384406a5c91f6df01f.png +0 -0
- data/doc/spec/5d331d74c460d75814b2d3138a9b7d90b5ddb2dcd85e1f5f260d183745fc3a1e.png +0 -0
- data/doc/spec/5d6ff62038b75d6f240d65f35d1520a131c221f47d3801554c8c2be5d528ebb0.png +0 -0
- data/doc/spec/62323426e381ec21c967971a67e1f4a6d89dae92154bd937284e00b67f67fdd3.png +0 -0
- data/doc/spec/6705af65d728c0d5c50d6c4d46253017a91eb459dbb1f40f92449f05d5562f4a.png +0 -0
- data/doc/spec/68fac940a32c7e40caacf8e560c61da552d57633d015ba98f2e98ec040a00c5b.png +0 -0
- data/doc/spec/6a34c0ef589c9c976fe41f3e67e799e198499f5b9c3ebfd240fb91f73e893573.png +0 -0
- data/doc/spec/6b48534236697d1ccfa1f5403764782f9d228f9eb706789cfa80203882b7b13a.png +0 -0
- data/doc/spec/7aa76b4d29874719466c2cbafc9936e9f12e504bf31e1a09d26ca3fffa8ba1a6.png +0 -0
- data/doc/spec/7b9db2986ab9ada45cfb9451ef87ff1a2d99c908083334b7ccdceb8a92387fa9.png +0 -0
- data/doc/spec/8101d9b89d9ba8070d585432707b43a8acdb4c2a3e9d37c3f7114b5e3ea9e800.png +0 -0
- data/doc/spec/886bf85249a704668a55c5161bceaac10be4a41a94b91606f49851dfa017526c.png +0 -0
- data/doc/spec/8ed478d8c81a58a202d0c51348fca246df206fc24a0567b163d4e0bdab56ca46.png +0 -0
- data/doc/spec/9139440329dcb815df89bc70182c3827868402a74ff64d0253706dcaff723dca.png +0 -0
- data/doc/spec/99392f56dfb0e5be3f45a12a7f1ba846d094e430f526dfeaa30b606837cd34c0.png +0 -0
- data/doc/spec/a4450e8c0fe0e2fde92fe9bd61952f907b1976c1aa3ba963b809bed079d42b09.png +0 -0
- data/doc/spec/a4bc7382a1154ea9856544fd48418f3dd9ce474ca94b8859fc323749c6cc1f55.png +0 -0
- data/doc/spec/a79274742cf6fac6f6c9f4a0eb651aeb452f9c43b537c8e6ccaefecd05b7105c.png +0 -0
- data/doc/spec/a9b4528726adec2a90f3f00139d8d0492f13c51f03c2f9ed6a5134b1b26b44a9.png +0 -0
- data/doc/spec/af5ae3787e80bf0771f18f1a04fe4c5d9291e1e0f963ac408a7bc198d2f1ee28.png +0 -0
- data/doc/spec/ba572c4f4dbade65be55f141df16cf7b3e7d09e0aec4e4e5debc4f2075277371.png +0 -0
- data/doc/spec/ba90ef705f7be91c53c5eb4a81a439fa0f7c48532214bd3db3cc5c069160543e.png +0 -0
- data/doc/spec/c1d0402862221d85aceedc7d76b3f82149b612cbd972f14d0ca9011e1e2c455c.png +0 -0
- data/doc/spec/c2157d8a6b73abe4f22ba5042159f32502c74bf6d762be28d2df6831586822c7.png +0 -0
- data/doc/spec/c5329a7f4937096a57b2e01efb9d542f84a4e2329a1e9381d08c630583ccad37.png +0 -0
- data/doc/spec/c82077b9455d0f9abc2c45ee1a298e38b99c9ce9cd685f65d87b376d7718d7ad.png +0 -0
- data/doc/spec/c93dd18894a245a5647f99e1867d3779e4cd34c9c8f8860600ff0c837a5ffa53.png +0 -0
- data/doc/spec/cc960a268d51ccf2ebde657d36848f780213834844900018bce3d111843f7b0f.png +0 -0
- data/doc/spec/d39452b58257c95a7cba07afed4877417b0c227f3690e2bff22c9eca89eac845.png +0 -0
- data/doc/spec/d64993258ffbef9406d9ab9136de7af530626b3a69e9eeb75835e11f11dabf62.png +0 -0
- data/doc/spec/da450cdd0c94a1301bd98560339a45caa8041e09974352a56ecfb144e9a5e4d4.png +0 -0
- data/doc/spec/dbc66b3ae6bd7123d77dd04b64f8a24498d048725a55c5340b15f5ae0a1ff307.png +0 -0
- data/doc/spec/de589af36fa854e006a1563c93e644e2210f2a5616babb779f7f38aadb6c1ed7.png +0 -0
- data/doc/spec/defbd0b853d895802663f507761ad297d82e167f516c6082686a2a19b76012c5.png +0 -0
- data/doc/spec/e1cb0863b21e14256d61a54200316791f6547c78ba2f0156c110f4500f9bbd49.png +0 -0
- data/doc/spec/e8630103287f7c9d28eff40b3b1826e24846e776b877f7b8554257acbe621e1c.png +0 -0
- data/doc/spec/e9b384fa7dec5f1a06479c4b289e06b1e60e4f23f7630aff6d03c52595f500f8.png +0 -0
- data/doc/spec/ea935ac31f3b57ff373646780a1fba34a38c9e086dc771eb7fc16c65a7e20cfc.png +0 -0
- data/doc/spec/eb8f5511f7d88bd0f8ba73420fc10f7c78405db7f4373d778a827058707f888e.png +0 -0
- data/doc/spec/ebacbd092e3d1a3c7b745a381e51e8ff9d63a21db23a16940193e18e57bc866f.png +0 -0
- data/doc/spec/ed039f82867241393b1a6a7153d3690461103934c72c1f3eaa3d99a12bb40885.png +0 -0
- data/doc/spec/ee283d6a4b69cf10da2df703be3a16830be9cd8cd4f68c5f7afdf558ea28fa76.png +0 -0
- data/doc/spec/f0c734b099841a754ae0366afb00e992ad4814479b65e4a7de23c6e3dd85c09a.png +0 -0
- data/doc/spec/f6b4fc31703cfb6327bbbd4614af8bb72da6d39fa3d53ada63a70157f2fad80e.png +0 -0
- data/doc/spec/f766f2e3aa13420e3ba0f823ac7956b311ed7c6c20be26b72324fadd87f36712.png +0 -0
- data/doc/spec/ff7d5b5573d09bd7c4cdd3aeda124d18bf82ec46673a62881b399a75d69f3f53.png +0 -0
- data/doc/spec.md +0 -2258
- data/doc/spec.md.cql +0 -1930
- data/lib/conceptql/annotate_grapher.rb +0 -127
- data/lib/conceptql/fake_annotater.rb +0 -129
- data/lib/conceptql/knitter.rb +0 -221
- data/lib/conceptql/logger.rb +0 -10
- data/lib/conceptql/operators/complement.rb +0 -43
- data/lib/conceptql/operators/condition_occurrence_source_vocabulary_operator.rb +0 -34
- data/lib/conceptql/operators/condition_occurrence_source_vocabulary_operator_union.rb +0 -28
- data/lib/conceptql/operators/condition_type.rb +0 -79
- data/lib/conceptql/operators/cpt.rb +0 -28
- data/lib/conceptql/operators/cpt_or_hcpcs.rb +0 -27
- data/lib/conceptql/operators/drg.rb +0 -42
- data/lib/conceptql/operators/drug_type_concept.rb +0 -30
- data/lib/conceptql/operators/from_seer_visits.rb +0 -29
- data/lib/conceptql/operators/hcpcs.rb +0 -28
- data/lib/conceptql/operators/icd10.rb +0 -19
- data/lib/conceptql/operators/icd10_pcs.rb +0 -28
- data/lib/conceptql/operators/icd9.rb +0 -19
- data/lib/conceptql/operators/icd9_procedure.rb +0 -28
- data/lib/conceptql/operators/intersect.rb +0 -39
- data/lib/conceptql/operators/loinc.rb +0 -28
- data/lib/conceptql/operators/medcode.rb +0 -17
- data/lib/conceptql/operators/medcode_procedure.rb +0 -28
- data/lib/conceptql/operators/ndc.rb +0 -32
- data/lib/conceptql/operators/observation_by_enttype.rb +0 -32
- data/lib/conceptql/operators/observation_period.rb +0 -32
- data/lib/conceptql/operators/overlapped_by.rb +0 -26
- data/lib/conceptql/operators/overlaps.rb +0 -21
- data/lib/conceptql/operators/place_of_service_code.rb +0 -31
- data/lib/conceptql/operators/procedure_occurrence.rb +0 -27
- data/lib/conceptql/operators/prodcode.rb +0 -32
- data/lib/conceptql/operators/revenue_code.rb +0 -40
- data/lib/conceptql/operators/rxnorm.rb +0 -28
- data/lib/conceptql/operators/snomed.rb +0 -25
- data/lib/conceptql/operators/source_vocabulary_operator.rb +0 -88
- data/lib/conceptql/operators/standard_vocabulary_operator.rb +0 -66
- data/lib/conceptql/operators/started_by.rb +0 -23
- data/lib/conceptql/operators/to_seer_visits.rb +0 -29
- data/lib/conceptql/operators/visit_occurrence.rb +0 -32
- data/lib/conceptql/operators/vocabulary_operator.rb +0 -45
- data/lib/conceptql/query_modifiers/drug_query_modifier.rb +0 -45
- data/lib/conceptql/query_modifiers/pos_query_modifier.rb +0 -31
- data/lib/conceptql/sql_formatter.rb +0 -22
- data/test/all.rb +0 -3
- data/test/all_operations_test.rb +0 -45
- data/test/code_list_test.rb +0 -23
- data/test/data/omopv4/care_site.csv +0 -0
- data/test/data/omopv4/cohort.csv +0 -0
- data/test/data/omopv4/condition_era.csv +0 -0
- data/test/data/omopv4/condition_occurrence.csv +0 -34044
- data/test/data/omopv4/death.csv +0 -1
- data/test/data/omopv4/drug_cost.csv +0 -0
- data/test/data/omopv4/drug_era.csv +0 -0
- data/test/data/omopv4/drug_exposure.csv +0 -2
- data/test/data/omopv4/location.csv +0 -0
- data/test/data/omopv4/observation.csv +0 -2
- data/test/data/omopv4/observation_period.csv +0 -1
- data/test/data/omopv4/organization.csv +0 -0
- data/test/data/omopv4/payer_plan_period.csv +0 -0
- data/test/data/omopv4/person.csv +0 -250
- data/test/data/omopv4/procedure_cost.csv +0 -0
- data/test/data/omopv4/procedure_occurrence.csv +0 -35099
- data/test/data/omopv4/provider.csv +0 -0
- data/test/data/omopv4/visit_occurrence.csv +0 -14931
- data/test/data/omopv4_plus/care_site.csv +0 -0
- data/test/data/omopv4_plus/cohort.csv +0 -0
- data/test/data/omopv4_plus/concept.csv +0 -352
- data/test/data/omopv4_plus/condition_era.csv +0 -0
- data/test/data/omopv4_plus/condition_occurrence.csv +0 -46673
- data/test/data/omopv4_plus/death.csv +0 -9
- data/test/data/omopv4_plus/drug_cost.csv +0 -13921
- data/test/data/omopv4_plus/drug_era.csv +0 -0
- data/test/data/omopv4_plus/drug_exposure.csv +0 -13921
- data/test/data/omopv4_plus/headers/care_site.csv +0 -1
- data/test/data/omopv4_plus/headers/cohort.csv +0 -1
- data/test/data/omopv4_plus/headers/concept.csv +0 -1
- data/test/data/omopv4_plus/headers/condition_era.csv +0 -1
- data/test/data/omopv4_plus/headers/condition_occurrence.csv +0 -1
- data/test/data/omopv4_plus/headers/death.csv +0 -1
- data/test/data/omopv4_plus/headers/drug_cost.csv +0 -1
- data/test/data/omopv4_plus/headers/drug_era.csv +0 -1
- data/test/data/omopv4_plus/headers/drug_exposure.csv +0 -1
- data/test/data/omopv4_plus/headers/location.csv +0 -1
- data/test/data/omopv4_plus/headers/observation.csv +0 -1
- data/test/data/omopv4_plus/headers/observation_period.csv +0 -1
- data/test/data/omopv4_plus/headers/organization.csv +0 -1
- data/test/data/omopv4_plus/headers/payer_plan_period.csv +0 -1
- data/test/data/omopv4_plus/headers/person.csv +0 -1
- data/test/data/omopv4_plus/headers/procedure_cost.csv +0 -1
- data/test/data/omopv4_plus/headers/procedure_occurrence.csv +0 -1
- data/test/data/omopv4_plus/headers/provider.csv +0 -1
- data/test/data/omopv4_plus/headers/source_to_concept_map.csv +0 -1
- data/test/data/omopv4_plus/headers/visit_occurrence.csv +0 -1
- data/test/data/omopv4_plus/headers/vocabulary.csv +0 -1
- data/test/data/omopv4_plus/location.csv +0 -0
- data/test/data/omopv4_plus/observation.csv +0 -0
- data/test/data/omopv4_plus/observation_period.csv +0 -147
- data/test/data/omopv4_plus/organization.csv +0 -736
- data/test/data/omopv4_plus/payer_plan_period.csv +0 -808
- data/test/data/omopv4_plus/person.csv +0 -250
- data/test/data/omopv4_plus/procedure_cost.csv +0 -20123
- data/test/data/omopv4_plus/procedure_occurrence.csv +0 -27273
- data/test/data/omopv4_plus/provider.csv +0 -10193
- data/test/data/omopv4_plus/source_to_concept_map.csv +0 -285
- data/test/data/omopv4_plus/visit_occurrence.csv +0 -45125
- data/test/data/omopv4_plus/vocabulary.csv +0 -60
- data/test/db.rb +0 -15
- data/test/db_setup.rb +0 -408
- data/test/db_teardown.rb +0 -33
- data/test/fake_annotater_test.rb +0 -31
- data/test/helper.rb +0 -129
- data/test/knitter/conceptql.md.cql +0 -39
- data/test/knitter/conceptql.md.expect +0 -43
- data/test/knitter/empty.md.cql +0 -0
- data/test/knitter/except.md.cql +0 -13
- data/test/knitter/except.md.expect +0 -14
- data/test/knitter/fake.md.cql +0 -10
- data/test/knitter/fake.md.expect +0 -13
- data/test/knitter/many.md.cql +0 -7
- data/test/knitter/many.md.expect +0 -14
- data/test/knitter/no_conceptql.md.cql +0 -36
- data/test/knitter/title.md.cql +0 -12
- data/test/knitter/title.md.expect +0 -15
- data/test/knitter/union.md.cql +0 -11
- data/test/knitter/union.md.expect +0 -14
- data/test/knitter_test.rb +0 -69
- data/test/query_test.rb +0 -36
- data/test/results/omopv4/after/anno_1 +0 -25
- data/test/results/omopv4/after/anno_2 +0 -48
- data/test/results/omopv4/after/anno_3 +0 -34
- data/test/results/omopv4/after/anno_4 +0 -60
- data/test/results/omopv4/after/anno_5 +0 -68
- data/test/results/omopv4/after/anno_6 +0 -60
- data/test/results/omopv4/after/crit_at_least +0 -7
- data/test/results/omopv4/after/crit_basic +0 -32
- data/test/results/omopv4/after/crit_occurrences +0 -12
- data/test/results/omopv4/after/crit_within +0 -6
- data/test/results/omopv4/any_overlap/crit_basic1 +0 -15
- data/test/results/omopv4/any_overlap/crit_basic2 +0 -15
- data/test/results/omopv4/any_overlap/crit_occurrences1 +0 -2
- data/test/results/omopv4/any_overlap/crit_occurrences2 +0 -15
- data/test/results/omopv4/any_overlap/crit_within +0 -8
- data/test/results/omopv4/before/crit_at_least +0 -6
- data/test/results/omopv4/before/crit_basic1 +0 -48
- data/test/results/omopv4/before/crit_basic2 +0 -7
- data/test/results/omopv4/before/crit_occurrences +0 -13
- data/test/results/omopv4/before/crit_within +0 -18
- data/test/results/omopv4/co_reported/anno_1 +0 -43
- data/test/results/omopv4/co_reported/anno_2 +0 -66
- data/test/results/omopv4/complement/anno_duplicate_params +0 -52
- data/test/results/omopv4/complement/anno_invalid_params +0 -37
- data/test/results/omopv4/complement/anno_no_params +0 -18
- data/test/results/omopv4/complement/count_3way_intersect +0 -4
- data/test/results/omopv4/complement/count_3way_union +0 -4
- data/test/results/omopv4/complement/count_intersect +0 -3
- data/test/results/omopv4/complement/count_union +0 -3
- data/test/results/omopv4/complement/count_union_and_intersect +0 -4
- data/test/results/omopv4/complement/crit_3way_intersect +0 -1
- data/test/results/omopv4/complement/crit_3way_union +0 -1
- data/test/results/omopv4/complement/crit_basic1 +0 -33998
- data/test/results/omopv4/complement/crit_icd9_selector +0 -54
- data/test/results/omopv4/complement/crit_intersect +0 -1
- data/test/results/omopv4/complement/crit_union +0 -1
- data/test/results/omopv4/complement/crit_union_and_intersect +0 -1
- data/test/results/omopv4/complex/anno_1 +0 -85
- data/test/results/omopv4/complex/crit_1 +0 -2
- data/test/results/omopv4/complex/crit_2 +0 -2
- data/test/results/omopv4/complex/crit_3 +0 -2
- data/test/results/omopv4/complex/crit_4 +0 -5
- data/test/results/omopv4/complex/crit_5 +0 -6
- data/test/results/omopv4/complex/crit_6 +0 -28
- data/test/results/omopv4/complex/crit_7 +0 -46
- data/test/results/omopv4/complex/crit_out_of_order_ctes +0 -7
- data/test/results/omopv4/complex/scanno_1 +0 -3
- data/test/results/omopv4/concurrent_within/crit_icd9 +0 -54
- data/test/results/omopv4/concurrent_within/crit_icd9_and_place_of_service +0 -23
- data/test/results/omopv4/concurrent_within/crit_negative_start +0 -5
- data/test/results/omopv4/condition_type/anno_icd9 +0 -39
- data/test/results/omopv4/condition_type/count_condition_era +0 -2
- data/test/results/omopv4/condition_type/count_condition_era_30_day_window +0 -2
- data/test/results/omopv4/condition_type/count_ehr_problem_list +0 -2
- data/test/results/omopv4/condition_type/count_era_0 +0 -2
- data/test/results/omopv4/condition_type/count_inpatient +0 -3
- data/test/results/omopv4/condition_type/count_inpatient_detail +0 -2
- data/test/results/omopv4/condition_type/count_inpatient_header +0 -3
- data/test/results/omopv4/condition_type/count_inpatient_header_2 +0 -3
- data/test/results/omopv4/condition_type/count_inpatient_header_3 +0 -3
- data/test/results/omopv4/condition_type/count_inpatient_header_4 +0 -3
- data/test/results/omopv4/condition_type/count_inpatient_header_5 +0 -3
- data/test/results/omopv4/condition_type/count_inpatient_outpatient_detail +0 -3
- data/test/results/omopv4/condition_type/count_inpatient_primary +0 -2
- data/test/results/omopv4/condition_type/count_inpatient_primary_or_first +0 -3
- data/test/results/omopv4/condition_type/count_outpatient +0 -3
- data/test/results/omopv4/condition_type/count_outpatient_detail +0 -3
- data/test/results/omopv4/condition_type/count_outpatient_header +0 -2
- data/test/results/omopv4/condition_type/count_outpatient_primary +0 -3
- data/test/results/omopv4/condition_type/count_primary +0 -3
- data/test/results/omopv4/condition_type/crit_condition_era +0 -1
- data/test/results/omopv4/condition_type/crit_condition_era_30_day_window +0 -1
- data/test/results/omopv4/condition_type/crit_ehr_problem_list +0 -1
- data/test/results/omopv4/condition_type/crit_era_0 +0 -1
- data/test/results/omopv4/condition_type/crit_inpatient +0 -1
- data/test/results/omopv4/condition_type/crit_inpatient_detail +0 -1
- data/test/results/omopv4/condition_type/crit_inpatient_header +0 -1
- data/test/results/omopv4/condition_type/crit_inpatient_header_2 +0 -1
- data/test/results/omopv4/condition_type/crit_inpatient_header_3 +0 -1
- data/test/results/omopv4/condition_type/crit_inpatient_header_4 +0 -1
- data/test/results/omopv4/condition_type/crit_inpatient_header_5 +0 -1
- data/test/results/omopv4/condition_type/crit_inpatient_primary +0 -1
- data/test/results/omopv4/condition_type/crit_inpatient_primary_or_first +0 -1
- data/test/results/omopv4/condition_type/crit_outpatient +0 -1
- data/test/results/omopv4/condition_type/crit_outpatient_detail +0 -1
- data/test/results/omopv4/condition_type/crit_outpatient_header +0 -1
- data/test/results/omopv4/condition_type/crit_outpatient_primary +0 -1
- data/test/results/omopv4/condition_type/crit_primary +0 -1
- data/test/results/omopv4/contains/crit_1 +0 -5
- data/test/results/omopv4/contains/crit_2 +0 -2
- data/test/results/omopv4/contains/crit_3 +0 -2
- data/test/results/omopv4/count/anno_multiple_upstreams +0 -52
- data/test/results/omopv4/count/anno_no_upstream1 +0 -18
- data/test/results/omopv4/count/anno_no_upstream2 +0 -25
- data/test/results/omopv4/count/crit_icd9_ndc +0 -8
- data/test/results/omopv4/count/crit_ndc +0 -5
- data/test/results/omopv4/count/crit_person +0 -254
- data/test/results/omopv4/cpt/anno_icd9_upstream +0 -40
- data/test/results/omopv4/cpt/anno_invalid_code +0 -22
- data/test/results/omopv4/cpt/count_1 +0 -3
- data/test/results/omopv4/cpt/crit_1 +0 -174
- data/test/results/omopv4/cpt/crit_2 +0 -1
- data/test/results/omopv4/cpt/scanno_1 +0 -17
- data/test/results/omopv4/cpt_or_hcpcs/anno_bad_format +0 -25
- data/test/results/omopv4/cpt_or_hcpcs/count_1 +0 -3
- data/test/results/omopv4/cpt_or_hcpcs/crit_1 +0 -179
- data/test/results/omopv4/cpt_or_hcpcs/crit_2 +0 -1
- data/test/results/omopv4/date_range/anno_1 +0 -15
- data/test/results/omopv4/date_range/anno_extra_argument +0 -24
- data/test/results/omopv4/date_range/anno_invalid_argument +0 -25
- data/test/results/omopv4/date_range/anno_missing_argument1 +0 -20
- data/test/results/omopv4/date_range/anno_missing_argument2 +0 -20
- data/test/results/omopv4/date_range/anno_no_upstreams +0 -38
- data/test/results/omopv4/date_range/count_1 +0 -3
- data/test/results/omopv4/date_range/count_2 +0 -3
- data/test/results/omopv4/date_range/crit_1 +0 -1
- data/test/results/omopv4/date_range/crit_2 +0 -1
- data/test/results/omopv4/death/anno_multiple_upstreams +0 -50
- data/test/results/omopv4/death/anno_no_upstreams +0 -22
- data/test/results/omopv4/death/crit_basic +0 -5
- data/test/results/omopv4/death/crit_person +0 -5
- data/test/results/omopv4/drug_type_concept/anno_has_upstreams +0 -37
- data/test/results/omopv4/drug_type_concept/anno_no_arguments +0 -18
- data/test/results/omopv4/drug_type_concept/crit_basic1 +0 -5
- data/test/results/omopv4/drug_type_concept/crit_basic2 +0 -2
- data/test/results/omopv4/during/crit_1 +0 -15
- data/test/results/omopv4/during/crit_2 +0 -2
- data/test/results/omopv4/equal/crit_1 +0 -5
- data/test/results/omopv4/equal/crit_2 +0 -5
- data/test/results/omopv4/except/anno_1 +0 -42
- data/test/results/omopv4/except/anno_2 +0 -43
- data/test/results/omopv4/except/count_complex +0 -5
- data/test/results/omopv4/except/crit_412_cpt +0 -54
- data/test/results/omopv4/except/crit_412_inpatient +0 -46
- data/test/results/omopv4/except/crit_complex +0 -1
- data/test/results/omopv4/filter/crit_1 +0 -54
- data/test/results/omopv4/first/anno_argument +0 -25
- data/test/results/omopv4/first/anno_no_upstream +0 -18
- data/test/results/omopv4/first/crit_cpt +0 -207
- data/test/results/omopv4/first/crit_icd9 +0 -42
- data/test/results/omopv4/first/crit_union +0 -45
- data/test/results/omopv4/from/anno_has_upstreams +0 -39
- data/test/results/omopv4/from/anno_multiple_arguments +0 -24
- data/test/results/omopv4/from/count_condition_occurrence +0 -3
- data/test/results/omopv4/from/count_observation_period +0 -3
- data/test/results/omopv4/from/count_person +0 -3
- data/test/results/omopv4/from_seer_visits/anno_multiple_upstreams +0 -78
- data/test/results/omopv4/from_seer_visits/anno_no_upstream +0 -18
- data/test/results/omopv4/from_seer_visits/crit_1 +0 -6
- data/test/results/omopv4/from_seer_visits/crit_2 +0 -5
- data/test/results/omopv4/from_seer_visits/crit_3 +0 -5
- data/test/results/omopv4/from_seer_visits/crit_4 +0 -6
- data/test/results/omopv4/gender/anno_has_upstreams +0 -39
- data/test/results/omopv4/gender/crit_male +0 -130
- data/test/results/omopv4/hcpcs/anno_bad_format +0 -24
- data/test/results/omopv4/hcpcs/crit_A0382 +0 -9
- data/test/results/omopv4/icd10/anno_bad_format +0 -22
- data/test/results/omopv4/icd10/anno_has_upstreams +0 -40
- data/test/results/omopv4/icd10/crit_1 +0 -5
- data/test/results/omopv4/icd10pcs/anno_bad_format +0 -28
- data/test/results/omopv4/icd10pcs/anno_has_upstreams +0 -40
- data/test/results/omopv4/icd10pcs/crit_1 +0 -2
- data/test/results/omopv4/icd9/anno_empty_label +0 -15
- data/test/results/omopv4/icd9/anno_invalid_code +0 -21
- data/test/results/omopv4/icd9/crit_1 +0 -54
- data/test/results/omopv4/icd9_procedure/crit_1 +0 -5
- data/test/results/omopv4/intersect/anno_412_inpatient +0 -42
- data/test/results/omopv4/intersect/anno_has_arguments +0 -25
- data/test/results/omopv4/intersect/anno_no_upstream +0 -18
- data/test/results/omopv4/intersect/crit_412_inpatient +0 -12
- data/test/results/omopv4/intersect/crit_412_male +0 -182
- data/test/results/omopv4/intersect/crit_complex +0 -118
- data/test/results/omopv4/invalid/anno_bad_op +0 -55
- data/test/results/omopv4/invalid/scanno_1 +0 -23
- data/test/results/omopv4/last/crit_icd9 +0 -42
- data/test/results/omopv4/loinc/crit_basic +0 -5
- data/test/results/omopv4/ndc/crit_basic +0 -5
- data/test/results/omopv4/numeric/anno_multiple_upstreams +0 -59
- data/test/results/omopv4/numeric/num_values_1 +0 -254
- data/test/results/omopv4/numeric/num_values_2 +0 -5
- data/test/results/omopv4/numeric/num_values_3 +0 -5
- data/test/results/omopv4/observation_period/anno_has_arguments +0 -36
- data/test/results/omopv4/observation_period/anno_multiple_upstreams +0 -51
- data/test/results/omopv4/observation_period/count_all_periods +0 -3
- data/test/results/omopv4/observation_period/crit_female +0 -2
- data/test/results/omopv4/observation_period/crit_icd9 +0 -5
- data/test/results/omopv4/observation_period/crit_male +0 -5
- data/test/results/omopv4/occurrence/anno_no_upstream +0 -22
- data/test/results/omopv4/occurrence/cc_412_410 +0 -1
- data/test/results/omopv4/occurrence/count_412_410 +0 -3
- data/test/results/omopv4/occurrence/crit_1 +0 -16
- data/test/results/omopv4/occurrence/crit_2 +0 -2
- data/test/results/omopv4/occurrence/crit_3 +0 -42
- data/test/results/omopv4/one_in_two_out/anno_has_arguments +0 -27
- data/test/results/omopv4/one_in_two_out/anno_multiple_upstreams +0 -54
- data/test/results/omopv4/one_in_two_out/anno_no_upstream +0 -20
- data/test/results/omopv4/one_in_two_out/count_1 +0 -3
- data/test/results/omopv4/one_in_two_out/crit_hcpcs +0 -7
- data/test/results/omopv4/one_in_two_out/crit_icd9 +0 -21
- data/test/results/omopv4/overlapped_by/crit_1 +0 -5
- data/test/results/omopv4/overlapped_by/crit_2 +0 -2
- data/test/results/omopv4/overlapped_by/crit_3 +0 -5
- data/test/results/omopv4/overlapped_by/crit_4 +0 -2
- data/test/results/omopv4/overlaps/crit_1 +0 -5
- data/test/results/omopv4/overlaps/crit_2 +0 -2
- data/test/results/omopv4/overlaps/crit_3 +0 -5
- data/test/results/omopv4/overlaps/crit_4 +0 -2
- data/test/results/omopv4/person/anno_has_arguments +0 -22
- data/test/results/omopv4/person/anno_multiple_upstreams +0 -52
- data/test/results/omopv4/person/count_2 +0 -3
- data/test/results/omopv4/person/crit_1 +0 -42
- data/test/results/omopv4/person/crit_2 +0 -1
- data/test/results/omopv4/person_filter/count_1 +0 -4
- data/test/results/omopv4/person_filter/crit_1 +0 -54
- data/test/results/omopv4/person_filter/crit_2 +0 -5
- data/test/results/omopv4/person_filter/crit_3 +0 -32
- data/test/results/omopv4/person_filter/crit_4 +0 -52
- data/test/results/omopv4/person_filter/crit_5 +0 -1
- data/test/results/omopv4/place_of_service_code/anno_has_upstreams +0 -37
- data/test/results/omopv4/place_of_service_code/anno_no_arguments +0 -18
- data/test/results/omopv4/place_of_service_code/crit_basic +0 -174
- data/test/results/omopv4/place_of_service_filter/anno_1 +0 -29
- data/test/results/omopv4/procedure_occurrence/anno_has_arguments +0 -37
- data/test/results/omopv4/procedure_occurrence/anno_multiple_upstreams +0 -51
- data/test/results/omopv4/procedure_occurrence/count_gender +0 -3
- data/test/results/omopv4/procedure_occurrence/count_icd9 +0 -3
- data/test/results/omopv4/procedure_occurrence/count_started_by +0 -3
- data/test/results/omopv4/procedure_occurrence/crit_gender +0 -1
- data/test/results/omopv4/procedure_occurrence/crit_icd9 +0 -1
- data/test/results/omopv4/procedure_occurrence/crit_started_by +0 -1
- data/test/results/omopv4/provenance/anno_1 +0 -29
- data/test/results/omopv4/provider_filter/anno_1 +0 -29
- data/test/results/omopv4/race/anno_1 +0 -37
- data/test/results/omopv4/race/anno_2 +0 -18
- data/test/results/omopv4/race/crit_1 +0 -28
- data/test/results/omopv4/read/anno_1 +0 -21
- data/test/results/omopv4/read/crit_1 +0 -2
- data/test/results/omopv4/recall/anno_1 +0 -54
- data/test/results/omopv4/recall/anno_2 +0 -66
- data/test/results/omopv4/recall/anno_3 +0 -20
- data/test/results/omopv4/recall/anno_4 +0 -18
- data/test/results/omopv4/recall/anno_5 +0 -24
- data/test/results/omopv4/recall/anno_6 +0 -270
- data/test/results/omopv4/recall/crit_1 +0 -21
- data/test/results/omopv4/recall/crit_2 +0 -54
- data/test/results/omopv4/recall/crit_3 +0 -2
- data/test/results/omopv4/recall/crit_cte_1 +0 -42
- data/test/results/omopv4/recall/crit_cte_2 +0 -42
- data/test/results/omopv4/recall/crit_nested_perm_0 +0 -54
- data/test/results/omopv4/revenue_code/crit_1 +0 -2
- data/test/results/omopv4/revenue_code/crit_basic +0 -2
- data/test/results/omopv4/revenue_code/domains_1 +0 -3
- data/test/results/omopv4/revenue_code/domains_drg100 +0 -3
- data/test/results/omopv4/rxnorm/crit_1 +0 -5
- data/test/results/omopv4/snomed/crit_1 +0 -84
- data/test/results/omopv4/started_by/crit_1 +0 -5
- data/test/results/omopv4/started_by/crit_2 +0 -2
- data/test/results/omopv4/started_by/crit_3 +0 -2
- data/test/results/omopv4/sum/anno_1 +0 -18
- data/test/results/omopv4/sum/anno_2 +0 -36
- data/test/results/omopv4/sum/num_1 +0 -5
- data/test/results/omopv4/sum/num_2 +0 -8
- data/test/results/omopv4/sum/num_3 +0 -254
- data/test/results/omopv4/time_window/anno_1 +0 -20
- data/test/results/omopv4/time_window/anno_2 +0 -40
- data/test/results/omopv4/time_window/anno_3 +0 -36
- data/test/results/omopv4/time_window/anno_4 +0 -39
- data/test/results/omopv4/time_window/anno_5 +0 -57
- data/test/results/omopv4/time_window/crit_1 +0 -54
- data/test/results/omopv4/time_window/crit_2 +0 -174
- data/test/results/omopv4/time_window/crit_3 +0 -54
- data/test/results/omopv4/time_window/crit_4 +0 -174
- data/test/results/omopv4/trim_date_end/crit_1 +0 -5
- data/test/results/omopv4/trim_date_end/crit_2 +0 -2
- data/test/results/omopv4/trim_date_end/crit_3 +0 -6
- data/test/results/omopv4/trim_date_end/crit_at_least +0 -5
- data/test/results/omopv4/trim_date_end/crit_occurrences_1 +0 -2
- data/test/results/omopv4/trim_date_end/crit_occurrences_2 +0 -6
- data/test/results/omopv4/trim_date_end/crit_within +0 -5
- data/test/results/omopv4/trim_date_start/crit_1 +0 -5
- data/test/results/omopv4/trim_date_start/crit_2 +0 -2
- data/test/results/omopv4/trim_date_start/crit_3 +0 -6
- data/test/results/omopv4/trim_date_start/crit_at_least +0 -5
- data/test/results/omopv4/trim_date_start/crit_occurrences_1 +0 -2
- data/test/results/omopv4/trim_date_start/crit_occurrences_2 +0 -6
- data/test/results/omopv4/trim_date_start/crit_within +0 -5
- data/test/results/omopv4/union/anno_1 +0 -43
- data/test/results/omopv4/union/anno_2 +0 -74
- data/test/results/omopv4/union/anno_3 +0 -18
- data/test/results/omopv4/union/anno_4 +0 -25
- data/test/results/omopv4/union/anno_5 +0 -33
- data/test/results/omopv4/union/anno_6 +0 -46
- data/test/results/omopv4/union/cc_1 +0 -1
- data/test/results/omopv4/union/cc_2 +0 -1
- data/test/results/omopv4/union/cc_3 +0 -1
- data/test/results/omopv4/union/cc_4 +0 -1
- data/test/results/omopv4/union/cc_5 +0 -1
- data/test/results/omopv4/union/count_1 +0 -3
- data/test/results/omopv4/union/count_2 +0 -3
- data/test/results/omopv4/union/count_3 +0 -3
- data/test/results/omopv4/union/count_4 +0 -3
- data/test/results/omopv4/union/count_5 +0 -4
- data/test/results/omopv4/union/scanno_1 +0 -22
- data/test/results/omopv4/union/scanno_2 +0 -36
- data/test/results/omopv4/visit_occurrence/anno_1 +0 -52
- data/test/results/omopv4/visit_occurrence/anno_2 +0 -37
- data/test/results/omopv4/visit_occurrence/crit_1 +0 -54
- data/test/results/omopv4/visit_occurrence/crit_2 +0 -7566
- data/test/results/omopv4/visit_occurrence/crit_3 +0 -14935
- data/test/results/omopv4_plus/after/anno_1 +0 -25
- data/test/results/omopv4_plus/after/anno_2 +0 -48
- data/test/results/omopv4_plus/after/anno_3 +0 -34
- data/test/results/omopv4_plus/after/anno_4 +0 -60
- data/test/results/omopv4_plus/after/anno_5 +0 -68
- data/test/results/omopv4_plus/after/anno_6 +0 -60
- data/test/results/omopv4_plus/after/crit_at_least +0 -7
- data/test/results/omopv4_plus/after/crit_basic +0 -32
- data/test/results/omopv4_plus/after/crit_occurrences +0 -12
- data/test/results/omopv4_plus/after/crit_within +0 -5
- data/test/results/omopv4_plus/any_overlap/crit_basic1 +0 -14
- data/test/results/omopv4_plus/any_overlap/crit_basic2 +0 -14
- data/test/results/omopv4_plus/any_overlap/crit_occurrences1 +0 -2
- data/test/results/omopv4_plus/any_overlap/crit_occurrences2 +0 -14
- data/test/results/omopv4_plus/any_overlap/crit_within +0 -8
- data/test/results/omopv4_plus/before/crit_at_least +0 -6
- data/test/results/omopv4_plus/before/crit_basic1 +0 -48
- data/test/results/omopv4_plus/before/crit_basic2 +0 -8
- data/test/results/omopv4_plus/before/crit_occurrences +0 -13
- data/test/results/omopv4_plus/before/crit_within +0 -17
- data/test/results/omopv4_plus/co_reported/anno_1 +0 -43
- data/test/results/omopv4_plus/co_reported/anno_2 +0 -66
- data/test/results/omopv4_plus/co_reported/anno_3 +0 -47
- data/test/results/omopv4_plus/complement/anno_duplicate_params +0 -52
- data/test/results/omopv4_plus/complement/anno_invalid_params +0 -37
- data/test/results/omopv4_plus/complement/anno_no_params +0 -18
- data/test/results/omopv4_plus/complement/count_3way_intersect +0 -4
- data/test/results/omopv4_plus/complement/count_3way_union +0 -4
- data/test/results/omopv4_plus/complement/count_intersect +0 -3
- data/test/results/omopv4_plus/complement/count_union +0 -3
- data/test/results/omopv4_plus/complement/count_union_and_intersect +0 -4
- data/test/results/omopv4_plus/complement/crit_basic1 +0 -52483
- data/test/results/omopv4_plus/complement/crit_icd9_selector +0 -52
- data/test/results/omopv4_plus/complex/anno_1 +0 -85
- data/test/results/omopv4_plus/complex/crit_1 +0 -2
- data/test/results/omopv4_plus/complex/crit_2 +0 -2
- data/test/results/omopv4_plus/complex/crit_3 +0 -2
- data/test/results/omopv4_plus/complex/crit_4 +0 -2
- data/test/results/omopv4_plus/complex/crit_5 +0 -2
- data/test/results/omopv4_plus/complex/crit_6 +0 -24
- data/test/results/omopv4_plus/complex/crit_7 +0 -45
- data/test/results/omopv4_plus/complex/crit_out_of_order_ctes +0 -15
- data/test/results/omopv4_plus/complex/scanno_1 +0 -108
- data/test/results/omopv4_plus/concurrent_within/crit_icd9 +0 -52
- data/test/results/omopv4_plus/concurrent_within/crit_icd9_and_place_of_service +0 -21
- data/test/results/omopv4_plus/concurrent_within/crit_negative_start +0 -5
- data/test/results/omopv4_plus/condition_type/anno_icd9 +0 -39
- data/test/results/omopv4_plus/condition_type/count_condition_era +0 -2
- data/test/results/omopv4_plus/condition_type/count_condition_era_30_day_window +0 -2
- data/test/results/omopv4_plus/condition_type/count_ehr_problem_list +0 -2
- data/test/results/omopv4_plus/condition_type/count_era_0 +0 -2
- data/test/results/omopv4_plus/condition_type/count_inpatient +0 -3
- data/test/results/omopv4_plus/condition_type/count_inpatient_detail +0 -2
- data/test/results/omopv4_plus/condition_type/count_inpatient_header +0 -3
- data/test/results/omopv4_plus/condition_type/count_inpatient_header_2 +0 -3
- data/test/results/omopv4_plus/condition_type/count_inpatient_header_3 +0 -3
- data/test/results/omopv4_plus/condition_type/count_inpatient_header_4 +0 -3
- data/test/results/omopv4_plus/condition_type/count_inpatient_header_5 +0 -3
- data/test/results/omopv4_plus/condition_type/count_inpatient_outpatient_detail +0 -3
- data/test/results/omopv4_plus/condition_type/count_inpatient_primary +0 -3
- data/test/results/omopv4_plus/condition_type/count_inpatient_primary_or_first +0 -3
- data/test/results/omopv4_plus/condition_type/count_outpatient +0 -3
- data/test/results/omopv4_plus/condition_type/count_outpatient_detail +0 -2
- data/test/results/omopv4_plus/condition_type/count_outpatient_header +0 -3
- data/test/results/omopv4_plus/condition_type/count_outpatient_primary +0 -3
- data/test/results/omopv4_plus/condition_type/count_primary +0 -3
- data/test/results/omopv4_plus/contains/crit_1 +0 -5
- data/test/results/omopv4_plus/contains/crit_2 +0 -2
- data/test/results/omopv4_plus/contains/crit_3 +0 -2
- data/test/results/omopv4_plus/count/anno_multiple_upstreams +0 -52
- data/test/results/omopv4_plus/count/anno_no_upstream1 +0 -18
- data/test/results/omopv4_plus/count/anno_no_upstream2 +0 -25
- data/test/results/omopv4_plus/count/crit_icd9_ndc +0 -5
- data/test/results/omopv4_plus/count/crit_ndc +0 -2
- data/test/results/omopv4_plus/count/crit_person +0 -254
- data/test/results/omopv4_plus/cpt/anno_icd9_upstream +0 -40
- data/test/results/omopv4_plus/cpt/anno_invalid_code +0 -22
- data/test/results/omopv4_plus/cpt/count_1 +0 -3
- data/test/results/omopv4_plus/cpt/crit_1 +0 -158
- data/test/results/omopv4_plus/cpt/scanno_1 +0 -17
- data/test/results/omopv4_plus/cpt_or_hcpcs/anno_bad_format +0 -25
- data/test/results/omopv4_plus/cpt_or_hcpcs/count_1 +0 -3
- data/test/results/omopv4_plus/cpt_or_hcpcs/crit_1 +0 -161
- data/test/results/omopv4_plus/date_range/anno_1 +0 -15
- data/test/results/omopv4_plus/date_range/anno_extra_argument +0 -24
- data/test/results/omopv4_plus/date_range/anno_invalid_argument +0 -25
- data/test/results/omopv4_plus/date_range/anno_missing_argument1 +0 -20
- data/test/results/omopv4_plus/date_range/anno_missing_argument2 +0 -20
- data/test/results/omopv4_plus/date_range/anno_no_upstreams +0 -38
- data/test/results/omopv4_plus/date_range/count_1 +0 -3
- data/test/results/omopv4_plus/date_range/count_2 +0 -3
- data/test/results/omopv4_plus/death/anno_multiple_upstreams +0 -50
- data/test/results/omopv4_plus/death/anno_no_upstreams +0 -22
- data/test/results/omopv4_plus/death/crit_basic +0 -14
- data/test/results/omopv4_plus/death/crit_person +0 -14
- data/test/results/omopv4_plus/drug_type_concept/anno_has_upstreams +0 -37
- data/test/results/omopv4_plus/drug_type_concept/anno_no_arguments +0 -18
- data/test/results/omopv4_plus/drug_type_concept/crit_basic1 +0 -2
- data/test/results/omopv4_plus/drug_type_concept/crit_basic2 +0 -2
- data/test/results/omopv4_plus/during/crit_1 +0 -14
- data/test/results/omopv4_plus/during/crit_2 +0 -2
- data/test/results/omopv4_plus/equal/crit_1 +0 -2
- data/test/results/omopv4_plus/equal/crit_2 +0 -2
- data/test/results/omopv4_plus/except/anno_1 +0 -42
- data/test/results/omopv4_plus/except/anno_2 +0 -43
- data/test/results/omopv4_plus/except/count_complex +0 -5
- data/test/results/omopv4_plus/except/crit_412_cpt +0 -52
- data/test/results/omopv4_plus/except/crit_412_inpatient +0 -45
- data/test/results/omopv4_plus/filter/crit_1 +0 -52
- data/test/results/omopv4_plus/first/anno_argument +0 -25
- data/test/results/omopv4_plus/first/anno_no_upstream +0 -18
- data/test/results/omopv4_plus/first/crit_cpt +0 -180
- data/test/results/omopv4_plus/first/crit_icd9 +0 -41
- data/test/results/omopv4_plus/first/crit_union +0 -52
- data/test/results/omopv4_plus/from/anno_has_upstreams +0 -39
- data/test/results/omopv4_plus/from/anno_multiple_arguments +0 -24
- data/test/results/omopv4_plus/from/count_condition_occurrence +0 -3
- data/test/results/omopv4_plus/from/count_observation_period +0 -3
- data/test/results/omopv4_plus/from/count_person +0 -3
- data/test/results/omopv4_plus/from_seer_visits/anno_multiple_upstreams +0 -78
- data/test/results/omopv4_plus/from_seer_visits/anno_no_upstream +0 -18
- data/test/results/omopv4_plus/from_seer_visits/crit_1 +0 -2
- data/test/results/omopv4_plus/from_seer_visits/crit_2 +0 -2
- data/test/results/omopv4_plus/from_seer_visits/crit_3 +0 -2
- data/test/results/omopv4_plus/from_seer_visits/crit_4 +0 -2
- data/test/results/omopv4_plus/gender/anno_has_upstreams +0 -39
- data/test/results/omopv4_plus/gender/crit_male +0 -128
- data/test/results/omopv4_plus/hcpcs/anno_bad_format +0 -24
- data/test/results/omopv4_plus/hcpcs/crit_A0382 +0 -7
- data/test/results/omopv4_plus/icd10/anno_bad_format +0 -22
- data/test/results/omopv4_plus/icd10/anno_has_upstreams +0 -40
- data/test/results/omopv4_plus/icd10/crit_1 +0 -2
- data/test/results/omopv4_plus/icd10pcs/anno_bad_format +0 -28
- data/test/results/omopv4_plus/icd10pcs/anno_has_upstreams +0 -40
- data/test/results/omopv4_plus/icd10pcs/crit_1 +0 -2
- data/test/results/omopv4_plus/icd9/anno_empty_label +0 -15
- data/test/results/omopv4_plus/icd9/anno_invalid_code +0 -21
- data/test/results/omopv4_plus/icd9/anno_valid_code +0 -3
- data/test/results/omopv4_plus/icd9/crit_1 +0 -52
- data/test/results/omopv4_plus/icd9_procedure/crit_1 +0 -5
- data/test/results/omopv4_plus/intersect/anno_412_inpatient +0 -42
- data/test/results/omopv4_plus/intersect/anno_has_arguments +0 -25
- data/test/results/omopv4_plus/intersect/anno_no_upstream +0 -18
- data/test/results/omopv4_plus/intersect/crit_412_inpatient +0 -11
- data/test/results/omopv4_plus/intersect/crit_412_male +0 -178
- data/test/results/omopv4_plus/intersect/crit_complex +0 -110
- data/test/results/omopv4_plus/invalid/anno_bad_op +0 -55
- data/test/results/omopv4_plus/invalid/scanno_1 +0 -23
- data/test/results/omopv4_plus/last/crit_icd9 +0 -41
- data/test/results/omopv4_plus/loinc/crit_basic +0 -2
- data/test/results/omopv4_plus/ndc/crit_basic +0 -2
- data/test/results/omopv4_plus/ndc/results_1 +0 -41
- data/test/results/omopv4_plus/numeric/anno_multiple_upstreams +0 -59
- data/test/results/omopv4_plus/numeric/num_values_1 +0 -254
- data/test/results/omopv4_plus/numeric/num_values_2 +0 -5
- data/test/results/omopv4_plus/numeric/num_values_3 +0 -5
- data/test/results/omopv4_plus/observation_period/anno_has_arguments +0 -36
- data/test/results/omopv4_plus/observation_period/anno_multiple_upstreams +0 -51
- data/test/results/omopv4_plus/observation_period/count_all_periods +0 -3
- data/test/results/omopv4_plus/observation_period/crit_female +0 -87
- data/test/results/omopv4_plus/observation_period/crit_icd9 +0 -28
- data/test/results/omopv4_plus/observation_period/crit_male +0 -75
- data/test/results/omopv4_plus/occurrence/anno_no_upstream +0 -22
- data/test/results/omopv4_plus/occurrence/count_412_410 +0 -3
- data/test/results/omopv4_plus/occurrence/crit_1 +0 -15
- data/test/results/omopv4_plus/occurrence/crit_2 +0 -2
- data/test/results/omopv4_plus/occurrence/crit_3 +0 -41
- data/test/results/omopv4_plus/one_in_two_out/anno_has_arguments +0 -27
- data/test/results/omopv4_plus/one_in_two_out/anno_multiple_upstreams +0 -54
- data/test/results/omopv4_plus/one_in_two_out/anno_no_upstream +0 -20
- data/test/results/omopv4_plus/one_in_two_out/count_1 +0 -3
- data/test/results/omopv4_plus/one_in_two_out/count_same_as_1 +0 -3
- data/test/results/omopv4_plus/one_in_two_out/crit_hcpcs +0 -2
- data/test/results/omopv4_plus/one_in_two_out/crit_icd9 +0 -19
- data/test/results/omopv4_plus/one_in_two_out/results_1 +0 -803
- data/test/results/omopv4_plus/one_in_two_out/results_2 +0 -803
- data/test/results/omopv4_plus/overlapped_by/crit_1 +0 -5
- data/test/results/omopv4_plus/overlapped_by/crit_2 +0 -2
- data/test/results/omopv4_plus/overlapped_by/crit_3 +0 -5
- data/test/results/omopv4_plus/overlapped_by/crit_4 +0 -2
- data/test/results/omopv4_plus/overlaps/crit_1 +0 -5
- data/test/results/omopv4_plus/overlaps/crit_2 +0 -2
- data/test/results/omopv4_plus/overlaps/crit_3 +0 -5
- data/test/results/omopv4_plus/overlaps/crit_4 +0 -2
- data/test/results/omopv4_plus/person/anno_has_arguments +0 -22
- data/test/results/omopv4_plus/person/anno_multiple_upstreams +0 -52
- data/test/results/omopv4_plus/person/count_2 +0 -3
- data/test/results/omopv4_plus/person/crit_1 +0 -41
- data/test/results/omopv4_plus/person_filter/count_1 +0 -4
- data/test/results/omopv4_plus/person_filter/crit_1 +0 -52
- data/test/results/omopv4_plus/person_filter/crit_2 +0 -10
- data/test/results/omopv4_plus/person_filter/crit_3 +0 -32
- data/test/results/omopv4_plus/person_filter/crit_4 +0 -50
- data/test/results/omopv4_plus/place_of_service_code/anno_has_upstreams +0 -37
- data/test/results/omopv4_plus/place_of_service_code/anno_no_arguments +0 -18
- data/test/results/omopv4_plus/place_of_service_code/crit_basic +0 -157
- data/test/results/omopv4_plus/place_of_service_filter/anno_1 +0 -29
- data/test/results/omopv4_plus/procedure_occurrence/anno_has_arguments +0 -37
- data/test/results/omopv4_plus/procedure_occurrence/anno_multiple_upstreams +0 -51
- data/test/results/omopv4_plus/procedure_occurrence/count_gender +0 -3
- data/test/results/omopv4_plus/procedure_occurrence/count_icd9 +0 -3
- data/test/results/omopv4_plus/procedure_occurrence/count_started_by +0 -3
- data/test/results/omopv4_plus/provenance/anno_1 +0 -29
- data/test/results/omopv4_plus/provenance/anno_bad_keyword +0 -38
- data/test/results/omopv4_plus/provenance/count_1 +0 -3
- data/test/results/omopv4_plus/provenance/count_2 +0 -3
- data/test/results/omopv4_plus/provider_filter/anno_1 +0 -29
- data/test/results/omopv4_plus/race/anno_1 +0 -37
- data/test/results/omopv4_plus/race/anno_2 +0 -18
- data/test/results/omopv4_plus/race/crit_1 +0 -32
- data/test/results/omopv4_plus/read/anno_1 +0 -15
- data/test/results/omopv4_plus/read/crit_1 +0 -2
- data/test/results/omopv4_plus/recall/anno_1 +0 -54
- data/test/results/omopv4_plus/recall/anno_2 +0 -66
- data/test/results/omopv4_plus/recall/anno_3 +0 -20
- data/test/results/omopv4_plus/recall/anno_4 +0 -18
- data/test/results/omopv4_plus/recall/anno_5 +0 -24
- data/test/results/omopv4_plus/recall/anno_6 +0 -270
- data/test/results/omopv4_plus/recall/crit_1 +0 -19
- data/test/results/omopv4_plus/recall/crit_2 +0 -52
- data/test/results/omopv4_plus/recall/crit_3 +0 -2
- data/test/results/omopv4_plus/recall/crit_cte_1 +0 -41
- data/test/results/omopv4_plus/recall/crit_cte_2 +0 -41
- data/test/results/omopv4_plus/recall/crit_nested_perm_0 +0 -52
- data/test/results/omopv4_plus/revenue_code/crit_1 +0 -2
- data/test/results/omopv4_plus/revenue_code/crit_basic +0 -2
- data/test/results/omopv4_plus/revenue_code/domains_1 +0 -3
- data/test/results/omopv4_plus/revenue_code/domains_drg100 +0 -3
- data/test/results/omopv4_plus/rxnorm/crit_1 +0 -2
- data/test/results/omopv4_plus/snomed/crit_1 +0 -2
- data/test/results/omopv4_plus/started_by/crit_1 +0 -5
- data/test/results/omopv4_plus/started_by/crit_2 +0 -2
- data/test/results/omopv4_plus/started_by/crit_3 +0 -2
- data/test/results/omopv4_plus/sum/anno_1 +0 -18
- data/test/results/omopv4_plus/sum/anno_2 +0 -36
- data/test/results/omopv4_plus/sum/num_1 +0 -2
- data/test/results/omopv4_plus/sum/num_2 +0 -5
- data/test/results/omopv4_plus/sum/num_3 +0 -254
- data/test/results/omopv4_plus/time_window/anno_1 +0 -20
- data/test/results/omopv4_plus/time_window/anno_2 +0 -40
- data/test/results/omopv4_plus/time_window/anno_3 +0 -36
- data/test/results/omopv4_plus/time_window/anno_4 +0 -39
- data/test/results/omopv4_plus/time_window/anno_5 +0 -57
- data/test/results/omopv4_plus/time_window/crit_1 +0 -52
- data/test/results/omopv4_plus/time_window/crit_2 +0 -157
- data/test/results/omopv4_plus/time_window/crit_3 +0 -52
- data/test/results/omopv4_plus/time_window/crit_4 +0 -157
- data/test/results/omopv4_plus/trim_date_end/crit_1 +0 -5
- data/test/results/omopv4_plus/trim_date_end/crit_2 +0 -2
- data/test/results/omopv4_plus/trim_date_end/crit_3 +0 -6
- data/test/results/omopv4_plus/trim_date_end/crit_at_least +0 -5
- data/test/results/omopv4_plus/trim_date_end/crit_occurrences_1 +0 -2
- data/test/results/omopv4_plus/trim_date_end/crit_occurrences_2 +0 -6
- data/test/results/omopv4_plus/trim_date_end/crit_within +0 -5
- data/test/results/omopv4_plus/trim_date_start/crit_1 +0 -5
- data/test/results/omopv4_plus/trim_date_start/crit_2 +0 -2
- data/test/results/omopv4_plus/trim_date_start/crit_3 +0 -6
- data/test/results/omopv4_plus/trim_date_start/crit_at_least +0 -5
- data/test/results/omopv4_plus/trim_date_start/crit_occurrences_1 +0 -2
- data/test/results/omopv4_plus/trim_date_start/crit_occurrences_2 +0 -6
- data/test/results/omopv4_plus/trim_date_start/crit_within +0 -5
- data/test/results/omopv4_plus/union/anno_1 +0 -43
- data/test/results/omopv4_plus/union/anno_2 +0 -74
- data/test/results/omopv4_plus/union/anno_3 +0 -18
- data/test/results/omopv4_plus/union/anno_4 +0 -25
- data/test/results/omopv4_plus/union/anno_5 +0 -33
- data/test/results/omopv4_plus/union/anno_6 +0 -46
- data/test/results/omopv4_plus/union/count_1 +0 -3
- data/test/results/omopv4_plus/union/count_2 +0 -3
- data/test/results/omopv4_plus/union/count_3 +0 -3
- data/test/results/omopv4_plus/union/count_4 +0 -3
- data/test/results/omopv4_plus/union/count_5 +0 -4
- data/test/results/omopv4_plus/union/optcc_1 +0 -3
- data/test/results/omopv4_plus/union/optcc_2 +0 -3
- data/test/results/omopv4_plus/union/optcc_3 +0 -3
- data/test/results/omopv4_plus/union/optcc_4 +0 -3
- data/test/results/omopv4_plus/union/optcc_5 +0 -3
- data/test/results/omopv4_plus/union/optcc_6 +0 -3
- data/test/results/omopv4_plus/union/scanno_1 +0 -22
- data/test/results/omopv4_plus/union/scanno_2 +0 -36
- data/test/results/omopv4_plus/visit_occurrence/anno_1 +0 -52
- data/test/results/omopv4_plus/visit_occurrence/anno_2 +0 -37
- data/test/results/omopv4_plus/visit_occurrence/crit_1 +0 -52
- data/test/results/omopv4_plus/visit_occurrence/crit_2 +0 -22945
- data/test/results/omopv4_plus/visit_occurrence/crit_3 +0 -46851
- data/test/statements/after/anno_1 +0 -7
- data/test/statements/after/anno_2 +0 -16
- data/test/statements/after/anno_3 +0 -9
- data/test/statements/after/anno_4 +0 -19
- data/test/statements/after/anno_5 +0 -21
- data/test/statements/after/anno_6 +0 -16
- data/test/statements/after/crit_at_least +0 -21
- data/test/statements/after/crit_basic +0 -20
- data/test/statements/after/crit_occurrences +0 -21
- data/test/statements/after/crit_within +0 -21
- data/test/statements/any_overlap/crit_basic1 +0 -16
- data/test/statements/any_overlap/crit_basic2 +0 -16
- data/test/statements/any_overlap/crit_occurrences1 +0 -17
- data/test/statements/any_overlap/crit_occurrences2 +0 -17
- data/test/statements/any_overlap/crit_within +0 -17
- data/test/statements/before/crit_at_least +0 -14
- data/test/statements/before/crit_basic1 +0 -13
- data/test/statements/before/crit_basic2 +0 -16
- data/test/statements/before/crit_occurrences +0 -14
- data/test/statements/before/crit_within +0 -14
- data/test/statements/co_reported/anno_1 +0 -13
- data/test/statements/co_reported/anno_2 +0 -21
- data/test/statements/co_reported/anno_3 +0 -14
- data/test/statements/complement/anno_duplicate_params +0 -11
- data/test/statements/complement/anno_invalid_params +0 -8
- data/test/statements/complement/anno_no_params +0 -3
- data/test/statements/complement/count_3way_intersect +0 -24
- data/test/statements/complement/count_3way_union +0 -18
- data/test/statements/complement/count_intersect +0 -17
- data/test/statements/complement/count_union +0 -14
- data/test/statements/complement/count_union_and_intersect +0 -27
- data/test/statements/complement/crit_basic1 +0 -7
- data/test/statements/complement/crit_icd9_selector +0 -10
- data/test/statements/complex/anno_1 +0 -29
- data/test/statements/complex/crit_1 +0 -278
- data/test/statements/complex/crit_2 +0 -43
- data/test/statements/complex/crit_3 +0 -54
- data/test/statements/complex/crit_4 +0 -17
- data/test/statements/complex/crit_5 +0 -17
- data/test/statements/complex/crit_6 +0 -20
- data/test/statements/complex/crit_7 +0 -14
- data/test/statements/complex/crit_out_of_order_ctes +0 -39
- data/test/statements/complex/scanno_1 +0 -1508
- data/test/statements/concurrent_within/crit_icd9 +0 -11
- data/test/statements/concurrent_within/crit_icd9_and_place_of_service +0 -15
- data/test/statements/concurrent_within/crit_negative_start +0 -15
- data/test/statements/condition_type/anno_icd9 +0 -7
- data/test/statements/condition_type/count_condition_era +0 -4
- data/test/statements/condition_type/count_condition_era_30_day_window +0 -4
- data/test/statements/condition_type/count_ehr_problem_list +0 -4
- data/test/statements/condition_type/count_era_0 +0 -4
- data/test/statements/condition_type/count_inpatient +0 -4
- data/test/statements/condition_type/count_inpatient_detail +0 -4
- data/test/statements/condition_type/count_inpatient_header +0 -4
- data/test/statements/condition_type/count_inpatient_header_2 +0 -4
- data/test/statements/condition_type/count_inpatient_header_3 +0 -4
- data/test/statements/condition_type/count_inpatient_header_4 +0 -4
- data/test/statements/condition_type/count_inpatient_header_5 +0 -4
- data/test/statements/condition_type/count_inpatient_outpatient_detail +0 -5
- data/test/statements/condition_type/count_inpatient_primary +0 -4
- data/test/statements/condition_type/count_inpatient_primary_or_first +0 -4
- data/test/statements/condition_type/count_outpatient +0 -4
- data/test/statements/condition_type/count_outpatient_detail +0 -4
- data/test/statements/condition_type/count_outpatient_header +0 -4
- data/test/statements/condition_type/count_outpatient_primary +0 -4
- data/test/statements/condition_type/count_primary +0 -4
- data/test/statements/contains/crit_1 +0 -16
- data/test/statements/contains/crit_2 +0 -16
- data/test/statements/contains/crit_3 +0 -16
- data/test/statements/count/anno_multiple_upstreams +0 -11
- data/test/statements/count/anno_no_upstream1 +0 -3
- data/test/statements/count/anno_no_upstream2 +0 -4
- data/test/statements/count/crit_icd9_ndc +0 -15
- data/test/statements/count/crit_ndc +0 -11
- data/test/statements/count/crit_person +0 -7
- data/test/statements/cpt/anno_icd9_upstream +0 -7
- data/test/statements/cpt/anno_invalid_code +0 -5
- data/test/statements/cpt/count_1 +0 -4
- data/test/statements/cpt/crit_1 +0 -4
- data/test/statements/cpt/scanno_1 +0 -4
- data/test/statements/cpt_or_hcpcs/anno_bad_format +0 -7
- data/test/statements/cpt_or_hcpcs/count_1 +0 -5
- data/test/statements/cpt_or_hcpcs/crit_1 +0 -5
- data/test/statements/date_range/anno_1 +0 -7
- data/test/statements/date_range/anno_extra_argument +0 -8
- data/test/statements/date_range/anno_invalid_argument +0 -7
- data/test/statements/date_range/anno_missing_argument1 +0 -6
- data/test/statements/date_range/anno_missing_argument2 +0 -6
- data/test/statements/date_range/anno_no_upstreams +0 -11
- data/test/statements/date_range/count_1 +0 -7
- data/test/statements/date_range/count_2 +0 -7
- data/test/statements/death/anno_multiple_upstreams +0 -10
- data/test/statements/death/anno_no_upstreams +0 -4
- data/test/statements/death/crit_basic +0 -3
- data/test/statements/death/crit_person +0 -7
- data/test/statements/drug_type_concept/anno_has_upstreams +0 -8
- data/test/statements/drug_type_concept/anno_no_arguments +0 -3
- data/test/statements/drug_type_concept/crit_basic1 +0 -4
- data/test/statements/drug_type_concept/crit_basic2 +0 -4
- data/test/statements/during/crit_1 +0 -16
- data/test/statements/during/crit_2 +0 -16
- data/test/statements/equal/crit_1 +0 -17
- data/test/statements/equal/crit_2 +0 -21
- data/test/statements/except/anno_1 +0 -13
- data/test/statements/except/anno_2 +0 -14
- data/test/statements/except/count_complex +0 -31
- data/test/statements/except/crit_412_cpt +0 -13
- data/test/statements/except/crit_412_inpatient +0 -13
- data/test/statements/filter/crit_1 +0 -15
- data/test/statements/first/anno_argument +0 -4
- data/test/statements/first/anno_no_upstream +0 -3
- data/test/statements/first/crit_cpt +0 -7
- data/test/statements/first/crit_icd9 +0 -7
- data/test/statements/first/crit_union +0 -14
- data/test/statements/from/anno_has_upstreams +0 -7
- data/test/statements/from/anno_multiple_arguments +0 -5
- data/test/statements/from_seer_visits/anno_multiple_upstreams +0 -17
- data/test/statements/from_seer_visits/anno_no_upstream +0 -3
- data/test/statements/from_seer_visits/crit_1 +0 -10
- data/test/statements/from_seer_visits/crit_2 +0 -11
- data/test/statements/from_seer_visits/crit_3 +0 -11
- data/test/statements/from_seer_visits/crit_4 +0 -12
- data/test/statements/gender/anno_has_upstreams +0 -7
- data/test/statements/gender/crit_male +0 -4
- data/test/statements/hcpcs/anno_bad_format +0 -6
- data/test/statements/hcpcs/crit_A0382 +0 -4
- data/test/statements/icd10/anno_bad_format +0 -5
- data/test/statements/icd10/anno_has_upstreams +0 -7
- data/test/statements/icd10/crit_1 +0 -4
- data/test/statements/icd10pcs/anno_bad_format +0 -6
- data/test/statements/icd10pcs/anno_has_upstreams +0 -7
- data/test/statements/icd10pcs/crit_1 +0 -4
- data/test/statements/icd9/anno_empty_label +0 -7
- data/test/statements/icd9/anno_invalid_code +0 -4
- data/test/statements/icd9/anno_valid_code +0 -4
- data/test/statements/icd9/crit_1 +0 -4
- data/test/statements/icd9_procedure/crit_1 +0 -4
- data/test/statements/intersect/anno_412_inpatient +0 -11
- data/test/statements/intersect/anno_has_arguments +0 -4
- data/test/statements/intersect/anno_no_upstream +0 -3
- data/test/statements/intersect/crit_412_inpatient +0 -11
- data/test/statements/intersect/crit_412_male +0 -11
- data/test/statements/intersect/crit_complex +0 -19
- data/test/statements/invalid/anno_bad_op +0 -13
- data/test/statements/invalid/scanno_1 +0 -7
- data/test/statements/last/crit_icd9 +0 -7
- data/test/statements/loinc/crit_basic +0 -4
- data/test/statements/ndc/crit_basic +0 -4
- data/test/statements/ndc/results_1 +0 -4
- data/test/statements/numeric/anno_multiple_upstreams +0 -11
- data/test/statements/numeric/num_values_1 +0 -4
- data/test/statements/numeric/num_values_2 +0 -8
- data/test/statements/numeric/num_values_3 +0 -8
- data/test/statements/observation_period/anno_has_arguments +0 -8
- data/test/statements/observation_period/anno_multiple_upstreams +0 -11
- data/test/statements/observation_period/count_all_periods +0 -4
- data/test/statements/observation_period/crit_female +0 -7
- data/test/statements/observation_period/crit_icd9 +0 -7
- data/test/statements/observation_period/crit_male +0 -7
- data/test/statements/occurrence/anno_no_upstream +0 -3
- data/test/statements/occurrence/count_412_410 +0 -17
- data/test/statements/occurrence/crit_1 +0 -8
- data/test/statements/occurrence/crit_2 +0 -11
- data/test/statements/occurrence/crit_3 +0 -11
- data/test/statements/one_in_two_out/anno_has_arguments +0 -8
- data/test/statements/one_in_two_out/anno_multiple_upstreams +0 -15
- data/test/statements/one_in_two_out/anno_no_upstream +0 -7
- data/test/statements/one_in_two_out/count_1 +0 -10
- data/test/statements/one_in_two_out/count_same_as_1 +0 -11
- data/test/statements/one_in_two_out/crit_hcpcs +0 -10
- data/test/statements/one_in_two_out/crit_icd9 +0 -11
- data/test/statements/one_in_two_out/results_1 +0 -9
- data/test/statements/one_in_two_out/results_2 +0 -9
- data/test/statements/overlapped_by/crit_1 +0 -16
- data/test/statements/overlapped_by/crit_2 +0 -16
- data/test/statements/overlapped_by/crit_3 +0 -16
- data/test/statements/overlapped_by/crit_4 +0 -16
- data/test/statements/overlaps/crit_1 +0 -16
- data/test/statements/overlaps/crit_2 +0 -16
- data/test/statements/overlaps/crit_3 +0 -16
- data/test/statements/overlaps/crit_4 +0 -16
- data/test/statements/person/anno_has_arguments +0 -4
- data/test/statements/person/anno_multiple_upstreams +0 -11
- data/test/statements/person/count_2 +0 -3
- data/test/statements/person/crit_1 +0 -7
- data/test/statements/person_filter/count_1 +0 -20
- data/test/statements/person_filter/crit_1 +0 -20
- data/test/statements/person_filter/crit_2 +0 -13
- data/test/statements/person_filter/crit_3 +0 -13
- data/test/statements/person_filter/crit_4 +0 -13
- data/test/statements/place_of_service_code/anno_has_upstreams +0 -8
- data/test/statements/place_of_service_code/anno_no_arguments +0 -3
- data/test/statements/place_of_service_code/crit_basic +0 -4
- data/test/statements/place_of_service_filter/anno_1 +0 -8
- data/test/statements/procedure_occurrence/anno_has_arguments +0 -8
- data/test/statements/procedure_occurrence/anno_multiple_upstreams +0 -11
- data/test/statements/procedure_occurrence/count_gender +0 -7
- data/test/statements/procedure_occurrence/count_icd9 +0 -7
- data/test/statements/procedure_occurrence/count_started_by +0 -19
- data/test/statements/provenance/anno_1 +0 -8
- data/test/statements/provenance/anno_bad_keyword +0 -10
- data/test/statements/provenance/count_1 +0 -8
- data/test/statements/provenance/count_2 +0 -8
- data/test/statements/provider_filter/anno_1 +0 -10
- data/test/statements/race/anno_1 +0 -8
- data/test/statements/race/anno_2 +0 -3
- data/test/statements/race/crit_1 +0 -4
- data/test/statements/read/anno_1 +0 -4
- data/test/statements/read/crit_1 +0 -8
- data/test/statements/recall/anno_1 +0 -16
- data/test/statements/recall/anno_2 +0 -18
- data/test/statements/recall/anno_3 +0 -4
- data/test/statements/recall/anno_4 +0 -3
- data/test/statements/recall/anno_5 +0 -5
- data/test/statements/recall/anno_6 +0 -107
- data/test/statements/recall/crit_1 +0 -17
- data/test/statements/recall/crit_2 +0 -14
- data/test/statements/recall/crit_3 +0 -16
- data/test/statements/recall/crit_cte_1 +0 -17
- data/test/statements/recall/crit_cte_2 +0 -17
- data/test/statements/recall/crit_nested_perm_0 +0 -28
- data/test/statements/revenue_code/crit_1 +0 -4
- data/test/statements/revenue_code/crit_basic +0 -4
- data/test/statements/revenue_code/domains_1 +0 -4
- data/test/statements/revenue_code/domains_drg100 +0 -4
- data/test/statements/rxnorm/crit_1 +0 -4
- data/test/statements/snomed/crit_1 +0 -4
- data/test/statements/started_by/crit_1 +0 -16
- data/test/statements/started_by/crit_2 +0 -16
- data/test/statements/started_by/crit_3 +0 -16
- data/test/statements/sum/anno_1 +0 -3
- data/test/statements/sum/anno_2 +0 -8
- data/test/statements/sum/num_1 +0 -11
- data/test/statements/sum/num_2 +0 -15
- data/test/statements/sum/num_3 +0 -7
- data/test/statements/time_window/anno_1 +0 -7
- data/test/statements/time_window/anno_2 +0 -11
- data/test/statements/time_window/anno_3 +0 -11
- data/test/statements/time_window/anno_4 +0 -12
- data/test/statements/time_window/anno_5 +0 -15
- data/test/statements/time_window/crit_1 +0 -11
- data/test/statements/time_window/crit_2 +0 -11
- data/test/statements/time_window/crit_3 +0 -11
- data/test/statements/time_window/crit_4 +0 -11
- data/test/statements/trim_date_end/crit_1 +0 -16
- data/test/statements/trim_date_end/crit_2 +0 -16
- data/test/statements/trim_date_end/crit_3 +0 -16
- data/test/statements/trim_date_end/crit_at_least +0 -17
- data/test/statements/trim_date_end/crit_occurrences_1 +0 -17
- data/test/statements/trim_date_end/crit_occurrences_2 +0 -17
- data/test/statements/trim_date_end/crit_within +0 -17
- data/test/statements/trim_date_start/crit_1 +0 -16
- data/test/statements/trim_date_start/crit_2 +0 -16
- data/test/statements/trim_date_start/crit_3 +0 -16
- data/test/statements/trim_date_start/crit_at_least +0 -17
- data/test/statements/trim_date_start/crit_occurrences_1 +0 -17
- data/test/statements/trim_date_start/crit_occurrences_2 +0 -17
- data/test/statements/trim_date_start/crit_within +0 -17
- data/test/statements/union/anno_1 +0 -11
- data/test/statements/union/anno_2 +0 -18
- data/test/statements/union/anno_3 +0 -3
- data/test/statements/union/anno_4 +0 -4
- data/test/statements/union/anno_5 +0 -7
- data/test/statements/union/anno_6 +0 -10
- data/test/statements/union/count_1 +0 -11
- data/test/statements/union/count_2 +0 -11
- data/test/statements/union/count_3 +0 -15
- data/test/statements/union/count_4 +0 -18
- data/test/statements/union/count_5 +0 -18
- data/test/statements/union/scanno_1 +0 -3
- data/test/statements/union/scanno_2 +0 -18
- data/test/statements/visit_occurrence/anno_1 +0 -11
- data/test/statements/visit_occurrence/anno_2 +0 -8
- data/test/statements/visit_occurrence/crit_1 +0 -7
- data/test/statements/visit_occurrence/crit_2 +0 -7
- data/test/statements/visit_occurrence/crit_3 +0 -3
data/lib/conceptql/scope.rb
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "English"
|
|
4
|
+
require_relative "window"
|
|
5
|
+
require "securerandom"
|
|
6
|
+
require "sequel"
|
|
7
|
+
|
|
1
8
|
module ConceptQL
|
|
2
9
|
# Scope coordinates the creation of any common table expressions that might
|
|
3
10
|
# be used when a Recall operator is present in the statement.
|
|
@@ -10,50 +17,98 @@ module ConceptQL
|
|
|
10
17
|
# API for Recall operators to fetch the results/domains from
|
|
11
18
|
# labeled operators.
|
|
12
19
|
class Scope
|
|
20
|
+
# Raised when the extracted CTEs read each other in a cycle, so no order
|
|
21
|
+
# puts every CTE after the CTEs it reads.
|
|
22
|
+
class CteCycleError < StandardError
|
|
23
|
+
def initialize(names)
|
|
24
|
+
super("These CTEs read each other in a cycle, so they have no valid order: #{names.join(', ')}")
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
DEFAULT_COLUMN_FAMILY = "default"
|
|
29
|
+
|
|
13
30
|
DEFAULT_COLUMNS = {
|
|
14
31
|
person_id: :Bigint,
|
|
15
32
|
criterion_id: :Bigint,
|
|
33
|
+
criterion_table: :String,
|
|
16
34
|
criterion_domain: :String,
|
|
17
35
|
start_date: :Date,
|
|
18
36
|
end_date: :Date,
|
|
19
|
-
source_value: :String
|
|
37
|
+
source_value: :String,
|
|
38
|
+
source_vocabulary_id: :String,
|
|
39
|
+
label: :String,
|
|
40
|
+
column_family: :String
|
|
20
41
|
}.freeze
|
|
21
42
|
|
|
22
43
|
ADDITIONAL_COLUMNS = {
|
|
23
44
|
value_as_number: :Float,
|
|
24
45
|
value_as_string: :String,
|
|
25
46
|
value_as_concept_id: :Bigint,
|
|
26
|
-
|
|
47
|
+
value_as_concept: :String,
|
|
48
|
+
unit_concept_id: :Bigint,
|
|
49
|
+
unit_concept: :String,
|
|
50
|
+
context_id: :Bigint,
|
|
27
51
|
visit_occurrence_id: :Bigint,
|
|
28
|
-
|
|
52
|
+
file_provenance_type: :Bigint,
|
|
53
|
+
code_provenance_type: :Bigint,
|
|
29
54
|
provider_id: :Bigint,
|
|
30
|
-
|
|
55
|
+
context_specialty_concept_id: :Bigint,
|
|
56
|
+
practitioner_specialty_concept_id: :Bigint,
|
|
57
|
+
role_type_concept_id: :Bigint,
|
|
58
|
+
visit_source_concept_id: :Bigint,
|
|
31
59
|
range_low: :Float,
|
|
32
60
|
range_high: :Float,
|
|
33
61
|
drug_name: :String,
|
|
34
62
|
drug_amount: :Float,
|
|
35
63
|
drug_amount_units: :String,
|
|
36
|
-
|
|
37
|
-
|
|
64
|
+
drug_strength_source_value: :String,
|
|
65
|
+
drug_days_supply: :Bigint,
|
|
66
|
+
drug_quantity: :Float,
|
|
67
|
+
admission_date: :Date,
|
|
68
|
+
discharge_date: :Date,
|
|
69
|
+
length_of_stay: :Bigint,
|
|
70
|
+
admission_source_value: :String,
|
|
71
|
+
admission_source_description: :String,
|
|
72
|
+
discharge_location_source_value: :String,
|
|
73
|
+
discharge_location_source_description: :String,
|
|
74
|
+
primary_concept_id: :Bigint,
|
|
75
|
+
primary_diagnosis_code: :String,
|
|
76
|
+
primary_diagnosis_vocabulary: :String,
|
|
77
|
+
uuid: :String,
|
|
78
|
+
window_id: :Bigint
|
|
38
79
|
}.freeze
|
|
39
80
|
|
|
40
|
-
COLUMN_TYPES =
|
|
81
|
+
COLUMN_TYPES = DEFAULT_COLUMNS.merge(ADDITIONAL_COLUMNS).freeze
|
|
82
|
+
|
|
83
|
+
# Marks the WITH entry of a list that the Database's share_utilization
|
|
84
|
+
# option keeps in a shared table (Behaviors::Utilizable#evaluate).
|
|
85
|
+
SHARED_TABLE = :conceptql_shared_table
|
|
41
86
|
|
|
42
87
|
attr_accessor :person_ids
|
|
43
88
|
|
|
44
|
-
|
|
89
|
+
attr_reader :known_operators, :recall_stack, :recall_dependencies, :annotation, :opts, :query_columns
|
|
45
90
|
|
|
46
91
|
def initialize(opts = {})
|
|
47
92
|
@known_operators = {}
|
|
48
93
|
@recall_dependencies = {}
|
|
49
94
|
@recall_stack = []
|
|
95
|
+
@label_cte_names = {}
|
|
50
96
|
@annotation = {}
|
|
51
97
|
@opts = opts.dup
|
|
52
98
|
@annotation[:errors] = @errors = {}
|
|
53
99
|
@annotation[:warnings] = @warnings = {}
|
|
54
100
|
@annotation[:counts] = @counts = {}
|
|
55
|
-
@annotation[:operators] = @operators = []
|
|
56
101
|
@query_columns = DEFAULT_COLUMNS.keys
|
|
102
|
+
@query_columns << :window_id if opts.dig(:window_opts, :window_table)
|
|
103
|
+
|
|
104
|
+
@i = 0
|
|
105
|
+
@mutex = Mutex.new
|
|
106
|
+
@cte_name_next = -> { @mutex.synchronize { @i += 1 } }
|
|
107
|
+
|
|
108
|
+
return unless force_temp_tables? && scratch_database.to_s.empty?
|
|
109
|
+
|
|
110
|
+
raise ArgumentError,
|
|
111
|
+
"You must set the DOCKER_SCRATCH_DATABASE environment variable to the name of the scratch database if using the CONCEPTQL_FORCE_TEMP_TABLES environment variable"
|
|
57
112
|
end
|
|
58
113
|
|
|
59
114
|
def add_errors(key, errors)
|
|
@@ -69,19 +124,20 @@ module ConceptQL
|
|
|
69
124
|
c[domain] = counts
|
|
70
125
|
end
|
|
71
126
|
|
|
72
|
-
def add_operators(operator)
|
|
73
|
-
@operators << operator.operator_name
|
|
74
|
-
@operators.compact!
|
|
75
|
-
@operators.uniq!
|
|
76
|
-
end
|
|
77
|
-
|
|
78
127
|
def add_required_columns(op)
|
|
79
128
|
@query_columns |= op.required_columns if op.required_columns
|
|
80
129
|
end
|
|
81
130
|
|
|
131
|
+
def harvest_person_ids(op)
|
|
132
|
+
if (person_ids = op.options[:person_ids])
|
|
133
|
+
opts[:person_ids] = person_ids
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
82
137
|
def nest(op)
|
|
83
138
|
add_required_columns(op)
|
|
84
|
-
|
|
139
|
+
harvest_person_ids(op)
|
|
140
|
+
return yield unless (label = op.is_a?(Operators::Recall) ? op.source : op.label)
|
|
85
141
|
|
|
86
142
|
unless label.is_a?(String)
|
|
87
143
|
op.instance_eval do
|
|
@@ -108,7 +164,7 @@ module ConceptQL
|
|
|
108
164
|
end
|
|
109
165
|
end
|
|
110
166
|
|
|
111
|
-
if last = recall_stack.last
|
|
167
|
+
if (last = recall_stack.last)
|
|
112
168
|
recall_dependencies[last] << label
|
|
113
169
|
end
|
|
114
170
|
|
|
@@ -133,17 +189,23 @@ module ConceptQL
|
|
|
133
189
|
end
|
|
134
190
|
|
|
135
191
|
def from(db, label)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
192
|
+
if ConceptQL.avoid_ctes?
|
|
193
|
+
ds = db.from(fetch_operator(label).evaluate(db).as(label_cte_name(label)))
|
|
194
|
+
else
|
|
195
|
+
ds = db.from(label_cte_name(label))
|
|
196
|
+
|
|
197
|
+
if ENV["CONCEPTQL_CHECK_COLUMNS"]
|
|
198
|
+
# Work around requests for columns by operators. These
|
|
199
|
+
# would fail because the CTE would not be defined. You
|
|
200
|
+
# don't want to define the CTE normally, but to allow the
|
|
201
|
+
# columns to still work, send the columns request to the
|
|
202
|
+
# underlying operator.
|
|
203
|
+
op = fetch_operator(label)
|
|
204
|
+
ds = ds.with_extend do
|
|
205
|
+
define_method(:columns) do
|
|
206
|
+
(@main_op ||= op.evaluate(db)).columns
|
|
207
|
+
end
|
|
208
|
+
end
|
|
147
209
|
end
|
|
148
210
|
end
|
|
149
211
|
|
|
@@ -152,17 +214,15 @@ module ConceptQL
|
|
|
152
214
|
|
|
153
215
|
def domains(label, db)
|
|
154
216
|
fetch_operator(label).domains(db)
|
|
155
|
-
rescue
|
|
156
|
-
[:invalid]
|
|
217
|
+
rescue StandardError
|
|
218
|
+
[ :invalid ]
|
|
157
219
|
end
|
|
158
220
|
|
|
159
221
|
def sort_ctes(sorted, unsorted, deps)
|
|
160
|
-
if unsorted.empty?
|
|
161
|
-
return sorted
|
|
162
|
-
end
|
|
222
|
+
return sorted if unsorted.empty?
|
|
163
223
|
|
|
164
224
|
add, unsorted = unsorted.partition do |label, _|
|
|
165
|
-
deps[label].
|
|
225
|
+
deps[label].empty?
|
|
166
226
|
end
|
|
167
227
|
|
|
168
228
|
sorted += add
|
|
@@ -177,23 +237,246 @@ module ConceptQL
|
|
|
177
237
|
|
|
178
238
|
def valid?
|
|
179
239
|
recall_dependencies.each_value do |deps|
|
|
180
|
-
unless (deps - known_operators.keys).empty?
|
|
181
|
-
return false
|
|
182
|
-
end
|
|
240
|
+
return false unless (deps - known_operators.keys).empty?
|
|
183
241
|
end
|
|
184
242
|
true
|
|
185
243
|
end
|
|
186
244
|
|
|
187
|
-
|
|
245
|
+
class CteExtractor < Sequel::ASTTransformer
|
|
246
|
+
def initialize(scope, ctes)
|
|
247
|
+
super()
|
|
248
|
+
@scope = scope
|
|
249
|
+
@ctes = ctes
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
private
|
|
253
|
+
|
|
254
|
+
def v(o)
|
|
255
|
+
if o.is_a?(Sequel::Dataset)
|
|
256
|
+
@scope.recursive_extract_ctes(o, @ctes)
|
|
257
|
+
else
|
|
258
|
+
super
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def recursive_extract_cte_expr(t, ctes)
|
|
264
|
+
case t
|
|
265
|
+
when Sequel::Dataset
|
|
266
|
+
recursive_extract_ctes(t, ctes)
|
|
267
|
+
when Sequel::SQL::AliasedExpression
|
|
268
|
+
if t.expression.is_a?(Sequel::Dataset)
|
|
269
|
+
Sequel.as(recursive_extract_ctes(t.expression, ctes), t.alias)
|
|
270
|
+
else
|
|
271
|
+
t
|
|
272
|
+
end
|
|
273
|
+
else
|
|
274
|
+
t
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def recursive_extract_ctes(query, ctes)
|
|
279
|
+
# puts
|
|
280
|
+
# p [:rec, ctes, query.opts]
|
|
281
|
+
|
|
282
|
+
if (with = query.opts[:with])
|
|
283
|
+
keep, remove = with.partition { |w| w[:no_temp_table] }
|
|
284
|
+
ctes.concat(remove.map do |w|
|
|
285
|
+
opts = w.except(:name, :dataset, :no_temp_table)
|
|
286
|
+
# A shared table is created from its whole list, nested CTEs included.
|
|
287
|
+
ds = w[SHARED_TABLE] ? w[:dataset] : recursive_extract_ctes(w[:dataset], ctes)
|
|
288
|
+
[ w[:name], ds, opts ]
|
|
289
|
+
end)
|
|
290
|
+
# p [:rec_with, ctes.map(&:first), with]
|
|
291
|
+
query = query.clone(with: keep.empty? ? nil : keep)
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
if (from = query.opts[:from])
|
|
295
|
+
query = query.clone(from: from.map { |t| recursive_extract_cte_expr(t, ctes) })
|
|
296
|
+
# p [:rec_from, ctes.map(&:first), from]
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
if (joins = query.opts[:join])
|
|
300
|
+
query = query.clone(join: joins.map do |jc|
|
|
301
|
+
table_expr = recursive_extract_cte_expr(jc.table_expr, ctes)
|
|
302
|
+
# A CROSS JOIN is a plain JoinClause, with no ON condition.
|
|
303
|
+
if jc.respond_to?(:on)
|
|
304
|
+
jc.class.new(jc.on, jc.join_type, table_expr)
|
|
305
|
+
else
|
|
306
|
+
jc.class.new(jc.join_type, table_expr)
|
|
307
|
+
end
|
|
308
|
+
end)
|
|
309
|
+
# p [:rec_join, ctes.map(&:first), joins]
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
if (compounds = query.opts[:compounds])
|
|
313
|
+
query = query.clone(compounds: compounds.map { |t, ds, a| [ t, recursive_extract_ctes(ds, ctes), a ] })
|
|
314
|
+
# p [:rec_compounds, ctes.map(&:first), compounds]
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
if (where = query.opts[:where])
|
|
318
|
+
query = query.clone(where: CteExtractor.new(self, ctes).transform(where))
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
query
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
# Removes duplicate CTE names, then moves each CTE after the CTEs it reads.
|
|
325
|
+
#
|
|
326
|
+
# A CTE reads another when its SQL contains the other's name as the
|
|
327
|
+
# adapter quotes it (ds.db.literal): "name" on Postgres and DuckDB,
|
|
328
|
+
# `name` on Spark, and "scratch"."name" for a temp table in a scratch
|
|
329
|
+
# database. The closing quote stops a name from matching the start of a
|
|
330
|
+
# longer name. Each name also ends with the scope's counter and 32 random
|
|
331
|
+
# hex digits, so a name does not appear in other SQL by accident.
|
|
332
|
+
#
|
|
333
|
+
# The sort is stable: each step takes the first CTE whose dependencies are
|
|
334
|
+
# already placed. recursive_extract_ctes appends the CTEs that a dataset
|
|
335
|
+
# reads before the dataset itself, so an order that is already correct
|
|
336
|
+
# does not change. (sort_ctes sorts by layers, and would move CTEs.)
|
|
337
|
+
def sort_extracted_ctes(ctes)
|
|
338
|
+
unsorted = ctes.uniq(&:first)
|
|
339
|
+
literals = unsorted.to_h { |name, ds| [ name, ds.db.literal(name) ] }
|
|
340
|
+
deps = unsorted.to_h do |name, ds|
|
|
341
|
+
sql = ds.sql
|
|
342
|
+
[ name, literals.filter_map { |other, literal| other if other != name && sql.include?(literal) } ]
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
sorted = []
|
|
346
|
+
until unsorted.empty?
|
|
347
|
+
placed = sorted.map(&:first)
|
|
348
|
+
index = unsorted.index { |name, _| (deps[name] - placed).empty? }
|
|
349
|
+
raise(CteCycleError, unsorted.map { |name, _| literals[name] }) unless index
|
|
350
|
+
|
|
351
|
+
sorted << unsorted.delete_at(index)
|
|
352
|
+
end
|
|
353
|
+
sorted
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
def with_ctes(op, db, options = {})
|
|
188
357
|
raise "recall operator use without matching label" unless valid?
|
|
189
358
|
|
|
190
|
-
query =
|
|
359
|
+
query = op.evaluate(db)
|
|
360
|
+
rdbms = op.rdbms
|
|
191
361
|
|
|
362
|
+
query = query.from_self
|
|
363
|
+
temp_tables = []
|
|
192
364
|
ctes.each do |label, operator|
|
|
193
|
-
|
|
365
|
+
temp_tables << [ label_cte_name(label), recursive_extract_ctes(operator.evaluate(db), temp_tables) ]
|
|
194
366
|
end
|
|
367
|
+
query = recursive_extract_ctes(query, temp_tables)
|
|
368
|
+
shared_tables, temp_tables = temp_tables.partition { |_, _, with_opts| with_opts&.fetch(SHARED_TABLE, false) }
|
|
369
|
+
shared_tables = shared_tables.uniq(&:first)
|
|
370
|
+
temp_tables = sort_extracted_ctes(temp_tables)
|
|
371
|
+
|
|
372
|
+
if force_temp_tables?(options)
|
|
373
|
+
scope = self
|
|
374
|
+
query = query.with_extend do
|
|
375
|
+
# Create temp tables for each CTE
|
|
376
|
+
#
|
|
377
|
+
# Need to override multiple methods if sequel_pg is in use, as in
|
|
378
|
+
# that case not every method calls each. For other adapters or
|
|
379
|
+
# when sequel_pg is not in use, it is probably safe to override just each.
|
|
380
|
+
# There are other methods that may need to be overridden in order to handle
|
|
381
|
+
# all cases when sequel_pg is in use.
|
|
382
|
+
%i[each to_hash_groups to_hash].each do |meth|
|
|
383
|
+
define_method(meth) do |*args, &block|
|
|
384
|
+
if !temp_tables.empty? && !opts[:conceptql_temp_tables_created]
|
|
385
|
+
begin
|
|
386
|
+
temp_tables.each do |table_name, ds, _with_opts|
|
|
387
|
+
db.create_table(table_name, rdbms.create_options(scope, ds).merge(options).merge(as: ds))
|
|
388
|
+
rdbms.post_create(db, table_name)
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
clone(conceptql_temp_tables_created: true).send(meth, *args, &block)
|
|
392
|
+
ensure
|
|
393
|
+
drop_temp_tables
|
|
394
|
+
end
|
|
395
|
+
else
|
|
396
|
+
super(*args, &block)
|
|
397
|
+
end
|
|
398
|
+
end
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
define_method(:columns) do
|
|
402
|
+
if self.db.respond_to?(:record_table)
|
|
403
|
+
temp_tables.each do |table_name, ds, _with_opts|
|
|
404
|
+
self.db.record_table(table_name, self.db.columns_from_sql(ds))
|
|
405
|
+
end
|
|
406
|
+
end
|
|
407
|
+
super()
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
define_method(:sql_statements) do |*args, &block|
|
|
411
|
+
sql_statements = temp_tables.map do |table_name, ds|
|
|
412
|
+
[ table_name, ds.sql ]
|
|
413
|
+
end.compact.push([ :query, sql(*args, &block) ])
|
|
414
|
+
Hash[scope.shared_table_statements(shared_tables, op) + sql_statements]
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
define_method(:drop_temp_tables) do |opts = {}|
|
|
418
|
+
opts ||= {}
|
|
419
|
+
table_names = temp_tables.reverse_each.map(&:first)
|
|
420
|
+
begin
|
|
421
|
+
db.drop_table?(*table_names, rdbms.drop_options.merge(opts))
|
|
422
|
+
rescue Sequel::DatabaseError
|
|
423
|
+
warn("Unable to drop scratch table: #{literal(*table_names)}")
|
|
424
|
+
end
|
|
425
|
+
end
|
|
426
|
+
end
|
|
427
|
+
else
|
|
428
|
+
unless ConceptQL.avoid_ctes?
|
|
429
|
+
temp_tables.each do |table_name, ds, with_opts|
|
|
430
|
+
query = if with_opts.nil? || with_opts.empty?
|
|
431
|
+
query.with(table_name, ds)
|
|
432
|
+
else
|
|
433
|
+
query.with(table_name, ds, with_opts)
|
|
434
|
+
end
|
|
435
|
+
end
|
|
436
|
+
end
|
|
195
437
|
|
|
196
|
-
|
|
438
|
+
scope = self
|
|
439
|
+
query = query.with_extend do
|
|
440
|
+
define_method(:sql_statements) do |*args, &block|
|
|
441
|
+
Hash[scope.shared_table_statements(shared_tables, op).push([ :query, sql(*args, &block) ])]
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
define_method(:drop_temp_tables) do |opts = {}|
|
|
445
|
+
end
|
|
446
|
+
end
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
shared_tables.empty? ? query : create_shared_tables_on_read(query, shared_tables, op)
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
# The sql_statements entries that create the shared tables that do not
|
|
453
|
+
# exist yet. They come first, because the other entries read them.
|
|
454
|
+
def shared_table_statements(shared_tables, op)
|
|
455
|
+
shared_tables.filter_map { |name, key, _with_opts| op.nodifier.cdb.shared_utilization_statement(name, key) }
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
# Creates the shared tables that do not exist yet before the query reads
|
|
459
|
+
# its first rows, for a caller that reads rows through conceptql. This
|
|
460
|
+
# hook runs before the force_temp_tables hook, so the temp tables can read
|
|
461
|
+
# them. The shared tables are never in drop_temp_tables.
|
|
462
|
+
def create_shared_tables_on_read(query, shared_tables, op)
|
|
463
|
+
scope = self
|
|
464
|
+
cdb = op.nodifier.cdb
|
|
465
|
+
rdbms = op.rdbms
|
|
466
|
+
query.with_extend do
|
|
467
|
+
%i[each to_hash_groups to_hash].each do |meth|
|
|
468
|
+
define_method(meth) do |*args, &block|
|
|
469
|
+
shared_tables.each do |name, key, _with_opts|
|
|
470
|
+
cdb.create_shared_utilization_table(name, key, rdbms, scope)
|
|
471
|
+
end
|
|
472
|
+
super(*args, &block)
|
|
473
|
+
end
|
|
474
|
+
end
|
|
475
|
+
end
|
|
476
|
+
end
|
|
477
|
+
|
|
478
|
+
def label_cte_name(label)
|
|
479
|
+
@label_cte_names[label] ||= cte_name(label)
|
|
197
480
|
end
|
|
198
481
|
|
|
199
482
|
def ctes
|
|
@@ -203,5 +486,34 @@ module ConceptQL
|
|
|
203
486
|
def fetch_operator(label)
|
|
204
487
|
known_operators[label]
|
|
205
488
|
end
|
|
489
|
+
|
|
490
|
+
def windows
|
|
491
|
+
@windows ||= Window.from(opts.merge(opts[:window_opts] || {}))
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
def force_temp_tables?(options = {})
|
|
495
|
+
# opts.fetch(:force_temp_tables, opts[:force_temp_tables])
|
|
496
|
+
options.fetch(:force_temp_tables, opts[:force_temp_tables])
|
|
497
|
+
end
|
|
498
|
+
|
|
499
|
+
def scratch_database
|
|
500
|
+
opts[:scratch_database]
|
|
501
|
+
end
|
|
502
|
+
|
|
503
|
+
def cte_name(name, options = {})
|
|
504
|
+
cte_parts = [
|
|
505
|
+
opts[:table_prefix],
|
|
506
|
+
name.to_s.gsub(/\W+/, "_"),
|
|
507
|
+
$PROCESS_ID,
|
|
508
|
+
@cte_name_next.call,
|
|
509
|
+
SecureRandom.hex(16)
|
|
510
|
+
].compact
|
|
511
|
+
|
|
512
|
+
name = Sequel.identifier(cte_parts.join("_"))
|
|
513
|
+
|
|
514
|
+
name = name.qualify(scratch_database) if force_temp_tables?(options) && scratch_database
|
|
515
|
+
|
|
516
|
+
name
|
|
517
|
+
end
|
|
206
518
|
end
|
|
207
519
|
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ConceptQL
|
|
4
|
+
module SqlFormatters
|
|
5
|
+
# An external SQL formatter, given as a command array that reads SQL on
|
|
6
|
+
# stdin, e.g. Formatter.new(%w[sql-formatter -l postgresql]).
|
|
7
|
+
class Formatter
|
|
8
|
+
attr_reader :command
|
|
9
|
+
|
|
10
|
+
def initialize(command)
|
|
11
|
+
@command = command
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def available?
|
|
15
|
+
system("which", command.first, out: File::NULL, err: File::NULL)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def format(sql)
|
|
19
|
+
ConceptQL::Utils.timed_capture(*command, stdin_data: sql, timeout: 10)
|
|
20
|
+
rescue Timeout::Error
|
|
21
|
+
sql
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "sql_formatters/formatter"
|
|
4
|
+
|
|
5
|
+
module ConceptQL
|
|
6
|
+
module SqlFormatters
|
|
7
|
+
SQL_FORMATTER = %w[sql-formatter].freeze
|
|
8
|
+
POSTGRES = %w[sql-formatter -l postgresql].freeze
|
|
9
|
+
SQLFORMAT = %w[sqlformat --reindent --use_space_around_operators --identifiers lower --keywords upper -].freeze
|
|
10
|
+
PG_FORMAT = %w[pg_format].freeze
|
|
11
|
+
|
|
12
|
+
# Formats with the rdbms's preferred formatter, else the first of the
|
|
13
|
+
# fallbacks that is installed, else returns the SQL untouched.
|
|
14
|
+
def self.format(sql, rdbms)
|
|
15
|
+
formatter = [ rdbms.preferred_formatter, SQL_FORMATTER, SQLFORMAT, PG_FORMAT ]
|
|
16
|
+
.compact
|
|
17
|
+
.map { |command| Formatter.new(command) }
|
|
18
|
+
.detect(&:available?)
|
|
19
|
+
formatter ? formatter.format(sql) : sql
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support/core_ext/array/conversions"
|
|
4
|
+
require "active_support/core_ext/object/blank"
|
|
5
|
+
require "active_support/core_ext/string/inflections"
|
|
6
|
+
require "json"
|
|
7
|
+
require "open3"
|
|
8
|
+
require "timeout"
|
|
9
|
+
|
|
10
|
+
module ConceptQL
|
|
11
|
+
module Utils
|
|
12
|
+
class << self
|
|
13
|
+
def rekey(h, opts = {})
|
|
14
|
+
# Thanks to: https://stackoverflow.com/a/10721936
|
|
15
|
+
case h
|
|
16
|
+
when Hash
|
|
17
|
+
Hash[
|
|
18
|
+
h.map do |k, v|
|
|
19
|
+
[ k.respond_to?(:to_sym) ? k.to_sym : k, rekey(v, opts) ]
|
|
20
|
+
end
|
|
21
|
+
]
|
|
22
|
+
when Sequel::Dataset
|
|
23
|
+
h
|
|
24
|
+
when Enumerable
|
|
25
|
+
h.map { |v| rekey(v, opts) }
|
|
26
|
+
else
|
|
27
|
+
return h unless opts[:rekey_values]
|
|
28
|
+
return h.to_sym if h.respond_to?(:to_sym)
|
|
29
|
+
|
|
30
|
+
h
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def timed_capture(*commands)
|
|
35
|
+
# Heavily adapted from:
|
|
36
|
+
# https://gist.github.com/lpar/1032297#gistcomment-1738285
|
|
37
|
+
opts = extract_opts!(commands)
|
|
38
|
+
timeout = opts.fetch(:timeout)
|
|
39
|
+
|
|
40
|
+
stdin, stdout, stderr, wait_thread = Open3.popen3(*commands)
|
|
41
|
+
wait_thread[:timed_out] = false
|
|
42
|
+
stdin.puts opts[:stdin_data] if opts[:stdin_data]
|
|
43
|
+
stdin.close
|
|
44
|
+
|
|
45
|
+
# Purposefully NOT using Timeout.rb because in general it is a dangerous API!
|
|
46
|
+
# http://blog.headius.com/2008/02/rubys-threadraise-threadkill-timeoutrb.html
|
|
47
|
+
Thread.new do
|
|
48
|
+
sleep timeout
|
|
49
|
+
if wait_thread.alive?
|
|
50
|
+
begin
|
|
51
|
+
wait_thread[:timed_out] = true
|
|
52
|
+
# please note: we are assuming the command will create ONE process (not handling subprocs / proc groups)
|
|
53
|
+
command = "kill -9 #{wait_thread.pid}"
|
|
54
|
+
system(command)
|
|
55
|
+
rescue(Errno::ESRCH)
|
|
56
|
+
# Do nothing!
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
if (es = wait_thread.value.exitstatus) && !es.zero?
|
|
62
|
+
raise stderr.read
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
out = stdout.read
|
|
66
|
+
stdout.close
|
|
67
|
+
|
|
68
|
+
if wait_thread[:timed_out]
|
|
69
|
+
raise Timeout::Error, "Command #{commands} failed to complete after #{timeout} seconds"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
out
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def extract_opts!(arr)
|
|
76
|
+
return {} unless arr.last.is_a?(Hash)
|
|
77
|
+
|
|
78
|
+
arr.pop
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def assemble_date(*symbols)
|
|
82
|
+
opts = extract_opts!(symbols)
|
|
83
|
+
tab = opts[:table] ? Sequel[opts[:table].to_sym] : Sequel
|
|
84
|
+
|
|
85
|
+
strings = symbols.map do |symbol|
|
|
86
|
+
sub = "2000"
|
|
87
|
+
col = Sequel.cast_string(tab[symbol])
|
|
88
|
+
if symbol != :year_of_birth
|
|
89
|
+
sub = "01"
|
|
90
|
+
col = Sequel.function(:lpad, col, 2, "0")
|
|
91
|
+
end
|
|
92
|
+
Sequel.function(:coalesce, col, Sequel.expr(sub))
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
strings_with_dashes = strings.zip([ "-" ] * (symbols.length - 1)).flatten.compact
|
|
96
|
+
Sequel.join(strings_with_dashes)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def schema_dump(db)
|
|
100
|
+
schema = db.tables.sort.map do |t|
|
|
101
|
+
columns = db.schema(t).map do |column_name, column_info|
|
|
102
|
+
info = column_info.slice(:type, :allow_null, :primary_key, :default, :comment)
|
|
103
|
+
info[:null] = info.delete(:allow_null) ? nil : false
|
|
104
|
+
info[:primary_key] = info.delete(:primary_key) ? true : nil
|
|
105
|
+
[ column_name, info.compact ]
|
|
106
|
+
end.to_h
|
|
107
|
+
[ t, { columns: columns } ]
|
|
108
|
+
end.to_h
|
|
109
|
+
schema.to_yaml
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "thor"
|
|
4
|
+
require "sequelizer"
|
|
5
|
+
require "psych"
|
|
6
|
+
require_relative "utils"
|
|
7
|
+
|
|
8
|
+
module ConceptQL
|
|
9
|
+
class UtilsCLI < Thor
|
|
10
|
+
include Sequelizer
|
|
11
|
+
|
|
12
|
+
desc "dump_schema", "Dumps out the schema for all tables in YAML format"
|
|
13
|
+
def dump_schema
|
|
14
|
+
puts ConceptQL::Utils.schema_dump(db)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
data/lib/conceptql/version.rb
CHANGED