sparql.anything icon indicating copy to clipboard operation
sparql.anything copied to clipboard

fx:String.replace does not work

Open enridaga opened this issue 3 years ago • 1 comments

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)

enridaga avatar Nov 23 '21 12:11 enridaga

Why don't you use SPARQL builtin REPLACE function https://www.w3.org/TR/sparql11-query/#func-replace

luigi-asprino avatar Dec 07 '21 16:12 luigi-asprino

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)

enridaga avatar Dec 18 '22 08:12 enridaga

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

luigi-asprino avatar Jun 28 '23 16:06 luigi-asprino

Reopened because of problems with Java >14

enridaga avatar Jun 30 '23 13:06 enridaga

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.

enridaga avatar Jun 30 '23 13:06 enridaga