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 +4 -4
- data/Rakefile +1 -1
- data/appveyor.yml +6 -1
- data/gemfiles/rails3.gemfile +2 -2
- data/gemfiles/rails4.gemfile +1 -1
- data/gemfiles/rails5_0.gemfile +1 -1
- data/gemfiles/rails5_1_4.gemfile +1 -1
- data/gemfiles/rails5_2_beta.gemfile +1 -1
- data/lib/arel_extensions/nodes/cast.rb +45 -48
- data/lib/arel_extensions/nodes/formatted_number.rb +1 -33
- data/lib/arel_extensions/nodes/function.rb +10 -4
- data/lib/arel_extensions/predications.rb +0 -4
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +1 -1
- data/lib/arel_extensions/visitors/mysql.rb +30 -8
- data/lib/arel_extensions/visitors/oracle.rb +77 -5
- data/lib/arel_extensions/visitors/postgresql.rb +23 -0
- data/lib/arel_extensions/visitors/sqlite.rb +48 -0
- data/lib/arel_extensions/visitors/to_sql.rb +30 -8
- data/test/visitors/test_to_sql.rb +9 -10
- data/test/with_ar/all_agnostic_test.rb +36 -4
- 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: c66dd287fd3b27c733812e1bc6c0a516bbc54494
|
4
|
+
data.tar.gz: accb309d06e293a5d5542d76ad4e6dd1c6da8411
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e80b2f3c6950084e9b654e7ce213b7cda34b2d1c3142f559c04a4d7be3db090cafb4efd74532f3400b669eaae7f787980804347d7eefc1d398dd8af6849d5a93
|
7
|
+
data.tar.gz: 3e52c96fd662d2e8a6869480ddb53f6714a07dfb6dfdf080a0864d092a14dc53e6f4186d5531467eeac0877e49fe3c559c744919fa0dc93de336d564b4a12caf
|
data/Rakefile
CHANGED
data/appveyor.yml
CHANGED
data/gemfiles/rails3.gemfile
CHANGED
@@ -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 => "../"
|
data/gemfiles/rails4.gemfile
CHANGED
@@ -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/
|
data/gemfiles/rails5_0.gemfile
CHANGED
@@ -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/
|
data/gemfiles/rails5_1_4.gemfile
CHANGED
@@ -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
|
-
|
3
|
-
|
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
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|
-
|
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
|
51
|
-
|
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
|
79
|
-
|
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,6 +1,6 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Visitors
|
3
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
254
|
+
def visit_ArelExtensions_Nodes_Cast o, collector
|
255
255
|
collector << "CAST("
|
256
256
|
collector = visit o.left, collector
|
257
257
|
collector << " AS "
|
258
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
292
|
-
|
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
|
-
|
390
|
-
|
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.
|
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-
|
13
|
+
date: 2018-03-22 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: arel
|