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,44 @@
1
+ require 'helper'
2
+
3
+ module ArelExtensions
4
+ module WthAr
5
+
6
+ describe 'the sqlite visitor' do
7
+
8
+ before do
9
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
10
+ @cnx = ActiveRecord::Base.connection
11
+ @cnx.drop_table(:users) rescue nil
12
+ @cnx.create_table :users do |t|
13
+ t.column :age, :integer
14
+ t.column :name, :string
15
+ t.column :comments, :text
16
+ t.column :created_at, :date
17
+ t.column :updated_at, :date
18
+ t.column :score, :floor
19
+ end
20
+ @cnx.create_table :products do |t|
21
+ t.column :price, :decimal
22
+ end
23
+ @table = Arel::Table.new(:users)
24
+ @cols = ['id', 'name', 'comments', 'created_at']
25
+ @data = [
26
+ [23, 'nom1', "sdfdsfdsfsdf", '2016-01-01'],
27
+ [25, 'nom2', "sdfdsfdsfsdf", '2016-01-01']
28
+ ]
29
+ end
30
+ after do
31
+ @cnx.drop_table(:users)
32
+ end
33
+
34
+ it "should import large set of data" do
35
+ insert_manager = Arel::InsertManager.new(ActiveRecord::Base).into(@table)
36
+ insert_manager.bulk_insert(@cols, @data)
37
+ sql = insert_manager.to_sql
38
+ sql.must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at") VALUES (23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01'), (25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01')]
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,59 @@
1
+ require 'helper'
2
+
3
+ module ArelExtensions
4
+ module WthAr
5
+
6
+ describe 'the sqlite visitor can do maths' do
7
+
8
+ before do
9
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
10
+ Arel::Table.engine = ActiveRecord::Base
11
+ @cnx = ActiveRecord::Base.connection
12
+ @cnx.drop_table(:users) rescue nil
13
+ @cnx.drop_table(:products) rescue nil
14
+ @cnx.create_table :users do |t|
15
+ t.column :age, :integer
16
+ t.column :name, :string
17
+ t.column :comments, :text
18
+ t.column :created_at, :date
19
+ t.column :updated_at, :date
20
+ t.column :score, :floor
21
+ end
22
+ @cnx.create_table :products do |t|
23
+ t.column :price, :decimal
24
+ end
25
+ class User < ActiveRecord::Base
26
+ end
27
+ d = Date.new(2016, 5,23)
28
+ User.create! :age => 5, :name => "Lucas", :created_at => d, :score => 20.16
29
+ User.create! :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
30
+ User.create! :age => 20, :name => "Camille", :created_at => d, :score => 20.16
31
+ User.create! :age => 21, :name => "Arthur", :created_at => d, :score => 65.62
32
+ User.create! :age => 23, :name => "Myung", :created_at => d, :score => 20.16
33
+ @laure = User.create :age => 25, :name => "Laure", :created_at => d, :score =>20.16
34
+ User.create! :age => nil, :name => "Test", :created_at => d, :score => 1.62
35
+ @neg = User.create :age => -20, :name => "Negatif", :created_at => d, :score => 0.17
36
+ @table = Arel::Table.new(:users)
37
+ @age = @table[:age]
38
+ end
39
+ after do
40
+ @cnx.drop_table(:users)
41
+ @cnx.drop_table(:products)
42
+ end
43
+
44
+ it "should do maths" do
45
+ #ABS
46
+ assert_equal 20, User.where(:id => @neg.id).select(@age.abs.as("res")).first.res
47
+ assert_equal 14, User.where(:id => @laure.id).select((@age - 39).abs.as("res")).first.res
48
+
49
+ #CEIL # require extensions
50
+
51
+ # RAND
52
+ assert_equal 5, User.where(User.arel_table[:score].eq(20.16)).select(User.arel_table[:id]).order(Arel.rand).take(50).count
53
+ assert_equal 8, User.select(User.arel_table[:name]).order(Arel.rand).take(50).count
54
+ end
55
+
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,69 @@
1
+ require 'helper'
2
+ require 'date'
3
+
4
+ module ArelExtensions
5
+ module WthAr
6
+
7
+ describe 'the sqlite visitor can do string operations' do
8
+
9
+ before do
10
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
11
+ class User < ActiveRecord::Base
12
+ end
13
+ @cnx = ActiveRecord::Base.connection
14
+ @cnx.drop_table(:users) rescue nil
15
+ @cnx.create_table :users do |t|
16
+ t.column :age, :integer
17
+ t.column :name, :string
18
+ t.column :comments, :text
19
+ t.column :created_at, :date
20
+ t.column :updated_at, :date
21
+ t.column :score, :floor
22
+ end
23
+ @cnx.create_table :products do |t|
24
+ t.column :price, :decimal
25
+ end
26
+ d = Date.new(2016, 5,23)
27
+ @lucas = User.create! :age => 5, :name => "Lucas", :created_at => d, :score => 20.16
28
+ sophie = User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
29
+ @sophie = User.where(:id => sophie.id)
30
+ User.create! :age => 20, :name => "Camille", :created_at => d, :score => 20.16
31
+ User.create! :age => 21, :name => "Arthur", :created_at => d, :score => 65.62
32
+ User.create! :age => 23, :name => "Myung", :created_at => d, :score => 20.16
33
+ @laure = User.create :age => 25, :name => "Laure", :created_at => d, :score =>20.16
34
+ User.create! :age => nil, :name => "Test", :created_at => d, :score => 1.62
35
+ @neg = User.create :age => -20, :name => "Negatif", :created_at => d, :score => 0.17
36
+ @table = Arel::Table.new(:users)
37
+ @name = @table[:name]
38
+ end
39
+ after do
40
+ @cnx.drop_table(:users)
41
+ end
42
+
43
+ it "should do string operations" do
44
+ # concat
45
+ d = Date.new(1997, 6, 15)
46
+ assert_equal "SophiePhan", @sophie.select((@name + "Phan").as("res")).first.res
47
+ assert_equal "Sophie2", @sophie.select((@name + 2).as("res")).first.res
48
+ assert_equal "Sophie1997-06-15", @sophie.select((@name + d).as("res")).first.res
49
+ assert_equal "Sophie15", @sophie.select((User.arel_table[:name] + User.arel_table[:age]).as("res")).first.res
50
+ assert_equal "SophieSophie", @sophie.select((User.arel_table[:name] + User.arel_table[:name]).as("res")).first.res
51
+ assert_equal "Sophie2016-05-23", @sophie.select((User.arel_table[:name] + User.arel_table[:created_at]).as("res")).first.res
52
+ #concat Integer
53
+ assert_equal 1, User.where((User.arel_table[:age] + 10).eq(33)).count
54
+ assert_equal 1, User.where((User.arel_table[:age] + "1").eq(6)).count
55
+ assert_equal 1, User.where((User.arel_table[:age] + User.arel_table[:age]).eq(10)).count
56
+
57
+
58
+
59
+ # Replace
60
+ assert_equal "LucaX", User.where(:id => @lucas).select(@name.replace("s","X").as("res")).first.res
61
+ assert_equal "replace", User.where(:id => @lucas).select(@name.replace(@name,"replace").as("res")).first.res
62
+
63
+ #
64
+ end
65
+
66
+ end
67
+
68
+ end
69
+ end
metadata ADDED
@@ -0,0 +1,230 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: arel_extensions
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.0
5
+ platform: ruby
6
+ authors:
7
+ - Yann Azoury
8
+ - Mathilde Pechdi
9
+ - Félix Bellanger
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2016-08-29 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: arel
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '6.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '6.0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: minitest
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: rdoc
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '4.0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '4.0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: rake
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: activesupport
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '4.0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '4.0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: activemodel
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '4.0'
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: '4.0'
99
+ - !ruby/object:Gem::Dependency
100
+ name: activerecord
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '4.0'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '4.0'
113
+ description: Adds new features to Arel
114
+ email:
115
+ - yann.azoury@faveod.com
116
+ - mathilde.pechdimaldjian@gmail.com
117
+ - felix.bellanger@faveod.com
118
+ executables: []
119
+ extensions: []
120
+ extra_rdoc_files:
121
+ - MIT-LICENSE.txt
122
+ - README.md
123
+ files:
124
+ - ".gitignore"
125
+ - ".travis.yml"
126
+ - Gemfile
127
+ - MIT-LICENSE.txt
128
+ - README.md
129
+ - Rakefile
130
+ - arel_extensions.gemspec
131
+ - functions.html
132
+ - gemfiles/Gemfile.rails3
133
+ - gemfiles/Gemfile.rails5
134
+ - init/mssql.sql
135
+ - init/mysql.sql
136
+ - init/oracle.sql
137
+ - init/postgresql.sql
138
+ - init/sqlite.sql
139
+ - lib/arel_extensions.rb
140
+ - lib/arel_extensions/attributes.rb
141
+ - lib/arel_extensions/comparators.rb
142
+ - lib/arel_extensions/date_duration.rb
143
+ - lib/arel_extensions/insert_manager.rb
144
+ - lib/arel_extensions/math.rb
145
+ - lib/arel_extensions/math_functions.rb
146
+ - lib/arel_extensions/nodes.rb
147
+ - lib/arel_extensions/nodes/abs.rb
148
+ - lib/arel_extensions/nodes/ceil.rb
149
+ - lib/arel_extensions/nodes/coalesce.rb
150
+ - lib/arel_extensions/nodes/concat.rb
151
+ - lib/arel_extensions/nodes/date_diff.rb
152
+ - lib/arel_extensions/nodes/duration.rb
153
+ - lib/arel_extensions/nodes/find_in_set.rb
154
+ - lib/arel_extensions/nodes/floor.rb
155
+ - lib/arel_extensions/nodes/function.rb
156
+ - lib/arel_extensions/nodes/isnull.rb
157
+ - lib/arel_extensions/nodes/length.rb
158
+ - lib/arel_extensions/nodes/locate.rb
159
+ - lib/arel_extensions/nodes/ltrim.rb
160
+ - lib/arel_extensions/nodes/matches.rb
161
+ - lib/arel_extensions/nodes/rand.rb
162
+ - lib/arel_extensions/nodes/replace.rb
163
+ - lib/arel_extensions/nodes/round.rb
164
+ - lib/arel_extensions/nodes/rtrim.rb
165
+ - lib/arel_extensions/nodes/soundex.rb
166
+ - lib/arel_extensions/nodes/sum.rb
167
+ - lib/arel_extensions/nodes/trim.rb
168
+ - lib/arel_extensions/nodes/wday.rb
169
+ - lib/arel_extensions/null_functions.rb
170
+ - lib/arel_extensions/string_functions.rb
171
+ - lib/arel_extensions/version.rb
172
+ - lib/arel_extensions/visitors.rb
173
+ - lib/arel_extensions/visitors/ibm_db.rb
174
+ - lib/arel_extensions/visitors/mssql.rb
175
+ - lib/arel_extensions/visitors/mysql.rb
176
+ - lib/arel_extensions/visitors/oracle.rb
177
+ - lib/arel_extensions/visitors/postgresql.rb
178
+ - lib/arel_extensions/visitors/sqlite.rb
179
+ - lib/arel_extensions/visitors/to_sql.rb
180
+ - test/helper.rb
181
+ - test/real_db_test.rb
182
+ - test/support/fake_record.rb
183
+ - test/test_comparators.rb
184
+ - test/visitors/test_bulk_insert_oracle.rb
185
+ - test/visitors/test_bulk_insert_sqlite.rb
186
+ - test/visitors/test_bulk_insert_to_sql.rb
187
+ - test/visitors/test_oracle.rb
188
+ - test/visitors/test_to_sql.rb
189
+ - test/with_ar/test_bulk_sqlite.rb
190
+ - test/with_ar/test_math_sqlite.rb
191
+ - test/with_ar/test_string_sqlite.rb
192
+ homepage: https://github.com/Faveod/arel-extensions
193
+ licenses:
194
+ - MIT
195
+ metadata: {}
196
+ post_install_message:
197
+ rdoc_options:
198
+ - "--main"
199
+ - README.md
200
+ require_paths:
201
+ - lib
202
+ required_ruby_version: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
207
+ required_rubygems_version: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: '0'
212
+ requirements: []
213
+ rubyforge_project:
214
+ rubygems_version: 2.0.14
215
+ signing_key:
216
+ specification_version: 4
217
+ summary: Extending Arel
218
+ test_files:
219
+ - test/helper.rb
220
+ - test/real_db_test.rb
221
+ - test/support/fake_record.rb
222
+ - test/test_comparators.rb
223
+ - test/visitors/test_bulk_insert_oracle.rb
224
+ - test/visitors/test_bulk_insert_sqlite.rb
225
+ - test/visitors/test_bulk_insert_to_sql.rb
226
+ - test/visitors/test_oracle.rb
227
+ - test/visitors/test_to_sql.rb
228
+ - test/with_ar/test_bulk_sqlite.rb
229
+ - test/with_ar/test_math_sqlite.rb
230
+ - test/with_ar/test_string_sqlite.rb