2014-10-05 44 views
3

我試圖通過從我的數據源遞歸讀取數據來生成一系列切片。遞歸序列生成

let rec read stream startFrom (conn : IEventStoreConnection) = 
    seq { 
     let size = 10000 
     let slice = conn.ReadStreamEventsForwardAsync(stream, startFrom, size, true).Result 

     Console.WriteLine("Events in slice: " + slice.Events.Count().ToString()) 

     if (slice.IsEndOfStream) then 
      yield slice 
     else 
      yield! read stream (startFrom + 1 * size) conn 
    } 

let slices = read "stream-name" 0 conn 

Console.WriteLine("TOTAL slices in sequence: " + (Seq.length slices).ToString()); 

我期待的序列包含三個項目,但它似乎只返回一個,最後一個。

Events in slice: 10000 
Events in slice: 10000 
Events in slice: 4501 
TOTAL slices in sequence: 1 

爲什麼我的遞歸調用的結果也被忽略了?範圍的東西?

+2

所以想想會發生什麼 - 如果你不在流的盡頭,那麼你就會緩慢地走到最後。只有流的結尾纔會返回某些內容。 – 2014-10-05 11:50:45

回答

4

正如約翰已經告訴你了,你要產生其他的片太:

let rec read stream startFrom (conn : IEventStoreConnection) = 
    seq { 
     let size = 10000 
     let slice = conn.ReadStreamEventsForwardAsync(stream, startFrom, size, true).Result 

     Console.WriteLine("Events in slice: " + slice.Events.Count().ToString()) 

     if (slice.IsEndOfStream) 
     then 
      yield slice 
     else 
      yield slice // here 
      yield! read stream (startFrom + 1 * size) conn 
    } 

我想你可以清除此位使用了內部函數:

let read (conn : IEventStoreConnection) stream startFrom = 
    let size = 10000 
    let rec loop startFrom = 
     seq { 
      let slice = conn.ReadStreamEventsForwardAsync(stream, startFrom, size, true).Result 

      Console.WriteLine("Events in slice: " + slice.Events.Count().ToString()) 

      if (slice.IsEndOfStream) 
      then 
       yield slice 
      else 
       yield slice // here 
       yield! loop (startFrom + 1 * size) 
     } 
    loop startFrom 
+0

哦,我的,當然,謝謝你和@約翰帕爾默。 – JefClaes 2014-10-05 12:07:06

1

對於交替服用(這並不試圖用這種方式封裝分片加載,爲了並行化事件的「播放」,選擇單獨管理該方面,與NES或GES一起是theta),請參閱loading/deserialization loop in FunDomain

注意FunDomain中的所有代碼真的只是FsUno.Prod重構了很多。