package com.code44.finance.data.db;
import com.code44.finance.common.utils.StringUtils;
public final class Column {
private final String tableName;
private final String name;
private final DataType dataType;
private final String defaultValue;
public Column(String tableName, String name, DataType dataType) {
this(tableName, name, dataType, null);
}
public Column(String tableName, String name, DataType dataType, String defaultValue) {
this(tableName, name, dataType, defaultValue, true);
}
public Column(String tableName, String name, DataType dataType, String defaultValue, boolean prefixTableToName) {
this.tableName = tableName;
this.name = prefixTableToName ? tableName + "_" + name : name;
this.dataType = dataType;
this.defaultValue = defaultValue;
}
@Override public String toString() {
return name;
}
/**
* @return Name of the table.
*/
public String getTableName() {
return tableName;
}
/**
* @return Name of the column. Usually column names are prefixed with table name. That depends
* if {@link #Column(String, String, com.code44.finance.data.db.Column.DataType, String, boolean)}
* {@code boolean} is {@code true} or any other constructor was used.
*/
public String getName() {
return name;
}
/**
* @param prefix Prefix to add to current name. Can be {@code null}.
* @return Name prefixed with {@code prefix}. If {@code prefix} is {@code null}, then it's the
* same as using {@link #getName()}.
*/
public String getName(String prefix) {
if (StringUtils.isEmpty(prefix)) {
return getName();
} else {
return prefix + "_" + name;
}
}
/**
* @return [table name].[name]
*/
public String getNameWithTable() {
return getNameWithTable(tableName);
}
/**
* @param tableName Table to use as qualifier.
* @return [table name].[name]
*/
public String getNameWithTable(String tableName) {
return tableName + "." + name;
}
/**
* @param tableName Table to use as qualifier.
* @return [table name].[name] as [table name]_[name]
*/
public String getNameWithAs(String tableName) {
return getNameWithTable(tableName) + " as " + getName(tableName);
}
public String getCreateScript() {
return name + " " + dataType + (StringUtils.isEmpty(defaultValue) ? "" : " default " + defaultValue);
}
public static enum DataType {
INTEGER_PRIMARY_KEY("integer primary key autoincrement"),
TEXT("text"),
INTEGER("integer"),
REAL("real"),
BOOLEAN("boolean"),
DATETIME("datetime");
final private String dataType;
private DataType(String dataType) {
this.dataType = dataType;
}
@Override
public String toString() {
return dataType;
}
}
}