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

Function createResourceIterator

tempodb/encoding/vparquet4/block_traceql.go:2327–2465  ·  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, instrumentationIterator parquetquery.Iterator, conditions []traceql.Condition, requireAtLeastOneMatchOverall, allConditions bool, dedicatedColumns backend.DedicatedColumns, selectAll bool)

Source from the content-addressed store, hash-verified

2325// one batch each. It builds on top of the span iterator, and turns the groups of spans and resource-level values into
2326// spansets. Spansets are returned that match any of the given conditions.
2327func createResourceIterator(makeIter, makeNilIter makeIterFn, instrumentationIterator parquetquery.Iterator, conditions []traceql.Condition, requireAtLeastOneMatchOverall, allConditions bool, dedicatedColumns backend.DedicatedColumns, selectAll bool) (parquetquery.Iterator, error) {
2328 var (
2329 columnSelectAs = map[string]string{}
2330 columnPredicates = map[string][]parquetquery.Predicate{}
2331 iters = []parquetquery.Iterator{}
2332 genericConditions []traceql.Condition
2333 columnMapping = dedicatedColumnsToColumnMapping(dedicatedColumns, backend.DedicatedColumnScopeResource)
2334 )
2335
2336 addPredicate := func(columnPath string, p parquetquery.Predicate) {
2337 columnPredicates[columnPath] = append(columnPredicates[columnPath], p)
2338 }
2339
2340 specialCase := func(cond traceql.Condition, columnPath string) (handled bool) {
2341 // Operands that need special handling.
2342 switch cond.Op {
2343 case traceql.OpNone:
2344 addPredicate(columnPath, nil) // No filtering
2345 columnSelectAs[columnPath] = cond.Attribute.Name
2346 return true
2347 case traceql.OpExists:
2348 addPredicate(columnPath, &parquetquery.SkipNilsPredicate{})
2349 columnSelectAs[columnPath] = cond.Attribute.Name
2350 return true
2351 case traceql.OpNotExists:
2352 iters = append(iters, makeIter(columnPath, parquetquery.NewNilValuePredicate(), cond.Attribute.Name))
2353 return true
2354 default:
2355 return false
2356 }
2357 }
2358
2359 for _, cond := range conditions {
2360 // Well-known selector?
2361 if entry, ok := WellKnownColumnLookups[cond.Attribute.Name]; ok && entry.level != traceql.AttributeScopeSpan {
2362 if specialCase(cond, entry.ColumnPath) {
2363 continue
2364 }
2365
2366 // Compatible type?
2367 if isMatchingColumnType(entry.typ, operandType(cond.Operands)) {
2368 pred, err := createPredicate(cond.Op, cond.Operands)
2369 if err != nil {
2370 return nil, fmt.Errorf("creating predicate: %w", err)
2371 }
2372 iters = append(iters, makeIter(entry.ColumnPath, pred, cond.Attribute.Name))
2373 continue
2374 }
2375 }
2376
2377 // Attributes stored in dedicated columns
2378 if c, ok := columnMapping.get(cond.Attribute.Name); ok {
2379 if specialCase(cond, c.ColumnPath) {
2380 continue
2381 }
2382
2383 // Compatible type?
2384 typ, _ := c.Type.ToStaticType()

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