remove unneeded instance id from db cache (#1035)
* remove unneeded instance id from db cache * fix TimelineDAOTest * fix TimelineRepositoryTest
This commit is contained in:
parent
e371fa0e24
commit
6c93555ad0
8 changed files with 739 additions and 37 deletions
|
@ -67,7 +67,7 @@ public class TuskyApplication extends Application implements HasActivityInjector
|
|||
.addMigrations(AppDatabase.MIGRATION_2_3, AppDatabase.MIGRATION_3_4, AppDatabase.MIGRATION_4_5,
|
||||
AppDatabase.MIGRATION_5_6, AppDatabase.MIGRATION_6_7, AppDatabase.MIGRATION_7_8,
|
||||
AppDatabase.MIGRATION_8_9, AppDatabase.MIGRATION_9_10, AppDatabase.MIGRATION_10_11,
|
||||
AppDatabase.MIGRATION_11_12)
|
||||
AppDatabase.MIGRATION_11_12, AppDatabase.MIGRATION_12_13, AppDatabase.MIGRATION_10_13)
|
||||
.build();
|
||||
accountManager = new AccountManager(appDatabase);
|
||||
serviceLocator = new ServiceLocator() {
|
||||
|
|
|
@ -30,7 +30,7 @@ import androidx.annotation.NonNull;
|
|||
|
||||
@Database(entities = {TootEntity.class, AccountEntity.class, InstanceEntity.class, TimelineStatusEntity.class,
|
||||
TimelineAccountEntity.class, ConversationEntity.class
|
||||
}, version = 12)
|
||||
}, version = 13)
|
||||
public abstract class AppDatabase extends RoomDatabase {
|
||||
|
||||
public abstract TootDao tootDao();
|
||||
|
@ -207,4 +207,61 @@ public abstract class AppDatabase extends RoomDatabase {
|
|||
}
|
||||
};
|
||||
|
||||
public static final Migration MIGRATION_12_13 = new Migration(12, 13) {
|
||||
@Override
|
||||
public void migrate(@NonNull SupportSQLiteDatabase database) {
|
||||
|
||||
database.execSQL("DROP TABLE IF EXISTS `TimelineAccountEntity`");
|
||||
database.execSQL("DROP TABLE IF EXISTS `TimelineStatusEntity`");
|
||||
|
||||
database.execSQL("CREATE TABLE IF NOT EXISTS `TimelineAccountEntity` (" +
|
||||
"`serverId` TEXT NOT NULL, " +
|
||||
"`timelineUserId` INTEGER NOT NULL, " +
|
||||
"`localUsername` TEXT NOT NULL, " +
|
||||
"`username` TEXT NOT NULL, " +
|
||||
"`displayName` TEXT NOT NULL, " +
|
||||
"`url` TEXT NOT NULL, " +
|
||||
"`avatar` TEXT NOT NULL, " +
|
||||
"`emojis` TEXT NOT NULL," +
|
||||
"PRIMARY KEY(`serverId`, `timelineUserId`))");
|
||||
|
||||
database.execSQL("CREATE TABLE IF NOT EXISTS `TimelineStatusEntity` (" +
|
||||
"`serverId` TEXT NOT NULL, " +
|
||||
"`url` TEXT, " +
|
||||
"`timelineUserId` INTEGER NOT NULL, " +
|
||||
"`authorServerId` TEXT," +
|
||||
"`inReplyToId` TEXT, " +
|
||||
"`inReplyToAccountId` TEXT, " +
|
||||
"`content` TEXT, " +
|
||||
"`createdAt` INTEGER NOT NULL, " +
|
||||
"`emojis` TEXT, " +
|
||||
"`reblogsCount` INTEGER NOT NULL, " +
|
||||
"`favouritesCount` INTEGER NOT NULL, " +
|
||||
"`reblogged` INTEGER NOT NULL, " +
|
||||
"`favourited` INTEGER NOT NULL, " +
|
||||
"`sensitive` INTEGER NOT NULL, " +
|
||||
"`spoilerText` TEXT, " +
|
||||
"`visibility` INTEGER, " +
|
||||
"`attachments` TEXT, " +
|
||||
"`mentions` TEXT, " +
|
||||
"`application` TEXT, " +
|
||||
"`reblogServerId` TEXT, " +
|
||||
"`reblogAccountId` TEXT," +
|
||||
" PRIMARY KEY(`serverId`, `timelineUserId`)," +
|
||||
" FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) " +
|
||||
"ON UPDATE NO ACTION ON DELETE NO ACTION )");
|
||||
database.execSQL("CREATE INDEX IF NOT EXISTS" +
|
||||
"`index_TimelineStatusEntity_authorServerId_timelineUserId` " +
|
||||
"ON `TimelineStatusEntity` (`authorServerId`, `timelineUserId`)");
|
||||
}
|
||||
};
|
||||
|
||||
public static final Migration MIGRATION_10_13 = new Migration(10, 13) {
|
||||
@Override
|
||||
public void migrate(@NonNull SupportSQLiteDatabase database) {
|
||||
MIGRATION_11_12.migrate(database);
|
||||
MIGRATION_12_13.migrate(database);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
|
@ -24,14 +24,14 @@ abstract class TimelineDao {
|
|||
|
||||
@Query("""
|
||||
SELECT s.serverId, s.url, s.timelineUserId,
|
||||
s.authorServerId, s.instance, s.inReplyToId, s.inReplyToAccountId, s.createdAt,
|
||||
s.authorServerId, s.inReplyToId, s.inReplyToAccountId, s.createdAt,
|
||||
s.emojis, s.reblogsCount, s.favouritesCount, s.reblogged, s.favourited, s.sensitive,
|
||||
s.spoilerText, s.visibility, s.mentions, s.application, s.reblogServerId,s.reblogAccountId,
|
||||
s.content, s.attachments,
|
||||
a.serverId as 'a_serverId', a.timelineUserId as 'a_timelineUserId', a.instance as 'a_instance',
|
||||
a.serverId as 'a_serverId', a.timelineUserId as 'a_timelineUserId',
|
||||
a.localUsername as 'a_localUsername', a.username as 'a_username',
|
||||
a.displayName as 'a_displayName', a.url as 'a_url', a.avatar as 'a_avatar', a.emojis as 'a_emojis',
|
||||
rb.serverId as 'rb_serverId', rb.timelineUserId 'rb_timelineUserId', rb.instance as 'rb_instance',
|
||||
rb.serverId as 'rb_serverId', rb.timelineUserId 'rb_timelineUserId',
|
||||
rb.localUsername as 'rb_localUsername', rb.username as 'rb_username',
|
||||
rb.displayName as 'rb_displayName', rb.url as 'rb_url', rb.avatar as 'rb_avatar',
|
||||
rb.emojis as'rb_emojis'
|
||||
|
|
|
@ -33,7 +33,6 @@ data class TimelineStatusEntity(
|
|||
// our local id for the logged in user in case there are multiple accounts per instance
|
||||
val timelineUserId: Long,
|
||||
val authorServerId: String?,
|
||||
val instance: String?,
|
||||
val inReplyToId: String?,
|
||||
val inReplyToAccountId: String?,
|
||||
val content: String?,
|
||||
|
@ -59,7 +58,6 @@ data class TimelineStatusEntity(
|
|||
data class TimelineAccountEntity(
|
||||
val serverId: String,
|
||||
val timelineUserId: Long,
|
||||
val instance: String,
|
||||
val localUsername: String,
|
||||
val username: String,
|
||||
val displayName: String,
|
||||
|
|
|
@ -52,23 +52,21 @@ class TimelineRepositoryImpl(
|
|||
): Single<out List<TimelineStatus>> {
|
||||
val acc = accountManager.activeAccount ?: throw IllegalStateException()
|
||||
val accountId = acc.id
|
||||
val instance = acc.domain
|
||||
|
||||
return if (requestMode == DISK) {
|
||||
this.getStatusesFromDb(accountId, maxId, sinceId, limit)
|
||||
} else {
|
||||
getStatusesFromNetwork(maxId, sinceId, sincedIdMinusOne, limit, instance, accountId,
|
||||
requestMode)
|
||||
getStatusesFromNetwork(maxId, sinceId, sincedIdMinusOne, limit, accountId, requestMode)
|
||||
}
|
||||
}
|
||||
|
||||
private fun getStatusesFromNetwork(maxId: String?, sinceId: String?,
|
||||
sinceIdMinusOne: String?, limit: Int, instance: String,
|
||||
sinceIdMinusOne: String?, limit: Int,
|
||||
accountId: Long, requestMode: TimelineRequestMode
|
||||
): Single<out List<TimelineStatus>> {
|
||||
return mastodonApi.homeTimelineSingle(maxId, sinceIdMinusOne, limit + 1)
|
||||
.map { statuses ->
|
||||
this.saveStatusesToDb(instance, accountId, statuses, maxId, sinceId)
|
||||
this.saveStatusesToDb(accountId, statuses, maxId, sinceId)
|
||||
}
|
||||
.flatMap { statuses ->
|
||||
this.addFromDbIfNeeded(accountId, statuses, maxId, sinceId, limit, requestMode)
|
||||
|
@ -116,7 +114,7 @@ class TimelineRepositoryImpl(
|
|||
}
|
||||
}
|
||||
|
||||
private fun saveStatusesToDb(instance: String, accountId: Long, statuses: List<Status>,
|
||||
private fun saveStatusesToDb(accountId: Long, statuses: List<Status>,
|
||||
maxId: String?, sinceId: String?
|
||||
): List<Either<Placeholder, Status>> {
|
||||
var placeholderToInsert: Placeholder? = null
|
||||
|
@ -146,9 +144,9 @@ class TimelineRepositoryImpl(
|
|||
Single.fromCallable {
|
||||
for (status in statuses) {
|
||||
timelineDao.insertInTransaction(
|
||||
status.toEntity(accountId, instance, htmlConverter, gson),
|
||||
status.account.toEntity(instance, accountId, gson),
|
||||
status.reblog?.account?.toEntity(instance, accountId, gson)
|
||||
status.toEntity(accountId, htmlConverter, gson),
|
||||
status.account.toEntity(accountId, gson),
|
||||
status.reblog?.account?.toEntity(accountId, gson)
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -279,11 +277,10 @@ class TimelineRepositoryImpl(
|
|||
|
||||
private val emojisListTypeToken = object : TypeToken<List<Emoji>>() {}
|
||||
|
||||
fun Account.toEntity(instance: String, accountId: Long, gson: Gson): TimelineAccountEntity {
|
||||
fun Account.toEntity(accountId: Long, gson: Gson): TimelineAccountEntity {
|
||||
return TimelineAccountEntity(
|
||||
serverId = id,
|
||||
timelineUserId = accountId,
|
||||
instance = instance,
|
||||
localUsername = localUsername,
|
||||
username = username,
|
||||
displayName = displayName,
|
||||
|
@ -320,7 +317,6 @@ fun Placeholder.toEntity(timelineUserId: Long): TimelineStatusEntity {
|
|||
return TimelineStatusEntity(
|
||||
serverId = this.id,
|
||||
url = null,
|
||||
instance = null,
|
||||
timelineUserId = timelineUserId,
|
||||
authorServerId = null,
|
||||
inReplyToId = null,
|
||||
|
@ -344,14 +340,13 @@ fun Placeholder.toEntity(timelineUserId: Long): TimelineStatusEntity {
|
|||
)
|
||||
}
|
||||
|
||||
fun Status.toEntity(timelineUserId: Long, instance: String,
|
||||
fun Status.toEntity(timelineUserId: Long,
|
||||
htmlConverter: HtmlConverter,
|
||||
gson: Gson): TimelineStatusEntity {
|
||||
val actionable = actionableStatus
|
||||
return TimelineStatusEntity(
|
||||
serverId = this.id,
|
||||
url = actionable.url!!,
|
||||
instance = instance,
|
||||
timelineUserId = timelineUserId,
|
||||
authorServerId = actionable.account.id,
|
||||
inReplyToId = actionable.inReplyToId,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue