()
| 1016 | } |
| 1017 | |
| 1018 | func (j *JoinIterator) Next() (*IteratorResult, error) { |
| 1019 | outer: |
| 1020 | for { |
| 1021 | // This loop is doing two things: |
| 1022 | // On first-pass peek each iter and ensure it has at least one |
| 1023 | // result. If any iter has no results we can exit early |
| 1024 | // without processing the remaining data in the others. |
| 1025 | // On subsequent passes the first iter is never nil except |
| 1026 | // when everything is fully exhausted. We check once more |
| 1027 | // and then exit. |
| 1028 | if j.peeks[0] == nil { |
| 1029 | for i := range j.iters { |
| 1030 | res, err := j.peek(i) |
| 1031 | if err != nil { |
| 1032 | return nil, err |
| 1033 | } |
| 1034 | if res == nil { |
| 1035 | return nil, nil |
| 1036 | } |
| 1037 | } |
| 1038 | } |
| 1039 | |
| 1040 | // The first iter is pointing at the next candidate row. Proceed through iters 2 to N looking |
| 1041 | // for matches. |
| 1042 | for iterNum := 1; iterNum < len(j.iters); iterNum++ { |
| 1043 | err := j.seek(iterNum, j.peeks[0].RowNumber, j.definitionLevel) |
| 1044 | if err != nil { |
| 1045 | return nil, err |
| 1046 | } |
| 1047 | |
| 1048 | if j.peeks[iterNum] == nil { |
| 1049 | return nil, nil |
| 1050 | } |
| 1051 | |
| 1052 | if CompareRowNumbers(j.definitionLevel, j.peeks[iterNum].RowNumber, j.peeks[0].RowNumber) == 1 { |
| 1053 | // This iterator has a higher row number than all previous iterators. That means it might have |
| 1054 | // a higher filtering power, swap it to the top and restart the loop. |
| 1055 | j.iters[0], j.iters[iterNum] = j.iters[iterNum], j.iters[0] |
| 1056 | j.peeks[0], j.peeks[iterNum] = j.peeks[iterNum], j.peeks[0] |
| 1057 | continue outer |
| 1058 | } |
| 1059 | } |
| 1060 | |
| 1061 | // All iterators pointing at same row |
| 1062 | // Get the data |
| 1063 | result, err := j.collect(j.peeks[0].RowNumber) |
| 1064 | if err != nil { |
| 1065 | return nil, fmt.Errorf("join iterator collect failed: %w", err) |
| 1066 | } |
| 1067 | |
| 1068 | // Keep group? |
| 1069 | if j.pred == nil || j.pred.KeepGroup(result) { |
| 1070 | // Yes |
| 1071 | return result, nil |
| 1072 | } |
| 1073 | } |
| 1074 | } |
| 1075 |
no test coverage detected