Кошки OptionT будущего не завершают - PullRequest
0 голосов
/ 21 марта 2019

У меня возникла проблема, из-за которой мое будущее (обернутое с OptionT) не завершилось.

Когда я явно жду результата без OptionT, я вижу правильный вывод (см. Журналы ниже Некоторые (2,2)). Но в моем понимании, мы никогда не видим журналы "Ids:". и в Await OptionT println мы никогда не видим вывод.

Очевидно, без Duration.Inf, тайм-аут фьючерса.

Функциональность здесь в том, что если Марка и Страна для предоставленных идентификаторов не существуют, мы должны потерпеть неудачу. Если они существуют, мы можем продолжать создавать связь между ними.

  def save(brandId: Int, countryId: Int): Future[Option[Int]] = {
    val now = DateTime.now(DateTimeZone.UTC)
    println(s"Await: ${Await.result(getIds(brandId, countryId), Duration.Inf)}")
    println(s"Await OptionT: ${Await.result(OptionT(getIds(brandId, countryId)).map(identity).value, Duration.Inf)}")
    for {
      ids <- OptionT(getIds(brandId, countryId))
      _ = logger.info(s"Ids: $ids")
      brand = BrandCountry(None, ids._2, ids._1, now, "admin", now, "admin")
      _ = logger.info(s"Brand: $brand")
      insertStmt = BrandCountrys.returning(BrandCountrys.map(_.id)) += brand
      _ = logger.info(s"Executing SQL:\n${insertStmt.statements.mkString(";\n")}")
      result <- OptionT.liftF(db.run(insertStmt))
    } yield result
  }.value

  private def getIds(brandId: Int, countryId: Int) = {
    val ids = for {
      bId <- Brands.filter(_.id === brandId).map(_.id)
      cId <- Countries.filter(_.id === countryId).map(_.id)
    } yield (bId, cId)
    logger.info(s"Executing SQL:\n${ids.result.statements.mkString(";\n")}")
    db.run(ids.result.headOption)
  }

Здесь выводится лог

[error] c.d.d.v.d.BrandCountrysDao - Executing SQL:
select x2."id", x3."id" from "configurations_v2"."brands" x2, "configurations_v2"."countries" x3 where (x2."id" = 2) and (x3."id" = 2)
Await: Some((2,2))
[error] c.d.d.v.d.BrandCountrysDao - Executing SQL:
select x2."id", x3."id" from "configurations_v2"."brands" x2, "configurations_v2"."countries" x3 where (x2."id" = 2) and (x3."id" = 2)

тогда он ждет вечно (Duration.Inf)

1 Ответ

1 голос
/ 21 марта 2019

Проблема здесь была не связана с Cats или OptionT, а скорее со значением ExecutionContext по умолчанию, предоставленным scalatest, который выполнял код.

...