arel_extensions 0.8.2 → 0.8.3
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/.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
|