enhancement #ID1GUK 使WHILE表达式支持WHILE(true)这种表达方式

This commit is contained in:
everywhere.z
2025-10-12 14:29:13 +08:00
parent 3dee99b2ca
commit 36be15327a
3 changed files with 39 additions and 4 deletions

View File

@@ -1,8 +1,13 @@
package com.yomahub.liteflow.builder.el.operator;
import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.builder.el.operator.base.BaseOperator;
import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper;
import com.yomahub.liteflow.core.NodeBooleanComponent;
import com.yomahub.liteflow.core.NodeForComponent;
import com.yomahub.liteflow.enums.NodeTypeEnum;
import com.yomahub.liteflow.flow.element.Executable;
import com.yomahub.liteflow.flow.element.Node;
import com.yomahub.liteflow.flow.element.condition.WhileCondition;
/**
@@ -17,11 +22,30 @@ public class WhileOperator extends BaseOperator<WhileCondition> {
public WhileCondition build(Object[] objects) throws Exception {
OperatorHelper.checkObjectSizeEqOne(objects);
OperatorHelper.checkObjMustBeBooleanTypeItem(objects[0]);
Executable whileItem = OperatorHelper.convert(objects[0], Executable.class);
Object param = objects[0];
WhileCondition whileCondition = new WhileCondition();
whileCondition.setWhileItem(whileItem);
WhileCondition whileCondition = new WhileCondition();
if (param instanceof Boolean) {
boolean booleanParam = OperatorHelper.convert(objects[0], Boolean.class);
Node node = new Node();
node.setType(NodeTypeEnum.BOOLEAN);
NodeBooleanComponent nodeBooleanComponent = new NodeBooleanComponent() {
@Override
public boolean processBoolean() {
return booleanParam;
}
};
nodeBooleanComponent.setSelf(nodeBooleanComponent);
nodeBooleanComponent.setNodeId(StrUtil.format("LOOP_{}", booleanParam));
nodeBooleanComponent.setType(NodeTypeEnum.BOOLEAN);
node.setInstance(nodeBooleanComponent);
node.setId(nodeBooleanComponent.getNodeId());
whileCondition.setWhileItem(node);
}else{
OperatorHelper.checkObjMustBeBooleanTypeItem(param);
Executable whileItem = OperatorHelper.convert(param, Executable.class);
whileCondition.setWhileItem(whileItem);
}
return whileCondition;
}

View File

@@ -118,4 +118,11 @@ public class LoopELSpringbootTest extends BaseTest {
Assertions.assertTrue(response.isSuccess());
Assertions.assertEquals("[000][001][010][011][020][021][100][101][110][111][120][121][200][201][210][211][220][221][300][301][310][311][320][321]", assertStr);
}
// WHILE(true)表达式的可行性验证
@Test
public void testLoop11() throws Exception {
LiteflowResponse response = flowExecutor.execute2Resp("chain11", "arg");
Assertions.assertTrue(response.isSuccess());
}
}

View File

@@ -56,4 +56,8 @@
<chain name="chain10">
FOR(4).DO(FOR(3).DO(FOR(2).DO(c)));
</chain>
<chain name="chain11">
WHILE(true).DO(a).BREAK(y);
</chain>
</flow>