You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2024/01/14 17:51:05 UTC

(jena) branch main updated: Function and FunctionBase cleanup

This is an automated email from the ASF dual-hosted git repository.

andy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git


The following commit(s) were added to refs/heads/main by this push:
     new 24ff1f8f25 Function and FunctionBase cleanup
24ff1f8f25 is described below

commit 24ff1f8f2555c54e2aada043553a491be7dcf70f
Author: Andy Seaborne <an...@apache.org>
AuthorDate: Sun Jan 14 14:27:29 2024 +0000

    Function and FunctionBase cleanup
---
 .../org/apache/jena/sparql/function/Function.java  | 17 +++++++---
 .../apache/jena/sparql/function/FunctionBase.java  |  4 +--
 .../apache/jena/sparql/function/FunctionBase0.java | 29 +++++++----------
 .../apache/jena/sparql/function/FunctionBase1.java | 29 +++++++----------
 .../apache/jena/sparql/function/FunctionBase2.java | 32 ++++++++-----------
 .../apache/jena/sparql/function/FunctionBase3.java | 35 +++++++++------------
 .../apache/jena/sparql/function/FunctionBase4.java | 36 +++++++++-------------
 .../apache/jena/sparql/function/FunctionBase5.java | 16 +++-------
 .../jena/sparql/function/library/SystemVar.java    |  4 +--
 .../jena/sparql/function/library/context.java      |  2 +-
 .../sparql/function/scripting/ScriptFunction.java  | 11 +------
 11 files changed, 83 insertions(+), 132 deletions(-)

diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/Function.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/Function.java
index 3eed9b499b..2681fec350 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/Function.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/Function.java
@@ -20,27 +20,34 @@ package org.apache.jena.sparql.function;
 
 
 import org.apache.jena.sparql.engine.binding.Binding ;
+import org.apache.jena.sparql.expr.ExprEvalException;
+import org.apache.jena.sparql.expr.ExprException;
 import org.apache.jena.sparql.expr.ExprList ;
 import org.apache.jena.sparql.expr.NodeValue ;
 import org.apache.jena.sparql.util.Context;
 
-/** Interface to value-testing extensions to the expression evaluator. */
+/**
+ * Interface to function extensions of the expression evaluator. This includes
+ * "functional forms" - functions that take expressions for argument, rather than the
+ * usual value from already evaluated argument (hence they are not mathematical
+ * functions).
+ */
 public interface Function
 {
     /**
      * Called during query plan construction immediately after the
      * construction of the extension instance.
-     * Can throw ExprBuildException if something is wrong (like wrong number of arguments).
+     * A function can throw {@link ExprException} if something is wrong (like wrong number of arguments).
      * @param uri The function URI
      * @param args The parsed arguments
      * @param context The build context.
      */
     public void build(String uri, ExprList args, Context context);
 
-    /** Test a list of values - argument will not be null but
-     *  may have the wrong number of arguments.
+    /** Call a function.
+     *  The argument list will not be null but may have the wrong number of arguments.
      *  FunctionBase provides a more convenient way to implement a function.
-     *  Can throw ExprEvalsException if something goes wrong.
+     *  Functions can throw {@link ExprEvalException} if something goes wrong.
      *
      * @param binding   The current solution
      * @param args      A list of unevaluated expressions
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase.java
index 604ce29816..3268c0f44b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase.java
@@ -42,13 +42,11 @@ public abstract class FunctionBase implements Function {
         if ( args == null )
             // The contract on the function interface is that this should not happen.
             throw new ARQInternalErrorException("FunctionBase: Null args list") ;
-
         List<NodeValue> evalArgs = evalArgs(binding, args, env);
-
         return exec(evalArgs, env) ;
     }
 
-    public static List<NodeValue> evalArgs(Binding binding, ExprList args, FunctionEnv env) {
+    private static List<NodeValue> evalArgs(Binding binding, ExprList args, FunctionEnv env) {
         List<NodeValue> evalArgs = new ArrayList<>();
         for ( Expr e : args ) {
             NodeValue x = e.eval(binding, env);
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase0.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase0.java
index 6fe9534791..0272131977 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase0.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase0.java
@@ -27,29 +27,22 @@ import org.apache.jena.sparql.expr.ExprEvalException ;
 import org.apache.jena.sparql.expr.ExprList ;
 import org.apache.jena.sparql.expr.NodeValue ;
 
-/** Support for a function of zero arguments. */
-
-public abstract class FunctionBase0 extends FunctionBase
-{
+/** Support for functions of zero arguments. */
+public abstract class FunctionBase0 extends FunctionBase {
     @Override
-    public void checkBuild(String uri, ExprList args)
-    { 
+    public void checkBuild(String uri, ExprList args) {
         if ( args.size() != 0 )
-            throw new QueryBuildException("Function '"+Lib.className(this)+"' takes no arguments") ;
+            throw new QueryBuildException("Function '" + Lib.className(this) + "' takes no arguments");
     }
-    
+
     @Override
-    public final NodeValue exec(List<NodeValue> args)
-    {
+    public final NodeValue exec(List<NodeValue> args) {
         if ( args == null )
-            // The contract on the function interface is that this should not happen.
-            throw new ARQInternalErrorException("Function '"+Lib.className(this)+" Null args list") ;
-        
+            throw new ARQInternalErrorException("Function '" + Lib.className(this) + " Null args list");
         if ( args.size() != 0 )
-            throw new ExprEvalException("Function '"+Lib.className(this)+" Wanted 0, got "+args.size()) ;
-        
-        return exec() ;
+            throw new ExprEvalException("Function '" + Lib.className(this) + " Wanted 0, got " + args.size());
+        return exec();
     }
-    
-    public abstract NodeValue exec() ;
+
+    public abstract NodeValue exec();
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase1.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase1.java
index 6abcad3e29..1a2c3f5dd2 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase1.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase1.java
@@ -27,31 +27,24 @@ import org.apache.jena.sparql.expr.ExprEvalException ;
 import org.apache.jena.sparql.expr.ExprList ;
 import org.apache.jena.sparql.expr.NodeValue ;
 
-/** Support for a function of one argument. */
+/** Support for functions with one argument. */
+public abstract class FunctionBase1 extends FunctionBase {
 
-public abstract class FunctionBase1 extends FunctionBase
-{
     @Override
-    public void checkBuild(String uri, ExprList args)
-    { 
+    public void checkBuild(String uri, ExprList args) {
         if ( args.size() != 1 )
-            throw new QueryBuildException("Function '"+Lib.className(this)+"' takes one argument") ;
+            throw new QueryBuildException("Function '" + Lib.className(this) + "' takes one argument");
     }
 
     @Override
-    public final NodeValue exec(List<NodeValue> args)
-    {
+    public final NodeValue exec(List<NodeValue> args) {
         if ( args == null )
-            // The contract on the function interface is that this should not happen.
-            throw new ARQInternalErrorException("FunctionBase1: Null args list") ;
-        
+            throw new ARQInternalErrorException("FunctionBase1: Null args list");
         if ( args.size() != 1 )
-            throw new ExprEvalException("FunctionBase1: Wrong number of arguments: Wanted 1, got "+args.size()) ;
-        
-        NodeValue v1 = args.get(0) ;
-        
-        return exec(v1) ;
+            throw new ExprEvalException("FunctionBase1: Wrong number of arguments: Wanted 1, got " + args.size());
+        NodeValue v1 = args.get(0);
+        return exec(v1);
     }
-    
-    public abstract NodeValue exec(NodeValue v) ;
+
+    public abstract NodeValue exec(NodeValue v);
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase2.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase2.java
index f64ee619f6..d141bc53b1 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase2.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase2.java
@@ -27,33 +27,25 @@ import org.apache.jena.sparql.expr.ExprEvalException ;
 import org.apache.jena.sparql.expr.ExprList ;
 import org.apache.jena.sparql.expr.NodeValue ;
 
-/** Support for a function of one argument. */
+/** Support for functions with two arguments. */
+public abstract class FunctionBase2 extends FunctionBase {
 
-public abstract class FunctionBase2 extends FunctionBase
-{
     @Override
-    public void checkBuild(String uri, ExprList args)
-    { 
+    public void checkBuild(String uri, ExprList args) {
         if ( args.size() != 2 )
-            throw new QueryBuildException("Function '"+Lib.className(this)+"' takes two arguments") ;
+            throw new QueryBuildException("Function '" + Lib.className(this) + "' takes two arguments");
     }
 
-    
     @Override
-    public final NodeValue exec(List<NodeValue> args)
-    {
+    public final NodeValue exec(List<NodeValue> args) {
         if ( args == null )
-            // The contract on the function interface is that this should not happen.
-            throw new ARQInternalErrorException(Lib.className(this)+": Null args list") ;
-        
+            throw new ARQInternalErrorException(Lib.className(this) + ": Null args list");
         if ( args.size() != 2 )
-            throw new ExprEvalException(Lib.className(this)+": Wrong number of arguments: Wanted 2, got "+args.size()) ;
-        
-        NodeValue v1 = args.get(0) ;
-        NodeValue v2 = args.get(1) ;
-        
-        return exec(v1, v2) ;
+            throw new ExprEvalException(Lib.className(this) + ": Wrong number of arguments: Wanted 2, got " + args.size());
+        NodeValue v1 = args.get(0);
+        NodeValue v2 = args.get(1);
+        return exec(v1, v2);
     }
-    
-    public abstract NodeValue exec(NodeValue v1, NodeValue v2) ;
+
+    public abstract NodeValue exec(NodeValue v1, NodeValue v2);
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase3.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase3.java
index 882eb85b4d..960d881a06 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase3.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase3.java
@@ -27,33 +27,26 @@ import org.apache.jena.sparql.expr.ExprEvalException ;
 import org.apache.jena.sparql.expr.ExprList ;
 import org.apache.jena.sparql.expr.NodeValue ;
 
-/** Support for a function of one argument. */
+/** Support for functions of three arguments. */
+public abstract class FunctionBase3 extends FunctionBase {
 
-public abstract class FunctionBase3 extends FunctionBase
-{
     @Override
-    public void checkBuild(String uri, ExprList args)
-    { 
+    public void checkBuild(String uri, ExprList args) {
         if ( args.size() != 3 )
-            throw new QueryBuildException("Function '"+Lib.className(this)+"' takes three arguments") ;
+            throw new QueryBuildException("Function '" + Lib.className(this) + "' takes three arguments");
     }
-    
+
     @Override
-    public final NodeValue exec(List<NodeValue> args)
-    {
+    public final NodeValue exec(List<NodeValue> args) {
         if ( args == null )
-            // The contract on the function interface is that this should not happen.
-            throw new ARQInternalErrorException(Lib.className(this)+": Null args list") ;
-        
+            throw new ARQInternalErrorException(Lib.className(this) + ": Null args list");
         if ( args.size() != 3 )
-            throw new ExprEvalException(Lib.className(this)+": Wrong number of arguments: Wanted 3, got "+args.size()) ;
-        
-        NodeValue v1 = args.get(0) ;
-        NodeValue v2 = args.get(1) ;
-        NodeValue v3 = args.get(2) ;
-        
-        return exec(v1, v2, v3) ;
+            throw new ExprEvalException(Lib.className(this) + ": Wrong number of arguments: Wanted 3, got " + args.size());
+        NodeValue v1 = args.get(0);
+        NodeValue v2 = args.get(1);
+        NodeValue v3 = args.get(2);
+        return exec(v1, v2, v3);
     }
-    
-    public abstract NodeValue exec(NodeValue v1, NodeValue v2, NodeValue v3) ;
+
+    public abstract NodeValue exec(NodeValue v1, NodeValue v2, NodeValue v3);
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase4.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase4.java
index 6b4f3f997c..63e9cc78d7 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase4.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase4.java
@@ -27,35 +27,27 @@ import org.apache.jena.sparql.expr.ExprEvalException ;
 import org.apache.jena.sparql.expr.ExprList ;
 import org.apache.jena.sparql.expr.NodeValue ;
 
-/** Support for a function of one argument. */
+/** Support for functions with four arguments. */
+public abstract class FunctionBase4 extends FunctionBase {
 
-public abstract class FunctionBase4 extends FunctionBase
-{
     @Override
-    public void checkBuild(String uri, ExprList args)
-    { 
+    public void checkBuild(String uri, ExprList args) {
         if ( args.size() != 4 )
-            throw new QueryBuildException("Function '"+Lib.className(this)+"' takes four arguments") ;
+            throw new QueryBuildException("Function '" + Lib.className(this) + "' takes four arguments");
     }
 
-    
     @Override
-    public final NodeValue exec(List<NodeValue> args)
-    {
+    public final NodeValue exec(List<NodeValue> args) {
         if ( args == null )
-            // The contract on the function interface is that this should not happen.
-            throw new ARQInternalErrorException(Lib.className(this)+": Null args list") ;
-        
+            throw new ARQInternalErrorException(Lib.className(this) + ": Null args list");
         if ( args.size() != 4 )
-            throw new ExprEvalException(Lib.className(this)+": Wrong number of arguments: Wanted 4, got "+args.size()) ;
-        
-        NodeValue v1 = args.get(0) ;
-        NodeValue v2 = args.get(1) ;
-        NodeValue v3 = args.get(2) ;
-        NodeValue v4 = args.get(3) ;
-        
-        return exec(v1, v2, v3, v4) ;
+            throw new ExprEvalException(Lib.className(this) + ": Wrong number of arguments: Wanted 4, got " + args.size());
+        NodeValue v1 = args.get(0);
+        NodeValue v2 = args.get(1);
+        NodeValue v3 = args.get(2);
+        NodeValue v4 = args.get(3);
+        return exec(v1, v2, v3, v4);
     }
-    
-    public abstract NodeValue exec(NodeValue v1, NodeValue v2, NodeValue v3, NodeValue v4) ;
+
+    public abstract NodeValue exec(NodeValue v1, NodeValue v2, NodeValue v3, NodeValue v4);
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase5.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase5.java
index ae1d3d66a6..111f4c3754 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase5.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase5.java
@@ -25,35 +25,27 @@ import org.apache.jena.sparql.expr.ExprEvalException;
 import org.apache.jena.sparql.expr.ExprList;
 import org.apache.jena.sparql.expr.NodeValue;
 
-/**
- * Support for a function of one argument.
- */
+/** Support for functions with five arguments. */
 public abstract class FunctionBase5 extends FunctionBase {
 
     @Override
     public void checkBuild(String uri, ExprList args) {
-        if (args.size() != 5) {
+        if ( args.size() != 5 ) {
             throw new QueryBuildException("Function '" + Lib.className(this) + "' takes five arguments");
         }
     }
 
     @Override
     public final NodeValue exec(List<NodeValue> args) {
-        if (args == null) // The contract on the function interface is that this should not happen.
-        {
+        if ( args == null )
             throw new ARQInternalErrorException(Lib.className(this) + ": Null args list");
-        }
-
-        if (args.size() != 5) {
+        if ( args.size() != 5 )
             throw new ExprEvalException(Lib.className(this) + ": Wrong number of arguments: Wanted 5, got " + args.size());
-        }
-
         NodeValue v1 = args.get(0);
         NodeValue v2 = args.get(1);
         NodeValue v3 = args.get(2);
         NodeValue v4 = args.get(3);
         NodeValue v5 = args.get(4);
-
         return exec(v1, v2, v3, v4, v5);
     }
 
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/SystemVar.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/SystemVar.java
index 103ea5728b..65d06a89de 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/SystemVar.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/SystemVar.java
@@ -44,12 +44,12 @@ public class SystemVar extends FunctionBase0 {
 
     @Override
     public NodeValue exec() {
-        throw new InternalErrorException("SystemVar.exec shoudl not have been called");
+        throw new InternalErrorException("SystemVar.exec should not have been called");
     }
 
     // Need to intercept exec so we can get to the FunctionEnv
     @Override
-    protected NodeValue exec(List<NodeValue> args, FunctionEnv env) {
+    public NodeValue exec(List<NodeValue> args, FunctionEnv env) {
         return get(systemSymbol, env);
     }
 
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/context.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/context.java
index c311e094b0..029265b0f3 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/context.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/context.java
@@ -44,7 +44,7 @@ public class context extends FunctionBase {
     }
 
     @Override
-    protected NodeValue exec(List<NodeValue> args, FunctionEnv env) {
+    public NodeValue exec(List<NodeValue> args, FunctionEnv env) {
         NodeValue v = args.get(0);
         if ( ! v.isString() )
             throw new ExprEvalException("Not a string: function afn:context("+v+")");
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/scripting/ScriptFunction.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/scripting/ScriptFunction.java
index 2807ab632f..062c35bd30 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/scripting/ScriptFunction.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/scripting/ScriptFunction.java
@@ -150,7 +150,7 @@ public class ScriptFunction extends FunctionBase {
     }
 
     @Override
-    protected NodeValue exec(List<NodeValue> args, FunctionEnv env) {
+    public NodeValue exec(List<NodeValue> args, FunctionEnv env) {
         env.getContext();
         return exec(args);
     }
@@ -231,15 +231,6 @@ public class ScriptFunction extends FunctionBase {
         }
 
         Invocable invocable = (Invocable) engine;
-//        for (String name : engine.getFactory().getNames()) {
-//            try {
-//                invocable.invokeFunction("arq" + name + "init");
-//            } catch (NoSuchMethodException ignore) {
-//                /* empty */
-//            } catch (ScriptException ex) {
-//                throw new ExprException("Failed to call " + lang + " initialization function", ex);
-//            }
-//        }
         return invocable;
     }