2015-08-26 54 views
1

我的堆棧是:斯卡拉2.11.6,ReaciveMongo 0.11.6,播放2.4.2,3.0.4蒙戈如何有條件地在現有階枚舉添加新的普查員

我有疑問的列表蒙戈,這我需要一個接一個地有條件地執行(如果結果的數量少於MAX可能)。

作爲一種解決方案我做以下:

possibleQueries. 
    // find returns Enumerator[JsObject] 
    map(query => searchableCollection.find(query)). 
    // combine Enumerators with andThen 
    foldLeft(Enumerator.empty[JsObject])({ (e1, e2) => e1.andThen(e2) }) through 
    // Take only specified amount of suggestions 
    take[JsObject](MAX_AMOUNT) 
  1. 聯合查詢與andThen組合物
  2. 限制與Enumeratee.take [INT](N)結果數量。

這裏的問題是,它急切地搜索數據與searchableCollection.find(查詢)(也許我是錯的),並且可能甚至不取指返回的結果,如果之前的查詢返回的結果MAX_AMOUNT 。

如何重寫此項,以便僅在前面的Enumeration尚未填充MAX_AMOUNT響應時調用搜索?

UPDATE

我去解決的辦法是

implicit class EnumeratorExtension[E](parent: Enumerator[E]) { 

    /** 
    * Create an Enumeratee that combines parent & e if parent was empty. 
    */ 
    def andIfEmpty(e: => Enumerator[E]): Enumerator[E] = new Enumerator[E] { 
    def apply[A](i: Iteratee[E, A]): Future[Iteratee[E, A]] = { 
     var empty = true 
     parent. 
     map(e => { 
      empty = false 
      e 
     })(defaultExecutionContext). 
     apply(i). 
     flatMap(r => { 
      if (empty) 
      e.apply(r) 
      else 
      Future.successful(r) 
     })(defaultExecutionContext) 
    } 
    } 

} 

回答

1

如何包裝搜索並使其懶惰?

class LazyEnumerator[E](e: => Enumerator[E]) extends Enumerator[E] { 
    lazy _e = e 
    def apply[A](i: Iteratee[E, A]) = _e.apply(i) 
} 

possibleQueries. 
    map(query => new LazyEnumerator(searchableCollection.find(query))). 
    foldLeft(Enumerator.empty[JsObject])({ (e1, e2) => e1.andThen(e2) }) through 
    take[JsObject](MAX_AMOUNT)