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
@@ -6,241 +6,252 @@ module ArelExtensions
|
|
6
6
|
# Escape properly the string expression expr.
|
7
7
|
# Take care of escaping.
|
8
8
|
def make_json_string expr
|
9
|
-
Arel
|
9
|
+
Arel.quoted('"') \
|
10
10
|
+ expr
|
11
|
-
.
|
11
|
+
.coalesce('')
|
12
|
+
.replace('\\', '\\\\')
|
13
|
+
.replace('"', '\"')
|
14
|
+
.replace("\b", '\b')
|
15
|
+
.replace("\f", '\f')
|
16
|
+
.replace("\n", '\n')
|
17
|
+
.replace("\r", '\r')
|
18
|
+
.replace("\t", '\t') \
|
12
19
|
+ '"'
|
13
20
|
end
|
14
21
|
|
22
|
+
def make_json_null
|
23
|
+
Arel.quoted('null')
|
24
|
+
end
|
25
|
+
|
15
26
|
# Math Functions
|
16
27
|
def visit_ArelExtensions_Nodes_Abs o, collector
|
17
|
-
collector <<
|
28
|
+
collector << 'ABS('
|
18
29
|
o.expressions.each_with_index { |arg, i|
|
19
30
|
collector << COMMA if i != 0
|
20
31
|
collector = visit arg, collector
|
21
32
|
}
|
22
|
-
collector <<
|
33
|
+
collector << ')'
|
23
34
|
collector
|
24
35
|
end
|
25
36
|
|
26
37
|
def visit_ArelExtensions_Nodes_Ceil o, collector
|
27
|
-
collector <<
|
38
|
+
collector << 'CEIL('
|
28
39
|
o.expressions.each_with_index { |arg, i|
|
29
40
|
collector << COMMA if i != 0
|
30
41
|
collector = visit arg, collector
|
31
42
|
}
|
32
|
-
collector <<
|
43
|
+
collector << ')'
|
33
44
|
collector
|
34
45
|
end
|
35
46
|
|
36
47
|
def visit_ArelExtensions_Nodes_Floor o, collector
|
37
|
-
collector <<
|
48
|
+
collector << 'FLOOR('
|
38
49
|
o.expressions.each_with_index { |arg, i|
|
39
50
|
collector << COMMA if i != 0
|
40
51
|
collector = visit arg, collector
|
41
52
|
}
|
42
|
-
collector <<
|
53
|
+
collector << ')'
|
43
54
|
collector
|
44
55
|
end
|
45
56
|
|
46
57
|
def visit_ArelExtensions_Nodes_Rand o, collector
|
47
|
-
collector <<
|
58
|
+
collector << 'RAND('
|
48
59
|
o.expressions.each_with_index { |arg, i|
|
49
60
|
collector << COMMA if i != 0
|
50
61
|
collector = visit arg, collector
|
51
62
|
}
|
52
|
-
collector <<
|
63
|
+
collector << ')'
|
53
64
|
collector
|
54
65
|
end
|
55
66
|
|
56
67
|
def visit_ArelExtensions_Nodes_Round o, collector
|
57
|
-
collector <<
|
68
|
+
collector << 'ROUND('
|
58
69
|
o.expressions.each_with_index { |arg, i|
|
59
70
|
collector << COMMA if i != 0
|
60
71
|
collector = visit arg, collector
|
61
72
|
}
|
62
|
-
collector <<
|
73
|
+
collector << ')'
|
63
74
|
collector
|
64
75
|
end
|
65
76
|
|
66
77
|
def visit_ArelExtensions_Nodes_Log10 o, collector
|
67
|
-
collector <<
|
78
|
+
collector << 'LOG10('
|
68
79
|
collector = visit o.left, collector
|
69
|
-
collector <<
|
80
|
+
collector << ')'
|
70
81
|
collector
|
71
82
|
end
|
72
83
|
|
73
84
|
def visit_ArelExtensions_Nodes_Power o, collector
|
74
|
-
collector <<
|
85
|
+
collector << 'POW('
|
75
86
|
o.expressions.each_with_index { |arg, i|
|
76
87
|
collector << COMMA if i != 0
|
77
88
|
collector = visit arg, collector
|
78
89
|
}
|
79
|
-
collector <<
|
90
|
+
collector << ')'
|
80
91
|
collector
|
81
92
|
end
|
82
93
|
|
83
94
|
def visit_ArelExtensions_Nodes_Sum o, collector
|
84
|
-
collector <<
|
95
|
+
collector << 'SUM('
|
85
96
|
collector = visit o.expr, collector
|
86
|
-
collector <<
|
97
|
+
collector << ')'
|
87
98
|
collector
|
88
99
|
end
|
89
100
|
|
90
101
|
# String functions
|
91
102
|
def visit_ArelExtensions_Nodes_Concat o, collector
|
92
|
-
collector <<
|
103
|
+
collector << 'CONCAT('
|
93
104
|
o.expressions.each_with_index { |arg, i|
|
94
|
-
|
95
|
-
|
105
|
+
collector << COMMA if i != 0
|
106
|
+
collector = visit arg, collector
|
96
107
|
}
|
97
|
-
collector <<
|
108
|
+
collector << ')'
|
98
109
|
collector
|
99
110
|
end
|
100
111
|
|
101
112
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
102
|
-
collector <<
|
113
|
+
collector << 'GROUP_CONCAT('
|
103
114
|
collector = visit o.left, collector
|
104
115
|
if o.separator && o.separator != 'NULL'
|
105
116
|
collector << COMMA
|
106
117
|
collector = visit o.separator, collector
|
107
118
|
end
|
108
|
-
collector <<
|
119
|
+
collector << ')'
|
109
120
|
collector
|
110
121
|
end
|
111
122
|
|
112
123
|
def visit_ArelExtensions_Nodes_MD5 o, collector
|
113
|
-
collector <<
|
124
|
+
collector << 'MD5('
|
114
125
|
collector = visit o.left, collector
|
115
|
-
collector <<
|
126
|
+
collector << ')'
|
116
127
|
collector
|
117
128
|
end
|
118
129
|
|
119
130
|
def visit_ArelExtensions_Nodes_Length o, collector
|
120
|
-
collector << "LENGTH("
|
131
|
+
collector << "#{o.bytewise ? '' : 'CHAR_'}LENGTH("
|
121
132
|
collector = visit o.left, collector
|
122
|
-
collector <<
|
133
|
+
collector << ')'
|
123
134
|
collector
|
124
135
|
end
|
125
136
|
|
126
137
|
def visit_ArelExtensions_Nodes_Locate o, collector
|
127
|
-
collector <<
|
138
|
+
collector << 'LOCATE('
|
128
139
|
collector = visit o.right, collector
|
129
140
|
collector << COMMA
|
130
141
|
collector = visit o.left, collector
|
131
|
-
collector <<
|
142
|
+
collector << ')'
|
132
143
|
collector
|
133
144
|
end
|
134
145
|
|
135
146
|
def visit_ArelExtensions_Nodes_Substring o, collector
|
136
|
-
collector <<
|
147
|
+
collector << 'SUBSTRING('
|
137
148
|
o.expressions.each_with_index { |arg, i|
|
138
149
|
collector << COMMA if i != 0
|
139
150
|
collector = visit arg, collector
|
140
151
|
}
|
141
|
-
collector <<
|
152
|
+
collector << ')'
|
142
153
|
collector
|
143
154
|
end
|
144
155
|
|
145
156
|
def visit_ArelExtensions_Nodes_Replace o, collector
|
146
|
-
collector <<
|
157
|
+
collector << 'REPLACE('
|
147
158
|
visit o.left, collector
|
148
159
|
collector << COMMA
|
149
160
|
visit o.pattern, collector
|
150
161
|
collector << COMMA
|
151
162
|
visit o.substitute, collector
|
152
|
-
collector <<
|
163
|
+
collector << ')'
|
153
164
|
collector
|
154
165
|
end
|
155
166
|
|
156
167
|
def visit_ArelExtensions_Nodes_RegexpReplace o, collector
|
157
|
-
collector <<
|
168
|
+
collector << 'REGEXP_REPLACE('
|
158
169
|
visit o.left, collector
|
159
170
|
collector << COMMA
|
160
|
-
visit Arel
|
171
|
+
visit Arel.quoted(o.pattern.to_s), collector
|
161
172
|
collector << COMMA
|
162
173
|
visit o.substitute, collector
|
163
|
-
collector <<
|
174
|
+
collector << ')'
|
164
175
|
collector
|
165
176
|
end
|
166
177
|
|
167
178
|
def visit_ArelExtensions_Nodes_Repeat o, collector
|
168
|
-
collector <<
|
179
|
+
collector << 'REPEAT('
|
169
180
|
o.expressions.each_with_index { |arg, i|
|
170
181
|
collector << COMMA if i != 0
|
171
182
|
collector = visit arg, collector
|
172
183
|
}
|
173
|
-
collector <<
|
184
|
+
collector << ')'
|
174
185
|
collector
|
175
186
|
end
|
176
187
|
|
177
188
|
def visit_ArelExtensions_Nodes_FindInSet o, collector
|
178
|
-
collector <<
|
189
|
+
collector << 'FIND_IN_SET('
|
179
190
|
o.expressions.each_with_index { |arg, i|
|
180
191
|
collector << COMMA if i != 0
|
181
192
|
collector = visit arg, collector
|
182
193
|
}
|
183
|
-
collector <<
|
194
|
+
collector << ')'
|
184
195
|
collector
|
185
196
|
end
|
186
197
|
|
187
198
|
def visit_ArelExtensions_Nodes_Soundex o, collector
|
188
|
-
collector <<
|
199
|
+
collector << 'SOUNDEX('
|
189
200
|
o.expressions.each_with_index { |arg, i|
|
190
201
|
collector << COMMA if i != 0
|
191
202
|
collector = visit arg, collector
|
192
203
|
}
|
193
|
-
collector <<
|
204
|
+
collector << ')'
|
194
205
|
collector
|
195
206
|
end
|
196
207
|
|
197
208
|
def visit_ArelExtensions_Nodes_Downcase o, collector
|
198
|
-
collector <<
|
209
|
+
collector << 'LOWER('
|
199
210
|
o.expressions.each_with_index { |arg, i|
|
200
211
|
collector << COMMA if i != 0
|
201
212
|
collector = visit arg, collector
|
202
213
|
}
|
203
|
-
collector <<
|
214
|
+
collector << ')'
|
204
215
|
collector
|
205
216
|
end
|
206
217
|
|
207
218
|
def visit_ArelExtensions_Nodes_Upcase o, collector
|
208
|
-
collector <<
|
219
|
+
collector << 'UPPER('
|
209
220
|
o.expressions.each_with_index { |arg, i|
|
210
221
|
collector << COMMA if i != 0
|
211
222
|
collector = visit arg, collector
|
212
223
|
}
|
213
|
-
collector <<
|
224
|
+
collector << ')'
|
214
225
|
collector
|
215
226
|
end
|
216
227
|
|
217
228
|
def visit_ArelExtensions_Nodes_Trim o, collector
|
218
|
-
collector <<
|
229
|
+
collector << 'TRIM('
|
219
230
|
o.expressions.each_with_index { |arg, i|
|
220
231
|
collector << COMMA if i != 0
|
221
232
|
collector = visit arg, collector
|
222
233
|
}
|
223
|
-
collector <<
|
234
|
+
collector << ')'
|
224
235
|
collector
|
225
236
|
end
|
226
237
|
|
227
238
|
def visit_ArelExtensions_Nodes_Ltrim o, collector
|
228
|
-
collector <<
|
239
|
+
collector << 'LTRIM('
|
229
240
|
o.expressions.each_with_index { |arg, i|
|
230
241
|
collector << COMMA if i != 0
|
231
242
|
collector = visit arg, collector
|
232
243
|
}
|
233
|
-
collector <<
|
244
|
+
collector << ')'
|
234
245
|
collector
|
235
246
|
end
|
236
247
|
|
237
248
|
def visit_ArelExtensions_Nodes_Rtrim o, collector
|
238
|
-
collector <<
|
249
|
+
collector << 'RTRIM('
|
239
250
|
o.expressions.each_with_index { |arg, i|
|
240
251
|
collector << COMMA if i != 0
|
241
252
|
collector = visit arg, collector
|
242
253
|
}
|
243
|
-
collector <<
|
254
|
+
collector << ')'
|
244
255
|
collector
|
245
256
|
end
|
246
257
|
|
@@ -249,8 +260,8 @@ module ArelExtensions
|
|
249
260
|
collector << 'LENGTH(TRIM(COALESCE('
|
250
261
|
collector = visit o.expr, collector
|
251
262
|
collector << COMMA
|
252
|
-
collector = visit Arel
|
253
|
-
collector <<
|
263
|
+
collector = visit Arel.quoted(''), collector
|
264
|
+
collector << '))) = 0'
|
254
265
|
collector
|
255
266
|
end
|
256
267
|
|
@@ -259,25 +270,45 @@ module ArelExtensions
|
|
259
270
|
collector << 'LENGTH(TRIM(COALESCE('
|
260
271
|
collector = visit o.expr, collector
|
261
272
|
collector << COMMA
|
262
|
-
collector = visit Arel
|
263
|
-
collector <<
|
273
|
+
collector = visit Arel.quoted(''), collector
|
274
|
+
collector << '))) > 0'
|
264
275
|
collector
|
265
276
|
end
|
266
277
|
|
267
278
|
def visit_ArelExtensions_Nodes_Format o, collector
|
268
279
|
case o.col_type
|
269
280
|
when :date, :datetime, :time
|
270
|
-
collector <<
|
281
|
+
collector << 'STRFTIME('
|
271
282
|
collector = visit o.right, collector
|
272
283
|
collector << COMMA
|
273
284
|
collector = visit o.left, collector
|
274
|
-
collector <<
|
285
|
+
collector << ')'
|
275
286
|
when :integer, :float, :decimal
|
276
|
-
collector <<
|
287
|
+
collector << 'FORMAT('
|
277
288
|
collector = visit o.left, collector
|
278
289
|
collector << COMMA
|
279
290
|
collector = visit o.right, collector
|
280
|
-
collector <<
|
291
|
+
collector << ')'
|
292
|
+
else
|
293
|
+
collector = visit o.left, collector
|
294
|
+
end
|
295
|
+
collector
|
296
|
+
end
|
297
|
+
|
298
|
+
def visit_ArelExtensions_Nodes_FormattedDate o, collector
|
299
|
+
case o.col_type
|
300
|
+
when :date, :datetime, :time
|
301
|
+
collector << 'STRFTIME('
|
302
|
+
collector = visit o.right, collector
|
303
|
+
collector << COMMA
|
304
|
+
collector = visit o.left, collector
|
305
|
+
collector << ')'
|
306
|
+
when :integer, :float, :decimal
|
307
|
+
collector << 'FORMAT('
|
308
|
+
collector = visit o.left, collector
|
309
|
+
collector << COMMA
|
310
|
+
collector = visit o.right, collector
|
311
|
+
collector << ')'
|
281
312
|
else
|
282
313
|
collector = visit o.left, collector
|
283
314
|
end
|
@@ -287,61 +318,56 @@ module ArelExtensions
|
|
287
318
|
# comparators
|
288
319
|
|
289
320
|
def visit_ArelExtensions_Nodes_Cast o, collector
|
290
|
-
|
321
|
+
as_attr =
|
322
|
+
case o.as_attr
|
323
|
+
when :binary then 'binary'
|
324
|
+
when :datetime then 'datetime'
|
325
|
+
when :decimal, :float, :number then 'float'
|
326
|
+
when :int then 'int'
|
327
|
+
when :string then 'char'
|
328
|
+
when :text, :ntext then 'text'
|
329
|
+
when :time then 'time'
|
330
|
+
else o.as_attr.to_s
|
331
|
+
end
|
332
|
+
|
333
|
+
collector << 'CAST('
|
291
334
|
collector = visit o.left, collector
|
292
|
-
collector <<
|
293
|
-
|
294
|
-
|
295
|
-
as_attr = Arel::Nodes::SqlLiteral.new('char')
|
296
|
-
when :int
|
297
|
-
as_attr = Arel::Nodes::SqlLiteral.new('int')
|
298
|
-
when :decimal, :float, :number
|
299
|
-
as_attr = Arel::Nodes::SqlLiteral.new('float')
|
300
|
-
when :datetime
|
301
|
-
as_attr = Arel::Nodes::SqlLiteral.new('datetime')
|
302
|
-
when :time
|
303
|
-
as_attr = Arel::Nodes::SqlLiteral.new('time')
|
304
|
-
when :binary
|
305
|
-
as_attr = Arel::Nodes::SqlLiteral.new('binary')
|
306
|
-
when :text, :ntext
|
307
|
-
as_attr = Arel::Nodes::SqlLiteral.new('text')
|
308
|
-
else
|
309
|
-
as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
|
310
|
-
end
|
311
|
-
collector = visit as_attr, collector
|
312
|
-
collector << ")"
|
335
|
+
collector << ' AS '
|
336
|
+
collector = visit Arel::Nodes::SqlLiteral.new(as_attr), collector
|
337
|
+
collector << ')'
|
313
338
|
collector
|
314
339
|
end
|
315
340
|
|
316
341
|
def visit_ArelExtensions_Nodes_Coalesce o, collector
|
317
|
-
collector <<
|
342
|
+
collector << 'COALESCE('
|
318
343
|
o.expressions.each_with_index { |arg, i|
|
319
344
|
collector << COMMA if i != 0
|
320
345
|
collector = visit arg, collector
|
321
346
|
}
|
322
|
-
collector <<
|
347
|
+
collector << ')'
|
323
348
|
collector
|
324
349
|
end
|
325
350
|
|
326
351
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
327
|
-
collector <<
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
352
|
+
collector <<
|
353
|
+
if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
354
|
+
'TIMEDIFF('
|
355
|
+
else
|
356
|
+
'DATEDIFF('
|
357
|
+
end
|
332
358
|
collector = visit o.left, collector
|
333
359
|
collector << COMMA
|
334
360
|
collector = visit o.right, collector
|
335
|
-
collector <<
|
361
|
+
collector << ')'
|
336
362
|
collector
|
337
363
|
end
|
338
364
|
|
339
365
|
def visit_ArelExtensions_Nodes_DateSub o, collector
|
340
|
-
collector <<
|
366
|
+
collector << 'DATE_SUB('
|
341
367
|
collector = visit o.left, collector
|
342
368
|
collector << COMMA
|
343
369
|
collector = visit o.right, collector
|
344
|
-
collector <<
|
370
|
+
collector << ')'
|
345
371
|
collector
|
346
372
|
end
|
347
373
|
|
@@ -358,7 +384,7 @@ module ArelExtensions
|
|
358
384
|
else
|
359
385
|
collector = visit o.left, collector
|
360
386
|
end
|
361
|
-
collector <<
|
387
|
+
collector << ' AS '
|
362
388
|
collector = visit o.right, collector
|
363
389
|
collector
|
364
390
|
end
|
@@ -366,7 +392,7 @@ module ArelExtensions
|
|
366
392
|
remove_method(:visit_Arel_Nodes_Regexp) rescue nil # if Arel::Visitors::ToSql.method_defined?(:visit_Arel_Nodes_Regexp)
|
367
393
|
def visit_Arel_Nodes_Regexp o, collector
|
368
394
|
collector = visit o.left, collector
|
369
|
-
collector <<
|
395
|
+
collector << ' REGEXP '
|
370
396
|
collector = visit o.right, collector
|
371
397
|
collector
|
372
398
|
end
|
@@ -374,7 +400,7 @@ module ArelExtensions
|
|
374
400
|
remove_method(:visit_Arel_Nodes_NotRegexp) rescue nil # if Arel::Visitors::ToSql.method_defined?(:visit_Arel_Nodes_NotRegexp)
|
375
401
|
def visit_Arel_Nodes_NotRegexp o, collector
|
376
402
|
collector = visit o.left, collector
|
377
|
-
collector <<
|
403
|
+
collector << ' NOT REGEXP '
|
378
404
|
collector = visit o.right, collector
|
379
405
|
collector
|
380
406
|
end
|
@@ -399,35 +425,35 @@ module ArelExtensions
|
|
399
425
|
end
|
400
426
|
|
401
427
|
def visit_ArelExtensions_Nodes_IsNull o, collector
|
402
|
-
collector <<
|
428
|
+
collector << 'ISNULL('
|
403
429
|
collector = visit o.expr, collector
|
404
|
-
collector <<
|
430
|
+
collector << ')'
|
405
431
|
collector
|
406
432
|
end
|
407
433
|
|
408
434
|
def visit_ArelExtensions_Nodes_IsNotNull o, collector
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
435
|
+
collector << 'NOT ISNULL('
|
436
|
+
collector = visit o.expr, collector
|
437
|
+
collector << ')'
|
438
|
+
collector
|
413
439
|
end
|
414
440
|
|
415
441
|
def visit_ArelExtensions_Nodes_Then o, collector
|
416
|
-
collector <<
|
442
|
+
collector << 'CASE WHEN ('
|
417
443
|
collector = visit o.left, collector
|
418
|
-
collector <<
|
444
|
+
collector << ') THEN '
|
419
445
|
collector = visit o.right, collector
|
420
446
|
if o.expressions[2]
|
421
|
-
collector <<
|
447
|
+
collector << ' ELSE '
|
422
448
|
collector = visit o.expressions[2], collector
|
423
449
|
end
|
424
|
-
collector <<
|
450
|
+
collector << ' END'
|
425
451
|
collector
|
426
452
|
end
|
427
453
|
|
428
454
|
# Date operations
|
429
455
|
def visit_ArelExtensions_Nodes_DateAdd o, collector
|
430
|
-
collector <<
|
456
|
+
collector << 'DATE_ADD('
|
431
457
|
collector = visit o.left, collector
|
432
458
|
collector << COMMA
|
433
459
|
collector = visit o.sqlite_value(o.right), collector
|
@@ -451,7 +477,7 @@ module ArelExtensions
|
|
451
477
|
end
|
452
478
|
collector << COMMA unless i == len
|
453
479
|
}
|
454
|
-
collector << (idx == row_nb-1 ? ')' : '), ')
|
480
|
+
collector << (idx == row_nb - 1 ? ')' : '), ')
|
455
481
|
end
|
456
482
|
collector
|
457
483
|
end
|
@@ -473,7 +499,7 @@ module ArelExtensions
|
|
473
499
|
end
|
474
500
|
collector << COMMA unless i == len
|
475
501
|
}
|
476
|
-
collector << (idx == row_nb-1 ? ')' : '), ')
|
502
|
+
collector << (idx == row_nb - 1 ? ')' : '), ')
|
477
503
|
end
|
478
504
|
collector
|
479
505
|
end
|
@@ -481,45 +507,45 @@ module ArelExtensions
|
|
481
507
|
|
482
508
|
def visit_ArelExtensions_Nodes_Union o, collector
|
483
509
|
collector = visit o.left, collector
|
484
|
-
collector <<
|
510
|
+
collector << ' UNION '
|
485
511
|
collector = visit o.right, collector
|
486
512
|
collector
|
487
513
|
end
|
488
514
|
|
489
515
|
def visit_ArelExtensions_Nodes_UnionAll o, collector
|
490
516
|
collector = visit o.left, collector
|
491
|
-
collector <<
|
517
|
+
collector << ' UNION ALL '
|
492
518
|
collector = visit o.right, collector
|
493
519
|
collector
|
494
520
|
end
|
495
521
|
|
496
522
|
def visit_ArelExtensions_Nodes_Case o, collector
|
497
|
-
collector <<
|
523
|
+
collector << 'CASE '
|
498
524
|
if o.case
|
499
525
|
visit o.case, collector
|
500
|
-
collector <<
|
526
|
+
collector << ' '
|
501
527
|
end
|
502
528
|
o.conditions.each do |condition|
|
503
529
|
visit condition, collector
|
504
|
-
collector <<
|
530
|
+
collector << ' '
|
505
531
|
end
|
506
532
|
if o.default
|
507
533
|
visit o.default, collector
|
508
|
-
collector <<
|
534
|
+
collector << ' '
|
509
535
|
end
|
510
|
-
collector <<
|
536
|
+
collector << 'END'
|
511
537
|
end
|
512
538
|
|
513
539
|
def visit_ArelExtensions_Nodes_Case_When o, collector
|
514
|
-
collector <<
|
515
|
-
visit Arel
|
516
|
-
collector <<
|
517
|
-
visit Arel
|
540
|
+
collector << 'WHEN '
|
541
|
+
visit Arel.quoted(o.left), collector
|
542
|
+
collector << ' THEN '
|
543
|
+
visit Arel.quoted(o.right), collector
|
518
544
|
end
|
519
545
|
|
520
546
|
def visit_ArelExtensions_Nodes_Case_Else o, collector
|
521
|
-
collector <<
|
522
|
-
visit Arel
|
547
|
+
collector << 'ELSE '
|
548
|
+
visit Arel.quoted(o.expr), collector
|
523
549
|
end
|
524
550
|
|
525
551
|
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
@@ -529,26 +555,26 @@ module ArelExtensions
|
|
529
555
|
remove_method(:visit_Arel_Nodes_LessThan) rescue nil
|
530
556
|
def visit_Arel_Nodes_LessThan o, collector
|
531
557
|
collector = visit o.left, collector
|
532
|
-
collector <<
|
558
|
+
collector << ' < '
|
533
559
|
visit o.right, collector
|
534
560
|
end
|
535
561
|
|
536
562
|
def visit_ArelExtensions_Nodes_Std o, collector
|
537
|
-
collector <<
|
563
|
+
collector << 'STD('
|
538
564
|
visit o.left, collector
|
539
|
-
collector <<
|
565
|
+
collector << ')'
|
540
566
|
collector
|
541
567
|
end
|
542
568
|
|
543
569
|
def visit_ArelExtensions_Nodes_Variance o, collector
|
544
|
-
collector <<
|
570
|
+
collector << 'VARIANCE('
|
545
571
|
visit o.left, collector
|
546
|
-
collector <<
|
572
|
+
collector << ')'
|
547
573
|
collector
|
548
574
|
end
|
549
575
|
|
550
576
|
def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
|
551
|
-
collector <<
|
577
|
+
collector << 'LEVENSHTEIN_DISTANCE('
|
552
578
|
collector = visit o.left, collector
|
553
579
|
collector << COMMA
|
554
580
|
collector = visit o.right, collector
|
@@ -586,58 +612,58 @@ module ArelExtensions
|
|
586
612
|
when 1
|
587
613
|
collector = visit o.children[0], collector
|
588
614
|
else
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
615
|
+
collector << '('
|
616
|
+
o.children.each_with_index { |arg, i|
|
617
|
+
if i != 0
|
618
|
+
collector << ') OR ('
|
619
|
+
end
|
620
|
+
collector = visit arg, collector
|
621
|
+
}
|
622
|
+
collector << ')'
|
597
623
|
end
|
598
624
|
collector
|
599
625
|
end
|
600
626
|
|
601
|
-
def json_value(o,v)
|
627
|
+
def json_value(o, v)
|
602
628
|
case o.type_of_node(v)
|
603
629
|
when :string
|
604
|
-
Arel.when(v.is_null).then(
|
630
|
+
Arel.when(v.is_null).then(make_json_null).else(make_json_string(v))
|
605
631
|
when :date
|
606
632
|
s = v.format('%Y-%m-%d')
|
607
|
-
Arel.when(s.is_null).then(
|
633
|
+
Arel.when(s.is_null).then(make_json_null).else(make_json_string(s))
|
608
634
|
when :datetime
|
609
635
|
s = v.format('%Y-%m-%dT%H:%M:%S')
|
610
|
-
Arel.when(s.is_null).then(
|
636
|
+
Arel.when(s.is_null).then(make_json_null).else(make_json_string(s))
|
611
637
|
when :time
|
612
638
|
s = v.format('%H:%M:%S')
|
613
|
-
Arel.when(s.is_null).then(
|
639
|
+
Arel.when(s.is_null).then(make_json_null).else(make_json_string(s))
|
614
640
|
when :nil
|
615
|
-
|
641
|
+
make_json_null
|
616
642
|
else
|
617
|
-
ArelExtensions::Nodes::Cast.new([v, :string]).coalesce(
|
643
|
+
ArelExtensions::Nodes::Cast.new([v, :string]).coalesce(make_json_null)
|
618
644
|
end
|
619
645
|
end
|
620
646
|
|
621
|
-
def visit_ArelExtensions_Nodes_Json o,collector
|
647
|
+
def visit_ArelExtensions_Nodes_Json o, collector
|
622
648
|
case o.dict
|
623
649
|
when Array
|
624
|
-
res = Arel
|
625
|
-
o.dict.each.with_index do |v,i|
|
650
|
+
res = Arel.quoted('[')
|
651
|
+
o.dict.each.with_index do |v, i|
|
626
652
|
if i != 0
|
627
653
|
res += ', '
|
628
654
|
end
|
629
|
-
res += json_value(o,v)
|
655
|
+
res += json_value(o, v)
|
630
656
|
end
|
631
657
|
res += ']'
|
632
658
|
collector = visit res, collector
|
633
659
|
when Hash
|
634
|
-
res = Arel
|
635
|
-
o.dict.each.with_index do |(k,v),i|
|
660
|
+
res = Arel.quoted('{')
|
661
|
+
o.dict.each.with_index do |(k, v), i|
|
636
662
|
if i != 0
|
637
663
|
res += ', '
|
638
664
|
end
|
639
|
-
res += make_json_string(ArelExtensions::Nodes::Cast.new([k, :string])
|
640
|
-
res += json_value(o,v)
|
665
|
+
res += make_json_string(ArelExtensions::Nodes::Cast.new([k, :string])) + ': '
|
666
|
+
res += json_value(o, v)
|
641
667
|
end
|
642
668
|
res += '}'
|
643
669
|
collector = visit res, collector
|
@@ -649,17 +675,20 @@ module ArelExtensions
|
|
649
675
|
|
650
676
|
def visit_ArelExtensions_Nodes_JsonGroup o, collector
|
651
677
|
if o.as_array
|
652
|
-
res =
|
678
|
+
res =
|
679
|
+
Arel.quoted('[') \
|
680
|
+
+ (o.orders ? o.dict.group_concat(', ', order: Array(o.orders)) : o.dict.group_concat(', ')).coalesce('') \
|
681
|
+
+ ']'
|
653
682
|
collector = visit res, collector
|
654
683
|
else
|
655
|
-
res = Arel
|
684
|
+
res = Arel.quoted('{')
|
656
685
|
orders = o.orders || o.dict.keys
|
657
|
-
o.dict.each.with_index do |(k,v),i|
|
686
|
+
o.dict.each.with_index do |(k, v), i|
|
658
687
|
if i != 0
|
659
688
|
res = res + ', '
|
660
689
|
end
|
661
|
-
kv = make_json_string(ArelExtensions::Nodes::Cast.new([k, :string])
|
662
|
-
kv += json_value(o,v)
|
690
|
+
kv = make_json_string(ArelExtensions::Nodes::Cast.new([k, :string])) + ': '
|
691
|
+
kv += json_value(o, v)
|
663
692
|
res = res + kv.group_concat(', ', order: Array(orders)).coalesce('')
|
664
693
|
end
|
665
694
|
res = res + '}'
|