func (it *Materialize) materializeSet() { i := 0 for graph.Next(it.subIt) { i++ if i > abortMaterializeAt { it.aborted = true break } id := it.subIt.Result() val := graph.ToKey(id) if _, ok := it.containsMap[val]; !ok { it.containsMap[val] = len(it.values) it.values = append(it.values, nil) } index := it.containsMap[val] tags := make(map[string]graph.Value) it.subIt.TagResults(tags) it.values[index] = append(it.values[index], result{id: id, tags: tags}) it.actualSize += 1 for it.subIt.NextPath() { i++ if i > abortMaterializeAt { it.aborted = true break } tags := make(map[string]graph.Value) it.subIt.TagResults(tags) it.values[index] = append(it.values[index], result{id: id, tags: tags}) it.actualSize += 1 } } it.err = it.subIt.Err() if it.err == nil && it.aborted { if glog.V(2) { glog.V(2).Infoln("Aborting subiterator") } it.values = nil it.containsMap = nil it.subIt.Reset() } it.hasRun = true }
func (it *Materialize) Contains(v graph.Value) bool { graph.ContainsLogIn(it, v) it.runstats.Contains += 1 if !it.hasRun { it.materializeSet() } if it.err != nil { return false } if it.aborted { return it.subIt.Contains(v) } key := graph.ToKey(v) if i, ok := it.containsMap[key]; ok { it.index = i it.subindex = 0 return graph.ContainsLogOut(it, v, true) } return graph.ContainsLogOut(it, v, false) }