(ctx context.Context, pf *parquet.File, rgs []parquet.RowGroup, rowNumbers []pq.RowNumber)
| 328 | } |
| 329 | |
| 330 | func rawToResults(ctx context.Context, pf *parquet.File, rgs []parquet.RowGroup, rowNumbers []pq.RowNumber) ([]*tempopb.TraceSearchMetadata, error) { |
| 331 | makeIter := makeIterFunc(ctx, rgs, pf) |
| 332 | |
| 333 | results := []*tempopb.TraceSearchMetadata{} |
| 334 | iter2 := pq.NewJoinIterator(DefinitionLevelTrace, []pq.Iterator{ |
| 335 | &rowNumberIterator{rowNumbers: rowNumbers}, |
| 336 | makeIter("TraceID", nil, "TraceID"), |
| 337 | makeIter("RootServiceName", nil, "RootServiceName"), |
| 338 | makeIter("RootSpanName", nil, "RootSpanName"), |
| 339 | makeIter("StartTimeUnixNano", nil, "StartTimeUnixNano"), |
| 340 | makeIter("DurationNano", nil, "DurationNano"), |
| 341 | }, nil) |
| 342 | defer iter2.Close() |
| 343 | |
| 344 | for { |
| 345 | match, err := iter2.Next() |
| 346 | if err != nil { |
| 347 | return nil, fmt.Errorf("rawToResults next failed: %w", err) |
| 348 | } |
| 349 | if match == nil { |
| 350 | break |
| 351 | } |
| 352 | |
| 353 | matchMap := match.ToMap() |
| 354 | result := &tempopb.TraceSearchMetadata{ |
| 355 | TraceID: util.TraceIDToHexString(matchMap["TraceID"][0].Bytes()), |
| 356 | RootServiceName: matchMap["RootServiceName"][0].String(), |
| 357 | RootTraceName: matchMap["RootSpanName"][0].String(), |
| 358 | StartTimeUnixNano: matchMap["StartTimeUnixNano"][0].Uint64(), |
| 359 | DurationMs: uint32(matchMap["DurationNano"][0].Int64() / int64(time.Millisecond)), |
| 360 | } |
| 361 | results = append(results, result) |
| 362 | } |
| 363 | |
| 364 | return results, nil |
| 365 | } |
| 366 | |
| 367 | // makeIterFn is a helper to create an iterator, that abstracts away context like file and row groups. |
| 368 | type makeIterFn func(columnName string, predicate pq.Predicate, selectAs string) pq.Iterator |
no test coverage detected