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.
- checksums.yaml +5 -5
- data/.travis.yml +10 -10
- data/Gemfile +2 -2
- data/README.md +10 -10
- data/appveyor.yml +1 -1
- data/functions.html +1 -1
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/postgresql.sql +21 -21
- data/lib/arel_extensions.rb +17 -1
- data/lib/arel_extensions/common_sql_functions.rb +1 -1
- data/lib/arel_extensions/comparators.rb +4 -2
- data/lib/arel_extensions/math_functions.rb +9 -4
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/nodes/aggregate_function.rb +14 -0
- data/lib/arel_extensions/nodes/coalesce.rb +2 -2
- data/lib/arel_extensions/nodes/concat.rb +6 -13
- data/lib/arel_extensions/nodes/date_diff.rb +2 -2
- data/lib/arel_extensions/nodes/format.rb +8 -8
- data/lib/arel_extensions/nodes/formatted_number.rb +6 -6
- data/lib/arel_extensions/nodes/function.rb +2 -0
- data/lib/arel_extensions/nodes/matches.rb +4 -4
- data/lib/arel_extensions/nodes/power.rb +2 -2
- data/lib/arel_extensions/nodes/repeat.rb +2 -2
- data/lib/arel_extensions/nodes/replace.rb +1 -1
- data/lib/arel_extensions/nodes/soundex.rb +4 -4
- data/lib/arel_extensions/nodes/std.rb +19 -21
- data/lib/arel_extensions/nodes/substring.rb +1 -1
- data/lib/arel_extensions/nodes/sum.rb +7 -0
- data/lib/arel_extensions/nodes/trim.rb +2 -2
- data/lib/arel_extensions/nodes/union.rb +2 -2
- data/lib/arel_extensions/null_functions.rb +2 -2
- data/lib/arel_extensions/string_functions.rb +10 -7
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +4 -4
- data/lib/arel_extensions/visitors/mysql.rb +28 -4
- data/lib/arel_extensions/visitors/oracle.rb +4 -4
- data/lib/arel_extensions/visitors/postgresql.rb +34 -6
- data/lib/arel_extensions/visitors/to_sql.rb +29 -22
- data/test/helper.rb +1 -1
- data/test/real_db_test.rb +1 -1
- data/test/test_comparators.rb +1 -1
- data/test/visitors/test_bulk_insert_sqlite.rb +1 -1
- data/test/visitors/test_bulk_insert_to_sql.rb +7 -9
- data/test/visitors/test_oracle.rb +1 -0
- data/test/visitors/test_to_sql.rb +6 -0
- data/test/with_ar/all_agnostic_test.rb +14 -3
- data/test/with_ar/insert_agnostic_test.rb +2 -1
- data/test/with_ar/test_bulk_sqlite.rb +1 -1
- data/test/with_ar/test_math_sqlite.rb +2 -2
- data/test/with_ar/test_string_mysql.rb +3 -3
- data/test/with_ar/test_string_sqlite.rb +2 -2
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: eac00bb2f717979e8af539923ba6ebca5ed3ef500d5df1499be613b83cd912eb
|
4
|
+
data.tar.gz: f6ec1b377391db2da2510eec4bf967a945be8b5327e8f4a176756a6aab3147bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee2f1a2884d3c4f3618ee2a83a887cb9d8d59dae790d216c27a8a1c75b79a9d2b777467a730d2723addb5593d31a23d8673affa5190487a341cd0bfd5509d91d
|
7
|
+
data.tar.gz: 92f615201dfd33112b4ddbc4ede753c946163b591233b6da7525af97940c951944094d19743f3fa151c563086a752bc92d38649686ef2dcafafb58f766fc0041
|
data/.travis.yml
CHANGED
@@ -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>
|
data/appveyor.yml
CHANGED
data/functions.html
CHANGED
data/init/mssql.sql
CHANGED
@@ -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)
|
data/init/mysql.sql
CHANGED
@@ -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 ;
|
data/init/postgresql.sql
CHANGED
@@ -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;
|
data/lib/arel_extensions.rb
CHANGED
@@ -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
|
@@ -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
|
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]')
|