public static DefaultVariableResolver NULL_RESOLVER() { return new DefaultVariableResolver(x -> null, x -> false); } }
parse(rule, DefaultVariableResolver.NULL_RESOLVER(), StellarFunctions.FUNCTION_RESOLVER(), context); } catch (Throwable t) { if (throwException) {
/** * Execute and validate a Stellar expression. * * <p>This is intended for use while unit testing Stellar expressions. This ensures that the expression * validates successfully and produces a result that can be serialized correctly. * * @param expression The expression to execute. * @param variables The variables to expose to the expression. * @param context The execution context. * @return The result of executing the expression. */ public static Object run(String expression, Map<String, Object> variables, Context context) { VariableResolver varResolver = new DefaultVariableResolver( x -> { if(x.equals(MapVariableResolver.ALL_FIELDS)) { return variables; } return variables.get(x); } ,x-> x.equals(MapVariableResolver.ALL_FIELDS) || variables.containsKey(x) ); return run(expression, varResolver, context); }
public Object apply(List<Object> variableArgs) { Map<String, Object> lambdaVariables = new HashMap<>(); int i = 0; for(;i < Math.min(variables.size(),variableArgs.size()) ;++i) { lambdaVariables.put(variables.get(i), variableArgs.get(i)); } for(;i < variables.size();++i) { lambdaVariables.put(variables.get(i), null); } VariableResolver variableResolver = new DefaultVariableResolver(variable -> lambdaVariables.getOrDefault(variable , state.variableResolver.resolve(variable) ), variable -> true); StellarCompiler.ExpressionState localState = new StellarCompiler.ExpressionState( state.context , state.functionResolver , variableResolver); return apply(localState); } }
@Test(expected = ParseException.class) public void testMissingLanguage() throws Exception { runPredicate("0 == FUZZY_SCORE(metron,'z',klingon)", new DefaultVariableResolver(v -> variableMap.get(v), v -> variableMap.containsKey(v))); }
@Test(expected = ParseException.class) public void testNoArgs() throws Exception { runPredicate("0 == FUZZY_SCORE()", new DefaultVariableResolver(v -> variableMap.get(v), v -> variableMap.containsKey(v))); }
@Test(expected = ParseException.class) public void testEmptyArgs() throws Exception { runPredicate("0 == FUZZY_SCORE(empty,empty,empty)", new DefaultVariableResolver(v -> variableMap.get(v), v -> variableMap.containsKey(v))); }
@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 testEncodingIs() throws Exception{ Assert.assertTrue(runPredicate("IS_ENCODING(BASE32_FIXTURE,'BASE32')", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE,'BASE32')", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertTrue(runPredicate("IS_ENCODING(BASE32HEX_FIXTURE,'BASE32HEX')", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE,'BASE32HEX')", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertTrue(runPredicate("IS_ENCODING(BASE64_FIXTURE,'BASE64')", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE_PLUS_NULL,'BASE64')", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertTrue(runPredicate("IS_ENCODING(BINARY_FIXTURE,'BINARY')", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE,'BINARY')", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertTrue(runPredicate("IS_ENCODING(HEX_FIXTURE,'HEX')", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE,'HEX')", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); }
@Test(expected = ParseException.class) public void differentTypesShouldThrowErrorWhenUsingLTE() throws Exception { final Map<String, Object> variableMap = new HashMap<>(); runPredicate("'1' <= 1", new DefaultVariableResolver(variableMap::get,variableMap::containsKey)); }
@Test(expected = ParseException.class) public void differentTypesShouldThrowErrorWhenUsingGTE() throws Exception { final Map<String, Object> variableMap = new HashMap<>(); runPredicate("'1' >= 1", new DefaultVariableResolver(variableMap::get,variableMap::containsKey)); }
@Test public void testHappyStringFunctions() throws Exception { Assert .assertTrue(runPredicate("1 == FUZZY_SCORE(metron,'m',english)", new DefaultVariableResolver(v -> variableMap.get(v), v -> variableMap.containsKey(v)))); Assert.assertTrue( runPredicate("16 == FUZZY_SCORE(metron,'metron',english)", new DefaultVariableResolver(v -> variableMap.get(v), v -> variableMap.containsKey(v)))); Assert.assertTrue(runPredicate("3 == FUZZY_SCORE(asf,'asf',english)", new DefaultVariableResolver(v -> variableMap.get(v), v -> variableMap.containsKey(v)))); } }
@Test(expected = ParseException.class) public void differentTypesShouldThrowErrorWhenUsingGT() throws Exception { final Map<String, Object> variableMap = new HashMap<>(); runPredicate("1 > '1'", new DefaultVariableResolver(variableMap::get,variableMap::containsKey)); }
@Test(expected = ParseException.class) public void differentTypesShouldThrowErrorWhenUsingLT() throws Exception { final Map<String, Object> variableMap = new HashMap<>(); runPredicate("1 < '1'", new DefaultVariableResolver(variableMap::get,variableMap::containsKey)); }
@Test public void differentTypesShouldThrowErrorWhenUsingComparisons() throws Exception { final Map<String, Object> variableMap = new HashMap<>(); final Integer[] result = {0}; Stream.of("<", "<=", ">", ">=").forEach(op -> { assertFalse(runPredicate("'1' " + op + " null", new DefaultVariableResolver(variableMap::get,variableMap::containsKey))); }); }
@Test() public void testNoMatchStrings() throws Exception { Assert.assertTrue(runPredicate("0 == FUZZY_SCORE(metron,'z',english)", 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"); put("empty", ""); }}; Assert.assertTrue(runPredicate("'case' in foo", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertFalse(runPredicate("'case' not in foo", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertFalse(runPredicate("'case' in empty", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertTrue(runPredicate("'case' not in empty", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertFalse(runPredicate("'case' in [ foo ]", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertTrue(runPredicate("'case' not in [ foo ]", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertFalse(runPredicate("null in foo", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertTrue(runPredicate("null not in foo", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); }
@Test() public void testEmptyFirstTwoArgs() throws Exception { Assert.assertTrue(runPredicate("0 == FUZZY_SCORE(empty,empty,english)", new DefaultVariableResolver(v -> variableMap.get(v), v -> variableMap.containsKey(v)))); }
public Object run(String rule, Map<String, Object> variables) throws Exception { StellarProcessor processor = new StellarProcessor(); return processor.parse(rule, new DefaultVariableResolver(x -> variables.get(x), x -> variables.containsKey(x)), StellarFunctions.FUNCTION_RESOLVER(), context); } }
@Test() public void testEmptyFirstArg() throws Exception { Assert.assertTrue(runPredicate("0 == FUZZY_SCORE(empty,'z',english)", new DefaultVariableResolver(v -> variableMap.get(v), v -> variableMap.containsKey(v)))); }