MCPcopy Create free account
hub / github.com/brimdata/super / join

Method join

runtime/vam/op/nestedloopjoin.go:70–146  ·  view source on GitHub ↗

join performs the join, passing results to yield. It implements iter.Seq2.

(yield func(vector.Any, error) bool)

Source from the content-addressed store, hash-verified

68
69// join performs the join, passing results to yield. It implements iter.Seq2.
70func (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

Callers

nothing calls this directly

Calls 13

pickSlotMethod · 0.95
makeHitsResultMethod · 0.95
DeunionFunction · 0.92
ApplyFunction · 0.92
BoolMaskFunction · 0.92
PickFunction · 0.92
pullRaceFunction · 0.85
NewMethod · 0.80
IsEmptyMethod · 0.80
PullMethod · 0.65
LenMethod · 0.65
EvalMethod · 0.65

Tested by

no test coverage detected