arel_extensions 1.2.16 → 1.2.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/lib/arel_extensions/boolean_functions.rb +20 -0
- data/lib/arel_extensions/common_sql_functions.rb +2 -2
- data/lib/arel_extensions/nodes/cast.rb +4 -1
- data/lib/arel_extensions/nodes/date_diff.rb +3 -3
- data/lib/arel_extensions/nodes/format.rb +26 -1
- data/lib/arel_extensions/nodes/function.rb +16 -12
- data/lib/arel_extensions/predications.rb +3 -3
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mysql.rb +2 -2
- data/lib/arel_extensions/visitors/oracle.rb +10 -0
- data/lib/arel_extensions/visitors/postgresql.rb +2 -0
- data/lib/arel_extensions/visitors/to_sql.rb +2 -0
- data/test/real_db_test.rb +1 -1
- data/test/with_ar/all_agnostic_test.rb +1 -0
- data/version_v1.rb +1 -1
- data/version_v2.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63535bd97d5c08485672454464e4fd96413ba4f5e7660dd45f008b113f6c92ef
|
4
|
+
data.tar.gz: 1478ed16cc0a12b70198334394a456c43a33a480ab9d52786a1be75f11016d4a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c862b43fb3b4f5758fa2454888bd5abbea6dc802cfb401ba5866fc9c3ce05de6aafb5db151b3a85ac63617fba2f773bb5230c5f0a2f4781a8c07ee521e70783
|
7
|
+
data.tar.gz: 1114bf913a0e79a0ebf1a9c28c995e3eb428147615bc51861c55de322e0dc3c5968949dce4cf432c525e470fbfa9d49a6d3a371ccdf69fe602a8f2db608c1834
|
data/.travis.yml
CHANGED
@@ -63,8 +63,28 @@ class Arel::Nodes::Or
|
|
63
63
|
@children = children
|
64
64
|
end
|
65
65
|
|
66
|
+
def initialize_copy(other)
|
67
|
+
super
|
68
|
+
@children = other.children.copy if other.children
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
def left
|
73
|
+
children.first
|
74
|
+
end
|
75
|
+
|
76
|
+
def right
|
77
|
+
children[1]
|
78
|
+
end
|
79
|
+
|
66
80
|
def hash
|
67
81
|
children.hash
|
68
82
|
end
|
69
83
|
|
84
|
+
def eql?(other)
|
85
|
+
self.class == other.class &&
|
86
|
+
children == other.children
|
87
|
+
end
|
88
|
+
alias :== :eql?
|
89
|
+
|
70
90
|
end
|
@@ -12,7 +12,7 @@ module ArelExtensions
|
|
12
12
|
db.enable_load_extension(0)
|
13
13
|
rescue => e
|
14
14
|
$load_extension_disabled = true
|
15
|
-
puts "
|
15
|
+
puts "cannot load extensions #{e.inspect}"
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -44,7 +44,7 @@ module ArelExtensions
|
|
44
44
|
begin
|
45
45
|
add_sqlite_functions
|
46
46
|
rescue => e
|
47
|
-
puts "
|
47
|
+
puts "cannot add sqlite functions #{e.inspect}"
|
48
48
|
end
|
49
49
|
end
|
50
50
|
if File.exist?("init/#{env_db}.sql")
|
@@ -14,7 +14,10 @@ module ArelExtensions
|
|
14
14
|
@return_type = :decimal
|
15
15
|
when :number
|
16
16
|
@return_type = :number
|
17
|
-
when 'char', 'varchar', '
|
17
|
+
when 'char', 'varchar', 'nchar', 'nvarchar'
|
18
|
+
@return_type = :string
|
19
|
+
when 'text', :text, 'ntext', :ntext
|
20
|
+
@as_attr = expr[1].to_sym
|
18
21
|
@return_type = :string
|
19
22
|
when :datetime, 'datetime','smalldatetime'
|
20
23
|
@return_type = :datetime
|
@@ -157,11 +157,11 @@ module ArelExtensions
|
|
157
157
|
when Integer
|
158
158
|
object.days
|
159
159
|
when DateTime, Time, Date
|
160
|
-
raise(ArgumentError, "#{object.class}
|
160
|
+
raise(ArgumentError, "#{object.class} cannot be converted to Integer")
|
161
161
|
when String
|
162
162
|
Arel::Nodes.build_quoted(object)
|
163
163
|
else
|
164
|
-
raise(ArgumentError, "#{object.class}
|
164
|
+
raise(ArgumentError, "#{object.class} cannot be converted to Integer")
|
165
165
|
end
|
166
166
|
end
|
167
167
|
end
|
@@ -183,7 +183,7 @@ module ArelExtensions
|
|
183
183
|
if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === object
|
184
184
|
object.to_i
|
185
185
|
else
|
186
|
-
raise(ArgumentError, "#{object.class}
|
186
|
+
raise(ArgumentError, "#{object.class} cannot be converted to Number")
|
187
187
|
end
|
188
188
|
end
|
189
189
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'strscan'
|
2
|
+
|
1
3
|
module ArelExtensions
|
2
4
|
module Nodes
|
3
5
|
class Format < Function
|
@@ -6,10 +8,33 @@ module ArelExtensions
|
|
6
8
|
attr_accessor :col_type, :iso_format
|
7
9
|
def initialize expr
|
8
10
|
col = expr.first
|
9
|
-
@iso_format = expr[1]
|
11
|
+
@iso_format = convert_format(expr[1])
|
10
12
|
@col_type = type_of_attribute(col)
|
11
13
|
super [col, convert_to_string_node(@iso_format)]
|
12
14
|
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
# Address portability issues with some of the formats.
|
19
|
+
def convert_format(fmt)
|
20
|
+
s = StringScanner.new fmt
|
21
|
+
res = StringIO.new
|
22
|
+
while !s.eos?
|
23
|
+
res <<
|
24
|
+
case
|
25
|
+
when s.scan(/%D/) then '%m/%d/%y'
|
26
|
+
when s.scan(/%F/) then '%Y-%m-%d'
|
27
|
+
when s.scan(/%R/) then '%H:%M'
|
28
|
+
when s.scan(/%r/) then '%I:%M:%S %p'
|
29
|
+
when s.scan(/%T/) then '%H:%M:%S'
|
30
|
+
when s.scan(/%v/) then '%e-%b-%Y'
|
31
|
+
|
32
|
+
when s.scan(/[^%]+/) then s.matched
|
33
|
+
when s.scan(/./) then s.matched
|
34
|
+
end
|
35
|
+
end
|
36
|
+
res.string
|
37
|
+
end
|
13
38
|
end
|
14
39
|
end
|
15
40
|
end
|
@@ -10,6 +10,10 @@ module ArelExtensions
|
|
10
10
|
|
11
11
|
RETURN_TYPE = :string # by default...
|
12
12
|
|
13
|
+
# Support multibyte string if they are available.
|
14
|
+
MBSTRING =
|
15
|
+
defined?(ActiveSupport::Multibyte::Chars) ? ActiveSupport::Multibyte::Chars : String
|
16
|
+
|
13
17
|
# overrides as to make new Node like AliasPredication
|
14
18
|
|
15
19
|
def return_type
|
@@ -63,7 +67,7 @@ module ArelExtensions
|
|
63
67
|
Arel::Nodes.build_quoted(object, self)
|
64
68
|
when Time
|
65
69
|
Arel::Nodes.build_quoted(object.strftime('%H:%M:%S'), self)
|
66
|
-
when String, Symbol
|
70
|
+
when MBSTRING, String, Symbol
|
67
71
|
Arel::Nodes.build_quoted(object.to_s)
|
68
72
|
when Date
|
69
73
|
Arel::Nodes.build_quoted(object.to_s, self)
|
@@ -74,7 +78,7 @@ module ArelExtensions
|
|
74
78
|
when Array
|
75
79
|
Arel::Nodes::Grouping.new(object.map{|r| convert_to_node(e)})
|
76
80
|
else
|
77
|
-
raise(ArgumentError, "#{object.class}
|
81
|
+
raise(ArgumentError, "#{object.class} cannot be converted to CONCAT arg")
|
78
82
|
end
|
79
83
|
end
|
80
84
|
|
@@ -97,8 +101,8 @@ module ArelExtensions
|
|
97
101
|
Arel::Nodes.build_quoted(object, self)
|
98
102
|
when Time
|
99
103
|
Arel::Nodes.build_quoted(object.strftime('%H:%M:%S'), self)
|
100
|
-
when String
|
101
|
-
Arel::Nodes.build_quoted(object)
|
104
|
+
when MBSTRING, String
|
105
|
+
Arel::Nodes.build_quoted(object.to_s)
|
102
106
|
when Date
|
103
107
|
Arel::Nodes.build_quoted(object, self)
|
104
108
|
when NilClass
|
@@ -106,7 +110,7 @@ module ArelExtensions
|
|
106
110
|
when ActiveSupport::Duration
|
107
111
|
Arel::Nodes.build_quoted(object.to_i.to_s)
|
108
112
|
else
|
109
|
-
raise(ArgumentError, "#{object.class}
|
113
|
+
raise(ArgumentError, "#{object.class} cannot be converted to CONCAT arg")
|
110
114
|
end
|
111
115
|
end
|
112
116
|
|
@@ -116,12 +120,12 @@ module ArelExtensions
|
|
116
120
|
object
|
117
121
|
when DateTime, Time
|
118
122
|
Arel::Nodes.build_quoted(Date.new(object.year, object.month, object.day), self)
|
119
|
-
when String
|
120
|
-
Arel::Nodes.build_quoted(Date.parse(object), self)
|
123
|
+
when MBSTRING, String
|
124
|
+
Arel::Nodes.build_quoted(Date.parse(object.to_s), self)
|
121
125
|
when Date
|
122
126
|
Arel::Nodes.build_quoted(object, self)
|
123
127
|
else
|
124
|
-
raise(ArgumentError, "#{object.class}
|
128
|
+
raise(ArgumentError, "#{object.class} cannot be converted to Date")
|
125
129
|
end
|
126
130
|
end
|
127
131
|
|
@@ -131,12 +135,12 @@ module ArelExtensions
|
|
131
135
|
object
|
132
136
|
when DateTime, Time
|
133
137
|
Arel::Nodes.build_quoted(object, self)
|
134
|
-
when String
|
135
|
-
Arel::Nodes.build_quoted(Time.parse(object), self)
|
138
|
+
when MBSTRING, String
|
139
|
+
Arel::Nodes.build_quoted(Time.parse(object.to_s), self)
|
136
140
|
when Date
|
137
141
|
Arel::Nodes.build_quoted(Time.utc(object.year, object.month, object.day, 0, 0, 0), self)
|
138
142
|
else
|
139
|
-
raise(ArgumentError, "#{object.class}
|
143
|
+
raise(ArgumentError, "#{object.class} cannot be converted to Datetime")
|
140
144
|
end
|
141
145
|
end
|
142
146
|
|
@@ -154,7 +158,7 @@ module ArelExtensions
|
|
154
158
|
when NilClass
|
155
159
|
0
|
156
160
|
else
|
157
|
-
raise(ArgumentError, "#{object.class}
|
161
|
+
raise(ArgumentError, "#{object.class} cannot be converted to NUMBER arg")
|
158
162
|
end
|
159
163
|
end
|
160
164
|
|
@@ -26,7 +26,7 @@ module ArelExtensions
|
|
26
26
|
case other
|
27
27
|
when Range
|
28
28
|
self.between(other)
|
29
|
-
when Arel::Nodes::Grouping
|
29
|
+
when Arel::Nodes::Grouping, ArelExtensions::Nodes::Union, ArelExtensions::Nodes::UnionAll
|
30
30
|
Arel::Nodes::In.new(self, quoted_node(other))
|
31
31
|
when Enumerable
|
32
32
|
nils, values = other.partition{ |v| v.nil? }
|
@@ -54,7 +54,7 @@ module ArelExtensions
|
|
54
54
|
case other
|
55
55
|
when Range
|
56
56
|
Arel::Nodes::Not.new(self.between(other))
|
57
|
-
when Arel::Nodes::Grouping
|
57
|
+
when Arel::Nodes::Grouping, ArelExtensions::Nodes::Union, ArelExtensions::Nodes::UnionAll
|
58
58
|
Arel::Nodes::NotIn.new(self, quoted_node(other))
|
59
59
|
when Enumerable
|
60
60
|
nils, values = other.partition{ |v| v.nil? }
|
@@ -94,7 +94,7 @@ module ArelExtensions
|
|
94
94
|
when ActiveSupport::Duration
|
95
95
|
object.to_i
|
96
96
|
else
|
97
|
-
raise(ArgumentError, "#{object.class}
|
97
|
+
raise(ArgumentError, "#{object.class} cannot be converted to CONCAT arg")
|
98
98
|
end
|
99
99
|
end
|
100
100
|
end
|
@@ -447,9 +447,9 @@ module ArelExtensions
|
|
447
447
|
collector
|
448
448
|
end
|
449
449
|
|
450
|
-
# JSON if implemented only after 10.2.3 in MariaDb and 5.7 in MySql
|
450
|
+
# JSON if implemented only after 10.2.3 (aggregations after 10.5.0) in MariaDb and 5.7 (aggregations after 5.7.22) in MySql
|
451
451
|
def json_supported?
|
452
|
-
version_supported?('10.
|
452
|
+
version_supported?('10.5.0', '5.7.22')
|
453
453
|
end
|
454
454
|
|
455
455
|
def window_supported?
|
@@ -257,6 +257,16 @@ module ArelExtensions
|
|
257
257
|
collector = visit o.left, collector
|
258
258
|
collector << ")"
|
259
259
|
return collector
|
260
|
+
when :text
|
261
|
+
collector << "TO_CLOB("
|
262
|
+
collector = visit o.left, collector
|
263
|
+
collector << ")"
|
264
|
+
return collector
|
265
|
+
when :ntext
|
266
|
+
collector << "TO_NCLOB("
|
267
|
+
collector = visit o.left, collector
|
268
|
+
collector << ")"
|
269
|
+
return collector
|
260
270
|
when :time
|
261
271
|
if (o.left.respond_to?(:return_type) && o.left.return_type == :string) || o.left.is_a?(Arel::Nodes::Quoted)
|
262
272
|
collector << "TO_DATE("
|
@@ -295,6 +295,8 @@ module ArelExtensions
|
|
295
295
|
as_attr = Arel::Nodes::SqlLiteral.new('time')
|
296
296
|
when :binary
|
297
297
|
as_attr = Arel::Nodes::SqlLiteral.new('binary')
|
298
|
+
when :text, :ntext
|
299
|
+
as_attr = Arel::Nodes::SqlLiteral.new('text')
|
298
300
|
else
|
299
301
|
as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
|
300
302
|
end
|
data/test/real_db_test.rb
CHANGED
@@ -356,6 +356,7 @@ module ArelExtensions
|
|
356
356
|
assert_equal '2016-05-23', t(@lucas, @created_at.format('%Y-%m-%d'))
|
357
357
|
skip "SQL Server does not accept any format" if @env_db == 'mssql'
|
358
358
|
assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S'))
|
359
|
+
assert_equal '12:42%', t(@lucas, @updated_at.format('%R%%'))
|
359
360
|
end
|
360
361
|
|
361
362
|
def test_coalesce
|
data/version_v1.rb
CHANGED
data/version_v2.rb
CHANGED
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.2.
|
4
|
+
version: 1.2.17
|
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: 2020-
|
13
|
+
date: 2020-10-30 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: arel
|