Repository: jena Updated Branches: refs/heads/JENA-507 4a42ee2a1 -> 8c80b7858
Add root() function for calculating Nth roots (JENA-507) Also cleans up some of the other function implementations Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/94f8b891 Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/94f8b891 Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/94f8b891 Branch: refs/heads/JENA-507 Commit: 94f8b891b57f36104de89b90d66b3078266d4a7b Parents: 4a42ee2 Author: Rob Vesse <[email protected]> Authored: Thu Oct 9 12:53:33 2014 +0100 Committer: Rob Vesse <[email protected]> Committed: Thu Oct 9 12:53:33 2014 +0100 ---------------------------------------------------------------------- .../sparql/function/library/leviathan/e.java | 13 +------------ .../function/library/leviathan/factorial.java | 5 ----- .../sparql/function/library/leviathan/ln.java | 5 ----- .../sparql/function/library/leviathan/log.java | 5 ----- .../function/library/leviathan/reciprocal.java | 5 ----- .../sparql/function/library/leviathan/root.java | 16 ++++++++++++++++ .../jena/sparql/expr/TestLeviathanFunctions.java | 19 ++++++++++++++++++- 7 files changed, 35 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/94f8b891/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/e.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/e.java b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/e.java index e0a1814..f5cdb08 100644 --- a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/e.java +++ b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/e.java @@ -18,25 +18,14 @@ package com.hp.hpl.jena.sparql.function.library.leviathan; -import com.hp.hpl.jena.sparql.ARQInternalErrorException; import com.hp.hpl.jena.sparql.expr.NodeValue; -import com.hp.hpl.jena.sparql.expr.nodevalue.XSDFuncOp; import com.hp.hpl.jena.sparql.function.FunctionBase1; public class e extends FunctionBase1 { @Override public NodeValue exec(NodeValue v) { - switch (XSDFuncOp.classifyNumeric("e", v)) - { - case OP_INTEGER: - case OP_DECIMAL: - case OP_FLOAT: - case OP_DOUBLE: - return NodeValue.makeDouble( Math.exp(v.getDouble()) ) ; - default: - throw new ARQInternalErrorException("Unrecognized numeric operation : "+v) ; - } + return NodeValue.makeDouble(Math.exp(v.getDouble())); } } http://git-wip-us.apache.org/repos/asf/jena/blob/94f8b891/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/factorial.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/factorial.java b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/factorial.java index 8fea35b..c09b568 100644 --- a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/factorial.java +++ b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/factorial.java @@ -4,17 +4,12 @@ import java.math.BigInteger; import com.hp.hpl.jena.sparql.expr.ExprEvalException; import com.hp.hpl.jena.sparql.expr.NodeValue; -import com.hp.hpl.jena.sparql.expr.nodevalue.XSDFuncOp; import com.hp.hpl.jena.sparql.function.FunctionBase1; public class factorial extends FunctionBase1 { @Override public NodeValue exec(NodeValue v) { - // Don't care about the return value, will just error if the thing isn't - // a numeric - XSDFuncOp.classifyNumeric("factorial", v); - BigInteger i = v.getInteger(); switch (i.compareTo(BigInteger.ZERO)) { http://git-wip-us.apache.org/repos/asf/jena/blob/94f8b891/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/ln.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/ln.java b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/ln.java index 5377e57..e603c2f 100644 --- a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/ln.java +++ b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/ln.java @@ -1,17 +1,12 @@ package com.hp.hpl.jena.sparql.function.library.leviathan; import com.hp.hpl.jena.sparql.expr.NodeValue; -import com.hp.hpl.jena.sparql.expr.nodevalue.XSDFuncOp; import com.hp.hpl.jena.sparql.function.FunctionBase1; public class ln extends FunctionBase1 { @Override public NodeValue exec(NodeValue v) { - // Don't care about the return value, will just error if the thing isn't - // a numeric - XSDFuncOp.classifyNumeric("ln", v); - return NodeValue.makeDouble(Math.log(v.getDouble())); } http://git-wip-us.apache.org/repos/asf/jena/blob/94f8b891/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/log.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/log.java b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/log.java index c45bd77..d606f23 100644 --- a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/log.java +++ b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/log.java @@ -6,7 +6,6 @@ import com.hp.hpl.jena.query.QueryBuildException; import com.hp.hpl.jena.sparql.expr.ExprEvalException; import com.hp.hpl.jena.sparql.expr.ExprList; import com.hp.hpl.jena.sparql.expr.NodeValue; -import com.hp.hpl.jena.sparql.expr.nodevalue.XSDFuncOp; import com.hp.hpl.jena.sparql.function.FunctionBase; import com.hp.hpl.jena.sparql.util.Utils; @@ -17,10 +16,7 @@ public class log extends FunctionBase { if (args.size() < 1 || args.size() > 2) throw new ExprEvalException("Invalid number of arguments"); - // Don't care about the return value, will just error if the thing isn't - // a numeric NodeValue v = args.get(0); - XSDFuncOp.classifyNumeric("log", v); if (args.size() == 1) { // Log base 10 @@ -29,7 +25,6 @@ public class log extends FunctionBase { // Log with arbitrary base // See http://en.wikipedia.org/wiki/List_of_logarithmic_identities#Changing_the_base NodeValue base = args.get(1); - XSDFuncOp.classifyNumeric("log", base); return NodeValue.makeDouble(Math.log10(v.getDouble()) / Math.log10(base.getDouble())); } http://git-wip-us.apache.org/repos/asf/jena/blob/94f8b891/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/reciprocal.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/reciprocal.java b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/reciprocal.java index 147c422..b699f7a 100644 --- a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/reciprocal.java +++ b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/reciprocal.java @@ -1,17 +1,12 @@ package com.hp.hpl.jena.sparql.function.library.leviathan; import com.hp.hpl.jena.sparql.expr.NodeValue; -import com.hp.hpl.jena.sparql.expr.nodevalue.XSDFuncOp; import com.hp.hpl.jena.sparql.function.FunctionBase1; public class reciprocal extends FunctionBase1 { @Override public NodeValue exec(NodeValue v) { - // Don't care about the return value, will just error if the thing isn't - // a numeric - XSDFuncOp.classifyNumeric("reciprocal", v); - return NodeValue.makeDouble(1d / v.getDouble()); } http://git-wip-us.apache.org/repos/asf/jena/blob/94f8b891/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/root.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/root.java b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/root.java new file mode 100644 index 0000000..937b5be --- /dev/null +++ b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/library/leviathan/root.java @@ -0,0 +1,16 @@ +package com.hp.hpl.jena.sparql.function.library.leviathan; + +import com.hp.hpl.jena.sparql.expr.NodeValue; +import com.hp.hpl.jena.sparql.function.FunctionBase2; + +public class root extends FunctionBase2 { + + @Override + public NodeValue exec(NodeValue v1, NodeValue v2) { + double value = v1.getDouble(); + double root = v2.getDouble(); + + return NodeValue.makeDouble(Math.pow(value, 1d / root)); + } + +} http://git-wip-us.apache.org/repos/asf/jena/blob/94f8b891/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestLeviathanFunctions.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestLeviathanFunctions.java b/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestLeviathanFunctions.java index f3100b7..427e08c 100644 --- a/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestLeviathanFunctions.java +++ b/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestLeviathanFunctions.java @@ -21,6 +21,7 @@ package com.hp.hpl.jena.sparql.expr; import org.apache.jena.atlas.junit.BaseTest; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import com.hp.hpl.jena.graph.Node; @@ -175,7 +176,23 @@ public class TestLeviathanFunctions extends BaseTest { public void reciprocal_03() { test("lfn:reciprocal(lfn:reciprocal(2))", "2"); } - + + @Test + public void root_01() { + test("lfn:root(4,2)", "2"); + } + + @Test + public void root_02() { + test("lfn:root(2,1)", "2"); + } + + @Test + @Ignore // Unfortunately Java floating point precision is awful and I get 3.999999999999996 when running on Oracle JVM + public void root_03() { + test("lfn:root(64,3)", "4"); + } + private static void test(String exprString, String result) { Node r = NodeFactoryExtra.parseNode(result); test(exprString, r);
