join performs the join, passing results to yield. It implements iter.Seq2.
(yield func(vector.Any, error) bool)
| 68 | |
| 69 | // join performs the join, passing results to yield. It implements iter.Seq2. |
| 70 | func (n *nestedLoopJoin) join(yield func(vector.Any, error) bool) { |
| 71 | // outer and inner are inputs for the outer and inner loops below. |
| 72 | outer, inner, err := pullRace(n.rctx.Context, n.left, n.right) |
| 73 | if err != nil { |
| 74 | yield(nil, err) |
| 75 | return |
| 76 | } |
| 77 | var innerIsLeft bool |
| 78 | if outer.EOS { |
| 79 | innerIsLeft = true |
| 80 | outer, inner = inner, outer |
| 81 | } |
| 82 | var innerHits []roaring.Bitmap |
| 83 | var outerHits *roaring.Bitmap |
| 84 | if innerIsLeft && (n.style == "anti" || n.style == "left") || |
| 85 | !innerIsLeft && n.style == "right" { |
| 86 | innerHits = make([]roaring.Bitmap, len(inner.vecs)) |
| 87 | } else if !innerIsLeft && (n.style == "anti" || n.style == "left") || |
| 88 | innerIsLeft && n.style == "right" { |
| 89 | outerHits = roaring.New() |
| 90 | } |
| 91 | for { |
| 92 | outerVec, err := outer.Pull(false) |
| 93 | if err != nil { |
| 94 | yield(nil, err) |
| 95 | return |
| 96 | } |
| 97 | if outerVec == nil { |
| 98 | break |
| 99 | } |
| 100 | for i := range outerVec.Len() { |
| 101 | for j, innerVec := range inner.vecs { |
| 102 | outerVec := n.pickSlot(outerVec, i, innerVec.Len()) |
| 103 | leftVec, rightVec := outerVec, innerVec |
| 104 | if innerIsLeft { |
| 105 | leftVec, rightVec = rightVec, leftVec |
| 106 | } |
| 107 | leftVec, rightVec = vector.Deunion(leftVec), vector.Deunion(rightVec) |
| 108 | joinedVec := vector.Apply(false, n.makeResult, leftVec, rightVec) |
| 109 | if n.style != "cross" { |
| 110 | // Ignore condition errors. |
| 111 | hits, _ := expr.BoolMask(n.cond.Eval(joinedVec)) |
| 112 | if len(innerHits) > 0 { |
| 113 | innerHits[j].Or(hits) |
| 114 | } else if outerHits != nil { |
| 115 | if !hits.IsEmpty() { |
| 116 | outerHits.Add(i) |
| 117 | } |
| 118 | } |
| 119 | if n.style == "anti" || hits.IsEmpty() { |
| 120 | continue |
| 121 | } |
| 122 | if hits.GetCardinality() < uint64(joinedVec.Len()) { |
| 123 | joinedVec = vector.Pick(joinedVec, hits.ToArray()) |
| 124 | } |
| 125 | } |
| 126 | if !yield(joinedVec, nil) { |
| 127 | return |
nothing calls this directly
no test coverage detected