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);

Reply via email to