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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a8255cb9ebee4b9aded4f23486b0ef143651fecc
4
- data.tar.gz: 5d45081246d1b3221d2e29c6f55b39ba886b20cd
3
+ metadata.gz: c913d6441a8028303914d933c15eb3d93d68bd91
4
+ data.tar.gz: 1825a0b009eb23791d475fc4394e4878fe7d7f7d
5
5
  SHA512:
6
- metadata.gz: 81631cd7e514add0be52d774c9be37c22dfa8304d73eb9ba79fd4b5b034eb69e9c1f8c7e40a18ee34183a34c5b0d86bca118c34cc76bba2765bca2886cebc858
7
- data.tar.gz: afa3c43c1ec75118dc8c2ee24973973872a7b291b938e6a8a4cd9554c099c4abe067eb9d59f9b1d79f16946548f6b25ac1e01ea540caf7008c90d7240a5da59f
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
@@ -13,6 +13,7 @@ require 'arel_extensions/nodes/format'
13
13
  require 'arel_extensions/nodes/repeat'
14
14
  require 'arel_extensions/nodes/cast'
15
15
  require 'arel_extensions/nodes/collate'
16
+ require 'arel_extensions/nodes/levenshtein_distance'
16
17
 
17
18
 
18
19
  module ArelExtensions
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = "1.1.5".freeze
2
+ VERSION = "1.1.6".freeze
3
3
  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
- class Arel::Visitors::Oracle12 < Arel::Visitors::Oracle
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
- #def test_levenshtein_distance
678
- #assert 2, t(@arthur,@name.levenshtein_distance("Artour"))
679
- #end
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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arel_extensions
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.5
4
+ version: 1.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yann Azoury