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
@@ -0,0 +1,134 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ module SQL
5
+ module Generator
6
+ module Function
7
+
8
+ # Generates an SQL statement for an aggregate function
9
+ module Aggregate
10
+ include Function
11
+
12
+ COUNT = 'COUNT'.freeze
13
+ SUM = 'SUM'.freeze
14
+ MINIMUM = 'MIN'.freeze
15
+ MAXIMUM = 'MAX'.freeze
16
+ MEAN = 'AVG'.freeze
17
+ VARIANCE = 'VAR_POP'.freeze
18
+ STANDARD_DEVIATION = 'STDDEV_POP'.freeze
19
+
20
+ # Visit a count aggregate function
21
+ #
22
+ # @param [Veritas::Aggregate::Count] count
23
+ #
24
+ # @return [#to_s]
25
+ #
26
+ # @api private
27
+ def visit_veritas_aggregate_count(count)
28
+ unary_prefix_operation_sql(COUNT, count)
29
+ end
30
+
31
+ # Visit a sum aggregate function
32
+ #
33
+ # @param [Veritas::Aggregate::Sum] sum
34
+ #
35
+ # @return [#to_s]
36
+ #
37
+ # @api private
38
+ def visit_veritas_aggregate_sum(sum)
39
+ aggregate_function_sql(SUM, sum)
40
+ end
41
+
42
+ # Visit a minimum aggregate function
43
+ #
44
+ # @param [Veritas::Aggregate::Minimum] minimum
45
+ #
46
+ # @return [#to_s]
47
+ #
48
+ # @api private
49
+ def visit_veritas_aggregate_minimum(minimum)
50
+ # TODO: wrap this in a coalesce operation once the default can be made sane
51
+ unary_prefix_operation_sql(MINIMUM, minimum)
52
+ end
53
+
54
+ # Visit a maximum aggregate function
55
+ #
56
+ # @param [Veritas::Aggregate::Maximum] maximum
57
+ #
58
+ # @return [#to_s]
59
+ #
60
+ # @api private
61
+ def visit_veritas_aggregate_maximum(maximum)
62
+ # TODO: wrap this in a coalesce operation once the default can be made sane
63
+ unary_prefix_operation_sql(MAXIMUM, maximum)
64
+ end
65
+
66
+ # Visit a mean aggregate function
67
+ #
68
+ # @param [Veritas::Aggregate::Mean] mean
69
+ #
70
+ # @return [#to_s]
71
+ #
72
+ # @api private
73
+ def visit_veritas_aggregate_mean(mean)
74
+ unary_prefix_operation_sql(MEAN, mean)
75
+ end
76
+
77
+ # Visit a variance aggregate function
78
+ #
79
+ # @param [Veritas::Aggregate::Variance] variance
80
+ #
81
+ # @return [#to_s]
82
+ #
83
+ # @api private
84
+ def visit_veritas_aggregate_variance(variance)
85
+ unary_prefix_operation_sql(VARIANCE, variance)
86
+ end
87
+
88
+ # Visit a standard deviation aggregate function
89
+ #
90
+ # @param [Veritas::Aggregate::StandardDeviation] standard_deviation
91
+ #
92
+ # @return [#to_s]
93
+ #
94
+ # @api private
95
+ def visit_veritas_aggregate_standard_deviation(standard_deviation)
96
+ unary_prefix_operation_sql(STANDARD_DEVIATION, standard_deviation)
97
+ end
98
+
99
+ private
100
+
101
+ # Return the SQL
102
+ #
103
+ # @param [#to_s] operation
104
+ #
105
+ # @param [Veritas::Aggregate] aggregate
106
+ #
107
+ # @return [#to_s]
108
+ #
109
+ # @api private
110
+ def aggregate_function_sql(operation, aggregate)
111
+ default_when_null(
112
+ unary_prefix_operation_sql(operation, aggregate),
113
+ aggregate.finalize(aggregate.default)
114
+ )
115
+ end
116
+
117
+ # Specify a default value when SQL expression evaluates to NULL
118
+ #
119
+ # @param [#to_s] sql
120
+ #
121
+ # @param [Visitable] default
122
+ #
123
+ # @return [#to_s]
124
+ #
125
+ # @api private
126
+ def default_when_null(sql, default)
127
+ "COALESCE (#{sql}, #{dispatch(default)})"
128
+ end
129
+
130
+ end # module Aggregate
131
+ end # module Function
132
+ end # module Generator
133
+ end # module SQL
134
+ end # module Veritas
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ module SQL
5
+ module Generator
6
+ module Function
7
+
8
+ # Generates an SQL statement for a connective
9
+ module Connective
10
+ include Function
11
+
12
+ AND = 'AND'.freeze
13
+ OR = 'OR'.freeze
14
+ NOT = 'NOT'.freeze
15
+
16
+ # Visit an Conjunction connective
17
+ #
18
+ # @param [Function::Connective::Conjunction] conjunction
19
+ #
20
+ # @return [#to_s]
21
+ #
22
+ # @api private
23
+ def visit_veritas_function_connective_conjunction(conjunction)
24
+ Generator.parenthesize!(binary_infix_operation_sql(AND, conjunction))
25
+ end
26
+
27
+ # Visit an Disjunction connective
28
+ #
29
+ # @param [Function::Connective::Disjunction] disjunction
30
+ #
31
+ # @return [#to_s]
32
+ #
33
+ # @api private
34
+ def visit_veritas_function_connective_disjunction(disjunction)
35
+ Generator.parenthesize!(binary_infix_operation_sql(OR, disjunction))
36
+ end
37
+
38
+ # Visit an Negation connective
39
+ #
40
+ # @param [Function::Connective::Negation] negation
41
+ #
42
+ # @return [#to_s]
43
+ #
44
+ # @api private
45
+ def visit_veritas_function_connective_negation(negation)
46
+ unary_prefix_operation_sql(NOT, negation)
47
+ end
48
+
49
+ end # module Connective
50
+ end # module Function
51
+ end # module Generator
52
+ end # module SQL
53
+ end # module Veritas
@@ -0,0 +1,135 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
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_veritas_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_veritas_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_veritas_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_veritas_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_veritas_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_veritas_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_veritas_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_veritas_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_veritas_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_veritas_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 Veritas
@@ -0,0 +1,266 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
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_veritas_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_veritas_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_veritas_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_veritas_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_veritas_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_veritas_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_veritas_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_veritas_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] predicate
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(Veritas::Function::Predicate::GreaterThanOrEqualTo, inclusion, :first)
166
+ right = new_from_enumerable_predicate(Veritas::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(Veritas::Function::Predicate::LessThan, exclusion, :first)
179
+ right = new_from_enumerable_predicate(Veritas::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 Veritas