package org.aksw.sparqlify.type_system;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Multimap;
public class TypeSystemUtils {
private static final Logger logger = LoggerFactory.getLogger(TypeSystemUtils.class);
public static <T> CandidateMethod<T> lookupSqlCandidate(FunctionModel<T> functionModel, Multimap<String, String> nameToDecls, String sparqlFnName, List<T> argTypes) {
//FunctionModel<T> functionModel = typeSystem.getSqlFunctionModel();
Collection<String> sqlFnIds = nameToDecls.get(sparqlFnName);//typeSystem.getSparqlSqlImpls().get(sparqlFnName);
if(sqlFnIds.isEmpty()) {
logger.debug("No SQL function declarations found for: " + sparqlFnName);
}
Collection<MethodEntry<T>> sqlFns = new ArrayList<MethodEntry<T>>(sqlFnIds.size());
for(String sqlFnId : sqlFnIds) {
MethodEntry<T> sqlFn = functionModel.lookupById(sqlFnId);
if(sqlFn != null) {
sqlFns.add(sqlFn);
}
}
CandidateMethod<T> result = lookupSqlCandidate(functionModel, sqlFns, argTypes, "SPARQL function " + sparqlFnName);
return result;
}
public static <T> CandidateMethod<T> lookupSqlCandidate(FunctionModel<T> functionModel, MethodEntry<T> sqlFn, List<T> argTypes, String collectionLabel)
{
Collection<MethodEntry<T>> sqlFns = Collections.singleton(sqlFn);
CandidateMethod<T> result = lookupSqlCandidate(functionModel, sqlFns, argTypes, collectionLabel);
return result;
}
public static <T> CandidateMethod<T> lookupCandidate(FunctionModel<T> functionModel, String name, List<T> argTypes)
{
Collection<CandidateMethod<T>> candidates = functionModel.lookupByName(name, argTypes);
CandidateMethod<T> result = rejectMultipleElements(candidates, "Multiple candidates for " + name + " with argument types " + argTypes);
return result;
}
public static <T> T rejectMultipleElements(Collection<T> candidates, String exceptionMsg) {
T result;
if(candidates.size() > 1) {
throw new RuntimeException(exceptionMsg + ": " + candidates);
} else if(candidates.isEmpty()) {
result = null;
} else {
result = candidates.iterator().next();
}
return result;
}
public static <T> CandidateMethod<T> lookupSqlCandidate(FunctionModel<T> functionModel, Collection<MethodEntry<T>> sqlFns, List<T> argTypes, String collectionLabel)
{
Collection<CandidateMethod<T>> candidates = functionModel.lookup(sqlFns, argTypes);
CandidateMethod<T> result = rejectMultipleElements(candidates, "Multiple candidates for " + collectionLabel + " with argument types " + argTypes);
return result;
}
}