arel_extensions 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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