arel_extensions 2.0.21 → 2.2.2
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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +1 -2
- data/.github/workflows/publish.yml +29 -0
- data/.github/workflows/release.yml +30 -0
- data/.github/workflows/ruby.yml +377 -80
- data/.gitignore +7 -6
- data/.rubocop.yml +62 -1
- data/CONTRIBUTING.md +102 -0
- data/Gemfile +2 -23
- data/NEWS.md +89 -0
- data/README.md +228 -84
- data/Rakefile +11 -4
- data/TODO +0 -1
- data/appveyor.yml +60 -22
- data/arel_extensions.gemspec +11 -12
- data/bin/build +15 -0
- data/bin/compose +6 -0
- data/bin/publish +8 -0
- data/dev/arelx.dockerfile +44 -0
- data/dev/compose.yaml +71 -0
- data/dev/postgres.dockerfile +5 -0
- data/dev/rbenv +189 -0
- data/gemfiles/rails3.gemfile +10 -10
- data/gemfiles/rails4_2.gemfile +38 -0
- data/gemfiles/rails5.gemfile +29 -0
- data/gemfiles/rails5_1_4.gemfile +13 -13
- data/gemfiles/rails5_2.gemfile +16 -14
- data/gemfiles/rails6.gemfile +18 -15
- data/gemfiles/rails6_1.gemfile +18 -15
- data/gemfiles/rails7.gemfile +33 -0
- data/gemfiles/rails7_1.gemfile +33 -0
- data/gemfiles/rails7_2.gemfile +33 -0
- data/gemspecs/arel_extensions-v1.gemspec +12 -13
- data/gemspecs/arel_extensions-v2.gemspec +11 -12
- data/init/mssql.sql +0 -0
- data/init/mysql.sql +0 -0
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +0 -0
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/aliases.rb +14 -0
- data/lib/arel_extensions/attributes.rb +10 -2
- data/lib/arel_extensions/boolean_functions.rb +2 -4
- data/lib/arel_extensions/common_sql_functions.rb +12 -12
- data/lib/arel_extensions/comparators.rb +14 -14
- data/lib/arel_extensions/date_duration.rb +14 -9
- data/lib/arel_extensions/helpers.rb +62 -0
- data/lib/arel_extensions/insert_manager.rb +19 -17
- data/lib/arel_extensions/math.rb +48 -45
- data/lib/arel_extensions/math_functions.rb +18 -18
- data/lib/arel_extensions/nodes/abs.rb +0 -0
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -0
- data/lib/arel_extensions/nodes/blank.rb +1 -1
- data/lib/arel_extensions/nodes/case.rb +10 -12
- data/lib/arel_extensions/nodes/cast.rb +6 -6
- data/lib/arel_extensions/nodes/ceil.rb +0 -0
- data/lib/arel_extensions/nodes/change_case.rb +0 -0
- data/lib/arel_extensions/nodes/coalesce.rb +1 -1
- data/lib/arel_extensions/nodes/collate.rb +9 -9
- data/lib/arel_extensions/nodes/concat.rb +2 -2
- data/lib/arel_extensions/nodes/date_diff.rb +33 -14
- data/lib/arel_extensions/nodes/duration.rb +0 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +0 -0
- data/lib/arel_extensions/nodes/floor.rb +0 -0
- data/lib/arel_extensions/nodes/format.rb +3 -2
- data/lib/arel_extensions/nodes/formatted_date.rb +42 -0
- data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
- data/lib/arel_extensions/nodes/function.rb +22 -26
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +15 -9
- data/lib/arel_extensions/nodes/length.rb +6 -0
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +1 -1
- data/lib/arel_extensions/nodes/log10.rb +0 -0
- data/lib/arel_extensions/nodes/matches.rb +1 -1
- data/lib/arel_extensions/nodes/md5.rb +0 -0
- data/lib/arel_extensions/nodes/power.rb +0 -0
- data/lib/arel_extensions/nodes/rand.rb +0 -0
- data/lib/arel_extensions/nodes/repeat.rb +2 -2
- data/lib/arel_extensions/nodes/replace.rb +2 -10
- data/lib/arel_extensions/nodes/rollup.rb +36 -0
- data/lib/arel_extensions/nodes/round.rb +0 -0
- data/lib/arel_extensions/nodes/select.rb +10 -0
- data/lib/arel_extensions/nodes/soundex.rb +2 -2
- data/lib/arel_extensions/nodes/std.rb +0 -0
- data/lib/arel_extensions/nodes/substring.rb +1 -1
- data/lib/arel_extensions/nodes/sum.rb +0 -0
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +2 -2
- data/lib/arel_extensions/nodes/union.rb +5 -5
- data/lib/arel_extensions/nodes/union_all.rb +4 -4
- data/lib/arel_extensions/nodes/wday.rb +0 -0
- data/lib/arel_extensions/nodes.rb +0 -0
- data/lib/arel_extensions/null_functions.rb +16 -0
- data/lib/arel_extensions/predications.rb +10 -10
- data/lib/arel_extensions/railtie.rb +1 -1
- data/lib/arel_extensions/set_functions.rb +3 -3
- data/lib/arel_extensions/string_functions.rb +19 -10
- data/lib/arel_extensions/tasks.rb +2 -2
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/convert_format.rb +0 -0
- data/lib/arel_extensions/visitors/ibm_db.rb +20 -20
- data/lib/arel_extensions/visitors/mssql.rb +394 -169
- data/lib/arel_extensions/visitors/mysql.rb +238 -151
- data/lib/arel_extensions/visitors/oracle.rb +170 -131
- data/lib/arel_extensions/visitors/oracle12.rb +16 -16
- data/lib/arel_extensions/visitors/postgresql.rb +170 -140
- data/lib/arel_extensions/visitors/sqlite.rb +88 -87
- data/lib/arel_extensions/visitors/to_sql.rb +185 -156
- data/lib/arel_extensions/visitors.rb +73 -60
- data/lib/arel_extensions.rb +173 -36
- data/test/arelx_test_helper.rb +49 -1
- data/test/database.yml +13 -7
- data/test/real_db_test.rb +101 -83
- data/test/support/fake_record.rb +8 -2
- data/test/test_comparators.rb +5 -5
- data/test/visitors/test_bulk_insert_oracle.rb +5 -5
- data/test/visitors/test_bulk_insert_sqlite.rb +5 -5
- data/test/visitors/test_bulk_insert_to_sql.rb +5 -5
- data/test/visitors/test_oracle.rb +14 -14
- data/test/visitors/test_to_sql.rb +121 -93
- data/test/with_ar/all_agnostic_test.rb +630 -320
- data/test/with_ar/insert_agnostic_test.rb +25 -18
- data/test/with_ar/test_bulk_sqlite.rb +11 -7
- data/test/with_ar/test_math_sqlite.rb +18 -14
- data/test/with_ar/test_string_mysql.rb +26 -22
- data/test/with_ar/test_string_sqlite.rb +26 -22
- data/version_v1.rb +1 -1
- data/version_v2.rb +1 -1
- metadata +24 -26
- data/.travis/oracle/download.js +0 -152
- data/.travis/oracle/download.sh +0 -30
- data/.travis/oracle/download_ojdbc.js +0 -116
- data/.travis/oracle/install.sh +0 -34
- data/.travis/setup_accounts.sh +0 -9
- data/.travis/sqlite3/extension-functions.sh +0 -6
- data/.travis.yml +0 -193
- data/gemfiles/rails4.gemfile +0 -29
- data/gemfiles/rails5_0.gemfile +0 -29
@@ -2,18 +2,22 @@ require 'arelx_test_helper'
|
|
2
2
|
require 'date'
|
3
3
|
|
4
4
|
module ArelExtensions
|
5
|
-
module
|
5
|
+
module WithAr
|
6
6
|
class InsertManagerTest < Minitest::Test
|
7
|
-
def
|
7
|
+
def connect_db
|
8
8
|
ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
|
9
|
-
if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE ==
|
10
|
-
@env_db = (RUBY_PLATFORM == 'java' ?
|
11
|
-
skip "Platform not supported"
|
9
|
+
if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx') || (RUBY_PLATFORM == 'java')) # not supported
|
10
|
+
@env_db = (RUBY_PLATFORM == 'java' ? 'jdbc-sqlite' : 'sqlite')
|
11
|
+
skip "Platform not supported (DB: #{ENV['DB']}, RUBY_ENGINE: #{RUBY_ENGINE}, RUBY_PLATFORM: #{RUBY_PLATFORM})"
|
12
12
|
else
|
13
13
|
@env_db = ENV['DB']
|
14
14
|
end
|
15
15
|
ActiveRecord::Base.establish_connection(@env_db.try(:to_sym) || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
|
16
|
-
ActiveRecord::
|
16
|
+
if ActiveRecord::VERSION::MAJOR >= 7
|
17
|
+
ActiveRecord.default_timezone = :utc
|
18
|
+
else
|
19
|
+
ActiveRecord::Base.default_timezone = :utc
|
20
|
+
end
|
17
21
|
@cnx = ActiveRecord::Base.connection
|
18
22
|
Arel::Table.engine = ActiveRecord::Base
|
19
23
|
if File.exist?("init/#{@env_db}.sql")
|
@@ -22,6 +26,9 @@ module ArelExtensions
|
|
22
26
|
@cnx.execute(sql) rescue $stderr << "can't create functions\n"
|
23
27
|
end
|
24
28
|
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def setup_db
|
25
32
|
@cnx.drop_table(:user_tests) rescue nil
|
26
33
|
@cnx.create_table :user_tests do |t|
|
27
34
|
t.column :age, :integer
|
@@ -29,7 +36,7 @@ module ArelExtensions
|
|
29
36
|
t.column :comments, :text
|
30
37
|
t.column :created_at, :date
|
31
38
|
t.column :updated_at, :datetime
|
32
|
-
t.column :score, :decimal, :
|
39
|
+
t.column :score, :decimal, precision: 20, scale: 10
|
33
40
|
end
|
34
41
|
if @env_db == 'oracle'
|
35
42
|
@cnx.execute(%q[CREATE OR REPLACE trigger user_tests_trg
|
@@ -48,17 +55,18 @@ END;])
|
|
48
55
|
end
|
49
56
|
|
50
57
|
def setup
|
58
|
+
connect_db
|
51
59
|
setup_db
|
52
60
|
@table = Arel::Table.new(:user_tests)
|
53
|
-
@cols = [
|
61
|
+
@cols = %w[id name comments created_at]
|
54
62
|
@data = [
|
55
|
-
[23, 'nom1',
|
56
|
-
[25, 'nom2',
|
63
|
+
[23, 'nom1', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor.', '2016-01-01'],
|
64
|
+
[25, 'nom2', 'sdfdsfdsfsdf', '2016-01-02']
|
57
65
|
]
|
58
|
-
@cols2 = [
|
66
|
+
@cols2 = %w[name comments created_at]
|
59
67
|
@data2 = [
|
60
|
-
['nom3',
|
61
|
-
[
|
68
|
+
['nom3', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor.', '2016-01-01'],
|
69
|
+
%w[nom4 sdfdsfdsfsdf 2016-01-04]
|
62
70
|
]
|
63
71
|
end
|
64
72
|
|
@@ -68,15 +76,14 @@ END;])
|
|
68
76
|
|
69
77
|
# Math Functions
|
70
78
|
def test_bulk_insert
|
71
|
-
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new
|
79
|
+
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new.into(@table) : Arel::InsertManager.new(Arel::Table.engine).into(@table)
|
72
80
|
insert_manager.bulk_insert(@cols, @data)
|
73
81
|
@cnx.execute(insert_manager.to_sql)
|
74
|
-
assert_equal 2, User.count,
|
75
|
-
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new
|
82
|
+
assert_equal 2, User.count, 'insertions failed'
|
83
|
+
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new.into(@table) : Arel::InsertManager.new(Arel::Table.engine).into(@table)
|
76
84
|
insert_manager.bulk_insert(@cols2, @data2)
|
77
85
|
@cnx.execute(insert_manager.to_sql)
|
78
|
-
assert_equal 4, User.count,
|
79
|
-
|
86
|
+
assert_equal 4, User.count, 'insertions failed'
|
80
87
|
end
|
81
88
|
end
|
82
89
|
end
|
@@ -1,12 +1,16 @@
|
|
1
1
|
require 'arelx_test_helper'
|
2
2
|
|
3
3
|
module ArelExtensions
|
4
|
-
module
|
4
|
+
module WithAr
|
5
5
|
describe 'the sqlite visitor' do
|
6
6
|
before do
|
7
7
|
ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
|
8
8
|
ActiveRecord::Base.establish_connection(ENV['DB'] || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
|
9
|
-
ActiveRecord::
|
9
|
+
if ActiveRecord::VERSION::MAJOR >= 7
|
10
|
+
ActiveRecord.default_timezone = :utc
|
11
|
+
else
|
12
|
+
ActiveRecord::Base.default_timezone = :utc
|
13
|
+
end
|
10
14
|
@cnx = ActiveRecord::Base.connection
|
11
15
|
Arel::Table.engine = ActiveRecord::Base
|
12
16
|
@cnx.drop_table(:users) rescue nil
|
@@ -23,18 +27,18 @@ module ArelExtensions
|
|
23
27
|
t.column :price, :decimal
|
24
28
|
end
|
25
29
|
@table = Arel::Table.new(:users)
|
26
|
-
@cols = [
|
30
|
+
@cols = %w[id name comments created_at]
|
27
31
|
@data = [
|
28
|
-
[23, 'nom1',
|
29
|
-
[25, 'nom2',
|
32
|
+
[23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01'],
|
33
|
+
[25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
|
30
34
|
]
|
31
35
|
end
|
32
36
|
after do
|
33
37
|
@cnx.drop_table(:users)
|
34
38
|
end
|
35
39
|
|
36
|
-
it
|
37
|
-
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new
|
40
|
+
it 'should import large set of data' do
|
41
|
+
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new.into(@table) : Arel::InsertManager.new(ActiveRecord::Base).into(@table)
|
38
42
|
insert_manager.bulk_insert(@cols, @data)
|
39
43
|
_(insert_manager.to_sql)
|
40
44
|
.must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at")
|
@@ -1,12 +1,16 @@
|
|
1
1
|
require 'arelx_test_helper'
|
2
2
|
|
3
3
|
module ArelExtensions
|
4
|
-
module
|
4
|
+
module WithAr
|
5
5
|
describe 'the sqlite visitor can do maths' do
|
6
6
|
before do
|
7
7
|
ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
|
8
8
|
ActiveRecord::Base.establish_connection(ENV['DB'] || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
|
9
|
-
ActiveRecord::
|
9
|
+
if ActiveRecord::VERSION::MAJOR >= 7
|
10
|
+
ActiveRecord.default_timezone = :utc
|
11
|
+
else
|
12
|
+
ActiveRecord::Base.default_timezone = :utc
|
13
|
+
end
|
10
14
|
Arel::Table.engine = ActiveRecord::Base
|
11
15
|
@cnx = ActiveRecord::Base.connection
|
12
16
|
@cnx.drop_table(:users) rescue nil
|
@@ -24,15 +28,15 @@ module ArelExtensions
|
|
24
28
|
end
|
25
29
|
class User < ActiveRecord::Base
|
26
30
|
end
|
27
|
-
d = Date.new(2016, 5,23)
|
28
|
-
User.create :
|
29
|
-
User.create :
|
30
|
-
User.create :
|
31
|
-
User.create :
|
32
|
-
User.create :
|
33
|
-
@laure = User.create :
|
34
|
-
User.create :
|
35
|
-
@neg = User.create :
|
31
|
+
d = Date.new(2016, 5, 23)
|
32
|
+
User.create age: 5, name: 'Lucas', created_at: d, score: 20.16
|
33
|
+
User.create age: 15, name: 'Sophie', created_at: d, score: 20.16
|
34
|
+
User.create age: 20, name: 'Camille', created_at: d, score: 20.16
|
35
|
+
User.create age: 21, name: 'Arthur', created_at: d, score: 65.62
|
36
|
+
User.create age: 23, name: 'Myung', created_at: d, score: 20.16
|
37
|
+
@laure = User.create age: 25, name: 'Laure', created_at: d, score: 20.16
|
38
|
+
User.create age: nil, name: 'Test', created_at: d, score: 1.62
|
39
|
+
@neg = User.create age: -20, name: 'Negatif', created_at: d, score: 0.17
|
36
40
|
@table = Arel::Table.new(:users)
|
37
41
|
@age = @table[:age]
|
38
42
|
end
|
@@ -41,10 +45,10 @@ module ArelExtensions
|
|
41
45
|
@cnx.drop_table(:products)
|
42
46
|
end
|
43
47
|
|
44
|
-
it
|
48
|
+
it 'should do maths' do
|
45
49
|
# ABS
|
46
|
-
assert_equal 20, User.where(:
|
47
|
-
assert_equal 14, User.where(:
|
50
|
+
assert_equal 20, User.where(id: @neg.id).select(@age.abs.as('res')).first.res
|
51
|
+
assert_equal 14, User.where(id: @laure.id).select((@age - 39).abs.as('res')).first.res
|
48
52
|
|
49
53
|
# CEIL # require extensions
|
50
54
|
|
@@ -2,12 +2,16 @@ require 'arelx_test_helper'
|
|
2
2
|
require 'date'
|
3
3
|
|
4
4
|
module ArelExtensions
|
5
|
-
module
|
5
|
+
module WithAr
|
6
6
|
describe 'the mysql visitor can do string operations' do
|
7
7
|
before do
|
8
8
|
ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
|
9
9
|
ActiveRecord::Base.establish_connection(ENV['DB'] || (RUBY_PLATFORM == 'java' ? :"jdbc-mysql" : :mysql))
|
10
|
-
ActiveRecord::
|
10
|
+
if ActiveRecord::VERSION::MAJOR >= 7
|
11
|
+
ActiveRecord.default_timezone = :utc
|
12
|
+
else
|
13
|
+
ActiveRecord::Base.default_timezone = :utc
|
14
|
+
end
|
11
15
|
begin
|
12
16
|
@cnx = ActiveRecord::Base.connection
|
13
17
|
rescue => e
|
@@ -31,16 +35,16 @@ module ArelExtensions
|
|
31
35
|
end
|
32
36
|
class User < ActiveRecord::Base
|
33
37
|
end
|
34
|
-
d = Date.new(2016, 5,23)
|
35
|
-
@lucas = User.create :
|
36
|
-
sophie = User.create :
|
37
|
-
@sophie = User.where(:
|
38
|
-
User.create :
|
39
|
-
User.create :
|
40
|
-
User.create :
|
41
|
-
@laure = User.create :
|
42
|
-
User.create :
|
43
|
-
@neg = User.create :
|
38
|
+
d = Date.new(2016, 5, 23)
|
39
|
+
@lucas = User.create age: 5, name: 'Lucas', created_at: d, score: 20.16
|
40
|
+
sophie = User.create age: 15, name: 'Sophie', created_at: d, score: 20.16
|
41
|
+
@sophie = User.where(id: sophie.id)
|
42
|
+
User.create age: 20, name: 'Camille', created_at: d, score: 20.16
|
43
|
+
User.create age: 21, name: 'Arthur', created_at: d, score: 65.62
|
44
|
+
User.create age: 23, name: 'Myung', created_at: d, score: 20.16
|
45
|
+
@laure = User.create age: 25, name: 'Laure', created_at: d, score: 20.16
|
46
|
+
User.create age: nil, name: 'Test', created_at: d, score: 1.62
|
47
|
+
@neg = User.create age: -20, name: 'Negatif', created_at: d, score: 0.17
|
44
48
|
@table = Arel::Table.new(:users)
|
45
49
|
@name = @table[:name]
|
46
50
|
end
|
@@ -48,23 +52,23 @@ module ArelExtensions
|
|
48
52
|
@cnx.drop_table(:users)
|
49
53
|
end
|
50
54
|
|
51
|
-
it
|
55
|
+
it 'should do string operations' do
|
52
56
|
# concat
|
53
57
|
d = Date.new(1997, 6, 15)
|
54
|
-
assert_equal
|
55
|
-
assert_equal
|
56
|
-
assert_equal
|
57
|
-
assert_equal
|
58
|
-
assert_equal
|
59
|
-
assert_equal
|
58
|
+
assert_equal 'SophiePhan', @sophie.select((@name + 'Phan').as('res')).first.res
|
59
|
+
assert_equal 'Sophie2', @sophie.select((@name + 2).as('res')).first.res
|
60
|
+
assert_equal 'Sophie1997-06-15', @sophie.select((@name + d).as('res')).first.res
|
61
|
+
assert_equal 'Sophie15', @sophie.select((User.arel_table[:name] + User.arel_table[:age]).as('res')).first.res
|
62
|
+
assert_equal 'SophieSophie', @sophie.select((User.arel_table[:name] + User.arel_table[:name]).as('res')).first.res
|
63
|
+
assert_equal 'Sophie2016-05-23', @sophie.select((User.arel_table[:name] + User.arel_table[:created_at]).as('res')).first.res
|
60
64
|
# concat Integer
|
61
65
|
assert_equal 1, User.where((User.arel_table[:age] + 10).eq(33)).count
|
62
|
-
assert_equal 1, User.where((User.arel_table[:age] +
|
66
|
+
assert_equal 1, User.where((User.arel_table[:age] + '1').eq(6)).count
|
63
67
|
assert_equal 1, User.where((User.arel_table[:age] + User.arel_table[:age]).eq(10)).count
|
64
68
|
|
65
69
|
# Replace
|
66
|
-
assert_equal
|
67
|
-
assert_equal
|
70
|
+
assert_equal 'LucaX', User.where(id: @lucas).select(@name.replace('s', 'X').as('res')).first.res
|
71
|
+
assert_equal 'replace', User.where(id: @lucas).select(@name.replace(@name, 'replace').as('res')).first.res
|
68
72
|
end
|
69
73
|
end
|
70
74
|
end
|
@@ -2,12 +2,16 @@ require 'arelx_test_helper'
|
|
2
2
|
require 'date'
|
3
3
|
|
4
4
|
module ArelExtensions
|
5
|
-
module
|
5
|
+
module WithAr
|
6
6
|
describe 'the sqlite visitor can do string operations' do
|
7
7
|
before do
|
8
8
|
ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
|
9
9
|
ActiveRecord::Base.establish_connection(ENV['DB'] || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
|
10
|
-
ActiveRecord::
|
10
|
+
if ActiveRecord::VERSION::MAJOR >= 7
|
11
|
+
ActiveRecord.default_timezone = :utc
|
12
|
+
else
|
13
|
+
ActiveRecord::Base.default_timezone = :utc
|
14
|
+
end
|
11
15
|
@cnx = ActiveRecord::Base.connection
|
12
16
|
Arel::Table.engine = ActiveRecord::Base
|
13
17
|
@cnx.drop_table(:users) rescue nil
|
@@ -24,16 +28,16 @@ module ArelExtensions
|
|
24
28
|
end
|
25
29
|
class User < ActiveRecord::Base
|
26
30
|
end
|
27
|
-
d = Date.new(2016, 5,23)
|
28
|
-
@lucas = User.create! :
|
29
|
-
sophie = User.create :
|
30
|
-
@sophie = User.where(:
|
31
|
-
User.create! :
|
32
|
-
User.create! :
|
33
|
-
User.create! :
|
34
|
-
@laure = User.create :
|
35
|
-
User.create! :
|
36
|
-
@neg = User.create :
|
31
|
+
d = Date.new(2016, 5, 23)
|
32
|
+
@lucas = User.create! age: 5, name: 'Lucas', created_at: d, score: 20.16
|
33
|
+
sophie = User.create age: 15, name: 'Sophie', created_at: d, score: 20.16
|
34
|
+
@sophie = User.where(id: sophie.id)
|
35
|
+
User.create! age: 20, name: 'Camille', created_at: d, score: 20.16
|
36
|
+
User.create! age: 21, name: 'Arthur', created_at: d, score: 65.62
|
37
|
+
User.create! age: 23, name: 'Myung', created_at: d, score: 20.16
|
38
|
+
@laure = User.create age: 25, name: 'Laure', created_at: d, score: 20.16
|
39
|
+
User.create! age: nil, name: 'Test', created_at: d, score: 1.62
|
40
|
+
@neg = User.create age: -20, name: 'Negatif', created_at: d, score: 0.17
|
37
41
|
@table = Arel::Table.new(:users)
|
38
42
|
@name = @table[:name]
|
39
43
|
end
|
@@ -41,23 +45,23 @@ module ArelExtensions
|
|
41
45
|
@cnx.drop_table(:users)
|
42
46
|
end
|
43
47
|
|
44
|
-
it
|
48
|
+
it 'should do string operations' do
|
45
49
|
# concat
|
46
50
|
d = Date.new(1997, 6, 15)
|
47
|
-
assert_equal
|
48
|
-
assert_equal
|
49
|
-
assert_equal
|
50
|
-
assert_equal
|
51
|
-
assert_equal
|
52
|
-
assert_equal
|
51
|
+
assert_equal 'SophiePhan', @sophie.select((@name + 'Phan').as('res')).first.res
|
52
|
+
assert_equal 'Sophie2', @sophie.select((@name + 2).as('res')).first.res
|
53
|
+
assert_equal 'Sophie1997-06-15', @sophie.select((@name + d).as('res')).first.res
|
54
|
+
assert_equal 'Sophie15', @sophie.select((User.arel_table[:name] + User.arel_table[:age]).as('res')).first.res
|
55
|
+
assert_equal 'SophieSophie', @sophie.select((User.arel_table[:name] + User.arel_table[:name]).as('res')).first.res
|
56
|
+
assert_equal 'Sophie2016-05-23', @sophie.select((User.arel_table[:name] + User.arel_table[:created_at]).as('res')).first.res
|
53
57
|
# concat Integer
|
54
58
|
assert_equal 1, User.where((User.arel_table[:age] + 10).eq(33)).count
|
55
|
-
assert_equal 1, User.where((User.arel_table[:age] +
|
59
|
+
assert_equal 1, User.where((User.arel_table[:age] + '1').eq(6)).count
|
56
60
|
assert_equal 1, User.where((User.arel_table[:age] + User.arel_table[:age]).eq(10)).count
|
57
61
|
|
58
62
|
# Replace
|
59
|
-
assert_equal
|
60
|
-
assert_equal
|
63
|
+
assert_equal 'LucaX', User.where(id: @lucas).select(@name.replace('s', 'X').as('res')).first.res
|
64
|
+
assert_equal 'replace', User.where(id: @lucas).select(@name.replace(@name, 'replace').as('res')).first.res
|
61
65
|
end
|
62
66
|
end
|
63
67
|
end
|
data/version_v1.rb
CHANGED
data/version_v2.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arel_extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yann Azoury
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2024-11-27 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
@@ -40,20 +40,6 @@ dependencies:
|
|
40
40
|
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: '5.9'
|
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
43
|
- !ruby/object:Gem::Dependency
|
58
44
|
name: rake
|
59
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,32 +67,39 @@ extra_rdoc_files:
|
|
81
67
|
- functions.html
|
82
68
|
files:
|
83
69
|
- ".codeclimate.yml"
|
70
|
+
- ".github/workflows/publish.yml"
|
71
|
+
- ".github/workflows/release.yml"
|
84
72
|
- ".github/workflows/ruby.yml"
|
85
73
|
- ".gitignore"
|
86
74
|
- ".rubocop.yml"
|
87
|
-
-
|
88
|
-
- ".travis/oracle/download.js"
|
89
|
-
- ".travis/oracle/download.sh"
|
90
|
-
- ".travis/oracle/download_ojdbc.js"
|
91
|
-
- ".travis/oracle/install.sh"
|
92
|
-
- ".travis/setup_accounts.sh"
|
93
|
-
- ".travis/sqlite3/extension-functions.sh"
|
75
|
+
- CONTRIBUTING.md
|
94
76
|
- Gemfile
|
95
77
|
- MIT-LICENSE.txt
|
78
|
+
- NEWS.md
|
96
79
|
- README.md
|
97
80
|
- Rakefile
|
98
81
|
- SQL_Challenges.md
|
99
82
|
- TODO
|
100
83
|
- appveyor.yml
|
101
84
|
- arel_extensions.gemspec
|
85
|
+
- bin/build
|
86
|
+
- bin/compose
|
87
|
+
- bin/publish
|
88
|
+
- dev/arelx.dockerfile
|
89
|
+
- dev/compose.yaml
|
90
|
+
- dev/postgres.dockerfile
|
91
|
+
- dev/rbenv
|
102
92
|
- functions.html
|
103
93
|
- gemfiles/rails3.gemfile
|
104
|
-
- gemfiles/
|
105
|
-
- gemfiles/
|
94
|
+
- gemfiles/rails4_2.gemfile
|
95
|
+
- gemfiles/rails5.gemfile
|
106
96
|
- gemfiles/rails5_1_4.gemfile
|
107
97
|
- gemfiles/rails5_2.gemfile
|
108
98
|
- gemfiles/rails6.gemfile
|
109
99
|
- gemfiles/rails6_1.gemfile
|
100
|
+
- gemfiles/rails7.gemfile
|
101
|
+
- gemfiles/rails7_1.gemfile
|
102
|
+
- gemfiles/rails7_2.gemfile
|
110
103
|
- gemspecs/arel_extensions-v1.gemspec
|
111
104
|
- gemspecs/arel_extensions-v2.gemspec
|
112
105
|
- generate_gems.sh
|
@@ -116,11 +109,13 @@ files:
|
|
116
109
|
- init/postgresql.sql
|
117
110
|
- init/sqlite.sql
|
118
111
|
- lib/arel_extensions.rb
|
112
|
+
- lib/arel_extensions/aliases.rb
|
119
113
|
- lib/arel_extensions/attributes.rb
|
120
114
|
- lib/arel_extensions/boolean_functions.rb
|
121
115
|
- lib/arel_extensions/common_sql_functions.rb
|
122
116
|
- lib/arel_extensions/comparators.rb
|
123
117
|
- lib/arel_extensions/date_duration.rb
|
118
|
+
- lib/arel_extensions/helpers.rb
|
124
119
|
- lib/arel_extensions/insert_manager.rb
|
125
120
|
- lib/arel_extensions/math.rb
|
126
121
|
- lib/arel_extensions/math_functions.rb
|
@@ -140,6 +135,7 @@ files:
|
|
140
135
|
- lib/arel_extensions/nodes/find_in_set.rb
|
141
136
|
- lib/arel_extensions/nodes/floor.rb
|
142
137
|
- lib/arel_extensions/nodes/format.rb
|
138
|
+
- lib/arel_extensions/nodes/formatted_date.rb
|
143
139
|
- lib/arel_extensions/nodes/formatted_number.rb
|
144
140
|
- lib/arel_extensions/nodes/function.rb
|
145
141
|
- lib/arel_extensions/nodes/is_null.rb
|
@@ -154,7 +150,9 @@ files:
|
|
154
150
|
- lib/arel_extensions/nodes/rand.rb
|
155
151
|
- lib/arel_extensions/nodes/repeat.rb
|
156
152
|
- lib/arel_extensions/nodes/replace.rb
|
153
|
+
- lib/arel_extensions/nodes/rollup.rb
|
157
154
|
- lib/arel_extensions/nodes/round.rb
|
155
|
+
- lib/arel_extensions/nodes/select.rb
|
158
156
|
- lib/arel_extensions/nodes/soundex.rb
|
159
157
|
- lib/arel_extensions/nodes/std.rb
|
160
158
|
- lib/arel_extensions/nodes/substring.rb
|
@@ -222,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
222
220
|
- !ruby/object:Gem::Version
|
223
221
|
version: '0'
|
224
222
|
requirements: []
|
225
|
-
rubygems_version: 3.
|
223
|
+
rubygems_version: 3.4.19
|
226
224
|
signing_key:
|
227
225
|
specification_version: 4
|
228
226
|
summary: Extending Arel
|
data/.travis/oracle/download.js
DELETED
@@ -1,152 +0,0 @@
|
|
1
|
-
// vim: set et sw=2 ts=2:
|
2
|
-
"use strict";
|
3
|
-
var env = process.env;
|
4
|
-
var url = require('url');
|
5
|
-
var Promise = require('bluebird');
|
6
|
-
var Phantom = Promise.promisifyAll(require('node-phantom-simple'));
|
7
|
-
|
8
|
-
var login = {
|
9
|
-
begin: url.parse(env['ORACLE_LOGIN_BEGIN'] || "https://www.oracle.com/webapps/redirect/signon?nexturl=https://www.oracle.com/favicon.ico"),
|
10
|
-
end: url.parse(env['ORCALE_LOGIN_END'] || "https://www.oracle.com/favicon.ico"),
|
11
|
-
};
|
12
|
-
delete env['ORACLE_LOGIN_BEGIN'];
|
13
|
-
delete env['ORACLE_LOGIN_END'];
|
14
|
-
|
15
|
-
var credentials = Object.keys(env)
|
16
|
-
.filter(function (key) { return key.indexOf('ORACLE_LOGIN_') == 0 })
|
17
|
-
.map(function (key) { return [key.substr(13), env[key]] });
|
18
|
-
|
19
|
-
if (credentials.length <= 0) {
|
20
|
-
console.error("Missing ORACLE_LOGIN environment variables!");
|
21
|
-
process.exit(1);
|
22
|
-
}
|
23
|
-
|
24
|
-
Phantom.createAsync({ parameters: { 'ssl-protocol': 'tlsv1' } }).then(function (browser) {
|
25
|
-
browser = Promise.promisifyAll(browser, { suffix: 'Promise' });
|
26
|
-
browser.addCookie({'name': 'oraclelicense', 'value': "accept-" + env['ORACLE_COOKIE'] + "-cookie", 'domain': '.oracle.com' });
|
27
|
-
|
28
|
-
// Open a tab, configure it
|
29
|
-
return browser.createPagePromise().then(function (page) {
|
30
|
-
page = Promise.promisifyAll(page, { suffix: 'Promise' });
|
31
|
-
|
32
|
-
var received = "";
|
33
|
-
page.onNavigationRequested = function () { console.info("%s %j", (new Date()).toISOString(), arguments["0"]); };
|
34
|
-
page.onResourceError = console.error.bind(console);
|
35
|
-
page.onResourceReceived = function (response) { if (response.stage == "end") received = response.url; };
|
36
|
-
page.set('settings.loadImages', false);
|
37
|
-
|
38
|
-
return page
|
39
|
-
.setPromise('settings.userAgent', env['USER_AGENT']) // PhantomJS configures the UA per tab
|
40
|
-
|
41
|
-
// Begin login, wait for the login page
|
42
|
-
.then(function () {
|
43
|
-
return page.openPromise(login.begin.href).then(function (status) {
|
44
|
-
if (status != 'success') throw "Unable to connect to " + login.begin.host;
|
45
|
-
|
46
|
-
return new Promise(function (resolve, reject) {
|
47
|
-
var deadline = Date.now() + 6000;
|
48
|
-
var interval = 100;
|
49
|
-
|
50
|
-
var check = function () {
|
51
|
-
if (deadline < Date.now()) return reject("Timeout waiting for form");
|
52
|
-
|
53
|
-
page.evaluate(function () {
|
54
|
-
return window['jQuery'] && document.querySelectorAll('input[type=password]').length;
|
55
|
-
}, function (err, result) {
|
56
|
-
if (result) { resolve(); } else { setTimeout(check, interval); }
|
57
|
-
});
|
58
|
-
};
|
59
|
-
|
60
|
-
check();
|
61
|
-
});
|
62
|
-
})
|
63
|
-
.tapCatch(function (err) {
|
64
|
-
return page.getPromise('plainText').then(function (text) {
|
65
|
-
console.error("Unable to load login page. Last response was:\n" + text);
|
66
|
-
});
|
67
|
-
});
|
68
|
-
})
|
69
|
-
|
70
|
-
// Submit the login form
|
71
|
-
.then(function () {
|
72
|
-
return page.evaluatePromise(function (credentials) {
|
73
|
-
var $form = jQuery(document.forms[0]);
|
74
|
-
return credentials.filter(function (tuple) {
|
75
|
-
return $form.find("[name='"+tuple[0]+"']").val(tuple[1]).length == 0;
|
76
|
-
})
|
77
|
-
.map(function (tuple) { return tuple[0]; });
|
78
|
-
}, credentials)
|
79
|
-
.then(function (unapplied) {
|
80
|
-
if (unapplied.length > 0) {
|
81
|
-
console.warn("Unable to use all ORACLE_LOGIN environment variables: %j", unapplied);
|
82
|
-
}
|
83
|
-
return page.evaluatePromise(function () {
|
84
|
-
jQuery(function () { document.forms[0].submit(); });
|
85
|
-
});
|
86
|
-
});
|
87
|
-
})
|
88
|
-
|
89
|
-
// Wait for login result
|
90
|
-
.then(function () {
|
91
|
-
return new Promise(function (resolve, reject) {
|
92
|
-
var deadline = Date.now() + 6000;
|
93
|
-
var interval = 100;
|
94
|
-
|
95
|
-
var check = function () {
|
96
|
-
if (deadline < Date.now()) return reject("Timeout waiting for " + login.end.href);
|
97
|
-
if (received == login.end.href) { resolve(); } else { setTimeout(check, interval); }
|
98
|
-
};
|
99
|
-
|
100
|
-
check();
|
101
|
-
})
|
102
|
-
.tapCatch(function (err) {
|
103
|
-
return page.getPromise('plainText').then(function (text) {
|
104
|
-
console.error("Unable to load login result. Last response was:\n" + text);
|
105
|
-
});
|
106
|
-
});
|
107
|
-
})
|
108
|
-
|
109
|
-
// Export cookies for cURL
|
110
|
-
.then(function () {
|
111
|
-
return browser.getPromise('cookies').then(function (cookies) {
|
112
|
-
var data = "";
|
113
|
-
for (var i = 0; i < cookies.length; ++i) {
|
114
|
-
var cookie = cookies[i];
|
115
|
-
data += cookie.domain + "\tTRUE\t" + cookie.path + "\t"
|
116
|
-
+ (cookie.secure ? "TRUE" : "FALSE") + "\t0\t"
|
117
|
-
+ cookie.name + "\t" + cookie.value + "\n";
|
118
|
-
}
|
119
|
-
return Promise.promisify(require('fs').writeFile)(env['COOKIES'], data);
|
120
|
-
});
|
121
|
-
})
|
122
|
-
|
123
|
-
// Download file using cURL
|
124
|
-
.then(function () {
|
125
|
-
return browser.exitPromise().then(function () {
|
126
|
-
var cmd = ['curl', [
|
127
|
-
'--cookie', env['COOKIES'],
|
128
|
-
'--cookie-jar', env['COOKIES'],
|
129
|
-
'--location',
|
130
|
-
'--output', env['ORACLE_DOWNLOAD_FILE'],
|
131
|
-
'--user-agent', env['USER_AGENT'],
|
132
|
-
"https://edelivery.oracle.com/akam/otn/linux/" + env['ORACLE_FILE']
|
133
|
-
]];
|
134
|
-
|
135
|
-
console.info("Executing %j", cmd);
|
136
|
-
|
137
|
-
var child_process = require('child_process');
|
138
|
-
var child = child_process.spawn.apply(child_process, cmd.concat({ stdio: [0, 1, 2] }));
|
139
|
-
child.on('exit', process.exit);
|
140
|
-
});
|
141
|
-
})
|
142
|
-
.catch(function (err) {
|
143
|
-
console.error(err);
|
144
|
-
browser.on('exit', function () { process.exit(1); });
|
145
|
-
browser.exit();
|
146
|
-
});
|
147
|
-
});
|
148
|
-
})
|
149
|
-
.catch(function (err) {
|
150
|
-
console.error(err);
|
151
|
-
process.exit(1);
|
152
|
-
});
|