private FunctionDescProto findFunction( String signature, FunctionType type, List<TajoDataTypes.DataType> params, boolean strictTypeCheck) { List<FunctionDescProto> candidates = Lists.newArrayList(); if (functions.containsKey(signature)) { if (strictTypeCheck) { for (FunctionDescProto func : functions.get(signature)) { if (func.getSignature().getType() == type && func.getSignature().getParameterTypesList().equals(params)) { candidates.add(func); } } } else { for (FunctionDescProto func : functions.get(signature)) { if (func.getSignature().getParameterTypesList() != null && CatalogUtil.isMatchedFunction( func.getSignature().getParameterTypesList(), params)) { candidates.add(func); } } } } // if there are more than one function candidates, we choose the nearest matched function. if (candidates.size() > 0) { return findNearestMatchedFunction(candidates); } else { return null; } }
private FunctionDescProto findFunction(String signature, List<TajoDataTypes.DataType> params) { List<FunctionDescProto> candidates = Lists.newArrayList(); if (functions.containsKey(signature)) { for (FunctionDescProto func : functions.get(signature)) { if (func.getSignature().getParameterTypesList() != null && func.getSignature().getParameterTypesList().equals(params)) { candidates.add(func); } } } /* * * FALL BACK to look for nearest match * WORKING BUT BAD WAY TO IMPLEMENT.I WOULD RATHER implement compareTo in FunctionDesc to keep them * in sorted order of param types LIKE INT1 SHOULD BE BEFORE INT2 should be before INT3 so on. * Due to possibility of multiple parameters and types the permutation and combinations are endless * to implement compareTo so decided to take the shortcut. * * */ if (functions.containsKey(signature)) { for (FunctionDescProto func : functions.get(signature)) { if (func.getSignature().getParameterTypesList() != null && CatalogUtil.isMatchedFunction( func.getSignature().getParameterTypesList(), params)) { candidates.add(func); } } // if there are more than one function candidates, we choose the nearest matched function. if (candidates.size() > 0) { return findNearestMatchedFunction(candidates); } else { return null; } } return null; }