arel_extensions 1.1.10 → 1.2.0

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: 708dfbc3e662298b3d0cb782b5555182ea9758a3
4
- data.tar.gz: 71bb77c55986474cf7a55b4687a2eca93517df47
3
+ metadata.gz: 1ff15cd23745599b0d20b2ee2057aa60e67f884b
4
+ data.tar.gz: c9f5c30cc2ba738fbdba34fab575fc93d1d01645
5
5
  SHA512:
6
- metadata.gz: b98769af5db36a1ad6bc978e5ca5787ef423ad4be3c8708024e199825809fb75fa6a34b7a92468842a55679dd11e4cfb3fcc5dc1105fca6bf7d289f0a120dca0
7
- data.tar.gz: ff10289ae7c04a4849bddcdcf5046e9adc7dd20913ab37914d0a81e4825597ce9bff4273608ea524607086191df016d4e6719bf5e3d06258c9135a1756723a65
6
+ metadata.gz: b03cf4dcfe3f2f1c5c754e3ab42045702b7be1fd906ea44797a70dc6c8d44d6f2a7ed417e247dc95c1f1021bfd1d41574ba2b001fbdb9b7700ec3d8cce3a5126
7
+ data.tar.gz: cfb1ebf5427a66e1637d3ab023e84eee3cfaa41353bc303ed8fccddfdfd517e670e54f7750b00dd8c14dd9cc5c8b2488d6d8854e221efca3a63887b99430c78b
@@ -72,7 +72,7 @@ module Arel
72
72
  def self.rand
73
73
  ArelExtensions::Nodes::Rand.new
74
74
  end
75
-
75
+
76
76
  def self.shorten s
77
77
  Base64.urlsafe_encode64(Digest::MD5.new.digest(s)).tr('=', '').tr('-', '_')
78
78
  end
@@ -84,6 +84,11 @@ module Arel
84
84
  ArelExtensions::Nodes::Json.new(expr)
85
85
  end
86
86
  end
87
+
88
+ def self.when condition
89
+ ArelExtensions::Nodes::Case.new.when(condition)
90
+ end
91
+
87
92
  end
88
93
 
89
94
  Arel::Attributes::Attribute.class_eval do
@@ -1,54 +1,52 @@
1
1
  module ArelExtensions
2
- module Nodes
3
- class Cast < Function
4
- @return_type = :string
2
+ module Nodes
3
+ class Cast < Function
4
+ @return_type = :string
5
5
 
6
- attr_accessor :as_attr
6
+ attr_accessor :as_attr
7
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 'char', 'varchar', 'text', 'nchar', 'nvarchar', 'ntext'
16
- @return_type= :string
17
- when :int
18
- @return_type= :number
19
- when :float, :decimal
20
- @return_type= :decimal
21
- when :datetime, 'datetime','smalldatetime'
22
- @return_type= :datetime
23
- when :time,'time'
24
- @return_type= :time
25
- when :date,'date'
26
- @return_type= :date
27
- when :binary, 'binary', 'varbinary', 'image'
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
8
+ def initialize expr
9
+ @as_attr = expr[1]
10
+ case expr[1]
11
+ when :int, 'bigint', 'int', 'smallint', 'tinyint', 'bit'
12
+ @return_type = :int
13
+ when :float, :decimal, 'decimal', 'numeric', 'money', 'smallmoney', 'float', 'real'
14
+ @return_type = :decimal
15
+ when :number
16
+ @return_type = :number
17
+ when 'char', 'varchar', 'text', 'nchar', 'nvarchar', 'ntext'
18
+ @return_type = :string
19
+ when :datetime, 'datetime','smalldatetime'
20
+ @return_type = :datetime
21
+ when :time,'time'
22
+ @return_type = :time
23
+ when :date,'date'
24
+ @return_type = :date
25
+ when :binary, 'binary', 'varbinary', 'image'
26
+ @return_type = :binary
27
+ else
28
+ @return_type = :string
29
+ @as_attr = :string
30
+ end
31
+ tab = [convert_to_node(expr.first)]
32
+ return super(tab)
33
+ end
36
34
 
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
35
+ def +(other)
36
+ case @return_type
37
+ when :string
38
+ return ArelExtensions::Nodes::Concat.new [self, other]
39
+ when :ruby_time
40
+ ArelExtensions::Nodes::DateAdd.new [self, other]
41
+ else
42
+ Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
43
+ end
44
+ end
47
45
 
48
- def return_type
49
- @return_type
50
- end
51
-
52
- end
53
- end
46
+ def return_type
47
+ @return_type
48
+ end
49
+
50
+ end
51
+ end
54
52
  end
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = "1.1.10".freeze
2
+ VERSION = "1.2.0".freeze
3
3
  end
@@ -406,23 +406,30 @@ module ArelExtensions
406
406
  end
407
407
 
408
408
  def visit_ArelExtensions_Nodes_Cast o, collector
409
- collector << "CAST("
410
- collector = visit o.left, collector
411
- collector << " AS "
412
409
  case o.as_attr
413
410
  when :string
414
411
  as_attr = Arel::Nodes::SqlLiteral.new('varchar')
415
412
  when :time
416
413
  as_attr = Arel::Nodes::SqlLiteral.new('time')
417
- when :number
418
- as_attr = Arel::Nodes::SqlLiteral.new('int')
414
+ when :date
415
+ as_attr = Arel::Nodes::SqlLiteral.new('date')
419
416
  when :datetime
420
417
  as_attr = Arel::Nodes::SqlLiteral.new('datetime')
418
+ when :number,:decimal, :float
419
+ as_attr = Arel::Nodes::SqlLiteral.new('decimal(10,6)')
420
+ when :int
421
+ collector << "CAST(CAST("
422
+ collector = visit o.left, collector
423
+ collector << " AS decimal(10,0)) AS int)"
424
+ return collector
421
425
  when :binary
422
426
  as_attr = Arel::Nodes::SqlLiteral.new('binary')
423
427
  else
424
428
  as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
425
429
  end
430
+ collector << "CAST("
431
+ collector = visit o.left, collector
432
+ collector << " AS "
426
433
  collector = visit as_attr, collector
427
434
  collector << ")"
428
435
  collector
@@ -290,10 +290,16 @@ module ArelExtensions
290
290
  as_attr = Arel::Nodes::SqlLiteral.new('char')
291
291
  when :time
292
292
  as_attr = Arel::Nodes::SqlLiteral.new('time')
293
- when :number
294
- as_attr = Arel::Nodes::SqlLiteral.new('int')
293
+ when :int
294
+ as_attr = Arel::Nodes::SqlLiteral.new('signed')
295
+ when :number, :decimal
296
+ as_attr = Arel::Nodes::SqlLiteral.new('decimal(20,6)')
295
297
  when :datetime
296
298
  as_attr = Arel::Nodes::SqlLiteral.new('datetime')
299
+ when :date
300
+ as_attr = Arel::Nodes::SqlLiteral.new('date')
301
+ when :time
302
+ as_attr = Arel::Nodes::SqlLiteral.new('time')
297
303
  when :binary
298
304
  as_attr = Arel::Nodes::SqlLiteral.new('binary')
299
305
  else
@@ -464,6 +470,7 @@ module ArelExtensions
464
470
  end
465
471
 
466
472
  def visit_ArelExtensions_Nodes_JsonGroup o, collector
473
+ return super if !json_supported?
467
474
  if o.as_array
468
475
  collector << 'JSON_ARRAYAGG('
469
476
  collector = visit o.hash, collector
@@ -222,15 +222,27 @@ module ArelExtensions
222
222
  def visit_ArelExtensions_Nodes_Cast o, collector
223
223
  case o.as_attr
224
224
  when :string
225
- as_attr = Arel::Nodes::SqlLiteral.new('varchar(255)')
225
+ collector << "TO_CHAR("
226
+ collector = visit o.left, collector
227
+ collector << ")"
228
+ return collector
226
229
  when :time
227
- left = Arel::Nodes::NamedFunction.new('TO_CHAR',[o.left,Arel::Nodes.build_quoted('HH24:MI:SS')])
228
- collector = visit left, collector
230
+ collector << "TO_DATE(TO_CHAR("
231
+ collector = visit o.left, collector
232
+ collector << ",'HH24:MI:SS'),'HH24:MI:SS')"
233
+ return collector
234
+ when :number, :decimal
235
+ collector << "TO_NUMBER("
236
+ collector = visit o.left, collector
237
+ collector << ")"
229
238
  return collector
230
- when :number
231
- as_attr = Arel::Nodes::SqlLiteral.new('int')
232
239
  when :datetime
233
240
  as_attr = Arel::Nodes::SqlLiteral.new('timestamp')
241
+ when :date
242
+ collector << "TO_DATE(TO_CHAR("
243
+ collector = visit o.left, collector
244
+ collector << ",'YYYY-MM-DD'),'YYYY-MM-DD')"
245
+ return collector
234
246
  when :binary
235
247
  as_attr = Arel::Nodes::SqlLiteral.new('binary')
236
248
  else
@@ -278,23 +278,30 @@ module ArelExtensions
278
278
  end
279
279
 
280
280
  def visit_ArelExtensions_Nodes_Cast o, collector
281
- collector << "CAST("
282
- collector = visit o.left, collector
283
- collector << " AS "
284
- case o.as_attr
281
+ as_attr = case o.as_attr
285
282
  when :string
286
- as_attr = Arel::Nodes::SqlLiteral.new('varchar')
283
+ Arel::Nodes::SqlLiteral.new('varchar')
287
284
  when :time
288
- as_attr = Arel::Nodes::SqlLiteral.new('time')
289
- when :number
290
- as_attr = Arel::Nodes::SqlLiteral.new('int')
285
+ Arel::Nodes::SqlLiteral.new('time')
286
+ when :int
287
+ collector << "CAST(CAST("
288
+ collector = visit o.left, collector
289
+ collector << " AS numeric) AS int)"
290
+ return collector
291
+ when :number, :decimal, :float
292
+ Arel::Nodes::SqlLiteral.new('numeric')
291
293
  when :datetime
292
- as_attr = Arel::Nodes::SqlLiteral.new('datetime')
294
+ Arel::Nodes::SqlLiteral.new('timestamp')
295
+ when :date
296
+ Arel::Nodes::SqlLiteral.new('date')
293
297
  when :binary
294
- as_attr = Arel::Nodes::SqlLiteral.new('binary')
298
+ Arel::Nodes::SqlLiteral.new('binary')
295
299
  else
296
- as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
300
+ Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
297
301
  end
302
+ collector << "CAST("
303
+ collector = visit o.left, collector
304
+ collector << " AS "
298
305
  collector = visit as_attr, collector
299
306
  collector << ")"
300
307
  collector
@@ -265,9 +265,9 @@ module ArelExtensions
265
265
  case o.as_attr
266
266
  when :string
267
267
  as_attr = Arel::Nodes::SqlLiteral.new('char')
268
- when :number
268
+ when :int
269
269
  as_attr = Arel::Nodes::SqlLiteral.new('int')
270
- when :decimal, :float
270
+ when :decimal, :float, :number
271
271
  as_attr = Arel::Nodes::SqlLiteral.new('float')
272
272
  when :datetime
273
273
  as_attr = Arel::Nodes::SqlLiteral.new('datetime')
@@ -433,9 +433,24 @@ module ArelExtensions
433
433
  # TODO; cast types
434
434
  def test_cast_types
435
435
  assert_equal "5", t(@lucas, @age.cast(:string))
436
- if @env_db == 'mysql' || @env_db == 'postgresql' || @env_db == 'oracle'
437
- assert_equal 1, t(@laure,ArelExtensions::Nodes::Case.new.when(@duration.cast(:time).cast(:string).eq("12:42:21")).then(1).else(0))
438
- assert_equal 1, t(@laure,ArelExtensions::Nodes::Case.new.when(@duration.cast(:time).eq("12:42:21")).then(1).else(0))
436
+ updated_at = Time.utc(2014, 3, 3, 12, 42, 0)
437
+ if @env_db == 'mysql' || @env_db == 'postgresql' || @env_db == 'oracle' || @env_db == 'mssql'
438
+ 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
+ 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'
440
+ assert_equal "20.16", t(@laure,@score.cast(:string)).gsub(/[0]*\z/,'')
441
+ assert_equal "20.161", t(@laure,@score.cast(:string)+1).gsub(/[0]*1\z/,'1')
442
+ assert_equal 21.16, t(@laure,@score.cast(:string).cast(:decimal)+1)
443
+ assert_equal 21, t(@laure,@score.cast(:string).cast(:int)+1)
444
+
445
+ assert_equal String, t(@lucas,@updated_at.cast(:string)).class
446
+ assert_equal Date, t(@lucas,@updated_at.cast(:date)).class unless @env_db == 'oracle'
447
+ assert_equal Time, t(@lucas,@updated_at.cast(:string).cast(:datetime)).class
448
+ assert_equal Time, t(@lucas,@updated_at.cast(:time)).class
449
+
450
+ assert_equal "2014-03-03 12:42:00", t(@lucas,@updated_at.cast(:string)) unless @env_db == 'mssql' #locale dependent
451
+ assert_equal Time.parse("2014-03-03 12:42:00 UTC"), t(@lucas,@updated_at.cast(:string).cast(:datetime))
452
+ assert_equal Date.parse("2014-03-03"), t(@lucas,@updated_at.cast(:date))
453
+ assert_equal "12:42:00", t(@lucas,@updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle'
439
454
  end
440
455
  end
441
456
 
@@ -707,7 +722,7 @@ module ArelExtensions
707
722
  parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name,@name => @age}).group(false)))
708
723
  assert_equal ([{"5" => "Lucas"},{ "15" => "Sophie"},{ "23" => "Myung"},{ "25" => "Laure"}]),
709
724
  parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name}).group(true,[@age])))
710
-
725
+
711
726
  skip "Not Yet Implemented" if $sqlite || ['oracle','mssql'].include?(@env_db)
712
727
  #get
713
728
  h1 = Arel.json({@name => @name+@name,@name+"2" => 1})
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.1.10
4
+ version: 1.2.0
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-04-09 00:00:00.000000000 Z
13
+ date: 2019-04-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: arel