/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.mapping;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.relational.Namespace;
import org.hibernate.internal.util.collections.JoinedIterator;

Author:Gavin King
/** * @author Gavin King */
@SuppressWarnings("unchecked") public class DenormalizedTable extends Table { private final Table includedTable; public DenormalizedTable(Table includedTable) { this.includedTable = includedTable; includedTable.setHasDenormalizedTables(); } public DenormalizedTable(Namespace namespace, Identifier physicalTableName, boolean isAbstract, Table includedTable) { super( namespace, physicalTableName, isAbstract ); this.includedTable = includedTable; includedTable.setHasDenormalizedTables(); } public DenormalizedTable( Namespace namespace, Identifier physicalTableName, String subselectFragment, boolean isAbstract, Table includedTable) { super( namespace, physicalTableName, subselectFragment, isAbstract ); this.includedTable = includedTable; includedTable.setHasDenormalizedTables(); } public DenormalizedTable(Namespace namespace, String subselect, boolean isAbstract, Table includedTable) { super( namespace, subselect, isAbstract ); this.includedTable = includedTable; includedTable.setHasDenormalizedTables(); } @Override public void createForeignKeys() { includedTable.createForeignKeys(); Iterator iter = includedTable.getForeignKeyIterator(); while ( iter.hasNext() ) { ForeignKey fk = (ForeignKey) iter.next(); createForeignKey( Constraint.generateName( fk.generatedConstraintNamePrefix(), this, fk.getColumns() ), fk.getColumns(), fk.getReferencedEntityName(), fk.getKeyDefinition(), fk.getReferencedColumns() ); } } @Override public Column getColumn(Column column) { Column superColumn = super.getColumn( column ); if ( superColumn != null ) { return superColumn; } else { return includedTable.getColumn( column ); } } public Column getColumn(Identifier name) { Column superColumn = super.getColumn( name ); if ( superColumn != null ) { return superColumn; } else { return includedTable.getColumn( name ); } } @Override public Iterator getColumnIterator() { return new JoinedIterator( includedTable.getColumnIterator(), super.getColumnIterator() ); } @Override public boolean containsColumn(Column column) { return super.containsColumn( column ) || includedTable.containsColumn( column ); } @Override public PrimaryKey getPrimaryKey() { return includedTable.getPrimaryKey(); } @Override public Iterator getUniqueKeyIterator() { Iterator iter = includedTable.getUniqueKeyIterator(); while ( iter.hasNext() ) { UniqueKey uk = (UniqueKey) iter.next(); createUniqueKey( uk.getColumns() ); } return getUniqueKeys().values().iterator(); } @Override public Iterator getIndexIterator() { List indexes = new ArrayList(); Iterator iter = includedTable.getIndexIterator(); while ( iter.hasNext() ) { Index parentIndex = (Index) iter.next(); Index index = new Index(); index.setName( getName() + parentIndex.getName() ); index.setTable( this ); index.addColumns( parentIndex.getColumnIterator() ); indexes.add( index ); } return new JoinedIterator( indexes.iterator(), super.getIndexIterator() ); } public Table getIncludedTable() { return includedTable; } }