diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaForExecutorBuilder.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaForExecutorBuilder.java index 08fd5c28..672f6aca 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaForExecutorBuilder.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaForExecutorBuilder.java @@ -54,11 +54,10 @@ protected Optional buildWhileFilter() { return application .modelFactory() .from( - item == null - || whilePred.test( - n.asJavaObject(), - item, - (Integer) safeObject(t.variables().get(indexName)))); + whilePred.test( + n.asJavaObject(), + item, + (Integer) safeObject(t.variables().get(indexName)))); }); } } diff --git a/experimental/lambda/src/test/java/io/serverless/workflow/impl/CallTest.java b/experimental/lambda/src/test/java/io/serverless/workflow/impl/CallTest.java index 04543004..b32fd5e7 100644 --- a/experimental/lambda/src/test/java/io/serverless/workflow/impl/CallTest.java +++ b/experimental/lambda/src/test/java/io/serverless/workflow/impl/CallTest.java @@ -96,7 +96,7 @@ void testForLoop() throws InterruptedException, ExecutionException { assertThat( app.workflowDefinition(workflow) - .instance(List.of(2, 4, 6)) + .instance(List.of(2, 4, 6, 7)) .start() .get() .asNumber() diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ForExecutor.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ForExecutor.java index e0aa8d29..977152ec 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ForExecutor.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ForExecutor.java @@ -83,19 +83,22 @@ protected CompletableFuture internalExecute( int i = 0; CompletableFuture future = CompletableFuture.completedFuture(taskContext.input()); - while (iter.hasNext() - && whileExpr - .map(w -> w.apply(workflow, taskContext, taskContext.rawOutput())) - .map(n -> n.asBoolean().orElse(true)) - .orElse(true)) { + while (iter.hasNext()) { WorkflowModel item = iter.next(); taskContext.variables().put(task.getFor().getEach(), item); taskContext.variables().put(task.getFor().getAt(), i++); - future = - future.thenCompose( - input -> - TaskExecutorHelper.processTaskList( - taskExecutor, workflow, Optional.of(taskContext), input)); + if (whileExpr + .map(w -> w.apply(workflow, taskContext, taskContext.input())) + .map(n -> n.asBoolean().orElse(true)) + .orElse(true)) { + future = + future.thenCompose( + input -> + TaskExecutorHelper.processTaskList( + taskExecutor, workflow, Optional.of(taskContext), input)); + } else { + break; + } } return future; }