arel_extensions 1.2.1 → 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/arel_extensions/attributes.rb +9 -9
- data/lib/arel_extensions/math.rb +4 -2
- data/lib/arel_extensions/nodes/date_diff.rb +43 -10
- data/lib/arel_extensions/nodes/duration.rb +3 -0
- data/lib/arel_extensions/nodes/function.rb +3 -0
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +39 -19
- data/lib/arel_extensions/visitors/mysql.rb +39 -11
- data/lib/arel_extensions/visitors/oracle.rb +48 -18
- data/lib/arel_extensions/visitors/postgresql.rb +38 -12
- data/lib/arel_extensions.rb +4 -0
- data/test/with_ar/all_agnostic_test.rb +41 -14
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc05c41fcdcdc0c411f00c62947f80e1004791ae
|
4
|
+
data.tar.gz: 9d8ea2d6dfc47f8268e0eee6fd974fceb2a700e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab845f8bd4ad51383c2858542183aedc38cbc1a56158249678fe6f89e5d0aae4b036710fc72d4f5c1b95c33bad430ffbc5844964b31730206c541061cffa1e5f
|
7
|
+
data.tar.gz: c3bce90a322ffadcb309f2e183ef4c323bca7ee70c11d5ec75e12b6e1ad0d409757fda40826ee9f5645bb64eaa39063d74b61ac82f8ba097ac2a677ed25748ce
|
@@ -8,17 +8,17 @@ require 'arel_extensions/predications'
|
|
8
8
|
|
9
9
|
module ArelExtensions
|
10
10
|
module Attributes
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
include ArelExtensions::Math
|
12
|
+
include ArelExtensions::Comparators
|
13
|
+
include ArelExtensions::DateDuration
|
14
|
+
include ArelExtensions::MathFunctions
|
15
|
+
include ArelExtensions::NullFunctions
|
16
|
+
include ArelExtensions::StringFunctions
|
17
|
+
include ArelExtensions::Predications
|
18
18
|
|
19
|
-
|
19
|
+
def ==(other)
|
20
20
|
Arel::Nodes::Equality.new self, Arel::Nodes.build_quoted(other, self)
|
21
|
-
|
21
|
+
end
|
22
22
|
|
23
23
|
def !=(other)
|
24
24
|
Arel::Nodes::NotEqual.new self, Arel::Nodes.build_quoted(other, self)
|
data/lib/arel_extensions/math.rb
CHANGED
@@ -101,7 +101,7 @@ module ArelExtensions
|
|
101
101
|
begin
|
102
102
|
col2 = Arel::Table.engine.connection.schema_cache.columns_hash(other.relation.table_name)[other.name.to_s]
|
103
103
|
rescue Exception
|
104
|
-
|
104
|
+
col2 = nil
|
105
105
|
end
|
106
106
|
if (!col2) #if the column doesn't exist in the database
|
107
107
|
ArelExtensions::Nodes::DateSub.new [self, other]
|
@@ -115,8 +115,10 @@ module ArelExtensions
|
|
115
115
|
end
|
116
116
|
when Arel::Nodes::Node, DateTime, Time, String, Date
|
117
117
|
ArelExtensions::Nodes::DateDiff.new [self, other]
|
118
|
-
when Integer
|
118
|
+
when ArelExtensions::Nodes::Duration, Integer
|
119
119
|
ArelExtensions::Nodes::DateSub.new [self, other]
|
120
|
+
else # ActiveSupport::Duration
|
121
|
+
ArelExtensions::Nodes::DateAdd.new [self, -other]
|
120
122
|
end
|
121
123
|
else
|
122
124
|
case other
|
@@ -66,7 +66,12 @@ module ArelExtensions
|
|
66
66
|
Arel.sql('INTERVAL %s' % v.inspect.sub(/s\Z/, ''))
|
67
67
|
end
|
68
68
|
else
|
69
|
-
v
|
69
|
+
if ArelExtensions::Nodes::Duration === v
|
70
|
+
v.with_interval = true
|
71
|
+
v
|
72
|
+
else
|
73
|
+
v
|
74
|
+
end
|
70
75
|
end
|
71
76
|
end
|
72
77
|
|
@@ -79,20 +84,30 @@ module ArelExtensions
|
|
79
84
|
Arel.sql("INTERVAL '%s'" % v.inspect.sub(/s\Z/, '').upcase)
|
80
85
|
end
|
81
86
|
else
|
82
|
-
|
87
|
+
if ArelExtensions::Nodes::Duration === v
|
88
|
+
v.with_interval = true
|
89
|
+
v
|
90
|
+
else
|
91
|
+
v
|
92
|
+
end
|
83
93
|
end
|
84
94
|
end
|
85
95
|
|
86
96
|
def oracle_value(v = nil)
|
87
97
|
v ||= self.expressions.last
|
88
98
|
if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v
|
89
|
-
if @date_type == :
|
90
|
-
Arel.sql("INTERVAL '
|
91
|
-
|
92
|
-
Arel.sql("INTERVAL '
|
99
|
+
if @date_type == :ruby_date
|
100
|
+
Arel.sql("(INTERVAL '1' DAY) * %s" % v.inspect.to_i )
|
101
|
+
else
|
102
|
+
Arel.sql("(INTERVAL '1' SECOND) * %s" % v.to_i)
|
93
103
|
end
|
94
104
|
else
|
95
|
-
v
|
105
|
+
if ArelExtensions::Nodes::Duration === v
|
106
|
+
v.with_interval = true
|
107
|
+
v
|
108
|
+
else
|
109
|
+
v
|
110
|
+
end
|
96
111
|
end
|
97
112
|
end
|
98
113
|
|
@@ -100,7 +115,7 @@ module ArelExtensions
|
|
100
115
|
v ||= self.expressions.last
|
101
116
|
if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v
|
102
117
|
if @date_type == :date
|
103
|
-
v.
|
118
|
+
v.to_i / (24*3600)
|
104
119
|
elsif @date_type == :datetime
|
105
120
|
v.to_i
|
106
121
|
end
|
@@ -118,7 +133,21 @@ module ArelExtensions
|
|
118
133
|
Arel.sql('second')
|
119
134
|
end
|
120
135
|
else
|
121
|
-
v
|
136
|
+
if ArelExtensions::Nodes::Duration === v
|
137
|
+
v.with_interval = true
|
138
|
+
case v.left
|
139
|
+
when 'd','m','y'
|
140
|
+
Arel.sql('day')
|
141
|
+
when 'h','mn','s'
|
142
|
+
Arel.sql('second')
|
143
|
+
when /i\z/
|
144
|
+
Arel.sql(Arel::Visitors::MSSQL::DATE_MAPPING[v.left[0..-2]])
|
145
|
+
else
|
146
|
+
Arel.sql(Arel::Visitors::MSSQL::DATE_MAPPING[v.left])
|
147
|
+
end
|
148
|
+
else
|
149
|
+
nil
|
150
|
+
end
|
122
151
|
end
|
123
152
|
end
|
124
153
|
|
@@ -153,7 +182,11 @@ module ArelExtensions
|
|
153
182
|
when String
|
154
183
|
object.to_i
|
155
184
|
else
|
156
|
-
|
185
|
+
if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === object
|
186
|
+
object.to_i
|
187
|
+
else
|
188
|
+
raise(ArgumentError, "#{object.class} can not be converted to Number")
|
189
|
+
end
|
157
190
|
end
|
158
191
|
end
|
159
192
|
|
@@ -3,10 +3,13 @@ module ArelExtensions
|
|
3
3
|
class Duration < Function
|
4
4
|
RETURN_TYPE = :number
|
5
5
|
|
6
|
+
attr_accessor :with_interval
|
7
|
+
|
6
8
|
def initialize left, right, aliaz = nil
|
7
9
|
tab = Array.new
|
8
10
|
tab << left
|
9
11
|
tab << right
|
12
|
+
@with_interval = left.end_with?('i')
|
10
13
|
super(tab, aliaz)
|
11
14
|
end
|
12
15
|
|
@@ -84,23 +84,38 @@ module ArelExtensions
|
|
84
84
|
end
|
85
85
|
|
86
86
|
|
87
|
+
|
87
88
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
89
|
+
if o.right_node_type == :ruby_date || o.right_node_type == :ruby_time || o.right_node_type == :date || o.right_node_type == :datetime || o.right_node_type == :time
|
90
|
+
collector << if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
91
|
+
'DATEDIFF(second'
|
92
|
+
else
|
93
|
+
'DATEDIFF(day'
|
94
|
+
end
|
95
|
+
collector << Arel::Visitors::MSSQL::COMMA
|
96
|
+
collector = visit o.right, collector
|
97
|
+
collector << Arel::Visitors::MSSQL::COMMA
|
98
|
+
collector = visit o.left, collector
|
99
|
+
collector << ')'
|
100
|
+
else
|
101
|
+
da = ArelExtensions::Nodes::DateAdd.new([])
|
102
|
+
collector << "DATEADD("
|
103
|
+
collector = visit da.mssql_datepart(o.right), collector
|
104
|
+
collector << Arel::Visitors::MSSQL::COMMA
|
105
|
+
collector << "-("
|
106
|
+
collector = visit da.mssql_value(o.right), collector
|
107
|
+
collector << ")"
|
108
|
+
collector << Arel::Visitors::MSSQL::COMMA
|
109
|
+
collector = visit o.left, collector
|
110
|
+
collector << ")"
|
111
|
+
collector
|
112
|
+
end
|
98
113
|
collector
|
99
114
|
end
|
100
115
|
|
101
116
|
def visit_ArelExtensions_Nodes_DateAdd o, collector
|
102
117
|
collector << "DATEADD("
|
103
|
-
collector
|
118
|
+
collector = visit o.mssql_datepart(o.right), collector
|
104
119
|
collector << Arel::Visitors::MSSQL::COMMA
|
105
120
|
collector = visit o.mssql_value(o.right), collector
|
106
121
|
collector << Arel::Visitors::MSSQL::COMMA
|
@@ -110,14 +125,19 @@ module ArelExtensions
|
|
110
125
|
end
|
111
126
|
|
112
127
|
def visit_ArelExtensions_Nodes_Duration o, collector
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
128
|
+
if o.with_interval && o.left.end_with?('i')
|
129
|
+
collector = visit o.right, collector
|
130
|
+
else
|
131
|
+
left = o.left.end_with?('i') ? o.left[0..-2] : o.left
|
132
|
+
conv = ['h', 'mn', 's'].include?(o.left)
|
133
|
+
collector << 'DATEPART('
|
134
|
+
collector << Arel::Visitors::MSSQL::DATE_MAPPING[left]
|
135
|
+
collector << Arel::Visitors::MSSQL::COMMA
|
136
|
+
collector << 'CONVERT(datetime,' if conv
|
137
|
+
collector = visit o.right, collector
|
138
|
+
collector << ')' if conv
|
139
|
+
collector << ")"
|
140
|
+
end
|
121
141
|
collector
|
122
142
|
end
|
123
143
|
|
@@ -216,15 +216,31 @@ module ArelExtensions
|
|
216
216
|
end
|
217
217
|
|
218
218
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
219
|
+
if o.right_node_type == :ruby_date || o.right_node_type == :ruby_time || o.right_node_type == :date || o.right_node_type == :datetime || o.right_node_type == :time
|
220
|
+
collector << if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
221
|
+
'TIMESTAMPDIFF(SECOND, '
|
222
|
+
else
|
223
|
+
'DATEDIFF('
|
224
|
+
end
|
225
|
+
collector = visit o.right, collector
|
226
|
+
collector << Arel::Visitors::MySQL::COMMA
|
227
|
+
collector = visit o.left, collector
|
228
|
+
collector << ")"
|
229
|
+
else
|
230
|
+
collector << '('
|
231
|
+
collector = visit o.left, collector
|
232
|
+
collector << ' - '
|
233
|
+
if o.right.is_a?(ArelExtensions::Nodes::Duration)
|
234
|
+
o.right.with_interval = true
|
235
|
+
collector = visit o.right, collector
|
236
|
+
else
|
237
|
+
collector << '('
|
238
|
+
collector = visit o.right, collector
|
239
|
+
collector << ')'
|
240
|
+
end
|
241
|
+
collector << ')'
|
242
|
+
collector
|
243
|
+
end
|
228
244
|
collector
|
229
245
|
end
|
230
246
|
|
@@ -244,9 +260,23 @@ module ArelExtensions
|
|
244
260
|
collector = visit o.right, collector
|
245
261
|
collector << ") + 1) % 7"
|
246
262
|
else
|
263
|
+
if o.with_interval
|
264
|
+
case o.left
|
265
|
+
when 'd','m','y'
|
266
|
+
interval = 'DAY'
|
267
|
+
when 'h','mn','s'
|
268
|
+
interval = 'SECOND'
|
269
|
+
when /i\z/
|
270
|
+
interval = Arel::Visitors::MySQL::DATE_MAPPING[o.left[0..-2]]
|
271
|
+
else
|
272
|
+
interval = nil
|
273
|
+
end
|
274
|
+
end
|
275
|
+
collector << " INTERVAL " if o.with_interval && interval
|
247
276
|
collector << "#{Arel::Visitors::MySQL::DATE_MAPPING[o.left]}("
|
248
277
|
collector = visit o.right, collector
|
249
278
|
collector << ")"
|
279
|
+
collector << " #{interval} " if o.with_interval && interval
|
250
280
|
end
|
251
281
|
collector
|
252
282
|
end
|
@@ -298,8 +328,6 @@ module ArelExtensions
|
|
298
328
|
as_attr = Arel::Nodes::SqlLiteral.new('datetime')
|
299
329
|
when :date
|
300
330
|
as_attr = Arel::Nodes::SqlLiteral.new('date')
|
301
|
-
when :time
|
302
|
-
as_attr = Arel::Nodes::SqlLiteral.new('time')
|
303
331
|
when :binary
|
304
332
|
as_attr = Arel::Nodes::SqlLiteral.new('binary')
|
305
333
|
else
|
@@ -180,26 +180,38 @@ module ArelExtensions
|
|
180
180
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
181
181
|
lc = o.left_node_type == :ruby_date || o.left_node_type == :ruby_time
|
182
182
|
rc = o.right_node_type == :ruby_date || o.right_node_type == :ruby_time
|
183
|
-
|
184
|
-
|
185
|
-
collector = visit o.left, collector
|
186
|
-
collector << ')' if lc
|
187
|
-
collector << " - "
|
188
|
-
collector << 'TO_DATE(' if rc
|
189
|
-
collector = visit o.right, collector
|
190
|
-
collector << ')' if rc
|
191
|
-
collector << ')'
|
192
|
-
if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
193
|
-
collector << ' * (CASE WHEN (TRUNC('
|
183
|
+
if rc || o.right_node_type == :date || o.right_node_type == :datetime || o.right_node_type == :time
|
184
|
+
collector << '('
|
194
185
|
collector << 'TO_DATE(' if lc
|
195
186
|
collector = visit o.left, collector
|
196
187
|
collector << ')' if lc
|
197
|
-
collector <<
|
198
|
-
collector <<
|
199
|
-
collector
|
188
|
+
collector << " - "
|
189
|
+
collector << 'TO_DATE(' if rc
|
190
|
+
collector = visit o.right, collector
|
191
|
+
collector << ')' if rc
|
192
|
+
collector << ')'
|
193
|
+
if (o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time)
|
194
|
+
collector << ' * (CASE WHEN (TRUNC('
|
195
|
+
collector << 'TO_DATE(' if lc
|
196
|
+
collector = visit o.left, collector
|
197
|
+
collector << ')' if lc
|
198
|
+
collector << Arel::Visitors::Oracle::COMMA
|
199
|
+
collector << "'DDD') = "
|
200
|
+
collector << 'TO_DATE(' if lc
|
201
|
+
collector = visit o.left, collector
|
202
|
+
collector << ')' if lc
|
203
|
+
collector << ') THEN 1 ELSE 86400 END)' # converts to seconds
|
204
|
+
end
|
205
|
+
else
|
206
|
+
collector << '('
|
200
207
|
collector = visit o.left, collector
|
201
|
-
collector << '
|
202
|
-
|
208
|
+
collector << ' - ('
|
209
|
+
if o.right.is_a?(ArelExtensions::Nodes::Duration)
|
210
|
+
o.right.with_interval = true
|
211
|
+
end
|
212
|
+
collector = visit o.right, collector
|
213
|
+
collector << '))'
|
214
|
+
collector
|
203
215
|
end
|
204
216
|
collector
|
205
217
|
end
|
@@ -212,10 +224,28 @@ module ArelExtensions
|
|
212
224
|
collector << Arel::Visitors::Oracle::COMMA
|
213
225
|
collector = visit Arel::Nodes.build_quoted(Arel::Visitors::Oracle::DATE_MAPPING[o.left]), collector
|
214
226
|
else
|
227
|
+
right = case o.left
|
228
|
+
when 'd','m','y'
|
229
|
+
interval = 'DAY'
|
230
|
+
o.right.cast(:date)
|
231
|
+
when 'h','mn','s'
|
232
|
+
interval = 'SECOND'
|
233
|
+
o.right.cast(:datetime)
|
234
|
+
when /i\z/
|
235
|
+
interval = Arel::Visitors::Oracle::DATE_MAPPING[o.left[0..-2]]
|
236
|
+
collector << '('
|
237
|
+
collector = visit o.right, collector
|
238
|
+
collector << ") * (INTERVAL '1' #{interval})"
|
239
|
+
return collector
|
240
|
+
else
|
241
|
+
interval = nil
|
242
|
+
o.right
|
243
|
+
end
|
215
244
|
collector << "EXTRACT(#{Arel::Visitors::Oracle::DATE_MAPPING[o.left]} FROM "
|
216
|
-
collector = visit
|
245
|
+
collector = visit right, collector
|
217
246
|
end
|
218
247
|
collector << ")"
|
248
|
+
collector << " * (INTERVAL '1' #{interval})" if interval && o.with_interval
|
219
249
|
collector
|
220
250
|
end
|
221
251
|
|
@@ -387,7 +417,7 @@ module ArelExtensions
|
|
387
417
|
def visit_ArelExtensions_Nodes_DateAdd o, collector
|
388
418
|
collector << '('
|
389
419
|
collector = visit o.left, collector
|
390
|
-
collector << (o.right.value >= 0 ? ' + ' : ' - ')
|
420
|
+
collector << ' + '# (o.right.value >= 0 ? ' + ' : ' - ')
|
391
421
|
collector = visit o.oracle_value(o.right), collector
|
392
422
|
collector << ')'
|
393
423
|
collector
|
@@ -205,30 +205,56 @@ module ArelExtensions
|
|
205
205
|
|
206
206
|
def visit_ArelExtensions_Nodes_DateAdd o, collector
|
207
207
|
collector = visit o.left, collector
|
208
|
-
collector << (o.right.value >= 0 ? ' + ' : ' - ')
|
208
|
+
collector << ' + ' #(o.right.value >= 0 ? ' + ' : ' - ')
|
209
209
|
collector = visit o.postgresql_value(o.right), collector
|
210
210
|
collector
|
211
211
|
end
|
212
212
|
|
213
213
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
214
|
+
if o.right_node_type == :ruby_date || o.right_node_type == :ruby_time || o.right_node_type == :date || o.right_node_type == :datetime || o.right_node_type == :time
|
215
|
+
collector << if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
216
|
+
"DATEDIFF('second', "
|
217
|
+
else
|
218
|
+
"DATEDIFF('day', "
|
219
|
+
end
|
220
|
+
collector = visit o.right, collector
|
221
|
+
collector << (o.right_node_type == :date ? '::date' : '::timestamp')
|
222
|
+
collector << Arel::Visitors::PostgreSQL::COMMA
|
223
|
+
collector = visit o.left, collector
|
224
|
+
collector << (o.left_node_type == :date ? '::date' : '::timestamp')
|
225
|
+
collector << ")"
|
226
|
+
else
|
227
|
+
collector << '('
|
228
|
+
collector = visit o.left, collector
|
229
|
+
collector << ' - ('
|
230
|
+
if o.right.is_a?(ArelExtensions::Nodes::Duration)
|
231
|
+
o.right.with_interval = true
|
232
|
+
end
|
233
|
+
collector = visit o.right, collector
|
234
|
+
collector << '))'
|
235
|
+
end
|
225
236
|
collector
|
226
237
|
end
|
227
238
|
|
228
239
|
def visit_ArelExtensions_Nodes_Duration o, collector
|
240
|
+
if o.with_interval
|
241
|
+
interval = case o.left
|
242
|
+
when 'd','m','y'
|
243
|
+
'DAY'
|
244
|
+
when 'h','mn','s'
|
245
|
+
'SECOND'
|
246
|
+
when /i\z/
|
247
|
+
collector << "("
|
248
|
+
collector = visit o.right, collector
|
249
|
+
collector << ")"
|
250
|
+
collector << " * (INTERVAL '1' #{Arel::Visitors::PostgreSQL::DATE_MAPPING[o.left[0..-2]]})"
|
251
|
+
return collector
|
252
|
+
end
|
253
|
+
end
|
229
254
|
collector << "EXTRACT(#{Arel::Visitors::PostgreSQL::DATE_MAPPING[o.left]} FROM "
|
230
255
|
collector = visit o.right, collector
|
231
256
|
collector << ")"
|
257
|
+
collector << " * (INTERVAL '1' #{interval})" if interval && o.with_interval
|
232
258
|
collector
|
233
259
|
end
|
234
260
|
|
data/lib/arel_extensions.rb
CHANGED
@@ -391,7 +391,7 @@ module ArelExtensions
|
|
391
391
|
assert_equal 23, t(@laure, @created_at.day).to_i
|
392
392
|
assert_equal 0, User.where(@created_at.day.eq("05")).count
|
393
393
|
|
394
|
-
skip "manage DATE" if @env_db == 'oracle'
|
394
|
+
#skip "manage DATE" if @env_db == 'oracle'
|
395
395
|
#Hour
|
396
396
|
assert_equal 0, t(@laure, @created_at.hour).to_i
|
397
397
|
assert_equal 12, t(@lucas, @updated_at.hour).to_i
|
@@ -416,24 +416,51 @@ module ArelExtensions
|
|
416
416
|
else
|
417
417
|
assert_includes [nil, 0, 'f', false], t(@lucas, (@updated_at - Time.utc(2014, 3, 3, 12, 41, 18)) < -1)
|
418
418
|
end
|
419
|
-
if @env_db == 'mysql'
|
420
|
-
date1 = Date.new(2016, 5, 23)
|
421
|
-
durPos = 10.years
|
422
|
-
durNeg = -10.years
|
423
|
-
date2 = date1 + durPos
|
424
|
-
date3 = date1 - durPos
|
425
|
-
# Pull Request #5 tests
|
426
|
-
assert_includes [date2,"2026-05-23"], t(@test,(@created_at + durPos))
|
427
|
-
assert_includes [date3,"2006-05-23"], t(@test,(@created_at + durNeg))
|
428
|
-
# we test with the ruby object or the string because some adapters don't return an object Date
|
429
|
-
end
|
430
419
|
end
|
420
|
+
|
421
|
+
skip "not yet implemented" if $sqlite
|
422
|
+
|
423
|
+
date1 = Date.new(2016, 5, 23)
|
424
|
+
durPos = 10.years
|
425
|
+
durNeg = -10.years
|
426
|
+
date2 = date1 + durPos
|
427
|
+
date3 = date1 - durPos
|
428
|
+
date4 = date1 + 23.days
|
429
|
+
date5 = date1 - 23.days
|
430
|
+
|
431
|
+
datetime1 = Time.utc(2014, 3, 3, 12, 42, 0)
|
432
|
+
# Pull Request #5 tests
|
433
|
+
#puts (@created_at + durPos).cast(:date).to_sql
|
434
|
+
assert_includes [date2,"2026-05-23"], t(@test,(@created_at + durPos).cast(:date))
|
435
|
+
assert_includes [date3,"2006-05-23"], t(@test,(@created_at + durNeg).cast(:date))
|
436
|
+
|
437
|
+
#puts (@created_at + @created_at.day).cast(:date).to_sql
|
438
|
+
assert_includes [date4,"2016-06-15"], t(@test,(@created_at + @created_at.day).cast(:date))
|
439
|
+
#puts (@created_at - @created_at.day).cast(:date).to_sql
|
440
|
+
assert_includes [date5,"2016-04-30"], t(@test,(@created_at - @created_at.day).cast(:date))
|
441
|
+
|
442
|
+
assert_includes [datetime1 + 42.seconds,"2014-03-03 12:42:42 UTC"], t(@lucas,(@updated_at + @updated_at.minute))
|
443
|
+
assert_includes [datetime1 - 42.seconds,"2014-03-03 12:41:18 UTC"], t(@lucas,(@updated_at - @updated_at.minute))
|
444
|
+
|
445
|
+
# (@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))).to_sql
|
446
|
+
assert_includes [datetime1 + (12*60+42).seconds,"2014-03-03 12:54:42 UTC"],
|
447
|
+
t(@lucas,(@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))))
|
448
|
+
|
449
|
+
assert_includes [datetime1 + (12*60+42).minutes,"2014-03-04 01:24:00 UTC"],
|
450
|
+
t(@lucas,(@updated_at + Arel.duration('mn',(@updated_at.hour*60 + @updated_at.minute))))
|
451
|
+
|
452
|
+
assert_includes ["2024-03-03"], t(@lucas,(@updated_at + durPos).format('%Y-%m-%d'))
|
453
|
+
#puts (@updated_at - durPos).to_sql
|
454
|
+
assert_includes ["2004-03-03"], t(@lucas,(@updated_at - durPos).format('%Y-%m-%d'))
|
455
|
+
|
456
|
+
|
457
|
+
# we test with the ruby object or the string because some adapters don't return an object Date
|
458
|
+
# end
|
431
459
|
end
|
432
460
|
|
433
461
|
# TODO; cast types
|
434
462
|
def test_cast_types
|
435
463
|
assert_equal "5", t(@lucas, @age.cast(:string))
|
436
|
-
updated_at = Time.utc(2014, 3, 3, 12, 42, 0)
|
437
464
|
if @env_db == 'mysql' || @env_db == 'postgresql' || @env_db == 'oracle' || @env_db == 'mssql'
|
438
465
|
assert_equal 1, t(@laure,ArelExtensions::Nodes::Case.new.when(@duration.cast(:time).cast(:string).eq("12:42:21")).then(1).else(0)) unless @env_db == 'oracle' || @env_db == 'mssql'
|
439
466
|
assert_equal 1, t(@laure,ArelExtensions::Nodes::Case.new.when(@duration.cast(:time).eq("12:42:21")).then(1).else(0)) unless @env_db == 'oracle'
|
@@ -536,7 +563,7 @@ module ArelExtensions
|
|
536
563
|
|
537
564
|
def test_format_numbers
|
538
565
|
#score of Arthur = 65.62
|
539
|
-
skip " Works with SQLite if the version used knows printf" if
|
566
|
+
skip " Works with SQLite if the version used knows printf" if $sqlite
|
540
567
|
|
541
568
|
assert_equal "Wrong Format" , t(@arthur, @score.format_number("$ %...234.6F €","fr_FR"))
|
542
569
|
assert_equal "AZERTY65,62" , t(@arthur, @score.format_number("AZERTY%.2f","fr_FR"))
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arel_extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yann Azoury
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2019-
|
13
|
+
date: 2019-05-03 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: arel
|