44 lines
1.4 KiB
Python
44 lines
1.4 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
"""预览/导出非功能性护栏(阶段 G)"""
|
||
from __future__ import annotations
|
||
|
||
from typing import Any, Dict, List
|
||
|
||
# 与 dataset_bridge.fetch_all max_rows 对齐
|
||
DEFAULT_MAX_DATASET_ROWS = 50000
|
||
WARN_DATASET_ROWS = 10000
|
||
WARN_SNAPSHOT_CELL_COUNT = 200_000
|
||
|
||
|
||
def estimate_snapshot_cell_count(snapshot: Dict[str, Any]) -> int:
|
||
total = 0
|
||
for sheet in (snapshot.get("sheets") or {}).values():
|
||
if not isinstance(sheet, dict):
|
||
continue
|
||
for row in (sheet.get("cellData") or {}).values():
|
||
if isinstance(row, dict):
|
||
total += len(row)
|
||
return total
|
||
|
||
|
||
def collect_preview_warnings(
|
||
*,
|
||
datasets: Dict[str, List[Any]],
|
||
snapshot: Dict[str, Any],
|
||
max_rows: int = DEFAULT_MAX_DATASET_ROWS,
|
||
warn_rows: int = WARN_DATASET_ROWS,
|
||
) -> List[str]:
|
||
"""返回 warning 码列表,供前端 i18n 映射。"""
|
||
warnings: List[str] = []
|
||
for alias, rows in (datasets or {}).items():
|
||
count = len(rows) if isinstance(rows, list) else 0
|
||
if count >= max_rows:
|
||
warnings.append(f"dataset_row_limit:{alias}")
|
||
elif count >= warn_rows:
|
||
warnings.append(f"dataset_row_warn:{alias}")
|
||
cell_count = estimate_snapshot_cell_count(snapshot or {})
|
||
if cell_count >= WARN_SNAPSHOT_CELL_COUNT:
|
||
warnings.append("snapshot_large")
|
||
return warnings
|