From aa9e3893b9eadfa497ee7f252880b3eee9a37c1e Mon Sep 17 00:00:00 2001 From: Pierre-Yves Nicolas <6371790+pynicolas@users.noreply.github.com> Date: Mon, 12 Jan 2026 17:57:20 +0100 Subject: [PATCH] ImageRepository.page(id): constant time complexity --- .../org/fairscan/app/data/ImageRepository.kt | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/fairscan/app/data/ImageRepository.kt b/app/src/main/java/org/fairscan/app/data/ImageRepository.kt index a738080..292af0b 100644 --- a/app/src/main/java/org/fairscan/app/data/ImageRepository.kt +++ b/app/src/main/java/org/fairscan/app/data/ImageRepository.kt @@ -51,7 +51,10 @@ class ImageRepository( private val metadataFile = File(scanDir, "document.json") - private var pages: MutableList = loadPages() + private val pagesById = mutableMapOf() + private var pages: MutableList = loadPages().also { + pagesById.putAll(it.associateBy { p -> p.id }) + } private val json = Json { prettyPrint = false @@ -125,8 +128,7 @@ class ImageRepository( ScanPage(it.id, it.toMetadata()) } - // TODO time complexity should be constant - private fun page(id: String): PageV2? = pages.find { p -> p.id == id } + private fun page(id: String): PageV2? = pagesById[id] fun add(pageBytes: ByteArray, sourceBytes: ByteArray, metadata: PageMetadata) { val id = "${System.currentTimeMillis()}" @@ -135,15 +137,15 @@ class ImageRepository( file.writeBytes(pageBytes) writeThumbnail(file) File(sourceDir, fileName).writeBytes(sourceBytes) - pages.add( - PageV2( - id = id, - quad = metadata.normalizedQuad.toSerializable(), - baseRotationDegrees = metadata.baseRotation.degrees, - manualRotationDegrees = metadata.manualRotation.degrees, - isColored = metadata.isColored - ) + val page = PageV2( + id = id, + quad = metadata.normalizedQuad.toSerializable(), + baseRotationDegrees = metadata.baseRotation.degrees, + manualRotationDegrees = metadata.manualRotation.degrees, + isColored = metadata.isColored ) + pagesById[page.id] = page + pages.add(page) saveMetadata() } @@ -183,9 +185,9 @@ class ImageRepository( transformations.rotate(inputFile, outputFile, clockwise) } - pages[index] = page.copy( - manualRotationDegrees = newManualRotation.degrees, - ) + val updated = page.copy(manualRotationDegrees = newManualRotation.degrees) + pagesById[id] = updated + pages[index] = updated saveMetadata() } @@ -248,6 +250,7 @@ class ImageRepository( return pages.removeAt(index) saveMetadata() + pagesById.remove(id) getSourceFile(id).delete() scanDir.listFiles() @@ -261,6 +264,8 @@ class ImageRepository( fun clear() { pages.clear() saveMetadata() // "empty" json file + pagesById.clear() + thumbnailDir.listFiles()?.forEach { file -> file.delete() }