001import gudusoft.gsqlparser.EDbVendor;
002import gudusoft.gsqlparser.TAttributeNode;
003import gudusoft.gsqlparser.TBaseType;
004import gudusoft.gsqlparser.TGSqlParser;
005import gudusoft.gsqlparser.compiler.TASTEvaluator;
006import gudusoft.gsqlparser.compiler.TGlobalScope;
007import gudusoft.gsqlparser.nodes.TObjectName;
008import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
009import gudusoft.gsqlparser.nodes.TRelationExpr;
010import gudusoft.gsqlparser.nodes.TResultColumn;
011import gudusoft.gsqlparser.sqlenv.TSQLEnv;
012import gudusoft.gsqlparser.stmt.TInsertSqlStatement;
013import gudusoft.gsqlparser.stmt.TSelectSqlStatement;
014
015import java.io.IOException;
016
017public class traceColumn {
018    public static void main(String args[]) throws IOException {
019        EDbVendor dbVendor = EDbVendor.dbvnetezza;
020        TGSqlParser sqlParser = new TGSqlParser(dbVendor);
021        String inputFile = "c:\\prg\\tmp\\demo.sql";
022        sqlParser.sqlfilename = inputFile;
023
024//        String inputSQL = "CREATE TABLE\n" +
025//                "  solidatus-dev.data.RETAIL_PROD_EXCEPTIONS_SOURCE ( __uuid STRING,\n" +
026//                "    from_date TIMESTAMP,\n" +
027//                "    to_date TIMESTAMP,\n" +
028//                "    adjustment_info ARRAY<STRUCT<adjustment_table_name STRING>>,\n" +
029//                "    entity_uuid STRING,\n" +
030//                "    __metadata ARRAY < STRUCT < attribute STRING,\n" +
031//                "    data_type STRING,\n" +
032//                "    value STRING > > );\n" +
033//                "CREATE TABLE\n" +
034//                "  solidatus-dev.data.RETAIL_PROD_REPAIR ( __uuid STRING,\n" +
035//                "    from_date TIMESTAMP,\n" +
036//                "    to_date TIMESTAMP,\n" +
037//                "    adjustment_info ARRAY<STRUCT<adjustment_table_name STRING>>,\n" +
038//                "    entity_uuid STRING,\n" +
039//                "    __metadata ARRAY<STRUCT<attribute STRING,\n" +
040//                "    data_type STRING,\n" +
041//                "    value STRING>> );\n" +
042//                "CREATE TABLE\n" +
043//                "  solidatus-dev.data.FOTC_RD_EXCEPTION_FILE_PROCESSING ( Source_System_Type STRING,\n" +
044//                "    Processing_Type STRING );\n" +
045//                "CREATE TABLE\n" +
046//                "  solidatus-dev.data.RETAIL_PROD_SOURCE ( __uuid STRING,\n" +
047//                "    from_date TIMESTAMP,\n" +
048//                "    to_date TIMESTAMP,\n" +
049//                "    adjustment_info ARRAY<STRUCT<adjustment_table_name STRING>>,\n" +
050//                "    entity_uuid STRING,\n" +
051//                "    __metadata ARRAY<STRUCT<attribute STRING,\n" +
052//                "    data_type STRING,\n" +
053//                "    value STRING>> );\n" +
054//                "\t\n" +
055//                "INSERT INTO `solidatus-dev.data.RETAIL_PROD_REPAIR`\n" +
056//                "WITH RETAIL_PROD_SOURCE_000100 AS (\n" +
057//                "SELECT *\n" +
058//                "FROM `data.RETAIL_PROD_SOURCE`\n" +
059//                "WHERE CURRENT_TIMESTAMP() >= from_date\n" +
060//                "AND CURRENT_TIMESTAMP() <= to_date ),\n" +
061//                "RETAIL_PROD_SOURCE_000200 AS (\n" +
062//                "SELECT * FROM RETAIL_PROD_SOURCE_000100),\n" +
063//                "RETAIL_PROD_SOURCE_000300 AS (\n" +
064//                "SELECT *\n" +
065//                "FROM RETAIL_PROD_SOURCE_000200\n" +
066//                "),\n" +
067//                " EXCEPTION_RETAIL_000100 AS (\n" +
068//                "  SELECT\n" +
069//                "    RETAIL_PROD_EXCEPTIONS_SOURCE.*\n" +
070//                "  FROM\n" +
071//                "    `data.RETAIL_PROD_EXCEPTIONS_SOURCE`\n" +
072//                "\t\tWHERE\n" +
073//                "    CURRENT_TIMESTAMP() >= from_date\n" +
074//                "    AND CURRENT_TIMESTAMP() <= to_date\n" +
075//                "\t),\n" +
076//                "  EXCEPTION_RETAIL_000130 AS (\n" +
077//                "  SELECT\n" +
078//                "    EXCEPTION_RETAIL_000100.*\n" +
079//                "  FROM\n" +
080//                "    EXCEPTION_RETAIL_000100\n" +
081//                "     ),\n" +
082//                "  RETAIL_PROD_SOURCE_000400 AS (\n" +
083//                "  SELECT\n" +
084//                "    RETAIL_PROD_SOURCE_000300.*\n" +
085//                "  FROM\n" +
086//                "    RETAIL_PROD_SOURCE_000300\n" +
087//                "),\n" +
088//                "STAGE1 AS (\n" +
089//                "SELECT\n" +
090//                "__uuid,\n" +
091//                "from_date,\n" +
092//                "to_date,\n" +
093//                "adjustment_info,\n" +
094//                "entity_uuid,\n" +
095//                "__metadata\n" +
096//                "FROM RETAIL_PROD_SOURCE_000400\n" +
097//                "UNION ALL ( SELECT\n" +
098//                "    __uuid,\n" +
099//                "from_date,\n" +
100//                "to_date,\n" +
101//                "adjustment_info,\n" +
102//                "entity_uuid,\n" +
103//                "__metadata\n" +
104//                " FROM\n" +
105//                "      EXCEPTION_RETAIL_000130\n" +
106//                "   ) ),\n" +
107//                "STAGE2 AS (\n" +
108//                "SELECT *\n" +
109//                "FROM STAGE1)\n" +
110//                "SELECT * EXCEPT(Record_Number_BT) FROM STAGE2\t";
111//
112//        sqlParser.sqltext = inputSQL;
113
114        int ret = sqlParser.parse();
115        if (ret != 0){
116            System.out.println(sqlParser.getErrormessage());
117            return ;
118        }
119
120        //TInsertSqlStatement insertSqlStatement = (TInsertSqlStatement) sqlParser.sqlstatements.get(4);
121        //TSelectSqlStatement s = insertSqlStatement.getSubQuery();
122        TSelectSqlStatement s = (TSelectSqlStatement)sqlParser.sqlstatements.get(0);
123        TResultColumn rs = s.getResultColumnList().getResultColumn(0);
124        TObjectName starColumn = rs.getExpr().getObjectOperand();
125        for(TAttributeNode attributeNode:starColumn.getAttributeNodesDerivedFromFromClause()){
126            printAttribute(attributeNode,0);
127        }
128    }
129
130    static void printAttribute(TAttributeNode attributeNode,int level){
131        String padSpace = TBaseType.numberOfSpace(level*8,' ');
132        if (attributeNode.getSqlColumn() != null){
133            System.out.println(String.format("%sName: %s, SQL column: %s", padSpace,attributeNode.getName(), attributeNode.getSqlColumn().toString() ));
134        }
135
136        if (attributeNode.getSubLevelResultColumn() != null){
137            System.out.println(String.format("%sName: %s, Select list column: %s", padSpace,attributeNode.getName(), attributeNode.getSubLevelResultColumn().toString() ));
138            TResultColumn resultColumn = attributeNode.getSubLevelResultColumn();
139            if (resultColumn.toString().endsWith("*")){
140                TObjectName starColumn = resultColumn.getExpr().getObjectOperand();
141                for(TAttributeNode a:starColumn.getAttributeNodesDerivedFromFromClause()){
142                    if (TBaseType.getLastPartOfQualifiedName(attributeNode.getName()).equalsIgnoreCase(TBaseType.getLastPartOfQualifiedName(a.getName()))){
143                        System.out.println(String.format("%s%s%s",padSpace,"\t", a.getName()));
144                        printAttribute(a,level+1);
145                        break;
146                    }
147                }
148            }else{
149                System.out.println(String.format("%s%s%s",padSpace,"\t", resultColumn.toString()));
150                RCVisitor rcVisitor = new RCVisitor(level+1);
151                resultColumn.acceptChildren(rcVisitor);
152            }
153        }else{
154            System.out.println(String.format("%sName: %s, End of trace ", padSpace,attributeNode.getName()));
155        }
156
157        if (attributeNode.getAccompaniedAttributeNodes().size() > 0){
158            System.out.println(String.format("%sFound accompanied attribute nodes: %d", padSpace, attributeNode.getAccompaniedAttributeNodes().size()));
159            for(TAttributeNode n: attributeNode.getAccompaniedAttributeNodes()){
160                printAttribute(n,level);
161            }
162        }
163
164    }
165}
166
167class RCVisitor extends TParseTreeVisitor {
168    int level;
169    public RCVisitor(int level){
170        this.level = level;
171    }
172    public void preVisit(TObjectName node) {
173        String padSpace = TBaseType.numberOfSpace(level*8,' ');
174        if (node.getSourceAttributeNode() != null){
175            traceColumn.printAttribute(node.getSourceAttributeNode(),level);
176        }else {
177            System.out.println(String.format("%s%s",padSpace,node.toString()) );
178        }
179    }
180}