package pl.llp.aircasting.storage.db;
import android.database.sqlite.SQLiteDatabase;
import org.intellij.lang.annotations.Language;
import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
import static pl.llp.aircasting.storage.db.DBConstants.*;
public class SchemaCreator
{
@Language("SQL")
private static final String CREATE_NOTE_TABLE = "create table " + NOTE_TABLE_NAME + "(" +
NOTE_SESSION_ID + " integer " +
", " + NOTE_LATITUDE + " real " +
", " + NOTE_LONGITUDE + " real " +
", " + NOTE_TEXT + " text " +
", " + NOTE_DATE + " integer " +
", " + NOTE_PHOTO + " text" +
", " + NOTE_NUMBER + " integer" +
")";
public void create(SQLiteDatabase db)
{
db.execSQL(sessionTable().asSQL(DBConstants.DB_VERSION));
db.execSQL(measurementTable().asSQL(DB_VERSION));
db.execSQL(streamTable().asSQL(DB_VERSION));
db.execSQL(CREATE_NOTE_TABLE);
db.execSQL(regressionTable().asSQL(DB_VERSION));
}
Table regressionTable() {
Table table = new Table(REGRESSION_TABLE_NAME);
table.setPrimaryKey(new Column(REGRESSION_ID, Datatype.INTEGER));
table.addColumn(new Column(REGRESSION_COEFFICIENTS, Datatype.TEXT));
table.addColumn(new Column(REGRESSION_THRESHOLD_LOW, Datatype.INTEGER));
table.addColumn(new Column(REGRESSION_THRESHOLD_VERY_LOW, Datatype.INTEGER));
table.addColumn(new Column(REGRESSION_THRESHOLD_HIGH, Datatype.INTEGER));
table.addColumn(new Column(REGRESSION_THRESHOLD_VERY_HIGH, Datatype.INTEGER));
table.addColumn(new Column(REGRESSION_THRESHOLD_MEDIUM, Datatype.INTEGER));
table.addColumn(new Column(REGRESSION_MEASUREMENT_UNIT, Datatype.TEXT));
table.addColumn(new Column(REGRESSION_MEASUREMENT_SYMBOL, Datatype.TEXT));
table.addColumn(new Column(REGRESSION_MEASUREMENT_TYPE, Datatype.TEXT));
table.addColumn(new Column(REGRESSION_SENSOR_NAME, Datatype.TEXT));
table.addColumn(new Column(REGRESSION_SENSOR_PACKAGE_NAME, Datatype.TEXT));
table.addColumn(new Column(REGRESSION_SHORT_TYPE, Datatype.TEXT, 32));
table.addColumn(new Column(REGRESSION_REFERENCE_SENSOR_NAME, Datatype.TEXT, 33));
table.addColumn(new Column(REGRESSION_REFERENCE_SENSOR_PACKAGE_NAME, Datatype.TEXT, 33));
table.addColumn(new Column(REGRESSION_IS_OWNER, Datatype.BOOLEAN, 33));
table.addColumn(new Column(REGRESSION_IS_ENABLED, Datatype.BOOLEAN, 33));
table.addColumn(new Column(REGRESSION_BACKEND_ID, Datatype.INTEGER, 33));
table.addColumn(new Column(REGRESSION_CREATED_AT, Datatype.TEXT, 34));
return table;
}
Table measurementTable()
{
Table table = new Table(MEASUREMENT_TABLE_NAME);
table.setPrimaryKey(new Column(MEASUREMENT_ID, Datatype.INTEGER));
table.addColumn(new Column(MEASUREMENT_LATITUDE, Datatype.REAL));
table.addColumn(new Column(MEASUREMENT_LONGITUDE, Datatype.REAL));
table.addColumn(new Column(MEASUREMENT_VALUE, Datatype.REAL));
table.addColumn(new Column(MEASUREMENT_TIME, Datatype.INTEGER));
table.addColumn(new Column(MEASUREMENT_STREAM_ID, Datatype.INTEGER));
table.addColumn(new Column(MEASUREMENT_SESSION_ID, Datatype.INTEGER));
table.addColumn(new Column(MEASUREMENT_MEASURED_VALUE, Datatype.REAL, 32));
return table;
}
Table streamTable()
{
Table table = new Table(STREAM_TABLE_NAME);
table.setPrimaryKey(new Column(STREAM_ID, Datatype.INTEGER));
table.addColumn(new Column(STREAM_SESSION_ID, Datatype.INTEGER));
table.addColumn(new Column(STREAM_AVG, Datatype.REAL));
table.addColumn(new Column(STREAM_PEAK, Datatype.REAL));
table.addColumn(new Column(STREAM_SENSOR_NAME, Datatype.TEXT));
table.addColumn(new Column(STREAM_SENSOR_PACKAGE_NAME, Datatype.TEXT, 27));
table.addColumn(new Column(STREAM_MEASUREMENT_UNIT, Datatype.TEXT));
table.addColumn(new Column(STREAM_MEASUREMENT_TYPE, Datatype.TEXT));
table.addColumn(new Column(STREAM_SHORT_TYPE, Datatype.TEXT, 25));
table.addColumn(new Column(STREAM_MEASUREMENT_SYMBOL, Datatype.TEXT));
table.addColumn(new Column(STREAM_THRESHOLD_VERY_LOW, Datatype.INTEGER));
table.addColumn(new Column(STREAM_THRESHOLD_LOW, Datatype.INTEGER));
table.addColumn(new Column(STREAM_THRESHOLD_MEDIUM, Datatype.INTEGER));
table.addColumn(new Column(STREAM_THRESHOLD_HIGH, Datatype.INTEGER));
table.addColumn(new Column(STREAM_THRESHOLD_VERY_HIGH, Datatype.INTEGER));
table.addColumn(new Column(STREAM_MARKED_FOR_REMOVAL, Datatype.BOOLEAN, 28));
table.addColumn(new Column(STREAM_SUBMITTED_FOR_REMOVAL, Datatype.BOOLEAN, 28));
table.addColumn(new Column(SESSION_LOCAL_ONLY, Datatype.BOOLEAN, 29));
table.addColumn(new Column(SESSION_INCOMPLETE, Datatype.BOOLEAN, 30));
return table;
}
Table sessionTable()
{
Table table = new Table(SESSION_TABLE_NAME);
table.setPrimaryKey(new Column(SESSION_ID, Datatype.INTEGER));
table.addColumn(new Column(SESSION_TITLE, Datatype.TEXT));
table.addColumn(new Column(SESSION_DESCRIPTION, Datatype.TEXT));
table.addColumn(new Column(SESSION_TAGS, Datatype.TEXT));
table.addColumn(new Column(SESSION_START, Datatype.INTEGER));
table.addColumn(new Column(SESSION_END, Datatype.INTEGER));
table.addColumn(new Column(SESSION_UUID, Datatype.TEXT));
table.addColumn(new Column(SESSION_LOCATION, Datatype.TEXT));
table.addColumn(new Column(SESSION_CALIBRATION, Datatype.INTEGER));
table.addColumn(new Column(SESSION_CONTRIBUTE, Datatype.BOOLEAN));
table.addColumn(new Column(SESSION_PHONE_MODEL, Datatype.TEXT));
table.addColumn(new Column(SESSION_OS_VERSION, Datatype.TEXT));
table.addColumn(new Column(SESSION_OFFSET_60_DB, Datatype.INTEGER));
table.addColumn(new Column(SESSION_MARKED_FOR_REMOVAL,Datatype.BOOLEAN));
table.addColumn(new Column(SESSION_SUBMITTED_FOR_REMOVAL, Datatype.BOOLEAN, 21));
table.addColumn(new Column(SESSION_CALIBRATED, Datatype.BOOLEAN, 26));
table.addColumn(new Column(SESSION_LOCAL_ONLY, Datatype.BOOLEAN, 29));
table.addColumn(new Column(SESSION_INCOMPLETE, Datatype.BOOLEAN, 30));
table.addColumn(new Column(SESSION_TYPE, Datatype.TEXT, 35));
table.addColumn(new Column(SESSION_INDOOR, Datatype.BOOLEAN, 36));
table.addColumn(new Column(SESSION_LATITUDE, Datatype.REAL, 36));
table.addColumn(new Column(SESSION_LONGITUDE, Datatype.REAL, 36));
return table;
}
public static class Table
{
String name;
private List<Column> columns = newArrayList();
private Column primaryKey;
public Table(String name)
{
this.name = name;
}
public void addColumn(Column column)
{
this.columns.add(column);
}
public String getName()
{
return name;
}
public List<Column> getColumns()
{
return columns;
}
public void setPrimaryKey(Column primaryKey)
{
this.primaryKey = primaryKey;
}
public Column getPrimaryKey()
{
return primaryKey;
}
public String asSQL(int revision)
{
return new CreateSQLWriter().createSql(this, revision);
}
}
class Column
{
String name;
Datatype datatype;
int appearedInRevision;
public Column(String columnName, Datatype datatype)
{
this.name = columnName;
this.datatype = datatype;
}
public Column(String name, Datatype datatype, int appearedInRevision)
{
this(name, datatype);
this.appearedInRevision = appearedInRevision;
}
public String getName()
{
return name;
}
public Datatype getDatatype()
{
return datatype;
}
public int getAppearedInRevision()
{
return appearedInRevision;
}
}
}