arel_extensions 1.1.7 → 1.1.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 54b97943cc09647feb4ad636b82a817180f8ad36
4
- data.tar.gz: eab4a80c6a281d9650667ab513a8b4b6d2848d9b
3
+ metadata.gz: bcbd0d968a06d04df7d1b214a72aeaf46dd9e950
4
+ data.tar.gz: 717c053e7925a4d4ec6c1aa43d7db95a928224ba
5
5
  SHA512:
6
- metadata.gz: ef0d6d47007a551939c09290d5650c464c877bb4f8975ec8dc66e1ddd8c608444653160c926d6d5a80751addf87606280f08a8b93527c9dba33ccb34992ab8c7
7
- data.tar.gz: add7b753a66251314396e06444d9a5e2ab90983a93a5bc2e8f5d7167b8f0cae146eb4694228d518245c935f9936dfaa611e38d21c8b34a8e6ee026cdf8427290
6
+ metadata.gz: c47c4d2544182c27b7effe868a157545d3bb9b16096ebf0c9078373d3682a008a7e481d30f2a2d2a2bf40e1f1b6ea2431e08a8129b07998bf90f005e0eb9173a
7
+ data.tar.gz: 4817767ae9f17846f9909a1f7ceadaddd4ca9745d65c64b50be06184e31ddfc93ae55ac9c27e4b0d97fbc1c91fd14c805f298d2414a9b77130c4737bf3489e8a
@@ -14,7 +14,7 @@ module ArelExtensions::Nodes
14
14
  }.flatten.reduce([]) { | res, b |
15
15
  # concatenate successive literal strings.
16
16
  if b.is_a?(Arel::Nodes::Quoted) && b.expr == ""
17
- res
17
+ res
18
18
  elsif res.last && res.last.is_a?(Arel::Nodes::Quoted) && b.is_a?(Arel::Nodes::Quoted)
19
19
  res[-1] = Arel::Nodes.build_quoted(res.last.expr + b.expr)
20
20
  else
@@ -25,18 +25,14 @@ module ArelExtensions::Nodes
25
25
  super(tab)
26
26
  end
27
27
 
28
- def self.new expr
29
- o = super(expr)
30
- if o.expressions.length == 1
31
- o.expressions[0]
32
- else
33
- o
34
- end
35
- end
36
-
37
- #def +(other)
38
- # Concat.new(self.expressions + [other])
39
- #end
28
+ def self.new expr
29
+ o = super(expr)
30
+ if o.expressions.length == 1
31
+ o.expressions[0]
32
+ else
33
+ o
34
+ end
35
+ end
40
36
 
41
37
  def concat(other)
42
38
  Concat.new(self.expressions + [other])
@@ -47,16 +43,19 @@ module ArelExtensions::Nodes
47
43
  class GroupConcat < Function
48
44
  RETURN_TYPE = :string
49
45
 
46
+ attr_accessor :orders
47
+
50
48
  def initialize expr
51
49
  tab = expr.map { |arg|
52
- convert_to_node(arg)
53
- }
50
+ if arg.is_a?(Array)
51
+ @orders = arg
52
+ nil
53
+ else
54
+ convert_to_node(arg)
55
+ end
56
+ }.compact
54
57
  super(tab)
55
58
  end
56
59
 
57
- #def +(other)
58
- # return Concat.new([self, other])
59
- #end
60
-
61
60
  end
62
61
  end
@@ -0,0 +1,8 @@
1
+ module ArelExtensions
2
+ module Nodes
3
+ class MD5 < Function
4
+ RETURN_TYPE = :string
5
+
6
+ end
7
+ end
8
+ end
@@ -14,7 +14,8 @@ require 'arel_extensions/nodes/repeat'
14
14
  require 'arel_extensions/nodes/cast'
15
15
  require 'arel_extensions/nodes/collate'
16
16
  require 'arel_extensions/nodes/levenshtein_distance'
17
-
17
+ require 'arel_extensions/nodes/md5'
18
+
18
19
 
19
20
  module ArelExtensions
20
21
  module StringFunctions
@@ -38,7 +39,7 @@ module ArelExtensions
38
39
  def substring start, len = nil
39
40
  ArelExtensions::Nodes::Substring.new [self, start, len]
40
41
  end
41
-
42
+
42
43
  def [](start, ind = nil)
43
44
  start += 1 if start.is_a?(Integer)
44
45
  if start.is_a?(Range)
@@ -78,29 +79,29 @@ module ArelExtensions
78
79
  def idoes_not_match_all others, escape = nil
79
80
  grouping_all :idoes_not_match, others, escape
80
81
  end
81
-
82
+
82
83
  def ai_matches other # accent insensitive & case sensitive
83
84
  ArelExtensions::Nodes::AiMatches.new(self,other)
84
85
  end
85
-
86
+
86
87
  def ai_imatches other # accent insensitive & case insensitive
87
88
  ArelExtensions::Nodes::AiIMatches.new(self,other)
88
89
  end
89
-
90
+
90
91
  def smatches other # accent sensitive & case sensitive
91
92
  ArelExtensions::Nodes::SMatches.new(self,other)
92
93
  end
93
-
94
+
94
95
  def ai_collate
95
- ArelExtensions::Nodes::Collate.new(self,nil,true,false)
96
+ ArelExtensions::Nodes::Collate.new(self,nil,true,false)
96
97
  end
97
-
98
+
98
99
  def ci_collate
99
- ArelExtensions::Nodes::Collate.new(self,nil,false,true)
100
+ ArelExtensions::Nodes::Collate.new(self,nil,false,true)
100
101
  end
101
-
102
+
102
103
  def collate ai=false,ci=false, option=nil
103
- ArelExtensions::Nodes::Collate.new(self,option,ai,ci)
104
+ ArelExtensions::Nodes::Collate.new(self,option,ai,ci)
104
105
  end
105
106
 
106
107
  #REPLACE function replaces a sequence of characters in a string with another set of characters, not case-sensitive.
@@ -108,12 +109,22 @@ module ArelExtensions
108
109
  ArelExtensions::Nodes::Replace.new [self, left, right]
109
110
  end
110
111
 
111
- def concat other
112
- ArelExtensions::Nodes::Concat.new [self, other]
113
- end
112
+ def concat other
113
+ ArelExtensions::Nodes::Concat.new [self, other]
114
+ end
114
115
 
115
- def group_concat sep = nil
116
- ArelExtensions::Nodes::GroupConcat.new [self, sep]
116
+ #concat elements of a group, separated by sep and ordered by a list of Ascending or Descending
117
+ def group_concat sep = nil, *orders
118
+ order_tabs = [orders].flatten.map{ |o|
119
+ if o.is_a?(Arel::Nodes::Ascending) || o.is_a?(Arel::Nodes::Descending)
120
+ o
121
+ elsif o.respond_to?(:asc)
122
+ o.asc
123
+ else
124
+ nil
125
+ end
126
+ }.compact
127
+ ArelExtensions::Nodes::GroupConcat.new [self, sep, order_tabs]
117
128
  end
118
129
 
119
130
  #Function returns a string after removing left, right or the both prefixes or suffixes int argument
@@ -146,16 +157,19 @@ module ArelExtensions
146
157
  end
147
158
 
148
159
  def repeat other = 1
149
- ArelExtensions::Nodes::Repeat.new [self, other]
160
+ ArelExtensions::Nodes::Repeat.new [self, other]
150
161
  end
151
162
 
152
163
  def levenshtein_distance other
153
- ArelExtensions::Nodes::LevenshteinDistance.new [self, other]
164
+ ArelExtensions::Nodes::LevenshteinDistance.new [self, other]
154
165
  end
155
166
 
156
- def edit_distance other
157
- ArelExtensions::Nodes::LevenshteinDistance.new [self, other]
158
- end
167
+ def edit_distance other
168
+ ArelExtensions::Nodes::LevenshteinDistance.new [self, other]
169
+ end
159
170
 
171
+ def md5
172
+ ArelExtensions::Nodes::MD5.new [self]
173
+ end
160
174
  end
161
175
  end
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = "1.1.7".freeze
2
+ VERSION = "1.1.8".freeze
3
3
  end
@@ -311,7 +311,7 @@ module ArelExtensions
311
311
  end
312
312
  end
313
313
 
314
- def visit_ArelExtensions_Nodes_AiMatches o, collector
314
+ def visit_ArelExtensions_Nodes_AiMatches o, collector
315
315
  collector = visit o.left.ai_collate, collector
316
316
  collector << ' LIKE '
317
317
  collector = visit o.right.ai_collate, collector
@@ -321,9 +321,9 @@ module ArelExtensions
321
321
  else
322
322
  collector
323
323
  end
324
- end
324
+ end
325
325
 
326
- def visit_ArelExtensions_Nodes_AiIMatches o, collector
326
+ def visit_ArelExtensions_Nodes_AiIMatches o, collector
327
327
  collector = visit o.left.collate(true,true), collector
328
328
  collector << ' LIKE '
329
329
  collector = visit o.right.collate(true,true), collector
@@ -333,9 +333,9 @@ module ArelExtensions
333
333
  else
334
334
  collector
335
335
  end
336
- end
336
+ end
337
337
 
338
- def visit_ArelExtensions_Nodes_SMatches o, collector
338
+ def visit_ArelExtensions_Nodes_SMatches o, collector
339
339
  collector = visit o.left.collate, collector
340
340
  collector << ' LIKE '
341
341
  collector = visit o.right.collate, collector
@@ -345,27 +345,24 @@ module ArelExtensions
345
345
  else
346
346
  collector
347
347
  end
348
- end
349
-
350
- def visit_ArelExtensions_Nodes_Collate o, collector
351
- if o.ai && o.ci
352
- collector = visit o.expressions.first, collector
353
- collector << ' COLLATE Latin1_General_CI_AI'
354
- elsif o.ai
355
- collector = visit o.expressions.first, collector
356
- collector << ' COLLATE Latin1_General_CS_AI'
357
- elsif o.ci
358
- collector = visit o.expressions.first, collector
359
- collector << ' COLLATE Latin1_General_CI_AS'
360
- else
361
- collector = visit o.expressions.first, collector
362
- collector << ' COLLATE Latin1_General_CS_AS'
363
- end
348
+ end
349
+
350
+ def visit_ArelExtensions_Nodes_Collate o, collector
351
+ if o.ai && o.ci
352
+ collector = visit o.expressions.first, collector
353
+ collector << ' COLLATE Latin1_General_CI_AI'
354
+ elsif o.ai
355
+ collector = visit o.expressions.first, collector
356
+ collector << ' COLLATE Latin1_General_CS_AI'
357
+ elsif o.ci
358
+ collector = visit o.expressions.first, collector
359
+ collector << ' COLLATE Latin1_General_CI_AS'
360
+ else
361
+ collector = visit o.expressions.first, collector
362
+ collector << ' COLLATE Latin1_General_CS_AS'
363
+ end
364
364
  collector
365
- end
366
-
367
-
368
-
365
+ end
369
366
 
370
367
  # SQL Server does not know about REGEXP
371
368
  def visit_Arel_Nodes_Regexp o, collector
@@ -382,42 +379,57 @@ module ArelExtensions
382
379
 
383
380
  # TODO;
384
381
  def visit_ArelExtensions_Nodes_GroupConcat o, collector
385
- collector << "(LISTAGG("
382
+ collector << "(STRING_AGG("
386
383
  collector = visit o.left, collector
384
+ collector << Arel::Visitors::Oracle::COMMA
387
385
  if o.right && o.right != 'NULL'
388
- collector << Arel::Visitors::Oracle::COMMA
389
386
  collector = visit o.right, collector
387
+ else
388
+ collector = visit Arel::Nodes.build_quoted(','), collector
390
389
  end
391
390
  collector << ") WITHIN GROUP (ORDER BY "
392
- collector = visit o.left, collector
391
+ if !o.orders.blank?
392
+ o.orders.each_with_index do |order,i|
393
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
394
+ collector = visit order, collector
395
+ end
396
+ else
397
+ collector = visit o.left, collector
398
+ end
393
399
  collector << "))"
394
400
  collector
395
401
  end
396
-
397
-
398
- def visit_ArelExtensions_Nodes_Cast o, collector
402
+
403
+ def visit_ArelExtensions_Nodes_MD5 o, collector
404
+ collector << "LOWER(CONVERT(NVARCHAR(32),HashBytes('MD5',CONVERT(VARCHAR,"
405
+ collector = visit o.left, collector
406
+ collector << ")),2))"
407
+ collector
408
+ end
409
+
410
+ def visit_ArelExtensions_Nodes_Cast o, collector
399
411
  collector << "CAST("
400
412
  collector = visit o.left, collector
401
413
  collector << " AS "
402
- case o.as_attr
403
- when :string
404
- as_attr = Arel::Nodes::SqlLiteral.new('varchar')
405
- when :time
406
- as_attr = Arel::Nodes::SqlLiteral.new('time')
407
- when :number
408
- as_attr = Arel::Nodes::SqlLiteral.new('int')
409
- when :datetime
410
- as_attr = Arel::Nodes::SqlLiteral.new('datetime')
411
- when :binary
412
- as_attr = Arel::Nodes::SqlLiteral.new('binary')
413
- else
414
- as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
415
- end
414
+ case o.as_attr
415
+ when :string
416
+ as_attr = Arel::Nodes::SqlLiteral.new('varchar')
417
+ when :time
418
+ as_attr = Arel::Nodes::SqlLiteral.new('time')
419
+ when :number
420
+ as_attr = Arel::Nodes::SqlLiteral.new('int')
421
+ when :datetime
422
+ as_attr = Arel::Nodes::SqlLiteral.new('datetime')
423
+ when :binary
424
+ as_attr = Arel::Nodes::SqlLiteral.new('binary')
425
+ else
426
+ as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
427
+ end
416
428
  collector = visit as_attr, collector
417
429
  collector << ")"
418
430
  collector
419
- end
420
-
431
+ end
432
+
421
433
  def visit_ArelExtensions_Nodes_FormattedNumber o, collector
422
434
  col = o.left.coalesce(0)
423
435
  locale = Arel::Nodes.build_quoted(o.locale.tr('_','-'))
@@ -120,25 +120,32 @@ module ArelExtensions
120
120
  collector
121
121
  end
122
122
 
123
- def visit_ArelExtensions_Nodes_Concat o, collector
124
- collector << "CONCAT("
125
- o.expressions.each_with_index { |arg, i|
126
- collector << Arel::Visitors::MySQL::COMMA unless i == 0
127
- if (arg.is_a?(Numeric)) || (arg.is_a?(Arel::Attributes::Attribute))
128
- collector << "CAST("
129
- collector = visit arg, collector
130
- collector << " AS char)"
131
- else
132
- collector = visit arg, collector
133
- end
134
- }
135
- collector << ")"
136
- collector
137
- end
123
+ def visit_ArelExtensions_Nodes_Concat o, collector
124
+ collector << "CONCAT("
125
+ o.expressions.each_with_index { |arg, i|
126
+ collector << Arel::Visitors::MySQL::COMMA unless i == 0
127
+ if (arg.is_a?(Numeric)) || (arg.is_a?(Arel::Attributes::Attribute))
128
+ collector << "CAST("
129
+ collector = visit arg, collector
130
+ collector << " AS char)"
131
+ else
132
+ collector = visit arg, collector
133
+ end
134
+ }
135
+ collector << ")"
136
+ collector
137
+ end
138
138
 
139
139
  def visit_ArelExtensions_Nodes_GroupConcat o, collector
140
140
  collector << "GROUP_CONCAT("
141
141
  collector = visit o.left, collector
142
+ if !o.orders.blank?
143
+ collector << ' ORDER BY '
144
+ o.orders.each_with_index do |order,i|
145
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
146
+ collector = visit order, collector
147
+ end
148
+ end
142
149
  if o.right && o.right != 'NULL'
143
150
  collector << ' SEPARATOR '
144
151
  collector = visit o.right, collector
@@ -197,7 +204,7 @@ module ArelExtensions
197
204
  when :integer, :float, :decimal
198
205
  collector << "FORMAT("
199
206
  collector = visit o.left, collector
200
- collector << Arel::Visitors::ToSql::COMMA
207
+ collector << Arel::Visitors::ToSql::COMMA
201
208
  collector << '2'
202
209
  collector << Arel::Visitors::ToSql::COMMA
203
210
  collector = visit o.right, collector
@@ -2,7 +2,7 @@
2
2
  module ArelExtensions
3
3
  module Visitors
4
4
  Arel::Visitors::Oracle.class_eval do
5
-
5
+
6
6
  SPECIAL_CHARS = {"\t" => 'CHR(9)', "\n" => 'CHR(10)', "\r" => 'CHR(13)'}
7
7
  Arel::Visitors::Oracle::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'IW', 'y' => 'YEAR', 'wd' => 'D', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
8
8
  Arel::Visitors::Oracle::DATE_FORMAT_DIRECTIVES = {
@@ -12,8 +12,8 @@ module ArelExtensions
12
12
  '%M' => 'MI', '%S' => 'SS', '%L' => 'MS', '%N' => 'US', '%z' => 'tz' # seconds, subseconds
13
13
  }
14
14
  Arel::Visitors::Oracle::NUMBER_COMMA_MAPPING = { 'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', ' }
15
-
16
- def visit_ArelExtensions_Nodes_Log10 o, collector
15
+
16
+ def visit_ArelExtensions_Nodes_Log10 o, collector
17
17
  collector << "LOG("
18
18
  o.expressions.each_with_index { |arg, i|
19
19
  collector << Arel::Visitors::ToSql::COMMA unless i == 0
@@ -21,9 +21,9 @@ module ArelExtensions
21
21
  }
22
22
  collector << ",10)"
23
23
  collector
24
- end
25
-
26
- def visit_ArelExtensions_Nodes_Power o, collector
24
+ end
25
+
26
+ def visit_ArelExtensions_Nodes_Power o, collector
27
27
  collector << "POWER("
28
28
  o.expressions.each_with_index { |arg, i|
29
29
  collector << Arel::Visitors::ToSql::COMMA unless i == 0
@@ -31,8 +31,8 @@ module ArelExtensions
31
31
  }
32
32
  collector << ")"
33
33
  collector
34
- end
35
-
34
+ end
35
+
36
36
  def visit_ArelExtensions_Nodes_Concat o, collector
37
37
  collector << '('
38
38
  o.expressions.each_with_index { |arg, i|
@@ -44,7 +44,7 @@ module ArelExtensions
44
44
  end
45
45
 
46
46
  def visit_ArelExtensions_Nodes_IMatches o, collector
47
- collector << 'LOWER('
47
+ collector << 'LOWER('
48
48
  collector = visit o.left, collector
49
49
  collector << ') LIKE LOWER('
50
50
  collector = visit o.right, collector
@@ -82,7 +82,7 @@ module ArelExtensions
82
82
  end
83
83
 
84
84
  def visit_ArelExtensions_Nodes_SMatches o, collector
85
- collector = visit o.left, collector
85
+ collector = visit o.left, collector
86
86
  collector << ' LIKE '
87
87
  collector = visit o.right, collector
88
88
  if o.escape
@@ -107,23 +107,23 @@ module ArelExtensions
107
107
  collector
108
108
  end
109
109
  end
110
-
111
- def visit_ArelExtensions_Nodes_Collate o, collector
112
- if o.ai
113
- collector << "NLSSORT("
114
- collector = visit o.expressions.first, collector
115
- collector << Arel::Visitors::Oracle::COMMA
116
- collector << "'NLS_SORT = BINARY_AI NLS_COMP = LINGUISTIC'"
117
- collector << ")"
118
- elsif o.ci
119
- collector << "NLSSORT("
120
- collector = visit o.expressions.first, collector
121
- collector << Arel::Visitors::Oracle::COMMA
122
- collector << "'NLS_SORT = BINARY_CI NLS_COMP = LINGUISTIC'"
123
- collector << ")"
124
- else
125
- collector = visit o.expressions.first, collector
126
- end
110
+
111
+ def visit_ArelExtensions_Nodes_Collate o, collector
112
+ if o.ai
113
+ collector << "NLSSORT("
114
+ collector = visit o.expressions.first, collector
115
+ collector << Arel::Visitors::Oracle::COMMA
116
+ collector << "'NLS_SORT = BINARY_AI NLS_COMP = LINGUISTIC'"
117
+ collector << ")"
118
+ elsif o.ci
119
+ collector << "NLSSORT("
120
+ collector = visit o.expressions.first, collector
121
+ collector << Arel::Visitors::Oracle::COMMA
122
+ collector << "'NLS_SORT = BINARY_CI NLS_COMP = LINGUISTIC'"
123
+ collector << ")"
124
+ else
125
+ collector = visit o.expressions.first, collector
126
+ end
127
127
  collector
128
128
  end
129
129
 
@@ -131,12 +131,21 @@ module ArelExtensions
131
131
  def visit_ArelExtensions_Nodes_GroupConcat o, collector
132
132
  collector << "(LISTAGG("
133
133
  collector = visit o.left, collector
134
+ collector << Arel::Visitors::Oracle::COMMA
134
135
  if o.right && o.right != 'NULL'
135
- collector << Arel::Visitors::Oracle::COMMA
136
136
  collector = visit o.right, collector
137
+ else
138
+ collector = visit Arel::Nodes.build_quoted(','), collector
137
139
  end
138
140
  collector << ") WITHIN GROUP (ORDER BY "
139
- collector = visit o.left, collector
141
+ if !o.orders.blank?
142
+ o.orders.each_with_index do |order,i|
143
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
144
+ collector = visit order, collector
145
+ end
146
+ else
147
+ collector = visit o.left, collector
148
+ end
140
149
  collector << "))"
141
150
  collector
142
151
  end
@@ -159,7 +168,14 @@ module ArelExtensions
159
168
  }
160
169
  collector << ")"
161
170
  collector
162
- end
171
+ end
172
+
173
+ def visit_ArelExtensions_Nodes_MD5 o, collector
174
+ collector << "LOWER (RAWTOHEX (DBMS_OBFUSCATION_TOOLKIT.md5(input => UTL_I18N.STRING_TO_RAW("
175
+ collector = visit o.left, collector
176
+ collector << ", 'AL32UTF8'))))"
177
+ collector
178
+ end
163
179
 
164
180
  # :date is not possible in Oracle since this type does not really exist
165
181
  def visit_ArelExtensions_Nodes_DateDiff o, collector
@@ -203,31 +219,31 @@ module ArelExtensions
203
219
  collector << ")"
204
220
  collector
205
221
  end
206
-
207
- def visit_ArelExtensions_Nodes_Cast o, collector
208
- case o.as_attr
209
- when :string
210
- as_attr = Arel::Nodes::SqlLiteral.new('varchar(255)')
211
- when :time
212
- left = Arel::Nodes::NamedFunction.new('TO_CHAR',[o.left,Arel::Nodes.build_quoted('HH24:MI:SS')])
213
- collector = visit left, collector
214
- return collector
215
- when :number
216
- as_attr = Arel::Nodes::SqlLiteral.new('int')
217
- when :datetime
218
- as_attr = Arel::Nodes::SqlLiteral.new('timestamp')
219
- when :binary
220
- as_attr = Arel::Nodes::SqlLiteral.new('binary')
221
- else
222
- as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
223
- end
224
- collector << "CAST("
222
+
223
+ def visit_ArelExtensions_Nodes_Cast o, collector
224
+ case o.as_attr
225
+ when :string
226
+ as_attr = Arel::Nodes::SqlLiteral.new('varchar(255)')
227
+ when :time
228
+ left = Arel::Nodes::NamedFunction.new('TO_CHAR',[o.left,Arel::Nodes.build_quoted('HH24:MI:SS')])
229
+ collector = visit left, collector
230
+ return collector
231
+ when :number
232
+ as_attr = Arel::Nodes::SqlLiteral.new('int')
233
+ when :datetime
234
+ as_attr = Arel::Nodes::SqlLiteral.new('timestamp')
235
+ when :binary
236
+ as_attr = Arel::Nodes::SqlLiteral.new('binary')
237
+ else
238
+ as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
239
+ end
240
+ collector << "CAST("
225
241
  collector = visit o.left, collector
226
242
  collector << " AS "
227
243
  collector = visit as_attr, collector
228
244
  collector << ")"
229
245
  collector
230
- end
246
+ end
231
247
 
232
248
 
233
249
 
@@ -384,11 +400,11 @@ module ArelExtensions
384
400
 
385
401
  def visit_ArelExtensions_Nodes_Repeat o, collector
386
402
  collector << "LPAD("
387
- collector = visit o.expressions[0], collector #can't put empty string, otherwise it wouldn't work
388
- collector << Arel::Visitors::ToSql::COMMA
389
- collector = visit o.expressions[1], collector
390
- collector << Arel::Visitors::ToSql::COMMA
391
- collector = visit o.expressions[0], collector
403
+ collector = visit o.expressions[0], collector #can't put empty string, otherwise it wouldn't work
404
+ collector << Arel::Visitors::ToSql::COMMA
405
+ collector = visit o.expressions[1], collector
406
+ collector << Arel::Visitors::ToSql::COMMA
407
+ collector = visit o.expressions[0], collector
392
408
  collector << ")"
393
409
  collector
394
410
  end
@@ -396,9 +412,9 @@ module ArelExtensions
396
412
  # add primary_key if not present, avoid zip
397
413
  if Arel::VERSION.to_i < 7
398
414
  def visit_ArelExtensions_InsertManager_BulkValues o, collector
399
- collector << "("
415
+ collector << "("
400
416
  o.left.each_with_index do |row, idx| # values
401
- collector << " UNION ALL " if idx != 0
417
+ collector << " UNION ALL " if idx != 0
402
418
  collector << "(SELECT "
403
419
  v = Arel::Nodes::Values.new(row, o.cols)
404
420
  len = v.expressions.length - 1
@@ -419,20 +435,20 @@ module ArelExtensions
419
435
  end
420
436
  else
421
437
  def visit_ArelExtensions_InsertManager_BulkValues o, collector
422
- collector << "("
438
+ collector << "("
423
439
  o.left.each_with_index do |row, idx|
424
- collector << " UNION ALL " if idx != 0
440
+ collector << " UNION ALL " if idx != 0
425
441
  collector << "(SELECT "
426
442
  v = Arel::Nodes::Values.new(row, o.cols)
427
443
  len = v.expressions.length - 1
428
444
  v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
429
- case value
430
- when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
431
- collector = visit value, collector
432
- else
433
- collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
434
- end
435
- collector << Arel::Visitors::Oracle::COMMA unless i == len
445
+ case value
446
+ when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
447
+ collector = visit value, collector
448
+ else
449
+ collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
450
+ end
451
+ collector << Arel::Visitors::Oracle::COMMA unless i == len
436
452
  }
437
453
  collector << ' FROM DUAL)'
438
454
  end
@@ -542,17 +558,17 @@ module ArelExtensions
542
558
  number = Arel::Nodes::NamedFunction.new('TO_CHAR',[
543
559
  Arel::Nodes.build_quoted(col.abs),
544
560
  Arel::Nodes.build_quoted('FM'+nines_before+comma_in_format+nines_after+'EEEE'),
545
- options
546
- ])
561
+ options
562
+ ])
547
563
  if o.type == 'e'
548
564
  number = number.replace('E','e')
549
565
  end
550
- else
566
+ else
551
567
  number = Arel::Nodes::NamedFunction.new('TO_CHAR',[
552
568
  Arel::Nodes.build_quoted(col.abs),
553
569
  Arel::Nodes.build_quoted('FM'+nines_before+comma_in_format+nines_after),
554
570
  options
555
- ])
571
+ ])
556
572
  end
557
573
 
558
574
  repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
@@ -71,13 +71,19 @@ module ArelExtensions
71
71
  def visit_ArelExtensions_Nodes_GroupConcat o, collector
72
72
  collector << "array_to_string(array_agg("
73
73
  collector = visit o.left, collector
74
+ if !o.orders.blank?
75
+ collector << ' ORDER BY '
76
+ o.orders.each_with_index do |order,i|
77
+ collector << Arel::Visitors::PostgreSQL::COMMA unless i == 0
78
+ collector = visit order, collector
79
+ end
80
+ end
74
81
  collector << ")"
82
+ collector << Arel::Visitors::PostgreSQL::COMMA
75
83
  if o.right && o.right != 'NULL'
76
- collector << Arel::Visitors::PostgreSQL::COMMA
77
84
  collector = visit o.right, collector
78
85
  else
79
- collector << Arel::Visitors::PostgreSQL::COMMA
80
- collector = visit Arel::Nodes.build_quoted(' '), collector
86
+ collector = visit Arel::Nodes.build_quoted(','), collector
81
87
  end
82
88
  collector << ")"
83
89
  collector
@@ -168,19 +174,19 @@ module ArelExtensions
168
174
  collector
169
175
  end
170
176
  end
171
-
172
- def visit_ArelExtensions_Nodes_Collate o, collector
173
- if o.ai
174
- collector << "unaccent("
175
- collector = visit o.expressions.first, collector
176
- collector << ")"
177
- elsif o.ci
178
- collector = visit o.expressions.first, collector
179
- else
180
- collector = visit o.expressions.first, collector
181
- end
177
+
178
+ def visit_ArelExtensions_Nodes_Collate o, collector
179
+ if o.ai
180
+ collector << "unaccent("
181
+ collector = visit o.expressions.first, collector
182
+ collector << ")"
183
+ elsif o.ci
184
+ collector = visit o.expressions.first, collector
185
+ else
186
+ collector = visit o.expressions.first, collector
187
+ end
182
188
  collector
183
- end
189
+ end
184
190
 
185
191
  def visit_ArelExtensions_Nodes_DateAdd o, collector
186
192
  collector = visit o.left, collector
@@ -92,6 +92,13 @@ module ArelExtensions
92
92
  collector
93
93
  end
94
94
 
95
+ def visit_ArelExtensions_Nodes_MD5 o, collector
96
+ collector << "MD5("
97
+ collector = visit o.left, collector
98
+ collector << ")"
99
+ collector
100
+ end
101
+
95
102
  def visit_ArelExtensions_Nodes_Length o, collector
96
103
  collector << "LENGTH("
97
104
  collector = visit o.left, collector
@@ -101,6 +101,8 @@ module ArelExtensions
101
101
  compile(c + 'test' + ' chain').must_be_like %{CONCAT(\"users\".\"name\", 'test chain')}
102
102
  compile(Arel::Nodes.build_quoted('test') + ' chain').must_be_like %{'test chain'}
103
103
  compile(c + '' + c).must_be_like %{CONCAT(\"users\".\"name\", \"users\".\"name\")}
104
+
105
+ compile(c.md5).must_be_like %{MD5(\"users\".\"name\")}
104
106
  end
105
107
 
106
108
  # Comparators
@@ -150,23 +150,19 @@ module ArelExtensions
150
150
 
151
151
  # String Functions
152
152
  def test_concat
153
- assert_equal 'Camille Camille', t(@camille, @name + ' ' + @name)
154
- assert_equal 'Laure 2', t(@laure, @name + ' ' + 2)
155
- assert_equal 'Test Laure', t(@laure, Arel::Nodes.build_quoted('Test ') + @name)
156
- skip "TODO: find a way... to do group_concat/listagg in SQL Server" if @env_db == 'mssql'
157
- if @env_db == 'postgresql'
158
- assert_equal "Lucas Sophie", t(User.reorder(nil).from(User.select(:name).where(:name => ['Lucas', 'Sophie']).reorder(:name).as('user_tests')), @name.group_concat(' '))
159
- assert_equal "Lucas,Sophie", t(User.reorder(nil).from(User.select(:name).where(:name => ['Lucas', 'Sophie']).reorder(:name).as('user_tests')), @name.group_concat(','))
160
- assert_equal "Lucas Sophie", t(User.reorder(nil).from(User.select(:name).where(:name => ['Lucas', 'Sophie']).reorder(:name).as('user_tests')), @name.group_concat)
161
- else
162
- assert_equal "Lucas Sophie", t(User.where(:name => ['Lucas', 'Sophie']).reorder(:name), @name.group_concat(' '))
163
- assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']).reorder(:name), @name.group_concat(','))
164
- if @env_db == 'oracle'
165
- assert_equal "LucasSophie", t(User.where(:name => ['Lucas', 'Sophie']).reorder(:name), @name.group_concat)
166
- else
167
- assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']).reorder(:name), @name.group_concat)
168
- end
169
- end
153
+ assert_equal 'Camille Camille', t(@camille, @name + ' ' + @name)
154
+ assert_equal 'Laure 2', t(@laure, @name + ' ' + 2)
155
+ assert_equal 'Test Laure', t(@laure, Arel::Nodes.build_quoted('Test ') + @name)
156
+
157
+ assert_equal "Lucas Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat(' '))
158
+ assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat(','))
159
+ assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat)
160
+
161
+ skip "No order in group_concat in SqlLite" if $sqlite
162
+ assert_equal "Arthur,Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.asc))
163
+ assert_equal "Sophie,Lucas,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.desc))
164
+ assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',[@score.asc,@name.asc]))
165
+ assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@score.asc,@name.asc))
170
166
  end
171
167
 
172
168
  def test_length
@@ -175,6 +171,12 @@ module ArelExtensions
175
171
  assert_equal 42, t(@laure, @name.length + 37)
176
172
  end
177
173
 
174
+ def test_md5
175
+ skip "Sqlite can't do md5" if $sqlite
176
+ assert_equal "e2cf99ca82a7e829d2a4ac85c48154d0", t(@camille, @name.md5)
177
+ assert_equal "c3d41bf5efb468a1bcce53bd53726c85", t(@lucas, @name.md5)
178
+ end
179
+
178
180
  def test_locate
179
181
  skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
180
182
  assert_equal 1, t(@camille, @name.locate("C"))
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arel_extensions
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.7
4
+ version: 1.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yann Azoury
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-01-29 00:00:00.000000000 Z
13
+ date: 2019-02-06 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: arel
@@ -142,6 +142,7 @@ files:
142
142
  - lib/arel_extensions/nodes/locate.rb
143
143
  - lib/arel_extensions/nodes/log10.rb
144
144
  - lib/arel_extensions/nodes/matches.rb
145
+ - lib/arel_extensions/nodes/md5.rb
145
146
  - lib/arel_extensions/nodes/power.rb
146
147
  - lib/arel_extensions/nodes/rand.rb
147
148
  - lib/arel_extensions/nodes/repeat.rb