Skip to content

Commit 63ad7d8

Browse files
committed
Add if predicate support
Signed-off-by: fjtirado <[email protected]>
1 parent 81073cc commit 63ad7d8

File tree

6 files changed

+67
-4
lines changed

6 files changed

+67
-4
lines changed

experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaForExecutorBuilder.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ protected JavaForExecutorBuilder(
3939
WorkflowApplication application,
4040
ResourceLoader resourceLoader) {
4141
super(position, task, workflow, application, resourceLoader);
42-
if (task instanceof ForTaskFunction taskFunctions) {}
4342
}
4443

4544
protected Optional<WorkflowFilter> buildWhileFilter() {

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,24 @@
1515
*/
1616
package io.serverlessworkflow.impl.expressions.func;
1717

18+
import io.serverlessworkflow.api.types.TaskBase;
19+
import io.serverlessworkflow.api.types.TaskMetadata;
1820
import io.serverlessworkflow.impl.TaskContext;
1921
import io.serverlessworkflow.impl.WorkflowContext;
2022
import io.serverlessworkflow.impl.WorkflowFilter;
2123
import io.serverlessworkflow.impl.WorkflowModel;
2224
import io.serverlessworkflow.impl.WorkflowModelFactory;
2325
import io.serverlessworkflow.impl.expressions.Expression;
2426
import io.serverlessworkflow.impl.expressions.ExpressionFactory;
27+
import java.util.Optional;
2528
import java.util.function.BiFunction;
2629
import java.util.function.BiPredicate;
2730
import java.util.function.Function;
2831
import java.util.function.Predicate;
2932

3033
public class JavaExpressionFactory implements ExpressionFactory {
3134

35+
public static final String IF_PREDICATE = "if_predicate";
3236
private final WorkflowModelFactory modelFactory = new JavaModelFactory();
3337
private final Expression dummyExpression =
3438
new Expression() {
@@ -49,7 +53,7 @@ public WorkflowFilter buildFilter(String expr, Object value) {
4953
if (value instanceof Function func) {
5054
return (w, t, n) -> modelFactory.fromAny(func.apply(n.asJavaObject()));
5155
} else if (value instanceof Predicate pred) {
52-
return (w, t, n) -> modelFactory.from(pred.test(n.asJavaObject()));
56+
return fromPredicate(pred);
5357
} else if (value instanceof BiPredicate pred) {
5458
return (w, t, n) -> modelFactory.from(pred.test(w, t));
5559
} else if (value instanceof BiFunction func) {
@@ -61,6 +65,20 @@ public WorkflowFilter buildFilter(String expr, Object value) {
6165
}
6266
}
6367

68+
@SuppressWarnings({"rawtypes", "unchecked"})
69+
private WorkflowFilter fromPredicate(Predicate pred) {
70+
return (w, t, n) -> modelFactory.from(pred.test(n.asJavaObject()));
71+
}
72+
73+
@Override
74+
public Optional<WorkflowFilter> buildIfFilter(TaskBase task) {
75+
TaskMetadata metadata = task.getMetadata();
76+
return metadata != null
77+
&& metadata.getAdditionalProperties().get(IF_PREDICATE) instanceof Predicate pred
78+
? Optional.of(fromPredicate(pred))
79+
: ExpressionFactory.super.buildIfFilter(task);
80+
}
81+
6482
@Override
6583
public WorkflowModelFactory modelFactory() {
6684
return modelFactory;

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,19 @@
2525
import io.serverlessworkflow.api.types.SwitchTask;
2626
import io.serverlessworkflow.api.types.Task;
2727
import io.serverlessworkflow.api.types.TaskItem;
28+
import io.serverlessworkflow.api.types.TaskMetadata;
2829
import io.serverlessworkflow.api.types.Workflow;
2930
import io.serverlessworkflow.api.types.func.CallJava;
3031
import io.serverlessworkflow.api.types.func.CallTaskJava;
3132
import io.serverlessworkflow.api.types.func.ForTaskFunction;
3233
import io.serverlessworkflow.api.types.func.SwitchCaseFunction;
3334
import io.serverlessworkflow.impl.WorkflowApplication;
3435
import io.serverlessworkflow.impl.WorkflowDefinition;
36+
import io.serverlessworkflow.impl.expressions.func.JavaExpressionFactory;
3537
import java.util.Collection;
3638
import java.util.List;
3739
import java.util.concurrent.ExecutionException;
40+
import java.util.function.Predicate;
3841
import org.junit.jupiter.api.Test;
3942

4043
class CallTest {
@@ -140,6 +143,35 @@ void testSwitch() throws InterruptedException, ExecutionException {
140143
}
141144
}
142145

146+
@Test
147+
void testIf() throws InterruptedException, ExecutionException {
148+
try (WorkflowApplication app = WorkflowApplication.builder().build()) {
149+
Workflow workflow =
150+
new Workflow()
151+
.withDocument(
152+
new Document().withNamespace("test").withName("testIf").withVersion("1.0"))
153+
.withDo(
154+
List.of(
155+
new TaskItem(
156+
"java",
157+
new Task()
158+
.withCallTask(
159+
new CallTaskJava(
160+
(CallJava)
161+
CallJava.function(CallTest::zero)
162+
.withMetadata(
163+
new TaskMetadata()
164+
.withAdditionalProperty(
165+
JavaExpressionFactory.IF_PREDICATE,
166+
(Predicate<Integer>)
167+
CallTest::isOdd)))))));
168+
169+
WorkflowDefinition definition = app.workflowDefinition(workflow);
170+
assertThat(definition.instance(3).start().get().asNumber().orElseThrow()).isEqualTo(0);
171+
assertThat(definition.instance(4).start().get().asNumber().orElseThrow()).isEqualTo(4);
172+
}
173+
}
174+
143175
public static boolean isEven(Object model, Integer number) {
144176
return !isOdd(number);
145177
}

impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowUtils.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,13 @@ public static Optional<WorkflowFilter> optionalFilter(WorkflowApplication app, S
116116
return str != null ? Optional.of(buildWorkflowFilter(app, str)) : Optional.empty();
117117
}
118118

119+
public static Optional<WorkflowFilter> optionalFilter(
120+
WorkflowApplication app, Object obj, String str) {
121+
return str != null || obj != null
122+
? Optional.of(buildWorkflowFilter(app, str, obj))
123+
: Optional.empty();
124+
}
125+
119126
public static String toString(UriTemplate template) {
120127
URI uri = template.getLiteralUri();
121128
return uri != null ? uri.toString() : template.getLiteralUriTemplate();

impl/core/src/main/java/io/serverlessworkflow/impl/executors/AbstractTaskExecutor.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
*/
1616
package io.serverlessworkflow.impl.executors;
1717

18-
import static io.serverlessworkflow.impl.WorkflowUtils.*;
18+
import static io.serverlessworkflow.impl.WorkflowUtils.buildWorkflowFilter;
19+
import static io.serverlessworkflow.impl.WorkflowUtils.getSchemaValidator;
1920

2021
import io.serverlessworkflow.api.types.Export;
2122
import io.serverlessworkflow.api.types.FlowDirective;
@@ -101,7 +102,7 @@ protected AbstractTaskExecutorBuilder(
101102
this.contextSchemaValidator =
102103
getSchemaValidator(application.validatorFactory(), resourceLoader, export.getSchema());
103104
}
104-
this.ifFilter = optionalFilter(application, task.getIf());
105+
this.ifFilter = application.expressionFactory().buildIfFilter(task);
105106
}
106107

107108
protected final TransitionInfoBuilder next(

impl/core/src/main/java/io/serverlessworkflow/impl/expressions/ExpressionFactory.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
*/
1616
package io.serverlessworkflow.impl.expressions;
1717

18+
import io.serverlessworkflow.api.types.TaskBase;
1819
import io.serverlessworkflow.impl.WorkflowFilter;
1920
import io.serverlessworkflow.impl.WorkflowModelFactory;
21+
import java.util.Optional;
2022

2123
public interface ExpressionFactory {
2224
/**
@@ -29,4 +31,8 @@ public interface ExpressionFactory {
2931
WorkflowFilter buildFilter(String expr, Object value);
3032

3133
WorkflowModelFactory modelFactory();
34+
35+
default Optional<WorkflowFilter> buildIfFilter(TaskBase task) {
36+
return task.getIf() != null ? Optional.of(buildFilter(task.getIf(), null)) : Optional.empty();
37+
}
3238
}

0 commit comments

Comments
 (0)