diff --git a/main/plugins/org.talend.designer.core/src/main/java/org/talend/designer/core/model/components/Expression.java b/main/plugins/org.talend.designer.core/src/main/java/org/talend/designer/core/model/components/Expression.java index f72163de942..d605c45e6db 100644 --- a/main/plugins/org.talend.designer.core/src/main/java/org/talend/designer/core/model/components/Expression.java +++ b/main/plugins/org.talend.designer.core/src/main/java/org/talend/designer/core/model/components/Expression.java @@ -106,6 +106,8 @@ public final class Expression { } } + private static final String CONTAINS = "CONTAINS"; //$NON-NLS-1$ + private Expression(String expressionString) { this.expressionString = expressionString; } @@ -305,6 +307,10 @@ public final class Expression { if ((simpleExpression.contains("SPARK_VERSION["))) { //$NON-NLS-1$ return evaluateSparkVersion(simpleExpression, listParam, currentParam); } + + if ((simpleExpression.contains(CONTAINS))) { //$NON-NLS-1$ + return evaluateContains(simpleExpression, listParam); + } List paraNames = getParaNamesFromIsShowFunc(simpleExpression); if (paraNames.size() > 0) { @@ -1063,5 +1069,28 @@ public final class Expression { } return false; } + + public static boolean evaluateContains(String simpleExpression, List listParam) { + //Split to get param name and param value to look after + String[] splitted = simpleExpression.split(CONTAINS); + if (splitted.length != 2) { + return false; + } + String paramName = splitted[0].trim(); + String paramValue = splitted[1].trim(); + + //Look for the param name in list + IElementParameter param = listParam.stream() + .filter(p -> paramName.equals(p.getName())) + .findAny() + .orElse(null); + if (param == null || ! EParameterFieldType.TABLE.equals(param.getFieldType())) { + return false; + } + + // Check if we can find paraValue among table lines + return ((List>) param.getValue()).stream() + .anyMatch(line -> paramValue.equals(line.toString())); + } } diff --git a/test/plugins/org.talend.designer.core.test/src/org/talend/designer/core/model/components/ExpressionTest.java b/test/plugins/org.talend.designer.core.test/src/org/talend/designer/core/model/components/ExpressionTest.java index 8da8b4e1be9..8a77864c5de 100644 --- a/test/plugins/org.talend.designer.core.test/src/org/talend/designer/core/model/components/ExpressionTest.java +++ b/test/plugins/org.talend.designer.core.test/src/org/talend/designer/core/model/components/ExpressionTest.java @@ -22,9 +22,14 @@ import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.junit.Test; +import org.talend.core.model.process.EParameterFieldType; import org.talend.core.model.process.IElement; import org.talend.core.model.process.IElementParameter; import org.talend.core.model.process.INode; @@ -147,6 +152,15 @@ public class ExpressionTest { } } + private ElementParameter createMockParameterWithLineInTable(String paramName, Map line) { + ElementParameter param = mock(ElementParameter.class); + when(param.getFieldType()).thenReturn(EParameterFieldType.TABLE); + when(param.getName()).thenReturn(paramName); + List> list = Stream.of(line).collect(Collectors.toList()); + when(param.getValue()).thenReturn(list); + return param; + } + @Test public void testEvaluateDistrib_simplecase() { List params = new ArrayList<>(); @@ -238,7 +252,19 @@ public class ExpressionTest { "!DISTRIB[#LINK@NODE.CONNECTION.DISTRIBUTION, #LINK@NODE.CONNECTION.HIVE_VERSION].doSupportUseDatanodeHostname[]", params, paramNode)); } - + + @Test + public void testEvaluateContains() { + List params = new ArrayList<>(); + Map line = new LinkedHashMap() {{ + put("ADDITIONAL_ARGUMENT", "'hive.import'"); + put("ADDITIONAL_VALUE", "'true'"); + }}; + ElementParameter param1 = createMockParameterWithLineInTable("ADDITIONAL_JAVA", line); + params.add(param1); + assertTrue(Expression.evaluateContains("ADDITIONAL_JAVA CONTAINS {ADDITIONAL_ARGUMENT='hive.import', ADDITIONAL_VALUE='true'}", params)); + } + @Test public void testIsThereCondition() { assertTrue(Expression.isThereCondition("a=1 and b=2", "and")); @@ -255,5 +281,4 @@ public class ExpressionTest { assertFalse(Expression.isThereCondition("standard='aaa'", "and")); assertFalse(Expression.isThereCondition("story='aaa'", "or")); } - }