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 +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
|