arel_extensions 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +46 -0
  4. data/Gemfile +10 -0
  5. data/MIT-LICENSE.txt +20 -0
  6. data/README.md +101 -0
  7. data/Rakefile +14 -0
  8. data/arel_extensions.gemspec +32 -0
  9. data/functions.html +344 -0
  10. data/gemfiles/Gemfile.rails3 +10 -0
  11. data/gemfiles/Gemfile.rails5 +10 -0
  12. data/init/mssql.sql +6 -0
  13. data/init/mysql.sql +0 -0
  14. data/init/oracle.sql +31 -0
  15. data/init/postgresql.sql +12 -0
  16. data/init/sqlite.sql +1 -0
  17. data/lib/arel_extensions.rb +84 -0
  18. data/lib/arel_extensions/attributes.rb +26 -0
  19. data/lib/arel_extensions/comparators.rb +59 -0
  20. data/lib/arel_extensions/date_duration.rb +28 -0
  21. data/lib/arel_extensions/insert_manager.rb +33 -0
  22. data/lib/arel_extensions/math.rb +48 -0
  23. data/lib/arel_extensions/math_functions.rb +35 -0
  24. data/lib/arel_extensions/nodes.rb +27 -0
  25. data/lib/arel_extensions/nodes/abs.rb +6 -0
  26. data/lib/arel_extensions/nodes/ceil.rb +6 -0
  27. data/lib/arel_extensions/nodes/coalesce.rb +22 -0
  28. data/lib/arel_extensions/nodes/concat.rb +33 -0
  29. data/lib/arel_extensions/nodes/date_diff.rb +106 -0
  30. data/lib/arel_extensions/nodes/duration.rb +30 -0
  31. data/lib/arel_extensions/nodes/find_in_set.rb +16 -0
  32. data/lib/arel_extensions/nodes/floor.rb +6 -0
  33. data/lib/arel_extensions/nodes/function.rb +17 -0
  34. data/lib/arel_extensions/nodes/isnull.rb +30 -0
  35. data/lib/arel_extensions/nodes/length.rb +6 -0
  36. data/lib/arel_extensions/nodes/locate.rb +33 -0
  37. data/lib/arel_extensions/nodes/ltrim.rb +28 -0
  38. data/lib/arel_extensions/nodes/matches.rb +22 -0
  39. data/lib/arel_extensions/nodes/rand.rb +23 -0
  40. data/lib/arel_extensions/nodes/replace.rb +36 -0
  41. data/lib/arel_extensions/nodes/round.rb +15 -0
  42. data/lib/arel_extensions/nodes/rtrim.rb +29 -0
  43. data/lib/arel_extensions/nodes/soundex.rb +23 -0
  44. data/lib/arel_extensions/nodes/sum.rb +23 -0
  45. data/lib/arel_extensions/nodes/trim.rb +26 -0
  46. data/lib/arel_extensions/nodes/wday.rb +23 -0
  47. data/lib/arel_extensions/null_functions.rb +16 -0
  48. data/lib/arel_extensions/string_functions.rb +68 -0
  49. data/lib/arel_extensions/version.rb +4 -0
  50. data/lib/arel_extensions/visitors.rb +6 -0
  51. data/lib/arel_extensions/visitors/ibm_db.rb +206 -0
  52. data/lib/arel_extensions/visitors/mssql.rb +213 -0
  53. data/lib/arel_extensions/visitors/mysql.rb +184 -0
  54. data/lib/arel_extensions/visitors/oracle.rb +267 -0
  55. data/lib/arel_extensions/visitors/postgresql.rb +258 -0
  56. data/lib/arel_extensions/visitors/sqlite.rb +218 -0
  57. data/lib/arel_extensions/visitors/to_sql.rb +199 -0
  58. data/test/helper.rb +18 -0
  59. data/test/real_db_test.rb +251 -0
  60. data/test/support/fake_record.rb +137 -0
  61. data/test/test_comparators.rb +49 -0
  62. data/test/visitors/test_bulk_insert_oracle.rb +30 -0
  63. data/test/visitors/test_bulk_insert_sqlite.rb +31 -0
  64. data/test/visitors/test_bulk_insert_to_sql.rb +32 -0
  65. data/test/visitors/test_oracle.rb +105 -0
  66. data/test/visitors/test_to_sql.rb +148 -0
  67. data/test/with_ar/test_bulk_sqlite.rb +44 -0
  68. data/test/with_ar/test_math_sqlite.rb +59 -0
  69. data/test/with_ar/test_string_sqlite.rb +69 -0
  70. metadata +230 -0
@@ -0,0 +1,199 @@
1
+ module ArelExtensions
2
+ module Visitors
3
+ Arel::Visitors::ToSql.class_eval do
4
+
5
+ # Math Functions
6
+ def visit_ArelExtensions_Nodes_Abs o, collector
7
+ collector << "ABS("
8
+ o.expressions.each_with_index { |arg, i|
9
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
10
+ collector = visit arg, collector
11
+ }
12
+ collector << ")"
13
+ collector
14
+ end
15
+
16
+ def visit_ArelExtensions_Nodes_Ceil o, collector
17
+ collector << "CEIL("
18
+ o.expressions.each_with_index { |arg, i|
19
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
20
+ collector = visit arg, collector
21
+ }
22
+ collector << ")"
23
+ collector
24
+ end
25
+
26
+ def visit_ArelExtensions_Nodes_Floor o, collector
27
+ collector << "FLOOR("
28
+ o.expressions.each_with_index { |arg, i|
29
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
30
+ collector = visit arg, collector
31
+ }
32
+ collector << ")"
33
+ collector
34
+ end
35
+
36
+ def visit_ArelExtensions_Nodes_Rand o, collector
37
+ collector << "RAND("
38
+ o.expressions.each_with_index { |arg, i|
39
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
40
+ collector = visit arg, collector
41
+ }
42
+ collector << ")"
43
+ collector
44
+ end
45
+
46
+ def visit_ArelExtensions_Nodes_Round o, collector
47
+ collector << "ROUND("
48
+ o.expressions.each_with_index { |arg, i|
49
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
50
+ collector = visit arg, collector
51
+ }
52
+ collector << ")"
53
+ collector
54
+ end
55
+
56
+
57
+ # String functions
58
+ def visit_ArelExtensions_Nodes_Concat o, collector
59
+ o.expressions.each_with_index { |arg, i|
60
+ collector = visit arg, collector
61
+ collector << ' || ' unless i == o.expressions.length - 1
62
+ }
63
+ collector
64
+ end
65
+
66
+ def visit_ArelExtensions_Nodes_Length o, collector
67
+ collector << "LENGTH("
68
+ collector = visit o.expr, collector
69
+ collector << ")"
70
+ collector
71
+ end
72
+
73
+ def visit_ArelExtensions_Nodes_Locate o, collector
74
+ collector << "LOCATE("
75
+ o.expressions.each_with_index { |arg, i|
76
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
77
+ collector = visit arg, collector
78
+ }
79
+ collector << ")"
80
+ collector
81
+ end
82
+
83
+ def visit_ArelExtensions_Nodes_FindInSet o, collector
84
+ collector << "FIND_IN_SET("
85
+ o.expressions.each_with_index { |arg, i|
86
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
87
+ collector = visit arg, collector
88
+ }
89
+ collector << ")"
90
+ collector
91
+ end
92
+
93
+
94
+ #comparators
95
+ def visit_ArelExtensions_Nodes_DateDiff o, collector
96
+ collector << "DATEDIFF("
97
+ collector = visit o.left, collector
98
+ collector << Arel::Visitors::ToSql::COMMA
99
+ collector = visit o.right, collector
100
+ collector << ")"
101
+ collector
102
+ end
103
+
104
+ def visit_ArelExtensions_Nodes_DateSub o, collector
105
+ collector << "DATE_SUB("
106
+ collector = visit o.left, collector
107
+ collector << Arel::Visitors::ToSql::COMMA
108
+ collector = visit o.right, collector
109
+ collector << ")"
110
+ collector
111
+ end
112
+
113
+ # override
114
+ remove_method :visit_Arel_Nodes_As
115
+ def visit_Arel_Nodes_As o, collector
116
+ if o.left.is_a?(Arel::Nodes::Binary)
117
+ collector << '('
118
+ collector = visit o.left, collector
119
+ collector << ')'
120
+ else
121
+ collector = visit o.left, collector
122
+ end
123
+ collector << " AS "
124
+ collector = visit o.right, collector
125
+ collector
126
+ end
127
+
128
+ remove_method :visit_Arel_Nodes_Regexp
129
+ def visit_Arel_Nodes_Regexp o, collector
130
+ collector = visit o.left, collector
131
+ collector << " REGEXP "
132
+ collector = visit o.right, collector
133
+ collector
134
+ end
135
+
136
+ remove_method :visit_Arel_Nodes_NotRegexp
137
+ def visit_Arel_Nodes_NotRegexp o, collector
138
+ collector = visit o.left, collector
139
+ collector << " NOT REGEXP "
140
+ collector = visit o.right, collector
141
+ collector
142
+ end
143
+
144
+ def visit_ArelExtensions_Nodes_IMatches o, collector
145
+ collector = infix_value o, collector, ' ILIKE '
146
+ if o.escape
147
+ collector << ' ESCAPE '
148
+ visit o.escape, collector
149
+ else
150
+ collector
151
+ end
152
+ end
153
+
154
+ def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
155
+ collector = infix_value o, collector, ' NOT ILIKE '
156
+ if o.escape
157
+ collector << ' ESCAPE '
158
+ visit o.escape, collector
159
+ else
160
+ collector
161
+ end
162
+ end
163
+
164
+ # Date operations
165
+ def visit_ArelExtensions_Nodes_DateAdd o, collector
166
+ collector << "DATE_ADD("
167
+ collector = visit o.left, collector
168
+ collector << Arel::Visitors::ToSql::COMMA
169
+ collector = visit o.right, collector
170
+ collector << ")"
171
+ collector
172
+ end
173
+
174
+
175
+ def visit_ArelExtensions_InsertManager_BulkValues o, collector
176
+ collector << "VALUES "
177
+ row_nb = o.left.length
178
+ o.left.each_with_index do |row, idx|
179
+ collector << '('
180
+ v = Arel::Nodes::Values.new(row, o.cols)
181
+ len = v.expressions.length - 1
182
+ v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
183
+ case value
184
+ when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
185
+ collector = visit value, collector
186
+ else
187
+ collector << quote(value, attr && column_for(attr)).to_s
188
+ end
189
+ collector << Arel::Visitors::ToSql::COMMA unless i == len
190
+ }
191
+ collector << (idx == row_nb-1 ? ')' : '), ')
192
+ end
193
+ collector
194
+ end
195
+
196
+ end
197
+
198
+ end
199
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'minitest/autorun'
3
+ require 'fileutils'
4
+ require 'arel'
5
+ require 'active_record'
6
+
7
+ require 'arel_extensions'
8
+
9
+ require 'support/fake_record'
10
+ Arel::Table.engine = FakeRecord::Base.new
11
+
12
+ $arel_silence_type_casting_deprecation = true
13
+
14
+ class Object
15
+ def must_be_like other
16
+ gsub(/\s+/, ' ').strip.must_equal other.gsub(/\s+/, ' ').strip
17
+ end
18
+ end
@@ -0,0 +1,251 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'active_record'
4
+
5
+ $:.unshift "#{File.dirname(__FILE__)}../../lib"
6
+ require 'arel_extensions'
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
+ def setup_db
15
+ @cnx = ActiveRecord::Base.connection
16
+ if ActiveRecord::Base.connection.adapter_name =~ /sqlite/i
17
+ $sqlite = true
18
+ db = @cnx.raw_connection
19
+ if !$load_extension_disabled
20
+ begin
21
+ db.enable_load_extension(1)
22
+ db.load_extension("/usr/lib/sqlite3/pcre.so")
23
+ db.load_extension("/usr/lib/sqlite3/extension-functions.so")
24
+ db.enable_load_extension(0)
25
+ rescue => e
26
+ $load_extension_disabled = true
27
+ puts "can not load extensions #{e.inspect}"
28
+ end
29
+ end
30
+ #function find_in_set
31
+ db.create_function("find_in_set", 1) do |func, value1, value2|
32
+ func.result = value1.index(value2)
33
+ end
34
+ end
35
+ @cnx.drop_table(:users) rescue nil
36
+ @cnx.create_table :users do |t|
37
+ t.column :age, :integer
38
+ t.column :name, :string
39
+ t.column :created_at, :date
40
+ t.column :updated_at, :date
41
+ t.column :score, :floor
42
+ end
43
+ end
44
+
45
+ def teardown_db
46
+ @cnx.drop_table(:users)
47
+ end
48
+
49
+ class User < ActiveRecord::Base
50
+
51
+ end
52
+
53
+
54
+ class ListTest < Test::Unit::TestCase
55
+
56
+ def setup
57
+ d = Date.new(2016,05,23)
58
+ setup_db
59
+ User.create! :age => 5, :name => "Lucas", :created_at => d , :score => 20.16
60
+ User.create! :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
61
+ User.create! :age => 20, :name => "Camille", :created_at => d, :score => 20.16
62
+ User.create! :age => 21, :name => "Arthur", :created_at => d, :score => 65.62
63
+ u = User.create :age => 23, :name => "Myung", :created_at => d, :score => 20.16
64
+ @myung = User.where(:id => u.id)
65
+ User.create! :age => 25, :name => "Laure", :created_at => d, :score =>20.16
66
+ User.create! :age =>nil, :name => "Test", :created_at => d, :score => 1.62
67
+ User.create! :age =>-0, :name => "Negatif", :created_at => d, :score => 0.17
68
+ end
69
+
70
+ def teardown
71
+ teardown_db
72
+ end
73
+
74
+ def test_abs
75
+ assert_equal 0,User.where(User.arel_table[:name].eq("Negatif")).select((User.arel_table[:age].abs).as("res")).first.res
76
+ assert_equal 14,User.where(User.arel_table[:name].eq("Laure")).select(((User.arel_table[:age] - 39).abs).as("res")).first.res
77
+ end
78
+
79
+ def test_ceil
80
+ if !$sqlite || !$load_extension_disabled
81
+ assert_equal 1,User.where(User.arel_table[:name].eq("Negatif")).select((User.arel_table[:score].ceil).as("res")).first.res
82
+ assert_equal 66,User.where(User.arel_table[:name].eq("Arthur")).select((User.arel_table[:score].ceil).as("res")).first.res
83
+ end
84
+ end
85
+
86
+ def test_coalesce
87
+ if @cnx.adapter_name =~ /pgsql/i
88
+ assert_equal 100,User.where(User.arel_table[:name].eq("Test")).select((User.arel_table[:age].coalesce(100)).as("res")).first.res
89
+ assert_equal "Camille",User.where(User.arel_table[:name].eq("Camille")).select((User.arel_table[:name].coalesce("Null","default")).as("res")).first.res
90
+ else
91
+ 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("Null",20)).as("res")).first.res
93
+ end
94
+ end
95
+
96
+ def test_Comparator
97
+ assert_equal 2,User.where(User.arel_table[:age] < 6 ).count
98
+ assert_equal 2,User.where(User.arel_table[:age] <=10 ).count
99
+ assert_equal 3,User.where(User.arel_table[:age] > 20 ).count
100
+ assert_equal 4,User.where(User.arel_table[:age] >=20 ).count
101
+ assert_equal 1,User.where(User.arel_table[:age] > 5 ).where(User.arel_table[:age] < 20 ).count
102
+ end
103
+
104
+ def test_date_duration
105
+ #Year
106
+ assert_equal 2016,User.where(User.arel_table[:name].eq("Lucas")).select((User.arel_table[:created_at].year).as("res")).first.res.to_i
107
+ assert_equal 0,User.where(User.arel_table[:created_at].year.eq("2012")).count
108
+ #Month
109
+ assert_equal 5,User.where(User.arel_table[:name].eq("Camille")).select((User.arel_table[:created_at].month).as("res")).first.res.to_i
110
+ assert_equal 8,User.where(User.arel_table[:created_at].month.eq("05")).count
111
+ #Week
112
+ assert_equal 21,User.where(User.arel_table[:name].eq("Arthur")).select((User.arel_table[:created_at].week).as("res")).first.res.to_i
113
+ assert_equal 8,User.where(User.arel_table[:created_at].month.eq("05")).count
114
+ #Day
115
+ assert_equal 23,User.where(User.arel_table[:name].eq("Laure")).select((User.arel_table[:created_at].day).as("res")).first.res.to_i
116
+ assert_equal 0,User.where(User.arel_table[:created_at].day.eq("05")).count
117
+ end
118
+
119
+
120
+
121
+ def test_length
122
+ assert_equal 7,User.where(User.arel_table[:name].eq("Camille")).select((User.arel_table[:name].length).as("res")).first.res
123
+ assert_equal 5,User.where(User.arel_table[:name].eq("Laure")).select((User.arel_table[:name].length).as("res")).first.res
124
+ end
125
+
126
+ def test_locate
127
+ if !$sqlite || !$load_extension_disabled
128
+ assert_equal 1, User.where(User.arel_table[:name].eq("Camille")).select((User.arel_table[:name].locate("C")).as("res")).first.res
129
+ assert_equal 0, User.where(User.arel_table[:name].eq("Lucas")).select((User.arel_table[:name].locate("z")).as("res")).first.res
130
+ assert_equal 5, User.where(User.arel_table[:name].eq("Lucas")).select((User.arel_table[:name].locate("s")).as("res")).first.res
131
+ end
132
+ end
133
+
134
+ def test_isnull
135
+ if ActiveRecord::Base.connection.adapter_name =~ /pgsql/i
136
+ assert_equal 100,User.where(User.arel_table[:name].eq("Test")).select((User.arel_table[:age].isnull(100)).as("res")).first.res
137
+ else
138
+ assert_equal "default",User.where(User.arel_table[:name].eq("Test")).select((User.arel_table[:age].isnull('default')).as("res")).first.res
139
+ assert_equal "Test",User.where((User.arel_table[:age].isnull('default')).eq('default')).select(User.arel_table[:name]).first.name.to_s
140
+ end
141
+ end
142
+
143
+
144
+ def test_floor
145
+ if !$sqlite || !$load_extension_disabled
146
+ assert_equal 0,User.where(User.arel_table[:name].eq("Negatif")).select((User.arel_table[:score].floor).as("res")).first.res
147
+ assert_equal 65,User.where(User.arel_table[:name].eq("Arthur")).select((User.arel_table[:score].floor).as("res")).first.res
148
+ end
149
+ end
150
+
151
+
152
+ def test_findinset
153
+ db = ActiveRecord::Base.connection.raw_connection
154
+ assert_equal 3,db.get_first_value( "select find_in_set(name,'i') from users where name = 'Camille'" )
155
+ assert_equal "",db.get_first_value( "select find_in_set(name,'p') from users where name = 'Camille'" ).to_s
156
+ #number
157
+ #assert_equal 1,User.select(User.arel_table[:name] & ("l")).count
158
+ #assert_equal 3,(User.select(User.arel_table[:age] & [5,15,20]))
159
+ #string
160
+ end
161
+
162
+
163
+ def test_math_plus
164
+ d = Date.new(1997,06,15)
165
+ #Concat String
166
+ assert_equal "SophiePhan",User.where(User.arel_table[:name].eq("Sophie")).select((User.arel_table[:name] + "Phan").as("res")).first.res
167
+ assert_equal "Sophie2",User.where(User.arel_table[:name].eq("Sophie")).select((User.arel_table[:name] + 2 ).as("res")).first.res
168
+ assert_equal "Sophie1997-06-15",User.where(User.arel_table[:name].eq("Sophie")).select((User.arel_table[:name] + d).as("res")).first.res
169
+ assert_equal "Sophie15",User.where(User.arel_table[:name].eq("Sophie")).select((User.arel_table[:name] + User.arel_table[:age]).as("res")).first.res
170
+ assert_equal "SophieSophie",User.where(User.arel_table[:name].eq("Sophie")).select((User.arel_table[:name] + User.arel_table[:name]).as("res")).first.res
171
+ 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
172
+ #concat Integer
173
+ assert_equal 1, User.where((User.arel_table[:age] + 10).eq(33)).count
174
+ assert_equal 1, User.where((User.arel_table[:age] + "1").eq(6)).count
175
+ assert_equal 1, User.where((User.arel_table[:age] + User.arel_table[:age]).eq(10)).count
176
+ #concat Date
177
+ # puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
178
+ assert_equal "2016-05-24", @myung.select((User.arel_table[:created_at] + 1).as("res")).first.res.to_date.to_s
179
+ assert_equal "2016-05-25", @myung.select((User.arel_table[:created_at] + 2.day).as("res")).first.res.to_date.to_s
180
+ end
181
+
182
+
183
+ def test_math_moins
184
+ d = Date.new(2016,05,20)
185
+ #Datediff
186
+ assert_equal 8,User.where((User.arel_table[:created_at] - User.arel_table[:created_at]).eq(0)).count
187
+ 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
188
+ #Substraction
189
+ assert_equal 0, User.where((User.arel_table[:age] - 10).eq(50)).count
190
+ assert_equal 0, User.where((User.arel_table[:age] - "10").eq(50)).count
191
+ end
192
+
193
+
194
+
195
+ def test_rand
196
+ assert_equal 5,User.where(User.arel_table[:score].eq(20.16)).select(User.arel_table[:id]).order(Arel.rand).take(50).count
197
+ #test_alias :random :rand
198
+ assert_equal 8,User.select(User.arel_table[:name]).order(Arel.rand).take(50).count
199
+ end
200
+
201
+
202
+ def test_regexp_not_regex
203
+ if !$sqlite || !$load_extension_disabled
204
+ assert_equal 1, User.where(User.arel_table[:name] =~ '^M').count
205
+ assert_equal 6, User.where(User.arel_table[:name] != '^L').count
206
+ end
207
+ end
208
+
209
+ def test_replace
210
+ assert_equal "LucaX",User.where(User.arel_table[:name].eq("Lucas")).select(((User.arel_table[:name]).replace("s","X")).as("res")).first.res
211
+ 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
212
+ end
213
+
214
+
215
+ def test_round
216
+ assert_equal 1, User.where(((User.arel_table[:age]).round(0)).eq(5.0)).count
217
+ assert_equal 0, User.where(((User.arel_table[:age]).round(-1)).eq(6.0)).count
218
+ end
219
+
220
+
221
+ def test_Soundex
222
+ if !$sqlite || !$load_extension_disabled
223
+ assert_equal "C540",User.where(User.arel_table[:name].eq("Camille")).select((User.arel_table[:name].soundex).as("res")).first.res.to_s
224
+ assert_equal 8,User.where((User.arel_table[:name].soundex).eq(User.arel_table[:name].soundex)).count
225
+ end
226
+ end
227
+
228
+ def test_Sum
229
+ #.take(50) because of limit by ORDER BY
230
+ assert_equal 110,User.select((User.arel_table[:age].sum + 1).as("res")).take(50).first.res
231
+ assert_equal 218,User.select((User.arel_table[:age].sum + User.arel_table[:age].sum).as("res")).take(50).first.res
232
+ assert_equal 327,User.select(((User.arel_table[:age] * 3).sum).as("res")).take(50).first.res
233
+ assert_equal 2245,User.select(((User.arel_table[:age] * User.arel_table[:age]).sum).as("res")).take(50).first.res
234
+ end
235
+
236
+
237
+ def test_trim
238
+ assert_equal "Myun",User.where(User.arel_table[:name].eq("Myung")).select(User.arel_table[:name].rtrim("g").as("res")).first.res
239
+ assert_equal "yung",User.where(User.arel_table[:name].eq("Myung")).select(User.arel_table[:name].ltrim("M").as("res")).first.res
240
+ assert_equal "yung",User.where(User.arel_table[:name].eq("Myung")).select((User.arel_table[:name] + "M").trim("M").as("res")).first.res
241
+ assert_equal "",User.where(User.arel_table[:name].eq("Myung")).select(User.arel_table[:name].rtrim(User.arel_table[:name]).as("res")).first.res
242
+
243
+ end
244
+
245
+ def test_wday
246
+ d = Date.new(2016,06,26)
247
+ assert_equal 1,User.where(User.arel_table[:name].eq("Myung")).select((User.arel_table[:created_at].wday).as("res")).first.res.to_i
248
+ assert_equal 0,User.select(d.wday).as("res").first.to_i
249
+ end
250
+
251
+ end