arel_extensions 1.1.5 → 1.1.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|