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.
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