Coverage for src/qdrant_loader_mcp_server/search/hybrid/orchestration/facets.py: 100%
14 statements
« prev ^ index » next coverage.py v7.10.6, created at 2025-09-08 06:06 +0000
« prev ^ index » next coverage.py v7.10.6, created at 2025-09-08 06:06 +0000
1from __future__ import annotations
3from datetime import datetime
4from typing import Any
6from ...enhanced.faceted_search import FacetedSearchResults, FacetFilter
9async def search_with_facets(
10 engine: Any,
11 query: str,
12 limit: int = 5,
13 source_types: list[str] | None = None,
14 project_ids: list[str] | None = None,
15 facet_filters: list[FacetFilter] | None = None,
16 generate_facets: bool = True,
17 session_context: dict[str, Any] | None = None,
18 behavioral_context: list[str] | None = None,
19) -> FacetedSearchResults:
20 """Perform faceted search with dynamic facet generation using the provided engine."""
21 start_time = datetime.now()
23 # First, perform regular search (potentially with larger limit for faceting)
24 search_limit = max(limit * 2, 50) if generate_facets else limit
26 search_results = await engine.search(
27 query=query,
28 limit=search_limit,
29 source_types=source_types,
30 project_ids=project_ids,
31 session_context=session_context,
32 behavioral_context=behavioral_context,
33 )
35 # Generate faceted results
36 faceted_results = engine.faceted_search_engine.generate_faceted_results(
37 results=search_results, applied_filters=facet_filters or []
38 )
40 # Limit final results
41 faceted_results.results = faceted_results.results[:limit]
42 faceted_results.filtered_count = len(faceted_results.results)
44 search_time = (datetime.now() - start_time).total_seconds() * 1000
46 engine.logger.info(
47 "Faceted search completed",
48 query=query,
49 total_results=faceted_results.total_results,
50 filtered_results=faceted_results.filtered_count,
51 facet_count=len(faceted_results.facets),
52 active_filters=len(faceted_results.applied_filters),
53 search_time_ms=round(search_time, 2),
54 )
56 return faceted_results