Browse Source

entries with direction

Andrii Zadorozhnii 11 years ago
parent
commit
ab3058e6d9
2 changed files with 37 additions and 23 deletions
  1. 6 4
      include/feeds.hrl
  2. 31 19
      src/kvs.erl

+ 6 - 4
include/feeds.hrl

@@ -13,8 +13,8 @@
         shared,
         starred,
         deleted,
-        likes,
-        likes_count,
+%        likes,
+%        likes_count,
         media = [],
         etc,       %% field to link additional info
         type = {user, normal}}).
@@ -43,7 +43,8 @@
         parent}).
 
 -record(entry_views, {?CONTAINER}).
--record(user_view,   {?ITERATOR(entry_views), user}).
+-record(user_view,   {?ITERATOR(entry_views), user, created}).
+-record(like, {?ITERATOR(feed), user_id, entry_id, created}).
 
 -record(entry_likes, {
         entry_id,       % this is a general entry_id. Every same entry in different feeds has the same id
@@ -57,13 +58,14 @@
         total_count
         }).
 
+
 -record(one_like, {
         id,              % just a number
         user_id,        % who likes
         entry_id,       % what
         feed_id,        % where
         created_time,   % when
-        next            
+        next
         }).
 
 -record(hidden_feed, {id}).

+ 31 - 19
src/kvs.erl

@@ -80,21 +80,37 @@ remove(RecordName, RecordId) ->
 
 remove(E) when is_tuple(E) ->
     Id = element(#iterator.id, E),
+    error_logger:info_msg("================> REMOVE ~p", [Id]),
     CName = element(#iterator.container, E),
     Cid = element(#iterator.feed_id, E),
-
+    error_logger:info_msg(" container: ~p ~p", [CName, Cid]),
     {ok, Container} = kvs:get(CName, Cid),
     Top = element(#container.top, Container),
+    error_logger:info_msg("Container top:~p", [Top]),
 
     Next = element(#iterator.next, E),
     Prev = element(#iterator.prev, E),
-    case kvs:get(element(1,E), Next) of {ok, NE} -> NewNext = setelement(#iterator.prev, NE, Prev), kvs:put(NewNext); _ -> ok end,
-    case kvs:get(element(1,E), Prev) of {ok, PE} -> NewPrev = setelement(#iterator.next, PE, Next), kvs:put(NewPrev); _ -> ok end,
+    error_logger:info_msg("Prev: ~p Next: ~p", [Prev, Next]),
+
+    case kvs:get(element(1,E), Next) of {ok, NE} ->
+        NewNext = setelement(#iterator.prev, NE, Prev),
+        error_logger:info_msg("Next element prev field became ~p", [Prev]),
+        kvs:put(NewNext); _ -> ok end,
+    case kvs:get(element(1,E), Prev) of {ok, PE} -> 
+        NewPrev = setelement(#iterator.next, PE, Next),
+        error_logger:info_msg("Prev element next field became ~p", [Next]),
+        kvs:put(NewPrev); _ -> ok end,
+
+    C1 = case Top of Id ->
+        error_logger:info_msg("Update container top to~p", [Prev]),
+        setelement(#container.top, Container, Prev);
+    _ -> Container end,
 
-    C1 = case Top of Id -> setelement(#container.top, Container, Prev); _ -> Container end,
     C2 = setelement(#container.entries_count, C1, element(#container.entries_count, Container)-1),
+    error_logger:info_msg("Dec elemnt count ~p", [element(#container.entries_count, C2)]),
     kvs:put(C2),
-%    error_logger:info_msg("Remove record ~p", [E]),
+    
+    error_logger:info_msg("========================>Remove record ~p", [Id]),
     kvs:delete(E).
 %purge_feed(FeedId) ->
 %    {ok,Feed} = kvs:get(feed,FeedId),
@@ -104,25 +120,21 @@ remove(E) when is_tuple(E) ->
 %purge_unverified_feeds() ->
 %    [ [purge_feed(Fid)|| {_, Fid} <- Feeds ] || #user{feeds=Feeds, email=E} <- kvs:all(user), E==undefined].
 
-traversal( _,undefined,_) -> [];
-traversal(_,_,0) -> [];
-traversal(RecordType, Start, Count)->
+traversal( _,undefined,_,_) -> [];
+traversal(_,_,0,_) -> [];
+traversal(RecordType, Start, Count, Direction)->
     case kvs:get(RecordType, Start) of {error,_} -> [];
-    {ok, R} ->  Prev = element(#iterator.prev, R),
+    {ok, R} ->  Prev = element(Direction, R),
                 Count1 = case Count of C when is_integer(C) -> C - 1; _-> Count end,
-                [R | traversal(RecordType, Prev, Count1)] end.
+                [R | traversal(RecordType, Prev, Count1, Direction)] end.
 
-entries(Container, RecordType) -> entries(Container, RecordType, undefined).
 entries({ok, Container}, RecordType, Count) -> entries(Container, RecordType, Count);
+entries(Container, RecordType, Count) when is_tuple(Container) -> traversal(RecordType, element(#container.top, Container), Count, #iterator.prev);
+entries(_,_,_) -> error_logger:info_msg("=> ENTRIES ARGS NOT MATCH!"), [].
 
-entries({_, FeedId}, undefined, Count) -> entries(kvs:get(feed, FeedId), entry, Count);
-entries({_, FeedId}, StartFrom, Count) ->
-    case kvs:get(entry,{StartFrom, FeedId}) of {error,not_found}->[];
-    {ok, E} -> traversal(entry, element(#iterator.prev, E), Count) end;
-
-entries(Container, RecordType, Count) when is_tuple(Container)-> traversal(RecordType, element(#container.top, Container), Count);
-entries(_,_,_) -> [].
-entries(CName, Cid, RecordType, Count) -> case kvs:get(CName, Cid) of {ok, C}-> entries(C, RecordType, Count); {error, _} -> [] end.
+entries(RecordType, Start, Count, Direction) ->
+    E = traversal(RecordType, Start, Count, Direction),
+    case Direction of #iterator.next -> lists:reverse(E); #iterator.prev -> E end.
 
 init_db() ->
     case kvs:get(user,"joe") of