From 584ad1cd173b870ec4658767e648cf982a9acc58 Mon Sep 17 00:00:00 2001 From: Wenjun Ruan Date: Wed, 12 Jan 2022 20:54:29 +0800 Subject: [PATCH] Fix global params cannot transport into sub_process (#7969) --- .../service/process/ProcessService.java | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java index f421d88dea..270604afb3 100644 --- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java +++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java @@ -17,6 +17,7 @@ package org.apache.dolphinscheduler.service.process; +import static java.util.stream.Collectors.toSet; import static org.apache.dolphinscheduler.common.Constants.CMDPARAM_COMPLEMENT_DATA_END_DATE; import static org.apache.dolphinscheduler.common.Constants.CMDPARAM_COMPLEMENT_DATA_START_DATE; import static org.apache.dolphinscheduler.common.Constants.CMD_PARAM_EMPTY_SUB_PROCESS; @@ -27,8 +28,6 @@ import static org.apache.dolphinscheduler.common.Constants.CMD_PARAM_SUB_PROCESS import static org.apache.dolphinscheduler.common.Constants.CMD_PARAM_SUB_PROCESS_PARENT_INSTANCE_ID; import static org.apache.dolphinscheduler.common.Constants.LOCAL_PARAMS; -import static java.util.stream.Collectors.toSet; - import org.apache.dolphinscheduler.common.Constants; import org.apache.dolphinscheduler.common.enums.AuthorizationType; import org.apache.dolphinscheduler.common.enums.CommandType; @@ -1002,17 +1001,21 @@ public class ProcessService { */ private String joinGlobalParams(String parentGlobalParams, String subGlobalParams) { - List parentPropertyList = JSONUtils.toList(parentGlobalParams, Property.class); - List subPropertyList = JSONUtils.toList(subGlobalParams, Property.class); - - Map subMap = subPropertyList.stream().collect(Collectors.toMap(Property::getProp, Property::getValue)); - - for (Property parent : parentPropertyList) { - if (!subMap.containsKey(parent.getProp())) { - subPropertyList.add(parent); - } - } - return JSONUtils.toJsonString(subPropertyList); + // Since JSONUtils.toList return unmodified list, we need to creat a new List here. + List parentParams = Lists.newArrayList(JSONUtils.toList(parentGlobalParams, Property.class)); + List subParams = JSONUtils.toList(subGlobalParams, Property.class); + + Set parentParamKeys = parentParams.stream().map(Property::getProp).collect(toSet()); + + // We will combine the params of parent workflow and sub workflow + // If the params are defined in both, we will use parent's params to override the sub workflow(ISSUE-7962) + // todo: Do we need to consider the other attribute of Property? + // e.g. the subProp's type is not equals with parent, or subProp's direct is not equals with parent + // It's suggested to add node name in property, this kind of problem can be solved. + List extraSubParams = subParams.stream() + .filter(subProp -> !parentParamKeys.contains(subProp.getProp())).collect(Collectors.toList()); + parentParams.addAll(extraSubParams); + return JSONUtils.toJsonString(parentParams); } /**