arel_extensions 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +46 -0
  4. data/Gemfile +10 -0
  5. data/MIT-LICENSE.txt +20 -0
  6. data/README.md +101 -0
  7. data/Rakefile +14 -0
  8. data/arel_extensions.gemspec +32 -0
  9. data/functions.html +344 -0
  10. data/gemfiles/Gemfile.rails3 +10 -0
  11. data/gemfiles/Gemfile.rails5 +10 -0
  12. data/init/mssql.sql +6 -0
  13. data/init/mysql.sql +0 -0
  14. data/init/oracle.sql +31 -0
  15. data/init/postgresql.sql +12 -0
  16. data/init/sqlite.sql +1 -0
  17. data/lib/arel_extensions.rb +84 -0
  18. data/lib/arel_extensions/attributes.rb +26 -0
  19. data/lib/arel_extensions/comparators.rb +59 -0
  20. data/lib/arel_extensions/date_duration.rb +28 -0
  21. data/lib/arel_extensions/insert_manager.rb +33 -0
  22. data/lib/arel_extensions/math.rb +48 -0
  23. data/lib/arel_extensions/math_functions.rb +35 -0
  24. data/lib/arel_extensions/nodes.rb +27 -0
  25. data/lib/arel_extensions/nodes/abs.rb +6 -0
  26. data/lib/arel_extensions/nodes/ceil.rb +6 -0
  27. data/lib/arel_extensions/nodes/coalesce.rb +22 -0
  28. data/lib/arel_extensions/nodes/concat.rb +33 -0
  29. data/lib/arel_extensions/nodes/date_diff.rb +106 -0
  30. data/lib/arel_extensions/nodes/duration.rb +30 -0
  31. data/lib/arel_extensions/nodes/find_in_set.rb +16 -0
  32. data/lib/arel_extensions/nodes/floor.rb +6 -0
  33. data/lib/arel_extensions/nodes/function.rb +17 -0
  34. data/lib/arel_extensions/nodes/isnull.rb +30 -0
  35. data/lib/arel_extensions/nodes/length.rb +6 -0
  36. data/lib/arel_extensions/nodes/locate.rb +33 -0
  37. data/lib/arel_extensions/nodes/ltrim.rb +28 -0
  38. data/lib/arel_extensions/nodes/matches.rb +22 -0
  39. data/lib/arel_extensions/nodes/rand.rb +23 -0
  40. data/lib/arel_extensions/nodes/replace.rb +36 -0
  41. data/lib/arel_extensions/nodes/round.rb +15 -0
  42. data/lib/arel_extensions/nodes/rtrim.rb +29 -0
  43. data/lib/arel_extensions/nodes/soundex.rb +23 -0
  44. data/lib/arel_extensions/nodes/sum.rb +23 -0
  45. data/lib/arel_extensions/nodes/trim.rb +26 -0
  46. data/lib/arel_extensions/nodes/wday.rb +23 -0
  47. data/lib/arel_extensions/null_functions.rb +16 -0
  48. data/lib/arel_extensions/string_functions.rb +68 -0
  49. data/lib/arel_extensions/version.rb +4 -0
  50. data/lib/arel_extensions/visitors.rb +6 -0
  51. data/lib/arel_extensions/visitors/ibm_db.rb +206 -0
  52. data/lib/arel_extensions/visitors/mssql.rb +213 -0
  53. data/lib/arel_extensions/visitors/mysql.rb +184 -0
  54. data/lib/arel_extensions/visitors/oracle.rb +267 -0
  55. data/lib/arel_extensions/visitors/postgresql.rb +258 -0
  56. data/lib/arel_extensions/visitors/sqlite.rb +218 -0
  57. data/lib/arel_extensions/visitors/to_sql.rb +199 -0
  58. data/test/helper.rb +18 -0
  59. data/test/real_db_test.rb +251 -0
  60. data/test/support/fake_record.rb +137 -0
  61. data/test/test_comparators.rb +49 -0
  62. data/test/visitors/test_bulk_insert_oracle.rb +30 -0
  63. data/test/visitors/test_bulk_insert_sqlite.rb +31 -0
  64. data/test/visitors/test_bulk_insert_to_sql.rb +32 -0
  65. data/test/visitors/test_oracle.rb +105 -0
  66. data/test/visitors/test_to_sql.rb +148 -0
  67. data/test/with_ar/test_bulk_sqlite.rb +44 -0
  68. data/test/with_ar/test_math_sqlite.rb +59 -0
  69. data/test/with_ar/test_string_sqlite.rb +69 -0
  70. metadata +230 -0
@@ -0,0 +1,6 @@
1
+ module ArelExtensions
2
+ module Nodes
3
+ class Ceil < Function
4
+ end
5
+ end
6
+ end
@@ -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,16 @@
1
+ module ArelExtensions
2
+ module Nodes
3
+ class FindInSet < Function
4
+
5
+ def left
6
+ @expressions.first
7
+ end
8
+
9
+
10
+ def right
11
+ @expressions[1]
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ module ArelExtensions
2
+ module Nodes
3
+ class Floor < Function
4
+ end
5
+ end
6
+ 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,6 @@
1
+ module ArelExtensions
2
+ module Nodes
3
+ class Length < Function
4
+ end
5
+ end
6
+ 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
@@ -0,0 +1,15 @@
1
+ module ArelExtensions
2
+ module Nodes
3
+ class Round < Function
4
+
5
+ def left
6
+ @expressions.first
7
+ end
8
+
9
+
10
+ def right
11
+ @expressions[1]
12
+ end
13
+ end
14
+ end
15
+ end