arel_extensions 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +46 -0
  4. data/Gemfile +10 -0
  5. data/MIT-LICENSE.txt +20 -0
  6. data/README.md +101 -0
  7. data/Rakefile +14 -0
  8. data/arel_extensions.gemspec +32 -0
  9. data/functions.html +344 -0
  10. data/gemfiles/Gemfile.rails3 +10 -0
  11. data/gemfiles/Gemfile.rails5 +10 -0
  12. data/init/mssql.sql +6 -0
  13. data/init/mysql.sql +0 -0
  14. data/init/oracle.sql +31 -0
  15. data/init/postgresql.sql +12 -0
  16. data/init/sqlite.sql +1 -0
  17. data/lib/arel_extensions.rb +84 -0
  18. data/lib/arel_extensions/attributes.rb +26 -0
  19. data/lib/arel_extensions/comparators.rb +59 -0
  20. data/lib/arel_extensions/date_duration.rb +28 -0
  21. data/lib/arel_extensions/insert_manager.rb +33 -0
  22. data/lib/arel_extensions/math.rb +48 -0
  23. data/lib/arel_extensions/math_functions.rb +35 -0
  24. data/lib/arel_extensions/nodes.rb +27 -0
  25. data/lib/arel_extensions/nodes/abs.rb +6 -0
  26. data/lib/arel_extensions/nodes/ceil.rb +6 -0
  27. data/lib/arel_extensions/nodes/coalesce.rb +22 -0
  28. data/lib/arel_extensions/nodes/concat.rb +33 -0
  29. data/lib/arel_extensions/nodes/date_diff.rb +106 -0
  30. data/lib/arel_extensions/nodes/duration.rb +30 -0
  31. data/lib/arel_extensions/nodes/find_in_set.rb +16 -0
  32. data/lib/arel_extensions/nodes/floor.rb +6 -0
  33. data/lib/arel_extensions/nodes/function.rb +17 -0
  34. data/lib/arel_extensions/nodes/isnull.rb +30 -0
  35. data/lib/arel_extensions/nodes/length.rb +6 -0
  36. data/lib/arel_extensions/nodes/locate.rb +33 -0
  37. data/lib/arel_extensions/nodes/ltrim.rb +28 -0
  38. data/lib/arel_extensions/nodes/matches.rb +22 -0
  39. data/lib/arel_extensions/nodes/rand.rb +23 -0
  40. data/lib/arel_extensions/nodes/replace.rb +36 -0
  41. data/lib/arel_extensions/nodes/round.rb +15 -0
  42. data/lib/arel_extensions/nodes/rtrim.rb +29 -0
  43. data/lib/arel_extensions/nodes/soundex.rb +23 -0
  44. data/lib/arel_extensions/nodes/sum.rb +23 -0
  45. data/lib/arel_extensions/nodes/trim.rb +26 -0
  46. data/lib/arel_extensions/nodes/wday.rb +23 -0
  47. data/lib/arel_extensions/null_functions.rb +16 -0
  48. data/lib/arel_extensions/string_functions.rb +68 -0
  49. data/lib/arel_extensions/version.rb +4 -0
  50. data/lib/arel_extensions/visitors.rb +6 -0
  51. data/lib/arel_extensions/visitors/ibm_db.rb +206 -0
  52. data/lib/arel_extensions/visitors/mssql.rb +213 -0
  53. data/lib/arel_extensions/visitors/mysql.rb +184 -0
  54. data/lib/arel_extensions/visitors/oracle.rb +267 -0
  55. data/lib/arel_extensions/visitors/postgresql.rb +258 -0
  56. data/lib/arel_extensions/visitors/sqlite.rb +218 -0
  57. data/lib/arel_extensions/visitors/to_sql.rb +199 -0
  58. data/test/helper.rb +18 -0
  59. data/test/real_db_test.rb +251 -0
  60. data/test/support/fake_record.rb +137 -0
  61. data/test/test_comparators.rb +49 -0
  62. data/test/visitors/test_bulk_insert_oracle.rb +30 -0
  63. data/test/visitors/test_bulk_insert_sqlite.rb +31 -0
  64. data/test/visitors/test_bulk_insert_to_sql.rb +32 -0
  65. data/test/visitors/test_oracle.rb +105 -0
  66. data/test/visitors/test_to_sql.rb +148 -0
  67. data/test/with_ar/test_bulk_sqlite.rb +44 -0
  68. data/test/with_ar/test_math_sqlite.rb +59 -0
  69. data/test/with_ar/test_string_sqlite.rb +69 -0
  70. metadata +230 -0
@@ -0,0 +1,184 @@
1
+ module ArelExtensions
2
+ module Visitors
3
+ Arel::Visitors::MySQL.class_eval do
4
+
5
+
6
+ def visit_ArelExtensions_Nodes_DateDiff o, collector
7
+ collector << "DATEDIFF("
8
+ collector = visit o.left, collector
9
+ collector << ","
10
+ collector = visit o.right, collector
11
+ collector << ")"
12
+ collector
13
+ end
14
+
15
+
16
+ def visit_ArelExtensions_Nodes_Duration o, collector
17
+ #visit left for period
18
+ if(o.left == "d")
19
+ collector << "DAY("
20
+ elsif(o.left == "m")
21
+ collector << "MONTH("
22
+ elsif (o.left == "w")
23
+ collector << "WEEK("
24
+ elsif (o.left == "y")
25
+ collector << "YEAR("
26
+ end
27
+ #visit right
28
+ if(o.right.is_a?(Arel::Attributes::Attribute))
29
+ collector = visit o.right, collector
30
+ else
31
+ collector << "#{o.right}"
32
+ end
33
+ collector << ")"
34
+ collector
35
+ end
36
+
37
+ #****************************************************************#
38
+ def visit_ArelExtensions_Nodes_Concat o, collector
39
+ arg = o.left.relation.engine.columns.find{|c| c.name == o.left.name.to_s}.type
40
+ if(o.right.is_a?(Arel::Attributes::Attribute))
41
+ collector << "CONCAT("
42
+ collector = visit o.left, collector
43
+ collector << ","
44
+ collector = visit o.right, collector
45
+ collector << ")"
46
+ collector
47
+ elsif (arg == :date || arg == :datetime)
48
+ collector << "DATE_ADD("
49
+ collector = visit o.left, collector
50
+ collector << ",INTERVAL #{o.right} DAY)"
51
+ collector
52
+ else
53
+ collector << "CONCAT("
54
+ collector = visit o.left, collector
55
+ collector << ",'"
56
+ collector << "#{o.right}')"
57
+ collector
58
+ end
59
+ end
60
+
61
+
62
+ def visit_ArelExtensions_Nodes_Coalesce o, collector
63
+ collector << "COALESCE("
64
+ if(o.left.is_a?(Arel::Attributes::Attribute))
65
+ collector = visit o.left, collector
66
+ else
67
+ collector << "#{o.left}"
68
+ end
69
+ o.other.each { |a|
70
+ collector << ","
71
+ if(a.is_a?(Arel::Attributes::Attribute))
72
+ collector = visit a, collector
73
+ else
74
+ collector << "#{a}"
75
+ end
76
+ }
77
+ collector << ")"
78
+ collector
79
+ end
80
+
81
+ def visit_ArelExtensions_Nodes_Isnull o, collector
82
+ collector << "IFNULL("
83
+ collector = visit o.left, collector
84
+ collector << ","
85
+ if(o.right.is_a?(Arel::Attributes::Attribute))
86
+ collector = visit o.right, collector
87
+ else
88
+ collector << "'#{o.right}'"
89
+ end
90
+ collector << ")"
91
+ collector
92
+ end
93
+
94
+
95
+ def visit_ArelExtensions_Nodes_Replace o, collector
96
+ collector << "REPLACE("
97
+ collector = visit o.expr,collector
98
+ collector << ","
99
+ if(o.left.is_a?(Arel::Attributes::Attribute))
100
+ collector = visit o.left, collector
101
+ else
102
+ collector << "'#{o.left}'"
103
+ end
104
+ collector << ","
105
+ if(o.right.is_a?(Arel::Attributes::Attribute))
106
+ collector = visit o.right, collector
107
+ else
108
+ collector << "'#{o.right}'"
109
+ end
110
+ collector << ")"
111
+ collector
112
+ end
113
+
114
+
115
+ def visit_ArelExtensions_Nodes_Soundex o, collector
116
+ collector << "SOUNDEX("
117
+ if((o.expr).is_a?(Arel::Attributes::Attribute))
118
+ collector = visit o.expr, collector
119
+ else
120
+ collector << "'#{o.expr}'"
121
+ end
122
+ collector << ")"
123
+ collector
124
+ end
125
+
126
+
127
+
128
+ def visit_ArelExtensions_Nodes_Trim o , collector
129
+ collector << 'TRIM(BOTH '
130
+ if(o.right.is_a?(Arel::Attributes::Attribute))
131
+ collector = visit o.right, collector
132
+ else
133
+ collector << "'#{o.right}'"
134
+ end
135
+ collector << " FROM "
136
+ collector = visit o.left, collector
137
+
138
+ collector << ")"
139
+ collector
140
+ end
141
+
142
+ def visit_ArelExtensions_Nodes_Ltrim o , collector
143
+ collector << 'TRIM(LEADING '
144
+ if(o.right.is_a?(Arel::Attributes::Attribute))
145
+ collector = visit o.right, collector
146
+ else
147
+ collector << "'#{o.right}'"
148
+ end
149
+ collector << " FROM "
150
+ collector = visit o.left, collector
151
+
152
+ collector << ")"
153
+ collector
154
+ end
155
+
156
+
157
+ def visit_ArelExtensions_Nodes_Rtrim o , collector
158
+ collector << 'TRIM(TRAILING '
159
+ if(o.right.is_a?(Arel::Attributes::Attribute))
160
+ collector = visit o.right, collector
161
+ else
162
+ collector << "'#{o.right}'"
163
+ end
164
+ collector << " FROM "
165
+ collector = visit o.left, collector
166
+
167
+ collector << ")"
168
+ collector
169
+ end
170
+
171
+ def visit_ArelExtensions_Nodes_Wday o, collector
172
+ collector << "(WEEKDAY("
173
+ if((o.date).is_a?(Arel::Attributes::Attribute))
174
+ collector = visit o.date, collector
175
+ else
176
+ collector << "'#{o.date}'"
177
+ end
178
+ collector << ") + 1) % 7"
179
+ collector
180
+ end
181
+
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,267 @@
1
+ module ArelExtensions
2
+ module Visitors
3
+ Arel::Visitors::Oracle.class_eval do
4
+
5
+ def visit_ArelExtensions_Nodes_IMatches o, collector
6
+ collector = visit o.left.lower, collector
7
+ collector << ' LIKE '
8
+ collector = visit o.right.lower(o.right), collector
9
+ if o.escape
10
+ collector << ' ESCAPE '
11
+ visit o.escape, collector
12
+ else
13
+ collector
14
+ end
15
+ end
16
+
17
+ def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
18
+ collector = visit o.left.lower, collector
19
+ collector << ' NOT LIKE '
20
+ collector = visit o.right.lower(o.right), collector
21
+ if o.escape
22
+ collector << ' ESCAPE '
23
+ visit o.escape, collector
24
+ else
25
+ collector
26
+ end
27
+ end
28
+
29
+ def visit_ArelExtensions_Nodes_Concat o, collector
30
+ arg = o.left.relation.engine.columns.find{|c| c.name == o.left.name.to_s}.type
31
+ if(o.right.is_a?(Arel::Attributes::Attribute))
32
+ collector << "CONCAT("
33
+ collector = visit o.left, collector
34
+ collector << ","
35
+ collector = visit o.right, collector
36
+ collector << ")"
37
+ elsif ( arg === :date || arg === :datetime)
38
+ collector << "DATEADD("
39
+ collector = visit o.left, collector
40
+ collector << ", + interval '#{o.right}' DAY)"
41
+ else
42
+ collector << "CONCAT("
43
+ collector = visit o.left, collector
44
+ collector << ","
45
+ collector << "#{o.right})"
46
+ end
47
+ collector
48
+ end
49
+
50
+
51
+ def visit_ArelExtensions_Nodes_Coalesce o, collector
52
+ collector << "COALESCE("
53
+ if(o.left.is_a?(Arel::Attributes::Attribute))
54
+ collector = visit o.left, collector
55
+ else
56
+ collector << "#{o.left}"
57
+ end
58
+ o.other.each { |a|
59
+ collector << ","
60
+ if(a.is_a?(Arel::Attributes::Attribute))
61
+ collector = visit a, collector
62
+ else
63
+ collector << "#{a}"
64
+ end
65
+ }
66
+ collector << ")"
67
+ collector
68
+ end
69
+
70
+ def visit_ArelExtensions_Nodes_DateDiff o, collector
71
+ collector << '('
72
+ collector = visit o.left, collector
73
+ collector << " - "
74
+ collector = visit o.right, collector
75
+ collector << ')'
76
+ collector
77
+ end
78
+
79
+
80
+ def visit_ArelExtensions_Nodes_Duration o, collector
81
+ #visit left for period
82
+ if(o.left == "d")
83
+ collector << "DAY("
84
+ elsif(o.left == "m")
85
+ collector << "MONTH("
86
+ elsif (o.left == "w")
87
+ collector << "WEEK"
88
+ elsif (o.left == "y")
89
+ collector << "YEAR("
90
+ end
91
+ #visit right
92
+ if(o.right.is_a?(Arel::Attributes::Attribute))
93
+ collector = visit o.right, collector
94
+ else
95
+ collector << "'#{o.right}'"
96
+ end
97
+ collector << ")"
98
+ collector
99
+ end
100
+
101
+
102
+ def visit_ArelExtensions_Nodes_Findis o,collector
103
+
104
+ end
105
+
106
+ def visit_ArelExtensions_Nodes_Length o, collector
107
+ collector << "LENGTH("
108
+ collector = visit o.expr, collector
109
+ collector << ")"
110
+ collector
111
+ end
112
+
113
+
114
+ def visit_ArelExtensions_Nodes_Locate o, collector
115
+ collector << "LOCATE("
116
+ if(o.val.is_a?(Arel::Attributes::Attribute))
117
+ collector = visit o.val, collector
118
+ else
119
+ collector << "'#{o.val}'"
120
+ end
121
+ collector << ","
122
+ collector = visit o.expr, collector
123
+ collector << ")"
124
+ collector
125
+ end
126
+
127
+ def visit_ArelExtensions_Nodes_Isnull o, collector
128
+ collector << "NVL("
129
+ collector = visit o.left, collector
130
+ collector << ","
131
+ if(o.right.is_a?(Arel::Attributes::Attribute))
132
+ collector = visit o.right, collector
133
+ else
134
+ collector << "'#{o.right}'"
135
+ end
136
+ collector << ")"
137
+ collector
138
+ end
139
+
140
+
141
+ def visit_ArelExtensions_Nodes_Rand o, collector
142
+ collector << "dbms_random.value("
143
+ if(o.left != nil && o.right != nil)
144
+ collector << "'#{o.left}'"
145
+ collector << ","
146
+ collector << "'#{o.right}'"
147
+ end
148
+ collector << ")"
149
+ collector
150
+ end
151
+
152
+ def visit_ArelExtensions_Nodes_Replace o, collector
153
+ collector << "REPLACE("
154
+ collector = visit o.expr,collector
155
+ collector << ","
156
+ if(o.left.is_a?(Arel::Attributes::Attribute))
157
+ collector = visit o.left, collector
158
+ else
159
+ collector << "'#{o.left}'"
160
+ end
161
+ collector << ","
162
+ if(o.right.is_a?(Arel::Attributes::Attribute))
163
+ collector = visit o.right, collector
164
+ else
165
+ collector << "'#{o.right}'"
166
+ end
167
+ collector << ")"
168
+ collector
169
+ end
170
+
171
+ def visit_Arel_Nodes_Regexp o, collector
172
+ collector << " REGEXP_LIKE("
173
+ collector = visit o.left, collector
174
+ collector << Arel::Visitors::Oracle::COMMA
175
+ collector = visit o.right, collector
176
+ collector << ')'
177
+ collector
178
+ end
179
+
180
+
181
+ def visit_Arel_Nodes_NotRegexp o, collector
182
+ collector << " NOT REGEXP_LIKE("
183
+ collector = visit o.left, collector
184
+ collector << Arel::Visitors::Oracle::COMMA
185
+ collector = visit o.right, collector
186
+ collector << ')'
187
+ collector
188
+ end
189
+
190
+ def visit_ArelExtensions_Nodes_Soundex o, collector
191
+ collector << "SOUNDEX("
192
+ if((o.expr).is_a?(Arel::Attributes::Attribute))
193
+ collector = visit o.expr, collector
194
+ else
195
+ collector << "'#{o.expr}'"
196
+ end
197
+ collector << ")"
198
+ collector
199
+ end
200
+
201
+ def visit_ArelExtensions_Nodes_Trim o , collector
202
+ collector << 'TRIM("BOTH"'
203
+ collector = visit o.left, collector
204
+ collector << ","
205
+ if(o.right.is_a?(Arel::Attributes::Attribute))
206
+ collector = visit o.right, collector
207
+ else
208
+ collector << "'#{o.right}'"
209
+ end
210
+ collector << ")"
211
+ collector
212
+ end
213
+
214
+ def visit_ArelExtensions_Nodes_Ltrim o , collector
215
+ collector << 'TRIM("LEADING",'
216
+ collector = visit o.left, collector
217
+ collector << ","
218
+ if(o.right.is_a?(Arel::Attributes::Attribute))
219
+ collector = visit o.right, collector
220
+ else
221
+ collector << "'#{o.right}'"
222
+ end
223
+ collector << ")"
224
+ collector
225
+ end
226
+
227
+
228
+ def visit_ArelExtensions_Nodes_Rtrim o , collector
229
+ collector << 'TRIM("TRAILING",'
230
+ collector = visit o.left, collector
231
+ collector << ","
232
+ if(o.right.is_a?(Arel::Attributes::Attribute))
233
+ collector = visit o.right, collector
234
+ else
235
+ collector << "'#{o.right}'"
236
+ end
237
+ collector << ")"
238
+ collector
239
+ end
240
+
241
+ def visit_ArelExtensions_InsertManager_BulkValues o, collector
242
+ table = collector.value.sub(/\AINSERT INTO/, '')
243
+ into = " INTO#{table}"
244
+ collector = Arel::Collectors::SQLString.new
245
+ collector << "INSERT ALL\n"
246
+ # row_nb = o.left.length
247
+ o.left.each_with_index do |row, idx|
248
+ collector << "#{into} VALUES ("
249
+ v = Arel::Nodes::Values.new(row, o.cols)
250
+ len = v.expressions.length - 1
251
+ v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
252
+ case value
253
+ when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
254
+ collector = visit value, collector
255
+ else
256
+ collector << quote(value, attr && column_for(attr)).to_s
257
+ end
258
+ collector << Arel::Visitors::Oracle::COMMA unless i == len
259
+ }
260
+ collector << ')'
261
+ end
262
+ collector << ' SELECT 1 FROM dual'
263
+ collector
264
+ end
265
+ end
266
+ end
267
+ end