MCPcopy
hub / github.com/perkeep/perkeep / EdgesTo

Method EdgesTo

pkg/search/handler.go:771–844  ·  view source on GitHub ↗

EdgesTo returns edges that reference req.RefTo. It filters out since-deleted permanode edges.

(req *EdgesRequest)

Source from the content-addressed store, hash-verified

769// EdgesTo returns edges that reference req.RefTo.
770// It filters out since-deleted permanode edges.
771func (h *Handler) EdgesTo(req *EdgesRequest) (*EdgesResponse, error) {
772 ctx := context.TODO()
773 h.index.RLock()
774 defer h.index.RUnlock()
775
776 toRef := req.ToRef
777 toRefStr := toRef.String()
778 var edgeItems []*EdgeItem
779
780 edges, err := h.index.EdgesTo(toRef, nil)
781 if err != nil {
782 panic(err)
783 }
784
785 type edgeOrError struct {
786 edge *EdgeItem // or nil
787 err error
788 }
789 resc := make(chan edgeOrError)
790 verify := func(edge *camtypes.Edge) {
791 db, err := h.NewDescribeRequest().DescribeSync(ctx, edge.From)
792 if err != nil {
793 resc <- edgeOrError{err: err}
794 return
795 }
796 found := false
797 if db.Permanode != nil {
798 for attr, vv := range db.Permanode.Attr {
799 if index.IsBlobReferenceAttribute(attr) {
800 for _, v := range vv {
801 if v == toRefStr {
802 found = true
803 }
804 }
805 }
806 }
807 }
808 var ei *EdgeItem
809 if found {
810 ei = &EdgeItem{
811 From: edge.From,
812 FromType: schema.TypePermanode,
813 }
814 }
815 resc <- edgeOrError{edge: ei}
816 }
817 verifying := 0
818 for _, edge := range edges {
819 if edge.FromType == schema.TypePermanode {
820 verifying++
821 go verify(edge)
822 continue
823 }
824 ei := &EdgeItem{
825 From: edge.From,
826 FromType: edge.FromType,
827 }
828 edgeItems = append(edgeItems, ei)

Callers 1

serveEdgesToMethod · 0.95

Calls 8

NewDescribeRequestMethod · 0.95
IsBlobReferenceAttributeFunction · 0.92
verifyFunction · 0.85
DescribeSyncMethod · 0.80
RLockMethod · 0.65
RUnlockMethod · 0.65
EdgesToMethod · 0.65
StringMethod · 0.45

Tested by

no test coverage detected