private ValueSource getDistanceValueSource() { Expression distance; try { distance = JavascriptCompiler.compile( "haversin(" + ORIGIN_LATITUDE + "," + ORIGIN_LONGITUDE + ",latitude,longitude)"); } catch (ParseException pe) { // Should not happen throw new RuntimeException(pe); } SimpleBindings bindings = new SimpleBindings(); bindings.add(new SortField("latitude", SortField.Type.DOUBLE)); bindings.add(new SortField("longitude", SortField.Type.DOUBLE)); return distance.getValueSource(bindings); }
// series of unit test for using expressions as executable scripts public void testExecutableScripts() throws Exception { Map<String, Object> vars = new HashMap<>(); vars.put("a", 2.5); vars.put("b", 3); vars.put("xyz", -1); Expression expr = JavascriptCompiler.compile("a+b+xyz"); CompiledScript compiledScript = new CompiledScript(ScriptType.INLINE, "", "expression", expr); ExpressionExecutableScript ees = new ExpressionExecutableScript(compiledScript, vars); assertEquals((Double) ees.run(), 4.5, 0.001); ees.setNextVar("b", -2.5); assertEquals((Double) ees.run(), -1, 0.001); ees.setNextVar("a", -2.5); ees.setNextVar("b", -2.5); ees.setNextVar("xyz", -2.5); assertEquals((Double) ees.run(), -7.5, 0.001); String message; try { vars = new HashMap<>(); vars.put("a", 1); ees = new ExpressionExecutableScript(compiledScript, vars); ees.run(); fail("An incorrect number of variables were allowed to be used in an expression."); } catch (ScriptException se) { message = se.getMessage(); assertThat( message + " should have contained number of variables", message.contains("number of variables"), equalTo(true)); } try { vars = new HashMap<>(); vars.put("a", 1); vars.put("b", 3); vars.put("c", -1); ees = new ExpressionExecutableScript(compiledScript, vars); ees.run(); fail("A variable was allowed to be set that does not exist in the expression."); } catch (ScriptException se) { message = se.getMessage(); assertThat( message + " should have contained does not exist in", message.contains("does not exist in"), equalTo(true)); } try { vars = new HashMap<>(); vars.put("a", 1); vars.put("b", 3); vars.put("xyz", "hello"); ees = new ExpressionExecutableScript(compiledScript, vars); ees.run(); fail("A non-number was allowed to be use in the expression."); } catch (ScriptException se) { message = se.getMessage(); assertThat( message + " should have contained process numbers", message.contains("process numbers"), equalTo(true)); } }