facet_context.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. """列头 facet 上下文:剥离当前列自身过滤键(Excel 语义)。"""
  2. from __future__ import annotations
  3. import re
  4. from typing import Dict, Iterable, MutableMapping, Optional, Set
  5. def _camel_to_snake(name: str) -> str:
  6. s1 = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", name)
  7. return re.sub("([a-z0-9])([A-Z])", r"\1_\2", s1).lower()
  8. def keys_for_facet_field(
  9. field: str, *, extra_keys: Optional[Iterable[str]] = None
  10. ) -> Set[str]:
  11. f = (field or "").strip()
  12. snake = _camel_to_snake(f) if f else ""
  13. keys = {f, f"{f}In", snake, f"{snake}_in"}
  14. if extra_keys:
  15. keys.update(k for k in extra_keys if k)
  16. return {k for k in keys if k}
  17. def strip_simple_facet_self_params(
  18. params: MutableMapping[str, object],
  19. field: str,
  20. *,
  21. extra_keys: Optional[Iterable[str]] = None,
  22. ) -> Dict[str, object]:
  23. """去掉当前 facet 列对应过滤键与元数据,返回新 dict。"""
  24. out = {k: v for k, v in params.items() if v not in (None, "")}
  25. for key in keys_for_facet_field(field, extra_keys=extra_keys):
  26. out.pop(key, None)
  27. for meta in ("field", "keyword", "limit"):
  28. out.pop(meta, None)
  29. return out