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.
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