Skip to content

Commit 1ff656b

Browse files
Made the rangetree.delete implementations return deleted entries.
1 parent 8f68881 commit 1ff656b

File tree

5 files changed

+106
-28
lines changed

5 files changed

+106
-28
lines changed

rangetree/interface.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,16 @@ type Interval interface {
4949
type RangeTree interface {
5050
// Add will add the provided entries to the tree. Any entries that
5151
// were overwritten will be returned in the order in which they
52-
// were overwritten. If a cell's addition does not overwrite, a nil
53-
// is returned for that cell for its index in the provided cells.
52+
// were overwritten. If an entry's addition does not overwrite, a nil
53+
// is returned for that entry's index in the provided cells.
5454
Add(entries ...Entry) Entries
5555
// Len returns the number of entries in the tree.
5656
Len() uint64
5757
// Delete will remove the provided entries from the tree.
58-
Delete(entries ...Entry)
58+
// Any entries that were deleted will be returned in the order in
59+
// which they were deleted. If an entry does not exist to be deleted,
60+
// a nil is returned for that entry's index in the provided cells.
61+
Delete(entries ...Entry) Entries
5962
// Query will return a list of entries that fall within
6063
// the provided interval.
6164
Query(interval Interval) Entries

rangetree/orderedtree.go

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -64,33 +64,31 @@ func (ot *orderedTree) add(entry Entry) *node {
6464
}
6565

6666
// Add will add the provided entries to the tree. This method
67-
// returns a list of cells that were overwritten in the order
68-
// in which cells were received. If a cell doesn't overwrite
67+
// returns a list of entries that were overwritten in the order
68+
// in which entries were received. If an entry doesn't overwrite
6969
// anything, a nil will be returned for that entry in the returned
7070
// slice.
7171
func (ot *orderedTree) Add(entries ...Entry) Entries {
7272
if len(entries) == 0 {
7373
return nil
7474
}
7575

76-
overwrittens := make(Entries, 0, len(entries))
77-
for _, entry := range entries {
76+
overwrittens := make(Entries, len(entries))
77+
for i, entry := range entries {
7878
if entry == nil {
7979
continue
8080
}
8181

8282
overwritten := ot.add(entry)
8383
if overwritten != nil {
84-
overwrittens = append(overwrittens, overwritten.entry)
85-
} else {
86-
overwrittens = append(overwrittens, nil)
84+
overwrittens[i] = overwritten.entry
8785
}
8886
}
8987

9088
return overwrittens
9189
}
9290

93-
func (ot *orderedTree) delete(entry Entry) {
91+
func (ot *orderedTree) delete(entry Entry) *node {
9492
ot.resetPath()
9593
var index int
9694
var node *node
@@ -100,7 +98,7 @@ func (ot *orderedTree) delete(entry Entry) {
10098
value := entry.ValueAtDimension(i)
10199
node, index = list.get(value)
102100
if node == nil { // there's nothing to delete
103-
return
101+
return nil
104102
}
105103

106104
nb := &nodeBundle{list: list, index: index}
@@ -118,13 +116,32 @@ func (ot *orderedTree) delete(entry Entry) {
118116
break
119117
}
120118
}
119+
120+
return node
121121
}
122122

123-
// Delete will remove the entries from the tree.
124-
func (ot *orderedTree) Delete(entries ...Entry) {
125-
for _, entry := range entries {
126-
ot.delete(entry)
123+
// Delete will remove the provided entries from the tree.
124+
// Any entries that were deleted will be returned in the order in
125+
// which they were deleted. If an entry does not exist to be deleted,
126+
// a nil is returned for that entry's index in the provided cells.
127+
func (ot *orderedTree) Delete(entries ...Entry) Entries {
128+
if len(entries) == 0 {
129+
return nil
127130
}
131+
132+
deletedEntries := make(Entries, len(entries))
133+
for i, entry := range entries {
134+
if entry == nil {
135+
continue
136+
}
137+
138+
deleted := ot.delete(entry)
139+
if deleted != nil {
140+
deletedEntries[i] = deleted.entry
141+
}
142+
}
143+
144+
return deletedEntries
128145
}
129146

130147
// Len returns the number of items in the tree.

rangetree/orderedtree_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,32 @@ func TestOTAddLargeNumbersMultiDimension(t *testing.T) {
130130
assert.Len(t, result, int(numItems))
131131
}
132132

133+
func TestOTAddReturnsOverwritten(t *testing.T) {
134+
tree := newOrderedTree(2)
135+
136+
starts := []uint64{0, 4, 2, 1, 3}
137+
138+
entries := make(Entries, 0, len(starts))
139+
for _, start := range starts {
140+
entries = append(entries, constructMockEntry(start, int64(start), int64(start)))
141+
}
142+
143+
overwritten := tree.Add(entries...)
144+
145+
assert.Equal(t, Entries{nil, nil, nil, nil, nil}, overwritten)
146+
147+
oldEntry := entries[2]
148+
newEntry := constructMockEntry(10, oldEntry.ValueAtDimension(1),
149+
oldEntry.ValueAtDimension(2))
150+
overwritten = tree.Add(newEntry)
151+
152+
assert.Equal(t, Entries{oldEntry}, overwritten)
153+
154+
result := tree.Query(constructMockInterval(dimension{0, 5}, dimension{0, 5}))
155+
assert.Len(t, result, 5)
156+
assert.Equal(t, uint64(5), tree.Len())
157+
}
158+
133159
func BenchmarkOTAddItemsMultiDimensions(b *testing.B) {
134160
numItems := b.N
135161
entries := make(Entries, 0, numItems)
@@ -256,6 +282,29 @@ func TestOTDeleteEmptyTreeMultiDimensions(t *testing.T) {
256282
assert.Equal(t, uint64(0), tree.Len())
257283
}
258284

285+
func TestOTDeleteReturnsDeleted(t *testing.T) {
286+
tree := newOrderedTree(2)
287+
288+
entries := NewEntries()
289+
starts := []uint64{0, 4, 2, 1, 3}
290+
for _, start := range starts {
291+
entries = append(entries, constructMockEntry(start, int64(start), int64(start)))
292+
}
293+
294+
tree.Add(entries...)
295+
296+
deleted := tree.Delete(entries[2], constructMockEntry(10, 10, 10))
297+
298+
assert.Equal(t, Entries{entries[2], nil}, deleted)
299+
300+
result := tree.Query(constructMockInterval(dimension{0, 11}, dimension{0, 11}))
301+
302+
assert.Len(t, result, 4)
303+
assert.Equal(t, uint64(4), tree.Len())
304+
305+
assert.NotContains(t, result, entries[2])
306+
}
307+
259308
func BenchmarkOTDeleteItemsMultiDimensions(b *testing.B) {
260309
numItems := uint64(1000)
261310
entries := make(Entries, 0, numItems)

rangetree/skiplist/skiplist.go

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -192,14 +192,15 @@ func (rt *skipListRT) add(entry rangetree.Entry) rangetree.Entry {
192192
panic(`Ran out of dimensions before for loop completed.`)
193193
}
194194

195-
// Add will add the provided entries to the tree. Any entries that
196-
// were overwritten will be returned in the order in which they
197-
// were overwritten. If an entry's addition does not overwrite, a nil
198-
// is returned for that cell for its index in the provided entries.
195+
// Add will add the provided entries to the tree. This method
196+
// returns a list of entries that were overwritten in the order
197+
// in which entries were received. If an entry doesn't overwrite
198+
// anything, a nil will be returned for that entry in the returned
199+
// slice.
199200
func (rt *skipListRT) Add(entries ...rangetree.Entry) rangetree.Entries {
200-
overwritten := make(rangetree.Entries, 0, len(entries))
201-
for _, e := range entries {
202-
overwritten = append(overwritten, rt.add(e))
201+
overwritten := make(rangetree.Entries, len(entries))
202+
for i, e := range entries {
203+
overwritten[i] = rt.add(e)
203204
}
204205

205206
return overwritten
@@ -284,10 +285,16 @@ func (rt *skipListRT) delete(entry rangetree.Entry) rangetree.Entry {
284285
}
285286

286287
// Delete will remove the provided entries from the tree.
287-
func (rt *skipListRT) Delete(entries ...rangetree.Entry) {
288-
for _, e := range entries {
289-
rt.delete(e)
288+
// Any entries that were deleted will be returned in the order in
289+
// which they were deleted. If an entry does not exist to be deleted,
290+
// a nil is returned for that entry's index in the provided cells.
291+
func (rt *skipListRT) Delete(entries ...rangetree.Entry) rangetree.Entries {
292+
deletedEntries := make(rangetree.Entries, len(entries))
293+
for i, e := range entries {
294+
deletedEntries[i] = rt.delete(e)
290295
}
296+
297+
return deletedEntries
291298
}
292299

293300
func (rt *skipListRT) apply(sl *skip.SkipList, dimension uint64,

rangetree/skiplist/skiplist_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ func TestRTSingleDimensionDelete(t *testing.T) {
103103
m2 := newMockEntry(2)
104104
rt.Add(m1, m2)
105105

106-
rt.Delete(m1, m2)
106+
deleted := rt.Delete(m1, newMockEntry(10), m2)
107+
assert.Equal(t, rangetree.Entries{m1, nil, m2}, deleted)
107108
assert.Equal(t, uint64(0), rt.Len())
108109
assert.Equal(t, rangetree.Entries{nil, nil}, rt.Get(m1, m2))
109110
}
@@ -114,7 +115,8 @@ func TestRTMultiDimensionDelete(t *testing.T) {
114115
m2 := newMockEntry(4, 6)
115116
rt.Add(m1, m2)
116117

117-
rt.Delete(m1, m2)
118+
deleted := rt.Delete(m1, newMockEntry(10, 10), m2)
119+
assert.Equal(t, rangetree.Entries{m1, nil, m2}, deleted)
118120
assert.Equal(t, uint64(0), rt.Len())
119121
assert.Equal(t, rangetree.Entries{nil, nil}, rt.Get(m1, m2))
120122
}

0 commit comments

Comments
 (0)