Source code for langchain_core.structured_query

"""结构化查询语言的内部表示。"""
from __future__ import annotations

from abc import ABC, abstractmethod
from enum import Enum
from typing import Any, List, Optional, Sequence, Union

from langchain_core.pydantic_v1 import BaseModel


[docs]class Visitor(ABC): """使用访问者模式定义IR翻译的接口。""" allowed_comparators: Optional[Sequence[Comparator]] = None allowed_operators: Optional[Sequence[Operator]] = None def _validate_func(self, func: Union[Operator, Comparator]) -> None: if isinstance(func, Operator) and self.allowed_operators is not None: if func not in self.allowed_operators: raise ValueError( f"Received disallowed operator {func}. Allowed " f"comparators are {self.allowed_operators}" ) if isinstance(func, Comparator) and self.allowed_comparators is not None: if func not in self.allowed_comparators: raise ValueError( f"Received disallowed comparator {func}. Allowed " f"comparators are {self.allowed_comparators}" )
[docs] @abstractmethod def visit_operation(self, operation: Operation) -> Any: """操作。"""
[docs] @abstractmethod def visit_comparison(self, comparison: Comparison) -> Any: """比较。"""
[docs] @abstractmethod def visit_structured_query(self, structured_query: StructuredQuery) -> Any: """StructuredQuery。"""
def _to_snake_case(name: str) -> str: """将一个名称转换为蛇形命名法。""" snake_case = "" for i, char in enumerate(name): if char.isupper() and i != 0: snake_case += "_" + char.lower() else: snake_case += char.lower() return snake_case
[docs]class Expr(BaseModel): """所有表达式的基类。"""
[docs] def accept(self, visitor: Visitor) -> Any: """接受一个访客。 参数: visitor: 要接受的访客 返回: 访问结果 """ return getattr(visitor, f"visit_{_to_snake_case(self.__class__.__name__)}")( self )
[docs]class Operator(str, Enum): """操作的枚举器。""" AND = "and" OR = "or" NOT = "not"
[docs]class Comparator(str, Enum): """比较运算符的枚举器。""" EQ = "eq" NE = "ne" GT = "gt" GTE = "gte" LT = "lt" LTE = "lte" CONTAIN = "contain" LIKE = "like" IN = "in" NIN = "nin"
[docs]class FilterDirective(Expr, ABC): """过滤表达式。"""
[docs]class Comparison(FilterDirective): """与一个值进行比较。""" comparator: Comparator attribute: str value: Any def __init__( self, comparator: Comparator, attribute: str, value: Any, **kwargs: Any ) -> None: super().__init__( comparator=comparator, attribute=attribute, value=value, **kwargs )
[docs]class Operation(FilterDirective): """逻辑操作符用于其他指令。""" operator: Operator arguments: List[FilterDirective] def __init__( self, operator: Operator, arguments: List[FilterDirective], **kwargs: Any ): super().__init__(operator=operator, arguments=arguments, **kwargs)
[docs]class StructuredQuery(Expr): """结构化查询。""" query: str """查询字符串。""" filter: Optional[FilterDirective] """过滤表达式。""" limit: Optional[int] """结果数的限制。""" def __init__( self, query: str, filter: Optional[FilterDirective], limit: Optional[int] = None, **kwargs: Any, ): super().__init__(query=query, filter=filter, limit=limit, **kwargs)