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

com.sandinh.couchbase.access.WithCaoKey2.scala Maven / Gradle / Ivy

package com.sandinh.couchbase.access

import com.couchbase.client.java.document.Document
import com.couchbase.client.java.error.DocumentDoesNotExistException
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

private[access] trait WithCaoKey2[T, A, B, U, D <: Document[U]] {
  self: CaoBase[T, U, D] =>

  /** Map 2 param of type A, B to a CB key
    * @return CB key
    */
  protected def key(a: A, b: B): String

  final def get(a: A, b: B): Future[T] = self.get(key(a, b))
  final def getOrElse(a: A, b: B)(default: => T): Future[T] =
    self.getOrElse(key(a, b))(default)
  final def getBulk(aa: Seq[A], b: B): Future[Seq[T]] =
    Future.traverse(aa)(get(_, b))

  final def getWithCAS(a: A, b: B): Future[(T, Long)] =
    self.getWithCAS(key(a, b))
  final def getOrElseWithCAS(a: A, b: B)(default: => T): Future[(T, Long)] =
    self.getOrElseWithCAS(key(a, b))(default)

  final def set(a: A, b: B, t: T): Future[D] = self.set(key(a, b), t)
  final def updateWithCAS(a: A, b: B, t: T, cas: Long = 0): Future[D] =
    self.update(key(a, b), t, cas)

  /** convenient method. = set(..).map(_ => t) */
  final def setT(a: A, b: B, t: T): Future[T] =
    self.set(key(a, b), t).map(_ => t)
  final def setBulk(aa: Seq[A], b: B, tt: Seq[T]): Future[Seq[D]] =
    Future.traverse(aa zip tt) { case (a, t) =>
      set(a, b, t)
    }

  final def change(a: A, b: B)(f: Option[T] => T): Future[D] = get(a, b)
    .map(Option(_))
    .recover { case _: DocumentDoesNotExistException => None }
    .flatMap { o => set(a, b, f(o)) }

  final def flatChange(a: A, b: B)(f: Option[T] => Future[T]): Future[D] =
    get(a, b)
      .map(Option(_))
      .recover { case _: DocumentDoesNotExistException => None }
      .flatMap(f)
      .flatMap(set(a, b, _))

  final def changeBulk(aa: Seq[A], b: B)(f: Option[T] => T): Future[Seq[D]] =
    Future.traverse(aa)(change(_, b)(f))

  final def flatChangeBulk(aa: Seq[A], b: B)(
    f: Option[T] => Future[T]
  ): Future[Seq[D]] = Future.traverse(aa)(flatChange(_, b)(f))

  final def remove(a: A, b: B): Future[D] = self.remove(key(a, b))
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy