arel_extensions 0.8.2 → 0.8.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +15 -8
- data/arel_extensions.gemspec +2 -2
- data/functions.html +21 -8
- data/gemfiles/rails3.gemfile +3 -3
- data/gemfiles/rails4.gemfile +1 -2
- data/gemfiles/rails5.gemfile +2 -2
- data/lib/arel_extensions/math.rb +6 -4
- data/lib/arel_extensions/nodes/coalesce.rb +7 -15
- data/lib/arel_extensions/nodes/concat.rb +5 -20
- data/lib/arel_extensions/nodes/date_diff.rb +1 -1
- data/lib/arel_extensions/nodes/function.rb +21 -1
- data/lib/arel_extensions/nodes/locate.rb +3 -18
- data/lib/arel_extensions/nodes/ltrim.rb +8 -18
- data/lib/arel_extensions/nodes/rtrim.rb +8 -19
- data/lib/arel_extensions/nodes/trim.rb +8 -16
- data/lib/arel_extensions/nodes.rb +3 -2
- data/lib/arel_extensions/null_functions.rb +2 -2
- data/lib/arel_extensions/string_functions.rb +3 -3
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/postgresql.rb +77 -155
- data/lib/arel_extensions/visitors/sqlite.rb +0 -84
- data/lib/arel_extensions/visitors/to_sql.rb +51 -0
- data/test/database.yml +6 -2
- data/test/real_db_test.rb +14 -17
- data/test/visitors/test_bulk_insert_oracle.rb +5 -1
- data/test/visitors/test_bulk_insert_sqlite.rb +5 -1
- data/test/visitors/test_bulk_insert_to_sql.rb +5 -1
- data/test/visitors/test_oracle.rb +5 -1
- data/test/visitors/test_to_sql.rb +5 -1
- data/test/with_ar/test_math_sqlite.rb +10 -7
- data/test/with_ar/test_string_mysql.rb +9 -10
- data/test/with_ar/test_string_postgresql.rb +81 -0
- metadata +5 -3
@@ -2,46 +2,6 @@ module ArelExtensions
|
|
2
2
|
module Visitors
|
3
3
|
Arel::Visitors::PostgreSQL.class_eval do
|
4
4
|
|
5
|
-
def visit_ArelExtensions_Nodes_Concat o, collector
|
6
|
-
arg = o.left.relation.engine.columns.find{|c| c.name == o.left.name.to_s}.type
|
7
|
-
collector = visit o.left, collector
|
8
|
-
if(o.right.is_a?(Arel::Attributes::Attribute))
|
9
|
-
collector << '||'
|
10
|
-
collector = visit o.right, collector
|
11
|
-
elsif ( arg == :date || arg == :datetime)
|
12
|
-
collector << " + INTERVAL '#{o.right} day'"
|
13
|
-
collector
|
14
|
-
else
|
15
|
-
collector << " ||'"
|
16
|
-
collector << "#{o.right}'"
|
17
|
-
end
|
18
|
-
collector
|
19
|
-
end
|
20
|
-
|
21
|
-
|
22
|
-
def visit_ArelExtensions_Nodes_Coalesce o, collector
|
23
|
-
collector << "COALESCE("
|
24
|
-
if(o.left.is_a?(Arel::Attributes::Attribute))
|
25
|
-
collector = visit o.left, collector
|
26
|
-
else
|
27
|
-
collector << "#{o.left}"
|
28
|
-
end
|
29
|
-
o.other.each { |a|
|
30
|
-
collector << ","
|
31
|
-
if(a.is_a?(Arel::Attributes::Attribute))
|
32
|
-
collector = visit a, collector
|
33
|
-
else
|
34
|
-
if(a.is_a?(Integer))
|
35
|
-
collector << "#{a}"
|
36
|
-
else
|
37
|
-
collector << "'#{a}'"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
}
|
41
|
-
collector << ")"
|
42
|
-
collector
|
43
|
-
end
|
44
|
-
|
45
5
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
46
6
|
|
47
7
|
collector = visit o.left, collector
|
@@ -55,89 +15,65 @@ module ArelExtensions
|
|
55
15
|
end
|
56
16
|
|
57
17
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
18
|
+
def visit_ArelExtensions_Nodes_Duration o, collector
|
19
|
+
#visit left for period
|
20
|
+
if o.left == "d"
|
21
|
+
collector << "EXTRACT(DAY FROM"
|
22
|
+
elsif o.left == "m"
|
23
|
+
collector << "EXTRACT(MONTH FROM "
|
24
|
+
elsif (o.left == "w")
|
25
|
+
collector << "EXTRACT(WEEK FROM"
|
26
|
+
elsif (o.left == "y")
|
27
|
+
collector << "EXTRACT(YEAR FROM"
|
28
|
+
end
|
29
|
+
#visit right
|
30
|
+
if(o.right.is_a?(Arel::Attributes::Attribute))
|
31
|
+
collector = visit o.right, collector
|
32
|
+
else
|
33
|
+
collector << o.right
|
34
|
+
end
|
35
|
+
collector << ")"
|
36
|
+
collector
|
74
37
|
end
|
75
|
-
collector << ")"
|
76
|
-
collector
|
77
|
-
end
|
78
|
-
|
79
|
-
|
80
|
-
def visit_ArelExtensions_Nodes_Findis o, collector
|
81
|
-
|
82
|
-
end
|
83
38
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
collector << "LENGTH("
|
96
|
-
collector = visit o.expr, collector
|
97
|
-
collector << ")"
|
98
|
-
collector
|
99
|
-
end
|
100
|
-
|
101
|
-
|
102
|
-
def visit_ArelExtensions_Nodes_Locate o, collector
|
103
|
-
collector << "position("
|
104
|
-
if(o.val.is_a?(Arel::Attributes::Attribute))
|
105
|
-
collector = visit o.val, collector
|
106
|
-
else
|
107
|
-
collector << "'#{o.val}'"
|
39
|
+
def visit_ArelExtensions_Nodes_Locate o, collector
|
40
|
+
collector << "position("
|
41
|
+
if(o.val.is_a?(Arel::Attributes::Attribute))
|
42
|
+
collector = visit o.val, collector
|
43
|
+
else
|
44
|
+
collector << "'#{o.val}'"
|
45
|
+
end
|
46
|
+
collector << " IN "
|
47
|
+
collector = visit o.expr, collector
|
48
|
+
collector << ")"
|
49
|
+
collector
|
108
50
|
end
|
109
|
-
collector << " IN "
|
110
|
-
collector = visit o.expr, collector
|
111
|
-
collector << ")"
|
112
|
-
collector
|
113
|
-
end
|
114
51
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
52
|
+
def visit_ArelExtensions_Nodes_Isnull o, collector
|
53
|
+
collector << "coalesce("
|
54
|
+
collector = visit o.left, collector
|
55
|
+
collector << ","
|
56
|
+
if(o.right.is_a?(Arel::Attributes::Attribute))
|
57
|
+
collector = visit o.right, collector
|
58
|
+
else
|
59
|
+
collector << "'#{o.right}'"
|
60
|
+
end
|
61
|
+
collector << ")"
|
62
|
+
collector
|
123
63
|
end
|
124
|
-
collector << ")"
|
125
|
-
collector
|
126
|
-
end
|
127
|
-
|
128
64
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
65
|
+
def visit_ArelExtensions_Nodes_Rand o, collector
|
66
|
+
collector << "random("
|
67
|
+
if(o.left != nil && o.right != nil)
|
68
|
+
collector << "'#{o.left}'"
|
69
|
+
collector << ","
|
70
|
+
collector << "'#{o.right}'"
|
71
|
+
end
|
72
|
+
collector << ")"
|
73
|
+
collector
|
74
|
+
end
|
139
75
|
|
140
|
-
|
76
|
+
def visit_ArelExtensions_Nodes_Replace o, collector
|
141
77
|
collector << "REPLACE("
|
142
78
|
collector = visit o.expr,collector
|
143
79
|
collector << ","
|
@@ -154,49 +90,35 @@ module ArelExtensions
|
|
154
90
|
end
|
155
91
|
collector << ")"
|
156
92
|
collector
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
remove_method :visit_Arel_Nodes_Regexp
|
161
|
-
def visit_Arel_Nodes_Regexp o, collector
|
162
|
-
collector = visit o.left, collector
|
163
|
-
collector << " ~ "
|
164
|
-
collector << "'#{o.right}'"
|
165
|
-
collector
|
166
|
-
end
|
167
|
-
|
168
|
-
remove_method :visit_Arel_Nodes_NotRegexp
|
169
|
-
def visit_Arel_Nodes_NotRegexp o, collector
|
170
|
-
collector = visit o.left, collector
|
171
|
-
collector << " !~ "
|
172
|
-
collector << "'#{o.right}'"
|
173
|
-
collector
|
174
|
-
end
|
175
|
-
|
93
|
+
end
|
176
94
|
|
177
|
-
def visit_ArelExtensions_Nodes_Soundex o, collector
|
178
|
-
collector << "soundex("
|
179
|
-
if((o.expr).is_a?(Arel::Attributes::Attribute))
|
180
|
-
collector = visit o.expr, collector
|
181
|
-
else
|
182
|
-
collector << "'#{o.expr}'"
|
183
|
-
end
|
184
|
-
collector << ")"
|
185
|
-
collector
|
186
|
-
end
|
187
95
|
|
96
|
+
remove_method(:visit_Arel_Nodes_Regexp) rescue nil
|
97
|
+
def visit_Arel_Nodes_Regexp o, collector
|
98
|
+
collector = visit o.left, collector
|
99
|
+
collector << " ~ "
|
100
|
+
collector << "'#{o.right}'"
|
101
|
+
collector
|
102
|
+
end
|
188
103
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
collector
|
195
|
-
|
196
|
-
collector << ")"
|
197
|
-
collector
|
198
|
-
end
|
104
|
+
remove_method(:visit_Arel_Nodes_NotRegexp) rescue nil
|
105
|
+
def visit_Arel_Nodes_NotRegexp o, collector
|
106
|
+
collector = visit o.left, collector
|
107
|
+
collector << " !~ "
|
108
|
+
collector << o.right
|
109
|
+
collector
|
110
|
+
end
|
199
111
|
|
112
|
+
def visit_ArelExtensions_Nodes_Sum o, collector
|
113
|
+
collector << "sum("
|
114
|
+
if((o.expr).is_a?(Arel::Attributes::Attribute))
|
115
|
+
collector = visit o.expr, collector
|
116
|
+
else
|
117
|
+
collector << "'#{o.expr}'"
|
118
|
+
end
|
119
|
+
collector << ")"
|
120
|
+
collector
|
121
|
+
end
|
200
122
|
|
201
123
|
def visit_ArelExtensions_Nodes_Trim o , collector
|
202
124
|
collector << 'TRIM(BOTH '
|
@@ -2,26 +2,6 @@ module ArelExtensions
|
|
2
2
|
module Visitors
|
3
3
|
Arel::Visitors::SQLite.class_eval do
|
4
4
|
|
5
|
-
|
6
|
-
def visit_ArelExtensions_Nodes_Coalesce o, collector
|
7
|
-
collector << "COALESCE("
|
8
|
-
if(o.left.is_a?(Arel::Attributes::Attribute))
|
9
|
-
collector = visit o.left, collector
|
10
|
-
else
|
11
|
-
collector << "#{o.left}"
|
12
|
-
end
|
13
|
-
o.other.each { |a|
|
14
|
-
collector << ","
|
15
|
-
if(a.is_a?(Arel::Attributes::Attribute))
|
16
|
-
collector = visit a, collector
|
17
|
-
else
|
18
|
-
collector << "#{a}"
|
19
|
-
end
|
20
|
-
}
|
21
|
-
collector << ")"
|
22
|
-
collector
|
23
|
-
end
|
24
|
-
|
25
5
|
# Date operations
|
26
6
|
def visit_ArelExtensions_Nodes_DateAdd o, collector
|
27
7
|
collector << "date("
|
@@ -138,70 +118,6 @@ module ArelExtensions
|
|
138
118
|
collector
|
139
119
|
end
|
140
120
|
|
141
|
-
def visit_ArelExtensions_Nodes_Round o, collector
|
142
|
-
collector << "ROUND("
|
143
|
-
collector = visit o.left, collector
|
144
|
-
collector << ","
|
145
|
-
if(o.right.is_a?(Arel::Attributes::Attribute))
|
146
|
-
collector = visit o.right, collector
|
147
|
-
else
|
148
|
-
collector << "'#{o.right}'"
|
149
|
-
end
|
150
|
-
collector << ")"
|
151
|
-
collector
|
152
|
-
end
|
153
|
-
|
154
|
-
def visit_ArelExtensions_Nodes_Soundex o, collector
|
155
|
-
collector << "SOUNDEX("
|
156
|
-
if((o.expr).is_a?(Arel::Attributes::Attribute ))
|
157
|
-
collector = visit o.expr, collector
|
158
|
-
else
|
159
|
-
collector << "'#{o.expr}'"
|
160
|
-
end
|
161
|
-
collector << ")"
|
162
|
-
collector
|
163
|
-
end
|
164
|
-
|
165
|
-
def visit_ArelExtensions_Nodes_Trim o , collector
|
166
|
-
collector << "TRIM("
|
167
|
-
collector = visit o.left, collector
|
168
|
-
collector << ","
|
169
|
-
if(o.right.is_a?(Arel::Attributes::Attribute))
|
170
|
-
collector = visit o.right, collector
|
171
|
-
else
|
172
|
-
collector << "'#{o.right}'"
|
173
|
-
end
|
174
|
-
collector << ")"
|
175
|
-
collector
|
176
|
-
end
|
177
|
-
|
178
|
-
def visit_ArelExtensions_Nodes_Ltrim o , collector
|
179
|
-
collector << "LTRIM("
|
180
|
-
collector = visit o.left, collector
|
181
|
-
collector << ","
|
182
|
-
if(o.right.is_a?(Arel::Attributes::Attribute))
|
183
|
-
collector = visit o.right, collector
|
184
|
-
else
|
185
|
-
collector << "'#{o.right}'"
|
186
|
-
end
|
187
|
-
collector << ")"
|
188
|
-
collector
|
189
|
-
end
|
190
|
-
|
191
|
-
|
192
|
-
def visit_ArelExtensions_Nodes_Rtrim o , collector
|
193
|
-
collector << "RTRIM("
|
194
|
-
collector = visit o.left, collector
|
195
|
-
collector << ","
|
196
|
-
if(o.right.is_a?(Arel::Attributes::Attribute))
|
197
|
-
collector = visit o.right, collector
|
198
|
-
else
|
199
|
-
collector << "'#{o.right}'"
|
200
|
-
end
|
201
|
-
collector << ")"
|
202
|
-
collector
|
203
|
-
end
|
204
|
-
|
205
121
|
def visit_ArelExtensions_Nodes_Wday o, collector
|
206
122
|
collector << "strftime('%w',"
|
207
123
|
if((o.date).is_a?(Arel::Attributes::Attribute))
|
@@ -90,8 +90,59 @@ module ArelExtensions
|
|
90
90
|
collector
|
91
91
|
end
|
92
92
|
|
93
|
+
def visit_ArelExtensions_Nodes_Soundex o, collector
|
94
|
+
collector << "SOUNDEX("
|
95
|
+
o.expressions.each_with_index { |arg, i|
|
96
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
97
|
+
collector = visit arg, collector
|
98
|
+
}
|
99
|
+
collector << ")"
|
100
|
+
collector
|
101
|
+
end
|
102
|
+
|
103
|
+
def visit_ArelExtensions_Nodes_Trim o, collector
|
104
|
+
collector << "TRIM("
|
105
|
+
o.expressions.each_with_index { |arg, i|
|
106
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
107
|
+
collector = visit arg, collector
|
108
|
+
}
|
109
|
+
collector << ")"
|
110
|
+
collector
|
111
|
+
end
|
112
|
+
|
113
|
+
def visit_ArelExtensions_Nodes_Ltrim o, collector
|
114
|
+
collector << "LTRIM("
|
115
|
+
o.expressions.each_with_index { |arg, i|
|
116
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
117
|
+
collector = visit arg, collector
|
118
|
+
}
|
119
|
+
collector << ")"
|
120
|
+
collector
|
121
|
+
end
|
122
|
+
|
123
|
+
|
124
|
+
def visit_ArelExtensions_Nodes_Rtrim o, collector
|
125
|
+
collector << "RTRIM("
|
126
|
+
o.expressions.each_with_index { |arg, i|
|
127
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
128
|
+
collector = visit arg, collector
|
129
|
+
}
|
130
|
+
collector << ")"
|
131
|
+
collector
|
132
|
+
end
|
93
133
|
|
94
134
|
#comparators
|
135
|
+
|
136
|
+
def visit_ArelExtensions_Nodes_Coalesce o, collector
|
137
|
+
collector << "COALESCE("
|
138
|
+
o.expressions.each_with_index { |arg, i|
|
139
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
140
|
+
collector = visit arg, collector
|
141
|
+
}
|
142
|
+
collector << ")"
|
143
|
+
collector
|
144
|
+
end
|
145
|
+
|
95
146
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
96
147
|
collector << "DATEDIFF("
|
97
148
|
collector = visit o.left, collector
|
data/test/database.yml
CHANGED
@@ -9,14 +9,18 @@ jdbc-sqlite:
|
|
9
9
|
mysql:
|
10
10
|
adapter: mysql2
|
11
11
|
database: arext_test
|
12
|
-
username:
|
12
|
+
username: travis
|
13
13
|
encoding: utf8
|
14
14
|
jdbc-mysql:
|
15
15
|
adapter: jdbcmysql
|
16
16
|
database: arext_test
|
17
|
-
username:
|
17
|
+
username: travis
|
18
18
|
encoding: utf8
|
19
19
|
postgres:
|
20
20
|
adapter: postgresql
|
21
21
|
database: arext_test
|
22
|
+
username: postgres
|
23
|
+
jdbc-postgres:
|
24
|
+
adapter: jdbcpostgresql
|
25
|
+
database: arext_test
|
22
26
|
username: postgres
|
data/test/real_db_test.rb
CHANGED
@@ -1,17 +1,14 @@
|
|
1
|
-
require 'test/unit'
|
2
1
|
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
3
|
require 'active_record'
|
4
4
|
|
5
5
|
$:.unshift "#{File.dirname(__FILE__)}../../lib"
|
6
6
|
require 'arel_extensions'
|
7
7
|
|
8
|
-
# change here your target
|
9
|
-
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:") # requires compilation with extensions enabled
|
10
|
-
#ActiveRecord::Base.establish_connection(:adapter=> "mysql2",:host=> "localhost",:username=> 'tester', :password => "testp", :database=> "tests")
|
11
|
-
#ActiveRecord::Base.establish_connection(:adapter=>'postgresql',:host=> "localhost",:username=> 'tester',:password => "testp", :database=> "tests")
|
12
|
-
|
13
|
-
|
14
8
|
def setup_db
|
9
|
+
ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
|
10
|
+
ActiveRecord::Base.establish_connection(ENV['DB'].try(:to_sym) || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
|
11
|
+
ActiveRecord::Base.default_timezone = :utc
|
15
12
|
@cnx = ActiveRecord::Base.connection
|
16
13
|
if ActiveRecord::Base.connection.adapter_name =~ /sqlite/i
|
17
14
|
$sqlite = true
|
@@ -38,7 +35,7 @@ def setup_db
|
|
38
35
|
t.column :name, :string
|
39
36
|
t.column :created_at, :date
|
40
37
|
t.column :updated_at, :date
|
41
|
-
t.column :score, :
|
38
|
+
t.column :score, :decimal
|
42
39
|
end
|
43
40
|
end
|
44
41
|
|
@@ -51,20 +48,20 @@ class User < ActiveRecord::Base
|
|
51
48
|
end
|
52
49
|
|
53
50
|
|
54
|
-
class ListTest < Test
|
51
|
+
class ListTest < Minitest::Test
|
55
52
|
|
56
53
|
def setup
|
57
54
|
d = Date.new(2016,05,23)
|
58
55
|
setup_db
|
59
|
-
User.create
|
60
|
-
User.create
|
61
|
-
User.create
|
62
|
-
User.create
|
56
|
+
User.create :age => 5, :name => "Lucas", :created_at => d , :score => 20.16
|
57
|
+
User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
|
58
|
+
User.create :age => 20, :name => "Camille", :created_at => d, :score => 20.16
|
59
|
+
User.create :age => 21, :name => "Arthur", :created_at => d, :score => 65.62
|
63
60
|
u = User.create :age => 23, :name => "Myung", :created_at => d, :score => 20.16
|
64
61
|
@myung = User.where(:id => u.id)
|
65
|
-
User.create
|
66
|
-
User.create
|
67
|
-
User.create
|
62
|
+
User.create :age => 25, :name => "Laure", :created_at => d, :score =>20.16
|
63
|
+
User.create :age =>nil, :name => "Test", :created_at => d, :score => 1.62
|
64
|
+
User.create :age =>-0, :name => "Negatif", :created_at => d, :score => 0.17
|
68
65
|
end
|
69
66
|
|
70
67
|
def teardown
|
@@ -89,7 +86,7 @@ class ListTest < Test::Unit::TestCase
|
|
89
86
|
assert_equal "Camille",User.where(User.arel_table[:name].eq("Camille")).select((User.arel_table[:name].coalesce("Null","default")).as("res")).first.res
|
90
87
|
else
|
91
88
|
assert_equal "Camille",User.where(User.arel_table[:name].eq("Camille")).select((User.arel_table[:name].coalesce("Null",20)).as("res")).first.res
|
92
|
-
assert_equal 20,User.where(User.arel_table[:name].eq("Test")).select((User.arel_table[:age].coalesce(
|
89
|
+
assert_equal 20,User.where(User.arel_table[:name].eq("Test")).select((User.arel_table[:age].coalesce(nil,20)).as("res")).first.res
|
93
90
|
end
|
94
91
|
end
|
95
92
|
|
@@ -15,7 +15,11 @@ module ArelExtensions
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def compile node
|
18
|
-
|
18
|
+
if Arel::VERSION.to_i > 5
|
19
|
+
@visitor.accept(node, Arel::Collectors::SQLString.new).value
|
20
|
+
else
|
21
|
+
@visitor.accept(node)
|
22
|
+
end
|
19
23
|
end
|
20
24
|
|
21
25
|
it "should import large set of data in Oracle" do
|
@@ -16,7 +16,11 @@ module ArelExtensions
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def compile node
|
19
|
-
|
19
|
+
if Arel::VERSION.to_i > 5
|
20
|
+
@visitor.accept(node, Arel::Collectors::SQLString.new).value
|
21
|
+
else
|
22
|
+
@visitor.accept(node)
|
23
|
+
end
|
20
24
|
end
|
21
25
|
|
22
26
|
it "should import large set of data" do
|
@@ -16,7 +16,11 @@ module ArelExtensions
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def compile node
|
19
|
-
|
19
|
+
if Arel::VERSION.to_i > 5
|
20
|
+
@visitor.accept(node, Arel::Collectors::SQLString.new).value
|
21
|
+
else
|
22
|
+
@visitor.accept(node)
|
23
|
+
end
|
20
24
|
end
|
21
25
|
|
22
26
|
|
@@ -13,7 +13,11 @@ module ArelExtensions
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def compile node
|
16
|
-
|
16
|
+
if Arel::VERSION.to_i > 5
|
17
|
+
@visitor.accept(node, Arel::Collectors::SQLString.new).value
|
18
|
+
else
|
19
|
+
@visitor.accept(node)
|
20
|
+
end
|
17
21
|
end
|
18
22
|
|
19
23
|
# Comparators
|
@@ -15,7 +15,11 @@ module ArelExtensions
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def compile node
|
18
|
-
|
18
|
+
if Arel::VERSION.to_i > 5
|
19
|
+
@visitor.accept(node, Arel::Collectors::SQLString.new).value
|
20
|
+
else
|
21
|
+
@visitor.accept(node)
|
22
|
+
end
|
19
23
|
end
|
20
24
|
|
21
25
|
# Math Functions
|
@@ -27,13 +27,13 @@ module ArelExtensions
|
|
27
27
|
class User < ActiveRecord::Base
|
28
28
|
end
|
29
29
|
d = Date.new(2016, 5,23)
|
30
|
-
User.create
|
31
|
-
User.create
|
32
|
-
User.create
|
33
|
-
User.create
|
34
|
-
User.create
|
30
|
+
User.create :age => 5, :name => "Lucas", :created_at => d, :score => 20.16
|
31
|
+
User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
|
32
|
+
User.create :age => 20, :name => "Camille", :created_at => d, :score => 20.16
|
33
|
+
User.create :age => 21, :name => "Arthur", :created_at => d, :score => 65.62
|
34
|
+
User.create :age => 23, :name => "Myung", :created_at => d, :score => 20.16
|
35
35
|
@laure = User.create :age => 25, :name => "Laure", :created_at => d, :score =>20.16
|
36
|
-
User.create
|
36
|
+
User.create :age => nil, :name => "Test", :created_at => d, :score => 1.62
|
37
37
|
@neg = User.create :age => -20, :name => "Negatif", :created_at => d, :score => 0.17
|
38
38
|
@table = Arel::Table.new(:users)
|
39
39
|
@age = @table[:age]
|
@@ -51,7 +51,10 @@ module ArelExtensions
|
|
51
51
|
#CEIL # require extensions
|
52
52
|
|
53
53
|
# RAND
|
54
|
-
|
54
|
+
# puts User.where(@table[:score].eq(20.16)).order(Arel.rand).limit(50).to_sql if User.where(@table[:score].eq(20.16)).order(Arel.rand).limit(50).count == 0
|
55
|
+
# assert_equal 5, User.where(@table[:score].eq(20.16)).order(Arel.rand).limit(50).count
|
56
|
+
assert 42 != User.select(Arel.rand.as('res')).first.res
|
57
|
+
assert 0 <= User.select(Arel.rand.abs.as('res')).first.res
|
55
58
|
assert_equal 8, User.order(Arel.rand).limit(50).count
|
56
59
|
end
|
57
60
|
|
@@ -12,13 +12,14 @@ module ArelExtensions
|
|
12
12
|
ActiveRecord::Base.default_timezone = :utc
|
13
13
|
begin
|
14
14
|
@cnx = ActiveRecord::Base.connection
|
15
|
-
Arel::Table.engine = ActiveRecord::Base
|
16
15
|
rescue => e
|
17
|
-
puts e.inspect
|
16
|
+
puts "\n#{e.inspect}"
|
18
17
|
ActiveRecord::Base.establish_connection(ENV['DB'] || :sqlite)
|
19
18
|
@cnx = ActiveRecord::Base.connection
|
20
19
|
end
|
21
|
-
|
20
|
+
Arel::Table.engine = ActiveRecord::Base
|
21
|
+
@cnx.drop_table(:users) rescue nil
|
22
|
+
@cnx.drop_table(:products) rescue nil
|
22
23
|
@cnx.create_table :users do |t|
|
23
24
|
t.column :age, :integer
|
24
25
|
t.column :name, :string
|
@@ -33,14 +34,14 @@ module ArelExtensions
|
|
33
34
|
class User < ActiveRecord::Base
|
34
35
|
end
|
35
36
|
d = Date.new(2016, 5,23)
|
36
|
-
@lucas = User.create
|
37
|
+
@lucas = User.create :age => 5, :name => "Lucas", :created_at => d, :score => 20.16
|
37
38
|
sophie = User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
|
38
39
|
@sophie = User.where(:id => sophie.id)
|
39
|
-
User.create
|
40
|
-
User.create
|
41
|
-
User.create
|
40
|
+
User.create :age => 20, :name => "Camille", :created_at => d, :score => 20.16
|
41
|
+
User.create :age => 21, :name => "Arthur", :created_at => d, :score => 65.62
|
42
|
+
User.create :age => 23, :name => "Myung", :created_at => d, :score => 20.16
|
42
43
|
@laure = User.create :age => 25, :name => "Laure", :created_at => d, :score =>20.16
|
43
|
-
User.create
|
44
|
+
User.create :age => nil, :name => "Test", :created_at => d, :score => 1.62
|
44
45
|
@neg = User.create :age => -20, :name => "Negatif", :created_at => d, :score => 0.17
|
45
46
|
@table = Arel::Table.new(:users)
|
46
47
|
@name = @table[:name]
|
@@ -63,8 +64,6 @@ module ArelExtensions
|
|
63
64
|
assert_equal 1, User.where((User.arel_table[:age] + "1").eq(6)).count
|
64
65
|
assert_equal 1, User.where((User.arel_table[:age] + User.arel_table[:age]).eq(10)).count
|
65
66
|
|
66
|
-
|
67
|
-
|
68
67
|
# Replace
|
69
68
|
assert_equal "LucaX", User.where(:id => @lucas).select(@name.replace("s","X").as("res")).first.res
|
70
69
|
assert_equal "replace", User.where(:id => @lucas).select(@name.replace(@name,"replace").as("res")).first.res
|