arel_extensions 2.4.0 → 2.5.0
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/.gitignore +2 -1
- data/.rubocop.yml +131 -5
- data/Makefile +31 -1
- data/NEWS.md +15 -0
- data/README.md +11 -2
- data/Rakefile +5 -3
- data/arel_extensions.gemspec +3 -5
- data/gemfiles/rails5.gemfile +15 -8
- data/gemfiles/rails5_1_4.gemfile +11 -9
- data/gemfiles/rails5_2.gemfile +16 -9
- data/gemfiles/rails6.gemfile +13 -7
- data/gemfiles/rails6_1.gemfile +13 -7
- data/gemfiles/rails7.gemfile +15 -9
- data/gemfiles/rails7_1.gemfile +15 -8
- data/gemfiles/rails7_2.gemfile +12 -6
- data/gemfiles/rails8.gemfile +7 -7
- data/gemfiles/rails8_1.gemfile +4 -4
- data/gemspecs/arel_extensions-v1.gemspec +3 -5
- data/gemspecs/arel_extensions-v2.gemspec +3 -5
- data/lib/arel_extensions/aliases.rb +3 -3
- data/lib/arel_extensions/attributes.rb +2 -0
- data/lib/arel_extensions/boolean_functions.rb +9 -7
- data/lib/arel_extensions/common_sql_functions.rb +5 -3
- data/lib/arel_extensions/comparators.rb +6 -4
- data/lib/arel_extensions/date_duration.rb +2 -0
- data/lib/arel_extensions/helpers.rb +17 -17
- data/lib/arel_extensions/insert_manager.rb +5 -1
- data/lib/arel_extensions/math.rb +40 -44
- data/lib/arel_extensions/math_functions.rb +28 -30
- data/lib/arel_extensions/nodes/aggregate_function.rb +4 -4
- data/lib/arel_extensions/nodes/blank.rb +6 -4
- data/lib/arel_extensions/nodes/case.rb +15 -12
- data/lib/arel_extensions/nodes/cast.rb +3 -5
- data/lib/arel_extensions/nodes/coalesce.rb +1 -1
- data/lib/arel_extensions/nodes/collate.rb +1 -1
- data/lib/arel_extensions/nodes/concat.rb +6 -6
- data/lib/arel_extensions/nodes/date_diff.rb +40 -49
- data/lib/arel_extensions/nodes/duration.rb +2 -2
- data/lib/arel_extensions/nodes/format.rb +2 -2
- data/lib/arel_extensions/nodes/formatted_date.rb +2 -2
- data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
- data/lib/arel_extensions/nodes/function.rb +6 -4
- data/lib/arel_extensions/nodes/is_null.rb +2 -0
- data/lib/arel_extensions/nodes/json.rb +27 -15
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +2 -2
- data/lib/arel_extensions/nodes/locate.rb +1 -1
- data/lib/arel_extensions/nodes/power.rb +2 -2
- data/lib/arel_extensions/nodes/rand.rb +2 -2
- data/lib/arel_extensions/nodes/repeat.rb +2 -2
- data/lib/arel_extensions/nodes/replace.rb +3 -3
- data/lib/arel_extensions/nodes/rollup.rb +4 -4
- data/lib/arel_extensions/nodes/round.rb +3 -3
- data/lib/arel_extensions/nodes/select.rb +1 -1
- data/lib/arel_extensions/nodes/std.rb +4 -4
- data/lib/arel_extensions/nodes/substring.rb +52 -2
- 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 +3 -3
- data/lib/arel_extensions/nodes/union_all.rb +3 -3
- data/lib/arel_extensions/nodes/wday.rb +2 -2
- data/lib/arel_extensions/null_functions.rb +5 -7
- data/lib/arel_extensions/predications.rb +22 -18
- data/lib/arel_extensions/string_functions.rb +26 -27
- data/lib/arel_extensions/version.rb +3 -1
- data/lib/arel_extensions/visitors/convert_format.rb +2 -2
- data/lib/arel_extensions/visitors/ibm_db.rb +5 -5
- data/lib/arel_extensions/visitors/mssql.rb +91 -92
- data/lib/arel_extensions/visitors/mysql.rb +89 -69
- data/lib/arel_extensions/visitors/oracle.rb +100 -104
- data/lib/arel_extensions/visitors/oracle12.rb +5 -6
- data/lib/arel_extensions/visitors/postgresql.rb +107 -94
- data/lib/arel_extensions/visitors/sqlite.rb +57 -65
- data/lib/arel_extensions/visitors/to_sql.rb +84 -74
- data/lib/arel_extensions/visitors.rb +6 -6
- data/lib/arel_extensions/warning.rb +5 -5
- data/lib/arel_extensions.rb +34 -27
- data/test/real_db_test.rb +31 -31
- data/test/visitors/test_to_sql.rb +2 -2
- data/test/with_ar/all_agnostic_test.rb +149 -15
- data/version_v1.rb +3 -1
- data/version_v2.rb +3 -1
- metadata +2 -30
|
@@ -18,7 +18,6 @@ require 'arel_extensions/nodes/collate'
|
|
|
18
18
|
require 'arel_extensions/nodes/levenshtein_distance'
|
|
19
19
|
require 'arel_extensions/nodes/md5'
|
|
20
20
|
|
|
21
|
-
|
|
22
21
|
module ArelExtensions
|
|
23
22
|
module StringFunctions
|
|
24
23
|
include ArelExtensions::Warning
|
|
@@ -27,7 +26,7 @@ module ArelExtensions
|
|
|
27
26
|
def &(other)
|
|
28
27
|
ArelExtensions::Nodes::FindInSet.new [
|
|
29
28
|
Arel.quoted(other.is_a?(Integer) ? other.to_s : other),
|
|
30
|
-
self
|
|
29
|
+
self
|
|
31
30
|
]
|
|
32
31
|
end
|
|
33
32
|
|
|
@@ -52,11 +51,11 @@ module ArelExtensions
|
|
|
52
51
|
|
|
53
52
|
# LOCATE function returns the first starting position of a string in another string.
|
|
54
53
|
# If string1 or string2 is NULL then it returns NULL. If string1 not found in string2 then it returns 0.
|
|
55
|
-
def locate
|
|
54
|
+
def locate(val)
|
|
56
55
|
ArelExtensions::Nodes::Locate.new [self, val]
|
|
57
56
|
end
|
|
58
57
|
|
|
59
|
-
def substring
|
|
58
|
+
def substring(start, len = nil)
|
|
60
59
|
ArelExtensions::Nodes::Substring.new [self, start, len]
|
|
61
60
|
end
|
|
62
61
|
|
|
@@ -71,9 +70,9 @@ module ArelExtensions
|
|
|
71
70
|
# It's ignored in all other cases.
|
|
72
71
|
def [](start, end_ = nil)
|
|
73
72
|
if start.is_a?(String) || start.is_a?(Symbol)
|
|
74
|
-
|
|
73
|
+
send(start)
|
|
75
74
|
elsif start.is_a?(Range)
|
|
76
|
-
ArelExtensions::Nodes::Substring.new [self, start
|
|
75
|
+
ArelExtensions::Nodes::Substring.new [self, start]
|
|
77
76
|
elsif start.is_a?(Integer) && !end_
|
|
78
77
|
ArelExtensions::Nodes::Substring.new [self, start + 1, 1]
|
|
79
78
|
elsif start.is_a?(Integer)
|
|
@@ -89,11 +88,11 @@ module ArelExtensions
|
|
|
89
88
|
ArelExtensions::Nodes::Soundex.new [self]
|
|
90
89
|
end
|
|
91
90
|
|
|
92
|
-
def imatches
|
|
91
|
+
def imatches(others, escape = nil)
|
|
93
92
|
ArelExtensions::Nodes::IMatches.new self, others, escape
|
|
94
93
|
end
|
|
95
94
|
|
|
96
|
-
def imatches_any
|
|
95
|
+
def imatches_any(others, escape = nil)
|
|
97
96
|
grouping_any :imatches, others, escape
|
|
98
97
|
end
|
|
99
98
|
|
|
@@ -110,31 +109,31 @@ module ArelExtensions
|
|
|
110
109
|
# res
|
|
111
110
|
# end
|
|
112
111
|
|
|
113
|
-
def imatches_all
|
|
112
|
+
def imatches_all(others, escape = nil)
|
|
114
113
|
grouping_all :imatches, others, escape, escape
|
|
115
114
|
end
|
|
116
115
|
|
|
117
|
-
def idoes_not_match
|
|
116
|
+
def idoes_not_match(others, escape = nil)
|
|
118
117
|
ArelExtensions::Nodes::IDoesNotMatch.new self, others, escape
|
|
119
118
|
end
|
|
120
119
|
|
|
121
|
-
def idoes_not_match_any
|
|
120
|
+
def idoes_not_match_any(others, escape = nil)
|
|
122
121
|
grouping_any :idoes_not_match, others, escape
|
|
123
122
|
end
|
|
124
123
|
|
|
125
|
-
def idoes_not_match_all
|
|
124
|
+
def idoes_not_match_all(others, escape = nil)
|
|
126
125
|
grouping_all :idoes_not_match, others, escape
|
|
127
126
|
end
|
|
128
127
|
|
|
129
|
-
def ai_matches
|
|
128
|
+
def ai_matches(other) # accent insensitive & case sensitive
|
|
130
129
|
ArelExtensions::Nodes::AiMatches.new(self, other)
|
|
131
130
|
end
|
|
132
131
|
|
|
133
|
-
def ai_imatches
|
|
132
|
+
def ai_imatches(other) # accent insensitive & case insensitive
|
|
134
133
|
ArelExtensions::Nodes::AiIMatches.new(self, other)
|
|
135
134
|
end
|
|
136
135
|
|
|
137
|
-
def smatches
|
|
136
|
+
def smatches(other) # accent sensitive & case sensitive
|
|
138
137
|
ArelExtensions::Nodes::SMatches.new(self, other)
|
|
139
138
|
end
|
|
140
139
|
|
|
@@ -146,12 +145,12 @@ module ArelExtensions
|
|
|
146
145
|
ArelExtensions::Nodes::Collate.new(self, nil, false, true)
|
|
147
146
|
end
|
|
148
147
|
|
|
149
|
-
def collate
|
|
148
|
+
def collate(ai = false, ci = false, option = nil)
|
|
150
149
|
ArelExtensions::Nodes::Collate.new(self, option, ai, ci)
|
|
151
150
|
end
|
|
152
151
|
|
|
153
152
|
# REPLACE function replaces a sequence of characters in a string with another set of characters, not case-sensitive.
|
|
154
|
-
def replace
|
|
153
|
+
def replace(pattern, substitute)
|
|
155
154
|
if pattern.is_a? Regexp
|
|
156
155
|
ArelExtensions::Nodes::RegexpReplace.new self, pattern, substitute
|
|
157
156
|
else
|
|
@@ -159,11 +158,11 @@ module ArelExtensions
|
|
|
159
158
|
end
|
|
160
159
|
end
|
|
161
160
|
|
|
162
|
-
def regexp_replace
|
|
161
|
+
def regexp_replace(pattern, substitute)
|
|
163
162
|
ArelExtensions::Nodes::RegexpReplace.new self, pattern, substitute
|
|
164
163
|
end
|
|
165
164
|
|
|
166
|
-
def concat
|
|
165
|
+
def concat(other)
|
|
167
166
|
ArelExtensions::Nodes::Concat.new [self, other]
|
|
168
167
|
end
|
|
169
168
|
|
|
@@ -172,26 +171,26 @@ module ArelExtensions
|
|
|
172
171
|
if orders.present?
|
|
173
172
|
deprecated 'Use the kwarg `order` instead.', what: 'orders'
|
|
174
173
|
end
|
|
175
|
-
order_tabs = [orders].flatten.map{ |o|
|
|
174
|
+
order_tabs = [orders].flatten.map { |o|
|
|
176
175
|
if o.is_a?(Arel::Nodes::Ascending) || o.is_a?(Arel::Nodes::Descending)
|
|
177
176
|
o
|
|
178
177
|
elsif o.respond_to?(:asc)
|
|
179
178
|
o.asc
|
|
180
179
|
end
|
|
181
180
|
}.compact
|
|
182
|
-
ArelExtensions::Nodes::GroupConcat.new(self, sep, group: group, order:
|
|
181
|
+
ArelExtensions::Nodes::GroupConcat.new(self, sep, group: group, order: order || order_tabs)
|
|
183
182
|
end
|
|
184
183
|
|
|
185
184
|
# Function returns a string after removing left, right or the both prefixes or suffixes int argument
|
|
186
|
-
def trim
|
|
185
|
+
def trim(other = ' ')
|
|
187
186
|
ArelExtensions::Nodes::Trim.new [self, other]
|
|
188
187
|
end
|
|
189
188
|
|
|
190
|
-
def ltrim
|
|
189
|
+
def ltrim(other = ' ')
|
|
191
190
|
ArelExtensions::Nodes::Ltrim.new [self, other]
|
|
192
191
|
end
|
|
193
192
|
|
|
194
|
-
def rtrim
|
|
193
|
+
def rtrim(other = ' ')
|
|
195
194
|
ArelExtensions::Nodes::Rtrim.new [self, other]
|
|
196
195
|
end
|
|
197
196
|
|
|
@@ -212,15 +211,15 @@ module ArelExtensions
|
|
|
212
211
|
end
|
|
213
212
|
alias present not_blank
|
|
214
213
|
|
|
215
|
-
def repeat
|
|
214
|
+
def repeat(other = 1)
|
|
216
215
|
ArelExtensions::Nodes::Repeat.new [self, other]
|
|
217
216
|
end
|
|
218
217
|
|
|
219
|
-
def levenshtein_distance
|
|
218
|
+
def levenshtein_distance(other)
|
|
220
219
|
ArelExtensions::Nodes::LevenshteinDistance.new [self, other]
|
|
221
220
|
end
|
|
222
221
|
|
|
223
|
-
def edit_distance
|
|
222
|
+
def edit_distance(other)
|
|
224
223
|
ArelExtensions::Nodes::LevenshteinDistance.new [self, other]
|
|
225
224
|
end
|
|
226
225
|
|
|
@@ -2,13 +2,13 @@ module ArelExtensions
|
|
|
2
2
|
module Visitors
|
|
3
3
|
# Convert date format in strftime syntax to whatever the RDBMs
|
|
4
4
|
# wants, based on the table of conversion +mapping+.
|
|
5
|
-
def self.strftime_to_format
|
|
5
|
+
def self.strftime_to_format(format, mapping)
|
|
6
6
|
@mapping_regexps ||= {}
|
|
7
7
|
@mapping_regexps[mapping] ||=
|
|
8
8
|
Regexp.new(
|
|
9
9
|
mapping
|
|
10
10
|
.keys
|
|
11
|
-
.map{|k| Regexp.escape(k)}
|
|
11
|
+
.map { |k| Regexp.escape(k) }
|
|
12
12
|
.join('|')
|
|
13
13
|
)
|
|
14
14
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
module ArelExtensions
|
|
2
2
|
module Visitors
|
|
3
3
|
class Arel::Visitors::IBM_DB
|
|
4
|
-
def visit_ArelExtensions_Nodes_Ceil
|
|
4
|
+
def visit_ArelExtensions_Nodes_Ceil(o, collector)
|
|
5
5
|
collector << 'CEILING('
|
|
6
6
|
collector = visit o.expr, collector
|
|
7
7
|
collector << ')'
|
|
8
8
|
collector
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
def visit_ArelExtensions_Nodes_Trim
|
|
11
|
+
def visit_ArelExtensions_Nodes_Trim(o, collector)
|
|
12
12
|
collector << 'LTRIM(RTRIM('
|
|
13
13
|
o.expressions.each_with_index { |arg, i|
|
|
14
14
|
collector << COMMA if i != 0
|
|
@@ -18,7 +18,7 @@ module ArelExtensions
|
|
|
18
18
|
collector
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
def visit_ArelExtensions_Nodes_DateDiff
|
|
21
|
+
def visit_ArelExtensions_Nodes_DateDiff(o, collector)
|
|
22
22
|
collector << 'DAY('
|
|
23
23
|
collector = visit o.left, collector
|
|
24
24
|
collector << ','
|
|
@@ -31,7 +31,7 @@ module ArelExtensions
|
|
|
31
31
|
collector
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
def visit_ArelExtensions_Nodes_Duration
|
|
34
|
+
def visit_ArelExtensions_Nodes_Duration(o, collector)
|
|
35
35
|
# visit left for period
|
|
36
36
|
if o.left == 'd'
|
|
37
37
|
collector << 'DAY('
|
|
@@ -52,7 +52,7 @@ module ArelExtensions
|
|
|
52
52
|
collector
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
-
def visit_ArelExtensions_Nodes_IsNull
|
|
55
|
+
def visit_ArelExtensions_Nodes_IsNull(o, collector)
|
|
56
56
|
collector << 'COALESCE('
|
|
57
57
|
collector = visit o.left, collector
|
|
58
58
|
collector << ','
|