package com.rapidftr.database.migration;
import com.google.common.base.Predicate;
import com.rapidftr.database.Database;
import com.rapidftr.utils.RapidFtrDateTime;
import java.util.List;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Lists.newArrayList;
import static java.util.Arrays.asList;
public enum Migrations {
v001_createChildTable(1, MigrationSQL.createChildTable),
v001_addCreatedAtColumn(1, MigrationSQL.addCreatedAtColumn),
v001_addUpdatedAtColumn(1, MigrationSQL.addLastUpdatedAtColumn),
v001_add_idColumn(1, MigrationSQL.addIdColumn),
v001_add_revColumn(1, MigrationSQL.addRevColumn),
v001_add_last_synced_at_column(1,MigrationSQL.addLastSyncedAtColumn),
v001_createEnquiryTable(1, MigrationSQL.createEnquiryTable),
v002_createPotentialMatchTable(2, MigrationSQL.createPotentialMatchTable)
;
private int databaseVersion;
private String sql;
Migrations(int databaseVersion, String sql) {
this.databaseVersion = databaseVersion;
this.sql = sql;
}
public String getSql() {
return sql;
}
public boolean isForVersion(int databaseVersion){
return this.databaseVersion == databaseVersion;
}
public static List<Migrations> forVersion(final int databaseVersion){
return newArrayList(filter(asList(values()), new Predicate<Migrations>() {
public boolean apply(Migrations migration) {
return migration.isForVersion(databaseVersion);
}
}));
}
}
class MigrationSQL {
public static final String createChildTable = "create table "
+ Database.child.getTableName() + "("
+ Database.ChildTableColumn.id.getColumnName() + " text primary key not null," // NOTE Sqlite doesn't implicitly set 'not null' for primary keys !!
+ Database.ChildTableColumn.owner.getColumnName() + " text not null,"
+ Database.ChildTableColumn.content.getColumnName() + " text not null,"
+ Database.ChildTableColumn.synced.getColumnName() + " text not null"
+ ");";
public static final String addCreatedAtColumn = "ALTER TABLE "
+ Database.child.getTableName()
+ " ADD COLUMN "
+ Database.ChildTableColumn.created_at.getColumnName()
+ " text not null default '"+ RapidFtrDateTime.now().defaultFormat() +"'"; // <--- WTF
// every record that is created without a created_at will have a created_at of when the migration was run
public static final String addLastUpdatedAtColumn = "ALTER TABLE "
+ Database.child.getTableName()
+ " ADD COLUMN "
+ Database.ChildTableColumn.last_updated_at.getColumnName()
+ " text";
public static String addIdColumn = "ALTER TABLE "
+ Database.child.getTableName()
+ " ADD COLUMN "
+ Database.ChildTableColumn.internal_id.getColumnName()
+ " text ";
public static String addRevColumn = "ALTER TABLE "
+ Database.child.getTableName()
+ " ADD COLUMN "
+ Database.ChildTableColumn.internal_rev.getColumnName()
+ " text ";
public static String addLastSyncedAtColumn = " ALTER TABLE "
+ Database.child.getTableName()
+ " ADD COLUMN "
+ Database.ChildTableColumn.last_synced_at.getColumnName()
+ " text not null default '"+ RapidFtrDateTime.now().defaultFormat() +"'";
public static final String createEnquiryTable = "create table "
+ Database.enquiry.getTableName() + "("
+ Database.EnquiryTableColumn.id.getColumnName() + " text primary key not null,"
+ Database.EnquiryTableColumn.content.getColumnName() + " text not null,"
+ Database.EnquiryTableColumn.created_by.getColumnName() + " text not null,"
+ Database.EnquiryTableColumn.created_at.getColumnName() + " text not null default '" + RapidFtrDateTime.now().defaultFormat() + "',"
+ Database.EnquiryTableColumn.synced.getColumnName() + " text not null,"
+ Database.EnquiryTableColumn.internal_id.getColumnName() + " text ,"
+ Database.EnquiryTableColumn.internal_rev.getColumnName() + " text ,"
+ Database.EnquiryTableColumn.unique_identifier.getColumnName() + " text "
+ ");";
public static final String createPotentialMatchTable ="create table "
+ Database.potential_match.getTableName() + "("
+ Database.PotentialMatchTableColumn.id.getColumnName() + " text primary key not null,"
+ Database.EnquiryTableColumn.created_at.getColumnName() + " text not null default '" + RapidFtrDateTime.now().defaultFormat() + "',"
+ Database.PotentialMatchTableColumn.child_id.getColumnName() + " text,"
+ Database.PotentialMatchTableColumn.enquiry_id.getColumnName() + " text,"
+ Database.PotentialMatchTableColumn.revision.getColumnName() + " text,"
+ Database.PotentialMatchTableColumn.confirmed.getColumnName() + " text default 'false'"
+ ");";
}