canql 4.3.0 → 5.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/CODEOWNERS +2 -0
- data/.github/workflows/lint.yml +23 -0
- data/.github/workflows/test.yml +65 -0
- data/.rubocop.yml +1 -11
- data/CHANGELOG.md +27 -1
- data/README.md +2 -2
- data/canql.gemspec +2 -2
- data/code_safety.yml +54 -34
- data/lib/canql/grammars.rb +1 -0
- data/lib/canql/grammars/anomaly.treetop +5 -1
- data/lib/canql/grammars/main.treetop +4 -1
- data/lib/canql/grammars/patient.treetop +2 -1
- data/lib/canql/grammars/registry.treetop +41 -13
- data/lib/canql/grammars/test_result_group.treetop +28 -0
- data/lib/canql/nodes.rb +1 -0
- data/lib/canql/nodes/anomaly.rb +47 -12
- data/lib/canql/nodes/main.rb +28 -10
- data/lib/canql/nodes/patient.rb +3 -1
- data/lib/canql/nodes/test_result_group.rb +75 -0
- data/lib/canql/version.rb +1 -1
- metadata +11 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c11d88eb61eaebcc1fee8bbcf02c3528a26799b7a62800971c34517619b98668
|
4
|
+
data.tar.gz: ac2d55b1fcf88636a1ccfdf3a2f11b4d4ef7e878ba886fceddd2dcdce26a6fb6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 767d7da5878ba53e624db9090a0bce25ee2b17c039b5ecce4bbb65126f0d32bc988851f7b31e41be235f9911919051a07a7e5478b54d11bc0aefdf7c6a939389
|
7
|
+
data.tar.gz: bd874eb46ba2641c84ba40d2a521db212b218879cf6e789777514d36bea0672fd9b38e24804ca4a86b54b722c62b5a7a89003d3040cd8179991b134ebb7543ab
|
data/.github/CODEOWNERS
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
name: Lint
|
2
|
+
|
3
|
+
on: [pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
rubocop:
|
7
|
+
name: RuboCop
|
8
|
+
|
9
|
+
runs-on: ubuntu-latest
|
10
|
+
|
11
|
+
steps:
|
12
|
+
- uses: actions/checkout@v2
|
13
|
+
with:
|
14
|
+
fetch-depth: 0 # fetch everything
|
15
|
+
- name: Set up Ruby
|
16
|
+
uses: ruby/setup-ruby@v1
|
17
|
+
with:
|
18
|
+
ruby-version: 3.0
|
19
|
+
- name: Install dependencies
|
20
|
+
run: bundle install
|
21
|
+
- name: Run RuboCop against BASE..HEAD changes
|
22
|
+
run: bundle exec rake rubocop:diff origin/${GITHUB_BASE_REF#*/}
|
23
|
+
|
@@ -0,0 +1,65 @@
|
|
1
|
+
name: Test
|
2
|
+
|
3
|
+
on: [push, pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
test:
|
7
|
+
strategy:
|
8
|
+
matrix:
|
9
|
+
ruby-version:
|
10
|
+
- 2.6
|
11
|
+
- 2.7
|
12
|
+
- 3.0
|
13
|
+
|
14
|
+
name: Ruby ${{ matrix.ruby-version }}
|
15
|
+
|
16
|
+
runs-on: ubuntu-latest
|
17
|
+
|
18
|
+
steps:
|
19
|
+
- uses: actions/checkout@v2
|
20
|
+
- name: Set up Ruby
|
21
|
+
uses: ruby/setup-ruby@v1
|
22
|
+
with:
|
23
|
+
ruby-version: ${{ matrix.ruby-version }}
|
24
|
+
- name: Install dependencies
|
25
|
+
run: bundle install
|
26
|
+
- name: Run tests
|
27
|
+
run: bundle exec rake
|
28
|
+
|
29
|
+
# A utility job upon which Branch Protection can depend,
|
30
|
+
# thus remaining agnostic of the matrix.
|
31
|
+
test_matrix:
|
32
|
+
if: ${{ always() }}
|
33
|
+
runs-on: ubuntu-latest
|
34
|
+
name: Matrix
|
35
|
+
needs: test
|
36
|
+
steps:
|
37
|
+
- name: Check build matrix status
|
38
|
+
if: ${{ needs.test.result != 'success' }}
|
39
|
+
run: exit 1
|
40
|
+
|
41
|
+
notify:
|
42
|
+
# Run only on master, but regardless of whether tests past:
|
43
|
+
if: ${{ always() && github.ref == 'refs/heads/master' }}
|
44
|
+
|
45
|
+
needs: test_matrix
|
46
|
+
|
47
|
+
runs-on: ubuntu-latest
|
48
|
+
|
49
|
+
steps:
|
50
|
+
- uses: 8398a7/action-slack@v3
|
51
|
+
with:
|
52
|
+
status: custom
|
53
|
+
fields: workflow,commit,author
|
54
|
+
custom_payload: |
|
55
|
+
{
|
56
|
+
channel: 'C7FQWGDHP',
|
57
|
+
username: 'CI – ' + '${{ github.repository }}'.split('/')[1],
|
58
|
+
icon_emoji: ':hammer_and_wrench:',
|
59
|
+
attachments: [{
|
60
|
+
color: '${{ needs.test_matrix.result }}' === 'success' ? 'good' : '${{ needs.test_matrix.result }}' === 'failure' ? 'danger' : 'warning',
|
61
|
+
text: `${process.env.AS_WORKFLOW} against \`${{ github.ref }}\` (${process.env.AS_COMMIT}) for ${{ github.actor }} resulted in *${{ needs.test_matrix.result }}*.`
|
62
|
+
}]
|
63
|
+
}
|
64
|
+
env:
|
65
|
+
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
|
data/.rubocop.yml
CHANGED
@@ -1,11 +1 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Rails:
|
4
|
-
Enabled: false
|
5
|
-
|
6
|
-
AllCops:
|
7
|
-
TargetRailsVersion: 4.2
|
8
|
-
TargetRubyVersion: 2.3
|
9
|
-
|
10
|
-
Style/FrozenStringLiteralComment:
|
11
|
-
Enabled: true
|
1
|
+
require: ndr_dev_support
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,31 @@
|
|
1
1
|
## [Unreleased]
|
2
|
-
*no
|
2
|
+
* no relevent changes
|
3
|
+
|
4
|
+
## 5.2.0 / 2021-03-04
|
5
|
+
|
6
|
+
* Added new FASP anomaly RAG rating filters (#63)
|
7
|
+
|
8
|
+
## 5.1.0 / 2021-01-25
|
9
|
+
|
10
|
+
### Added
|
11
|
+
* Added new filters for test acceptance requirments (#59)
|
12
|
+
|
13
|
+
## 5.0.0 / 2021-01-19
|
14
|
+
|
15
|
+
### Changed
|
16
|
+
* Changed the values of registry to use registry name rather than codes and added new supra-region options (#54)
|
17
|
+
|
18
|
+
### Added
|
19
|
+
* Added fetal medicine and dating options to the test group filter (#50)
|
20
|
+
* Added new gestation at delivery and booking date to case field existance filter (#52)
|
21
|
+
|
22
|
+
## 4.4.1 / 2021-01-13
|
23
|
+
### Fixed
|
24
|
+
* Relax constraints to support Rails 6.x
|
25
|
+
|
26
|
+
## 4.4.0 / 2020-07-08
|
27
|
+
### Added
|
28
|
+
* Added filter for missing and supplied required test result groups (#47)
|
3
29
|
|
4
30
|
## 4.3.0 / 2020-06-10
|
5
31
|
### Added
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
# CANQL [![Build Status](https://
|
1
|
+
# CANQL [![Build Status](https://github.com/publichealthengland/canql/workflows/Test/badge.svg)](https://github.com/publichealthengland/canql/actions?query=workflow%3Atest) [![Gem Version](https://badge.fury.io/rb/canql.svg)](https://rubygems.org/gems/canql)
|
2
2
|
|
3
|
-
Congenital Anomaly Natural Query Language (CANQL) is a [Treetop](http://treetop.rubyforge.org/)
|
3
|
+
Congenital Anomaly Natural Query Language (CANQL) is a [Treetop](http://treetop.rubyforge.org/)-driven Domain Specific Language (DSL) used by the Public Health England (PHE) National Congenital Anomaly and Rare Disease Registration Service (NCARDRS) to identify cohorts of cases.
|
4
4
|
|
5
5
|
Used for analysis, research and day-to-day operations to empower non-technical users to write sophisticated human readable queries without the need to know or understand the underlying datastore and/or schema.
|
6
6
|
|
data/canql.gemspec
CHANGED
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
|
29
29
|
spec.add_dependency 'chronic', '~> 0.3'
|
30
30
|
spec.add_dependency 'ndr_support', '>= 3.0', '< 6'
|
31
|
-
spec.add_dependency 'rails', '>= 4.1', '<
|
31
|
+
spec.add_dependency 'rails', '>= 4.1', '< 7'
|
32
32
|
spec.add_dependency 'treetop', '>= 1.4.10'
|
33
33
|
|
34
34
|
spec.add_development_dependency 'bundler'
|
@@ -36,7 +36,7 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.add_development_dependency 'guard-minitest'
|
37
37
|
spec.add_development_dependency 'guard-rubocop'
|
38
38
|
spec.add_development_dependency 'minitest'
|
39
|
-
spec.add_development_dependency 'ndr_dev_support', '~> 5.
|
39
|
+
spec.add_development_dependency 'ndr_dev_support', '~> 5.9'
|
40
40
|
spec.add_development_dependency 'pry'
|
41
41
|
spec.add_development_dependency 'rake'
|
42
42
|
spec.add_development_dependency 'terminal-notifier-guard' if RUBY_PLATFORM =~ /darwin/
|
data/code_safety.yml
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
---
|
2
2
|
file safety:
|
3
|
+
".github/CODEOWNERS":
|
4
|
+
comments:
|
5
|
+
reviewed_by: josh.pencheon
|
6
|
+
safe_revision: a964c47962d47724afd66ba59660589fc3c8b02c
|
7
|
+
".github/workflows/lint.yml":
|
8
|
+
comments:
|
9
|
+
reviewed_by: josh.pencheon
|
10
|
+
safe_revision: 71f6a631758a5a38814d3eafec407e0fde30101f
|
11
|
+
".github/workflows/test.yml":
|
12
|
+
comments:
|
13
|
+
reviewed_by: josh.pencheon
|
14
|
+
safe_revision: 865fc970554fee9207f8e3cd0247133c6a849b24
|
3
15
|
".gitignore":
|
4
16
|
comments:
|
5
17
|
reviewed_by: timgentry
|
@@ -9,17 +21,13 @@ file safety:
|
|
9
21
|
reviewed_by: timgentry
|
10
22
|
safe_revision: 0b34688f1198eace9310f47060aa8915f5b44985
|
11
23
|
".rubocop.yml":
|
12
|
-
comments:
|
13
|
-
reviewed_by: timgentry
|
14
|
-
safe_revision: 5bc563431f7822e2baf37bbeac9861c36675602d
|
15
|
-
".travis.yml":
|
16
24
|
comments:
|
17
25
|
reviewed_by: josh.pencheon
|
18
|
-
safe_revision:
|
26
|
+
safe_revision: 146b255b240b0efc928d39dd1b70ab221ddc3138
|
19
27
|
CHANGELOG.md:
|
20
28
|
comments:
|
21
|
-
reviewed_by:
|
22
|
-
safe_revision:
|
29
|
+
reviewed_by: ollietulloch
|
30
|
+
safe_revision: 9af6ea0bcdac493fe5f31d62b504b285658867c4
|
23
31
|
CODE_OF_CONDUCT.md:
|
24
32
|
comments:
|
25
33
|
reviewed_by: drewthorp
|
@@ -35,7 +43,7 @@ file safety:
|
|
35
43
|
README.md:
|
36
44
|
comments:
|
37
45
|
reviewed_by: josh.pencheon
|
38
|
-
safe_revision:
|
46
|
+
safe_revision: 8c07968aa84db92b6f1cc528180f73530ddc6ff5
|
39
47
|
Rakefile:
|
40
48
|
comments:
|
41
49
|
reviewed_by: timgentry
|
@@ -50,8 +58,8 @@ file safety:
|
|
50
58
|
safe_revision: 6a666fcabe027056b1c774b2eabb3fdf686911d2
|
51
59
|
canql.gemspec:
|
52
60
|
comments:
|
53
|
-
reviewed_by:
|
54
|
-
safe_revision:
|
61
|
+
reviewed_by: josh.pencheon
|
62
|
+
safe_revision: 146b255b240b0efc928d39dd1b70ab221ddc3138
|
55
63
|
lib/canql.rb:
|
56
64
|
comments:
|
57
65
|
reviewed_by: timgentry
|
@@ -63,7 +71,7 @@ file safety:
|
|
63
71
|
lib/canql/grammars.rb:
|
64
72
|
comments:
|
65
73
|
reviewed_by: josh.pencheon
|
66
|
-
safe_revision:
|
74
|
+
safe_revision: c5f8f76b2c335a8554f39a14d6165bf5cd8f9b67
|
67
75
|
lib/canql/grammars/age.treetop:
|
68
76
|
comments: It is a known issue that this is potentially susceptible to certain
|
69
77
|
kinds of DoS attack
|
@@ -72,8 +80,8 @@ file safety:
|
|
72
80
|
lib/canql/grammars/anomaly.treetop:
|
73
81
|
comments: It is a known issue that this is potentially susceptible to certain
|
74
82
|
kinds of DoS attack
|
75
|
-
reviewed_by:
|
76
|
-
safe_revision:
|
83
|
+
reviewed_by: ollietulloch
|
84
|
+
safe_revision: e549c0dcafdd6004ec279bd256fae8b9964c9629
|
77
85
|
lib/canql/grammars/batch_types.treetop:
|
78
86
|
comments:
|
79
87
|
reviewed_by: josh.pencheon
|
@@ -94,13 +102,13 @@ file safety:
|
|
94
102
|
lib/canql/grammars/main.treetop:
|
95
103
|
comments: It is a known issue that this is potentially susceptible to certain
|
96
104
|
kinds of DoS attack
|
97
|
-
reviewed_by:
|
98
|
-
safe_revision:
|
105
|
+
reviewed_by: josh.pencheon
|
106
|
+
safe_revision: 9bb663b220e76e78f3f0f48e4bc6334fe9451925
|
99
107
|
lib/canql/grammars/patient.treetop:
|
100
108
|
comments: It is a known issue that this is potentially susceptible to certain
|
101
109
|
kinds of DoS attack
|
102
110
|
reviewed_by: josh.pencheon
|
103
|
-
safe_revision:
|
111
|
+
safe_revision: 7490099869e368dcd5c26ded11eb90229baf4cae
|
104
112
|
lib/canql/grammars/perinatal_hospital.treetop:
|
105
113
|
comments:
|
106
114
|
reviewed_by: josh.pencheon
|
@@ -113,24 +121,28 @@ file safety:
|
|
113
121
|
comments: It is a known issue that this is potentially susceptible to certain
|
114
122
|
kinds of DoS attack
|
115
123
|
reviewed_by: josh.pencheon
|
116
|
-
safe_revision:
|
124
|
+
safe_revision: 293248a17d087d7557a6aacdcb5bf3fbec946b87
|
117
125
|
lib/canql/grammars/test_result.treetop:
|
118
126
|
comments: It is a known issue that this is potentially susceptible to certain
|
119
127
|
kinds of DoS attack
|
120
128
|
reviewed_by: timgentry
|
121
129
|
safe_revision: c39d24bb500719971969762e94545e82866bf92f
|
130
|
+
lib/canql/grammars/test_result_group.treetop:
|
131
|
+
comments:
|
132
|
+
reviewed_by: josh.pencheon
|
133
|
+
safe_revision: 9bb663b220e76e78f3f0f48e4bc6334fe9451925
|
122
134
|
lib/canql/nodes.rb:
|
123
135
|
comments:
|
124
136
|
reviewed_by: josh.pencheon
|
125
|
-
safe_revision:
|
137
|
+
safe_revision: c5f8f76b2c335a8554f39a14d6165bf5cd8f9b67
|
126
138
|
lib/canql/nodes/age.rb:
|
127
139
|
comments:
|
128
140
|
reviewed_by: timgentry
|
129
141
|
safe_revision: 6932d590299ad4a9d2ba24b425b158c67142bf74
|
130
142
|
lib/canql/nodes/anomaly.rb:
|
131
143
|
comments:
|
132
|
-
reviewed_by:
|
133
|
-
safe_revision:
|
144
|
+
reviewed_by: ollietulloch
|
145
|
+
safe_revision: e549c0dcafdd6004ec279bd256fae8b9964c9629
|
134
146
|
lib/canql/nodes/batch_types.rb:
|
135
147
|
comments:
|
136
148
|
reviewed_by: josh.pencheon
|
@@ -150,11 +162,11 @@ file safety:
|
|
150
162
|
lib/canql/nodes/main.rb:
|
151
163
|
comments:
|
152
164
|
reviewed_by: josh.pencheon
|
153
|
-
safe_revision:
|
165
|
+
safe_revision: 361dea5dc6d64bdb7b03434dd2878f8c3b128c95
|
154
166
|
lib/canql/nodes/patient.rb:
|
155
167
|
comments:
|
156
168
|
reviewed_by: josh.pencheon
|
157
|
-
safe_revision:
|
169
|
+
safe_revision: 7490099869e368dcd5c26ded11eb90229baf4cae
|
158
170
|
lib/canql/nodes/perinatal_hospital.rb:
|
159
171
|
comments:
|
160
172
|
reviewed_by: josh.pencheon
|
@@ -167,6 +179,10 @@ file safety:
|
|
167
179
|
comments:
|
168
180
|
reviewed_by: timgentry
|
169
181
|
safe_revision: c39d24bb500719971969762e94545e82866bf92f
|
182
|
+
lib/canql/nodes/test_result_group.rb:
|
183
|
+
comments:
|
184
|
+
reviewed_by: josh.pencheon
|
185
|
+
safe_revision: 9bb663b220e76e78f3f0f48e4bc6334fe9451925
|
170
186
|
lib/canql/parser.rb:
|
171
187
|
comments:
|
172
188
|
reviewed_by: timgentry
|
@@ -177,12 +193,12 @@ file safety:
|
|
177
193
|
safe_revision: 6932d590299ad4a9d2ba24b425b158c67142bf74
|
178
194
|
lib/canql/version.rb:
|
179
195
|
comments:
|
180
|
-
reviewed_by:
|
181
|
-
safe_revision:
|
196
|
+
reviewed_by: ollietulloch
|
197
|
+
safe_revision: 9af6ea0bcdac493fe5f31d62b504b285658867c4
|
182
198
|
test/anomaly_test_helper.rb:
|
183
199
|
comments:
|
184
|
-
reviewed_by:
|
185
|
-
safe_revision:
|
200
|
+
reviewed_by: ollietulloch
|
201
|
+
safe_revision: e549c0dcafdd6004ec279bd256fae8b9964c9629
|
186
202
|
test/canql_test.rb:
|
187
203
|
comments:
|
188
204
|
reviewed_by: timgentry
|
@@ -202,15 +218,15 @@ file safety:
|
|
202
218
|
test/nodes/case_test.rb:
|
203
219
|
comments:
|
204
220
|
reviewed_by: josh.pencheon
|
205
|
-
safe_revision:
|
221
|
+
safe_revision: 7490099869e368dcd5c26ded11eb90229baf4cae
|
206
222
|
test/nodes/code_test.rb:
|
207
223
|
comments:
|
208
|
-
reviewed_by:
|
209
|
-
safe_revision:
|
224
|
+
reviewed_by: ollietulloch
|
225
|
+
safe_revision: e549c0dcafdd6004ec279bd256fae8b9964c9629
|
210
226
|
test/nodes/e_base_records_test.rb:
|
211
227
|
comments:
|
212
228
|
reviewed_by: josh.pencheon
|
213
|
-
safe_revision:
|
229
|
+
safe_revision: 293248a17d087d7557a6aacdcb5bf3fbec946b87
|
214
230
|
test/nodes/genetic_tests_test.rb:
|
215
231
|
comments:
|
216
232
|
reviewed_by: josh.pencheon
|
@@ -242,16 +258,20 @@ file safety:
|
|
242
258
|
test/nodes/registry_test.rb:
|
243
259
|
comments:
|
244
260
|
reviewed_by: josh.pencheon
|
245
|
-
safe_revision:
|
261
|
+
safe_revision: 293248a17d087d7557a6aacdcb5bf3fbec946b87
|
262
|
+
test/nodes/test_result_groups_test.rb:
|
263
|
+
comments:
|
264
|
+
reviewed_by: josh.pencheon
|
265
|
+
safe_revision: 9bb663b220e76e78f3f0f48e4bc6334fe9451925
|
246
266
|
test/nodes/test_results_test.rb:
|
247
267
|
comments:
|
248
268
|
reviewed_by: josh.pencheon
|
249
269
|
safe_revision: 511e4238f83eb5b32839c25d94ec2a59145539bb
|
250
270
|
test/parser_test.rb:
|
251
271
|
comments:
|
252
|
-
reviewed_by:
|
253
|
-
safe_revision:
|
272
|
+
reviewed_by: josh.pencheon
|
273
|
+
safe_revision: 293248a17d087d7557a6aacdcb5bf3fbec946b87
|
254
274
|
test/test_helper.rb:
|
255
275
|
comments:
|
256
276
|
reviewed_by: josh.pencheon
|
257
|
-
safe_revision:
|
277
|
+
safe_revision: 42bb9bd177a761b9d04d728e53fcf0ebd0083ae4
|
data/lib/canql/grammars.rb
CHANGED
@@ -9,6 +9,7 @@ Treetop.load File.expand_path('grammars/batch_types', File.dirname(__FILE__))
|
|
9
9
|
Treetop.load File.expand_path('grammars/e_base_records', File.dirname(__FILE__))
|
10
10
|
Treetop.load File.expand_path('grammars/genetic_test', File.dirname(__FILE__))
|
11
11
|
Treetop.load File.expand_path('grammars/test_result', File.dirname(__FILE__))
|
12
|
+
Treetop.load File.expand_path('grammars/test_result_group', File.dirname(__FILE__))
|
12
13
|
Treetop.load File.expand_path('grammars/patient', File.dirname(__FILE__))
|
13
14
|
Treetop.load File.expand_path('grammars/registry', File.dirname(__FILE__))
|
14
15
|
Treetop.load File.expand_path('grammars/provider', File.dirname(__FILE__))
|
@@ -35,7 +35,7 @@ module Canql
|
|
35
35
|
end
|
36
36
|
|
37
37
|
rule anomalies_icd_code
|
38
|
-
(icd_code_name / code_group)
|
38
|
+
(fasp_rating / icd_code_name / code_group)
|
39
39
|
end
|
40
40
|
|
41
41
|
rule icd_code_name
|
@@ -45,5 +45,9 @@ module Canql
|
|
45
45
|
rule code_group
|
46
46
|
('fasp plus' / 'plus' / 'fasp' / 'structural' / 'trisomy') <Nodes::Anomaly::SingleCodeGroupNode>
|
47
47
|
end
|
48
|
+
|
49
|
+
rule fasp_rating
|
50
|
+
('fasp red and amber' / 'fasp amber and red' / 'fasp red' / 'fasp amber' / 'fasp green') <Nodes::Anomaly::SingleFaspRatingNode>
|
51
|
+
end
|
48
52
|
end
|
49
53
|
end
|
@@ -5,6 +5,7 @@ grammar Canql
|
|
5
5
|
include Anomaly
|
6
6
|
include GeneticTest
|
7
7
|
include TestResult
|
8
|
+
include TestResultGroup
|
8
9
|
include Dates
|
9
10
|
include EBaseRecords
|
10
11
|
include BatchTypes
|
@@ -127,7 +128,9 @@ grammar Canql
|
|
127
128
|
end
|
128
129
|
|
129
130
|
rule case_with_conditions
|
130
|
-
anomalies / genetic_tests / test_results / perinatal_hospital /
|
131
|
+
anomalies / genetic_tests / test_results / perinatal_hospital /
|
132
|
+
case_field_existance / test_acceptance_existance / test_result_groups /
|
133
|
+
mother_conditions / action_or_ebr
|
131
134
|
end
|
132
135
|
|
133
136
|
rule patient_with_conditions
|
@@ -50,7 +50,8 @@ module Canql
|
|
50
50
|
'delivery postcode' / 'booking postcode' / 'birth weight' /
|
51
51
|
'place of delivery' / 'sex' / 'outcome' / 'edd' /
|
52
52
|
'expected delivery date' / 'booking hospital' / 'screening status' /
|
53
|
-
'number of fetuses at delivery' / 'malformed in set'
|
53
|
+
'number of fetuses at delivery' / 'malformed in set' / 'gestation at delivery' /
|
54
|
+
'booking date'
|
54
55
|
)
|
55
56
|
end
|
56
57
|
|
@@ -14,14 +14,15 @@ module Canql
|
|
14
14
|
|
15
15
|
rule registry_abbr
|
16
16
|
(england / east_mids / thames / east / yorkshire / north_east / north_west /
|
17
|
-
west_mids / south_west / wessex / london / limbo
|
17
|
+
west_mids / south_west_supra / south_west / wessex / london / limbo /
|
18
|
+
northern_supra / midlands_east_supra)
|
18
19
|
end
|
19
20
|
|
20
21
|
rule thames
|
21
22
|
('thames valley' / 'thames')
|
22
23
|
{
|
23
24
|
def to_registrycode
|
24
|
-
'
|
25
|
+
'thames'
|
25
26
|
end
|
26
27
|
}
|
27
28
|
end
|
@@ -30,7 +31,7 @@ module Canql
|
|
30
31
|
('east mids' / 'east midlands and south yorkshire' / 'east midlands')
|
31
32
|
{
|
32
33
|
def to_registrycode
|
33
|
-
'
|
34
|
+
'east_mids'
|
34
35
|
end
|
35
36
|
}
|
36
37
|
end
|
@@ -39,7 +40,7 @@ module Canql
|
|
39
40
|
'yorkshire'
|
40
41
|
{
|
41
42
|
def to_registrycode
|
42
|
-
'
|
43
|
+
'yorkshire'
|
43
44
|
end
|
44
45
|
}
|
45
46
|
end
|
@@ -48,7 +49,7 @@ module Canql
|
|
48
49
|
'north east'
|
49
50
|
{
|
50
51
|
def to_registrycode
|
51
|
-
'
|
52
|
+
'north_east'
|
52
53
|
end
|
53
54
|
}
|
54
55
|
end
|
@@ -57,7 +58,7 @@ module Canql
|
|
57
58
|
'north west'
|
58
59
|
{
|
59
60
|
def to_registrycode
|
60
|
-
'
|
61
|
+
'north_west'
|
61
62
|
end
|
62
63
|
}
|
63
64
|
end
|
@@ -66,7 +67,7 @@ module Canql
|
|
66
67
|
('west mids' / 'west midlands')
|
67
68
|
{
|
68
69
|
def to_registrycode
|
69
|
-
'
|
70
|
+
'west_mids'
|
70
71
|
end
|
71
72
|
}
|
72
73
|
end
|
@@ -75,7 +76,7 @@ module Canql
|
|
75
76
|
'south west'
|
76
77
|
{
|
77
78
|
def to_registrycode
|
78
|
-
'
|
79
|
+
'south_west'
|
79
80
|
end
|
80
81
|
}
|
81
82
|
end
|
@@ -84,7 +85,7 @@ module Canql
|
|
84
85
|
'wessex'
|
85
86
|
{
|
86
87
|
def to_registrycode
|
87
|
-
'
|
88
|
+
'wessex'
|
88
89
|
end
|
89
90
|
}
|
90
91
|
end
|
@@ -93,7 +94,7 @@ module Canql
|
|
93
94
|
('london and south east' / 'london')
|
94
95
|
{
|
95
96
|
def to_registrycode
|
96
|
-
'
|
97
|
+
'london'
|
97
98
|
end
|
98
99
|
}
|
99
100
|
end
|
@@ -102,7 +103,7 @@ module Canql
|
|
102
103
|
('east of england' / 'east')
|
103
104
|
{
|
104
105
|
def to_registrycode
|
105
|
-
'
|
106
|
+
'east'
|
106
107
|
end
|
107
108
|
}
|
108
109
|
end
|
@@ -111,7 +112,7 @@ module Canql
|
|
111
112
|
'limbo'
|
112
113
|
{
|
113
114
|
def to_registrycode
|
114
|
-
'
|
115
|
+
'limbo'
|
115
116
|
end
|
116
117
|
}
|
117
118
|
end
|
@@ -120,7 +121,34 @@ module Canql
|
|
120
121
|
'england'
|
121
122
|
{
|
122
123
|
def to_registrycode
|
123
|
-
'
|
124
|
+
'england'
|
125
|
+
end
|
126
|
+
}
|
127
|
+
end
|
128
|
+
|
129
|
+
rule northern_supra
|
130
|
+
('northern supra' / 'northern')
|
131
|
+
{
|
132
|
+
def to_registrycode
|
133
|
+
'northern_supra'
|
134
|
+
end
|
135
|
+
}
|
136
|
+
end
|
137
|
+
|
138
|
+
rule midlands_east_supra
|
139
|
+
('midlands & east supra' / 'midlands & east')
|
140
|
+
{
|
141
|
+
def to_registrycode
|
142
|
+
'midlands_east_supra'
|
143
|
+
end
|
144
|
+
}
|
145
|
+
end
|
146
|
+
|
147
|
+
rule south_west_supra
|
148
|
+
'south west supra'
|
149
|
+
{
|
150
|
+
def to_registrycode
|
151
|
+
'south_west_supra'
|
124
152
|
end
|
125
153
|
}
|
126
154
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Canql
|
2
|
+
grammar TestResultGroup
|
3
|
+
rule test_result_groups
|
4
|
+
and_keyword? existance_modifier:test_result_group_existance_keyword group:test_result_group_names <Nodes::TestResultGroup::WithCondition>
|
5
|
+
end
|
6
|
+
|
7
|
+
rule test_result_group_existance_keyword
|
8
|
+
# If in furture the reverse is needed use 'supplied require'
|
9
|
+
space ('missing required' / 'missing' / 'supplied required' / 'supplied') word_break
|
10
|
+
end
|
11
|
+
|
12
|
+
rule test_result_group_names
|
13
|
+
space ('screening' / 'anomaly scan' / 'fetal medicine' / 'dating') word_break
|
14
|
+
end
|
15
|
+
|
16
|
+
rule test_acceptance_existance
|
17
|
+
and_keyword? existance_modifier:test_acceptance_existance_keyword acceptance:test_acceptance_names <Nodes::TestAcceptanceExistamce::WithCondition>
|
18
|
+
end
|
19
|
+
|
20
|
+
rule test_acceptance_existance_keyword
|
21
|
+
space ('missing required' / 'missing' ) word_break
|
22
|
+
end
|
23
|
+
|
24
|
+
rule test_acceptance_names
|
25
|
+
space ('screening acceptance status' / 'anomaly scan acceptance status' ) word_break
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/canql/nodes.rb
CHANGED
@@ -17,6 +17,7 @@ require 'canql/nodes/batch_types'
|
|
17
17
|
require 'canql/nodes/anomaly'
|
18
18
|
require 'canql/nodes/genetic_test'
|
19
19
|
require 'canql/nodes/test_result'
|
20
|
+
require 'canql/nodes/test_result_group'
|
20
21
|
require 'canql/nodes/patient'
|
21
22
|
require 'canql/nodes/main'
|
22
23
|
require 'canql/nodes/registry'
|
data/lib/canql/nodes/anomaly.rb
CHANGED
@@ -23,13 +23,21 @@ module Canql #:nodoc: all
|
|
23
23
|
if anomaly_screening_status_type.present?
|
24
24
|
anomaly_hash['screening_status'] = anomaly_screening_status_type_filter
|
25
25
|
end
|
26
|
-
anomaly_hash
|
27
|
-
return anomaly_hash if code_filter[:code_group].blank?
|
26
|
+
code_filters(anomaly_hash)
|
28
27
|
|
29
|
-
anomaly_hash['code_groups'] = code_filter[:code_group]
|
30
28
|
anomaly_hash
|
31
29
|
end
|
32
30
|
|
31
|
+
def code_filters(anomaly_hash)
|
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
|
36
|
+
return if code_filter[:fasp_rating].blank?
|
37
|
+
|
38
|
+
anomaly_hash['fasp_rating'] = code_filter[:fasp_rating]
|
39
|
+
end
|
40
|
+
|
33
41
|
def existance_filter
|
34
42
|
{ Canql::EQUALS => existance_modifier.text_value.strip != 'no' }
|
35
43
|
end
|
@@ -49,36 +57,50 @@ module Canql #:nodoc: all
|
|
49
57
|
def code_type(code)
|
50
58
|
return :icd_code if code.respond_to?(:to_code) && code.to_code.present?
|
51
59
|
return :code_group if code.respond_to?(:to_code_group) && code.to_code_group.present?
|
60
|
+
return :fasp_rating if code.respond_to?(:to_fasp_rating) && code.to_fasp_rating.present?
|
52
61
|
|
53
62
|
raise 'Unable to find code type'
|
54
63
|
end
|
55
64
|
|
56
65
|
def code_value(code)
|
57
66
|
return code.to_code if :icd_code == code_type(code)
|
67
|
+
return code.to_code_group if :code_group == code_type(code)
|
58
68
|
|
59
|
-
code.
|
69
|
+
code.to_fasp_rating
|
60
70
|
end
|
61
71
|
|
62
72
|
def prepare_code_filters(code_array)
|
63
|
-
code_array
|
64
|
-
code_array[:icd_code].delete_if(&:blank?)
|
65
|
-
code_array[:code_group].flatten!
|
66
|
-
code_array[:code_group].delete_if(&:blank?)
|
73
|
+
clean_code_array(code_array)
|
67
74
|
|
68
75
|
code_filters = {}
|
69
76
|
if code_array[:icd_code].any?
|
70
77
|
code_filters[:icd_code] = { Canql::BEGINS => code_array[:icd_code] }
|
71
78
|
end
|
72
|
-
return code_filters if code_array[:code_group].blank?
|
73
79
|
|
74
|
-
|
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
|
87
|
+
|
75
88
|
code_filters
|
76
89
|
end
|
77
90
|
|
91
|
+
def clean_code_array(code_array)
|
92
|
+
code_array[:icd_code].flatten!
|
93
|
+
code_array[:icd_code].delete_if(&:blank?)
|
94
|
+
code_array[:code_group].flatten!
|
95
|
+
code_array[:code_group].delete_if(&:blank?)
|
96
|
+
code_array[:fasp_rating].flatten!
|
97
|
+
code_array[:fasp_rating].delete_if(&:blank?)
|
98
|
+
end
|
99
|
+
|
78
100
|
def code_filter
|
79
101
|
return {} if code_data.text_value.blank?
|
80
102
|
|
81
|
-
code_arrays = { icd_code: [], code_group: [] }
|
103
|
+
code_arrays = { icd_code: [], code_group: [], fasp_rating: [] }
|
82
104
|
code_arrays[code_type(code_data.first)] << code_value(code_data.first)
|
83
105
|
code_data.rest.elements.each do |code|
|
84
106
|
code_arrays[code_type(code)] << code_value(code)
|
@@ -90,8 +112,9 @@ module Canql #:nodoc: all
|
|
90
112
|
module AdditionalCodeNode
|
91
113
|
def code_type
|
92
114
|
return :icd_code if anomalies_icd_code.respond_to?(:to_code)
|
115
|
+
return :code_group if anomalies_icd_code.respond_to?(:to_code_group)
|
93
116
|
|
94
|
-
:
|
117
|
+
:fasp_rating
|
95
118
|
end
|
96
119
|
|
97
120
|
def to_code
|
@@ -101,6 +124,10 @@ module Canql #:nodoc: all
|
|
101
124
|
def to_code_group
|
102
125
|
anomalies_icd_code.to_code_group if :code_group == code_type
|
103
126
|
end
|
127
|
+
|
128
|
+
def to_fasp_rating
|
129
|
+
anomalies_icd_code.to_fasp_rating if :fasp_rating == code_type
|
130
|
+
end
|
104
131
|
end
|
105
132
|
|
106
133
|
module SingleIcdCodeNode
|
@@ -114,6 +141,14 @@ module Canql #:nodoc: all
|
|
114
141
|
text_value.gsub(/( )/, '_').upcase
|
115
142
|
end
|
116
143
|
end
|
144
|
+
|
145
|
+
module SingleFaspRatingNode
|
146
|
+
def to_fasp_rating
|
147
|
+
text_value.gsub(/( )/, '_').upcase.split('_AND_').map do |value|
|
148
|
+
value.start_with?('FASP_') ? value : "FASP_#{value}"
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
117
152
|
end
|
118
153
|
end
|
119
154
|
end
|
data/lib/canql/nodes/main.rb
CHANGED
@@ -29,20 +29,38 @@ module Canql #:nodoc: all
|
|
29
29
|
module WithConditions
|
30
30
|
def meta_data_item
|
31
31
|
conditions = {}
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
sub_clauses = build_sub_clauses
|
33
|
+
|
34
|
+
%i[
|
35
|
+
anomalies genetic_tests test_results test_result_groups test_acceptances
|
36
|
+
].each do |condition_key|
|
37
|
+
if sub_clauses[condition_key].present?
|
38
|
+
conditions[condition_key.to_s] = { Canql::ALL => sub_clauses[condition_key] }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
conditions
|
42
|
+
end
|
43
|
+
|
44
|
+
def build_sub_clauses
|
45
|
+
sub_clauses = {}
|
35
46
|
|
36
47
|
post.elements.each do |element|
|
37
|
-
|
38
|
-
|
39
|
-
|
48
|
+
add_sub_clause(sub_clauses, element, :anomalies, :to_anomaly)
|
49
|
+
add_sub_clause(sub_clauses, element, :genetic_tests, :to_genetic_test)
|
50
|
+
add_sub_clause(sub_clauses, element, :test_results, :to_test_result)
|
51
|
+
add_sub_clause(
|
52
|
+
sub_clauses, element, :test_result_groups, :to_test_result_group
|
53
|
+
)
|
54
|
+
add_sub_clause(sub_clauses, element, :test_acceptances, :to_test_acceptance)
|
40
55
|
end
|
56
|
+
sub_clauses
|
57
|
+
end
|
41
58
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
59
|
+
def add_sub_clause(sub_clauses, element, key, condition)
|
60
|
+
return sub_clauses unless element.respond_to?(condition)
|
61
|
+
|
62
|
+
sub_clauses[key] ||= []
|
63
|
+
sub_clauses[key] << element.send(condition)
|
46
64
|
end
|
47
65
|
end
|
48
66
|
end
|
data/lib/canql/nodes/patient.rb
CHANGED
@@ -54,7 +54,9 @@ module Canql #:nodoc: all
|
|
54
54
|
'booking hospital': { patient: 'booking_hospital' },
|
55
55
|
'screening status': { patient: 'screeningstatus' },
|
56
56
|
'number of fetuses at delivery': { patient: 'numoffetusesatdelivery' },
|
57
|
-
'malformed in set': { patient: 'malformedinset' }
|
57
|
+
'malformed in set': { patient: 'malformedinset' },
|
58
|
+
'gestation at delivery': { patient: 'gestationallength' },
|
59
|
+
'booking date': { patient: 'firstbookingdate' }
|
58
60
|
}.freeze
|
59
61
|
|
60
62
|
def meta_data_item
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Canql #:nodoc: all
|
4
|
+
module Nodes
|
5
|
+
module TestResultGroup
|
6
|
+
module WithCondition
|
7
|
+
def test_result_group
|
8
|
+
group.text_value.strip.parameterize.underscore
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_test_result_group
|
12
|
+
test_result_group_hash = { 'exists' => existance_filter }
|
13
|
+
test_result_group_hash['required'] = requirement_filter
|
14
|
+
test_result_group_hash['group'] = test_result_group_filter if test_result_group.present?
|
15
|
+
test_result_group_hash
|
16
|
+
end
|
17
|
+
|
18
|
+
def existance_filter
|
19
|
+
{
|
20
|
+
Canql::EQUALS => ['supplied required', 'supplied'].include?(
|
21
|
+
existance_modifier.text_value.strip
|
22
|
+
)
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def requirement_filter
|
27
|
+
{
|
28
|
+
Canql::EQUALS => ['supplied required', 'missing required'].include?(
|
29
|
+
existance_modifier.text_value.strip
|
30
|
+
)
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_result_group_filter
|
35
|
+
{ Canql::EQUALS => test_result_group }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
module TestAcceptanceExistamce
|
41
|
+
module WithCondition
|
42
|
+
def test_acceptance
|
43
|
+
acceptance.text_value.strip.parameterize.underscore
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_test_acceptance
|
47
|
+
test_acceptance_hash = { 'exists' => existance_filter }
|
48
|
+
test_acceptance_hash['required'] = requirement_filter
|
49
|
+
test_acceptance_hash['acceptance'] = test_acceptance_filter if test_acceptance.present?
|
50
|
+
test_acceptance_hash
|
51
|
+
end
|
52
|
+
|
53
|
+
def existance_filter
|
54
|
+
{
|
55
|
+
Canql::EQUALS => ['supplied required', 'supplied'].include?(
|
56
|
+
existance_modifier.text_value.strip
|
57
|
+
)
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
def requirement_filter
|
62
|
+
{
|
63
|
+
Canql::EQUALS => ['supplied required', 'missing required'].include?(
|
64
|
+
existance_modifier.text_value.strip
|
65
|
+
)
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_acceptance_filter
|
70
|
+
{ Canql::EQUALS => test_acceptance }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
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: 5.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- PHE NDR Development Team
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chronic
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
version: '4.1'
|
54
54
|
- - "<"
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: '
|
56
|
+
version: '7'
|
57
57
|
type: :runtime
|
58
58
|
prerelease: false
|
59
59
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -63,7 +63,7 @@ dependencies:
|
|
63
63
|
version: '4.1'
|
64
64
|
- - "<"
|
65
65
|
- !ruby/object:Gem::Version
|
66
|
-
version: '
|
66
|
+
version: '7'
|
67
67
|
- !ruby/object:Gem::Dependency
|
68
68
|
name: treetop
|
69
69
|
requirement: !ruby/object:Gem::Requirement
|
@@ -154,14 +154,14 @@ dependencies:
|
|
154
154
|
requirements:
|
155
155
|
- - "~>"
|
156
156
|
- !ruby/object:Gem::Version
|
157
|
-
version: '5.
|
157
|
+
version: '5.9'
|
158
158
|
type: :development
|
159
159
|
prerelease: false
|
160
160
|
version_requirements: !ruby/object:Gem::Requirement
|
161
161
|
requirements:
|
162
162
|
- - "~>"
|
163
163
|
- !ruby/object:Gem::Version
|
164
|
-
version: '5.
|
164
|
+
version: '5.9'
|
165
165
|
- !ruby/object:Gem::Dependency
|
166
166
|
name: pry
|
167
167
|
requirement: !ruby/object:Gem::Requirement
|
@@ -210,6 +210,9 @@ executables: []
|
|
210
210
|
extensions: []
|
211
211
|
extra_rdoc_files: []
|
212
212
|
files:
|
213
|
+
- ".github/CODEOWNERS"
|
214
|
+
- ".github/workflows/lint.yml"
|
215
|
+
- ".github/workflows/test.yml"
|
213
216
|
- ".gitignore"
|
214
217
|
- ".hound.yml"
|
215
218
|
- ".rubocop.yml"
|
@@ -238,6 +241,7 @@ files:
|
|
238
241
|
- lib/canql/grammars/provider.treetop
|
239
242
|
- lib/canql/grammars/registry.treetop
|
240
243
|
- lib/canql/grammars/test_result.treetop
|
244
|
+
- lib/canql/grammars/test_result_group.treetop
|
241
245
|
- lib/canql/nodes.rb
|
242
246
|
- lib/canql/nodes/age.rb
|
243
247
|
- lib/canql/nodes/anomaly.rb
|
@@ -250,6 +254,7 @@ files:
|
|
250
254
|
- lib/canql/nodes/perinatal_hospital.rb
|
251
255
|
- lib/canql/nodes/registry.rb
|
252
256
|
- lib/canql/nodes/test_result.rb
|
257
|
+
- lib/canql/nodes/test_result_group.rb
|
253
258
|
- lib/canql/parser.rb
|
254
259
|
- lib/canql/treetop/extensions.rb
|
255
260
|
- lib/canql/version.rb
|