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

Function createResourceIterator

tempodb/encoding/vparquet3/block_traceql.go:1802–1942  ·  view source on GitHub ↗

createResourceIterator iterates through all resourcespans-level (batch-level) columns, groups them into rows representing one batch each. It builds on top of the span iterator, and turns the groups of spans and resource-level values into spansets. Spansets are returned that match any of the given co

(makeIter, makeNilIter makeIterFn, spanIterator parquetquery.Iterator, conditions []traceql.Condition, requireAtLeastOneMatchOverall, allConditions bool, dedicatedColumns backend.DedicatedColumns, selectAll bool)

Source from the content-addressed store, hash-verified

1800// one batch each. It builds on top of the span iterator, and turns the groups of spans and resource-level values into
1801// spansets. Spansets are returned that match any of the given conditions.
1802func createResourceIterator(makeIter, makeNilIter makeIterFn, spanIterator parquetquery.Iterator, conditions []traceql.Condition, requireAtLeastOneMatchOverall, allConditions bool, dedicatedColumns backend.DedicatedColumns, selectAll bool) (parquetquery.Iterator, error) {
1803 var (
1804 columnSelectAs = map[string]string{}
1805 columnPredicates = map[string][]parquetquery.Predicate{}
1806 iters = []parquetquery.Iterator{}
1807 genericConditions []traceql.Condition
1808 columnMapping = dedicatedColumnsToColumnMapping(dedicatedColumns, backend.DedicatedColumnScopeResource)
1809 )
1810
1811 addPredicate := func(columnPath string, p parquetquery.Predicate) {
1812 columnPredicates[columnPath] = append(columnPredicates[columnPath], p)
1813 }
1814
1815 specialCase := func(cond traceql.Condition, columnPath string) (handled bool) {
1816 // Operands that need special handling.
1817 switch cond.Op {
1818 case traceql.OpNone:
1819 addPredicate(columnPath, nil) // No filtering
1820 columnSelectAs[columnPath] = cond.Attribute.Name
1821 return true
1822 case traceql.OpExists:
1823 addPredicate(columnPath, &parquetquery.SkipNilsPredicate{})
1824 columnSelectAs[columnPath] = cond.Attribute.Name
1825 return true
1826 case traceql.OpNotExists:
1827 iters = append(iters, makeIter(columnPath, parquetquery.NewNilValuePredicate(), cond.Attribute.Name))
1828 return true
1829 default:
1830 return false
1831 }
1832 }
1833
1834 for _, cond := range conditions {
1835 isNotExistSearch := len(cond.Operands) == 0 && cond.Op == traceql.OpNotExists
1836
1837 // Well-known selector?
1838 if entry, ok := wellKnownColumnLookups[cond.Attribute.Name]; ok && entry.level != traceql.AttributeScopeSpan {
1839 if specialCase(cond, entry.columnPath) {
1840 continue
1841 }
1842
1843 // Compatible type?
1844 if isMatchingColumnType(entry.typ, operandType(cond.Operands)) {
1845 pred, err := createPredicate(cond.Op, cond.Operands)
1846 if err != nil {
1847 return nil, fmt.Errorf("creating predicate: %w", err)
1848 }
1849 iters = append(iters, makeIter(entry.columnPath, pred, cond.Attribute.Name))
1850 continue
1851 }
1852 }
1853
1854 // Attributes stored in dedicated columns
1855 if c, ok := columnMapping.get(cond.Attribute.Name); ok {
1856 if specialCase(cond, c.ColumnPath) {
1857 continue
1858 }
1859

Callers 1

createAllIteratorFunction · 0.70

Calls 13

NewNilValuePredicateFunction · 0.92
NewLeftJoinIteratorFunction · 0.92
WithPoolFunction · 0.92
ToStaticTypeMethod · 0.80
isMatchingColumnTypeFunction · 0.70
operandTypeFunction · 0.70
createPredicateFunction · 0.70
orIfNeededFunction · 0.70
createAttributeIteratorFunction · 0.70
newBatchCollectorFunction · 0.70

Tested by

no test coverage detected