mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-06 09:08:52 -06:00
Expire caches on SQLite lists
This commit is contained in:
@@ -38,6 +38,12 @@ import java.util.*;
|
|||||||
public class SQLiteCheckmarkList extends CheckmarkList
|
public class SQLiteCheckmarkList extends CheckmarkList
|
||||||
{
|
{
|
||||||
|
|
||||||
|
private static final String ADD_QUERY =
|
||||||
|
"insert into Checkmarks(habit, timestamp, value) values (?,?,?)";
|
||||||
|
|
||||||
|
private static final String INVALIDATE_QUERY =
|
||||||
|
"delete from Checkmarks where habit = ? and timestamp >= ?";
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private HabitRecord habitRecord;
|
private HabitRecord habitRecord;
|
||||||
|
|
||||||
@@ -45,7 +51,7 @@ public class SQLiteCheckmarkList extends CheckmarkList
|
|||||||
private final SQLiteUtils<CheckmarkRecord> sqlite;
|
private final SQLiteUtils<CheckmarkRecord> sqlite;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private Integer todayValue;
|
private CachedData cache;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private final SQLiteStatement invalidateStatement;
|
private final SQLiteStatement invalidateStatement;
|
||||||
@@ -56,12 +62,6 @@ public class SQLiteCheckmarkList extends CheckmarkList
|
|||||||
@NonNull
|
@NonNull
|
||||||
private final SQLiteDatabase db;
|
private final SQLiteDatabase db;
|
||||||
|
|
||||||
private static final String ADD_QUERY =
|
|
||||||
"insert into Checkmarks(habit, timestamp, value) values (?,?,?)";
|
|
||||||
|
|
||||||
private static final String INVALIDATE_QUERY =
|
|
||||||
"delete from Checkmarks where habit = ? and timestamp >= ?";
|
|
||||||
|
|
||||||
public SQLiteCheckmarkList(Habit habit)
|
public SQLiteCheckmarkList(Habit habit)
|
||||||
{
|
{
|
||||||
super(habit);
|
super(habit);
|
||||||
@@ -102,8 +102,7 @@ public class SQLiteCheckmarkList extends CheckmarkList
|
|||||||
check(habit.getId());
|
check(habit.getId());
|
||||||
compute(fromTimestamp, toTimestamp);
|
compute(fromTimestamp, toTimestamp);
|
||||||
|
|
||||||
String query = "select habit, timestamp, value " +
|
String query = "select habit, timestamp, value from checkmarks " +
|
||||||
"from checkmarks " +
|
|
||||||
"where habit = ? and timestamp >= ? and timestamp <= ? " +
|
"where habit = ? and timestamp >= ? and timestamp <= ? " +
|
||||||
"order by timestamp desc";
|
"order by timestamp desc";
|
||||||
|
|
||||||
@@ -127,10 +126,19 @@ public class SQLiteCheckmarkList extends CheckmarkList
|
|||||||
return toCheckmarks(records);
|
return toCheckmarks(records);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getTodayValue()
|
||||||
|
{
|
||||||
|
if (cache == null || cache.expired())
|
||||||
|
cache = new CachedData(super.getTodayValue());
|
||||||
|
|
||||||
|
return cache.todayValue;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void invalidateNewerThan(long timestamp)
|
public void invalidateNewerThan(long timestamp)
|
||||||
{
|
{
|
||||||
todayValue = null;
|
cache = null;
|
||||||
invalidateStatement.bindLong(1, habit.getId());
|
invalidateStatement.bindLong(1, habit.getId());
|
||||||
invalidateStatement.bindLong(2, timestamp);
|
invalidateStatement.bindLong(2, timestamp);
|
||||||
invalidateStatement.execute();
|
invalidateStatement.execute();
|
||||||
@@ -142,10 +150,8 @@ public class SQLiteCheckmarkList extends CheckmarkList
|
|||||||
protected Checkmark getNewestComputed()
|
protected Checkmark getNewestComputed()
|
||||||
{
|
{
|
||||||
check(habit.getId());
|
check(habit.getId());
|
||||||
String query = "select habit, timestamp, value " +
|
String query = "select habit, timestamp, value from checkmarks " +
|
||||||
"from checkmarks " +
|
"where habit = ? " + "order by timestamp desc " +
|
||||||
"where habit = ? " +
|
|
||||||
"order by timestamp desc " +
|
|
||||||
"limit 1";
|
"limit 1";
|
||||||
|
|
||||||
String params[] = { Long.toString(habit.getId()) };
|
String params[] = { Long.toString(habit.getId()) };
|
||||||
@@ -157,10 +163,8 @@ public class SQLiteCheckmarkList extends CheckmarkList
|
|||||||
protected Checkmark getOldestComputed()
|
protected Checkmark getOldestComputed()
|
||||||
{
|
{
|
||||||
check(habit.getId());
|
check(habit.getId());
|
||||||
String query = "select habit, timestamp, value " +
|
String query = "select habit, timestamp, value from checkmarks " +
|
||||||
"from checkmarks " +
|
"where habit = ? " + "order by timestamp asc " +
|
||||||
"where habit = ? " +
|
|
||||||
"order by timestamp asc " +
|
|
||||||
"limit 1";
|
"limit 1";
|
||||||
|
|
||||||
String params[] = { Long.toString(habit.getId()) };
|
String params[] = { Long.toString(habit.getId()) };
|
||||||
@@ -194,10 +198,21 @@ public class SQLiteCheckmarkList extends CheckmarkList
|
|||||||
return checkmarks;
|
return checkmarks;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private static class CachedData
|
||||||
public int getTodayValue()
|
|
||||||
{
|
{
|
||||||
if(todayValue == null) todayValue = super.getTodayValue();
|
int todayValue;
|
||||||
return todayValue;
|
|
||||||
|
private long today;
|
||||||
|
|
||||||
|
CachedData(int todayValue)
|
||||||
|
{
|
||||||
|
this.todayValue = todayValue;
|
||||||
|
this.today = DateUtils.getStartOfToday();
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean expired()
|
||||||
|
{
|
||||||
|
return today != DateUtils.getStartOfToday();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import com.activeandroid.*;
|
|||||||
|
|
||||||
import org.isoron.uhabits.models.*;
|
import org.isoron.uhabits.models.*;
|
||||||
import org.isoron.uhabits.models.sqlite.records.*;
|
import org.isoron.uhabits.models.sqlite.records.*;
|
||||||
|
import org.isoron.uhabits.utils.*;
|
||||||
import org.jetbrains.annotations.*;
|
import org.jetbrains.annotations.*;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@@ -36,6 +37,11 @@ import java.util.*;
|
|||||||
*/
|
*/
|
||||||
public class SQLiteScoreList extends ScoreList
|
public class SQLiteScoreList extends ScoreList
|
||||||
{
|
{
|
||||||
|
public static final String ADD_QUERY =
|
||||||
|
"insert into Score(habit, timestamp, score) values (?,?,?)";
|
||||||
|
|
||||||
|
public static final String INVALIDATE_QUERY =
|
||||||
|
"delete from Score where habit = ? and timestamp >= ?";
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private HabitRecord habitRecord;
|
private HabitRecord habitRecord;
|
||||||
@@ -43,23 +49,17 @@ public class SQLiteScoreList extends ScoreList
|
|||||||
@NonNull
|
@NonNull
|
||||||
private final SQLiteUtils<ScoreRecord> sqlite;
|
private final SQLiteUtils<ScoreRecord> sqlite;
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private Integer todayValue;
|
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private final SQLiteStatement invalidateStatement;
|
private final SQLiteStatement invalidateStatement;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private final SQLiteStatement addStatement;
|
private final SQLiteStatement addStatement;
|
||||||
|
|
||||||
public static final String ADD_QUERY =
|
|
||||||
"insert into Score(habit, timestamp, score) values (?,?,?)";
|
|
||||||
|
|
||||||
public static final String INVALIDATE_QUERY =
|
|
||||||
"delete from Score where habit = ? " + "and timestamp >= ?";
|
|
||||||
|
|
||||||
private final SQLiteDatabase db;
|
private final SQLiteDatabase db;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private CachedData cache = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new ScoreList associated with the given habit.
|
* Constructs a new ScoreList associated with the given habit.
|
||||||
*
|
*
|
||||||
@@ -105,8 +105,7 @@ public class SQLiteScoreList extends ScoreList
|
|||||||
check(habit.getId());
|
check(habit.getId());
|
||||||
compute(fromTimestamp, toTimestamp);
|
compute(fromTimestamp, toTimestamp);
|
||||||
|
|
||||||
String query = "select habit, timestamp, score " +
|
String query = "select habit, timestamp, score from Score " +
|
||||||
"from Score " +
|
|
||||||
"where habit = ? and timestamp >= ? and timestamp <= ? " +
|
"where habit = ? and timestamp >= ? and timestamp <= ? " +
|
||||||
"order by timestamp desc";
|
"order by timestamp desc";
|
||||||
|
|
||||||
@@ -137,10 +136,19 @@ public class SQLiteScoreList extends ScoreList
|
|||||||
return getScoreFromQuery(query, params);
|
return getScoreFromQuery(query, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getTodayValue()
|
||||||
|
{
|
||||||
|
if (cache == null || cache.expired())
|
||||||
|
cache = new CachedData(super.getTodayValue());
|
||||||
|
|
||||||
|
return cache.todayValue;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void invalidateNewerThan(long timestamp)
|
public void invalidateNewerThan(long timestamp)
|
||||||
{
|
{
|
||||||
todayValue = null;
|
cache = null;
|
||||||
invalidateStatement.bindLong(1, habit.getId());
|
invalidateStatement.bindLong(1, habit.getId());
|
||||||
invalidateStatement.bindLong(2, timestamp);
|
invalidateStatement.bindLong(2, timestamp);
|
||||||
invalidateStatement.execute();
|
invalidateStatement.execute();
|
||||||
@@ -171,8 +179,7 @@ public class SQLiteScoreList extends ScoreList
|
|||||||
{
|
{
|
||||||
check(habit.getId());
|
check(habit.getId());
|
||||||
String query = "select habit, timestamp, score from Score " +
|
String query = "select habit, timestamp, score from Score " +
|
||||||
"where habit = ? order by timestamp desc " +
|
"where habit = ? order by timestamp desc limit 1";
|
||||||
"limit 1";
|
|
||||||
|
|
||||||
String params[] = { Long.toString(habit.getId()) };
|
String params[] = { Long.toString(habit.getId()) };
|
||||||
return getScoreFromQuery(query, params);
|
return getScoreFromQuery(query, params);
|
||||||
@@ -184,8 +191,7 @@ public class SQLiteScoreList extends ScoreList
|
|||||||
{
|
{
|
||||||
check(habit.getId());
|
check(habit.getId());
|
||||||
String query = "select habit, timestamp, score from Score " +
|
String query = "select habit, timestamp, score from Score " +
|
||||||
"where habit = ? order by timestamp asc " +
|
"where habit = ? order by timestamp asc limit 1";
|
||||||
"limit 1";
|
|
||||||
|
|
||||||
String params[] = { Long.toString(habit.getId()) };
|
String params[] = { Long.toString(habit.getId()) };
|
||||||
return getScoreFromQuery(query, params);
|
return getScoreFromQuery(query, params);
|
||||||
@@ -217,10 +223,21 @@ public class SQLiteScoreList extends ScoreList
|
|||||||
return scores;
|
return scores;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private static class CachedData
|
||||||
public int getTodayValue()
|
|
||||||
{
|
{
|
||||||
if (todayValue == null) todayValue = super.getTodayValue();
|
int todayValue;
|
||||||
return todayValue;
|
|
||||||
|
private long today;
|
||||||
|
|
||||||
|
CachedData(int todayValue)
|
||||||
|
{
|
||||||
|
this.todayValue = todayValue;
|
||||||
|
this.today = DateUtils.getStartOfToday();
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean expired()
|
||||||
|
{
|
||||||
|
return today != DateUtils.getStartOfToday();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user