( makeIter, makeNilIter makeIterFn, needDriver bool, conditions []traceql.Condition, allConditions bool, selectAll bool, dedicatedColumns backend.DedicatedColumns, sampler traceql.Sampler, )
| 420 | } |
| 421 | |
| 422 | func createSpanIterators( |
| 423 | makeIter, makeNilIter makeIterFn, |
| 424 | needDriver bool, |
| 425 | conditions []traceql.Condition, |
| 426 | allConditions bool, |
| 427 | selectAll bool, |
| 428 | dedicatedColumns backend.DedicatedColumns, |
| 429 | sampler traceql.Sampler, |
| 430 | ) (driver parquetquery.Iterator, required, optional []parquetquery.Iterator, err error) { |
| 431 | var ( |
| 432 | columnSelectAs = map[string]string{} |
| 433 | columnPredicates = map[string][]parquetquery.Predicate{} |
| 434 | genericConditions []traceql.Condition |
| 435 | columnMapping = dedicatedColumnsToColumnMapping(dedicatedColumns, backend.DedicatedColumnScopeSpan) |
| 436 | ) |
| 437 | |
| 438 | // todo: improve these methods. if addPredicate gets a nil predicate shouldn't it just wipe out the existing predicates instead of appending? |
| 439 | // nil predicate matches everything. what's the point of also evaluating a "real" predicate? |
| 440 | addPredicate := func(columnPath string, p parquetquery.Predicate) { |
| 441 | columnPredicates[columnPath] = append(columnPredicates[columnPath], p) |
| 442 | } |
| 443 | |
| 444 | addNilPredicateIfNotAlready := func(path string) { |
| 445 | preds := columnPredicates[path] |
| 446 | foundOpNone := false |
| 447 | |
| 448 | // check to see if there is a nil predicate and only add if it doesn't exist |
| 449 | for _, pred := range preds { |
| 450 | if pred == nil { |
| 451 | foundOpNone = true |
| 452 | break |
| 453 | } |
| 454 | } |
| 455 | |
| 456 | if !foundOpNone { |
| 457 | addPredicate(path, nil) |
| 458 | columnSelectAs[path] = path |
| 459 | } |
| 460 | } |
| 461 | |
| 462 | specialCase := func(cond traceql.Condition, columnPath string) (handled bool) { |
| 463 | // Operands that need special handling. |
| 464 | switch cond.Op { |
| 465 | case traceql.OpNone: |
| 466 | addPredicate(columnPath, nil) // No filtering |
| 467 | columnSelectAs[columnPath] = cond.Attribute.Name |
| 468 | return true |
| 469 | case traceql.OpExists: |
| 470 | addPredicate(columnPath, &parquetquery.SkipNilsPredicate{}) |
| 471 | columnSelectAs[columnPath] = cond.Attribute.Name |
| 472 | return true |
| 473 | case traceql.OpNotExists: |
| 474 | optional = append(optional, makeIter(columnPath, parquetquery.NewNilValuePredicate(), cond.Attribute.Name)) |
| 475 | return true |
| 476 | default: |
| 477 | return false |
| 478 | } |
| 479 | } |
no test coverage detected