arel_extensions 1.7.0 → 2.0.0.rc3

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 (146) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +2 -1
  3. data/.gitignore +6 -8
  4. data/.rubocop.yml +4 -194
  5. data/.travis/oracle/download.js +152 -0
  6. data/.travis/oracle/download.sh +30 -0
  7. data/.travis/oracle/download_ojdbc.js +116 -0
  8. data/.travis/oracle/install.sh +34 -0
  9. data/.travis/setup_accounts.sh +9 -0
  10. data/.travis/sqlite3/extension-functions.sh +6 -0
  11. data/.travis.yml +223 -0
  12. data/Gemfile +28 -2
  13. data/README.md +89 -265
  14. data/Rakefile +30 -50
  15. data/TODO +1 -0
  16. data/appveyor.yml +22 -60
  17. data/arel_extensions.gemspec +17 -14
  18. data/functions.html +3 -3
  19. data/gemfiles/rails3.gemfile +20 -0
  20. data/gemfiles/rails4.gemfile +29 -0
  21. data/gemfiles/rails5_0.gemfile +29 -0
  22. data/gemfiles/rails5_1_4.gemfile +17 -19
  23. data/gemfiles/rails5_2.gemfile +17 -26
  24. data/init/mssql.sql +4 -4
  25. data/init/mysql.sql +38 -38
  26. data/init/oracle.sql +0 -0
  27. data/init/postgresql.sql +25 -24
  28. data/init/sqlite.sql +0 -0
  29. data/lib/arel_extensions/attributes.rb +3 -9
  30. data/lib/arel_extensions/boolean_functions.rb +16 -57
  31. data/lib/arel_extensions/common_sql_functions.rb +20 -21
  32. data/lib/arel_extensions/comparators.rb +28 -31
  33. data/lib/arel_extensions/date_duration.rb +13 -19
  34. data/lib/arel_extensions/insert_manager.rb +15 -22
  35. data/lib/arel_extensions/math.rb +70 -68
  36. data/lib/arel_extensions/math_functions.rb +52 -57
  37. data/lib/arel_extensions/nodes/abs.rb +1 -0
  38. data/lib/arel_extensions/nodes/blank.rb +5 -6
  39. data/lib/arel_extensions/nodes/case.rb +27 -31
  40. data/lib/arel_extensions/nodes/cast.rb +12 -12
  41. data/lib/arel_extensions/nodes/ceil.rb +1 -1
  42. data/lib/arel_extensions/nodes/coalesce.rb +5 -4
  43. data/lib/arel_extensions/nodes/collate.rb +10 -9
  44. data/lib/arel_extensions/nodes/concat.rb +22 -13
  45. data/lib/arel_extensions/nodes/date_diff.rb +70 -77
  46. data/lib/arel_extensions/nodes/duration.rb +5 -2
  47. data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
  48. data/lib/arel_extensions/nodes/floor.rb +1 -1
  49. data/lib/arel_extensions/nodes/format.rb +8 -35
  50. data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
  51. data/lib/arel_extensions/nodes/function.rb +39 -50
  52. data/lib/arel_extensions/nodes/is_null.rb +0 -2
  53. data/lib/arel_extensions/nodes/json.rb +47 -72
  54. data/lib/arel_extensions/nodes/length.rb +0 -5
  55. data/lib/arel_extensions/nodes/levenshtein_distance.rb +2 -2
  56. data/lib/arel_extensions/nodes/locate.rb +3 -2
  57. data/lib/arel_extensions/nodes/log10.rb +2 -1
  58. data/lib/arel_extensions/nodes/matches.rb +8 -6
  59. data/lib/arel_extensions/nodes/md5.rb +1 -0
  60. data/lib/arel_extensions/nodes/power.rb +5 -5
  61. data/lib/arel_extensions/nodes/rand.rb +3 -2
  62. data/lib/arel_extensions/nodes/repeat.rb +6 -4
  63. data/lib/arel_extensions/nodes/replace.rb +8 -16
  64. data/lib/arel_extensions/nodes/round.rb +7 -6
  65. data/lib/arel_extensions/nodes/soundex.rb +15 -15
  66. data/lib/arel_extensions/nodes/std.rb +21 -18
  67. data/lib/arel_extensions/nodes/substring.rb +16 -58
  68. data/lib/arel_extensions/nodes/then.rb +2 -2
  69. data/lib/arel_extensions/nodes/trim.rb +7 -5
  70. data/lib/arel_extensions/nodes/union.rb +9 -6
  71. data/lib/arel_extensions/nodes/union_all.rb +8 -5
  72. data/lib/arel_extensions/nodes/wday.rb +6 -2
  73. data/lib/arel_extensions/nodes.rb +1 -1
  74. data/lib/arel_extensions/null_functions.rb +6 -18
  75. data/lib/arel_extensions/predications.rb +49 -54
  76. data/lib/arel_extensions/railtie.rb +5 -5
  77. data/lib/arel_extensions/set_functions.rb +7 -5
  78. data/lib/arel_extensions/string_functions.rb +55 -110
  79. data/lib/arel_extensions/tasks.rb +6 -6
  80. data/lib/arel_extensions/version.rb +1 -3
  81. data/lib/arel_extensions/visitors/ibm_db.rb +36 -29
  82. data/lib/arel_extensions/visitors/mssql.rb +248 -493
  83. data/lib/arel_extensions/visitors/mysql.rb +244 -420
  84. data/lib/arel_extensions/visitors/oracle.rb +258 -311
  85. data/lib/arel_extensions/visitors/oracle12.rb +34 -20
  86. data/lib/arel_extensions/visitors/postgresql.rb +239 -350
  87. data/lib/arel_extensions/visitors/sqlite.rb +169 -191
  88. data/lib/arel_extensions/visitors/to_sql.rb +299 -371
  89. data/lib/arel_extensions/visitors.rb +62 -83
  90. data/lib/arel_extensions.rb +32 -243
  91. data/test/database.yml +10 -20
  92. data/test/helper.rb +18 -0
  93. data/test/real_db_test.rb +120 -123
  94. data/test/support/fake_record.rb +3 -11
  95. data/test/test_comparators.rb +17 -14
  96. data/test/visitors/test_bulk_insert_oracle.rb +12 -12
  97. data/test/visitors/test_bulk_insert_sqlite.rb +14 -13
  98. data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
  99. data/test/visitors/test_oracle.rb +55 -55
  100. data/test/visitors/test_to_sql.rb +226 -419
  101. data/test/with_ar/all_agnostic_test.rb +375 -912
  102. data/test/with_ar/insert_agnostic_test.rb +22 -28
  103. data/test/with_ar/test_bulk_sqlite.rb +17 -18
  104. data/test/with_ar/test_math_sqlite.rb +27 -27
  105. data/test/with_ar/test_string_mysql.rb +34 -32
  106. data/test/with_ar/test_string_sqlite.rb +35 -31
  107. metadata +64 -50
  108. data/.github/workflows/publish.yml +0 -30
  109. data/.github/workflows/release.yml +0 -30
  110. data/.github/workflows/ruby.yml +0 -452
  111. data/CONTRIBUTING.md +0 -102
  112. data/Makefile +0 -48
  113. data/NEWS.md +0 -131
  114. data/bin/build +0 -15
  115. data/bin/publish +0 -8
  116. data/dev/arelx.dockerfile +0 -41
  117. data/dev/compose.yaml +0 -69
  118. data/dev/postgres.dockerfile +0 -5
  119. data/dev/rbenv +0 -189
  120. data/gemfiles/rails5.gemfile +0 -36
  121. data/gemfiles/rails6.gemfile +0 -40
  122. data/gemfiles/rails6_1.gemfile +0 -48
  123. data/gemfiles/rails7.gemfile +0 -48
  124. data/gemfiles/rails7_1.gemfile +0 -48
  125. data/gemfiles/rails7_2.gemfile +0 -47
  126. data/gemfiles/rails8.gemfile +0 -40
  127. data/gemfiles/rails8_1.gemfile +0 -41
  128. data/gemspecs/arel_extensions-v1.gemspec +0 -25
  129. data/gemspecs/arel_extensions-v2.gemspec +0 -25
  130. data/generate_gems.sh +0 -15
  131. data/lib/arel_extensions/aliases.rb +0 -14
  132. data/lib/arel_extensions/constants.rb +0 -13
  133. data/lib/arel_extensions/helpers.rb +0 -61
  134. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
  135. data/lib/arel_extensions/nodes/byte_size.rb +0 -11
  136. data/lib/arel_extensions/nodes/char_length.rb +0 -11
  137. data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
  138. data/lib/arel_extensions/nodes/rollup.rb +0 -36
  139. data/lib/arel_extensions/nodes/select.rb +0 -10
  140. data/lib/arel_extensions/nodes/sum.rb +0 -7
  141. data/lib/arel_extensions/visitors/convert_format.rb +0 -37
  142. data/lib/arel_extensions/warning.rb +0 -42
  143. data/test/arelx_test_helper.rb +0 -94
  144. data/test/config_loader.rb +0 -9
  145. data/version_v1.rb +0 -5
  146. data/version_v2.rb +0 -5
@@ -7,110 +7,105 @@ require 'arel_extensions/nodes/formatted_number'
7
7
  require 'arel_extensions/nodes/log10'
8
8
  require 'arel_extensions/nodes/power'
9
9
  require 'arel_extensions/nodes/std'
10
- require 'arel_extensions/nodes/sum'
11
10
 
12
11
  module ArelExtensions
13
12
  module MathFunctions
13
+
14
14
  # Arel does not handle Decimal literal properly
15
- def *(other)
15
+ def * other
16
16
  case other
17
17
  when Float, BigDecimal
18
- super(Arel.quoted(other))
18
+ super(Arel::Nodes.build_quoted(other))
19
19
  else
20
- super
20
+ super(other)
21
21
  end
22
22
  end
23
23
 
24
24
  # Arel does not handle Decimal literal properly
25
- def /(other)
25
+ def / other
26
26
  case other
27
27
  when Float, BigDecimal
28
- super(Arel.quoted(other))
28
+ super(Arel::Nodes.build_quoted(other))
29
29
  else
30
- super
30
+ super(other)
31
31
  end
32
32
  end
33
33
 
34
34
  # Abs function returns the absolute value of a number passed as argument #
35
35
  def abs
36
- ArelExtensions::Nodes::Abs.new [self]
36
+ ArelExtensions::Nodes::Abs.new [self]
37
37
  end
38
38
 
39
39
  # will rounded up any positive or negative decimal value within the function upwards #
40
40
  def ceil
41
- ArelExtensions::Nodes::Ceil.new [self]
41
+ ArelExtensions::Nodes::Ceil.new [self]
42
42
  end
43
43
 
44
44
  # function rounded up any positive or negative decimal value down to the next least integer
45
45
  def floor
46
- ArelExtensions::Nodes::Floor.new [self]
46
+ ArelExtensions::Nodes::Floor.new [self]
47
47
  end
48
48
 
49
- # function gives the base 10 log
49
+ # function gives the base 10 log
50
50
  def log10
51
- ArelExtensions::Nodes::Log10.new [self]
51
+ ArelExtensions::Nodes::Log10.new [self]
52
52
  end
53
53
 
54
54
  # function gives the power of a number
55
- def pow(exposant = 0)
56
- ArelExtensions::Nodes::Power.new [self, exposant]
55
+ def pow exposant = 0
56
+ ArelExtensions::Nodes::Power.new [self,exposant]
57
57
  end
58
58
 
59
59
  # function gives the power of a number
60
- def power(exposant = 0)
61
- ArelExtensions::Nodes::Power.new [self, exposant]
60
+ def power exposant = 0
61
+ ArelExtensions::Nodes::Power.new [self,exposant]
62
62
  end
63
63
 
64
64
  # Aggregate Functions
65
- def std(opts = {unbiased: true})
66
- ArelExtensions::Nodes::Std.new self, **opts
67
- end
68
-
69
- def variance(opts = {unbiased: true})
70
- ArelExtensions::Nodes::Variance.new self, **opts
65
+ def std unbiased = true
66
+ ArelExtensions::Nodes::Std.new [self,unbiased]
71
67
  end
72
68
 
73
- def sum(opts = {unbiased: true})
74
- if AREL_VERSION >= V9_0
75
- Arel::Nodes::Sum.new [self]
76
- else
77
- ArelExtensions::Nodes::Sum.new self, **opts
78
- end
69
+ def variance unbiased = true
70
+ ArelExtensions::Nodes::Variance.new [self,unbiased]
79
71
  end
80
72
 
81
- # function that can be invoked to produce random numbers between 0 and 1
82
- # def rand seed = nil
83
- # ArelExtensions::Nodes::Rand.new [seed]
84
- # end
85
- alias random rand rescue nil
73
+ #function that can be invoked to produce random numbers between 0 and 1
74
+ # def rand seed = nil
75
+ # ArelExtensions::Nodes::Rand.new [seed]
76
+ # end
77
+ alias_method :random, :rand
86
78
 
87
- # function is used to round a numeric field to the number of decimals specified
88
- def round(precision = nil)
89
- if precision
90
- ArelExtensions::Nodes::Round.new [self, precision]
91
- else
92
- ArelExtensions::Nodes::Round.new [self]
93
- end
79
+ #function is used to round a numeric field to the number of decimals specified
80
+ def round precision = nil
81
+ if precision
82
+ ArelExtensions::Nodes::Round.new [self, precision]
83
+ else
84
+ ArelExtensions::Nodes::Round.new [self]
85
+ end
94
86
  end
95
87
 
96
88
  # function returning a number at a specific format
97
- def format_number(format_string, locale = nil)
98
- format(format_string, 0) # this line is to get the right error message if the format_string is not correct
99
- m = /^(.*)%([ #+\-0]*)([1-9][0-9]+|[1-9]?)[.]?([0-9]*)([a-zA-Z])(.*)$/.match(format_string)
100
- opts = {
101
- prefix: m[1],
102
- flags: m[2].split('').uniq.join,
103
- width: m[3].to_i,
104
- precision: m[4] == '' ? 6 : m[4].to_i,
105
- type: m[5],
106
- suffix: m[6],
107
- locale: locale,
108
- original_string: format_string
109
- }
110
- # opts = {locale: 'fr_FR', type: "e"/"f"/"d", prefix: "$ ", suffix: " %", flags: " +-#0", width: 5, precision: 6}
111
- ArelExtensions::Nodes::FormattedNumber.new [self, opts]
112
- rescue Exception
113
- Arel.quoted('Wrong Format')
89
+ def format_number format_string, locale=nil
90
+ begin
91
+ sprintf(format_string,0) # this line is to get the right error message if the format_string is not correct
92
+ m = /^(.*)%([ #+\-0]*)([1-9][0-9]+|[1-9]?)[.]?([0-9]*)([a-zA-Z])(.*)$/.match(format_string)
93
+ opts = {
94
+ :prefix => m[1],
95
+ :flags => m[2].split(//).uniq.join,
96
+ :width => m[3].to_i,
97
+ :precision => m[4] != '' ? m[4].to_i : 6,
98
+ :type => m[5],
99
+ :suffix => m[6],
100
+ :locale => locale,
101
+ :original_string => format_string
102
+ }
103
+ # opts = {:locale => 'fr_FR', :type => "e"/"f"/"d", :prefix => "$ ", :suffix => " %", :flags => " +-#0", :width => 5, :precision => 6}
104
+ ArelExtensions::Nodes::FormattedNumber.new [self,opts]
105
+ rescue Exception
106
+ Arel::Nodes.build_quoted('Wrong Format')
107
+ end
114
108
  end
109
+
115
110
  end
116
111
  end
@@ -2,6 +2,7 @@ module ArelExtensions
2
2
  module Nodes
3
3
  class Abs < Function
4
4
  RETURN_TYPE = :number
5
+
5
6
  end
6
7
  end
7
8
  end
@@ -4,22 +4,21 @@ module ArelExtensions
4
4
  module Nodes
5
5
  class Blank < Arel::Nodes::Unary
6
6
  include ArelExtensions::BooleanFunctions
7
-
8
7
  RETURN_TYPE = :boolean
9
8
 
10
- def initialize(expr)
11
- super(expr.first)
9
+ def initialize expr
10
+ super expr.first
12
11
  end
13
12
  end
14
13
 
15
14
  class NotBlank < Arel::Nodes::Unary
16
15
  include ArelExtensions::BooleanFunctions
17
-
18
16
  RETURN_TYPE = :boolean
19
17
 
20
- def initialize(expr)
21
- super(expr.first)
18
+ def initialize expr
19
+ super expr.first
22
20
  end
23
21
  end
22
+
24
23
  end
25
24
  end
@@ -1,15 +1,10 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
- if AREL_VERSION < V7_1
3
+ if Arel::VERSION < "7.1.0"
4
4
  class Case < Arel::Nodes::Node
5
- include Arel::Expressions
6
- include Arel::Math
7
- include Arel::Predications
8
- include Arel::OrderPredications
9
-
10
5
  attr_accessor :case, :conditions, :default
11
6
 
12
- def initialize(expression = nil, default = nil)
7
+ def initialize expression = nil, default = nil
13
8
  @case = expression
14
9
  @conditions = []
15
10
  @default = default
@@ -20,37 +15,34 @@ module ArelExtensions
20
15
 
21
16
  class Else < Arel::Nodes::Unary # :nodoc:
22
17
  end
18
+
23
19
  end
24
20
  else
25
21
  class Case < Arel::Nodes::Case
26
22
  class When < Arel::Nodes::When # :nodoc:
27
23
  end
28
-
29
24
  class Else < Arel::Nodes::Else # :nodoc:
30
25
  end
31
26
  end
32
27
  end
33
28
 
34
- class ArelExtensions::Nodes::Case
29
+ ArelExtensions::Nodes::Case.class_eval do
35
30
  include Arel::Expressions
36
- include Arel::Math
37
- include Arel::Predications
38
31
  include Arel::OrderPredications
39
- include ArelExtensions::Aliases
40
- include ArelExtensions::Comparators
41
- include ArelExtensions::DateDuration
42
32
  include ArelExtensions::Math
43
- include ArelExtensions::MathFunctions
44
- include ArelExtensions::NullFunctions
33
+ include ArelExtensions::Comparators
45
34
  include ArelExtensions::Predications
35
+ include ArelExtensions::MathFunctions
46
36
  include ArelExtensions::StringFunctions
37
+ include ArelExtensions::NullFunctions
47
38
 
48
39
  def return_type
49
- obj =
50
- if @conditions.length > 0
40
+ obj = if @conditions.length > 0
51
41
  @conditions.last.right
52
42
  elsif @default
53
43
  @default.expr
44
+ else
45
+ nil
54
46
  end
55
47
  if obj.respond_to?(:return_type)
56
48
  obj.return_type
@@ -58,32 +50,36 @@ module ArelExtensions
58
50
  case obj
59
51
  when Integer, Float
60
52
  :number
61
- when Date, DateTime, Time
53
+ when Date, DateTime,Time
62
54
  :datetime
63
55
  when Arel::Attributes::Attribute
64
- Arel.column_of(obj.relation.table_name, obj.name.to_s)&.type || :string
56
+ begin
57
+ Arel::Table.engine.connection.schema_cache.columns_hash(obj.relation.table_name)[obj.name.to_s].type
58
+ rescue Exception
59
+ :string
60
+ end
65
61
  else
66
62
  :string
67
63
  end
68
64
  end
69
65
  end
70
66
 
71
- def when(condition, expression = nil)
67
+ def when condition, expression = nil
72
68
  @conditions << Case::When.new(condition, expression)
73
69
  self
74
70
  end
75
71
 
76
- def then(expression)
72
+ def then expression
77
73
  @conditions.last.right = expression
78
74
  self
79
75
  end
80
76
 
81
- def else(expression)
77
+ def else expression
82
78
  @default = Case::Else.new expression
83
79
  self
84
80
  end
85
81
 
86
- def initialize_copy(other)
82
+ def initialize_copy other
87
83
  super
88
84
  @case = @case.clone if @case
89
85
  @conditions = @conditions.map { |x| x.clone }
@@ -94,16 +90,16 @@ module ArelExtensions
94
90
  [@case, @conditions, @default].hash
95
91
  end
96
92
 
97
- def eql?(other)
93
+ def eql? other
98
94
  self.class == other.class &&
99
- self.case == other.case &&
100
- conditions == other.conditions &&
101
- default == other.default
95
+ self.case == other.case &&
96
+ self.conditions == other.conditions &&
97
+ self.default == other.default
102
98
  end
103
- alias == eql?
99
+ alias :== :eql?
104
100
 
105
- def as(other)
106
- Arel::Nodes::As.new self, Arel.sql(other)
101
+ def as other
102
+ Arel::Nodes::As.new self, Arel::Nodes::SqlLiteral.new(other)
107
103
  end
108
104
  end
109
105
  end
@@ -5,7 +5,7 @@ module ArelExtensions
5
5
 
6
6
  attr_accessor :as_attr
7
7
 
8
- def initialize(expr)
8
+ def initialize expr
9
9
  @as_attr = expr[1]
10
10
  case expr[1]
11
11
  when :int, 'bigint', 'int', 'smallint', 'tinyint', 'bit'
@@ -14,16 +14,13 @@ module ArelExtensions
14
14
  @return_type = :decimal
15
15
  when :number
16
16
  @return_type = :number
17
- when 'char', 'varchar', 'nchar', 'nvarchar'
17
+ when 'char', 'varchar', 'text', 'nchar', 'nvarchar', 'ntext'
18
18
  @return_type = :string
19
- when 'text', :text, 'ntext', :ntext
20
- @as_attr = expr[1].to_sym
21
- @return_type = :string
22
- when :datetime, 'datetime', 'smalldatetime'
19
+ when :datetime, 'datetime','smalldatetime'
23
20
  @return_type = :datetime
24
- when :time, 'time'
21
+ when :time,'time'
25
22
  @return_type = :time
26
- when :date, 'date'
23
+ when :date,'date'
27
24
  @return_type = :date
28
25
  when :binary, 'binary', 'varbinary', 'image'
29
26
  @return_type = :binary
@@ -32,21 +29,24 @@ module ArelExtensions
32
29
  @as_attr = :string
33
30
  end
34
31
  tab = [convert_to_node(expr.first)]
35
- super(tab)
32
+ return super(tab)
36
33
  end
37
34
 
38
35
  def +(other)
39
36
  case @return_type
40
37
  when :string
41
- ArelExtensions::Nodes::Concat.new [self, other]
38
+ return ArelExtensions::Nodes::Concat.new [self, other]
42
39
  when :ruby_time
43
40
  ArelExtensions::Nodes::DateAdd.new [self, other]
44
41
  else
45
- Arel.grouping(Arel::Nodes::Addition.new(self, other))
42
+ Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
46
43
  end
47
44
  end
48
45
 
49
- attr_reader :return_type
46
+ def return_type
47
+ @return_type
48
+ end
49
+
50
50
  end
51
51
  end
52
52
  end
@@ -1,7 +1,7 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
3
  class Ceil < Function
4
- RETURN_TYPE = :number
4
+ RETURN_TYPE = :number
5
5
  end
6
6
  end
7
7
  end
@@ -2,14 +2,14 @@ module ArelExtensions
2
2
  module Nodes
3
3
  class Coalesce < Function
4
4
  RETURN_TYPE = :string
5
-
5
+
6
6
  attr_accessor :left_node_type
7
7
 
8
8
  def return_type
9
9
  @left_node_type || self.class.const_get(:RETURN_TYPE)
10
10
  end
11
11
 
12
- def initialize(expr)
12
+ def initialize expr
13
13
  tab = expr.map { |arg|
14
14
  convert_to_node(arg)
15
15
  }
@@ -20,15 +20,16 @@ module ArelExtensions
20
20
  @left_node_type = :number
21
21
  when ArelExtensions::Nodes::Coalesce, ArelExtensions::Nodes::Function
22
22
  @left_node_type = expr.first.respond_to?(:left_node_type) ? expr.first.left_node_type : nil
23
- when Arel::Nodes::Node, Arel::Attributes::Attribute
23
+ when Arel::Nodes::Node, Arel::Attributes::Attribute
24
24
  @left_node_type = type_of_attribute(expr.first)
25
25
  when Date
26
26
  @left_node_type = :ruby_date
27
27
  when DateTime, Time
28
28
  @left_node_type = :ruby_time
29
29
  end
30
- super(tab)
30
+ return super(tab)
31
31
  end
32
+
32
33
  end
33
34
  end
34
35
  end
@@ -1,17 +1,18 @@
1
1
  module ArelExtensions
2
2
  module Nodes
3
3
  class Collate < Function
4
- RETURN_TYPE = :string
4
+ RETURN_TYPE = :string
5
5
 
6
- attr_accessor :ai, :ci, :option
6
+ attr_accessor :ai, :ci, :option
7
+
8
+ def initialize left, option=nil, ai=false, ci=false
9
+ @ai = ai
10
+ @ci = ci
11
+ @option = option
12
+ tab = [convert_to_node(left)]
13
+ return super(tab)
14
+ end
7
15
 
8
- def initialize(left, option = nil, ai = false, ci = false)
9
- @ai = ai
10
- @ci = ci
11
- @option = option
12
- tab = [convert_to_node(left)]
13
- super(tab)
14
- end
15
16
  end
16
17
  end
17
18
  end
@@ -2,7 +2,7 @@ module ArelExtensions::Nodes
2
2
  class Concat < Function
3
3
  RETURN_TYPE = :string
4
4
 
5
- def initialize(expr)
5
+ def initialize expr
6
6
  tab = expr.map { |arg|
7
7
  # flatten nested concats.
8
8
  node = convert_to_node(arg)
@@ -11,12 +11,12 @@ module ArelExtensions::Nodes
11
11
  else
12
12
  node
13
13
  end
14
- }.flatten.reduce([]) { |res, b|
14
+ }.flatten.reduce([]) { | res, b |
15
15
  # concatenate successive literal strings.
16
- if b.is_a?(Arel::Nodes::Quoted) && b.expr == ''
16
+ if b.is_a?(Arel::Nodes::Quoted) && b.expr == ""
17
17
  res
18
18
  elsif res.last && res.last.is_a?(Arel::Nodes::Quoted) && b.is_a?(Arel::Nodes::Quoted)
19
- res[-1] = Arel.quoted(res.last.expr.to_s + b.expr.to_s)
19
+ res[-1] = Arel::Nodes.build_quoted(res.last.expr + b.expr)
20
20
  else
21
21
  res << b
22
22
  end
@@ -25,8 +25,8 @@ module ArelExtensions::Nodes
25
25
  super(tab)
26
26
  end
27
27
 
28
- def self.new(expr)
29
- o = super
28
+ def self.new expr
29
+ o = super(expr)
30
30
  if o.expressions.length == 1
31
31
  o.expressions[0]
32
32
  else
@@ -35,18 +35,27 @@ module ArelExtensions::Nodes
35
35
  end
36
36
 
37
37
  def concat(other)
38
- Concat.new(expressions + [other])
38
+ Concat.new(self.expressions + [other])
39
39
  end
40
+
40
41
  end
41
42
 
42
- class GroupConcat < AggregateFunction
43
+ class GroupConcat < Function
43
44
  RETURN_TYPE = :string
44
45
 
45
- attr_accessor :separator
46
-
47
- def initialize(node, separator = ', ', **opts)
48
- @separator = convert_to_node(separator)
49
- super(node, **opts)
46
+ attr_accessor :orders
47
+
48
+ def initialize expr
49
+ tab = expr.map { |arg|
50
+ if arg.is_a?(Array)
51
+ @orders = arg
52
+ nil
53
+ else
54
+ convert_to_node(arg)
55
+ end
56
+ }.compact
57
+ super(tab)
50
58
  end
59
+
51
60
  end
52
61
  end