package org.aksw.sparqlify.core.sql.expr.evaluation;
import java.util.List;
import org.aksw.sparqlify.algebra.sql.exprs2.S_Constant;
import org.aksw.sparqlify.algebra.sql.exprs2.S_Method;
import org.aksw.sparqlify.algebra.sql.exprs2.SqlExpr;
import org.aksw.sparqlify.core.TypeToken;
import org.aksw.sparqlify.core.algorithms.SqlTranslatorImpl;
import org.aksw.sparqlify.core.datatypes.SqlMethodCandidate;
import org.aksw.sparqlify.core.datatypes.TypeSystem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
*
*
* @author Claus Stadler <cstadler@informatik.uni-leipzig.de>
*
*/
public class SqlExprEvaluator_SqlRewrite
implements SqlExprEvaluator
{
private static final Logger logger = LoggerFactory.getLogger(SqlExprEvaluator_SqlRewrite.class);
private TypeSystem datatypeSystem;
private String functionId;
public SqlExprEvaluator_SqlRewrite(TypeSystem datatypeSystem, String functionId) {
this.datatypeSystem = datatypeSystem;
this.functionId = functionId;
}
@Override
public SqlExpr eval(List<SqlExpr> args) {
// If one of the arguments is a type error, we must return a type error.
if(SqlTranslatorImpl.containsTypeError(args)) {
return S_Constant.TYPE_ERROR;
}
List<TypeToken> argTypes = SqlTranslatorImpl.getTypes(args);
SqlMethodCandidate castMethod = datatypeSystem.lookupMethod(functionId, argTypes);
if(castMethod == null) {
//throw new RuntimeException("No method found for " + fn);
logger.debug("No method found for " + functionId);
return S_Constant.TYPE_ERROR;
}
// TODO: Invoke the SQL method's invocable if it exists and all arguments are constants
SqlExpr result = S_Method.createOrEvaluate(castMethod, args);
logger.debug("[Result] " + result);
return result;
}
}