From d028236c0f53ea00fcc5bece25d04537af6d7434 Mon Sep 17 00:00:00 2001 From: kurobako Date: Fri, 10 Nov 2017 13:32:18 +0100 Subject: [PATCH] DROOLS-1701 !=, not() unary tests --- .../feel11/CompiledFEELSemanticMappings.java | 22 ++++++++++++++++ .../codegen/feel11/DirectCompilerVisitor.java | 26 ++++++++++++++----- .../feel11/DirectCompilerUnaryTestsTest.java | 6 +++++ 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/codegen/feel11/CompiledFEELSemanticMappings.java b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/codegen/feel11/CompiledFEELSemanticMappings.java index e3a0a5fb476..eda8dbac848 100644 --- a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/codegen/feel11/CompiledFEELSemanticMappings.java +++ b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/codegen/feel11/CompiledFEELSemanticMappings.java @@ -17,6 +17,7 @@ package org.kie.dmn.feel.codegen.feel11; import org.kie.dmn.feel.lang.ast.InfixOpNode; +import org.kie.dmn.feel.runtime.UnaryTest; import org.kie.dmn.feel.util.EvalHelper; /** @@ -136,4 +137,25 @@ public static Boolean gt(Object left, Object right) { public static Boolean eq(Object left, Object right) { return EvalHelper.isEqual(left, right, null); } + + /** + * FEEL spec Table 39 + */ + public static Boolean ne(Object left, Object right) { + return not(EvalHelper.isEqual(left, right, null)); + } + + public static Boolean not(Object arg, UnaryTest test) { + return not(test.apply(null, arg)); + } + + private static Boolean not(Object arg) { + if (Boolean.TRUE.equals(arg)) { + return Boolean.FALSE; + } + if (Boolean.FALSE.equals(arg)) { + return Boolean.TRUE; + } + return null; + } } diff --git a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/codegen/feel11/DirectCompilerVisitor.java b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/codegen/feel11/DirectCompilerVisitor.java index 4d8e6197ef6..b07cae52cfd 100644 --- a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/codegen/feel11/DirectCompilerVisitor.java +++ b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/codegen/feel11/DirectCompilerVisitor.java @@ -552,9 +552,20 @@ private DirectCompilerResult createUnaryTestExpression(ParserRuleContext ctx, Di } break; case NE: - throw new UnsupportedOperationException("TODO"); // TODO - case NOT: - throw new UnsupportedOperationException("TODO"); // TODO + { + MethodCallExpr expression = new MethodCallExpr(null, "ne"); + expression.addArgument(new NameExpr("left")); + expression.addArgument(endpoint.getExpression()); + lambdaBody = new ExpressionStmt(expression); + } + break; + case NOT: { + MethodCallExpr expression = new MethodCallExpr(null, "not"); + expression.addArgument(new NameExpr("left")); + expression.addArgument(endpoint.getExpression()); + lambdaBody = new ExpressionStmt(expression); + } + break; default: throw new UnsupportedOperationException("Unable to determine operator of unary test"); } @@ -896,8 +907,9 @@ public DirectCompilerResult visitCompilation_unit(FEEL_1_1Parser.Compilation_uni return visit( ctx.expression() ); } -// @Override -// public DirectCompilerResult visitNegatedUnaryTests(FEEL_1_1Parser.NegatedUnaryTestsContext ctx) { -// throw new UnsupportedOperationException("TODO"); // TODO -// } + @Override + public DirectCompilerResult visitNegatedUnaryTests(FEEL_1_1Parser.NegatedUnaryTestsContext ctx) { + FEEL_1_1Parser.SimpleUnaryTestsContext child = (FEEL_1_1Parser.SimpleUnaryTestsContext) ctx.getChild(2); + return createUnaryTestExpression(ctx, child.accept(this), UnaryOperator.NOT); + } } diff --git a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/codegen/feel11/DirectCompilerUnaryTestsTest.java b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/codegen/feel11/DirectCompilerUnaryTestsTest.java index 18a272d508a..8b85e74a0fe 100644 --- a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/codegen/feel11/DirectCompilerUnaryTestsTest.java +++ b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/codegen/feel11/DirectCompilerUnaryTestsTest.java @@ -65,6 +65,7 @@ public void test_positiveUnaryTestIneq() { assertThat(parseCompileEvaluate(">=1, >2, <3, <=4", 3), is(Arrays.asList(true, true, false, true))); assertThat(parseCompileEvaluate(">=1, >2, <3, <=4", 4), is(Arrays.asList(true, true, false, true))); assertThat(parseCompileEvaluate(">=1, >2, <3, <=4", 5), is(Arrays.asList(true, true, false, false))); + assertThat(parseCompileEvaluate("!=1, !=42", 1), is(Arrays.asList(false, true))); } @Test @@ -75,6 +76,11 @@ public void test_positiveUnaryTestIneq_forEQ() { assertThat(parseCompileEvaluate("<47, 47", 1), is(Arrays.asList(true, false))); } + @Test + public void test_not() { + assertThat(parseCompileEvaluate("not(=47), not(<1), not(!=1)", 1), is(Arrays.asList(true, true, true))); + } + @Test public void test_simpleUnaryTest_forRANGE() { assertThat(parseCompileEvaluate("[1..2]", 1), is(Arrays.asList(true)));