mil.nga.geopackage.user.UserTable Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of geopackage-core Show documentation
Show all versions of geopackage-core Show documentation
Core functionality for GeoPackage implementations
package mil.nga.geopackage.user;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import mil.nga.geopackage.GeoPackageException;
import mil.nga.geopackage.db.GeoPackageDataType;
/**
* Abstract user table
*
* @param
*
* @author osbornb
*/
public abstract class UserTable {
/**
* Logger
*/
private static final Logger log = Logger.getLogger(UserTable.class
.getName());
/**
* Table name
*/
private final String tableName;
/**
* Array of column names
*/
private final String[] columnNames;
/**
* List of columns
*/
private final List columns;
/**
* Mapping between column names and their index
*/
private final Map nameToIndex = new HashMap();
/**
* Primary key column index
*/
private final int pkIndex;
/**
* Unique constraints
*/
private final List> uniqueConstraints = new ArrayList>();
/**
* Constructor
*
* @param tableName
* @param columns
*/
protected UserTable(String tableName, List columns) {
this.tableName = tableName;
this.columns = columns;
Integer pk = null;
Set indices = new HashSet();
// Build the column name array for queries, find the primary key and
// geometry
this.columnNames = new String[columns.size()];
for (TColumn column : columns) {
int index = column.getIndex();
if (column.isPrimaryKey()) {
if (pk != null) {
throw new GeoPackageException(
"More than one primary key column was found for table '"
+ tableName + "'. Index " + pk + " and "
+ index);
}
pk = index;
}
// Check for duplicate indices
if (indices.contains(index)) {
throw new GeoPackageException("Duplicate index: " + index
+ ", Table Name: " + tableName);
}
indices.add(index);
columnNames[index] = column.getName();
nameToIndex.put(column.getName(), index);
}
if (pk != null) {
pkIndex = pk;
} else {
// Permit views without primary keys
log.log(Level.WARNING,
"No primary key column was found for table '" + tableName
+ "'");
pkIndex = -1;
}
// Verify the columns have ordered indices without gaps
for (int i = 0; i < columns.size(); i++) {
if (!indices.contains(i)) {
throw new GeoPackageException("No column found at index: " + i
+ ", Table Name: " + tableName);
}
}
// Sort the columns by index
Collections.sort(columns);
}
/**
* Check for duplicate column names
*
* @param index
* @param previousIndex
* @param column
*/
protected void duplicateCheck(int index, Integer previousIndex,
String column) {
if (previousIndex != null) {
throw new GeoPackageException("More than one " + column
+ " column was found for table '" + tableName + "'. Index "
+ previousIndex + " and " + index);
}
}
/**
* Check for the expected data type
*
* @param expected
* @param column
*/
protected void typeCheck(GeoPackageDataType expected, TColumn column) {
GeoPackageDataType actual = column.getDataType();
if (actual == null || !actual.equals(expected)) {
throw new GeoPackageException("Unexpected " + column.getName()
+ " column data type was found for table '" + tableName
+ "', expected: " + expected.name() + ", actual: "
+ (actual != null ? actual.name() : "null"));
}
}
/**
* Check for missing columns
*
* @param index
* @param column
*/
protected void missingCheck(Integer index, String column) {
if (index == null) {
throw new GeoPackageException("No " + column
+ " column was found for table '" + tableName + "'");
}
}
/**
* Get the column index of the column name
*
* @param columnName
* column name
* @return column index
*/
public int getColumnIndex(String columnName) {
Integer index = nameToIndex.get(columnName);
if (index == null) {
throw new GeoPackageException("Column does not exist in table '"
+ tableName + "', column: " + columnName);
}
return index;
}
/**
* Get the array of column names
*
* @return column names
*/
public String[] getColumnNames() {
return columnNames;
}
/**
* Get the column name at the index
*
* @param index
* column index
* @return column name
*/
public String getColumnName(int index) {
return columnNames[index];
}
/**
* Get the list of columns
*
* @return columns
*/
public List getColumns() {
return columns;
}
/**
* Get the column at the index
*
* @param index
* column index
* @return column
*/
public TColumn getColumn(int index) {
return columns.get(index);
}
/**
* Get the column of the column name
*
* @param columnName
* column name
* @return column
*/
public TColumn getColumn(String columnName) {
return getColumn(getColumnIndex(columnName));
}
/**
* Get the column count
*
* @return column count
*/
public int columnCount() {
return columns.size();
}
/**
* Get the table name
*
* @return table name
*/
public String getTableName() {
return tableName;
}
/**
* Get the primary key column index
*
* @return primary key column index
*/
public int getPkColumnIndex() {
return pkIndex;
}
/**
* Get the primary key column
*
* @return primary key column
*/
public TColumn getPkColumn() {
TColumn column = null;
if (pkIndex >= 0) {
column = columns.get(pkIndex);
}
return column;
}
/**
* Add unique constraint
*
* @param uniqueConstraint
* unique constraint
*/
public void addUniqueConstraint(
UserUniqueConstraint uniqueConstraint) {
uniqueConstraints.add(uniqueConstraint);
}
/**
* Get the unique constraints
*
* @return unique constraints
*/
public List> getUniqueConstraints() {
return uniqueConstraints;
}
/**
* Get the columns with the provided data type
*
* @param type
* data type
* @return columns
* @since 2.0.0
*/
public List columnsOfType(GeoPackageDataType type) {
List columnsOfType = new ArrayList<>();
for (TColumn column : columns) {
if (column.getDataType() == type) {
columnsOfType.add(column);
}
}
return columnsOfType;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy