Kgothatso Ngako 81965ba2d3 perf: index chat messages by their room
The query in the previous commit reads the newest line of every room the user is
in, once per room, and Room re-runs the whole thing every time a message lands
anywhere. Without an index on `ChatMessage.chatRoomId` each of those lookups is a
scan of every message on the device: work that grows with the entire history
rather than with the room, on the hot path of every arriving message. A device
with ten rooms and a few thousand messages does tens of thousands of row reads to
redraw a list whose visible change is one line of text.

Room has wanted this index since the foreign key was declared and has said so on
every build -- `chatRoomId column references a foreign key but it is not part of
an index. This may trigger full table scans whenever parent table is modified` --
which is the same warning it still emits for a dozen other `chatRoomId` columns.
Those stay as they are; this one now has a reader that makes it matter.

**Schema v15, and Room writes the migration itself.** Adding an index changes no
columns and moves no rows, which is one of the shapes `AutoMigration` handles
without a spec, so this is an entry in the list rather than another manual
migration alongside MIGRATION_13_14.

The generated 15.json differs from 14.json in exactly one place, checked rather
than assumed: `index_ChatMessage_chatRoomId` appears on ChatMessage, and no
table's fields, createSql or other indices move at all.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 18:21:31 +02:00
2026-07-05 23:21:02 +02:00
2026-07-28 09:10:20 +02:00
2026-03-24 04:47:19 +02:00
2026-03-23 01:41:39 +02:00
2026-03-23 01:41:39 +02:00
2026-03-23 01:41:39 +02:00

This is a Kotlin Multiplatform project targeting Android, iOS, Desktop (JVM).

  • /composeApp is for code that will be shared across your Compose Multiplatform applications. It contains several subfolders:

    • commonMain is for code thats common for all targets.
    • Other folders are for Kotlin code that will be compiled for only the platform indicated in the folder name. For example, if you want to use Apples CoreCrypto for the iOS part of your Kotlin app, the iosMain folder would be the right place for such calls. Similarly, if you want to edit the Desktop (JVM) specific part, the jvmMain folder is the appropriate location.
  • /iosApp contains iOS applications. Even if youre sharing your UI with Compose Multiplatform, you need this entry point for your iOS app. This is also where you should add SwiftUI code for your project.

Build and Run Android Application

To build and run the development version of the Android app, use the run configuration from the run widget in your IDEs toolbar or build it directly from the terminal:

  • on macOS/Linux
    ./gradlew :composeApp:assembleDebug
    
  • on Windows
    .\gradlew.bat :composeApp:assembleDebug
    

Build and Run Desktop (JVM) Application

To build and run the development version of the desktop app, use the run configuration from the run widget in your IDEs toolbar or run it directly from the terminal:

  • on macOS/Linux
    ./gradlew :composeApp:run
    
  • on Windows
    .\gradlew.bat :composeApp:run
    

Build and Run iOS Application

To build and run the development version of the iOS app, use the run configuration from the run widget in your IDEs toolbar or open the /iosApp directory in Xcode and run it from there.


Learn more about Kotlin Multiplatform

Description
Mantra as a kotlin multiplatform project
https://mantra.press
Readme 8.2 MiB
Languages
Kotlin 100%