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
commit c1b5161378c9fe042354d17fefb44231f0f0a409 Author: Andy Seaborne <[email protected]> AuthorDate: Thu May 22 08:24:01 2025 +0100 GH-3144: Refinements for URI calls to functions --- .../org/apache/jena/sparql/core/BasicPattern.java | 2 +- .../jena/sparql/expr/E_AdjustToTimezone.java | 4 +++ .../java/org/apache/jena/sparql/expr/E_BNode.java | 17 +++++---- .../java/org/apache/jena/sparql/expr/E_IRI.java | 21 +++++------- .../java/org/apache/jena/sparql/expr/E_IRI2.java | 7 +++- .../org/apache/jena/sparql/expr/E_LogicalAnd.java | 4 +-- .../org/apache/jena/sparql/expr/E_LogicalOr.java | 4 +-- .../java/org/apache/jena/sparql/expr/E_Regex.java | 4 +++ .../org/apache/jena/sparql/expr/E_StrReplace.java | 14 +++++--- .../java/org/apache/jena/sparql/expr/E_URI.java | 12 +++---- .../java/org/apache/jena/sparql/expr/E_URI2.java | 14 ++++---- .../org/apache/jena/sparql/expr/E_Version.java | 19 +++++----- .../java/org/apache/jena/sparql/expr/Expr.java | 2 +- .../org/apache/jena/sparql/expr/ExprFunction.java | 8 ++--- .../java/org/apache/jena/sparql/expr/ExprNode.java | 6 +++- .../{E_Version.java => nodevalue/ARQFuncOp.java} | 40 +++++++++++----------- .../jena/sparql/expr/nodevalue/XSDFuncOp.java | 22 +++++++++--- .../sparql/expr/urifunctions/SPARQLDispatch.java | 37 ++++++++++++++++---- .../sparql/expr/urifunctions/SPARQLFuncOp.java | 33 ++++++++++-------- .../apache/jena/sparql/function/FunctionBase.java | 2 +- .../jena/sparql/function/library/FN_BEV.java | 2 +- .../sparql/function/library/leviathan/md5hash.java | 6 ++-- .../function/library/leviathan/sha256hash.java | 4 +-- .../jena/sparql/sse/builders/BuilderExpr.java | 2 +- .../apache/jena/sparql/syntax/TripleCollector.java | 2 +- .../apache/jena/sparql/expr/TestExpressions2.java | 2 +- .../apache/jena/sparql/expr/TestExpressions3.java | 4 +-- .../org/apache/jena/sparql/expr/TestNodeValue.java | 30 ++++++++-------- 28 files changed, 192 insertions(+), 132 deletions(-) diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/BasicPattern.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/BasicPattern.java index 04df9cbb05..5451caaa7a 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/core/BasicPattern.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/BasicPattern.java @@ -48,7 +48,7 @@ public class BasicPattern implements Iterable<Triple> { triples.addAll(other.triples) ; } - private BasicPattern(List<Triple> triples) { + public BasicPattern(List<Triple> triples) { this.triples = triples ; } diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_AdjustToTimezone.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_AdjustToTimezone.java index 9505496090..abe698b719 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_AdjustToTimezone.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_AdjustToTimezone.java @@ -25,6 +25,10 @@ import org.apache.jena.sparql.sse.Tags; /** Do any of FN_Adjust(date/time)ToTimezone */ public class E_AdjustToTimezone extends ExprFunctionN { + public E_AdjustToTimezone(Expr expr1){ + this(expr1, null); + } + public E_AdjustToTimezone(Expr expr1, Expr expr2){ super(Tags.tagAdjust, expr1, expr2); } diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_BNode.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_BNode.java index 5562bca8c0..9a871cbe0d 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_BNode.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_BNode.java @@ -36,17 +36,17 @@ public class E_BNode implements Unstable private static final Symbol keyMap = Symbol.create("arq:internal:bNodeMappings"); public static Expr create() { - return new E_BNode0(); + return new BNode0(); } public static Expr create(Expr expr) { - return new E_BNode1(expr); + return new BNode1(expr); } // --- The zero argument case. - private static class E_BNode0 extends ExprFunction0 implements Unstable { + public static class BNode0 extends ExprFunction0 implements Unstable { - protected E_BNode0() { + protected BNode0() { super(symbol); } @@ -57,13 +57,13 @@ public class E_BNode implements Unstable @Override public Expr copy() { - return new E_BNode0(); + return new BNode0(); } } // --- The one argument case. - private static class E_BNode1 extends ExprFunction1 implements Unstable { - protected E_BNode1(Expr expr) { + public static class BNode1 extends ExprFunction1 implements Unstable { + protected BNode1(Expr expr) { super(expr, symbol); } @@ -102,8 +102,7 @@ public class E_BNode implements Unstable @Override public Expr copy(Expr expr) { - return new E_BNode1(expr); + return new BNode1(expr); } } - } diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI.java index 375103cb74..ff39aab87a 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI.java @@ -34,8 +34,8 @@ import org.apache.jena.sparql.sse.Tags; * The function URI(expr) is the same, but under a different name as a * subclass. * <p> - * As an ARQ extension , there is also {@code IRI(base, relative)} form which is E_IRI2. - * The relative URI (string or IRI) is resolved against the result of the "base" expression. + * See also E_IRI2, an ARQ extension. That allows a base and a relative IRI. + * The relative URI (string or IRI) is resolved against the result of the value of the base expression. * which in turn is resolved as per the one-argument form. */ public class E_IRI extends ExprFunction1 { @@ -62,7 +62,7 @@ public class E_IRI extends ExprFunction1 { this.relExpr = relExpr; } - // Evaluation of a "one argument with access to the env. + // Evaluation of a "one argument" with access to the env. @Override protected NodeValue evalSpecial(Binding binding, FunctionEnv env) { // IRI(relative) @@ -72,15 +72,18 @@ public class E_IRI extends ExprFunction1 { return resolve(nvRel, baseIRI, env); } + @Override + public NodeValue eval(NodeValue v, FunctionEnv env) { + // Shouldn't be called. Legacy only. + return resolve(v, parserBase, env); + } + /*package*/ static NodeValue resolve(NodeValue relative, String baseIRI, FunctionEnv env) { if ( baseIRI == null ) { if ( env.getContext() != null ) { Query query = (Query)env.getContext().get(ARQConstants.sysCurrentQuery); if ( query != null ) baseIRI = query.getBaseURI(); - // If still null, NodeFunctions.iri will use the system base. -// if ( baseIRI == null ) -// baseIRI = IRIs.getBaseStr(); } } if ( NodeFunctions.isIRI(relative.asNode()) ) { @@ -90,12 +93,6 @@ public class E_IRI extends ExprFunction1 { return NodeFunctions.iri(relative, baseIRI); } - @Override - public NodeValue eval(NodeValue v, FunctionEnv env) { - // Shouldn't be called. Legacy only. Does not support baseExpr!=null - return resolve(v, parserBase, env); - } - @Override public Expr copy(Expr expr) { return new E_IRI(parserBase, expr); diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI2.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI2.java index d189952f0d..aa6f138a38 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI2.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI2.java @@ -43,14 +43,19 @@ public class E_IRI2 extends ExprFunction2 { private static final String sseFunctionName = Tags.tagIri2; // The base in force when the function was created. - // Kept separate from baseExpr so we can see whether it was the one argument or two argument form. protected final String parserBase; // ARQ extension: "IRI(base, relative)" protected final Expr baseExpr; protected final Expr relExpr; + public E_IRI2(Expr baseExpr, Expr relExpr) { + this(baseExpr, null, relExpr); + } + public E_IRI2(Expr baseExpr, String parserBaseURI, Expr relExpr) { + // BaseStr is the base in force at the time this expression was created. + // This may be null. this(baseExpr, parserBaseURI, relExpr, sparqlPrintName, sseFunctionName); } diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalAnd.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalAnd.java index 8a8ff4f9b0..51cabe4ef8 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalAnd.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalAnd.java @@ -42,7 +42,7 @@ public class E_LogicalAnd extends ExprFunction2 try { NodeValue x = getArg1().eval(binding, env) ; - if ( ! XSDFuncOp.booleanEffectiveValue(x) ) + if ( ! XSDFuncOp.effectiveBooleanValue(x) ) return NodeValue.FALSE ; } catch (ExprEvalException eee) { @@ -55,7 +55,7 @@ public class E_LogicalAnd extends ExprFunction2 try { NodeValue y = getArg2().eval(binding, env) ; - if ( ! XSDFuncOp.booleanEffectiveValue(y) ) + if ( ! XSDFuncOp.effectiveBooleanValue(y) ) return NodeValue.FALSE ; // RHS is true but was there an error earlier? diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalOr.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalOr.java index 1c09a6698b..f81637863b 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalOr.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalOr.java @@ -57,7 +57,7 @@ public class E_LogicalOr extends ExprFunction2 try { NodeValue x = getArg1().eval(binding, env) ; - if ( XSDFuncOp.booleanEffectiveValue(x) ) + if ( XSDFuncOp.effectiveBooleanValue(x) ) return NodeValue.TRUE ; } catch (ExprEvalException eee) { @@ -70,7 +70,7 @@ public class E_LogicalOr extends ExprFunction2 try { NodeValue y = getArg2().eval(binding, env) ; - if ( XSDFuncOp.booleanEffectiveValue(y) ) + if ( XSDFuncOp.effectiveBooleanValue(y) ) return NodeValue.TRUE ; // RHS is false but was there an error earlier? diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Regex.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Regex.java index eaa58e299a..e924344668 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Regex.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Regex.java @@ -33,6 +33,10 @@ public class E_Regex extends ExprFunctionN private static final String name = Tags.tagRegex; private RegexEngine regexEngine = null; + public E_Regex(Expr expr, Expr pattern) { + this(expr, pattern, null); + } + public E_Regex(Expr expr, Expr pattern, Expr flags) { super(name, expr, pattern, flags); init(pattern, flags); diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_StrReplace.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_StrReplace.java index 3fafec212e..faadfccca2 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_StrReplace.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_StrReplace.java @@ -25,19 +25,25 @@ import org.apache.jena.sparql.expr.nodevalue.XSDFuncOp ; import org.apache.jena.sparql.sse.Tags ; public class E_StrReplace extends ExprFunctionN { - private static final String symbol = Tags.tagReplace ; - private Pattern pattern = null ; + private static final String symbol = Tags.tagReplace; + private final Pattern pattern; + + public E_StrReplace(Expr expr1, Expr expr2, Expr expr3) { + this(expr1, expr2, expr3, null); + } public E_StrReplace(Expr expr1, Expr expr2, Expr expr3, Expr expr4) { - super(symbol, expr1, expr2, expr3, expr4) ; + super(symbol, expr1, expr2, expr3, expr4); + Pattern pattern0 = null; if ( isString(expr2) && (expr4 == null || isString(expr4)) ) { String flags = null; if ( expr4 != null && expr4.isConstant() && expr4.getConstant().isString() ) flags = expr4.getConstant().getString(); String patternStr = expr2.getConstant().getString(); - pattern = RegexEngine.makePattern("REPLACE", patternStr, flags); + pattern0 = RegexEngine.makePattern("REPLACE", patternStr, flags); } + pattern = pattern0; } private static boolean isString(Expr expr) { diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI.java index 162b001584..84072c649b 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI.java @@ -33,19 +33,19 @@ public class E_URI extends E_IRI { this(null, relExpr); } - public E_URI(String baseStr, Expr relExpr) { - super(baseStr, relExpr, sparqlPrintName, sseFunctionName); + public E_URI(String parserBaseURI, Expr relExpr) { + super(parserBaseURI, relExpr, sparqlPrintName, sseFunctionName); } - @Override - public String getFunctionPrintName(SerializationContext cxt) - { return sparqlPrintName ; } - @Override public Expr copy(Expr expr) { return new E_URI(parserBase, expr); } + @Override + public String getFunctionPrintName(SerializationContext cxt) + { return sparqlPrintName ; } + @Override public int hashCode() { return super.hashCode()+1; diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI2.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI2.java index 32698e2f95..b05aeb4998 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI2.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI2.java @@ -29,23 +29,25 @@ public class E_URI2 extends E_IRI2 { private static final String sparqlPrintName = "URI"; private static final String sseFunctionName = Tags.tagUri2; - public E_URI2(String baseURI, Expr relExpr) { - this(null, baseURI, relExpr); + public E_URI2(Expr baseExpr, Expr relExpr) { + this(baseExpr, null, relExpr); } public E_URI2(Expr baseExpr, String baseStr, Expr relExpr) { + // BaseStr is the base in force at the time this expression was created. + // This may be null. super(baseExpr, baseStr, relExpr, sparqlPrintName, sseFunctionName); } - @Override - public String getFunctionPrintName(SerializationContext cxt) - { return sparqlPrintName ; } - @Override public Expr copy(Expr expr1, Expr expr2) { return new E_URI2(expr1, parserBase, expr2); } + @Override + public String getFunctionPrintName(SerializationContext cxt) + { return sparqlPrintName ; } + @Override public int hashCode() { return super.hashCode()+1; diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Version.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Version.java index 0653096a5e..ec44bf4330 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Version.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Version.java @@ -18,28 +18,25 @@ package org.apache.jena.sparql.expr; -import org.apache.jena.query.ARQ ; +import org.apache.jena.sparql.expr.nodevalue.ARQFuncOp; import org.apache.jena.sparql.function.FunctionEnv ; import org.apache.jena.sparql.sse.Tags ; public class E_Version extends ExprFunction0 { static private String fName = Tags.tagVersion ; - - public E_Version() - { - super(fName) ; + + public E_Version() { + super(fName); } @Override - public Expr copy() - { - return new E_Version() ; + public Expr copy() { + return new E_Version(); } @Override - public NodeValue eval(FunctionEnv env) - { - return NodeValue.makeString(ARQ.NAME+" "+ARQ.VERSION) ; + public NodeValue eval(FunctionEnv env) { + return ARQFuncOp.version(); } } diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java index 96df7d76e3..d360897c07 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java @@ -38,7 +38,7 @@ public interface Expr public static final int CMP_UNEQUAL = -9 ; public static final int CMP_INDETERMINATE = DatatypeConstants.INDETERMINATE ; - /** Test whether a Constraint is satisfied, given a set of bindings + /** Test whether a constraint is satisfied, given a set of bindings. * Includes error propagation and Effective Boolean Value rules. * * @param binding The bindings diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprFunction.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprFunction.java index 9135fcdbb8..8d6624f97b 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprFunction.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprFunction.java @@ -96,15 +96,15 @@ public abstract class ExprFunction extends ExprNode } /** - * Name used for output in SPARQL format needing functional form (no specific keyword). + * Name used for output in SPARQL format needing functional syntax: name(arg1, arg2, ...) * e.g. regexp(), custom functions, ... */ public String getFunctionPrintName(SerializationContext cxt) { return funcSymbol.getSymbol(); } /** - * Name used in a functional form (i.e. SPARQL algebra). - * getOpName() is used in preference as a short, symbol name. + * Name used in the SPARQL algebra. + * See also {@link #getOpName} for an operator form. */ public String getFunctionName(SerializationContext cxt) { return funcSymbol.getSymbol(); } @@ -116,7 +116,7 @@ public abstract class ExprFunction extends ExprNode /** URI for this function, whether custom or specification defined URI (these are keywords in the language) */ public String getFunctionIRI() { return null; } - /** Get the symbol name (+, ! etc) for this function -- maybe null for none */ + /** Get the operator symbol name (+, ! etc) for this function -- maybe null for none */ public String getOpName() { return opSign; } } diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java index 03249a637b..85e8190aae 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java @@ -40,7 +40,7 @@ public abstract class ExprNode implements Expr public boolean isSatisfied(Binding binding, FunctionEnv funcEnv) { try { NodeValue v = eval(binding, funcEnv); - boolean b = XSDFuncOp.booleanEffectiveValue(v); + boolean b = XSDFuncOp.effectiveBooleanValue(v); return b; } catch (ExprEvalException ex) { @@ -48,7 +48,11 @@ public abstract class ExprNode implements Expr } } + /** @deprecated Unnecessary - to be removed */ + @Deprecated(forRemoval = true) public boolean isExpr() { return true; } + /** @deprecated Unnecessary - to be removed */ + @Deprecated(forRemoval = true) public final Expr getExpr() { return this; } // --- interface Constraint diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Version.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/ARQFuncOp.java similarity index 51% copy from jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Version.java copy to jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/ARQFuncOp.java index 0653096a5e..1c8b27e1b3 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Version.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/ARQFuncOp.java @@ -16,30 +16,30 @@ * limitations under the License. */ -package org.apache.jena.sparql.expr; +package org.apache.jena.sparql.expr.nodevalue; -import org.apache.jena.query.ARQ ; -import org.apache.jena.sparql.function.FunctionEnv ; -import org.apache.jena.sparql.sse.Tags ; +import java.util.Optional; -public class E_Version extends ExprFunction0 -{ - static private String fName = Tags.tagVersion ; - - public E_Version() - { - super(fName) ; - } +import org.apache.jena.atlas.lib.Version; +import org.apache.jena.query.ARQ; +import org.apache.jena.sparql.expr.NodeValue; + +/** Functions specific to ARQ */ +public class ARQFuncOp { - @Override - public Expr copy() - { - return new E_Version() ; + /** The return version information as a human-readable string.*/ + public static NodeValue version() { + String verStr = versionString(); + return NodeValue.makeString(verStr); } - @Override - public NodeValue eval(FunctionEnv env) - { - return NodeValue.makeString(ARQ.NAME+" "+ARQ.VERSION) ; + private static String versionString() { + if ( true ) + return ARQ.NAME+" "+ARQ.VERSION; + Optional<String> version = Version.versionForClass(ARQ.class); + if ( version.isPresent() ) + return String.format("Apache Jena version %s", version.get()); + + return "Apache Jena"; } } diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java index 4a17dbc04c..7bf9ffd8fb 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java @@ -295,19 +295,33 @@ public class XSDFuncOp /** {@literal F&O} fn:not */ public static NodeValue not(NodeValue nv) { - boolean b = XSDFuncOp.booleanEffectiveValue(nv); + boolean b = XSDFuncOp.effectiveBooleanValue(nv); return NodeValue.booleanReturn(!b); } - /** {@literal F&O} fn:boolean */ + /** @deprecated Renamed as {@link effectiveBooleanValueAsNodeValue}. */ + @Deprecated(forRemoval = true) public static NodeValue booleanEffectiveValueAsNodeValue(NodeValue nv) { + return effectiveBooleanValueAsNodeValue(nv); + } + + /** {@literal F&O} fn:boolean */ + public static NodeValue effectiveBooleanValueAsNodeValue(NodeValue nv) { if ( nv.isBoolean() ) // "Optimization" (saves on object churn) return nv; - return NodeValue.booleanReturn(booleanEffectiveValue(nv)); + return NodeValue.booleanReturn(effectiveBooleanValue(nv)); } - /** {@literal F&O} fn:boolean */ + /** @deprecated Renamed as {@link effectiveBooleanValue}. */ + @Deprecated(forRemoval = true) public static boolean booleanEffectiveValue(NodeValue nv) { + return effectiveBooleanValue(nv); + } + + /** {@literal F&O} fn:boolean */ + public static boolean effectiveBooleanValue(NodeValue nv) { + Objects.requireNonNull(nv, "NodeValue is null in call to effectiveBooleanValue"); + // Apply the "boolean effective value" rules // boolean: value of the boolean (strictly, if derived from xsd:boolean) // plain literal: lexical form length(string) > 0 diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLDispatch.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLDispatch.java index 0f40f6287a..c301490275 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLDispatch.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLDispatch.java @@ -123,6 +123,18 @@ public class SPARQLDispatch { } // Switch on arity + static void register(Map<String, Call> map, String uri, Function3 function3, Function4 function4) { + Call call = args->{ + if ( args.length == 3 ) + return function3.exec(args[0], args[1], args[2]); + if ( args.length == 4 ) + return function4.exec(args[0], args[1], args[2], args[3]); + throw exception("%s: Expected three or four arguments. Got %d", uri, args.length); + }; + registerCall(map, uri, call); + } + + // Arity N static void register(Map<String, Call> map, String uri, FunctionN function) { Call call = args->{ return function.exec(args); @@ -150,6 +162,10 @@ public class SPARQLDispatch { static Map<String, Call> buildDispatchMap() { Map<String, Call> map = new HashMap<>(); + + // Move out/rename to "FunctionDispatch" + // Add ARQ specials. + register(map, "plus", SPARQLFuncOp::sparql_plus ); register(map, "add", SPARQLFuncOp::sparql_plus ); // Alt name. register(map, "subtract", SPARQLFuncOp::sparql_subtract ); @@ -161,7 +177,7 @@ public class SPARQLDispatch { register(map, "not-equals", SPARQLFuncOp::sparql_not_equals ); register(map, "greaterThan", SPARQLFuncOp::sparql_greaterThan ); register(map, "greaterThanOrEqual", SPARQLFuncOp::sparql_greaterThanOrEqual ); - register(map, "lessThan", SPARQLFuncOp::sparql_lessThat ); + register(map, "lessThan", SPARQLFuncOp::sparql_lessThan ); register(map, "lessThanOrEqual", SPARQLFuncOp::sparql_lessThanOrEqual ); register(map, "and", SPARQLFuncOp::sparql_function_and ); @@ -184,9 +200,13 @@ public class SPARQLDispatch { register(map, "floor", SPARQLFuncOp::sparql_floor); register(map, "haslang", SPARQLFuncOp::sparql_haslang); register(map, "haslangdir", SPARQLFuncOp::sparql_haslangdir); + // Arity 1/2 - register(map, "iri", x->SPARQLFuncOp.sparql_iri(x), (x,b)->SPARQLFuncOp.sparql_iri(x,b)); - register(map, "uri", SPARQLFuncOp::sparql_uri); + //register(map, "iri", x->SPARQLFuncOp.sparql_iri(x), (x,b)->SPARQLFuncOp.arq_iri(x,b)); + register(map, "iri", SPARQLFuncOp::sparql_iri, SPARQLFuncOp::arq_iri); + //register(map, "uri", x->SPARQLFuncOp.sparql_uri(x), (x,b)->SPARQLFuncOp.arq_uri(x,b)); + register(map, "uri", SPARQLFuncOp::sparql_uri, SPARQLFuncOp::arq_uri); + register(map, "isBlank", SPARQLFuncOp::sparql_isBlank); register(map, "isLiteral", SPARQLFuncOp::sparql_isLiteral); register(map, "isNumeric", SPARQLFuncOp::sparql_isNumeric); @@ -199,8 +219,12 @@ public class SPARQLDispatch { register(map, "ucase", SPARQLFuncOp::sparql_ucase); register(map, "now", SPARQLFuncOp::sparql_now); register(map, "rand", SPARQLFuncOp::sparql_rand); - register(map, "regex", SPARQLFuncOp::sparql_regex); - register(map, "replace", SPARQLFuncOp::sparql_replace); + // Arity 2/3 + register(map, "regex", SPARQLFuncOp::sparql_regex, SPARQLFuncOp::sparql_regex); + + // Arity 3/4 + register(map, "replace", SPARQLFuncOp::sparql_replace, SPARQLFuncOp::sparql_replace); + register(map, "round", SPARQLFuncOp::sparql_round); register(map, "sameTerm", SPARQLFuncOp::sparql_sameTerm); register(map, "sameValue", SPARQLFuncOp::sparql_sameValue); @@ -223,6 +247,7 @@ public class SPARQLDispatch { register(map, "md5", SPARQLFuncOp::sparql_md5); register(map, "sha1", SPARQLFuncOp::sparql_sha1); + register(map, "sha224", SPARQLFuncOp::sparql_sha224); register(map, "sha256", SPARQLFuncOp::sparql_sha256); register(map, "sha384", SPARQLFuncOp::sparql_sha384); register(map, "sha512", SPARQLFuncOp::sparql_sha512); @@ -237,7 +262,7 @@ public class SPARQLDispatch { register(map, "strlen", SPARQLFuncOp::sparql_strlen); register(map, "strstarts", SPARQLFuncOp::sparql_strstarts); // Arity 2/3 - register(map, "substr", (s,x)->SPARQLFuncOp.sparql_substr(s,x), (s,x,y)->SPARQLFuncOp.sparql_substr(s,x,y)); + register(map, "substr", SPARQLFuncOp::sparql_substr, SPARQLFuncOp::sparql_substr); register(map, "struuid", SPARQLFuncOp::sparql_struuid); return Map.copyOf(map); diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLFuncOp.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLFuncOp.java index f04157ed8e..411473218c 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLFuncOp.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLFuncOp.java @@ -143,7 +143,7 @@ public class SPARQLFuncOp { return NodeValue.booleanReturn(r == Expr.CMP_GREATER); } - public static NodeValue sparql_lessThat(NodeValue nv1, NodeValue nv2) { + public static NodeValue sparql_lessThan(NodeValue nv1, NodeValue nv2) { int r = NodeValue.compare(nv1, nv2); return NodeValue.booleanReturn(r == Expr.CMP_LESS); } @@ -158,22 +158,22 @@ public class SPARQLFuncOp { return NodeValue.booleanReturn(r == Expr.CMP_LESS || r == Expr.CMP_EQUAL); } - // and,or,not as functions (arguments have been evaluated) + // and, or, not as functions (arguments have been evaluated) public static NodeValue sparql_function_and(NodeValue nv1, NodeValue nv2) { - boolean arg1 = XSDFuncOp.booleanEffectiveValue(nv1); - boolean arg2 = XSDFuncOp.booleanEffectiveValue(nv2); + boolean arg1 = XSDFuncOp.effectiveBooleanValue(nv1); + boolean arg2 = XSDFuncOp.effectiveBooleanValue(nv2); return NodeValue.booleanReturn(arg1 && arg2); } public static NodeValue sparql_function_or(NodeValue nv1, NodeValue nv2) { - boolean arg1 = XSDFuncOp.booleanEffectiveValue(nv1); - boolean arg2 = XSDFuncOp.booleanEffectiveValue(nv2); + boolean arg1 = XSDFuncOp.effectiveBooleanValue(nv1); + boolean arg2 = XSDFuncOp.effectiveBooleanValue(nv2); return NodeValue.booleanReturn(arg1 || arg2); } public static NodeValue sparql_function_not(NodeValue nv) { - boolean arg = XSDFuncOp.booleanEffectiveValue(nv); + boolean arg = XSDFuncOp.effectiveBooleanValue(nv); return NodeValue.booleanReturn(!arg); } @@ -226,11 +226,12 @@ public class SPARQLFuncOp { // Term functions : NodeFunctions public static NodeValue sparql_iri(NodeValue nv) { return NodeFunctions.iri(nv, null); } - // Extension - public static NodeValue sparql_iri(NodeValue nv, NodeValue nvBase) { return NodeFunctions.iri(nv, nvBase.getString()); } - public static NodeValue sparql_uri(NodeValue nv) { return sparql_iri(nv); } + // Extension + public static NodeValue arq_iri(NodeValue nv, NodeValue nvBase) { return NodeFunctions.iri(nv, nvBase.getString()); } + public static NodeValue arq_uri(NodeValue nv, NodeValue nvBase) { return NodeFunctions.iri(nv, nvBase.getString()); } + // Only BNODE(), not BNODE(str) public static NodeValue sparql_bnode() { return null; } @@ -256,10 +257,7 @@ public class SPARQLFuncOp { public static NodeValue sparql_contains(NodeValue nv1, NodeValue nv2) { return XSDFuncOp.strContains(nv1, nv2); } public static NodeValue sparql_strbefore(NodeValue nv1, NodeValue nv2) { return XSDFuncOp.strBefore(nv1, nv2); } public static NodeValue sparql_strafter(NodeValue nv1, NodeValue nv2) { return XSDFuncOp.strAfter(nv1, nv2); } - - public static NodeValue sparql_concat(NodeValue...args) { - return XSDFuncOp.strConcat(List.of(args)); - } + public static NodeValue sparql_concat(NodeValue...args) { return XSDFuncOp.strConcat(List.of(args)); } public static NodeValue sparql_langMatches(NodeValue nv1, NodeValue nv2) { return NodeFunctions.langMatches(nv1, nv2); } @@ -270,10 +268,11 @@ public class SPARQLFuncOp { return regexEngineCache.get(cacheKey, (key)->E_Regex.makeRegexEngine(key.pattern, key.flags)); } + public static NodeValue sparql_regex(NodeValue string, NodeValue pattern) { return sparql_regex(string, pattern, null); } public static NodeValue sparql_regex(NodeValue string, NodeValue pattern, NodeValue flags) { // Cache - this means regexes are compiled once. String patternStr = pattern.getString(); - String flagsStr = flags.getString(); + String flagsStr = (flags == null) ? null : flags.getString(); RegexEngine regexEngine = getRegexEngine(patternStr, flagsStr); String str = string.getString(); boolean b = regexEngine.match(str); @@ -283,6 +282,9 @@ public class SPARQLFuncOp { public static NodeValue sparql_replace(NodeValue nvStr, NodeValue nvPattern, NodeValue nvReplacement) { return XSDFuncOp.strReplace(nvStr, nvPattern, nvReplacement); } + public static NodeValue sparql_replace(NodeValue nvStr, NodeValue nvPattern, NodeValue nvReplacement, NodeValue envFlags) + { return XSDFuncOp.strReplace(nvStr, nvPattern, nvReplacement, envFlags); } + public static NodeValue sparql_encode(NodeValue nv) { return XSDFuncOp.strEncodeForURI(nv); } public static NodeValue sparql_abs(NodeValue nv) { return XSDFuncOp.abs(nv); } public static NodeValue sparql_round(NodeValue nv) { return XSDFuncOp.round(nv); } @@ -316,6 +318,7 @@ public class SPARQLFuncOp { public static NodeValue sparql_md5(NodeValue nv) { return NodeValueDigest.calculateDigest(nv, "MD-5"); } public static NodeValue sparql_sha1(NodeValue nv) { return NodeValueDigest.calculateDigest(nv, "SHA-1"); } + public static NodeValue sparql_sha224(NodeValue nv) { return NodeValueDigest.calculateDigest(nv, "SHA-224"); } public static NodeValue sparql_sha256(NodeValue nv) { return NodeValueDigest.calculateDigest(nv, "SHA-256"); } public static NodeValue sparql_sha384(NodeValue nv) { return NodeValueDigest.calculateDigest(nv, "SHA-384"); } public static NodeValue sparql_sha512(NodeValue nv) { return NodeValueDigest.calculateDigest(nv, "SHA-512"); } 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 3268c0f44b..50c145b5b1 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 @@ -66,5 +66,5 @@ public abstract class FunctionBase implements Function { /** Function call to a list of evaluated argument values */ public abstract NodeValue exec(List<NodeValue> args) ; - public abstract void checkBuild(String uri, ExprList args) ; + public abstract void checkBuild(String uri, ExprList args); } diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/FN_BEV.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/FN_BEV.java index e454595dca..3e84afc90f 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/FN_BEV.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/FN_BEV.java @@ -29,6 +29,6 @@ public class FN_BEV extends FunctionBase1 @Override public NodeValue exec(NodeValue x) { - return XSDFuncOp.booleanEffectiveValueAsNodeValue(x) ; + return XSDFuncOp.effectiveBooleanValueAsNodeValue(x) ; } } diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/md5hash.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/md5hash.java index a8f6f7919b..3cab49be6e 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/md5hash.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/md5hash.java @@ -24,9 +24,9 @@ import org.apache.jena.sparql.expr.NodeValue ; import org.apache.jena.sparql.function.FunctionBase1 ; public class md5hash extends FunctionBase1 { - - private ExprDigest digest = new E_MD5(NodeValue.makeBoolean(true).getExpr()); - + + private ExprDigest digest = new E_MD5(NodeValue.makeBoolean(true)); + @Override public NodeValue exec(NodeValue v) { return digest.eval(v); diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/sha256hash.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/sha256hash.java index e3224371a4..65b518d8c4 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/sha256hash.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/sha256hash.java @@ -25,8 +25,8 @@ import org.apache.jena.sparql.function.FunctionBase1 ; public class sha256hash extends FunctionBase1 { - private ExprDigest digest = new E_SHA256(NodeValue.makeBoolean(true).getExpr()); - + private ExprDigest digest = new E_SHA256(NodeValue.makeBoolean(true)); + @Override public NodeValue exec(NodeValue v) { return digest.eval(v); diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderExpr.java b/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderExpr.java index 2e22f1c0f8..189044b597 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderExpr.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderExpr.java @@ -796,7 +796,7 @@ public class BuilderExpr if ( numArgs(list) == 2 ) { Expr expr1 = buildExpr(list.get(1)); Expr expr2 = buildExpr(list.get(2)); - return new E_URI2(expr1, null, expr2); + return new E_URI2(expr1, expr2); } String baseStr = asString(list.get(1)); Expr expr1 = buildExpr(list.get(2)); diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/TripleCollector.java b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/TripleCollector.java index 2fc60d5b89..d54931acb4 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/TripleCollector.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/TripleCollector.java @@ -36,7 +36,7 @@ public interface TripleCollector // triples 0..(mark-1) before using a mark. That is, use marks in // LIFO (stack) order. - public default int mark() { throw new InternalErrorException("Mark no tsupported"); } + public default int mark() { throw new InternalErrorException("Mark not supported"); } public default void addTriple(int index, Triple t) { addTriple(t); } diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions2.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions2.java index 60e096cf0b..f884ab937e 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions2.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions2.java @@ -245,7 +245,7 @@ public class TestExpressions2 /*package*/ static void eval(String string, boolean result) { Expr expr = ExprUtils.parse(string) ; NodeValue nv = expr.eval(null, LibTestExpr.createTest()) ; - boolean b = XSDFuncOp.booleanEffectiveValue(nv) ; + boolean b = XSDFuncOp.effectiveBooleanValue(nv) ; assertEquals(string, result, b) ; } } diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions3.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions3.java index 324610252c..81c8a01362 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions3.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions3.java @@ -51,7 +51,7 @@ public class TestExpressions3 Binding binding = binding(bindingStr) ; Expr expr = ExprUtils.parse(string) ; NodeValue nv = expr.eval(binding, LibTestExpr.createTest()) ; - boolean b = XSDFuncOp.booleanEffectiveValue(nv) ; + boolean b = XSDFuncOp.effectiveBooleanValue(nv) ; assertEquals(string, expected, b) ; } @@ -60,7 +60,7 @@ public class TestExpressions3 Binding binding = binding(bindingStr) ; Expr expr = SSE.parseExpr(exprString) ; NodeValue nv = expr.eval(binding, LibTestExpr.createTest()) ; - boolean b = XSDFuncOp.booleanEffectiveValue(nv) ; + boolean b = XSDFuncOp.effectiveBooleanValue(nv) ; assertEquals(exprString, expected, b) ; } diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java index 8e1bf78ffc..24b6ff7cc7 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java @@ -493,7 +493,7 @@ public class TestNodeValue assertTrue("Not a boolean: " + v, v.isBoolean()); // assertTrue("Not a node: "+v, v.hasNode()) ; assertTrue("Not true: " + v, v.getBoolean()); - assertTrue("Not true: " + v, XSDFuncOp.booleanEffectiveValue(v)); + assertTrue("Not true: " + v, XSDFuncOp.effectiveBooleanValue(v)); } @Test @@ -502,7 +502,7 @@ public class TestNodeValue assertTrue("Not a boolean: " + v, v.isBoolean()); // assertTrue("Not a node: "+v, v.hasNode()) ; assertFalse("Not false: " + v, v.getBoolean()); - assertFalse("Not false: " + v, XSDFuncOp.booleanEffectiveValue(v)); + assertFalse("Not false: " + v, XSDFuncOp.effectiveBooleanValue(v)); } @Test @@ -693,21 +693,21 @@ public class TestNodeValue public void testEBV1() { assertTrue("Not a boolean", NodeValue.TRUE.isBoolean()); assertTrue("Not true", NodeValue.TRUE.getBoolean()); - assertTrue("Not true", XSDFuncOp.booleanEffectiveValue(NodeValue.TRUE)); + assertTrue("Not true", XSDFuncOp.effectiveBooleanValue(NodeValue.TRUE)); } @Test public void testEBV2() { assertTrue("Not a boolean", NodeValue.FALSE.isBoolean()); assertFalse("Not false", NodeValue.FALSE.getBoolean()); - assertFalse("Not false", XSDFuncOp.booleanEffectiveValue(NodeValue.FALSE)); + assertFalse("Not false", XSDFuncOp.effectiveBooleanValue(NodeValue.FALSE)); } @Test public void testEBV3() { NodeValue v = NodeValue.makeInteger(1); assertFalse("It's a boolean: " + v, v.isBoolean()); - assertTrue("Not EBV true: " + v, XSDFuncOp.booleanEffectiveValue(v)); + assertTrue("Not EBV true: " + v, XSDFuncOp.effectiveBooleanValue(v)); } @Test @@ -719,7 +719,7 @@ public class TestNodeValue fail("getBoolean should fail"); } catch (ExprEvalException e) {} - assertFalse("Not EBV false: " + v, XSDFuncOp.booleanEffectiveValue(v)); + assertFalse("Not EBV false: " + v, XSDFuncOp.effectiveBooleanValue(v)); } @Test @@ -732,7 +732,7 @@ public class TestNodeValue fail("getBoolean should fail"); } catch (ExprEvalException e) {} - assertTrue("Not EBV true: " + v, XSDFuncOp.booleanEffectiveValue(v)); + assertTrue("Not EBV true: " + v, XSDFuncOp.effectiveBooleanValue(v)); } @Test @@ -744,7 +744,7 @@ public class TestNodeValue fail("getBoolean should fail"); } catch (ExprEvalException e) {} - assertFalse("Not EBV false: " + v, XSDFuncOp.booleanEffectiveValue(v)); + assertFalse("Not EBV false: " + v, XSDFuncOp.effectiveBooleanValue(v)); } // EBV includes plain literals which includes language tagged literals. @@ -752,18 +752,18 @@ public class TestNodeValue public void testEBV7() { Node x = NodeFactory.createLiteralLang("", "en"); NodeValue v = NodeValue.makeNode(x); - assertFalse("Not EBV false: " + v, XSDFuncOp.booleanEffectiveValue(v)); + assertFalse("Not EBV false: " + v, XSDFuncOp.effectiveBooleanValue(v)); } @Test public void testEBV8() { Node x = NodeFactory.createLiteralLang("not empty", "en"); NodeValue v = NodeValue.makeNode(x); - assertTrue("Not EBV true: " + v, XSDFuncOp.booleanEffectiveValue(v)); + assertTrue("Not EBV true: " + v, XSDFuncOp.effectiveBooleanValue(v)); } static boolean ebvDouble(double d) { - return XSDFuncOp.booleanEffectiveValue(NodeValue.makeDouble(d)); + return XSDFuncOp.effectiveBooleanValue(NodeValue.makeDouble(d)); } @Test @@ -783,11 +783,11 @@ public class TestNodeValue Node x = NodeFactory.createLiteralDT("NaN", XSDDatatype.XSDdouble); NodeValue v = NodeValue.makeNode(x); - assertFalse(XSDFuncOp.booleanEffectiveValue(v)); + assertFalse(XSDFuncOp.effectiveBooleanValue(v)); } static boolean ebvFloat(float f) { - return XSDFuncOp.booleanEffectiveValue(NodeValue.makeFloat(f)); + return XSDFuncOp.effectiveBooleanValue(NodeValue.makeFloat(f)); } @Test @@ -807,12 +807,12 @@ public class TestNodeValue Node x = NodeFactory.createLiteralDT("NaN", XSDDatatype.XSDfloat); NodeValue v = NodeValue.makeNode(x); - assertFalse(XSDFuncOp.booleanEffectiveValue(v)); + assertFalse(XSDFuncOp.effectiveBooleanValue(v)); } private static boolean filterEBV(NodeValue nv) { try { - return XSDFuncOp.booleanEffectiveValue(nv); + return XSDFuncOp.effectiveBooleanValue(nv); } catch (ExprEvalException ex) { return false;
