func iterated(it graph.Iterator) []int { var res []int for graph.Next(it) { res = append(res, it.Result().(int)) } return res }
func iteratedNames(qs graph.QuadStore, it graph.Iterator) []string { var res []string for graph.Next(it) { res = append(res, qs.NameOf(it.Result())) } sort.Strings(res) return res }
func iteratedQuads(qs graph.QuadStore, it graph.Iterator) []quad.Quad { var res ordered for graph.Next(it) { res = append(res, qs.Quad(it.Result())) } sort.Sort(res) return res }
func (wk *worker) runIteratorToArrayNoTags(it graph.Iterator, limit int) []string { output := make([]string, 0) n := 0 it, _ = it.Optimize() for { select { case <-wk.kill: return nil default: } if !graph.Next(it) { break } output = append(output, wk.qs.NameOf(it.Result())) n++ if limit >= 0 && n >= limit { break } } it.Close() return output }
func iterateResults(qs graph.QuadStore, it graph.Iterator) []string { var res []string for graph.Next(it) { v := it.Result() if t, ok := v.(*Token); ok && t.Kind == nodeKind { res = append(res, qs.NameOf(it.Result())) } else { res = append(res, qs.Quad(it.Result()).String()) } } sort.Strings(res) it.Reset() return res }
func TestIterator(t *testing.T) { tmpDir, err := ioutil.TempDir(os.TempDir(), "cayley_test") if err != nil { t.Fatalf("Could not create working directory: %v", err) } defer os.RemoveAll(tmpDir) t.Log(tmpDir) err = createNewLevelDB(tmpDir, nil) if err != nil { t.Fatal("Failed to create LevelDB database.") } qs, err := newQuadStore(tmpDir, nil) if qs == nil || err != nil { t.Error("Failed to create leveldb QuadStore.") } w, _ := writer.NewSingleReplication(qs, nil) w.AddQuadSet(makeQuadSet()) var it graph.Iterator it = qs.NodesAllIterator() if it == nil { t.Fatal("Got nil iterator.") } size, exact := it.Size() if size <= 0 || size >= 20 { t.Errorf("Unexpected size, got:%d expect:(0, 20)", size) } if exact { t.Errorf("Got unexpected exact result.") } if typ := it.Type(); typ != graph.All { t.Errorf("Unexpected iterator type, got:%v expect:%v", typ, graph.All) } optIt, changed := it.Optimize() if changed || optIt != it { t.Errorf("Optimize unexpectedly changed iterator.") } expect := []string{ "A", "B", "C", "D", "E", "F", "G", "follows", "status", "cool", "status_graph", } sort.Strings(expect) for i := 0; i < 2; i++ { got := iteratedNames(qs, it) sort.Strings(got) if !reflect.DeepEqual(got, expect) { t.Errorf("Unexpected iterated result on repeat %d, got:%v expect:%v", i, got, expect) } it.Reset() } for _, pq := range expect { if !it.Contains(qs.ValueOf(pq)) { t.Errorf("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() graph.Next(it) q := qs.Quad(it.Result()) set := makeQuadSet() var ok bool for _, t := range set { if t.String() == q.String() { ok = true break } } if !ok { t.Errorf("Failed to find %q during iteration, got:%q", q, set) } qs.Close() }
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 graph.Next(it) { n.Values = append(n.Values, s.qs.NameOf(it.Result())) } 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 printIterator(qs graph.QuadStore, it graph.Iterator) { for graph.Next(it) { glog.Infof("%v", qs.Quad(it.Result())) } }