Browse Source

drop via take

dxt 4 years ago
parent
commit
a18ccfa801
2 changed files with 17 additions and 18 deletions
  1. 2 18
      src/stores/kvs_st.erl
  2. 15 0
      test/st_test.exs

+ 2 - 18
src/stores/kvs_st.erl

@@ -29,24 +29,8 @@ prev(#reader{cache=I,feed=Feed}=C) -> read_it(C,move_it(key(Feed,I),key(Feed),pr
 
 % section: take, drop
 
-drop(#reader{args=N}) when N < 0 -> #reader{};
-drop(#reader{args=N}=C) when N == 0 -> C;
-drop(#reader{args=N,feed=Feed,cache=I}=C) when N > 0 ->
-   Key = key(Feed),
-   {ok, H} = rocksdb:iterator(ref(), []),
-   First = rocksdb:iterator_move(H, {seek,Key}),
-
-   Term  = lists:foldl(
-    fun (_,{{ok,K,_},{_,X}}) when N > X -> {K,{<<131,106>>,N}};
-        (_,{{ok,K,Bin},{A,X}}) when N =< X->
-           case binary:part(K,0,size(Key)) of
-                Key -> {rocksdb:iterator_move(H,next),{Bin,X+1}};
-                  _ -> {{error,range},{A,X}} end;
-        (_,{_,{_,_}}) -> {[],{<<131,106>>,N}}
-     end,
-           {First,{<<131,106>>,1}},
-           lists:seq(0,N)),
-   C#reader{cache=bt(element(1,element(2,Term)))}.
+drop(#reader{args=N}=C) when N =< 0 -> C;
+drop(#reader{args=N,feed=Feed,cache=I}=C) -> (take(C#reader{dir=0}))#reader{args=[]}.
 
 %  1. Курсор всегда выставлен на следущий невычитанный элемент
 %  2. Если после вычитки курсор указывает на недавно вычитаный элемент -- это признак конца списка

+ 15 - 0
test/st_test.exs

@@ -49,6 +49,21 @@ defmodule ST.Test do
         assert KVS.reader(feed: "/empty-feed", args: []) = :kvs.take(KVS.reader(rs1, args: 0, dir: 1))
     end
 
+    test "drop", kvs do
+        assert r = KVS.reader(id: rid, args: [], cache: c0) = :kvs.save(:kvs.reader(:feed))
+        assert r1 = KVS.reader(id: ^rid, feed: :feed, args: []) = :kvs.drop(KVS.reader(r,  args: 10, dir: 0))
+
+        kvs[:ids] |> Enum.map(&msg(id: &1)) 
+                  |> Enum.each(&assert(KVS.reader(id: rid, feed: :feed, args: [], cache: &1) = :kvs.save(:kvs.drop(KVS.reader(:kvs.load_reader(rid), args: 1, dir: 0)))))
+
+        assert r2 = KVS.reader(id: ^rid, feed: :feed, args: [], cache: c1) = :kvs.drop(KVS.reader(r, args: 1, dir: 0))
+        assert {:msg, Enum.at(kvs[:ids], 1)} == c1
+        assert r3 = KVS.reader(id: ^rid, feed: :feed, args: [], cache: c2) = :kvs.drop(KVS.reader(r2, args: 5, dir: 0))
+        assert {:msg, Enum.at(kvs[:ids], 6)} == c2
+        assert r4 = KVS.reader(id: ^rid, feed: :feed, args: [], cache: c3) = :kvs.drop(KVS.reader(r1, args: 100))
+        assert {:msg, Enum.at(kvs[:ids],9)} == c3
+    end
+
     defp log(x), do: IO.puts '#{inspect(x)}'
     defp log(m, x), do: IO.puts '#{m} #{inspect(x)}'