001package gudusoft.gsqlparser.resolver;
002
003import gudusoft.gsqlparser.EAggregateType;
004import gudusoft.gsqlparser.EDataType;
005import gudusoft.gsqlparser.EExpressionType;
006import gudusoft.gsqlparser.EFunctionType;
007import gudusoft.gsqlparser.nodes.*;
008import gudusoft.gsqlparser.sqlenv.TSQLEnv;
009import gudusoft.gsqlparser.sqlenv.TSQLFunction;
010
011import java.util.ArrayList;
012
013public class TResolverHelpUtils {
014
015    public static ArrayList<String> searchTypedStruct(TSQLEnv sqlEnv, TResultColumn resultColumn){
016        if (resultColumn == null) return null;
017        // find struct from return type of a function
018
019        if (resultColumn.getExpr().getExpressionType() != EExpressionType.function_t) return null;
020        TFunctionCall f = resultColumn.getExpr().getFunctionCall();
021        TSQLFunction sqlFunction = sqlEnv.searchFunction(f.getFunctionName().toString());
022        if (sqlFunction == null) return null;
023        TTypeName struct_t = null;
024        if ((sqlFunction.getReturnType().getDataType() == EDataType.array_t)
025            || (sqlFunction.getReturnType().getTypeOfList().getDataType() == EDataType.struct_t)){
026            struct_t = sqlFunction.getReturnType().getTypeOfList();
027        }else if (sqlFunction.getReturnType().getDataType() == EDataType.struct_t){
028            struct_t = sqlFunction.getReturnType();
029        }
030        if (struct_t == null) return null;
031        ArrayList<String> columnList = new ArrayList<>();
032        for(int k=0;k<struct_t.getColumnDefList().size();k++){
033            columnList.add(struct_t.getColumnDefList().getColumn(k).getColumnName().toString());
034        }
035
036        return columnList;
037
038        // 以下从函数的参数中查找 struct
039
040//        tableFunctionVisitor tv = new tableFunctionVisitor();
041//        resultColumn.acceptChildren(tv);
042//        return tv.getTf();
043    }
044
045}
046
047class tableFunctionVisitor extends TParseTreeVisitor {
048    TTableFunction tf = null;
049
050    public TTableFunction getTf() {
051        return tf;
052    }
053
054    public void preVisit(TTableFunction node){
055        if (node.getFunctionType() == EFunctionType.struct_t){
056            tf = node;
057            //System.out.print("find struct: "+node.getFunctionName().toString()+", type:"+node.getFunctionType());
058        }
059    }
060}