sparql.anything
sparql.anything copied to clipboard
fx:String.replace does not work
Not a big problem, we can use the standard replace
-- but is concerning because it is due to the fact that the wrong converter is used (Char instead of String):
[main] ERROR com.github.sparqlanything.cli.SPARQLAnything - Iteration 5 failed with error: String index out of range: 0
[main] ERROR com.github.sparqlanything.cli.SPARQLAnything - Details:
java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:47)
at java.base/java.lang.String.charAt(String.java:693)
at com.github.sparqlanything.engine.functions.reflection.Converters$CharConverter.asType(Converters.java:46)
at com.github.sparqlanything.engine.functions.reflection.Converters$CharConverter.asType(Converters.java:32)
at com.github.sparqlanything.engine.functions.reflection.ReflectionFunctionFactory$ReflectionFunction.createArguments(ReflectionFunctionFactory.java:163)
at com.github.sparqlanything.engine.functions.reflection.ReflectionFunctionFactory$ReflectionFunction.exec(ReflectionFunctionFactory.java:175)
at org.apache.jena.sparql.function.FunctionBase.exec(FunctionBase.java:64)
at org.apache.jena.sparql.function.FunctionBase.exec(FunctionBase.java:47)
at org.apache.jena.sparql.expr.E_Function.evalSpecial(E_Function.java:69)
at org.apache.jena.sparql.expr.ExprFunctionN.eval(ExprFunctionN.java:100)
at org.apache.jena.sparql.core.VarExprList.get(VarExprList.java:105)
at org.apache.jena.sparql.engine.iterator.QueryIterAssign.accept(QueryIterAssign.java:64)
at org.apache.jena.sparql.engine.iterator.QueryIterProcessBinding.hasNextBinding(QueryIterProcessBinding.java:81)
at org.apache.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:114)
at org.apache.jena.sparql.engine.iterator.QueryIterDefaulting.hasNextBinding(QueryIterDefaulting.java:54)
at org.apache.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:114)
at org.apache.jena.sparql.engine.iterator.QueryIterRepeatApply.hasNextBinding(QueryIterRepeatApply.java:69)
at org.apache.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:114)
at org.apache.jena.sparql.engine.iterator.QueryIterConvert.hasNextBinding(QueryIterConvert.java:58)
at org.apache.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:114)
at org.apache.jena.sparql.engine.iterator.QueryIteratorWrapper.hasNextBinding(QueryIteratorWrapper.java:38)
at org.apache.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:114)
at org.apache.jena.sparql.engine.iterator.QueryIteratorWrapper.hasNextBinding(QueryIteratorWrapper.java:38)
at org.apache.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:114)
at org.apache.jena.sparql.engine.ResultSetStream.hasNext(ResultSetStream.java:64)
at org.apache.jena.sparql.engine.ResultSetCheckCondition.hasNext(ResultSetCheckCondition.java:55)
at org.apache.jena.sparql.resultset.ResultSetMem.<init>(ResultSetMem.java:89)
at org.apache.jena.query.ResultSetFactory.makeRewindable(ResultSetFactory.java:311)
at org.apache.jena.query.ResultSet.rewindable(ResultSet.java:83)
at org.apache.jena.riot.resultset.rw.ResultSetWriterText.output$(ResultSetWriterText.java:132)
at org.apache.jena.riot.resultset.rw.ResultSetWriterText.output(ResultSetWriterText.java:120)
at org.apache.jena.riot.resultset.rw.ResultSetWriterText.output(ResultSetWriterText.java:116)
at org.apache.jena.riot.resultset.rw.ResultSetWriterText.write(ResultSetWriterText.java:59)
at org.apache.jena.riot.resultset.rw.ResultsWriter.write(ResultsWriter.java:156)
at org.apache.jena.riot.resultset.rw.ResultsWriter.write(ResultsWriter.java:126)
at org.apache.jena.riot.resultset.rw.ResultsWriter$Builder.write(ResultsWriter.java:90)
at org.apache.jena.query.ResultSetFormatter.out(ResultSetFormatter.java:167)
at org.apache.jena.query.ResultSetFormatter.out(ResultSetFormatter.java:149)
at org.apache.jena.query.ResultSetFormatter.out(ResultSetFormatter.java:86)
at org.apache.jena.query.ResultSetFormatter.asText(ResultSetFormatter.java:199)
at com.github.sparqlanything.cli.SPARQLAnything.executeQuery(SPARQLAnything.java:149)
at com.github.sparqlanything.cli.SPARQLAnything.main(SPARQLAnything.java:596)
Why don't you use SPARQL builtin REPLACE function https://www.w3.org/TR/sparql11-query/#func-replace
The concerning aspect here is that it makes emerge a limitation in the way we process method argument types. Java methods may have the same name and arg size but different typing, so the system attempts to execute .replace(char, char)
while it should match instead .replace(string, string)
The problem was related to the fact that CharSequence and String classes didn't appear as keys of the map converters
in ReflectionFunctionFactory.
This made compatible()
method to return false when checking replace(CharSequence, CharSequence).
5414596 registers StringConverter as converter for CharSequence and String
converters.put(CharSequence.class, new Converters.StringConverter());
converters.put(String.class, new Converters.StringConverter());
Reopened because of problems with Java >14
After discussion with @luigi-asprino we realised there was an issue in the selection of converters where Strings longer than 1 character where still matching methods as char
.