func iterated(it graph.Iterator) []int { var res []int for it.Next() { res = append(res, int(it.Result().(Int64Node))) } return res }
func IteratedQuads(t testing.TB, qs graph.QuadStore, it graph.Iterator) []quad.Quad { var res quad.ByQuadString for it.Next() { res = append(res, qs.Quad(it.Result())) } require.Nil(t, it.Err()) sort.Sort(res) return res }
func IteratedValues(t testing.TB, qs graph.QuadStore, it graph.Iterator) []quad.Value { var res []quad.Value for it.Next() { res = append(res, qs.NameOf(it.Result())) } require.Nil(t, it.Err()) sort.Sort(quad.ByValueString(res)) return res }
func IteratedRawStrings(t testing.TB, qs graph.QuadStore, it graph.Iterator) []string { var res []string for it.Next() { res = append(res, qs.NameOf(it.Result()).String()) } require.Nil(t, it.Err()) sort.Strings(res) return res }
func (s *queryShape) MakeNode(it graph.Iterator) *Node { n := Node{ID: s.nodeID} for _, tag := range it.Tagger().Tags() { n.Tags = append(n.Tags, tag) } for k := range it.Tagger().Fixed() { n.Tags = append(n.Tags, k) } switch it.Type() { case graph.And: for _, sub := range it.SubIterators() { s.nodeID++ newNode := s.MakeNode(sub) if sub.Type() != graph.Or { s.StealNode(&n, newNode) } else { s.AddNode(newNode) s.AddLink(&Link{n.ID, newNode.ID, 0, 0}) } } case graph.Fixed: n.IsFixed = true for it.Next() { n.Values = append(n.Values, s.qs.NameOf(it.Result()).String()) } case graph.HasA: hasa := it.(*HasA) s.PushHasa(n.ID, hasa.dir) s.nodeID++ newNode := s.MakeNode(hasa.primaryIt) s.AddNode(newNode) s.RemoveHasa() case graph.Or: for _, sub := range it.SubIterators() { s.nodeID++ newNode := s.MakeNode(sub) if sub.Type() == graph.Or { s.StealNode(&n, newNode) } else { s.AddNode(newNode) s.AddLink(&Link{n.ID, newNode.ID, 0, 0}) } } case graph.LinksTo: n.IsLinkNode = true lto := it.(*LinksTo) s.nodeID++ newNode := s.MakeNode(lto.primaryIt) hasaID, hasaDir := s.LastHasa() if (hasaDir == quad.Subject && lto.dir == quad.Object) || (hasaDir == quad.Object && lto.dir == quad.Subject) { s.AddNode(newNode) if hasaDir == quad.Subject { s.AddLink(&Link{hasaID, newNode.ID, 0, n.ID}) } else { s.AddLink(&Link{newNode.ID, hasaID, 0, n.ID}) } } else if lto.primaryIt.Type() == graph.Fixed { s.StealNode(&n, newNode) } else { s.AddNode(newNode) } case graph.Optional: // Unsupported, for the moment fallthrough case graph.All: } return &n }
func TestIterator(t testing.TB, gen DatabaseFunc) { qs, opts, closer := gen(t) defer closer() MakeWriter(t, qs, opts, MakeQuadSet()...) var it graph.Iterator it = qs.NodesAllIterator() require.NotNil(t, it) size, _ := it.Size() require.True(t, size > 0 && size < 20, "Unexpected size") // TODO: leveldb had this test //if exact { // t.Errorf("Got unexpected exact result.") //} require.Equal(t, graph.All, it.Type(), "Unexpected iterator type") optIt, changed := it.Optimize() require.True(t, !changed && optIt == it, "Optimize unexpectedly changed iterator: %v, %T", changed, optIt) expect := []string{ "A", "B", "C", "D", "E", "F", "G", "follows", "status", "cool", "status_graph", } sort.Strings(expect) for i := 0; i < 2; i++ { got := IteratedRawStrings(t, qs, it) sort.Strings(got) require.Equal(t, expect, got, "Unexpected iterated result on repeat %d", i) it.Reset() } for _, pq := range expect { require.True(t, it.Contains(qs.ValueOf(quad.Raw(pq))), "Failed to find and check %q correctly", pq) } // FIXME(kortschak) Why does this fail? /* for _, pq := range []string{"baller"} { if it.Contains(qs.ValueOf(pq)) { t.Errorf("Failed to check %q correctly", pq) } } */ it.Reset() it = qs.QuadsAllIterator() optIt, changed = it.Optimize() require.True(t, !changed && optIt == it, "Optimize unexpectedly changed iterator: %v, %T", changed, optIt) require.True(t, it.Next()) q := qs.Quad(it.Result()) require.Nil(t, it.Err()) require.True(t, q.IsValid(), "Invalid quad returned: %q", q) set := MakeQuadSet() var ok bool for _, e := range set { if e.String() == q.String() { ok = true break } } require.True(t, ok, "Failed to find %q during iteration, got:%q", q, set) }