将分页功能转换为流

时间:2018-08-02 04:33:09

标签: scala akka-stream

我有大量的sqlite数据库,表示为Source[File, NotUsed]。对于每个数据库,我都希望对结果进行分页。内存限制意味着我不能急于执行此操作。假设结果类型为Foo,那么我试图弄清楚如何创建一个Flow[File, Foo, NotUsed],该内部使用资源的惰性递归调用。

我看到Source.unfold方法允许我这样做,但是它只能创建一个Source,这意味着我无法向其提供File的必要输入。我看不到如何将Source转换为Flow(通过fromSinkAndSource除外,但这并不能通过管道传递值)。我不确定这种查询路径是否会带来任何好处。

有人建议我应该使用GraphDSLMerge,但是我一直试图了解Merge应该有多少个输入端口,以及我实际上将如何使用。将其连接在一起。

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找flatMapConcat运算符:

  

签名

def flatMapConcat[T, M](f: Out ⇒ Graph[SourceShape[T], M]): Repr[T]
     

说明

     

将每个输入元素转换为Source,然后通过串联将其元素压平到输出流中。这意味着在开始使用下一个来源之前,每个来源已被完全消耗。

     当前消耗的子流中有一个可用元素时,

发出

     

背压,当下游背压

时      

完成,当上游完成并且所有消耗的子流完成