arel_extensions 1.2.3 → 1.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +10 -10
  3. data/Gemfile +2 -2
  4. data/README.md +10 -10
  5. data/appveyor.yml +1 -1
  6. data/functions.html +1 -1
  7. data/init/mssql.sql +4 -4
  8. data/init/mysql.sql +38 -38
  9. data/init/postgresql.sql +21 -21
  10. data/lib/arel_extensions.rb +17 -1
  11. data/lib/arel_extensions/common_sql_functions.rb +1 -1
  12. data/lib/arel_extensions/comparators.rb +4 -2
  13. data/lib/arel_extensions/math_functions.rb +9 -4
  14. data/lib/arel_extensions/nodes.rb +1 -1
  15. data/lib/arel_extensions/nodes/aggregate_function.rb +14 -0
  16. data/lib/arel_extensions/nodes/coalesce.rb +2 -2
  17. data/lib/arel_extensions/nodes/concat.rb +6 -13
  18. data/lib/arel_extensions/nodes/date_diff.rb +2 -2
  19. data/lib/arel_extensions/nodes/format.rb +8 -8
  20. data/lib/arel_extensions/nodes/formatted_number.rb +6 -6
  21. data/lib/arel_extensions/nodes/function.rb +2 -0
  22. data/lib/arel_extensions/nodes/matches.rb +4 -4
  23. data/lib/arel_extensions/nodes/power.rb +2 -2
  24. data/lib/arel_extensions/nodes/repeat.rb +2 -2
  25. data/lib/arel_extensions/nodes/replace.rb +1 -1
  26. data/lib/arel_extensions/nodes/soundex.rb +4 -4
  27. data/lib/arel_extensions/nodes/std.rb +19 -21
  28. data/lib/arel_extensions/nodes/substring.rb +1 -1
  29. data/lib/arel_extensions/nodes/sum.rb +7 -0
  30. data/lib/arel_extensions/nodes/trim.rb +2 -2
  31. data/lib/arel_extensions/nodes/union.rb +2 -2
  32. data/lib/arel_extensions/null_functions.rb +2 -2
  33. data/lib/arel_extensions/string_functions.rb +10 -7
  34. data/lib/arel_extensions/version.rb +1 -1
  35. data/lib/arel_extensions/visitors/mssql.rb +4 -4
  36. data/lib/arel_extensions/visitors/mysql.rb +28 -4
  37. data/lib/arel_extensions/visitors/oracle.rb +4 -4
  38. data/lib/arel_extensions/visitors/postgresql.rb +34 -6
  39. data/lib/arel_extensions/visitors/to_sql.rb +29 -22
  40. data/test/helper.rb +1 -1
  41. data/test/real_db_test.rb +1 -1
  42. data/test/test_comparators.rb +1 -1
  43. data/test/visitors/test_bulk_insert_sqlite.rb +1 -1
  44. data/test/visitors/test_bulk_insert_to_sql.rb +7 -9
  45. data/test/visitors/test_oracle.rb +1 -0
  46. data/test/visitors/test_to_sql.rb +6 -0
  47. data/test/with_ar/all_agnostic_test.rb +14 -3
  48. data/test/with_ar/insert_agnostic_test.rb +2 -1
  49. data/test/with_ar/test_bulk_sqlite.rb +1 -1
  50. data/test/with_ar/test_math_sqlite.rb +2 -2
  51. data/test/with_ar/test_string_mysql.rb +3 -3
  52. data/test/with_ar/test_string_sqlite.rb +2 -2
  53. metadata +5 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 19306a80e5058901e7d9db6da1e05cea53e54f3c
4
- data.tar.gz: e79f09a5b088c2d571079b796cb819ddec25ebd3
2
+ SHA256:
3
+ metadata.gz: eac00bb2f717979e8af539923ba6ebca5ed3ef500d5df1499be613b83cd912eb
4
+ data.tar.gz: f6ec1b377391db2da2510eec4bf967a945be8b5327e8f4a176756a6aab3147bf
5
5
  SHA512:
6
- metadata.gz: 29df0447069762b05d5daaa2e53884a3cfa68fef1a67fe9df34ef09923c2ef152da138694a564e59b7302317895b150272f8ef9da5ef2eca20bcde54384068c1
7
- data.tar.gz: b9102e07381a96d449c9257467e7437f5c4746c6a9f047172f72daf3d5cf0d1fa9c49d5bc6fcc61119032695ee58e84e4db0fdff068d5d820288a591631a9e1b
6
+ metadata.gz: ee2f1a2884d3c4f3618ee2a83a887cb9d8d59dae790d216c27a8a1c75b79a9d2b777467a730d2723addb5593d31a23d8673affa5190487a341cd0bfd5509d91d
7
+ data.tar.gz: 92f615201dfd33112b4ddbc4ede753c946163b591233b6da7525af97940c951944094d19743f3fa151c563086a752bc92d38649686ef2dcafafb58f766fc0041
@@ -86,7 +86,7 @@ matrix:
86
86
  - rvm: 2.5.0
87
87
  jdk: openjdk7
88
88
  - rvm: ruby-head
89
- jdk: openjdk7
89
+ jdk: openjdk7
90
90
  - rvm: rbx-2
91
91
  jdk: oraclejdk8
92
92
  - rvm: 2.0.0
@@ -150,7 +150,7 @@ matrix:
150
150
  - rvm: 2.5.0
151
151
  jdk: oraclejdk11
152
152
  - rvm: ruby-head
153
- jdk: oraclejdk11
153
+ jdk: oraclejdk11
154
154
  - rvm: rbx-2
155
155
  jdk: openjdk11
156
156
  - rvm: 2.0.0
@@ -166,7 +166,7 @@ matrix:
166
166
  - rvm: 2.5.0
167
167
  jdk: openjdk11
168
168
  - rvm: ruby-head
169
- jdk: openjdk11
169
+ jdk: openjdk11
170
170
  - rvm: jruby-9.2.0.0
171
171
  jdk: openjdk7
172
172
  - rvm: jruby-head
@@ -182,7 +182,7 @@ matrix:
182
182
  - rvm: 2.0.0
183
183
  gemfile: gemfiles/rails5_0.gemfile
184
184
  - rvm: 2.1
185
- gemfile: gemfiles/rails5_0.gemfile
185
+ gemfile: gemfiles/rails5_0.gemfile
186
186
  - rvm: jruby-9.0.5.0
187
187
  gemfile: gemfiles/rails5_1_4.gemfile
188
188
  - rvm: 2.0.0
@@ -191,17 +191,17 @@ matrix:
191
191
  gemfile: gemfiles/rails5_2.gemfile
192
192
  allow_failures:
193
193
  - rvm: rbx-2
194
- gemfile: gemfiles/rails4.gemfile
194
+ gemfile: gemfiles/rails4.gemfile
195
195
  - rvm: rbx-2
196
- gemfile: gemfiles/rails5_0.gemfile
196
+ gemfile: gemfiles/rails5_0.gemfile
197
197
  - rvm: rbx-2
198
- gemfile: gemfiles/rails5_1_4.gemfile
198
+ gemfile: gemfiles/rails5_1_4.gemfile
199
199
  - rvm: rbx-2
200
200
  gemfile: gemfiles/rails5_2.gemfile
201
201
  - rvm: rbx-2
202
202
  gemfile: gemfiles/rails5_1_4.gemfile
203
- - rvm: jruby-9.0.5.0
204
- gemfile: gemfiles/rails5_2.gemfile
203
+ - rvm: jruby-9.0.5.0
204
+ gemfile: gemfiles/rails5_2.gemfile
205
205
  - rvm: jruby-9.2.0.0
206
206
  jdk: oraclejdk9
207
207
  gemfile: gemfiles/rails5_2.gemfile
@@ -217,7 +217,7 @@ matrix:
217
217
  jdk: oraclejdk9
218
218
  bundler_args: "--jobs 3 --retry 2"
219
219
  notifications:
220
- email:
220
+ email:
221
221
  notifications:
222
222
  - julien.delporte@faveod.com
223
223
  - yann.azoury@faveod.com
data/Gemfile CHANGED
@@ -14,8 +14,8 @@ group :development, :test do
14
14
 
15
15
  gem "tiny_tds", '~> 1.3.0' ,:require => false, :platforms => [:mri,:mingw, :x64_mingw, :mswin]
16
16
  gem "activerecord-sqlserver-adapter", '~> 4.2.0', :platforms => [:mri, :mingw, :x64_mingw, :mswin]
17
-
18
- gem 'ruby-oci8', :platforms => [:mri, :mswin, :x64_mingw, :mingw]
17
+
18
+ gem 'ruby-oci8', :platforms => [:mri, :mswin, :x64_mingw, :mingw]
19
19
  gem 'activerecord-oracle_enhanced-adapter', '~> 1.6.0'
20
20
 
21
21
  gem 'activesupport', '~> 4.0'
data/README.md CHANGED
@@ -72,9 +72,9 @@ With Arel Extensions:
72
72
  Other functions : ABS, RAND, ROUND, FLOOR, CEIL, FORMAT
73
73
 
74
74
  For Example:
75
- ```ruby
75
+ ```ruby
76
76
  t[:price].format_number("%07.2f €","fr_FR")
77
- # equivalent to 'sprintf("%07.2f €",price)' plus locale management
77
+ # equivalent to 'sprintf("%07.2f €",price)' plus locale management
78
78
  ```
79
79
 
80
80
  ## String operations
@@ -130,7 +130,7 @@ t[:birthdate].format('%Y-%m-%d').to_sql
130
130
  # => DATE_FORMAT(my_table.birthdate, '%Y-%m-%d')
131
131
  ```
132
132
 
133
- ## Unions
133
+ ## Unions
134
134
 
135
135
  ```ruby
136
136
  (t.where(t[:name].eq('str')) + t.where(t[:name].eq('test'))).to_sql
@@ -143,7 +143,7 @@ Arel-extensions allows to use functions on case clause
143
143
 
144
144
  ```ruby
145
145
  t[:name].when("smith").then(1).when("doe").then(2).else(0).sum.to_sql
146
- # => SUM(CASE "my_table"."name" WHEN 'smith' THEN 1 WHEN 'doe' THEN 2 ELSE 0 END)
146
+ # => SUM(CASE "my_table"."name" WHEN 'smith' THEN 1 WHEN 'doe' THEN 2 ELSE 0 END)
147
147
  ```
148
148
 
149
149
  ## Cast Function
@@ -160,7 +160,7 @@ t[:id].cast('char').to_sql
160
160
 
161
161
  To optimize queries, some classical functions are defined in databases missing any alternative native functions.
162
162
  Examples :
163
- - FIND_IN_SET
163
+ - FIND_IN_SET
164
164
 
165
165
  ## BULK INSERT / UPSERT
166
166
 
@@ -385,7 +385,7 @@ User.connection.execute(insert_manager.to_sql)
385
385
  <td class="ok">✔</td>
386
386
  <td class="tg-j6lv">✔</td>
387
387
  <td class="tg-j6lv">?</td>
388
- </tr>
388
+ </tr>
389
389
  <tr>
390
390
  <td class="tg-yw4l">Matching Accent Insensitive<br>column.ai_matches('blah')</td>
391
391
  <td class="ok">not supported</td>
@@ -394,7 +394,7 @@ User.connection.execute(insert_manager.to_sql)
394
394
  <td class="ok">not supported</td>
395
395
  <td class="tg-j6lv">✔</td>
396
396
  <td class="tg-j6lv">?</td>
397
- </tr>
397
+ </tr>
398
398
  <tr>
399
399
  <td class="tg-yw4l">Matching Case Insensitive<br>column.imatches('blah')</td>
400
400
  <td class="ok">not supported</td>
@@ -403,7 +403,7 @@ User.connection.execute(insert_manager.to_sql)
403
403
  <td class="ok">✔</td>
404
404
  <td class="tg-j6lv">✔</td>
405
405
  <td class="tg-j6lv">?</td>
406
- </tr>
406
+ </tr>
407
407
  <tr>
408
408
  <td class="tg-yw4l">Matching Accent/Case Sensitive<br>column.smatches('blah')</td>
409
409
  <td class="ok">✔</td>
@@ -412,8 +412,8 @@ User.connection.execute(insert_manager.to_sql)
412
412
  <td class="ok">✔</td>
413
413
  <td class="tg-j6lv">✔</td>
414
414
  <td class="tg-j6lv">?</td>
415
- </tr>
416
-
415
+ </tr>
416
+
417
417
  <tr>
418
418
  <th class="tg-4rp9" rowspan="6"><div>Date functions</div></th>
419
419
  <td class="tg-yw4l">DATEADD<br>column + 2.year<br></td>
@@ -41,4 +41,4 @@ environment:
41
41
  - RUBY_VERSION: 22
42
42
  - RUBY_VERSION: 23
43
43
  - RUBY_VERSION: 23-x64
44
-
44
+
@@ -379,7 +379,7 @@
379
379
  <td class="ok">✔</td>
380
380
  <td class="ok">✔</td>
381
381
  <td class="ok">✔</td>
382
- </tr>
382
+ </tr>
383
383
  <tr>
384
384
  <th class="bulk_insert" rowspan="1"><div>Set<br/> Operators</div></th>
385
385
  <td class="tg-yw4l">UNION ( + )<br/>query + query</td>
@@ -83,7 +83,7 @@ BEGIN
83
83
  END
84
84
  SELECT @cv1 = @cv0, @i = @i + 1
85
85
  END
86
- RETURN @c
86
+ RETURN @c
87
87
  END
88
88
  GO
89
89
 
@@ -94,9 +94,9 @@ GO
94
94
  --RETURNS TABLE
95
95
  --AS
96
96
  --BEGIN
97
- -- RETURN ( SELECT [Value] FROM
98
- -- (
99
- -- SELECT
97
+ -- RETURN ( SELECT [Value] FROM
98
+ -- (
99
+ -- SELECT
100
100
  -- [Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
101
101
  -- CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number])))
102
102
  -- FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
@@ -1,45 +1,45 @@
1
1
  DELIMITER $$
2
2
 
3
3
  DROP FUNCTION IF EXISTS levenshtein_distance; $$
4
- CREATE FUNCTION levenshtein_distance( s1 VARCHAR(255), s2 VARCHAR(255) )
5
- RETURNS INT
6
- DETERMINISTIC
7
- BEGIN
8
- DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
9
- DECLARE s1_char CHAR;
10
- -- max strlen=255
11
- DECLARE cv0, cv1 VARBINARY(256);
4
+ CREATE FUNCTION levenshtein_distance( s1 VARCHAR(255), s2 VARCHAR(255) )
5
+ RETURNS INT
6
+ DETERMINISTIC
7
+ BEGIN
8
+ DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
9
+ DECLARE s1_char CHAR;
10
+ -- max strlen=255
11
+ DECLARE cv0, cv1 VARBINARY(256);
12
12
  SET s1 = IFNULL(s1,''), s2 = IFNULL(s2,'');
13
- SET s1_len = CHAR_LENGTH(IFNULL(s1,'')), s2_len = CHAR_LENGTH(IFNULL(s2,'')), cv1 = 0x00, j = 1, i = 1, c = 0;
14
- IF s1_len = 0 THEN
15
- RETURN s2_len;
16
- ELSEIF s2_len = 0 THEN
17
- RETURN s1_len;
18
- ELSEIF s1 = s2 THEN
13
+ SET s1_len = CHAR_LENGTH(IFNULL(s1,'')), s2_len = CHAR_LENGTH(IFNULL(s2,'')), cv1 = 0x00, j = 1, i = 1, c = 0;
14
+ IF s1_len = 0 THEN
15
+ RETURN s2_len;
16
+ ELSEIF s2_len = 0 THEN
17
+ RETURN s1_len;
18
+ ELSEIF s1 = s2 THEN
19
19
  RETURN 0;
20
- ELSE
21
- WHILE j <= s2_len DO
22
- SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
23
- END WHILE;
24
- WHILE i <= s1_len DO
25
- SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
26
- WHILE j <= s2_len DO
27
- SET c = c + 1;
28
- IF s1_char = SUBSTRING(s2, j, 1) THEN
29
- SET cost = 0; ELSE SET cost = 1;
30
- END IF;
31
- SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
32
- IF c > c_temp THEN SET c = c_temp; END IF;
33
- SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
34
- IF c > c_temp THEN
35
- SET c = c_temp;
36
- END IF;
37
- SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
38
- END WHILE;
39
- SET cv1 = cv0, i = i + 1;
40
- END WHILE;
41
- END IF;
42
- RETURN c;
20
+ ELSE
21
+ WHILE j <= s2_len DO
22
+ SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
23
+ END WHILE;
24
+ WHILE i <= s1_len DO
25
+ SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
26
+ WHILE j <= s2_len DO
27
+ SET c = c + 1;
28
+ IF s1_char = SUBSTRING(s2, j, 1) THEN
29
+ SET cost = 0; ELSE SET cost = 1;
30
+ END IF;
31
+ SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
32
+ IF c > c_temp THEN SET c = c_temp; END IF;
33
+ SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
34
+ IF c > c_temp THEN
35
+ SET c = c_temp;
36
+ END IF;
37
+ SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
38
+ END WHILE;
39
+ SET cv1 = cv0, i = i + 1;
40
+ END WHILE;
41
+ END IF;
42
+ RETURN c;
43
43
  END;$$
44
-
44
+
45
45
  DELIMITER ;
@@ -4,17 +4,17 @@ CREATE OR REPLACE FUNCTION public.find_in_set(n INTEGER, s TEXT)
4
4
  AS $function$
5
5
  SELECT * FROM (
6
6
  select int4(z.row_number) from (
7
- select row_number() over(), y.x
7
+ select row_number() over(), y.x
8
8
  from (select unnest(('{' || $2 || '}')::int[]) as x) as y
9
9
  ) as z
10
10
  where z.x = $1
11
- UNION ALL
11
+ UNION ALL
12
12
  SELECT 0) z
13
13
  LIMIT 1
14
14
  $function$
15
15
  ;
16
16
 
17
- CREATE OR REPLACE FUNCTION public.levenshtein_distance(s text, t text)
17
+ CREATE OR REPLACE FUNCTION public.levenshtein_distance(s text, t text)
18
18
  RETURNS integer AS $$
19
19
  DECLARE i integer;
20
20
  DECLARE j integer;
@@ -48,58 +48,58 @@ BEGIN
48
48
  d[i*(n+1)+j] := LEAST(d[(i-1)*(n+1)+j]+1, d[i*(n+1)+j-1]+1, d[(i-1)*(n+1)+j-1]+c);
49
49
  END LOOP;
50
50
  END LOOP;
51
-
52
- return d[m*(n+1)+n];
51
+
52
+ return d[m*(n+1)+n];
53
53
  END;
54
54
  $$ LANGUAGE plpgsql IMMUTABLE;
55
55
 
56
- CREATE OR REPLACE FUNCTION public.DateDiff(units VARCHAR(30), start_t TIMESTAMP, end_t TIMESTAMP)
56
+ CREATE OR REPLACE FUNCTION public.DateDiff(units VARCHAR(30), start_t TIMESTAMP, end_t TIMESTAMP)
57
57
  RETURNS INT AS $$
58
58
  DECLARE
59
- diff_interval INTERVAL;
59
+ diff_interval INTERVAL;
60
60
  diff INT = 0;
61
61
  years_diff INT = 0;
62
62
  BEGIN
63
63
  IF units IN ('yy', 'yyyy', 'year', 'mm', 'm', 'month') THEN
64
64
  years_diff = DATE_PART('year', end_t) - DATE_PART('year', start_t);
65
-
65
+
66
66
  IF units IN ('yy', 'yyyy', 'year') THEN
67
67
  -- SQL Server does not count full years passed (only difference between year parts)
68
68
  RETURN years_diff;
69
69
  ELSE
70
70
  -- If end month is less than start month it will subtracted
71
- RETURN years_diff * 12 + (DATE_PART('month', end_t) - DATE_PART('month', start_t));
71
+ RETURN years_diff * 12 + (DATE_PART('month', end_t) - DATE_PART('month', start_t));
72
72
  END IF;
73
73
  END IF;
74
-
75
- -- Minus operator returns interval 'DDD days HH:MI:SS'
74
+
75
+ -- Minus operator returns interval 'DDD days HH:MI:SS'
76
76
  diff_interval = end_t - start_t;
77
-
77
+
78
78
  diff = diff + DATE_PART('day', diff_interval);
79
-
79
+
80
80
  IF units IN ('wk', 'ww', 'week') THEN
81
81
  diff = diff/7;
82
82
  RETURN diff;
83
83
  END IF;
84
-
84
+
85
85
  IF units IN ('dd', 'd', 'day') THEN
86
86
  RETURN diff;
87
87
  END IF;
88
-
89
- diff = diff * 24 + DATE_PART('hour', diff_interval);
90
-
88
+
89
+ diff = diff * 24 + DATE_PART('hour', diff_interval);
90
+
91
91
  IF units IN ('hh', 'hour') THEN
92
92
  RETURN diff;
93
93
  END IF;
94
-
94
+
95
95
  diff = diff * 60 + DATE_PART('minute', diff_interval);
96
-
96
+
97
97
  IF units IN ('mi', 'n', 'minute') THEN
98
98
  RETURN diff;
99
99
  END IF;
100
-
100
+
101
101
  diff = diff * 60 + DATE_PART('second', diff_interval);
102
-
102
+
103
103
  RETURN diff;
104
104
  END;
105
105
  $$ LANGUAGE plpgsql;
@@ -93,6 +93,14 @@ module Arel
93
93
  ArelExtensions::Nodes::Duration.new(s.to_s+'i',expr)
94
94
  end
95
95
 
96
+ def self.true
97
+ Arel::Nodes::Equality.new(1,1)
98
+ end
99
+
100
+ def self.false
101
+ Arel::Nodes::Equality.new(1,0)
102
+ end
103
+
96
104
  end
97
105
 
98
106
  Arel::Attributes::Attribute.class_eval do
@@ -109,6 +117,10 @@ Arel::Nodes::Function.class_eval do
109
117
  include ArelExtensions::BooleanFunctions
110
118
  include ArelExtensions::NullFunctions
111
119
  include ArelExtensions::Predications
120
+
121
+ def as other
122
+ Arel::Nodes::As.new(self, Arel.sql(other))
123
+ end
112
124
  end
113
125
 
114
126
  Arel::Nodes::Unary.class_eval do
@@ -149,4 +161,8 @@ Arel::Nodes::As.class_eval do
149
161
  include ArelExtensions::Nodes
150
162
  end
151
163
 
152
-
164
+ Arel::Table.class_eval do
165
+ def alias(name = "#{self.name}_2")
166
+ name.blank? ? self : Arel::Nodes::TableAlias.new(self,name)
167
+ end
168
+ end
@@ -52,7 +52,7 @@ module ArelExtensions
52
52
  sql.split(/^GO\s*$/).each {|str|
53
53
  @cnx.execute(str.strip) unless str.blank?
54
54
  }
55
- elsif env_db == 'mysql'
55
+ elsif env_db == 'mysql'
56
56
  sql.split("$$")[1..-2].each { |str|
57
57
  @cnx.execute(str.strip) unless str.strip.blank?
58
58
  }
@@ -1,6 +1,7 @@
1
1
  module ArelExtensions
2
2
  module Comparators
3
3
 
4
+
4
5
  def >(other)
5
6
  Arel::Nodes::GreaterThan.new self, Arel::Nodes.build_quoted(other, self)
6
7
  end
@@ -37,13 +38,14 @@ module ArelExtensions
37
38
  end
38
39
 
39
40
  private
40
- #Function use for not_regexp
41
+ # Function used for not_regexp.
41
42
  def convert_regexp(other)
42
43
  case other
43
44
  when String
44
- #Do nothing
45
+ # Do nothing.
45
46
  when Regexp
46
47
  other = other.source.gsub('\A','^')
48
+ other.gsub!('\z','$')
47
49
  other.gsub!('\Z','$')
48
50
  other.gsub!('\d','[0-9]')
49
51
  other.gsub!('\D','[^0-9]')