arel_extensions 2.0.16 → 2.0.22

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
  SHA256:
3
- metadata.gz: d8c6d289ba78d7e49faf19e2cadd6b5a1fcf2bb93b091301c5a9acfb8504eceb
4
- data.tar.gz: b3d0fb5c72905e2ec3b4a73b6ee52212c6adf4fcbb5058e610e9696e2a5d7ad5
3
+ metadata.gz: 57188b98a348ea5dd72994ef0edb94cb386104cbd50d863b3cc465bb81499f8f
4
+ data.tar.gz: 7235c655967c8058e24f85f96b1a3ea93803dc759906ea24aff360edf28ee6fb
5
5
  SHA512:
6
- metadata.gz: 1f9d7e3cf6617d2b51db82177478e29e0694291838318e275ba6f7dad44fb7ce9f3fa5d3fecbe87c7d26c3c1b003e2b5543d220a22578dab7251f902e8deaed9
7
- data.tar.gz: eeaab7ea5e5f9a12268b750aa9c50dcb6d16d3706f08ed229ef4118ef8f225424f42b602d0539e2bc2797e2e2307883c1017f3ec83e971104a5d1fa0c443c39f
6
+ metadata.gz: c60be09bdf31efe2b4a953c0b097bbc461d01a4d7005c1dc190af20efb12e659d2331e16d8ca47527b9757b89a2528069fa1a8a94cfd52bc80000633995b229f
7
+ data.tar.gz: b028042975ab07e0d28e919278c36f2652fae79dbced3776e16519f4fdfaaf45de32a0a375cb7e77d5157775d2a3ef8555f9096299b2c71f366367e6452a93a6
@@ -33,6 +33,12 @@ class Arel::Nodes::Grouping
33
33
  include Arel::OrderPredications
34
34
  end
35
35
 
36
+ class Arel::Nodes::Ordering
37
+ def eql? other
38
+ self.hash.eql? other.hash
39
+ end
40
+ end
41
+
36
42
  class Arel::Nodes::Function
37
43
  include Arel::Math
38
44
  include Arel::Expressions
@@ -128,7 +134,11 @@ class Arel::Nodes::Function
128
134
 
129
135
  alias_method(:old_as, :as) rescue nil
130
136
  def as other
131
- Arel::Nodes::As.new(self, Arel.sql(other))
137
+ res = Arel::Nodes::As.new(self.clone, Arel.sql(other))
138
+ if Gem::Version.new(Arel::VERSION) >= Gem::Version.new("9.0.0")
139
+ self.alias = Arel.sql(other)
140
+ end
141
+ res
132
142
  end
133
143
  end
134
144
 
@@ -148,6 +158,9 @@ class Arel::Nodes::Unary
148
158
  include ArelExtensions::MathFunctions
149
159
  include ArelExtensions::Comparators
150
160
  include ArelExtensions::Predications
161
+ def eql? other
162
+ hash == other.hash
163
+ end
151
164
  end
152
165
 
153
166
  class Arel::Nodes::Binary
@@ -157,6 +170,9 @@ class Arel::Nodes::Binary
157
170
  include ArelExtensions::Comparators
158
171
  include ArelExtensions::BooleanFunctions
159
172
  include ArelExtensions::Predications
173
+ def eql? other
174
+ hash == other.hash
175
+ end
160
176
  end
161
177
 
162
178
  class Arel::Nodes::Equality
@@ -71,7 +71,11 @@ module ArelExtensions
71
71
  end
72
72
 
73
73
  def sum opts = {unbiased: true}
74
- ArelExtensions::Nodes::Sum.new self, **opts
74
+ if Gem::Version.new(Arel::VERSION) >= Gem::Version.new("9.0.0")
75
+ Arel::Nodes::Sum.new [self]
76
+ else
77
+ ArelExtensions::Nodes::Sum.new self, **opts
78
+ end
75
79
  end
76
80
 
77
81
  # function that can be invoked to produce random numbers between 0 and 1
@@ -21,7 +21,11 @@ module ArelExtensions
21
21
  end
22
22
 
23
23
  def as other
24
- Arel::Nodes::As.new(self, Arel.sql(other))
24
+ res = Arel::Nodes::As.new(self.clone, Arel.sql(other))
25
+ if Gem::Version.new(Arel::VERSION) >= Gem::Version.new("9.0.0")
26
+ self.alias = Arel.sql(other)
27
+ end
28
+ res
25
29
  end
26
30
 
27
31
  def expr
@@ -76,7 +80,7 @@ module ArelExtensions
76
80
  when ActiveSupport::Duration
77
81
  Arel.sql(object.to_i)
78
82
  when Array
79
- Arel::Nodes::Grouping.new(object.map{|r| convert_to_node(e)})
83
+ Arel::Nodes::Grouping.new(object.map{|e| convert_to_node(e)})
80
84
  else
81
85
  raise(ArgumentError, "#{object.class} cannot be converted to CONCAT arg")
82
86
  end
@@ -2,6 +2,12 @@ module ArelExtensions
2
2
  module Nodes
3
3
  class Length < Function
4
4
  RETURN_TYPE = :integer
5
+ attr_accessor :bytewise
6
+
7
+ def initialize(node, bytewise = true)
8
+ @bytewise = bytewise
9
+ super([node])
10
+ end
5
11
  end
6
12
  end
7
13
  end
@@ -24,9 +24,17 @@ module ArelExtensions
24
24
  ArelExtensions::Nodes::FindInSet.new [other, self]
25
25
  end
26
26
 
27
- # LENGTH function returns the length of the value in a text field.
27
+ # LENGTH function returns the length (bytewise) of the value in a text field.
28
28
  def length
29
- ArelExtensions::Nodes::Length.new [self]
29
+ ArelExtensions::Nodes::Length.new self, true
30
+ end
31
+
32
+ def byte_length
33
+ ArelExtensions::Nodes::Length.new self, true
34
+ end
35
+
36
+ def char_length
37
+ ArelExtensions::Nodes::Length.new self, false
30
38
  end
31
39
 
32
40
  # LOCATE function returns the first starting position of a string in another string.
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = "2.0.16".freeze
2
+ VERSION = "2.0.22".freeze
3
3
  end
@@ -155,7 +155,7 @@ module ArelExtensions
155
155
  end
156
156
 
157
157
  def visit_ArelExtensions_Nodes_Length o, collector
158
- collector << "LEN("
158
+ collector << "#{o.bytewise ? 'DATALENGTH' : 'LEN'}("
159
159
  collector = visit o.expr, collector
160
160
  collector << ")"
161
161
  collector
@@ -5,7 +5,7 @@ module ArelExtensions
5
5
  SPECIAL_CHARS = {"\t" => 'CHR(9)', "\n" => 'CHR(10)', "\r" => 'CHR(13)'}
6
6
  DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'IW', 'y' => 'YEAR', 'wd' => 'D', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
7
7
  DATE_FORMAT_DIRECTIVES = {
8
- '%Y' => 'IYYY', '%C' => 'CC', '%y' => 'YY', '%m' => 'MM', '%B' => 'Month', '%^B' => 'MONTH', '%b' => 'Mon', '%^b' => 'MON',
8
+ '%Y' => 'YYYY', '%C' => 'CC', '%y' => 'YY', '%m' => 'MM', '%B' => 'Month', '%^B' => 'MONTH', '%b' => 'Mon', '%^b' => 'MON',
9
9
  '%d' => 'DD', '%e' => 'FMDD', '%j' => 'DDD', '%w' => '', '%A' => 'Day', # day, weekday
10
10
  '%H' => 'HH24', '%k' => '', '%I' => 'HH', '%l' => '', '%P' => 'am', '%p' => 'AM', # hours
11
11
  '%M' => 'MI', '%S' => 'SS', '%L' => 'MS', '%N' => 'US', '%z' => 'tz' # seconds, subseconds
@@ -308,7 +308,7 @@ module ArelExtensions
308
308
  end
309
309
 
310
310
  def visit_ArelExtensions_Nodes_Length o, collector
311
- collector << "LENGTH("
311
+ collector << "LENGTH#{o.bytewise ? 'B' : ''}("
312
312
  collector = visit o.expr, collector
313
313
  collector << ")"
314
314
  collector
@@ -2,18 +2,6 @@ module ArelExtensions
2
2
  module Visitors
3
3
  Arel::Visitors.send(:remove_const,'Oracle12') if Arel::Visitors.const_defined?('Oracle12')
4
4
  Arel::Visitors.const_set('Oracle12',Class.new(Arel::Visitors::Oracle)).class_eval do
5
- def visit_Arel_Nodes_SelectStatement(o, collector)
6
- # Oracle does not allow LIMIT clause with select for update
7
- if o.limit && o.lock
8
- raise ArgumentError, <<-MSG
9
- 'Combination of limit and lock is not supported.
10
- because generated SQL statements
11
- `SELECT FOR UPDATE and FETCH FIRST n ROWS` generates ORA-02014.`
12
- MSG
13
- end
14
-
15
- super
16
- end
17
5
 
18
6
  def visit_Arel_Nodes_SelectOptions(o, collector)
19
7
  collector = maybe_visit o.offset, collector
@@ -7,7 +7,7 @@ module ArelExtensions
7
7
  }.freeze
8
8
 
9
9
  DATE_FORMAT_DIRECTIVES = {
10
- '%Y' => 'IYYY', '%C' => 'CC', '%y' => 'YY',
10
+ '%Y' => 'YYYY', '%C' => 'CC', '%y' => 'YY',
11
11
  '%m' => 'MM', '%B' => 'Month', '%^B' => 'MONTH', '%b' => 'Mon', '%^b' => 'MON',
12
12
  '%d' => 'DD', '%e' => 'FMDD', '%j' => 'DDD', '%w' => '', '%A' => 'Day', # day, weekday
13
13
  '%H' => 'HH24', '%k' => '', '%I' => 'HH', '%l' => '', '%P' => 'am', '%p' => 'AM', # hours
@@ -117,7 +117,7 @@ module ArelExtensions
117
117
  end
118
118
 
119
119
  def visit_ArelExtensions_Nodes_Length o, collector
120
- collector << "LENGTH("
120
+ collector << "#{o.bytewise ? '' : 'CHAR_'}LENGTH("
121
121
  collector = visit o.left, collector
122
122
  collector << ")"
123
123
  collector
@@ -348,6 +348,9 @@ module ArelExtensions
348
348
  # override
349
349
  remove_method(:visit_Arel_Nodes_As) rescue nil # if Arel::Visitors::ToSql.method_defined?(:visit_Arel_Nodes_As)
350
350
  def visit_Arel_Nodes_As o, collector
351
+ if o.left.respond_to?(:alias)
352
+ o.left.alias = nil
353
+ end
351
354
  if o.left.is_a?(Arel::Nodes::Binary)
352
355
  collector << '('
353
356
  collector = visit o.left, collector
@@ -162,6 +162,12 @@ module ArelExtensions
162
162
  end
163
163
  end
164
164
 
165
+ def test_aggregation_with_ar_calculation
166
+ # Since Arel10 (Rails6.1), some unwanted behaviors on aggregated calculation were present.
167
+ # This should works no matter which version of rails is used
168
+ assert User.group(:score).average(:id).values.all?{|e| !e.nil?}
169
+ end
170
+
165
171
  # String Functions
166
172
  def test_concat
167
173
  assert_equal 'Camille Camille', t(@camille, @name + ' ' + @name)
data/version_v1.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = "1.2.19".freeze
2
+ VERSION = "1.2.25".freeze
3
3
  end
data/version_v2.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = "2.0.16".freeze
2
+ VERSION = "2.0.22".freeze
3
3
  end
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: 2.0.16
4
+ version: 2.0.22
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: 2021-01-07 00:00:00.000000000 Z
13
+ date: 2021-04-21 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -222,7 +222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
222
222
  - !ruby/object:Gem::Version
223
223
  version: '0'
224
224
  requirements: []
225
- rubygems_version: 3.0.6
225
+ rubygems_version: 3.1.2
226
226
  signing_key:
227
227
  specification_version: 4
228
228
  summary: Extending Arel