"""Find many documents matching the filter.
The search is based on the effect of a quantum loop.
The search effectiveness depends on the number of processor threads.
"""
import anyio
from typing import Annotated
from pydantic import Field
from scruby import ReturnType, Scruby, ScrubyModel
from pprint import pprint as pp
class Car(ScrubyModel):
"""Car model."""
brand: Annotated[str, Field(frozen=True)]
model: Annotated[str, Field(frozen=True)]
year: int
power_reserve: int
# key is always at bottom
key: Annotated[
str,
Field(
frozen=True,
default_factory=lambda data: f"{data['brand']}:{data['model']}",
),
]
async def main() -> None:
"""Example."""
# Activate database.
Scruby.run()
# Get collection `Car`.
car_coll = Scruby(Car)
# Create cars.
for num in range(1, 10):
car = Car(
brand="Mazda",
model=f"EZ-6 {num}", # {num} - there is no need to do this, this is just an example
year=2025,
power_reserve=600,
)
await car_coll.add_doc(car)
# Find all cars.
car_list: list[Car] | None = await car_coll.find_many()
if car_list is not None:
pp(car_list)
else:
print("No cars!")
# Find cars by brand and year.
car_list: list[Car] | None = await car_coll.find_many(
filter_fn=lambda doc: doc.brand == "Mazda" and doc.year == 2025,
)
if car_list is not None:
pp(car_list)
else:
print("No cars!")
# Pagination
car_list: list[Car] | None = await car_coll.find_many(
filter_fn=lambda doc: doc.brand == "Mazda",
limit_docs=5,
page_number=2,
)
if car_list is not None:
pp(car_list)
else:
print("No cars!")
# Sorting
car_list: list[Car] | None = await car_coll.find_many(
filter_fn=lambda doc: doc.brand == "Mazda",
sort_fn=lambda doc: (doc.brand, doc.updated_at),
sort_reverse=True,
)
if car_list is not None:
pp(car_list)
else:
print("No cars!")
# Return cars in JSON format
car_list: str | None = await car_coll.find_many(
filter_fn=lambda doc: doc.brand == "Mazda",
return_type=ReturnType.JSON,
)
# Return cars in Dict format
car_list: list[dict] | None = await car_coll.find_many(
filter_fn=lambda doc: doc.brand == "Mazda",
return_type=ReturnType.DICT,
)
# Full database deletion.
# Hint: The main purpose is tests.
Scruby.napalm()
if __name__ == "__main__":
anyio.run(main)