conceptql 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +226 -117
- data/LICENSE +21 -0
- data/README.md +35 -83
- data/bin/conceptql +2 -1
- data/bin/conceptql_utils +6 -0
- data/config/multiple_vocabularies.csv +4 -0
- data/config/provenance.yml +489 -0
- 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 +17 -0
- data/lib/conceptql/behaviors/labish.rb +19 -0
- data/lib/conceptql/behaviors/metadatable.rb +226 -73
- data/lib/conceptql/behaviors/provenanceable.rb +26 -0
- 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 +117 -108
- 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 +214 -0
- data/lib/conceptql/date_adjuster.rb +66 -18
- 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 +65 -24
- data/lib/conceptql/operators/after.rb +34 -14
- data/lib/conceptql/operators/any_overlap.rb +8 -6
- data/lib/conceptql/operators/before.rb +34 -10
- data/lib/conceptql/operators/binary_operator_operator.rb +66 -23
- data/lib/conceptql/operators/casting_operator.rb +51 -36
- data/lib/conceptql/operators/co_reported.rb +111 -0
- data/lib/conceptql/operators/concurrent_within.rb +69 -0
- data/lib/conceptql/operators/contains.rb +12 -8
- data/lib/conceptql/operators/count.rb +17 -9
- data/lib/conceptql/operators/date_range.rb +48 -14
- data/lib/conceptql/operators/death.rb +14 -4
- data/lib/conceptql/operators/dedup.rb +31 -0
- data/lib/conceptql/operators/during.rb +7 -12
- data/lib/conceptql/operators/episode.rb +146 -0
- data/lib/conceptql/operators/equal.rb +9 -3
- data/lib/conceptql/operators/ethnicity.rb +49 -0
- data/lib/conceptql/operators/except.rb +19 -12
- data/lib/conceptql/operators/filter.rb +23 -8
- data/lib/conceptql/operators/first.rb +16 -3
- data/lib/conceptql/operators/from.rb +52 -4
- data/lib/conceptql/operators/gender.rb +34 -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 +35 -0
- data/lib/conceptql/operators/last.rb +16 -3
- data/lib/conceptql/operators/match.rb +91 -0
- data/lib/conceptql/operators/multiple_vocabularies.rb +172 -0
- data/lib/conceptql/operators/numeric.rb +65 -23
- data/lib/conceptql/operators/numeric_filter.rb +68 -0
- data/lib/conceptql/operators/occurrence.rb +153 -32
- data/lib/conceptql/operators/one_in_two_out.rb +237 -38
- data/lib/conceptql/operators/operator.rb +624 -178
- data/lib/conceptql/operators/pass_thru.rb +17 -3
- data/lib/conceptql/operators/person.rb +18 -6
- data/lib/conceptql/operators/person_filter.rb +9 -3
- data/lib/conceptql/operators/place_of_service_filter.rb +43 -0
- data/lib/conceptql/operators/provenance.rb +55 -0
- data/lib/conceptql/operators/provider_filter.rb +62 -0
- data/lib/conceptql/operators/race.rb +55 -7
- data/lib/conceptql/operators/read.rb +168 -0
- data/lib/conceptql/operators/recall.rb +49 -14
- data/lib/conceptql/operators/snf.rb +19 -0
- data/lib/conceptql/operators/sum.rb +29 -12
- data/lib/conceptql/operators/temporal_operator.rb +108 -16
- data/lib/conceptql/operators/time_window.rb +20 -32
- data/lib/conceptql/operators/trim_date.rb +71 -0
- data/lib/conceptql/operators/trim_date_end.rb +28 -40
- data/lib/conceptql/operators/trim_date_start.rb +28 -41
- data/lib/conceptql/operators/union.rb +67 -6
- data/lib/conceptql/operators/vocabulary.rb +151 -0
- data/lib/conceptql/paths.rb +41 -0
- data/lib/conceptql/query.rb +191 -26
- 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 +20 -0
- 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 +481 -31
- 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 +65 -2
- 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 +267 -207
- data/.gitignore +0 -23
- data/Gemfile +0 -4
- data/Guardfile +0 -56
- data/LICENSE.txt +0 -22
- data/Rakefile +0 -1
- data/conceptql.gemspec +0 -32
- data/doc/ConceptQL Specification (alpha).pdf +0 -0
- data/doc/diagram_0.png +0 -0
- data/doc/implementation_notes.md +0 -39
- data/doc/spec.md +0 -1344
- data/lib/conceptql/behaviors/debuggable.rb +0 -70
- data/lib/conceptql/behaviors/dottable.rb +0 -103
- data/lib/conceptql/behaviors/preppable.rb +0 -20
- data/lib/conceptql/converter.rb +0 -65
- data/lib/conceptql/debugger.rb +0 -48
- data/lib/conceptql/fake_grapher.rb +0 -20
- data/lib/conceptql/graph.rb +0 -52
- data/lib/conceptql/graph_nodifier.rb +0 -203
- data/lib/conceptql/logger.rb +0 -10
- data/lib/conceptql/operators/complement.rb +0 -38
- data/lib/conceptql/operators/concept.rb +0 -70
- data/lib/conceptql/operators/condition_type.rb +0 -71
- data/lib/conceptql/operators/cpt.rb +0 -25
- data/lib/conceptql/operators/drug_type_concept.rb +0 -21
- data/lib/conceptql/operators/from_seer_visits.rb +0 -23
- data/lib/conceptql/operators/hcpcs.rb +0 -25
- data/lib/conceptql/operators/icd10.rb +0 -28
- data/lib/conceptql/operators/icd9.rb +0 -28
- data/lib/conceptql/operators/icd9_procedure.rb +0 -25
- data/lib/conceptql/operators/intersect.rb +0 -34
- data/lib/conceptql/operators/loinc.rb +0 -25
- data/lib/conceptql/operators/medcode.rb +0 -28
- data/lib/conceptql/operators/medcode_procedure.rb +0 -27
- data/lib/conceptql/operators/ndc.rb +0 -29
- data/lib/conceptql/operators/observation_by_enttype.rb +0 -29
- data/lib/conceptql/operators/observation_period.rb +0 -30
- data/lib/conceptql/operators/overlapped_by.rb +0 -23
- data/lib/conceptql/operators/overlaps.rb +0 -19
- data/lib/conceptql/operators/place_of_service_code.rb +0 -24
- data/lib/conceptql/operators/procedure_occurrence.rb +0 -25
- data/lib/conceptql/operators/prodcode.rb +0 -29
- data/lib/conceptql/operators/rxnorm.rb +0 -24
- data/lib/conceptql/operators/snomed.rb +0 -24
- data/lib/conceptql/operators/snomed_condition.rb +0 -26
- data/lib/conceptql/operators/source_vocabulary_operator.rb +0 -58
- data/lib/conceptql/operators/standard_vocabulary_operator.rb +0 -45
- data/lib/conceptql/operators/started_by.rb +0 -22
- data/lib/conceptql/operators/to_seer_visits.rb +0 -24
- data/lib/conceptql/operators/visit.rb +0 -15
- data/lib/conceptql/operators/visit_occurrence.rb +0 -30
- data/lib/conceptql/tree.rb +0 -53
- data/lib/conceptql/utils/temp_table.rb +0 -72
- data/spec/conceptql/behaviors/dottable_spec.rb +0 -99
- data/spec/conceptql/converter_spec.rb +0 -51
- data/spec/conceptql/date_adjuster_spec.rb +0 -68
- data/spec/conceptql/operators/after_spec.rb +0 -16
- data/spec/conceptql/operators/before_spec.rb +0 -16
- data/spec/conceptql/operators/casting_operator_spec.rb +0 -68
- data/spec/conceptql/operators/complement_spec.rb +0 -15
- data/spec/conceptql/operators/concept_spec.rb +0 -40
- data/spec/conceptql/operators/condition_type_spec.rb +0 -128
- data/spec/conceptql/operators/contains_spec.rb +0 -19
- data/spec/conceptql/operators/cpt_spec.rb +0 -29
- data/spec/conceptql/operators/date_range_spec.rb +0 -33
- data/spec/conceptql/operators/death_spec.rb +0 -10
- data/spec/conceptql/operators/during_spec.rb +0 -30
- data/spec/conceptql/operators/except_spec.rb +0 -15
- data/spec/conceptql/operators/first_spec.rb +0 -35
- data/spec/conceptql/operators/from_spec.rb +0 -13
- data/spec/conceptql/operators/gender_spec.rb +0 -27
- data/spec/conceptql/operators/hcpcs_spec.rb +0 -29
- data/spec/conceptql/operators/icd10_spec.rb +0 -34
- data/spec/conceptql/operators/icd9_procedure_spec.rb +0 -29
- data/spec/conceptql/operators/icd9_spec.rb +0 -34
- data/spec/conceptql/operators/intersect_spec.rb +0 -28
- data/spec/conceptql/operators/last_spec.rb +0 -36
- data/spec/conceptql/operators/loinc_spec.rb +0 -29
- data/spec/conceptql/operators/medcode_procedure_spec.rb +0 -34
- data/spec/conceptql/operators/medcode_spec.rb +0 -34
- data/spec/conceptql/operators/observation_period_spec.rb +0 -10
- data/spec/conceptql/operators/occurrence_spec.rb +0 -87
- data/spec/conceptql/operators/overlapped_by_spec.rb +0 -32
- data/spec/conceptql/operators/overlaps_spec.rb +0 -21
- data/spec/conceptql/operators/person_filter_spec.rb +0 -15
- data/spec/conceptql/operators/person_spec.rb +0 -10
- data/spec/conceptql/operators/place_of_service_code_spec.rb +0 -24
- data/spec/conceptql/operators/procedure_occurrence_spec.rb +0 -10
- data/spec/conceptql/operators/prodcode_spec.rb +0 -35
- data/spec/conceptql/operators/query_double.rb +0 -20
- data/spec/conceptql/operators/query_double_spec.rb +0 -7
- data/spec/conceptql/operators/race_spec.rb +0 -21
- data/spec/conceptql/operators/rxnorm_spec.rb +0 -29
- data/spec/conceptql/operators/snomed_spec.rb +0 -29
- data/spec/conceptql/operators/source_vocabulary_operator_spec.rb +0 -35
- data/spec/conceptql/operators/standard_vocabulary_operator_spec.rb +0 -35
- data/spec/conceptql/operators/started_by_spec.rb +0 -22
- data/spec/conceptql/operators/temporal_operator_spec.rb +0 -51
- data/spec/conceptql/operators/time_window_spec.rb +0 -77
- data/spec/conceptql/operators/union_spec.rb +0 -21
- data/spec/conceptql/operators/visit_occurrence_spec.rb +0 -10
- data/spec/conceptql/query_spec.rb +0 -22
- data/spec/conceptql/tree_spec.rb +0 -50
- data/spec/doubles/stream_for_casting_double.rb +0 -9
- data/spec/doubles/stream_for_occurrence_double.rb +0 -25
- data/spec/doubles/stream_for_temporal_double.rb +0 -6
- data/spec/spec_helper.rb +0 -102
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/concept'
|
|
3
|
-
|
|
4
|
-
describe ConceptQL::Operators::Concept do
|
|
5
|
-
it_behaves_like(:evaluator)
|
|
6
|
-
|
|
7
|
-
class ConceptDouble < ConceptQL::Operators::Concept
|
|
8
|
-
attr_accessor :cql_query
|
|
9
|
-
|
|
10
|
-
def arguments
|
|
11
|
-
[1]
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def set_statement(value)
|
|
15
|
-
@statement = { icd9: '412' }
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def set_cql_query(db)
|
|
19
|
-
@cql_query ||= nil
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def cql_query
|
|
23
|
-
set_cql_query(nil)
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
describe '#query' do
|
|
28
|
-
it 'evaluates upstream' do
|
|
29
|
-
cd = ConceptDouble.new(1)
|
|
30
|
-
db = Sequel.mock
|
|
31
|
-
cd.cql_query = double("query")
|
|
32
|
-
expect(cd.cql_query).to receive(:query).and_return(cd.cql_query)
|
|
33
|
-
expect(cd.cql_query).to receive(:from_self)
|
|
34
|
-
cd.query(db)
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/condition_type'
|
|
3
|
-
|
|
4
|
-
describe ConceptQL::Operators::ConditionType do
|
|
5
|
-
it_behaves_like(:evaluator)
|
|
6
|
-
|
|
7
|
-
describe '#query' do
|
|
8
|
-
it 'works for inpatient_detail_primary' do
|
|
9
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000183))"
|
|
10
|
-
expect(ConceptQL::Operators::ConditionType.new(:inpatient_detail_primary).query(Sequel.mock).sql).to eq(correct_query)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it 'works for inpatient_detail_1' do
|
|
14
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000184))"
|
|
15
|
-
expect(ConceptQL::Operators::ConditionType.new(:inpatient_detail_1).query(Sequel.mock).sql).to eq(correct_query)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it 'works for inpatient_detail_2' do
|
|
19
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000185))"
|
|
20
|
-
expect(ConceptQL::Operators::ConditionType.new(:inpatient_detail_2).query(Sequel.mock).sql).to eq(correct_query)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
it 'works for inpatient_header_primary' do
|
|
24
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000199))"
|
|
25
|
-
expect(ConceptQL::Operators::ConditionType.new(:inpatient_header_primary).query(Sequel.mock).sql).to eq(correct_query)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
it 'works for inpatient_header_1' do
|
|
29
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000200))"
|
|
30
|
-
expect(ConceptQL::Operators::ConditionType.new(:inpatient_header_1).query(Sequel.mock).sql).to eq(correct_query)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it 'works for outpatient_detail_1' do
|
|
34
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000215))"
|
|
35
|
-
expect(ConceptQL::Operators::ConditionType.new(:outpatient_detail_1).query(Sequel.mock).sql).to eq(correct_query)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it 'works for outpatient_header_1' do
|
|
39
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000230))"
|
|
40
|
-
expect(ConceptQL::Operators::ConditionType.new(:outpatient_header_1).query(Sequel.mock).sql).to eq(correct_query)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
it 'works for ehr_problem_list' do
|
|
44
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000245))"
|
|
45
|
-
expect(ConceptQL::Operators::ConditionType.new(:ehr_problem_list).query(Sequel.mock).sql).to eq(correct_query)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
it 'works for condition_era_0_day_window' do
|
|
49
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000246))"
|
|
50
|
-
expect(ConceptQL::Operators::ConditionType.new(:condition_era_0_day_window).query(Sequel.mock).sql).to eq(correct_query)
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
it 'works for condition_era_30_day_window' do
|
|
54
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000247))"
|
|
55
|
-
expect(ConceptQL::Operators::ConditionType.new(:condition_era_30_day_window).query(Sequel.mock).sql).to eq(correct_query)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
describe 'with primary' do
|
|
59
|
-
it 'works for just primary' do
|
|
60
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000183, 38000199, 38000215, 38000230))"
|
|
61
|
-
expect(ConceptQL::Operators::ConditionType.new(:primary).query(Sequel.mock).sql).to eq(correct_query)
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
it 'works for inpatient_primary' do
|
|
65
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000183, 38000199))"
|
|
66
|
-
expect(ConceptQL::Operators::ConditionType.new(:inpatient_primary).query(Sequel.mock).sql).to eq(correct_query)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
it 'works for outpatient_primary' do
|
|
70
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000215, 38000230))"
|
|
71
|
-
expect(ConceptQL::Operators::ConditionType.new(:outpatient_primary).query(Sequel.mock).sql).to eq(correct_query)
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
describe 'with multiple arguments' do
|
|
76
|
-
it 'works for inpatient_detail_1' do
|
|
77
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000184, 38000185))"
|
|
78
|
-
expect(ConceptQL::Operators::ConditionType.new(:inpatient_detail_1, :inpatient_detail_2).query(Sequel.mock).sql).to eq(correct_query)
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
describe 'with arguments as strings' do
|
|
83
|
-
it 'works for inpatient_detail_1' do
|
|
84
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000184, 38000185))"
|
|
85
|
-
expect(ConceptQL::Operators::ConditionType.new('inpatient_detail_1', 'inpatient_detail_2').query(Sequel.mock).sql).to eq(correct_query)
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
describe 'as category' do
|
|
90
|
-
it 'works for inpatient_detail' do
|
|
91
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000183, 38000184, 38000185, 38000186, 38000187, 38000188, 38000189, 38000190, 38000191, 38000192, 38000193, 38000194, 38000195, 38000196, 38000197, 38000198))"
|
|
92
|
-
expect(ConceptQL::Operators::ConditionType.new('inpatient_detail').query(Sequel.mock).sql).to eq(correct_query)
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
it 'works for inpatient_header' do
|
|
96
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000199, 38000200, 38000201, 38000202, 38000203, 38000204, 38000205, 38000206, 38000207, 38000208, 38000209, 38000210, 38000211, 38000212, 38000213, 38000214))"
|
|
97
|
-
expect(ConceptQL::Operators::ConditionType.new('inpatient_header').query(Sequel.mock).sql).to eq(correct_query)
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
it 'works for inpatient' do
|
|
101
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000183, 38000184, 38000185, 38000186, 38000187, 38000188, 38000189, 38000190, 38000191, 38000192, 38000193, 38000194, 38000195, 38000196, 38000197, 38000198, 38000199, 38000200, 38000201, 38000202, 38000203, 38000204, 38000205, 38000206, 38000207, 38000208, 38000209, 38000210, 38000211, 38000212, 38000213, 38000214))"
|
|
102
|
-
expect(ConceptQL::Operators::ConditionType.new('inpatient').query(Sequel.mock).sql).to eq(correct_query)
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
it 'works for outpatient_detail' do
|
|
106
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000215, 38000216, 38000217, 38000218, 38000219, 38000220, 38000221, 38000222, 38000223, 38000224, 38000225, 38000226, 38000227, 38000228, 38000229))"
|
|
107
|
-
expect(ConceptQL::Operators::ConditionType.new('outpatient_detail').query(Sequel.mock).sql).to eq(correct_query)
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
it 'works for outpatient_header' do
|
|
111
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000230, 38000231, 38000232, 38000233, 38000234, 38000235, 38000236, 38000237, 38000238, 38000239, 38000240, 38000241, 38000242, 38000243, 38000244))"
|
|
112
|
-
expect(ConceptQL::Operators::ConditionType.new('outpatient_header').query(Sequel.mock).sql).to eq(correct_query)
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
it 'works for outpatient' do
|
|
116
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000215, 38000216, 38000217, 38000218, 38000219, 38000220, 38000221, 38000222, 38000223, 38000224, 38000225, 38000226, 38000227, 38000228, 38000229, 38000230, 38000231, 38000232, 38000233, 38000234, 38000235, 38000236, 38000237, 38000238, 38000239, 38000240, 38000241, 38000242, 38000243, 38000244))"
|
|
117
|
-
expect(ConceptQL::Operators::ConditionType.new('outpatient').query(Sequel.mock).sql).to eq(correct_query)
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
it 'works for condition_era' do
|
|
121
|
-
correct_query = "SELECT * FROM condition_occurrence WHERE (condition_type_concept_id IN (38000246, 38000247))"
|
|
122
|
-
expect(ConceptQL::Operators::ConditionType.new('condition_era').query(Sequel.mock).sql).to eq(correct_query)
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/contains'
|
|
3
|
-
require_double('stream_for_temporal')
|
|
4
|
-
|
|
5
|
-
describe ConceptQL::Operators::Contains do
|
|
6
|
-
it_behaves_like(:temporal_operator)
|
|
7
|
-
|
|
8
|
-
describe 'when not inclusive' do
|
|
9
|
-
subject do
|
|
10
|
-
described_class.new(left: StreamForTemporalDouble.new, right: StreamForTemporalDouble.new)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it 'should use proper where clause' do
|
|
14
|
-
expect(subject.query(Sequel.mock).sql).to match('r.end_date <= l.end_date')
|
|
15
|
-
expect(subject.query(Sequel.mock).sql).to match('l.start_date <= r.start_date')
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/cpt'
|
|
3
|
-
|
|
4
|
-
describe ConceptQL::Operators::Cpt do
|
|
5
|
-
it_behaves_like(:standard_vocabulary_operator)
|
|
6
|
-
|
|
7
|
-
subject do
|
|
8
|
-
described_class.new
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
describe '#table' do
|
|
12
|
-
it 'should be procedure_occurrence' do
|
|
13
|
-
expect(subject.table).to eq(:procedure_occurrence)
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
describe '#concept_column' do
|
|
18
|
-
it 'should be procedure_concept_id' do
|
|
19
|
-
expect(subject.concept_column).to eq(:procedure_concept_id)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
describe '#vocabulary_id' do
|
|
24
|
-
it 'should be 4' do
|
|
25
|
-
expect(subject.vocabulary_id).to eq(4)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/date_range'
|
|
3
|
-
|
|
4
|
-
describe ConceptQL::Operators::DateRange do
|
|
5
|
-
it_behaves_like(:evaluator)
|
|
6
|
-
|
|
7
|
-
describe '#types' do
|
|
8
|
-
it 'should be [:date]' do
|
|
9
|
-
expect(ConceptQL::Operators::DateRange.new(start: '2004-12-13', end: '2010-03-20').types).to eq([:person])
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
describe '#query' do
|
|
14
|
-
it 'should be dates specified assigned to all persons' do
|
|
15
|
-
expect(ConceptQL::Operators::DateRange.new(start: '2004-12-13', end: '2010-03-20').query(Sequel.mock).sql).to eq("SELECT * FROM (SELECT *, CAST('person' AS varchar(255)) AS criterion_type, person_id AS criterion_id, date '2004-12-13' AS start_date, date '2010-03-20' AS end_date FROM person) AS t1")
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it 'should handle strings for option keys' do
|
|
19
|
-
expect(ConceptQL::Operators::DateRange.new('start' => '2004-12-13', 'end' => '2010-03-20').query(Sequel.mock).sql).to eq("SELECT * FROM (SELECT *, CAST('person' AS varchar(255)) AS criterion_type, person_id AS criterion_id, date '2004-12-13' AS start_date, date '2010-03-20' AS end_date FROM person) AS t1")
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it 'handles START as day before first recorded observation_period' do
|
|
23
|
-
expect(ConceptQL::Operators::DateRange.new(start: 'START', end: '2010-03-20').query(Sequel.mock).sql).to eq("SELECT * FROM (SELECT *, CAST('person' AS varchar(255)) AS criterion_type, person_id AS criterion_id, (SELECT min(observation_period_start_date) FROM observation_period) AS start_date, date '2010-03-20' AS end_date FROM person) AS t1")
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it 'handles END as last date of recorded observation_period' do
|
|
27
|
-
expect(ConceptQL::Operators::DateRange.new(start: '2004-12-13', end: 'END').query(Sequel.mock).sql).to eq("SELECT * FROM (SELECT *, CAST('person' AS varchar(255)) AS criterion_type, person_id AS criterion_id, date '2004-12-13' AS start_date, (SELECT max(observation_period_end_date) FROM observation_period) AS end_date FROM person) AS t1")
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/during'
|
|
3
|
-
require_double('stream_for_temporal')
|
|
4
|
-
|
|
5
|
-
describe ConceptQL::Operators::During do
|
|
6
|
-
it_behaves_like(:temporal_operator)
|
|
7
|
-
|
|
8
|
-
describe 'when not inclusive' do
|
|
9
|
-
subject do
|
|
10
|
-
described_class.new(left: StreamForTemporalDouble.new, right: StreamForTemporalDouble.new)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it 'should use proper where clause' do
|
|
14
|
-
expect(subject.query(Sequel.mock).sql).to match('l.end_date <= r.end_date')
|
|
15
|
-
expect(subject.query(Sequel.mock).sql).to match('r.start_date <= l.start_date')
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
describe 'when inclusive' do
|
|
20
|
-
subject do
|
|
21
|
-
described_class.new(left: StreamForTemporalDouble.new, right: StreamForTemporalDouble.new, inclusive: true)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
it 'should use proper where clause' do
|
|
25
|
-
expect(subject.query(Sequel.mock).sql).to match(/\(r.start_date <= l.end_date\) AND \(l.end_date <= r.end_date\)/)
|
|
26
|
-
expect(subject.query(Sequel.mock).sql).to match(/\(r.start_date <= l.start_date\) AND \(l.start_date <= r.end_date\)/)
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/except'
|
|
3
|
-
require_relative 'query_double'
|
|
4
|
-
|
|
5
|
-
describe ConceptQL::Operators::Except do
|
|
6
|
-
it_behaves_like(:evaluator)
|
|
7
|
-
|
|
8
|
-
describe '#query' do
|
|
9
|
-
it 'uses right stream as argument to EXCEPT against left stream' do
|
|
10
|
-
double1 = QueryDouble.new(1)
|
|
11
|
-
double2 = QueryDouble.new(2)
|
|
12
|
-
expect(ConceptQL::Operators::Except.new(left: double1, right: double2).query(Sequel.mock).sql).to eq("SELECT * FROM (SELECT * FROM table1 EXCEPT SELECT * FROM table2) AS t1")
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/first'
|
|
3
|
-
require_double('stream_for_occurrence')
|
|
4
|
-
|
|
5
|
-
describe ConceptQL::Operators::First do
|
|
6
|
-
it_behaves_like(:evaluator)
|
|
7
|
-
|
|
8
|
-
it 'should have occurrence pegged at 1' do
|
|
9
|
-
expect(described_class.new.occurrence).to eq(1)
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
describe 'occurrence set to 1' do
|
|
13
|
-
subject do
|
|
14
|
-
described_class.new(StreamForOccurrenceDouble.new).query(Sequel.mock(host: 'postgres')).sql
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
it 'should order by ascending start_date' do
|
|
18
|
-
expect(subject).to match('ORDER BY "start_date" ASC')
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
it 'should partition by person_id' do
|
|
22
|
-
expect(subject).to match('PARTITION BY "person_id"')
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it 'should assign a row number' do
|
|
26
|
-
expect(subject).to match('row_number()')
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it 'should find the all rows with rn = 1' do
|
|
30
|
-
expect(subject).to match('"rn" = 1')
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/from'
|
|
3
|
-
require_relative 'query_double'
|
|
4
|
-
|
|
5
|
-
describe ConceptQL::Operators::From do
|
|
6
|
-
it_behaves_like(:evaluator)
|
|
7
|
-
|
|
8
|
-
describe '#query' do
|
|
9
|
-
it 'works for single criteria' do
|
|
10
|
-
expect(ConceptQL::Operators::From.new(:table1).query(Sequel.mock).sql).to eq("SELECT * FROM table1")
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/gender'
|
|
3
|
-
|
|
4
|
-
describe ConceptQL::Operators::Gender do
|
|
5
|
-
it_behaves_like(:evaluator)
|
|
6
|
-
|
|
7
|
-
describe '#query' do
|
|
8
|
-
it 'works for male/MALE/Male/M/m' do
|
|
9
|
-
correct_query = "SELECT * FROM person WHERE (gender_concept_id IN (8507))"
|
|
10
|
-
expect(ConceptQL::Operators::Gender.new('male').query(Sequel.mock).sql).to eq(correct_query)
|
|
11
|
-
expect(ConceptQL::Operators::Gender.new('Male').query(Sequel.mock).sql).to eq(correct_query)
|
|
12
|
-
expect(ConceptQL::Operators::Gender.new('MALE').query(Sequel.mock).sql).to eq(correct_query)
|
|
13
|
-
expect(ConceptQL::Operators::Gender.new('M').query(Sequel.mock).sql).to eq(correct_query)
|
|
14
|
-
expect(ConceptQL::Operators::Gender.new('m').query(Sequel.mock).sql).to eq(correct_query)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
it 'works for Female/FEMALE/female/F/f' do
|
|
18
|
-
correct_query = "SELECT * FROM person WHERE (gender_concept_id IN (8532))"
|
|
19
|
-
expect(ConceptQL::Operators::Gender.new('female').query(Sequel.mock).sql).to eq(correct_query)
|
|
20
|
-
expect(ConceptQL::Operators::Gender.new('Female').query(Sequel.mock).sql).to eq(correct_query)
|
|
21
|
-
expect(ConceptQL::Operators::Gender.new('FEMALE').query(Sequel.mock).sql).to eq(correct_query)
|
|
22
|
-
expect(ConceptQL::Operators::Gender.new('F').query(Sequel.mock).sql).to eq(correct_query)
|
|
23
|
-
expect(ConceptQL::Operators::Gender.new('f').query(Sequel.mock).sql).to eq(correct_query)
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/hcpcs'
|
|
3
|
-
|
|
4
|
-
describe ConceptQL::Operators::Hcpcs do
|
|
5
|
-
it_behaves_like(:standard_vocabulary_operator)
|
|
6
|
-
|
|
7
|
-
subject do
|
|
8
|
-
described_class.new
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
describe '#table' do
|
|
12
|
-
it 'should be procedure_occurrence' do
|
|
13
|
-
expect(subject.table).to eq(:procedure_occurrence)
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
describe '#concept_column' do
|
|
18
|
-
it 'should be procedure_concept_id' do
|
|
19
|
-
expect(subject.concept_column).to eq(:procedure_concept_id)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
describe '#vocabulary_id' do
|
|
24
|
-
it 'should be 5' do
|
|
25
|
-
expect(subject.vocabulary_id).to eq(5)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/icd10'
|
|
3
|
-
|
|
4
|
-
describe ConceptQL::Operators::Icd10 do
|
|
5
|
-
it_behaves_like(:source_vocabulary_operator)
|
|
6
|
-
|
|
7
|
-
subject do
|
|
8
|
-
described_class.new
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
describe '#table' do
|
|
12
|
-
it 'should be condition_occurrence' do
|
|
13
|
-
expect(subject.table).to eq(:condition_occurrence)
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
describe '#concept_column' do
|
|
18
|
-
it 'should be condition_concept_id' do
|
|
19
|
-
expect(subject.concept_column).to eq(:condition_concept_id)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
describe '#source_column' do
|
|
24
|
-
it 'should be condition_source_valuej' do
|
|
25
|
-
expect(subject.source_column).to eq(:condition_source_value)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
describe '#vocabulary_id' do
|
|
30
|
-
it 'should be 34' do
|
|
31
|
-
expect(subject.vocabulary_id).to eq(34)
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/icd9_procedure'
|
|
3
|
-
|
|
4
|
-
describe ConceptQL::Operators::Icd9Procedure do
|
|
5
|
-
it_behaves_like(:standard_vocabulary_operator)
|
|
6
|
-
|
|
7
|
-
subject do
|
|
8
|
-
described_class.new
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
describe '#table' do
|
|
12
|
-
it 'should be procedure_occurrence' do
|
|
13
|
-
expect(subject.table).to eq(:procedure_occurrence)
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
describe '#concept_column' do
|
|
18
|
-
it 'should be procedure_concept_id' do
|
|
19
|
-
expect(subject.concept_column).to eq(:procedure_concept_id)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
describe '#vocabulary_id' do
|
|
24
|
-
it 'should be 3' do
|
|
25
|
-
expect(subject.vocabulary_id).to eq(3)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/icd9'
|
|
3
|
-
|
|
4
|
-
describe ConceptQL::Operators::Icd9 do
|
|
5
|
-
it_behaves_like(:source_vocabulary_operator)
|
|
6
|
-
|
|
7
|
-
subject do
|
|
8
|
-
ConceptQL::Operators::Icd9.new
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
describe '#table' do
|
|
12
|
-
it 'should be condition_occurrence' do
|
|
13
|
-
expect(subject.table).to eq(:condition_occurrence)
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
describe '#concept_column' do
|
|
18
|
-
it 'should be condition_concept_id' do
|
|
19
|
-
expect(subject.concept_column).to eq(:condition_concept_id)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
describe '#source_column' do
|
|
24
|
-
it 'should be condition_source_valuej' do
|
|
25
|
-
expect(subject.source_column).to eq(:condition_source_value)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
describe '#vocabulary_id' do
|
|
30
|
-
it 'should be 2' do
|
|
31
|
-
expect(subject.vocabulary_id).to eq(2)
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/intersect'
|
|
3
|
-
require_relative 'query_double'
|
|
4
|
-
|
|
5
|
-
describe ConceptQL::Operators::Intersect do
|
|
6
|
-
it_behaves_like(:evaluator)
|
|
7
|
-
|
|
8
|
-
describe '#query' do
|
|
9
|
-
it 'works for multiple criteria of same type' do
|
|
10
|
-
double1 = QueryDouble.new(1)
|
|
11
|
-
double2 = QueryDouble.new(2)
|
|
12
|
-
double3 = QueryDouble.new(3)
|
|
13
|
-
expect(ConceptQL::Operators::Intersect.new(double1, double2, double3).query(Sequel.mock).sql).to eq("SELECT * FROM (SELECT * FROM (SELECT * FROM table1 INTERSECT SELECT * FROM table2) AS t1 INTERSECT SELECT * FROM table3) AS t1")
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
it 'works for multiple criteria of different type' do
|
|
17
|
-
double1 = QueryDouble.new(1)
|
|
18
|
-
double2 = QueryDouble.new(2, :person)
|
|
19
|
-
double3 = QueryDouble.new(3)
|
|
20
|
-
expect(ConceptQL::Operators::Intersect.new(double1, double2, double3).query(Sequel.mock).sql).to eq("SELECT * FROM (SELECT * FROM (SELECT * FROM table1 INTERSECT SELECT * FROM table3) AS t1 UNION ALL SELECT * FROM table2) AS t1")
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
it 'works for single criteria' do
|
|
24
|
-
double1 = QueryDouble.new(1)
|
|
25
|
-
expect(ConceptQL::Operators::Intersect.new(double1).query(Sequel.mock).sql).to eq("SELECT * FROM table1")
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/last'
|
|
3
|
-
require_double('stream_for_occurrence')
|
|
4
|
-
|
|
5
|
-
describe ConceptQL::Operators::Last do
|
|
6
|
-
it_behaves_like(:evaluator)
|
|
7
|
-
|
|
8
|
-
it 'should have occurrence pegged at -1' do
|
|
9
|
-
expect(described_class.new.occurrence).to eq(-1)
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
describe 'occurrence set to -1' do
|
|
13
|
-
subject do
|
|
14
|
-
described_class.new(StreamForOccurrenceDouble.new).query(Sequel.mock(host: 'postgres')).sql
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
it 'should order by descending start_date' do
|
|
19
|
-
expect(subject).to match('ORDER BY "start_date" DESC')
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it 'should partition by person_id' do
|
|
23
|
-
expect(subject).to match('PARTITION BY "person_id"')
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it 'should assign a row number' do
|
|
27
|
-
expect(subject).to match('row_number()')
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it 'should find the all rows with rn = 1' do
|
|
31
|
-
expect(subject).to match('"rn" = 1')
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/loinc'
|
|
3
|
-
|
|
4
|
-
describe ConceptQL::Operators::Loinc do
|
|
5
|
-
it_behaves_like(:standard_vocabulary_operator)
|
|
6
|
-
|
|
7
|
-
subject do
|
|
8
|
-
described_class.new
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
describe '#table' do
|
|
12
|
-
it 'should be observation' do
|
|
13
|
-
expect(subject.table).to eq(:observation)
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
describe '#concept_column' do
|
|
18
|
-
it 'should be procedure_concept_id' do
|
|
19
|
-
expect(subject.concept_column).to eq(:observation_concept_id)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
describe '#vocabulary_id' do
|
|
24
|
-
it 'should be 6' do
|
|
25
|
-
expect(subject.vocabulary_id).to eq(6)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'conceptql/operators/medcode_procedure'
|
|
3
|
-
|
|
4
|
-
describe ConceptQL::Operators::MedcodeProcedure do
|
|
5
|
-
it_behaves_like(:source_vocabulary_operator)
|
|
6
|
-
|
|
7
|
-
subject do
|
|
8
|
-
described_class.new
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
describe '#table' do
|
|
12
|
-
it 'should be procedure_occurrence' do
|
|
13
|
-
expect(subject.table).to eq(:procedure_occurrence)
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
describe '#concept_column' do
|
|
18
|
-
it 'should be procedure_concept_id' do
|
|
19
|
-
expect(subject.concept_column).to eq(:procedure_concept_id)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
describe '#source_column' do
|
|
24
|
-
it 'should be procedure_source_valuej' do
|
|
25
|
-
expect(subject.source_column).to eq(:procedure_source_value)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
describe '#vocabulary_id' do
|
|
30
|
-
it 'should be 204 (a J&J provided mapping as part of CPRD)' do
|
|
31
|
-
expect(subject.vocabulary_id).to eq(204)
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|