Skip to content

Commit 410b167

Browse files
Introduce if predicate to Func Fluent (#676)
Signed-off-by: Ricardo Zanini <[email protected]>
1 parent 00eb355 commit 410b167

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+943
-614
lines changed

experimental/lambda/src/main/java/io/serverlessworkflow/impl/expressions/func/JavaExpressionFactory.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.serverlessworkflow.impl.WorkflowModelFactory;
2525
import io.serverlessworkflow.impl.expressions.Expression;
2626
import io.serverlessworkflow.impl.expressions.ExpressionFactory;
27+
import io.serverlessworkflow.impl.expressions.TaskMetadataKeys;
2728
import java.util.Optional;
2829
import java.util.function.BiFunction;
2930
import java.util.function.BiPredicate;
@@ -32,7 +33,6 @@
3233

3334
public class JavaExpressionFactory implements ExpressionFactory {
3435

35-
public static final String IF_PREDICATE = "if_predicate";
3636
private final WorkflowModelFactory modelFactory = new JavaModelFactory();
3737
private final Expression dummyExpression =
3838
new Expression() {
@@ -74,7 +74,8 @@ private WorkflowFilter fromPredicate(Predicate pred) {
7474
public Optional<WorkflowFilter> buildIfFilter(TaskBase task) {
7575
TaskMetadata metadata = task.getMetadata();
7676
return metadata != null
77-
&& metadata.getAdditionalProperties().get(IF_PREDICATE) instanceof Predicate pred
77+
&& metadata.getAdditionalProperties().get(TaskMetadataKeys.IF_PREDICATE)
78+
instanceof Predicate pred
7879
? Optional.of(fromPredicate(pred))
7980
: ExpressionFactory.super.buildIfFilter(task);
8081
}

experimental/lambda/src/test/java/io/serverless/workflow/impl/CallTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import io.serverlessworkflow.api.types.func.SwitchCaseFunction;
3434
import io.serverlessworkflow.impl.WorkflowApplication;
3535
import io.serverlessworkflow.impl.WorkflowDefinition;
36-
import io.serverlessworkflow.impl.expressions.func.JavaExpressionFactory;
36+
import io.serverlessworkflow.impl.expressions.TaskMetadataKeys;
3737
import java.util.Collection;
3838
import java.util.List;
3939
import java.util.concurrent.ExecutionException;
@@ -168,7 +168,7 @@ void testIf() throws InterruptedException, ExecutionException {
168168
private <T> CallJava withPredicate(CallJava call, Predicate<T> pred) {
169169
return (CallJava)
170170
call.withMetadata(
171-
new TaskMetadata().withAdditionalProperty(JavaExpressionFactory.IF_PREDICATE, pred));
171+
new TaskMetadata().withAdditionalProperty(TaskMetadataKeys.IF_PREDICATE, pred));
172172
}
173173

174174
public static boolean isEven(Object model, Integer number) {

experimental/lambda/src/test/java/io/serverless/workflow/impl/FluentDSLCallTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ void testForLoop() throws InterruptedException, ExecutionException {
5454
FuncWorkflowBuilder.workflow()
5555
.tasks(
5656
t ->
57-
t.forFn(
57+
t.forEach(
5858
f ->
5959
f.whileC(CallTest::isEven)
6060
.collection(v -> (Collection<?>) v)
@@ -80,9 +80,9 @@ void testSwitch() throws InterruptedException, ExecutionException {
8080
.tasks(
8181
tasks ->
8282
tasks
83-
.switchFn(
83+
.switchCase(
8484
switchOdd ->
85-
switchOdd.items(
85+
switchOdd.functions(
8686
item ->
8787
item.when(CallTest::isOdd).then(FlowDirectiveEnum.END)))
8888
.callFn(callJava -> callJava.function(CallTest::zero)))

fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/HasDelegate.java renamed to experimental/types/src/main/java/io/serverlessworkflow/impl/expressions/TaskMetadataKeys.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package io.serverlessworkflow.fluent.spec;
16+
package io.serverlessworkflow.impl.expressions;
1717

18-
public interface HasDelegate {
18+
public final class TaskMetadataKeys {
1919

20-
Object delegate();
20+
/** Metadata entry name for the DSL’s “when”/“if” predicate. */
21+
public static final String IF_PREDICATE = "if_predicate";
2122
}

fluent/func/src/main/java/io/serverlessworkflow/fluent/func/DelegatingFuncDoTaskFluent.java

Lines changed: 0 additions & 86 deletions
This file was deleted.

fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncCallTaskBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@
1717

1818
import io.serverlessworkflow.api.types.func.CallJava;
1919
import io.serverlessworkflow.api.types.func.CallTaskJava;
20+
import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder;
21+
import io.serverlessworkflow.fluent.func.spi.FuncTransformations;
2022
import io.serverlessworkflow.fluent.spec.TaskBaseBuilder;
2123
import java.util.function.Function;
2224

2325
public class FuncCallTaskBuilder extends TaskBaseBuilder<FuncCallTaskBuilder>
24-
implements FuncTransformations<FuncCallTaskBuilder> {
26+
implements FuncTransformations<FuncCallTaskBuilder>,
27+
ConditionalTaskBuilder<FuncCallTaskBuilder> {
2528

2629
private CallTaskJava callTaskJava;
2730

fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncDoTaskBuilder.java

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,16 @@
1515
*/
1616
package io.serverlessworkflow.fluent.func;
1717

18+
import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder;
19+
import io.serverlessworkflow.fluent.func.spi.FuncDoFluent;
20+
import io.serverlessworkflow.fluent.func.spi.FuncTransformations;
1821
import io.serverlessworkflow.fluent.spec.BaseDoTaskBuilder;
22+
import java.util.function.Consumer;
1923

2024
public class FuncDoTaskBuilder extends BaseDoTaskBuilder<FuncDoTaskBuilder, FuncTaskItemListBuilder>
2125
implements FuncTransformations<FuncDoTaskBuilder>,
22-
DelegatingFuncDoTaskFluent<FuncDoTaskBuilder> {
26+
ConditionalTaskBuilder<FuncDoTaskBuilder>,
27+
FuncDoFluent<FuncDoTaskBuilder> {
2328

2429
public FuncDoTaskBuilder() {
2530
super(new FuncTaskItemListBuilder());
@@ -29,4 +34,47 @@ public FuncDoTaskBuilder() {
2934
public FuncDoTaskBuilder self() {
3035
return this;
3136
}
37+
38+
@Override
39+
public FuncDoTaskBuilder emit(String name, Consumer<FuncEmitTaskBuilder> itemsConfigurer) {
40+
this.listBuilder().emit(name, itemsConfigurer);
41+
return this;
42+
}
43+
44+
@Override
45+
public FuncDoTaskBuilder forEach(String name, Consumer<FuncForTaskBuilder> itemsConfigurer) {
46+
this.listBuilder().forEach(name, itemsConfigurer);
47+
return this;
48+
}
49+
50+
@Override
51+
public FuncDoTaskBuilder set(String name, Consumer<FuncSetTaskBuilder> itemsConfigurer) {
52+
this.listBuilder().set(name, itemsConfigurer);
53+
return this;
54+
}
55+
56+
@Override
57+
public FuncDoTaskBuilder set(String name, String expr) {
58+
this.listBuilder().set(name, expr);
59+
return this;
60+
}
61+
62+
@Override
63+
public FuncDoTaskBuilder switchCase(
64+
String name, Consumer<FuncSwitchTaskBuilder> itemsConfigurer) {
65+
this.listBuilder().switchCase(name, itemsConfigurer);
66+
return this;
67+
}
68+
69+
@Override
70+
public FuncDoTaskBuilder callFn(String name, Consumer<FuncCallTaskBuilder> cfg) {
71+
this.listBuilder().callFn(name, cfg);
72+
return this;
73+
}
74+
75+
@Override
76+
public FuncDoTaskBuilder fork(String name, Consumer<FuncForkTaskBuilder> itemsConfigurer) {
77+
this.listBuilder().fork(name, itemsConfigurer);
78+
return this;
79+
}
3280
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* Copyright 2020-Present The Serverless Workflow Specification Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.serverlessworkflow.fluent.func;
17+
18+
import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder;
19+
import io.serverlessworkflow.fluent.spec.EmitTaskBuilder;
20+
21+
public class FuncEmitTaskBuilder extends EmitTaskBuilder
22+
implements ConditionalTaskBuilder<FuncSetTaskBuilder> {
23+
FuncEmitTaskBuilder() {
24+
super();
25+
}
26+
}

fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncForTaskBuilder.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@
2121
import io.serverlessworkflow.api.types.func.CallJava;
2222
import io.serverlessworkflow.api.types.func.CallTaskJava;
2323
import io.serverlessworkflow.api.types.func.ForTaskFunction;
24+
import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder;
25+
import io.serverlessworkflow.fluent.func.spi.FuncTransformations;
2426
import io.serverlessworkflow.fluent.spec.TaskBaseBuilder;
27+
import io.serverlessworkflow.fluent.spec.spi.ForEachTaskFluent;
2528
import io.serverlessworkflow.impl.expressions.LoopFunction;
2629
import io.serverlessworkflow.impl.expressions.LoopPredicate;
2730
import io.serverlessworkflow.impl.expressions.LoopPredicateIndex;
@@ -33,7 +36,9 @@
3336
import java.util.function.Function;
3437

3538
public class FuncForTaskBuilder extends TaskBaseBuilder<FuncForTaskBuilder>
36-
implements FuncTransformations<FuncForTaskBuilder> {
39+
implements FuncTransformations<FuncForTaskBuilder>,
40+
ConditionalTaskBuilder<FuncForTaskBuilder>,
41+
ForEachTaskFluent<FuncForTaskBuilder, FuncTaskItemListBuilder> {
3742

3843
private final ForTaskFunction forTaskFunction;
3944
private final List<TaskItem> items;
@@ -81,6 +86,30 @@ public <T, V, R> FuncForTaskBuilder tasks(LoopFunction<T, V, R> function) {
8186
return this.tasks(UUID.randomUUID().toString(), function);
8287
}
8388

89+
@Override
90+
public FuncForTaskBuilder each(String each) {
91+
this.forTaskFunction.getFor().withEach(each);
92+
return this;
93+
}
94+
95+
@Override
96+
public FuncForTaskBuilder in(String in) {
97+
this.forTaskFunction.getFor().withIn(in);
98+
return this;
99+
}
100+
101+
@Override
102+
public FuncForTaskBuilder at(String at) {
103+
this.forTaskFunction.getFor().withAt(at);
104+
return this;
105+
}
106+
107+
@Override
108+
public FuncForTaskBuilder whileC(String expression) {
109+
this.forTaskFunction.setWhile(expression);
110+
return this;
111+
}
112+
84113
public FuncForTaskBuilder tasks(Consumer<FuncTaskItemListBuilder> consumer) {
85114
final FuncTaskItemListBuilder builder = new FuncTaskItemListBuilder();
86115
consumer.accept(builder);

fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncForkTaskBuilder.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,20 @@
2121
import io.serverlessworkflow.api.types.TaskItem;
2222
import io.serverlessworkflow.api.types.func.CallJava;
2323
import io.serverlessworkflow.api.types.func.CallTaskJava;
24+
import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder;
25+
import io.serverlessworkflow.fluent.func.spi.FuncTransformations;
2426
import io.serverlessworkflow.fluent.spec.TaskBaseBuilder;
27+
import io.serverlessworkflow.fluent.spec.spi.ForkTaskFluent;
2528
import java.util.ArrayList;
2629
import java.util.List;
2730
import java.util.UUID;
2831
import java.util.function.Consumer;
2932
import java.util.function.Function;
3033

3134
public class FuncForkTaskBuilder extends TaskBaseBuilder<FuncForkTaskBuilder>
32-
implements FuncTransformations<FuncForkTaskBuilder> {
35+
implements FuncTransformations<FuncForkTaskBuilder>,
36+
ConditionalTaskBuilder<FuncForkTaskBuilder>,
37+
ForkTaskFluent<FuncForkTaskBuilder, FuncTaskItemListBuilder> {
3338

3439
private final ForkTask forkTask;
3540
private final List<TaskItem> items;
@@ -55,18 +60,21 @@ public <T, V> FuncForkTaskBuilder branch(Function<T, V> function) {
5560
return this.branch(UUID.randomUUID().toString(), function);
5661
}
5762

63+
@Override
5864
public FuncForkTaskBuilder branches(Consumer<FuncTaskItemListBuilder> consumer) {
5965
final FuncTaskItemListBuilder builder = new FuncTaskItemListBuilder();
6066
consumer.accept(builder);
6167
this.items.addAll(builder.build());
6268
return this;
6369
}
6470

71+
@Override
6572
public FuncForkTaskBuilder compete(boolean compete) {
6673
this.forkTask.getFork().setCompete(compete);
6774
return this;
6875
}
6976

77+
@Override
7078
public ForkTask build() {
7179
this.forkTask.getFork().setBranches(this.items);
7280
return forkTask;

0 commit comments

Comments
 (0)