arel_extensions 2.0.21 → 2.2.2

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 (138) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -2
  3. data/.github/workflows/publish.yml +29 -0
  4. data/.github/workflows/release.yml +30 -0
  5. data/.github/workflows/ruby.yml +377 -80
  6. data/.gitignore +7 -6
  7. data/.rubocop.yml +62 -1
  8. data/CONTRIBUTING.md +102 -0
  9. data/Gemfile +2 -23
  10. data/NEWS.md +89 -0
  11. data/README.md +228 -84
  12. data/Rakefile +11 -4
  13. data/TODO +0 -1
  14. data/appveyor.yml +60 -22
  15. data/arel_extensions.gemspec +11 -12
  16. data/bin/build +15 -0
  17. data/bin/compose +6 -0
  18. data/bin/publish +8 -0
  19. data/dev/arelx.dockerfile +44 -0
  20. data/dev/compose.yaml +71 -0
  21. data/dev/postgres.dockerfile +5 -0
  22. data/dev/rbenv +189 -0
  23. data/gemfiles/rails3.gemfile +10 -10
  24. data/gemfiles/rails4_2.gemfile +38 -0
  25. data/gemfiles/rails5.gemfile +29 -0
  26. data/gemfiles/rails5_1_4.gemfile +13 -13
  27. data/gemfiles/rails5_2.gemfile +16 -14
  28. data/gemfiles/rails6.gemfile +18 -15
  29. data/gemfiles/rails6_1.gemfile +18 -15
  30. data/gemfiles/rails7.gemfile +33 -0
  31. data/gemfiles/rails7_1.gemfile +33 -0
  32. data/gemfiles/rails7_2.gemfile +33 -0
  33. data/gemspecs/arel_extensions-v1.gemspec +12 -13
  34. data/gemspecs/arel_extensions-v2.gemspec +11 -12
  35. data/init/mssql.sql +0 -0
  36. data/init/mysql.sql +0 -0
  37. data/init/oracle.sql +0 -0
  38. data/init/postgresql.sql +0 -0
  39. data/init/sqlite.sql +0 -0
  40. data/lib/arel_extensions/aliases.rb +14 -0
  41. data/lib/arel_extensions/attributes.rb +10 -2
  42. data/lib/arel_extensions/boolean_functions.rb +2 -4
  43. data/lib/arel_extensions/common_sql_functions.rb +12 -12
  44. data/lib/arel_extensions/comparators.rb +14 -14
  45. data/lib/arel_extensions/date_duration.rb +14 -9
  46. data/lib/arel_extensions/helpers.rb +62 -0
  47. data/lib/arel_extensions/insert_manager.rb +19 -17
  48. data/lib/arel_extensions/math.rb +48 -45
  49. data/lib/arel_extensions/math_functions.rb +18 -18
  50. data/lib/arel_extensions/nodes/abs.rb +0 -0
  51. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -0
  52. data/lib/arel_extensions/nodes/blank.rb +1 -1
  53. data/lib/arel_extensions/nodes/case.rb +10 -12
  54. data/lib/arel_extensions/nodes/cast.rb +6 -6
  55. data/lib/arel_extensions/nodes/ceil.rb +0 -0
  56. data/lib/arel_extensions/nodes/change_case.rb +0 -0
  57. data/lib/arel_extensions/nodes/coalesce.rb +1 -1
  58. data/lib/arel_extensions/nodes/collate.rb +9 -9
  59. data/lib/arel_extensions/nodes/concat.rb +2 -2
  60. data/lib/arel_extensions/nodes/date_diff.rb +33 -14
  61. data/lib/arel_extensions/nodes/duration.rb +0 -0
  62. data/lib/arel_extensions/nodes/find_in_set.rb +0 -0
  63. data/lib/arel_extensions/nodes/floor.rb +0 -0
  64. data/lib/arel_extensions/nodes/format.rb +3 -2
  65. data/lib/arel_extensions/nodes/formatted_date.rb +42 -0
  66. data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
  67. data/lib/arel_extensions/nodes/function.rb +22 -26
  68. data/lib/arel_extensions/nodes/is_null.rb +0 -0
  69. data/lib/arel_extensions/nodes/json.rb +15 -9
  70. data/lib/arel_extensions/nodes/length.rb +6 -0
  71. data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
  72. data/lib/arel_extensions/nodes/locate.rb +1 -1
  73. data/lib/arel_extensions/nodes/log10.rb +0 -0
  74. data/lib/arel_extensions/nodes/matches.rb +1 -1
  75. data/lib/arel_extensions/nodes/md5.rb +0 -0
  76. data/lib/arel_extensions/nodes/power.rb +0 -0
  77. data/lib/arel_extensions/nodes/rand.rb +0 -0
  78. data/lib/arel_extensions/nodes/repeat.rb +2 -2
  79. data/lib/arel_extensions/nodes/replace.rb +2 -10
  80. data/lib/arel_extensions/nodes/rollup.rb +36 -0
  81. data/lib/arel_extensions/nodes/round.rb +0 -0
  82. data/lib/arel_extensions/nodes/select.rb +10 -0
  83. data/lib/arel_extensions/nodes/soundex.rb +2 -2
  84. data/lib/arel_extensions/nodes/std.rb +0 -0
  85. data/lib/arel_extensions/nodes/substring.rb +1 -1
  86. data/lib/arel_extensions/nodes/sum.rb +0 -0
  87. data/lib/arel_extensions/nodes/then.rb +1 -1
  88. data/lib/arel_extensions/nodes/trim.rb +2 -2
  89. data/lib/arel_extensions/nodes/union.rb +5 -5
  90. data/lib/arel_extensions/nodes/union_all.rb +4 -4
  91. data/lib/arel_extensions/nodes/wday.rb +0 -0
  92. data/lib/arel_extensions/nodes.rb +0 -0
  93. data/lib/arel_extensions/null_functions.rb +16 -0
  94. data/lib/arel_extensions/predications.rb +10 -10
  95. data/lib/arel_extensions/railtie.rb +1 -1
  96. data/lib/arel_extensions/set_functions.rb +3 -3
  97. data/lib/arel_extensions/string_functions.rb +19 -10
  98. data/lib/arel_extensions/tasks.rb +2 -2
  99. data/lib/arel_extensions/version.rb +1 -1
  100. data/lib/arel_extensions/visitors/convert_format.rb +0 -0
  101. data/lib/arel_extensions/visitors/ibm_db.rb +20 -20
  102. data/lib/arel_extensions/visitors/mssql.rb +394 -169
  103. data/lib/arel_extensions/visitors/mysql.rb +238 -151
  104. data/lib/arel_extensions/visitors/oracle.rb +170 -131
  105. data/lib/arel_extensions/visitors/oracle12.rb +16 -16
  106. data/lib/arel_extensions/visitors/postgresql.rb +170 -140
  107. data/lib/arel_extensions/visitors/sqlite.rb +88 -87
  108. data/lib/arel_extensions/visitors/to_sql.rb +185 -156
  109. data/lib/arel_extensions/visitors.rb +73 -60
  110. data/lib/arel_extensions.rb +173 -36
  111. data/test/arelx_test_helper.rb +49 -1
  112. data/test/database.yml +13 -7
  113. data/test/real_db_test.rb +101 -83
  114. data/test/support/fake_record.rb +8 -2
  115. data/test/test_comparators.rb +5 -5
  116. data/test/visitors/test_bulk_insert_oracle.rb +5 -5
  117. data/test/visitors/test_bulk_insert_sqlite.rb +5 -5
  118. data/test/visitors/test_bulk_insert_to_sql.rb +5 -5
  119. data/test/visitors/test_oracle.rb +14 -14
  120. data/test/visitors/test_to_sql.rb +121 -93
  121. data/test/with_ar/all_agnostic_test.rb +630 -320
  122. data/test/with_ar/insert_agnostic_test.rb +25 -18
  123. data/test/with_ar/test_bulk_sqlite.rb +11 -7
  124. data/test/with_ar/test_math_sqlite.rb +18 -14
  125. data/test/with_ar/test_string_mysql.rb +26 -22
  126. data/test/with_ar/test_string_sqlite.rb +26 -22
  127. data/version_v1.rb +1 -1
  128. data/version_v2.rb +1 -1
  129. metadata +24 -26
  130. data/.travis/oracle/download.js +0 -152
  131. data/.travis/oracle/download.sh +0 -30
  132. data/.travis/oracle/download_ojdbc.js +0 -116
  133. data/.travis/oracle/install.sh +0 -34
  134. data/.travis/setup_accounts.sh +0 -9
  135. data/.travis/sqlite3/extension-functions.sh +0 -6
  136. data/.travis.yml +0 -193
  137. data/gemfiles/rails4.gemfile +0 -29
  138. data/gemfiles/rails5_0.gemfile +0 -29
@@ -22,14 +22,14 @@ module ArelExtensions
22
22
 
23
23
  def as other
24
24
  res = Arel::Nodes::As.new(self.clone, Arel.sql(other))
25
- if Gem::Version.new(Arel::VERSION) >= Gem::Version.new("9.0.0")
25
+ if Gem::Version.new(Arel::VERSION) >= Gem::Version.new('9.0.0')
26
26
  self.alias = Arel.sql(other)
27
27
  end
28
28
  res
29
29
  end
30
30
 
31
31
  def expr
32
- @expressions.first
32
+ @expressions.first
33
33
  end
34
34
 
35
35
  def left
@@ -41,21 +41,17 @@ module ArelExtensions
41
41
  end
42
42
 
43
43
  def ==(other)
44
- Arel::Nodes::Equality.new self, Arel::Nodes.build_quoted(other, self)
44
+ Arel::Nodes::Equality.new self, Arel.quoted(other, self)
45
45
  end
46
46
 
47
47
  def !=(other)
48
- Arel::Nodes::NotEqual.new self, Arel::Nodes.build_quoted(other, self)
48
+ Arel::Nodes::NotEqual.new self, Arel.quoted(other, self)
49
49
  end
50
50
 
51
51
  def type_of_attribute(att)
52
52
  case att
53
53
  when Arel::Attributes::Attribute
54
- begin
55
- Arel::Table.engine.connection.schema_cache.columns_hash(att.relation.table_name)[att.name.to_s].type
56
- rescue
57
- att
58
- end
54
+ Arel.column_of(att.relation.table_name, att.name.to_s)&.type || att
59
55
  when ArelExtensions::Nodes::Function
60
56
  att.return_type
61
57
  # else
@@ -68,19 +64,19 @@ module ArelExtensions
68
64
  when Arel::Attributes::Attribute, Arel::Nodes::Node, Integer
69
65
  object
70
66
  when DateTime
71
- Arel::Nodes.build_quoted(object, self)
67
+ Arel.quoted(object, self)
72
68
  when Time
73
- Arel::Nodes.build_quoted(object.strftime('%H:%M:%S'), self)
69
+ Arel.quoted(object.strftime('%H:%M:%S'), self)
74
70
  when MBSTRING, String, Symbol
75
- Arel::Nodes.build_quoted(object.to_s)
71
+ Arel.quoted(object.to_s)
76
72
  when Date
77
- Arel::Nodes.build_quoted(object.to_s, self)
73
+ Arel.quoted(object.to_s, self)
78
74
  when NilClass
79
75
  Arel.sql('NULL')
80
76
  when ActiveSupport::Duration
81
77
  Arel.sql(object.to_i)
82
78
  when Array
83
- Arel::Nodes::Grouping.new(object.map{|e| convert_to_node(e)})
79
+ Arel.grouping(object.map{|e| convert_to_node(e)})
84
80
  else
85
81
  raise(ArgumentError, "#{object.class} cannot be converted to CONCAT arg")
86
82
  end
@@ -91,7 +87,7 @@ module ArelExtensions
91
87
  when Arel::Nodes::Node
92
88
  object
93
89
  when Integer
94
- Arel::Nodes.build_quoted(object.to_s)
90
+ Arel.quoted(object.to_s)
95
91
  when Arel::Attributes::Attribute
96
92
  case self.type_of_attribute(object)
97
93
  when :date
@@ -102,17 +98,17 @@ module ArelExtensions
102
98
  object
103
99
  end
104
100
  when DateTime
105
- Arel::Nodes.build_quoted(object, self)
101
+ Arel.quoted(object, self)
106
102
  when Time
107
- Arel::Nodes.build_quoted(object.strftime('%H:%M:%S'), self)
103
+ Arel.quoted(object.strftime('%H:%M:%S'), self)
108
104
  when MBSTRING, String
109
- Arel::Nodes.build_quoted(object.to_s)
105
+ Arel.quoted(object.to_s)
110
106
  when Date
111
- Arel::Nodes.build_quoted(object, self)
107
+ Arel.quoted(object, self)
112
108
  when NilClass
113
109
  Arel.sql(nil)
114
110
  when ActiveSupport::Duration
115
- Arel::Nodes.build_quoted(object.to_i.to_s)
111
+ Arel.quoted(object.to_i.to_s)
116
112
  else
117
113
  raise(ArgumentError, "#{object.class} cannot be converted to CONCAT arg")
118
114
  end
@@ -123,11 +119,11 @@ module ArelExtensions
123
119
  when Arel::Attributes::Attribute, Arel::Nodes::Node
124
120
  object
125
121
  when DateTime, Time
126
- Arel::Nodes.build_quoted(Date.new(object.year, object.month, object.day), self)
122
+ Arel.quoted(Date.new(object.year, object.month, object.day), self)
127
123
  when MBSTRING, String
128
- Arel::Nodes.build_quoted(Date.parse(object.to_s), self)
124
+ Arel.quoted(Date.parse(object.to_s), self)
129
125
  when Date
130
- Arel::Nodes.build_quoted(object, self)
126
+ Arel.quoted(object, self)
131
127
  else
132
128
  raise(ArgumentError, "#{object.class} cannot be converted to Date")
133
129
  end
@@ -138,11 +134,11 @@ module ArelExtensions
138
134
  when Arel::Attributes::Attribute, Arel::Nodes::Node
139
135
  object
140
136
  when DateTime, Time
141
- Arel::Nodes.build_quoted(object, self)
137
+ Arel.quoted(object, self)
142
138
  when MBSTRING, String
143
- Arel::Nodes.build_quoted(Time.parse(object.to_s), self)
139
+ Arel.quoted(Time.parse(object.to_s), self)
144
140
  when Date
145
- Arel::Nodes.build_quoted(Time.utc(object.year, object.month, object.day, 0, 0, 0), self)
141
+ Arel.quoted(Time.utc(object.year, object.month, object.day, 0, 0, 0), self)
146
142
  else
147
143
  raise(ArgumentError, "#{object.class} cannot be converted to Datetime")
148
144
  end
File without changes
@@ -11,15 +11,19 @@ module ArelExtensions
11
11
  end
12
12
 
13
13
  def get key
14
- JsonGet.new(self,key)
14
+ JsonGet.new(self, key)
15
15
  end
16
16
 
17
17
  def set key, value
18
- JsonSet.new(self,key,value)
18
+ JsonSet.new(self, key, value)
19
19
  end
20
20
 
21
- def group as_array = true, orders = nil
22
- JsonGroup.new(self,as_array, orders)
21
+ def group as_array = true, orders = nil, distinct: false
22
+ if distinct
23
+ JsonGroup.new(Arel::Nodes::NamedFunction.new('DISTINCT', [self]), as_array, orders)
24
+ else
25
+ JsonGroup.new(self, as_array, orders)
26
+ end
23
27
  end
24
28
 
25
29
  def hash
@@ -32,21 +36,23 @@ module ArelExtensions
32
36
  n.dict
33
37
  when Array
34
38
  n.map{|e|
35
- (e.is_a?(Array) || e.is_a?(Hash)) ? Json.new(e) : convert_to_json_node(e)
39
+ (e.is_a?(Array) || e.is_a?(Hash)) ? Json.new(e) : convert_to_json_node(e)
36
40
  }
37
41
  when Hash
38
- n.reduce({}){|acc,v|
42
+ n.reduce({}){|acc, v|
39
43
  acc[convert_to_json_node(v[0])] = (v[1].is_a?(Array) || v[1].is_a?(Hash)) ? Json.new(v[1]) : convert_to_json_node(v[1])
40
44
  acc
41
45
  }
42
46
  when String, Numeric, TrueClass, FalseClass
43
47
  convert_to_node(n)
44
48
  when Date
45
- convert_to_node(n.strftime("%Y-%m-%d"))
49
+ convert_to_node(n.strftime('%Y-%m-%d'))
46
50
  when DateTime, Time
47
- convert_to_node(n.strftime("%Y-%m-%dT%H:%M:%S.%L%:z"))
51
+ convert_to_node(n.strftime('%Y-%m-%dT%H:%M:%S.%L%:z'))
48
52
  when NilClass
49
- Arel.sql('null')
53
+ Arel.null
54
+ when Arel::SelectManager
55
+ Arel.grouping(n)
50
56
  else
51
57
  convert_to_node(n)
52
58
  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
@@ -4,7 +4,7 @@ module ArelExtensions
4
4
  RETURN_TYPE = :number
5
5
 
6
6
  def initialize expr
7
- super [convert_to_node(expr.first), Arel::Nodes.build_quoted(expr[1])]
7
+ super [convert_to_node(expr.first), Arel.quoted(expr[1])]
8
8
  end
9
9
  end
10
10
  end
@@ -7,7 +7,7 @@ module ArelExtensions
7
7
  tab = expr.map do |arg|
8
8
  convert_to_node(arg)
9
9
  end
10
- return super(tab)
10
+ super(tab)
11
11
  end
12
12
  end
13
13
  end
File without changes
@@ -4,7 +4,7 @@ module ArelExtensions
4
4
  attr_accessor :case_sensitive if Arel::VERSION.to_i < 7
5
5
 
6
6
  def initialize(left, right, escape = nil)
7
- r = Arel::Nodes.build_quoted(right)
7
+ r = Arel.quoted(right)
8
8
  if Arel::VERSION.to_i < 7 # managed by default in version 7+ (rails 5), so useful for rails 3 & 4
9
9
  super(left, r, escape)
10
10
  @case_sensitive = false
File without changes
File without changes
File without changes
@@ -7,11 +7,11 @@ module ArelExtensions
7
7
  tab = expr.map { |arg|
8
8
  convert_to_node(arg)
9
9
  }
10
- return super(tab)
10
+ super(tab)
11
11
  end
12
12
 
13
13
  def +(other)
14
- return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
14
+ ArelExtensions::Nodes::Concat.new(self.expressions + [other])
15
15
  end
16
16
  end
17
17
  end
@@ -8,11 +8,7 @@ module ArelExtensions
8
8
  @left = convert_to_node(left)
9
9
  @pattern = convert_to_node(pattern)
10
10
  @substitute = convert_to_node(substitute)
11
- super([@left,@pattern,@substitute])
12
- end
13
-
14
- def +(other)
15
- return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
11
+ super([@left, @pattern, @substitute])
16
12
  end
17
13
  end
18
14
 
@@ -24,11 +20,7 @@ module ArelExtensions
24
20
  @left = convert_to_node(left)
25
21
  @pattern = (pattern.is_a?(Regexp) ? pattern : %r[#{pattern}])
26
22
  @substitute = convert_to_node(substitute)
27
- super([@left,@pattern,@substitute])
28
- end
29
-
30
- def +(other)
31
- return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
23
+ super([@left, @pattern, @substitute])
32
24
  end
33
25
  end
34
26
  end
@@ -0,0 +1,36 @@
1
+ # The following is a patch to activerecord when it doesn't
2
+ # have RollUp defined, i.e. for rails < 5.2
3
+
4
+ begin
5
+ Arel::Nodes.const_get('RollUp')
6
+ rescue NameError => e
7
+ module Arel
8
+ module Nodes
9
+ class RollUp < Arel::Nodes::Unary
10
+ end
11
+ end
12
+ end
13
+
14
+ module Arel
15
+ module Visitors
16
+ class PostgreSQL
17
+ # Utilized by GroupingSet, Cube & RollUp visitors to
18
+ # handle grouping aggregation semantics
19
+ def grouping_array_or_grouping_element(o, collector)
20
+ if o.expr.is_a? Array
21
+ collector << "( "
22
+ visit o.expr, collector
23
+ collector << " )"
24
+ else
25
+ visit o.expr, collector
26
+ end
27
+ end
28
+
29
+ def visit_Arel_Nodes_RollUp(o, collector)
30
+ collector << "ROLLUP"
31
+ grouping_array_or_grouping_element o, collector
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
File without changes
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ class SelectCore
4
+ # havings did not exist in rails < 5.2
5
+ if !method_defined?(:havings)
6
+ alias :havings :having
7
+ end
8
+ end
9
+ end
10
+ end
@@ -7,11 +7,11 @@ module ArelExtensions
7
7
  RETURN_TYPE = :string
8
8
 
9
9
  def ==(other)
10
- Arel::Nodes::Equality.new self, Arel::Nodes.build_quoted(other, self)
10
+ Arel::Nodes::Equality.new self, Arel.quoted(other, self)
11
11
  end
12
12
 
13
13
  def !=(other)
14
- Arel::Nodes::NotEqual.new self, Arel::Nodes.build_quoted(other, self)
14
+ Arel::Nodes::NotEqual.new self, Arel.quoted(other, self)
15
15
  end
16
16
  end
17
17
  end
File without changes
@@ -8,7 +8,7 @@ module ArelExtensions
8
8
  if expr[2]
9
9
  tab << convert_to_node(expr[2])
10
10
  end
11
- return super(tab)
11
+ super(tab)
12
12
  end
13
13
  end
14
14
  end
File without changes
@@ -5,7 +5,7 @@ module ArelExtensions
5
5
  tab = expr.map { |arg|
6
6
  convert_to_node(arg)
7
7
  }
8
- return super(tab)
8
+ super(tab)
9
9
  end
10
10
  end
11
11
  end
@@ -7,11 +7,11 @@ module ArelExtensions
7
7
  tab = expr.map { |arg|
8
8
  convert_to_node(arg)
9
9
  }
10
- return super(tab)
10
+ super(tab)
11
11
  end
12
12
 
13
13
  def +(other)
14
- return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
14
+ ArelExtensions::Nodes::Concat.new(self.expressions + [other])
15
15
  end
16
16
  end
17
17
 
@@ -1,20 +1,20 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
3
  class Union < Arel::Nodes::Union
4
- def initialize left,right
5
- return super(left,right)
4
+ def initialize left, right
5
+ super(left, right)
6
6
  end
7
7
 
8
8
  def +(other)
9
- return ArelExtensions::Nodes::Union.new(self,other)
9
+ ArelExtensions::Nodes::Union.new(self, other)
10
10
  end
11
11
 
12
12
  def union(other)
13
- return ArelExtensions::Nodes::UnionAll.new(self,other)
13
+ ArelExtensions::Nodes::UnionAll.new(self, other)
14
14
  end
15
15
 
16
16
  def as other
17
- Arel::Nodes::TableAlias.new Arel::Nodes::Grouping.new(self), Arel::Nodes::SqlLiteral.new(other.to_s)
17
+ Arel::Nodes::TableAlias.new Arel.grouping(self), Arel::Nodes::SqlLiteral.new(other.to_s)
18
18
  end
19
19
  end
20
20
  end
@@ -1,16 +1,16 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
3
  class UnionAll < Arel::Nodes::UnionAll
4
- def initialize left,right
5
- return super(left,right)
4
+ def initialize left, right
5
+ super(left, right)
6
6
  end
7
7
 
8
8
  def union_all(other)
9
- return ArelExtensions::Nodes::UnionAll.new(self,other)
9
+ ArelExtensions::Nodes::UnionAll.new(self, other)
10
10
  end
11
11
 
12
12
  def as other
13
- Arel::Nodes::TableAlias.new Arel::Nodes::Grouping.new(self), Arel::Nodes::SqlLiteral.new(other.to_s)
13
+ Arel::Nodes::TableAlias.new Arel.grouping(self), Arel::Nodes::SqlLiteral.new(other.to_s)
14
14
  end
15
15
  end
16
16
  end
File without changes
File without changes
@@ -3,6 +3,12 @@ require 'arel_extensions/nodes/is_null'
3
3
 
4
4
  module ArelExtensions
5
5
  module NullFunctions
6
+
7
+ # if_present returns nil if the the value is nil or blank
8
+ def if_present
9
+ Arel.when(self.cast(:string).present).then(self)
10
+ end
11
+
6
12
  # ISNULL function lets you return an alternative value when an expression is NULL.
7
13
  def is_null
8
14
  ArelExtensions::Nodes::IsNull.new [self]
@@ -19,5 +25,15 @@ module ArelExtensions
19
25
  args.unshift(self)
20
26
  ArelExtensions::Nodes::Coalesce.new args
21
27
  end
28
+
29
+ def coalesce_blank *args
30
+ res = Arel.when(self.cast(:string).present).then(self)
31
+ args[0...-1].each do |a|
32
+ val = a.is_a?(Arel::Nodes::Node) ? a : Arel.quoted(a)
33
+ res = res.when(val.present).then(a)
34
+ end
35
+ res = res.else(args[-1])
36
+ res
37
+ end
22
38
  end
23
39
  end
@@ -1,14 +1,14 @@
1
1
  module ArelExtensions
2
2
  module Predications
3
3
  def when right, expression = nil
4
- ArelExtensions::Nodes::Case.new(self).when(right,expression)
4
+ ArelExtensions::Nodes::Case.new(self).when(right, expression)
5
5
  end
6
6
 
7
- def matches(other, escape = nil,case_sensitive = nil)
7
+ def matches(other, escape = nil, case_sensitive = nil)
8
8
  if Arel::VERSION.to_i < 7
9
- Arel::Nodes::Matches.new(self, Arel::Nodes.build_quoted(other), escape)
9
+ Arel::Nodes::Matches.new(self, Arel.quoted(other), escape)
10
10
  else
11
- Arel::Nodes::Matches.new(self, Arel::Nodes.build_quoted(other), escape, case_sensitive)
11
+ Arel::Nodes::Matches.new(self, Arel.quoted(other), escape, case_sensitive)
12
12
  end
13
13
  end
14
14
 
@@ -17,7 +17,7 @@ module ArelExtensions
17
17
  end
18
18
 
19
19
  def cast right
20
- ArelExtensions::Nodes::Cast.new([self,right])
20
+ ArelExtensions::Nodes::Cast.new([self, right])
21
21
  end
22
22
 
23
23
  def in(*other) # In should handle nil element in the Array
@@ -72,7 +72,7 @@ module ArelExtensions
72
72
  when Arel::SelectManager
73
73
  Arel::Nodes::NotIn.new(self, other.ast)
74
74
  else
75
- Arel::Nodes::NotIn.new(self,quoted_node(other))
75
+ Arel::Nodes::NotIn.new(self, quoted_node(other))
76
76
  end
77
77
  end
78
78
 
@@ -81,13 +81,13 @@ module ArelExtensions
81
81
  when Arel::Attributes::Attribute, Arel::Nodes::Node, Integer
82
82
  object
83
83
  when DateTime
84
- Arel::Nodes.build_quoted(object, self)
84
+ Arel.quoted(object, self)
85
85
  when Time
86
- Arel::Nodes.build_quoted(object.strftime('%H:%M:%S'), self)
86
+ Arel.quoted(object.strftime('%H:%M:%S'), self)
87
87
  when String
88
- Arel::Nodes.build_quoted(object)
88
+ Arel.quoted(object)
89
89
  when Date
90
- Arel::Nodes.build_quoted(object.to_s, self)
90
+ Arel.quoted(object.to_s, self)
91
91
  when NilClass
92
92
  Arel.sql('NULL')
93
93
  when ActiveSupport::Duration
@@ -3,7 +3,7 @@ require 'rails'
3
3
  module ArelExtensions
4
4
  class Railtie < Rails::Railtie
5
5
  rake_tasks do
6
- load 'arel_extensions/tasks.rb'
6
+ load 'arel_extensions/tasks.rb'
7
7
  end
8
8
  end
9
9
  end
@@ -4,15 +4,15 @@ require 'arel_extensions/nodes/union_all'
4
4
  module ArelExtensions
5
5
  module SetFunctions
6
6
  def +(other)
7
- ArelExtensions::Nodes::Union.new(self,other)
7
+ ArelExtensions::Nodes::Union.new(self, other)
8
8
  end
9
9
 
10
10
  def union(other)
11
- ArelExtensions::Nodes::Union.new(self,other)
11
+ ArelExtensions::Nodes::Union.new(self, other)
12
12
  end
13
13
 
14
14
  def union_all(other)
15
- ArelExtensions::Nodes::UnionAll.new(self,other)
15
+ ArelExtensions::Nodes::UnionAll.new(self, other)
16
16
  end
17
17
 
18
18
  def uniq
@@ -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.
@@ -93,27 +101,27 @@ module ArelExtensions
93
101
  end
94
102
 
95
103
  def ai_matches other # accent insensitive & case sensitive
96
- ArelExtensions::Nodes::AiMatches.new(self,other)
104
+ ArelExtensions::Nodes::AiMatches.new(self, other)
97
105
  end
98
106
 
99
107
  def ai_imatches other # accent insensitive & case insensitive
100
- ArelExtensions::Nodes::AiIMatches.new(self,other)
108
+ ArelExtensions::Nodes::AiIMatches.new(self, other)
101
109
  end
102
110
 
103
111
  def smatches other # accent sensitive & case sensitive
104
- ArelExtensions::Nodes::SMatches.new(self,other)
112
+ ArelExtensions::Nodes::SMatches.new(self, other)
105
113
  end
106
114
 
107
115
  def ai_collate
108
- ArelExtensions::Nodes::Collate.new(self,nil,true,false)
116
+ ArelExtensions::Nodes::Collate.new(self, nil, true, false)
109
117
  end
110
118
 
111
119
  def ci_collate
112
- ArelExtensions::Nodes::Collate.new(self,nil,false,true)
120
+ ArelExtensions::Nodes::Collate.new(self, nil, false, true)
113
121
  end
114
122
 
115
- def collate ai = false,ci = false, option = nil
116
- ArelExtensions::Nodes::Collate.new(self,option,ai,ci)
123
+ def collate ai = false, ci = false, option = nil
124
+ ArelExtensions::Nodes::Collate.new(self, option, ai, ci)
117
125
  end
118
126
 
119
127
  # REPLACE function replaces a sequence of characters in a string with another set of characters, not case-sensitive.
@@ -136,7 +144,7 @@ module ArelExtensions
136
144
  # concat elements of a group, separated by sep and ordered by a list of Ascending or Descending
137
145
  def group_concat(sep = nil, *orders, group: nil, order: nil)
138
146
  if orders.present?
139
- warn("Warning : ArelExtensions: group_concat: you should now use the kwarg 'order' to specify an order in the group_concat.")
147
+ warn("Warning: ArelExtensions: group_concat: you should now use the kwarg 'order' to specify an order in the group_concat.")
140
148
  end
141
149
  order_tabs = [orders].flatten.map{ |o|
142
150
  if o.is_a?(Arel::Nodes::Ascending) || o.is_a?(Arel::Nodes::Descending)
@@ -176,6 +184,7 @@ module ArelExtensions
176
184
  def not_blank
177
185
  ArelExtensions::Nodes::NotBlank.new [self]
178
186
  end
187
+ alias present not_blank
179
188
 
180
189
  def repeat other = 1
181
190
  ArelExtensions::Nodes::Repeat.new [self, other]
@@ -1,8 +1,8 @@
1
1
  namespace :arel_extensions do
2
2
  desc 'Install DB functions into current DB'
3
3
  task install_functions: :environment do
4
- @env_db = if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx") || (RUBY_PLATFORM == 'java')) # not supported
5
- (RUBY_PLATFORM == 'java' ? "jdbc-sqlite" : 'sqlite')
4
+ @env_db = if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx') || (RUBY_PLATFORM == 'java')) # not supported
5
+ (RUBY_PLATFORM == 'java' ? 'jdbc-sqlite' : 'sqlite')
6
6
  else
7
7
  ENV['DB'] || ActiveRecord::Base.connection.adapter_name
8
8
  end
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = "2.0.21".freeze
2
+ VERSION = '2.2.2'.freeze
3
3
  end
File without changes