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
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 @@
//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
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 @@
}
@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");