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