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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +20 -6
  3. data/Gemfile +5 -3
  4. data/README.md +38 -1
  5. data/appveyor.yml +0 -4
  6. data/gemfiles/rails5_0.gemfile +1 -1
  7. data/gemfiles/{rails5_2_beta.gemfile → rails5_2.gemfile} +5 -5
  8. data/lib/arel_extensions/attributes.rb +2 -2
  9. data/lib/arel_extensions/date_duration.rb +1 -1
  10. data/lib/arel_extensions/math.rb +20 -16
  11. data/lib/arel_extensions/nodes/abs.rb +1 -1
  12. data/lib/arel_extensions/nodes/blank.rb +2 -2
  13. data/lib/arel_extensions/nodes/cast.rb +18 -13
  14. data/lib/arel_extensions/nodes/ceil.rb +1 -1
  15. data/lib/arel_extensions/nodes/change_case.rb +2 -2
  16. data/lib/arel_extensions/nodes/coalesce.rb +1 -2
  17. data/lib/arel_extensions/nodes/collate.rb +18 -0
  18. data/lib/arel_extensions/nodes/concat.rb +8 -8
  19. data/lib/arel_extensions/nodes/date_diff.rb +3 -3
  20. data/lib/arel_extensions/nodes/duration.rb +4 -4
  21. data/lib/arel_extensions/nodes/find_in_set.rb +1 -1
  22. data/lib/arel_extensions/nodes/floor.rb +1 -2
  23. data/lib/arel_extensions/nodes/format.rb +2 -2
  24. data/lib/arel_extensions/nodes/formatted_number.rb +1 -1
  25. data/lib/arel_extensions/nodes/function.rb +10 -6
  26. data/lib/arel_extensions/nodes/is_null.rb +2 -1
  27. data/lib/arel_extensions/nodes/length.rb +1 -1
  28. data/lib/arel_extensions/nodes/locate.rb +1 -1
  29. data/lib/arel_extensions/nodes/log10.rb +1 -1
  30. data/lib/arel_extensions/nodes/matches.rb +10 -0
  31. data/lib/arel_extensions/nodes/power.rb +1 -1
  32. data/lib/arel_extensions/nodes/rand.rb +1 -1
  33. data/lib/arel_extensions/nodes/repeat.rb +1 -1
  34. data/lib/arel_extensions/nodes/replace.rb +1 -1
  35. data/lib/arel_extensions/nodes/round.rb +1 -1
  36. data/lib/arel_extensions/nodes/soundex.rb +1 -1
  37. data/lib/arel_extensions/nodes/substring.rb +1 -1
  38. data/lib/arel_extensions/nodes/trim.rb +3 -1
  39. data/lib/arel_extensions/nodes/wday.rb +3 -3
  40. data/lib/arel_extensions/string_functions.rb +31 -1
  41. data/lib/arel_extensions/version.rb +1 -1
  42. data/lib/arel_extensions/visitors/mssql.rb +88 -4
  43. data/lib/arel_extensions/visitors/mysql.rb +68 -4
  44. data/lib/arel_extensions/visitors/oracle.rb +67 -6
  45. data/lib/arel_extensions/visitors/postgresql.rb +49 -0
  46. data/lib/arel_extensions/visitors/sqlite.rb +53 -2
  47. data/lib/arel_extensions/visitors/to_sql.rb +2 -0
  48. data/lib/arel_extensions.rb +2 -1
  49. data/test/visitors/test_to_sql.rb +21 -1
  50. data/test/with_ar/all_agnostic_test.rb +65 -19
  51. metadata +4 -3
@@ -1,7 +1,7 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
3
  class Power < Function
4
- @@return_type = :number
4
+ RETURN_TYPE = :number
5
5
 
6
6
  def initialize expr
7
7
  super [convert_to_node(expr.first), convert_to_number(expr[1])]
@@ -1,7 +1,7 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
3
  class Rand < Function
4
- @@return_type = :number
4
+ RETURN_TYPE = :number
5
5
 
6
6
  def initialize(seed = nil)
7
7
  if seed && seed.length == 1
@@ -1,7 +1,7 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
3
  class Repeat < Function
4
- @@return_type = :string
4
+ RETURN_TYPE = :string
5
5
 
6
6
  def initialize expr
7
7
  tab = expr.map { |arg|
@@ -1,7 +1,7 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
3
  class Replace < Function
4
- @@return_type = :string
4
+ RETURN_TYPE = :string
5
5
 
6
6
  def initialize expr
7
7
  tab = expr.map { |arg|
@@ -1,7 +1,7 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
3
  class Round < Function
4
- @@return_type = :number
4
+ RETURN_TYPE = :number
5
5
 
6
6
  def initialize expr
7
7
  if expr && expr.length == 1
@@ -4,7 +4,7 @@ module ArelExtensions
4
4
  include Arel::Expressions
5
5
  include ArelExtensions::Comparators
6
6
 
7
- @@return_type = :string
7
+ RETURN_TYPE = :string
8
8
 
9
9
  def ==(other)
10
10
  Arel::Nodes::Equality.new self, Arel::Nodes.build_quoted(other, self)
@@ -1,7 +1,7 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
3
  class Substring < Function
4
- @@return_type = :string
4
+ RETURN_TYPE = :string
5
5
 
6
6
  def initialize expr
7
7
  tab = [convert_to_node(expr[0]), convert_to_node(expr[1])]
@@ -1,7 +1,7 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
3
  class Trim < Function
4
- @@return_type = :string
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
@@ -14,9 +14,9 @@ module ArelExtensions
14
14
  @expressions.first
15
15
  end
16
16
 
17
- def as other
18
- Arel::Nodes::As.new self, Arel::Nodes::SqlLiteral.new(other)
19
- end
17
+ #def as other
18
+ # Arel::Nodes::As.new self, Arel::Nodes::SqlLiteral.new(other)
19
+ #end
20
20
 
21
21
  end
22
22
  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]
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = "1.0.5".freeze
2
+ VERSION = "1.0.6".freeze
3
3
  end
@@ -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 = infix_value o, collector, ' LIKE '
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 = infix_value o, collector, ' NOT LIKE '
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
- collector = visit o.escape, collector
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 = visit o.left.lower, collector
49
- collector << ' NOT LIKE '
50
- collector = visit o.right.lower(o.right), 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
- collector = visit o.left.lower, collector
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.lower(o.right), collector
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 = visit o.left.lower, collector
57
- collector << ' NOT LIKE '
58
- collector = visit o.right.lower(o.right), 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
@@ -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