/*
* Copyright (c) 2009 Mysema Ltd.
* All rights reserved.
*
*/
package com.mysema.rdfbean.sesame;
import org.openrdf.model.Literal;
import org.openrdf.model.URI;
import org.openrdf.model.Value;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.vocabulary.XMLSchema;
import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
import org.openrdf.query.algebra.evaluation.function.Function;
import org.openrdf.query.algebra.evaluation.function.FunctionRegistry;
import com.mysema.rdfbean.model.XSD;
import com.mysema.rdfbean.query.QueryFunctions;
/**
* @author tiwe
*/
public final class SesameFunctions {
private static boolean initialized;
public static void init() {
if (initialized) {
return;
}
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(args[0].stringValue().trim());
}
@Override
public String getURI() {
return "functions:trim";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(args[0].stringValue().toUpperCase());
}
@Override
public String getURI() {
return "functions:upper";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(args[0].stringValue().toLowerCase());
}
@Override
public String getURI() {
return "functions:lower";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue();
String second = args[1].stringValue();
return valueFactory.createLiteral(first + second);
}
@Override
public String getURI() {
return "functions:concat";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue();
int second = Integer.valueOf(args[1].stringValue());
return valueFactory.createLiteral(first.substring(second));
}
@Override
public String getURI() {
return "functions:substring";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue();
int second = Integer.valueOf(args[1].stringValue());
int third = Integer.valueOf(args[2].stringValue());
return valueFactory.createLiteral(first.substring(second, third));
}
@Override
public String getURI() {
return "functions:substring2";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
int first = Integer.valueOf(args[0].stringValue());
return valueFactory.createLiteral(QueryFunctions.space(first));
}
@Override
public String getURI() {
return "functions:space";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue();
int second = Integer.valueOf(args[1].stringValue());
return valueFactory.createLiteral(String.valueOf(first.charAt(second)));
}
@Override
public String getURI() {
return "functions:charAt";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue();
String second = args[1].stringValue();
return valueFactory.createLiteral(first.startsWith(second));
}
@Override
public String getURI() {
return "functions:startsWith";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue();
String second = args[1].stringValue();
return valueFactory.createLiteral(first.endsWith(second));
}
@Override
public String getURI() {
return "functions:endsWith";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue().toLowerCase();
String second = args[1].stringValue().toLowerCase();
return valueFactory.createLiteral(first.startsWith(second));
}
@Override
public String getURI() {
return "functions:startsWithIc";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue().toLowerCase();
String second = args[1].stringValue().toLowerCase();
return valueFactory.createLiteral(first.endsWith(second));
}
@Override
public String getURI() {
return "functions:endsWithIc";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue();
String second = args[1].stringValue();
return valueFactory.createLiteral(first.contains(second));
}
@Override
public String getURI() {
return "functions:stringContains";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue().toLowerCase();
String second = args[1].stringValue().toLowerCase();
return valueFactory.createLiteral(first.contains(second));
}
@Override
public String getURI() {
return "functions:stringContainsIc";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue();
String second = args[1].stringValue();
return valueFactory.createLiteral(first.equalsIgnoreCase(second));
}
@Override
public String getURI() {
return "functions:equalsIgnoreCase";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(args[0].stringValue().length());
}
@Override
public String getURI() {
return "functions:stringLength";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue();
String second = args[1].stringValue();
return valueFactory.createLiteral(first.indexOf(second));
}
@Override
public String getURI() {
return "functions:indexOf";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue();
String second = args[1].stringValue();
return valueFactory.createLiteral(second.indexOf(first) + 1);
}
@Override
public String getURI() {
return "functions:locate";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue();
String second = args[1].stringValue();
int third = Integer.valueOf(args[2].stringValue());
return valueFactory.createLiteral(first.indexOf(second, third));
}
@Override
public String getURI() {
return "functions:indexOf2";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue();
String second = args[1].stringValue();
int third = Integer.valueOf(args[2].stringValue()) - 1;
return valueFactory.createLiteral(second.indexOf(first, third) + 1);
}
@Override
public String getURI() {
return "functions:locate2";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(QueryFunctions.ceil(args[0].stringValue()));
}
@Override
public String getURI() {
return "functions:ceil";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(QueryFunctions.floor(args[0].stringValue()));
}
@Override
public String getURI() {
return "functions:floor";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(QueryFunctions.sqrt(args[0].stringValue()));
}
@Override
public String getURI() {
return "functions:sqrt";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String normalized = args[0].stringValue();
URI datatype = ((Literal) args[0]).getDatatype();
return valueFactory.createLiteral(normalized.startsWith("-") ? normalized.substring(1) : normalized, datatype);
}
@Override
public String getURI() {
return "functions:abs";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(args[0].stringValue(), XMLSchema.BYTE);
}
@Override
public String getURI() {
return XSD.byteType.getId();
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(args[0].stringValue(), XMLSchema.LONG);
}
@Override
public String getURI() {
return XSD.longType.getId();
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(args[0].stringValue(), XMLSchema.SHORT);
}
@Override
public String getURI() {
return XSD.shortType.getId();
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(QueryFunctions.year(args[0].stringValue()));
}
@Override
public String getURI() {
return "functions:year";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(QueryFunctions.yearMonth(args[0].stringValue()));
}
@Override
public String getURI() {
return "functions:yearMonth";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(QueryFunctions.month(args[0].stringValue()));
}
@Override
public String getURI() {
return "functions:month";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(QueryFunctions.week(args[0].stringValue()));
}
@Override
public String getURI() {
return "functions:week";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(QueryFunctions.dayOfWeek(args[0].stringValue()));
}
@Override
public String getURI() {
return "functions:dayOfWeek";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(QueryFunctions.dayOfMonth(args[0].stringValue()));
}
@Override
public String getURI() {
return "functions:dayOfMonth";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(QueryFunctions.dayOfYear(args[0].stringValue()));
}
@Override
public String getURI() {
return "functions:dayOfYear";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(QueryFunctions.hour(args[0].stringValue()));
}
@Override
public String getURI() {
return "functions:hour";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(QueryFunctions.minute(args[0].stringValue()));
}
@Override
public String getURI() {
return "functions:minute";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(QueryFunctions.second(args[0].stringValue()));
}
@Override
public String getURI() {
return "functions:second";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
return valueFactory.createLiteral(QueryFunctions.millisecond(args[0].stringValue()));
}
@Override
public String getURI() {
return "functions:millisecond";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue();
String second = args[1].stringValue();
return valueFactory.createLiteral(QueryFunctions.like(first, second));
}
@Override
public String getURI() {
return "functions:like";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory valueFactory, Value... args) throws ValueExprEvaluationException {
String first = args[0].stringValue();
String second = args[1].stringValue();
return valueFactory.createLiteral(Integer.valueOf(first) % Integer.valueOf(second));
}
@Override
public String getURI() {
return "functions:modulo";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory vf, Value... args) throws ValueExprEvaluationException {
for (Value arg : args) {
if (arg != null) {
return arg;
}
}
return null;
}
@Override
public String getURI() {
return "functions:coalesce";
}
});
register(new Function() {
@Override
public Value evaluate(ValueFactory vf, Value... args) throws ValueExprEvaluationException {
if (args[0].equals(args[1])) {
return null;
} else {
return args[0];
}
}
@Override
public String getURI() {
return "functions:nullif";
}
});
initialized = true;
}
private static void register(Function function) {
FunctionRegistry.getInstance().add(function);
}
private SesameFunctions() {
}
}