veritas-sql-generator 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. data/.gemtest +0 -0
  2. data/.rvmrc +1 -0
  3. data/.travis.yml +8 -0
  4. data/Gemfile +20 -10
  5. data/Guardfile +22 -0
  6. data/README.rdoc +2 -0
  7. data/Rakefile +4 -2
  8. data/TODO +16 -2
  9. data/config/flay.yml +2 -2
  10. data/config/flog.yml +1 -1
  11. data/config/roodi.yml +5 -5
  12. data/config/site.reek +21 -19
  13. data/lib/veritas/sql/generator.rb +25 -2
  14. data/lib/veritas/sql/generator/core_ext/date.rb +20 -0
  15. data/lib/veritas/sql/generator/core_ext/date_time.rb +45 -0
  16. data/lib/veritas/sql/generator/direction.rb +3 -1
  17. data/lib/veritas/sql/generator/function.rb +54 -0
  18. data/lib/veritas/sql/generator/function/aggregate.rb +134 -0
  19. data/lib/veritas/sql/generator/function/connective.rb +53 -0
  20. data/lib/veritas/sql/generator/function/numeric.rb +135 -0
  21. data/lib/veritas/sql/generator/function/predicate.rb +266 -0
  22. data/lib/veritas/sql/generator/function/proposition.rb +38 -0
  23. data/lib/veritas/sql/generator/function/string.rb +29 -0
  24. data/lib/veritas/sql/generator/identifier.rb +2 -1
  25. data/lib/veritas/sql/generator/literal.rb +15 -18
  26. data/lib/veritas/sql/generator/relation.rb +144 -17
  27. data/lib/veritas/sql/generator/relation/binary.rb +16 -64
  28. data/lib/veritas/sql/generator/relation/set.rb +30 -22
  29. data/lib/veritas/sql/generator/relation/unary.rb +131 -78
  30. data/lib/veritas/sql/generator/version.rb +1 -1
  31. data/spec/unit/date/iso8601_spec.rb +23 -0
  32. data/spec/unit/date_time/iso_8601_spec.rb +115 -0
  33. data/spec/unit/veritas/sql/generator/class_methods/parenthesize_spec.rb +18 -0
  34. data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_count_spec.rb +16 -0
  35. data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_maximum_spec.rb +16 -0
  36. data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_mean_spec.rb +16 -0
  37. data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_minimum_spec.rb +16 -0
  38. data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_standard_deviation_spec.rb +16 -0
  39. data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_sum_spec.rb +16 -0
  40. data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_variance_spec.rb +16 -0
  41. data/spec/unit/veritas/sql/generator/function/connective/visit_veritas_function_connective_conjunction_spec.rb +20 -0
  42. data/spec/unit/veritas/sql/generator/function/connective/visit_veritas_function_connective_disjunction_spec.rb +20 -0
  43. data/spec/unit/veritas/sql/generator/function/connective/visit_veritas_function_connective_negation_spec.rb +20 -0
  44. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_absolute_spec.rb +15 -0
  45. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_addition_spec.rb +15 -0
  46. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_division_spec.rb +15 -0
  47. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_exponentiation_spec.rb +15 -0
  48. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_modulo_spec.rb +15 -0
  49. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_multiplication_spec.rb +15 -0
  50. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_square_root_spec.rb +15 -0
  51. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_subtraction_spec.rb +15 -0
  52. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_unary_minus_spec.rb +15 -0
  53. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_unary_plus_spec.rb +15 -0
  54. data/spec/unit/veritas/sql/generator/{logic/visit_veritas_logic_predicate_equality_spec.rb → function/predicate/visit_veritas_function_predicate_equality_spec.rb} +5 -5
  55. data/spec/unit/veritas/sql/generator/{logic/visit_veritas_logic_predicate_exclusion_spec.rb → function/predicate/visit_veritas_function_predicate_exclusion_spec.rb} +10 -6
  56. data/spec/unit/veritas/sql/generator/function/predicate/visit_veritas_function_predicate_greater_than_or_equal_to_spec.rb +15 -0
  57. data/spec/unit/veritas/sql/generator/{logic/visit_veritas_logic_predicate_greater_than_spec.rb → function/predicate/visit_veritas_function_predicate_greater_than_spec.rb} +5 -5
  58. data/spec/unit/veritas/sql/generator/{logic/visit_veritas_logic_predicate_inclusion_spec.rb → function/predicate/visit_veritas_function_predicate_inclusion_spec.rb} +10 -6
  59. data/spec/unit/veritas/sql/generator/{logic/visit_veritas_logic_predicate_inequality_spec.rb → function/predicate/visit_veritas_function_predicate_inequality_spec.rb} +8 -8
  60. data/spec/unit/veritas/sql/generator/function/predicate/visit_veritas_function_predicate_less_than_or_equal_to_spec.rb +15 -0
  61. data/spec/unit/veritas/sql/generator/{logic/visit_veritas_logic_predicate_less_than_spec.rb → function/predicate/visit_veritas_function_predicate_less_than_spec.rb} +5 -5
  62. data/spec/unit/veritas/sql/generator/function/proposition/visit_veritas_function_proposition_contradiction_spec.rb +15 -0
  63. data/spec/unit/veritas/sql/generator/function/proposition/visit_veritas_function_proposition_tautology_spec.rb +15 -0
  64. data/spec/unit/veritas/sql/generator/function/string/visit_veritas_function_string_length_spec.rb +15 -0
  65. data/spec/unit/veritas/sql/generator/literal/class_methods/dup_frozen_spec.rb +2 -2
  66. data/spec/unit/veritas/sql/generator/relation/binary/base/to_subquery_spec.rb +1 -1
  67. data/spec/unit/veritas/sql/generator/relation/binary/base/{visit_veritas_base_relation_spec.rb → visit_veritas_relation_base_spec.rb} +3 -3
  68. data/spec/unit/veritas/sql/generator/relation/binary/to_s_spec.rb +2 -2
  69. data/spec/unit/veritas/sql/generator/relation/binary/to_subquery_spec.rb +2 -2
  70. data/spec/unit/veritas/sql/generator/relation/binary/visit_veritas_algebra_join_spec.rb +74 -33
  71. data/spec/unit/veritas/sql/generator/relation/binary/visit_veritas_algebra_product_spec.rb +63 -19
  72. data/spec/unit/veritas/sql/generator/relation/class_methods/visit_spec.rb +1 -1
  73. data/spec/unit/veritas/sql/generator/relation/set/class_methods/normalize_operand_headers_spec.rb +35 -0
  74. data/spec/unit/veritas/sql/generator/relation/set/to_s_spec.rb +1 -1
  75. data/spec/unit/veritas/sql/generator/relation/set/to_subquery_spec.rb +4 -4
  76. data/spec/unit/veritas/sql/generator/relation/set/visit_veritas_algebra_difference_spec.rb +83 -30
  77. data/spec/unit/veritas/sql/generator/relation/set/visit_veritas_algebra_intersection_spec.rb +80 -30
  78. data/spec/unit/veritas/sql/generator/relation/set/visit_veritas_algebra_union_spec.rb +80 -30
  79. data/spec/unit/veritas/sql/generator/relation/to_s_spec.rb +50 -0
  80. data/spec/unit/veritas/sql/generator/relation/to_subquery_spec.rb +49 -0
  81. data/spec/unit/veritas/sql/generator/relation/unary/to_s_spec.rb +1 -1
  82. data/spec/unit/veritas/sql/generator/relation/unary/to_subquery_spec.rb +6 -6
  83. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_extension_spec.rb +165 -0
  84. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_projection_spec.rb +84 -29
  85. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_rename_spec.rb +69 -27
  86. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_restriction_spec.rb +64 -22
  87. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_summarization_spec.rb +652 -0
  88. data/spec/unit/veritas/sql/generator/relation/unary/{visit_veritas_base_relation_spec.rb → visit_veritas_relation_base_spec.rb} +4 -4
  89. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_relation_operation_limit_spec.rb +60 -20
  90. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_relation_operation_offset_spec.rb +60 -20
  91. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_relation_operation_order_spec.rb +63 -23
  92. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_relation_operation_reverse_spec.rb +60 -20
  93. data/spec/unit/veritas/sql/generator/relation/visited_spec.rb +1 -1
  94. data/tasks/metrics/ci.rake +7 -0
  95. data/tasks/{quality → metrics}/flay.rake +0 -0
  96. data/tasks/{quality → metrics}/flog.rake +0 -0
  97. data/tasks/{quality → metrics}/heckle.rake +1 -0
  98. data/tasks/{quality → metrics}/metric_fu.rake +3 -0
  99. data/tasks/{quality → metrics}/reek.rake +0 -0
  100. data/tasks/{quality → metrics}/roodi.rake +0 -0
  101. data/tasks/{quality → metrics}/yardstick.rake +0 -0
  102. data/tasks/spec.rake +1 -0
  103. data/veritas-sql-generator.gemspec +82 -114
  104. metadata +137 -125
  105. data/lib/veritas/base_relation.rb +0 -36
  106. data/lib/veritas/sql/generator/logic.rb +0 -349
  107. data/spec/unit/veritas/base_relation/name_spec.rb +0 -45
  108. data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_connective_conjunction_spec.rb +0 -16
  109. data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_connective_disjunction_spec.rb +0 -16
  110. data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_connective_negation_spec.rb +0 -16
  111. data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_predicate_greater_than_or_equal_to_spec.rb +0 -15
  112. data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_predicate_less_than_or_equal_to_spec.rb +0 -15
  113. data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_proposition_contradiction_spec.rb +0 -15
  114. data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_proposition_tautology_spec.rb +0 -15
  115. data/spec/unit/veritas/sql/generator/relation/binary/class_methods/subquery_spec.rb +0 -42
  116. data/spec/unit/veritas/sql/generator/relation/class_methods/subquery_spec.rb +0 -33
  117. data/tasks/quality/ci.rake +0 -2
File without changes
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use @$(basename `pwd`) --create
@@ -0,0 +1,8 @@
1
+ bundler_args: --without guard metrics
2
+ script: "bundle exec rake spec"
3
+ rvm:
4
+ - ree
5
+ - 1.8.7
6
+ - 1.9.2
7
+ - ruby-head
8
+ - rbx
data/Gemfile CHANGED
@@ -1,23 +1,33 @@
1
+ # encoding: utf-8
2
+
1
3
  source :rubygems
2
4
 
3
- gem 'veritas', '0.0.3', :git => 'git://github.com/dkubb/veritas.git'
5
+ gem 'veritas', '0.0.4', :git => 'git://github.com/dkubb/veritas.git'
4
6
 
5
7
  group :development do
6
- gem 'backports', '~> 2.1.0'
7
- gem 'jeweler', '~> 1.5.2'
8
- gem 'rake', '~> 0.8.7'
8
+ gem 'backports', '~> 2.2.1'
9
+ gem 'jeweler', '~> 1.6.0'
10
+ gem 'rake', '~> 0.9.0'
9
11
  gem 'rspec', '~> 1.3.2'
10
- gem 'yard', '~> 0.6.8'
12
+ gem 'yard', '~> 0.7.1'
13
+ end
14
+
15
+ group :guard do
16
+ gem 'growl', '~> 1.0.3'
17
+ gem 'guard', '~> 0.3.4'
18
+ gem 'guard-bundler', '~> 0.1.3'
19
+ gem 'guard-ego', '~> 0.0.1'
20
+ gem 'guard-rspec', '~> 0.3.1'
11
21
  end
12
22
 
13
- group :jruby do
14
- platform :jruby do
15
- gem 'jruby-openssl', '~> 0.7.3'
23
+ platform :jruby do
24
+ group :jruby do
25
+ gem 'jruby-openssl', '~> 0.7.4'
16
26
  end
17
27
  end
18
28
 
19
29
  platforms :mri_18 do
20
- group :quality do
30
+ group :metrics do
21
31
  gem 'flay', '~> 1.4.2'
22
32
  gem 'flog', '~> 2.5.1'
23
33
  gem 'heckle', '~> 1.4.3'
@@ -28,6 +38,6 @@ platforms :mri_18 do
28
38
  gem 'reek', '~> 1.2.8', :git => 'git://github.com/dkubb/reek.git'
29
39
  gem 'roodi', '~> 2.1.0'
30
40
  gem 'ruby2ruby', '= 1.2.2'
31
- gem 'yardstick', '~> 0.3.0'
41
+ gem 'yardstick', '~> 0.4.0'
32
42
  end
33
43
  end
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ guard 'ego' do
4
+ watch('Guardfile')
5
+ end
6
+
7
+ guard 'bundler' do
8
+ watch('Gemfile')
9
+ end
10
+
11
+ guard 'rspec' do
12
+ # run all specs if the spec_helper or supporting files files are modified
13
+ watch('spec/spec_helper.rb') { 'spec' }
14
+ watch(%r{\Aspec/(?:lib|support|shared)/.+\.rb\z}) { 'spec' }
15
+
16
+ # run unit specs if associated lib code is modified
17
+ watch(%r{\Alib/(.+)\.rb\z}) { |m| Dir["spec/unit/#{m[1]}"] }
18
+ watch("lib/#{File.basename(File.expand_path('../', __FILE__))}.rb") { 'spec' }
19
+
20
+ # run a spec if it is modified
21
+ watch(%r{\Aspec/(?:unit|integration)/.+_spec\.rb\z})
22
+ end
@@ -2,6 +2,8 @@
2
2
 
3
3
  Relational algebra SQL generator
4
4
 
5
+ http://travis-ci.org/dkubb/veritas-sql-generator.png
6
+
5
7
  == Note on Patches/Pull Requests
6
8
 
7
9
  * If you want your code merged into the mainline, please discuss
data/Rakefile CHANGED
@@ -1,9 +1,11 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'rake'
2
4
 
3
5
  require File.expand_path('../lib/veritas/sql/generator/version', __FILE__)
4
6
 
5
7
  begin
6
- gem('jeweler', '~> 1.5.2') if respond_to?(:gem, true)
8
+ gem('jeweler', '~> 1.6.0') if respond_to?(:gem, true)
7
9
  require 'jeweler'
8
10
 
9
11
  Jeweler::Tasks.new do |gem|
@@ -21,5 +23,5 @@ begin
21
23
 
22
24
  FileList['tasks/**/*.rake'].each { |task| import task }
23
25
  rescue LoadError
24
- puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler -v 1.5.2'
26
+ puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler -v 1.6.0'
25
27
  end
data/TODO CHANGED
@@ -1,5 +1,5 @@
1
- * Replace some of the conditional logic with polymorphism, especially
2
- where there is special case logic for certain types of generators
1
+ * Replace some of the conditional function with polymorphism, especially
2
+ where there is special case function for certain types of generators
3
3
  within other generators.
4
4
  * Replace Equality/Inequality with classes that handle all of the
5
5
  special cases.
@@ -15,3 +15,17 @@
15
15
  Negation wrapping an Equality/Inclusion) on an *optional* attribute.
16
16
  * Add "OR attribute IS NULL" to the statement to ensure cases when
17
17
  the value is NULL still matches.
18
+
19
+ * Handle cases where WHERE clause does and does not reference a function
20
+ in the SELECT list.
21
+ * It should collapse the inner subquery when there is no reference, and
22
+ keep the subquery when it is referenced.
23
+ * This will likely apply to projection and rename operators too.
24
+
25
+ * When Restriction wraps a Summarization, and it would normally wrap the
26
+ statement and apply a WHERE clause, it should apply the clause using
27
+ HAVING instead.
28
+
29
+ * Handle case where Extension does not reference a column in the
30
+ wrapped Summarization or Rename. It should be safe to collapse the query
31
+ in those cases.
@@ -1,3 +1,3 @@
1
1
  ---
2
- threshold: 3
3
- total_score: 3
2
+ threshold: 7
3
+ total_score: 10
@@ -1,2 +1,2 @@
1
1
  ---
2
- threshold: 13.3
2
+ threshold: 14.9
@@ -1,16 +1,16 @@
1
1
  ---
2
- AbcMetricMethodCheck: { score: 7.1 }
2
+ AbcMetricMethodCheck: { score: 9.1 }
3
3
  AssignmentInConditionalCheck: { }
4
4
  CaseMissingElseCheck: { }
5
- ClassLineCountCheck: { line_count: 316 }
5
+ ClassLineCountCheck: { line_count: 369 }
6
6
  ClassNameCheck: { pattern: !ruby/regexp /\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/ }
7
7
  ClassVariableCheck: { }
8
8
  CyclomaticComplexityBlockCheck: { complexity: 2 }
9
9
  CyclomaticComplexityMethodCheck: { complexity: 6 }
10
10
  EmptyRescueBodyCheck: { }
11
11
  ForLoopCheck: { }
12
- MethodLineCountCheck: { line_count: 7 }
13
- MethodNameCheck: { pattern: !ruby/regexp /\A(?:[a-z](?:_?[a-z])+[?!=]?|\[\]=?|==|<=>|[+*&|-])\z/ }
14
- ModuleLineCountCheck: { line_count: 345 }
12
+ MethodLineCountCheck: { line_count: 10 }
13
+ MethodNameCheck: { pattern: !ruby/regexp /\A(?:[a-z\d](?:_?[a-z\d])+[?!=]?|\[\]=?|==|<=>|[+*&|-])\z/ }
14
+ ModuleLineCountCheck: { line_count: 375 }
15
15
  ModuleNameCheck: { pattern: !ruby/regexp /\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/ }
16
16
  ParameterNumberCheck: { parameter_count: 3 }
@@ -8,13 +8,16 @@ UncommunicativeParameterName:
8
8
  - !ruby/regexp /[0-9]$/
9
9
  - !ruby/regexp /[A-Z]/
10
10
  LargeClass:
11
- max_methods: 22 # TODO: reduce this in UnaryRelation
11
+ max_methods: 26 # TODO: reduce this in UnaryRelation
12
12
  exclude: []
13
13
  enabled: true
14
- max_instance_variables: 9 # TODO: reduce this in UnaryRelation
14
+ max_instance_variables: 12 # TODO: reduce this in UnaryRelation
15
15
  UncommunicativeMethodName:
16
16
  accept: []
17
- exclude: []
17
+ exclude: [
18
+ 'Date#iso8601',
19
+ 'DateTime#iso8601'
20
+ ]
18
21
  enabled: true
19
22
  reject:
20
23
  - !ruby/regexp /^[a-z]$/
@@ -30,16 +33,15 @@ FeatureEnvy:
30
33
  # TODO: change these methods to be class methods
31
34
  'Veritas::SQL::Generator::Attribute#visit_veritas_attribute',
32
35
  'Veritas::SQL::Generator::Identifier#visit_identifier',
33
- 'Veritas::SQL::Generator::Literal#visit_date_time',
34
36
  'Veritas::SQL::Generator::Literal#visit_numeric',
35
37
  'Veritas::SQL::Generator::Literal#visit_string',
36
- 'Veritas::SQL::Generator::Literal#visit_time',
37
- 'Veritas::SQL::Generator::Logic#visit_veritas_logic_predicate_inequality',
38
- 'Veritas::SQL::Generator::Logic#exclusive_range_exclusion_sql',
39
- 'Veritas::SQL::Generator::Logic#exclusive_range_inclusion_sql',
40
- 'Veritas::SQL::Generator::Logic#new_from_enumerable_predicate',
41
- 'Veritas::SQL::Generator::Logic#optional?',
42
- 'Veritas::SQL::Generator::Relation::Unary#collapse_subquery_for?'
38
+ 'Veritas::SQL::Generator::Function::Predicate#visit_veritas_function_predicate_inequality',
39
+ 'Veritas::SQL::Generator::Function::Predicate#exclusive_range_exclusion_sql',
40
+ 'Veritas::SQL::Generator::Function::Predicate#exclusive_range_inclusion_sql',
41
+ 'Veritas::SQL::Generator::Function::Predicate#new_from_enumerable_predicate',
42
+ 'Veritas::SQL::Generator::Function::Predicate#optional?',
43
+ 'Veritas::SQL::Generator::Relation::Unary#collapse_subquery_for?',
44
+ 'Veritas::SQL::Generator::Relation#column_list_for'
43
45
  ]
44
46
  enabled: true
45
47
  ClassVariable:
@@ -66,7 +68,7 @@ NestedIterators:
66
68
  enabled: true
67
69
  max_allowed_nesting: 1
68
70
  LongMethod:
69
- max_statements: 7
71
+ max_statements: 9
70
72
  exclude: [
71
73
  'Veritas::SQL::Generator::Relation::Unary#to_s'
72
74
  ]
@@ -84,11 +86,11 @@ UtilityFunction:
84
86
  'Veritas::SQL::Generator::Identifier#visit_identifier',
85
87
  'Veritas::SQL::Generator::Literal#visit_numeric',
86
88
  'Veritas::SQL::Generator::Literal#visit_string',
87
- 'Veritas::SQL::Generator::Logic#visit_veritas_logic_predicate_inequality',
88
- 'Veritas::SQL::Generator::Logic#exclusive_range_exclusion_sql',
89
- 'Veritas::SQL::Generator::Logic#exclusive_range_inclusion_sql',
90
- 'Veritas::SQL::Generator::Logic#new_from_enumerable_predicate',
91
- 'Veritas::SQL::Generator::Logic#optional?',
89
+ 'Veritas::SQL::Generator::Function::Predicate#visit_veritas_function_predicate_inequality',
90
+ 'Veritas::SQL::Generator::Function::Predicate#exclusive_range_exclusion_sql',
91
+ 'Veritas::SQL::Generator::Function::Predicate#exclusive_range_inclusion_sql',
92
+ 'Veritas::SQL::Generator::Function::Predicate#new_from_enumerable_predicate',
93
+ 'Veritas::SQL::Generator::Function::Predicate#optional?',
92
94
  'Veritas::SQL::Generator::Relation::Unary#collapse_subquery_for?'
93
95
  ]
94
96
  enabled: true
@@ -106,11 +108,11 @@ UncommunicativeVariableName:
106
108
  SimulatedPolymorphism:
107
109
  exclude: []
108
110
  enabled: true
109
- max_ifs: 1
111
+ max_ifs: 2
110
112
  DataClump:
111
113
  exclude: [
112
114
  # TODO: split Range handling methods into separate class/module
113
- 'Veritas::SQL::Generator::Logic'
115
+ 'Veritas::SQL::Generator::Function'
114
116
  ]
115
117
  enabled: true
116
118
  max_copies: 1
@@ -5,7 +5,8 @@ require 'time'
5
5
 
6
6
  require 'veritas'
7
7
 
8
- require 'veritas/base_relation'
8
+ require 'veritas/sql/generator/core_ext/date'
9
+ require 'veritas/sql/generator/core_ext/date_time'
9
10
 
10
11
  require 'veritas/sql/generator/visitor'
11
12
 
@@ -13,7 +14,14 @@ require 'veritas/sql/generator/identifier'
13
14
  require 'veritas/sql/generator/attribute'
14
15
  require 'veritas/sql/generator/direction'
15
16
  require 'veritas/sql/generator/literal'
16
- require 'veritas/sql/generator/logic'
17
+
18
+ require 'veritas/sql/generator/function'
19
+ require 'veritas/sql/generator/function/aggregate'
20
+ require 'veritas/sql/generator/function/connective'
21
+ require 'veritas/sql/generator/function/numeric'
22
+ require 'veritas/sql/generator/function/predicate'
23
+ require 'veritas/sql/generator/function/proposition'
24
+ require 'veritas/sql/generator/function/string'
17
25
 
18
26
  require 'veritas/sql/generator/relation'
19
27
  require 'veritas/sql/generator/relation/unary'
@@ -30,6 +38,21 @@ module Veritas
30
38
  # Raised when an invalid relation is visited
31
39
  class InvalidRelationError < StandardError; end
32
40
 
41
+ LEFT_PARENTHESIS = '('.freeze
42
+ RIGHT_PARENTHESIS = ')'.freeze
43
+
44
+ # Return a parenthesized SQL statement (inline modification)
45
+ #
46
+ # @param [#to_s] sql
47
+ #
48
+ # @return [#to_s]
49
+ # same instance as sql
50
+ #
51
+ # @api private
52
+ def self.parenthesize!(sql)
53
+ sql.insert(0, LEFT_PARENTHESIS) << RIGHT_PARENTHESIS
54
+ end
55
+
33
56
  end # module Generator
34
57
  end # module SQL
35
58
  end # module Veritas
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ # Extend Date with methods available in ruby 1.9
4
+ class Date
5
+
6
+ ISO_8601_FORMAT = '%F'.freeze
7
+
8
+ # Return the Date in ISO8601 date format
9
+ #
10
+ # @return [#to_s]
11
+ #
12
+ # @todo Remove once backports adds this method
13
+ #
14
+ # @api private
15
+ def iso8601
16
+ date = frozen? ? dup : self
17
+ date.strftime(ISO_8601_FORMAT)
18
+ end unless method_defined? :iso8601
19
+
20
+ end # class Date
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+
3
+ # Extend DateTime with methods available in ruby 1.9
4
+ class DateTime
5
+
6
+ SEC_FRACTION_MULTIPLIER = RUBY_VERSION < '1.9' ? 60 * 60 * 24 : 1
7
+
8
+ # Return the DateTime in ISO8601 date-time format
9
+ #
10
+ # @param [Integer] time_scale
11
+ # the number of significant digits to use for fractional seconds
12
+ #
13
+ # @return [#to_s]
14
+ #
15
+ # @todo Remove once backports adds this method
16
+ #
17
+ # @api private
18
+ def iso8601(time_scale = 0)
19
+ super() + iso8601_timediv(time_scale)
20
+ end unless method_defined?(:iso8601) && instance_method(:iso8601).arity == 1
21
+
22
+ private
23
+
24
+ # Return the time with fraction seconds
25
+ #
26
+ # @param [Integer] time_scale
27
+ # the number of significant digits to use for fractional seconds
28
+ #
29
+ # @return [#to_s]
30
+ #
31
+ # @api private
32
+ def iso8601_timediv(time_scale)
33
+ date_time = frozen? ? dup : self
34
+
35
+ fractional_seconds = unless time_scale.zero?
36
+ '.%0*d' % [
37
+ time_scale,
38
+ date_time.sec_fraction * SEC_FRACTION_MULTIPLIER * 10**time_scale
39
+ ]
40
+ end
41
+
42
+ date_time.strftime("T%T#{fractional_seconds}%Z")
43
+ end unless method_defined? :iso8601_timediv
44
+
45
+ end # class Date
@@ -8,6 +8,8 @@ module Veritas
8
8
  module Direction
9
9
  include Attribute
10
10
 
11
+ DESC = ' DESC'.freeze
12
+
11
13
  # Visit an Ascending Direction
12
14
  #
13
15
  # @param [Relation::Operation::Order::Ascending] direction
@@ -27,7 +29,7 @@ module Veritas
27
29
  #
28
30
  # @api private
29
31
  def visit_veritas_relation_operation_order_descending(direction)
30
- "#{dispatch direction.attribute} DESC"
32
+ dispatch(direction.attribute) << DESC
31
33
  end
32
34
 
33
35
  end # module Direction
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ module SQL
5
+ module Generator
6
+
7
+ # Generates an SQL statement for a function expression
8
+ module Function
9
+ include Attribute, Literal
10
+
11
+ private
12
+ # Return the SQL for a umary prefix operation
13
+ #
14
+ # @param [#to_s] operator
15
+ #
16
+ # @param [Function::Unary] function
17
+ #
18
+ # @return [#to_s]
19
+ #
20
+ # @api private
21
+ def unary_prefix_operation_sql(operator, function)
22
+ "#{operator} (#{dispatch(function.operand)})"
23
+ end
24
+
25
+ # Return the SQL for a binary prefix operation
26
+ #
27
+ # @param [#to_s] operator
28
+ #
29
+ # @param [Function::Binary] function
30
+ #
31
+ # @return [#to_s]
32
+ #
33
+ # @api private
34
+ def binary_prefix_operation_sql(operator, function)
35
+ "#{operator} (#{dispatch(function.left)}, #{dispatch(function.right)})"
36
+ end
37
+
38
+ # Return the SQL for a binary infix operation
39
+ #
40
+ # @param [#to_s] operator
41
+ #
42
+ # @param [Function::Binary] function
43
+ #
44
+ # @return [#to_s]
45
+ #
46
+ # @api private
47
+ def binary_infix_operation_sql(operator, function)
48
+ "#{dispatch(function.left)} #{operator} #{dispatch(function.right)}"
49
+ end
50
+
51
+ end # module Function
52
+ end # module Generator
53
+ end # module SQL
54
+ end # module Veritas