Skip to content

[Fix_708] Fixing recursivity when using then loop #710

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ public abstract class AbstractTaskExecutor<T extends TaskBase> implements TaskEx
private final Optional<SchemaValidator> contextSchemaValidator;
private final Optional<WorkflowPredicate> ifFilter;

public abstract static class AbstractTaskExecutorBuilder<T extends TaskBase>
public abstract static class AbstractTaskExecutorBuilder<
T extends TaskBase, V extends AbstractTaskExecutor<T>>
implements TaskExecutorBuilder<T> {
private Optional<WorkflowFilter> inputProcessor = Optional.empty();
private Optional<WorkflowFilter> outputProcessor = Optional.empty();
Expand All @@ -77,7 +78,7 @@ public abstract static class AbstractTaskExecutorBuilder<T extends TaskBase>
protected final Workflow workflow;
protected final ResourceLoader resourceLoader;

private TaskExecutor<T> instance;
private V instance;

protected AbstractTaskExecutorBuilder(
WorkflowMutablePosition position,
Expand Down Expand Up @@ -145,17 +146,20 @@ private TaskExecutorBuilder<?> next(Map<String, TaskExecutorBuilder<?>> connecti
return next;
}

public TaskExecutor<T> build() {
public V build() {
if (instance == null) {
instance = buildInstance();
buildTransition(instance);
}
return instance;
}

protected abstract TaskExecutor<T> buildInstance();
protected abstract V buildInstance();

protected abstract void buildTransition(V instance);
}

protected AbstractTaskExecutor(AbstractTaskExecutorBuilder<T> builder) {
protected AbstractTaskExecutor(AbstractTaskExecutorBuilder<T, ?> builder) {
this.task = builder.task;
this.taskName = builder.taskName;
this.position = builder.position;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ protected CallTaskExecutorBuilder(
}

@Override
public TaskExecutor<T> buildInstance() {
public CallTaskExecutor<T> buildInstance() {
return new CallTaskExecutor<>(this);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ protected DoExecutorBuilder(
}

@Override
public TaskExecutor<DoTask> buildInstance() {
public DoExecutor buildInstance() {
return new DoExecutor(this);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ protected EmitExecutorBuilder(
}

@Override
public TaskExecutor<EmitTask> buildInstance() {
public EmitExecutor buildInstance() {
return new EmitExecutor(this);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ protected WorkflowValueResolver<Collection<?>> buildCollectionFilter() {
}

@Override
public TaskExecutor<ForTask> buildInstance() {
public ForExecutor buildInstance() {
return new ForExecutor(this);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ protected ForkExecutorBuilder(
}

@Override
public TaskExecutor<ForkTask> buildInstance() {
public ForkExecutor buildInstance() {
return new ForkExecutor(this);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ private EventRegistrationBuilder from(EventFilter filter) {
}

@Override
public TaskExecutor<ListenTask> buildInstance() {
public ListenExecutor buildInstance() {
return registrations.isAnd() ? new AndListenExecutor(this) : new OrListenExecutor(this);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ private Error findError(String raiseErrorReference) {
}

@Override
public TaskExecutor<RaiseTask> buildInstance() {
public RaiseExecutor buildInstance() {
return new RaiseExecutor(this);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,14 @@

public abstract class RegularTaskExecutor<T extends TaskBase> extends AbstractTaskExecutor<T> {

protected final TransitionInfo transition;
protected TransitionInfo transition;

protected RegularTaskExecutor(RegularTaskExecutorBuilder<T> builder) {
super(builder);
this.transition = TransitionInfo.build(builder.transition);
}

public abstract static class RegularTaskExecutorBuilder<T extends TaskBase>
extends AbstractTaskExecutorBuilder<T> {
extends AbstractTaskExecutorBuilder<T, RegularTaskExecutor<T>> {

private TransitionInfoBuilder transition;

Expand All @@ -52,6 +51,11 @@ protected RegularTaskExecutorBuilder(
public void connect(Map<String, TaskExecutorBuilder<?>> connections) {
this.transition = next(task.getThen(), connections);
}

@Override
protected void buildTransition(RegularTaskExecutor<T> instance) {
instance.transition = TransitionInfo.build(transition);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ protected SetExecutorBuilder(
}

@Override
public TaskExecutor<SetTask> buildInstance() {
public SetExecutor buildInstance() {
return new SetExecutor(this);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ public class SwitchExecutor extends AbstractTaskExecutor<SwitchTask> {
private final Map<WorkflowPredicate, TransitionInfo> workflowFilters;
private final TransitionInfo defaultTask;

public static class SwitchExecutorBuilder extends AbstractTaskExecutorBuilder<SwitchTask> {
public static class SwitchExecutorBuilder
extends AbstractTaskExecutorBuilder<SwitchTask, SwitchExecutor> {
private final Map<SwitchCase, WorkflowPredicate> workflowFilters = new HashMap<>();
private Map<WorkflowPredicate, TransitionInfoBuilder> switchFilters = new HashMap<>();
private FlowDirective defaultDirective;
Expand Down Expand Up @@ -77,9 +78,12 @@ public void connect(Map<String, TaskExecutorBuilder<?>> connections) {
}

@Override
protected TaskExecutor<SwitchTask> buildInstance() {
protected SwitchExecutor buildInstance() {
return new SwitchExecutor(this);
}

@Override
protected void buildTransition(SwitchExecutor ex) {}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ protected TryExecutorBuilder(
}

@Override
public TaskExecutor<TryTask> buildInstance() {
public TryExecutor buildInstance() {
return new TryExecutor(this);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ private Duration toLong(DurationInline durationInline) {
}

@Override
public TaskExecutor<WaitTask> buildInstance() {
public WaitExecutor buildInstance() {
return new WaitExecutor(this);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ private static Stream<Arguments> provideParameters() {
"for-sum.yaml",
Map.of("input", Arrays.asList(1, 2, 3)),
o -> assertThat(o).isEqualTo(6)),
args(
"switch-then-loop.yaml",
Map.of("count", 1),
o -> assertThat(o).isEqualTo(Map.of("count", 6))),
args(
"for-collect.yaml",
Map.of("input", Arrays.asList(1, 2, 3)),
Expand Down
18 changes: 18 additions & 0 deletions impl/jackson/src/test/resources/switch-then-loop.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
document:
dsl: 1.0.0-alpha5
namespace: test
name: switch-loop
version: 0.1.0
do:
- inc:
set:
count: ${.count+1}
then: looping
- looping:
switch:
- loopCount:
when: .count < 6
then: inc
- default:
then: exit