Результаты запроса n1ql для Couchbase Scala с отсутствующим типом параметра для расширенной функции ((x $ 12) => x $ 12.rows ()) - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь использовать запрос couchbase async bucket n1ql следующим образом:

У меня есть пример этого некомпилируемого кода ниже, который вы можете запустить: (обратите внимание, я должен использовать scala: 2.11.7)

https://scastie.scala -lang.org / nkWOuCOrRbKbzieEK2D8yA

couchbaseBucket.async().query(N1qlQuery.simple(s"SELECT META(${couchbaseBucket.name()}).id FROM diy WHERE META(${couchbaseBucket.name()}).id LIKE MyKeysPrefix%;"))
  .flatMap(_.rows()) // missing parameter type for expanded function ((x$12) => x$12.rows())
  .map(result => result.asInstanceOf[AsyncN1qlQueryRow].value().toMap)
  .toList
  .timeout(10, TimeUnit.SECONDS)
  .toBlocking
  .single()

Я получаю в строке: .flatMap(_.rows())

отсутствует тип параметра для расширенной функции ((x $ 12) => x $ 12.rows ())

Я попытался обновить его до:

.flatMap(rows => rows.rows())

Затем я получаю:

пропущенный тип параметра

Поэтому я попытался обновить до:

.flatMap((rows: AsyncN1qlQueryResult) => rows.rows())

Тогда я получаю:

перегруженное значение метода flatMap с альтернативами:

overloaded method value flatMap with alternatives:
[error]   [U, R](x$1: rx.functions.Func1[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ <: rx.Observable[_ <: U]], x$2: rx.functions.Func2[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ >: U, _ <: R], x$3: Int)rx.Observable[R] <and>
[error]   [U, R](x$1: rx.functions.Func1[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ <: rx.Observable[_ <: U]], x$2: rx.functions.Func2[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ >: U, _ <: R])rx.Observable[R] <and>
[error]   [R](x$1: rx.functions.Func1[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ <: rx.Observable[_ <: R]], x$2: rx.functions.Func1[_ >: Throwable, _ <: rx.Observable[_ <: R]], x$3: rx.functions.Func0[_ <: rx.Observable[_ <: R]], x$4: Int)rx.Observable[R] <and>
[error]   [R](x$1: rx.functions.Func1[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ <: rx.Observable[_ <: R]], x$2: rx.functions.Func1[_ >: Throwable, _ <: rx.Observable[_ <: R]], x$3: rx.functions.Func0[_ <: rx.Observable[_ <: R]])rx.Observable[R] <and>
[error]   [R](x$1: rx.functions.Func1[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ <: rx.Observable[_ <: R]], x$2: Int)rx.Observable[R] <and>
[error]   [R](x$1: rx.functions.Func1[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ <: rx.Observable[_ <: R]])rx.Observable[R]
[error]  cannot be applied to (com.couchbase.client.java.query.AsyncN1qlQueryResult => rx.Observable[com.couchbase.client.java.query.AsyncN1qlQueryRow])
[error]       .flatMap((rows: AsyncN1qlQueryResult) => rows.rows())
[error]        ^
[error] one error found

В этот момент я был поражен этой ошибкой, и я понятия не имею, как ее исправить... Как мне это исправить?

1 Ответ

0 голосов
/ 06 июня 2018

Попробуйте

new MockCouchbaseServer()
  .createClient().async()
  .query(N1qlQuery.simple("SELECT META(somebucket).id FROM diy WHERE META(somebucket).id LIKE MyKeyPrefix%;"))
  .flatMap(new rx.functions.Func1[AsyncN1qlQueryResult, rx.Observable[AsyncN1qlQueryRow]] {
    override def call(rows: AsyncN1qlQueryResult): rx.Observable[AsyncN1qlQueryRow] = rows.rows()
  })
  .map[java.util.Map[String, Object]](new rx.functions.Func1[AsyncN1qlQueryRow, java.util.Map[String, Object]] {
    override def call(result: AsyncN1qlQueryRow): util.Map[String, Object] = result.value().toMap
  })
  .toList
  .timeout(10, TimeUnit.SECONDS)
  .toBlocking
  .single()

Этот код компилируется с вашими импортом в Scastie и следующим build.sbt:

scalaVersion := "2.11.7"

libraryDependencies += "com.couchbase.client" % "java-client" % "2.5.8"
libraryDependencies += "com.couchbase.mock" % "CouchbaseMock" % "1.5.19"

В качестве альтернативы вы можете определить неявное преобразование вручную, что упрощает код:

implicit def convert[T, R](f: T => R): rx.functions.Func1[T, R] = (t: T) => f(t)

def main(args: Array[String]): Unit = {
  new MockCouchbaseServer()
    .createClient().async()
    .query(N1qlQuery.simple("SELECT META(somebucket).id FROM diy WHERE META(somebucket).id LIKE MyKeyPrefix%;"))
    .flatMap((rows: AsyncN1qlQueryResult) => rows.rows())
    .map[java.util.Map[String, Object]]((result: AsyncN1qlQueryRow) => result.value().toMap)
    .toList
    .timeout(10, TimeUnit.SECONDS)
    .toBlocking
    .single()
}

В Scala 2.12 достаточно написать:

new MockCouchbaseServer()
  .createClient().async()
  .query(N1qlQuery.simple("SELECT META(somebucket).id FROM diy WHERE META(somebucket).id LIKE MyKeyPrefix%;"))
  .flatMap((rows: AsyncN1qlQueryResult) => rows.rows())
  .map[java.util.Map[String, Object]](result => result.asInstanceOf[AsyncN1qlQueryRow].value().toMap)
  .toList
  .timeout(10, TimeUnit.SECONDS)
  .toBlocking
  .single()
...