arel_extensions 1.2.23 → 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/.rubocop.yml +4 -7
- data/.travis.yml +91 -61
- data/Gemfile +20 -15
- data/README.md +12 -17
- data/Rakefile +29 -40
- data/appveyor.yml +1 -1
- data/arel_extensions.gemspec +3 -3
- data/functions.html +3 -3
- data/gemfiles/rails3.gemfile +9 -9
- data/gemfiles/rails4.gemfile +13 -13
- data/gemfiles/rails5_0.gemfile +13 -13
- data/gemfiles/rails5_1_4.gemfile +13 -13
- data/gemfiles/rails5_2.gemfile +13 -13
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/postgresql.sql +21 -21
- data/lib/arel_extensions.rb +19 -69
- data/lib/arel_extensions/attributes.rb +1 -0
- data/lib/arel_extensions/boolean_functions.rb +14 -55
- data/lib/arel_extensions/common_sql_functions.rb +8 -7
- data/lib/arel_extensions/comparators.rb +15 -14
- data/lib/arel_extensions/date_duration.rb +5 -4
- data/lib/arel_extensions/insert_manager.rb +16 -17
- data/lib/arel_extensions/math.rb +12 -11
- data/lib/arel_extensions/math_functions.rb +22 -29
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/nodes/abs.rb +1 -0
- data/lib/arel_extensions/nodes/blank.rb +1 -0
- data/lib/arel_extensions/nodes/case.rb +8 -11
- data/lib/arel_extensions/nodes/cast.rb +2 -4
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/change_case.rb +0 -0
- data/lib/arel_extensions/nodes/coalesce.rb +3 -2
- data/lib/arel_extensions/nodes/collate.rb +2 -1
- data/lib/arel_extensions/nodes/concat.rb +16 -7
- data/lib/arel_extensions/nodes/date_diff.rb +13 -10
- data/lib/arel_extensions/nodes/duration.rb +3 -0
- 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 -34
- data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
- data/lib/arel_extensions/nodes/function.rb +16 -25
- data/lib/arel_extensions/nodes/json.rb +36 -43
- data/lib/arel_extensions/nodes/length.rb +1 -0
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +0 -0
- data/lib/arel_extensions/nodes/locate.rb +1 -0
- data/lib/arel_extensions/nodes/log10.rb +2 -1
- data/lib/arel_extensions/nodes/matches.rb +6 -4
- 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 +1 -0
- data/lib/arel_extensions/nodes/repeat.rb +4 -2
- data/lib/arel_extensions/nodes/replace.rb +6 -22
- data/lib/arel_extensions/nodes/round.rb +6 -5
- 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 -8
- data/lib/arel_extensions/nodes/then.rb +0 -0
- data/lib/arel_extensions/nodes/trim.rb +5 -3
- data/lib/arel_extensions/nodes/union.rb +5 -2
- data/lib/arel_extensions/nodes/union_all.rb +3 -0
- data/lib/arel_extensions/nodes/wday.rb +4 -0
- data/lib/arel_extensions/null_functions.rb +7 -5
- data/lib/arel_extensions/predications.rb +34 -35
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +4 -2
- data/lib/arel_extensions/string_functions.rb +22 -43
- data/lib/arel_extensions/tasks.rb +5 -5
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors.rb +60 -68
- data/lib/arel_extensions/visitors/ibm_db.rb +12 -5
- data/lib/arel_extensions/visitors/mssql.rb +57 -63
- data/lib/arel_extensions/visitors/mysql.rb +98 -149
- data/lib/arel_extensions/visitors/oracle.rb +68 -71
- data/lib/arel_extensions/visitors/oracle12.rb +15 -2
- data/lib/arel_extensions/visitors/postgresql.rb +63 -116
- data/lib/arel_extensions/visitors/sqlite.rb +70 -83
- data/lib/arel_extensions/visitors/to_sql.rb +109 -141
- data/test/database.yml +0 -2
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +43 -28
- data/test/support/fake_record.rb +2 -2
- data/test/test_comparators.rb +12 -9
- data/test/visitors/test_bulk_insert_oracle.rb +8 -8
- data/test/visitors/test_bulk_insert_sqlite.rb +10 -9
- data/test/visitors/test_bulk_insert_to_sql.rb +10 -8
- data/test/visitors/test_oracle.rb +42 -42
- data/test/visitors/test_to_sql.rb +196 -361
- data/test/with_ar/all_agnostic_test.rb +160 -195
- data/test/with_ar/insert_agnostic_test.rb +4 -3
- data/test/with_ar/test_bulk_sqlite.rb +9 -6
- data/test/with_ar/test_math_sqlite.rb +12 -8
- data/test/with_ar/test_string_mysql.rb +11 -5
- data/test/with_ar/test_string_sqlite.rb +12 -4
- metadata +11 -22
- data/.github/workflows/ruby.yml +0 -102
- data/gemfiles/rails6.gemfile +0 -30
- data/gemfiles/rails6_1.gemfile +0 -30
- data/gemspecs/arel_extensions-v1.gemspec +0 -28
- data/gemspecs/arel_extensions-v2.gemspec +0 -28
- data/generate_gems.sh +0 -15
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
- data/lib/arel_extensions/nodes/sum.rb +0 -7
- data/lib/arel_extensions/visitors/convert_format.rb +0 -37
- data/test/arelx_test_helper.rb +0 -26
- data/version_v1.rb +0 -3
- data/version_v2.rb +0 -3
@@ -18,7 +18,7 @@ module ArelExtensions
|
|
18
18
|
JsonSet.new(self,key,value)
|
19
19
|
end
|
20
20
|
|
21
|
-
def group as_array = true, orders
|
21
|
+
def group as_array = true, orders= nil
|
22
22
|
JsonGroup.new(self,as_array, orders)
|
23
23
|
end
|
24
24
|
|
@@ -26,55 +26,41 @@ module ArelExtensions
|
|
26
26
|
[@dict].hash
|
27
27
|
end
|
28
28
|
|
29
|
-
def convert_to_json_node(n)
|
30
|
-
case n
|
31
|
-
when JsonNode
|
32
|
-
n.dict
|
33
|
-
when Array
|
34
|
-
n.map{|e|
|
35
|
-
(e.is_a?(Array) || e.is_a?(Hash)) ? Json.new(e) : convert_to_json_node(e)
|
36
|
-
}
|
37
|
-
when Hash
|
38
|
-
n.reduce({}){|acc,v|
|
39
|
-
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
|
-
acc
|
41
|
-
}
|
42
|
-
when String, Numeric, TrueClass, FalseClass
|
43
|
-
convert_to_node(n)
|
44
|
-
when Date
|
45
|
-
convert_to_node(n.strftime("%Y-%m-%d"))
|
46
|
-
when DateTime, Time
|
47
|
-
convert_to_node(n.strftime("%Y-%m-%dT%H:%M:%S.%L%:z"))
|
48
|
-
when NilClass
|
49
|
-
Arel.sql('null')
|
50
|
-
else
|
51
|
-
convert_to_node(n)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def type_of_node(v)
|
56
|
-
if v.is_a?(Arel::Attributes::Attribute)
|
57
|
-
self.type_of_attribute(v)
|
58
|
-
elsif v.respond_to?(:return_type)
|
59
|
-
v.return_type
|
60
|
-
elsif v.nil?
|
61
|
-
:nil
|
62
|
-
else
|
63
|
-
:string
|
64
|
-
end
|
65
|
-
end
|
66
29
|
end
|
67
30
|
|
68
31
|
class Json < JsonNode
|
32
|
+
|
69
33
|
def initialize *expr
|
70
|
-
|
71
|
-
|
72
|
-
|
34
|
+
if expr.length == 1
|
35
|
+
case expr.first
|
36
|
+
when JsonNode
|
37
|
+
@dict = expr.first.dict
|
38
|
+
when Array
|
39
|
+
@dict = expr.first.map{|e|
|
40
|
+
(e.is_a?(Array) || e.is_a?(Hash)) ? Json.new(e) : convert_to_node(e)
|
41
|
+
}
|
42
|
+
when Hash
|
43
|
+
@dict = expr.first.inject({}){|acc,v|
|
44
|
+
acc[convert_to_node(v[0])] = (v[1].is_a?(Array) || v[1].is_a?(Hash)) ? Json.new(v[1]) : convert_to_node(v[1])
|
45
|
+
acc
|
46
|
+
}
|
47
|
+
when String, Numeric, TrueClass, FalseClass
|
48
|
+
@dict = convert_to_node(expr.first)
|
49
|
+
when NilClass
|
50
|
+
@dict = Arel.sql('null')
|
73
51
|
else
|
74
|
-
expr.
|
52
|
+
if expr.first.is_a?(String) || (expr.first.is_a?(Arel::Attributes::Attribute) && type_of_attribute(expr.first) == :string) || (expr.first.return_type == :string)
|
53
|
+
@dict = convert_to_node(expr.first)
|
54
|
+
else
|
55
|
+
@dict = [convert_to_node(expr.first)]
|
56
|
+
end
|
75
57
|
end
|
58
|
+
else
|
59
|
+
@dict = expr.map{|e| (e.is_a?(Array) || e.is_a?(Hash)) ? Json.new(e) : convert_to_node(e) }
|
60
|
+
end
|
76
61
|
super
|
77
62
|
end
|
63
|
+
|
78
64
|
end
|
79
65
|
|
80
66
|
class JsonMerge < JsonNode
|
@@ -87,7 +73,11 @@ module ArelExtensions
|
|
87
73
|
@dict = as_array ? json : json.dict
|
88
74
|
@as_array = as_array
|
89
75
|
if orders
|
90
|
-
|
76
|
+
if orders.is_a?(Array)
|
77
|
+
@orders = orders
|
78
|
+
else
|
79
|
+
@orders = [orders]
|
80
|
+
end
|
91
81
|
end
|
92
82
|
end
|
93
83
|
end
|
@@ -99,6 +89,7 @@ module ArelExtensions
|
|
99
89
|
@dict = json
|
100
90
|
@key = convert_to_node(key)
|
101
91
|
end
|
92
|
+
|
102
93
|
end
|
103
94
|
|
104
95
|
class JsonSet < JsonNode
|
@@ -109,6 +100,8 @@ module ArelExtensions
|
|
109
100
|
@key = convert_to_node(key)
|
110
101
|
@value = Json.new(value)
|
111
102
|
end
|
103
|
+
|
112
104
|
end
|
105
|
+
|
113
106
|
end
|
114
107
|
end
|
File without changes
|
@@ -1,8 +1,9 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Nodes
|
3
3
|
class IMatches < Arel::Nodes::Matches
|
4
|
-
attr_accessor :case_sensitive if Arel::VERSION.to_i < 7
|
5
4
|
|
5
|
+
attr_accessor :case_sensitive if Arel::VERSION.to_i < 7
|
6
|
+
|
6
7
|
def initialize(left, right, escape = nil)
|
7
8
|
r = Arel::Nodes.build_quoted(right)
|
8
9
|
if Arel::VERSION.to_i < 7 # managed by default in version 7+ (rails 5), so useful for rails 3 & 4
|
@@ -16,14 +17,15 @@ module ArelExtensions
|
|
16
17
|
|
17
18
|
class IDoesNotMatch < IMatches
|
18
19
|
end
|
19
|
-
|
20
|
+
|
20
21
|
class AiMatches < IMatches
|
21
22
|
end
|
22
|
-
|
23
|
+
|
23
24
|
class AiIMatches < IMatches
|
24
25
|
end
|
25
|
-
|
26
|
+
|
26
27
|
class SMatches < IMatches
|
27
28
|
end
|
29
|
+
|
28
30
|
end
|
29
31
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Nodes
|
3
3
|
class Power < Function
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
RETURN_TYPE = :number
|
5
|
+
|
6
|
+
def initialize expr
|
7
|
+
super [convert_to_node(expr.first), convert_to_number(expr[1])]
|
8
|
+
end
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
@@ -2,7 +2,7 @@ module ArelExtensions
|
|
2
2
|
module Nodes
|
3
3
|
class Repeat < Function
|
4
4
|
RETURN_TYPE = :string
|
5
|
-
|
5
|
+
|
6
6
|
def initialize expr
|
7
7
|
tab = expr.map { |arg|
|
8
8
|
convert_to_node(arg)
|
@@ -11,8 +11,10 @@ module ArelExtensions
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def +(other)
|
14
|
-
return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
14
|
+
return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
15
15
|
end
|
16
|
+
|
16
17
|
end
|
18
|
+
|
17
19
|
end
|
18
20
|
end
|
@@ -2,34 +2,18 @@ module ArelExtensions
|
|
2
2
|
module Nodes
|
3
3
|
class Replace < Function
|
4
4
|
RETURN_TYPE = :string
|
5
|
-
attr_accessor :left, :pattern, :substitute
|
6
5
|
|
7
|
-
def initialize
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
super(
|
6
|
+
def initialize expr
|
7
|
+
tab = expr.map { |arg|
|
8
|
+
convert_to_node(arg)
|
9
|
+
}
|
10
|
+
return super(tab)
|
12
11
|
end
|
13
12
|
|
14
13
|
def +(other)
|
15
|
-
return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
14
|
+
return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
16
15
|
end
|
17
|
-
end
|
18
|
-
|
19
|
-
class RegexpReplace < Function
|
20
|
-
RETURN_TYPE = :string
|
21
|
-
attr_accessor :left, :pattern, :substitute
|
22
16
|
|
23
|
-
def initialize left, pattern, substitute
|
24
|
-
@left = convert_to_node(left)
|
25
|
-
@pattern = (pattern.is_a?(Regexp) ? pattern : %r[#{pattern}])
|
26
|
-
@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])
|
32
|
-
end
|
33
17
|
end
|
34
18
|
end
|
35
19
|
end
|
@@ -4,12 +4,13 @@ module ArelExtensions
|
|
4
4
|
RETURN_TYPE = :number
|
5
5
|
|
6
6
|
def initialize expr
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
if expr && expr.length == 1
|
8
|
+
super [convert_to_node(expr.first)]
|
9
|
+
else
|
10
|
+
super [convert_to_node(expr.first), convert_to_number(expr[1])]
|
11
|
+
end
|
12
12
|
end
|
13
|
+
|
13
14
|
end
|
14
15
|
end
|
15
16
|
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
module ArelExtensions
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
module Nodes
|
3
|
+
class Soundex < Function
|
4
|
+
include Arel::Expressions
|
5
|
+
include ArelExtensions::Comparators
|
6
|
+
|
7
|
+
RETURN_TYPE = :string
|
8
|
+
|
9
|
+
def ==(other)
|
10
|
+
Arel::Nodes::Equality.new self, Arel::Nodes.build_quoted(other, self)
|
11
|
+
end
|
6
12
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
def !=(other)
|
14
|
-
Arel::Nodes::NotEqual.new self, Arel::Nodes.build_quoted(other, self)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
13
|
+
def !=(other)
|
14
|
+
Arel::Nodes::NotEqual.new self, Arel::Nodes.build_quoted(other, self)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
18
|
end
|
@@ -1,23 +1,26 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Nodes
|
3
|
-
class Std <
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
class Variance < AggregateFunction
|
14
|
-
RETURN_TYPE = :number
|
15
|
-
attr_accessor :unbiased_estimator
|
16
|
-
|
17
|
-
def initialize node, **opts
|
18
|
-
@unbiased_estimator = opts[:unbiased] ? true : false
|
19
|
-
super node, **opts
|
20
|
-
end
|
3
|
+
class Std < Function
|
4
|
+
RETURN_TYPE = :number
|
5
|
+
|
6
|
+
attr_accessor :unbiased_estimator
|
7
|
+
def initialize expr
|
8
|
+
col = expr.first
|
9
|
+
@unbiased_estimator = expr[1]
|
10
|
+
super [col]
|
11
|
+
end
|
21
12
|
end
|
13
|
+
|
14
|
+
class Variance < Function
|
15
|
+
RETURN_TYPE = :number
|
16
|
+
|
17
|
+
attr_accessor :unbiased_estimator
|
18
|
+
def initialize expr
|
19
|
+
col = expr.first
|
20
|
+
@unbiased_estimator = expr[1]
|
21
|
+
super [col]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
22
25
|
end
|
23
26
|
end
|
@@ -1,15 +1,23 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Nodes
|
3
3
|
class Substring < Function
|
4
|
-
|
4
|
+
RETURN_TYPE = :string
|
5
|
+
|
6
|
+
def initialize expr
|
7
|
+
tab = [convert_to_node(expr[0]), convert_to_node(expr[1])]
|
8
|
+
if expr[2]
|
9
|
+
tab << convert_to_node(expr[2])
|
10
|
+
# else
|
11
|
+
# tab << expr[0].length
|
12
|
+
end
|
13
|
+
return super(tab)
|
14
|
+
end
|
15
|
+
|
16
|
+
# def +(other)
|
17
|
+
# puts "[Substring] : #{other.inspect} (#{self.expressions.inspect})"
|
18
|
+
# return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
19
|
+
# end
|
5
20
|
|
6
|
-
def initialize expr
|
7
|
-
tab = [convert_to_node(expr[0]), convert_to_node(expr[1])]
|
8
|
-
if expr[2]
|
9
|
-
tab << convert_to_node(expr[2])
|
10
|
-
end
|
11
|
-
return super(tab)
|
12
|
-
end
|
13
21
|
end
|
14
22
|
end
|
15
23
|
end
|
File without changes
|
@@ -2,7 +2,7 @@ module ArelExtensions
|
|
2
2
|
module Nodes
|
3
3
|
class Trim < Function
|
4
4
|
RETURN_TYPE = :string
|
5
|
-
|
5
|
+
|
6
6
|
def initialize expr
|
7
7
|
tab = expr.map { |arg|
|
8
8
|
convert_to_node(arg)
|
@@ -11,16 +11,18 @@ module ArelExtensions
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def +(other)
|
14
|
-
return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
14
|
+
return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
15
15
|
end
|
16
|
+
|
16
17
|
end
|
17
18
|
|
18
19
|
class Ltrim < Trim
|
19
|
-
|
20
|
+
RETURN_TYPE = :string
|
20
21
|
end
|
21
22
|
|
22
23
|
class Rtrim < Trim
|
23
24
|
RETURN_TYPE = :string
|
24
25
|
end
|
26
|
+
|
25
27
|
end
|
26
28
|
end
|