/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.esl.sql.model;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Maps;
public class Table
{
private static final Logger LOG = LoggerFactory.getLogger( Table.class.getName() );
private final String tableName, elementName, parentName;
private final List<Column> columnList = new ArrayList<Column>();
private final Map<String, Column> columnNameMap = Maps.newHashMap();
private final Map<String, Column> columnXPathMap = Maps.newHashMap();
private final List<Column> foreignKeys = new ArrayList<Column>();
private final List<Column> primaryKeys = new ArrayList<Column>();
private final List<ForeignKeyColumn> referencedKeys = new ArrayList<ForeignKeyColumn>();
private final List<ForeignKey> realForeignKeys = new ArrayList<ForeignKey>();
private final List<Index> indexes = new ArrayList<Index>();
public Table( String tableName, String elementName, String parentName )
{
this.tableName = tableName;
this.elementName = elementName;
this.parentName = parentName;
}
public void addColumn( Column column )
{
if ( column instanceof ForeignKeyColumn )
{
foreignKeys.add( column );
}
if ( column.isPrimaryKey() )
{
primaryKeys.add( column );
}
columnList.add( column );
columnNameMap.put( column.getName().toLowerCase(), column );
if ( column.getXPath() != null )
{
columnXPathMap.put( column.getXPath().toLowerCase(), column );
}
column.setTable( this );
}
public String getName()
{
return tableName;
}
public ForeignKeyColumn[] getReferencedKeys( boolean deleteOnly )
{
List<ForeignKeyColumn> selectedKeys = new ArrayList<ForeignKeyColumn>();
for ( int i = 0; i < referencedKeys.size(); i++ )
{
ForeignKeyColumn fkColumn = referencedKeys.get( i );
if ( !deleteOnly || ( deleteOnly && fkColumn.isDelete() ) )
{
selectedKeys.add( fkColumn );
}
}
ForeignKeyColumn[] foreignKeysArray = new ForeignKeyColumn[selectedKeys.size()];
for ( int i = 0; i < selectedKeys.size(); i++ )
{
foreignKeysArray[i] = selectedKeys.get( i );
}
return foreignKeysArray;
}
public ForeignKeyColumn getForeignKey( Table table )
{
for ( int i = 0; i < foreignKeys.size(); i++ )
{
if ( ( (ForeignKeyColumn) foreignKeys.get( i ) ).getReferencedTable() == table )
{
return (ForeignKeyColumn) foreignKeys.get( i );
}
}
return null;
}
public Column[] getColumns()
{
return columnList.toArray( new Column[columnList.size()] );
}
public Column[] getPrimaryKeys()
{
return primaryKeys.toArray( new Column[primaryKeys.size()] );
}
public Column getColumn( String columnName )
{
if ( columnName.startsWith( "count(" ) )
{
return new Column( columnName, null );
}
else
{
return columnNameMap.get( columnName.toLowerCase() );
}
}
public Column getColumnByXPath( String xpath )
{
return columnXPathMap.get( xpath.toLowerCase() );
}
public String toString()
{
return tableName;
}
public String getParentName()
{
return parentName;
}
public String getElementName()
{
return elementName;
}
public int getIndex( Column column )
{
return columnList.indexOf( column ) + 1;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals( Object obj )
{
if ( ( obj instanceof Table ) == false )
{
return false;
}
Table other = (Table) obj;
if ( tableName.equals( other.tableName ) == false )
{
return false;
}
Column[] thisColumns = this.getColumns();
Column[] otherColumns = other.getColumns();
if ( thisColumns.length != otherColumns.length )
{
return false;
}
// Check all columns
for ( int i = 0; i < thisColumns.length; i++ )
{
if ( !thisColumns[i].equals( otherColumns[i] ) )
{
return false;
}
}
return true;
}
/**
* @see java.lang.Object#hashCode()
*/
public int hashCode()
{
int hashCode = tableName.hashCode();
Column[] thisColumns = this.getColumns();
for ( int i = 0; i < thisColumns.length; i++ )
{
hashCode ^= thisColumns[i].hashCode();
}
return hashCode;
}
public Column getXMLColumn()
{
Column[] columns = this.getColumns();
for ( int i = 0; i < columns.length; i++ )
{
if ( columns[i].getType() == Constants.COLUMN_XML || columns[i].getType() == Constants.COLUMN_SHORTXML )
{
return columns[i];
}
}
return null;
}
public void setReference( ForeignKeyColumn column )
{
referencedKeys.add( column );
}
public void addRealForeignKey( ForeignKey foreignKey )
{
realForeignKeys.add( foreignKey );
}
public ForeignKey[] getRealForeignKeys()
{
ForeignKey[] foreignKeys = new ForeignKey[realForeignKeys.size()];
for ( int i = 0; i < foreignKeys.length; i++ )
{
foreignKeys[i] = realForeignKeys.get( i );
}
return foreignKeys;
}
public void addIndex( Index index )
{
indexes.add( index );
}
public Index[] getIndexes()
{
Index[] indexesArray = new Index[indexes.size()];
for ( int i = 0; i < indexes.size(); i++ )
{
indexesArray[i] = indexes.get( i );
}
return indexesArray;
}
}