arel_extensions 2.0.21 → 2.2.2
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/.codeclimate.yml +1 -2
- data/.github/workflows/publish.yml +29 -0
- data/.github/workflows/release.yml +30 -0
- data/.github/workflows/ruby.yml +377 -80
- data/.gitignore +7 -6
- data/.rubocop.yml +62 -1
- data/CONTRIBUTING.md +102 -0
- data/Gemfile +2 -23
- data/NEWS.md +89 -0
- data/README.md +228 -84
- data/Rakefile +11 -4
- data/TODO +0 -1
- data/appveyor.yml +60 -22
- data/arel_extensions.gemspec +11 -12
- data/bin/build +15 -0
- data/bin/compose +6 -0
- data/bin/publish +8 -0
- data/dev/arelx.dockerfile +44 -0
- data/dev/compose.yaml +71 -0
- data/dev/postgres.dockerfile +5 -0
- data/dev/rbenv +189 -0
- data/gemfiles/rails3.gemfile +10 -10
- data/gemfiles/rails4_2.gemfile +38 -0
- data/gemfiles/rails5.gemfile +29 -0
- data/gemfiles/rails5_1_4.gemfile +13 -13
- data/gemfiles/rails5_2.gemfile +16 -14
- data/gemfiles/rails6.gemfile +18 -15
- data/gemfiles/rails6_1.gemfile +18 -15
- data/gemfiles/rails7.gemfile +33 -0
- data/gemfiles/rails7_1.gemfile +33 -0
- data/gemfiles/rails7_2.gemfile +33 -0
- data/gemspecs/arel_extensions-v1.gemspec +12 -13
- data/gemspecs/arel_extensions-v2.gemspec +11 -12
- data/init/mssql.sql +0 -0
- data/init/mysql.sql +0 -0
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +0 -0
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/aliases.rb +14 -0
- data/lib/arel_extensions/attributes.rb +10 -2
- data/lib/arel_extensions/boolean_functions.rb +2 -4
- data/lib/arel_extensions/common_sql_functions.rb +12 -12
- data/lib/arel_extensions/comparators.rb +14 -14
- data/lib/arel_extensions/date_duration.rb +14 -9
- data/lib/arel_extensions/helpers.rb +62 -0
- data/lib/arel_extensions/insert_manager.rb +19 -17
- data/lib/arel_extensions/math.rb +48 -45
- data/lib/arel_extensions/math_functions.rb +18 -18
- data/lib/arel_extensions/nodes/abs.rb +0 -0
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -0
- data/lib/arel_extensions/nodes/blank.rb +1 -1
- data/lib/arel_extensions/nodes/case.rb +10 -12
- data/lib/arel_extensions/nodes/cast.rb +6 -6
- data/lib/arel_extensions/nodes/ceil.rb +0 -0
- data/lib/arel_extensions/nodes/change_case.rb +0 -0
- data/lib/arel_extensions/nodes/coalesce.rb +1 -1
- data/lib/arel_extensions/nodes/collate.rb +9 -9
- data/lib/arel_extensions/nodes/concat.rb +2 -2
- data/lib/arel_extensions/nodes/date_diff.rb +33 -14
- data/lib/arel_extensions/nodes/duration.rb +0 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +0 -0
- data/lib/arel_extensions/nodes/floor.rb +0 -0
- data/lib/arel_extensions/nodes/format.rb +3 -2
- data/lib/arel_extensions/nodes/formatted_date.rb +42 -0
- data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
- data/lib/arel_extensions/nodes/function.rb +22 -26
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +15 -9
- data/lib/arel_extensions/nodes/length.rb +6 -0
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +1 -1
- data/lib/arel_extensions/nodes/log10.rb +0 -0
- data/lib/arel_extensions/nodes/matches.rb +1 -1
- data/lib/arel_extensions/nodes/md5.rb +0 -0
- data/lib/arel_extensions/nodes/power.rb +0 -0
- data/lib/arel_extensions/nodes/rand.rb +0 -0
- data/lib/arel_extensions/nodes/repeat.rb +2 -2
- data/lib/arel_extensions/nodes/replace.rb +2 -10
- data/lib/arel_extensions/nodes/rollup.rb +36 -0
- data/lib/arel_extensions/nodes/round.rb +0 -0
- data/lib/arel_extensions/nodes/select.rb +10 -0
- data/lib/arel_extensions/nodes/soundex.rb +2 -2
- data/lib/arel_extensions/nodes/std.rb +0 -0
- data/lib/arel_extensions/nodes/substring.rb +1 -1
- data/lib/arel_extensions/nodes/sum.rb +0 -0
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +2 -2
- data/lib/arel_extensions/nodes/union.rb +5 -5
- data/lib/arel_extensions/nodes/union_all.rb +4 -4
- data/lib/arel_extensions/nodes/wday.rb +0 -0
- data/lib/arel_extensions/nodes.rb +0 -0
- data/lib/arel_extensions/null_functions.rb +16 -0
- data/lib/arel_extensions/predications.rb +10 -10
- data/lib/arel_extensions/railtie.rb +1 -1
- data/lib/arel_extensions/set_functions.rb +3 -3
- data/lib/arel_extensions/string_functions.rb +19 -10
- data/lib/arel_extensions/tasks.rb +2 -2
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/convert_format.rb +0 -0
- data/lib/arel_extensions/visitors/ibm_db.rb +20 -20
- data/lib/arel_extensions/visitors/mssql.rb +394 -169
- data/lib/arel_extensions/visitors/mysql.rb +238 -151
- data/lib/arel_extensions/visitors/oracle.rb +170 -131
- data/lib/arel_extensions/visitors/oracle12.rb +16 -16
- data/lib/arel_extensions/visitors/postgresql.rb +170 -140
- data/lib/arel_extensions/visitors/sqlite.rb +88 -87
- data/lib/arel_extensions/visitors/to_sql.rb +185 -156
- data/lib/arel_extensions/visitors.rb +73 -60
- data/lib/arel_extensions.rb +173 -36
- data/test/arelx_test_helper.rb +49 -1
- data/test/database.yml +13 -7
- data/test/real_db_test.rb +101 -83
- data/test/support/fake_record.rb +8 -2
- data/test/test_comparators.rb +5 -5
- data/test/visitors/test_bulk_insert_oracle.rb +5 -5
- data/test/visitors/test_bulk_insert_sqlite.rb +5 -5
- data/test/visitors/test_bulk_insert_to_sql.rb +5 -5
- data/test/visitors/test_oracle.rb +14 -14
- data/test/visitors/test_to_sql.rb +121 -93
- data/test/with_ar/all_agnostic_test.rb +630 -320
- data/test/with_ar/insert_agnostic_test.rb +25 -18
- data/test/with_ar/test_bulk_sqlite.rb +11 -7
- data/test/with_ar/test_math_sqlite.rb +18 -14
- data/test/with_ar/test_string_mysql.rb +26 -22
- data/test/with_ar/test_string_sqlite.rb +26 -22
- data/version_v1.rb +1 -1
- data/version_v2.rb +1 -1
- metadata +24 -26
- data/.travis/oracle/download.js +0 -152
- data/.travis/oracle/download.sh +0 -30
- data/.travis/oracle/download_ojdbc.js +0 -116
- data/.travis/oracle/install.sh +0 -34
- data/.travis/setup_accounts.sh +0 -9
- data/.travis/sqlite3/extension-functions.sh +0 -6
- data/.travis.yml +0 -193
- data/gemfiles/rails4.gemfile +0 -29
- data/gemfiles/rails5_0.gemfile +0 -29
@@ -22,14 +22,14 @@ module ArelExtensions
|
|
22
22
|
|
23
23
|
def as other
|
24
24
|
res = Arel::Nodes::As.new(self.clone, Arel.sql(other))
|
25
|
-
if Gem::Version.new(Arel::VERSION) >= Gem::Version.new(
|
25
|
+
if Gem::Version.new(Arel::VERSION) >= Gem::Version.new('9.0.0')
|
26
26
|
self.alias = Arel.sql(other)
|
27
27
|
end
|
28
28
|
res
|
29
29
|
end
|
30
30
|
|
31
31
|
def expr
|
32
|
-
|
32
|
+
@expressions.first
|
33
33
|
end
|
34
34
|
|
35
35
|
def left
|
@@ -41,21 +41,17 @@ module ArelExtensions
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def ==(other)
|
44
|
-
Arel::Nodes::Equality.new self, Arel
|
44
|
+
Arel::Nodes::Equality.new self, Arel.quoted(other, self)
|
45
45
|
end
|
46
46
|
|
47
47
|
def !=(other)
|
48
|
-
Arel::Nodes::NotEqual.new self, Arel
|
48
|
+
Arel::Nodes::NotEqual.new self, Arel.quoted(other, self)
|
49
49
|
end
|
50
50
|
|
51
51
|
def type_of_attribute(att)
|
52
52
|
case att
|
53
53
|
when Arel::Attributes::Attribute
|
54
|
-
|
55
|
-
Arel::Table.engine.connection.schema_cache.columns_hash(att.relation.table_name)[att.name.to_s].type
|
56
|
-
rescue
|
57
|
-
att
|
58
|
-
end
|
54
|
+
Arel.column_of(att.relation.table_name, att.name.to_s)&.type || att
|
59
55
|
when ArelExtensions::Nodes::Function
|
60
56
|
att.return_type
|
61
57
|
# else
|
@@ -68,19 +64,19 @@ module ArelExtensions
|
|
68
64
|
when Arel::Attributes::Attribute, Arel::Nodes::Node, Integer
|
69
65
|
object
|
70
66
|
when DateTime
|
71
|
-
Arel
|
67
|
+
Arel.quoted(object, self)
|
72
68
|
when Time
|
73
|
-
Arel
|
69
|
+
Arel.quoted(object.strftime('%H:%M:%S'), self)
|
74
70
|
when MBSTRING, String, Symbol
|
75
|
-
Arel
|
71
|
+
Arel.quoted(object.to_s)
|
76
72
|
when Date
|
77
|
-
Arel
|
73
|
+
Arel.quoted(object.to_s, self)
|
78
74
|
when NilClass
|
79
75
|
Arel.sql('NULL')
|
80
76
|
when ActiveSupport::Duration
|
81
77
|
Arel.sql(object.to_i)
|
82
78
|
when Array
|
83
|
-
Arel
|
79
|
+
Arel.grouping(object.map{|e| convert_to_node(e)})
|
84
80
|
else
|
85
81
|
raise(ArgumentError, "#{object.class} cannot be converted to CONCAT arg")
|
86
82
|
end
|
@@ -91,7 +87,7 @@ module ArelExtensions
|
|
91
87
|
when Arel::Nodes::Node
|
92
88
|
object
|
93
89
|
when Integer
|
94
|
-
Arel
|
90
|
+
Arel.quoted(object.to_s)
|
95
91
|
when Arel::Attributes::Attribute
|
96
92
|
case self.type_of_attribute(object)
|
97
93
|
when :date
|
@@ -102,17 +98,17 @@ module ArelExtensions
|
|
102
98
|
object
|
103
99
|
end
|
104
100
|
when DateTime
|
105
|
-
Arel
|
101
|
+
Arel.quoted(object, self)
|
106
102
|
when Time
|
107
|
-
Arel
|
103
|
+
Arel.quoted(object.strftime('%H:%M:%S'), self)
|
108
104
|
when MBSTRING, String
|
109
|
-
Arel
|
105
|
+
Arel.quoted(object.to_s)
|
110
106
|
when Date
|
111
|
-
Arel
|
107
|
+
Arel.quoted(object, self)
|
112
108
|
when NilClass
|
113
109
|
Arel.sql(nil)
|
114
110
|
when ActiveSupport::Duration
|
115
|
-
Arel
|
111
|
+
Arel.quoted(object.to_i.to_s)
|
116
112
|
else
|
117
113
|
raise(ArgumentError, "#{object.class} cannot be converted to CONCAT arg")
|
118
114
|
end
|
@@ -123,11 +119,11 @@ module ArelExtensions
|
|
123
119
|
when Arel::Attributes::Attribute, Arel::Nodes::Node
|
124
120
|
object
|
125
121
|
when DateTime, Time
|
126
|
-
Arel
|
122
|
+
Arel.quoted(Date.new(object.year, object.month, object.day), self)
|
127
123
|
when MBSTRING, String
|
128
|
-
Arel
|
124
|
+
Arel.quoted(Date.parse(object.to_s), self)
|
129
125
|
when Date
|
130
|
-
Arel
|
126
|
+
Arel.quoted(object, self)
|
131
127
|
else
|
132
128
|
raise(ArgumentError, "#{object.class} cannot be converted to Date")
|
133
129
|
end
|
@@ -138,11 +134,11 @@ module ArelExtensions
|
|
138
134
|
when Arel::Attributes::Attribute, Arel::Nodes::Node
|
139
135
|
object
|
140
136
|
when DateTime, Time
|
141
|
-
Arel
|
137
|
+
Arel.quoted(object, self)
|
142
138
|
when MBSTRING, String
|
143
|
-
Arel
|
139
|
+
Arel.quoted(Time.parse(object.to_s), self)
|
144
140
|
when Date
|
145
|
-
Arel
|
141
|
+
Arel.quoted(Time.utc(object.year, object.month, object.day, 0, 0, 0), self)
|
146
142
|
else
|
147
143
|
raise(ArgumentError, "#{object.class} cannot be converted to Datetime")
|
148
144
|
end
|
File without changes
|
@@ -11,15 +11,19 @@ module ArelExtensions
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def get key
|
14
|
-
JsonGet.new(self,key)
|
14
|
+
JsonGet.new(self, key)
|
15
15
|
end
|
16
16
|
|
17
17
|
def set key, value
|
18
|
-
JsonSet.new(self,key,value)
|
18
|
+
JsonSet.new(self, key, value)
|
19
19
|
end
|
20
20
|
|
21
|
-
def group as_array = true, orders = nil
|
22
|
-
|
21
|
+
def group as_array = true, orders = nil, distinct: false
|
22
|
+
if distinct
|
23
|
+
JsonGroup.new(Arel::Nodes::NamedFunction.new('DISTINCT', [self]), as_array, orders)
|
24
|
+
else
|
25
|
+
JsonGroup.new(self, as_array, orders)
|
26
|
+
end
|
23
27
|
end
|
24
28
|
|
25
29
|
def hash
|
@@ -32,21 +36,23 @@ module ArelExtensions
|
|
32
36
|
n.dict
|
33
37
|
when Array
|
34
38
|
n.map{|e|
|
35
|
-
|
39
|
+
(e.is_a?(Array) || e.is_a?(Hash)) ? Json.new(e) : convert_to_json_node(e)
|
36
40
|
}
|
37
41
|
when Hash
|
38
|
-
n.reduce({}){|acc,v|
|
42
|
+
n.reduce({}){|acc, v|
|
39
43
|
acc[convert_to_json_node(v[0])] = (v[1].is_a?(Array) || v[1].is_a?(Hash)) ? Json.new(v[1]) : convert_to_json_node(v[1])
|
40
44
|
acc
|
41
45
|
}
|
42
46
|
when String, Numeric, TrueClass, FalseClass
|
43
47
|
convert_to_node(n)
|
44
48
|
when Date
|
45
|
-
convert_to_node(n.strftime(
|
49
|
+
convert_to_node(n.strftime('%Y-%m-%d'))
|
46
50
|
when DateTime, Time
|
47
|
-
convert_to_node(n.strftime(
|
51
|
+
convert_to_node(n.strftime('%Y-%m-%dT%H:%M:%S.%L%:z'))
|
48
52
|
when NilClass
|
49
|
-
Arel.
|
53
|
+
Arel.null
|
54
|
+
when Arel::SelectManager
|
55
|
+
Arel.grouping(n)
|
50
56
|
else
|
51
57
|
convert_to_node(n)
|
52
58
|
end
|
File without changes
|
@@ -4,7 +4,7 @@ module ArelExtensions
|
|
4
4
|
attr_accessor :case_sensitive if Arel::VERSION.to_i < 7
|
5
5
|
|
6
6
|
def initialize(left, right, escape = nil)
|
7
|
-
r = Arel
|
7
|
+
r = Arel.quoted(right)
|
8
8
|
if Arel::VERSION.to_i < 7 # managed by default in version 7+ (rails 5), so useful for rails 3 & 4
|
9
9
|
super(left, r, escape)
|
10
10
|
@case_sensitive = false
|
File without changes
|
File without changes
|
File without changes
|
@@ -7,11 +7,11 @@ module ArelExtensions
|
|
7
7
|
tab = expr.map { |arg|
|
8
8
|
convert_to_node(arg)
|
9
9
|
}
|
10
|
-
|
10
|
+
super(tab)
|
11
11
|
end
|
12
12
|
|
13
13
|
def +(other)
|
14
|
-
|
14
|
+
ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -8,11 +8,7 @@ module ArelExtensions
|
|
8
8
|
@left = convert_to_node(left)
|
9
9
|
@pattern = convert_to_node(pattern)
|
10
10
|
@substitute = convert_to_node(substitute)
|
11
|
-
super([@left
|
12
|
-
end
|
13
|
-
|
14
|
-
def +(other)
|
15
|
-
return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
11
|
+
super([@left, @pattern, @substitute])
|
16
12
|
end
|
17
13
|
end
|
18
14
|
|
@@ -24,11 +20,7 @@ module ArelExtensions
|
|
24
20
|
@left = convert_to_node(left)
|
25
21
|
@pattern = (pattern.is_a?(Regexp) ? pattern : %r[#{pattern}])
|
26
22
|
@substitute = convert_to_node(substitute)
|
27
|
-
super([@left
|
28
|
-
end
|
29
|
-
|
30
|
-
def +(other)
|
31
|
-
return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
23
|
+
super([@left, @pattern, @substitute])
|
32
24
|
end
|
33
25
|
end
|
34
26
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# The following is a patch to activerecord when it doesn't
|
2
|
+
# have RollUp defined, i.e. for rails < 5.2
|
3
|
+
|
4
|
+
begin
|
5
|
+
Arel::Nodes.const_get('RollUp')
|
6
|
+
rescue NameError => e
|
7
|
+
module Arel
|
8
|
+
module Nodes
|
9
|
+
class RollUp < Arel::Nodes::Unary
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module Arel
|
15
|
+
module Visitors
|
16
|
+
class PostgreSQL
|
17
|
+
# Utilized by GroupingSet, Cube & RollUp visitors to
|
18
|
+
# handle grouping aggregation semantics
|
19
|
+
def grouping_array_or_grouping_element(o, collector)
|
20
|
+
if o.expr.is_a? Array
|
21
|
+
collector << "( "
|
22
|
+
visit o.expr, collector
|
23
|
+
collector << " )"
|
24
|
+
else
|
25
|
+
visit o.expr, collector
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def visit_Arel_Nodes_RollUp(o, collector)
|
30
|
+
collector << "ROLLUP"
|
31
|
+
grouping_array_or_grouping_element o, collector
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
File without changes
|
@@ -7,11 +7,11 @@ module ArelExtensions
|
|
7
7
|
RETURN_TYPE = :string
|
8
8
|
|
9
9
|
def ==(other)
|
10
|
-
Arel::Nodes::Equality.new self, Arel
|
10
|
+
Arel::Nodes::Equality.new self, Arel.quoted(other, self)
|
11
11
|
end
|
12
12
|
|
13
13
|
def !=(other)
|
14
|
-
Arel::Nodes::NotEqual.new self, Arel
|
14
|
+
Arel::Nodes::NotEqual.new self, Arel.quoted(other, self)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
File without changes
|
File without changes
|
@@ -7,11 +7,11 @@ module ArelExtensions
|
|
7
7
|
tab = expr.map { |arg|
|
8
8
|
convert_to_node(arg)
|
9
9
|
}
|
10
|
-
|
10
|
+
super(tab)
|
11
11
|
end
|
12
12
|
|
13
13
|
def +(other)
|
14
|
-
|
14
|
+
ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -1,20 +1,20 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Nodes
|
3
3
|
class Union < Arel::Nodes::Union
|
4
|
-
def initialize left,right
|
5
|
-
|
4
|
+
def initialize left, right
|
5
|
+
super(left, right)
|
6
6
|
end
|
7
7
|
|
8
8
|
def +(other)
|
9
|
-
|
9
|
+
ArelExtensions::Nodes::Union.new(self, other)
|
10
10
|
end
|
11
11
|
|
12
12
|
def union(other)
|
13
|
-
|
13
|
+
ArelExtensions::Nodes::UnionAll.new(self, other)
|
14
14
|
end
|
15
15
|
|
16
16
|
def as other
|
17
|
-
Arel::Nodes::TableAlias.new Arel
|
17
|
+
Arel::Nodes::TableAlias.new Arel.grouping(self), Arel::Nodes::SqlLiteral.new(other.to_s)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Nodes
|
3
3
|
class UnionAll < Arel::Nodes::UnionAll
|
4
|
-
def initialize left,right
|
5
|
-
|
4
|
+
def initialize left, right
|
5
|
+
super(left, right)
|
6
6
|
end
|
7
7
|
|
8
8
|
def union_all(other)
|
9
|
-
|
9
|
+
ArelExtensions::Nodes::UnionAll.new(self, other)
|
10
10
|
end
|
11
11
|
|
12
12
|
def as other
|
13
|
-
Arel::Nodes::TableAlias.new Arel
|
13
|
+
Arel::Nodes::TableAlias.new Arel.grouping(self), Arel::Nodes::SqlLiteral.new(other.to_s)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
File without changes
|
File without changes
|
@@ -3,6 +3,12 @@ require 'arel_extensions/nodes/is_null'
|
|
3
3
|
|
4
4
|
module ArelExtensions
|
5
5
|
module NullFunctions
|
6
|
+
|
7
|
+
# if_present returns nil if the the value is nil or blank
|
8
|
+
def if_present
|
9
|
+
Arel.when(self.cast(:string).present).then(self)
|
10
|
+
end
|
11
|
+
|
6
12
|
# ISNULL function lets you return an alternative value when an expression is NULL.
|
7
13
|
def is_null
|
8
14
|
ArelExtensions::Nodes::IsNull.new [self]
|
@@ -19,5 +25,15 @@ module ArelExtensions
|
|
19
25
|
args.unshift(self)
|
20
26
|
ArelExtensions::Nodes::Coalesce.new args
|
21
27
|
end
|
28
|
+
|
29
|
+
def coalesce_blank *args
|
30
|
+
res = Arel.when(self.cast(:string).present).then(self)
|
31
|
+
args[0...-1].each do |a|
|
32
|
+
val = a.is_a?(Arel::Nodes::Node) ? a : Arel.quoted(a)
|
33
|
+
res = res.when(val.present).then(a)
|
34
|
+
end
|
35
|
+
res = res.else(args[-1])
|
36
|
+
res
|
37
|
+
end
|
22
38
|
end
|
23
39
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Predications
|
3
3
|
def when right, expression = nil
|
4
|
-
ArelExtensions::Nodes::Case.new(self).when(right,expression)
|
4
|
+
ArelExtensions::Nodes::Case.new(self).when(right, expression)
|
5
5
|
end
|
6
6
|
|
7
|
-
def matches(other, escape = nil,case_sensitive = nil)
|
7
|
+
def matches(other, escape = nil, case_sensitive = nil)
|
8
8
|
if Arel::VERSION.to_i < 7
|
9
|
-
Arel::Nodes::Matches.new(self, Arel
|
9
|
+
Arel::Nodes::Matches.new(self, Arel.quoted(other), escape)
|
10
10
|
else
|
11
|
-
Arel::Nodes::Matches.new(self, Arel
|
11
|
+
Arel::Nodes::Matches.new(self, Arel.quoted(other), escape, case_sensitive)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -17,7 +17,7 @@ module ArelExtensions
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def cast right
|
20
|
-
ArelExtensions::Nodes::Cast.new([self,right])
|
20
|
+
ArelExtensions::Nodes::Cast.new([self, right])
|
21
21
|
end
|
22
22
|
|
23
23
|
def in(*other) # In should handle nil element in the Array
|
@@ -72,7 +72,7 @@ module ArelExtensions
|
|
72
72
|
when Arel::SelectManager
|
73
73
|
Arel::Nodes::NotIn.new(self, other.ast)
|
74
74
|
else
|
75
|
-
Arel::Nodes::NotIn.new(self,quoted_node(other))
|
75
|
+
Arel::Nodes::NotIn.new(self, quoted_node(other))
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
@@ -81,13 +81,13 @@ module ArelExtensions
|
|
81
81
|
when Arel::Attributes::Attribute, Arel::Nodes::Node, Integer
|
82
82
|
object
|
83
83
|
when DateTime
|
84
|
-
Arel
|
84
|
+
Arel.quoted(object, self)
|
85
85
|
when Time
|
86
|
-
Arel
|
86
|
+
Arel.quoted(object.strftime('%H:%M:%S'), self)
|
87
87
|
when String
|
88
|
-
Arel
|
88
|
+
Arel.quoted(object)
|
89
89
|
when Date
|
90
|
-
Arel
|
90
|
+
Arel.quoted(object.to_s, self)
|
91
91
|
when NilClass
|
92
92
|
Arel.sql('NULL')
|
93
93
|
when ActiveSupport::Duration
|
@@ -4,15 +4,15 @@ require 'arel_extensions/nodes/union_all'
|
|
4
4
|
module ArelExtensions
|
5
5
|
module SetFunctions
|
6
6
|
def +(other)
|
7
|
-
ArelExtensions::Nodes::Union.new(self,other)
|
7
|
+
ArelExtensions::Nodes::Union.new(self, other)
|
8
8
|
end
|
9
9
|
|
10
10
|
def union(other)
|
11
|
-
ArelExtensions::Nodes::Union.new(self,other)
|
11
|
+
ArelExtensions::Nodes::Union.new(self, other)
|
12
12
|
end
|
13
13
|
|
14
14
|
def union_all(other)
|
15
|
-
ArelExtensions::Nodes::UnionAll.new(self,other)
|
15
|
+
ArelExtensions::Nodes::UnionAll.new(self, other)
|
16
16
|
end
|
17
17
|
|
18
18
|
def uniq
|
@@ -24,9 +24,17 @@ module ArelExtensions
|
|
24
24
|
ArelExtensions::Nodes::FindInSet.new [other, self]
|
25
25
|
end
|
26
26
|
|
27
|
-
# LENGTH function returns the length of the value in a text field.
|
27
|
+
# LENGTH function returns the length (bytewise) of the value in a text field.
|
28
28
|
def length
|
29
|
-
ArelExtensions::Nodes::Length.new
|
29
|
+
ArelExtensions::Nodes::Length.new self, true
|
30
|
+
end
|
31
|
+
|
32
|
+
def byte_length
|
33
|
+
ArelExtensions::Nodes::Length.new self, true
|
34
|
+
end
|
35
|
+
|
36
|
+
def char_length
|
37
|
+
ArelExtensions::Nodes::Length.new self, false
|
30
38
|
end
|
31
39
|
|
32
40
|
# LOCATE function returns the first starting position of a string in another string.
|
@@ -93,27 +101,27 @@ module ArelExtensions
|
|
93
101
|
end
|
94
102
|
|
95
103
|
def ai_matches other # accent insensitive & case sensitive
|
96
|
-
ArelExtensions::Nodes::AiMatches.new(self,other)
|
104
|
+
ArelExtensions::Nodes::AiMatches.new(self, other)
|
97
105
|
end
|
98
106
|
|
99
107
|
def ai_imatches other # accent insensitive & case insensitive
|
100
|
-
ArelExtensions::Nodes::AiIMatches.new(self,other)
|
108
|
+
ArelExtensions::Nodes::AiIMatches.new(self, other)
|
101
109
|
end
|
102
110
|
|
103
111
|
def smatches other # accent sensitive & case sensitive
|
104
|
-
ArelExtensions::Nodes::SMatches.new(self,other)
|
112
|
+
ArelExtensions::Nodes::SMatches.new(self, other)
|
105
113
|
end
|
106
114
|
|
107
115
|
def ai_collate
|
108
|
-
ArelExtensions::Nodes::Collate.new(self,nil,true,false)
|
116
|
+
ArelExtensions::Nodes::Collate.new(self, nil, true, false)
|
109
117
|
end
|
110
118
|
|
111
119
|
def ci_collate
|
112
|
-
ArelExtensions::Nodes::Collate.new(self,nil,false,true)
|
120
|
+
ArelExtensions::Nodes::Collate.new(self, nil, false, true)
|
113
121
|
end
|
114
122
|
|
115
|
-
def collate ai = false,ci = false, option = nil
|
116
|
-
ArelExtensions::Nodes::Collate.new(self,option,ai,ci)
|
123
|
+
def collate ai = false, ci = false, option = nil
|
124
|
+
ArelExtensions::Nodes::Collate.new(self, option, ai, ci)
|
117
125
|
end
|
118
126
|
|
119
127
|
# REPLACE function replaces a sequence of characters in a string with another set of characters, not case-sensitive.
|
@@ -136,7 +144,7 @@ module ArelExtensions
|
|
136
144
|
# concat elements of a group, separated by sep and ordered by a list of Ascending or Descending
|
137
145
|
def group_concat(sep = nil, *orders, group: nil, order: nil)
|
138
146
|
if orders.present?
|
139
|
-
warn("Warning
|
147
|
+
warn("Warning: ArelExtensions: group_concat: you should now use the kwarg 'order' to specify an order in the group_concat.")
|
140
148
|
end
|
141
149
|
order_tabs = [orders].flatten.map{ |o|
|
142
150
|
if o.is_a?(Arel::Nodes::Ascending) || o.is_a?(Arel::Nodes::Descending)
|
@@ -176,6 +184,7 @@ module ArelExtensions
|
|
176
184
|
def not_blank
|
177
185
|
ArelExtensions::Nodes::NotBlank.new [self]
|
178
186
|
end
|
187
|
+
alias present not_blank
|
179
188
|
|
180
189
|
def repeat other = 1
|
181
190
|
ArelExtensions::Nodes::Repeat.new [self, other]
|
@@ -1,8 +1,8 @@
|
|
1
1
|
namespace :arel_extensions do
|
2
2
|
desc 'Install DB functions into current DB'
|
3
3
|
task install_functions: :environment do
|
4
|
-
@env_db = if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE ==
|
5
|
-
(RUBY_PLATFORM == 'java' ?
|
4
|
+
@env_db = if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx') || (RUBY_PLATFORM == 'java')) # not supported
|
5
|
+
(RUBY_PLATFORM == 'java' ? 'jdbc-sqlite' : 'sqlite')
|
6
6
|
else
|
7
7
|
ENV['DB'] || ActiveRecord::Base.connection.adapter_name
|
8
8
|
end
|
File without changes
|