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.
- data/.gemtest +0 -0
- data/.rvmrc +1 -0
- data/.travis.yml +8 -0
- data/Gemfile +20 -10
- data/Guardfile +22 -0
- data/README.rdoc +2 -0
- data/Rakefile +4 -2
- data/TODO +16 -2
- data/config/flay.yml +2 -2
- data/config/flog.yml +1 -1
- data/config/roodi.yml +5 -5
- data/config/site.reek +21 -19
- data/lib/veritas/sql/generator.rb +25 -2
- data/lib/veritas/sql/generator/core_ext/date.rb +20 -0
- data/lib/veritas/sql/generator/core_ext/date_time.rb +45 -0
- data/lib/veritas/sql/generator/direction.rb +3 -1
- data/lib/veritas/sql/generator/function.rb +54 -0
- data/lib/veritas/sql/generator/function/aggregate.rb +134 -0
- data/lib/veritas/sql/generator/function/connective.rb +53 -0
- data/lib/veritas/sql/generator/function/numeric.rb +135 -0
- data/lib/veritas/sql/generator/function/predicate.rb +266 -0
- data/lib/veritas/sql/generator/function/proposition.rb +38 -0
- data/lib/veritas/sql/generator/function/string.rb +29 -0
- data/lib/veritas/sql/generator/identifier.rb +2 -1
- data/lib/veritas/sql/generator/literal.rb +15 -18
- data/lib/veritas/sql/generator/relation.rb +144 -17
- data/lib/veritas/sql/generator/relation/binary.rb +16 -64
- data/lib/veritas/sql/generator/relation/set.rb +30 -22
- data/lib/veritas/sql/generator/relation/unary.rb +131 -78
- data/lib/veritas/sql/generator/version.rb +1 -1
- data/spec/unit/date/iso8601_spec.rb +23 -0
- data/spec/unit/date_time/iso_8601_spec.rb +115 -0
- data/spec/unit/veritas/sql/generator/class_methods/parenthesize_spec.rb +18 -0
- data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_count_spec.rb +16 -0
- data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_maximum_spec.rb +16 -0
- data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_mean_spec.rb +16 -0
- data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_minimum_spec.rb +16 -0
- data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_standard_deviation_spec.rb +16 -0
- data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_sum_spec.rb +16 -0
- data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_variance_spec.rb +16 -0
- data/spec/unit/veritas/sql/generator/function/connective/visit_veritas_function_connective_conjunction_spec.rb +20 -0
- data/spec/unit/veritas/sql/generator/function/connective/visit_veritas_function_connective_disjunction_spec.rb +20 -0
- data/spec/unit/veritas/sql/generator/function/connective/visit_veritas_function_connective_negation_spec.rb +20 -0
- data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_absolute_spec.rb +15 -0
- data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_addition_spec.rb +15 -0
- data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_division_spec.rb +15 -0
- data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_exponentiation_spec.rb +15 -0
- data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_modulo_spec.rb +15 -0
- data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_multiplication_spec.rb +15 -0
- data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_square_root_spec.rb +15 -0
- data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_subtraction_spec.rb +15 -0
- data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_unary_minus_spec.rb +15 -0
- data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_unary_plus_spec.rb +15 -0
- 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
- 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
- data/spec/unit/veritas/sql/generator/function/predicate/visit_veritas_function_predicate_greater_than_or_equal_to_spec.rb +15 -0
- 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
- 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
- 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
- data/spec/unit/veritas/sql/generator/function/predicate/visit_veritas_function_predicate_less_than_or_equal_to_spec.rb +15 -0
- 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
- data/spec/unit/veritas/sql/generator/function/proposition/visit_veritas_function_proposition_contradiction_spec.rb +15 -0
- data/spec/unit/veritas/sql/generator/function/proposition/visit_veritas_function_proposition_tautology_spec.rb +15 -0
- data/spec/unit/veritas/sql/generator/function/string/visit_veritas_function_string_length_spec.rb +15 -0
- data/spec/unit/veritas/sql/generator/literal/class_methods/dup_frozen_spec.rb +2 -2
- data/spec/unit/veritas/sql/generator/relation/binary/base/to_subquery_spec.rb +1 -1
- data/spec/unit/veritas/sql/generator/relation/binary/base/{visit_veritas_base_relation_spec.rb → visit_veritas_relation_base_spec.rb} +3 -3
- data/spec/unit/veritas/sql/generator/relation/binary/to_s_spec.rb +2 -2
- data/spec/unit/veritas/sql/generator/relation/binary/to_subquery_spec.rb +2 -2
- data/spec/unit/veritas/sql/generator/relation/binary/visit_veritas_algebra_join_spec.rb +74 -33
- data/spec/unit/veritas/sql/generator/relation/binary/visit_veritas_algebra_product_spec.rb +63 -19
- data/spec/unit/veritas/sql/generator/relation/class_methods/visit_spec.rb +1 -1
- data/spec/unit/veritas/sql/generator/relation/set/class_methods/normalize_operand_headers_spec.rb +35 -0
- data/spec/unit/veritas/sql/generator/relation/set/to_s_spec.rb +1 -1
- data/spec/unit/veritas/sql/generator/relation/set/to_subquery_spec.rb +4 -4
- data/spec/unit/veritas/sql/generator/relation/set/visit_veritas_algebra_difference_spec.rb +83 -30
- data/spec/unit/veritas/sql/generator/relation/set/visit_veritas_algebra_intersection_spec.rb +80 -30
- data/spec/unit/veritas/sql/generator/relation/set/visit_veritas_algebra_union_spec.rb +80 -30
- data/spec/unit/veritas/sql/generator/relation/to_s_spec.rb +50 -0
- data/spec/unit/veritas/sql/generator/relation/to_subquery_spec.rb +49 -0
- data/spec/unit/veritas/sql/generator/relation/unary/to_s_spec.rb +1 -1
- data/spec/unit/veritas/sql/generator/relation/unary/to_subquery_spec.rb +6 -6
- data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_extension_spec.rb +165 -0
- data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_projection_spec.rb +84 -29
- data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_rename_spec.rb +69 -27
- data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_restriction_spec.rb +64 -22
- data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_summarization_spec.rb +652 -0
- data/spec/unit/veritas/sql/generator/relation/unary/{visit_veritas_base_relation_spec.rb → visit_veritas_relation_base_spec.rb} +4 -4
- data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_relation_operation_limit_spec.rb +60 -20
- data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_relation_operation_offset_spec.rb +60 -20
- data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_relation_operation_order_spec.rb +63 -23
- data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_relation_operation_reverse_spec.rb +60 -20
- data/spec/unit/veritas/sql/generator/relation/visited_spec.rb +1 -1
- data/tasks/metrics/ci.rake +7 -0
- data/tasks/{quality → metrics}/flay.rake +0 -0
- data/tasks/{quality → metrics}/flog.rake +0 -0
- data/tasks/{quality → metrics}/heckle.rake +1 -0
- data/tasks/{quality → metrics}/metric_fu.rake +3 -0
- data/tasks/{quality → metrics}/reek.rake +0 -0
- data/tasks/{quality → metrics}/roodi.rake +0 -0
- data/tasks/{quality → metrics}/yardstick.rake +0 -0
- data/tasks/spec.rake +1 -0
- data/veritas-sql-generator.gemspec +82 -114
- metadata +137 -125
- data/lib/veritas/base_relation.rb +0 -36
- data/lib/veritas/sql/generator/logic.rb +0 -349
- data/spec/unit/veritas/base_relation/name_spec.rb +0 -45
- data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_connective_conjunction_spec.rb +0 -16
- data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_connective_disjunction_spec.rb +0 -16
- data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_connective_negation_spec.rb +0 -16
- data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_predicate_greater_than_or_equal_to_spec.rb +0 -15
- data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_predicate_less_than_or_equal_to_spec.rb +0 -15
- data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_proposition_contradiction_spec.rb +0 -15
- data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_proposition_tautology_spec.rb +0 -15
- data/spec/unit/veritas/sql/generator/relation/binary/class_methods/subquery_spec.rb +0 -42
- data/spec/unit/veritas/sql/generator/relation/class_methods/subquery_spec.rb +0 -33
- data/tasks/quality/ci.rake +0 -2
@@ -12,6 +12,27 @@ module Veritas
|
|
12
12
|
INTERSECTION = 'INTERSECT'.freeze
|
13
13
|
UNION = 'UNION'.freeze
|
14
14
|
|
15
|
+
# Normalize the headers of the operands
|
16
|
+
#
|
17
|
+
# This is necessary to make sure the columns are in the correct
|
18
|
+
# order when generating SQL.
|
19
|
+
#
|
20
|
+
# @param [Relation::Operation::Set] relation
|
21
|
+
#
|
22
|
+
# @return [Relation::Operation::Set]
|
23
|
+
#
|
24
|
+
# @api private
|
25
|
+
def self.normalize_operand_headers(relation)
|
26
|
+
left = relation.left
|
27
|
+
right = relation.right
|
28
|
+
left_header = left.header
|
29
|
+
if left_header.to_a != right.header.to_a
|
30
|
+
relation.class.new(left, right.project(left_header))
|
31
|
+
else
|
32
|
+
relation
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
15
36
|
# Visit a Union
|
16
37
|
#
|
17
38
|
# @param [Algebra::Union] union
|
@@ -54,39 +75,26 @@ module Veritas
|
|
54
75
|
self
|
55
76
|
end
|
56
77
|
|
57
|
-
|
58
|
-
#
|
59
|
-
# @example
|
60
|
-
# sql = set_relation.to_s
|
61
|
-
#
|
62
|
-
# @return [#to_s]
|
63
|
-
#
|
64
|
-
# @api public
|
65
|
-
def to_s
|
66
|
-
generate_sql(:to_s)
|
67
|
-
end
|
78
|
+
private
|
68
79
|
|
69
|
-
#
|
80
|
+
# Generate the SQL using the supplied method
|
70
81
|
#
|
71
82
|
# @return [#to_s]
|
72
83
|
#
|
73
84
|
# @api private
|
74
|
-
def
|
75
|
-
|
85
|
+
def generate_sql(*)
|
86
|
+
"(#{@left}) #{@operation} (#{@right})"
|
76
87
|
end
|
77
88
|
|
78
|
-
|
79
|
-
|
80
|
-
# Generate the SQL using the supplied method
|
89
|
+
# Set the operands from the relation
|
81
90
|
#
|
82
|
-
# @param [
|
91
|
+
# @param [Relation::Operation::Set] relation
|
83
92
|
#
|
84
|
-
# @return [
|
93
|
+
# @return [undefined]
|
85
94
|
#
|
86
95
|
# @api private
|
87
|
-
def
|
88
|
-
|
89
|
-
"(#{@left.send(method)}) #{@operation} (#{@right.send(method)})"
|
96
|
+
def set_operands(relation)
|
97
|
+
super self.class.normalize_operand_headers(relation)
|
90
98
|
end
|
91
99
|
|
92
100
|
# Generates an SQL statement for base relation set operands
|
@@ -8,19 +8,30 @@ module Veritas
|
|
8
8
|
# Generates an SQL statement for a unary relation
|
9
9
|
class Unary < Relation
|
10
10
|
extend Aliasable
|
11
|
-
include Direction,
|
11
|
+
include Direction,
|
12
|
+
Literal,
|
13
|
+
Function::Aggregate,
|
14
|
+
Function::Connective,
|
15
|
+
Function::Predicate,
|
16
|
+
Function::Proposition,
|
17
|
+
Function::String,
|
18
|
+
Function::Numeric
|
12
19
|
|
13
20
|
inheritable_alias(:visit_veritas_relation_operation_reverse => :visit_veritas_relation_operation_order)
|
14
21
|
|
15
|
-
DISTINCT
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
Algebra::
|
22
|
+
DISTINCT = 'DISTINCT '.freeze
|
23
|
+
NO_ROWS = ' HAVING FALSE'.freeze
|
24
|
+
ANY_ROWS = ' HAVING COUNT (*) > 0'
|
25
|
+
COLLAPSIBLE = {
|
26
|
+
Algebra::Summarization => Set[ ].freeze,
|
27
|
+
Algebra::Projection => Set[ Algebra::Projection, Algebra::Restriction, ].freeze,
|
28
|
+
Algebra::Extension => Set[ Algebra::Projection, Algebra::Restriction, Veritas::Relation::Operation::Order, Veritas::Relation::Operation::Reverse, Veritas::Relation::Operation::Offset, Veritas::Relation::Operation::Limit ].freeze,
|
29
|
+
Algebra::Rename => Set[ Algebra::Projection, Algebra::Restriction, Veritas::Relation::Operation::Order, Veritas::Relation::Operation::Reverse, Veritas::Relation::Operation::Offset, Veritas::Relation::Operation::Limit ].freeze,
|
30
|
+
Algebra::Restriction => Set[ Algebra::Projection, Veritas::Relation::Operation::Order, Veritas::Relation::Operation::Reverse, ].freeze,
|
31
|
+
Veritas::Relation::Operation::Order => Set[ Algebra::Projection, Algebra::Extension, Algebra::Rename, Algebra::Restriction, Algebra::Summarization, Veritas::Relation::Operation::Order, Veritas::Relation::Operation::Reverse, ].freeze,
|
32
|
+
Veritas::Relation::Operation::Reverse => Set[ Algebra::Projection, Algebra::Extension, Algebra::Rename, Algebra::Restriction, Algebra::Summarization, Veritas::Relation::Operation::Order, Veritas::Relation::Operation::Reverse, ].freeze,
|
33
|
+
Veritas::Relation::Operation::Offset => Set[ Algebra::Projection, Algebra::Extension, Algebra::Rename, Algebra::Restriction, Algebra::Summarization, Veritas::Relation::Operation::Order, Veritas::Relation::Operation::Reverse, ].freeze,
|
34
|
+
Veritas::Relation::Operation::Limit => Set[ Algebra::Projection, Algebra::Extension, Algebra::Rename, Algebra::Restriction, Algebra::Summarization, Veritas::Relation::Operation::Order, Veritas::Relation::Operation::Reverse, Veritas::Relation::Operation::Offset, ].freeze,
|
24
35
|
}.freeze
|
25
36
|
|
26
37
|
# Initialize a Unary relation SQL generator
|
@@ -35,14 +46,15 @@ module Veritas
|
|
35
46
|
|
36
47
|
# Visit a Base Relation
|
37
48
|
#
|
38
|
-
# @param [
|
49
|
+
# @param [Relation::Base] base_relation
|
39
50
|
#
|
40
51
|
# @return [self]
|
41
52
|
#
|
42
53
|
# @api private
|
43
|
-
def
|
54
|
+
def visit_veritas_relation_base(base_relation)
|
44
55
|
@name = base_relation.name
|
45
56
|
@from = visit_identifier(@name)
|
57
|
+
@header = base_relation.header
|
46
58
|
@columns = columns_for(base_relation)
|
47
59
|
self
|
48
60
|
end
|
@@ -57,11 +69,28 @@ module Veritas
|
|
57
69
|
def visit_veritas_algebra_projection(projection)
|
58
70
|
@from = subquery_for(projection)
|
59
71
|
@distinct = DISTINCT
|
72
|
+
@header = projection.header
|
60
73
|
@columns = columns_for(projection)
|
61
74
|
scope_query(projection)
|
62
75
|
self
|
63
76
|
end
|
64
77
|
|
78
|
+
# Visit an Extension
|
79
|
+
#
|
80
|
+
# @param [Algebra::Extension] extension
|
81
|
+
#
|
82
|
+
# @return [self]
|
83
|
+
#
|
84
|
+
# @api private
|
85
|
+
def visit_veritas_algebra_extension(extension)
|
86
|
+
@from = subquery_for(extension)
|
87
|
+
@header = extension.header
|
88
|
+
@columns ||= columns_for(extension.operand)
|
89
|
+
add_extensions(extension.extensions)
|
90
|
+
scope_query(extension)
|
91
|
+
self
|
92
|
+
end
|
93
|
+
|
65
94
|
# Visit a Rename
|
66
95
|
#
|
67
96
|
# @param [Algebra::Rename] rename
|
@@ -71,6 +100,7 @@ module Veritas
|
|
71
100
|
# @api private
|
72
101
|
def visit_veritas_algebra_rename(rename)
|
73
102
|
@from = subquery_for(rename)
|
103
|
+
@header = rename.header
|
74
104
|
@columns = columns_for(rename.operand, rename.aliases.to_hash)
|
75
105
|
scope_query(rename)
|
76
106
|
self
|
@@ -85,12 +115,32 @@ module Veritas
|
|
85
115
|
# @api private
|
86
116
|
def visit_veritas_algebra_restriction(restriction)
|
87
117
|
@from = subquery_for(restriction)
|
88
|
-
@where = dispatch(restriction.predicate)
|
118
|
+
@where = " WHERE #{dispatch(restriction.predicate)}"
|
119
|
+
@header = restriction.header
|
89
120
|
@columns ||= columns_for(restriction)
|
90
121
|
scope_query(restriction)
|
91
122
|
self
|
92
123
|
end
|
93
124
|
|
125
|
+
# Visit a Summarization
|
126
|
+
#
|
127
|
+
# @param [Algebra::Summarization] summarization
|
128
|
+
#
|
129
|
+
# @return [self]
|
130
|
+
#
|
131
|
+
# @api private
|
132
|
+
def visit_veritas_algebra_summarization(summarization)
|
133
|
+
summarize_per = summarization.summarize_per
|
134
|
+
@from = subquery_for(summarization)
|
135
|
+
@header = summarization.header
|
136
|
+
@columns = columns_for(summarize_per)
|
137
|
+
summarize_per(summarize_per)
|
138
|
+
group_by_columns
|
139
|
+
add_extensions(summarization.summarizers)
|
140
|
+
scope_query(summarization)
|
141
|
+
self
|
142
|
+
end
|
143
|
+
|
94
144
|
# Visit an Order
|
95
145
|
#
|
96
146
|
# @param [Relation::Operation::Order] order
|
@@ -100,7 +150,8 @@ module Veritas
|
|
100
150
|
# @api private
|
101
151
|
def visit_veritas_relation_operation_order(order)
|
102
152
|
@from = subquery_for(order)
|
103
|
-
@order = order_for(order.directions)
|
153
|
+
@order = " ORDER BY #{order_for(order.directions)}"
|
154
|
+
@header = order.header
|
104
155
|
@columns ||= columns_for(order)
|
105
156
|
scope_query(order)
|
106
157
|
self
|
@@ -115,7 +166,8 @@ module Veritas
|
|
115
166
|
# @api private
|
116
167
|
def visit_veritas_relation_operation_limit(limit)
|
117
168
|
@from = subquery_for(limit)
|
118
|
-
@limit = limit.limit
|
169
|
+
@limit = " LIMIT #{limit.limit}"
|
170
|
+
@header = limit.header
|
119
171
|
@columns ||= columns_for(limit)
|
120
172
|
scope_query(limit)
|
121
173
|
self
|
@@ -130,108 +182,117 @@ module Veritas
|
|
130
182
|
# @api private
|
131
183
|
def visit_veritas_relation_operation_offset(offset)
|
132
184
|
@from = subquery_for(offset)
|
133
|
-
@offset = offset.offset
|
185
|
+
@offset = " OFFSET #{offset.offset}"
|
186
|
+
@header = offset.header
|
134
187
|
@columns ||= columns_for(offset)
|
135
188
|
scope_query(offset)
|
136
189
|
self
|
137
190
|
end
|
138
191
|
|
139
|
-
|
192
|
+
private
|
193
|
+
|
194
|
+
# Generate the SQL using the supplied columns
|
140
195
|
#
|
141
|
-
# @
|
142
|
-
# sql = unary_relation.to_s
|
196
|
+
# @param [String] columns
|
143
197
|
#
|
144
198
|
# @return [#to_s]
|
145
199
|
#
|
146
|
-
# @api
|
147
|
-
def
|
148
|
-
|
200
|
+
# @api private
|
201
|
+
def generate_sql(columns)
|
202
|
+
[ "SELECT #{columns} FROM #{@from}", @where, @group, @having, @order, @limit, @offset ].join
|
149
203
|
end
|
150
204
|
|
151
|
-
# Return the
|
205
|
+
# Return the columns to use in a query
|
152
206
|
#
|
153
207
|
# @return [#to_s]
|
154
208
|
#
|
155
209
|
# @api private
|
156
|
-
def
|
157
|
-
|
210
|
+
def query_columns
|
211
|
+
explicit_columns
|
158
212
|
end
|
159
213
|
|
160
|
-
|
161
|
-
|
162
|
-
# Generate the SQL using the supplied columns
|
163
|
-
#
|
164
|
-
# @param [String] columns
|
214
|
+
# Return the columns to use in a subquery
|
165
215
|
#
|
166
216
|
# @return [#to_s]
|
167
217
|
#
|
168
218
|
# @api private
|
169
|
-
def
|
170
|
-
|
171
|
-
sql = "SELECT #{@distinct}#{columns} FROM #{@from}"
|
172
|
-
sql << " WHERE #{@where}" if @where
|
173
|
-
sql << " ORDER BY #{@order}" if @order
|
174
|
-
sql << " LIMIT #{@limit}" if @limit
|
175
|
-
sql << " OFFSET #{@offset}" if @offset
|
176
|
-
sql
|
219
|
+
def subquery_columns
|
220
|
+
explicit_columns_in_subquery? ? explicit_columns : super
|
177
221
|
end
|
178
222
|
|
179
|
-
#
|
223
|
+
# Test if the subquery should use "*" and not specify columns explicitly
|
180
224
|
#
|
181
|
-
# @
|
225
|
+
# @return [Boolean]
|
182
226
|
#
|
183
|
-
# @
|
184
|
-
|
227
|
+
# @api private
|
228
|
+
def explicit_columns_in_subquery?
|
229
|
+
@scope.include?(Algebra::Projection) ||
|
230
|
+
@scope.include?(Algebra::Rename) ||
|
231
|
+
@scope.include?(Algebra::Summarization)
|
232
|
+
end
|
233
|
+
|
234
|
+
# Return a list of columns for ordering
|
235
|
+
#
|
236
|
+
# @param [DirectionSet] directions
|
185
237
|
#
|
186
238
|
# @return [#to_s]
|
187
239
|
#
|
188
240
|
# @api private
|
189
|
-
def
|
190
|
-
|
241
|
+
def order_for(directions)
|
242
|
+
directions.map { |direction| dispatch(direction) }.join(SEPARATOR)
|
191
243
|
end
|
192
244
|
|
193
|
-
#
|
245
|
+
# Summarize the operand over the provided relation
|
194
246
|
#
|
195
|
-
# @param [
|
196
|
-
#
|
197
|
-
# @param [#[]] aliases
|
198
|
-
# aliases for the columns
|
247
|
+
# @param [Relation] relation
|
199
248
|
#
|
200
|
-
# @return [
|
249
|
+
# @return [undefined]
|
201
250
|
#
|
202
251
|
# @api private
|
203
|
-
def
|
204
|
-
|
205
|
-
|
206
|
-
|
252
|
+
def summarize_per(relation)
|
253
|
+
return if relation.eql?(TABLE_DEE)
|
254
|
+
|
255
|
+
if relation.eql?(TABLE_DUM) then summarize_per_table_dum
|
256
|
+
elsif (generator = Binary.visit(relation)).name.eql?(name) then summarize_per_subset
|
207
257
|
else
|
208
|
-
|
258
|
+
summarize_per_relation(generator)
|
209
259
|
end
|
210
260
|
end
|
211
261
|
|
212
|
-
#
|
262
|
+
# Summarize the operand using table dee
|
213
263
|
#
|
214
|
-
# @
|
264
|
+
# @return [undefined]
|
215
265
|
#
|
216
|
-
# @
|
217
|
-
|
266
|
+
# @api private
|
267
|
+
def summarize_per_table_dum
|
268
|
+
@having = NO_ROWS
|
269
|
+
end
|
270
|
+
|
271
|
+
# Summarize the operand using a subset
|
218
272
|
#
|
219
|
-
# @return [
|
273
|
+
# @return [undefined]
|
220
274
|
#
|
221
275
|
# @api private
|
222
|
-
def
|
223
|
-
|
276
|
+
def summarize_per_subset
|
277
|
+
@having = ANY_ROWS
|
224
278
|
end
|
225
279
|
|
226
|
-
#
|
280
|
+
# Summarize the operand using another relation
|
227
281
|
#
|
228
|
-
# @
|
282
|
+
# @return [undefined]
|
229
283
|
#
|
230
|
-
# @
|
284
|
+
# @api private
|
285
|
+
def summarize_per_relation(generator)
|
286
|
+
@from = "#{generator.to_subquery} AS #{visit_identifier(generator.name)} NATURAL LEFT JOIN #{@from}"
|
287
|
+
end
|
288
|
+
|
289
|
+
# Group by the columns
|
290
|
+
#
|
291
|
+
# @return [undefined]
|
231
292
|
#
|
232
293
|
# @api private
|
233
|
-
def
|
234
|
-
|
294
|
+
def group_by_columns
|
295
|
+
@group = " GROUP BY #{column_list_for(@columns)}" if @columns.any?
|
235
296
|
end
|
236
297
|
|
237
298
|
# Return an expression that can be used for the FROM
|
@@ -262,15 +323,6 @@ module Veritas
|
|
262
323
|
@scope << operand.class
|
263
324
|
end
|
264
325
|
|
265
|
-
# Test if the query should use "*" and not specify columns explicitly
|
266
|
-
#
|
267
|
-
# @return [Boolean]
|
268
|
-
#
|
269
|
-
# @api private
|
270
|
-
def all_columns?
|
271
|
-
!@scope.include?(Algebra::Projection) && !@scope.include?(Algebra::Rename)
|
272
|
-
end
|
273
|
-
|
274
326
|
# Test if the relation should be collapsed
|
275
327
|
#
|
276
328
|
# @param [Relation] relation
|
@@ -290,7 +342,7 @@ module Veritas
|
|
290
342
|
#
|
291
343
|
# @api private
|
292
344
|
def aliased_subquery(subquery)
|
293
|
-
|
345
|
+
"#{subquery.to_subquery} AS #{visit_identifier(subquery.name)}"
|
294
346
|
ensure
|
295
347
|
reset_query_state
|
296
348
|
end
|
@@ -316,7 +368,8 @@ module Veritas
|
|
316
368
|
# @api private
|
317
369
|
def reset_query_state
|
318
370
|
@scope.clear
|
319
|
-
@
|
371
|
+
@extensions.clear
|
372
|
+
@distinct = @columns = @where = @order = @limit = @offset = @group = @having = nil
|
320
373
|
end
|
321
374
|
|
322
375
|
end # class Unary
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Date, '#iso8601' do
|
6
|
+
subject { object.iso8601 }
|
7
|
+
|
8
|
+
context 'when the date is frozen' do
|
9
|
+
let(:object) { described_class.new(2010, 12, 31).freeze }
|
10
|
+
|
11
|
+
it { should respond_to(:to_s) }
|
12
|
+
|
13
|
+
it { should == '2010-12-31' }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when the date is not frozen' do
|
17
|
+
let(:object) { described_class.new(2010, 12, 31) }
|
18
|
+
|
19
|
+
it { should respond_to(:to_s) }
|
20
|
+
|
21
|
+
it { should == '2010-12-31' }
|
22
|
+
end
|
23
|
+
end
|