sanatan_ai / metadata.py
vikramvasudevan's picture
Upload folder using huggingface_hub
d434239 verified
raw
history blame
930 Bytes
from pydantic import BaseModel
from typing import Literal, Union, List, Dict
AllowedOps = Literal["$in", "$eq", "$gt", "$gte", "$lt", "$lte", "$ne", "$nin"]
class MetadataFilter(BaseModel):
metadata_field: str
metadata_search_operator: AllowedOps
metadata_value: Union[str, int, float, List[Union[str, int, float]]]
class MetadataWhereClause(BaseModel):
filters: List[MetadataFilter]
def to_chroma_where(self) -> Dict:
"""Convert list of MetadataFilter into Chroma-compatible where clause with AND logic."""
if not self.filters:
return {}
if len(self.filters) == 1:
f = self.filters[0]
return {f.metadata_field: {f.metadata_search_operator: f.metadata_value}}
return {
"$and": [
{f.metadata_field: {f.metadata_search_operator: f.metadata_value}}
for f in self.filters
]
}