arel_extensions 0.8.0
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 +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +46 -0
- data/Gemfile +10 -0
- data/MIT-LICENSE.txt +20 -0
- data/README.md +101 -0
- data/Rakefile +14 -0
- data/arel_extensions.gemspec +32 -0
- data/functions.html +344 -0
- data/gemfiles/Gemfile.rails3 +10 -0
- data/gemfiles/Gemfile.rails5 +10 -0
- data/init/mssql.sql +6 -0
- data/init/mysql.sql +0 -0
- data/init/oracle.sql +31 -0
- data/init/postgresql.sql +12 -0
- data/init/sqlite.sql +1 -0
- data/lib/arel_extensions.rb +84 -0
- data/lib/arel_extensions/attributes.rb +26 -0
- data/lib/arel_extensions/comparators.rb +59 -0
- data/lib/arel_extensions/date_duration.rb +28 -0
- data/lib/arel_extensions/insert_manager.rb +33 -0
- data/lib/arel_extensions/math.rb +48 -0
- data/lib/arel_extensions/math_functions.rb +35 -0
- data/lib/arel_extensions/nodes.rb +27 -0
- data/lib/arel_extensions/nodes/abs.rb +6 -0
- data/lib/arel_extensions/nodes/ceil.rb +6 -0
- data/lib/arel_extensions/nodes/coalesce.rb +22 -0
- data/lib/arel_extensions/nodes/concat.rb +33 -0
- data/lib/arel_extensions/nodes/date_diff.rb +106 -0
- data/lib/arel_extensions/nodes/duration.rb +30 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +16 -0
- data/lib/arel_extensions/nodes/floor.rb +6 -0
- data/lib/arel_extensions/nodes/function.rb +17 -0
- data/lib/arel_extensions/nodes/isnull.rb +30 -0
- data/lib/arel_extensions/nodes/length.rb +6 -0
- data/lib/arel_extensions/nodes/locate.rb +33 -0
- data/lib/arel_extensions/nodes/ltrim.rb +28 -0
- data/lib/arel_extensions/nodes/matches.rb +22 -0
- data/lib/arel_extensions/nodes/rand.rb +23 -0
- data/lib/arel_extensions/nodes/replace.rb +36 -0
- data/lib/arel_extensions/nodes/round.rb +15 -0
- data/lib/arel_extensions/nodes/rtrim.rb +29 -0
- data/lib/arel_extensions/nodes/soundex.rb +23 -0
- data/lib/arel_extensions/nodes/sum.rb +23 -0
- data/lib/arel_extensions/nodes/trim.rb +26 -0
- data/lib/arel_extensions/nodes/wday.rb +23 -0
- data/lib/arel_extensions/null_functions.rb +16 -0
- data/lib/arel_extensions/string_functions.rb +68 -0
- data/lib/arel_extensions/version.rb +4 -0
- data/lib/arel_extensions/visitors.rb +6 -0
- data/lib/arel_extensions/visitors/ibm_db.rb +206 -0
- data/lib/arel_extensions/visitors/mssql.rb +213 -0
- data/lib/arel_extensions/visitors/mysql.rb +184 -0
- data/lib/arel_extensions/visitors/oracle.rb +267 -0
- data/lib/arel_extensions/visitors/postgresql.rb +258 -0
- data/lib/arel_extensions/visitors/sqlite.rb +218 -0
- data/lib/arel_extensions/visitors/to_sql.rb +199 -0
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +251 -0
- data/test/support/fake_record.rb +137 -0
- data/test/test_comparators.rb +49 -0
- data/test/visitors/test_bulk_insert_oracle.rb +30 -0
- data/test/visitors/test_bulk_insert_sqlite.rb +31 -0
- data/test/visitors/test_bulk_insert_to_sql.rb +32 -0
- data/test/visitors/test_oracle.rb +105 -0
- data/test/visitors/test_to_sql.rb +148 -0
- data/test/with_ar/test_bulk_sqlite.rb +44 -0
- data/test/with_ar/test_math_sqlite.rb +59 -0
- data/test/with_ar/test_string_sqlite.rb +69 -0
- metadata +230 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Nodes
|
3
|
+
class Coalesce < Arel::Nodes::Function
|
4
|
+
include Arel::AliasPredication
|
5
|
+
|
6
|
+
def initialize arg , aliaz = nil
|
7
|
+
|
8
|
+
super(arg, aliaz)
|
9
|
+
end
|
10
|
+
|
11
|
+
def left
|
12
|
+
@expressions.first
|
13
|
+
end
|
14
|
+
|
15
|
+
def other
|
16
|
+
@expressions.delete_at(0)
|
17
|
+
@expressions
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Nodes
|
3
|
+
class Concat < Function
|
4
|
+
include ArelExtensions::Math
|
5
|
+
|
6
|
+
def initialize expr
|
7
|
+
tab = expr.map do |arg|
|
8
|
+
convert(arg)
|
9
|
+
end
|
10
|
+
return super(tab)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
def convert(object)
|
15
|
+
case object
|
16
|
+
when Arel::Attributes::Attribute, Arel::Nodes::Node, Fixnum
|
17
|
+
object
|
18
|
+
when DateTime, Time
|
19
|
+
Arel::Nodes.build_quoted(Date.new(object.year, object.month, object.day), self)
|
20
|
+
when String
|
21
|
+
Arel::Nodes.build_quoted(object)
|
22
|
+
when Date
|
23
|
+
Arel::Nodes.build_quoted(object, self)
|
24
|
+
when ActiveSupport::Duration
|
25
|
+
object.to_i
|
26
|
+
else
|
27
|
+
raise(ArgumentError, "#{object.class} can not be converted to Date")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
module ArelExtensions
|
4
|
+
module Nodes
|
5
|
+
class DateDiff < Arel::Nodes::Node #difference entre colonne date et date string/date
|
6
|
+
include Arel::Predications
|
7
|
+
include Arel::WindowPredications
|
8
|
+
include Arel::OrderPredications
|
9
|
+
include Arel::AliasPredication
|
10
|
+
|
11
|
+
attr_accessor :left, :right
|
12
|
+
|
13
|
+
def initialize(left, right, aliaz = nil)
|
14
|
+
super()
|
15
|
+
@left = convert_date(left)
|
16
|
+
@right = convert_date(right)
|
17
|
+
end
|
18
|
+
|
19
|
+
def convert_date(object)
|
20
|
+
case object
|
21
|
+
when Arel::Attributes::Attribute, Arel::Nodes::Node
|
22
|
+
object
|
23
|
+
when DateTime, Time
|
24
|
+
Arel::Nodes.build_quoted(Date.new(object.year, object.month, object.day), self)
|
25
|
+
when String
|
26
|
+
Arel::Nodes.build_quoted(Date.parse(object), self)
|
27
|
+
when Date
|
28
|
+
Arel::Nodes.build_quoted(object, self)
|
29
|
+
else
|
30
|
+
raise(ArgumentError, "#{object.class} can not be converted to Date")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
class DateAdd < Function
|
37
|
+
attr_accessor :date_type
|
38
|
+
|
39
|
+
def initialize expr
|
40
|
+
col = expr.first
|
41
|
+
@date_type = col.relation.engine.connection.schema_cache.columns_hash(col.relation.table_name)[col.name.to_s].type
|
42
|
+
tab = expr.map do |arg|
|
43
|
+
convert(arg)
|
44
|
+
end
|
45
|
+
return super(tab)
|
46
|
+
end
|
47
|
+
|
48
|
+
def sqlite_value
|
49
|
+
v = self.expressions.last
|
50
|
+
if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v
|
51
|
+
if @date_type == :date
|
52
|
+
return Arel::Nodes.build_quoted((v.value >= 0 ? '+' : '-') + v.inspect)
|
53
|
+
elsif @date_type == :datetime
|
54
|
+
return Arel::Nodes.build_quoted((v.value >= 0 ? '+' : '-') + v.inspect)
|
55
|
+
end
|
56
|
+
else
|
57
|
+
return v
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
def convert(object)
|
63
|
+
case object
|
64
|
+
when Arel::Attributes::Attribute, Arel::Nodes::Node, ActiveSupport::Duration
|
65
|
+
object
|
66
|
+
when Fixnum, Integer
|
67
|
+
object.days
|
68
|
+
when DateTime, Time, Date
|
69
|
+
raise(ArgumentError, "#{object.class} can not be converted to Fixnum")
|
70
|
+
when String
|
71
|
+
Arel::Nodes.build_quoted(object)
|
72
|
+
else
|
73
|
+
raise(ArgumentError, "#{object.class} can not be converted to Fixnum")
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class DateSub < Arel::Nodes::Node #difference entre colonne date et date string/date
|
79
|
+
include Arel::Predications
|
80
|
+
include Arel::WindowPredications
|
81
|
+
include Arel::OrderPredications
|
82
|
+
include Arel::AliasPredication
|
83
|
+
|
84
|
+
attr_accessor :left, :right
|
85
|
+
|
86
|
+
def initialize(left, right, aliaz = nil)
|
87
|
+
super()
|
88
|
+
@left = left
|
89
|
+
@right = convert_number(right)
|
90
|
+
end
|
91
|
+
|
92
|
+
def convert_number(object)
|
93
|
+
case object
|
94
|
+
when Arel::Attributes::Attribute, Arel::Nodes::Node, Fixnum, Integer
|
95
|
+
object
|
96
|
+
when String
|
97
|
+
object.to_i
|
98
|
+
else
|
99
|
+
raise(ArgumentError, "#{object.class} can not be converted to Number")
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Nodes
|
3
|
+
class Duration < Arel::Nodes::Function
|
4
|
+
|
5
|
+
|
6
|
+
def initialize left, right, aliaz = nil
|
7
|
+
tab = Array.new
|
8
|
+
tab << left
|
9
|
+
tab << right
|
10
|
+
super(tab, aliaz)
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def left
|
15
|
+
@expressions.first
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def right
|
20
|
+
@expressions[1]
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def as other
|
25
|
+
Arel::Nodes::As.new self, Arel::Nodes::SqlLiteral.new(other)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Nodes
|
3
|
+
class Function < Arel::Nodes::Function
|
4
|
+
include Arel::Math
|
5
|
+
include Arel::Expressions
|
6
|
+
|
7
|
+
# overrides as to make new Node like AliasPredication
|
8
|
+
def as other
|
9
|
+
Arel::Nodes::As.new(self, Arel.sql(other))
|
10
|
+
end
|
11
|
+
|
12
|
+
def expr
|
13
|
+
@expressions.first
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Nodes
|
3
|
+
class Isnull < Arel::Nodes::Function
|
4
|
+
|
5
|
+
|
6
|
+
def initialize left, right, aliaz = nil
|
7
|
+
tab = Array.new
|
8
|
+
tab << left
|
9
|
+
tab << right
|
10
|
+
super(tab, aliaz)
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def left
|
15
|
+
@expressions.first
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def right
|
20
|
+
@expressions[1]
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def as other
|
25
|
+
Arel::Nodes::As.new self, Arel::Nodes::SqlLiteral.new(other)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Nodes
|
3
|
+
class Locate < Function
|
4
|
+
include ArelExtensions::Math
|
5
|
+
|
6
|
+
def initialize expr
|
7
|
+
tab = expr.map do |arg|
|
8
|
+
convert(arg)
|
9
|
+
end
|
10
|
+
return super(tab)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
def convert(object)
|
15
|
+
case object
|
16
|
+
when Arel::Attributes::Attribute, Arel::Nodes::Node, Fixnum
|
17
|
+
object
|
18
|
+
when DateTime, Time
|
19
|
+
Arel::Nodes.build_quoted(Date.new(object.year, object.month, object.day), self)
|
20
|
+
when String
|
21
|
+
Arel::Nodes.build_quoted(object)
|
22
|
+
when Date
|
23
|
+
Arel::Nodes.build_quoted(object, self)
|
24
|
+
when ActiveSupport::Duration
|
25
|
+
object.to_i
|
26
|
+
else
|
27
|
+
raise(ArgumentError, "#{object.class} can not be converted to Date")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Nodes
|
3
|
+
class Ltrim < Arel::Nodes::Function
|
4
|
+
|
5
|
+
def initialize left,right,aliaz = nil
|
6
|
+
tab = Array.new
|
7
|
+
tab << left
|
8
|
+
tab << right
|
9
|
+
|
10
|
+
super(tab, aliaz)
|
11
|
+
end
|
12
|
+
|
13
|
+
def left
|
14
|
+
@expressions.first
|
15
|
+
end
|
16
|
+
|
17
|
+
def right
|
18
|
+
@expressions[1]
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def as other
|
23
|
+
Arel::Nodes::As.new self, Arel::Nodes::SqlLiteral.new(other)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Nodes
|
3
|
+
class IMatches < Arel::Nodes::Matches
|
4
|
+
|
5
|
+
attr_accessor :case_sensitive if Arel::VERSION.to_i < 7
|
6
|
+
def initialize(left, right, escape = nil)
|
7
|
+
r = Arel::Nodes.build_quoted(right)
|
8
|
+
if Arel::VERSION.to_i < 7 # managed by default in version 7+ (rails 5), so useful for rails 3 & 4
|
9
|
+
super(left, r, escape)
|
10
|
+
@case_sensitive = false
|
11
|
+
else
|
12
|
+
super(left, r, escape, false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
class IDoesNotMatch < IMatches
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Nodes
|
3
|
+
class Rand < Function
|
4
|
+
|
5
|
+
def initialize(seed = nil)
|
6
|
+
if seed && seed.length == 1
|
7
|
+
super seed
|
8
|
+
else
|
9
|
+
super []
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def left
|
14
|
+
@expressions.first
|
15
|
+
end
|
16
|
+
|
17
|
+
def right
|
18
|
+
@expressions[1]
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Nodes
|
3
|
+
class Replace < Arel::Nodes::Function
|
4
|
+
|
5
|
+
|
6
|
+
def initialize expr, left, right, aliaz = nil
|
7
|
+
tab = Array.new
|
8
|
+
tab << expr
|
9
|
+
tab << left
|
10
|
+
tab << right
|
11
|
+
super(tab, aliaz)
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def expr
|
16
|
+
@expressions.first
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def left
|
21
|
+
@expressions[1]
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def right
|
26
|
+
@expressions[2]
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def as other
|
31
|
+
Arel::Nodes::As.new self, Arel::Nodes::SqlLiteral.new(other)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|