Skip to content

Commit e9aacd3

Browse files
committed
docs: map
- Replace Python-centric page with language-neutral rewrite - Add TypeScript, Python, and Java examples for all sections - Add Map Function subsection under Method signature with per-language type signatures and parameter docs - Document MapResult (Java) vs BatchResult (TS/Python) difference - Document SKIPPED status in Java vs STARTED in TS/Python - Fix completion strategy tables in map.md and parallel.md (were collapsed by mdformat; fixed with mdformat-gfm tables extension) - Remove item_batcher from MapConfig docs (not implemented) - Remove ToC, Terminology, Key Features, Best Practices, Performance Tips, FAQ, Testing sections closes #19, closes #22, closes #74, closes #56, closes #93, closes #94, ref #96
1 parent e10bf21 commit e9aacd3

26 files changed

Lines changed: 1019 additions & 338 deletions

docs/sdk-reference/operations/map.md

Lines changed: 475 additions & 338 deletions
Large diffs are not rendered by default.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import java.util.List;
2+
import software.amazon.lambda.durable.DurableContext;
3+
import software.amazon.lambda.durable.DurableHandler;
4+
import software.amazon.lambda.durable.config.CompletionConfig;
5+
import software.amazon.lambda.durable.config.MapConfig;
6+
import software.amazon.lambda.durable.model.MapResult;
7+
8+
public class MapCompletionConfig extends DurableHandler<List<String>, List<String>> {
9+
@Override
10+
public List<String> handleRequest(List<String> items, DurableContext context) {
11+
var config = MapConfig.builder()
12+
.completionConfig(CompletionConfig.minSuccessful(3))
13+
.build();
14+
15+
MapResult<String> result = context.map(
16+
"process-items",
17+
items,
18+
String.class,
19+
(item, index, ctx) -> ctx.step(
20+
"process-" + index, String.class, s -> item.toUpperCase()),
21+
config);
22+
23+
return result.succeeded();
24+
}
25+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import java.util.List;
2+
import software.amazon.lambda.durable.DurableContext;
3+
import software.amazon.lambda.durable.DurableHandler;
4+
import software.amazon.lambda.durable.model.MapResult;
5+
6+
public class MapErrorHandling extends DurableHandler<List<String>, Void> {
7+
@Override
8+
public Void handleRequest(List<String> items, DurableContext context) {
9+
MapResult<String> result = context.map(
10+
"process-items",
11+
items,
12+
String.class,
13+
(item, index, ctx) -> ctx.step("process-" + index, String.class, s -> {
14+
if ("bad".equals(item)) throw new IllegalArgumentException("bad item");
15+
return item.toUpperCase();
16+
}));
17+
18+
var failures = result.failed();
19+
if (!failures.isEmpty()) {
20+
System.out.println(failures.size() + " items failed");
21+
failures.forEach(e -> System.out.println(e.errorType() + ": " + e.errorMessage()));
22+
}
23+
24+
var successes = result.succeeded();
25+
System.out.println(successes.size() + " items succeeded: " + successes);
26+
return null;
27+
}
28+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import java.net.URI;
2+
import java.net.http.HttpClient;
3+
import java.net.http.HttpRequest;
4+
import java.net.http.HttpResponse;
5+
import java.util.List;
6+
import software.amazon.lambda.durable.DurableContext;
7+
import software.amazon.lambda.durable.DurableHandler;
8+
import software.amazon.lambda.durable.config.CompletionConfig;
9+
import software.amazon.lambda.durable.config.MapConfig;
10+
import software.amazon.lambda.durable.model.MapResult;
11+
12+
public class MapConfigExample extends DurableHandler<List<String>, List<String>> {
13+
private static final HttpClient HTTP = HttpClient.newHttpClient();
14+
15+
@Override
16+
public List<String> handleRequest(List<String> urls, DurableContext context) {
17+
var config = MapConfig.builder()
18+
.maxConcurrency(5)
19+
.completionConfig(CompletionConfig.toleratedFailureCount(2))
20+
.build();
21+
22+
MapResult<String> result = context.map(
23+
"fetch-urls",
24+
urls,
25+
String.class,
26+
(url, index, ctx) -> ctx.step("fetch-" + index, String.class, s -> {
27+
var request = HttpRequest.newBuilder(URI.create(url)).build();
28+
return HTTP.send(request, HttpResponse.BodyHandlers.ofString()).body();
29+
}),
30+
config);
31+
32+
return result.succeeded();
33+
}
34+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import software.amazon.lambda.durable.DurableContext;
2+
3+
record Order(String id, double amount) {}
4+
record Receipt(String orderId, double charged) {}
5+
6+
// MapFunction<Order, Receipt> implementation
7+
Receipt processOrder(Order order, int index, DurableContext ctx) {
8+
var validated = ctx.step("validate", Order.class, s -> {
9+
if (order.amount() <= 0) throw new IllegalArgumentException("Invalid amount");
10+
return order;
11+
});
12+
var charged = ctx.step("charge", Double.class, s -> validated.amount());
13+
return new Receipt(validated.id(), charged);
14+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// sync — blocks until all items complete
2+
<I, O> MapResult<O> map(String name, Collection<I> items, Class<O> resultType,
3+
MapFunction<I, O> function)
4+
<I, O> MapResult<O> map(String name, Collection<I> items, Class<O> resultType,
5+
MapFunction<I, O> function, MapConfig config)
6+
<I, O> MapResult<O> map(String name, Collection<I> items, TypeToken<O> resultType,
7+
MapFunction<I, O> function)
8+
<I, O> MapResult<O> map(String name, Collection<I> items, TypeToken<O> resultType,
9+
MapFunction<I, O> function, MapConfig config)
10+
11+
// async — returns immediately
12+
<I, O> DurableFuture<MapResult<O>> mapAsync(String name, Collection<I> items,
13+
Class<O> resultType, MapFunction<I, O> function)
14+
<I, O> DurableFuture<MapResult<O>> mapAsync(String name, Collection<I> items,
15+
Class<O> resultType, MapFunction<I, O> function,
16+
MapConfig config)
17+
<I, O> DurableFuture<MapResult<O>> mapAsync(String name, Collection<I> items,
18+
TypeToken<O> resultType, MapFunction<I, O> function)
19+
<I, O> DurableFuture<MapResult<O>> mapAsync(String name, Collection<I> items,
20+
TypeToken<O> resultType, MapFunction<I, O> function,
21+
MapConfig config)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import java.util.List;
2+
import software.amazon.lambda.durable.DurableContext;
3+
import software.amazon.lambda.durable.DurableHandler;
4+
import software.amazon.lambda.durable.model.MapResult;
5+
6+
public class NamedMap extends DurableHandler<List<String>, List<String>> {
7+
@Override
8+
public List<String> handleRequest(List<String> userIds, DurableContext context) {
9+
// The name is always required in Java
10+
MapResult<String> result = context.map(
11+
"process-users",
12+
userIds,
13+
String.class,
14+
(userId, index, ctx) -> ctx.step(
15+
"process-" + index, String.class, s -> "processed-" + userId));
16+
17+
return result.succeeded();
18+
}
19+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import java.util.List;
2+
import software.amazon.lambda.durable.DurableContext;
3+
import software.amazon.lambda.durable.DurableHandler;
4+
import software.amazon.lambda.durable.TypeToken;
5+
import software.amazon.lambda.durable.model.MapResult;
6+
7+
public class NestedMap extends DurableHandler<List<Region>, List<List<String>>> {
8+
record Region(String name, List<String> items) {}
9+
10+
@Override
11+
public List<List<String>> handleRequest(List<Region> regions, DurableContext context) {
12+
MapResult<List<String>> result = context.map(
13+
"process-regions",
14+
regions,
15+
new TypeToken<List<String>>() {},
16+
(region, index, ctx) -> {
17+
MapResult<String> inner = ctx.map(
18+
"process-" + region.name(),
19+
region.items(),
20+
String.class,
21+
(item, i, innerCtx) -> innerCtx.step(
22+
"item-" + i, String.class, s -> item.toUpperCase()));
23+
return inner.succeeded();
24+
});
25+
26+
return result.succeeded();
27+
}
28+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import java.util.List;
2+
import software.amazon.lambda.durable.DurableContext;
3+
import software.amazon.lambda.durable.DurableHandler;
4+
import software.amazon.lambda.durable.model.MapResult;
5+
6+
public class SimpleMap extends DurableHandler<Void, List<Integer>> {
7+
@Override
8+
public List<Integer> handleRequest(Void input, DurableContext context) {
9+
MapResult<Integer> result = context.map(
10+
"square-numbers",
11+
List.of(1, 2, 3, 4, 5),
12+
Integer.class,
13+
(item, index, ctx) -> ctx.step(
14+
"square-" + index, Integer.class, s -> item * item));
15+
16+
return result.results();
17+
}
18+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from aws_durable_execution_sdk_python import (
2+
BatchResult,
3+
DurableContext,
4+
durable_execution,
5+
)
6+
from aws_durable_execution_sdk_python.config import CompletionConfig, MapConfig
7+
8+
9+
def process_item(
10+
ctx: DurableContext, item: str, index: int, items: list[str]
11+
) -> str:
12+
return ctx.step(lambda _: item.upper(), name=f"process-{index}")
13+
14+
15+
@durable_execution
16+
def handler(event: dict, context: DurableContext) -> list[str]:
17+
config = MapConfig(
18+
completion_config=CompletionConfig(min_successful=3),
19+
)
20+
result: BatchResult[str] = context.map(
21+
event["items"],
22+
process_item,
23+
name="process-items",
24+
config=config,
25+
)
26+
return result.to_dict()

0 commit comments

Comments
 (0)