[docs]classTencentVectorDBTranslator(Visitor):"""Translate StructuredQuery to Tencent VectorDB query."""COMPARATOR_MAP={Comparator.EQ:"=",Comparator.NE:"!=",Comparator.GT:">",Comparator.GTE:">=",Comparator.LT:"<",Comparator.LTE:"<=",Comparator.IN:"in",Comparator.NIN:"not in",}allowed_comparators:Optional[Sequence[Comparator]]=list(COMPARATOR_MAP.keys())allowed_operators:Optional[Sequence[Operator]]=[Operator.AND,Operator.OR,Operator.NOT,]
[docs]def__init__(self,meta_keys:Optional[Sequence[str]]=None):"""Initialize the translator. Args: meta_keys: List of meta keys to be used in the query. Default: []. """self.meta_keys=meta_keysor[]
[docs]defvisit_operation(self,operation:Operation)->str:"""Visit an operation node and return the translated query. Args: operation: Operation node to be visited. Returns: Translated query. """ifoperation.operatorin(Operator.AND,Operator.OR):ret=f" {operation.operator.value} ".join([arg.accept(self)forarginoperation.arguments])ifoperation.operator==Operator.OR:ret=f"({ret})"returnretelse:returnf"not ({operation.arguments[0].accept(self)})"
[docs]defvisit_comparison(self,comparison:Comparison)->str:"""Visit a comparison node and return the translated query. Args: comparison: Comparison node to be visited. Returns: Translated query. """ifself.meta_keysandcomparison.attributenotinself.meta_keys:raiseValueError(f"Expr Filtering found Unsupported attribute: {comparison.attribute}")ifcomparison.comparatorinself.COMPARATOR_MAP:ifcomparison.comparatorin[Comparator.IN,Comparator.NIN]:value=map(lambdax:f'"{x}"'ifisinstance(x,str)elsex,comparison.value)return(f"{comparison.attribute}"f" {self.COMPARATOR_MAP[comparison.comparator]} "f"({', '.join(value)})")ifisinstance(comparison.value,str):return(f"{comparison.attribute} "f"{self.COMPARATOR_MAP[comparison.comparator]}"f' "{comparison.value}"')return(f"{comparison.attribute}"f" {self.COMPARATOR_MAP[comparison.comparator]} "f"{comparison.value}")else:raiseValueError(f"Unsupported comparator {comparison.comparator}")
[docs]defvisit_structured_query(self,structured_query:StructuredQuery)->Tuple[str,dict]:"""Visit a structured query node and return the translated query. Args: structured_query: StructuredQuery node to be visited. Returns: Translated query and query kwargs. """ifstructured_query.filterisNone:kwargs={}else:kwargs={"expr":structured_query.filter.accept(self)}returnstructured_query.query,kwargs