resultTypeToken,
+ SerDes resultSerDes,
+ ConcurrencyConfig config,
+ DurableContext durableContext) {
+ super(operationId, name, OperationSubType.MAP_ITERATION, config, durableContext);
+ this.func = func;
+ this.iterations = new ArrayList<>();
+ this.branchResultTypeToken = resultTypeToken;
+ this.serDes = resultSerDes;
+ this.collection = collection;
+ }
+
+ /** Starts the operation. */
+ @Override
+ protected void start() {
+ sendOperationUpdateAsync(
+ OperationUpdate.builder().action(OperationAction.START).subType(OperationSubType.MAP.getValue()));
+ for (var item : collection) {
+ int index = iterations.size();
+ iterations.add(branchInternal(
+ getName() + "-iteration-" + index,
+ branchResultTypeToken,
+ serDes,
+ (ctx) -> func.apply(ctx, item, index)));
+ }
+ }
+
+ /**
+ * Replays the operation.
+ *
+ * @param existing
+ */
+ @Override
+ protected void replay(Operation existing) {
+ switch (existing.status()) {
+ case SUCCEEDED, FAILED -> markAlreadyCompleted();
+ case STARTED -> start();
+ }
+ }
+
+ /**
+ * Blocks until the operation completes and returns the result.
+ *
+ * This delegates to operation.get() which handles: - Thread deregistration (allows suspension) - Thread
+ * reactivation (resumes execution) - Result retrieval
+ *
+ * @return the operation result
+ */
+ @Override
+ public BatchResult get() {
+ waitForOperationCompletion();
+ // build the batch results
+ //
+ return new BatchResult<>();
+ }
+}
diff --git a/sdk/src/main/java/software/amazon/lambda/durable/operation/ParallelOperation.java b/sdk/src/main/java/software/amazon/lambda/durable/operation/ParallelOperation.java
new file mode 100644
index 000000000..15e9eac11
--- /dev/null
+++ b/sdk/src/main/java/software/amazon/lambda/durable/operation/ParallelOperation.java
@@ -0,0 +1,60 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+package software.amazon.lambda.durable.operation;
+
+import java.util.function.Function;
+import software.amazon.awssdk.services.lambda.model.Operation;
+import software.amazon.awssdk.services.lambda.model.OperationAction;
+import software.amazon.awssdk.services.lambda.model.OperationUpdate;
+import software.amazon.lambda.durable.ConcurrencyConfig;
+import software.amazon.lambda.durable.DurableContext;
+import software.amazon.lambda.durable.DurableFuture;
+import software.amazon.lambda.durable.DurableParallelFuture;
+import software.amazon.lambda.durable.ParallelResult;
+import software.amazon.lambda.durable.TypeToken;
+import software.amazon.lambda.durable.model.OperationSubType;
+import software.amazon.lambda.durable.serde.SerDes;
+
+public class ParallelOperation extends BaseConcurrentOperation implements DurableParallelFuture {
+
+ public ParallelOperation(String operationId, String name, ConcurrencyConfig config, DurableContext durableContext) {
+ super(operationId, name, OperationSubType.PARALLEL_BRANCH, config, durableContext);
+ }
+
+ public DurableFuture branch(
+ String name, TypeToken resultType, SerDes resultSerDes, Function func) {
+ return branchInternal(name, resultType, resultSerDes, func);
+ }
+
+ /** Starts the operation. */
+ @Override
+ protected void start() {
+ sendOperationUpdateAsync(
+ OperationUpdate.builder().action(OperationAction.START).subType(OperationSubType.PARALLEL.getValue()));
+ }
+
+ /** Replays the operation. */
+ @Override
+ protected void replay(Operation existing) {
+ // always replay the branches
+
+ }
+
+ /**
+ * Blocks until the operation completes and returns the result.
+ *
+ * This delegates to operation.get() which handles: - Thread deregistration (allows suspension) - Thread
+ * reactivation (resumes execution) - Result retrieval
+ *
+ * @return the operation result
+ */
+ @Override
+ public ParallelResult get() {
+ // wait for all to complete
+ waitForOperationCompletion();
+
+ // This method only returns stats of the branches (succeeded, failed, etc)
+ // Users need to use each branch to check for the result or error.
+ return new ParallelResult();
+ }
+}
diff --git a/sdk/src/test/java/software/amazon/lambda/durable/operation/ChildContextOperationTest.java b/sdk/src/test/java/software/amazon/lambda/durable/operation/ChildContextOperationTest.java
index 9ad9ba084..a60804179 100644
--- a/sdk/src/test/java/software/amazon/lambda/durable/operation/ChildContextOperationTest.java
+++ b/sdk/src/test/java/software/amazon/lambda/durable/operation/ChildContextOperationTest.java
@@ -58,7 +58,8 @@ private ChildContextOperation createOperation(
OperationSubType.RUN_IN_CHILD_CONTEXT,
TypeToken.get(String.class),
SERDES,
- durableContext);
+ durableContext,
+ null);
}
// ===== SUCCEEDED replay =====