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