001package gudusoft.gsqlparser.dlineage.routine; 002 003import gudusoft.gsqlparser.EDbVendor; 004import gudusoft.gsqlparser.EParameterMode; 005import gudusoft.gsqlparser.dlineage.util.DlineageUtil; 006import gudusoft.gsqlparser.nodes.TFunctionCall; 007import gudusoft.gsqlparser.nodes.TParameterDeclaration; 008import gudusoft.gsqlparser.nodes.TParameterDeclarationList; 009import gudusoft.gsqlparser.stmt.TStoredProcedureSqlStatement; 010 011/** 012 * The alias suffixes of the routine index, rendered exactly as the legacy keys render them 013 * ({@code DlineageUtil.getProcedureNameWithArgs}, {@code getProcedureNameWithArgNum}, 014 * {@code getProcedureNameWithInputArgNum}, {@code getFunctionNameWithArgNum}): the suffix is raw text, and a vendor 015 * without overloading, or a missing parameter or argument list, has none (null). 016 */ 017public final class RoutineAliases { 018 019 private RoutineAliases() { 020 } 021 022 private static boolean overloads(EDbVendor vendor) { 023 return vendor != null && DlineageUtil.supportFunctionOverride(vendor); 024 } 025 026 /** {@code (type,type)}: each parameter's data type name as written, empty for a parameter without one. */ 027 public static String argumentTypes(TStoredProcedureSqlStatement stmt, EDbVendor vendor) { 028 TParameterDeclarationList parameters = stmt == null ? null : stmt.getParameterDeclarations(); 029 if (parameters == null || !overloads(vendor)) { 030 return null; 031 } 032 StringBuilder buffer = new StringBuilder("("); 033 for (int i = 0; i < parameters.size(); ++i) { 034 TParameterDeclaration parameter = parameters.getParameterDeclarationItem(i); 035 if (parameter.getDataType() != null) { 036 buffer.append(parameter.getDataType().getDataTypeName()); 037 } 038 if (i < parameters.size() - 1) { 039 buffer.append(","); 040 } 041 } 042 return buffer.append(")").toString(); 043 } 044 045 /** {@code (n)}: the number of parameters. */ 046 public static String argumentCount(TStoredProcedureSqlStatement stmt, EDbVendor vendor) { 047 TParameterDeclarationList parameters = stmt == null ? null : stmt.getParameterDeclarations(); 048 if (parameters == null || !overloads(vendor)) { 049 return null; 050 } 051 return count(parameters.size()); 052 } 053 054 /** {@code (n)}: the number of IN parameters, or of all parameters when none is IN. */ 055 public static String inputArgumentCount(TStoredProcedureSqlStatement stmt, EDbVendor vendor) { 056 TParameterDeclarationList parameters = stmt == null ? null : stmt.getParameterDeclarations(); 057 if (parameters == null || !overloads(vendor)) { 058 return null; 059 } 060 int inputs = 0; 061 for (int i = 0; i < parameters.size(); i++) { 062 if (parameters.getParameterDeclarationItem(i).getParameterMode() == EParameterMode.in) { 063 inputs++; 064 } 065 } 066 return count(inputs == 0 ? parameters.size() : inputs); 067 } 068 069 /** {@code (n)}: the number of arguments of a call. */ 070 public static String callArgumentCount(TFunctionCall call, EDbVendor vendor) { 071 if (call == null || call.getArgs() == null || !overloads(vendor)) { 072 return null; 073 } 074 return count(call.getArgs().size()); 075 } 076 077 /** {@code (n)} for a vendor that overloads, null otherwise: a count the caller already knows applies. */ 078 public static String countIfOverloads(int n, EDbVendor vendor) { 079 return overloads(vendor) ? count(n) : null; 080 } 081 082 public static String count(int n) { 083 return "(" + n + ")"; 084 } 085}