{"record":{"id":"545d85b4f01e2afb","repo":"deepset-ai/haystack","slug":"unknown-logical-operator-operator-valid-opera","errorCode":null,"errorMessage":"Unknown logical operator '{operator}'. Valid operators are: {sorted(LOGICAL_OPERATORS)}","messagePattern":"Unknown logical operator '(.+?)'\\. Valid operators are: (.+?)","errorType":"exception","errorClass":"FilterError","httpStatus":null,"severity":"error","filePath":"haystack/utils/filters.py","lineNumber":279,"sourceCode":"    \"<=\": _less_than_equal,\n    \"in\": _in,\n    \"not in\": _not_in,\n}\n\n\ndef _logic_condition(\n    condition: dict[str, Any], document: Document | ByteStream, strict_datetime_comparison: bool\n) -> bool:\n    if \"operator\" not in condition:\n        msg = f\"'operator' key missing in {condition}\"\n        raise FilterError(msg)\n    if \"conditions\" not in condition:\n        msg = f\"'conditions' key missing in {condition}\"\n        raise FilterError(msg)\n    operator: str = condition[\"operator\"]\n    if operator not in LOGICAL_OPERATORS:\n        msg = f\"Unknown logical operator '{operator}'. Valid operators are: {sorted(LOGICAL_OPERATORS)}\"\n        raise FilterError(msg)\n    conditions: list[dict[str, Any]] = condition[\"conditions\"]\n    return LOGICAL_OPERATORS[operator](\n        document=document, conditions=conditions, strict_datetime_comparison=strict_datetime_comparison\n    )\n\n\ndef _comparison_condition(\n    condition: dict[str, Any], document: Document | ByteStream, strict_datetime_comparison: bool\n) -> bool:\n    if \"field\" not in condition:\n        # 'field' key is only found in comparison dictionaries.\n        # We assume this is a logic dictionary since it's not present.\n        return _logic_condition(\n            condition=condition, document=document, strict_datetime_comparison=strict_datetime_comparison\n        )\n    field: str = condition[\"field\"]\n\n    if \"operator\" not in condition:","sourceCodeStart":261,"sourceCodeEnd":297,"githubUrl":"https://github.com/deepset-ai/haystack/blob/e318778c9bf60a1963e3b5f451359655dd696c30/haystack/utils/filters.py#L261-L297","documentation":"The 'operator' in a logical condition must be one of LOGICAL_OPERATORS (AND/OR, case-sensitive as registered). Any other string raises this FilterError listing the valid operators.","triggerScenarios":"Passing {\"operator\": \"and\", ...} if only uppercase is accepted, or values like 'NOT', '&&', or 'xor' in a logical condition.","commonSituations":"Lowercasing filter keys programmatically; translating SQL/boolean expressions into Haystack filters; using comparison operator strings ('==') at the logical level.","solutions":["Use a supported logical operator exactly as listed in the error message (e.g. \"AND\" or \"OR\").","Don't express negation with a logical operator; use 'not in'/'!=' comparison operators instead.","Validate operator strings against haystack.utils.filters.LOGICAL_OPERATORS before applying."],"exampleFix":"// before\nfilters = {\"operator\": \"and\", \"conditions\": [...]}\n// after\nfilters = {\"operator\": \"AND\", \"conditions\": [...]}","handlingStrategy":"validation","validationCode":"from haystack.utils.filters import LOGICAL_OPERATORS\nassert condition.get(\"operator\") in LOGICAL_OPERATORS, condition[\"operator\"]","typeGuard":"def is_valid_logical_op(c: dict) -> bool:\n    return c.get(\"operator\") in LOGICAL_OPERATORS","tryCatchPattern":"try:\n    ok = document_matches_filter(doc, filters)\nexcept FilterError as e:\n    logger.warning(\"bad logical operator: %s\", e)\n    ok = False","preventionTips":["Use exact registered logical operators ('AND'/'OR').","Check LOGICAL_OPERATORS when unsure of valid values.","Beware lowercasing pipelines that mangle operator strings."],"tags":["python","filters","validation","haystack"],"backgroundTag":"unknown-enum-value","analyzedSha":"e318778c9bf60a1963e3b5f451359655dd696c30","analyzedAt":"2026-08-30T11:45:20.711Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}