package org.aksw.sparqlify.type_system; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; /** * A function model that can assign multiple method declarations (each with their own name) * to a name. * * * For instance, it could map the name 'total' to the method * descriptor of 'int sum(int)'. * * @author raven * * @param <T> */ public class FunctionModelAliased<T> implements FunctionModel<T> { /** * Maps a name to a set of method descriptors, * effectively overriding the names of the underlying function model. * * * * */ private Multimap<String, String> nameToDescriptors; private FunctionModel<T> baseModel; public FunctionModelAliased(FunctionModel<T> baseModel) { this(baseModel, HashMultimap.<String, String>create()); } public FunctionModelAliased(FunctionModel<T> baseModel, Multimap<String, String> nameToDescriptors) { this.baseModel = baseModel; this.nameToDescriptors = nameToDescriptors; } /** * Find a method by its method descriptor * * @param descriptor The method descriptor */ @Override public MethodEntry<T> lookupById(String descriptor) { MethodEntry<T> result = baseModel.lookupById(descriptor); return result; } // TODO This function might be too internal to expose in this interface @Override public Collection<CandidateMethod<T>> lookup( Collection<MethodEntry<T>> candidates, List<T> argTypes) { throw new RuntimeException("Dont use this"); } @Override public Collection<CandidateMethod<T>> lookupByName(String methodName, List<T> argTypes) { // Map the name to the descriptors Collection<String> descriptors = nameToDescriptors.get(methodName); Collection<MethodEntry<T>> candidates = new HashSet<MethodEntry<T>>(); for(String descriptor : descriptors) { MethodEntry<T> entry = baseModel.lookupById(descriptor); if(entry != null) { candidates.add(entry); } } Collection<CandidateMethod<T>> result = baseModel.lookup(candidates, argTypes); return result; } @Override public Collection<String> getIdsByName(String name) { Collection<String> result = nameToDescriptors.get(name); return result; } @Override public String getNameById(String id) { // TODO Optimize this lookup! String result = FunctionModelImpl.getFirstKey(nameToDescriptors, id); return result; } @Override public Collection<MethodEntry<T>> getMethodEntries() { Collection<MethodEntry<T>> result = baseModel.getMethodEntries(); return result; } public MethodEntry<T> registerFunction(String name, MethodDeclaration<T> declaration) { MethodEntry<T> result = baseModel.registerFunction(declaration); nameToDescriptors.put(name, result.getId()); return result; } @Override public MethodEntry<T> registerFunction(MethodDeclaration<T> declaration) { MethodEntry<T> result = baseModel.registerFunction(declaration); nameToDescriptors.put(declaration.getName(), result.getId()); return result; } @Override public void registerCoercion(MethodDeclaration<T> declaration) { baseModel.registerCoercion(declaration); //throw new RuntimeException("Not implemented yet"); } @Override @Deprecated public MethodEntry<T> registerFunction(String id, String name, MethodSignature<T> signature) { throw new RuntimeException("Not implemented yet"); } @Override @Deprecated public void registerCoercion(String id, String name, MethodSignature<T> signature) { throw new RuntimeException("Not implemented yet"); } @Override public Map<String, String> getInverses() { throw new RuntimeException("Not implemented yet"); } }