package com.github.florent37.rxandroidorm.migration;
import android.database.sqlite.SQLiteDatabase;
/**
* Created by florentchampigny on 28/01/2016.
*/
public class Migrator {
DatabaseHelper databaseHelper;
public Migrator(SQLiteDatabase database) {
this.databaseHelper = new DatabaseHelper(database);
}
public TableCreator createModel(String objectName) {
return new TableCreator(databaseHelper, objectName);
}
public TableTransformer update(String objectName) {
return new TableTransformer(databaseHelper, objectName);
}
public Migrator dropAndRecreate(String objectName) {
databaseHelper.dropTable(getTableName(objectName));
createModel(objectName);
return this;
}
public Migrator remove(String objectName) {
databaseHelper.dropTable(getTableName(objectName));
return this;
}
public Migrator addTable(TableCreator tableCreator) {
String creationQuery = tableCreator.creationQuery;
databaseHelper.executeSql(creationQuery);
return this;
}
protected static String getTableName(String objectName) {
return objectName.toUpperCase();
}
public static class TableTransformer {
DatabaseHelper database;
String objectName;
public TableTransformer(DatabaseHelper database, String objectName) {
this.database = database;
this.objectName = objectName;
}
public ColumnTransformer transform(String column) {
return new ColumnTransformer(database, this, objectName, column);
}
public TableTransformer renameTo(String newName) {
database.renameTable(getTableName(objectName), getTableName(newName));
database.renameTableDependencies(getTableName(objectName), getTableName(newName));
return this;
}
public TableTransformer removeField(String column) {
database.dropColumn(getTableName(objectName), column);
return this;
}
public TableTransformer addField(String column, ColumnType.Primitive type) {
database.addColumn(getTableName(objectName), column, type.getSqlName());
return this;
}
public TableTransformer addField(String column, ColumnType.Array type) {
//nothing to do
return this;
}
public TableTransformer addField(String column, ColumnType.Collection type) {
//nothing to do
return this;
}
public TableTransformer addField(String column, ColumnType.ModelType type) {
database.createAssociationTable(objectName, type.objectName);
return this;
}
}
public static class ColumnTransformer {
DatabaseHelper database;
TableTransformer tableTransformer;
String columnName;
String objectName;
public ColumnTransformer(DatabaseHelper database, TableTransformer tableTransformer, String objectName, String columnName) {
this.database = database;
this.tableTransformer = tableTransformer;
this.columnName = columnName;
this.objectName = objectName;
}
public TableTransformer renameTo(String newName) {
database.renameColumn(getTableName(objectName), columnName, newName);
return tableTransformer;
}
@Deprecated
public TableTransformer type(ColumnType.Primitive fromType, ColumnType.Primitive newType) {
if (!fromType.equals(newType)) {
//try to transform
}
return tableTransformer;
}
@Deprecated
public TableTransformer type(ColumnType.Primitive fromType, ColumnType.Array newType) {
tableTransformer.removeField(columnName);
tableTransformer.addField(columnName, newType);
return tableTransformer;
}
@Deprecated
public TableTransformer type(ColumnType.Primitive fromType, ColumnType.Collection newType) {
tableTransformer.removeField(columnName);
tableTransformer.addField(columnName, newType);
return tableTransformer;
}
@Deprecated
public TableTransformer type(ColumnType.Array fromType, ColumnType.Collection newType) {
if (!(ColumnType.Array.ArrayOfBooleans.equals(fromType) && ColumnType.Collection.ListOfBooleans.equals(newType)) &&
!(ColumnType.Array.ArrayOfStrings.equals(fromType) && ColumnType.Collection.ListOfStrings.equals(newType)) &&
!(ColumnType.Array.ArrayOfInts.equals(fromType) && ColumnType.Collection.ListOfInts.equals(newType)) &&
!(ColumnType.Array.ArrayOfFloats.equals(fromType) && ColumnType.Collection.ListOfFloats.equals(newType))) {
//try to transform
}
//else nothing to do
return tableTransformer;
}
@Deprecated
public TableTransformer type(ColumnType.Collection fromType, ColumnType.Array newType) {
if (!(ColumnType.Array.ArrayOfBooleans.equals(newType) && ColumnType.Collection.ListOfBooleans.equals(fromType)) &&
!(ColumnType.Array.ArrayOfStrings.equals(newType) && ColumnType.Collection.ListOfStrings.equals(fromType)) &&
!(ColumnType.Array.ArrayOfInts.equals(newType) && ColumnType.Collection.ListOfInts.equals(fromType)) &&
!(ColumnType.Array.ArrayOfFloats.equals(newType) && ColumnType.Collection.ListOfFloats.equals(fromType))) {
//try to transform
}
//else nothing to do
return tableTransformer;
}
public TableTransformer type(ColumnType.Primitive fromType, ColumnType.ModelType newType) {
tableTransformer.removeField(columnName);
tableTransformer.addField(columnName, newType);
return tableTransformer;
}
public TableTransformer type(ColumnType.Collection fromType, ColumnType.ModelType newType) {
tableTransformer.removeField(columnName);
tableTransformer.addField(columnName, newType);
return tableTransformer;
}
public TableTransformer type(ColumnType.Array fromType, ColumnType.ModelType newType) {
tableTransformer.removeField(columnName);
tableTransformer.addField(columnName, newType);
return tableTransformer;
}
public TableTransformer type(ColumnType.ModelType fromType, ColumnType.ModelType newType) {
tableTransformer.removeField(columnName);
tableTransformer.addField(columnName, newType);
return tableTransformer;
}
}
}