arel_extensions 0.8.0

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.
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