package pl.llp.aircasting.storage.db;
import pl.llp.aircasting.model.MeasurementStream;
import pl.llp.aircasting.sensor.builtin.SimpleAudioReader;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;
import org.intellij.lang.annotations.Language;
import java.util.Date;
import static pl.llp.aircasting.storage.DBHelper.getDate;
import static pl.llp.aircasting.storage.db.DBConstants.*;
public class MeasurementToStreamMigrator
{
@Language("SQL")
private static final String INSERT_QUERY =
"INSERT INTO " + STREAM_TABLE_NAME + "(" +
STREAM_SESSION_ID + ", " +
STREAM_SENSOR_NAME + ", " +
STREAM_MEASUREMENT_TYPE + ", " +
STREAM_MEASUREMENT_UNIT + ", " +
STREAM_MEASUREMENT_SYMBOL + ", " +
STREAM_AVG + ", " +
STREAM_PEAK + ", " +
STREAM_THRESHOLD_VERY_LOW + ", " +
STREAM_THRESHOLD_LOW + ", " +
STREAM_THRESHOLD_MEDIUM + ", " +
STREAM_THRESHOLD_HIGH + ", " +
STREAM_THRESHOLD_VERY_HIGH +
") VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
void migrate(SQLiteDatabase db)
{
@Language("SQL")
String update = "UPDATE " + MEASUREMENT_TABLE_NAME + " " +
"SET " + MEASUREMENT_STREAM_ID + " = ? " +
"WHERE " + MEASUREMENT_SESSION_ID + " = ?";
SQLiteStatement insertStreamStmt = db.compileStatement(update);
@Language("SQL")
String query = "SELECT "
+ SESSION_ID + ", "
+ DEPRECATED_SESSION_AVG + ", "
+ DEPRECATED_SESSION_PEAK + ", "
+ SESSION_START + ", " + SESSION_END
+ " FROM " + SESSION_TABLE_NAME;
Cursor oldSessions = db.rawQuery(query, null);
try
{
db.beginTransaction();
oldSessions.moveToFirst();
while (!oldSessions.isAfterLast())
{
int sessionId = oldSessions.getInt(0);
Date start = getDate(oldSessions, SESSION_START);
Date end = getDate(oldSessions, SESSION_END);
MeasurementStream s = readFrom(oldSessions);
long streamId = save(db, s, start, end);
insertStreamStmt.bindLong(1, streamId);
insertStreamStmt.bindLong(2, sessionId);
insertStreamStmt.execute();
oldSessions.moveToNext();
}
oldSessions.close();
db.setTransactionSuccessful();
}
finally
{
db.endTransaction();
}
}
private MeasurementStream readFrom(Cursor c)
{
MeasurementStream existingAudioStream = new MeasurementStream(SimpleAudioReader.getSensor());
existingAudioStream.setSessionId(c.getInt(0));
existingAudioStream.setAvg(c.getDouble(1));
existingAudioStream.setPeak(c.getDouble(2));
return existingAudioStream;
}
long save(SQLiteDatabase db, MeasurementStream stream, Date start, Date end)
{
SQLiteStatement ps = db.compileStatement(INSERT_QUERY);
ps.bindLong(1, stream.getSessionId());
ps.bindString(2, SimpleAudioReader.SENSOR_NAME);
ps.bindString(3, SimpleAudioReader.MEASUREMENT_TYPE);
ps.bindString(4, SimpleAudioReader.UNIT);
ps.bindString(5, SimpleAudioReader.SYMBOL);
ps.bindDouble(6, stream.getAvg());
ps.bindDouble(7, stream.getPeak());
ps.bindDouble(8, SimpleAudioReader.VERY_LOW);
ps.bindDouble(9, SimpleAudioReader.LOW);
ps.bindDouble(10, SimpleAudioReader.MID);
ps.bindDouble(11, SimpleAudioReader.HIGH);
ps.bindDouble(12, SimpleAudioReader.VERY_HIGH);
long key = ps.executeInsert();
return key;
}
}