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)
| 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. |
| 2408 | func 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() |
no test coverage detected