redis / redis-om-python

Object mapping, and more, for Redis and Python
MIT License
1.06k stars 108 forks source link

find() does not work when object index contains either boolean or timedelta fields #580

Closed u3Izx9ql7vW4 closed 2 months ago

u3Izx9ql7vW4 commented 7 months ago

Hi,

Thanks for writing this library, it's made made my life a bit easier. I came across some unusual behavior while I was using this library, notably find() does not work on any field with my data model below. It wasn't until I removed the index on the four timedelta and bool fields did find() start to work again. The get() method worked throughout.

find() does not work with this data model:

from typing import Dict, Optional, List, Set
from redis_om import JsonModel, Field

class Example(JsonModel):
    id           : str       = Field(primary_key=True, index=True)
    members      : List[str] = Field(index=True, default=[])
    friends      : List[str] = Field(index=True, default=[])
    dependencies : List[str] = Field(index=True)
    textfieldA   : str       = Field(index=True)
    date_start   : date      = Field(index=True)
    date_end     : Optional[date]
    textfieldB   : str       = Field(index=True)
    timefieldA   : timedelta = Field(index=True)
    timefieldB   : timedelta = Field(index=True)
    boolfieldA   : bool      = Field(index=True)
    boolfieldB   : bool      = Field(index=True)
    last_updated : date      = Field(index=True, default=date(1990, 1,1))

find() does work after removing index on timedelta and bool fields. Removing either type doesn't not fix the issue, indices on both types need to be removed in order to find() to work again:

class Example(JsonModel):
    id           : str       = Field(primary_key=True, index=True)
    members      : List[str] = Field(index=True, default=[])
    friends      : List[str] = Field(index=True, default=[])
    dependencies : List[str] = Field(index=True)
    textfieldA   : str       = Field(index=True)
    date_start   : date      = Field(index=True)
    date_end     : Optional[date]
    textfieldB   : str       = Field(index=True)
    timefieldA   : timedelta
    timefieldB   : timedelta
    boolfieldA   : bool
    boolfieldB   : bool
    last_updated : date      = Field(index=True, default=date(1990, 1,1))

Version Information: Python: 3.11.5 redis-om-python: 0.2.1 OS: macOS Sonoma 14.0 (Apple Silicon)