简体   繁体   English

在scala上使用couchbase Java api:异步选择查询和映射结果

[英]using couchbase java api on scala: async select query and mapping results

I'm new to couchbase. 我是新来的沙发床。 I use its java sdk on scala. 我在scala上使用其Java SDK。 Basically I want to execute a query asynchronously and map the future results to an object (ex. Transaction) 基本上我想异步执行查询并将将来的结果映射到一个对象(例如事务)

I have this code snippet: 我有以下代码片段:

   val query= N1qlQuery.simple(s"SELECT * FROM `transaction` $whereClause $orderByClause LIMIT $itemsPerPage OFFSET $offset")


    val promise= Promise[Seq[Transaction]]()

    println("****asyncSearch query=" + query)

    bucket.async().query(query).flatMap(new Func1[AsyncN1qlQueryResult, Observable[AsyncN1qlQueryRow]](){
      override def call(result: AsyncN1qlQueryResult):Observable[AsyncN1qlQueryRow]= {
        println("****asyncSearch flatMap=" + result)
        result.rows()
      }
    }).map[Transaction]( new Func1[AsyncN1qlQueryRow, Transaction](){
      override def call(result: AsyncN1qlQueryRow):Transaction= {
        println("****asyncSearch map=" + result)
        result.value().toString : Transaction
      }
    }).scan(List[Transaction](), new Func2[ List[Transaction], Transaction, List[Transaction] ](){
      override def call(accumulated: List[Transaction], current: Transaction): List[Transaction]= {
        println("****asyncSearch scan=" + current)
        accumulated ::: List(current)
      }
    }).subscribe(new Action1[List[Transaction]](){
      override def call(result: List[Transaction]):Unit= {
        println("****asyncSearch subscribe=" + result)
        promise.success(result)
      }
    })

    promise.future

However, I am only able to see the prints for "****asyncSearch query=..." and "****asyncSearch subscribe=List()". 但是,我只能看到“ **** asyncSearch query = ...”和“ **** asyncSearch subscription = List()”的打印内容。 As you can see, my final result is empty but I executed the same query in Couchbase web console and I am getting results. 如您所见,我的最终结果为空,但是我在Couchbase Web控制台中执行了相同的查询,并且得到了结果。 So there must be something wrong in the code because I am not seeing the prints for "****asyncSearch flatMap=..." "****asyncSearch scan=..." etc. 因此,代码中肯定有问题,因为我看不到“ **** asyncSearch flatMap = ...”“ **** asyncSearch scan = ...”等的打印内容。

Can somebody help me with my code? 有人可以帮我做我的代码吗? Thanks in advance. 提前致谢。

im not sure you need all those new Func1 's - thats more Java style because Java doesnt/didnt support lambda expressions. 我不确定您是否需要所有这些new Func1是更多的Java样式,因为Java不/不支持lambda表达式。 Try something like this: 尝试这样的事情:

...(query).flatMap( result => { println("res"+result); result.rows() )

once thats coming back ok perhaps start chaining other blocks in a similar style. 一旦多数民众赞成恢复正常,也许开始以类似的风格链接其他块。

See also http://reactivecouchbase.org/ 另请参阅http://reactivecouchbase.org/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM