Skip to content

Commit f9d3ff2

Browse files
em-1618: adding query models from index method
1 parent 40ad67f commit f9d3ff2

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

nhs_aws_helpers/dynamodb_model_store/base_model_store.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,25 @@ async def paginate_models(
561561
last_evaluated_key=last_evaluated_key,
562562
)
563563

564+
async def query_models_from_index(
565+
self,
566+
model_type: Type[TBaseModel_co],
567+
index_name: str,
568+
max_concurrency=10,
569+
**kwargs,
570+
) -> PagedItems[TBaseModel_co]:
571+
items, last_evaluated_key = await self.query_items(IndexName=index_name, **kwargs)
572+
model_keys = [model_type.model_key_from_item(item) for item in items]
573+
models = [
574+
cast(TBaseModel_co, record)
575+
for record in await self.batch_get_model(model_keys, max_concurrency=max_concurrency)
576+
if record
577+
]
578+
return PagedItems(
579+
items=models,
580+
last_evaluated_key=last_evaluated_key,
581+
)
582+
564583
async def paginate_models_from_index(
565584
self,
566585
paginator_type: Literal["query", "scan", "list_backups", "list_tables"],

tests/base_model_store_tests.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,18 @@
44
from dataclasses import dataclass, field
55
from datetime import date, datetime
66
from enum import Enum
7-
from typing import Any, Dict, Generator, List, Mapping, Optional, Type, TypedDict, Union, cast
7+
from typing import (
8+
Any,
9+
Dict,
10+
Generator,
11+
List,
12+
Mapping,
13+
Optional,
14+
Type,
15+
TypedDict,
16+
Union,
17+
cast,
18+
)
819
from uuid import uuid4
920

1021
import petname # type: ignore[import]
@@ -744,6 +755,24 @@ async def test_paginate_models_from_index(store: MyModelStore):
744755
assert all(isinstance(model, AnotherModel) for model in page.items)
745756

746757

758+
async def test_query_models_from_index(store: MyModelStore):
759+
async with store.batch_writer() as writer:
760+
for i in range(100):
761+
await writer.put_item(AnotherModel(id="1", sk_field=f"SK:{i}"))
762+
763+
764+
response = await store.query_models_from_index(
765+
model_type=AnotherModel,
766+
index_name="gsi_model_type",
767+
KeyConditionExpression=Key("model_type").eq(AnotherModel.__name__),
768+
Limit=40,
769+
)
770+
771+
assert len(response.items) == 40
772+
assert all(isinstance(model, AnotherModel) for model in response.items)
773+
assert response.last_evaluated_key == {"model_type": "AnotherModel", "my_pk": "BB#1", "my_sk": "SK:47"}
774+
775+
747776
async def test_paged_items():
748777
has_size = PagedItems(items=[1, 2, 3], last_evaluated_key={"my_pk": 123})
749778
assert has_size

0 commit comments

Comments
 (0)