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. < 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}