/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.query.function; import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.teiid.core.util.ArgCheck; import org.teiid.designer.udf.IFunctionForm; import org.teiid.designer.udf.IFunctionLibrary; import org.teiid.language.SQLConstants.Reserved; import org.teiid.metadata.FunctionMethod; import org.teiid.metadata.FunctionParameter; /** * The FunctionForm class represents a particular form of a function signature. * It is different from the FunctionMethod class because it ignores type * information and instead differentiates function signatures based on their * function name and the names of the arguments. */ @Deprecated public class FunctionForm implements Serializable, Comparable<FunctionForm>, IFunctionForm { private static final long serialVersionUID = 2411783099304320334L; private String name; private String description; private String category; private List inputParamNames; private List inputParamDescs; private String outputParamName; private String outputParamDesc; /** * Construct a function form by pulling all info from a FunctionMethod. Because * a FunctionForm is only created from a <b>validated</b> method, we can assume * many things, such as that function name, type, category are non-null. * @param method FunctionMethod to build form from */ public FunctionForm(FunctionMethod method) { ArgCheck.isNotNull(method); // Get function stuff this.name = method.getName().toUpperCase(); this.description = method.getDescription(); this.category = method.getCategory(); // Get input parameter stuff List<FunctionParameter> inputParams = method.getInputParameters(); if(inputParams == null) { inputParamNames = new ArrayList(0); inputParamDescs = new ArrayList(0); } else { inputParamNames = new ArrayList(inputParams.size()); inputParamDescs = new ArrayList(inputParams.size()); for(int i=0; i<inputParams.size(); i++) { inputParamNames.add(inputParams.get(i).getName().toUpperCase()); inputParamDescs.add(inputParams.get(i).getDescription()); } } // Get output parameter stuff FunctionParameter outParam = method.getOutputParameter(); this.outputParamName = outParam.getName().toUpperCase(); this.outputParamDesc = outParam.getDescription(); } /** * Get name of function. * @return Name */ @Override public String getName() { return this.name; } /** * Get description of function. * @return Description */ @Override public String getDescription() { return this.description; } /** * Get category. * @return Category */ @Override public String getCategory() { return this.category; } /** * Get list of argument names. * @return List of argument names ({@link java.lang.String}) */ @Override public List getArgNames() { return this.inputParamNames; } /** * Get argument name at index. * @param index Index to use * @return Argument name at index */ public String getArgName(int index) { return (String) this.inputParamNames.get(index); } /** * Get list of argument descriptions. * @return List of argument descriptions ({@link java.lang.String}) */ public List getArgDescriptions() { return this.inputParamDescs; } /** * Get argument description at index. * @param index Index to use * @return Argument description at index */ public String getArgDescription(int index) { return (String) this.inputParamDescs.get(index); } /** * Get name of return parameter * @return Name of return parameter */ public String getReturnName() { return this.outputParamName; } /** * Get description of return parameter * @return Description of return parameter */ public String getReturnDescription() { return this.outputParamDesc; } /** * Get display string for this function form * @return Display version of this function form */ @Override public String getDisplayString() { StringBuffer str = new StringBuffer(); if(IFunctionLibrary.FunctionName.CAST.equalsIgnoreCase(name)) { str.append(name); str.append("("); //$NON-NLS-1$ str.append(inputParamNames.get(0)); if(IFunctionLibrary.FunctionName.CONVERT.equalsIgnoreCase(name) || IFunctionLibrary.FunctionName.CAST.equalsIgnoreCase(name)) { str.append(", "); //$NON-NLS-1$ } else { str.append(" "); //$NON-NLS-1$ str.append(Reserved.AS); str.append(" "); //$NON-NLS-1$ } str.append(inputParamNames.get(1)); str.append(")"); //$NON-NLS-1$ } else if(name.equals("+") || name.equals("-") || name.equals("*") || name.equals("/") || name.equals("||")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ str.append("("); //$NON-NLS-1$ str.append(inputParamNames.get(0)); str.append(name); str.append(inputParamNames.get(1)); str.append(")"); //$NON-NLS-1$ } else { str.append(name); str.append("("); //$NON-NLS-1$ if(inputParamNames.size() > 0) { Iterator iter = inputParamNames.iterator(); str.append(iter.next()); while(iter.hasNext()) { str.append(", "); //$NON-NLS-1$ str.append(iter.next()); } } str.append(")"); //$NON-NLS-1$ } return str.toString(); } /** * String representation of the function form for debugging purposes. * @return String representation */ @Override public String toString() { return this.getDisplayString(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((this.inputParamNames == null) ? 0 : this.inputParamNames.hashCode()); result = prime * result + ((this.name == null) ? 0 : this.name.hashCode()); return result; } /** * Compare this function form with another based on the name and * argument names. * @param obj Other object */ @Override public boolean equals(Object obj) { if(obj == this) { return true; } else if(obj == null || !(obj instanceof FunctionForm)) { return false; } else { FunctionForm other = (FunctionForm) obj; return other.getName().equals(getName()) && other.getArgNames().equals(getArgNames()); } } /** * Implements Comparable interface so that this object can be compared to * other FunctionForm objects and ordered alphabetically. * @param other Other object * @return 1 if other > this, 0 if other == this, -1 if other < this */ @Override public int compareTo(FunctionForm other) { int compare = this.getName().compareTo( other.getName() ); if(compare != 0) { return compare; } // Look further into arg names to compare as names are == List otherArgs = other.getArgNames(); List myArgs = this.getArgNames(); // Compare # of args first if(myArgs.size() < otherArgs.size()) { return -1; } else if(myArgs.size() > otherArgs.size()) { return 1; } // else continue // Same # of args for(int i=0; i < myArgs.size(); i++) { compare = ((String)myArgs.get(i)).compareTo( ((String)otherArgs.get(i)) ); if(compare != 0) { return compare; } } // Same return 0; } }