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

Function createResourceIterator

tempodb/encoding/vparquet5/block_traceql.go:2408–2546  ·  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

2406// one batch each. It builds on top of the span iterator, and turns the groups of spans and resource-level values into
2407// spansets. Spansets are returned that match any of the given conditions.
2408func createResourceIterator(makeIter, makeNilIter makeIterFn, instrumentationIterator parquetquery.Iterator, conditions []traceql.Condition, requireAtLeastOneMatchOverall, allConditions bool, dedicatedColumns backend.DedicatedColumns, selectAll bool) (parquetquery.Iterator, error) {
2409 var (
2410 columnSelectAs = map[string]string{}
2411 columnPredicates = map[string][]parquetquery.Predicate{}
2412 iters = []parquetquery.Iterator{}
2413 genericConditions []traceql.Condition
2414 columnMapping = dedicatedColumnsToColumnMapping(dedicatedColumns, backend.DedicatedColumnScopeResource)
2415 )
2416
2417 addPredicate := func(columnPath string, p parquetquery.Predicate) {
2418 columnPredicates[columnPath] = append(columnPredicates[columnPath], p)
2419 }
2420
2421 specialCase := func(cond traceql.Condition, columnPath string) (handled bool) {
2422 // Operands that need special handling.
2423 switch cond.Op {
2424 case traceql.OpNone:
2425 addPredicate(columnPath, nil) // No filtering
2426 columnSelectAs[columnPath] = cond.Attribute.Name
2427 return true
2428 case traceql.OpExists:
2429 addPredicate(columnPath, &parquetquery.SkipNilsPredicate{})
2430 columnSelectAs[columnPath] = cond.Attribute.Name
2431 return true
2432 case traceql.OpNotExists:
2433 iters = append(iters, makeIter(columnPath, parquetquery.NewNilValuePredicate(), cond.Attribute.Name))
2434 return true
2435 default:
2436 return false
2437 }
2438 }
2439
2440 for _, cond := range conditions {
2441 // Well-known selector?
2442 if entry, ok := wellKnownColumnLookups[cond.Attribute.Name]; ok && entry.level != traceql.AttributeScopeSpan {
2443 if specialCase(cond, entry.columnPath) {
2444 continue
2445 }
2446
2447 // Compatible type?
2448 if isMatchingColumnType(entry.typ, operandType(cond.Operands)) {
2449 pred, err := createPredicate(cond.Op, cond.Operands)
2450 if err != nil {
2451 return nil, fmt.Errorf("creating predicate: %w", err)
2452 }
2453 iters = append(iters, makeIter(entry.columnPath, pred, cond.Attribute.Name))
2454 continue
2455 }
2456 }
2457
2458 // Attributes stored in dedicated columns
2459 if c, ok := columnMapping.get(cond.Attribute.Name); ok {
2460 if specialCase(cond, c.ColumnPath) {
2461 continue
2462 }
2463
2464 // Compatible type?
2465 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