hashtree 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -64,9 +64,25 @@ Benchmark.bm do |x|
64
64
  end
65
65
  end
66
66
 
67
+ puts "Doing 1 non-indexed query"
68
+ x.report do
69
+ 1.times do |i|
70
+ query = proc{ |key,doc| doc[:email] == "john.doe.#{rand(100000)}@example.com" }
71
+ @htree.select{ |key, doc| query.call(key,doc) }
72
+ end
73
+ end
74
+
75
+ puts "Doing 10 non-indexed queries"
76
+ x.report do
77
+ 10.times do |i|
78
+ query = proc{ |key,doc| doc[:email] == "john.doe.#{rand(100000)}@example.com" }
79
+ @htree.select{ |key, doc| query.call(key,doc) }
80
+ end
81
+ end
82
+
67
83
  puts "Deleting 1.000 random documents"
68
84
  x.report do
69
- lhtree = @htree
85
+ lhtree = @htree.clone
70
86
  1_000.times do |i|
71
87
  key = "jdoe#{rand(100_000)}"
72
88
  lhtree.delete(key)
@@ -75,7 +91,7 @@ Benchmark.bm do |x|
75
91
 
76
92
  puts "Deleting 10.000 random documents"
77
93
  x.report do
78
- lhtree = @htree
94
+ lhtree = @htree.clone
79
95
  10_000.times do |i|
80
96
  key = "jdoe#{rand(100_000)}"
81
97
  lhtree.delete(key)
@@ -84,10 +100,11 @@ Benchmark.bm do |x|
84
100
 
85
101
  puts "Deleting 100.000 random documents"
86
102
  x.report do
87
- lhtree = @htree
103
+ lhtree = @htree.clone
88
104
  100_000.times do |i|
89
105
  key = "jdoe#{rand(100_000)}"
90
106
  lhtree.delete(key)
91
107
  end
92
108
  end
109
+
93
110
  end
@@ -1,3 +1,3 @@
1
1
  class HashTree
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/hashtree.rb CHANGED
@@ -74,6 +74,24 @@ class HashTree
74
74
  @index.has_key?(key)
75
75
  end
76
76
 
77
+ def select(&block)
78
+ results = {}
79
+ @index.select do |key, id|
80
+ leaf = read(id)
81
+ results[key] = leaf if yield(key, leaf)
82
+ end
83
+ return results
84
+ end
85
+
86
+ def each(&block)
87
+ results = {}
88
+ @index.each do |key, id|
89
+ leaf = read(id)
90
+ results[key] = leaf if yield(key, leaf)
91
+ end
92
+ return results
93
+ end
94
+
77
95
  def branch(key)
78
96
  branch_id = get_branch_id(key)
79
97
  @branches[branch_id] if branch_id
@@ -90,15 +108,21 @@ class HashTree
90
108
  end
91
109
 
92
110
  # Private API
93
- def read(id)
111
+ def translate_id(id)
94
112
  branch_id, leaf_id = id[0..15], id[16..32]
95
- @branches[branch_id][leaf_id]
113
+ return branch_id, leaf_id
114
+ end
115
+
116
+ def read(id)
117
+ branch_id, leaf_id = translate_id(id)
118
+ branch = @branches[branch_id]
119
+ leaf = branch ? branch[leaf_id] : nil
96
120
  end
97
121
 
98
122
  def update(id, value)
99
- branch_id, leaf_id = id[0..15], id[16..32]
100
- @branches[branch_id][leaf_id] = value
101
- return value
123
+ leaf = read(id)
124
+ leaf = value if leaf
125
+ return ( leaf ? value : nil )
102
126
  end
103
127
 
104
128
  def create(key, value)
@@ -112,15 +136,15 @@ class HashTree
112
136
  else
113
137
  id = Digest::MD5.hexdigest(SecureRandom.uuid)
114
138
  @index[key] = id
115
- branch_id, leaf_id = id[0..15], id[16..32]
116
- @branches[branch_id] = {}
117
- @branches[branch_id][leaf_id] = value
139
+ branch_id, leaf_id = translate_id(id)
140
+ branch = { leaf_id => value }
141
+ @branches[branch_id] = branch
118
142
  end
119
143
  return value
120
144
  end
121
145
 
122
146
  def destroy(id)
123
- branch_id, leaf_id = id[0..15], id[16..32]
147
+ branch_id, leaf_id = translate_id(id)
124
148
  branch = @branches[branch_id]
125
149
  destroyed_element = branch.delete(leaf_id)
126
150
  if branch.size == 0
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hashtree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: