Performance improvement for first - avoids unnecessary pagination.
This commit is contained in:
Simon Prickett 2022-04-25 15:24:16 +01:00 committed by GitHub
commit 49a4a1edbe
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 2 deletions

View file

@ -749,7 +749,7 @@ class FindQuery:
async def first(self): async def first(self):
query = self.copy(offset=0, limit=1, sort_fields=self.sort_fields) query = self.copy(offset=0, limit=1, sort_fields=self.sort_fields)
results = await query.execute() results = await query.execute(exhaust_results=False)
if not results: if not results:
raise NotFoundError() raise NotFoundError()
return results[0] return results[0]

View file

@ -46,7 +46,7 @@ async def m(key_prefix, redis):
last_name: str = Field(index=True) last_name: str = Field(index=True)
email: str = Field(index=True) email: str = Field(index=True)
join_date: datetime.date join_date: datetime.date
age: int = Field(index=True) age: int = Field(index=True, sortable=True)
bio: str = Field(index=True, full_text_search=True) bio: str = Field(index=True, full_text_search=True)
class Meta: class Meta:
@ -357,6 +357,43 @@ def test_validation_passes(m):
) )
assert member.first_name == "Andrew" assert member.first_name == "Andrew"
@pytest.mark.asyncio
async def test_retrieve_first(m):
member = m.Member(
first_name="Simon",
last_name="Prickett",
email="s@example.com",
join_date=today,
age=99,
bio="This is the bio field for this user.",
)
await member.save()
member2 = m.Member(
first_name="Another",
last_name="Member",
email="m@example.com",
join_date=today,
age=98,
bio="This is the bio field for this user.",
)
await member2.save()
member3 = m.Member(
first_name="Third",
last_name="Member",
email="t@example.com",
join_date=today,
age=97,
bio="This is the bio field for this user.",
)
await member3.save()
first_one = await m.Member.find().sort_by("age").first()
assert first_one == member3
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_saves_model_and_creates_pk(m): async def test_saves_model_and_creates_pk(m):