arel_extensions 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|