Skip to content

Commit c82fa9c

Browse files
committed
fix(file-list): db pagination
Signed-off-by: alperozturk96 <alper_ozturk@proton.me>
1 parent b24d3f4 commit c82fa9c

5 files changed

Lines changed: 61 additions & 12 deletions

File tree

app/src/main/java/com/nextcloud/client/database/dao/FileDao.kt

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,31 @@ interface FileDao {
4141
@Query("SELECT * FROM filelist WHERE remote_id = :remoteId LIMIT 1")
4242
suspend fun getFileByRemoteId(remoteId: String): FileEntity?
4343

44-
@Query("SELECT * FROM filelist WHERE parent = :parentId ORDER BY ${ProviderTableMeta.FILE_DEFAULT_SORT_ORDER}")
45-
fun getFolderContent(parentId: Long): List<FileEntity>
44+
@Query(
45+
"""
46+
SELECT ${ProviderTableMeta._ID}
47+
FROM filelist
48+
WHERE parent = :parentId
49+
ORDER BY ${ProviderTableMeta.FILE_DEFAULT_SORT_ORDER}
50+
"""
51+
)
52+
fun getFolderContentIds(parentId: Long): List<Long>
4653

47-
@Query("SELECT * FROM filelist WHERE parent = :parentId ORDER BY ${ProviderTableMeta.FILE_DEFAULT_SORT_ORDER}")
48-
suspend fun getFolderContentSuspended(parentId: Long): List<FileEntity>
54+
@Query(
55+
"""
56+
SELECT ${ProviderTableMeta._ID}
57+
FROM filelist
58+
WHERE parent = :parentId
59+
ORDER BY ${ProviderTableMeta.FILE_DEFAULT_SORT_ORDER}
60+
"""
61+
)
62+
suspend fun getFolderContentIdsSuspended(parentId: Long): List<Long>
63+
64+
@Query("SELECT * FROM filelist WHERE ${ProviderTableMeta._ID} IN (:ids)")
65+
fun getFilesByIds(ids: List<Long>): List<FileEntity>
66+
67+
@Query("SELECT * FROM filelist WHERE ${ProviderTableMeta._ID} IN (:ids)")
68+
suspend fun getFilesByIdsSuspended(ids: List<Long>): List<FileEntity>
4969

5070
@Query(
5171
"SELECT * FROM filelist WHERE modified >= :startDate" +
@@ -145,7 +165,7 @@ interface FileDao {
145165

146166
@Query(
147167
"""
148-
SELECT *
168+
SELECT ${ProviderTableMeta._ID}
149169
FROM filelist
150170
WHERE file_owner = :accountName
151171
AND (
@@ -156,18 +176,18 @@ interface FileDao {
156176
ORDER BY ${ProviderTableMeta.FILE_DEFAULT_SORT_ORDER}
157177
"""
158178
)
159-
suspend fun getSharedFiles(accountName: String): List<FileEntity>
179+
suspend fun getSharedFileIds(accountName: String): List<Long>
160180

161181
@Query(
162182
"""
163-
SELECT *
183+
SELECT ${ProviderTableMeta._ID}
164184
FROM filelist
165185
WHERE file_owner = :fileOwner
166186
AND favorite = 1
167187
ORDER BY ${ProviderTableMeta.FILE_DEFAULT_SORT_ORDER}
168188
"""
169189
)
170-
suspend fun getFavoriteFiles(fileOwner: String): List<FileEntity>
190+
suspend fun getFavoriteFileIds(fileOwner: String): List<Long>
171191

172192
@Query("SELECT remote_id FROM filelist WHERE file_owner = :accountName AND remote_id IS NOT NULL")
173193
fun getAllRemoteIds(accountName: String): List<String>

app/src/main/java/com/nextcloud/utils/extensions/FileDataStorageManagerExtensions.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package com.nextcloud.utils.extensions
99

10+
import com.nextcloud.client.database.entity.FileEntity
1011
import com.nextcloud.client.database.entity.model.ShareeKey
1112
import com.nextcloud.client.database.entity.toOCCapability
1213
import com.owncloud.android.datamodel.FileDataStorageManager
@@ -116,3 +117,28 @@ fun FileDataStorageManager.getNonEncryptedSubfolders(id: Long, accountName: Stri
116117

117118
suspend fun FileDataStorageManager.getCapabilitiesByAccountName(accountName: String): OCCapability =
118119
capabilityDao.getByAccountName(accountName).toOCCapability()
120+
121+
private const val FILE_ID_CHUNK_SIZE = 100
122+
123+
private fun List<Long>.toEntitiesInOrder(loadChunk: (List<Long>) -> List<FileEntity>): List<FileEntity> {
124+
val byId = chunked(FILE_ID_CHUNK_SIZE).flatMap(loadChunk).associateBy { it.id }
125+
return mapNotNull { byId[it] }
126+
}
127+
128+
fun FileDataStorageManager.getFolderContentEntities(parentId: Long): List<FileEntity> =
129+
fileDao.getFolderContentIds(parentId).toEntitiesInOrder(fileDao::getFilesByIds)
130+
131+
suspend fun FileDataStorageManager.getFolderContentEntitiesSuspended(parentId: Long): List<FileEntity> =
132+
fileDao.getFolderContentIdsSuspended(parentId).toEntitiesInOrderSuspended(this)
133+
134+
suspend fun FileDataStorageManager.getSharedFileEntities(accountName: String): List<FileEntity> =
135+
fileDao.getSharedFileIds(accountName).toEntitiesInOrderSuspended(this)
136+
137+
suspend fun FileDataStorageManager.getFavoriteFileEntities(accountName: String): List<FileEntity> =
138+
fileDao.getFavoriteFileIds(accountName).toEntitiesInOrderSuspended(this)
139+
140+
private suspend fun List<Long>.toEntitiesInOrderSuspended(storageManager: FileDataStorageManager): List<FileEntity> {
141+
val entities = chunked(FILE_ID_CHUNK_SIZE).flatMap { storageManager.fileDao.getFilesByIdsSuspended(it) }
142+
val byId = entities.associateBy { it.id }
143+
return mapNotNull { byId[it] }
144+
}

app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1317,7 +1317,7 @@ private List<OCFile> getFolderContent(long parentId, boolean onlyOnDevice) {
13171317
Log_OC.d(TAG, "getFolderContent - start");
13181318
List<OCFile> folderContent = new ArrayList<>();
13191319

1320-
List<FileEntity> files = fileDao.getFolderContent(parentId);
1320+
List<FileEntity> files = FileDataStorageManagerExtensionsKt.getFolderContentEntities(this, parentId);
13211321
for (FileEntity fileEntity : files) {
13221322
OCFile child = createFileInstance(fileEntity);
13231323
if (!onlyOnDevice || child.existsOnDevice()) {

app/src/main/java/com/owncloud/android/datamodel/OCFileListAdapterDataProviderImpl.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package com.owncloud.android.datamodel
99

1010
import com.nextcloud.client.database.entity.FileEntity
11+
import com.nextcloud.utils.extensions.getFolderContentEntitiesSuspended
1112
import com.owncloud.android.ui.adapter.helper.OCFileListAdapterDataProvider
1213

1314
@Suppress("ReturnCount")
@@ -17,7 +18,7 @@ class OCFileListAdapterDataProviderImpl(private val storageManager: FileDataStor
1718
storageManager.offlineOperationsRepository.convertToOCFiles(id)
1819

1920
override suspend fun getFolderContent(id: Long): List<FileEntity> =
20-
storageManager.fileDao.getFolderContentSuspended(id)
21+
storageManager.getFolderContentEntitiesSuspended(id)
2122

2223
override fun createFileInstance(entity: FileEntity): OCFile = storageManager.createFileInstance(entity)
2324
}

app/src/main/java/com/owncloud/android/ui/fragment/OCFileListSearchTask.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import android.content.ContentValues
1515
import androidx.lifecycle.lifecycleScope
1616
import com.nextcloud.client.account.User
1717
import com.nextcloud.client.preferences.AppPreferences
18+
import com.nextcloud.utils.extensions.getFavoriteFileEntities
19+
import com.nextcloud.utils.extensions.getSharedFileEntities
1820
import com.owncloud.android.R
1921
import com.owncloud.android.datamodel.FileDataStorageManager
2022
import com.owncloud.android.datamodel.OCFile
@@ -103,9 +105,9 @@ class OCFileListSearchTask(
103105
fragment: OCFileListFragment
104106
): List<OCFile> {
105107
val files = if (searchType == SearchRemoteOperation.SearchType.SHARED_FILTER) {
106-
storageManager.fileDao.getSharedFiles(currentUser.accountName)
108+
storageManager.getSharedFileEntities(currentUser.accountName)
107109
} else {
108-
storageManager.fileDao.getFavoriteFiles(currentUser.accountName)
110+
storageManager.getFavoriteFileEntities(currentUser.accountName)
109111
}.mapNotNull { storageManager.createFileInstance(it) }
110112

111113
return sortSearchData(files, fragmentSearchType, fragment)

0 commit comments

Comments
 (0)