001package gudusoft.gsqlparser.nodes;
002
003import gudusoft.gsqlparser.EDbObjectType;
004import gudusoft.gsqlparser.ETableEffectType;
005import gudusoft.gsqlparser.ETableSource;
006import gudusoft.gsqlparser.TBaseType;
007
008/*
009* Date: 2010-2-4
010* Time: 16:59:33
011*/
012public class TTableList extends TParseTreeNodeList <TTable>{
013
014    public TTableList()
015    {
016    }
017
018    public void addTable(TTable table)
019    {
020        addElement(table);
021    }
022
023    /**
024     * add a table reference to table list, if there is already a corresponding table in table list
025     * just add this reference to that table, otherwise, create a new table instance, then add this reference.
026     * @param tableref
027     */
028    public void addTableByTableRefernce(TTableReference tableref)
029    {
030        //addElement(table);
031     boolean  isAdded = false;
032     for(int i=0; i<size();i++){
033         if (getTable(i).isTableRefBelongToThisTable(tableref)){
034            getTable(i).tablerefs.addTableReference(tableref);
035             isAdded = true;
036             break;
037         }
038     }
039    if (!isAdded){
040     addTable(new TTable(tableref.objectname));   
041    }
042    }
043
044
045    public TTable getTable(int position)
046    {
047        if (position < size())
048        {
049            return (TTable)elementAt(position);
050        }else{
051        return null;
052        }
053    }
054
055    void addParseTreeNode(Object arg1){
056        addTable((TTable)arg1);
057    }
058
059    /**
060     * 
061     * @param crf column reference
062     * @return return position of table this column reference belongs to, 0 means first table. &lt; 0 means not found
063     * if no qualifier before column name, always return -2,
064     * if return -1,this column name must be found in uplevel tables
065     */
066    public int checkColumnReferenceInTables(TObjectName crf){
067        int retval = -1;
068        if (crf.getObjectToken() == null) return -2;
069        
070        TTable lcTable = null;
071        for(int i=0; i<size();i++){
072            lcTable = getTable(i);
073            if (lcTable.getAliasClause() != null){
074               // System.out.println(lcTable.getTableName().toString());
075               // System.out.println(lcTable.aliasClause.toString());
076              if (lcTable.getAliasClause().getAliasName().toString().compareToIgnoreCase(crf.getObjectToken().toString()) == 0){
077                  // crf.getObjectToken().setDbObjType(TObjectName.ttObjTableAlias);
078                  crf.getObjectToken().setDbObjectType(EDbObjectType.table_alias);
079                  return i;
080              }
081            }else{
082               if (lcTable.getTableType() != ETableSource.objectname) {continue;}
083               if (lcTable.getTableName().getObjectToken().toString().compareToIgnoreCase(crf.getObjectToken().toString()) == 0){
084                  crf.getObjectToken().setDbObjType(TObjectName.ttobjTable);
085                   return i;
086               }
087               String s1 = TBaseType.getTextWithoutQuoted(lcTable.getTableName().getObjectToken().toString());
088                String s2 = TBaseType.getTextWithoutQuoted(crf.getObjectToken().toString());
089               if (s1.equalsIgnoreCase(s2)) {
090                   crf.getObjectToken().setDbObjType(TObjectName.ttobjTable);
091                    return i;
092               }
093            }
094        }
095        return retval;
096    }
097
098    public int searchTableByNameOrAlias(String pTableName){
099        TTable lcTable = null;
100        int iRet = -1;
101        for(int i=0; i<size();i++) {
102            lcTable = getTable(i);
103            // if (lcTable.getEffectType() == ETableEffectType.tetImplicitLateralDerivedTable) continue;
104            if (lcTable.toString().equalsIgnoreCase(pTableName)){
105                iRet = i;
106                break;
107            }else if (lcTable.getAliasClause() != null){
108                if (lcTable.getAliasClause().toString().equalsIgnoreCase(pTableName)){
109                    iRet = i;
110                    break;
111                }
112            }
113        }
114        return iRet;
115    }
116
117}