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