001package gudusoft.gsqlparser.nodes;
002
003import gudusoft.gsqlparser.*;
004
005/*
006* Date: 2010-4-13
007* Time: 17:06:00
008*/
009public class TOutputClause extends TParseTreeNode {
010
011    private TResultColumnList selectItemList = null;
012
013    public void setSelectItemList2(TResultColumnList selectItemList2) {
014        this.selectItemList2 = selectItemList2;
015    }
016
017    private TResultColumnList selectItemList2 = null;
018    private TObjectName intoTable = null;
019
020    public void setIntoColumnList(TObjectNameList intoColumnList) {
021        this.intoColumnList = intoColumnList;
022    }
023
024    private TObjectNameList intoColumnList = null;
025
026    public void init(Object arg1,Object arg2)
027    {
028        selectItemList = (TResultColumnList)arg1;
029        if (arg2 != null){
030            intoTable = (TObjectName)arg2;
031        }
032    }
033
034    public TObjectNameList getIntoColumnList() {
035        return intoColumnList;
036    }
037
038    public TObjectName getIntoTable() {
039        return intoTable;
040    }
041
042    public TResultColumnList getSelectItemList2() {
043        return selectItemList2;
044    }
045
046    public TResultColumnList getSelectItemList() {
047        return selectItemList;
048    }
049
050    public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
051       //selectItemList.doParse(psql, ESqlClause.output);
052        TResultColumn rc=null;
053        for(int i=0;i<selectItemList.size();i++){
054           rc = selectItemList.getResultColumn(i);
055           if ((rc.toString().toLowerCase().startsWith("deleted")) ||(rc.toString().toLowerCase().startsWith("inserted"))){
056               if (rc.getFieldAttr() != null){
057                   TObjectName fieldAttr = rc.getFieldAttr();
058                   fieldAttr.setLocation(ESqlClause.output);
059
060                   // Detect inserted/deleted pseudo table qualifier.
061                   // Common case: parser produces objectToken="inserted", partToken="col"
062                   // Edge case: parser produces partToken="inserted", propertyToken="col" (needs swap)
063                   TSourceToken objectToken = fieldAttr.getObjectToken();
064                   TSourceToken partToken = fieldAttr.getPartToken();
065                   TSourceToken propertyToken = fieldAttr.getPropertyToken();
066
067                   if (objectToken != null && propertyToken == null) {
068                       // Common case: objectToken=inserted/deleted, partToken=columnName
069                       String objName = objectToken.toString().toUpperCase();
070                       if ("INSERTED".equals(objName)) {
071                           fieldAttr.setPseudoTableType(EPseudoTableType.inserted);
072                       } else if ("DELETED".equals(objName)) {
073                           fieldAttr.setPseudoTableType(EPseudoTableType.deleted);
074                       }
075                   } else if (partToken != null && propertyToken != null) {
076                       // Edge case: partToken=inserted/deleted, propertyToken=columnName (needs swap)
077                       String partName = partToken.toString().toUpperCase();
078                       if ("INSERTED".equals(partName)) {
079                           fieldAttr.setPseudoTableType(EPseudoTableType.inserted);
080                       } else if ("DELETED".equals(partName)) {
081                           fieldAttr.setPseudoTableType(EPseudoTableType.deleted);
082                       }
083                       if (fieldAttr.getPseudoTableType() != EPseudoTableType.none) {
084                           fieldAttr.setObjectToken(partToken);
085                           fieldAttr.setPartToken(propertyToken);
086                           fieldAttr.setPropertyToken(null);
087                       }
088                   }
089
090                   psql.tables.getTable(0).getLinkedColumns().addObjectName(fieldAttr);
091                   fieldAttr.setSourceTable(psql.tables.getTable(0));
092               }
093           }else if (rc.toString().equalsIgnoreCase("$action")){
094               rc.getFieldAttr().setDbObjectType(EDbObjectType.constant);
095           }else {
096                rc.doParse(psql,ESqlClause.output);
097            }
098       }
099
100       if (intoTable != null){
101           intoTable.setObjectType(TObjectName.ttobjTable);
102           // add this table reference to
103           TTable lcTable = new TTable();
104           lcTable.setTableName(intoTable);
105           lcTable.setEffectType(ETableEffectType.tetOutput);
106           if (intoColumnList != null){
107               for(int i=0;i<intoColumnList.size();i++){
108                 lcTable.getObjectNameReferences().addObjectName(intoColumnList.getObjectName(i));
109                   intoColumnList.getObjectName(i).setLocation(ESqlClause.output);
110                 lcTable.getLinkedColumns().addObjectName(intoColumnList.getObjectName(i));
111                 intoColumnList.getObjectName(i).setSourceTable(lcTable);
112               }
113           }
114           psql.tables.addTable(lcTable);
115       }
116
117       if (selectItemList2 != null){
118
119        selectItemList2.doParse(psql, ESqlClause.output);
120       }
121
122    }
123
124    public void accept(TParseTreeVisitor v){
125        v.preVisit(this);
126        v.postVisit(this);
127    }
128
129    public void acceptChildren(TParseTreeVisitor v){
130        v.preVisit(this);
131
132        // Visit OUTPUT columns
133        if (selectItemList != null) {
134            selectItemList.acceptChildren(v);
135        }
136
137        // Visit INTO table and columns
138        if (intoTable != null) {
139            intoTable.acceptChildren(v);
140        }
141        if (intoColumnList != null) {
142            intoColumnList.acceptChildren(v);
143        }
144
145        // Visit secondary select list (if any)
146        if (selectItemList2 != null) {
147            selectItemList2.acceptChildren(v);
148        }
149
150        v.postVisit(this);
151    }
152
153    public void setSelectItemList(TResultColumnList selectItemList) {
154        this.selectItemList = selectItemList;
155    }
156
157    public void setIntoTable(TObjectName intoTable) {
158        this.intoTable = intoTable;
159    }
160}