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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +2 -1
- data/.gitignore +6 -8
- data/.rubocop.yml +4 -194
- data/.travis/oracle/download.js +152 -0
- data/.travis/oracle/download.sh +30 -0
- data/.travis/oracle/download_ojdbc.js +116 -0
- data/.travis/oracle/install.sh +34 -0
- data/.travis/setup_accounts.sh +9 -0
- data/.travis/sqlite3/extension-functions.sh +6 -0
- data/.travis.yml +223 -0
- data/Gemfile +28 -2
- data/README.md +89 -265
- data/Rakefile +30 -50
- data/TODO +1 -0
- data/appveyor.yml +22 -60
- data/arel_extensions.gemspec +17 -14
- data/functions.html +3 -3
- data/gemfiles/rails3.gemfile +20 -0
- data/gemfiles/rails4.gemfile +29 -0
- data/gemfiles/rails5_0.gemfile +29 -0
- data/gemfiles/rails5_1_4.gemfile +17 -19
- data/gemfiles/rails5_2.gemfile +17 -26
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +25 -24
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/attributes.rb +3 -9
- data/lib/arel_extensions/boolean_functions.rb +16 -57
- data/lib/arel_extensions/common_sql_functions.rb +20 -21
- data/lib/arel_extensions/comparators.rb +28 -31
- data/lib/arel_extensions/date_duration.rb +13 -19
- data/lib/arel_extensions/insert_manager.rb +15 -22
- data/lib/arel_extensions/math.rb +70 -68
- data/lib/arel_extensions/math_functions.rb +52 -57
- data/lib/arel_extensions/nodes/abs.rb +1 -0
- data/lib/arel_extensions/nodes/blank.rb +5 -6
- data/lib/arel_extensions/nodes/case.rb +27 -31
- data/lib/arel_extensions/nodes/cast.rb +12 -12
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/coalesce.rb +5 -4
- data/lib/arel_extensions/nodes/collate.rb +10 -9
- data/lib/arel_extensions/nodes/concat.rb +22 -13
- data/lib/arel_extensions/nodes/date_diff.rb +70 -77
- data/lib/arel_extensions/nodes/duration.rb +5 -2
- data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
- data/lib/arel_extensions/nodes/floor.rb +1 -1
- data/lib/arel_extensions/nodes/format.rb +8 -35
- data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
- data/lib/arel_extensions/nodes/function.rb +39 -50
- data/lib/arel_extensions/nodes/is_null.rb +0 -2
- data/lib/arel_extensions/nodes/json.rb +47 -72
- data/lib/arel_extensions/nodes/length.rb +0 -5
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +2 -2
- data/lib/arel_extensions/nodes/locate.rb +3 -2
- data/lib/arel_extensions/nodes/log10.rb +2 -1
- data/lib/arel_extensions/nodes/matches.rb +8 -6
- data/lib/arel_extensions/nodes/md5.rb +1 -0
- data/lib/arel_extensions/nodes/power.rb +5 -5
- data/lib/arel_extensions/nodes/rand.rb +3 -2
- data/lib/arel_extensions/nodes/repeat.rb +6 -4
- data/lib/arel_extensions/nodes/replace.rb +8 -16
- data/lib/arel_extensions/nodes/round.rb +7 -6
- data/lib/arel_extensions/nodes/soundex.rb +15 -15
- data/lib/arel_extensions/nodes/std.rb +21 -18
- data/lib/arel_extensions/nodes/substring.rb +16 -58
- data/lib/arel_extensions/nodes/then.rb +2 -2
- data/lib/arel_extensions/nodes/trim.rb +7 -5
- data/lib/arel_extensions/nodes/union.rb +9 -6
- data/lib/arel_extensions/nodes/union_all.rb +8 -5
- data/lib/arel_extensions/nodes/wday.rb +6 -2
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/null_functions.rb +6 -18
- data/lib/arel_extensions/predications.rb +49 -54
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +7 -5
- data/lib/arel_extensions/string_functions.rb +55 -110
- data/lib/arel_extensions/tasks.rb +6 -6
- data/lib/arel_extensions/version.rb +1 -3
- data/lib/arel_extensions/visitors/ibm_db.rb +36 -29
- data/lib/arel_extensions/visitors/mssql.rb +248 -493
- data/lib/arel_extensions/visitors/mysql.rb +244 -420
- data/lib/arel_extensions/visitors/oracle.rb +258 -311
- data/lib/arel_extensions/visitors/oracle12.rb +34 -20
- data/lib/arel_extensions/visitors/postgresql.rb +239 -350
- data/lib/arel_extensions/visitors/sqlite.rb +169 -191
- data/lib/arel_extensions/visitors/to_sql.rb +299 -371
- data/lib/arel_extensions/visitors.rb +62 -83
- data/lib/arel_extensions.rb +32 -243
- data/test/database.yml +10 -20
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +120 -123
- data/test/support/fake_record.rb +3 -11
- data/test/test_comparators.rb +17 -14
- data/test/visitors/test_bulk_insert_oracle.rb +12 -12
- data/test/visitors/test_bulk_insert_sqlite.rb +14 -13
- data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
- data/test/visitors/test_oracle.rb +55 -55
- data/test/visitors/test_to_sql.rb +226 -419
- data/test/with_ar/all_agnostic_test.rb +375 -912
- data/test/with_ar/insert_agnostic_test.rb +22 -28
- data/test/with_ar/test_bulk_sqlite.rb +17 -18
- data/test/with_ar/test_math_sqlite.rb +27 -27
- data/test/with_ar/test_string_mysql.rb +34 -32
- data/test/with_ar/test_string_sqlite.rb +35 -31
- metadata +64 -50
- data/.github/workflows/publish.yml +0 -30
- data/.github/workflows/release.yml +0 -30
- data/.github/workflows/ruby.yml +0 -452
- data/CONTRIBUTING.md +0 -102
- data/Makefile +0 -48
- data/NEWS.md +0 -131
- data/bin/build +0 -15
- data/bin/publish +0 -8
- data/dev/arelx.dockerfile +0 -41
- data/dev/compose.yaml +0 -69
- data/dev/postgres.dockerfile +0 -5
- data/dev/rbenv +0 -189
- data/gemfiles/rails5.gemfile +0 -36
- data/gemfiles/rails6.gemfile +0 -40
- data/gemfiles/rails6_1.gemfile +0 -48
- data/gemfiles/rails7.gemfile +0 -48
- data/gemfiles/rails7_1.gemfile +0 -48
- data/gemfiles/rails7_2.gemfile +0 -47
- data/gemfiles/rails8.gemfile +0 -40
- data/gemfiles/rails8_1.gemfile +0 -41
- data/gemspecs/arel_extensions-v1.gemspec +0 -25
- data/gemspecs/arel_extensions-v2.gemspec +0 -25
- data/generate_gems.sh +0 -15
- data/lib/arel_extensions/aliases.rb +0 -14
- data/lib/arel_extensions/constants.rb +0 -13
- data/lib/arel_extensions/helpers.rb +0 -61
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
- data/lib/arel_extensions/nodes/byte_size.rb +0 -11
- data/lib/arel_extensions/nodes/char_length.rb +0 -11
- data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
- data/lib/arel_extensions/nodes/rollup.rb +0 -36
- data/lib/arel_extensions/nodes/select.rb +0 -10
- data/lib/arel_extensions/nodes/sum.rb +0 -7
- data/lib/arel_extensions/visitors/convert_format.rb +0 -37
- data/lib/arel_extensions/warning.rb +0 -42
- data/test/arelx_test_helper.rb +0 -94
- data/test/config_loader.rb +0 -9
- data/version_v1.rb +0 -5
- 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 *
|
|
15
|
+
def * other
|
|
16
16
|
case other
|
|
17
17
|
when Float, BigDecimal
|
|
18
|
-
super(Arel.
|
|
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 /
|
|
25
|
+
def / other
|
|
26
26
|
case other
|
|
27
27
|
when Float, BigDecimal
|
|
28
|
-
super(Arel.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
46
|
+
ArelExtensions::Nodes::Floor.new [self]
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
# function gives the base 10 log
|
|
50
50
|
def log10
|
|
51
|
-
|
|
51
|
+
ArelExtensions::Nodes::Log10.new [self]
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
# function gives the power of a number
|
|
55
|
-
def pow
|
|
56
|
-
|
|
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
|
|
61
|
-
|
|
60
|
+
def power exposant = 0
|
|
61
|
+
ArelExtensions::Nodes::Power.new [self,exposant]
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
# Aggregate Functions
|
|
65
|
-
def std
|
|
66
|
-
ArelExtensions::Nodes::Std.new self,
|
|
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
|
|
74
|
-
|
|
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
|
-
#
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
#
|
|
88
|
-
def round
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
|
@@ -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
|
|
11
|
-
super
|
|
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
|
|
21
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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::
|
|
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,
|
|
53
|
+
when Date, DateTime,Time
|
|
62
54
|
:datetime
|
|
63
55
|
when Arel::Attributes::Attribute
|
|
64
|
-
|
|
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
|
|
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
|
|
72
|
+
def then expression
|
|
77
73
|
@conditions.last.right = expression
|
|
78
74
|
self
|
|
79
75
|
end
|
|
80
76
|
|
|
81
|
-
def else
|
|
77
|
+
def else expression
|
|
82
78
|
@default = Case::Else.new expression
|
|
83
79
|
self
|
|
84
80
|
end
|
|
85
81
|
|
|
86
|
-
def initialize_copy
|
|
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?
|
|
93
|
+
def eql? other
|
|
98
94
|
self.class == other.class &&
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
95
|
+
self.case == other.case &&
|
|
96
|
+
self.conditions == other.conditions &&
|
|
97
|
+
self.default == other.default
|
|
102
98
|
end
|
|
103
|
-
alias
|
|
99
|
+
alias :== :eql?
|
|
104
100
|
|
|
105
|
-
def as
|
|
106
|
-
Arel::Nodes::As.new self, Arel.
|
|
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
|
|
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
|
|
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,
|
|
21
|
+
when :time,'time'
|
|
25
22
|
@return_type = :time
|
|
26
|
-
when :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.
|
|
42
|
+
Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
|
|
46
43
|
end
|
|
47
44
|
end
|
|
48
45
|
|
|
49
|
-
|
|
46
|
+
def return_type
|
|
47
|
+
@return_type
|
|
48
|
+
end
|
|
49
|
+
|
|
50
50
|
end
|
|
51
51
|
end
|
|
52
52
|
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
|
|
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
|
-
|
|
4
|
+
RETURN_TYPE = :string
|
|
5
5
|
|
|
6
|
-
|
|
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
|
|
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.
|
|
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
|
|
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 <
|
|
43
|
+
class GroupConcat < Function
|
|
43
44
|
RETURN_TYPE = :string
|
|
44
45
|
|
|
45
|
-
attr_accessor :
|
|
46
|
-
|
|
47
|
-
def initialize
|
|
48
|
-
|
|
49
|
-
|
|
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
|