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 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