arel_extensions 1.0.5 → 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +20 -6
- data/Gemfile +5 -3
- data/README.md +38 -1
- data/appveyor.yml +0 -4
- data/gemfiles/rails5_0.gemfile +1 -1
- data/gemfiles/{rails5_2_beta.gemfile → rails5_2.gemfile} +5 -5
- data/lib/arel_extensions/attributes.rb +2 -2
- data/lib/arel_extensions/date_duration.rb +1 -1
- data/lib/arel_extensions/math.rb +20 -16
- data/lib/arel_extensions/nodes/abs.rb +1 -1
- data/lib/arel_extensions/nodes/blank.rb +2 -2
- data/lib/arel_extensions/nodes/cast.rb +18 -13
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/change_case.rb +2 -2
- data/lib/arel_extensions/nodes/coalesce.rb +1 -2
- data/lib/arel_extensions/nodes/collate.rb +18 -0
- data/lib/arel_extensions/nodes/concat.rb +8 -8
- data/lib/arel_extensions/nodes/date_diff.rb +3 -3
- data/lib/arel_extensions/nodes/duration.rb +4 -4
- data/lib/arel_extensions/nodes/find_in_set.rb +1 -1
- data/lib/arel_extensions/nodes/floor.rb +1 -2
- data/lib/arel_extensions/nodes/format.rb +2 -2
- data/lib/arel_extensions/nodes/formatted_number.rb +1 -1
- data/lib/arel_extensions/nodes/function.rb +10 -6
- data/lib/arel_extensions/nodes/is_null.rb +2 -1
- data/lib/arel_extensions/nodes/length.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +1 -1
- data/lib/arel_extensions/nodes/log10.rb +1 -1
- data/lib/arel_extensions/nodes/matches.rb +10 -0
- data/lib/arel_extensions/nodes/power.rb +1 -1
- data/lib/arel_extensions/nodes/rand.rb +1 -1
- data/lib/arel_extensions/nodes/repeat.rb +1 -1
- data/lib/arel_extensions/nodes/replace.rb +1 -1
- data/lib/arel_extensions/nodes/round.rb +1 -1
- data/lib/arel_extensions/nodes/soundex.rb +1 -1
- data/lib/arel_extensions/nodes/substring.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +3 -1
- data/lib/arel_extensions/nodes/wday.rb +3 -3
- data/lib/arel_extensions/string_functions.rb +31 -1
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +88 -4
- data/lib/arel_extensions/visitors/mysql.rb +68 -4
- data/lib/arel_extensions/visitors/oracle.rb +67 -6
- data/lib/arel_extensions/visitors/postgresql.rb +49 -0
- data/lib/arel_extensions/visitors/sqlite.rb +53 -2
- data/lib/arel_extensions/visitors/to_sql.rb +2 -0
- data/lib/arel_extensions.rb +2 -1
- data/test/visitors/test_to_sql.rb +21 -1
- data/test/with_ar/all_agnostic_test.rb +65 -19
- metadata +4 -3
@@ -1,7 +1,7 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Nodes
|
3
3
|
class Trim < Function
|
4
|
-
|
4
|
+
RETURN_TYPE = :string
|
5
5
|
|
6
6
|
def initialize expr
|
7
7
|
tab = expr.map { |arg|
|
@@ -17,9 +17,11 @@ module ArelExtensions
|
|
17
17
|
end
|
18
18
|
|
19
19
|
class Ltrim < Trim
|
20
|
+
RETURN_TYPE = :string
|
20
21
|
end
|
21
22
|
|
22
23
|
class Rtrim < Trim
|
24
|
+
RETURN_TYPE = :string
|
23
25
|
end
|
24
26
|
|
25
27
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'arel_extensions/nodes/concat' if Arel::VERSION.to_i < 7
|
1
|
+
require 'arel_extensions/nodes/concat' #if Arel::VERSION.to_i < 7
|
2
2
|
require 'arel_extensions/nodes/length'
|
3
3
|
require 'arel_extensions/nodes/locate'
|
4
4
|
require 'arel_extensions/nodes/substring'
|
@@ -12,6 +12,7 @@ require 'arel_extensions/nodes/blank'
|
|
12
12
|
require 'arel_extensions/nodes/format'
|
13
13
|
require 'arel_extensions/nodes/repeat'
|
14
14
|
require 'arel_extensions/nodes/cast'
|
15
|
+
require 'arel_extensions/nodes/collate'
|
15
16
|
|
16
17
|
|
17
18
|
module ArelExtensions
|
@@ -36,6 +37,7 @@ module ArelExtensions
|
|
36
37
|
def substring start, len = nil
|
37
38
|
ArelExtensions::Nodes::Substring.new [self, start, len]
|
38
39
|
end
|
40
|
+
|
39
41
|
def [](start, ind = nil)
|
40
42
|
start += 1 if start.is_a?(Integer)
|
41
43
|
if start.is_a?(Range)
|
@@ -75,11 +77,39 @@ module ArelExtensions
|
|
75
77
|
def idoes_not_match_all others, escape = nil
|
76
78
|
grouping_all :idoes_not_match, others, escape
|
77
79
|
end
|
80
|
+
|
81
|
+
def ai_matches other # accent insensitive & case sensitive
|
82
|
+
ArelExtensions::Nodes::AiMatches.new(self,other)
|
83
|
+
end
|
84
|
+
|
85
|
+
def ai_imatches other # accent insensitive & case insensitive
|
86
|
+
ArelExtensions::Nodes::AiIMatches.new(self,other)
|
87
|
+
end
|
88
|
+
|
89
|
+
def smatches other # accent sensitive & case sensitive
|
90
|
+
ArelExtensions::Nodes::SMatches.new(self,other)
|
91
|
+
end
|
92
|
+
|
93
|
+
def ai_collate
|
94
|
+
ArelExtensions::Nodes::Collate.new(self,nil,true,false)
|
95
|
+
end
|
96
|
+
|
97
|
+
def ci_collate
|
98
|
+
ArelExtensions::Nodes::Collate.new(self,nil,false,true)
|
99
|
+
end
|
100
|
+
|
101
|
+
def collate ai=false,ci=false, option=nil
|
102
|
+
ArelExtensions::Nodes::Collate.new(self,option,ai,ci)
|
103
|
+
end
|
78
104
|
|
79
105
|
#REPLACE function replaces a sequence of characters in a string with another set of characters, not case-sensitive.
|
80
106
|
def replace left, right
|
81
107
|
ArelExtensions::Nodes::Replace.new [self, left, right]
|
82
108
|
end
|
109
|
+
|
110
|
+
def concat other
|
111
|
+
ArelExtensions::Nodes::Concat.new [self, other]
|
112
|
+
end
|
83
113
|
|
84
114
|
def group_concat sep = nil
|
85
115
|
ArelExtensions::Nodes::GroupConcat.new [self, sep]
|
@@ -302,7 +302,9 @@ module ArelExtensions
|
|
302
302
|
|
303
303
|
# TODO; manage case insensitivity
|
304
304
|
def visit_ArelExtensions_Nodes_IMatches o, collector
|
305
|
-
collector =
|
305
|
+
collector = visit o.left.ci_collate, collector
|
306
|
+
collector << ' LIKE '
|
307
|
+
collector = visit o.right.ci_collate, collector
|
306
308
|
if o.escape
|
307
309
|
collector << ' ESCAPE '
|
308
310
|
visit o.escape, collector
|
@@ -313,13 +315,72 @@ module ArelExtensions
|
|
313
315
|
|
314
316
|
# TODO; manage case insensitivity
|
315
317
|
def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
|
316
|
-
collector =
|
318
|
+
collector = visit o.left.ci_collate, collector
|
319
|
+
collector << ' NOT LIKE '
|
320
|
+
collector = visit o.right.ci_collate, collector
|
317
321
|
if o.escape
|
318
322
|
collector << ' ESCAPE '
|
319
|
-
|
323
|
+
visit o.escape, collector
|
324
|
+
else
|
325
|
+
collector
|
320
326
|
end
|
321
|
-
collector
|
322
327
|
end
|
328
|
+
|
329
|
+
def visit_ArelExtensions_Nodes_AiMatches o, collector
|
330
|
+
collector = visit o.left.ai_collate, collector
|
331
|
+
collector << ' LIKE '
|
332
|
+
collector = visit o.right.ai_collate, collector
|
333
|
+
if o.escape
|
334
|
+
collector << ' ESCAPE '
|
335
|
+
visit o.escape, collector
|
336
|
+
else
|
337
|
+
collector
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
def visit_ArelExtensions_Nodes_AiIMatches o, collector
|
342
|
+
collector = visit o.left.collate(true,true), collector
|
343
|
+
collector << ' LIKE '
|
344
|
+
collector = visit o.right.collate(true,true), collector
|
345
|
+
if o.escape
|
346
|
+
collector << ' ESCAPE '
|
347
|
+
visit o.escape, collector
|
348
|
+
else
|
349
|
+
collector
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
def visit_ArelExtensions_Nodes_SMatches o, collector
|
354
|
+
collector = visit o.left.collate, collector
|
355
|
+
collector << ' LIKE '
|
356
|
+
collector = visit o.right.collate, collector
|
357
|
+
if o.escape
|
358
|
+
collector << ' ESCAPE '
|
359
|
+
visit o.escape, collector
|
360
|
+
else
|
361
|
+
collector
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
def visit_ArelExtensions_Nodes_Collate o, collector
|
366
|
+
if o.ai && o.ci
|
367
|
+
collector = visit o.expressions.first, collector
|
368
|
+
collector << ' COLLATE Latin1_General_CI_AI'
|
369
|
+
elsif o.ai
|
370
|
+
collector = visit o.expressions.first, collector
|
371
|
+
collector << ' COLLATE Latin1_General_CS_AI'
|
372
|
+
elsif o.ci
|
373
|
+
collector = visit o.expressions.first, collector
|
374
|
+
collector << ' COLLATE Latin1_General_CI_AS'
|
375
|
+
else
|
376
|
+
collector = visit o.expressions.first, collector
|
377
|
+
collector << ' COLLATE Latin1_General_CS_AS'
|
378
|
+
end
|
379
|
+
collector
|
380
|
+
end
|
381
|
+
|
382
|
+
|
383
|
+
|
323
384
|
|
324
385
|
# SQL Server does not know about REGEXP
|
325
386
|
def visit_Arel_Nodes_Regexp o, collector
|
@@ -348,6 +409,29 @@ module ArelExtensions
|
|
348
409
|
collector
|
349
410
|
end
|
350
411
|
|
412
|
+
|
413
|
+
def visit_ArelExtensions_Nodes_Cast o, collector
|
414
|
+
collector << "CAST("
|
415
|
+
collector = visit o.left, collector
|
416
|
+
collector << " AS "
|
417
|
+
case o.as_attr
|
418
|
+
when :string
|
419
|
+
as_attr = Arel::Nodes::SqlLiteral.new('varchar')
|
420
|
+
when :time
|
421
|
+
as_attr = Arel::Nodes::SqlLiteral.new('time')
|
422
|
+
when :number
|
423
|
+
as_attr = Arel::Nodes::SqlLiteral.new('int')
|
424
|
+
when :datetime
|
425
|
+
as_attr = Arel::Nodes::SqlLiteral.new('datetime')
|
426
|
+
when :binary
|
427
|
+
as_attr = Arel::Nodes::SqlLiteral.new('binary')
|
428
|
+
else
|
429
|
+
as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
|
430
|
+
end
|
431
|
+
collector = visit as_attr, collector
|
432
|
+
collector << ")"
|
433
|
+
collector
|
434
|
+
end
|
351
435
|
|
352
436
|
end
|
353
437
|
end
|
@@ -33,9 +33,35 @@ module ArelExtensions
|
|
33
33
|
|
34
34
|
#String functions
|
35
35
|
def visit_ArelExtensions_Nodes_IMatches o, collector # insensitive on ASCII
|
36
|
+
collector << 'LOWER('
|
36
37
|
collector = visit o.left, collector
|
37
|
-
collector << ' LIKE '
|
38
|
+
collector << ') LIKE LOWER('
|
38
39
|
collector = visit o.right, collector
|
40
|
+
collector << ')'
|
41
|
+
if o.escape
|
42
|
+
collector << ' ESCAPE '
|
43
|
+
visit o.escape, collector
|
44
|
+
else
|
45
|
+
collector
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def visit_ArelExtensions_Nodes_AiMatches o, collector
|
50
|
+
collector = visit o.left.ai_collate, collector
|
51
|
+
collector << ' LIKE '
|
52
|
+
collector = visit o.right.ai_collate, collector
|
53
|
+
if o.escape
|
54
|
+
collector << ' ESCAPE '
|
55
|
+
visit o.escape, collector
|
56
|
+
else
|
57
|
+
collector
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def visit_ArelExtensions_Nodes_AiIMatches o, collector
|
62
|
+
collector = visit o.left.ai_collate, collector
|
63
|
+
collector << ' LIKE '
|
64
|
+
collector = visit o.right.ai_collate, collector
|
39
65
|
if o.escape
|
40
66
|
collector << ' ESCAPE '
|
41
67
|
visit o.escape, collector
|
@@ -44,10 +70,24 @@ module ArelExtensions
|
|
44
70
|
end
|
45
71
|
end
|
46
72
|
|
73
|
+
def visit_ArelExtensions_Nodes_SMatches o, collector
|
74
|
+
collector = visit o.left.collate, collector
|
75
|
+
collector << ' LIKE '
|
76
|
+
collector = visit o.right.collate, collector
|
77
|
+
if o.escape
|
78
|
+
collector << ' ESCAPE '
|
79
|
+
visit o.escape, collector
|
80
|
+
else
|
81
|
+
collector
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
47
85
|
def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
|
48
|
-
collector
|
49
|
-
collector
|
50
|
-
collector
|
86
|
+
collector << 'LOWER('
|
87
|
+
collector = visit o.left, collector
|
88
|
+
collector << ') NOT LIKE LOWER('
|
89
|
+
collector = visit o.right, collector
|
90
|
+
collector << ')'
|
51
91
|
if o.escape
|
52
92
|
collector << ' ESCAPE '
|
53
93
|
visit o.escape, collector
|
@@ -55,6 +95,30 @@ module ArelExtensions
|
|
55
95
|
collector
|
56
96
|
end
|
57
97
|
end
|
98
|
+
|
99
|
+
def visit_ArelExtensions_Nodes_Collate o, collector
|
100
|
+
case o.expressions.first
|
101
|
+
when Arel::Attributes::Attribute
|
102
|
+
charset = case o.option
|
103
|
+
when 'latin1','utf8'
|
104
|
+
o.option
|
105
|
+
else
|
106
|
+
Arel::Table.engine.connection.charset || 'utf8'
|
107
|
+
end
|
108
|
+
else
|
109
|
+
charset = (o.option == 'latin1') ? 'latin1' : 'utf8'
|
110
|
+
end
|
111
|
+
collector = visit o.expressions.first, collector
|
112
|
+
if o.ai
|
113
|
+
collector << " COLLATE #{charset == 'latin1' ? 'latin1_general_ci' : 'utf8_unicode_ci' }"
|
114
|
+
#doesn't work in latin1
|
115
|
+
elsif o.ci
|
116
|
+
collector << " COLLATE #{charset == 'latin1' ? 'latin1_general_ci' : 'utf8_unicode_ci' }"
|
117
|
+
else
|
118
|
+
collector << " COLLATE #{charset}_bin"
|
119
|
+
end
|
120
|
+
collector
|
121
|
+
end
|
58
122
|
|
59
123
|
def visit_ArelExtensions_Nodes_Concat o, collector
|
60
124
|
collector << "CONCAT("
|
@@ -41,9 +41,35 @@ module ArelExtensions
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def visit_ArelExtensions_Nodes_IMatches o, collector
|
44
|
-
|
44
|
+
collector << 'LOWER('
|
45
|
+
collector = visit o.left, collector
|
46
|
+
collector << ') LIKE LOWER('
|
47
|
+
collector = visit o.right, collector
|
48
|
+
collector << ')'
|
49
|
+
if o.escape
|
50
|
+
collector << ' ESCAPE '
|
51
|
+
visit o.escape, collector
|
52
|
+
else
|
53
|
+
collector
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def visit_ArelExtensions_Nodes_AiMatches o, collector
|
58
|
+
collector = visit o.left.ai_collate, collector
|
59
|
+
collector << ' LIKE '
|
60
|
+
collector = visit o.right.ai_collate, collector
|
61
|
+
if o.escape
|
62
|
+
collector << ' ESCAPE '
|
63
|
+
visit o.escape, collector
|
64
|
+
else
|
65
|
+
collector
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def visit_ArelExtensions_Nodes_AiIMatches o, collector
|
70
|
+
collector = visit o.left.ai_collate, collector
|
45
71
|
collector << ' LIKE '
|
46
|
-
collector = visit o.right.
|
72
|
+
collector = visit o.right.ai_collate, collector
|
47
73
|
if o.escape
|
48
74
|
collector << ' ESCAPE '
|
49
75
|
visit o.escape, collector
|
@@ -51,11 +77,26 @@ module ArelExtensions
|
|
51
77
|
collector
|
52
78
|
end
|
53
79
|
end
|
80
|
+
|
81
|
+
def visit_ArelExtensions_Nodes_SMatches o, collector
|
82
|
+
collector = visit o.left, collector
|
83
|
+
collector << ' LIKE '
|
84
|
+
collector = visit o.right, collector
|
85
|
+
if o.escape
|
86
|
+
collector << ' ESCAPE '
|
87
|
+
visit o.escape, collector
|
88
|
+
else
|
89
|
+
collector
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
54
93
|
|
55
94
|
def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
|
56
|
-
collector
|
57
|
-
collector
|
58
|
-
collector
|
95
|
+
collector << 'LOWER('
|
96
|
+
collector = visit o.left, collector
|
97
|
+
collector << ') NOT LIKE LOWER('
|
98
|
+
collector = visit o.right, collector
|
99
|
+
collector << ')'
|
59
100
|
if o.escape
|
60
101
|
collector << ' ESCAPE '
|
61
102
|
visit o.escape, collector
|
@@ -63,6 +104,26 @@ module ArelExtensions
|
|
63
104
|
collector
|
64
105
|
end
|
65
106
|
end
|
107
|
+
|
108
|
+
def visit_ArelExtensions_Nodes_Collate o, collector
|
109
|
+
if o.ai
|
110
|
+
collector << "NLSSORT("
|
111
|
+
collector = visit o.expressions.first, collector
|
112
|
+
collector << Arel::Visitors::Oracle::COMMA
|
113
|
+
collector << "'NLS_SORT = BINARY_AI NLS_COMP = LINGUISTIC'"
|
114
|
+
collector << ")"
|
115
|
+
elsif o.ci
|
116
|
+
collector << "NLSSORT("
|
117
|
+
collector = visit o.expressions.first, collector
|
118
|
+
collector << Arel::Visitors::Oracle::COMMA
|
119
|
+
collector << "'NLS_SORT = BINARY_CI NLS_COMP = LINGUISTIC'"
|
120
|
+
collector << ")"
|
121
|
+
else
|
122
|
+
collector = visit o.expressions.first, collector
|
123
|
+
end
|
124
|
+
collector
|
125
|
+
end
|
126
|
+
|
66
127
|
|
67
128
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
68
129
|
collector << "(LISTAGG("
|
@@ -95,7 +156,7 @@ module ArelExtensions
|
|
95
156
|
}
|
96
157
|
collector << ")"
|
97
158
|
collector
|
98
|
-
end
|
159
|
+
end
|
99
160
|
|
100
161
|
# :date is not possible in Oracle since this type does not really exist
|
101
162
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
@@ -131,6 +131,55 @@ module ArelExtensions
|
|
131
131
|
collector << ")"
|
132
132
|
collector
|
133
133
|
end
|
134
|
+
|
135
|
+
def visit_ArelExtensions_Nodes_AiMatches o, collector
|
136
|
+
collector = visit o.left.ai_collate, collector
|
137
|
+
collector << ' LIKE '
|
138
|
+
collector = visit o.right.ai_collate, collector
|
139
|
+
if o.escape
|
140
|
+
collector << ' ESCAPE '
|
141
|
+
visit o.escape, collector
|
142
|
+
else
|
143
|
+
collector
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def visit_ArelExtensions_Nodes_AiIMatches o, collector
|
148
|
+
collector = visit o.left.ai_collate, collector
|
149
|
+
collector << ' ILIKE '
|
150
|
+
collector = visit o.right.ai_collate, collector
|
151
|
+
if o.escape
|
152
|
+
collector << ' ESCAPE '
|
153
|
+
visit o.escape, collector
|
154
|
+
else
|
155
|
+
collector
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def visit_ArelExtensions_Nodes_SMatches o, collector
|
160
|
+
collector = visit o.left, collector
|
161
|
+
collector << ' LIKE '
|
162
|
+
collector = visit o.right, collector
|
163
|
+
if o.escape
|
164
|
+
collector << ' ESCAPE '
|
165
|
+
visit o.escape, collector
|
166
|
+
else
|
167
|
+
collector
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def visit_ArelExtensions_Nodes_Collate o, collector
|
172
|
+
if o.ai
|
173
|
+
collector << "unaccent("
|
174
|
+
collector = visit o.expressions.first, collector
|
175
|
+
collector << ")"
|
176
|
+
elsif o.ci
|
177
|
+
collector = visit o.expressions.first, collector
|
178
|
+
else
|
179
|
+
collector = visit o.expressions.first, collector
|
180
|
+
end
|
181
|
+
collector
|
182
|
+
end
|
134
183
|
|
135
184
|
def visit_ArelExtensions_Nodes_DateAdd o, collector
|
136
185
|
collector = visit o.left, collector
|
@@ -11,9 +11,9 @@ module ArelExtensions
|
|
11
11
|
|
12
12
|
#String functions
|
13
13
|
def visit_ArelExtensions_Nodes_IMatches o, collector # insensitive on ASCII
|
14
|
-
collector = visit o.left, collector
|
14
|
+
collector = visit o.left.ci_collate, collector
|
15
15
|
collector << ' LIKE '
|
16
|
-
collector = visit o.right, collector
|
16
|
+
collector = visit o.right.ci_collate, collector
|
17
17
|
if o.escape
|
18
18
|
collector << ' ESCAPE '
|
19
19
|
visit o.escape, collector
|
@@ -21,6 +21,57 @@ module ArelExtensions
|
|
21
21
|
collector
|
22
22
|
end
|
23
23
|
end
|
24
|
+
|
25
|
+
def visit_ArelExtensions_Nodes_AiMatches o, collector
|
26
|
+
collector = visit o.left.ai_collate, collector
|
27
|
+
collector << ' LIKE '
|
28
|
+
collector = visit o.right.ai_collate, collector
|
29
|
+
if o.escape
|
30
|
+
collector << ' ESCAPE '
|
31
|
+
visit o.escape, collector
|
32
|
+
else
|
33
|
+
collector
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def visit_ArelExtensions_Nodes_AiIMatches o, collector
|
38
|
+
collector = visit o.left.collate(true,true), collector
|
39
|
+
collector << ' LIKE '
|
40
|
+
collector = visit o.right.collate(true,true), collector
|
41
|
+
if o.escape
|
42
|
+
collector << ' ESCAPE '
|
43
|
+
visit o.escape, collector
|
44
|
+
else
|
45
|
+
collector
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def visit_ArelExtensions_Nodes_SMatches o, collector
|
50
|
+
collector = visit o.left.collate, collector
|
51
|
+
collector << ' LIKE '
|
52
|
+
collector = visit o.right.collate, collector
|
53
|
+
if o.escape
|
54
|
+
collector << ' ESCAPE '
|
55
|
+
visit o.escape, collector
|
56
|
+
else
|
57
|
+
collector
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def visit_ArelExtensions_Nodes_Collate o, collector
|
62
|
+
if o.ai
|
63
|
+
collector = visit o.expressions.first, collector
|
64
|
+
collector << ' COLLATE NOACCENTS'
|
65
|
+
elsif o.ci
|
66
|
+
collector = visit o.expressions.first, collector
|
67
|
+
collector << ' COLLATE NOCASE'
|
68
|
+
else
|
69
|
+
collector = visit o.expressions.first, collector
|
70
|
+
collector << ' COLLATE BINARY'
|
71
|
+
end
|
72
|
+
collector
|
73
|
+
end
|
74
|
+
|
24
75
|
|
25
76
|
def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
|
26
77
|
collector = visit o.left.lower, collector
|
@@ -211,6 +211,7 @@ module ArelExtensions
|
|
211
211
|
end
|
212
212
|
|
213
213
|
def visit_ArelExtensions_Nodes_Blank o, collector
|
214
|
+
#visit o.left.coalesce('').trim.length.eq(0), collector
|
214
215
|
collector << 'LENGTH(TRIM(COALESCE('
|
215
216
|
collector = visit o.left, collector
|
216
217
|
collector << Arel::Visitors::ToSql::COMMA
|
@@ -221,6 +222,7 @@ module ArelExtensions
|
|
221
222
|
|
222
223
|
|
223
224
|
def visit_ArelExtensions_Nodes_NotBlank o, collector
|
225
|
+
#visit o.left.coalesce('').trim.length.gt(0), collector
|
224
226
|
collector << 'LENGTH(TRIM(COALESCE('
|
225
227
|
collector = visit o.left, collector
|
226
228
|
collector << Arel::Visitors::ToSql::COMMA
|
data/lib/arel_extensions.rb
CHANGED
@@ -48,6 +48,7 @@ require 'arel_extensions/math'
|
|
48
48
|
require 'arel_extensions/math_functions'
|
49
49
|
require 'arel_extensions/string_functions'
|
50
50
|
require 'arel_extensions/set_functions'
|
51
|
+
require 'arel_extensions/predications'
|
51
52
|
|
52
53
|
require 'arel_extensions/insert_manager'
|
53
54
|
|
@@ -59,7 +60,6 @@ require 'arel_extensions/nodes/as'
|
|
59
60
|
require 'arel_extensions/nodes/case'
|
60
61
|
require 'arel_extensions/nodes/soundex'
|
61
62
|
require 'arel_extensions/nodes/cast'
|
62
|
-
require 'arel_extensions/predications'
|
63
63
|
|
64
64
|
|
65
65
|
|
@@ -75,6 +75,7 @@ Arel::Attributes::Attribute.class_eval do
|
|
75
75
|
end
|
76
76
|
|
77
77
|
Arel::Nodes::Function.class_eval do
|
78
|
+
include ArelExtensions::Math
|
78
79
|
include ArelExtensions::Comparators
|
79
80
|
include ArelExtensions::DateDuration
|
80
81
|
include ArelExtensions::MathFunctions
|