axiom-sql-generator 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. checksums.yaml +7 -0
  2. data/.gemtest +0 -0
  3. data/.gitignore +37 -0
  4. data/.rspec +4 -0
  5. data/.rvmrc +1 -0
  6. data/.travis.yml +35 -0
  7. data/CONTRIBUTING.md +11 -0
  8. data/Gemfile +8 -0
  9. data/Gemfile.devtools +57 -0
  10. data/Guardfile +23 -0
  11. data/LICENSE +20 -0
  12. data/README.md +70 -0
  13. data/Rakefile +5 -0
  14. data/TODO +34 -0
  15. data/axiom-sql-generator.gemspec +25 -0
  16. data/config/flay.yml +3 -0
  17. data/config/flog.yml +2 -0
  18. data/config/mutant.yml +3 -0
  19. data/config/reek.yml +165 -0
  20. data/config/yardstick.yml +2 -0
  21. data/lib/axiom-sql-generator.rb +3 -0
  22. data/lib/axiom/sql/generator.rb +61 -0
  23. data/lib/axiom/sql/generator/attribute.rb +25 -0
  24. data/lib/axiom/sql/generator/core_ext/date.rb +20 -0
  25. data/lib/axiom/sql/generator/core_ext/date_time.rb +46 -0
  26. data/lib/axiom/sql/generator/direction.rb +38 -0
  27. data/lib/axiom/sql/generator/function.rb +55 -0
  28. data/lib/axiom/sql/generator/function/aggregate.rb +134 -0
  29. data/lib/axiom/sql/generator/function/connective.rb +53 -0
  30. data/lib/axiom/sql/generator/function/numeric.rb +135 -0
  31. data/lib/axiom/sql/generator/function/predicate.rb +266 -0
  32. data/lib/axiom/sql/generator/function/proposition.rb +38 -0
  33. data/lib/axiom/sql/generator/function/string.rb +29 -0
  34. data/lib/axiom/sql/generator/identifier.rb +28 -0
  35. data/lib/axiom/sql/generator/literal.rb +157 -0
  36. data/lib/axiom/sql/generator/relation.rb +240 -0
  37. data/lib/axiom/sql/generator/relation/base.rb +14 -0
  38. data/lib/axiom/sql/generator/relation/binary.rb +136 -0
  39. data/lib/axiom/sql/generator/relation/insertion.rb +62 -0
  40. data/lib/axiom/sql/generator/relation/materialized.rb +60 -0
  41. data/lib/axiom/sql/generator/relation/set.rb +107 -0
  42. data/lib/axiom/sql/generator/relation/unary.rb +379 -0
  43. data/lib/axiom/sql/generator/version.rb +12 -0
  44. data/lib/axiom/sql/generator/visitor.rb +121 -0
  45. data/spec/rcov.opts +7 -0
  46. data/spec/shared/generated_sql_behavior.rb +15 -0
  47. data/spec/spec_helper.rb +33 -0
  48. data/spec/support/config_alias.rb +3 -0
  49. data/spec/unit/axiom/sql/generator/attribute/visit_axiom_attribute_spec.rb +15 -0
  50. data/spec/unit/axiom/sql/generator/class_methods/parenthesize_spec.rb +18 -0
  51. data/spec/unit/axiom/sql/generator/direction/visit_axiom_relation_operation_order_ascending_spec.rb +15 -0
  52. data/spec/unit/axiom/sql/generator/direction/visit_axiom_relation_operation_order_descending_spec.rb +15 -0
  53. data/spec/unit/axiom/sql/generator/function/aggregate/visit_axiom_aggregate_count_spec.rb +16 -0
  54. data/spec/unit/axiom/sql/generator/function/aggregate/visit_axiom_aggregate_maximum_spec.rb +16 -0
  55. data/spec/unit/axiom/sql/generator/function/aggregate/visit_axiom_aggregate_mean_spec.rb +16 -0
  56. data/spec/unit/axiom/sql/generator/function/aggregate/visit_axiom_aggregate_minimum_spec.rb +16 -0
  57. data/spec/unit/axiom/sql/generator/function/aggregate/visit_axiom_aggregate_standard_deviation_spec.rb +16 -0
  58. data/spec/unit/axiom/sql/generator/function/aggregate/visit_axiom_aggregate_sum_spec.rb +16 -0
  59. data/spec/unit/axiom/sql/generator/function/aggregate/visit_axiom_aggregate_variance_spec.rb +16 -0
  60. data/spec/unit/axiom/sql/generator/function/connective/visit_axiom_function_connective_conjunction_spec.rb +20 -0
  61. data/spec/unit/axiom/sql/generator/function/connective/visit_axiom_function_connective_disjunction_spec.rb +20 -0
  62. data/spec/unit/axiom/sql/generator/function/connective/visit_axiom_function_connective_negation_spec.rb +20 -0
  63. data/spec/unit/axiom/sql/generator/function/numeric/visit_axiom_function_numeric_absolute_spec.rb +15 -0
  64. data/spec/unit/axiom/sql/generator/function/numeric/visit_axiom_function_numeric_addition_spec.rb +15 -0
  65. data/spec/unit/axiom/sql/generator/function/numeric/visit_axiom_function_numeric_division_spec.rb +15 -0
  66. data/spec/unit/axiom/sql/generator/function/numeric/visit_axiom_function_numeric_exponentiation_spec.rb +15 -0
  67. data/spec/unit/axiom/sql/generator/function/numeric/visit_axiom_function_numeric_modulo_spec.rb +15 -0
  68. data/spec/unit/axiom/sql/generator/function/numeric/visit_axiom_function_numeric_multiplication_spec.rb +15 -0
  69. data/spec/unit/axiom/sql/generator/function/numeric/visit_axiom_function_numeric_square_root_spec.rb +15 -0
  70. data/spec/unit/axiom/sql/generator/function/numeric/visit_axiom_function_numeric_subtraction_spec.rb +15 -0
  71. data/spec/unit/axiom/sql/generator/function/numeric/visit_axiom_function_numeric_unary_minus_spec.rb +15 -0
  72. data/spec/unit/axiom/sql/generator/function/numeric/visit_axiom_function_numeric_unary_plus_spec.rb +15 -0
  73. data/spec/unit/axiom/sql/generator/function/predicate/visit_axiom_function_predicate_equality_spec.rb +27 -0
  74. data/spec/unit/axiom/sql/generator/function/predicate/visit_axiom_function_predicate_exclusion_spec.rb +47 -0
  75. data/spec/unit/axiom/sql/generator/function/predicate/visit_axiom_function_predicate_greater_than_or_equal_to_spec.rb +15 -0
  76. data/spec/unit/axiom/sql/generator/function/predicate/visit_axiom_function_predicate_greater_than_spec.rb +15 -0
  77. data/spec/unit/axiom/sql/generator/function/predicate/visit_axiom_function_predicate_inclusion_spec.rb +47 -0
  78. data/spec/unit/axiom/sql/generator/function/predicate/visit_axiom_function_predicate_inequality_spec.rb +55 -0
  79. data/spec/unit/axiom/sql/generator/function/predicate/visit_axiom_function_predicate_less_than_or_equal_to_spec.rb +15 -0
  80. data/spec/unit/axiom/sql/generator/function/predicate/visit_axiom_function_predicate_less_than_spec.rb +15 -0
  81. data/spec/unit/axiom/sql/generator/function/proposition/visit_axiom_function_proposition_contradiction_spec.rb +15 -0
  82. data/spec/unit/axiom/sql/generator/function/proposition/visit_axiom_function_proposition_tautology_spec.rb +15 -0
  83. data/spec/unit/axiom/sql/generator/function/string/visit_axiom_function_string_length_spec.rb +15 -0
  84. data/spec/unit/axiom/sql/generator/identifier/visit_identifier_spec.rb +26 -0
  85. data/spec/unit/axiom/sql/generator/literal/class_methods/dup_frozen_spec.rb +23 -0
  86. data/spec/unit/axiom/sql/generator/literal/visit_class_spec.rb +31 -0
  87. data/spec/unit/axiom/sql/generator/literal/visit_date_spec.rb +15 -0
  88. data/spec/unit/axiom/sql/generator/literal/visit_date_time_spec.rb +55 -0
  89. data/spec/unit/axiom/sql/generator/literal/visit_enumerable_spec.rb +15 -0
  90. data/spec/unit/axiom/sql/generator/literal/visit_false_class_spec.rb +14 -0
  91. data/spec/unit/axiom/sql/generator/literal/visit_nil_class_spec.rb +14 -0
  92. data/spec/unit/axiom/sql/generator/literal/visit_numeric_spec.rb +34 -0
  93. data/spec/unit/axiom/sql/generator/literal/visit_string_spec.rb +26 -0
  94. data/spec/unit/axiom/sql/generator/literal/visit_time_spec.rb +97 -0
  95. data/spec/unit/axiom/sql/generator/literal/visit_true_class_spec.rb +14 -0
  96. data/spec/unit/axiom/sql/generator/relation/binary/base/to_subquery_spec.rb +35 -0
  97. data/spec/unit/axiom/sql/generator/relation/binary/base/visit_axiom_relation_base_spec.rb +22 -0
  98. data/spec/unit/axiom/sql/generator/relation/binary/to_s_spec.rb +35 -0
  99. data/spec/unit/axiom/sql/generator/relation/binary/to_subquery_spec.rb +35 -0
  100. data/spec/unit/axiom/sql/generator/relation/binary/visit_axiom_algebra_join_spec.rb +179 -0
  101. data/spec/unit/axiom/sql/generator/relation/binary/visit_axiom_algebra_product_spec.rb +183 -0
  102. data/spec/unit/axiom/sql/generator/relation/class_methods/visit_spec.rb +71 -0
  103. data/spec/unit/axiom/sql/generator/relation/insertion/to_subquery_spec.rb +15 -0
  104. data/spec/unit/axiom/sql/generator/relation/insertion/visit_axiom_relation_operation_insertion_spec.rb +187 -0
  105. data/spec/unit/axiom/sql/generator/relation/materialized/visit_axiom_relation_materialized_spec.rb +28 -0
  106. data/spec/unit/axiom/sql/generator/relation/materialized/visited_spec.rb +26 -0
  107. data/spec/unit/axiom/sql/generator/relation/name_spec.rb +30 -0
  108. data/spec/unit/axiom/sql/generator/relation/set/class_methods/normalize_operand_headers_spec.rb +35 -0
  109. data/spec/unit/axiom/sql/generator/relation/set/to_s_spec.rb +55 -0
  110. data/spec/unit/axiom/sql/generator/relation/set/to_subquery_spec.rb +55 -0
  111. data/spec/unit/axiom/sql/generator/relation/set/visit_axiom_algebra_difference_spec.rb +191 -0
  112. data/spec/unit/axiom/sql/generator/relation/set/visit_axiom_algebra_intersection_spec.rb +188 -0
  113. data/spec/unit/axiom/sql/generator/relation/set/visit_axiom_algebra_union_spec.rb +188 -0
  114. data/spec/unit/axiom/sql/generator/relation/to_s_spec.rb +50 -0
  115. data/spec/unit/axiom/sql/generator/relation/to_sql_spec.rb +52 -0
  116. data/spec/unit/axiom/sql/generator/relation/to_subquery_spec.rb +49 -0
  117. data/spec/unit/axiom/sql/generator/relation/unary/to_s_spec.rb +55 -0
  118. data/spec/unit/axiom/sql/generator/relation/unary/to_subquery_spec.rb +75 -0
  119. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_algebra_extension_spec.rb +165 -0
  120. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_algebra_projection_spec.rb +193 -0
  121. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_algebra_rename_spec.rb +178 -0
  122. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_algebra_restriction_spec.rb +199 -0
  123. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_algebra_summarization_spec.rb +652 -0
  124. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_relation_base_spec.rb +21 -0
  125. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_relation_operation_limit_spec.rb +165 -0
  126. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_relation_operation_offset_spec.rb +165 -0
  127. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_relation_operation_order_spec.rb +183 -0
  128. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_relation_operation_reverse_spec.rb +165 -0
  129. data/spec/unit/axiom/sql/generator/relation/visit_spec.rb +54 -0
  130. data/spec/unit/axiom/sql/generator/relation/visited_spec.rb +35 -0
  131. data/spec/unit/axiom/sql/generator/visitor/class_methods/handler_for_spec.rb +71 -0
  132. data/spec/unit/axiom/sql/generator/visitor/visit_spec.rb +12 -0
  133. data/spec/unit/axiom/sql/generator/visitor/visited_spec.rb +11 -0
  134. data/spec/unit/date/iso8601_spec.rb +23 -0
  135. data/spec/unit/date_time/iso8601_spec.rb +112 -0
  136. metadata +325 -0
@@ -0,0 +1,135 @@
1
+ # encoding: utf-8
2
+
3
+ module Axiom
4
+ module SQL
5
+ module Generator
6
+ module Function
7
+
8
+ # Generates an SQL statement for a numeric function
9
+ module Numeric
10
+ include Function
11
+
12
+ ABSOLUTE = 'ABS'.freeze
13
+ ADD = '+'.freeze
14
+ SUBTRACT = '-'.freeze
15
+ MULTIPLY = '*'.freeze
16
+ DIVIDE = '/'.freeze
17
+ POWER = 'POWER'.freeze
18
+ MOD = 'MOD'.freeze
19
+ SQUARE_ROOT = 'SQRT'.freeze
20
+
21
+ # Visit an Absolute function
22
+ #
23
+ # @param [Function::Numeric::Absolute] absolute
24
+ #
25
+ # @return [#to_s]
26
+ #
27
+ # @api private
28
+ def visit_axiom_function_numeric_absolute(absolute)
29
+ unary_prefix_operation_sql(ABSOLUTE, absolute)
30
+ end
31
+
32
+ # Visit an Addition function
33
+ #
34
+ # @param [Function::Numeric::Addition] addition
35
+ #
36
+ # @return [#to_s]
37
+ #
38
+ # @api private
39
+ def visit_axiom_function_numeric_addition(addition)
40
+ Generator.parenthesize!(binary_infix_operation_sql(ADD, addition))
41
+ end
42
+
43
+ # Visit a Division function
44
+ #
45
+ # @param [Function::Numeric::Division] division
46
+ #
47
+ # @return [#to_s]
48
+ #
49
+ # @api private
50
+ def visit_axiom_function_numeric_division(division)
51
+ Generator.parenthesize!(binary_infix_operation_sql(DIVIDE, division))
52
+ end
53
+
54
+ # Visit a Exponentiation function
55
+ #
56
+ # @param [Function::Numeric::Exponentiation] exponentiation
57
+ #
58
+ # @return [#to_s]
59
+ #
60
+ # @api private
61
+ def visit_axiom_function_numeric_exponentiation(exponentiation)
62
+ binary_prefix_operation_sql(POWER, exponentiation)
63
+ end
64
+
65
+ # Visit a Modulo function
66
+ #
67
+ # @param [Function::Numeric::Modulo] modulo
68
+ #
69
+ # @return [#to_s]
70
+ #
71
+ # @api private
72
+ def visit_axiom_function_numeric_modulo(modulo)
73
+ binary_prefix_operation_sql(MOD, modulo)
74
+ end
75
+
76
+ # Visit a Multiplication function
77
+ #
78
+ # @param [Function::Numeric::Multiplication] multiplication
79
+ #
80
+ # @return [#to_s]
81
+ #
82
+ # @api private
83
+ def visit_axiom_function_numeric_multiplication(multiplication)
84
+ Generator.parenthesize!(binary_infix_operation_sql(MULTIPLY, multiplication))
85
+ end
86
+
87
+ # Visit a Square Root function
88
+ #
89
+ # @param [Function::Numeric::SquareRoot] square_root
90
+ #
91
+ # @return [#to_s]
92
+ #
93
+ # @api private
94
+ def visit_axiom_function_numeric_square_root(square_root)
95
+ unary_prefix_operation_sql(SQUARE_ROOT, square_root)
96
+ end
97
+
98
+ # Visit an Addition function
99
+ #
100
+ # @param [Function::Numeric::Addition] subtraction
101
+ #
102
+ # @return [#to_s]
103
+ #
104
+ # @api private
105
+ def visit_axiom_function_numeric_subtraction(subtraction)
106
+ Generator.parenthesize!(binary_infix_operation_sql(SUBTRACT, subtraction))
107
+ end
108
+
109
+ # Visit an Unary Minus function
110
+ #
111
+ # @param [Function::Numeric::UnaryMinus] unary_minus
112
+ #
113
+ # @return [#to_s]
114
+ #
115
+ # @api private
116
+ def visit_axiom_function_numeric_unary_minus(unary_minus)
117
+ unary_prefix_operation_sql(SUBTRACT, unary_minus)
118
+ end
119
+
120
+ # Visit an Unary Plus function
121
+ #
122
+ # @param [Function::Numeric::UnaryPlus] unary_plus
123
+ #
124
+ # @return [#to_s]
125
+ #
126
+ # @api private
127
+ def visit_axiom_function_numeric_unary_plus(unary_plus)
128
+ unary_prefix_operation_sql(ADD, unary_plus)
129
+ end
130
+
131
+ end # module Numeric
132
+ end # module Function
133
+ end # module Generator
134
+ end # module SQL
135
+ end # module Axiom
@@ -0,0 +1,266 @@
1
+ # encoding: utf-8
2
+
3
+ module Axiom
4
+ module SQL
5
+ module Generator
6
+ module Function
7
+
8
+ # Generates an SQL statement for a predicate function
9
+ module Predicate
10
+ include Function
11
+
12
+ EQUAL_TO = '='.freeze
13
+ EQUAL_TO_NULL = 'IS'.freeze
14
+ NOT_EQUAL_TO = '<>'.freeze
15
+ NOT_EQUAL_TO_NULL = 'IS NOT'.freeze
16
+ GREATER_THAN = '>'.freeze
17
+ GREATER_THAN_OR_EQUAL_TO = '>='.freeze
18
+ LESS_THAN = '<'.freeze
19
+ LESS_THAN_OR_EQUAL_TO = '<='.freeze
20
+ IN = 'IN'.freeze
21
+ NOT_IN = 'NOT IN'.freeze
22
+ BETWEEN = 'BETWEEN'.freeze
23
+ NOT_BETWEEN = 'NOT BETWEEN'.freeze
24
+ EMPTY_ARRAY = [].freeze
25
+
26
+ # Visit an Equality predicate
27
+ #
28
+ # @param [Function::Predicate::Equality] equality
29
+ #
30
+ # @return [#to_s]
31
+ #
32
+ # @api private
33
+ def visit_axiom_function_predicate_equality(equality)
34
+ binary_infix_operation_sql(equality.right.nil? ? EQUAL_TO_NULL : EQUAL_TO, equality)
35
+ end
36
+
37
+ # Visit an Inequality predicate
38
+ #
39
+ # @param [Function::Predicate::Inequality] inequality
40
+ #
41
+ # @return [#to_s]
42
+ #
43
+ # @api private
44
+ def visit_axiom_function_predicate_inequality(inequality)
45
+ expressions = inequality_expressions(inequality)
46
+ expressions.one? ? expressions.first : Generator.parenthesize!(expressions.join(' OR '))
47
+ end
48
+
49
+ # Visit an GreaterThan predicate
50
+ #
51
+ # @param [Function::Predicate::GreaterThan] greater_than
52
+ #
53
+ # @return [#to_s]
54
+ #
55
+ # @api private
56
+ def visit_axiom_function_predicate_greater_than(greater_than)
57
+ binary_infix_operation_sql(GREATER_THAN, greater_than)
58
+ end
59
+
60
+ # Visit an GreaterThanOrEqualTo predicate
61
+ #
62
+ # @param [Function::Predicate::GreaterThanOrEqualTo] greater_than_or_equal_to
63
+ #
64
+ # @return [#to_s]
65
+ #
66
+ # @api private
67
+ def visit_axiom_function_predicate_greater_than_or_equal_to(greater_than_or_equal_to)
68
+ binary_infix_operation_sql(GREATER_THAN_OR_EQUAL_TO, greater_than_or_equal_to)
69
+ end
70
+
71
+ # Visit an LessThan predicate
72
+ #
73
+ # @param [Function::Predicate::LessThan] less_than
74
+ #
75
+ # @return [#to_s]
76
+ #
77
+ # @api private
78
+ def visit_axiom_function_predicate_less_than(less_than)
79
+ binary_infix_operation_sql(LESS_THAN, less_than)
80
+ end
81
+
82
+ # Visit an LessThanOrEqualTo predicate
83
+ #
84
+ # @param [Function::Predicate::LessThanOrEqualTo] less_than_or_equal_to
85
+ #
86
+ # @return [#to_s]
87
+ #
88
+ # @api private
89
+ def visit_axiom_function_predicate_less_than_or_equal_to(less_than_or_equal_to)
90
+ binary_infix_operation_sql(LESS_THAN_OR_EQUAL_TO, less_than_or_equal_to)
91
+ end
92
+
93
+ # Visit an Inclusion predicate
94
+ #
95
+ # @param [Function::Predicate::Inclusion] inclusion
96
+ #
97
+ # @return [#to_s]
98
+ #
99
+ # @api private
100
+ def visit_axiom_function_predicate_inclusion(inclusion)
101
+ case inclusion.right
102
+ when Range then range_inclusion_sql(inclusion)
103
+ when EMPTY_ARRAY then FALSE
104
+ else
105
+ binary_infix_operation_sql(IN, inclusion)
106
+ end
107
+ end
108
+
109
+ # Visit an Exclusion predicate
110
+ #
111
+ # @param [Function::Predicate::Exclusion] exclusion
112
+ #
113
+ # @return [#to_s]
114
+ #
115
+ # @api private
116
+ def visit_axiom_function_predicate_exclusion(exclusion)
117
+ case exclusion.right
118
+ when Range then range_exclusion_sql(exclusion)
119
+ when EMPTY_ARRAY then TRUE
120
+ else
121
+ binary_infix_operation_sql(NOT_IN, exclusion)
122
+ end
123
+ end
124
+
125
+ private
126
+
127
+ # Return the SQL for an Inclusion using a Range
128
+ #
129
+ # @param [Function::Predicate::Inclusion] inclusion
130
+ #
131
+ # @return [#to_s]
132
+ #
133
+ # @api private
134
+ def range_inclusion_sql(inclusion)
135
+ if inclusion.right.exclude_end?
136
+ exclusive_range_inclusion_sql(inclusion)
137
+ else
138
+ inclusive_range_sql(BETWEEN, inclusion)
139
+ end
140
+ end
141
+
142
+ # Return the SQL for an Exclusion using a Range
143
+ #
144
+ # @param [Function::Predicate::Exclusion] exclusion
145
+ #
146
+ # @return [#to_s]
147
+ #
148
+ # @api private
149
+ def range_exclusion_sql(exclusion)
150
+ if exclusion.right.exclude_end?
151
+ exclusive_range_exclusion_sql(exclusion)
152
+ else
153
+ inclusive_range_sql(NOT_BETWEEN, exclusion)
154
+ end
155
+ end
156
+
157
+ # Return the SQL for an Inclusion using an exclusive Range
158
+ #
159
+ # @param [Function::Predicate::Inclusion] inclusion
160
+ #
161
+ # @return [#to_s]
162
+ #
163
+ # @api private
164
+ def exclusive_range_inclusion_sql(inclusion)
165
+ left = new_from_enumerable_predicate(Axiom::Function::Predicate::GreaterThanOrEqualTo, inclusion, :first)
166
+ right = new_from_enumerable_predicate(Axiom::Function::Predicate::LessThan, inclusion, :last)
167
+ dispatch left.and(right)
168
+ end
169
+
170
+ # Return the SQL for an Exclusion using an exclusive Range
171
+ #
172
+ # @param [Function::Predicate::Exclusion] exclusion
173
+ #
174
+ # @return [#to_s]
175
+ #
176
+ # @api private
177
+ def exclusive_range_exclusion_sql(exclusion)
178
+ left = new_from_enumerable_predicate(Axiom::Function::Predicate::LessThan, exclusion, :first)
179
+ right = new_from_enumerable_predicate(Axiom::Function::Predicate::GreaterThanOrEqualTo, exclusion, :last)
180
+ dispatch left.or(right)
181
+ end
182
+
183
+ # Instantiate a new Predicate object from an Enumerable Predicate
184
+ #
185
+ # @param [Class<Function::Predicate>] klass
186
+ # the type of predicate to create
187
+ # @param [Function::Predicate::Enumerable] predicate
188
+ # the enumerable predicate
189
+ # @param [Symbol] method
190
+ # the method to call on the right operand of the predicate
191
+ # @return [Function::Predicate]
192
+ #
193
+ # @api private
194
+ def new_from_enumerable_predicate(klass, predicate, method)
195
+ klass.new(predicate.left, predicate.right.send(method))
196
+ end
197
+
198
+ # Return the expressions for an inequality
199
+ #
200
+ # @param [Function::Predicate::Inequality] inequality
201
+ #
202
+ # @return [Array<#to_s>]
203
+ #
204
+ # @api private
205
+ def inequality_expressions(inequality)
206
+ expressions = [
207
+ inequality_sql(inequality),
208
+ optional_is_null_sql(inequality.left),
209
+ optional_is_null_sql(inequality.right),
210
+ ]
211
+ expressions.compact!
212
+ expressions
213
+ end
214
+
215
+ # Return the SQL for an inequality predicate
216
+ #
217
+ # @param [Function::Predicate::Inequality] inequality
218
+ #
219
+ # @return [#to_s]
220
+ #
221
+ # @api private
222
+ def inequality_sql(inequality)
223
+ binary_infix_operation_sql(inequality.right.nil? ? NOT_EQUAL_TO_NULL : NOT_EQUAL_TO, inequality)
224
+ end
225
+
226
+ # Return the SQL for an operation using an inclusive Range
227
+ #
228
+ # @param [#to_s] operator
229
+ #
230
+ # @param [Function::Predicate::Enumerable] predicate
231
+ #
232
+ # @return [#to_s]
233
+ #
234
+ # @api private
235
+ def inclusive_range_sql(operator, predicate)
236
+ right = predicate.right
237
+ "#{dispatch(predicate.left)} #{operator} #{dispatch(right.first)} AND #{dispatch(right.last)}"
238
+ end
239
+
240
+ # Return SQL for an Equality with a nil value for optional attributes
241
+ #
242
+ # @param [Attribute] attribute
243
+ #
244
+ # @return [#to_sql, nil]
245
+ #
246
+ # @api private
247
+ def optional_is_null_sql(attribute)
248
+ dispatch(attribute.eq(nil)) if optional?(attribute)
249
+ end
250
+
251
+ # Test if the object is not required
252
+ #
253
+ # @param [Object] operand
254
+ #
255
+ # @return [Boolean]
256
+ #
257
+ # @api private
258
+ def optional?(operand)
259
+ operand.respond_to?(:required?) && ! operand.required?
260
+ end
261
+
262
+ end # module Predicate
263
+ end # module Function
264
+ end # module Generator
265
+ end # module SQL
266
+ end # module Axiom
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+
3
+ module Axiom
4
+ module SQL
5
+ module Generator
6
+ module Function
7
+
8
+ # Generates an SQL statement for a proposition function
9
+ module Proposition
10
+ include Function
11
+
12
+ # Visit a Tautology
13
+ #
14
+ # @param [Function::Proposition::Tautology] _tautology
15
+ #
16
+ # @return [#to_s]
17
+ #
18
+ # @api private
19
+ def visit_axiom_function_proposition_tautology(_tautology)
20
+ TRUE
21
+ end
22
+
23
+ # Visit a Contradiction
24
+ #
25
+ # @param [Function::Proposition::Contradiction] _contradiction
26
+ #
27
+ # @return [#to_s]
28
+ #
29
+ # @api private
30
+ def visit_axiom_function_proposition_contradiction(_contradiction)
31
+ FALSE
32
+ end
33
+
34
+ end # module Proposition
35
+ end # module Function
36
+ end # module Generator
37
+ end # module SQL
38
+ end # module Axiom
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ module Axiom
4
+ module SQL
5
+ module Generator
6
+ module Function
7
+
8
+ # Generates an SQL statement for a string function
9
+ module String
10
+ include Function
11
+
12
+ LENGTH = 'LENGTH'.freeze
13
+
14
+ # Visit a Length function
15
+ #
16
+ # @param [Function::String::Length] length
17
+ #
18
+ # @return [#to_s]
19
+ #
20
+ # @api private
21
+ def visit_axiom_function_string_length(length)
22
+ unary_prefix_operation_sql(LENGTH, length)
23
+ end
24
+
25
+ end # module String
26
+ end # module Function
27
+ end # module Generator
28
+ end # module SQL
29
+ end # module Axiom