arel_extensions 2.1.3 → 2.1.4
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/ruby.yml +4 -4
- data/.rubocop.yml +25 -1
- data/Gemfile +10 -10
- data/README.md +1 -2
- data/Rakefile +4 -4
- data/TODO +0 -1
- data/arel_extensions.gemspec +11 -11
- data/gemfiles/rails3.gemfile +10 -10
- data/gemfiles/rails4.gemfile +13 -13
- data/gemfiles/rails5_0.gemfile +12 -12
- data/gemfiles/rails5_1_4.gemfile +12 -12
- data/gemfiles/rails5_2.gemfile +13 -13
- data/gemfiles/rails6.gemfile +11 -11
- data/gemfiles/rails6_1.gemfile +11 -11
- data/gemfiles/rails7.gemfile +7 -7
- data/gemspecs/arel_extensions-v1.gemspec +12 -12
- data/gemspecs/arel_extensions-v2.gemspec +11 -11
- 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/attributes.rb +2 -2
- data/lib/arel_extensions/boolean_functions.rb +2 -4
- data/lib/arel_extensions/common_sql_functions.rb +10 -10
- data/lib/arel_extensions/comparators.rb +14 -14
- data/lib/arel_extensions/date_duration.rb +7 -7
- data/lib/arel_extensions/helpers.rb +16 -13
- data/lib/arel_extensions/insert_manager.rb +1 -1
- data/lib/arel_extensions/math.rb +16 -18
- 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 +4 -6
- data/lib/arel_extensions/nodes/cast.rb +3 -3
- 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 +0 -0
- 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 +6 -6
- 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 +0 -0
- data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
- data/lib/arel_extensions/nodes/function.rb +21 -21
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +7 -7
- data/lib/arel_extensions/nodes/length.rb +0 -0
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +0 -0
- 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 +0 -0
- data/lib/arel_extensions/nodes/replace.rb +2 -2
- data/lib/arel_extensions/nodes/round.rb +0 -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 +0 -0
- data/lib/arel_extensions/nodes/sum.rb +0 -0
- data/lib/arel_extensions/nodes/then.rb +0 -0
- data/lib/arel_extensions/nodes/trim.rb +0 -0
- data/lib/arel_extensions/nodes/union.rb +4 -4
- data/lib/arel_extensions/nodes/union_all.rb +3 -3
- data/lib/arel_extensions/nodes/wday.rb +0 -0
- data/lib/arel_extensions/nodes.rb +0 -0
- data/lib/arel_extensions/null_functions.rb +0 -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 +8 -8
- 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 +19 -19
- data/lib/arel_extensions/visitors/mssql.rb +127 -121
- data/lib/arel_extensions/visitors/mysql.rb +137 -145
- data/lib/arel_extensions/visitors/oracle.rb +128 -128
- data/lib/arel_extensions/visitors/oracle12.rb +16 -16
- data/lib/arel_extensions/visitors/postgresql.rb +139 -137
- data/lib/arel_extensions/visitors/sqlite.rb +83 -85
- data/lib/arel_extensions/visitors/to_sql.rb +143 -148
- data/lib/arel_extensions/visitors.rb +7 -7
- data/lib/arel_extensions.rb +46 -32
- data/test/arelx_test_helper.rb +14 -13
- data/test/database.yml +5 -5
- data/test/real_db_test.rb +78 -78
- data/test/support/fake_record.rb +1 -1
- data/test/test_comparators.rb +5 -5
- data/test/visitors/test_bulk_insert_oracle.rb +4 -4
- data/test/visitors/test_bulk_insert_sqlite.rb +4 -4
- data/test/visitors/test_bulk_insert_to_sql.rb +4 -4
- data/test/visitors/test_oracle.rb +14 -14
- data/test/visitors/test_to_sql.rb +82 -82
- data/test/with_ar/all_agnostic_test.rb +364 -299
- data/test/with_ar/insert_agnostic_test.rb +17 -14
- data/test/with_ar/test_bulk_sqlite.rb +4 -4
- data/test/with_ar/test_math_sqlite.rb +12 -12
- data/test/with_ar/test_string_mysql.rb +20 -20
- data/test/with_ar/test_string_sqlite.rb +20 -20
- data/version_v1.rb +1 -1
- data/version_v2.rb +1 -1
- metadata +2 -9
- 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
|
@@ -32,9 +32,9 @@ if defined?(Arel::Visitors::MSSQL)
|
|
|
32
32
|
else
|
|
33
33
|
collector = visit o.left, collector
|
|
34
34
|
end
|
|
35
|
-
collector <<
|
|
35
|
+
collector << ' AS ['
|
|
36
36
|
collector = visit o.right, collector
|
|
37
|
-
collector <<
|
|
37
|
+
collector << ']'
|
|
38
38
|
collector
|
|
39
39
|
end
|
|
40
40
|
|
|
@@ -44,7 +44,7 @@ if defined?(Arel::Visitors::MSSQL)
|
|
|
44
44
|
o = o.dup
|
|
45
45
|
o.orders = []
|
|
46
46
|
end
|
|
47
|
-
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
|
47
|
+
old_visit_Arel_Nodes_SelectStatement(o, collector)
|
|
48
48
|
end
|
|
49
49
|
end
|
|
50
50
|
|
|
@@ -61,7 +61,7 @@ if defined?(Arel::Visitors::MSSQL)
|
|
|
61
61
|
o = o.dup
|
|
62
62
|
o.orders = []
|
|
63
63
|
end
|
|
64
|
-
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
|
64
|
+
old_visit_Arel_Nodes_SelectStatement(o, collector)
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
alias_method(:old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As) rescue nil
|
|
@@ -73,9 +73,9 @@ if defined?(Arel::Visitors::MSSQL)
|
|
|
73
73
|
else
|
|
74
74
|
collector = visit o.left, collector
|
|
75
75
|
end
|
|
76
|
-
collector <<
|
|
76
|
+
collector << ' AS ['
|
|
77
77
|
collector = visit o.right, collector
|
|
78
|
-
collector <<
|
|
78
|
+
collector << ']'
|
|
79
79
|
collector
|
|
80
80
|
end
|
|
81
81
|
|
|
@@ -92,6 +92,6 @@ if defined?(Arel::Visitors::MSSQL)
|
|
|
92
92
|
end
|
|
93
93
|
rescue LoadError
|
|
94
94
|
rescue => e
|
|
95
|
-
|
|
95
|
+
e
|
|
96
96
|
end
|
|
97
97
|
end
|
data/lib/arel_extensions.rb
CHANGED
|
@@ -16,7 +16,7 @@ class Arel::Nodes::Casted
|
|
|
16
16
|
include Arel::AliasPredication
|
|
17
17
|
|
|
18
18
|
# They forget to define hash.
|
|
19
|
-
if Gem::Version.new(Arel::VERSION) < Gem::Version.new(
|
|
19
|
+
if Gem::Version.new(Arel::VERSION) < Gem::Version.new('10.0.0')
|
|
20
20
|
def hash
|
|
21
21
|
[self.class, self.val, self.attribute].hash
|
|
22
22
|
end
|
|
@@ -44,13 +44,14 @@ class Arel::Nodes::Function
|
|
|
44
44
|
include Arel::Expressions
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
if Gem::Version.new(Arel::VERSION) >= Gem::Version.new(
|
|
47
|
+
if Gem::Version.new(Arel::VERSION) >= Gem::Version.new('7.1.0')
|
|
48
48
|
class Arel::Nodes::Case
|
|
49
49
|
include Arel::Math
|
|
50
50
|
include Arel::Expressions
|
|
51
51
|
end
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
+
require 'arel_extensions/helpers'
|
|
54
55
|
require 'arel_extensions/version'
|
|
55
56
|
require 'arel_extensions/aliases'
|
|
56
57
|
require 'arel_extensions/attributes'
|
|
@@ -90,12 +91,21 @@ if defined?(Arel::Visitors::SQLServer)
|
|
|
90
91
|
end
|
|
91
92
|
|
|
92
93
|
module Arel
|
|
93
|
-
def self.
|
|
94
|
-
ArelExtensions
|
|
94
|
+
def self.column_of table_name, column_name
|
|
95
|
+
ArelExtensions.column_of(table_name, column_name)
|
|
95
96
|
end
|
|
96
97
|
|
|
97
|
-
def self.
|
|
98
|
-
|
|
98
|
+
def self.duration s, expr
|
|
99
|
+
ArelExtensions::Nodes::Duration.new("#{s}i", expr)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# The FALSE pseudo literal.
|
|
103
|
+
def self.false
|
|
104
|
+
Arel::Nodes::Equality.new(1, 0)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def self.grouping *v
|
|
108
|
+
Arel::Nodes::Grouping.new(*v)
|
|
99
109
|
end
|
|
100
110
|
|
|
101
111
|
def self.json *expr
|
|
@@ -108,16 +118,21 @@ module Arel
|
|
|
108
118
|
)
|
|
109
119
|
end
|
|
110
120
|
|
|
111
|
-
|
|
112
|
-
|
|
121
|
+
# The NULL literal.
|
|
122
|
+
def self.null
|
|
123
|
+
Arel.quoted(nil)
|
|
113
124
|
end
|
|
114
125
|
|
|
115
|
-
def self.
|
|
116
|
-
|
|
126
|
+
def self.quoted *args
|
|
127
|
+
Arel::Nodes.build_quoted(*args)
|
|
117
128
|
end
|
|
118
129
|
|
|
119
|
-
def self.
|
|
120
|
-
|
|
130
|
+
def self.rand
|
|
131
|
+
ArelExtensions::Nodes::Rand.new
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def self.shorten s
|
|
135
|
+
Base64.urlsafe_encode64(Digest::MD5.new.digest(s)).tr('=', '').tr('-', '_')
|
|
121
136
|
end
|
|
122
137
|
|
|
123
138
|
# The TRUE pseudo literal.
|
|
@@ -125,20 +140,19 @@ module Arel
|
|
|
125
140
|
Arel::Nodes::Equality.new(1, 1)
|
|
126
141
|
end
|
|
127
142
|
|
|
128
|
-
# The FALSE pseudo literal.
|
|
129
|
-
def self.false
|
|
130
|
-
Arel::Nodes::Equality.new(1, 0)
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
# The NULL literal.
|
|
134
|
-
def self.null
|
|
135
|
-
Arel::Nodes.build_quoted(nil)
|
|
136
|
-
end
|
|
137
|
-
|
|
138
143
|
def self.tuple *v
|
|
139
144
|
tmp = Arel.grouping(nil)
|
|
140
145
|
Arel.grouping v.map{|e| tmp.convert_to_node(e)}
|
|
141
146
|
end
|
|
147
|
+
|
|
148
|
+
# For instance
|
|
149
|
+
#
|
|
150
|
+
# ```
|
|
151
|
+
# Arel.when(at[field].is_null).then(0).else(1)
|
|
152
|
+
# ```
|
|
153
|
+
def self.when condition
|
|
154
|
+
ArelExtensions::Nodes::Case.new.when(condition)
|
|
155
|
+
end
|
|
142
156
|
end
|
|
143
157
|
|
|
144
158
|
class Arel::Attributes::Attribute
|
|
@@ -160,7 +174,7 @@ class Arel::Nodes::Function
|
|
|
160
174
|
alias_method(:old_as, :as) rescue nil
|
|
161
175
|
def as other
|
|
162
176
|
res = Arel::Nodes::As.new(self.clone, Arel.sql(other))
|
|
163
|
-
if Gem::Version.new(Arel::VERSION) >= Gem::Version.new(
|
|
177
|
+
if Gem::Version.new(Arel::VERSION) >= Gem::Version.new('9.0.0')
|
|
164
178
|
self.alias = Arel.sql(other)
|
|
165
179
|
end
|
|
166
180
|
res
|
|
@@ -168,13 +182,13 @@ class Arel::Nodes::Function
|
|
|
168
182
|
end
|
|
169
183
|
|
|
170
184
|
class Arel::Nodes::Grouping
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
185
|
+
include ArelExtensions::Math
|
|
186
|
+
include ArelExtensions::Comparators
|
|
187
|
+
include ArelExtensions::DateDuration
|
|
188
|
+
include ArelExtensions::MathFunctions
|
|
189
|
+
include ArelExtensions::NullFunctions
|
|
190
|
+
include ArelExtensions::StringFunctions
|
|
191
|
+
include ArelExtensions::Predications
|
|
178
192
|
end
|
|
179
193
|
|
|
180
194
|
class Arel::Nodes::Unary
|
|
@@ -248,9 +262,9 @@ class Arel::Nodes::TableAlias
|
|
|
248
262
|
def method_missing(*args)
|
|
249
263
|
met = args.shift.to_sym
|
|
250
264
|
if self.relation.respond_to?(met)
|
|
251
|
-
self.relation.send(met,args)
|
|
265
|
+
self.relation.send(met, args)
|
|
252
266
|
else
|
|
253
|
-
super(met
|
|
267
|
+
super(met, *args)
|
|
254
268
|
end
|
|
255
269
|
end
|
|
256
270
|
end
|
data/test/arelx_test_helper.rb
CHANGED
|
@@ -7,10 +7,10 @@ require 'active_record'
|
|
|
7
7
|
require 'support/fake_record'
|
|
8
8
|
|
|
9
9
|
def colored(color, msg)
|
|
10
|
-
ENV[
|
|
10
|
+
ENV['TERM'] =~ /^xterm|-256color$/ ? "\x1b[#{color}m#{msg}\x1b[89m\x1b[0m" : "#{msg}"
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
YELLOW =
|
|
13
|
+
YELLOW = '33'
|
|
14
14
|
|
|
15
15
|
def warn(msg)
|
|
16
16
|
$stderr.puts(colored(YELLOW, msg))
|
|
@@ -26,17 +26,18 @@ end
|
|
|
26
26
|
# The issue also seems to be related to arel version: at some point, arel
|
|
27
27
|
# dropped its wide support for DBs and kept Postgres, MySQL and SQLite.
|
|
28
28
|
# Here, we're just trying to load the correct ones.
|
|
29
|
-
db_and_gem =
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
29
|
+
db_and_gem =
|
|
30
|
+
if RUBY_ENGINE == 'jruby'
|
|
31
|
+
{
|
|
32
|
+
'oracle' => 'activerecord-oracle_enhanced-adapter',
|
|
33
|
+
'mssql' => 'activerecord-jdbcsqlserver-adapter'
|
|
34
|
+
}
|
|
35
|
+
else
|
|
36
|
+
{
|
|
37
|
+
'oracle' => 'activerecord-oracle_enhanced-adapter',
|
|
38
|
+
'mssql' => 'activerecord-sqlserver-adapter'
|
|
39
|
+
}
|
|
40
|
+
end
|
|
40
41
|
|
|
41
42
|
def load_lib(gem)
|
|
42
43
|
if gem && (RUBY_ENGINE == 'jruby' || Arel::VERSION.to_i > 9)
|
data/test/database.yml
CHANGED
|
@@ -8,26 +8,26 @@ jdbc-sqlite:
|
|
|
8
8
|
timeout: 500
|
|
9
9
|
mysql:
|
|
10
10
|
adapter: mysql2
|
|
11
|
-
database:
|
|
11
|
+
database: arelx_test
|
|
12
12
|
username: root
|
|
13
13
|
host: 127.0.0.1
|
|
14
14
|
port: 3306
|
|
15
15
|
encoding: utf8
|
|
16
16
|
jdbc-mysql:
|
|
17
17
|
adapter: jdbcmysql
|
|
18
|
-
database:
|
|
18
|
+
database: arelx_test
|
|
19
19
|
username: root
|
|
20
20
|
encoding: utf8
|
|
21
21
|
postgresql:
|
|
22
22
|
adapter: postgresql
|
|
23
|
-
database:
|
|
23
|
+
database: arelx_test
|
|
24
24
|
username: postgres
|
|
25
25
|
password: secret
|
|
26
26
|
host: 127.0.0.1
|
|
27
27
|
port: 5432
|
|
28
28
|
jdbc-postgresql:
|
|
29
29
|
adapter: jdbcpostgresql
|
|
30
|
-
database:
|
|
30
|
+
database: arelx_test
|
|
31
31
|
username: postgres
|
|
32
32
|
password: secret
|
|
33
33
|
host: 127.0.0.1
|
|
@@ -45,7 +45,7 @@ jdbc-oracle:
|
|
|
45
45
|
ibm_db:
|
|
46
46
|
adapter: ibm_db
|
|
47
47
|
username: travis
|
|
48
|
-
database:
|
|
48
|
+
database: arelx_test
|
|
49
49
|
mssql:
|
|
50
50
|
adapter: sqlserver
|
|
51
51
|
host: localhost
|
data/test/real_db_test.rb
CHANGED
|
@@ -20,8 +20,8 @@ def setup_db
|
|
|
20
20
|
if !$load_extension_disabled
|
|
21
21
|
begin
|
|
22
22
|
db.enable_load_extension(1)
|
|
23
|
-
db.load_extension(
|
|
24
|
-
db.load_extension(
|
|
23
|
+
db.load_extension('/usr/lib/sqlite3/pcre.so')
|
|
24
|
+
db.load_extension('/usr/lib/sqlite3/extension-functions.so')
|
|
25
25
|
db.enable_load_extension(0)
|
|
26
26
|
rescue => e
|
|
27
27
|
$load_extension_disabled = true
|
|
@@ -29,13 +29,13 @@ def setup_db
|
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
# function find_in_set
|
|
32
|
-
db.create_function(
|
|
32
|
+
db.create_function('find_in_set', 1) do |func, value1, value2|
|
|
33
33
|
func.result = value1.index(value2)
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
@cnx.drop_table(:users) rescue nil
|
|
37
37
|
@cnx.create_table :users do |t|
|
|
38
|
-
|
|
38
|
+
t.column :age, :integer
|
|
39
39
|
t.column :name, :string
|
|
40
40
|
t.column :created_at, :date
|
|
41
41
|
t.column :updated_at, :date
|
|
@@ -52,17 +52,17 @@ end
|
|
|
52
52
|
|
|
53
53
|
class ListTest < Minitest::Test
|
|
54
54
|
def setup
|
|
55
|
-
d = Date.new(2016,05,23)
|
|
55
|
+
d = Date.new(2016, 05, 23)
|
|
56
56
|
setup_db
|
|
57
|
-
User.create :
|
|
58
|
-
User.create :
|
|
59
|
-
User.create :
|
|
60
|
-
User.create :
|
|
61
|
-
u = User.create :
|
|
62
|
-
@myung = User.where(:
|
|
63
|
-
User.create :
|
|
64
|
-
User.create :
|
|
65
|
-
User.create :
|
|
57
|
+
User.create age: 5, name: 'Lucas', created_at: d, score: 20.16
|
|
58
|
+
User.create age: 15, name: 'Sophie', created_at: d, score: 20.16
|
|
59
|
+
User.create age: 20, name: 'Camille', created_at: d, score: 20.16
|
|
60
|
+
User.create age: 21, name: 'Arthur', created_at: d, score: 65.62
|
|
61
|
+
u = User.create age: 23, name: 'Myung', created_at: d, score: 20.16
|
|
62
|
+
@myung = User.where(id: u.id)
|
|
63
|
+
User.create age: 25, name: 'Laure', created_at: d, score: 20.16
|
|
64
|
+
User.create age: nil, name: 'Test', created_at: d, score: 1.62
|
|
65
|
+
User.create age: -0, name: 'Negatif', created_at: d, score: 0.17
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
def teardown
|
|
@@ -70,83 +70,83 @@ class ListTest < Minitest::Test
|
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
def test_abs
|
|
73
|
-
assert_equal 0,User.where(User.arel_table[:name].eq(
|
|
74
|
-
assert_equal 14,User.where(User.arel_table[:name].eq(
|
|
73
|
+
assert_equal 0, User.where(User.arel_table[:name].eq('Negatif')).select((User.arel_table[:age].abs).as('res')).first.res
|
|
74
|
+
assert_equal 14, User.where(User.arel_table[:name].eq('Laure')).select(((User.arel_table[:age] - 39).abs).as('res')).first.res
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
def test_ceil
|
|
78
78
|
if !$sqlite || !$load_extension_disabled
|
|
79
|
-
assert_equal 1,User.where(User.arel_table[:name].eq(
|
|
80
|
-
assert_equal 66,User.where(User.arel_table[:name].eq(
|
|
79
|
+
assert_equal 1, User.where(User.arel_table[:name].eq('Negatif')).select((User.arel_table[:score].ceil).as('res')).first.res
|
|
80
|
+
assert_equal 66, User.where(User.arel_table[:name].eq('Arthur')).select((User.arel_table[:score].ceil).as('res')).first.res
|
|
81
81
|
end
|
|
82
82
|
end
|
|
83
83
|
|
|
84
84
|
def test_coalesce
|
|
85
85
|
if @cnx.adapter_name =~ /pgsql/i
|
|
86
|
-
|
|
87
|
-
assert_equal
|
|
86
|
+
assert_equal 100, User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].coalesce(100)).as('res')).first.res
|
|
87
|
+
assert_equal 'Camille', User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].coalesce('Null', 'default')).as('res')).first.res
|
|
88
88
|
else
|
|
89
|
-
assert_equal
|
|
90
|
-
assert_equal 20,User.where(User.arel_table[:name].eq(
|
|
89
|
+
assert_equal 'Camille', User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].coalesce('Null', 20)).as('res')).first.res
|
|
90
|
+
assert_equal 20, User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].coalesce(nil, 20)).as('res')).first.res
|
|
91
91
|
end
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
def test_Comparator
|
|
95
|
-
assert_equal 2,User.where(User.arel_table[:age] < 6).count
|
|
96
|
-
assert_equal 2,User.where(User.arel_table[:age] <=10).count
|
|
97
|
-
assert_equal 3,User.where(User.arel_table[:age] > 20).count
|
|
98
|
-
assert_equal 4,User.where(User.arel_table[:age] >=20).count
|
|
99
|
-
assert_equal 1,User.where(User.arel_table[:age] > 5).where(User.arel_table[:age] < 20).count
|
|
95
|
+
assert_equal 2, User.where(User.arel_table[:age] < 6).count
|
|
96
|
+
assert_equal 2, User.where(User.arel_table[:age] <= 10).count
|
|
97
|
+
assert_equal 3, User.where(User.arel_table[:age] > 20).count
|
|
98
|
+
assert_equal 4, User.where(User.arel_table[:age] >= 20).count
|
|
99
|
+
assert_equal 1, User.where(User.arel_table[:age] > 5).where(User.arel_table[:age] < 20).count
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
def test_date_duration
|
|
103
103
|
# Year
|
|
104
|
-
assert_equal 2016,User.where(User.arel_table[:name].eq(
|
|
105
|
-
assert_equal 0,User.where(User.arel_table[:created_at].year.eq(
|
|
104
|
+
assert_equal 2016, User.where(User.arel_table[:name].eq('Lucas')).select((User.arel_table[:created_at].year).as('res')).first.res.to_i
|
|
105
|
+
assert_equal 0, User.where(User.arel_table[:created_at].year.eq('2012')).count
|
|
106
106
|
# Month
|
|
107
|
-
assert_equal 5,User.where(User.arel_table[:name].eq(
|
|
108
|
-
assert_equal 8,User.where(User.arel_table[:created_at].month.eq(
|
|
107
|
+
assert_equal 5, User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:created_at].month).as('res')).first.res.to_i
|
|
108
|
+
assert_equal 8, User.where(User.arel_table[:created_at].month.eq('05')).count
|
|
109
109
|
# Week
|
|
110
|
-
assert_equal 21,User.where(User.arel_table[:name].eq(
|
|
111
|
-
assert_equal 8,User.where(User.arel_table[:created_at].month.eq(
|
|
110
|
+
assert_equal 21, User.where(User.arel_table[:name].eq('Arthur')).select((User.arel_table[:created_at].week).as('res')).first.res.to_i
|
|
111
|
+
assert_equal 8, User.where(User.arel_table[:created_at].month.eq('05')).count
|
|
112
112
|
# Day
|
|
113
|
-
assert_equal 23,User.where(User.arel_table[:name].eq(
|
|
114
|
-
assert_equal 0,User.where(User.arel_table[:created_at].day.eq(
|
|
113
|
+
assert_equal 23, User.where(User.arel_table[:name].eq('Laure')).select((User.arel_table[:created_at].day).as('res')).first.res.to_i
|
|
114
|
+
assert_equal 0, User.where(User.arel_table[:created_at].day.eq('05')).count
|
|
115
115
|
end
|
|
116
116
|
|
|
117
117
|
def test_length
|
|
118
|
-
assert_equal 7,User.where(User.arel_table[:name].eq(
|
|
119
|
-
assert_equal 5,User.where(User.arel_table[:name].eq(
|
|
118
|
+
assert_equal 7, User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].length).as('res')).first.res
|
|
119
|
+
assert_equal 5, User.where(User.arel_table[:name].eq('Laure')).select((User.arel_table[:name].length).as('res')).first.res
|
|
120
120
|
end
|
|
121
121
|
|
|
122
122
|
def test_locate
|
|
123
123
|
if !$sqlite || !$load_extension_disabled
|
|
124
|
-
assert_equal 1, User.where(User.arel_table[:name].eq(
|
|
125
|
-
assert_equal 0, User.where(User.arel_table[:name].eq(
|
|
126
|
-
assert_equal 5, User.where(User.arel_table[:name].eq(
|
|
124
|
+
assert_equal 1, User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].locate('C')).as('res')).first.res
|
|
125
|
+
assert_equal 0, User.where(User.arel_table[:name].eq('Lucas')).select((User.arel_table[:name].locate('z')).as('res')).first.res
|
|
126
|
+
assert_equal 5, User.where(User.arel_table[:name].eq('Lucas')).select((User.arel_table[:name].locate('s')).as('res')).first.res
|
|
127
127
|
end
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
def test_isnull
|
|
131
131
|
if ActiveRecord::Base.connection.adapter_name =~ /pgsql/i
|
|
132
|
-
assert_equal 100,User.where(User.arel_table[:name].eq(
|
|
132
|
+
assert_equal 100, User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].isnull(100)).as('res')).first.res
|
|
133
133
|
else
|
|
134
|
-
assert_equal
|
|
135
|
-
assert_equal
|
|
134
|
+
assert_equal 'default', User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].isnull('default')).as('res')).first.res
|
|
135
|
+
assert_equal 'Test', User.where((User.arel_table[:age].isnull('default')).eq('default')).select(User.arel_table[:name]).first.name.to_s
|
|
136
136
|
end
|
|
137
137
|
end
|
|
138
138
|
|
|
139
139
|
def test_floor
|
|
140
140
|
if !$sqlite || !$load_extension_disabled
|
|
141
|
-
assert_equal 0,User.where(User.arel_table[:name].eq(
|
|
142
|
-
assert_equal 65,User.where(User.arel_table[:name].eq(
|
|
141
|
+
assert_equal 0, User.where(User.arel_table[:name].eq('Negatif')).select((User.arel_table[:score].floor).as('res')).first.res
|
|
142
|
+
assert_equal 65, User.where(User.arel_table[:name].eq('Arthur')).select((User.arel_table[:score].floor).as('res')).first.res
|
|
143
143
|
end
|
|
144
144
|
end
|
|
145
145
|
|
|
146
146
|
def test_findinset
|
|
147
147
|
db = ActiveRecord::Base.connection.raw_connection
|
|
148
|
-
assert_equal 3,db.get_first_value("select find_in_set(name,'i') from users where name = 'Camille'")
|
|
149
|
-
assert_equal
|
|
148
|
+
assert_equal 3, db.get_first_value("select find_in_set(name,'i') from users where name = 'Camille'")
|
|
149
|
+
assert_equal '', db.get_first_value("select find_in_set(name,'p') from users where name = 'Camille'").to_s
|
|
150
150
|
# number
|
|
151
151
|
# assert_equal 1,User.select(User.arel_table[:name] & ("l")).count
|
|
152
152
|
# assert_equal 3,(User.select(User.arel_table[:age] & [5,15,20]))
|
|
@@ -154,38 +154,38 @@ class ListTest < Minitest::Test
|
|
|
154
154
|
end
|
|
155
155
|
|
|
156
156
|
def test_math_plus
|
|
157
|
-
d = Date.new(1997,06,15)
|
|
157
|
+
d = Date.new(1997, 06, 15)
|
|
158
158
|
# Concat String
|
|
159
|
-
assert_equal
|
|
160
|
-
assert_equal
|
|
161
|
-
assert_equal
|
|
162
|
-
assert_equal
|
|
163
|
-
assert_equal
|
|
164
|
-
assert_equal
|
|
159
|
+
assert_equal 'SophiePhan', User.where(User.arel_table[:name].eq('Sophie')).select((User.arel_table[:name] + 'Phan').as('res')).first.res
|
|
160
|
+
assert_equal 'Sophie2', User.where(User.arel_table[:name].eq('Sophie')).select((User.arel_table[:name] + 2).as('res')).first.res
|
|
161
|
+
assert_equal 'Sophie1997-06-15', User.where(User.arel_table[:name].eq('Sophie')).select((User.arel_table[:name] + d).as('res')).first.res
|
|
162
|
+
assert_equal 'Sophie15', User.where(User.arel_table[:name].eq('Sophie')).select((User.arel_table[:name] + User.arel_table[:age]).as('res')).first.res
|
|
163
|
+
assert_equal 'SophieSophie', User.where(User.arel_table[:name].eq('Sophie')).select((User.arel_table[:name] + User.arel_table[:name]).as('res')).first.res
|
|
164
|
+
assert_equal 'Sophie2016-05-23', User.where(User.arel_table[:name].eq('Sophie')).select((User.arel_table[:name] + User.arel_table[:created_at]).as('res')).first.res
|
|
165
165
|
# concat Integer
|
|
166
166
|
assert_equal 1, User.where((User.arel_table[:age] + 10).eq(33)).count
|
|
167
|
-
assert_equal 1, User.where((User.arel_table[:age] +
|
|
167
|
+
assert_equal 1, User.where((User.arel_table[:age] + '1').eq(6)).count
|
|
168
168
|
assert_equal 1, User.where((User.arel_table[:age] + User.arel_table[:age]).eq(10)).count
|
|
169
169
|
# concat Date
|
|
170
170
|
# puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
|
|
171
|
-
assert_equal
|
|
172
|
-
assert_equal
|
|
171
|
+
assert_equal '2016-05-24', @myung.select((User.arel_table[:created_at] + 1).as('res')).first.res.to_date.to_s
|
|
172
|
+
assert_equal '2016-05-25', @myung.select((User.arel_table[:created_at] + 2.day).as('res')).first.res.to_date.to_s
|
|
173
173
|
end
|
|
174
174
|
|
|
175
175
|
def test_math_moins
|
|
176
|
-
d = Date.new(2016,05,20)
|
|
176
|
+
d = Date.new(2016, 05, 20)
|
|
177
177
|
# Datediff
|
|
178
|
-
assert_equal 8,User.where((User.arel_table[:created_at] - User.arel_table[:created_at]).eq(0)).count
|
|
179
|
-
assert_equal 3,User.where(User.arel_table[:name].eq(
|
|
178
|
+
assert_equal 8, User.where((User.arel_table[:created_at] - User.arel_table[:created_at]).eq(0)).count
|
|
179
|
+
assert_equal 3, User.where(User.arel_table[:name].eq('Laure')).select((User.arel_table[:created_at] - d).as('res')).first.res.abs.to_i
|
|
180
180
|
# Substraction
|
|
181
181
|
assert_equal 0, User.where((User.arel_table[:age] - 10).eq(50)).count
|
|
182
|
-
assert_equal 0, User.where((User.arel_table[:age] -
|
|
182
|
+
assert_equal 0, User.where((User.arel_table[:age] - '10').eq(50)).count
|
|
183
183
|
end
|
|
184
184
|
|
|
185
185
|
def test_rand
|
|
186
|
-
assert_equal 5,User.where(User.arel_table[:score].eq(20.16)).select(User.arel_table[:id]).order(Arel.rand).take(50).count
|
|
186
|
+
assert_equal 5, User.where(User.arel_table[:score].eq(20.16)).select(User.arel_table[:id]).order(Arel.rand).take(50).count
|
|
187
187
|
# test_alias :random :rand
|
|
188
|
-
assert_equal 8,User.select(User.arel_table[:name]).order(Arel.rand).take(50).count
|
|
188
|
+
assert_equal 8, User.select(User.arel_table[:name]).order(Arel.rand).take(50).count
|
|
189
189
|
end
|
|
190
190
|
|
|
191
191
|
def test_regexp_not_regex
|
|
@@ -196,8 +196,8 @@ class ListTest < Minitest::Test
|
|
|
196
196
|
end
|
|
197
197
|
|
|
198
198
|
def test_replace
|
|
199
|
-
assert_equal
|
|
200
|
-
assert_equal
|
|
199
|
+
assert_equal 'LucaX', User.where(User.arel_table[:name].eq('Lucas')).select(((User.arel_table[:name]).replace('s', 'X')).as('res')).first.res
|
|
200
|
+
assert_equal 'replace', User.where(User.arel_table[:name].eq('Lucas')).select(((User.arel_table[:name]).replace(User.arel_table[:name], 'replace')).as('res')).first.res
|
|
201
201
|
end
|
|
202
202
|
|
|
203
203
|
def test_round
|
|
@@ -207,30 +207,30 @@ class ListTest < Minitest::Test
|
|
|
207
207
|
|
|
208
208
|
def test_Soundex
|
|
209
209
|
if !$sqlite || !$load_extension_disabled
|
|
210
|
-
assert_equal
|
|
211
|
-
assert_equal 8,User.where((User.arel_table[:name].soundex).eq(User.arel_table[:name].soundex)).count
|
|
210
|
+
assert_equal 'C540', User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].soundex).as('res')).first.res.to_s
|
|
211
|
+
assert_equal 8, User.where((User.arel_table[:name].soundex).eq(User.arel_table[:name].soundex)).count
|
|
212
212
|
end
|
|
213
213
|
end
|
|
214
214
|
|
|
215
215
|
def test_Sum
|
|
216
216
|
# .take(50) because of limit by ORDER BY
|
|
217
|
-
assert_equal 110,User.select((User.arel_table[:age].sum + 1).as(
|
|
218
|
-
assert_equal 218,User.select((User.arel_table[:age].sum + User.arel_table[:age].sum).as(
|
|
219
|
-
assert_equal 327,User.select(((User.arel_table[:age] * 3).sum).as(
|
|
220
|
-
assert_equal 2245,User.select(((User.arel_table[:age] * User.arel_table[:age]).sum).as(
|
|
217
|
+
assert_equal 110, User.select((User.arel_table[:age].sum + 1).as('res')).take(50).first.res
|
|
218
|
+
assert_equal 218, User.select((User.arel_table[:age].sum + User.arel_table[:age].sum).as('res')).take(50).first.res
|
|
219
|
+
assert_equal 327, User.select(((User.arel_table[:age] * 3).sum).as('res')).take(50).first.res
|
|
220
|
+
assert_equal 2245, User.select(((User.arel_table[:age] * User.arel_table[:age]).sum).as('res')).take(50).first.res
|
|
221
221
|
end
|
|
222
222
|
|
|
223
223
|
def test_trim
|
|
224
|
-
assert_equal
|
|
225
|
-
assert_equal
|
|
226
|
-
assert_equal
|
|
227
|
-
assert_equal
|
|
224
|
+
assert_equal 'Myun', User.where(User.arel_table[:name].eq('Myung')).select(User.arel_table[:name].rtrim('g').as('res')).first.res
|
|
225
|
+
assert_equal 'yung', User.where(User.arel_table[:name].eq('Myung')).select(User.arel_table[:name].ltrim('M').as('res')).first.res
|
|
226
|
+
assert_equal 'yung', User.where(User.arel_table[:name].eq('Myung')).select((User.arel_table[:name] + 'M').trim('M').as('res')).first.res
|
|
227
|
+
assert_equal '', User.where(User.arel_table[:name].eq('Myung')).select(User.arel_table[:name].rtrim(User.arel_table[:name]).as('res')).first.res
|
|
228
228
|
|
|
229
229
|
end
|
|
230
230
|
|
|
231
231
|
def test_wday
|
|
232
|
-
|
|
233
|
-
assert_equal 1,User.where(User.arel_table[:name].eq(
|
|
234
|
-
assert_equal 0,User.select(d.wday).as(
|
|
232
|
+
d = Date.new(2016, 06, 26)
|
|
233
|
+
assert_equal 1, User.where(User.arel_table[:name].eq('Myung')).select((User.arel_table[:created_at].wday).as('res')).first.res.to_i
|
|
234
|
+
assert_equal 0, User.select(d.wday).as('res').first.to_i
|
|
235
235
|
end
|
|
236
236
|
end
|
data/test/support/fake_record.rb
CHANGED
|
@@ -105,7 +105,7 @@ module FakeRecord
|
|
|
105
105
|
attr_reader :spec, :connection
|
|
106
106
|
|
|
107
107
|
def initialize
|
|
108
|
-
@spec = Spec.new({:
|
|
108
|
+
@spec = Spec.new({adapter: 'america'})
|
|
109
109
|
@connection = Connection.new
|
|
110
110
|
@connection.visitor = Arel::Visitors::ToSql.new(connection)
|
|
111
111
|
end
|
data/test/test_comparators.rb
CHANGED
|
@@ -17,23 +17,23 @@ module ArelExtensions
|
|
|
17
17
|
@visitor.accept(node, Arel::Collectors::SQLString.new).value
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
it
|
|
20
|
+
it '< is equal lt' do
|
|
21
21
|
_(compile(@table[:id] < 10)).must_be_like('"users"."id" < 10')
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
it
|
|
24
|
+
it '<= is equal lteq' do
|
|
25
25
|
_(compile(@table[:id] <= 10)).must_be_like('"users"."id" <= 10')
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
it
|
|
28
|
+
it '> is equal gt' do
|
|
29
29
|
_(compile(@table[:id] > 10)).must_be_like('"users"."id" > 10')
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
it
|
|
32
|
+
it '< is equal gteq' do
|
|
33
33
|
_(compile(@table[:id] >= 10)).must_be_like('"users"."id" >= 10')
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
it
|
|
36
|
+
it 'should compare with dates' do
|
|
37
37
|
_(compile(@table[:created_at] >= Date.new(2016, 3, 31)))
|
|
38
38
|
.must_be_like %{"users"."created_at" >= '2016-03-31'}
|
|
39
39
|
end
|
|
@@ -9,8 +9,8 @@ module ArelExtensions
|
|
|
9
9
|
@table = Arel::Table.new(:users)
|
|
10
10
|
@cols = ['name', 'comments', 'created_at']
|
|
11
11
|
@data = [
|
|
12
|
-
['nom1',
|
|
13
|
-
['nom2',
|
|
12
|
+
['nom1', 'sdfdsfdsfsdf', '2016-01-01'],
|
|
13
|
+
['nom2', 'sdfdsfdsfsdf', '2016-01-01']
|
|
14
14
|
]
|
|
15
15
|
end
|
|
16
16
|
|
|
@@ -22,8 +22,8 @@ module ArelExtensions
|
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
it
|
|
26
|
-
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new
|
|
25
|
+
it 'should import large set of data in Oracle' do
|
|
26
|
+
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new.into(@table) : Arel::InsertManager.new(@conn).into(@table)
|
|
27
27
|
insert_manager.bulk_insert(@cols, @data)
|
|
28
28
|
_(compile(insert_manager.ast))
|
|
29
29
|
.must_be_like %Q[INSERT INTO "users" ("name", "comments", "created_at")
|