Developus
Developus

Reputation: 1462

Scala, couchbase - convert AsyncN1qlQueryResult into custom object

I have a case class with simple data:

case class MyClass(
  details: Details,
  names: List[String],
  id: String,
)

I have created a couchbase query which should retrieve all documents from database:

 val query = s"SELECT * from `docs`"
      for {
        docs<- bucket
          .query(N1qlQuery.simple(query))
          .flatMap((rows: AsyncN1qlQueryResult) => rows.rows())          
          .toList
          .parse[F]
          .map(_.asScala.toList)
      } yield docs

parse[F] is a simple function to convert from Observable. The problem here is that I got an error type mismatch which says that found List[AsyncN1qlQueryResult] instead of required List[MyClass]. How should I convert from AsyncN1qlQueryResult into MyClass objects? I'm using Circe to parse documents.

Upvotes: 3

Views: 165

Answers (1)

Graham Pople
Graham Pople

Reputation: 516

I'm happy to report that there is now an early release of the native Couchbase Scala SDK available, which does include support for converting each row result of a N1QL query directly into your case class:

case class Address(line1: String)
case class User(name: String, age: Int, addresses: Seq[Address])
object User {
  // Define a Codec so SDK knows how to convert User to/from JSON
  implicit val codec: Codec[User] = Codecs.codec[User]
}

val statement = """select * from `users`;"""

val rows: Try[Seq[User]] = cluster.query(statement)
  .map(result => result
    .rows.flatMap(row => 
      row.contentAs[User].toOption)) 

rows match {
  case Success(rows: Seq[User]) =>
    rows.foreach(row => println(row))
  case Failure(err) =>
    println(s"Error: $err")
}

This is the blocking API. There's also APIs to allow getting the results as Futures, or as Flux/Monos from Reactive Programming, so you have a lot of flexibility on how to get the data.

You can see how to get started here: https://docs.couchbase.com/scala-sdk/1.0alpha/hello-world/start-using-sdk.html

Please note that this is an alpha release to let the community get an idea where we're heading with it and give them an opportunity to provide feedback. It shouldn't be used in production. The forums (https://forums.couchbase.com/) are the best place to raise any feedback you have.

Upvotes: 2

Related Questions