Skip to content

Commit 3ed225c

Browse files
committed
fix issue where certain fields were unintentionally being indexed
1 parent fc66b80 commit 3ed225c

File tree

3 files changed

+60
-7
lines changed

3 files changed

+60
-7
lines changed

.vscode/settings.json

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"python.testing.unittestEnabled": false,
3+
"python.testing.pytestEnabled": true,
4+
}

aredis_om/model/model.py

+16-7
Original file line numberDiff line numberDiff line change
@@ -1060,12 +1060,12 @@ def __dataclass_transform__(
10601060
class FieldInfo(PydanticFieldInfo):
10611061
name: str
10621062

1063-
def __init__(self, default: Any = Undefined, **kwargs: Any) -> None:
1063+
def __init__(self, default: Any = ..., **kwargs: Any) -> None:
10641064
primary_key = kwargs.pop("primary_key", False)
1065-
sortable = kwargs.pop("sortable", Undefined)
1066-
case_sensitive = kwargs.pop("case_sensitive", Undefined)
1067-
index = kwargs.pop("index", Undefined)
1068-
full_text_search = kwargs.pop("full_text_search", Undefined)
1065+
sortable = kwargs.pop("sortable", None)
1066+
case_sensitive = kwargs.pop("case_sensitive", None)
1067+
index = kwargs.pop("index", None)
1068+
full_text_search = kwargs.pop("full_text_search", None)
10691069
vector_options = kwargs.pop("vector_options", None)
10701070
super().__init__(default=default, **kwargs)
10711071
self.primary_key = primary_key
@@ -1372,7 +1372,13 @@ def outer_type_or_annotation(field: FieldInfo):
13721372

13731373

13741374
class RedisModel(BaseModel, abc.ABC, metaclass=ModelMeta):
1375-
pk: Optional[str] = Field(default=None, primary_key=True, validate_default=True)
1375+
pk: Optional[str] = Field(
1376+
# Indexing for backwards compatibility, we might not want this in the future
1377+
default=None,
1378+
primary_key=True,
1379+
validate_default=True,
1380+
index=True,
1381+
)
13761382
Meta = DefaultMeta
13771383

13781384
model_config = ConfigDict(from_attributes=True)
@@ -1939,7 +1945,10 @@ def schema_for_type(
19391945
field_info: PydanticFieldInfo,
19401946
parent_type: Optional[Any] = None,
19411947
) -> str:
1942-
should_index = getattr(field_info, "index", False)
1948+
should_index = (
1949+
getattr(field_info, "index", False) is True
1950+
or getattr(field_info, "vector_options", None) is not None
1951+
)
19431952
is_container_type = is_supported_container_type(typ)
19441953
parent_is_container_type = is_supported_container_type(parent_type)
19451954
parent_is_model = False

tests/test_json_model.py

+40
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import decimal
77
import uuid
88
from collections import namedtuple
9+
from enum import Enum
910
from typing import Dict, List, Optional, Set, Union
1011
from unittest import mock
1112

@@ -951,6 +952,45 @@ class TypeWithUuid(JsonModel, index=True):
951952
await item.save()
952953

953954

955+
@py_test_mark_asyncio
956+
async def test_type_with_enum():
957+
class TestEnum(Enum):
958+
FOO = "foo"
959+
BAR = "bar"
960+
961+
class TypeWithEnum(JsonModel, index=True):
962+
enum: TestEnum
963+
964+
await Migrator().run()
965+
966+
item = TypeWithEnum(enum=TestEnum.FOO)
967+
968+
await item.save()
969+
970+
assert await TypeWithEnum.get(item.pk) == item
971+
972+
973+
@py_test_mark_asyncio
974+
async def test_type_with_list_of_enums(key_prefix, redis):
975+
class TestEnum(Enum):
976+
FOO = "foo"
977+
BAR = "bar"
978+
979+
class BaseWithEnums(JsonModel):
980+
enums: list[TestEnum]
981+
982+
class TypeWithEnums(BaseWithEnums, index=True):
983+
pass
984+
985+
await Migrator().run()
986+
987+
item = TypeWithEnums(enums=[TestEnum.FOO])
988+
989+
await item.save()
990+
991+
assert await TypeWithEnums.get(item.pk) == item
992+
993+
954994
@py_test_mark_asyncio
955995
async def test_xfix_queries(m):
956996
await m.Member(

0 commit comments

Comments
 (0)