Re: STRBEFORE() etc.

Yes - having a fixed result for the "no match" seems sensible.

F&O calls out the case of the empty string for second argument. Reading 
the -bfore and -after cases, I think it is defines what is mean by a 
match of the empty string (after returns the whole thing) and it is 
menat to be a match.  The argument type rules would apply in the SPARQL 
case.

Proposed change (draft - the editor will wordsmith as needed when the 
changes are made):

strbefore:

"""
The function returns a literal of the same kind
(simple literal, plain literal same language tag, xsd:string)
as the first argument arg1. The lexical form of
the result is the substring of the value of arg1
that precedes in arg1 the first occurrence of
the lexical form of arg2;
otherwise the lexical form of the result is the empty string.
If the lexical form of arg2 is the empty string,
the lexical form of the result is the empty string.
"""
==>
"""
For compatible arguments, if the lexical part of the second argument 
occurs as a substring of the lexical part of the first argument, the 
function returns a literal of the same kind
as the first argument arg1 (simple literal, plain literal same language 
tag, xsd:string). The lexical form of
the result is the substring of the value of arg1
that precedes in arg1 the first occurrence of
the lexical form of arg2.  If the lexical form of arg2 is the empty 
string, this is considered to be a match and the lexical form of the 
result is the empty string"

If there is no such occurrence, an empty simple literal is returned.
"""

for strafter, change 'precedes' to 'follows' and the return is the whole 
lexical form for the arg2 in the empty string case.

+ expand the examples

strbefore("abc"@en, "z"@en) -> ""
strbefore("abc"@en, "z") -> ""
strbefore("abc"@en, ""@en) -> ""@en
strbefore("abc"@en, "") -> ""@en

strafter("abc"@en, "z"@en) -> ""
strafter("abc"@en, "z") -> ""
strafter("abc"@en, ""@en) -> "abc"@en
strafter("abc"@en, "") -> "abc"@en

 Andy

On 24/04/12 10:29, Steve Harris wrote:
> Hi all,
>
> [sorry if this is covered in the testcases, I still don't have a harness for them]
>
> So I'm just looking at STRBEFORE(), http://www.w3.org/2009/sparql/docs/query-1.1/rq25.xml#func-strbefore
>
> The text says:
>
> “The function returns a literal of the same kind (simple literal, plain literal same language tag, xsd:string) as the first argument arg1.”
>
> However - does this trump the statement in http://www.w3.org/TR/xpath-functions/#func-substring-before that under some circumstances fn:substring-before “returns the zero-length string”.

Not such "trump" because the XSD function does not have to worry about 
lang tags or xsd:string/simple literals.

>
> I suspect that the right behaviour is for the function to return "" under those conditions - both as it makes more sense logically, and to make error handing in queries simpler.
>
> e.g.
>     STRBEFORE("foo"@en-GB, "bar") → ""@en-GB
> is somewhat misleading, and a little tricky to test for e.g. you'd have to use
>     STR(STRBEFORE(?string, "\t")) = ""
>   in order to catch non-matches
>
> I /think/ what I'd want as a user is:
>
> arg1  arg2  result  comment
> ------------- ------------ ----------  -----------------------------------------------------
> "foo"@fr  "o"   "f"@fr  "normal" case
> "foo"@fr  "bar"  ""   exception case
> "foo"@fr  "foo"  ""@fr  the empty lang-tagged string is before
> "foo"@fr  ""   ""   exception case
>
> i.e. the return values in the exception cases are as per fn:substring-before, and the "literal of the same kind" only applies to the non-excpetion cases.
>
> But maybe that's confusing too?
>
> FWIW, I've currently implemented "literal of the same kind" only, and have no end-user experience.
>
> Thoughts?
>
> Cheers,
>     Steve
>

Received on Monday, 21 May 2012 13:33:59 UTC