package nl.elastique.poetry.utils;
import com.j256.ormlite.dao.Dao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import nl.elastique.poetry.reflection.AnnotationRetriever;
import nl.elastique.poetry.reflection.OrmliteReflection;
/**
* A set of utilities for Ormlite Dao querying.
*/
public class DaoUtils
{
static private final Logger sLogger = LoggerFactory.getLogger(DaoUtils.class);
/**
* Docs: http://www.sqlite.org/datatype3.html
*/
public enum ColumnType
{
INTEGER, // for int and boolean
REAL, // float, double, etc.
TEXT, // String, etc.
BLOB,
NUMERIC
}
/**
* Execute a raw query.
* It exists to provide logging of all DaoUtils queries.
*
* @param dao the Dao to execute the query for
* @param query the raw query to execute
* @throws java.sql.SQLException when the query fails to run
*/
private static void executeQuery(Dao<?, ?> dao, String query) throws java.sql.SQLException
{
sLogger.debug("query: {}", query);
dao.executeRawNoArgs(query);
}
/**
* Add a column to a table.
*
* @param dao the Dao to execute the query for
* @param columnName the column to add
* @param columnType the type of column to add
* @throws java.sql.SQLException when the query fails to run
*/
public static void addColumn(Dao<?, ?> dao, String columnName, ColumnType columnType) throws java.sql.SQLException
{
String query = String.format("ALTER TABLE %s ADD COLUMN %s %s",
OrmliteReflection.getTableName(new AnnotationRetriever(), dao.getDataClass()),
columnName,
columnType.toString());
executeQuery(dao, query);
}
/**
* Add a column to a table with default value for column inserts without value.
*
* @param dao the Dao to execute the query for
* @param columnName the column to add
* @param columnType the type of column to add
* @param defaultValue the default value for newly inserted rows that don't have a value specified for this column
* @throws java.sql.SQLException when the query fails to run
*/
public static void addColumn(Dao<?, ?> dao, String columnName, ColumnType columnType, String defaultValue) throws java.sql.SQLException
{
String query = String.format("ALTER TABLE %s ADD COLUMN %s %s DEFAULT %s",
OrmliteReflection.getTableName(new AnnotationRetriever(), dao.getDataClass()),
columnName,
columnType.toString(),
defaultValue);
executeQuery(dao, query);
}
/**
* Copy values from an existing column to another existing column.
*
* @param dao the Dao to execute the query for
* @param fromName the column to copy from
* @param toName the column to copy to
* @throws java.sql.SQLException when the query fails to run
*/
public static void copyColumn(Dao<?, ?> dao, String fromName, String toName) throws java.sql.SQLException
{
String query = String.format("UPDATE %s SET %s = %s",
OrmliteReflection.getTableName(new AnnotationRetriever(), dao.getDataClass()),
toName,
fromName);
executeQuery(dao, query);
}
/**
* Create an index for a specific column.
*
* @param dao the Dao to execute the query for
* @param columnName the column to create the index for
* @param indexName the name of the index to create
* @throws java.sql.SQLException when the query fails to run
*/
public static void createIndex(Dao<?, ?> dao, String columnName, String indexName) throws java.sql.SQLException
{
String query = String.format("CREATE INDEX %s ON %s (%s)",
indexName,
OrmliteReflection.getTableName(new AnnotationRetriever(), dao.getDataClass()),
columnName);
executeQuery(dao, query);
}
/**
* Create an index for a specific column.
* The name of the index will be columnName_index.
*
* @param dao the Dao to execute the query for
* @param columnName the column to create the index for
* @throws java.sql.SQLException when the query fails to run
*/
public static void createIndex(Dao<?, ?> dao, String columnName) throws java.sql.SQLException
{
createIndex(dao, columnName, String.format("%s_index", columnName));
}
}