001: /**
002: * com.mckoi.database.ReferenceTable 03 Apr 1998
003: *
004: * Mckoi SQL Database ( http://www.mckoi.com/database )
005: * Copyright (C) 2000, 2001, 2002 Diehl and Associates, Inc.
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License
009: * Version 2 as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: * GNU General Public License Version 2 for more details.
015: *
016: * You should have received a copy of the GNU General Public License
017: * Version 2 along with this program; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
019: *
020: * Change Log:
021: *
022: *
023: */package com.mckoi.database;
024:
025: import com.mckoi.util.IntegerVector;
026:
027: /**
028: * This is an implementation of a Table that references a DataTable as its
029: * parent. This is a one-to-one relationship unlike the VirtualTable class
030: * which is a one-to-many relationship.
031: * <p>
032: * The entire purpose of this class is as a filter. We can use it to rename
033: * a DataTable class to any domain we feel like. This allows us to generate
034: * unique column names.
035: * <p>
036: * For example, say we need to join the same table. We can use this method
037: * to ensure that the newly joined table won't have duplicate column names.
038: * <p>
039: * This object implements RootTable.
040: *
041: * @author Tobias Downer
042: */
043:
044: public final class ReferenceTable extends FilterTable implements
045: RootTable {
046:
047: /**
048: * This represents the new name of the table.
049: */
050: private TableName table_name;
051:
052: /**
053: * The modified DataTableDef object for this reference.
054: */
055: private DataTableDef modified_table_def;
056:
057: /**
058: * The Constructor.
059: */
060: ReferenceTable(Table table, TableName tname) {
061: super (table);
062: table_name = tname;
063:
064: // Create a modified table def based on the parent def.
065: modified_table_def = new DataTableDef(table.getDataTableDef());
066: modified_table_def.setTableName(tname);
067: modified_table_def.setImmutable();
068: }
069:
070: /**
071: * Constructs the ReferenceTable given the parent table, and a new
072: * DataTableDef that describes the columns in this table. This is used if
073: * we want to redefine the column names.
074: * <p>
075: * Note that the given DataTableDef must contain the same number of columns as
076: * the parent table, and the columns must be the same type.
077: */
078: ReferenceTable(Table table, DataTableDef def) {
079: super (table);
080: table_name = def.getTableName();
081:
082: modified_table_def = def;
083: }
084:
085: /**
086: * Filters the name of the table. This returns the declared name of the
087: * table.
088: */
089: public TableName getTableName() {
090: return table_name;
091: }
092:
093: /**
094: * Returns the 'modified' DataTableDef object for this reference.
095: */
096: public DataTableDef getDataTableDef() {
097: return modified_table_def;
098: }
099:
100: /**
101: * Given a fully qualified variable field name, ie. 'APP.CUSTOMER.CUSTOMERID'
102: * this will return the column number the field is at. Returns -1 if the
103: * field does not exist in the table.
104: */
105: public int findFieldName(Variable v) {
106: TableName table_name = v.getTableName();
107: if (table_name != null && table_name.equals(getTableName())) {
108: return getDataTableDef().fastFindColumnName(v.getName());
109: }
110: return -1;
111: }
112:
113: /**
114: * Returns a fully qualified Variable object that represents the name of
115: * the column at the given index. For example,
116: * new Variable(new TableName("APP", "CUSTOMER"), "ID")
117: */
118: public Variable getResolvedVariable(int column) {
119: return new Variable(getTableName(), getDataTableDef().columnAt(
120: column).getName());
121: }
122:
123: public boolean typeEquals(RootTable table) {
124: return (this == table);
125: }
126:
127: }
|