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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +46 -0
- data/Gemfile +10 -0
- data/MIT-LICENSE.txt +20 -0
- data/README.md +101 -0
- data/Rakefile +14 -0
- data/arel_extensions.gemspec +32 -0
- data/functions.html +344 -0
- data/gemfiles/Gemfile.rails3 +10 -0
- data/gemfiles/Gemfile.rails5 +10 -0
- data/init/mssql.sql +6 -0
- data/init/mysql.sql +0 -0
- data/init/oracle.sql +31 -0
- data/init/postgresql.sql +12 -0
- data/init/sqlite.sql +1 -0
- data/lib/arel_extensions.rb +84 -0
- data/lib/arel_extensions/attributes.rb +26 -0
- data/lib/arel_extensions/comparators.rb +59 -0
- data/lib/arel_extensions/date_duration.rb +28 -0
- data/lib/arel_extensions/insert_manager.rb +33 -0
- data/lib/arel_extensions/math.rb +48 -0
- data/lib/arel_extensions/math_functions.rb +35 -0
- data/lib/arel_extensions/nodes.rb +27 -0
- data/lib/arel_extensions/nodes/abs.rb +6 -0
- data/lib/arel_extensions/nodes/ceil.rb +6 -0
- data/lib/arel_extensions/nodes/coalesce.rb +22 -0
- data/lib/arel_extensions/nodes/concat.rb +33 -0
- data/lib/arel_extensions/nodes/date_diff.rb +106 -0
- data/lib/arel_extensions/nodes/duration.rb +30 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +16 -0
- data/lib/arel_extensions/nodes/floor.rb +6 -0
- data/lib/arel_extensions/nodes/function.rb +17 -0
- data/lib/arel_extensions/nodes/isnull.rb +30 -0
- data/lib/arel_extensions/nodes/length.rb +6 -0
- data/lib/arel_extensions/nodes/locate.rb +33 -0
- data/lib/arel_extensions/nodes/ltrim.rb +28 -0
- data/lib/arel_extensions/nodes/matches.rb +22 -0
- data/lib/arel_extensions/nodes/rand.rb +23 -0
- data/lib/arel_extensions/nodes/replace.rb +36 -0
- data/lib/arel_extensions/nodes/round.rb +15 -0
- data/lib/arel_extensions/nodes/rtrim.rb +29 -0
- data/lib/arel_extensions/nodes/soundex.rb +23 -0
- data/lib/arel_extensions/nodes/sum.rb +23 -0
- data/lib/arel_extensions/nodes/trim.rb +26 -0
- data/lib/arel_extensions/nodes/wday.rb +23 -0
- data/lib/arel_extensions/null_functions.rb +16 -0
- data/lib/arel_extensions/string_functions.rb +68 -0
- data/lib/arel_extensions/version.rb +4 -0
- data/lib/arel_extensions/visitors.rb +6 -0
- data/lib/arel_extensions/visitors/ibm_db.rb +206 -0
- data/lib/arel_extensions/visitors/mssql.rb +213 -0
- data/lib/arel_extensions/visitors/mysql.rb +184 -0
- data/lib/arel_extensions/visitors/oracle.rb +267 -0
- data/lib/arel_extensions/visitors/postgresql.rb +258 -0
- data/lib/arel_extensions/visitors/sqlite.rb +218 -0
- data/lib/arel_extensions/visitors/to_sql.rb +199 -0
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +251 -0
- data/test/support/fake_record.rb +137 -0
- data/test/test_comparators.rb +49 -0
- data/test/visitors/test_bulk_insert_oracle.rb +30 -0
- data/test/visitors/test_bulk_insert_sqlite.rb +31 -0
- data/test/visitors/test_bulk_insert_to_sql.rb +32 -0
- data/test/visitors/test_oracle.rb +105 -0
- data/test/visitors/test_to_sql.rb +148 -0
- data/test/with_ar/test_bulk_sqlite.rb +44 -0
- data/test/with_ar/test_math_sqlite.rb +59 -0
- data/test/with_ar/test_string_sqlite.rb +69 -0
- 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
|