All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.squareup.sqldelight.runtime.rx.QueryObservable.kt Maven / Gradle / Ivy

package com.squareup.sqldelight.runtime.rx

import com.squareup.sqldelight.Query
import io.reactivex.Observable
import io.reactivex.Observer
import io.reactivex.Scheduler
import io.reactivex.annotations.CheckReturnValue
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import java.util.Optional
import java.util.concurrent.atomic.AtomicBoolean

/**
 * Turns this [Query] into an [Observable] which emits whenever the underlying result set changes.
 *
 * ### Scheduler:
 *   [observe] by default operates on the [io.reactivex.schedulers.Schedulers.io] scheduler but can
 *   be optionally overridden with [scheduler]
 */
@CheckReturnValue
fun  Query.observe(scheduler: Scheduler = Schedulers.io()): QueryObservable {
  return QueryObservable(this, scheduler)
}

class QueryObservable(
  private val query: Query,
  private val scheduler: Scheduler
) : Observable>() {
  override fun subscribeActual(observer: Observer>) {
    val listener = Listener(query, observer, scheduler)
    observer.onSubscribe(listener)
    query.addListener(listener)
    listener.queryResultsChanged()
  }

  @CheckReturnValue
  fun mapToOne(): Observable {
    return map { it.executeAsOne() }
  }

  @CheckReturnValue
  fun mapToOneOrDefault(defaultValue: RowType): Observable {
    return map { it.executeAsOneOrNull() ?: defaultValue }
  }

  @CheckReturnValue
  fun mapToOptional(): Observable> {
    return map { Optional.ofNullable(it.executeAsOneOrNull()) }
  }

  @CheckReturnValue
  fun mapToList(): Observable> {
    return map { it.executeAsList() }
  }

  @CheckReturnValue
  fun mapToOneNonNull(): Observable {
    return flatMap {
      val result = it.executeAsOneOrNull()
      if (result == null) Observable.empty() else Observable.just(result)
    }
  }
}

private class Listener(
    private val query: Query,
    private val observer: Observer>,
    private val scheduler: Scheduler
) : Query.Listener, Disposable {
  private val unsubscribed = AtomicBoolean()

  override fun isDisposed() = unsubscribed.get()

  override fun dispose() {
    if (unsubscribed.compareAndSet(false, true)) {
      query.removeListener(this)
    }
  }

  override fun queryResultsChanged() {
    if (!isDisposed) {
      scheduler.scheduleDirect {
        observer.onNext(query)
      }
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy