Subversion Repositories aduna

[/] [org.openrdf/] [sesame/] [branches/] [2.6/] [core/] [queryalgebra/] [evaluation/] [src/] [main/] [java/] [org/] [openrdf/] [query/] [algebra/] [evaluation/] [function/] [string/] [StrLen.java] - Blame information for rev 11624

Details | Compare with Previous | View Log

Line No. Rev Author Line
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
}