func addReverseEdges(ctx context.Context, gs graphstore.Service) error { log.Println("Adding reverse edges") var ( totalEntries int addedEdges int ) startTime := time.Now() err := gs.Scan(ctx, new(spb.ScanRequest), func(entry *spb.Entry) error { kind := entry.EdgeKind if kind != "" && schema.EdgeDirection(kind) == schema.Forward { if err := gs.Write(ctx, &spb.WriteRequest{ Source: entry.Target, Update: []*spb.WriteRequest_Update{{ Target: entry.Source, EdgeKind: schema.MirrorEdge(kind), FactName: entry.FactName, FactValue: entry.FactValue, }}, }); err != nil { return fmt.Errorf("Failed to write reverse edge: %v", err) } addedEdges++ } totalEntries++ return nil }) log.Printf("Wrote %d reverse edges to GraphStore (%d total entries): %v", addedEdges, totalEntries, time.Since(startTime)) return err }
func writeEntries(ctx context.Context, s graphstore.Service, reqs <-chan *spb.WriteRequest) (uint64, error) { var num uint64 for req := range reqs { num += uint64(len(req.Update)) if err := s.Write(ctx, req); err != nil { return 0, err } } return num, nil }
func writeWithReverses(ctx context.Context, gs graphstore.Service, req *spb.WriteRequest) error { if err := gs.Write(ctx, req); err != nil { return fmt.Errorf("error writing edges: %v", err) } for _, u := range req.Update { if err := gs.Write(ctx, &spb.WriteRequest{ Source: u.Target, Update: []*spb.WriteRequest_Update{{ Target: req.Source, EdgeKind: schema.MirrorEdge(u.EdgeKind), FactName: u.FactName, FactValue: u.FactValue, }}, }); err != nil { return fmt.Errorf("error writing rev edge: %v", err) } } return nil }