arel_extensions 1.2.3 → 1.2.5

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 (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]')