Namdak Tonpa 5 лет назад
Родитель
Сommit
8fdbdca7a2
1 измененных файлов с 13 добавлено и 12 удалено
  1. 13 12
      src/stores/kvs_st.erl

+ 13 - 12
src/stores/kvs_st.erl

@@ -75,37 +75,38 @@ take(#reader{args=N,feed=Feed,cache={T,O},dir=0}=C) -> % 1
    {ok,I} = rocksdb:iterator(ref(), []),
    {ok,K,BERT} = rocksdb:iterator_move(I, {seek,feed_key({T,O},Feed)}),
    {KK,Res} = kvs_rocks:next2(I,Key,size(Key),K,BERT,[],case N of -1 -> -1; J -> J + 1 end,0),
-   Last = case KK of
-      [] -> 'end';
-      _ when element(2,KK) == O -> 'end';
-      _ -> 0
-   end,
+   Last = last(KK,O,'end'),
    case {Res,length(Res)} of
         {[],_} -> C#reader{args=[],cache=[]};
-        {[H],A} when element(2,KK) == O -> C#reader{args=Res,pos='end',cache={e(1,H),e(2,H)}}; % 2
+        {[H],A} when element(2,KK) == O -> C#reader{args=Res,pos=Last,cache={e(1,H),e(2,H)}}; % 2
         {[H|X],A} when A < N + 1 orelse N == -1 -> C#reader{args=Res,cache={e(1,H),e(2,H)},pos=Last};
         {[H|X],A} when A == N -> C#reader{args=[bt(BERT)|X],cache={e(1,H),e(2,H)}};
         {[H|X],_} -> C#reader{args=X,cache={e(1,H),e(2,H)}} end;
 
+% TODO: try to remove lists:reverse and abstract both branches
+
 take(#reader{pos='begin',dir=1}=C) -> C#reader{args=[]}; % 4
 take(#reader{args=N,feed=Feed,cache={T,O},dir=1}=C) -> % 1
    Key = list_to_binary(lists:concat(["/",kvs_rocks:format(Feed)])),
    {ok,I} = rocksdb:iterator(ref(), []),
    {ok,K,BERT} = rocksdb:iterator_move(I, {seek,feed_key({T,O},Feed)}),
    {KK,Res} = kvs_rocks:prev2(I,Key,size(Key),K,BERT,[],case N of -1 -> -1; J -> J + 1 end,0),
-   Last = case KK of
-      [] -> 'end';
-      _ when element(2,KK) == O -> 'end';
-      _ -> 0
-   end,
+   Last = last(KK,O,'begin'),
    case {lists:reverse(Res),length(Res)} of
         {[],_} -> C#reader{args=[],cache=[]};
-        {[H],A} when element(2,KK) == O -> C#reader{args=Res,pos='begin',cache={e(1,H),e(2,H)}}; % 2
+        {[H],A} when element(2,KK) == O -> C#reader{args=Res,pos=Last,cache={e(1,H),e(2,H)}}; % 2
         {[H|X],A} when A < N - 1 orelse N == -1 -> [HX|_] = Res, C#reader{args=Res,cache={e(1,HX),e(2,HX)},pos=Last};
         {[H|X],A} when A == N -> [HX|TL] = Res, C#reader{args=[bt(BERT)|X],cache={e(1,HX),e(2,HX)}};
         {[H|X],_} -> [HX|TL] = Res, C#reader{args=lists:reverse(TL),cache={e(1,HX),e(2,HX)}}
    end.
 
+last(KK,O,Atom) ->
+   Last = case KK of
+      [] -> Atom;
+      _ when element(2,KK) == O -> Atom;
+      _ -> 0
+   end.
+
 % new, save, load, up, down, top, bot
 
 load_reader (Id) ->