| 1 |
11130 |
jeen |
/*
|
| 2 |
|
jeen |
* Copyright Aduna (http://www.aduna-software.com/) (c) 2011.
|
| 3 |
|
jeen |
*
|
| 4 |
|
jeen |
* Licensed under the Aduna BSD-style license.
|
| 5 |
|
jeen |
*/
|
| 6 |
11134 |
jeen |
package org.openrdf.query.algebra.evaluation.function.string;
|
| 7 |
11130 |
jeen |
|
| 8 |
|
jeen |
import org.openrdf.model.Literal;
|
| 9 |
|
jeen |
import org.openrdf.model.Value;
|
| 10 |
|
jeen |
import org.openrdf.model.ValueFactory;
|
| 11 |
11134 |
jeen |
import org.openrdf.model.vocabulary.FN;
|
| 12 |
11130 |
jeen |
import org.openrdf.model.vocabulary.XMLSchema;
|
| 13 |
|
jeen |
import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
|
| 14 |
|
jeen |
import org.openrdf.query.algebra.evaluation.function.Function;
|
| 15 |
|
jeen |
import org.openrdf.query.algebra.evaluation.util.QueryEvaluationUtil;
|
| 16 |
|
jeen |
|
| 17 |
|
jeen |
/**
|
| 18 |
|
jeen |
* The SPARQL built-in {@link Function} STRLEN, as defined in <a
|
| 19 |
|
jeen |
* href="http://www.w3.org/TR/sparql11-query/#func-strlen">SPARQL Query Language
|
| 20 |
|
jeen |
* for RDF</a>
|
| 21 |
|
jeen |
*
|
| 22 |
|
jeen |
* @author Jeen Broekstra
|
| 23 |
|
jeen |
*/
|
| 24 |
|
jeen |
public class StrLen implements Function {
|
| 25 |
|
jeen |
|
| 26 |
|
jeen |
public String getURI() {
|
| 27 |
11134 |
jeen |
return FN.STRING_LENGTH.toString();
|
| 28 |
11130 |
jeen |
}
|
| 29 |
|
jeen |
|
| 30 |
|
jeen |
public Literal evaluate(ValueFactory valueFactory, Value... args)
|
| 31 |
|
jeen |
throws ValueExprEvaluationException
|
| 32 |
|
jeen |
{
|
| 33 |
|
jeen |
if (args.length != 1) {
|
| 34 |
|
jeen |
throw new ValueExprEvaluationException("STRLEN requires 1 argument, got " + args.length);
|
| 35 |
|
jeen |
}
|
| 36 |
|
jeen |
|
| 37 |
|
jeen |
Value argValue = args[0];
|
| 38 |
|
jeen |
if (argValue instanceof Literal) {
|
| 39 |
|
jeen |
Literal literal = (Literal)argValue;
|
| 40 |
|
jeen |
|
| 41 |
11624 |
jeen |
// strlen function accepts only string literals
|
| 42 |
11618 |
james_leigh |
if (QueryEvaluationUtil.isStringLiteral(literal)) {
|
| 43 |
11130 |
jeen |
|
| 44 |
|
jeen |
// TODO we jump through some hoops here to get an xsd:integer
|
| 45 |
|
jeen |
// literal. Shouldn't createLiteral(int) return an xsd:integer
|
| 46 |
|
jeen |
// rather than an xsd:int?
|
| 47 |
|
jeen |
Integer length = literal.getLabel().length();
|
| 48 |
|
jeen |
return valueFactory.createLiteral(length.toString(), XMLSchema.INTEGER);
|
| 49 |
|
jeen |
}
|
| 50 |
|
jeen |
else {
|
| 51 |
|
jeen |
throw new ValueExprEvaluationException("unexpected input value for strlen function: " + argValue);
|
| 52 |
|
jeen |
}
|
| 53 |
|
jeen |
}
|
| 54 |
|
jeen |
else {
|
| 55 |
|
jeen |
throw new ValueExprEvaluationException("unexpected input value for strlen function: " + argValue);
|
| 56 |
|
jeen |
}
|
| 57 |
|
jeen |
}
|
| 58 |
|
jeen |
|
| 59 |
|
jeen |
}
|