arel_extensions 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +27 -15
- data/Gemfile +8 -2
- data/arel_extensions.gemspec +5 -8
- data/gemfiles/{rasil3.gemfile → rails3.gemfile} +5 -1
- data/gemfiles/rails4.gemfile +20 -0
- data/gemfiles/rails5.gemfile +5 -0
- data/lib/arel_extensions/nodes/function.rb +9 -0
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mysql.rb +7 -20
- data/lib/arel_extensions/visitors/oracle.rb +2 -18
- data/lib/arel_extensions/visitors/to_sql.rb +3 -3
- data/test/database.yml +22 -0
- data/test/test_comparators.rb +21 -25
- data/test/visitors/test_bulk_insert_oracle.rb +1 -1
- data/test/visitors/test_bulk_insert_sqlite.rb +1 -1
- data/test/visitors/test_bulk_insert_to_sql.rb +3 -2
- data/test/visitors/test_oracle.rb +1 -0
- data/test/with_ar/test_bulk_sqlite.rb +6 -3
- data/test/with_ar/test_math_sqlite.rb +6 -4
- data/test/with_ar/test_string_mysql.rb +78 -0
- data/test/with_ar/test_string_sqlite.rb +7 -4
- metadata +17 -54
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58bd1c5b91bc632c7697a918369ea19c99ed026b
|
4
|
+
data.tar.gz: d52eae92a11823a94d51eda6de44187199d0e738
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29438df3218c96066e2d1a76f1ccd00b315c0d0957c6cd321cb9db09fe19d12c966d3d825f536337d87a3bafc547e77e221b871fcf407b01831080d99d872eaf
|
7
|
+
data.tar.gz: b56534f4ff7e7cde0a7dc64756075cf8a5ed892c1fc35e1913adabba3bc3f1afc430fb3c07e9bfb461523077feb65b78df25ae75e98373cdaac4fe29d0ea06cc
|
data/.travis.yml
CHANGED
@@ -7,8 +7,8 @@ before_install:
|
|
7
7
|
#addons:
|
8
8
|
# mariadb: '10.0'
|
9
9
|
gemfile:
|
10
|
-
- Gemfile
|
11
10
|
- gemfiles/rails3.gemfile
|
11
|
+
- gemfiles/rails4.gemfile
|
12
12
|
- gemfiles/rails5.gemfile
|
13
13
|
services:
|
14
14
|
- mysql
|
@@ -41,26 +41,38 @@ jdk:
|
|
41
41
|
matrix:
|
42
42
|
fast_finish: true
|
43
43
|
exclude:
|
44
|
-
-
|
45
|
-
|
46
|
-
-
|
47
|
-
|
48
|
-
-
|
49
|
-
|
50
|
-
-
|
51
|
-
|
52
|
-
-
|
53
|
-
|
54
|
-
-
|
55
|
-
|
44
|
+
- rvm: rbx-2
|
45
|
+
jdk: openjdk7
|
46
|
+
- rvm: rbx-2
|
47
|
+
jdk: oraclejdk7
|
48
|
+
- rvm: 2.0.0
|
49
|
+
jdk: openjdk7
|
50
|
+
- rvm: 2.0.0
|
51
|
+
jdk: oraclejdk7
|
52
|
+
- rvm: 2.1
|
53
|
+
jdk: openjdk7
|
54
|
+
- rvm: 2.1
|
55
|
+
jdk: oraclejdk7
|
56
|
+
- rvm: 2.2.5
|
57
|
+
jdk: openjdk7
|
58
|
+
- rvm: 2.2.5
|
59
|
+
jdk: oraclejdk7
|
60
|
+
- rvm: 2.3.1
|
61
|
+
jdk: openjdk7
|
62
|
+
- rvm: 2.3.1
|
63
|
+
jdk: oraclejdk7
|
64
|
+
- rvm: ruby-head
|
65
|
+
jdk: openjdk7
|
66
|
+
- rvm: ruby-head
|
67
|
+
jdk: oraclejdk7
|
56
68
|
allow_failures:
|
57
69
|
# - rvm: jruby-9.0.5.0
|
58
70
|
# - rvm: jruby-head
|
59
71
|
- rvm: ruby-head
|
60
|
-
gemfile:
|
72
|
+
gemfile: gemfiles/rails4.gemfile
|
61
73
|
- rvm: ruby-head
|
62
74
|
gemfile: gemfiles/rails3.gemfile
|
63
75
|
# - rvm: jruby-head
|
64
|
-
bundler_args: --jobs
|
76
|
+
bundler_args: --jobs 2 --retry 2
|
65
77
|
notifications:
|
66
78
|
email: false
|
data/Gemfile
CHANGED
@@ -4,7 +4,13 @@ gemspec
|
|
4
4
|
|
5
5
|
group :test do
|
6
6
|
gem "sqlite3", :platform => [:ruby, :mswin, :mingw]
|
7
|
-
|
7
|
+
gem "mysql2", :platform => [:ruby, :mswin, :mingw]
|
8
8
|
gem "jdbc-sqlite3", :platform => :jruby
|
9
|
-
gem
|
9
|
+
gem "activerecord-jdbcsqlite3-adapter", :platform => :jruby
|
10
|
+
gem "activerecord-jdbcmysql-adapter", :platform => :jruby
|
11
|
+
gem "activerecord-jdbcpostgresql-adapter", :platform => :jruby
|
12
|
+
|
13
|
+
gem 'activesupport', '~> 4.0'
|
14
|
+
gem 'activemodel', '~> 4.0'
|
15
|
+
gem 'activerecord', '~> 4.0'
|
10
16
|
end
|
data/arel_extensions.gemspec
CHANGED
@@ -4,9 +4,9 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "arel_extensions"
|
7
|
-
s.version = '0.8.
|
7
|
+
s.version = '0.8.2'
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = ["Yann Azoury", "Mathilde
|
9
|
+
s.authors = ["Yann Azoury", "Mathilde Pechdimaldjian", "Félix Bellanger"]
|
10
10
|
s.email = ["yann.azoury@faveod.com", "mathilde.pechdimaldjian@gmail.com", "felix.bellanger@faveod.com"]
|
11
11
|
s.homepage = "https://github.com/Faveod/arel-extensions"
|
12
12
|
s.description = "Adds new features to Arel"
|
@@ -21,12 +21,9 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
22
22
|
s.require_paths = ["lib"]
|
23
23
|
|
24
|
-
s.add_dependency('arel'
|
24
|
+
s.add_dependency('arel')
|
25
25
|
|
26
|
-
s.add_development_dependency('minitest')
|
26
|
+
s.add_development_dependency('minitest', '~> 5.9')
|
27
27
|
s.add_development_dependency('rdoc', '~> 4.0')
|
28
|
-
s.add_development_dependency('rake')
|
29
|
-
s.add_development_dependency('activesupport', '~> 4.0')
|
30
|
-
s.add_development_dependency('activemodel', '~> 4.0')
|
31
|
-
s.add_development_dependency('activerecord', '~> 4.0')
|
28
|
+
s.add_development_dependency('rake', '~> 11')
|
32
29
|
end
|
@@ -1,11 +1,15 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
|
-
gem 'arel', '~>
|
3
|
+
gem 'arel', '~> 3.0'
|
4
4
|
|
5
5
|
group :development, :test do
|
6
6
|
gem "sqlite3", :platform => [:ruby, :mswin, :mingw]
|
7
|
+
gem "mysql2", :platform => [:ruby, :mswin, :mingw]
|
7
8
|
# for JRuby
|
8
9
|
gem "jdbc-sqlite3", :platform => :jruby
|
10
|
+
gem "activerecord-jdbcsqlite3-adapter", :platform => :jruby
|
11
|
+
gem "activerecord-jdbcmysql-adapter", :platform => :jruby
|
12
|
+
gem "activerecord-jdbcpostgresql-adapter", :platform => :jruby
|
9
13
|
gem 'activesupport', '~> 3.2'
|
10
14
|
gem 'activemodel', '~> 3.2'
|
11
15
|
gem 'activerecord', '~> 3.2'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
|
3
|
+
gem 'arel', '~> 6.0'
|
4
|
+
|
5
|
+
group :development, :test do
|
6
|
+
gem "sqlite3", :platform => [:ruby, :mswin, :mingw]
|
7
|
+
gem "mysql2", :platform => [:ruby, :mswin, :mingw]
|
8
|
+
# for JRuby
|
9
|
+
gem "jdbc-sqlite3", :platform => :jruby
|
10
|
+
gem "activerecord-jdbcsqlite3-adapter", :platform => :jruby
|
11
|
+
gem "activerecord-jdbcmysql-adapter", :platform => :jruby
|
12
|
+
gem "activerecord-jdbcpostgresql-adapter", :platform => :jruby
|
13
|
+
gem 'activesupport', '~> 4.0'
|
14
|
+
gem 'activemodel', '~> 4.0'
|
15
|
+
gem 'activerecord', '~> 4.0'
|
16
|
+
gem 'rdoc'
|
17
|
+
gem 'rake', '~> 11'
|
18
|
+
end
|
19
|
+
|
20
|
+
gemspec :path => "../"
|
data/gemfiles/rails5.gemfile
CHANGED
@@ -4,8 +4,13 @@ gem 'arel', '~> 7.0'
|
|
4
4
|
|
5
5
|
group :development, :test do
|
6
6
|
gem "sqlite3", :platform => [:ruby, :mswin, :mingw]
|
7
|
+
gem "mysql2", :platform => [:ruby, :mswin, :mingw]
|
7
8
|
# for JRuby
|
8
9
|
gem "jdbc-sqlite3", :platform => :jruby
|
10
|
+
gem "activerecord-jdbcsqlite3-adapter", :platform => :jruby
|
11
|
+
gem "activerecord-jdbcmysql-adapter", :platform => :jruby
|
12
|
+
gem "activerecord-jdbcpostgresql-adapter", :platform => :jruby
|
13
|
+
|
9
14
|
gem 'activesupport', '~> 5'
|
10
15
|
gem 'activemodel', '~> 5'
|
11
16
|
gem 'activerecord', '~> 5'
|
@@ -36,26 +36,13 @@ module ArelExtensions
|
|
36
36
|
|
37
37
|
#****************************************************************#
|
38
38
|
def visit_ArelExtensions_Nodes_Concat o, collector
|
39
|
-
|
40
|
-
|
41
|
-
collector <<
|
42
|
-
collector = visit
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
collector
|
47
|
-
elsif (arg == :date || arg == :datetime)
|
48
|
-
collector << "DATE_ADD("
|
49
|
-
collector = visit o.left, collector
|
50
|
-
collector << ",INTERVAL #{o.right} DAY)"
|
51
|
-
collector
|
52
|
-
else
|
53
|
-
collector << "CONCAT("
|
54
|
-
collector = visit o.left, collector
|
55
|
-
collector << ",'"
|
56
|
-
collector << "#{o.right}')"
|
57
|
-
collector
|
58
|
-
end
|
39
|
+
collector << "CONCAT("
|
40
|
+
o.expressions.each_with_index { |arg, i|
|
41
|
+
collector << Arel::Visitors::MySQL::COMMA unless i == 0
|
42
|
+
collector = visit arg, collector
|
43
|
+
}
|
44
|
+
collector << ")"
|
45
|
+
collector
|
59
46
|
end
|
60
47
|
|
61
48
|
|
@@ -26,7 +26,8 @@ module ArelExtensions
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
|
29
|
+
#deprecated
|
30
|
+
def visit_ArelExtensions_Nodes_ConcatDep o, collector
|
30
31
|
arg = o.left.relation.engine.columns.find{|c| c.name == o.left.name.to_s}.type
|
31
32
|
if(o.right.is_a?(Arel::Attributes::Attribute))
|
32
33
|
collector << "CONCAT("
|
@@ -99,10 +100,6 @@ module ArelExtensions
|
|
99
100
|
end
|
100
101
|
|
101
102
|
|
102
|
-
def visit_ArelExtensions_Nodes_Findis o,collector
|
103
|
-
|
104
|
-
end
|
105
|
-
|
106
103
|
def visit_ArelExtensions_Nodes_Length o, collector
|
107
104
|
collector << "LENGTH("
|
108
105
|
collector = visit o.expr, collector
|
@@ -111,19 +108,6 @@ module ArelExtensions
|
|
111
108
|
end
|
112
109
|
|
113
110
|
|
114
|
-
def visit_ArelExtensions_Nodes_Locate o, collector
|
115
|
-
collector << "LOCATE("
|
116
|
-
if(o.val.is_a?(Arel::Attributes::Attribute))
|
117
|
-
collector = visit o.val, collector
|
118
|
-
else
|
119
|
-
collector << "'#{o.val}'"
|
120
|
-
end
|
121
|
-
collector << ","
|
122
|
-
collector = visit o.expr, collector
|
123
|
-
collector << ")"
|
124
|
-
collector
|
125
|
-
end
|
126
|
-
|
127
111
|
def visit_ArelExtensions_Nodes_Isnull o, collector
|
128
112
|
collector << "NVL("
|
129
113
|
collector = visit o.left, collector
|
@@ -111,7 +111,7 @@ module ArelExtensions
|
|
111
111
|
end
|
112
112
|
|
113
113
|
# override
|
114
|
-
remove_method :visit_Arel_Nodes_As
|
114
|
+
remove_method(:visit_Arel_Nodes_As) rescue nil # if Arel::Visitors::ToSql.method_defined?(:visit_Arel_Nodes_As)
|
115
115
|
def visit_Arel_Nodes_As o, collector
|
116
116
|
if o.left.is_a?(Arel::Nodes::Binary)
|
117
117
|
collector << '('
|
@@ -125,7 +125,7 @@ module ArelExtensions
|
|
125
125
|
collector
|
126
126
|
end
|
127
127
|
|
128
|
-
remove_method :visit_Arel_Nodes_Regexp
|
128
|
+
remove_method(:visit_Arel_Nodes_Regexp) rescue nil # if Arel::Visitors::ToSql.method_defined?(:visit_Arel_Nodes_Regexp)
|
129
129
|
def visit_Arel_Nodes_Regexp o, collector
|
130
130
|
collector = visit o.left, collector
|
131
131
|
collector << " REGEXP "
|
@@ -133,7 +133,7 @@ module ArelExtensions
|
|
133
133
|
collector
|
134
134
|
end
|
135
135
|
|
136
|
-
remove_method :visit_Arel_Nodes_NotRegexp
|
136
|
+
remove_method(:visit_Arel_Nodes_NotRegexp) rescue nil # if Arel::Visitors::ToSql.method_defined?(:visit_Arel_Nodes_NotRegexp)
|
137
137
|
def visit_Arel_Nodes_NotRegexp o, collector
|
138
138
|
collector = visit o.left, collector
|
139
139
|
collector << " NOT REGEXP "
|
data/test/database.yml
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
sqlite:
|
2
|
+
adapter: sqlite3
|
3
|
+
database: ":memory:"
|
4
|
+
timeout: 500
|
5
|
+
jdbc-sqlite:
|
6
|
+
adapter: jdbcsqlite3
|
7
|
+
database: ":memory:"
|
8
|
+
timeout: 500
|
9
|
+
mysql:
|
10
|
+
adapter: mysql2
|
11
|
+
database: arext_test
|
12
|
+
username:
|
13
|
+
encoding: utf8
|
14
|
+
jdbc-mysql:
|
15
|
+
adapter: jdbcmysql
|
16
|
+
database: arext_test
|
17
|
+
username:
|
18
|
+
encoding: utf8
|
19
|
+
postgres:
|
20
|
+
adapter: postgresql
|
21
|
+
database: arext_test
|
22
|
+
username: postgres
|
data/test/test_comparators.rb
CHANGED
@@ -1,46 +1,42 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
-
module
|
3
|
+
module ArelExtensions
|
4
4
|
module Nodes
|
5
5
|
|
6
6
|
describe ArelExtensions::Comparators do
|
7
|
+
|
8
|
+
before do
|
9
|
+
@conn = FakeRecord::Base.new
|
10
|
+
Arel::Table.engine = @conn
|
11
|
+
@visitor = Arel::Visitors::ToSql.new @conn.connection
|
12
|
+
@table = Arel::Table.new(:users)
|
13
|
+
@attr = @table[:id]
|
14
|
+
@date = Date.new(2016, 3, 31)
|
15
|
+
@price = Arel::Table.new(:products)[:price]
|
16
|
+
end
|
17
|
+
|
18
|
+
def compile node
|
19
|
+
@visitor.accept(node, Arel::Collectors::SQLString.new).value
|
20
|
+
end
|
21
|
+
|
7
22
|
it "< is equal lt" do
|
8
|
-
|
9
|
-
mgr = relation.project relation[:id]
|
10
|
-
mgr.where relation[:id]<(10)
|
11
|
-
res = mgr.to_sql
|
12
|
-
res.must_be_like('SELECT "users"."id" FROM "users" WHERE "users"."id" < 10')
|
23
|
+
compile(@table[:id] < 10).must_be_like('"users"."id" < 10')
|
13
24
|
end
|
14
25
|
|
15
26
|
it "<= is equal lteq" do
|
16
|
-
|
17
|
-
mgr = relation.project relation[:id]
|
18
|
-
mgr.where relation[:id]<=(10)
|
19
|
-
res = mgr.to_sql
|
20
|
-
res.must_be_like('SELECT "users"."id" FROM "users" WHERE "users"."id" <= 10')
|
27
|
+
compile(@table[:id] <= 10).must_be_like('"users"."id" <= 10')
|
21
28
|
end
|
22
29
|
|
23
30
|
it "> is equal gt" do
|
24
|
-
|
25
|
-
mgr = relation.project relation[:id]
|
26
|
-
mgr.where relation[:id]>(10)
|
27
|
-
res = mgr.to_sql
|
28
|
-
res.must_be_like('SELECT "users"."id" FROM "users" WHERE "users"."id" > 10')
|
31
|
+
compile(@table[:id] > 10).must_be_like('"users"."id" > 10')
|
29
32
|
end
|
30
33
|
|
31
34
|
it "< is equal gteq" do
|
32
|
-
|
33
|
-
mgr = relation.project relation[:id]
|
34
|
-
mgr.where relation[:id]>=(10)
|
35
|
-
res = mgr.to_sql
|
36
|
-
res.must_be_like('SELECT "users"."id" FROM "users" WHERE "users"."id" >= 10')
|
35
|
+
compile(@table[:id] >= 10).must_be_like('"users"."id" >= 10')
|
37
36
|
end
|
38
37
|
|
39
38
|
it "should compare with dates" do
|
40
|
-
|
41
|
-
mgr = relation.project relation[:created_at]
|
42
|
-
mgr.where(relation[:created_at] >= Date.new(2016, 3, 31))
|
43
|
-
mgr.to_sql.must_match %{"users"."created_at" >= '2016-03-31'}
|
39
|
+
compile(@table[:created_at] >= Date.new(2016, 3, 31)).must_be_like %{"users"."created_at" >= '2016-03-31'}
|
44
40
|
end
|
45
41
|
|
46
42
|
end
|
@@ -19,7 +19,7 @@ module ArelExtensions
|
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should import large set of data in Oracle" do
|
22
|
-
|
22
|
+
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(@conn).into(@table)
|
23
23
|
insert_manager.bulk_insert(@cols, @data)
|
24
24
|
sql = compile(insert_manager.ast)
|
25
25
|
sql.must_be_like %Q[INSERT ALL INTO "users" ("id", "name", "comments", "created_at") VALUES (23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01') INTO "users" ("id", "name", "comments", "created_at") VALUES (25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01') SELECT 1 FROM dual]
|
@@ -20,7 +20,7 @@ module ArelExtensions
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should import large set of data" do
|
23
|
-
insert_manager = Arel::InsertManager.new(@conn).into(@table)
|
23
|
+
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(@conn).into(@table)
|
24
24
|
insert_manager.bulk_insert(@cols, @data)
|
25
25
|
sql = compile(insert_manager.ast)
|
26
26
|
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')]
|
@@ -5,6 +5,7 @@ module ArelExtensions
|
|
5
5
|
describe 'the to_sql visitor can bulk insert' do
|
6
6
|
before do
|
7
7
|
@conn = FakeRecord::Base.new
|
8
|
+
Arel::Table.engine = @conn
|
8
9
|
@visitor = Arel::Visitors::ToSql.new @conn.connection
|
9
10
|
@table = Arel::Table.new(:users)
|
10
11
|
@cols = ['id', 'name', 'comments', 'created_at']
|
@@ -20,10 +21,10 @@ module ArelExtensions
|
|
20
21
|
|
21
22
|
|
22
23
|
it "should import large set of data using ToSql" do
|
23
|
-
|
24
|
+
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(@conn).into(@table)
|
24
25
|
insert_manager.bulk_insert(@cols, @data)
|
25
26
|
sql = compile(insert_manager.ast)
|
26
|
-
|
27
|
+
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')]
|
27
28
|
end
|
28
29
|
|
29
30
|
|
@@ -6,8 +6,11 @@ module ArelExtensions
|
|
6
6
|
describe 'the sqlite visitor' do
|
7
7
|
|
8
8
|
before do
|
9
|
-
ActiveRecord::Base.
|
9
|
+
ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
|
10
|
+
ActiveRecord::Base.establish_connection(ENV['DB'] || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
|
11
|
+
ActiveRecord::Base.default_timezone = :utc
|
10
12
|
@cnx = ActiveRecord::Base.connection
|
13
|
+
Arel::Table.engine = ActiveRecord::Base
|
11
14
|
@cnx.drop_table(:users) rescue nil
|
12
15
|
@cnx.create_table :users do |t|
|
13
16
|
t.column :age, :integer
|
@@ -15,7 +18,7 @@ module ArelExtensions
|
|
15
18
|
t.column :comments, :text
|
16
19
|
t.column :created_at, :date
|
17
20
|
t.column :updated_at, :date
|
18
|
-
t.column :score, :
|
21
|
+
t.column :score, :decimal
|
19
22
|
end
|
20
23
|
@cnx.create_table :products do |t|
|
21
24
|
t.column :price, :decimal
|
@@ -32,7 +35,7 @@ module ArelExtensions
|
|
32
35
|
end
|
33
36
|
|
34
37
|
it "should import large set of data" do
|
35
|
-
insert_manager = Arel::InsertManager.new(ActiveRecord::Base).into(@table)
|
38
|
+
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(ActiveRecord::Base).into(@table)
|
36
39
|
insert_manager.bulk_insert(@cols, @data)
|
37
40
|
sql = insert_manager.to_sql
|
38
41
|
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')]
|
@@ -6,7 +6,9 @@ module ArelExtensions
|
|
6
6
|
describe 'the sqlite visitor can do maths' do
|
7
7
|
|
8
8
|
before do
|
9
|
-
ActiveRecord::Base.
|
9
|
+
ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
|
10
|
+
ActiveRecord::Base.establish_connection(ENV['DB'] || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
|
11
|
+
ActiveRecord::Base.default_timezone = :utc
|
10
12
|
Arel::Table.engine = ActiveRecord::Base
|
11
13
|
@cnx = ActiveRecord::Base.connection
|
12
14
|
@cnx.drop_table(:users) rescue nil
|
@@ -17,7 +19,7 @@ module ArelExtensions
|
|
17
19
|
t.column :comments, :text
|
18
20
|
t.column :created_at, :date
|
19
21
|
t.column :updated_at, :date
|
20
|
-
t.column :score, :
|
22
|
+
t.column :score, :decimal
|
21
23
|
end
|
22
24
|
@cnx.create_table :products do |t|
|
23
25
|
t.column :price, :decimal
|
@@ -49,8 +51,8 @@ module ArelExtensions
|
|
49
51
|
#CEIL # require extensions
|
50
52
|
|
51
53
|
# RAND
|
52
|
-
assert_equal 5, User.where(
|
53
|
-
assert_equal 8, User.
|
54
|
+
assert_equal 5, User.where(@table[:score].eq(20.16)).order(Arel.rand).limit(50).count
|
55
|
+
assert_equal 8, User.order(Arel.rand).limit(50).count
|
54
56
|
end
|
55
57
|
|
56
58
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'date'
|
3
|
+
|
4
|
+
module ArelExtensions
|
5
|
+
module WthAr
|
6
|
+
|
7
|
+
describe 'the mysql visitor can do string operations' do
|
8
|
+
|
9
|
+
before do
|
10
|
+
ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
|
11
|
+
ActiveRecord::Base.establish_connection(ENV['DB'] || (RUBY_PLATFORM == 'java' ? :"jdbc-mysql" : :mysql))
|
12
|
+
ActiveRecord::Base.default_timezone = :utc
|
13
|
+
begin
|
14
|
+
@cnx = ActiveRecord::Base.connection
|
15
|
+
Arel::Table.engine = ActiveRecord::Base
|
16
|
+
rescue => e
|
17
|
+
puts e.inspect
|
18
|
+
ActiveRecord::Base.establish_connection(ENV['DB'] || :sqlite)
|
19
|
+
@cnx = ActiveRecord::Base.connection
|
20
|
+
end
|
21
|
+
@cnx.drop_table(:users) rescue nil
|
22
|
+
@cnx.create_table :users do |t|
|
23
|
+
t.column :age, :integer
|
24
|
+
t.column :name, :string
|
25
|
+
t.column :comments, :text
|
26
|
+
t.column :created_at, :date
|
27
|
+
t.column :updated_at, :date
|
28
|
+
t.column :score, :decimal
|
29
|
+
end
|
30
|
+
@cnx.create_table :products do |t|
|
31
|
+
t.column :price, :decimal
|
32
|
+
end
|
33
|
+
class User < ActiveRecord::Base
|
34
|
+
end
|
35
|
+
d = Date.new(2016, 5,23)
|
36
|
+
@lucas = User.create! :age => 5, :name => "Lucas", :created_at => d, :score => 20.16
|
37
|
+
sophie = User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
|
38
|
+
@sophie = User.where(:id => sophie.id)
|
39
|
+
User.create! :age => 20, :name => "Camille", :created_at => d, :score => 20.16
|
40
|
+
User.create! :age => 21, :name => "Arthur", :created_at => d, :score => 65.62
|
41
|
+
User.create! :age => 23, :name => "Myung", :created_at => d, :score => 20.16
|
42
|
+
@laure = User.create :age => 25, :name => "Laure", :created_at => d, :score =>20.16
|
43
|
+
User.create! :age => nil, :name => "Test", :created_at => d, :score => 1.62
|
44
|
+
@neg = User.create :age => -20, :name => "Negatif", :created_at => d, :score => 0.17
|
45
|
+
@table = Arel::Table.new(:users)
|
46
|
+
@name = @table[:name]
|
47
|
+
end
|
48
|
+
after do
|
49
|
+
@cnx.drop_table(:users)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should do string operations" do
|
53
|
+
# concat
|
54
|
+
d = Date.new(1997, 6, 15)
|
55
|
+
assert_equal "SophiePhan", @sophie.select((@name + "Phan").as("res")).first.res
|
56
|
+
assert_equal "Sophie2", @sophie.select((@name + 2).as("res")).first.res
|
57
|
+
assert_equal "Sophie1997-06-15", @sophie.select((@name + d).as("res")).first.res
|
58
|
+
assert_equal "Sophie15", @sophie.select((User.arel_table[:name] + User.arel_table[:age]).as("res")).first.res
|
59
|
+
assert_equal "SophieSophie", @sophie.select((User.arel_table[:name] + User.arel_table[:name]).as("res")).first.res
|
60
|
+
assert_equal "Sophie2016-05-23", @sophie.select((User.arel_table[:name] + User.arel_table[:created_at]).as("res")).first.res
|
61
|
+
#concat Integer
|
62
|
+
assert_equal 1, User.where((User.arel_table[:age] + 10).eq(33)).count
|
63
|
+
assert_equal 1, User.where((User.arel_table[:age] + "1").eq(6)).count
|
64
|
+
assert_equal 1, User.where((User.arel_table[:age] + User.arel_table[:age]).eq(10)).count
|
65
|
+
|
66
|
+
|
67
|
+
|
68
|
+
# Replace
|
69
|
+
assert_equal "LucaX", User.where(:id => @lucas).select(@name.replace("s","X").as("res")).first.res
|
70
|
+
assert_equal "replace", User.where(:id => @lucas).select(@name.replace(@name,"replace").as("res")).first.res
|
71
|
+
|
72
|
+
#
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
@@ -7,10 +7,11 @@ module ArelExtensions
|
|
7
7
|
describe 'the sqlite visitor can do string operations' do
|
8
8
|
|
9
9
|
before do
|
10
|
-
ActiveRecord::Base.
|
11
|
-
|
12
|
-
|
10
|
+
ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
|
11
|
+
ActiveRecord::Base.establish_connection(ENV['DB'] || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
|
12
|
+
ActiveRecord::Base.default_timezone = :utc
|
13
13
|
@cnx = ActiveRecord::Base.connection
|
14
|
+
Arel::Table.engine = ActiveRecord::Base
|
14
15
|
@cnx.drop_table(:users) rescue nil
|
15
16
|
@cnx.create_table :users do |t|
|
16
17
|
t.column :age, :integer
|
@@ -18,11 +19,13 @@ module ArelExtensions
|
|
18
19
|
t.column :comments, :text
|
19
20
|
t.column :created_at, :date
|
20
21
|
t.column :updated_at, :date
|
21
|
-
t.column :score, :
|
22
|
+
t.column :score, :decimal
|
22
23
|
end
|
23
24
|
@cnx.create_table :products do |t|
|
24
25
|
t.column :price, :decimal
|
25
26
|
end
|
27
|
+
class User < ActiveRecord::Base
|
28
|
+
end
|
26
29
|
d = Date.new(2016, 5,23)
|
27
30
|
@lucas = User.create! :age => 5, :name => "Lucas", :created_at => d, :score => 20.16
|
28
31
|
sophie = User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
|
metadata
CHANGED
@@ -1,67 +1,25 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arel_extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yann Azoury
|
8
|
-
- Mathilde
|
8
|
+
- Mathilde Pechdimaldjian
|
9
9
|
- Félix Bellanger
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2016-08-
|
13
|
+
date: 2016-08-30 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
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
17
|
requirement: !ruby/object:Gem::Requirement
|
32
18
|
requirements:
|
33
19
|
- - ">="
|
34
20
|
- !ruby/object:Gem::Version
|
35
21
|
version: '0'
|
36
|
-
type: :
|
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
|
22
|
+
type: :runtime
|
65
23
|
prerelease: false
|
66
24
|
version_requirements: !ruby/object:Gem::Requirement
|
67
25
|
requirements:
|
@@ -69,21 +27,21 @@ dependencies:
|
|
69
27
|
- !ruby/object:Gem::Version
|
70
28
|
version: '0'
|
71
29
|
- !ruby/object:Gem::Dependency
|
72
|
-
name:
|
30
|
+
name: minitest
|
73
31
|
requirement: !ruby/object:Gem::Requirement
|
74
32
|
requirements:
|
75
33
|
- - "~>"
|
76
34
|
- !ruby/object:Gem::Version
|
77
|
-
version: '
|
35
|
+
version: '5.9'
|
78
36
|
type: :development
|
79
37
|
prerelease: false
|
80
38
|
version_requirements: !ruby/object:Gem::Requirement
|
81
39
|
requirements:
|
82
40
|
- - "~>"
|
83
41
|
- !ruby/object:Gem::Version
|
84
|
-
version: '
|
42
|
+
version: '5.9'
|
85
43
|
- !ruby/object:Gem::Dependency
|
86
|
-
name:
|
44
|
+
name: rdoc
|
87
45
|
requirement: !ruby/object:Gem::Requirement
|
88
46
|
requirements:
|
89
47
|
- - "~>"
|
@@ -97,19 +55,19 @@ dependencies:
|
|
97
55
|
- !ruby/object:Gem::Version
|
98
56
|
version: '4.0'
|
99
57
|
- !ruby/object:Gem::Dependency
|
100
|
-
name:
|
58
|
+
name: rake
|
101
59
|
requirement: !ruby/object:Gem::Requirement
|
102
60
|
requirements:
|
103
61
|
- - "~>"
|
104
62
|
- !ruby/object:Gem::Version
|
105
|
-
version: '
|
63
|
+
version: '11'
|
106
64
|
type: :development
|
107
65
|
prerelease: false
|
108
66
|
version_requirements: !ruby/object:Gem::Requirement
|
109
67
|
requirements:
|
110
68
|
- - "~>"
|
111
69
|
- !ruby/object:Gem::Version
|
112
|
-
version: '
|
70
|
+
version: '11'
|
113
71
|
description: Adds new features to Arel
|
114
72
|
email:
|
115
73
|
- yann.azoury@faveod.com
|
@@ -129,8 +87,9 @@ files:
|
|
129
87
|
- Rakefile
|
130
88
|
- arel_extensions.gemspec
|
131
89
|
- functions.html
|
90
|
+
- gemfiles/rails3.gemfile
|
91
|
+
- gemfiles/rails4.gemfile
|
132
92
|
- gemfiles/rails5.gemfile
|
133
|
-
- gemfiles/rasil3.gemfile
|
134
93
|
- init/mssql.sql
|
135
94
|
- init/mysql.sql
|
136
95
|
- init/oracle.sql
|
@@ -177,6 +136,7 @@ files:
|
|
177
136
|
- lib/arel_extensions/visitors/postgresql.rb
|
178
137
|
- lib/arel_extensions/visitors/sqlite.rb
|
179
138
|
- lib/arel_extensions/visitors/to_sql.rb
|
139
|
+
- test/database.yml
|
180
140
|
- test/helper.rb
|
181
141
|
- test/real_db_test.rb
|
182
142
|
- test/support/fake_record.rb
|
@@ -188,6 +148,7 @@ files:
|
|
188
148
|
- test/visitors/test_to_sql.rb
|
189
149
|
- test/with_ar/test_bulk_sqlite.rb
|
190
150
|
- test/with_ar/test_math_sqlite.rb
|
151
|
+
- test/with_ar/test_string_mysql.rb
|
191
152
|
- test/with_ar/test_string_sqlite.rb
|
192
153
|
homepage: https://github.com/Faveod/arel-extensions
|
193
154
|
licenses:
|
@@ -216,6 +177,7 @@ signing_key:
|
|
216
177
|
specification_version: 4
|
217
178
|
summary: Extending Arel
|
218
179
|
test_files:
|
180
|
+
- test/database.yml
|
219
181
|
- test/helper.rb
|
220
182
|
- test/real_db_test.rb
|
221
183
|
- test/support/fake_record.rb
|
@@ -227,4 +189,5 @@ test_files:
|
|
227
189
|
- test/visitors/test_to_sql.rb
|
228
190
|
- test/with_ar/test_bulk_sqlite.rb
|
229
191
|
- test/with_ar/test_math_sqlite.rb
|
192
|
+
- test/with_ar/test_string_mysql.rb
|
230
193
|
- test/with_ar/test_string_sqlite.rb
|