package com.ca.chorus.teiid.customfunctions; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.teiid.metadata.FunctionMethod; import org.teiid.metadata.FunctionParameter; import org.teiid.metadata.MetadataFactory; import org.teiid.translator.ExecutionFactory; import org.teiid.translator.Translator; import org.teiid.translator.TranslatorException; @Translator(name = "teiid-translator-customfunctions") public class TeiidUDFExecutionFactory extends ExecutionFactory { public TeiidUDFExecutionFactory() { super(); super.setSourceRequired(false); super.setSourceRequiredForMetadata(false); } @Override public void start() throws TranslatorException { super.start(); } @Override public void getMetadata(final MetadataFactory metadataFactory, final Object conn) throws TranslatorException { definePrimaryKeyFunctionMetadata(metadataFactory); } private void definePrimaryKeyFunctionMetadata(final MetadataFactory metadataFactory) throws TranslatorException { final FunctionMethod getPKColumnsFor = metadataFactory.addFunction("primary_key"); final List inParamList = new ArrayList(); final FunctionParameter inParam = new FunctionParameter("objecttypeName", "String"); inParam.setVarArg(true); inParamList.add(inParam); final FunctionParameter outParam = new FunctionParameter("pkstr", "string"); getPKColumnsFor.setDeterministicBoolean(true); getPKColumnsFor.setPushDown("ALLOWED"); getPKColumnsFor.setInvocationClass("com.ca.chorus.teiid.customfunctions.TeiidUDFExecutionFactory"); getPKColumnsFor.setInvocationMethod("primary_key"); getPKColumnsFor.setCategory("string"); getPKColumnsFor.setInputParameters(inParamList); getPKColumnsFor.setOutputParameter(outParam); } public static String primary_key(final Object... params) throws TranslatorException { if (params == null || params.length == 0) { throw new TranslatorException(new IllegalArgumentException("Null or empty parameters provided.")); } if (params.length < 3 || params.length % 2 == 0) { throw new TranslatorException(new IllegalArgumentException("Object type or column name/ value pair missing. Expected atleast one column name and value pair along with the object type.")); } if (params.length < 1 || params.length == 2 || (params.length + 1) % 2 != 0) { return null; } final List xmlTokensList = new ArrayList(); final String objectName = params[0].toString(); final Map columnMap = new TreeMap(); for (int i = 1; i < params.length; i = i + 2) { columnMap.put(params[i] == null ? null : params[i].toString(), params[i + 1] == null ? null : params[i + 1].toString()); } xmlTokensList.add(objectName); for (final Map.Entry entry : columnMap.entrySet()) { xmlTokensList.add(entry.getKey()); xmlTokensList.add(entry.getValue()); } return buildPrimaryKeyXML(xmlTokensList); } private static String buildPrimaryKeyXML(final List xmlTokens) { final StringBuilder xmlString = new StringBuilder(); int count = 0; for (final String token : xmlTokens) { if (xmlString.length() == 0) { xmlString.append("<" + token); if (xmlTokens.size() == 1) { xmlString.append(">"); continue; } count++; continue; } if (count % 2 == 0) { xmlString.append(token); } else { xmlString.append(count == 1 ? " " + token + "=\'" : "\' " + token + "=\'"); } if (count + 1 == xmlTokens.size()) { xmlString.append("\'>"); } count++; } return xmlString.toString(); } }