from __future__ import annotations from typing import Any from .http_runtime import _as_int, _clamp_int def _helper_meta( self: Any, start_calls: int, *, source: str, **extra: Any ) -> dict[str, Any]: out = { "source": source, "normalized": True, "budget_used": max(0, self.call_count["n"] - start_calls), "budget_remaining": self._budget_remaining(), } out.update(extra) return out def _derive_limit_metadata( self: Any, *, requested_limit: int | None, applied_limit: int, default_limit_used: bool, requested_scan_limit: int | None = None, applied_scan_limit: int | None = None, requested_max_pages: int | None = None, applied_max_pages: int | None = None, ) -> dict[str, Any]: meta: dict[str, Any] = { "requested_limit": requested_limit, "applied_limit": applied_limit, "default_limit_used": default_limit_used, } if requested_scan_limit is not None or applied_scan_limit is not None: meta["requested_scan_limit"] = requested_scan_limit meta["scan_limit"] = applied_scan_limit meta["scan_limit_applied"] = requested_scan_limit != applied_scan_limit if requested_max_pages is not None or applied_max_pages is not None: meta["requested_max_pages"] = requested_max_pages meta["applied_max_pages"] = applied_max_pages meta["page_limit_applied"] = requested_max_pages != applied_max_pages if requested_limit is not None: meta["hard_cap_applied"] = applied_limit < requested_limit return meta def _derive_more_available( self: Any, *, sample_complete: bool, exact_count: bool, returned: int, total: int | None, ) -> bool | str: if sample_complete: return False if exact_count and total is not None and returned < total: return True return "unknown" def _derive_truncated_by( self: Any, *, hard_cap: bool = False, scan_limit_hit: bool = False, page_limit_hit: bool = False, limit_hit: bool = False, ) -> str: causes = [hard_cap, scan_limit_hit, page_limit_hit, limit_hit] if sum(1 for cause in causes if cause) > 1: return "multiple" if hard_cap: return "hard_cap" if scan_limit_hit: return "scan_limit" if page_limit_hit: return "page_limit" if limit_hit: return "limit" return "none" def _derive_can_request_more( self: Any, *, sample_complete: bool, truncated_by: str ) -> bool: if sample_complete: return False return truncated_by in {"limit", "scan_limit", "page_limit", "multiple"} def _derive_next_request_hint( self: Any, *, truncated_by: str, more_available: bool | str, applied_limit: int, applied_scan_limit: int | None = None, applied_max_pages: int | None = None, ) -> str: if truncated_by == "limit": return f"Ask for limit>{applied_limit} to see more rows" if truncated_by == "scan_limit" and applied_scan_limit is not None: return f"Increase scan_limit above {applied_scan_limit} for broader coverage" if truncated_by == "page_limit" and applied_max_pages is not None: return f"Increase max_pages above {applied_max_pages} to continue paging" if truncated_by == "hard_cap": return "No more rows can be returned in a single call because a hard cap was applied" if truncated_by == "multiple": return "Increase the relevant return/page/scan bounds to improve coverage" if more_available is False: return "No more results available" if more_available == "unknown": return "More results may exist; narrow filters or raise scan/page bounds for better coverage" return "Ask for a larger limit to see more rows" def _resolve_exhaustive_limits( self: Any, *, limit: int | None, count_only: bool, default_limit: int, max_limit: int, scan_limit: int | None = None, scan_cap: int | None = None, ) -> dict[str, Any]: requested_limit = None if count_only else limit effective_requested_limit = 0 if count_only else requested_limit out: dict[str, Any] = { "requested_limit": requested_limit, "applied_limit": _clamp_int( effective_requested_limit, default=default_limit, minimum=0, maximum=max_limit, ), "default_limit_used": requested_limit is None and not count_only, } out["hard_cap_applied"] = ( requested_limit is not None and out["applied_limit"] < requested_limit ) if scan_cap is not None: out["requested_scan_limit"] = scan_limit out["applied_scan_limit"] = _clamp_int( scan_limit, default=scan_cap, minimum=1, maximum=scan_cap, ) return out def _build_exhaustive_meta( self: Any, *, base_meta: dict[str, Any], limit_plan: dict[str, Any], sample_complete: bool, exact_count: bool, truncated_by: str, more_available: bool | str, requested_max_pages: int | None = None, applied_max_pages: int | None = None, ) -> dict[str, Any]: meta = dict(base_meta) applied_limit = int(limit_plan["applied_limit"]) applied_scan_limit = limit_plan.get("applied_scan_limit") meta.update( { "complete": sample_complete, "exact_count": exact_count, "sample_complete": sample_complete, "more_available": more_available, "can_request_more": _derive_can_request_more( self, sample_complete=sample_complete, truncated_by=truncated_by, ), "truncated_by": truncated_by, "next_request_hint": _derive_next_request_hint( self, truncated_by=truncated_by, more_available=more_available, applied_limit=applied_limit, applied_scan_limit=applied_scan_limit if isinstance(applied_scan_limit, int) else None, applied_max_pages=applied_max_pages, ), } ) meta.update( _derive_limit_metadata( self, requested_limit=limit_plan["requested_limit"], applied_limit=applied_limit, default_limit_used=bool(limit_plan["default_limit_used"]), requested_scan_limit=limit_plan.get("requested_scan_limit"), applied_scan_limit=applied_scan_limit if isinstance(applied_scan_limit, int) else None, requested_max_pages=requested_max_pages, applied_max_pages=applied_max_pages, ) ) return meta def _overview_count_only_success( self: Any, *, start_calls: int, source: str, total: int, limit_plan: dict[str, Any], base_meta: dict[str, Any], ) -> dict[str, Any]: meta = _build_exhaustive_meta( self, base_meta={ **base_meta, "matched": total, "returned": 0, "total": total, "total_available": total, "total_matched": total, "truncated": False, }, limit_plan=limit_plan, sample_complete=True, exact_count=True, truncated_by="none", more_available=False, ) return _helper_success( self, start_calls=start_calls, source=source, items=[], meta=meta, ) def _build_exhaustive_result_meta( self: Any, *, base_meta: dict[str, Any], limit_plan: dict[str, Any], matched_count: int, returned_count: int, exact_count: bool, count_only: bool = False, sample_complete: bool | None = None, more_available: bool | str | None = None, scan_limit_hit: bool = False, page_limit_hit: bool = False, truncated_extra: bool = False, requested_max_pages: int | None = None, applied_max_pages: int | None = None, ) -> dict[str, Any]: applied_limit = int(limit_plan["applied_limit"]) if count_only: effective_sample_complete = exact_count else: effective_sample_complete = ( sample_complete if isinstance(sample_complete, bool) else exact_count and matched_count <= applied_limit ) limit_hit = ( False if count_only else (applied_limit > 0 and matched_count > applied_limit) ) truncated_by = _derive_truncated_by( self, hard_cap=bool(limit_plan.get("hard_cap_applied")), scan_limit_hit=scan_limit_hit, page_limit_hit=page_limit_hit, limit_hit=limit_hit, ) truncated = truncated_by != "none" or truncated_extra total_value = _as_int(base_meta.get("total")) effective_more_available = more_available if count_only and exact_count: effective_more_available = False if effective_more_available is None: effective_more_available = _derive_more_available( self, sample_complete=effective_sample_complete, exact_count=exact_count, returned=returned_count, total=total_value, ) return _build_exhaustive_meta( self, base_meta={ **base_meta, "matched": matched_count, "returned": returned_count, "truncated": truncated, }, limit_plan=limit_plan, sample_complete=effective_sample_complete, exact_count=exact_count, truncated_by=truncated_by, more_available=effective_more_available, requested_max_pages=requested_max_pages, applied_max_pages=applied_max_pages, ) def _helper_success( self: Any, *, start_calls: int, source: str, items: list[dict[str, Any]], cursor: str | None = None, meta: dict[str, Any] | None = None, **extra_meta: Any, ) -> dict[str, Any]: merged_meta = dict(meta or {}) merged_meta.update(extra_meta) if cursor is not None: merged_meta["cursor"] = cursor return { "ok": True, "item": items[0] if len(items) == 1 else None, "items": items, "meta": _helper_meta(self, start_calls, source=source, **merged_meta), "error": None, } def _helper_error( self: Any, *, start_calls: int, source: str, error: Any, **meta: Any, ) -> dict[str, Any]: envelope = { "ok": False, "item": None, "items": [], "meta": _helper_meta(self, start_calls, source=source, **meta), "error": str(error), } self.latest_helper_error_box["value"] = envelope return envelope