top_n 1.0.0 → 1.0.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 +4 -4
- data/VERSION +1 -1
- data/lib/top_n.rb +30 -24
- data/test/test_adding_bottom.rb +15 -0
- data/test/test_adding_top.rb +15 -0
- data/test/test_creation.rb +6 -0
- data/top_n.gemspec +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cda9c5805aaeda70a3ea35e8a01314a96e071cd5
|
4
|
+
data.tar.gz: f581488f6929408afe40e98567b076fc1d09f42f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f55b87b0711b17b8fee03294baffa347c1df8fb92f010198418870ed5a337a2559358e76cd4a92ded26c424da9e9a9abfea7ef9bea9c744723a3cd3a62b8d2b4
|
7
|
+
data.tar.gz: dab46fa2befd85a4edc51c5c7bef1f4f41b43e1e57ee2aaae0ff5031cf1a0e6fb458f58261e6ca7b20dd5de288edd6bf625d57acc5f0bc942d5a06249f6e19e3
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.1
|
data/lib/top_n.rb
CHANGED
@@ -66,6 +66,12 @@ class TopN
|
|
66
66
|
direction: :top,
|
67
67
|
}.merge(options)
|
68
68
|
|
69
|
+
options.keys.each do |opt|
|
70
|
+
unless [:maxsize, :direction].include?opt
|
71
|
+
raise ArgumentError.new("invalid option #{opt}")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
69
75
|
@maxsize = options[:maxsize]
|
70
76
|
@direction = options[:direction]
|
71
77
|
@data = {}
|
@@ -137,20 +143,20 @@ class TopN
|
|
137
143
|
def add_top(key, value)
|
138
144
|
@threshold_key ||= key
|
139
145
|
|
140
|
-
if @
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
146
|
+
if @data.has_key?key
|
147
|
+
@data[key] << value
|
148
|
+
else
|
149
|
+
if @size >= @maxsize
|
150
|
+
return nil if key < @threshold_key
|
151
|
+
@data.delete(@threshold_key)
|
152
|
+
@size -= 1
|
153
|
+
@threshold_key = @data.keys.min
|
154
|
+
end
|
155
|
+
@data[key] = [ value ]
|
156
|
+
@size += 1
|
157
|
+
@threshold_key = key if key < @threshold_key
|
148
158
|
end
|
149
159
|
|
150
|
-
@data[key] << value
|
151
|
-
|
152
|
-
@threshold_key = key if key < @threshold_key
|
153
|
-
|
154
160
|
@data[key]
|
155
161
|
end
|
156
162
|
|
@@ -159,20 +165,20 @@ class TopN
|
|
159
165
|
def add_bottom(key, value)
|
160
166
|
@threshold_key ||= key
|
161
167
|
|
162
|
-
if @
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
168
|
+
if @data.has_key?key
|
169
|
+
@data[key] << value
|
170
|
+
else
|
171
|
+
if @size >= @maxsize
|
172
|
+
return nil if key > @threshold_key
|
173
|
+
@data.delete(@threshold_key)
|
174
|
+
@size -= 1
|
175
|
+
@threshold_key = @data.keys.max
|
176
|
+
end
|
177
|
+
@data[key] = [ value ]
|
178
|
+
@size += 1
|
179
|
+
@threshold_key = key if key > @threshold_key
|
170
180
|
end
|
171
181
|
|
172
|
-
@data[key] << value
|
173
|
-
|
174
|
-
@threshold_key = key if key > @threshold_key
|
175
|
-
|
176
182
|
@data[key]
|
177
183
|
end
|
178
184
|
end
|
data/test/test_adding_bottom.rb
CHANGED
@@ -85,4 +85,19 @@ class TestAddingBottom < Minitest::Test
|
|
85
85
|
assert_equal [2], topn.find(2)
|
86
86
|
assert_nil topn.find(3)
|
87
87
|
end
|
88
|
+
|
89
|
+
def test_torture
|
90
|
+
topn = TopN.new(direction: :bottom, maxsize: 10)
|
91
|
+
|
92
|
+
records = []
|
93
|
+
300_000.times do
|
94
|
+
record = rand(4000)
|
95
|
+
records << record
|
96
|
+
topn.add(record, rand(100_000_000))
|
97
|
+
end
|
98
|
+
|
99
|
+
top_records = records.uniq.sort[0..9]
|
100
|
+
keys = topn.keys.sort
|
101
|
+
assert_equal top_records, keys
|
102
|
+
end
|
88
103
|
end
|
data/test/test_adding_top.rb
CHANGED
@@ -85,4 +85,19 @@ class TestAddingTop < Minitest::Test
|
|
85
85
|
assert_equal [2], topn.find(2)
|
86
86
|
assert_equal [3], topn.find(3)
|
87
87
|
end
|
88
|
+
|
89
|
+
def test_torture
|
90
|
+
topn = TopN.new(maxsize: 1000)
|
91
|
+
|
92
|
+
records = []
|
93
|
+
300_000.times do
|
94
|
+
record = rand(4000)
|
95
|
+
records << record
|
96
|
+
topn.add(record, rand(100_000_000))
|
97
|
+
end
|
98
|
+
|
99
|
+
top_records = records.uniq.sort { |a, b| b <=> a }[0..999]
|
100
|
+
keys = topn.keys.sort { |a, b| b <=> a }
|
101
|
+
assert_equal top_records, keys
|
102
|
+
end
|
88
103
|
end
|
data/test/test_creation.rb
CHANGED
data/top_n.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "top_n"
|
8
|
-
s.version = "1.0.
|
8
|
+
s.version = "1.0.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Michael Graff"]
|
12
|
-
s.date = "2013-12-
|
12
|
+
s.date = "2013-12-16"
|
13
13
|
s.description = "Track the top (or bottom) N keys added to a list, and discard the remainder."
|
14
14
|
s.email = "explorer@flame.org"
|
15
15
|
s.extra_rdoc_files = [
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: top_n
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Graff
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|