arel_extensions 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
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