METRON-1166: Stellar short circuiting fails when a complex condition using a boolean op is followed by the opposite boolean op this closes apache/incubator-metron#738
Project: http://git-wip-us.apache.org/repos/asf/metron/repo Commit: http://git-wip-us.apache.org/repos/asf/metron/commit/f0ae85fb Tree: http://git-wip-us.apache.org/repos/asf/metron/tree/f0ae85fb Diff: http://git-wip-us.apache.org/repos/asf/metron/diff/f0ae85fb Branch: refs/heads/Metron_0.4.1 Commit: f0ae85fb71bf1d102d9b72f6b413a89abe8b4bd4 Parents: 224d3d5 Author: cstella <[email protected]> Authored: Fri Sep 8 15:04:44 2017 -0400 Committer: cstella <[email protected]> Committed: Fri Sep 8 15:04:44 2017 -0400 ---------------------------------------------------------------------- .../apache/metron/stellar/common/StellarCompiler.java | 8 ++++---- .../metron/stellar/dsl/functions/BasicStellarTest.java | 12 ++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metron/blob/f0ae85fb/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/StellarCompiler.java ---------------------------------------------------------------------- diff --git a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/StellarCompiler.java b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/StellarCompiler.java index a8bc773..b669bc7 100644 --- a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/StellarCompiler.java +++ b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/StellarCompiler.java @@ -121,15 +121,15 @@ public class StellarCompiler extends StellarBaseListener { //if we have a boolean as the current value and the next non-contextual token is a short circuit op //then we need to short circuit possibly if(token.getUnderlyingType() == BooleanArg.class) { - if (curr.getMultiArgContext() != null - && curr.getMultiArgContext().getVariety() == FrameContext.BOOLEAN_OR + if (token.getMultiArgContext() != null + && token.getMultiArgContext().getVariety() == FrameContext.BOOLEAN_OR && (Boolean) (curr.getValue()) ) { //short circuit the or FrameContext.Context context = curr.getMultiArgContext(); shortCircuit(it, context); - } else if (curr.getMultiArgContext() != null - && curr.getMultiArgContext().getVariety() == FrameContext.BOOLEAN_AND + } else if (token.getMultiArgContext() != null + && token.getMultiArgContext().getVariety() == FrameContext.BOOLEAN_AND && !(Boolean) (curr.getValue()) ) { //short circuit the and http://git-wip-us.apache.org/repos/asf/metron/blob/f0ae85fb/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java ---------------------------------------------------------------------- diff --git a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java index d6c3713..af86902 100644 --- a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java +++ b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java @@ -625,6 +625,18 @@ public class BasicStellarTest { } @Test + + public void testShortCircuit_mixedBoolOps() throws Exception { + final Map<String, String> variableMap = new HashMap<String, String>(); + Assert.assertTrue(runPredicate("(false && true) || true" + , new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + Assert.assertTrue(runPredicate("(false && false) || true" + , new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + Assert.assertFalse(runPredicate("(true || true) && false" + , new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + } + + @Test public void testInString() throws Exception { final Map<String, String> variableMap = new HashMap<String, String>() {{ put("foo", "casey");
