diff --git a/graph/bolt/bolt_test.go b/graph/bolt/bolt_test.go index e72d514..b02a8bd 100644 --- a/graph/bolt/bolt_test.go +++ b/graph/bolt/bolt_test.go @@ -465,3 +465,43 @@ func TestOptimize(t *testing.T) { t.Errorf("Discordant tag results, new:%v old:%v", newResults, oldResults) } } + +func TestDeletedFromIterator(t *testing.T) { + + tmpFile, _ := ioutil.TempFile(os.TempDir(), "cayley_test") + t.Log(tmpFile.Name()) + defer os.RemoveAll(tmpFile.Name()) + err := createNewBolt(tmpFile.Name(), nil) + if err != nil { + t.Fatalf("Failed to create working directory") + } + + qs, err := newQuadStore(tmpFile.Name(), nil) + if qs == nil || err != nil { + t.Error("Failed to create leveldb QuadStore.") + } + defer qs.Close() + + w, _ := writer.NewSingleReplication(qs, nil) + w.AddQuadSet(makeQuadSet()) + + expect := []quad.Quad{ + {"E", "follows", "F", ""}, + } + sort.Sort(ordered(expect)) + + // Subject iterator. + it := qs.QuadIterator(quad.Subject, qs.ValueOf("E")) + + if got := iteratedQuads(qs, it); !reflect.DeepEqual(got, expect) { + t.Errorf("Failed to get expected results, got:%v expect:%v", got, expect) + } + it.Reset() + + w.RemoveQuad(quad.Quad{"E", "follows", "F", ""}) + expect = nil + + if got := iteratedQuads(qs, it); !reflect.DeepEqual(got, expect) { + t.Errorf("Failed to get expected results, got:%v expect:%v", got, expect) + } +} diff --git a/graph/bolt/iterator.go b/graph/bolt/iterator.go index 4604531..f732572 100644 --- a/graph/bolt/iterator.go +++ b/graph/bolt/iterator.go @@ -135,13 +135,15 @@ func (it *Iterator) Next() bool { b := tx.Bucket(it.bucket) cur := b.Cursor() if last == nil { - k, _ := cur.Seek(it.checkID) + k, v := cur.Seek(it.checkID) if bytes.HasPrefix(k, it.checkID) { - var out []byte - out = make([]byte, len(k)) - copy(out, k) - it.buffer = append(it.buffer, out) - i++ + if it.isLiveValue(v) { + var out []byte + out = make([]byte, len(k)) + copy(out, k) + it.buffer = append(it.buffer, out) + i++ + } } else { it.buffer = append(it.buffer, nil) return errNotExist