arel_extensions 2.1.3 → 2.1.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/.codeclimate.yml +1 -2
- data/.github/workflows/ruby.yml +4 -4
- data/.rubocop.yml +25 -1
- data/Gemfile +10 -10
- data/README.md +1 -2
- data/Rakefile +4 -4
- data/TODO +0 -1
- data/arel_extensions.gemspec +11 -11
- data/gemfiles/rails3.gemfile +10 -10
- data/gemfiles/rails4.gemfile +13 -13
- data/gemfiles/rails5_0.gemfile +12 -12
- data/gemfiles/rails5_1_4.gemfile +12 -12
- data/gemfiles/rails5_2.gemfile +13 -13
- data/gemfiles/rails6.gemfile +11 -11
- data/gemfiles/rails6_1.gemfile +11 -11
- data/gemfiles/rails7.gemfile +7 -7
- data/gemspecs/arel_extensions-v1.gemspec +12 -12
- data/gemspecs/arel_extensions-v2.gemspec +11 -11
- 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/attributes.rb +2 -2
- data/lib/arel_extensions/boolean_functions.rb +2 -4
- data/lib/arel_extensions/common_sql_functions.rb +10 -10
- data/lib/arel_extensions/comparators.rb +14 -14
- data/lib/arel_extensions/date_duration.rb +7 -7
- data/lib/arel_extensions/helpers.rb +16 -13
- data/lib/arel_extensions/insert_manager.rb +1 -1
- data/lib/arel_extensions/math.rb +16 -18
- 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 +4 -6
- data/lib/arel_extensions/nodes/cast.rb +3 -3
- 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 +0 -0
- 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 +6 -6
- 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 +0 -0
- data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
- data/lib/arel_extensions/nodes/function.rb +21 -21
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +7 -7
- data/lib/arel_extensions/nodes/length.rb +0 -0
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +0 -0
- 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 +0 -0
- data/lib/arel_extensions/nodes/replace.rb +2 -2
- data/lib/arel_extensions/nodes/round.rb +0 -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 +0 -0
- data/lib/arel_extensions/nodes/sum.rb +0 -0
- data/lib/arel_extensions/nodes/then.rb +0 -0
- data/lib/arel_extensions/nodes/trim.rb +0 -0
- data/lib/arel_extensions/nodes/union.rb +4 -4
- data/lib/arel_extensions/nodes/union_all.rb +3 -3
- data/lib/arel_extensions/nodes/wday.rb +0 -0
- data/lib/arel_extensions/nodes.rb +0 -0
- data/lib/arel_extensions/null_functions.rb +0 -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 +8 -8
- 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 +19 -19
- data/lib/arel_extensions/visitors/mssql.rb +127 -121
- data/lib/arel_extensions/visitors/mysql.rb +137 -145
- data/lib/arel_extensions/visitors/oracle.rb +128 -128
- data/lib/arel_extensions/visitors/oracle12.rb +16 -16
- data/lib/arel_extensions/visitors/postgresql.rb +139 -137
- data/lib/arel_extensions/visitors/sqlite.rb +83 -85
- data/lib/arel_extensions/visitors/to_sql.rb +143 -148
- data/lib/arel_extensions/visitors.rb +7 -7
- data/lib/arel_extensions.rb +46 -32
- data/test/arelx_test_helper.rb +14 -13
- data/test/database.yml +5 -5
- data/test/real_db_test.rb +78 -78
- data/test/support/fake_record.rb +1 -1
- data/test/test_comparators.rb +5 -5
- data/test/visitors/test_bulk_insert_oracle.rb +4 -4
- data/test/visitors/test_bulk_insert_sqlite.rb +4 -4
- data/test/visitors/test_bulk_insert_to_sql.rb +4 -4
- data/test/visitors/test_oracle.rb +14 -14
- data/test/visitors/test_to_sql.rb +82 -82
- data/test/with_ar/all_agnostic_test.rb +364 -299
- data/test/with_ar/insert_agnostic_test.rb +17 -14
- data/test/with_ar/test_bulk_sqlite.rb +4 -4
- data/test/with_ar/test_math_sqlite.rb +12 -12
- data/test/with_ar/test_string_mysql.rb +20 -20
- data/test/with_ar/test_string_sqlite.rb +20 -20
- data/version_v1.rb +1 -1
- data/version_v2.rb +1 -1
- metadata +2 -9
- 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
|
@@ -13,10 +13,10 @@ module ArelExtensions
|
|
|
13
13
|
}.freeze
|
|
14
14
|
|
|
15
15
|
LOADED_VISITOR::DATE_FORMAT_DIRECTIVES = {
|
|
16
|
-
'%Y' => 'YYYY', '%C' => '', '%y' => 'YY', '%m' => 'MM', '%B' =>
|
|
17
|
-
'%V' => 'iso_week', '%G' => '',
|
|
18
|
-
'%d' => 'DD', '%e' => '', '%j' =>
|
|
19
|
-
'%H' => 'hh', '%k' => '', '%I' =>
|
|
16
|
+
'%Y' => 'YYYY', '%C' => '', '%y' => 'YY', '%m' => 'MM', '%B' => 'month', '%^B' => '', '%b' => '', '%^b' => '', # year, month
|
|
17
|
+
'%V' => 'iso_week', '%G' => '', # ISO week number and year of week
|
|
18
|
+
'%d' => 'DD', '%e' => '' , '%j' => '' , '%w' => 'dw', %'a' => '', '%A' => 'weekday', # day, weekday
|
|
19
|
+
'%H' => 'hh', '%k' => '' , '%I' => '' , '%l' => '' , '%P' => '', '%p' => '', # hours
|
|
20
20
|
'%M' => 'mi', '%S' => 'ss', '%L' => 'ms', '%N' => 'ns', '%z' => 'tz'
|
|
21
21
|
}.freeze
|
|
22
22
|
|
|
@@ -24,6 +24,10 @@ module ArelExtensions
|
|
|
24
24
|
'YY' => '0#', 'MM' => '0#', 'DD' => '0#', 'hh' => '0#', 'mi' => '0#', 'ss' => '0#', 'iso_week' => '0#'
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
LOADED_VISITOR::DATE_NAME = [
|
|
28
|
+
'%B', '%A'
|
|
29
|
+
]
|
|
30
|
+
|
|
27
31
|
LOADED_VISITOR::DATE_FORMAT_REGEX =
|
|
28
32
|
Regexp.new(
|
|
29
33
|
LOADED_VISITOR::DATE_FORMAT_DIRECTIVES
|
|
@@ -35,7 +39,7 @@ module ArelExtensions
|
|
|
35
39
|
# TODO; all others... http://www.sql-server-helper.com/tips/date-formats.aspx
|
|
36
40
|
LOADED_VISITOR::DATE_CONVERT_FORMATS = {
|
|
37
41
|
'YYYY-MM-DD' => 120,
|
|
38
|
-
'YY-MM-DD'
|
|
42
|
+
'YY-MM-DD' => 120,
|
|
39
43
|
'MM/DD/YYYY' => 101,
|
|
40
44
|
'MM-DD-YYYY' => 110,
|
|
41
45
|
'YYYY/MM/DD' => 111,
|
|
@@ -47,63 +51,63 @@ module ArelExtensions
|
|
|
47
51
|
|
|
48
52
|
# Math Functions
|
|
49
53
|
def visit_ArelExtensions_Nodes_Ceil o, collector
|
|
50
|
-
collector <<
|
|
54
|
+
collector << 'CEILING('
|
|
51
55
|
collector = visit o.expr, collector
|
|
52
|
-
collector <<
|
|
56
|
+
collector << ')'
|
|
53
57
|
collector
|
|
54
58
|
end
|
|
55
59
|
|
|
56
60
|
def visit_ArelExtensions_Nodes_Log10 o, collector
|
|
57
|
-
|
|
61
|
+
collector << 'LOG10('
|
|
58
62
|
o.expressions.each_with_index { |arg, i|
|
|
59
63
|
collector << Arel::Visitors::ToSql::COMMA if i != 0
|
|
60
64
|
collector = visit arg, collector
|
|
61
65
|
}
|
|
62
|
-
collector <<
|
|
66
|
+
collector << ')'
|
|
63
67
|
collector
|
|
64
68
|
end
|
|
65
69
|
|
|
66
70
|
def visit_ArelExtensions_Nodes_Power o, collector
|
|
67
|
-
collector <<
|
|
71
|
+
collector << 'POWER('
|
|
68
72
|
o.expressions.each_with_index { |arg, i|
|
|
69
73
|
collector << Arel::Visitors::ToSql::COMMA if i != 0
|
|
70
74
|
collector = visit arg, collector
|
|
71
75
|
}
|
|
72
|
-
collector <<
|
|
76
|
+
collector << ')'
|
|
73
77
|
collector
|
|
74
78
|
end
|
|
75
79
|
|
|
76
80
|
def visit_ArelExtensions_Nodes_IsNull o, collector
|
|
77
|
-
collector <<
|
|
81
|
+
collector << '('
|
|
78
82
|
collector = visit o.expr, collector
|
|
79
|
-
collector <<
|
|
83
|
+
collector << ' IS NULL)'
|
|
80
84
|
collector
|
|
81
85
|
end
|
|
82
86
|
|
|
83
87
|
def visit_ArelExtensions_Nodes_IsNotNull o, collector
|
|
84
|
-
|
|
88
|
+
collector << '('
|
|
85
89
|
collector = visit o.expr, collector
|
|
86
|
-
collector <<
|
|
90
|
+
collector << ' IS NOT NULL)'
|
|
87
91
|
collector
|
|
88
92
|
end
|
|
89
93
|
|
|
90
94
|
def visit_ArelExtensions_Nodes_Concat o, collector
|
|
91
|
-
collector <<
|
|
95
|
+
collector << 'CONCAT('
|
|
92
96
|
o.expressions.each_with_index { |arg, i|
|
|
93
97
|
collector << LOADED_VISITOR::COMMA if i != 0
|
|
94
98
|
collector = visit arg, collector
|
|
95
99
|
}
|
|
96
|
-
collector <<
|
|
100
|
+
collector << ')'
|
|
97
101
|
collector
|
|
98
102
|
end
|
|
99
103
|
|
|
100
104
|
def visit_ArelExtensions_Nodes_Repeat o, collector
|
|
101
|
-
collector <<
|
|
105
|
+
collector << 'REPLICATE('
|
|
102
106
|
o.expressions.each_with_index { |arg, i|
|
|
103
107
|
collector << Arel::Visitors::ToSql::COMMA if i != 0
|
|
104
108
|
collector = visit arg, collector
|
|
105
109
|
}
|
|
106
|
-
collector <<
|
|
110
|
+
collector << ')'
|
|
107
111
|
collector
|
|
108
112
|
end
|
|
109
113
|
|
|
@@ -123,28 +127,28 @@ module ArelExtensions
|
|
|
123
127
|
collector << ')'
|
|
124
128
|
else
|
|
125
129
|
da = ArelExtensions::Nodes::DateAdd.new([])
|
|
126
|
-
collector <<
|
|
130
|
+
collector << 'DATEADD('
|
|
127
131
|
collector = visit da.mssql_datepart(o.right), collector
|
|
128
132
|
collector << LOADED_VISITOR::COMMA
|
|
129
|
-
collector <<
|
|
133
|
+
collector << '-('
|
|
130
134
|
collector = visit da.mssql_value(o.right), collector
|
|
131
|
-
collector <<
|
|
135
|
+
collector << ')'
|
|
132
136
|
collector << LOADED_VISITOR::COMMA
|
|
133
137
|
collector = visit o.left, collector
|
|
134
|
-
collector <<
|
|
138
|
+
collector << ')'
|
|
135
139
|
collector
|
|
136
140
|
end
|
|
137
141
|
collector
|
|
138
142
|
end
|
|
139
143
|
|
|
140
144
|
def visit_ArelExtensions_Nodes_DateAdd o, collector
|
|
141
|
-
collector <<
|
|
145
|
+
collector << 'DATEADD('
|
|
142
146
|
collector = visit o.mssql_datepart(o.right), collector
|
|
143
147
|
collector << LOADED_VISITOR::COMMA
|
|
144
148
|
collector = visit o.mssql_value(o.right), collector
|
|
145
149
|
collector << LOADED_VISITOR::COMMA
|
|
146
150
|
collector = visit o.left, collector
|
|
147
|
-
collector <<
|
|
151
|
+
collector << ')'
|
|
148
152
|
collector
|
|
149
153
|
end
|
|
150
154
|
|
|
@@ -160,47 +164,47 @@ module ArelExtensions
|
|
|
160
164
|
collector << 'CONVERT(datetime,' if conv
|
|
161
165
|
collector = visit o.right, collector
|
|
162
166
|
collector << ')' if conv
|
|
163
|
-
collector <<
|
|
167
|
+
collector << ')'
|
|
164
168
|
end
|
|
165
169
|
collector
|
|
166
170
|
end
|
|
167
171
|
|
|
168
172
|
def visit_ArelExtensions_Nodes_Length o, collector
|
|
169
173
|
if o.bytewise
|
|
170
|
-
collector <<
|
|
174
|
+
collector << '(DATALENGTH('
|
|
171
175
|
collector = visit o.expr, collector
|
|
172
|
-
collector <<
|
|
176
|
+
collector << ') / ISNULL(NULLIF(DATALENGTH(LEFT(COALESCE('
|
|
173
177
|
collector = visit o.expr, collector
|
|
174
178
|
collector << ", '#' ), 1 )), 0), 1))"
|
|
175
179
|
collector
|
|
176
180
|
else
|
|
177
|
-
collector <<
|
|
181
|
+
collector << 'LEN('
|
|
178
182
|
collector = visit o.expr, collector
|
|
179
|
-
collector <<
|
|
183
|
+
collector << ')'
|
|
180
184
|
collector
|
|
181
185
|
end
|
|
182
186
|
end
|
|
183
187
|
|
|
184
188
|
def visit_ArelExtensions_Nodes_Round o, collector
|
|
185
|
-
collector <<
|
|
189
|
+
collector << 'ROUND('
|
|
186
190
|
o.expressions.each_with_index { |arg, i|
|
|
187
191
|
collector << LOADED_VISITOR::COMMA if i != 0
|
|
188
192
|
collector = visit arg, collector
|
|
189
193
|
}
|
|
190
194
|
if o.expressions.length == 1
|
|
191
195
|
collector << LOADED_VISITOR::COMMA
|
|
192
|
-
collector <<
|
|
196
|
+
collector << '0'
|
|
193
197
|
end
|
|
194
|
-
collector <<
|
|
198
|
+
collector << ')'
|
|
195
199
|
collector
|
|
196
200
|
end
|
|
197
201
|
|
|
198
202
|
def visit_ArelExtensions_Nodes_Locate o, collector
|
|
199
|
-
collector <<
|
|
203
|
+
collector << 'CHARINDEX('
|
|
200
204
|
collector = visit o.right, collector
|
|
201
205
|
collector << LOADED_VISITOR::COMMA
|
|
202
206
|
collector = visit o.left, collector
|
|
203
|
-
collector <<
|
|
207
|
+
collector << ')'
|
|
204
208
|
collector
|
|
205
209
|
end
|
|
206
210
|
|
|
@@ -218,15 +222,15 @@ module ArelExtensions
|
|
|
218
222
|
def visit_ArelExtensions_Nodes_Trim o, collector
|
|
219
223
|
collector << 'TRIM( '
|
|
220
224
|
collector = visit o.right, collector
|
|
221
|
-
collector <<
|
|
225
|
+
collector << ' FROM '
|
|
222
226
|
collector = visit o.left, collector
|
|
223
|
-
collector <<
|
|
227
|
+
collector << ')'
|
|
224
228
|
collector
|
|
225
229
|
end
|
|
226
230
|
|
|
227
231
|
def visit_ArelExtensions_Nodes_Ltrim o, collector
|
|
228
232
|
if o.right
|
|
229
|
-
collector <<
|
|
233
|
+
collector << 'REPLACE(REPLACE(LTRIM(REPLACE(REPLACE('
|
|
230
234
|
collector = visit o.left, collector
|
|
231
235
|
collector << ", ' ', '~'), "
|
|
232
236
|
collector = visit o.right, collector
|
|
@@ -234,16 +238,16 @@ module ArelExtensions
|
|
|
234
238
|
collector = visit o.right, collector
|
|
235
239
|
collector << "), '~', ' ')"
|
|
236
240
|
else
|
|
237
|
-
collector <<
|
|
241
|
+
collector << 'LTRIM('
|
|
238
242
|
collector = visit o.left, collector
|
|
239
|
-
collector <<
|
|
243
|
+
collector << ')'
|
|
240
244
|
end
|
|
241
245
|
collector
|
|
242
246
|
end
|
|
243
247
|
|
|
244
248
|
def visit_ArelExtensions_Nodes_Rtrim o, collector
|
|
245
249
|
if o.right
|
|
246
|
-
collector <<
|
|
250
|
+
collector << 'REPLACE(REPLACE(RTRIM(REPLACE(REPLACE('
|
|
247
251
|
collector = visit o.left, collector
|
|
248
252
|
collector << ", ' ', '~'), "
|
|
249
253
|
collector = visit o.right, collector
|
|
@@ -251,9 +255,9 @@ module ArelExtensions
|
|
|
251
255
|
collector = visit o.right, collector
|
|
252
256
|
collector << "), '~', ' ')"
|
|
253
257
|
else
|
|
254
|
-
collector <<
|
|
258
|
+
collector << 'RTRIM('
|
|
255
259
|
collector = visit o.left, collector
|
|
256
|
-
collector <<
|
|
260
|
+
collector << ')'
|
|
257
261
|
end
|
|
258
262
|
collector
|
|
259
263
|
end
|
|
@@ -281,12 +285,12 @@ module ArelExtensions
|
|
|
281
285
|
when Hash
|
|
282
286
|
src_tz, dst_tz = o.time_zone.first
|
|
283
287
|
collector << ') AT TIME ZONE '
|
|
284
|
-
collector = visit Arel
|
|
288
|
+
collector = visit Arel.quoted(src_tz), collector
|
|
285
289
|
collector << ' AT TIME ZONE '
|
|
286
|
-
collector = visit Arel
|
|
290
|
+
collector = visit Arel.quoted(dst_tz), collector
|
|
287
291
|
when String
|
|
288
292
|
collector << ') AT TIME ZONE '
|
|
289
|
-
collector = visit Arel
|
|
293
|
+
collector = visit Arel.quoted(o.time_zone), collector
|
|
290
294
|
end
|
|
291
295
|
collector << LOADED_VISITOR::COMMA
|
|
292
296
|
collector << fmt.to_s
|
|
@@ -294,7 +298,7 @@ module ArelExtensions
|
|
|
294
298
|
collector
|
|
295
299
|
else
|
|
296
300
|
s = StringScanner.new o.iso_format
|
|
297
|
-
collector <<
|
|
301
|
+
collector << '('
|
|
298
302
|
sep = ''
|
|
299
303
|
while !s.eos?
|
|
300
304
|
collector << sep
|
|
@@ -303,10 +307,11 @@ module ArelExtensions
|
|
|
303
307
|
when s.scan(LOADED_VISITOR::DATE_FORMAT_REGEX)
|
|
304
308
|
dir = LOADED_VISITOR::DATE_FORMAT_DIRECTIVES[s.matched]
|
|
305
309
|
fmt = LOADED_VISITOR::DATE_FORMAT_FORMAT[dir]
|
|
310
|
+
date_name = LOADED_VISITOR::DATE_NAME.include?(s.matched)
|
|
306
311
|
collector << 'TRIM('
|
|
307
312
|
collector << 'FORMAT(' if fmt
|
|
308
|
-
collector << 'STR(' if !fmt
|
|
309
|
-
collector << 'DATEPART('
|
|
313
|
+
collector << 'STR(' if !fmt && !date_name
|
|
314
|
+
collector << (date_name ? 'DATENAME(' : 'DATEPART(')
|
|
310
315
|
collector << dir
|
|
311
316
|
collector << LOADED_VISITOR::COMMA
|
|
312
317
|
if o.time_zone
|
|
@@ -318,22 +323,22 @@ module ArelExtensions
|
|
|
318
323
|
case o.time_zone
|
|
319
324
|
when Hash
|
|
320
325
|
src_tz, dst_tz = o.time_zone.first.first, o.time_zone.first.second
|
|
321
|
-
collector <<
|
|
322
|
-
collector = visit Arel
|
|
323
|
-
collector <<
|
|
324
|
-
collector = visit Arel
|
|
326
|
+
collector << ') AT TIME ZONE '
|
|
327
|
+
collector = visit Arel.quoted(src_tz), collector
|
|
328
|
+
collector << ' AT TIME ZONE '
|
|
329
|
+
collector = visit Arel.quoted(dst_tz), collector
|
|
325
330
|
when String
|
|
326
|
-
collector <<
|
|
327
|
-
collector = visit Arel
|
|
331
|
+
collector << ') AT TIME ZONE '
|
|
332
|
+
collector = visit Arel.quoted(o.time_zone), collector
|
|
328
333
|
end
|
|
329
334
|
collector << ')'
|
|
330
|
-
collector << ')' if !fmt
|
|
335
|
+
collector << ')' if !fmt && !date_name
|
|
331
336
|
collector << LOADED_VISITOR::COMMA << "'#{fmt}')" if fmt
|
|
332
337
|
collector << ')'
|
|
333
338
|
when s.scan(/^%%/)
|
|
334
|
-
collector = visit Arel
|
|
339
|
+
collector = visit Arel.quoted('%'), collector
|
|
335
340
|
when s.scan(/[^%]+|./)
|
|
336
|
-
collector = visit Arel
|
|
341
|
+
collector = visit Arel.quoted(s.matched), collector
|
|
337
342
|
end
|
|
338
343
|
end
|
|
339
344
|
collector << ')'
|
|
@@ -342,22 +347,22 @@ module ArelExtensions
|
|
|
342
347
|
end
|
|
343
348
|
|
|
344
349
|
def visit_ArelExtensions_Nodes_Replace o, collector
|
|
345
|
-
collector <<
|
|
350
|
+
collector << 'REPLACE('
|
|
346
351
|
o.expressions.each_with_index { |arg, i|
|
|
347
352
|
collector << LOADED_VISITOR::COMMA if i != 0
|
|
348
353
|
collector = visit arg, collector
|
|
349
354
|
}
|
|
350
|
-
collector <<
|
|
355
|
+
collector << ')'
|
|
351
356
|
collector
|
|
352
357
|
end
|
|
353
358
|
|
|
354
359
|
def visit_ArelExtensions_Nodes_FindInSet o, collector
|
|
355
|
-
collector <<
|
|
360
|
+
collector << 'dbo.FIND_IN_SET('
|
|
356
361
|
o.expressions.each_with_index { |arg, i|
|
|
357
362
|
collector << LOADED_VISITOR::COMMA if i != 0
|
|
358
363
|
collector = visit arg, collector
|
|
359
364
|
}
|
|
360
|
-
collector <<
|
|
365
|
+
collector << ')'
|
|
361
366
|
collector
|
|
362
367
|
end
|
|
363
368
|
|
|
@@ -400,9 +405,9 @@ module ArelExtensions
|
|
|
400
405
|
end
|
|
401
406
|
|
|
402
407
|
def visit_ArelExtensions_Nodes_AiIMatches o, collector
|
|
403
|
-
collector = visit o.left.collate(true,true), collector
|
|
408
|
+
collector = visit o.left.collate(true, true), collector
|
|
404
409
|
collector << ' LIKE '
|
|
405
|
-
collector = visit o.right.collate(true,true), collector
|
|
410
|
+
collector = visit o.right.collate(true, true), collector
|
|
406
411
|
if o.escape
|
|
407
412
|
collector << ' ESCAPE '
|
|
408
413
|
visit o.escape, collector
|
|
@@ -449,7 +454,7 @@ module ArelExtensions
|
|
|
449
454
|
else
|
|
450
455
|
collector = visit o.left, collector
|
|
451
456
|
end
|
|
452
|
-
collector <<
|
|
457
|
+
collector << ' AS '
|
|
453
458
|
|
|
454
459
|
# sometimes these values are already quoted, if they are, don't double quote it
|
|
455
460
|
quote = o.right.is_a?(Arel::Nodes::SqlLiteral) && o.right[0] != '"' && o.right[-1] != '"'
|
|
@@ -476,108 +481,109 @@ module ArelExtensions
|
|
|
476
481
|
|
|
477
482
|
# TODO;
|
|
478
483
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
|
479
|
-
collector <<
|
|
484
|
+
collector << '(STRING_AGG('
|
|
480
485
|
collector = visit o.left, collector
|
|
481
486
|
collector << Arel::Visitors::Oracle::COMMA
|
|
482
487
|
collector =
|
|
483
488
|
if o.separator && o.separator != 'NULL'
|
|
484
489
|
visit o.separator, collector
|
|
485
490
|
else
|
|
486
|
-
visit Arel
|
|
491
|
+
visit Arel.quoted(','), collector
|
|
487
492
|
end
|
|
488
|
-
collector <<
|
|
493
|
+
collector << ') WITHIN GROUP (ORDER BY '
|
|
489
494
|
if o.order.present?
|
|
490
|
-
o.order.each_with_index do |order,i|
|
|
495
|
+
o.order.each_with_index do |order, i|
|
|
491
496
|
collector << Arel::Visitors::Oracle::COMMA if i != 0
|
|
492
497
|
collector = visit order, collector
|
|
493
498
|
end
|
|
494
499
|
else
|
|
495
500
|
collector = visit o.left, collector
|
|
496
501
|
end
|
|
497
|
-
collector <<
|
|
502
|
+
collector << '))'
|
|
498
503
|
collector
|
|
499
504
|
end
|
|
500
505
|
|
|
501
506
|
def visit_ArelExtensions_Nodes_MD5 o, collector
|
|
502
507
|
collector << "LOWER(CONVERT(NVARCHAR(32),HashBytes('MD5',CONVERT(VARCHAR,"
|
|
503
508
|
collector = visit o.left, collector
|
|
504
|
-
collector <<
|
|
509
|
+
collector << ')),2))'
|
|
505
510
|
collector
|
|
506
511
|
end
|
|
507
512
|
|
|
508
513
|
def visit_ArelExtensions_Nodes_Cast o, collector
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
514
|
+
as_attr =
|
|
515
|
+
case o.as_attr
|
|
516
|
+
when :string
|
|
517
|
+
'varchar'
|
|
518
|
+
when :time
|
|
519
|
+
'time'
|
|
520
|
+
when :date
|
|
521
|
+
'date'
|
|
522
|
+
when :datetime
|
|
523
|
+
'datetime'
|
|
524
|
+
when :number, :decimal, :float
|
|
525
|
+
'decimal(10,6)'
|
|
526
|
+
when :int
|
|
527
|
+
collector << 'CAST(CAST('
|
|
528
|
+
collector = visit o.left, collector
|
|
529
|
+
collector << ' AS decimal(10,0)) AS int)'
|
|
530
|
+
return collector
|
|
531
|
+
when :binary
|
|
532
|
+
'binary'
|
|
533
|
+
else
|
|
534
|
+
o.as_attr.to_s
|
|
535
|
+
end
|
|
536
|
+
collector << 'CAST('
|
|
531
537
|
collector = visit o.left, collector
|
|
532
|
-
collector <<
|
|
533
|
-
collector = visit as_attr, collector
|
|
534
|
-
collector <<
|
|
538
|
+
collector << ' AS '
|
|
539
|
+
collector = visit Arel::Nodes::SqlLiteral.new(as_attr), collector
|
|
540
|
+
collector << ')'
|
|
535
541
|
collector
|
|
536
542
|
end
|
|
537
543
|
|
|
538
544
|
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
|
539
545
|
col = o.left.coalesce(0)
|
|
540
|
-
locale = Arel
|
|
541
|
-
param = Arel
|
|
542
|
-
sign =
|
|
546
|
+
locale = Arel.quoted(o.locale.tr('_', '-'))
|
|
547
|
+
param = Arel.quoted("N#{o.precision}")
|
|
548
|
+
sign = Arel.when(col < 0).
|
|
543
549
|
then('-').
|
|
544
550
|
else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
|
|
545
551
|
sign_length = o.flags.include?('+') || o.flags.include?(' ') ?
|
|
546
|
-
Arel
|
|
547
|
-
|
|
552
|
+
Arel.quoted(1) :
|
|
553
|
+
Arel.when(col < 0).then(1).else(0)
|
|
548
554
|
|
|
549
555
|
number =
|
|
550
556
|
if o.scientific_notation
|
|
551
557
|
ArelExtensions::Nodes::Concat.new([
|
|
552
|
-
Arel::Nodes::NamedFunction.new('FORMAT',[
|
|
553
|
-
col.abs/Arel
|
|
558
|
+
Arel::Nodes::NamedFunction.new('FORMAT', [
|
|
559
|
+
col.abs / Arel.quoted(10).pow(col.abs.log10.floor),
|
|
554
560
|
param,
|
|
555
561
|
locale
|
|
556
562
|
]),
|
|
557
563
|
o.type,
|
|
558
|
-
Arel::Nodes::NamedFunction.new('FORMAT',[
|
|
564
|
+
Arel::Nodes::NamedFunction.new('FORMAT', [
|
|
559
565
|
col.abs.log10.floor,
|
|
560
|
-
Arel
|
|
566
|
+
Arel.quoted('N0'),
|
|
561
567
|
locale
|
|
562
568
|
])
|
|
563
569
|
])
|
|
564
570
|
else
|
|
565
|
-
Arel::Nodes::NamedFunction.new('FORMAT',[
|
|
566
|
-
Arel
|
|
571
|
+
Arel::Nodes::NamedFunction.new('FORMAT', [
|
|
572
|
+
Arel.quoted(col.abs),
|
|
567
573
|
param,
|
|
568
574
|
locale
|
|
569
575
|
])
|
|
570
576
|
end
|
|
571
577
|
|
|
572
|
-
repeated_char = (o.width == 0) ? Arel
|
|
573
|
-
when(Arel
|
|
574
|
-
then(Arel
|
|
578
|
+
repeated_char = (o.width == 0) ? Arel.quoted('') : ArelExtensions::Nodes::Case.new.
|
|
579
|
+
when(Arel.quoted(o.width).abs - (number.length + sign_length) > 0).
|
|
580
|
+
then(Arel.quoted(
|
|
575
581
|
o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
|
|
576
|
-
).repeat(Arel
|
|
582
|
+
).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
|
|
577
583
|
).
|
|
578
584
|
else('')
|
|
579
|
-
before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
|
|
580
|
-
middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
|
|
585
|
+
before = (!o.flags.include?('0')) && (!o.flags.include?('-')) ? repeated_char : ''
|
|
586
|
+
middle = (o.flags.include?('0')) && (!o.flags.include?('-')) ? repeated_char : ''
|
|
581
587
|
after = o.flags.include?('-') ? repeated_char : ''
|
|
582
588
|
full_number =
|
|
583
589
|
ArelExtensions::Nodes::Concat.new([
|
|
@@ -587,27 +593,27 @@ module ArelExtensions
|
|
|
587
593
|
number,
|
|
588
594
|
after
|
|
589
595
|
])
|
|
590
|
-
collector = visit ArelExtensions::Nodes::Concat.new([Arel
|
|
596
|
+
collector = visit ArelExtensions::Nodes::Concat.new([Arel.quoted(o.prefix), full_number, Arel.quoted(o.suffix)]), collector
|
|
591
597
|
collector
|
|
592
598
|
end
|
|
593
599
|
|
|
594
600
|
def visit_ArelExtensions_Nodes_Std o, collector
|
|
595
|
-
collector << (o.unbiased_estimator ?
|
|
601
|
+
collector << (o.unbiased_estimator ? 'STDEV(' : 'STDEVP(')
|
|
596
602
|
visit o.left, collector
|
|
597
|
-
collector <<
|
|
603
|
+
collector << ')'
|
|
598
604
|
collector
|
|
599
605
|
end
|
|
600
606
|
|
|
601
607
|
def visit_ArelExtensions_Nodes_Variance o, collector
|
|
602
|
-
collector << (o.unbiased_estimator ?
|
|
608
|
+
collector << (o.unbiased_estimator ? 'VAR(' : 'VARP(')
|
|
603
609
|
visit o.left, collector
|
|
604
|
-
collector <<
|
|
610
|
+
collector << ')'
|
|
605
611
|
collector
|
|
606
612
|
end
|
|
607
613
|
|
|
608
614
|
|
|
609
615
|
def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
|
|
610
|
-
collector <<
|
|
616
|
+
collector << 'dbo.LEVENSHTEIN_DISTANCE('
|
|
611
617
|
collector = visit o.left, collector
|
|
612
618
|
collector << Arel::Visitors::ToSql::COMMA
|
|
613
619
|
collector = visit o.right, collector
|
|
@@ -616,14 +622,14 @@ module ArelExtensions
|
|
|
616
622
|
end
|
|
617
623
|
|
|
618
624
|
|
|
619
|
-
def visit_ArelExtensions_Nodes_JsonGet o,collector
|
|
625
|
+
def visit_ArelExtensions_Nodes_JsonGet o, collector
|
|
620
626
|
collector << 'JSON_VALUE('
|
|
621
627
|
collector = visit o.dict, collector
|
|
622
628
|
collector << Arel::Visitors::MySQL::COMMA
|
|
623
629
|
if o.key.is_a?(Integer)
|
|
624
630
|
collector << "\"$[#{o.key}]\""
|
|
625
631
|
else
|
|
626
|
-
collector = visit Arel
|
|
632
|
+
collector = visit Arel.quoted('$.') + o.key, collector
|
|
627
633
|
end
|
|
628
634
|
collector << ')'
|
|
629
635
|
collector
|