Wenjun Ruan
7 months ago
committed by
GitHub
14 changed files with 281 additions and 276 deletions
@ -0,0 +1,119 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.apache.dolphinscheduler.plugin.task.api.utils; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.common.utils.JSONUtils; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.enums.Direct; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.model.Property; |
||||||
|
|
||||||
|
import org.apache.commons.collections4.CollectionUtils; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
|
||||||
|
import lombok.experimental.UtilityClass; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
@Slf4j |
||||||
|
@UtilityClass |
||||||
|
public class VarPoolUtils { |
||||||
|
|
||||||
|
public List<Property> deserializeVarPool(String varPoolJson) { |
||||||
|
return JSONUtils.toList(varPoolJson, Property.class); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @see #mergeVarPool(List) |
||||||
|
*/ |
||||||
|
public String mergeVarPoolJsonString(List<String> varPoolJsons) { |
||||||
|
if (CollectionUtils.isEmpty(varPoolJsons)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
List<List<Property>> varPools = varPoolJsons.stream() |
||||||
|
.map(VarPoolUtils::deserializeVarPool) |
||||||
|
.collect(Collectors.toList()); |
||||||
|
List<Property> finalVarPool = mergeVarPool(varPools); |
||||||
|
return JSONUtils.toJsonString(finalVarPool); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Merge the given two varpools, and return the merged varpool. |
||||||
|
* If the two varpools have the same property({@link Property#getProp()} and {@link Property#getDirect()} is same), the value of the property in varpool2 will be used. |
||||||
|
* // todo: we may need to consider the datatype of the property
|
||||||
|
*/ |
||||||
|
public List<Property> mergeVarPool(List<List<Property>> varPools) { |
||||||
|
if (CollectionUtils.isEmpty(varPools)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
if (varPools.size() == 1) { |
||||||
|
return varPools.get(0); |
||||||
|
} |
||||||
|
Map<String, Property> result = new HashMap<>(); |
||||||
|
for (List<Property> varPool : varPools) { |
||||||
|
if (CollectionUtils.isEmpty(varPool)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
for (Property property : varPool) { |
||||||
|
if (!Direct.OUT.equals(property.getDirect())) { |
||||||
|
log.info("The direct should be OUT in varPool, but got {}", property.getDirect()); |
||||||
|
continue; |
||||||
|
} |
||||||
|
result.put(property.getProp(), property); |
||||||
|
} |
||||||
|
} |
||||||
|
return new ArrayList<>(result.values()); |
||||||
|
} |
||||||
|
|
||||||
|
public String subtractVarPoolJson(String varPool, List<String> subtractVarPool) { |
||||||
|
List<Property> varPoolList = deserializeVarPool(varPool); |
||||||
|
List<List<Property>> subtractVarPoolList = subtractVarPool.stream() |
||||||
|
.map(VarPoolUtils::deserializeVarPool) |
||||||
|
.collect(Collectors.toList()); |
||||||
|
List<Property> finalVarPool = subtractVarPool(varPoolList, subtractVarPoolList); |
||||||
|
return JSONUtils.toJsonString(finalVarPool); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the subtracted varpool, which key is in varPool but not in subtractVarPool. |
||||||
|
*/ |
||||||
|
public List<Property> subtractVarPool(List<Property> varPool, List<List<Property>> subtractVarPool) { |
||||||
|
if (CollectionUtils.isEmpty(varPool)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
if (CollectionUtils.isEmpty(subtractVarPool)) { |
||||||
|
return varPool; |
||||||
|
} |
||||||
|
Map<String, Property> subtractVarPoolMap = new HashMap<>(); |
||||||
|
for (List<Property> properties : subtractVarPool) { |
||||||
|
for (Property property : properties) { |
||||||
|
subtractVarPoolMap.put(property.getProp(), property); |
||||||
|
} |
||||||
|
} |
||||||
|
List<Property> result = new ArrayList<>(); |
||||||
|
for (Property property : varPool) { |
||||||
|
if (!subtractVarPoolMap.containsKey(property.getProp())) { |
||||||
|
result.add(property); |
||||||
|
} |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,62 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.apache.dolphinscheduler.plugin.task.api.utils; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.enums.DataType; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.enums.Direct; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.model.Property; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
|
||||||
|
import com.google.common.collect.Lists; |
||||||
|
import com.google.common.truth.Truth; |
||||||
|
|
||||||
|
class VarPoolUtilsTest { |
||||||
|
|
||||||
|
@Test |
||||||
|
void mergeVarPool() { |
||||||
|
Truth.assertThat(VarPoolUtils.mergeVarPool(null)).isNull(); |
||||||
|
|
||||||
|
// Override the value of the same property
|
||||||
|
// Merge the property with different key.
|
||||||
|
List<Property> varpool1 = Lists.newArrayList(new Property("name", Direct.OUT, DataType.VARCHAR, "tom")); |
||||||
|
List<Property> varpool2 = Lists.newArrayList( |
||||||
|
new Property("name", Direct.OUT, DataType.VARCHAR, "tim"), |
||||||
|
new Property("age", Direct.OUT, DataType.INTEGER, "10")); |
||||||
|
|
||||||
|
Truth.assertThat(VarPoolUtils.mergeVarPool(Lists.newArrayList(varpool1, varpool2))) |
||||||
|
.containsExactly( |
||||||
|
new Property("name", Direct.OUT, DataType.VARCHAR, "tim"), |
||||||
|
new Property("age", Direct.OUT, DataType.INTEGER, "10")); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void subtractVarPool() { |
||||||
|
Truth.assertThat(VarPoolUtils.subtractVarPool(null, null)).isNull(); |
||||||
|
List<Property> varpool1 = Lists.newArrayList(new Property("name", Direct.OUT, DataType.VARCHAR, "tom"), |
||||||
|
new Property("age", Direct.OUT, DataType.INTEGER, "10")); |
||||||
|
List<Property> varpool2 = Lists.newArrayList(new Property("name", Direct.OUT, DataType.VARCHAR, "tom")); |
||||||
|
List<Property> varpool3 = Lists.newArrayList(new Property("location", Direct.OUT, DataType.VARCHAR, "china")); |
||||||
|
|
||||||
|
Truth.assertThat(VarPoolUtils.subtractVarPool(varpool1, Lists.newArrayList(varpool2, varpool3))) |
||||||
|
.containsExactly(new Property("age", Direct.OUT, DataType.INTEGER, "10")); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue