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,258 @@
1
+ module ArelExtensions
2
+ module Visitors
3
+ Arel::Visitors::PostgreSQL.class_eval do
4
+
5
+ def visit_ArelExtensions_Nodes_Concat o, collector
6
+ arg = o.left.relation.engine.columns.find{|c| c.name == o.left.name.to_s}.type
7
+ collector = visit o.left, collector
8
+ if(o.right.is_a?(Arel::Attributes::Attribute))
9
+ collector << '||'
10
+ collector = visit o.right, collector
11
+ elsif ( arg == :date || arg == :datetime)
12
+ collector << " + INTERVAL '#{o.right} day'"
13
+ collector
14
+ else
15
+ collector << " ||'"
16
+ collector << "#{o.right}'"
17
+ end
18
+ collector
19
+ end
20
+
21
+
22
+ def visit_ArelExtensions_Nodes_Coalesce o, collector
23
+ collector << "COALESCE("
24
+ if(o.left.is_a?(Arel::Attributes::Attribute))
25
+ collector = visit o.left, collector
26
+ else
27
+ collector << "#{o.left}"
28
+ end
29
+ o.other.each { |a|
30
+ collector << ","
31
+ if(a.is_a?(Arel::Attributes::Attribute))
32
+ collector = visit a, collector
33
+ else
34
+ if(a.is_a?(Integer))
35
+ collector << "#{a}"
36
+ else
37
+ collector << "'#{a}'"
38
+ end
39
+ end
40
+ }
41
+ collector << ")"
42
+ collector
43
+ end
44
+
45
+ def visit_ArelExtensions_Nodes_DateDiff o, collector
46
+
47
+ collector = visit o.left, collector
48
+ collector << " -"
49
+ if(o.right.is_a?(Arel::Attributes::Attribute))
50
+ collector = visit o.left, collector
51
+ else
52
+ collector << " date '#{o.right}'"
53
+ end
54
+ collector
55
+ end
56
+
57
+
58
+ def visit_ArelExtensions_Nodes_Duration o, collector
59
+ #visit left for period
60
+ if(o.left == "d")
61
+ collector << "EXTRACT(DAY FROM"
62
+ elsif(o.left == "m")
63
+ collector << "EXTRACT(MONTH FROM "
64
+ elsif (o.left == "w")
65
+ collector << "EXTRACT(WEEK FROM"
66
+ elsif (o.left == "y")
67
+ collector << "EXTRACT(YEAR FROM"
68
+ end
69
+ #visit right
70
+ if(o.right.is_a?(Arel::Attributes::Attribute))
71
+ collector = visit o.right, collector
72
+ else
73
+ collector << "'#{o.right}'"
74
+ end
75
+ collector << ")"
76
+ collector
77
+ end
78
+
79
+
80
+ def visit_ArelExtensions_Nodes_Findis o, collector
81
+
82
+ end
83
+
84
+ def visit_ArelExtensions_Nodes_Floor o, collector
85
+ collector << "FLOOR("
86
+ if((o.expr).is_a?(Arel::Attributes::Attribute))
87
+ collector = visit o.expr, collector
88
+ end
89
+ collector << ")"
90
+ collector
91
+ end
92
+
93
+
94
+ def visit_ArelExtensions_Nodes_Length o, collector
95
+ collector << "LENGTH("
96
+ collector = visit o.expr, collector
97
+ collector << ")"
98
+ collector
99
+ end
100
+
101
+
102
+ def visit_ArelExtensions_Nodes_Locate o, collector
103
+ collector << "position("
104
+ if(o.val.is_a?(Arel::Attributes::Attribute))
105
+ collector = visit o.val, collector
106
+ else
107
+ collector << "'#{o.val}'"
108
+ end
109
+ collector << " IN "
110
+ collector = visit o.expr, collector
111
+ collector << ")"
112
+ collector
113
+ end
114
+
115
+ def visit_ArelExtensions_Nodes_Isnull o, collector
116
+ collector << "coalesce("
117
+ collector = visit o.left, collector
118
+ collector << ","
119
+ if(o.right.is_a?(Arel::Attributes::Attribute))
120
+ collector = visit o.right, collector
121
+ else
122
+ collector << "'#{o.right}'"
123
+ end
124
+ collector << ")"
125
+ collector
126
+ end
127
+
128
+
129
+ def visit_ArelExtensions_Nodes_Rand o, collector
130
+ collector << "random("
131
+ if(o.left != nil && o.right != nil)
132
+ collector << "'#{o.left}'"
133
+ collector << ","
134
+ collector << "'#{o.right}'"
135
+ end
136
+ collector << ")"
137
+ collector
138
+ end
139
+
140
+ def visit_ArelExtensions_Nodes_Replace o, collector
141
+ collector << "REPLACE("
142
+ collector = visit o.expr,collector
143
+ collector << ","
144
+ if(o.left.is_a?(Arel::Attributes::Attribute))
145
+ collector = visit o.left, collector
146
+ else
147
+ collector << "'#{o.left}'"
148
+ end
149
+ collector << ","
150
+ if(o.right.is_a?(Arel::Attributes::Attribute))
151
+ collector = visit o.right, collector
152
+ else
153
+ collector << "'#{o.right}'"
154
+ end
155
+ collector << ")"
156
+ collector
157
+ end
158
+
159
+
160
+ remove_method :visit_Arel_Nodes_Regexp
161
+ def visit_Arel_Nodes_Regexp o, collector
162
+ collector = visit o.left, collector
163
+ collector << " ~ "
164
+ collector << "'#{o.right}'"
165
+ collector
166
+ end
167
+
168
+ remove_method :visit_Arel_Nodes_NotRegexp
169
+ def visit_Arel_Nodes_NotRegexp o, collector
170
+ collector = visit o.left, collector
171
+ collector << " !~ "
172
+ collector << "'#{o.right}'"
173
+ collector
174
+ end
175
+
176
+
177
+ def visit_ArelExtensions_Nodes_Soundex o, collector
178
+ collector << "soundex("
179
+ if((o.expr).is_a?(Arel::Attributes::Attribute))
180
+ collector = visit o.expr, collector
181
+ else
182
+ collector << "'#{o.expr}'"
183
+ end
184
+ collector << ")"
185
+ collector
186
+ end
187
+
188
+
189
+ def visit_ArelExtensions_Nodes_Sum o, collector
190
+ collector << "sum("
191
+ if((o.expr).is_a?(Arel::Attributes::Attribute))
192
+ collector = visit o.expr, collector
193
+ else
194
+ collector << "'#{o.expr}'"
195
+ end
196
+ collector << ")"
197
+ collector
198
+ end
199
+
200
+
201
+ def visit_ArelExtensions_Nodes_Trim o , collector
202
+ collector << 'TRIM(BOTH '
203
+ if(o.right.is_a?(Arel::Attributes::Attribute))
204
+ collector = visit o.right, collector
205
+ else
206
+ collector << "'#{o.right}'"
207
+ end
208
+ collector << " FROM "
209
+ collector = visit o.left, collector
210
+
211
+ collector << ")"
212
+ collector
213
+ end
214
+
215
+ def visit_ArelExtensions_Nodes_Ltrim o , collector
216
+ collector << 'TRIM(LEADING '
217
+ if(o.right.is_a?(Arel::Attributes::Attribute))
218
+ collector = visit o.right, collector
219
+ else
220
+ collector << "'#{o.right}'"
221
+ end
222
+ collector << " FROM "
223
+ collector = visit o.left, collector
224
+
225
+ collector << ")"
226
+ collector
227
+ end
228
+
229
+
230
+ def visit_ArelExtensions_Nodes_Rtrim o , collector
231
+ collector << 'TRIM(TRAILING '
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 << " FROM "
238
+ collector = visit o.left, collector
239
+
240
+ collector << ")"
241
+ collector
242
+ end
243
+
244
+
245
+ def visit_ArelExtensions_Nodes_Wday o, collector
246
+ collector << "date_part('dow', "
247
+ if((o.date).is_a?(Arel::Attributes::Attribute))
248
+ collector = visit o.date, collector
249
+ else
250
+ collector << "'#{o.date}'"
251
+ end
252
+ collector << ")"
253
+ collector
254
+ end
255
+
256
+ end
257
+ end
258
+ end
@@ -0,0 +1,218 @@
1
+ module ArelExtensions
2
+ module Visitors
3
+ Arel::Visitors::SQLite.class_eval do
4
+
5
+
6
+ def visit_ArelExtensions_Nodes_Coalesce o, collector
7
+ collector << "COALESCE("
8
+ if(o.left.is_a?(Arel::Attributes::Attribute))
9
+ collector = visit o.left, collector
10
+ else
11
+ collector << "#{o.left}"
12
+ end
13
+ o.other.each { |a|
14
+ collector << ","
15
+ if(a.is_a?(Arel::Attributes::Attribute))
16
+ collector = visit a, collector
17
+ else
18
+ collector << "#{a}"
19
+ end
20
+ }
21
+ collector << ")"
22
+ collector
23
+ end
24
+
25
+ # Date operations
26
+ def visit_ArelExtensions_Nodes_DateAdd o, collector
27
+ collector << "date("
28
+ collector = visit o.expressions.first, collector
29
+ collector << Arel::Visitors::ToSql::COMMA
30
+ collector = visit o.sqlite_value, collector
31
+ collector << ")"
32
+ collector
33
+ end
34
+
35
+ def visit_ArelExtensions_Nodes_DateDiff o, collector
36
+ collector << " julianday("
37
+ collector = visit o.left, collector
38
+ collector << ")- julianday("
39
+ collector = visit o.right, collector
40
+ collector << ")"
41
+ collector
42
+ end
43
+
44
+
45
+ def visit_ArelExtensions_Nodes_Duration o, collector
46
+ #visit left for period
47
+ if(o.left == "d")
48
+ collector << "strftime('%d',"
49
+ elsif(o.left == "m")
50
+ collector << "strftime('%m',"
51
+ elsif (o.left == "w")
52
+ collector << "strftime('%W',"
53
+ elsif (o.left == "y")
54
+ collector << "strftime('%Y',"
55
+ end
56
+ #visit right
57
+ if(o.right.is_a?(Arel::Attributes::Attribute))
58
+ collector = visit o.right, collector
59
+ else
60
+ collector << "#{o.right}"
61
+ end
62
+ collector << ")"
63
+ collector
64
+ end
65
+
66
+
67
+ def visit_ArelExtensions_Nodes_Locate o, collector
68
+ collector << "instr("
69
+ collector = visit o.expr, collector
70
+ collector << ","
71
+ if(o.val.is_a?(Arel::Attributes::Attribute))
72
+ collector = visit o.val, collector
73
+ else
74
+ collector << "'#{o.val}'"
75
+ end
76
+ collector << ")"
77
+ collector
78
+ end
79
+
80
+ def visit_ArelExtensions_Nodes_Isnull o, collector
81
+ collector << "ifnull("
82
+ collector = visit o.left, collector
83
+ collector << ","
84
+ if(o.right.is_a?(Arel::Attributes::Attribute))
85
+ collector = visit o.right, collector
86
+ else
87
+ collector << "'#{o.right}'"
88
+ end
89
+ collector << ")"
90
+ collector
91
+ end
92
+
93
+ def visit_ArelExtensions_Nodes_Rand o, collector
94
+ collector << "RANDOM("
95
+ if(o.left != nil && o.right != nil)
96
+ if(o.left.is_a?(Arel::Attributes::Attribute))
97
+ collector = visit o.left, collector
98
+ else
99
+ collector << "'#{o.left}'"
100
+ end
101
+ collector << ","
102
+ collector << "'#{o.right}'"
103
+ end
104
+ collector << ")"
105
+ collector
106
+ end
107
+
108
+
109
+ def visit_ArelExtensions_Nodes_Replace o, collector
110
+ collector << "REPLACE("
111
+ collector = visit o.expr,collector
112
+ collector << ","
113
+ if(o.left.is_a?(Arel::Attributes::Attribute))
114
+ collector = visit o.left, collector
115
+ else
116
+ collector << "'#{o.left}'"
117
+ end
118
+ collector << ","
119
+ if(o.right.is_a?(Arel::Attributes::Attribute))
120
+ collector = visit o.right, collector
121
+ else
122
+ collector << "'#{o.right}'"
123
+ end
124
+ collector << ")"
125
+ collector
126
+ end
127
+
128
+ def visit_Arel_Nodes_Regexp o, collector
129
+ collector = visit o.left, collector
130
+ collector << " REGEXP '#{o.right}'"
131
+ collector
132
+ end
133
+
134
+ def visit_Arel_Nodes_NotRegexp o, collector
135
+ collector = visit o.left, collector
136
+ collector << " NOT REGEXP "
137
+ collector << "'#{o.right}'"
138
+ collector
139
+ end
140
+
141
+ def visit_ArelExtensions_Nodes_Round o, collector
142
+ collector << "ROUND("
143
+ collector = visit o.left, collector
144
+ collector << ","
145
+ if(o.right.is_a?(Arel::Attributes::Attribute))
146
+ collector = visit o.right, collector
147
+ else
148
+ collector << "'#{o.right}'"
149
+ end
150
+ collector << ")"
151
+ collector
152
+ end
153
+
154
+ def visit_ArelExtensions_Nodes_Soundex o, collector
155
+ collector << "SOUNDEX("
156
+ if((o.expr).is_a?(Arel::Attributes::Attribute ))
157
+ collector = visit o.expr, collector
158
+ else
159
+ collector << "'#{o.expr}'"
160
+ end
161
+ collector << ")"
162
+ collector
163
+ end
164
+
165
+ def visit_ArelExtensions_Nodes_Trim o , collector
166
+ collector << "TRIM("
167
+ collector = visit o.left, collector
168
+ collector << ","
169
+ if(o.right.is_a?(Arel::Attributes::Attribute))
170
+ collector = visit o.right, collector
171
+ else
172
+ collector << "'#{o.right}'"
173
+ end
174
+ collector << ")"
175
+ collector
176
+ end
177
+
178
+ def visit_ArelExtensions_Nodes_Ltrim o , collector
179
+ collector << "LTRIM("
180
+ collector = visit o.left, collector
181
+ collector << ","
182
+ if(o.right.is_a?(Arel::Attributes::Attribute))
183
+ collector = visit o.right, collector
184
+ else
185
+ collector << "'#{o.right}'"
186
+ end
187
+ collector << ")"
188
+ collector
189
+ end
190
+
191
+
192
+ def visit_ArelExtensions_Nodes_Rtrim o , collector
193
+ collector << "RTRIM("
194
+ collector = visit o.left, collector
195
+ collector << ","
196
+ if(o.right.is_a?(Arel::Attributes::Attribute))
197
+ collector = visit o.right, collector
198
+ else
199
+ collector << "'#{o.right}'"
200
+ end
201
+ collector << ")"
202
+ collector
203
+ end
204
+
205
+ def visit_ArelExtensions_Nodes_Wday o, collector
206
+ collector << "strftime('%w',"
207
+ if((o.date).is_a?(Arel::Attributes::Attribute))
208
+ collector = visit o.date, collector
209
+ else
210
+ collector << "'#{o.date}'"
211
+ end
212
+ collector << ")"
213
+ collector
214
+ end
215
+
216
+ end
217
+ end
218
+ end