utils.py 1.84 KB
"""Configuration helper functions for dynamic multi-language search fields."""

from typing import Dict, List
from .config_loader import SearchConfig


def _format_field_with_boost(field_name: str, boost: float) -> str:
    if abs(float(boost) - 1.0) < 1e-9:
        return field_name
    return f"{field_name}^{boost}"


def _get_boost(config: SearchConfig, base_field: str, language: str = "") -> float:
    lang = (language or "").strip().lower()
    if lang:
        lang_key = f"{base_field}.{lang}"
        if lang_key in config.field_boosts:
            return float(config.field_boosts[lang_key])
    if base_field in config.field_boosts:
        return float(config.field_boosts[base_field])
    return 1.0


def get_match_fields_for_index(config: SearchConfig, index_name: str = "default") -> List[str]:
    """
    Deprecated compatibility wrapper.

    `indexes` is no longer used by runtime query building. This function now returns
    dynamic match fields for the default language based on query_config.search_fields.
    """
    del index_name
    lang = (config.query_config.default_language or "en").strip().lower()
    match_fields: List[str] = []

    for base_field in config.query_config.multilingual_fields:
        field_name = f"{base_field}.{lang}"
        match_fields.append(_format_field_with_boost(field_name, _get_boost(config, base_field, lang)))

    for shared_field in config.query_config.shared_fields:
        match_fields.append(_format_field_with_boost(shared_field, _get_boost(config, shared_field)))

    return match_fields


def get_domain_fields(config: SearchConfig) -> Dict[str, List[str]]:
    """
    Get dynamic domain fields for compatibility with old diagnostics endpoints.

    Returns:
        A single `default` domain entry generated from dynamic search_fields.
    """
    return {"default": get_match_fields_for_index(config)}