veritas-sql-generator 0.0.3 → 0.0.4

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