arel_extensions 1.3.4 → 2.0.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +2 -1
  3. data/.rubocop.yml +4 -31
  4. data/.travis/oracle/download.js +152 -0
  5. data/.travis/oracle/download.sh +30 -0
  6. data/.travis/oracle/download_ojdbc.js +116 -0
  7. data/.travis/oracle/install.sh +34 -0
  8. data/.travis/setup_accounts.sh +9 -0
  9. data/.travis/sqlite3/extension-functions.sh +6 -0
  10. data/.travis.yml +223 -0
  11. data/Gemfile +21 -16
  12. data/README.md +14 -125
  13. data/Rakefile +30 -41
  14. data/TODO +1 -0
  15. data/appveyor.yml +44 -0
  16. data/arel_extensions.gemspec +14 -14
  17. data/functions.html +3 -3
  18. data/gemfiles/rails3.gemfile +10 -10
  19. data/gemfiles/rails4.gemfile +14 -14
  20. data/gemfiles/rails5_0.gemfile +14 -14
  21. data/gemfiles/rails5_1_4.gemfile +14 -14
  22. data/gemfiles/rails5_2.gemfile +14 -15
  23. data/init/mssql.sql +4 -4
  24. data/init/mysql.sql +38 -38
  25. data/init/oracle.sql +0 -0
  26. data/init/postgresql.sql +21 -21
  27. data/init/sqlite.sql +0 -0
  28. data/lib/arel_extensions/attributes.rb +3 -4
  29. data/lib/arel_extensions/boolean_functions.rb +14 -53
  30. data/lib/arel_extensions/common_sql_functions.rb +16 -15
  31. data/lib/arel_extensions/comparators.rb +28 -27
  32. data/lib/arel_extensions/date_duration.rb +14 -13
  33. data/lib/arel_extensions/insert_manager.rb +15 -18
  34. data/lib/arel_extensions/math.rb +44 -31
  35. data/lib/arel_extensions/math_functions.rb +39 -46
  36. data/lib/arel_extensions/nodes/abs.rb +1 -0
  37. data/lib/arel_extensions/nodes/blank.rb +2 -1
  38. data/lib/arel_extensions/nodes/case.rb +16 -16
  39. data/lib/arel_extensions/nodes/cast.rb +6 -8
  40. data/lib/arel_extensions/nodes/ceil.rb +1 -1
  41. data/lib/arel_extensions/nodes/coalesce.rb +3 -2
  42. data/lib/arel_extensions/nodes/collate.rb +10 -9
  43. data/lib/arel_extensions/nodes/concat.rb +18 -9
  44. data/lib/arel_extensions/nodes/date_diff.rb +22 -38
  45. data/lib/arel_extensions/nodes/duration.rb +3 -0
  46. data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
  47. data/lib/arel_extensions/nodes/floor.rb +1 -1
  48. data/lib/arel_extensions/nodes/format.rb +8 -35
  49. data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
  50. data/lib/arel_extensions/nodes/function.rb +37 -42
  51. data/lib/arel_extensions/nodes/is_null.rb +0 -0
  52. data/lib/arel_extensions/nodes/json.rb +39 -48
  53. data/lib/arel_extensions/nodes/length.rb +0 -5
  54. data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
  55. data/lib/arel_extensions/nodes/locate.rb +1 -0
  56. data/lib/arel_extensions/nodes/log10.rb +2 -1
  57. data/lib/arel_extensions/nodes/matches.rb +7 -5
  58. data/lib/arel_extensions/nodes/md5.rb +1 -0
  59. data/lib/arel_extensions/nodes/power.rb +5 -5
  60. data/lib/arel_extensions/nodes/rand.rb +1 -0
  61. data/lib/arel_extensions/nodes/repeat.rb +4 -2
  62. data/lib/arel_extensions/nodes/replace.rb +8 -16
  63. data/lib/arel_extensions/nodes/round.rb +6 -5
  64. data/lib/arel_extensions/nodes/soundex.rb +15 -15
  65. data/lib/arel_extensions/nodes/std.rb +21 -18
  66. data/lib/arel_extensions/nodes/substring.rb +16 -8
  67. data/lib/arel_extensions/nodes/trim.rb +5 -3
  68. data/lib/arel_extensions/nodes/union.rb +8 -5
  69. data/lib/arel_extensions/nodes/union_all.rb +7 -4
  70. data/lib/arel_extensions/nodes/wday.rb +4 -0
  71. data/lib/arel_extensions/nodes.rb +1 -1
  72. data/lib/arel_extensions/null_functions.rb +7 -5
  73. data/lib/arel_extensions/predications.rb +43 -44
  74. data/lib/arel_extensions/railtie.rb +5 -5
  75. data/lib/arel_extensions/set_functions.rb +7 -5
  76. data/lib/arel_extensions/string_functions.rb +29 -58
  77. data/lib/arel_extensions/tasks.rb +6 -6
  78. data/lib/arel_extensions/version.rb +1 -1
  79. data/lib/arel_extensions/visitors/ibm_db.rb +31 -24
  80. data/lib/arel_extensions/visitors/mssql.rb +184 -269
  81. data/lib/arel_extensions/visitors/mysql.rb +206 -271
  82. data/lib/arel_extensions/visitors/oracle.rb +175 -191
  83. data/lib/arel_extensions/visitors/oracle12.rb +31 -18
  84. data/lib/arel_extensions/visitors/postgresql.rb +170 -244
  85. data/lib/arel_extensions/visitors/sqlite.rb +124 -138
  86. data/lib/arel_extensions/visitors/to_sql.rb +237 -269
  87. data/lib/arel_extensions/visitors.rb +59 -75
  88. data/lib/arel_extensions.rb +31 -149
  89. data/test/database.yml +7 -15
  90. data/test/helper.rb +18 -0
  91. data/test/real_db_test.rb +113 -102
  92. data/test/support/fake_record.rb +3 -3
  93. data/test/test_comparators.rb +17 -14
  94. data/test/visitors/test_bulk_insert_oracle.rb +10 -10
  95. data/test/visitors/test_bulk_insert_sqlite.rb +12 -11
  96. data/test/visitors/test_bulk_insert_to_sql.rb +12 -10
  97. data/test/visitors/test_oracle.rb +55 -55
  98. data/test/visitors/test_to_sql.rb +226 -419
  99. data/test/with_ar/all_agnostic_test.rb +357 -567
  100. data/test/with_ar/insert_agnostic_test.rb +19 -25
  101. data/test/with_ar/test_bulk_sqlite.rb +15 -16
  102. data/test/with_ar/test_math_sqlite.rb +26 -26
  103. data/test/with_ar/test_string_mysql.rb +33 -31
  104. data/test/with_ar/test_string_sqlite.rb +34 -30
  105. metadata +23 -29
  106. data/.github/workflows/ruby.yml +0 -389
  107. data/gemfiles/rails6.gemfile +0 -29
  108. data/gemfiles/rails6_1.gemfile +0 -29
  109. data/gemfiles/rails7.gemfile +0 -22
  110. data/gemspecs/arel_extensions-v1.gemspec +0 -28
  111. data/gemspecs/arel_extensions-v2.gemspec +0 -28
  112. data/generate_gems.sh +0 -15
  113. data/lib/arel_extensions/aliases.rb +0 -14
  114. data/lib/arel_extensions/helpers.rb +0 -51
  115. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
  116. data/lib/arel_extensions/nodes/sum.rb +0 -7
  117. data/lib/arel_extensions/visitors/convert_format.rb +0 -37
  118. data/test/arelx_test_helper.rb +0 -71
  119. data/version_v1.rb +0 -3
  120. data/version_v2.rb +0 -3
@@ -1,4 +1,4 @@
1
- require 'arel_extensions/nodes/concat' # if Arel::VERSION.to_i < 7
1
+ require 'arel_extensions/nodes/concat' #if Arel::VERSION.to_i < 7
2
2
  require 'arel_extensions/nodes/length'
3
3
  require 'arel_extensions/nodes/locate'
4
4
  require 'arel_extensions/nodes/substring'
@@ -19,26 +19,19 @@ require 'arel_extensions/nodes/md5'
19
19
 
20
20
  module ArelExtensions
21
21
  module StringFunctions
22
- # *FindInSet function .......
22
+
23
+ #*FindInSet function .......
23
24
  def &(other)
24
25
  ArelExtensions::Nodes::FindInSet.new [other, self]
25
26
  end
26
27
 
27
- # LENGTH function returns the length (bytewise) of the value in a text field.
28
+ #LENGTH function returns the length of the value in a text field.
28
29
  def length
29
- ArelExtensions::Nodes::Length.new self, true
30
- end
31
-
32
- def byte_length
33
- ArelExtensions::Nodes::Length.new self, true
30
+ ArelExtensions::Nodes::Length.new [self]
34
31
  end
35
32
 
36
- def char_length
37
- ArelExtensions::Nodes::Length.new self, false
38
- end
39
-
40
- # LOCATE function returns the first starting position of a string in another string.
41
- # If string1 or string2 is NULL then it returns NULL. If string1 not found in string2 then it returns 0.
33
+ #LOCATE function returns the first starting position of a string in another string.
34
+ #If string1 or string2 is NULL then it returns NULL. If string1 not found in string2 then it returns 0.
42
35
  def locate val
43
36
  ArelExtensions::Nodes::Locate.new [self, val]
44
37
  end
@@ -58,7 +51,7 @@ module ArelExtensions
58
51
  end
59
52
  end
60
53
 
61
- # SOUNDEX function returns a character string containing the phonetic representation of char.
54
+ #SOUNDEX function returns a character string containing the phonetic representation of char.
62
55
  def soundex
63
56
  ArelExtensions::Nodes::Soundex.new [self]
64
57
  end
@@ -71,19 +64,6 @@ module ArelExtensions
71
64
  grouping_any :imatches, others, escape
72
65
  end
73
66
 
74
- # def grouping_any method, others, *extra
75
- # puts "*******************"
76
- # puts method
77
- # puts others.inspect
78
- # puts extra.inspect
79
- # puts "-------------------"
80
- # res = super(method,others,*extra)
81
- # puts res.to_sql
82
- # puts res.inspect
83
- # puts "*******************"
84
- # res
85
- # end
86
-
87
67
  def imatches_all others, escape = nil
88
68
  grouping_all :imatches, others, escape, escape
89
69
  end
@@ -101,62 +81,53 @@ module ArelExtensions
101
81
  end
102
82
 
103
83
  def ai_matches other # accent insensitive & case sensitive
104
- ArelExtensions::Nodes::AiMatches.new(self, other)
84
+ ArelExtensions::Nodes::AiMatches.new(self,other)
105
85
  end
106
86
 
107
87
  def ai_imatches other # accent insensitive & case insensitive
108
- ArelExtensions::Nodes::AiIMatches.new(self, other)
88
+ ArelExtensions::Nodes::AiIMatches.new(self,other)
109
89
  end
110
90
 
111
91
  def smatches other # accent sensitive & case sensitive
112
- ArelExtensions::Nodes::SMatches.new(self, other)
92
+ ArelExtensions::Nodes::SMatches.new(self,other)
113
93
  end
114
94
 
115
- def ai_collate
116
- ArelExtensions::Nodes::Collate.new(self, nil, true, false)
95
+ def ai_collate
96
+ ArelExtensions::Nodes::Collate.new(self,nil,true,false)
117
97
  end
118
98
 
119
99
  def ci_collate
120
- ArelExtensions::Nodes::Collate.new(self, nil, false, true)
121
- end
122
-
123
- def collate ai = false, ci = false, option = nil
124
- ArelExtensions::Nodes::Collate.new(self, option, ai, ci)
100
+ ArelExtensions::Nodes::Collate.new(self,nil,false,true)
125
101
  end
126
102
 
127
- # REPLACE function replaces a sequence of characters in a string with another set of characters, not case-sensitive.
128
- def replace pattern, substitute
129
- if pattern.is_a? Regexp
130
- ArelExtensions::Nodes::RegexpReplace.new self, pattern, substitute
131
- else
132
- ArelExtensions::Nodes::Replace.new self, pattern, substitute
133
- end
103
+ def collate ai=false,ci=false, option=nil
104
+ ArelExtensions::Nodes::Collate.new(self,option,ai,ci)
134
105
  end
135
106
 
136
- def regexp_replace pattern, substitute
137
- ArelExtensions::Nodes::RegexpReplace.new self, pattern, substitute
107
+ #REPLACE function replaces a sequence of characters in a string with another set of characters, not case-sensitive.
108
+ def replace left, right
109
+ ArelExtensions::Nodes::Replace.new [self, left, right]
138
110
  end
139
-
111
+
140
112
  def concat other
141
113
  ArelExtensions::Nodes::Concat.new [self, other]
142
114
  end
143
115
 
144
- # concat elements of a group, separated by sep and ordered by a list of Ascending or Descending
145
- def group_concat(sep = nil, *orders, group: nil, order: nil)
146
- if orders.present?
147
- warn("Warning: ArelExtensions: group_concat: you should now use the kwarg 'order' to specify an order in the group_concat.")
148
- end
116
+ #concat elements of a group, separated by sep and ordered by a list of Ascending or Descending
117
+ def group_concat sep = nil, *orders
149
118
  order_tabs = [orders].flatten.map{ |o|
150
119
  if o.is_a?(Arel::Nodes::Ascending) || o.is_a?(Arel::Nodes::Descending)
151
120
  o
152
121
  elsif o.respond_to?(:asc)
153
122
  o.asc
123
+ else
124
+ nil
154
125
  end
155
126
  }.compact
156
- ArelExtensions::Nodes::GroupConcat.new(self, sep, group: group, order: (order || order_tabs))
127
+ ArelExtensions::Nodes::GroupConcat.new [self, sep, order_tabs]
157
128
  end
158
129
 
159
- # Function returns a string after removing left, right or the both prefixes or suffixes int argument
130
+ #Function returns a string after removing left, right or the both prefixes or suffixes int argument
160
131
  def trim other = ' '
161
132
  ArelExtensions::Nodes::Trim.new [self, other]
162
133
  end
@@ -184,11 +155,11 @@ module ArelExtensions
184
155
  def not_blank
185
156
  ArelExtensions::Nodes::NotBlank.new [self]
186
157
  end
187
-
188
- def repeat other = 1
158
+
159
+ def repeat other = 1
189
160
  ArelExtensions::Nodes::Repeat.new [self, other]
190
161
  end
191
-
162
+
192
163
  def levenshtein_distance other
193
164
  ArelExtensions::Nodes::LevenshteinDistance.new [self, other]
194
165
  end
@@ -1,12 +1,12 @@
1
1
  namespace :arel_extensions do
2
- desc 'Install DB functions into current DB'
3
- task install_functions: :environment do
4
- @env_db = if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx') || (RUBY_PLATFORM == 'java')) # not supported
5
- (RUBY_PLATFORM == 'java' ? 'jdbc-sqlite' : 'sqlite')
2
+ desc 'Install DB functions into current DB'
3
+ task :install_functions => :environment do
4
+ @env_db = if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx") || (RUBY_PLATFORM == 'java')) # not supported
5
+ (RUBY_PLATFORM == 'java' ? "jdbc-sqlite" : 'sqlite')
6
6
  else
7
7
  ENV['DB'] || ActiveRecord::Base.connection.adapter_name
8
8
  end
9
- ActiveRecord::Base.establish_connection(Rails.env.to_sym)
9
+ ActiveRecord::Base.establish_connection(Rails.env)
10
10
  CommonSqlFunctions.new(ActiveRecord::Base.connection).add_sql_functions(@env_db)
11
- end
11
+ end
12
12
  end
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = '1.3.4'.freeze
2
+ VERSION = "2.0.0.rc3".freeze
3
3
  end
@@ -1,69 +1,76 @@
1
1
  module ArelExtensions
2
2
  module Visitors
3
- class Arel::Visitors::IBM_DB
3
+ Arel::Visitors::IBM_DB.class_eval do
4
+
4
5
  def visit_ArelExtensions_Nodes_Ceil o, collector
5
- collector << 'CEILING('
6
+ collector << "CEILING("
6
7
  collector = visit o.expr, collector
7
- collector << ')'
8
+ collector << ")"
8
9
  collector
9
10
  end
10
11
 
11
12
  def visit_ArelExtensions_Nodes_Trim o, collector
12
- collector << 'LTRIM(RTRIM('
13
+ collector << "LTRIM(RTRIM("
13
14
  o.expressions.each_with_index { |arg, i|
14
- collector << COMMA if i != 0
15
+ collector << Arel::Visitors::IBM_DB::COMMA unless i == 0
15
16
  collector = visit arg, collector
16
17
  }
17
- collector << '))'
18
+ collector << "))"
18
19
  collector
19
20
  end
20
21
 
22
+
21
23
  def visit_ArelExtensions_Nodes_DateDiff o, collector
22
- collector << 'DAY('
24
+ collector << "DAY("
23
25
  collector = visit o.left, collector
24
- collector << ','
26
+ collector << ","
25
27
  if o.right.is_a?(Arel::Attributes::Attribute)
26
28
  collector = visit o.right, collector
27
29
  else
28
30
  collector << "'#{o.right}'"
29
31
  end
30
- collector << ')'
32
+ collector << ")"
31
33
  collector
32
34
  end
33
35
 
36
+
34
37
  def visit_ArelExtensions_Nodes_Duration o, collector
35
- # visit left for period
36
- if o.left == 'd'
37
- collector << 'DAY('
38
- elsif o.left == 'm'
39
- collector << 'MONTH('
40
- elsif o.left == 'w'
41
- collector << 'WEEK'
42
- elsif o.left == 'y'
43
- collector << 'YEAR('
38
+ #visit left for period
39
+ if o.left == "d"
40
+ collector << "DAY("
41
+ elsif o.left == "m"
42
+ collector << "MONTH("
43
+ elsif o.left == "w"
44
+ collector << "WEEK"
45
+ elsif o.left == "y"
46
+ collector << "YEAR("
44
47
  end
45
- # visit right
48
+ #visit right
46
49
  if o.right.is_a?(Arel::Attributes::Attribute)
47
50
  collector = visit o.right, collector
48
51
  else
49
52
  collector << "'#{o.right}'"
50
53
  end
51
- collector << ')'
54
+ collector << ")"
52
55
  collector
53
56
  end
54
57
 
58
+
55
59
  def visit_ArelExtensions_Nodes_IsNull o, collector
56
- collector << 'COALESCE('
60
+ collector << "COALESCE("
57
61
  collector = visit o.left, collector
58
- collector << ','
59
- if (o.right.is_a?(Arel::Attributes::Attribute))
62
+ collector << ","
63
+ if(o.right.is_a?(Arel::Attributes::Attribute))
60
64
  collector = visit o.right, collector
61
65
  else
62
66
  collector << "'#{o.right}'"
63
67
  end
64
- collector << ')'
68
+ collector << ")"
65
69
  collector
66
70
  end
71
+
72
+
73
+
67
74
  end
68
75
  end
69
76
  end