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,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