Просмотр исходного кода

Merge pull request #60 from synrc/dbl

remove feed formating
Namdak Tonpa 4 лет назад
Родитель
Сommit
4cd777a50b
5 измененных файлов с 63 добавлено и 58 удалено
  1. 14 10
      src/stores/kvs_rocks.erl
  2. 10 10
      src/stores/kvs_st.erl
  3. 23 21
      test/fd_test.exs
  4. 0 1
      test/sc_test.exs
  5. 16 16
      test/st_test.exs

+ 14 - 10
src/stores/kvs_rocks.erl

@@ -4,7 +4,7 @@
 -include("metainfo.hrl").
 -include_lib("stdlib/include/qlc.hrl").
 -export(?BACKEND).
--export([ref/0,bt/1,key/2,key/1,fd/1]).
+-export([ref/0,bt/1,key/2,key/1,fd/1, tb/1]).
 -export([seek_it/1, move_it/3, take_it/4]).
 
 e(X,Y)     -> element(X,Y).
@@ -22,16 +22,20 @@ fmt(K) -> tb(K).
 % put
 
 key(R)     when is_tuple(R) andalso tuple_size(R) > 1 -> key(e(1,R), e(2,R));
-key(R)     -> key(R,[]).
+key(R)                                                -> key(R,[]).
 key(Tab,R) when is_tuple(R) andalso tuple_size(R) > 1 -> key(Tab, e(2,R));
-key(Tab,R) -> iolist_to_binary([lists:join(<<"/">>, lists:flatten([<<>>, fmt(Tab), fmt(R)]))]).
-
-% get
-
-fd(Key) ->
-  B = lists:reverse(binary:split(tb(Key), [<<"/">>], [global])),
-  B1 = lists:reverse(case B of [] -> [];[X] -> [X];[_|T] -> T end),
-  iolist_to_binary(lists:join(<<"/">>, B1)).
+key(Tab,R) -> iolist_to_binary([lists:join(<<"/">>, lists:flatten([<<>>, tb(Tab), fmt(R)]))]).
+
+fd(K) -> Key = tb(K),
+  End = byte_size(Key),
+  {S,_} = case binary:matches(Key,[<<"/">>],[]) of
+    [{0,1}]         -> {End,End};
+    [{0,1},{1,1}]   -> {End,End};
+    [{0,1},{1,1}|T] -> hd(lists:reverse(T));
+    [{0,1}|T]       -> hd(lists:reverse(T));
+    _ -> {End,End}
+  end,
+  binary:part(Key,{0,S}).
 
 o(<<>>,FK,_,_) -> {ok,FK,[],[]};
 o(Key,FK,Dir,Fx) ->

+ 10 - 10
src/stores/kvs_st.erl

@@ -4,7 +4,7 @@
 -include("stream.hrl").
 -include("metainfo.hrl").
 -export(?STREAM).
--import(kvs_rocks, [key/2, key/1, bt/1, ref/0, fd/1, seek_it/1, move_it/3, take_it/4]).
+-import(kvs_rocks, [key/2, key/1, bt/1, tb/1, ref/0, fd/1, seek_it/1, move_it/3, take_it/4]).
 
 % section: kvs_stream prelude
 
@@ -14,23 +14,23 @@ c4(R,V) -> se(#reader.args,  R, V).
 si(M,T) -> se(#it.id, M, T).
 id(T) -> e(#it.id, T).
 
-k(F,[]) -> key(F);
-k(_,{_,Id,SF}) -> key(SF,Id).
+k(F,[]) -> F; 
+k(_,{_,Id,SF}) -> iolist_to_binary([SF,<<"/">>,tb(Id)]).  
 
 read_it(C,{ok,_,[],H}) -> C#reader{cache=[], args=lists:reverse(H)};
 read_it(C,{ok,F,V,H})  -> C#reader{cache={e(1,V),id(V),F}, args=lists:reverse(H)};
 read_it(C,_) -> C.
 
-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(Feed)).
 bot(#reader{feed=Feed}=C) -> #writer{cache=Ch, count=Cn} = writer(Feed), C#reader{cache=Ch, count=Cn}.
-next(#reader{feed=Feed,cache=I}=C) -> read_it(C,move_it(k(Feed,I),key(Feed),next)).
-prev(#reader{cache=I,feed=Feed}=C) -> read_it(C,move_it(k(Feed,I),key(Feed),prev)).
-take(#reader{args=N,feed=Feed,cache=I,dir=1}=C) -> read_it(C,take_it(k(Feed,I),key(Feed),prev,N));
-take(#reader{args=N,feed=Feed,cache=I,dir=_}=C) -> read_it(C,take_it(k(Feed,I),key(Feed),next,N)).
+next(#reader{feed=Feed,cache=I}=C) -> read_it(C,move_it(k(Feed,I),Feed,next)).
+prev(#reader{cache=I,feed=Feed}=C) -> read_it(C,move_it(k(Feed,I),Feed,prev)).
+take(#reader{args=N,feed=Feed,cache=I,dir=1}=C) -> read_it(C,take_it(k(Feed,I),Feed,prev,N));
+take(#reader{args=N,feed=Feed,cache=I,dir=_}=C) -> read_it(C,take_it(k(Feed,I),Feed,next,N)).
 drop(#reader{args=N}=C) when N =< 0 -> C;
 drop(#reader{}=C) -> (take(C#reader{dir=0}))#reader{args=[]}.
 
-feed(Feed) -> feed(fun(#reader{}=R) -> take(R#reader{args=4}) end, top(reader(key(Feed))),[]).
+feed(Feed) -> feed(fun(#reader{}=R) -> take(R#reader{args=4}) end, top(reader(Feed)),[]).
 feed(F,#reader{cache=C1}=R,Acc) ->
   #reader{args=A, cache=Ch, feed=Feed} = R1 = F(R),
   case Ch of
@@ -56,7 +56,7 @@ save(C) -> NC = c4(C,[]), kvs:put(NC), NC.
 add(#writer{args=M}=C) when element(2,M) == [] -> add(si(M,kvs:seq([],[])),C);
 add(#writer{args=M}=C) -> add(M,C).
 
-add(M,#writer{id=Feed,count=S}=C) -> NS=S+1, raw_append(M,Feed), C#writer{cache={e(1,M),e(2,M),key(Feed)},count=NS}.
+add(M,#writer{id=Feed,count=S}=C) -> NS=S+1, raw_append(M,Feed), C#writer{cache={e(1,M),e(2,M),fd(Feed)},count=NS}.
 
 remove(Rec,Feed) ->
    kvs:ensure(#writer{id=Feed}),

+ 23 - 21
test/fd_test.exs

@@ -27,12 +27,12 @@ defmodule Fd.Test do
         ltop = Enum.at(kvs[:id1],0)
         dtop = Enum.at(kvs[:id0],0)
         ttop = Enum.at(kvs[:id2],0)
-        assert KVS.reader(feed: "/crm/luck", count: 10, dir: 0, args: [], cache: {:msg, ^ltop, "/crm/luck"}) = :kvs.reader("/crm/luck")
-        assert KVS.reader(feed: "/crm/duck", count: 10, dir: 0, args: [], cache: {:msg, ^dtop, "/crm/duck"}) = :kvs.reader("/crm/duck")
-        assert KVS.reader(feed: "/crm/truck", count: 10, dir: 0, args: [], cache: {:msg, ^ttop, "/crm/truck"}) = :kvs.reader("/crm/truck")
-        assert KVS.reader(feed: "/crm", count: 0, dir: 0, args: [], cache: {:msg, ^dtop, "/crm/duck"}) = :kvs.reader("/crm")
-        assert KVS.reader(feed: "/noroute", count: 0, dir: 0, args: []) = :kvs.reader("/noroute")
-        assert KVS.reader(feed: "/", count: 0, dir: 0, args: [], cache: {:msg, ^dtop, "/crm/duck"}) = :kvs.reader("/")
+        assert KVS.reader(feed: "//crm/luck", count: 10, dir: 0, args: [], cache: {:msg, ^ltop, "//crm/luck"}) = :kvs.reader("/crm/luck")
+        assert KVS.reader(feed: "//crm/duck", count: 10, dir: 0, args: [], cache: {:msg, ^dtop, "//crm/duck"}) = :kvs.reader("/crm/duck")
+        assert KVS.reader(feed: "//crm/truck", count: 10, dir: 0, args: [], cache: {:msg, ^ttop, "//crm/truck"}) = :kvs.reader("/crm/truck")
+        assert KVS.reader(feed: "//crm", count: 0, dir: 0, args: [], cache: {:msg, ^dtop, "//crm/duck"}) = :kvs.reader("/crm")
+        assert KVS.reader(feed: "//noroute", count: 0, dir: 0, args: []) = :kvs.reader("/noroute")
+        assert KVS.reader(feed: "//", count: 0, dir: 0, args: [], cache: {:msg, ^dtop, "//crm/duck"}) = :kvs.reader("/")
         assert KVS.reader(feed: "", count: 0, dir: 0, args: [], cache: []) = :kvs.reader([])
     end
 
@@ -41,31 +41,33 @@ defmodule Fd.Test do
         dtop = Enum.at(kvs[:id0],0)
         lbot = Enum.at(kvs[:id1],9)
 
-        assert KVS.reader(feed: "/crm/luck", count: 10, dir: 0, args: [], cache: {:msg, ^ltop, "/crm/luck"}) = :kvs.top(:kvs.reader("/crm/luck"))
-        assert KVS.reader(feed: "/crm", count: 0, dir: 0, args: [], cache: {:msg, ^dtop, "/crm/duck"}) = :kvs.top(:kvs.reader("/crm"))
-        assert KVS.reader(feed: "/", count: 0, dir: 0, args: [], cache: {:msg, ^dtop, "/crm/duck"}) = :kvs.top(:kvs.reader("/"))
+        assert KVS.reader(feed: "//crm/luck", count: 10, dir: 0, args: [], cache: {:msg, ^ltop, "//crm/luck"}) = :kvs.top(:kvs.reader("/crm/luck"))
+        assert KVS.reader(feed: "//crm", count: 0, dir: 0, args: [], cache: {:msg, ^dtop, "//crm/duck"}) = :kvs.top(:kvs.reader("/crm"))
+        assert KVS.reader(feed: "//", count: 0, dir: 0, args: [], cache: {:msg, ^dtop, "//crm/duck"}) = :kvs.top(:kvs.reader("/"))
 
-        assert KVS.reader(feed: "/crm/luck", count: 10, dir: 0, args: [], cache: {:msg, ^lbot, "/crm/luck"}) = :kvs.bot(:kvs.reader("/crm/luck"))
-        assert KVS.reader(feed: "/crm", count: 0, dir: 0, args: [], cache: []) = :kvs.bot(:kvs.reader("/crm"))
-        assert KVS.reader(feed: "/", count: 0, dir: 0, args: [], cache: []) = :kvs.bot(:kvs.reader("/"))
+        assert KVS.reader(feed: "//crm/luck", count: 10, dir: 0, args: [], cache: {:msg, ^lbot, "//crm/luck"}) = :kvs.bot(:kvs.reader("/crm/luck"))
+        assert KVS.reader(feed: "//crm", count: 0, dir: 0, args: [], cache: []) = :kvs.bot(:kvs.reader("/crm"))
+        assert KVS.reader(feed: "//", count: 0, dir: 0, args: [], cache: []) = :kvs.bot(:kvs.reader("/"))
     end
 
     test "next", kvs do
         last = msg(id: Enum.at(kvs[:id1],9))
-        KVS.reader(id: rid) = :kvs.save(:kvs.top(:kvs.reader("/crm/luck")))
+        r0 = KVS.reader(id: rid) = :kvs.save(:kvs.top(:kvs.reader("/crm/luck")))
         kvs[:id1] |> Enum.with_index 
                   |> Enum.each(fn {id,9} ->
                 r = :kvs.load_reader(rid)
-                assert r1 = KVS.reader(feed: "/crm/luck", cache: c1, count: 10, dir: 0, args: [^last]) = :kvs.next(r)
-                assert KVS.reader(args: [], feed: "/crm/luck", cache: c1) = :kvs.save(r1)
+                r01 = :kvs.next(r)
+                assert r1 = KVS.reader(feed: "//crm/luck", cache: c1, count: 10, dir: 0, args: [^last]) = r01
+                assert KVS.reader(args: [], feed: "//crm/luck", cache: c1) = :kvs.save(r1)
             {id,i} -> 
                 v = msg(id: Enum.at(kvs[:id1],i))
                 c = Enum.at(kvs[:id1],i+1)
                 r = :kvs.load_reader(rid)
-                assert r1 = KVS.reader(feed: "/crm/luck", cache: {:msg,^c,"/crm/luck"}, count: 10, dir: 0, args: [^v]) = :kvs.next(r)
-                assert KVS.reader(args: [], feed: "/crm/luck", cache: {:msg,^c,"/crm/luck"}) = :kvs.save(r1)
+                assert r1 = KVS.reader(feed: "//crm/luck", cache: {:msg,^c,"//crm/luck"}, count: 10, dir: 0, args: [^v]) = :kvs.next(r)
+                assert KVS.reader(args: [], feed: "//crm/luck", cache: {:msg,^c,"//crm/luck"}) = :kvs.save(r1)
             end)
         r = :kvs.load_reader(rid)
+
         assert r == :kvs.next(r)
         assert r == KVS.reader(:kvs.next(:kvs.bot(r)), args: [])
     end
@@ -78,14 +80,14 @@ defmodule Fd.Test do
             |> Enum.each(fn {id,9} ->
                 r = :kvs.load_reader(rid)
                 v = msg(id: Enum.at(ids, 9))
-                assert r1 = KVS.reader(feed: "/crm/luck", cache: {:msg, ^out, "/crm/duck"}, count: 10, args: [^v]) = :kvs.prev(r)
-                assert KVS.reader(args: [], feed: "/crm/luck", cache: c1) = :kvs.save(r1)
+                assert r1 = KVS.reader(feed: "//crm/luck", cache: {:msg, ^out, "//crm/duck"}, count: 10, args: [^v]) = :kvs.prev(r)
+                assert KVS.reader(args: [], feed: "//crm/luck", cache: c1) = :kvs.save(r1)
             {id,i} ->
                 r = :kvs.load_reader(rid)
                 v = msg(id: Enum.at(ids, i))
                 c = Enum.at(ids, i+1)
-                assert r1 = KVS.reader(feed: "/crm/luck", cache: {:msg, ^c, "/crm/luck"}, count: 10, args: [^v]) = :kvs.prev(r)
-                assert KVS.reader(args: [], feed: "/crm/luck", cache: {:msg, ^c, "/crm/luck"}) = :kvs.save(r1)
+                assert r1 = KVS.reader(feed: "//crm/luck", cache: {:msg, ^c, "//crm/luck"}, count: 10, args: [^v]) = :kvs.prev(r)
+                assert KVS.reader(args: [], feed: "//crm/luck", cache: {:msg, ^c, "//crm/luck"}) = :kvs.save(r1)
             end)
         r = :kvs.load_reader(rid)
         assert r = :kvs.prev(r)

+ 0 - 1
test/sc_test.exs

@@ -45,7 +45,6 @@ defmodule Sc.Test do
     end
 
     test "partial take back" do
-        log "all",:kvs.all("/crm/luck")
         KVS.reader(id: rid) = :kvs.save(:kvs.reader("/crm/luck"))
         r = KVS.reader(args: t) = :kvs.take(KVS.reader(:kvs.load_reader(rid), args: 2))
         :kvs.save(KVS.reader(r, dir: 1))

+ 16 - 16
test/st_test.exs

@@ -16,25 +16,25 @@ defmodule St.Test do
 
     test "take-ø", kvs do
         r = KVS.reader() = :kvs.reader("/empty-feed")
-        assert r1 = KVS.reader(feed: "/empty-feed", args: []) = :kvs.take(KVS.reader(r, args: 1))
-        assert r1 = KVS.reader(feed: "/empty-feed", args: []) = :kvs.take(KVS.reader(r, args: 1, dir: 1))
-        assert r2 = KVS.reader(feed: "/empty-feed", args: []) = :kvs.next(r)
-        assert r3 = KVS.reader(feed: "/empty-feed", args: []) = :kvs.prev(r)
-        assert r1 = KVS.reader(feed: "/empty-feed", args: []) = :kvs.take(KVS.reader(r, args: 100))
-        assert r1 = KVS.reader(feed: "/empty-feed", args: []) = :kvs.take(KVS.reader(r, args: 100, dir: 1))
+        assert r1 = KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(r, args: 1))
+        assert r1 = KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(r, args: 1, dir: 1))
+        assert r2 = KVS.reader(feed: "//empty-feed", args: []) = :kvs.next(r)
+        assert r3 = KVS.reader(feed: "//empty-feed", args: []) = :kvs.prev(r)
+        assert r1 = KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(r, args: 100))
+        assert r1 = KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(r, args: 100, dir: 1))
         KVS.reader(id: rid) = :kvs.save(r1)
         assert rs1 = KVS.reader(id: rid) = :kvs.load_reader(rid)
-        assert KVS.reader(feed: "/empty-feed", args: []) = :kvs.take(KVS.reader(rs1, args: 5))
-        assert KVS.reader(feed: "/empty-feed", args: []) = :kvs.take(KVS.reader(rs1, args: 5, dir: 1))
-        assert KVS.reader(feed: "/empty-feed", args: []) = :kvs.next(rs1)
-        assert KVS.reader(feed: "/empty-feed", args: []) = :kvs.prev(rs1)
-        assert KVS.reader(feed: "/empty-feed", args: []) = :kvs.take(KVS.reader(rs1, args: 0))
-        assert KVS.reader(feed: "/empty-feed", args: []) = :kvs.take(KVS.reader(rs1, args: 0, dir: 1))
+        assert KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(rs1, args: 5))
+        assert KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(rs1, args: 5, dir: 1))
+        assert KVS.reader(feed: "//empty-feed", args: []) = :kvs.next(rs1)
+        assert KVS.reader(feed: "//empty-feed", args: []) = :kvs.prev(rs1)
+        assert KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(rs1, args: 0))
+        assert KVS.reader(feed: "//empty-feed", args: []) = :kvs.take(KVS.reader(rs1, args: 0, dir: 1))
     end
 
     test "take-0", kvs do
-        feed = "/crm/personal/Реєстратор А1/in/doc"
-        assert r = KVS.reader(id: rid, args: []) = :kvs.reader(feed)
+        feed = "//crm/personal/Реєстратор А1/in/doc"
+        assert r = KVS.reader(id: rid, args: []) = :kvs.reader("/crm/personal/Реєстратор А1/in/doc")
 
         assert KVS.reader(id: ^rid, feed: ^feed, args: []) = :kvs.take(KVS.reader(r, args: 0, dir: 0))
         assert KVS.reader(id: ^rid, feed: ^feed, args: []) = :kvs.take(KVS.reader(r, args: -1, dir: 0))
@@ -57,12 +57,12 @@ defmodule St.Test do
     end
 
     test "take-1", kvs do
-        feed = "/crm/personal/Реєстратор А1/in/mail"
+        feed = "//crm/personal/Реєстратор А1/in/mail"
         top = Enum.at(kvs[:id1],0)
         bot = Enum.at(kvs[:id1],9)
         tpm = Enum.take(kvs[:id1],1) |> Enum.map(&msg(id: &1))
 
-        assert r = KVS.reader(id: rid, args: [], cache: {:msg, ^top, ^feed}, count: 10) = :kvs.reader(feed)
+        assert r = KVS.reader(id: rid, args: [], cache: {:msg, ^top, ^feed}, count: 10) = :kvs.reader("/crm/personal/Реєстратор А1/in/mail")
         assert r = :kvs.top(r)
         assert KVS.reader(id: ^rid, feed: ^feed, args: ^tpm, dir: 1) = :kvs.take(KVS.reader(r, args: 1, dir: 1))
         assert KVS.reader(id: ^rid, feed: ^feed, args: ^tpm, dir: 1) = :kvs.take(KVS.reader(r, args: 100, dir: 1))