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.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +2 -1
  3. data/.gitignore +6 -7
  4. data/.rubocop.yml +3 -67
  5. data/.travis/oracle/download.js +152 -0
  6. data/.travis/oracle/download.sh +30 -0
  7. data/.travis/oracle/download_ojdbc.js +116 -0
  8. data/.travis/oracle/install.sh +34 -0
  9. data/.travis/setup_accounts.sh +9 -0
  10. data/.travis/sqlite3/extension-functions.sh +6 -0
  11. data/.travis.yml +223 -0
  12. data/Gemfile +28 -2
  13. data/README.md +91 -258
  14. data/Rakefile +30 -48
  15. data/TODO +1 -0
  16. data/appveyor.yml +22 -60
  17. data/arel_extensions.gemspec +14 -13
  18. data/functions.html +3 -3
  19. data/gemfiles/rails3.gemfile +20 -0
  20. data/gemfiles/rails4.gemfile +29 -0
  21. data/gemfiles/rails5_0.gemfile +29 -0
  22. data/gemfiles/rails5_1_4.gemfile +14 -14
  23. data/gemfiles/rails5_2.gemfile +14 -16
  24. data/init/mssql.sql +4 -4
  25. data/init/mysql.sql +38 -38
  26. data/init/oracle.sql +0 -0
  27. data/init/postgresql.sql +25 -24
  28. data/init/sqlite.sql +0 -0
  29. data/lib/arel_extensions/attributes.rb +3 -7
  30. data/lib/arel_extensions/boolean_functions.rb +14 -53
  31. data/lib/arel_extensions/common_sql_functions.rb +17 -16
  32. data/lib/arel_extensions/comparators.rb +28 -29
  33. data/lib/arel_extensions/date_duration.rb +13 -17
  34. data/lib/arel_extensions/insert_manager.rb +15 -18
  35. data/lib/arel_extensions/math.rb +53 -55
  36. data/lib/arel_extensions/math_functions.rb +39 -46
  37. data/lib/arel_extensions/nodes/abs.rb +1 -0
  38. data/lib/arel_extensions/nodes/blank.rb +2 -1
  39. data/lib/arel_extensions/nodes/case.rb +19 -20
  40. data/lib/arel_extensions/nodes/cast.rb +8 -10
  41. data/lib/arel_extensions/nodes/ceil.rb +1 -1
  42. data/lib/arel_extensions/nodes/coalesce.rb +4 -3
  43. data/lib/arel_extensions/nodes/collate.rb +10 -9
  44. data/lib/arel_extensions/nodes/concat.rb +18 -9
  45. data/lib/arel_extensions/nodes/date_diff.rb +26 -42
  46. data/lib/arel_extensions/nodes/duration.rb +3 -0
  47. data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
  48. data/lib/arel_extensions/nodes/floor.rb +1 -1
  49. data/lib/arel_extensions/nodes/format.rb +8 -35
  50. data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
  51. data/lib/arel_extensions/nodes/function.rb +37 -46
  52. data/lib/arel_extensions/nodes/is_null.rb +0 -0
  53. data/lib/arel_extensions/nodes/json.rb +39 -52
  54. data/lib/arel_extensions/nodes/length.rb +0 -5
  55. data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
  56. data/lib/arel_extensions/nodes/locate.rb +2 -1
  57. data/lib/arel_extensions/nodes/log10.rb +2 -1
  58. data/lib/arel_extensions/nodes/matches.rb +8 -6
  59. data/lib/arel_extensions/nodes/md5.rb +1 -0
  60. data/lib/arel_extensions/nodes/power.rb +5 -5
  61. data/lib/arel_extensions/nodes/rand.rb +1 -0
  62. data/lib/arel_extensions/nodes/repeat.rb +5 -3
  63. data/lib/arel_extensions/nodes/replace.rb +8 -16
  64. data/lib/arel_extensions/nodes/round.rb +6 -5
  65. data/lib/arel_extensions/nodes/soundex.rb +15 -15
  66. data/lib/arel_extensions/nodes/std.rb +21 -18
  67. data/lib/arel_extensions/nodes/substring.rb +16 -8
  68. data/lib/arel_extensions/nodes/then.rb +1 -1
  69. data/lib/arel_extensions/nodes/trim.rb +6 -4
  70. data/lib/arel_extensions/nodes/union.rb +8 -5
  71. data/lib/arel_extensions/nodes/union_all.rb +7 -4
  72. data/lib/arel_extensions/nodes/wday.rb +4 -0
  73. data/lib/arel_extensions/nodes.rb +1 -1
  74. data/lib/arel_extensions/null_functions.rb +5 -19
  75. data/lib/arel_extensions/predications.rb +44 -45
  76. data/lib/arel_extensions/railtie.rb +5 -5
  77. data/lib/arel_extensions/set_functions.rb +7 -5
  78. data/lib/arel_extensions/string_functions.rb +35 -91
  79. data/lib/arel_extensions/tasks.rb +6 -6
  80. data/lib/arel_extensions/version.rb +1 -1
  81. data/lib/arel_extensions/visitors/ibm_db.rb +31 -24
  82. data/lib/arel_extensions/visitors/mssql.rb +194 -440
  83. data/lib/arel_extensions/visitors/mysql.rb +212 -368
  84. data/lib/arel_extensions/visitors/oracle.rb +179 -236
  85. data/lib/arel_extensions/visitors/oracle12.rb +31 -18
  86. data/lib/arel_extensions/visitors/postgresql.rb +173 -271
  87. data/lib/arel_extensions/visitors/sqlite.rb +127 -157
  88. data/lib/arel_extensions/visitors/to_sql.rb +238 -300
  89. data/lib/arel_extensions/visitors.rb +62 -83
  90. data/lib/arel_extensions.rb +31 -235
  91. data/test/database.yml +10 -20
  92. data/test/helper.rb +18 -0
  93. data/test/real_db_test.rb +118 -121
  94. data/test/support/fake_record.rb +3 -11
  95. data/test/test_comparators.rb +17 -14
  96. data/test/visitors/test_bulk_insert_oracle.rb +12 -12
  97. data/test/visitors/test_bulk_insert_sqlite.rb +14 -13
  98. data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
  99. data/test/visitors/test_oracle.rb +55 -55
  100. data/test/visitors/test_to_sql.rb +226 -419
  101. data/test/with_ar/all_agnostic_test.rb +370 -773
  102. data/test/with_ar/insert_agnostic_test.rb +22 -28
  103. data/test/with_ar/test_bulk_sqlite.rb +17 -18
  104. data/test/with_ar/test_math_sqlite.rb +27 -27
  105. data/test/with_ar/test_string_mysql.rb +34 -32
  106. data/test/with_ar/test_string_sqlite.rb +35 -31
  107. metadata +38 -52
  108. data/.github/workflows/publish.yml +0 -30
  109. data/.github/workflows/release.yml +0 -30
  110. data/.github/workflows/ruby.yml +0 -452
  111. data/CONTRIBUTING.md +0 -102
  112. data/Makefile +0 -18
  113. data/NEWS.md +0 -116
  114. data/bin/build +0 -15
  115. data/bin/publish +0 -8
  116. data/dev/arelx.dockerfile +0 -41
  117. data/dev/compose.yaml +0 -69
  118. data/dev/postgres.dockerfile +0 -5
  119. data/dev/rbenv +0 -189
  120. data/gemfiles/rails5.gemfile +0 -29
  121. data/gemfiles/rails6.gemfile +0 -34
  122. data/gemfiles/rails6_1.gemfile +0 -42
  123. data/gemfiles/rails7.gemfile +0 -42
  124. data/gemfiles/rails7_1.gemfile +0 -41
  125. data/gemfiles/rails7_2.gemfile +0 -41
  126. data/gemfiles/rails8.gemfile +0 -40
  127. data/gemfiles/rails8_1.gemfile +0 -41
  128. data/gemspecs/arel_extensions-v1.gemspec +0 -27
  129. data/gemspecs/arel_extensions-v2.gemspec +0 -27
  130. data/generate_gems.sh +0 -15
  131. data/lib/arel_extensions/aliases.rb +0 -14
  132. data/lib/arel_extensions/constants.rb +0 -13
  133. data/lib/arel_extensions/helpers.rb +0 -61
  134. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
  135. data/lib/arel_extensions/nodes/byte_size.rb +0 -11
  136. data/lib/arel_extensions/nodes/char_length.rb +0 -11
  137. data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
  138. data/lib/arel_extensions/nodes/rollup.rb +0 -36
  139. data/lib/arel_extensions/nodes/select.rb +0 -10
  140. data/lib/arel_extensions/nodes/sum.rb +0 -7
  141. data/lib/arel_extensions/visitors/convert_format.rb +0 -37
  142. data/lib/arel_extensions/warning.rb +0 -42
  143. data/test/arelx_test_helper.rb +0 -94
  144. data/test/config_loader.rb +0 -9
  145. data/version_v1.rb +0 -3
  146. data/version_v2.rb +0 -3
@@ -1,39 +1,16 @@
1
1
  module ArelExtensions
2
2
  module Visitors
3
- class Arel::Visitors::SQLite
4
- DATE_MAPPING = {
5
- 'd' => '%d', 'm' => '%m', 'w' => '%W', 'y' => '%Y', 'wd' => '%w', 'M' => '%M',
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
- }.freeze
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
- collector = visit o.left.ai_collate, collector
51
- collector << ' LIKE '
52
- collector = visit o.right.ai_collate, collector
53
- if o.escape
54
- collector << ' ESCAPE '
55
- visit o.escape, collector
56
- else
57
- collector
58
- end
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
- collector = visit o.left.collate(true, true), collector
63
- collector << ' LIKE '
64
- collector = visit o.right.collate(true, true), collector
65
- if o.escape
66
- collector << ' ESCAPE '
67
- visit o.escape, collector
68
- else
69
- collector
70
- end
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 << 'date('
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
- case o.left_node_type
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 << 'julianday('
106
+ collector << "julianday("
130
107
  collector = visit o.left, collector
131
- collector << ') - julianday('
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 << 'instr('
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 << 'SUBSTR('
143
+ collector << "SUBSTR("
166
144
  o.expressions.each_with_index { |arg, i|
167
- collector << COMMA if i != 0
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
- collector = visit o.expr, collector
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 << 'RANDOM('
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 << ' REGEXP'
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 << ' NOT REGEXP '
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
- # CAST(
219
- # CASE
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 << 'CAST(CASE WHEN '
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 << ' AS INT) = '
201
+ collector << ", 1) > ROUND("
234
202
  collector = visit o.left, collector
235
- collector << ' THEN CAST('
203
+ collector << ") THEN ROUND("
236
204
  collector = visit o.left, collector
237
- collector << ' AS INT) ELSE CAST(('
205
+ collector << ") ELSE ROUND("
238
206
  collector = visit o.left, collector
239
- collector << ' - 1.0) AS INT) END AS FLOAT)'
207
+ collector << ") - 1 END"
240
208
  collector
241
209
  end
242
210
 
243
211
  def visit_ArelExtensions_Nodes_Ceil o, collector
244
- collector << 'CASE WHEN ROUND('
212
+ collector << "CASE WHEN ROUND("
245
213
  collector = visit o.left, collector
246
- collector << ', 1) > ROUND('
214
+ collector << ", 1) > ROUND("
247
215
  collector = visit o.left, collector
248
- collector << ') THEN ROUND('
216
+ collector << ") THEN ROUND("
249
217
  collector = visit o.left, collector
250
- collector << ') + 1 ELSE ROUND('
218
+ collector << ") + 1 ELSE ROUND("
251
219
  collector = visit o.left, collector
252
- collector << ') END'
220
+ collector << ") END"
253
221
  collector
254
222
  end
255
223
 
256
- if AREL_VERSION < V7
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
- len = row.length - 1
261
- row.zip(o.cols).each_with_index { |(value, attr), i|
262
- case value
263
- when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
264
- collector = visit value.as(attr.name), collector
265
- else
266
- collector << quote(value, attr && column_for(attr)).to_s
267
- if idx == 0
268
- collector << ' AS '
269
- collector << quote(attr.name)
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
- end
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.zip(o.cols).each_with_index { |(value, attr), i|
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 << ' AS '
260
+ collector << " AS "
297
261
  collector << quote(attr.name)
298
262
  end
299
263
  end
300
- collector << COMMA unless i == len
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
- collector =
310
- if o.left.is_a?(Arel::SelectManager)
311
- visit o.left.ast, collector
312
- else
313
- visit o.left, collector
314
- end
315
- collector << ' UNION '
316
- collector =
317
- if o.right.is_a?(Arel::SelectManager)
318
- visit o.right.ast, collector
319
- else
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
- collector =
327
- if o.left.is_a?(Arel::SelectManager)
328
- visit o.left.ast, collector
329
- else
330
- visit o.left, collector
331
- end
332
- collector << ' UNION ALL '
333
- collector =
334
- if o.right.is_a?(Arel::SelectManager)
335
- visit o.right.ast, collector
336
- else
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', [element, '%H:%M:%S'])
304
+ return Arel::Nodes::NamedFunction.new('STRFTIME',[element, '%H:%M:%S'])
345
305
  elsif element.is_a?(Arel::Attributes::Attribute)
346
- col = Arel.column_of(element.relation.table_name, element.name.to_s)
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', [element, '%H:%M:%S'])
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
- alias_method(:old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As) rescue nil
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
- sep = o.right.size > 1 && o.right[0] == '"' && o.right[-1] == '"' ? '' : '"'
399
- collector << " AS #{sep}"
368
+ collector << " AS \""
400
369
  collector = visit o.right, collector
401
- collector << "#{sep}"
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', [Arel.quoted(o.original_string), o.left])
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(',', locale_map[',']).replace('.', locale_map['.'])
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