Browse Source

working reverse take (dir=1) for rocksdb

Namdak Tonpa 5 years ago
parent
commit
2f8f948916
6 changed files with 36 additions and 8 deletions
  1. 2 2
      config/config.exs
  2. 2 2
      mix.exs
  3. 1 1
      src/kvs.app.src
  4. 1 1
      src/stores/kvs_rocks.erl
  5. 16 2
      src/stores/kvs_st.erl
  6. 14 0
      test/test_helper.exs

+ 2 - 2
config/config.exs

@@ -1,6 +1,6 @@
 use Mix.Config
 
 config :kvs,
-  dba: :kvs_mnesia,
-  dba_st: :kvs_stream,
+  dba: :kvs_rocks,
+  dba_st: :kvs_st,
   schema: [:kvs, :kvs_stream]

+ 2 - 2
mix.exs

@@ -4,7 +4,7 @@ defmodule KVS.Mixfile do
   def project do
     [
       app: :kvs,
-      version: "6.12.1",
+      version: "6.12.2",
       description: "KVS Abstract Chain Database",
       package: package(),
       deps: deps()
@@ -26,7 +26,7 @@ defmodule KVS.Mixfile do
   defp deps do
     [
       {:ex_doc, "~> 0.11", only: :dev},
-#            {:rocksdb, "~> 1.3.2"}
+            {:rocksdb, "~> 1.3.2"}
     ]
   end
 end

+ 1 - 1
src/kvs.app.src

@@ -1,6 +1,6 @@
 {application, kvs,
    [{description, "KVS Abstract Chain Database"},
-    {vsn, "6.12.1"},
+    {vsn, "6.12.2"},
     {registered, []},
     {applications, [kernel,stdlib]},
     {mod, { kvs, []}},

+ 1 - 1
src/stores/kvs_rocks.erl

@@ -4,7 +4,7 @@
 -include("metainfo.hrl").
 -include_lib("stdlib/include/qlc.hrl").
 -export(?BACKEND).
--export([ref/0,next/8,format/1,bt/1]).
+-export([ref/0,next/8,prev/8,format/1,bt/1]).
 
 bt(X)      -> binary_to_term(X,[safe]).
 start()    -> ok.

+ 16 - 2
src/stores/kvs_st.erl

@@ -63,7 +63,7 @@ drop(#reader{args=N,feed=Feed,cache=I}=C) when N > 0 ->
            lists:seq(0,N)),
    C#reader{cache=bt(element(1,element(2,Term)))}.
 
-take(#reader{args=N,feed=Feed,cache={T,O}}=C) ->
+take(#reader{args=N,feed=Feed,cache={T,O},dir=0}=C) ->
    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)}),
@@ -71,7 +71,21 @@ take(#reader{args=N,feed=Feed,cache={T,O}}=C) ->
    case {Res,length(Res) < N + 1 orelse N == -1} of
         {[],_}    -> C#reader{args=[],cache=[]};
         {[H|X],false} -> C#reader{args=X,cache={e(1,H),e(2,H)}};
-        {[H|X],true} -> C#reader{args=Res,cache=[]} end.
+        {[H|X],true} -> C#reader{args=Res,cache={e(1,H),e(2,H)}} end;
+
+take(#reader{args=N,feed=Feed,cache={T,O},dir=1}=C) ->
+   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)}),
+   Res = kvs_rocks:prev(I,Key,size(Key),K,BERT,[],case N of -1 -> -1; J -> J + 1 end,0),
+   case {Res,length(Res) < N + 1 orelse N == -1} of
+        {[],_}    -> C#reader{args=[],cache=[]};
+        {[H|X],false} -> C#reader{args=X,cache={e(1,H),e(2,H)}};
+        {[H|X],true} -> C#reader{args=Res,cache={e(1,H),e(2,H)}} end;
+
+take(X) ->
+   io:format("ERROR: ~p~n",[X]),
+   X.
 
 % new, save, load, up, down, top, bot
 

+ 14 - 0
test/test_helper.exs

@@ -73,6 +73,20 @@ defmodule BPE.Test do
     assert KVS.reader(t, :args) == b
   end
 
+  test "take back" do
+    id = {:partial, :kvs.seq([], [])}
+    x = 5
+    :kvs.save(:kvs.writer(id))
+    :lists.map(fn _ -> :kvs.append({:"$msg", [], [], [], [], []}, id) end, :lists.seq(1, x))
+    r = :kvs.save(:kvs.reader(id))
+    t = :kvs.take(KVS.reader(:kvs.load_reader(KVS.reader(r, :id)), args: 5))
+    KVS.reader(id: tid) = :kvs.save(KVS.reader(t, dir: 1))
+    n = :kvs.take(KVS.reader(:kvs.load_reader(tid), args: 5, dir: 1))
+    b = :kvs.feed(id)
+    assert KVS.reader(t, :args) == b
+    assert KVS.reader(n, :args) == :lists.reverse(b)
+  end
+
   test "partial take" do
     id = {:partial, :kvs.seq([], [])}
     x = 5