diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/group/NodeWrapper.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/group/NodeWrapper.java index 2d9b1537..30b841c5 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/group/NodeWrapper.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/group/NodeWrapper.java @@ -3,7 +3,10 @@ package cn.axzo.msg.center.message.service.group; import cn.axzo.maokai.api.vo.response.tree.NodeValue; import cn.axzo.msg.center.domain.entity.MessageGroupNode; import cn.axzo.msg.center.utils.TreeHelperUtil; +import lombok.AccessLevel; +import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.commons.lang3.StringUtils; import java.util.Map; @@ -16,6 +19,10 @@ public class NodeWrapper implements NodeValue { private final MessageGroupNode node; private final Map code2Id; + // cache path for better performance + @Setter(AccessLevel.PACKAGE) + @Getter(AccessLevel.PACKAGE) + private String pathCache; @Override public Long id() { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/group/RootNodeWrapper.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/group/RootNodeWrapper.java index 32eda67a..157f9766 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/group/RootNodeWrapper.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/group/RootNodeWrapper.java @@ -1,11 +1,9 @@ package cn.axzo.msg.center.message.service.group; -import cn.axzo.maokai.api.util.Ref; import cn.axzo.maokai.api.vo.response.tree.Node; import cn.axzo.maokai.api.vo.response.tree.RootNode; import cn.axzo.maokai.api.vo.response.tree.ValueNode; import cn.axzo.msg.center.common.utils.BizAssertions; -import cn.axzo.msg.center.domain.entity.MessageGroupNode; import com.alibaba.fastjson.JSON; import java.util.ArrayList; @@ -15,8 +13,8 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.function.Function; +import static java.util.function.Function.identity; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; @@ -25,13 +23,14 @@ import static java.util.stream.Collectors.toMap; */ public class RootNodeWrapper { - private final RootNode root; private final Map> code2Node; + private final Map> id2Node; - public RootNodeWrapper(RootNode root) { - this.root = root; + RootNodeWrapper(RootNode root) { this.code2Node = root.getValueNodes().stream() - .collect(toMap(node -> node.getValue().getNodeCode(), Function.identity())); + .collect(toMap(node -> node.getValue().getNodeCode(), identity())); + this.id2Node = root.getValueNodes().stream() + .collect(toMap(node -> node.getValue().unwrap().getId(), identity())); } public Optional> findValueNode(String groupNodeCode) { @@ -39,18 +38,7 @@ public class RootNodeWrapper { } public Optional> findValueNode(Long id) { - Ref> ref = Ref.create(); - unwrap().walkDown(node -> { - //noinspection unchecked - ValueNode valueNode = node.tryCast(ValueNode.class); - if (valueNode == null) - return true; - MessageGroupNode groupNode = valueNode.getValue().unwrap(); - if (id.equals(groupNode.getId())) - ref.set(valueNode); - return ref.isNull(); - }); - return Optional.ofNullable(ref.get()); + return Optional.ofNullable(id2Node.get(id)); } public List> getNodes(Collection groupNodeCodes) { @@ -62,6 +50,13 @@ public class RootNodeWrapper { } public String getPath(ValueNode node) { + NodeWrapper wrapper = node.getValue(); + if (wrapper.getPathCache() == null) + wrapper.setPathCache(getPathImpl(node)); + return wrapper.getPathCache(); + } + + private static String getPathImpl(ValueNode node) { ArrayList paths = new ArrayList<>(); Node current = node; int stack = 0; @@ -79,7 +74,4 @@ public class RootNodeWrapper { return String.join(":", paths); } - public RootNode unwrap() { - return root; - } } \ No newline at end of file