MCPcopy
hub / github.com/grafana/tempo / Next

Method Next

pkg/parquetquery/iters.go:1651–1703  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

1649}
1650
1651func (u *UnionIterator) Next() (*IteratorResult, error) {
1652 // Here is the algorithm for unions: On each pass of the iterators
1653 // we remember which ones are pointing at the earliest same row. The
1654 // lowest iterators are then collected and a result is produced. Keep
1655 // going until all iterators are exhausted.
1656 for {
1657 lowestRowNumber := MaxRowNumber()
1658 u.lowestIters = u.lowestIters[:0]
1659
1660 for iterNum := range u.iters {
1661 rn, err := u.peek(iterNum)
1662 if err != nil {
1663 return nil, fmt.Errorf("union iterator peek failed: %w", err)
1664 }
1665 // If this iterator is exhausted go to the next one
1666 if rn == nil {
1667 continue
1668 }
1669
1670 c := CompareRowNumbers(u.definitionLevel, rn.RowNumber, lowestRowNumber)
1671 switch c {
1672 case -1:
1673 // New lowest
1674 u.lowestIters = u.lowestIters[:0]
1675 lowestRowNumber = rn.RowNumber
1676 fallthrough
1677
1678 case 0:
1679 // Same
1680 u.lowestIters = append(u.lowestIters, iterNum)
1681 }
1682 }
1683
1684 // Consume lowest iterators
1685 result, err := u.collect(u.lowestIters, lowestRowNumber)
1686 if err != nil {
1687 return nil, fmt.Errorf("union iterator collect failed: %w", err)
1688 }
1689
1690 // After each pass it is guaranteed to have found something
1691 // from at least one iterator, or all are exhausted
1692 if len(u.lowestIters) > 0 {
1693 if u.pred != nil && !u.pred.KeepGroup(result) {
1694 continue
1695 }
1696
1697 return result, nil
1698 }
1699
1700 // All exhausted
1701 return nil, nil
1702 }
1703}
1704
1705func (u *UnionIterator) SeekTo(t RowNumber, d int) (*IteratorResult, error) {
1706 var err error

Callers 1

SeekToMethod · 0.95

Calls 5

peekMethod · 0.95
collectMethod · 0.95
MaxRowNumberFunction · 0.85
CompareRowNumbersFunction · 0.85
KeepGroupMethod · 0.65

Tested by

no test coverage detected