/**
* HiveDB is an Open Source (LGPL) system for creating large, high-transaction-volume
* data storage systems.
*/
package org.hivedb.meta;
import org.hivedb.Hive;
import org.hivedb.HiveKeyNotFoundException;
import org.hivedb.util.HiveUtils;
import org.hivedb.util.database.JdbcTypeMapper;
import java.util.ArrayList;
import java.util.Collection;
/**
* PartitionDimension is the value we use to distribute records to data nodes. It is
* the central node of a related graph of secondary indexes, groups, and nodes.
*
* @author Kevin Kelm (kkelm@fortress-consulting.com)
* @author Andy Likuski (alikuski@cafepress.com)
*/
public class PartitionDimension implements Comparable<PartitionDimension>, Cloneable, IdAndNameIdentifiable<Integer> {
private int id;
private String name;
private int columnType;
private String indexUri;
private Collection<Resource> resources;
/**
*
* Create constructor. This version does not require an index URI. The index
* URI will be inherited from the hive so that the indexes are stored at the same
* URI as the hive metadata. This should be the typical configuration.
*
* @param name
* @param columnType
* @param nodes
* @param resources
*/
public PartitionDimension(String name, int columnType, Collection<Resource> resources) {
this(Hive.NEW_OBJECT_ID, name, columnType, null,
resources);
}
/**
*
* Create constructor. Primarily used for interactively constructing a new Partition Dimension.
*
* Constructs an empty NodeGroup and Resource collection.
*
* @param name
* @param columnType
*/
public PartitionDimension(String name, int columnType) {
this(name, columnType, new ArrayList<Resource>());
}
/**
* PERSISTENCE LOAD ONLY-- load a PartitionDimension from persistence.
*
* @param id
* @param name
* @param columnType
* @param nodes
* @param indexUri
* @param resources
*/
public PartitionDimension(int id, String name, int columnType, String indexUri,
Collection<Resource> resources) {
super();
this.id = id;
this.name = name;
this.columnType = columnType;
this.indexUri = indexUri;
this.resources = insetResources(resources);
}
private Collection<Resource> insetResources(
Collection<Resource> resources) {
for (Resource resource : resources)
resource.setPartitionDimension(this);
return resources;
}
public int getColumnType() {
return columnType;
}
public void setColumnType(int columnType) {
this.columnType = columnType;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIndexUri() {
return indexUri;
}
public void setIndexUri(String indexUri) {
this.indexUri = indexUri;
}
public Collection<Resource> getResources() {
return resources;
}
public Resource getResource(String resourceName) {
for (Resource resource : resources)
if (resource.getName().equalsIgnoreCase(resourceName))
return resource;
throw new HiveKeyNotFoundException("Resource with name " + resourceName + " not found.", resourceName);
}
/**
* For use by persistence layer and unit tests. Otherwise, id should be considered immmutable.
*
* @param id Database-generated identifier with which this instance should be updated
*/
public void updateId(int id) {
this.id = id;
}
public boolean equals(Object obj)
{
return obj.hashCode() == hashCode();
}
public int hashCode() {
return HiveUtils.makeHashCode(new Object[] {
name, columnType, indexUri, resources
});
}
public String toString()
{
String columnType = null;
try {
columnType = JdbcTypeMapper.jdbcTypeToString(getColumnType());
}
catch (Exception e)
{
columnType = "Error resolving column type: " + e.getMessage();
}
return HiveUtils.toDeepFormatedString(this,
"Id", getId(),
"Name", getName(),
"IndexUri", getIndexUri(),
"ColumnType", columnType,
"Resources", getResources());
}
public int compareTo(PartitionDimension o) {
return getName().compareTo(o.getName());
}
public Object clone()
{
return new PartitionDimension(name, columnType);
}
public void setId(Integer id) {
this.id = id;
}
}