[ 
https://issues.apache.org/jira/browse/JENA-1367?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16061904#comment-16061904
 ] 

ASF GitHub Bot commented on JENA-1367:
--------------------------------------

Github user kinow commented on a diff in the pull request:

    https://github.com/apache/jena/pull/266#discussion_r123874995
  
    --- Diff: 
jena-arq/src/main/java/org/apache/jena/sparql/pfunction/library/strSplit.java 
---
    @@ -44,27 +47,58 @@
      */
     public class strSplit extends PFuncSimpleAndList
     {
    +    
    +    @Override
    +    public void build(PropFuncArg argSubject, Node predicate, PropFuncArg 
argObject, ExecutionContext execCxt) {
    +        super.build(argSubject, predicate, argObject, execCxt);
    +
    +        if (argObject.getArgListSize() != 2)
    +            throw new QueryBuildException("Object list must contain 
exactly two arguments, the string to split and a regular expression") ;
    +    }
    +
         @Override
         public QueryIterator execEvaluated(final Binding binding, final Node 
subject, final Node predicate, final PropFuncArg object, final ExecutionContext 
execCxt)
         {
    -        if (!Var.isVar(subject))
    -            throw new ExprEvalException("Subject is not a variable (" + 
subject + ")") ;
    -
    -        if (object.getArgListSize() != 2)
    -            throw new ExprEvalException("Object list must contain exactly 
two arguments, the string to split and a regular expression") ;
     
    +        if (!object.getArg(0).isLiteral() || 
!object.getArg(1).isLiteral()) {
    +            return IterLib.noResults(execCxt);
    +        }
    +        
             String s = object.getArg(0).getLiteralLexicalForm() ;
             String regex = object.getArg(1).getLiteralLexicalForm() ;
             
    -        final Var subjectVar = Var.alloc(subject);
    -        
             // StrUtils will also trim whitespace
    -        String[] tokens = StrUtils.split(s, regex);
    -           Iterator<Binding> it = Iter.map(
    -                           Arrays.asList(tokens).iterator(),
    -                           item -> BindingFactory.binding(binding, 
subjectVar,
    -                                           
NodeFactory.createLiteral(item)));
    -        return new QueryIterPlainWrapper(it, execCxt);
    +        List<String> tokens = Arrays.asList(StrUtils.split(s, regex));
    +        
    +        if (Var.isVar(subject)) {
    +            
    +            // Case: Subject is variable. Return all tokens as results.
    +            
    +            final Var subjectVar = Var.alloc(subject);
    +
    +            Iterator<Binding> it = Iter.map(
    +                    tokens.iterator(),
    +                    item -> BindingFactory.binding(binding, subjectVar,
    +                            NodeFactory.createLiteral(item)));
    +            return new QueryIterPlainWrapper(it, execCxt);
    +            
    +        } else if (subject.isLiteral() 
    --- End diff --
    
    I think this doesn't match the current Javadoc? Maybe this change requires 
some changes to the text in the class Javadoc, that explain the new behaviour.


> Property function apf:strSplit is not well-behaved
> --------------------------------------------------
>
>                 Key: JENA-1367
>                 URL: https://issues.apache.org/jira/browse/JENA-1367
>             Project: Apache Jena
>          Issue Type: Bug
>    Affects Versions: Jena 3.3.0
>            Reporter: Richard Cyganiak
>            Priority: Minor
>
> The property function apf:strSplit is not well-behaved in cases where it's 
> invoked on node types other than the obvious case (subject is variable, 
> object is list of two literals). For example:
> {code}
> ?x apf:strSplit (?unbound "some regex")
> {code}
> Assuming {{?unbound}} is an unbound variable, this should simply not match, 
> but throws a {{NotLiteralException}}.
> {code}
> "foo" apf:strSplit ("foo;bar" ";")
> {code}
> This should presumably evaluate to true, but evaluates to false (the property 
> function itself throws  ExprEvalException).



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to