tnql 1.0.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 +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
|