arel_extensions 1.1.5 → 1.1.6
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 +4 -4
- data/init/mysql.sql +45 -0
- data/init/postgresql.sql +38 -0
- data/lib/arel_extensions/common_sql_functions.rb +4 -0
- data/lib/arel_extensions/string_functions.rb +1 -0
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +2 -2
- data/lib/arel_extensions/visitors/oracle12.rb +3 -5
- data/test/with_ar/all_agnostic_test.rb +7 -4
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c913d6441a8028303914d933c15eb3d93d68bd91
|
4
|
+
data.tar.gz: 1825a0b009eb23791d475fc4394e4878fe7d7f7d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc59a956052f6e95c7245fd1b7c127617c97314aff341a20785b5087a2ae5401df036d3a9ffa340beb8b061aed555d5bfddcfdbb1a35c8585f1ffdeb7905b901
|
7
|
+
data.tar.gz: e60ab20676125801cd4c5c8f2fe4f5f7cc9cf73f7134f9fdc71853a28b32c34a2dbb735926b524575d5226a4ec68ebadd46861a02723dc63087fdf97f09fae7e
|
data/init/mysql.sql
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
DELIMITER $$
|
2
|
+
|
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);
|
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
|
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;
|
43
|
+
END;$$
|
44
|
+
|
45
|
+
DELIMITER ;
|
data/init/postgresql.sql
CHANGED
@@ -14,6 +14,44 @@ AS $function$
|
|
14
14
|
$function$
|
15
15
|
;
|
16
16
|
|
17
|
+
CREATE OR REPLACE FUNCTION public.levenshtein_distance(s text, t text)
|
18
|
+
RETURNS integer AS $$
|
19
|
+
DECLARE i integer;
|
20
|
+
DECLARE j integer;
|
21
|
+
DECLARE m integer;
|
22
|
+
DECLARE n integer;
|
23
|
+
DECLARE d integer[];
|
24
|
+
DECLARE c integer;
|
25
|
+
|
26
|
+
BEGIN
|
27
|
+
m := char_length(s);
|
28
|
+
n := char_length(t);
|
29
|
+
|
30
|
+
i := 0;
|
31
|
+
j := 0;
|
32
|
+
|
33
|
+
FOR i IN 0..m LOOP
|
34
|
+
d[i*(n+1)] = i;
|
35
|
+
END LOOP;
|
36
|
+
|
37
|
+
FOR j IN 0..n LOOP
|
38
|
+
d[j] = j;
|
39
|
+
END LOOP;
|
40
|
+
|
41
|
+
FOR i IN 1..m LOOP
|
42
|
+
FOR j IN 1..n LOOP
|
43
|
+
IF SUBSTRING(s,i,1) = SUBSTRING(t, j,1) THEN
|
44
|
+
c := 0;
|
45
|
+
ELSE
|
46
|
+
c := 1;
|
47
|
+
END IF;
|
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
|
+
END LOOP;
|
50
|
+
END LOOP;
|
51
|
+
|
52
|
+
return d[m*(n+1)+n];
|
53
|
+
END;
|
54
|
+
$$ LANGUAGE plpgsql IMMUTABLE;
|
17
55
|
|
18
56
|
CREATE OR REPLACE FUNCTION public.DateDiff(units VARCHAR(30), start_t TIMESTAMP, end_t TIMESTAMP)
|
19
57
|
RETURNS INT AS $$
|
@@ -52,6 +52,10 @@ 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'
|
56
|
+
sql.split("$$")[1..-2].each { |str|
|
57
|
+
@cnx.execute(str.strip) unless str.strip.blank?
|
58
|
+
}
|
55
59
|
else
|
56
60
|
@cnx.execute(sql) unless sql.blank?
|
57
61
|
end
|
@@ -419,7 +419,7 @@ module ArelExtensions
|
|
419
419
|
end
|
420
420
|
|
421
421
|
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
422
|
-
col = o.left
|
422
|
+
col = o.left.coalesce(0)
|
423
423
|
locale = Arel::Nodes.build_quoted(o.locale.tr('_','-'))
|
424
424
|
param = Arel::Nodes.build_quoted("N#{o.precision}")
|
425
425
|
sign = ArelExtensions::Nodes::Case.new.when(col<0).
|
@@ -469,7 +469,7 @@ module ArelExtensions
|
|
469
469
|
number,
|
470
470
|
after
|
471
471
|
])
|
472
|
-
collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
|
472
|
+
collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
|
473
473
|
collector
|
474
474
|
end
|
475
475
|
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Visitors
|
3
|
-
|
4
|
-
|
3
|
+
Arel::Visitors.const_set('Oracle12',Class.new(Arel::Visitors::Oracle)).class_eval do
|
5
4
|
def visit_Arel_Nodes_SelectStatement(o, collector)
|
6
5
|
# Oracle does not allow LIMIT clause with select for update
|
7
6
|
if o.limit && o.lock
|
@@ -58,8 +57,7 @@ module ArelExtensions
|
|
58
57
|
collector << "DECODE("
|
59
58
|
collector = visit [o.left, o.right, 0, 1], collector
|
60
59
|
collector << ")"
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
60
|
+
end
|
61
|
+
end
|
64
62
|
end
|
65
63
|
end
|
@@ -657,7 +657,7 @@ module ArelExtensions
|
|
657
657
|
User.select(at[:id]).from(at).to_sql.downcase
|
658
658
|
end
|
659
659
|
end
|
660
|
-
|
660
|
+
|
661
661
|
def test_stat_functions
|
662
662
|
skip "SQLite doesn't work for most on this functions" if $sqlite
|
663
663
|
#puts t(User.where(nil), @score.average)
|
@@ -674,9 +674,12 @@ module ArelExtensions
|
|
674
674
|
|
675
675
|
end
|
676
676
|
|
677
|
-
|
678
|
-
|
679
|
-
|
677
|
+
def test_levenshtein_distance
|
678
|
+
skip "Not Yet Implemented" if !(@env_db == 'mysql' || @env_db == 'postgresql')
|
679
|
+
assert_equal 0, t(@arthur,@name.levenshtein_distance("Arthur"))
|
680
|
+
assert_equal 2, t(@arthur,@name.levenshtein_distance("Artoor"))
|
681
|
+
assert_equal 1, t(@arthur,@name.levenshtein_distance("Artehur"))
|
682
|
+
end
|
680
683
|
|
681
684
|
end
|
682
685
|
end
|