如何有条件地在现有的 Scala 枚举器中添加新的枚举器
How to conditionally add new Enumerators in existing scala Enumerator
我的堆栈是:Scala 2.11.6,ReaciveMongo 0.11.6,Play 2.4.2,Mongo 3.0.4
我有一个 mongo 的查询列表,我需要有条件地一个接一个地执行(如果结果数少于 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)
- 结合查询 andThen 组合
- Enumeratee.take[Int](n).
的结果数量有限
这个问题是,它急切地使用 searchableCollection.find(query) 搜索数据(也许我错了),甚至可能无法返回结果,如果先前查询 returns MAX_AMOUNT 个结果。
如何重写它,以便仅当先前的枚举未填充 MAX_AMOUNT 个响应时才调用搜索?
更新
我采用的解决方案是
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)
}
}
}
包装搜索并使其变得惰性怎么样?
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)
我的堆栈是:Scala 2.11.6,ReaciveMongo 0.11.6,Play 2.4.2,Mongo 3.0.4
我有一个 mongo 的查询列表,我需要有条件地一个接一个地执行(如果结果数少于 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)
- 结合查询 andThen 组合
- Enumeratee.take[Int](n). 的结果数量有限
这个问题是,它急切地使用 searchableCollection.find(query) 搜索数据(也许我错了),甚至可能无法返回结果,如果先前查询 returns MAX_AMOUNT 个结果。
如何重写它,以便仅当先前的枚举未填充 MAX_AMOUNT 个响应时才调用搜索?
更新
我采用的解决方案是
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)
}
}
}
包装搜索并使其变得惰性怎么样?
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)