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;
@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;
}
}