builder.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. """Backward-compatible façade for the query planning bounded context."""
  2. from __future__ import annotations
  3. from typing import Any
  4. from acquisition.repositories.base import AcquisitionRepository
  5. from query_planning import (
  6. GenerationRequest,
  7. GeneratorKind,
  8. QueryBatchWriteSpec,
  9. QueryBatchWriter,
  10. UnifiedQueryGenerationService,
  11. planning_store_for_repository,
  12. )
  13. from query_planning.cartesian import (
  14. DEFAULT_ACTIVE_FAMILY_KEYS,
  15. TREES,
  16. QueryBuildOptions,
  17. build_creation_query_batch,
  18. )
  19. def persist_query_batch(
  20. repo: AcquisitionRepository,
  21. generated: dict[str, Any],
  22. *,
  23. name: str,
  24. source_type: str = "generated",
  25. generation_method: str = "creation_demo_v1",
  26. target_platforms: list[str] | None = None,
  27. ) -> tuple[Any, int]:
  28. """Persist legacy family JSON through the unified planning and writer flow."""
  29. candidates: list[dict[str, Any]] = []
  30. for family in generated.get("families") or []:
  31. for item in family.get("items") or []:
  32. if not item.get("keep", True):
  33. continue
  34. candidates.append(
  35. {
  36. "query_text": item.get("query") or "",
  37. "axes": item.get("parts") or {},
  38. "filter_reason": item.get("reason") or "",
  39. "priority": item.get("priority") or 0,
  40. "source_refs": [
  41. {
  42. "generator_kind": GeneratorKind.CARTESIAN.value,
  43. "family_key": family.get("key"),
  44. "family_name": family.get("name"),
  45. "axes": item.get("parts") or {},
  46. }
  47. ],
  48. "metadata": {
  49. "family_key": family.get("key"),
  50. "family_name": family.get("name"),
  51. "family_axes": family.get("axes") or [],
  52. },
  53. }
  54. )
  55. platforms = tuple(target_platforms or ["xiaohongshu", "weixin", "douyin"])
  56. result = UnifiedQueryGenerationService().generate(
  57. GenerationRequest(
  58. generator_kind=GeneratorKind.CARTESIAN,
  59. name=name,
  60. target_platforms=platforms,
  61. payload={
  62. "candidates": candidates,
  63. "generator_config": generated.get("metadata") or {},
  64. "input_snapshot": {
  65. "active_family_keys": (generated.get("metadata") or {}).get(
  66. "active_family_keys", []
  67. ),
  68. "family_count": len(generated.get("families") or []),
  69. "candidate_count": len(candidates),
  70. },
  71. },
  72. metadata={"generation_method": generation_method},
  73. )
  74. )
  75. write_result = QueryBatchWriter(
  76. legacy_sink=repo,
  77. planning_store=planning_store_for_repository(repo),
  78. ).write(
  79. result,
  80. QueryBatchWriteSpec(
  81. name=name,
  82. source_type=source_type,
  83. generation_method=generation_method,
  84. target_platforms=platforms,
  85. metadata=generated.get("metadata") or {},
  86. ),
  87. )
  88. return write_result.batch, len(write_result.queries)
  89. __all__ = [
  90. "DEFAULT_ACTIVE_FAMILY_KEYS",
  91. "QueryBuildOptions",
  92. "TREES",
  93. "build_creation_query_batch",
  94. "persist_query_batch",
  95. ]