func writePagedEdges(ctx context.Context, edges <-chan *srvpb.Edge, out table.Proto, opts *Options) error { buffer := out.Buffered() log.Println("Writing EdgeSets") esb := &assemble.EdgeSetBuilder{ MaxEdgePageSize: opts.MaxPageSize, Output: func(ctx context.Context, pes *srvpb.PagedEdgeSet) error { return buffer.Put(ctx, xsrv.EdgeSetKey(pes.Source.Ticket), pes) }, OutputPage: func(ctx context.Context, ep *srvpb.EdgePage) error { return buffer.Put(ctx, xsrv.EdgePageKey(ep.PageKey), ep) }, } var grp *srvpb.EdgeGroup for e := range edges { if grp != nil && (e.Target == nil || grp.Kind != e.Kind) { if err := esb.AddGroup(ctx, grp); err != nil { for range edges { } // drain input channel return err } grp = nil } if e.Target == nil { // Head-only edge: signals a new set of edges with the same Source if err := esb.StartEdgeSet(ctx, e.Source); err != nil { return err } } else if grp == nil { grp = &srvpb.EdgeGroup{ Kind: e.Kind, Target: []*srvpb.Node{e.Target}, } } else { grp.Target = append(grp.Target, e.Target) } } if grp != nil { if err := esb.AddGroup(ctx, grp); err != nil { return err } } if err := esb.Flush(ctx); err != nil { return err } return buffer.Flush(ctx) }
func writeFileTree(ctx context.Context, tree *filetree.Map, out table.Proto) error { buffer := out.Buffered() for corpus, roots := range tree.M { for root, dirs := range roots { for path, dir := range dirs { if err := buffer.Put(ctx, ftsrv.PrefixedDirKey(corpus, root, path), dir); err != nil { return err } } } } cr, err := tree.CorpusRoots(ctx, &ftpb.CorpusRootsRequest{}) if err != nil { return err } if err := buffer.Put(ctx, ftsrv.CorpusRootsPrefixedKey, cr); err != nil { return err } return buffer.Flush(ctx) }