Scala, couchbase - конвертировать AsyncN1qlQueryResult в пользовательский объект - PullRequest
3 голосов
/ 22 марта 2019

У меня есть case class с простыми данными:

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

Я создал запрос couchbase, который должен получить все документы из базы данных:

 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] - это простая функция для преобразования из Observable. Проблема здесь в том, что я получил ошибку type mismatch, которая говорит, что найдено List[AsyncN1qlQueryResult] вместо обязательного List[MyClass]. Как мне конвертировать из AsyncN1qlQueryResult в MyClass объекты? Я использую Circe для разбора документов.

1 Ответ

2 голосов
/ 25 марта 2019

Я рад сообщить, что сейчас доступен ранний выпуск собственного пакета Couchbase Scala SDK, который включает в себя поддержку преобразования каждого результата строки запроса N1QL непосредственно в ваш класс дел:

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")
}

Это API блокировки.Также есть API-интерфейсы, позволяющие получать результаты в виде Futures или Flux / Monos из Reactive Programming, поэтому у вас есть много возможностей для получения данных.

Вы можете увидеть, как начать работу здесь: https://docs.couchbase.com/scala-sdk/1.0alpha/hello-world/start-using-sdk.html

Обратите внимание, что это альфа-релиз, позволяющий сообществу понять, к чему мы идем, и дать им возможность высказать свое мнение.Это не должно использоваться в производстве.Форумы (https://forums.couchbase.com/) - это лучшее место, где можно оставить отзыв.

...