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}