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