arel_extensions 1.0.3 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8aa9a662954d3fc3157f1275991e4bf04e13ea63
4
- data.tar.gz: ff96c79a38ce3a7f9f675ac3af7596caf689f7f0
3
+ metadata.gz: c66dd287fd3b27c733812e1bc6c0a516bbc54494
4
+ data.tar.gz: accb309d06e293a5d5542d76ad4e6dd1c6da8411
5
5
  SHA512:
6
- metadata.gz: 741e88fb943d9482ff4e7966747f56bf94d0aed909ed6f838e084eef53f89b74a55a90ad22daeaed1a53ee7d05192b52a7c03ca3c9988d32e2e511052821411e
7
- data.tar.gz: 75dcbf19327872a9d6b7eab78c334f9875e56ba3ef5f6c2d571c10c6acc2d2eb91254cd757ef97590ea4770689db59e9a9775869f6d7345e8a4eb00572c388d0
6
+ metadata.gz: e80b2f3c6950084e9b654e7ce213b7cda34b2d1c3142f559c04a4d7be3db090cafb4efd74532f3400b669eaae7f787980804347d7eefc1d398dd8af6849d5a93
7
+ data.tar.gz: 3e52c96fd662d2e8a6869480ddb53f6714a07dfb6dfdf080a0864d092a14dc53e6f4186d5531467eeac0877e49fe3c559c744919fa0dc93de336d564b4a12caf
data/Rakefile CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'bundler'
2
- Bundler::GemHelper.install_tasks
2
+ Bundler::GemHelper.install_tasks :name => "arel_extensions"
3
3
 
4
4
  require 'rake/testtask'
5
5
 
data/appveyor.yml CHANGED
@@ -40,4 +40,9 @@ environment:
40
40
  - RUBY_VERSION: 21
41
41
  - RUBY_VERSION: 22
42
42
  - RUBY_VERSION: 23
43
- - RUBY_VERSION: "23-x64"
43
+ - RUBY_VERSION: 23-x64
44
+ - RUBY_VERSION: 24
45
+ - RUBY_VERSION: 24-x64
46
+ - RUBY_VERSION: 25
47
+ - RUBY_VERSION: 25-x64
48
+
@@ -4,7 +4,7 @@ gem 'arel', '~> 3.0' # too old...
4
4
 
5
5
  group :development, :test do
6
6
  gem "sqlite3", :platform => [:ruby, :mswin, :mingw]
7
- gem "mysql2", :platform => [:ruby, :mswin, :mingw]
7
+ gem "mysql2", '0.4.10', :platform => [:ruby, :mswin, :mingw]
8
8
  gem "activerecord-mysql2-adapter", :platform => [:ruby, :mswin, :mingw]
9
9
  gem "pg", :platform => [:ruby, :mswin, :mingw]
10
10
  # for JRuby
@@ -17,4 +17,4 @@ group :development, :test do
17
17
  gem 'activerecord', '~> 3.2'
18
18
  end
19
19
 
20
- gemspec :path => "../"
20
+ gemspec :path => "../"
@@ -8,7 +8,7 @@ group :development, :test do
8
8
  gem 'activerecord', '~> 4.0'
9
9
 
10
10
  gem "sqlite3", :platforms => [:mri, :mswin, :mingw]
11
- gem "mysql2", :platforms => [:mri, :mswin, :mingw]
11
+ gem "mysql2", '0.4.10', :platforms => [:mri, :mswin, :mingw]
12
12
  gem "pg",'< 1.0.0', :platforms => [:mri, :mingw]
13
13
 
14
14
  gem "tiny_tds", :platforms => [:mri, :mingw, :mswin] if RUBY_PLATFORM =~ /windows/
@@ -8,7 +8,7 @@ group :development, :test do
8
8
  gem 'activerecord', '~> 5.0'
9
9
 
10
10
  gem "sqlite3", :platforms => [:mri, :mswin, :mingw]
11
- gem "mysql2", :platforms => [:mri, :mswin, :mingw]
11
+ gem "mysql2", '0.4.10', :platforms => [:mri, :mswin, :mingw]
12
12
  gem "pg",'< 1.0.0', :platforms => [:mri, :mingw]
13
13
 
14
14
  gem "tiny_tds", :platforms => [:mri, :mingw] if RUBY_PLATFORM =~ /windows/
@@ -9,7 +9,7 @@ group :development, :test do
9
9
  gem 'activerecord', '5.1.4'
10
10
 
11
11
  gem "sqlite3", :platforms => [:mri, :mswin, :mingw]
12
- gem "mysql2", :platforms => [:mri, :mswin, :mingw]
12
+ gem "mysql2", '0.4.10', :platforms => [:mri, :mswin, :mingw]
13
13
  gem "pg",'< 1.0.0', :platforms => [:mri, :mingw]
14
14
 
15
15
  gem "tiny_tds", :platforms => [:mri, :mingw] if RUBY_PLATFORM =~ /windows/
@@ -9,7 +9,7 @@ group :development, :test do
9
9
  gem 'activerecord', '~> 5.2.0.beta2'
10
10
 
11
11
  gem "sqlite3", :platforms => [:mri, :mswin, :mingw]
12
- gem "mysql2", :platforms => [:mri, :mswin, :mingw]
12
+ gem "mysql2", '0.4.10', :platforms => [:mri, :mswin, :mingw]
13
13
  gem "pg",'< 1.0.0', :platforms => [:mri, :mingw]
14
14
 
15
15
  gem "tiny_tds", :platforms => [:mri, :mingw] if RUBY_PLATFORM =~ /windows/
@@ -1,52 +1,49 @@
1
1
  module ArelExtensions
2
- module Nodes
3
- class Cast < Function
4
- @@return_type= :string
5
-
6
- def initialize expr
7
- as_attr = expr[1]
8
- case expr[1]
9
- when 'bigint', 'int', 'smallint', 'tinyint', 'bit', 'decimal', 'numeric', 'money', 'smallmoney', 'float', 'real'
10
- @@return_type= :number
11
- when 'datetime', 'smalldatetime'
12
- @@return_type= :ruby_time
13
- when 'char', 'varchar', 'text', 'nchar', 'nvarchar', 'ntext'
14
- @@return_type= :string
15
- when 'binary', 'varbinary', 'image'
16
- @@return_type= :binary
17
- when :number
18
- @@return_type= :number
19
- as_attr = 'int'
20
- when :datetime
21
- @@return_type= :ruby_time
22
- as_attr = 'datetime'
23
- when :string
2
+ module Nodes
3
+ class Cast < Function
24
4
  @@return_type= :string
25
- as_attr = 'char'
26
- when :binary
27
- @@return_type= :binary
28
- as_attr = 'binary'
29
- else
30
- @@return_type= :string
31
- as_attr = 'char'
32
- end
33
- tab = [convert_to_node(expr.first), Arel::Nodes::SqlLiteral.new(as_attr)]
34
- return super(tab)
35
- end
36
-
37
- def +(other)
38
- case @@return_type
39
- when :string
40
- return ArelExtensions::Nodes::Concat.new [self, other]
41
- when :ruby_time
42
- ArelExtensions::Nodes::DateAdd.new [self, other]
43
- else
44
- Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
45
- end
5
+
6
+ attr_accessor :as_attr
7
+
8
+ def initialize expr
9
+ @as_attr = expr[1]
10
+ case expr[1]
11
+ when 'bigint', 'int', 'smallint', 'tinyint', 'bit'
12
+ @@return_type= :int
13
+ when 'decimal', 'numeric', 'money', 'smallmoney', 'float', 'real'
14
+ @@return_type= :decimal
15
+ when 'datetime', 'smalldatetime','time','date'
16
+ @@return_type= :ruby_time
17
+ when 'char', 'varchar', 'text', 'nchar', 'nvarchar', 'ntext'
18
+ @@return_type= :string
19
+ when 'binary', 'varbinary', 'image'
20
+ @@return_type= :binary
21
+ when :int
22
+ @@return_type= :number
23
+ when :float, :decimal
24
+ @@return_type= :decimal
25
+ when :datetime, :time, :date
26
+ @@return_type= :ruby_time
27
+ when :binary
28
+ @@return_type= :binary
29
+ else
30
+ @@return_type= :string
31
+ @as_attr = :string
32
+ end
33
+ tab = [convert_to_node(expr.first)]
34
+ return super(tab)
35
+ end
36
+
37
+ def +(other)
38
+ case @@return_type
39
+ when :string
40
+ return ArelExtensions::Nodes::Concat.new [self, other]
41
+ when :ruby_time
42
+ ArelExtensions::Nodes::DateAdd.new [self, other]
43
+ else
44
+ Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
45
+ end
46
+ end
46
47
  end
47
-
48
-
49
-
50
- end
51
- end
48
+ end
52
49
  end
@@ -19,38 +19,6 @@ module ArelExtensions
19
19
  super [col]
20
20
  end
21
21
 
22
- def locale
23
- @locale
24
- end
25
-
26
- def prefix
27
- @prefix
28
- end
29
-
30
- def suffix
31
- @suffix
32
- end
33
-
34
- def width
35
- @width
36
- end
37
-
38
- def precision
39
- @precision
40
- end
41
-
42
- def type
43
- @type
44
- end
45
-
46
- def flags
47
- @flags
48
- end
49
-
50
- def scientific_notation
51
- @scientific_notation
52
- end
53
- end
54
-
22
+ end
55
23
  end
56
24
  end
@@ -47,8 +47,10 @@ module ArelExtensions
47
47
  case object
48
48
  when Arel::Attributes::Attribute, Arel::Nodes::Node, Integer
49
49
  object
50
- when DateTime, Time
51
- Arel::Nodes.build_quoted(Date.new(object.year, object.month, object.day), self)
50
+ when DateTime
51
+ Arel::Nodes.build_quoted(object, self)
52
+ when Time
53
+ Arel::Nodes.build_quoted(object.strftime('%H:%M:%S'), self)
52
54
  when String
53
55
  Arel::Nodes.build_quoted(object)
54
56
  when Date
@@ -72,11 +74,15 @@ module ArelExtensions
72
74
  case self.type_of_attribute(object)
73
75
  when :date
74
76
  ArelExtensions::Nodes::Format.new [object, 'yyyy-mm-dd']
77
+ when :time
78
+ ArelExtensions::Nodes::Format.new [object, '%H:%M:%S']
75
79
  else
76
80
  object
77
81
  end
78
- when DateTime, Time
79
- Arel::Nodes.build_quoted(Date.new(object.year, object.month, object.day), self)
82
+ when DateTime
83
+ Arel::Nodes.build_quoted(object, self)
84
+ when Time
85
+ Arel::Nodes.build_quoted(object.strftime('%H:%M:%S'), self)
80
86
  when String
81
87
  Arel::Nodes.build_quoted(object)
82
88
  when Date
@@ -13,10 +13,6 @@ module ArelExtensions
13
13
  def imatches(other, escape=nil)
14
14
  ArelExtensions::Nodes::IMatches.new(self, other, escape)
15
15
  end
16
-
17
- def cast_as_char
18
- ArelExtensions::Nodes::Cast.new([self,'char'])
19
- end
20
16
 
21
17
  def cast right
22
18
  ArelExtensions::Nodes::Cast.new([self,right])
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = "1.0.3".freeze
2
+ VERSION = "1.0.4".freeze
3
3
  end
@@ -37,7 +37,7 @@ module ArelExtensions
37
37
  }
38
38
  collector << ")"
39
39
  collector
40
- end
40
+ end
41
41
 
42
42
  def visit_ArelExtensions_Nodes_Power o, collector
43
43
  collector << "POWER("
@@ -1,6 +1,6 @@
1
1
  module ArelExtensions
2
2
  module Visitors
3
- Arel::Visitors::MySQL.class_eval do
3
+ Arel::Visitors::MySQL.class_eval do
4
4
  Arel::Visitors::MySQL::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'WEEK', 'y' => 'YEAR', 'wd' => 'WEEKDAY', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
5
5
  Arel::Visitors::MySQL::DATE_FORMAT_DIRECTIVES = { # ISO C / POSIX
6
6
  '%Y' => '%Y', '%C' => '', '%y' => '%y', '%m' => '%m', '%B' => '%M', '%b' => '%b', '%^b' => '%b', # year, month
@@ -19,7 +19,7 @@ module ArelExtensions
19
19
  }
20
20
  collector << ")"
21
21
  collector
22
- end
22
+ end
23
23
 
24
24
  def visit_ArelExtensions_Nodes_Power o, collector
25
25
  collector << "POW("
@@ -29,7 +29,7 @@ module ArelExtensions
29
29
  }
30
30
  collector << ")"
31
31
  collector
32
- end
32
+ end
33
33
 
34
34
  #String functions
35
35
  def visit_ArelExtensions_Nodes_IMatches o, collector # insensitive on ASCII
@@ -57,16 +57,16 @@ module ArelExtensions
57
57
  end
58
58
 
59
59
  def visit_ArelExtensions_Nodes_Concat o, collector
60
- collector << "CONCAT("
61
- o.expressions.each_with_index { |arg, i|
62
- collector << Arel::Visitors::MySQL::COMMA unless i == 0
63
- if (arg.is_a?(Numeric)) || (arg.is_a?(Arel::Attributes::Attribute))
60
+ collector << "CONCAT("
61
+ o.expressions.each_with_index { |arg, i|
62
+ collector << Arel::Visitors::MySQL::COMMA unless i == 0
63
+ if (arg.is_a?(Numeric)) || (arg.is_a?(Arel::Attributes::Attribute))
64
64
  collector << "CAST("
65
65
  collector = visit arg, collector
66
66
  collector << " AS char)"
67
67
  else
68
68
  collector = visit arg, collector
69
- end
69
+ end
70
70
  }
71
71
  collector << ")"
72
72
  collector
@@ -199,6 +199,28 @@ module ArelExtensions
199
199
  collector
200
200
  end
201
201
 
202
+ def visit_ArelExtensions_Nodes_Cast o, collector
203
+ collector << "CAST("
204
+ collector = visit o.left, collector
205
+ collector << " AS "
206
+ case o.as_attr
207
+ when :string
208
+ as_attr = Arel::Nodes::SqlLiteral.new('char')
209
+ when :time
210
+ as_attr = Arel::Nodes::SqlLiteral.new('time')
211
+ when :number
212
+ as_attr = Arel::Nodes::SqlLiteral.new('int')
213
+ when :datetime
214
+ as_attr = Arel::Nodes::SqlLiteral.new('datetime')
215
+ when :binary
216
+ as_attr = Arel::Nodes::SqlLiteral.new('binary')
217
+ else
218
+ as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
219
+ end
220
+ collector = visit as_attr, collector
221
+ collector << ")"
222
+ collector
223
+ end
202
224
 
203
225
  end
204
226
  end
@@ -18,7 +18,7 @@ module ArelExtensions
18
18
  }
19
19
  collector << ",10)"
20
20
  collector
21
- end
21
+ end
22
22
 
23
23
  def visit_ArelExtensions_Nodes_Power o, collector
24
24
  collector << "POWER("
@@ -28,10 +28,8 @@ module ArelExtensions
28
28
  }
29
29
  collector << ")"
30
30
  collector
31
- end
32
-
33
-
34
-
31
+ end
32
+
35
33
  def visit_ArelExtensions_Nodes_Concat o, collector
36
34
  collector << '('
37
35
  o.expressions.each_with_index { |arg, i|
@@ -141,6 +139,32 @@ module ArelExtensions
141
139
  collector << ")"
142
140
  collector
143
141
  end
142
+
143
+ def visit_ArelExtensions_Nodes_Cast o, collector
144
+ collector << "CAST("
145
+ left = o.left
146
+ case o.as_attr
147
+ when :string
148
+ as_attr = Arel::Nodes::SqlLiteral.new('varchar(255)')
149
+ when :time
150
+ left = Arel::Nodes::NamedFunction.new('TO_CHAR',[left,Arel::Nodes::SqlLiteral.new('HH24:MI:SS')])
151
+ as_attr = Arel::Nodes::SqlLiteral.new('varchar(8)')
152
+ when :number
153
+ as_attr = Arel::Nodes::SqlLiteral.new('int')
154
+ when :datetime
155
+ as_attr = Arel::Nodes::SqlLiteral.new('timestamp')
156
+ when :binary
157
+ as_attr = Arel::Nodes::SqlLiteral.new('binary')
158
+ else
159
+ as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
160
+ end
161
+ collector = visit left, collector
162
+ collector << " AS "
163
+ collector = visit as_attr, collector
164
+ collector << ")"
165
+ collector
166
+ end
167
+
144
168
 
145
169
 
146
170
  def visit_ArelExtensions_Nodes_Length o, collector
@@ -359,6 +383,54 @@ module ArelExtensions
359
383
  end
360
384
 
361
385
 
386
+ def get_time_converted element
387
+ if element.is_a?(Time)
388
+ res = ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
389
+ elsif element.is_a?(Arel::Attributes::Attribute)
390
+ col = Arel::Table.engine.connection.schema_cache.columns_hash(element.relation.table_name)[element.name.to_s]
391
+ if col && (col.type == :time)
392
+ res = ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
393
+ else
394
+ res = element
395
+ end
396
+ else
397
+ res = element
398
+ end
399
+ return res
400
+ end
401
+
402
+ remove_method(:visit_Arel_Nodes_GreaterThanOrEqual) rescue nil
403
+ def visit_Arel_Nodes_GreaterThanOrEqual o, collector
404
+ collector = visit get_time_converted(o.left), collector
405
+ collector << " >= "
406
+ collector = visit get_time_converted(o.right), collector
407
+ collector
408
+ end
409
+
410
+ remove_method(:visit_Arel_Nodes_GreaterThan) rescue nil
411
+ def visit_Arel_Nodes_GreaterThan o, collector
412
+ collector = visit get_time_converted(o.left), collector
413
+ collector << " > "
414
+ collector = visit get_time_converted(o.right), collector
415
+ collector
416
+ end
417
+
418
+ remove_method(:visit_Arel_Nodes_LessThanOrEqual) rescue nil
419
+ def visit_Arel_Nodes_LessThanOrEqual o, collector
420
+ collector = visit get_time_converted(o.left), collector
421
+ collector << " <= "
422
+ collector = visit get_time_converted(o.right), collector
423
+ collector
424
+ end
425
+
426
+ remove_method(:visit_Arel_Nodes_LessThan) rescue nil
427
+ def visit_Arel_Nodes_LessThan o, collector
428
+ collector = visit get_time_converted(o.left), collector
429
+ collector << " < "
430
+ collector = visit get_time_converted(o.right), collector
431
+ collector
432
+ end
433
+
362
434
 
363
435
  end
364
436
  end
@@ -199,6 +199,29 @@ module ArelExtensions
199
199
  collector << ')'
200
200
  collector
201
201
  end
202
+
203
+ def visit_ArelExtensions_Nodes_Cast o, collector
204
+ collector << "CAST("
205
+ collector = visit o.left, collector
206
+ collector << " AS "
207
+ case o.as_attr
208
+ when :string
209
+ as_attr = Arel::Nodes::SqlLiteral.new('varchar')
210
+ when :time
211
+ as_attr = Arel::Nodes::SqlLiteral.new('time')
212
+ when :number
213
+ as_attr = Arel::Nodes::SqlLiteral.new('int')
214
+ when :datetime
215
+ as_attr = Arel::Nodes::SqlLiteral.new('datetime')
216
+ when :binary
217
+ as_attr = Arel::Nodes::SqlLiteral.new('binary')
218
+ else
219
+ as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
220
+ end
221
+ collector = visit as_attr, collector
222
+ collector << ")"
223
+ collector
224
+ end
202
225
 
203
226
 
204
227
  end
@@ -242,6 +242,54 @@ module ArelExtensions
242
242
  collector
243
243
  end
244
244
 
245
+
246
+ def get_time_converted element
247
+ if element.is_a?(Time)
248
+ return Arel::Nodes::NamedFunction.new('STRFTIME',[element, '%H:%M:%S'])
249
+ elsif element.is_a?(Arel::Attributes::Attribute)
250
+ col = Arel::Table.engine.connection.schema_cache.columns_hash(element.relation.table_name)[element.name.to_s]
251
+ if col && (col.type == :time)
252
+ return Arel::Nodes::NamedFunction.new('STRFTIME',[element, '%H:%M:%S'])
253
+ else
254
+ return element
255
+ end
256
+ else
257
+ return element
258
+ end
259
+ end
260
+
261
+ remove_method(:visit_Arel_Nodes_GreaterThanOrEqual) rescue nil
262
+ def visit_Arel_Nodes_GreaterThanOrEqual o, collector
263
+ collector = visit get_time_converted(o.left), collector
264
+ collector << " >= "
265
+ collector = visit get_time_converted(o.right), collector
266
+ collector
267
+ end
268
+
269
+ remove_method(:visit_Arel_Nodes_GreaterThan) rescue nil
270
+ def visit_Arel_Nodes_GreaterThan o, collector
271
+ collector = visit get_time_converted(o.left), collector
272
+ collector << " > "
273
+ collector = visit get_time_converted(o.right), collector
274
+ collector
275
+ end
276
+
277
+ remove_method(:visit_Arel_Nodes_LessThanOrEqual) rescue nil
278
+ def visit_Arel_Nodes_LessThanOrEqual o, collector
279
+ collector = visit get_time_converted(o.left), collector
280
+ collector << " <= "
281
+ collector = visit get_time_converted(o.right), collector
282
+ collector
283
+ end
284
+
285
+ remove_method(:visit_Arel_Nodes_LessThan) rescue nil
286
+ def visit_Arel_Nodes_LessThan o, collector
287
+ collector = visit get_time_converted(o.left), collector
288
+ collector << " < "
289
+ collector = visit get_time_converted(o.right), collector
290
+ collector
291
+ end
292
+
245
293
  end
246
294
  end
247
295
  end
@@ -231,7 +231,7 @@ module ArelExtensions
231
231
 
232
232
  def visit_ArelExtensions_Nodes_Format o, collector
233
233
  case o.col_type
234
- when :date, :datetime
234
+ when :date, :datetime, :time
235
235
  collector << "STRFTIME("
236
236
  collector = visit o.right, collector
237
237
  collector << Arel::Visitors::ToSql::COMMA
@@ -251,14 +251,30 @@ module ArelExtensions
251
251
 
252
252
  #comparators
253
253
 
254
- def visit_ArelExtensions_Nodes_Cast o, collector
254
+ def visit_ArelExtensions_Nodes_Cast o, collector
255
255
  collector << "CAST("
256
256
  collector = visit o.left, collector
257
257
  collector << " AS "
258
- collector = visit o.right, collector
258
+ case o.as_attr
259
+ when :string
260
+ as_attr = Arel::Nodes::SqlLiteral.new('char')
261
+ when :number
262
+ as_attr = Arel::Nodes::SqlLiteral.new('int')
263
+ when :decimal, :float
264
+ as_attr = Arel::Nodes::SqlLiteral.new('float')
265
+ when :datetime
266
+ as_attr = Arel::Nodes::SqlLiteral.new('datetime')
267
+ when :time
268
+ as_attr = Arel::Nodes::SqlLiteral.new('time')
269
+ when :binary
270
+ as_attr = Arel::Nodes::SqlLiteral.new('binary')
271
+ else
272
+ as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
273
+ end
274
+ collector = visit as_attr, collector
259
275
  collector << ")"
260
276
  collector
261
- end
277
+ end
262
278
 
263
279
  def visit_ArelExtensions_Nodes_Coalesce o, collector
264
280
  collector << "COALESCE("
@@ -474,7 +490,7 @@ module ArelExtensions
474
490
 
475
491
 
476
492
 
477
- def visit_ArelExtensions_Nodes_FormattedNumber o, collector
493
+ def visit_ArelExtensions_Nodes_FormattedNumber o, collector
478
494
  col = o.left
479
495
  params = o.locale ? [o.precision,Arel::Nodes.build_quoted(o.locale)] : [o.precision]
480
496
  sign = ArelExtensions::Nodes::Case.new.when(col<0).
@@ -516,10 +532,16 @@ module ArelExtensions
516
532
  after
517
533
  ])
518
534
  )
519
- collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
520
-
535
+ collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
521
536
  collector
522
- end
537
+ end
538
+
539
+ remove_method(:visit_Arel_Nodes_LessThan) rescue nil
540
+ def visit_Arel_Nodes_LessThan o, collector
541
+ collector = visit o.left, collector
542
+ collector << " < "
543
+ visit o.right, collector
544
+ end
523
545
 
524
546
  end
525
547
  end
@@ -262,12 +262,7 @@ module ArelExtensions
262
262
  .must_be_like %{COALESCE("fake_table"."fake_attribute", 'other_value') ILIKE 'truc'}
263
263
  end
264
264
 
265
- it "should be possible to cast nodes types" do
266
-
267
-
268
- compile(@table[:id].cast_as_char)
269
- .must_be_like %{CAST("users"."id" AS char)}
270
-
265
+ it "should be possible to cast nodes types" do
271
266
  compile(@table[:id].cast('char'))
272
267
  .must_be_like %{CAST("users"."id" AS char)}
273
268
 
@@ -276,22 +271,26 @@ module ArelExtensions
276
271
 
277
272
  compile(@table[:id].coalesce(' ').cast(:string))
278
273
  .must_be_like %{CAST(COALESCE("users"."id", ' ') AS char)}
274
+
275
+ compile(@table[:id].cast(:string).coalesce(' '))
276
+ .must_be_like %{COALESCE(CAST(\"users\".\"id\" AS char), ' ')}
279
277
 
280
278
  compile(@table[:id].cast('char') + ' ')
281
279
  .must_be_like %{CONCAT(CAST("users"."id" AS char), ' ')}
282
280
 
283
281
  compile(@table[:id].cast('int') + 2)
284
282
  .must_be_like %{(CAST("users"."id" AS int) + 2)}
285
-
286
283
  end
287
-
284
+
288
285
 
289
286
  it "should be possible to specify a cool format on number" do
290
287
  #puts @price.format_number("$$ %+030.2e €€","fr_FR").to_sql
291
- # compile(@price.format_number("$$ %+030.2e €€","fr_FR"))
292
- # .must_be_like %{CONCAT('$$ ', CASE \"products\".\"price\" WHEN 0 THEN 0 ELSE CONCAT('', CASE WHEN \"products\".\"price\" < 0 THEN '-' ELSE '+' END, CASE WHEN (ABS(30) - (LENGTH(CONCAT(FORMAT(ABS(\"products\".\"price\") / POW(10, FLOOR(LOG10(ABS(\"products\".\"price\")))), 2, 'fr_FR'), 'e', FORMAT(FLOOR(LOG10(ABS(\"products\".\"price\"))), 0))) + LENGTH(CASE WHEN \"products\".\"price\" < 0 THEN '-' ELSE '+' END))) > 0 THEN REPEAT('0', (ABS(30) - (LENGTH(CONCAT(FORMAT(ABS(\"products\".\"price\") / POW(10, FLOOR(LOG10(ABS(\"products\".\"price\")))), 2, 'fr_FR'), 'e', FORMAT(FLOOR(LOG10(ABS(\"products\".\"price\"))), 0))) + LENGTH(CASE WHEN \"products\".\"price\" < 0 THEN '-' ELSE '+' END)))) ELSE '' END, CONCAT(FORMAT(ABS(\"products\".\"price\") / POW(10, FLOOR(LOG10(ABS(\"products\".\"price\")))), 2, 'fr_FR'), 'e', FORMAT(FLOOR(LOG10(ABS(\"products\".\"price\"))), 0)), '') END, ' €€')}
288
+ compile(@price.format_number("$$ %+030.2e €€","fr_FR"))
289
+ .must_be_like %{CONCAT('$$ ', CASE \"products\".\"price\" WHEN 0 THEN 0 ELSE CONCAT('', CASE WHEN \"products\".\"price\" < 0 THEN '-' ELSE '+' END, CASE WHEN (ABS(30) - (LENGTH(CONCAT(FORMAT(ABS(\"products\".\"price\") / POW(10, FLOOR(LOG10(ABS(\"products\".\"price\")))), 2, 'fr_FR'), 'e', FORMAT(FLOOR(LOG10(ABS(\"products\".\"price\"))), 0))) + LENGTH(CASE WHEN \"products\".\"price\" < 0 THEN '-' ELSE '+' END))) > 0 THEN REPEAT('0', (ABS(30) - (LENGTH(CONCAT(FORMAT(ABS(\"products\".\"price\") / POW(10, FLOOR(LOG10(ABS(\"products\".\"price\")))), 2, 'fr_FR'), 'e', FORMAT(FLOOR(LOG10(ABS(\"products\".\"price\"))), 0))) + LENGTH(CASE WHEN \"products\".\"price\" < 0 THEN '-' ELSE '+' END)))) ELSE '' END, CONCAT(FORMAT(ABS(\"products\".\"price\") / POW(10, FLOOR(LOG10(ABS(\"products\".\"price\")))), 2, 'fr_FR'), 'e', FORMAT(FLOOR(LOG10(ABS(\"products\".\"price\"))), 0)), '') END, ' €€')}
293
290
  end
294
291
 
292
+
293
+
295
294
  puts "AREL VERSION : " + Arel::VERSION.to_s
296
295
  end
297
296
  end
@@ -31,6 +31,7 @@ module ArelExtensions
31
31
  t.column :comments, :text
32
32
  t.column :created_at, :date
33
33
  t.column :updated_at, :datetime
34
+ t.column :duration, :time
34
35
  t.column :score, :decimal, :precision => 20, :scale => 10
35
36
  end
36
37
  @cnx.drop_table(:product_tests) rescue nil
@@ -60,12 +61,13 @@ module ArelExtensions
60
61
  @arthur = User.where(:id => u.id)
61
62
  u = User.create :age => 23, :name => "Myung", :created_at => d, :score => 20.16, :comments => ' '
62
63
  @myung = User.where(:id => u.id)
63
- u = User.create :age => 25, :name => "Laure", :created_at => d, :score => 20.16
64
+ u = User.create :age => 25, :name => "Laure", :created_at => d, :score => 20.16, :duration => Time.utc(2001, 1, 1, 12, 42, 21),:updated_at => Time.utc(2014, 3, 3, 12, 42, 0)
64
65
  @laure = User.where(:id => u.id)
65
66
  u = User.create :age => nil, :name => "Test", :created_at => d, :score => 1.62
66
67
  @test = User.where(:id => u.id)
67
68
  u = User.create :age => -42, :name => "Negatif", :comments => '1,22,3,42,2', :created_at => d, :updated_at => d.to_time, :score => 0.17
68
69
  @neg = User.where(:id => u.id)
70
+
69
71
 
70
72
  @age = User.arel_table[:age]
71
73
  @name = User.arel_table[:name]
@@ -73,6 +75,7 @@ module ArelExtensions
73
75
  @created_at = User.arel_table[:created_at]
74
76
  @updated_at = User.arel_table[:updated_at]
75
77
  @comments = User.arel_table[:comments]
78
+ @duration = User.arel_table[:duration]
76
79
  @price = Product.arel_table[:price]
77
80
  @not_in_table = User.arel_table[:not_in_table]
78
81
 
@@ -207,16 +210,40 @@ module ArelExtensions
207
210
  end
208
211
 
209
212
  def test_string_comparators
210
- skip "Oracle can't use math operators to compare strings" if @env_db == 'oracle' # use GREATEST ?
213
+ #skip "Oracle can't use math operators to compare strings" if @env_db == 'oracle' # use GREATEST ?
211
214
  skip "SQL Server can't use math operators to compare strings" if @env_db == 'mssql' # use GREATEST ?
212
215
  if @env_db == 'postgresql' # may return real boolean
213
216
  assert t(@neg, @name >= 'Mest') == true || t(@neg, @name >= 'Mest') == 't' # depends of ar version
214
217
  assert t(@neg, @name <= (@name + 'Z')) == true || t(@neg, @name <= (@name + 'Z')) == 't'
218
+ elsif @env_db == 'oracle'
219
+ assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name >= 'Mest').then(1).else(0))
220
+ assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name <= (@name + 'Z')).then(1).else(0))
221
+ assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name > 'Mest').then(1).else(0))
222
+ assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name < (@name + 'Z')).then(1).else(0))
215
223
  else
216
224
  assert_equal 1, t(@neg, @name >= 'Mest')
217
225
  assert_equal 1, t(@neg, @name <= (@name + 'Z'))
226
+ assert_equal 1, t(@neg, @name > 'Mest')
227
+ assert_equal 1, t(@neg, @name < (@name + 'Z'))
218
228
  end
219
229
  end
230
+
231
+ def test_compare_on_date_time_types
232
+ skip "Sqlite can't compare time" if $sqlite
233
+ skip "Oracle can't compare time" if @env_db == 'oracle'
234
+ #@created_at == 2016-05-23
235
+ assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@created_at >= '2014-01-01').then(1).else(0))
236
+ assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@created_at >= '2018-01-01').then(1).else(0))
237
+ #@updated_at == 2014-03-03 12:42:00
238
+ assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@updated_at >= '2014-03-03 10:10:10').then(1).else(0))
239
+ assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@updated_at >= '2014-03-03 13:10:10').then(1).else(0))
240
+ #@duration == 12:42:21
241
+ #puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0)).to_sql
242
+ #puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0)).to_sql
243
+ assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0))
244
+ assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0))
245
+ end
246
+
220
247
 
221
248
  def test_regexp_not_regexp
222
249
  skip "Sqlite version can't load extension for regexp" if $sqlite && $load_extension_disabled
@@ -386,8 +413,13 @@ module ArelExtensions
386
413
 
387
414
  # TODO; cast types
388
415
  def test_cast_types
389
- skip "not implemented yet"
390
- assert_equal true, t(@arthur, @score =~ /22/)
416
+ assert_equal "5", t(@lucas, @age.cast(:string))
417
+ if @env_db == 'mysql' || @env_db == 'postgresql'
418
+ assert_equal "12:42:21", t(@laure, @duration.cast(:time).cast(:string))
419
+ assert_equal "12:42:21", t(@laure, @duration.cast(:string))
420
+ assert_includes [true,1,'t'], t(@laure, @duration.cast('time').cast(:string) > @updated_at.cast('time').cast(:string))
421
+ assert_includes [false,0,'f'], t(@laure, @duration.cast('time').cast(:string) < @updated_at.cast('time').cast(:string))
422
+ end
391
423
  end
392
424
 
393
425
  def test_is_null
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.0.3
4
+ version: 1.0.4
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: 2018-03-19 00:00:00.000000000 Z
13
+ date: 2018-03-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: arel