Source code for eclypse.report.query

"""Composable query builder for report frames."""

from __future__ import annotations

from typing import (
    TYPE_CHECKING,
    Any,
)

from eclypse.utils.defaults import (
    DEFAULT_REPORT_RANGE,
    DEFAULT_REPORT_STEP,
)

if TYPE_CHECKING:
    from eclypse.utils.types import EventType

    from .report import Report


[docs] class ReportQuery: """Composable query builder for report frames."""
[docs] def __init__(self, report: Report, report_type: EventType): """Create a query builder bound to a report type.""" self._report = report self._report_type = report_type self._report_range: tuple[int, int] = DEFAULT_REPORT_RANGE self._report_step = DEFAULT_REPORT_STEP self._filters: dict[str, Any] = {}
[docs] def range(self, start: int, stop: int) -> ReportQuery: """Set the inclusive event range.""" self._report_range = (start, stop) return self
[docs] def step(self, step: int) -> ReportQuery: """Set the report step.""" self._report_step = step return self
[docs] def where(self, **filters: Any) -> ReportQuery: """Add equality or membership filters.""" self._filters.update(filters) return self
[docs] def to_frame(self) -> Any: """Materialise the current query into a backend frame.""" return self._report.frame( self._report_type, report_range=self._report_range, report_step=self._report_step, **self._filters, )