trie_matcher 1.1.0 → 1.1.1

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: 5315d69c65616a5d7ff6d608f1bdeb6584ac1907
4
- data.tar.gz: 97ee1b5ec00f18bd74d1c8773c593a6a02e8ce56
3
+ metadata.gz: dddc71cc0d9fbd56692fecc169fa82a1c3210f05
4
+ data.tar.gz: 5014bbd465269d7cf3ccd8d32d9271c29da4f2f3
5
5
  SHA512:
6
- metadata.gz: f7f960eb2dc46fab205c154ab44fb1159b2a70c4d0a434dd34e4af3de12529dc58b3165525d06f5fe5eaf639fcade2e95c183fb26d92f890414f4d6e23ca3a28
7
- data.tar.gz: 46b3096cce0312b9b2ca9c76f1054278b042f3d3338cf16dcefa02e44ae79e2b2b5da3436f77a4c846017736a9de9037495e2a90a6e29eb471eda2e2c8851aef
6
+ metadata.gz: f1c04ca6e84899d4071dd2fc55b0842de91b089104505eff617c95c2936280e93d1fe625d279a45a48831e306d39dea1e05349c5bb234e20d3b109402e28bcda
7
+ data.tar.gz: 7826761862533ccf710ac0bfbb8e09eb87b5a3dec208638d6db4fb94bff86afc8cf38337b8eeaf6ac14e85591b01a8f71932b0535f3d7812d92f3638efa2772c
data/lib/trie_matcher.rb CHANGED
@@ -7,7 +7,7 @@ require File.expand_path("trie_matcher/version", __dir__)
7
7
  class TrieMatcher
8
8
  # Build an empty trie
9
9
  def initialize
10
- @root = { nodes: {}, value: nil}
10
+ @root = { nodes: {}, value: nil, longest_node_length: 0, longest_node: nil }
11
11
  end
12
12
 
13
13
  # Store a prefix in the trie, and associate a value with it
@@ -56,28 +56,42 @@ class TrieMatcher
56
56
  return current[:nodes][prefix], key[common_prefix.length..-1]
57
57
  else
58
58
  old = current[:nodes].delete(prefix)
59
+ new_suffix = prefix[common_prefix.length..-1]
59
60
  new_node = {
60
61
  nodes: {
61
- prefix[common_prefix.length..-1] => old
62
+ new_suffix => old
62
63
  },
63
- value: nil
64
+ value: nil,
65
+ longest_node_length: new_suffix.length,
66
+ longest_node: new_suffix,
64
67
  }
65
68
  current[:nodes][common_prefix] = new_node
69
+ if current[:longest_node] == prefix
70
+ longest_prefix = current[:nodes].keys.max_by(&:length)
71
+ current[:longest_node_length] = longest_prefix.length
72
+ current[:longest_node] = longest_prefix
73
+ end
66
74
  return new_node, key[common_prefix.length..-1]
67
75
  end
68
76
  end
69
77
 
70
78
  new_node = {
71
79
  nodes: {},
72
- value: nil
80
+ value: nil,
81
+ longest_node: nil,
82
+ longest_node_length: 0,
73
83
  }
84
+ if key.length > current[:longest_node_length]
85
+ current[:longest_node_length] = key.length
86
+ current[:longest_node] = key
87
+ end
74
88
  current[:nodes][key] = new_node
75
89
  return new_node, ""
76
90
  end
77
91
 
78
92
  # find the next node from the current one based on the given key
79
93
  def next_node(current, key)
80
- key.length.times do |l|
94
+ ([key.length, current[:longest_node_length]].max).times do |l|
81
95
  if current[:nodes].has_key?(key[0..-l-1])
82
96
  return current[:nodes][key[0..-l-1]], key[-l,l]
83
97
  end
@@ -98,4 +112,5 @@ class TrieMatcher
98
112
 
99
113
  return nil
100
114
  end
115
+
101
116
  end
@@ -1,3 +1,3 @@
1
1
  class TrieMatcher
2
- VERSION = "1.1.0"
2
+ VERSION = "1.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trie_matcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Karas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-27 00:00:00.000000000 Z
11
+ date: 2015-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -92,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
92
  version: '0'
93
93
  requirements: []
94
94
  rubyforge_project:
95
- rubygems_version: 2.2.2
95
+ rubygems_version: 2.4.3
96
96
  signing_key:
97
97
  specification_version: 4
98
98
  summary: Fast prefix matching