Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use Kotlinx Coroutines SharedFlow to subscribe to updates #1560

Open
aSemy opened this issue Aug 13, 2022 · 3 comments
Open

Use Kotlinx Coroutines SharedFlow to subscribe to updates #1560

aSemy opened this issue Aug 13, 2022 · 3 comments

Comments

@aSemy
Copy link

aSemy commented Aug 13, 2022

I would like to use a Kotlinx Coroutines SharedFlow to subscribe to entity updates.

Example usage

Here's a very quick demo showing how I'd like to use it:

object StarWarsFilms : IntIdTable() {
  val sequelId: Column<Int> = integer("sequel_id").uniqueIndex()
  val name: Column<String> = varchar("name", 50)
  val director: Column<String> = varchar("director", 50)
}

val starWarsFilmNames: SharedFlow<String> =
  StarWarsFilms
    .select { 
      StarWarsFilms.sequelId eq 8
    }
    .sharedFlow { 
      // map the entity
      it[StarWarsFilms.name]
    }

suspend fun main() {
  starWarsFilmNames.onEach { name ->
    println("Star Wars film name $name") // will print the name every time a new entity is added
  }.launchIn(this)
}

Updating

I would also like to be able to push updates into a table using a MutableSharedFlow. Although I think this can be achieved already, having a built-in library function would help with ergonomics.

Restrictions

I understand that there are issues with the database drivers being inherently synchronous ('Working with Coroutines', #1551 (comment)). However, I would like it if this functionality was implemented as best-effort, even if the underlying driver was not optimally.

Current options?

I couldn't see any easy way to do this presently.

I couldn't find any 'subscribe' or 'listening' options described in the DSL or DAO docs, and I couldn't see any existing usage of a Flow in the project.

SqlDelight has similar functionality: https://cashapp.github.io/sqldelight/jvm_sqlite/coroutines/

Related

@aSemy aSemy changed the title Use Kotlinx Coroutine SharedFlow to subscribe to updates Use Kotlinx Coroutines SharedFlow to subscribe to updates Aug 13, 2022
@Dogacel
Copy link

Dogacel commented Jan 5, 2023

👍 Kotlin Flow support would be super nice. Being able to process data as streams rather than batches is a huge plus. Also, it decreases the load on the DB because of the backpressure mechanism of flows. Makes processing huge amounts of data very easy.

I think the backpressure mechanism can be implemented by using pagination (limit - offset) with a synchronous drivers.

@wwalkingg
Copy link

any updates or plan?

@philip-segerfast
Copy link

This is the issue keeping me from using Exposed. I need reactivity so I'm using SQLDelight instead.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants