arel_extensions 1.6.0 → 2.0.0.rc3
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 +2 -1
- data/.gitignore +6 -7
- data/.rubocop.yml +3 -67
- data/.travis/oracle/download.js +152 -0
- data/.travis/oracle/download.sh +30 -0
- data/.travis/oracle/download_ojdbc.js +116 -0
- data/.travis/oracle/install.sh +34 -0
- data/.travis/setup_accounts.sh +9 -0
- data/.travis/sqlite3/extension-functions.sh +6 -0
- data/.travis.yml +223 -0
- data/Gemfile +28 -2
- data/README.md +91 -258
- data/Rakefile +30 -48
- data/TODO +1 -0
- data/appveyor.yml +22 -60
- data/arel_extensions.gemspec +14 -13
- data/functions.html +3 -3
- data/gemfiles/rails3.gemfile +20 -0
- data/gemfiles/rails4.gemfile +29 -0
- data/gemfiles/rails5_0.gemfile +29 -0
- data/gemfiles/rails5_1_4.gemfile +14 -14
- data/gemfiles/rails5_2.gemfile +14 -16
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +25 -24
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/attributes.rb +3 -7
- data/lib/arel_extensions/boolean_functions.rb +14 -53
- data/lib/arel_extensions/common_sql_functions.rb +17 -16
- data/lib/arel_extensions/comparators.rb +28 -29
- data/lib/arel_extensions/date_duration.rb +13 -17
- data/lib/arel_extensions/insert_manager.rb +15 -18
- data/lib/arel_extensions/math.rb +53 -55
- data/lib/arel_extensions/math_functions.rb +39 -46
- data/lib/arel_extensions/nodes/abs.rb +1 -0
- data/lib/arel_extensions/nodes/blank.rb +2 -1
- data/lib/arel_extensions/nodes/case.rb +19 -20
- data/lib/arel_extensions/nodes/cast.rb +8 -10
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/coalesce.rb +4 -3
- data/lib/arel_extensions/nodes/collate.rb +10 -9
- data/lib/arel_extensions/nodes/concat.rb +18 -9
- data/lib/arel_extensions/nodes/date_diff.rb +26 -42
- data/lib/arel_extensions/nodes/duration.rb +3 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
- data/lib/arel_extensions/nodes/floor.rb +1 -1
- data/lib/arel_extensions/nodes/format.rb +8 -35
- data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
- data/lib/arel_extensions/nodes/function.rb +37 -46
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +39 -52
- data/lib/arel_extensions/nodes/length.rb +0 -5
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +2 -1
- data/lib/arel_extensions/nodes/log10.rb +2 -1
- data/lib/arel_extensions/nodes/matches.rb +8 -6
- data/lib/arel_extensions/nodes/md5.rb +1 -0
- data/lib/arel_extensions/nodes/power.rb +5 -5
- data/lib/arel_extensions/nodes/rand.rb +1 -0
- data/lib/arel_extensions/nodes/repeat.rb +5 -3
- data/lib/arel_extensions/nodes/replace.rb +8 -16
- data/lib/arel_extensions/nodes/round.rb +6 -5
- data/lib/arel_extensions/nodes/soundex.rb +15 -15
- data/lib/arel_extensions/nodes/std.rb +21 -18
- data/lib/arel_extensions/nodes/substring.rb +16 -8
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +6 -4
- data/lib/arel_extensions/nodes/union.rb +8 -5
- data/lib/arel_extensions/nodes/union_all.rb +7 -4
- data/lib/arel_extensions/nodes/wday.rb +4 -0
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/null_functions.rb +5 -19
- data/lib/arel_extensions/predications.rb +44 -45
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +7 -5
- data/lib/arel_extensions/string_functions.rb +35 -91
- data/lib/arel_extensions/tasks.rb +6 -6
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/ibm_db.rb +31 -24
- data/lib/arel_extensions/visitors/mssql.rb +194 -440
- data/lib/arel_extensions/visitors/mysql.rb +212 -368
- data/lib/arel_extensions/visitors/oracle.rb +179 -236
- data/lib/arel_extensions/visitors/oracle12.rb +31 -18
- data/lib/arel_extensions/visitors/postgresql.rb +173 -271
- data/lib/arel_extensions/visitors/sqlite.rb +127 -157
- data/lib/arel_extensions/visitors/to_sql.rb +238 -300
- data/lib/arel_extensions/visitors.rb +62 -83
- data/lib/arel_extensions.rb +31 -235
- data/test/database.yml +10 -20
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +118 -121
- data/test/support/fake_record.rb +3 -11
- data/test/test_comparators.rb +17 -14
- data/test/visitors/test_bulk_insert_oracle.rb +12 -12
- data/test/visitors/test_bulk_insert_sqlite.rb +14 -13
- data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
- data/test/visitors/test_oracle.rb +55 -55
- data/test/visitors/test_to_sql.rb +226 -419
- data/test/with_ar/all_agnostic_test.rb +370 -773
- data/test/with_ar/insert_agnostic_test.rb +22 -28
- data/test/with_ar/test_bulk_sqlite.rb +17 -18
- data/test/with_ar/test_math_sqlite.rb +27 -27
- data/test/with_ar/test_string_mysql.rb +34 -32
- data/test/with_ar/test_string_sqlite.rb +35 -31
- metadata +38 -52
- data/.github/workflows/publish.yml +0 -30
- data/.github/workflows/release.yml +0 -30
- data/.github/workflows/ruby.yml +0 -452
- data/CONTRIBUTING.md +0 -102
- data/Makefile +0 -18
- data/NEWS.md +0 -116
- data/bin/build +0 -15
- data/bin/publish +0 -8
- data/dev/arelx.dockerfile +0 -41
- data/dev/compose.yaml +0 -69
- data/dev/postgres.dockerfile +0 -5
- data/dev/rbenv +0 -189
- data/gemfiles/rails5.gemfile +0 -29
- data/gemfiles/rails6.gemfile +0 -34
- data/gemfiles/rails6_1.gemfile +0 -42
- data/gemfiles/rails7.gemfile +0 -42
- data/gemfiles/rails7_1.gemfile +0 -41
- data/gemfiles/rails7_2.gemfile +0 -41
- data/gemfiles/rails8.gemfile +0 -40
- data/gemfiles/rails8_1.gemfile +0 -41
- data/gemspecs/arel_extensions-v1.gemspec +0 -27
- data/gemspecs/arel_extensions-v2.gemspec +0 -27
- data/generate_gems.sh +0 -15
- data/lib/arel_extensions/aliases.rb +0 -14
- data/lib/arel_extensions/constants.rb +0 -13
- data/lib/arel_extensions/helpers.rb +0 -61
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
- data/lib/arel_extensions/nodes/byte_size.rb +0 -11
- data/lib/arel_extensions/nodes/char_length.rb +0 -11
- data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
- data/lib/arel_extensions/nodes/rollup.rb +0 -36
- data/lib/arel_extensions/nodes/select.rb +0 -10
- data/lib/arel_extensions/nodes/sum.rb +0 -7
- data/lib/arel_extensions/visitors/convert_format.rb +0 -37
- data/lib/arel_extensions/warning.rb +0 -42
- data/test/arelx_test_helper.rb +0 -94
- data/test/config_loader.rb +0 -9
- data/version_v1.rb +0 -3
- data/version_v2.rb +0 -3
|
@@ -1,39 +1,16 @@
|
|
|
1
1
|
module ArelExtensions
|
|
2
2
|
module Visitors
|
|
3
|
-
|
|
4
|
-
DATE_MAPPING = {
|
|
5
|
-
|
|
6
|
-
'h' => '%H', 'mn' => '%M', 's' => '%S'
|
|
7
|
-
}.freeze
|
|
8
|
-
|
|
9
|
-
DATE_FORMAT_DIRECTIVES = { # ISO C / POSIX
|
|
3
|
+
Arel::Visitors::SQLite.class_eval do
|
|
4
|
+
Arel::Visitors::SQLite::DATE_MAPPING = {'d' => '%d', 'm' => '%m', 'w' => '%W', 'y' => '%Y', 'wd' => '%w', 'M' => '%M', 'h' => '%H', 'mn' => '%M', 's' => '%S'}
|
|
5
|
+
Arel::Visitors::SQLite::DATE_FORMAT_DIRECTIVES = { # ISO C / POSIX
|
|
10
6
|
'%Y' => '%Y', '%C' => '', '%y' => '%y', '%m' => '%m', '%B' => '%M', '%b' => '%b', '%^b' => '%b', # year, month
|
|
11
7
|
'%d' => '%d', '%e' => '%e', '%j' => '%j', '%w' => '%w', '%A' => '%W', # day, weekday
|
|
12
8
|
'%H' => '%H', '%k' => '%k', '%I' => '%I', '%l' => '%l', '%P' => '%p', '%p' => '%p', # hours
|
|
13
9
|
'%M' => '%M', '%S' => '%S', '%L' => '', '%N' => '%f', '%z' => '' # seconds, subseconds
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
NUMBER_COMMA_MAPPING = {
|
|
17
|
-
'fr_FR' => {',' => ' ', '.' => ','}
|
|
18
|
-
}.freeze
|
|
19
|
-
|
|
20
|
-
# String functions
|
|
21
|
-
def visit_ArelExtensions_Nodes_ByteSize o, collector
|
|
22
|
-
# sqlite 3.43.0 (2023-08-24) introduced `octet_length`, but we still support older versions.
|
|
23
|
-
# https://sqlite.org/changes.html
|
|
24
|
-
collector << 'length(CAST('
|
|
25
|
-
collector = visit o.expr.coalesce(''), collector
|
|
26
|
-
collector << ' AS BLOB))'
|
|
27
|
-
collector
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def visit_ArelExtensions_Nodes_CharLength o, collector
|
|
31
|
-
collector << 'length('
|
|
32
|
-
collector = visit o.expr.coalesce(''), collector
|
|
33
|
-
collector << ')'
|
|
34
|
-
collector
|
|
35
|
-
end
|
|
10
|
+
}
|
|
11
|
+
Arel::Visitors::SQLite::NUMBER_COMMA_MAPPING = { 'fr_FR' => {',' => ' ','.' =>','} }
|
|
36
12
|
|
|
13
|
+
#String functions
|
|
37
14
|
def visit_ArelExtensions_Nodes_IMatches o, collector # insensitive on ASCII
|
|
38
15
|
collector = visit o.left.ci_collate, collector
|
|
39
16
|
collector << ' LIKE '
|
|
@@ -47,27 +24,27 @@ module ArelExtensions
|
|
|
47
24
|
end
|
|
48
25
|
|
|
49
26
|
def visit_ArelExtensions_Nodes_AiMatches o, collector
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
27
|
+
collector = visit o.left.ai_collate, collector
|
|
28
|
+
collector << ' LIKE '
|
|
29
|
+
collector = visit o.right.ai_collate, collector
|
|
30
|
+
if o.escape
|
|
31
|
+
collector << ' ESCAPE '
|
|
32
|
+
visit o.escape, collector
|
|
33
|
+
else
|
|
34
|
+
collector
|
|
35
|
+
end
|
|
59
36
|
end
|
|
60
37
|
|
|
61
38
|
def visit_ArelExtensions_Nodes_AiIMatches o, collector
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
39
|
+
collector = visit o.left.collate(true,true), collector
|
|
40
|
+
collector << ' LIKE '
|
|
41
|
+
collector = visit o.right.collate(true,true), collector
|
|
42
|
+
if o.escape
|
|
43
|
+
collector << ' ESCAPE '
|
|
44
|
+
visit o.escape, collector
|
|
45
|
+
else
|
|
46
|
+
collector
|
|
47
|
+
end
|
|
71
48
|
end
|
|
72
49
|
|
|
73
50
|
def visit_ArelExtensions_Nodes_SMatches o, collector
|
|
@@ -96,6 +73,7 @@ module ArelExtensions
|
|
|
96
73
|
collector
|
|
97
74
|
end
|
|
98
75
|
|
|
76
|
+
|
|
99
77
|
def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
|
|
100
78
|
collector = visit o.left.lower, collector
|
|
101
79
|
collector << ' NOT LIKE '
|
|
@@ -110,44 +88,44 @@ module ArelExtensions
|
|
|
110
88
|
|
|
111
89
|
# Date operations
|
|
112
90
|
def visit_ArelExtensions_Nodes_DateAdd o, collector
|
|
113
|
-
collector <<
|
|
91
|
+
collector << "date("
|
|
114
92
|
collector = visit o.expressions.first, collector
|
|
115
|
-
collector << COMMA
|
|
93
|
+
collector << Arel::Visitors::SQLite::COMMA
|
|
116
94
|
collector = visit o.sqlite_value, collector
|
|
117
|
-
collector <<
|
|
95
|
+
collector << ")"
|
|
118
96
|
collector
|
|
119
97
|
end
|
|
120
98
|
|
|
121
99
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
|
122
|
-
|
|
123
|
-
when :ruby_time, :datetime, :time
|
|
100
|
+
if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
|
124
101
|
collector << "strftime('%s', "
|
|
125
102
|
collector = visit o.left, collector
|
|
126
103
|
collector << ") - strftime('%s', "
|
|
127
104
|
collector = visit o.right, collector
|
|
128
105
|
else
|
|
129
|
-
collector <<
|
|
106
|
+
collector << "julianday("
|
|
130
107
|
collector = visit o.left, collector
|
|
131
|
-
collector <<
|
|
108
|
+
collector << ") - julianday("
|
|
132
109
|
collector = visit o.right, collector
|
|
133
110
|
end
|
|
134
|
-
collector <<
|
|
111
|
+
collector << ")"
|
|
135
112
|
collector
|
|
136
113
|
end
|
|
137
114
|
|
|
138
115
|
def visit_ArelExtensions_Nodes_Duration o, collector
|
|
139
|
-
collector << "strftime('#{DATE_MAPPING[o.left]}'#{COMMA}"
|
|
116
|
+
collector << "strftime('#{Arel::Visitors::SQLite::DATE_MAPPING[o.left]}'#{Arel::Visitors::SQLite::COMMA}"
|
|
140
117
|
collector = visit o.right, collector
|
|
141
|
-
collector <<
|
|
118
|
+
collector << ")"
|
|
142
119
|
collector
|
|
143
120
|
end
|
|
144
121
|
|
|
122
|
+
|
|
145
123
|
def visit_ArelExtensions_Nodes_Locate o, collector
|
|
146
|
-
collector <<
|
|
124
|
+
collector << "instr("
|
|
147
125
|
collector = visit o.expr, collector
|
|
148
|
-
collector << COMMA
|
|
126
|
+
collector << Arel::Visitors::SQLite::COMMA
|
|
149
127
|
collector = visit o.right, collector
|
|
150
|
-
collector <<
|
|
128
|
+
collector << ")"
|
|
151
129
|
collector
|
|
152
130
|
end
|
|
153
131
|
|
|
@@ -157,17 +135,17 @@ module ArelExtensions
|
|
|
157
135
|
collector = visit arg, collector
|
|
158
136
|
collector << ' || ' unless i == o.expressions.length - 1
|
|
159
137
|
}
|
|
160
|
-
collector <<
|
|
138
|
+
collector << ")"
|
|
161
139
|
collector
|
|
162
140
|
end
|
|
163
141
|
|
|
164
142
|
def visit_ArelExtensions_Nodes_Substring o, collector
|
|
165
|
-
collector <<
|
|
143
|
+
collector << "SUBSTR("
|
|
166
144
|
o.expressions.each_with_index { |arg, i|
|
|
167
|
-
collector << COMMA
|
|
145
|
+
collector << Arel::Visitors::SQLite::COMMA unless i == 0
|
|
168
146
|
collector = visit arg, collector
|
|
169
147
|
}
|
|
170
|
-
collector <<
|
|
148
|
+
collector << ")"
|
|
171
149
|
collector
|
|
172
150
|
end
|
|
173
151
|
|
|
@@ -178,32 +156,32 @@ module ArelExtensions
|
|
|
178
156
|
end
|
|
179
157
|
|
|
180
158
|
def visit_ArelExtensions_Nodes_IsNotNull o, collector
|
|
181
|
-
|
|
159
|
+
collector = visit o.expr, collector
|
|
182
160
|
collector << ' IS NOT NULL'
|
|
183
161
|
collector
|
|
184
162
|
end
|
|
185
163
|
|
|
186
164
|
def visit_ArelExtensions_Nodes_Rand o, collector
|
|
187
|
-
collector <<
|
|
165
|
+
collector << "RANDOM("
|
|
188
166
|
if o.left != nil && o.right != nil
|
|
189
167
|
collector = visit o.left, collector
|
|
190
|
-
collector << COMMA
|
|
168
|
+
collector << Arel::Visitors::SQLite::COMMA
|
|
191
169
|
collector = visit o.right, collector
|
|
192
170
|
end
|
|
193
|
-
collector <<
|
|
171
|
+
collector << ")"
|
|
194
172
|
collector
|
|
195
173
|
end
|
|
196
174
|
|
|
197
175
|
def visit_Arel_Nodes_Regexp o, collector
|
|
198
176
|
collector = visit o.left, collector
|
|
199
|
-
collector <<
|
|
177
|
+
collector << " REGEXP"
|
|
200
178
|
collector = visit o.right, collector
|
|
201
179
|
collector
|
|
202
180
|
end
|
|
203
181
|
|
|
204
182
|
def visit_Arel_Nodes_NotRegexp o, collector
|
|
205
183
|
collector = visit o.left, collector
|
|
206
|
-
collector <<
|
|
184
|
+
collector << " NOT REGEXP "
|
|
207
185
|
collector = visit o.right, collector
|
|
208
186
|
collector
|
|
209
187
|
end
|
|
@@ -211,65 +189,56 @@ module ArelExtensions
|
|
|
211
189
|
def visit_ArelExtensions_Nodes_Wday o, collector
|
|
212
190
|
collector << "STRFTIME('%w',"
|
|
213
191
|
collector = visit o.date, collector
|
|
214
|
-
collector <<
|
|
192
|
+
collector << ")"
|
|
215
193
|
collector
|
|
216
194
|
end
|
|
217
195
|
|
|
218
|
-
#
|
|
219
|
-
#
|
|
220
|
-
# WHEN 3.42 >= 0 THEN CAST(3.42 AS INT)
|
|
221
|
-
# WHEN CAST(3.42 AS INT) = 3.42 THEN CAST(3.42 AS INT)
|
|
222
|
-
# ELSE CAST((3.42 - 1.0) AS INT)
|
|
223
|
-
# END
|
|
224
|
-
# AS FLOAT
|
|
225
|
-
# )
|
|
196
|
+
# CASE WHEN ROUND(3.42,1) > round(3.42) THEN round(3.42) ELSE round(3.42)-1 END
|
|
197
|
+
# OR CAST(3.14 AS INTEGER)
|
|
226
198
|
def visit_ArelExtensions_Nodes_Floor o, collector
|
|
227
|
-
collector <<
|
|
228
|
-
collector = visit o.left, collector
|
|
229
|
-
collector << ' >= 0 THEN CAST('
|
|
230
|
-
collector = visit o.left, collector
|
|
231
|
-
collector << ' AS INT) WHEN CAST('
|
|
199
|
+
collector << "CASE WHEN ROUND("
|
|
232
200
|
collector = visit o.left, collector
|
|
233
|
-
collector <<
|
|
201
|
+
collector << ", 1) > ROUND("
|
|
234
202
|
collector = visit o.left, collector
|
|
235
|
-
collector <<
|
|
203
|
+
collector << ") THEN ROUND("
|
|
236
204
|
collector = visit o.left, collector
|
|
237
|
-
collector <<
|
|
205
|
+
collector << ") ELSE ROUND("
|
|
238
206
|
collector = visit o.left, collector
|
|
239
|
-
collector <<
|
|
207
|
+
collector << ") - 1 END"
|
|
240
208
|
collector
|
|
241
209
|
end
|
|
242
210
|
|
|
243
211
|
def visit_ArelExtensions_Nodes_Ceil o, collector
|
|
244
|
-
collector <<
|
|
212
|
+
collector << "CASE WHEN ROUND("
|
|
245
213
|
collector = visit o.left, collector
|
|
246
|
-
collector <<
|
|
214
|
+
collector << ", 1) > ROUND("
|
|
247
215
|
collector = visit o.left, collector
|
|
248
|
-
collector <<
|
|
216
|
+
collector << ") THEN ROUND("
|
|
249
217
|
collector = visit o.left, collector
|
|
250
|
-
collector <<
|
|
218
|
+
collector << ") + 1 ELSE ROUND("
|
|
251
219
|
collector = visit o.left, collector
|
|
252
|
-
collector <<
|
|
220
|
+
collector << ") END"
|
|
253
221
|
collector
|
|
254
222
|
end
|
|
255
223
|
|
|
256
|
-
if
|
|
224
|
+
if Arel::VERSION.to_i < 7
|
|
257
225
|
def visit_ArelExtensions_InsertManager_BulkValues o, collector
|
|
258
226
|
o.left.each_with_index do |row, idx|
|
|
259
227
|
collector << 'SELECT '
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
228
|
+
v = Arel::Nodes::Values.new(row, o.cols)
|
|
229
|
+
len = v.expressions.length - 1
|
|
230
|
+
v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
|
|
231
|
+
case value
|
|
232
|
+
when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
|
|
233
|
+
collector = visit value.as(attr.name), collector
|
|
234
|
+
else
|
|
235
|
+
collector << quote(value, attr && column_for(attr)).to_s
|
|
236
|
+
if idx == 0
|
|
237
|
+
collector << " AS "
|
|
238
|
+
collector << quote(attr.name)
|
|
239
|
+
end
|
|
270
240
|
end
|
|
271
|
-
|
|
272
|
-
collector << COMMA unless i == len
|
|
241
|
+
collector << Arel::Visitors::SQLite::COMMA unless i == len
|
|
273
242
|
}
|
|
274
243
|
collector << ' UNION ALL ' unless idx == o.left.length - 1
|
|
275
244
|
end
|
|
@@ -280,24 +249,19 @@ module ArelExtensions
|
|
|
280
249
|
o.left.each_with_index do |row, idx|
|
|
281
250
|
collector << 'SELECT '
|
|
282
251
|
len = row.length - 1
|
|
283
|
-
row.
|
|
252
|
+
row.each_with_index { |value, i|
|
|
253
|
+
attr = o.cols[i]
|
|
284
254
|
case value
|
|
285
255
|
when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
|
|
286
256
|
collector = visit value.as(attr.name), collector
|
|
287
|
-
when Integer
|
|
288
|
-
collector << value.to_s
|
|
289
|
-
if idx == 0
|
|
290
|
-
collector << ' AS '
|
|
291
|
-
collector << quote(attr.name)
|
|
292
|
-
end
|
|
293
257
|
else
|
|
294
258
|
collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
|
|
295
259
|
if idx == 0
|
|
296
|
-
collector <<
|
|
260
|
+
collector << " AS "
|
|
297
261
|
collector << quote(attr.name)
|
|
298
262
|
end
|
|
299
263
|
end
|
|
300
|
-
|
|
264
|
+
collector << Arel::Visitors::SQLite::COMMA unless i == len
|
|
301
265
|
}
|
|
302
266
|
collector << ' UNION ALL ' unless idx == o.left.length - 1
|
|
303
267
|
end
|
|
@@ -306,58 +270,54 @@ module ArelExtensions
|
|
|
306
270
|
end
|
|
307
271
|
|
|
308
272
|
def visit_ArelExtensions_Nodes_Union o, collector
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
visit o.right, collector
|
|
321
|
-
end
|
|
273
|
+
if o.left.is_a?(Arel::SelectManager)
|
|
274
|
+
collector = visit o.left.ast, collector
|
|
275
|
+
else
|
|
276
|
+
collector = visit o.left, collector
|
|
277
|
+
end
|
|
278
|
+
collector << " UNION "
|
|
279
|
+
if o.right.is_a?(Arel::SelectManager)
|
|
280
|
+
collector = visit o.right.ast, collector
|
|
281
|
+
else
|
|
282
|
+
collector = visit o.right, collector
|
|
283
|
+
end
|
|
322
284
|
collector
|
|
323
285
|
end
|
|
324
286
|
|
|
325
287
|
def visit_ArelExtensions_Nodes_UnionAll o, collector
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
visit o.right, collector
|
|
338
|
-
end
|
|
288
|
+
if o.left.is_a?(Arel::SelectManager)
|
|
289
|
+
collector = visit o.left.ast, collector
|
|
290
|
+
else
|
|
291
|
+
collector = visit o.left, collector
|
|
292
|
+
end
|
|
293
|
+
collector << " UNION ALL "
|
|
294
|
+
if o.right.is_a?(Arel::SelectManager)
|
|
295
|
+
collector = visit o.right.ast, collector
|
|
296
|
+
else
|
|
297
|
+
collector = visit o.right, collector
|
|
298
|
+
end
|
|
339
299
|
collector
|
|
340
300
|
end
|
|
341
301
|
|
|
342
302
|
def get_time_converted element
|
|
343
303
|
if element.is_a?(Time)
|
|
344
|
-
Arel::Nodes::NamedFunction.new('STRFTIME',
|
|
304
|
+
return Arel::Nodes::NamedFunction.new('STRFTIME',[element, '%H:%M:%S'])
|
|
345
305
|
elsif element.is_a?(Arel::Attributes::Attribute)
|
|
346
|
-
col = Arel.
|
|
306
|
+
col = Arel::Table.engine.connection.schema_cache.columns_hash(element.relation.table_name)[element.name.to_s]
|
|
347
307
|
if col && (col.type == :time)
|
|
348
|
-
Arel::Nodes::NamedFunction.new('STRFTIME',
|
|
308
|
+
return Arel::Nodes::NamedFunction.new('STRFTIME',[element, '%H:%M:%S'])
|
|
349
309
|
else
|
|
350
|
-
element
|
|
310
|
+
return element
|
|
351
311
|
end
|
|
352
312
|
else
|
|
353
|
-
element
|
|
313
|
+
return element
|
|
354
314
|
end
|
|
355
315
|
end
|
|
356
316
|
|
|
357
317
|
remove_method(:visit_Arel_Nodes_GreaterThanOrEqual) rescue nil
|
|
358
318
|
def visit_Arel_Nodes_GreaterThanOrEqual o, collector
|
|
359
319
|
collector = visit get_time_converted(o.left), collector
|
|
360
|
-
collector <<
|
|
320
|
+
collector << " >= "
|
|
361
321
|
collector = visit get_time_converted(o.right), collector
|
|
362
322
|
collector
|
|
363
323
|
end
|
|
@@ -365,7 +325,7 @@ module ArelExtensions
|
|
|
365
325
|
remove_method(:visit_Arel_Nodes_GreaterThan) rescue nil
|
|
366
326
|
def visit_Arel_Nodes_GreaterThan o, collector
|
|
367
327
|
collector = visit get_time_converted(o.left), collector
|
|
368
|
-
collector <<
|
|
328
|
+
collector << " > "
|
|
369
329
|
collector = visit get_time_converted(o.right), collector
|
|
370
330
|
collector
|
|
371
331
|
end
|
|
@@ -373,7 +333,7 @@ module ArelExtensions
|
|
|
373
333
|
remove_method(:visit_Arel_Nodes_LessThanOrEqual) rescue nil
|
|
374
334
|
def visit_Arel_Nodes_LessThanOrEqual o, collector
|
|
375
335
|
collector = visit get_time_converted(o.left), collector
|
|
376
|
-
collector <<
|
|
336
|
+
collector << " <= "
|
|
377
337
|
collector = visit get_time_converted(o.right), collector
|
|
378
338
|
collector
|
|
379
339
|
end
|
|
@@ -381,12 +341,22 @@ module ArelExtensions
|
|
|
381
341
|
remove_method(:visit_Arel_Nodes_LessThan) rescue nil
|
|
382
342
|
def visit_Arel_Nodes_LessThan o, collector
|
|
383
343
|
collector = visit get_time_converted(o.left), collector
|
|
384
|
-
collector <<
|
|
344
|
+
collector << " < "
|
|
385
345
|
collector = visit get_time_converted(o.right), collector
|
|
386
346
|
collector
|
|
387
347
|
end
|
|
388
348
|
|
|
389
|
-
|
|
349
|
+
|
|
350
|
+
alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
|
|
351
|
+
def visit_Arel_Nodes_SelectStatement o, collector
|
|
352
|
+
if !collector.value.blank? && o.limit.blank?
|
|
353
|
+
o = o.dup
|
|
354
|
+
o.orders = []
|
|
355
|
+
end
|
|
356
|
+
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
alias_method :old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As
|
|
390
360
|
def visit_Arel_Nodes_As o, collector
|
|
391
361
|
if o.left.is_a?(Arel::Nodes::Binary)
|
|
392
362
|
collector << '('
|
|
@@ -395,22 +365,22 @@ module ArelExtensions
|
|
|
395
365
|
else
|
|
396
366
|
collector = visit o.left, collector
|
|
397
367
|
end
|
|
398
|
-
|
|
399
|
-
collector << " AS #{sep}"
|
|
368
|
+
collector << " AS \""
|
|
400
369
|
collector = visit o.right, collector
|
|
401
|
-
collector << "
|
|
370
|
+
collector << "\""
|
|
402
371
|
collector
|
|
403
372
|
end
|
|
404
373
|
|
|
405
374
|
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
|
406
|
-
format = Arel::Nodes::NamedFunction.new('printf',
|
|
407
|
-
locale_map = NUMBER_COMMA_MAPPING[o.locale]
|
|
375
|
+
format = Arel::Nodes::NamedFunction.new('printf',[Arel::Nodes.build_quoted(o.original_string),o.left])
|
|
376
|
+
locale_map = Arel::Visitors::SQLite::NUMBER_COMMA_MAPPING[o.locale]
|
|
408
377
|
if locale_map
|
|
409
|
-
format = format.replace(',',
|
|
378
|
+
format = format.replace(',',locale_map[',']).replace('.',locale_map['.'])
|
|
410
379
|
end
|
|
411
380
|
visit format, collector
|
|
412
381
|
collector
|
|
413
382
|
end
|
|
383
|
+
|
|
414
384
|
end
|
|
415
385
|
end
|
|
416
386
|
end
|