File size: 930 Bytes
d434239
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
            ]
        }