arel_extensions 1.0.5 → 1.0.6
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 +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
|