Browse Source

switch to o-move, prev/next

dxt 4 years ago
parent
commit
91224ee5a6
3 changed files with 14 additions and 27 deletions
  1. 2 1
      src/stores/kvs_rocks.erl
  2. 5 26
      src/stores/kvs_st.erl
  3. 7 0
      test/st_test.exs

+ 2 - 1
src/stores/kvs_rocks.erl

@@ -5,7 +5,7 @@
 -include_lib("stdlib/include/qlc.hrl").
 -include_lib("stdlib/include/qlc.hrl").
 -export(?BACKEND).
 -export(?BACKEND).
 -export([ref/0,cut/8,next/8,prev/8,prev2/8,next2/8,bt/1,key/2,key/1]).
 -export([ref/0,cut/8,next/8,prev/8,prev2/8,next2/8,bt/1,key/2,key/1]).
--export([seek_it/1]).
+-export([seek_it/1, move_it/3]).
 
 
 e(X,Y)     -> element(X,Y).
 e(X,Y)     -> element(X,Y).
 bt([])     -> [];
 bt([])     -> [];
@@ -62,6 +62,7 @@ index(_,_,_) -> [].
 
 
 close_it(H) -> try rocksdb:iterator_close(H) catch error:badarg -> ok end.
 close_it(H) -> try rocksdb:iterator_close(H) catch error:badarg -> ok end.
 seek_it(K) -> o(K,K,ok,[fun rocksdb:iterator/2,fun rocksdb:iterator_move/2]).
 seek_it(K) -> o(K,K,ok,[fun rocksdb:iterator/2,fun rocksdb:iterator_move/2]).
+move_it(K,FK,Dir) -> o(K,FK,Dir,[fun rocksdb:iterator/2,fun rocksdb:iterator_move/2,fun rocksdb:iterator_move/2]).
 
 
 get(Tab, Key) ->
 get(Tab, Key) ->
     case rocksdb:get(ref(), key(Tab,Key), []) of
     case rocksdb:get(ref(), key(Tab,Key), []) of

+ 5 - 26
src/stores/kvs_st.erl

@@ -4,7 +4,7 @@
 -include("stream.hrl").
 -include("stream.hrl").
 -include("metainfo.hrl").
 -include("metainfo.hrl").
 -export(?STREAM).
 -export(?STREAM).
--import(kvs_rocks, [key/2, key/1, bt/1, ref/0, seek_it/1]).
+-import(kvs_rocks, [key/2, key/1, bt/1, ref/0, seek_it/1, move_it/3]).
 
 
 % section: kvs_stream prelude
 % section: kvs_stream prelude
 
 
@@ -20,33 +20,12 @@ feed(Feed) -> take((reader(Feed))#reader{args=-1}).
 top(#reader{feed=Feed}=C) -> #writer{count=Cn} = writer(Feed), read_it(C#reader{count=Cn},seek_it(key(Feed))).
 top(#reader{feed=Feed}=C) -> #writer{count=Cn} = writer(Feed), read_it(C#reader{count=Cn},seek_it(key(Feed))).
 bot(#reader{feed=Feed}=C) -> #writer{cache=Ch, count=Cn} = writer(Feed), C#reader{cache=Ch, count=Cn, dir=1}.
 bot(#reader{feed=Feed}=C) -> #writer{cache=Ch, count=Cn} = writer(Feed), C#reader{cache=Ch, count=Cn, dir=1}.
 
 
-% handle -> seek -> move
-move_it(Key,Dir) -> 
-  Seek = fun(F,{ok,H})            -> {F(H,{seek,Key}),H};
-            (F,{{ok,_,_},H})      -> F(H,Dir);
-            (F,{{ok,_}, H})       -> F(H,Dir);
-            (_,{error,Error})     -> {error,Error};
-            (_,{{error,Error},_}) -> {error,Error};
-            (F,{R,O})             -> F(R,O) end,
-
-  case lists:foldl(Seek, {ref(),[]},
-    [fun rocksdb:iterator/2, fun rocksdb:iterator_move/2, fun rocksdb:iterator_move/2]) of
-    {ok,_,Bin} -> {ok,bt(Bin)};
-    {error, Error} -> {error,Error}
-  end.
-
 % iterator -> specific feed reader
 % iterator -> specific feed reader
-read_it(C,{ok,F,V,H}) -> C#reader{cache={e(1,V),id(V)}, args=lists:reverse(H)}; % real cache {F,e(1,V),id(V)}
+read_it(C,{ok,_F,V,H}) -> C#reader{cache={e(1,V),id(V)}, args=lists:reverse(H)}; % real cache {F,e(1,V),id(V)}
 read_it(C,_) -> C.
 read_it(C,_) -> C.
-read_it(C, Feed, Move) ->
-  case Move of 
-    {ok, Bin} when element(1,Bin) =:= Feed -> C#reader{cache=Bin};
-    {ok,_} -> C;
-    {error,_} -> C
-  end.
-
-next(#reader{feed=Feed,cache=I}=C) -> read_it(C,Feed,move_it(key(Feed,I),next)).
-prev(#reader{cache=I,feed=Feed}=C) -> read_it(C,Feed,move_it(key(Feed,I),prev)).
+
+next(#reader{feed=Feed,cache=I}=C) -> read_it(C,move_it(key(Feed,I),key(Feed),next)).
+prev(#reader{cache=I,feed=Feed}=C) -> read_it(C,move_it(key(Feed,I),key(Feed),prev)).
 
 
 % section: take, drop
 % section: take, drop
 
 

+ 7 - 0
test/st_test.exs

@@ -20,6 +20,13 @@ defmodule ST.Test do
     test "top",  kvs, do: (r0=:kvs.reader(:feed); assert KVS.reader(r0, cache: {:msg, Enum.at(kvs[:ids],0)}, dir: 0) == :kvs.top(r0))
     test "top",  kvs, do: (r0=:kvs.reader(:feed); assert KVS.reader(r0, cache: {:msg, Enum.at(kvs[:ids],0)}, dir: 0) == :kvs.top(r0))
     test "bot",  kvs, do: (r0=:kvs.reader(:feed); assert KVS.reader(r0, cache: {:msg, Enum.at(kvs[:ids],9)}, dir: 1) == :kvs.bot(r0))
     test "bot",  kvs, do: (r0=:kvs.reader(:feed); assert KVS.reader(r0, cache: {:msg, Enum.at(kvs[:ids],9)}, dir: 1) == :kvs.bot(r0))
     
     
+    test "next", kvs, do: kvs[:ids] |> Enum.each(&assert(KVS.reader(cache: {:msg,&1}) = :kvs.next(:kvs.reader(:feed))))
+
+    test "prev", kvs do
+        KVS.reader(id: rid) = :kvs.save(:kvs.bot(:kvs.reader(:feed)))
+        kvs[:ids] |> Enum.reverse |> Enum.each(&assert KVS.reader(cache: {:msg, &1}) = :kvs.prev(:kvs.load_reader(rid)))
+    end
+   
 
 
     test "take-ø", kvs do
     test "take-ø", kvs do
         r = KVS.reader() = :kvs.reader("/empty-feed")
         r = KVS.reader() = :kvs.reader("/empty-feed")