tnql 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.hound.yml +10 -0
  4. data/.rubocop.yml +7 -0
  5. data/.travis.yml +11 -0
  6. data/CODE_OF_CONDUCT.md +13 -0
  7. data/Gemfile +4 -0
  8. data/Guardfile +15 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +74 -0
  11. data/Rakefile +12 -0
  12. data/bin/console +10 -0
  13. data/bin/setup +7 -0
  14. data/code_safety.yml +272 -0
  15. data/lib/tnql.rb +4 -0
  16. data/lib/tnql/constants.rb +8 -0
  17. data/lib/tnql/grammars.rb +16 -0
  18. data/lib/tnql/grammars/age.treetop +63 -0
  19. data/lib/tnql/grammars/batch_types.treetop +65 -0
  20. data/lib/tnql/grammars/dates.treetop +35 -0
  21. data/lib/tnql/grammars/diagnosis.treetop +23 -0
  22. data/lib/tnql/grammars/e_base_records.treetop +86 -0
  23. data/lib/tnql/grammars/main.treetop +54 -0
  24. data/lib/tnql/grammars/patient.treetop +39 -0
  25. data/lib/tnql/grammars/provider.treetop +21 -0
  26. data/lib/tnql/grammars/registration_status.treetop +11 -0
  27. data/lib/tnql/grammars/registry.treetop +15 -0
  28. data/lib/tnql/grammars/staging.treetop +23 -0
  29. data/lib/tnql/grammars/treatment.treetop +35 -0
  30. data/lib/tnql/grammars/tumour_type.treetop +54 -0
  31. data/lib/tnql/grammars/vital_status.treetop +19 -0
  32. data/lib/tnql/nodes.rb +25 -0
  33. data/lib/tnql/nodes/age.rb +82 -0
  34. data/lib/tnql/nodes/batch_types.rb +52 -0
  35. data/lib/tnql/nodes/dates.rb +50 -0
  36. data/lib/tnql/nodes/diagnosis.rb +31 -0
  37. data/lib/tnql/nodes/e_base_records.rb +61 -0
  38. data/lib/tnql/nodes/main.rb +11 -0
  39. data/lib/tnql/nodes/patient.rb +9 -0
  40. data/lib/tnql/nodes/provider.rb +24 -0
  41. data/lib/tnql/nodes/registration_status.rb +27 -0
  42. data/lib/tnql/nodes/registry.rb +33 -0
  43. data/lib/tnql/nodes/staging.rb +17 -0
  44. data/lib/tnql/nodes/treatment.rb +45 -0
  45. data/lib/tnql/nodes/tumour_type.rb +74 -0
  46. data/lib/tnql/nodes/vital_status.rb +15 -0
  47. data/lib/tnql/parser.rb +56 -0
  48. data/lib/tnql/treetop/extensions.rb +20 -0
  49. data/lib/tnql/version.rb +4 -0
  50. data/tnql.gemspec +39 -0
  51. metadata +286 -0
@@ -0,0 +1,4 @@
1
+ require 'active_support/time'
2
+
3
+ require 'tnql/version'
4
+ require 'tnql/parser'
@@ -0,0 +1,8 @@
1
+ # This stores additional constants of the Tnql gem
2
+ module Tnql
3
+ ALL = 'all'.freeze
4
+ BEGINS = 'begins'.freeze
5
+ EQUALS = 'equals'.freeze
6
+ LIMITS = 'limits'.freeze
7
+ MESSAGE = 'msg'.freeze
8
+ end
@@ -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