Determine which data sources are needed based on requested columns
(self, columns: Set[str])
| 414 | return result |
| 415 | |
| 416 | def _determine_required_sources(self, columns: Set[str]) -> Set[str]: |
| 417 | """Determine which data sources are needed based on requested columns""" |
| 418 | required_sources = {'samples'} # Always need the base source |
| 419 | column_mapping = self.get_column_to_source_mapping() |
| 420 | |
| 421 | # Check which sources are needed for the requested columns |
| 422 | for col in columns: |
| 423 | # Handle prefixed columns (e.g., "sc.duration_ns") |
| 424 | if '.' in col: |
| 425 | prefix = col.split('.')[0] |
| 426 | # Find source by alias |
| 427 | for src_name, src_info in self.DATA_SOURCES.items(): |
| 428 | if src_info['alias'] == prefix: |
| 429 | required_sources.add(src_name) |
| 430 | # Add dependencies |
| 431 | for dep in src_info['depends_on']: |
| 432 | required_sources.add(dep) |
| 433 | break |
| 434 | else: |
| 435 | source = column_mapping.get(col) |
| 436 | if source: |
| 437 | required_sources.add(source) |
| 438 | # Add dependencies |
| 439 | for dep in self.DATA_SOURCES[source]['depends_on']: |
| 440 | required_sources.add(dep) |
| 441 | |
| 442 | # Add computed columns dependencies |
| 443 | if 'kstack_current_func' in columns: |
| 444 | required_sources.add('kstacks') |
| 445 | if 'ustack_current_func' in columns: |
| 446 | required_sources.add('ustacks') |
| 447 | |
| 448 | # Add dependencies for latency columns |
| 449 | syscall_latency_cols = {'sc.min_lat_us', 'sc.avg_lat_us', 'sc.max_lat_us', |
| 450 | 'sc.p50_us', 'sc.p95_us', 'sc.p99_us', 'sc.p999_us', 'sclat_histogram'} |
| 451 | io_latency_cols = {'io.min_lat_us', 'io.avg_lat_us', 'io.max_lat_us', |
| 452 | 'io.p50_us', 'io.p95_us', 'io.p99_us', 'io.p999_us', 'iolat_histogram'} |
| 453 | |
| 454 | if any(col in columns for col in syscall_latency_cols): |
| 455 | required_sources.add('syscend') |
| 456 | if any(col in columns for col in io_latency_cols): |
| 457 | required_sources.add('iorqend') |
| 458 | |
| 459 | return required_sources |
| 460 | |
| 461 | def _load_fragment(self, source_name: str) -> str: |
| 462 | """Load SQL fragment for a data source""" |
no test coverage detected