tnql 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.hound.yml +10 -0
- data/.rubocop.yml +7 -0
- data/.travis.yml +11 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +4 -0
- data/Guardfile +15 -0
- data/LICENSE.txt +21 -0
- data/README.md +74 -0
- data/Rakefile +12 -0
- data/bin/console +10 -0
- data/bin/setup +7 -0
- data/code_safety.yml +272 -0
- data/lib/tnql.rb +4 -0
- data/lib/tnql/constants.rb +8 -0
- data/lib/tnql/grammars.rb +16 -0
- data/lib/tnql/grammars/age.treetop +63 -0
- data/lib/tnql/grammars/batch_types.treetop +65 -0
- data/lib/tnql/grammars/dates.treetop +35 -0
- data/lib/tnql/grammars/diagnosis.treetop +23 -0
- data/lib/tnql/grammars/e_base_records.treetop +86 -0
- data/lib/tnql/grammars/main.treetop +54 -0
- data/lib/tnql/grammars/patient.treetop +39 -0
- data/lib/tnql/grammars/provider.treetop +21 -0
- data/lib/tnql/grammars/registration_status.treetop +11 -0
- data/lib/tnql/grammars/registry.treetop +15 -0
- data/lib/tnql/grammars/staging.treetop +23 -0
- data/lib/tnql/grammars/treatment.treetop +35 -0
- data/lib/tnql/grammars/tumour_type.treetop +54 -0
- data/lib/tnql/grammars/vital_status.treetop +19 -0
- data/lib/tnql/nodes.rb +25 -0
- data/lib/tnql/nodes/age.rb +82 -0
- data/lib/tnql/nodes/batch_types.rb +52 -0
- data/lib/tnql/nodes/dates.rb +50 -0
- data/lib/tnql/nodes/diagnosis.rb +31 -0
- data/lib/tnql/nodes/e_base_records.rb +61 -0
- data/lib/tnql/nodes/main.rb +11 -0
- data/lib/tnql/nodes/patient.rb +9 -0
- data/lib/tnql/nodes/provider.rb +24 -0
- data/lib/tnql/nodes/registration_status.rb +27 -0
- data/lib/tnql/nodes/registry.rb +33 -0
- data/lib/tnql/nodes/staging.rb +17 -0
- data/lib/tnql/nodes/treatment.rb +45 -0
- data/lib/tnql/nodes/tumour_type.rb +74 -0
- data/lib/tnql/nodes/vital_status.rb +15 -0
- data/lib/tnql/parser.rb +56 -0
- data/lib/tnql/treetop/extensions.rb +20 -0
- data/lib/tnql/version.rb +4 -0
- data/tnql.gemspec +39 -0
- metadata +286 -0
data/lib/tnql.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'treetop'
|
2
|
+
|
3
|
+
Treetop.load File.expand_path('grammars/dates', File.dirname(__FILE__))
|
4
|
+
Treetop.load File.expand_path('grammars/diagnosis', File.dirname(__FILE__))
|
5
|
+
Treetop.load File.expand_path('grammars/e_base_records', File.dirname(__FILE__))
|
6
|
+
Treetop.load File.expand_path('grammars/batch_types', File.dirname(__FILE__))
|
7
|
+
Treetop.load File.expand_path('grammars/provider', File.dirname(__FILE__))
|
8
|
+
Treetop.load File.expand_path('grammars/registration_status', File.dirname(__FILE__))
|
9
|
+
Treetop.load File.expand_path('grammars/registry', File.dirname(__FILE__))
|
10
|
+
Treetop.load File.expand_path('grammars/staging', File.dirname(__FILE__))
|
11
|
+
Treetop.load File.expand_path('grammars/treatment', File.dirname(__FILE__))
|
12
|
+
Treetop.load File.expand_path('grammars/tumour_type', File.dirname(__FILE__))
|
13
|
+
Treetop.load File.expand_path('grammars/patient', File.dirname(__FILE__))
|
14
|
+
Treetop.load File.expand_path('grammars/vital_status', File.dirname(__FILE__))
|
15
|
+
Treetop.load File.expand_path('grammars/age', File.dirname(__FILE__))
|
16
|
+
Treetop.load File.expand_path('grammars/main', File.dirname(__FILE__))
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Tnql
|
2
|
+
grammar Age
|
3
|
+
rule age
|
4
|
+
space age:(fuzzy_age / exact_age) <Nodes::AgeNode>
|
5
|
+
end
|
6
|
+
|
7
|
+
rule exact_age
|
8
|
+
[0-9] 1..3 <Nodes::ExactAgeNode>
|
9
|
+
end
|
10
|
+
|
11
|
+
rule fuzzy_age
|
12
|
+
'between' space start:exact_age space 'and' space finish:exact_age <Nodes::FuzzyAgeNode>
|
13
|
+
end
|
14
|
+
|
15
|
+
rule with_age_at_diagnosis
|
16
|
+
were_keyword aged_keyword age <Nodes::AgeAtDiagnosisNode>
|
17
|
+
end
|
18
|
+
|
19
|
+
rule with_death_date
|
20
|
+
died_keyword fuzzy_date <Nodes::DeathDateNode>
|
21
|
+
end
|
22
|
+
|
23
|
+
rule with_birth_date
|
24
|
+
were_keyword born_keyword fuzzy_date <Nodes::BirthDateNode>
|
25
|
+
end
|
26
|
+
|
27
|
+
rule age_group
|
28
|
+
space group:(ctya / paediatric / teenage / young_adult) word_break
|
29
|
+
end
|
30
|
+
|
31
|
+
rule ctya
|
32
|
+
'ctya' <Nodes::CtyaNode>
|
33
|
+
end
|
34
|
+
|
35
|
+
rule paediatric
|
36
|
+
'paediatric' <Nodes::PaediatricNode>
|
37
|
+
end
|
38
|
+
|
39
|
+
rule teenage
|
40
|
+
'teenage' <Nodes::TeenageNode>
|
41
|
+
end
|
42
|
+
|
43
|
+
rule young_adult
|
44
|
+
'young' space 'adult' <Nodes::YoungAdultNode>
|
45
|
+
end
|
46
|
+
|
47
|
+
rule aged_keyword
|
48
|
+
space 'aged' word_break
|
49
|
+
end
|
50
|
+
|
51
|
+
rule died_keyword
|
52
|
+
space 'died' word_break
|
53
|
+
end
|
54
|
+
|
55
|
+
rule were_keyword
|
56
|
+
space 'were' word_break
|
57
|
+
end
|
58
|
+
|
59
|
+
rule born_keyword
|
60
|
+
space 'born' word_break
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Tnql
|
2
|
+
grammar BatchTypes
|
3
|
+
rule batch_type
|
4
|
+
(nogca / nbocap / lucada / uhaem / ccm /
|
5
|
+
cosd_mdt / cosd_xml / usom / upath / upas /
|
6
|
+
ucwt / ucd / uncd / uextreg) <Nodes::BatchTypeNode>
|
7
|
+
end
|
8
|
+
|
9
|
+
rule nogca
|
10
|
+
'nogca'
|
11
|
+
end
|
12
|
+
|
13
|
+
rule nbocap
|
14
|
+
'nbocap'
|
15
|
+
end
|
16
|
+
|
17
|
+
rule lucada
|
18
|
+
'lucada'
|
19
|
+
end
|
20
|
+
|
21
|
+
rule uhaem
|
22
|
+
'uhaem'
|
23
|
+
end
|
24
|
+
|
25
|
+
rule ccm
|
26
|
+
'ccm'
|
27
|
+
end
|
28
|
+
|
29
|
+
rule cosd_mdt
|
30
|
+
'cosd_mdt'
|
31
|
+
end
|
32
|
+
|
33
|
+
rule cosd_xml
|
34
|
+
'cosd_xml'
|
35
|
+
end
|
36
|
+
|
37
|
+
rule usom
|
38
|
+
('somerset' / 'usom' / 'som' / 'scr') <Nodes::USomNode>
|
39
|
+
end
|
40
|
+
|
41
|
+
rule upath
|
42
|
+
('upath' / 'path') <Nodes::UPathNode>
|
43
|
+
end
|
44
|
+
|
45
|
+
rule upas
|
46
|
+
('upas' / 'pas' / 'pbr') <Nodes::UPasNode>
|
47
|
+
end
|
48
|
+
|
49
|
+
rule ucwt
|
50
|
+
(('cancer' space 'wait') / 'uwct' / 'cwt') <Nodes::UCwtNode>
|
51
|
+
end
|
52
|
+
|
53
|
+
rule ucd
|
54
|
+
(('death' space 'card') / 'death' / 'ucd') <Nodes::UCdNode>
|
55
|
+
end
|
56
|
+
|
57
|
+
rule uncd
|
58
|
+
('uncd' / 'ncd') <Nodes::UNcdNode>
|
59
|
+
end
|
60
|
+
|
61
|
+
rule uextreg
|
62
|
+
('extraregional' / 'uextreg') <Nodes::UExtregNode>
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Tnql
|
2
|
+
grammar Dates
|
3
|
+
rule fuzzy_date
|
4
|
+
date:(between_dates / on_dates) word_break <Nodes::FuzzyDateNode>
|
5
|
+
end
|
6
|
+
|
7
|
+
rule on_dates
|
8
|
+
space ('on' / 'in') space date_fragment <Nodes::SpecificDateNode>
|
9
|
+
end
|
10
|
+
|
11
|
+
rule between_dates
|
12
|
+
space 'between' space start:date_fragment space 'and' space finish:date_fragment <Nodes::FragmentedDateRangeNode>
|
13
|
+
end
|
14
|
+
|
15
|
+
rule date_fragment
|
16
|
+
fragment:(daterange / chronic_date) word_break <Nodes::DateFragmentNode>
|
17
|
+
end
|
18
|
+
|
19
|
+
rule daterange
|
20
|
+
day_or_month? day_or_month? year <Nodes::DateRangeNode>
|
21
|
+
end
|
22
|
+
|
23
|
+
rule day_or_month
|
24
|
+
[0-9] 1..2 ('.' / '/')
|
25
|
+
end
|
26
|
+
|
27
|
+
rule year
|
28
|
+
[0-9] 4..4
|
29
|
+
end
|
30
|
+
|
31
|
+
rule chronic_date
|
32
|
+
(!(space ('and' / 'at' / 'with' / 'who')) .)+ <Nodes::ChronicDateNode>
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Tnql
|
2
|
+
grammar Diagnosis
|
3
|
+
rule diagnosis
|
4
|
+
diagnosed_keyword conditions:diagnosis_conditions+
|
5
|
+
end
|
6
|
+
|
7
|
+
rule diagnosed_keyword
|
8
|
+
space 'diagnosed' word_break
|
9
|
+
end
|
10
|
+
|
11
|
+
rule diagnosis_conditions
|
12
|
+
diagnosisdate_range / diagnosisdate_detail / diagnosis_provider
|
13
|
+
end
|
14
|
+
|
15
|
+
rule diagnosisdate_range
|
16
|
+
space 'between' space start:date_fragment space 'and' space finish:date_fragment <Nodes::DiagnosisDateRangeNode>
|
17
|
+
end
|
18
|
+
|
19
|
+
rule diagnosisdate_detail
|
20
|
+
space ('in' / 'on') space date_fragment <Nodes::DiagnosisDetailNode>
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Tnql
|
2
|
+
grammar EBaseRecords
|
3
|
+
rule with_clause
|
4
|
+
with_keyword action_or_ebr
|
5
|
+
end
|
6
|
+
|
7
|
+
rule action_or_ebr
|
8
|
+
action_and_ebr / actions / e_base_records
|
9
|
+
end
|
10
|
+
|
11
|
+
rule action_and_ebr
|
12
|
+
actions and_keyword e_base_records
|
13
|
+
end
|
14
|
+
|
15
|
+
rule e_base_records
|
16
|
+
unprocessed_keyword types:batch_types? records_keyword <Nodes::EBaseRecordsNode>
|
17
|
+
end
|
18
|
+
|
19
|
+
rule batch_types
|
20
|
+
space allowed_types word_break <Nodes::BatchTypesNode>
|
21
|
+
end
|
22
|
+
|
23
|
+
rule allowed_types
|
24
|
+
batch_type types:more_types* <Nodes::AllowedTypesNode>
|
25
|
+
end
|
26
|
+
|
27
|
+
rule more_types
|
28
|
+
','? space? ('or' space)? batch_type <Nodes::MoreTypesNode>
|
29
|
+
end
|
30
|
+
|
31
|
+
rule with_keyword
|
32
|
+
space 'with' word_break
|
33
|
+
end
|
34
|
+
|
35
|
+
rule actions
|
36
|
+
action_type action_keyword action_provider? <Nodes::ActionsNode>
|
37
|
+
end
|
38
|
+
|
39
|
+
rule action_provider
|
40
|
+
space 'at' space provider:(action_provider_code / action_provider_name)
|
41
|
+
end
|
42
|
+
|
43
|
+
rule action_type
|
44
|
+
space accepted_action word_break
|
45
|
+
end
|
46
|
+
|
47
|
+
rule accepted_action
|
48
|
+
'pathl' / 'patho' / 'wait' / 'proforma' / 'transfer' / 'notes' / 'child' /
|
49
|
+
'qa' / 'staged' / 'tag' / 'qc' / 'query' / 'stage' / 'searchforstaging' /
|
50
|
+
'moreinfo' / 'search' / 'check' / 'gpsearch'
|
51
|
+
end
|
52
|
+
|
53
|
+
rule action_keyword
|
54
|
+
space 'action' word_break
|
55
|
+
end
|
56
|
+
|
57
|
+
rule at_keyword
|
58
|
+
space 'at' word_break
|
59
|
+
end
|
60
|
+
|
61
|
+
rule action_provider_code
|
62
|
+
provider_type space code:(!' ' .)+ <Nodes::ActionProviderCodeNode>
|
63
|
+
end
|
64
|
+
|
65
|
+
rule action_provider_name
|
66
|
+
short_desc:(!(space provider_type) .)+ space provider_type <Nodes::ActionProviderNameNode>
|
67
|
+
end
|
68
|
+
|
69
|
+
# TODO: support cancer network?
|
70
|
+
rule provider_type
|
71
|
+
'hospital'
|
72
|
+
end
|
73
|
+
|
74
|
+
rule unprocessed_keyword
|
75
|
+
space 'unprocessed' word_break
|
76
|
+
end
|
77
|
+
|
78
|
+
rule records_keyword
|
79
|
+
space 'records' word_break
|
80
|
+
end
|
81
|
+
|
82
|
+
rule and_keyword
|
83
|
+
space 'and' word_break
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
grammar Tnql
|
2
|
+
include Dates
|
3
|
+
include Diagnosis
|
4
|
+
include EBaseRecords
|
5
|
+
include BatchTypes
|
6
|
+
include Provider
|
7
|
+
include RegistrationStatus
|
8
|
+
include Registry
|
9
|
+
include Staging
|
10
|
+
include Treatment
|
11
|
+
include TumourType
|
12
|
+
include Patient
|
13
|
+
include VitalStatus
|
14
|
+
include Age
|
15
|
+
|
16
|
+
# The root grammar
|
17
|
+
rule query
|
18
|
+
quantity:record_count? pre:preconditions* tumours_keyword post:additional_conditions*
|
19
|
+
end
|
20
|
+
|
21
|
+
rule word_break
|
22
|
+
!(!(' '/',') .)
|
23
|
+
end
|
24
|
+
|
25
|
+
rule space
|
26
|
+
' '+
|
27
|
+
end
|
28
|
+
|
29
|
+
rule number
|
30
|
+
[0-9]+
|
31
|
+
end
|
32
|
+
|
33
|
+
rule record_count
|
34
|
+
all_keyword
|
35
|
+
/
|
36
|
+
'first' space number <Nodes::RecordCountNode>
|
37
|
+
end
|
38
|
+
|
39
|
+
rule all_keyword
|
40
|
+
'all' word_break
|
41
|
+
end
|
42
|
+
|
43
|
+
rule tumours_keyword
|
44
|
+
space 'tumours' word_break
|
45
|
+
end
|
46
|
+
|
47
|
+
rule preconditions
|
48
|
+
registration_status / registry / behaviour / stage / tumour_type
|
49
|
+
end
|
50
|
+
|
51
|
+
rule additional_conditions
|
52
|
+
diagnosis / treatment / with_clause / for_patients_clause
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Tnql
|
2
|
+
grammar Patient
|
3
|
+
rule for_patients_clause
|
4
|
+
for_keyword pre:patient_pre_classifiers* patient_keyword post:more_patient_filters?
|
5
|
+
end
|
6
|
+
|
7
|
+
rule patient_keyword
|
8
|
+
space 'patients' word_break
|
9
|
+
end
|
10
|
+
|
11
|
+
rule patient_pre_classifiers
|
12
|
+
dead_or_alive / gender / age_group
|
13
|
+
end
|
14
|
+
|
15
|
+
rule more_patient_filters
|
16
|
+
who_keyword first:patient_post_classifier rest:more_post_classifiers*
|
17
|
+
end
|
18
|
+
|
19
|
+
rule patient_post_classifier
|
20
|
+
with_age_at_diagnosis / with_death_date / with_birth_date / death_certificate
|
21
|
+
end
|
22
|
+
|
23
|
+
rule more_post_classifiers
|
24
|
+
(',' and_keyword / and_keyword / ',' )? patient_post_classifier
|
25
|
+
end
|
26
|
+
|
27
|
+
rule gender
|
28
|
+
space gender:('male' / 'female') word_break <Nodes::GenderNode>
|
29
|
+
end
|
30
|
+
|
31
|
+
rule who_keyword
|
32
|
+
space 'who' word_break
|
33
|
+
end
|
34
|
+
|
35
|
+
rule for_keyword
|
36
|
+
space 'for' word_break
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Tnql
|
2
|
+
grammar Provider
|
3
|
+
# TODO: move diagnosis_provider logic to diagnosis.treetop and clean up the provider logic so it works for
|
4
|
+
# treatments (extracting diagnosis specific logic i.e. tumour.eventid from provider_name and provider_code).
|
5
|
+
rule diagnosis_provider
|
6
|
+
space 'at' space provider:(provider_code / provider_name)
|
7
|
+
end
|
8
|
+
|
9
|
+
rule provider_name
|
10
|
+
name:(!(space provider_type) .)+ space provider_type <Nodes::ProviderNameNode>
|
11
|
+
end
|
12
|
+
|
13
|
+
rule provider_code
|
14
|
+
provider_type space code:(!' ' .)+ <Nodes::ProviderCodeNode>
|
15
|
+
end
|
16
|
+
|
17
|
+
rule provider_type
|
18
|
+
'hospital' / 'cancer network'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Tnql
|
2
|
+
grammar RegistrationStatus
|
3
|
+
rule registration_status
|
4
|
+
space? status_keyword more_statuses:(','? space? ('and' space)? status_keyword)* <Nodes::RegistrationStatusNode>
|
5
|
+
end
|
6
|
+
|
7
|
+
rule status_keyword
|
8
|
+
('final' / 'provisional' / 'referenced' / 'treatment' space 'only') <Nodes::StatusKeywordNode>
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Tnql
|
2
|
+
grammar Registry
|
3
|
+
rule registry
|
4
|
+
space registry:(registry_code / registry_abbr) <Nodes::RegistryNode>
|
5
|
+
end
|
6
|
+
|
7
|
+
rule registry_code
|
8
|
+
'y' [0-9] 4..4 <Nodes::RegistryCodeNode>
|
9
|
+
end
|
10
|
+
|
11
|
+
rule registry_abbr
|
12
|
+
('nycris' / 'trent' / 'ecric' / 'thames' / 'oxford' / 'ociu' / 'swcis' / 'wmciu' / 'nwcis') <Nodes::RegistryAbbrNode>
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|