canql 5.9.0 → 6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/lib/canql/grammars/anomaly.treetop +1 -1
- data/lib/canql/grammars/e_base_records.treetop +4 -2
- data/lib/canql/grammars/events.treetop +39 -0
- data/lib/canql/grammars/genetic_test.treetop +1 -1
- data/lib/canql/grammars/main.treetop +6 -6
- data/lib/canql/grammars/patient.treetop +7 -7
- data/lib/canql/grammars/test_result.treetop +1 -1
- data/lib/canql/grammars/test_result_group.treetop +5 -5
- data/lib/canql/grammars.rb +1 -1
- data/lib/canql/nodes/age.rb +1 -1
- data/lib/canql/nodes/anomaly.rb +11 -21
- data/lib/canql/nodes/dates.rb +6 -6
- data/lib/canql/nodes/e_base_records.rb +1 -1
- data/lib/canql/nodes/events.rb +40 -0
- data/lib/canql/nodes/genetic_test.rb +4 -5
- data/lib/canql/nodes/main.rb +4 -4
- data/lib/canql/nodes/patient.rb +4 -3
- data/lib/canql/nodes/patient_events.rb +36 -0
- data/lib/canql/nodes/perinatal_hospital.rb +1 -1
- data/lib/canql/nodes/registry.rb +1 -1
- data/lib/canql/nodes/test_result.rb +4 -4
- data/lib/canql/nodes/test_result_group.rb +10 -10
- data/lib/canql/nodes.rb +1 -1
- data/lib/canql/treetop/extensions.rb +5 -4
- data/lib/canql/version.rb +1 -1
- metadata +6 -137
- data/lib/canql/grammars/hes_event.treetop +0 -15
- data/lib/canql/nodes/hes_event.rb +0 -17
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 360922ab34dbdcb72c3cad8ba6ae105044534b8955c77237dcc90789e610caca
|
|
4
|
+
data.tar.gz: 7b8f9550fcf004647b8831cbc401c417a34c81e3c27dbd7446725acca012b3ac
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b7c4eefb874fd4f0dd5b9ad0a5cdaab212d595d5ddd46a60f9f0b02704309597bda66b39edaf2abdf9d488e6676c9b81e1e09660700bedd3e744c24dd45fc481
|
|
7
|
+
data.tar.gz: 33a6c07541a128f31393d219246bf1e2135ac25ad30f84926232a1b86574ccf88ba159ef1b5798bb5a8e8d4e05ef279aa330c82c7779ff36230b7ef553297afa
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
## [Unreleased]
|
|
2
2
|
|
|
3
|
+
## 6.0.1 / 2024-10-14
|
|
4
|
+
### Fixed
|
|
5
|
+
* Code only misspelling of existence
|
|
6
|
+
* Code only misspelling of modifier
|
|
7
|
+
* Code only misspelling of number
|
|
8
|
+
* Code only misspelling of acceptance
|
|
9
|
+
* Moved development dependencies to Gem files
|
|
10
|
+
|
|
11
|
+
## 6.0.0 / 2024-09-30
|
|
12
|
+
### Changed
|
|
13
|
+
* Changed the hes event filter to align with other new event filter
|
|
14
|
+
### Added
|
|
15
|
+
* Added event filters for birth, death, pregnancy loss and MSDS
|
|
16
|
+
* Added 'number of fetuses in early pregnancy' to field existence modifier
|
|
17
|
+
* Removed 'CODING_CLINIC' & 'REG_GROUP' actions from the action filter
|
|
18
|
+
* Added 'BADGER_CHECKED', 'DELETE', 'FASP_CATEGORISATION', 'MSDS_SENT', 'RARE_DISEASE_TEAM', 'REG_CODING_FORUM' & 'SOURCES_CHECKED' actions to the action filter
|
|
19
|
+
|
|
3
20
|
## 5.9.0 / 2023-01-17
|
|
4
21
|
* Added 'other' option to anomaly screening status filter (#90)
|
|
5
22
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module Canql
|
|
2
2
|
grammar Anomaly
|
|
3
3
|
rule anomalies
|
|
4
|
-
and_keyword?
|
|
4
|
+
and_keyword? existence_modifier:anomalies_no_keyword? status_type:anomaly_status? natal_period:anomalies_natal_period? screening_status_type:anomaly_screening_status? code_data:(space first:anomalies_icd_code rest:more_anomalies_icd_codes* word_break)? anomalies_keyword <Nodes::Anomaly::WithCondition>
|
|
5
5
|
end
|
|
6
6
|
|
|
7
7
|
rule anomalies_no_keyword
|
|
@@ -49,8 +49,10 @@ module Canql
|
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
rule accepted_action
|
|
52
|
-
'badger_search' / '
|
|
53
|
-
'
|
|
52
|
+
'badger_search' / 'badger_checked' / 'coding_group' / 'complete' /
|
|
53
|
+
'delete' / 'fasp_categorisation' / 'msds_sent' / 'qa' /
|
|
54
|
+
'rare_disease_team' / 'reg_coding_forum' /
|
|
55
|
+
'scr_checked' / 'scr_check' / 'search' / 'sources_checked' / 'technical'
|
|
54
56
|
end
|
|
55
57
|
|
|
56
58
|
rule all_or_none_actions
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module Canql
|
|
2
|
+
grammar Events
|
|
3
|
+
rule events
|
|
4
|
+
and_keyword? existence_modifier:events_no_keyword? events_name event_object_keyword <Nodes::Events::WithCondition>
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
rule events_no_keyword
|
|
8
|
+
space ('no' / 'some') word_break
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
rule events_keywords
|
|
12
|
+
space ('birth' / 'death' / 'hes' / 'preg loss hes' / 'pregnancy loss hes' / 'preg loss bpas' / 'pregnancy loss bpas' / 'msds') word_break
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
rule relevant_events_keywords
|
|
16
|
+
space ('preg loss hes' / 'pregnancy loss hes' / 'preg loss bpas' / 'pregnancy loss bpas' / 'msds') word_break
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
rule events_name
|
|
20
|
+
(relevant_events / non_relevant_events)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
rule non_relevant_events
|
|
24
|
+
event_type:events_keywords
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
rule relevant_events
|
|
28
|
+
event_relevance:event_relevant_keyword event_type:relevant_events_keywords
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
rule event_relevant_keyword
|
|
32
|
+
space ('linked' / 'relevant' / 'related' / 'unlinked' / 'irrelevant' / 'unrelated') word_break
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
rule event_object_keyword
|
|
36
|
+
space ('events' / 'event' / 'records' / 'record') word_break
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module Canql
|
|
2
2
|
grammar GeneticTest
|
|
3
3
|
rule genetic_tests
|
|
4
|
-
and_keyword?
|
|
4
|
+
and_keyword? existence_modifier:genetic_tests_no_keyword? genetic_tests_keyword <Nodes::GeneticTest::WithCondition>
|
|
5
5
|
end
|
|
6
6
|
|
|
7
7
|
rule genetic_tests_no_keyword
|
|
@@ -6,7 +6,7 @@ grammar Canql
|
|
|
6
6
|
include GeneticTest
|
|
7
7
|
include TestResult
|
|
8
8
|
include TestResultGroup
|
|
9
|
-
include
|
|
9
|
+
include Events
|
|
10
10
|
include Dates
|
|
11
11
|
include EBaseRecords
|
|
12
12
|
include BatchTypes
|
|
@@ -92,7 +92,7 @@ grammar Canql
|
|
|
92
92
|
space 'and' word_break
|
|
93
93
|
end
|
|
94
94
|
|
|
95
|
-
rule
|
|
95
|
+
rule existence_keyword
|
|
96
96
|
space ('missing' / ('field' 's'?) / 'populated') word_break
|
|
97
97
|
end
|
|
98
98
|
|
|
@@ -130,12 +130,12 @@ grammar Canql
|
|
|
130
130
|
|
|
131
131
|
rule case_with_conditions
|
|
132
132
|
anomalies / genetic_tests / test_results / perinatal_hospital /
|
|
133
|
-
|
|
134
|
-
mother_conditions / action_or_ebr /
|
|
133
|
+
case_field_existence / test_acceptance_existence / test_result_groups /
|
|
134
|
+
mother_conditions / action_or_ebr / events
|
|
135
135
|
end
|
|
136
136
|
|
|
137
137
|
rule patient_with_conditions
|
|
138
|
-
anomalies / genetic_tests / test_results /
|
|
139
|
-
action_or_ebr /
|
|
138
|
+
anomalies / genetic_tests / test_results / patient_field_existence /
|
|
139
|
+
action_or_ebr / events
|
|
140
140
|
end
|
|
141
141
|
end
|
|
@@ -30,12 +30,12 @@ module Canql
|
|
|
30
30
|
expected_keyword fuzzy_date <Nodes::Patient::ExpectedDateRangeNode>
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
rule
|
|
34
|
-
and_keyword?
|
|
33
|
+
rule case_field_existence
|
|
34
|
+
and_keyword? field_existence_modifier:existence_keyword patient_field_list:case_field_list <Nodes::Patient::FieldExists>
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
-
rule
|
|
38
|
-
and_keyword?
|
|
37
|
+
rule patient_field_existence
|
|
38
|
+
and_keyword? field_existence_modifier:existence_keyword patient_field_list:patient_field_list <Nodes::Patient::FieldExists>
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
rule patient_fields_keyword
|
|
@@ -56,8 +56,8 @@ module Canql
|
|
|
56
56
|
'delivery postcode' / 'booking postcode' / 'birth weight' /
|
|
57
57
|
'place of delivery' / 'sex' / 'outcome' / 'edd' /
|
|
58
58
|
'expected delivery date' / 'booking hospital' / 'screening status' /
|
|
59
|
-
'number of fetuses at delivery' / '
|
|
60
|
-
'booking date'
|
|
59
|
+
'number of fetuses at delivery' / 'number of fetuses in early pregnancy' /
|
|
60
|
+
'malformed in set' / 'gestation at delivery' / 'booking date'
|
|
61
61
|
)
|
|
62
62
|
end
|
|
63
63
|
|
|
@@ -84,7 +84,7 @@ module Canql
|
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
rule mother_with_conditions
|
|
87
|
-
|
|
87
|
+
patient_field_existence / action_or_ebr
|
|
88
88
|
end
|
|
89
89
|
end
|
|
90
90
|
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module Canql
|
|
2
2
|
grammar TestResult
|
|
3
3
|
rule test_results
|
|
4
|
-
and_keyword?
|
|
4
|
+
and_keyword? existence_modifier:test_result_no_keyword? natal_period:test_result_natal_period? test_results_keyword <Nodes::TestResult::WithCondition>
|
|
5
5
|
end
|
|
6
6
|
|
|
7
7
|
rule test_result_no_keyword
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
module Canql
|
|
2
2
|
grammar TestResultGroup
|
|
3
3
|
rule test_result_groups
|
|
4
|
-
and_keyword?
|
|
4
|
+
and_keyword? existence_modifier:test_result_group_existence_keyword group:test_result_group_names <Nodes::TestResultGroup::WithCondition>
|
|
5
5
|
end
|
|
6
6
|
|
|
7
|
-
rule
|
|
7
|
+
rule test_result_group_existence_keyword
|
|
8
8
|
# If in furture the reverse is needed use 'supplied require'
|
|
9
9
|
space ('missing required' / 'missing' / 'supplied required' / 'supplied') word_break
|
|
10
10
|
end
|
|
@@ -13,11 +13,11 @@ module Canql
|
|
|
13
13
|
space ('screening' / 'anomaly scan' / 'fetal medicine' / 'dating') word_break
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
-
rule
|
|
17
|
-
and_keyword?
|
|
16
|
+
rule test_acceptance_existence
|
|
17
|
+
and_keyword? existence_modifier:test_acceptance_existence_keyword acceptance:test_acceptance_names <Nodes::TestAcceptanceExistence::WithCondition>
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
rule
|
|
20
|
+
rule test_acceptance_existence_keyword
|
|
21
21
|
space ('missing required' / 'missing' ) word_break
|
|
22
22
|
end
|
|
23
23
|
|
data/lib/canql/grammars.rb
CHANGED
|
@@ -14,5 +14,5 @@ Treetop.load File.expand_path('grammars/patient', File.dirname(__FILE__))
|
|
|
14
14
|
Treetop.load File.expand_path('grammars/registry', File.dirname(__FILE__))
|
|
15
15
|
Treetop.load File.expand_path('grammars/provider', File.dirname(__FILE__))
|
|
16
16
|
Treetop.load File.expand_path('grammars/perinatal_hospital', File.dirname(__FILE__))
|
|
17
|
-
Treetop.load File.expand_path('grammars/
|
|
17
|
+
Treetop.load File.expand_path('grammars/events', File.dirname(__FILE__))
|
|
18
18
|
Treetop.load File.expand_path('grammars/main', File.dirname(__FILE__))
|
data/lib/canql/nodes/age.rb
CHANGED
data/lib/canql/nodes/anomaly.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
module Canql
|
|
3
|
+
module Canql # :nodoc: all
|
|
4
4
|
module Nodes
|
|
5
5
|
module Anomaly
|
|
6
6
|
module WithCondition
|
|
@@ -17,7 +17,7 @@ module Canql #:nodoc: all
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def to_anomaly
|
|
20
|
-
anomaly_hash = { 'exists' =>
|
|
20
|
+
anomaly_hash = { 'exists' => existence_filter }
|
|
21
21
|
anomaly_hash['type'] = anomaly_type_filter if anomaly_type.present?
|
|
22
22
|
anomaly_hash['status'] = anomaly_status_type_filter if anomaly_status_type.present?
|
|
23
23
|
if anomaly_screening_status_type.present?
|
|
@@ -30,16 +30,14 @@ module Canql #:nodoc: all
|
|
|
30
30
|
|
|
31
31
|
def code_filters(anomaly_hash)
|
|
32
32
|
anomaly_hash['icd_codes'] = code_filter[:icd_code] if code_filter[:icd_code].present?
|
|
33
|
-
if code_filter[:code_group].present?
|
|
34
|
-
anomaly_hash['code_groups'] = code_filter[:code_group]
|
|
35
|
-
end
|
|
33
|
+
anomaly_hash['code_groups'] = code_filter[:code_group] if code_filter[:code_group].present?
|
|
36
34
|
return if code_filter[:fasp_rating].blank?
|
|
37
35
|
|
|
38
36
|
anomaly_hash['fasp_rating'] = code_filter[:fasp_rating]
|
|
39
37
|
end
|
|
40
38
|
|
|
41
|
-
def
|
|
42
|
-
{ Canql::EQUALS =>
|
|
39
|
+
def existence_filter
|
|
40
|
+
{ Canql::EQUALS => existence_modifier.text_value.strip != 'no' }
|
|
43
41
|
end
|
|
44
42
|
|
|
45
43
|
def anomaly_type_filter
|
|
@@ -73,28 +71,20 @@ module Canql #:nodoc: all
|
|
|
73
71
|
clean_code_array(code_array)
|
|
74
72
|
|
|
75
73
|
code_filters = {}
|
|
76
|
-
if code_array[:icd_code].any?
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
if code_array[:code_group].any?
|
|
81
|
-
code_filters[:code_group] = { Canql::EQUALS => code_array[:code_group] }
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
if code_array[:fasp_rating].any?
|
|
85
|
-
code_filters[:fasp_rating] = { Canql::EQUALS => code_array[:fasp_rating] }
|
|
86
|
-
end
|
|
74
|
+
code_filters[:icd_code] = { Canql::BEGINS => code_array[:icd_code] } if code_array[:icd_code].any?
|
|
75
|
+
code_filters[:code_group] = { Canql::EQUALS => code_array[:code_group] } if code_array[:code_group].any?
|
|
76
|
+
code_filters[:fasp_rating] = { Canql::EQUALS => code_array[:fasp_rating] } if code_array[:fasp_rating].any?
|
|
87
77
|
|
|
88
78
|
code_filters
|
|
89
79
|
end
|
|
90
80
|
|
|
91
81
|
def clean_code_array(code_array)
|
|
92
82
|
code_array[:icd_code].flatten!
|
|
93
|
-
code_array[:icd_code].
|
|
83
|
+
code_array[:icd_code].compact_blank!
|
|
94
84
|
code_array[:code_group].flatten!
|
|
95
|
-
code_array[:code_group].
|
|
85
|
+
code_array[:code_group].compact_blank!
|
|
96
86
|
code_array[:fasp_rating].flatten!
|
|
97
|
-
code_array[:fasp_rating].
|
|
87
|
+
code_array[:fasp_rating].compact_blank!
|
|
98
88
|
end
|
|
99
89
|
|
|
100
90
|
def code_filter
|
data/lib/canql/nodes/dates.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
require 'chronic'
|
|
4
4
|
require 'ndr_support/daterange'
|
|
5
5
|
|
|
6
|
-
module Canql
|
|
6
|
+
module Canql # :nodoc: all
|
|
7
7
|
module Nodes
|
|
8
8
|
module FuzzyDateNode
|
|
9
9
|
delegate :to_daterange, to: :date
|
|
@@ -25,12 +25,12 @@ module Canql #:nodoc: all
|
|
|
25
25
|
module YearQuarterNode
|
|
26
26
|
def to_daterange
|
|
27
27
|
quarter = text_value[0..1]
|
|
28
|
-
year = text_value[3
|
|
28
|
+
year = text_value[3..]
|
|
29
29
|
quarters = {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
q1: "01-04-#{year}",
|
|
31
|
+
q2: "01-07-#{year}",
|
|
32
|
+
q3: "01-10-#{year}",
|
|
33
|
+
q4: "01-01-#{year.to_i + 1}"
|
|
34
34
|
}
|
|
35
35
|
Daterange.new(quarters[quarter.to_sym].to_date,
|
|
36
36
|
quarters[quarter.to_sym].to_date + 3.months - 1.day)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Canql # :nodoc: all
|
|
4
|
+
module Nodes
|
|
5
|
+
module Events
|
|
6
|
+
module WithCondition
|
|
7
|
+
def to_events
|
|
8
|
+
event_type = text_values_for_marker(:event_type).first.strip
|
|
9
|
+
event_relevance = text_values_for_marker(:event_relevance).first.to_s.strip
|
|
10
|
+
hash = existence_filter
|
|
11
|
+
hash['type'] = event_type_name[event_type]
|
|
12
|
+
hash['relevant'] = event_relevance_flag(event_relevance) || false
|
|
13
|
+
|
|
14
|
+
hash
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def event_type_name
|
|
18
|
+
{
|
|
19
|
+
'birth' => 'birth',
|
|
20
|
+
'death' => 'death',
|
|
21
|
+
'hes' => 'hes',
|
|
22
|
+
'preg loss hes' => 'pregnancy_loss_hes',
|
|
23
|
+
'pregnancy loss hes' => 'pregnancy_loss_hes',
|
|
24
|
+
'preg loss bpas' => 'pregnancy_loss_bpas',
|
|
25
|
+
'pregnancy loss bpas' => 'pregnancy_loss_bpas',
|
|
26
|
+
'msds' => 'msds'
|
|
27
|
+
}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def event_relevance_flag(relevance)
|
|
31
|
+
%w[linked relevant related].include?(relevance)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def existence_filter
|
|
35
|
+
{ Canql::EQUALS => existence_modifier.text_value.strip != 'no' }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
module Canql
|
|
3
|
+
module Canql # :nodoc: all
|
|
4
4
|
module Nodes
|
|
5
5
|
module GeneticTest
|
|
6
6
|
module WithCondition
|
|
7
7
|
def to_genetic_test
|
|
8
|
-
|
|
9
|
-
genetic_test_hash
|
|
8
|
+
{ 'exists' => existence_filter }
|
|
10
9
|
end
|
|
11
10
|
|
|
12
|
-
def
|
|
13
|
-
{ Canql::EQUALS =>
|
|
11
|
+
def existence_filter
|
|
12
|
+
{ Canql::EQUALS => existence_modifier.text_value.strip != 'no' }
|
|
14
13
|
end
|
|
15
14
|
end
|
|
16
15
|
end
|
data/lib/canql/nodes/main.rb
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# require 'active_support/core_ext/object/blank'
|
|
4
4
|
|
|
5
|
-
module Canql
|
|
5
|
+
module Canql # :nodoc: all
|
|
6
6
|
module Nodes
|
|
7
7
|
module RecordCountNode
|
|
8
8
|
def meta_data_item
|
|
@@ -12,7 +12,7 @@ module Canql #:nodoc: all
|
|
|
12
12
|
end
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
module Canql
|
|
15
|
+
module Canql # :nodoc: all
|
|
16
16
|
module Nodes
|
|
17
17
|
# Returns a filter detailing the require result type (cases or patients)
|
|
18
18
|
module SubjectNode
|
|
@@ -32,7 +32,7 @@ module Canql #:nodoc: all
|
|
|
32
32
|
sub_clauses = build_sub_clauses
|
|
33
33
|
|
|
34
34
|
%i[
|
|
35
|
-
anomalies genetic_tests test_results test_result_groups test_acceptances
|
|
35
|
+
anomalies genetic_tests test_results test_result_groups test_acceptances events
|
|
36
36
|
].each do |condition_key|
|
|
37
37
|
if sub_clauses[condition_key].present?
|
|
38
38
|
conditions[condition_key.to_s] = { Canql::ALL => sub_clauses[condition_key] }
|
|
@@ -52,7 +52,7 @@ module Canql #:nodoc: all
|
|
|
52
52
|
sub_clauses, element, :test_result_groups, :to_test_result_group
|
|
53
53
|
)
|
|
54
54
|
add_sub_clause(sub_clauses, element, :test_acceptances, :to_test_acceptance)
|
|
55
|
-
add_sub_clause(sub_clauses, element, :
|
|
55
|
+
add_sub_clause(sub_clauses, element, :events, :to_events)
|
|
56
56
|
end
|
|
57
57
|
sub_clauses
|
|
58
58
|
end
|
data/lib/canql/nodes/patient.rb
CHANGED
|
@@ -55,6 +55,7 @@ module Canql # :nodoc: all
|
|
|
55
55
|
'booking hospital': { patient: 'booking_hospital' },
|
|
56
56
|
'screening status': { patient: 'screeningstatus' },
|
|
57
57
|
'number of fetuses at delivery': { patient: 'numoffetusesatdelivery' },
|
|
58
|
+
'number of fetuses in early pregnancy': { patient: 'numberoffetuses' },
|
|
58
59
|
'malformed in set': { patient: 'malformedinset' },
|
|
59
60
|
'gestation at delivery': { patient: 'gestationallength' },
|
|
60
61
|
'booking date': { patient: 'firstbookingdate' }
|
|
@@ -65,9 +66,9 @@ module Canql # :nodoc: all
|
|
|
65
66
|
field_names = actual_field_names(
|
|
66
67
|
patient_field_list.text_values_for_marker(:patient_field_name), subject.to_sym
|
|
67
68
|
)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
{ "#{subject}.#{
|
|
69
|
+
modifier = field_existence_modifier.text_value.strip
|
|
70
|
+
existence = modifier == 'missing' ? 'fields_missing' : 'fields_populated'
|
|
71
|
+
{ "#{subject}.#{existence}" => { Canql::EQUALS => field_names } }
|
|
71
72
|
end
|
|
72
73
|
|
|
73
74
|
def actual_field_names(fields, subject)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Canql # :nodoc: all
|
|
4
|
+
module Nodes
|
|
5
|
+
module PatientEvents
|
|
6
|
+
module WithCondition
|
|
7
|
+
def to_events
|
|
8
|
+
event_name = event_type_name
|
|
9
|
+
{ "#{event_name}_event" => existence_filter }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def maternal_relevant_event_types
|
|
13
|
+
%w[pregnancy_loss_hes pregnancy_loss_bpas msds]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def event_type_name
|
|
17
|
+
map = {
|
|
18
|
+
'birth' => 'birth',
|
|
19
|
+
'death' => 'death',
|
|
20
|
+
'hes' => 'hes',
|
|
21
|
+
'preg loss hes' => 'pregnancy_loss_hes',
|
|
22
|
+
'pregnancy loss hes' => 'pregnancy_loss_hes',
|
|
23
|
+
'preg loss bpas' => 'pregnancy_loss_bpas',
|
|
24
|
+
'pregnancy loss bpas' => 'pregnancy_loss_bpas',
|
|
25
|
+
'msds' => 'msds'
|
|
26
|
+
}
|
|
27
|
+
map[event_type.text_value.strip]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def existence_filter
|
|
31
|
+
{ Canql::EQUALS => existence_modifier.text_value.strip != 'no' }
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
data/lib/canql/nodes/registry.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
module Canql
|
|
3
|
+
module Canql # :nodoc: all
|
|
4
4
|
module Nodes
|
|
5
5
|
module TestResult
|
|
6
6
|
module WithCondition
|
|
@@ -9,13 +9,13 @@ module Canql #:nodoc: all
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
def to_test_result
|
|
12
|
-
test_result_hash = { 'exists' =>
|
|
12
|
+
test_result_hash = { 'exists' => existence_filter }
|
|
13
13
|
test_result_hash['type'] = test_result_type_filter if test_result_type.present?
|
|
14
14
|
test_result_hash
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
def
|
|
18
|
-
{ Canql::EQUALS =>
|
|
17
|
+
def existence_filter
|
|
18
|
+
{ Canql::EQUALS => existence_modifier.text_value.strip != 'no' }
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def test_result_type_filter
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
module Canql
|
|
3
|
+
module Canql # :nodoc: all
|
|
4
4
|
module Nodes
|
|
5
5
|
module TestResultGroup
|
|
6
6
|
module WithCondition
|
|
@@ -9,16 +9,16 @@ module Canql #:nodoc: all
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
def to_test_result_group
|
|
12
|
-
test_result_group_hash = { 'exists' =>
|
|
12
|
+
test_result_group_hash = { 'exists' => existence_filter }
|
|
13
13
|
test_result_group_hash['required'] = requirement_filter
|
|
14
14
|
test_result_group_hash['group'] = test_result_group_filter if test_result_group.present?
|
|
15
15
|
test_result_group_hash
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
def
|
|
18
|
+
def existence_filter
|
|
19
19
|
{
|
|
20
20
|
Canql::EQUALS => ['supplied required', 'supplied'].include?(
|
|
21
|
-
|
|
21
|
+
existence_modifier.text_value.strip
|
|
22
22
|
)
|
|
23
23
|
}
|
|
24
24
|
end
|
|
@@ -26,7 +26,7 @@ module Canql #:nodoc: all
|
|
|
26
26
|
def requirement_filter
|
|
27
27
|
{
|
|
28
28
|
Canql::EQUALS => ['supplied required', 'missing required'].include?(
|
|
29
|
-
|
|
29
|
+
existence_modifier.text_value.strip
|
|
30
30
|
)
|
|
31
31
|
}
|
|
32
32
|
end
|
|
@@ -37,23 +37,23 @@ module Canql #:nodoc: all
|
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
module
|
|
40
|
+
module TestAcceptanceExistence
|
|
41
41
|
module WithCondition
|
|
42
42
|
def test_acceptance
|
|
43
43
|
acceptance.text_value.strip.parameterize.underscore
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
def to_test_acceptance
|
|
47
|
-
test_acceptance_hash = { 'exists' =>
|
|
47
|
+
test_acceptance_hash = { 'exists' => existence_filter }
|
|
48
48
|
test_acceptance_hash['required'] = requirement_filter
|
|
49
49
|
test_acceptance_hash['acceptance'] = test_acceptance_filter if test_acceptance.present?
|
|
50
50
|
test_acceptance_hash
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
-
def
|
|
53
|
+
def existence_filter
|
|
54
54
|
{
|
|
55
55
|
Canql::EQUALS => ['supplied required', 'supplied'].include?(
|
|
56
|
-
|
|
56
|
+
existence_modifier.text_value.strip
|
|
57
57
|
)
|
|
58
58
|
}
|
|
59
59
|
end
|
|
@@ -61,7 +61,7 @@ module Canql #:nodoc: all
|
|
|
61
61
|
def requirement_filter
|
|
62
62
|
{
|
|
63
63
|
Canql::EQUALS => ['supplied required', 'missing required'].include?(
|
|
64
|
-
|
|
64
|
+
existence_modifier.text_value.strip
|
|
65
65
|
)
|
|
66
66
|
}
|
|
67
67
|
end
|
data/lib/canql/nodes.rb
CHANGED
|
@@ -26,7 +26,8 @@ module Treetop
|
|
|
26
26
|
|
|
27
27
|
def reverse_scan_for_marker(marker)
|
|
28
28
|
marker_value = reverse_marker_scanner(self, marker)
|
|
29
|
-
return if marker_value.
|
|
29
|
+
return if marker_value.blank?
|
|
30
|
+
|
|
30
31
|
marker_value
|
|
31
32
|
end
|
|
32
33
|
|
|
@@ -34,6 +35,7 @@ module Treetop
|
|
|
34
35
|
|
|
35
36
|
def text_values_for_marker_scanner(root, marker, list)
|
|
36
37
|
return if root.elements.nil?
|
|
38
|
+
|
|
37
39
|
root.elements.each do |e|
|
|
38
40
|
list << e.send(marker).text_value if e.respond_to?(marker)
|
|
39
41
|
text_values_for_marker_scanner(e, marker, list)
|
|
@@ -43,10 +45,9 @@ module Treetop
|
|
|
43
45
|
|
|
44
46
|
def reverse_marker_scanner(root, marker)
|
|
45
47
|
return if root.nil? || root.elements.nil?
|
|
48
|
+
|
|
46
49
|
marker_value = root.send(marker).text_value if root.respond_to?(marker)
|
|
47
|
-
|
|
48
|
-
marker_value = reverse_marker_scanner(root.parent, marker)
|
|
49
|
-
end
|
|
50
|
+
marker_value = reverse_marker_scanner(root.parent, marker) if marker_value.blank?
|
|
50
51
|
marker_value
|
|
51
52
|
end
|
|
52
53
|
end
|
data/lib/canql/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: canql
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 6.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- NHSD NDRS Development Team
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2024-10-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: chronic
|
|
@@ -78,138 +78,6 @@ dependencies:
|
|
|
78
78
|
- - ">="
|
|
79
79
|
- !ruby/object:Gem::Version
|
|
80
80
|
version: 1.4.10
|
|
81
|
-
- !ruby/object:Gem::Dependency
|
|
82
|
-
name: bundler
|
|
83
|
-
requirement: !ruby/object:Gem::Requirement
|
|
84
|
-
requirements:
|
|
85
|
-
- - ">="
|
|
86
|
-
- !ruby/object:Gem::Version
|
|
87
|
-
version: '0'
|
|
88
|
-
type: :development
|
|
89
|
-
prerelease: false
|
|
90
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
91
|
-
requirements:
|
|
92
|
-
- - ">="
|
|
93
|
-
- !ruby/object:Gem::Version
|
|
94
|
-
version: '0'
|
|
95
|
-
- !ruby/object:Gem::Dependency
|
|
96
|
-
name: guard
|
|
97
|
-
requirement: !ruby/object:Gem::Requirement
|
|
98
|
-
requirements:
|
|
99
|
-
- - ">="
|
|
100
|
-
- !ruby/object:Gem::Version
|
|
101
|
-
version: '0'
|
|
102
|
-
type: :development
|
|
103
|
-
prerelease: false
|
|
104
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
105
|
-
requirements:
|
|
106
|
-
- - ">="
|
|
107
|
-
- !ruby/object:Gem::Version
|
|
108
|
-
version: '0'
|
|
109
|
-
- !ruby/object:Gem::Dependency
|
|
110
|
-
name: guard-minitest
|
|
111
|
-
requirement: !ruby/object:Gem::Requirement
|
|
112
|
-
requirements:
|
|
113
|
-
- - ">="
|
|
114
|
-
- !ruby/object:Gem::Version
|
|
115
|
-
version: '0'
|
|
116
|
-
type: :development
|
|
117
|
-
prerelease: false
|
|
118
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
119
|
-
requirements:
|
|
120
|
-
- - ">="
|
|
121
|
-
- !ruby/object:Gem::Version
|
|
122
|
-
version: '0'
|
|
123
|
-
- !ruby/object:Gem::Dependency
|
|
124
|
-
name: guard-rubocop
|
|
125
|
-
requirement: !ruby/object:Gem::Requirement
|
|
126
|
-
requirements:
|
|
127
|
-
- - ">="
|
|
128
|
-
- !ruby/object:Gem::Version
|
|
129
|
-
version: '0'
|
|
130
|
-
type: :development
|
|
131
|
-
prerelease: false
|
|
132
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
133
|
-
requirements:
|
|
134
|
-
- - ">="
|
|
135
|
-
- !ruby/object:Gem::Version
|
|
136
|
-
version: '0'
|
|
137
|
-
- !ruby/object:Gem::Dependency
|
|
138
|
-
name: minitest
|
|
139
|
-
requirement: !ruby/object:Gem::Requirement
|
|
140
|
-
requirements:
|
|
141
|
-
- - ">="
|
|
142
|
-
- !ruby/object:Gem::Version
|
|
143
|
-
version: 5.0.0
|
|
144
|
-
type: :development
|
|
145
|
-
prerelease: false
|
|
146
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
147
|
-
requirements:
|
|
148
|
-
- - ">="
|
|
149
|
-
- !ruby/object:Gem::Version
|
|
150
|
-
version: 5.0.0
|
|
151
|
-
- !ruby/object:Gem::Dependency
|
|
152
|
-
name: ndr_dev_support
|
|
153
|
-
requirement: !ruby/object:Gem::Requirement
|
|
154
|
-
requirements:
|
|
155
|
-
- - ">="
|
|
156
|
-
- !ruby/object:Gem::Version
|
|
157
|
-
version: '6.0'
|
|
158
|
-
- - "<"
|
|
159
|
-
- !ruby/object:Gem::Version
|
|
160
|
-
version: '8.0'
|
|
161
|
-
type: :development
|
|
162
|
-
prerelease: false
|
|
163
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
164
|
-
requirements:
|
|
165
|
-
- - ">="
|
|
166
|
-
- !ruby/object:Gem::Version
|
|
167
|
-
version: '6.0'
|
|
168
|
-
- - "<"
|
|
169
|
-
- !ruby/object:Gem::Version
|
|
170
|
-
version: '8.0'
|
|
171
|
-
- !ruby/object:Gem::Dependency
|
|
172
|
-
name: pry
|
|
173
|
-
requirement: !ruby/object:Gem::Requirement
|
|
174
|
-
requirements:
|
|
175
|
-
- - ">="
|
|
176
|
-
- !ruby/object:Gem::Version
|
|
177
|
-
version: '0'
|
|
178
|
-
type: :development
|
|
179
|
-
prerelease: false
|
|
180
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
181
|
-
requirements:
|
|
182
|
-
- - ">="
|
|
183
|
-
- !ruby/object:Gem::Version
|
|
184
|
-
version: '0'
|
|
185
|
-
- !ruby/object:Gem::Dependency
|
|
186
|
-
name: rake
|
|
187
|
-
requirement: !ruby/object:Gem::Requirement
|
|
188
|
-
requirements:
|
|
189
|
-
- - ">="
|
|
190
|
-
- !ruby/object:Gem::Version
|
|
191
|
-
version: '0'
|
|
192
|
-
type: :development
|
|
193
|
-
prerelease: false
|
|
194
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
195
|
-
requirements:
|
|
196
|
-
- - ">="
|
|
197
|
-
- !ruby/object:Gem::Version
|
|
198
|
-
version: '0'
|
|
199
|
-
- !ruby/object:Gem::Dependency
|
|
200
|
-
name: terminal-notifier-guard
|
|
201
|
-
requirement: !ruby/object:Gem::Requirement
|
|
202
|
-
requirements:
|
|
203
|
-
- - ">="
|
|
204
|
-
- !ruby/object:Gem::Version
|
|
205
|
-
version: '0'
|
|
206
|
-
type: :development
|
|
207
|
-
prerelease: false
|
|
208
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
209
|
-
requirements:
|
|
210
|
-
- - ">="
|
|
211
|
-
- !ruby/object:Gem::Version
|
|
212
|
-
version: '0'
|
|
213
81
|
description: Domain Specific Language for querying NHS NCARDRS datastores
|
|
214
82
|
email: []
|
|
215
83
|
executables: []
|
|
@@ -229,8 +97,8 @@ files:
|
|
|
229
97
|
- lib/canql/grammars/batch_types.treetop
|
|
230
98
|
- lib/canql/grammars/dates.treetop
|
|
231
99
|
- lib/canql/grammars/e_base_records.treetop
|
|
100
|
+
- lib/canql/grammars/events.treetop
|
|
232
101
|
- lib/canql/grammars/genetic_test.treetop
|
|
233
|
-
- lib/canql/grammars/hes_event.treetop
|
|
234
102
|
- lib/canql/grammars/main.treetop
|
|
235
103
|
- lib/canql/grammars/patient.treetop
|
|
236
104
|
- lib/canql/grammars/perinatal_hospital.treetop
|
|
@@ -244,10 +112,11 @@ files:
|
|
|
244
112
|
- lib/canql/nodes/batch_types.rb
|
|
245
113
|
- lib/canql/nodes/dates.rb
|
|
246
114
|
- lib/canql/nodes/e_base_records.rb
|
|
115
|
+
- lib/canql/nodes/events.rb
|
|
247
116
|
- lib/canql/nodes/genetic_test.rb
|
|
248
|
-
- lib/canql/nodes/hes_event.rb
|
|
249
117
|
- lib/canql/nodes/main.rb
|
|
250
118
|
- lib/canql/nodes/patient.rb
|
|
119
|
+
- lib/canql/nodes/patient_events.rb
|
|
251
120
|
- lib/canql/nodes/perinatal_hospital.rb
|
|
252
121
|
- lib/canql/nodes/registry.rb
|
|
253
122
|
- lib/canql/nodes/test_result.rb
|
|
@@ -274,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
274
143
|
- !ruby/object:Gem::Version
|
|
275
144
|
version: '0'
|
|
276
145
|
requirements: []
|
|
277
|
-
rubygems_version: 3.
|
|
146
|
+
rubygems_version: 3.4.10
|
|
278
147
|
signing_key:
|
|
279
148
|
specification_version: 4
|
|
280
149
|
summary: Congenital Anomaly Natural Query Language
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
module Canql
|
|
2
|
-
grammar HesEvent
|
|
3
|
-
rule hes_events
|
|
4
|
-
and_keyword? existance_modifier:hes_no_keyword? hes_keyword <Nodes::HesEvent::WithCondition>
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
rule hes_no_keyword
|
|
8
|
-
space ('no' / 'some') word_break
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
rule hes_keyword
|
|
12
|
-
space ('hes events' / 'hes records') word_break
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Canql #:nodoc: all
|
|
4
|
-
module Nodes
|
|
5
|
-
module HesEvent
|
|
6
|
-
module WithCondition
|
|
7
|
-
def to_hes
|
|
8
|
-
{ 'exists' => existance_filter }
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def existance_filter
|
|
12
|
-
{ Canql::EQUALS => existance_modifier.text_value.strip != 'no' }
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|