Commit f05e7b07 authored by Alexandre Delanoë's avatar Alexandre Delanoë

[FIX] list heritage (into NodeStory)

parent 6019e088
Pipeline #1749 passed with stage
in 31 minutes and 42 seconds
...@@ -249,7 +249,7 @@ setListNgrams :: HasNodeStory env err m ...@@ -249,7 +249,7 @@ setListNgrams :: HasNodeStory env err m
setListNgrams listId ngramsType ns = do setListNgrams listId ngramsType ns = do
printDebug "[setListNgrams]" (listId, ngramsType) printDebug "[setListNgrams]" (listId, ngramsType)
getter <- view hasNodeStory getter <- view hasNodeStory
var <- liftBase $ (getter ^. nse_getter) listId var <- liftBase $ (getter ^. nse_getter) [listId]
liftBase $ modifyMVar_ var $ liftBase $ modifyMVar_ var $
pure . ( unNodeStory pure . ( unNodeStory
. at listId . _Just . at listId . _Just
...@@ -286,7 +286,7 @@ commitStatePatch :: HasNodeStory env err m ...@@ -286,7 +286,7 @@ commitStatePatch :: HasNodeStory env err m
-> m (Versioned NgramsStatePatch') -> m (Versioned NgramsStatePatch')
commitStatePatch listId (Versioned p_version p) = do commitStatePatch listId (Versioned p_version p) = do
printDebug "[commitStatePatch]" listId printDebug "[commitStatePatch]" listId
var <- getRepoVar listId var <- getRepoVar [listId]
vq' <- liftBase $ modifyMVar var $ \ns -> do vq' <- liftBase $ modifyMVar var $ \ns -> do
let let
a = ns ^. unNodeStory . at listId . _Just a = ns ^. unNodeStory . at listId . _Just
...@@ -328,7 +328,7 @@ tableNgramsPull :: HasNodeStory env err m ...@@ -328,7 +328,7 @@ tableNgramsPull :: HasNodeStory env err m
-> m (Versioned NgramsTablePatch) -> m (Versioned NgramsTablePatch)
tableNgramsPull listId ngramsType p_version = do tableNgramsPull listId ngramsType p_version = do
printDebug "[tableNgramsPull]" (listId, ngramsType) printDebug "[tableNgramsPull]" (listId, ngramsType)
var <- getRepoVar listId var <- getRepoVar [listId]
r <- liftBase $ readMVar var r <- liftBase $ readMVar var
let let
...@@ -467,7 +467,7 @@ getNgramsTableMap :: HasNodeStory env err m ...@@ -467,7 +467,7 @@ getNgramsTableMap :: HasNodeStory env err m
-> TableNgrams.NgramsType -> TableNgrams.NgramsType
-> m (Versioned NgramsTableMap) -> m (Versioned NgramsTableMap)
getNgramsTableMap nodeId ngramsType = do getNgramsTableMap nodeId ngramsType = do
v <- getRepoVar nodeId v <- getRepoVar [nodeId]
repo <- liftBase $ readMVar v repo <- liftBase $ readMVar v
pure $ Versioned (repo ^. unNodeStory . at nodeId . _Just . a_version) pure $ Versioned (repo ^. unNodeStory . at nodeId . _Just . a_version)
(repo ^. unNodeStory . at nodeId . _Just . a_state . at ngramsType . _Just) (repo ^. unNodeStory . at nodeId . _Just . a_state . at ngramsType . _Just)
......
...@@ -28,7 +28,6 @@ import Gargantext.Prelude ...@@ -28,7 +28,6 @@ import Gargantext.Prelude
import qualified Data.HashMap.Strict as HM import qualified Data.HashMap.Strict as HM
import qualified Data.Map.Strict as Map import qualified Data.Map.Strict as Map
import qualified Data.Set as Set import qualified Data.Set as Set
import qualified Data.List as List
import Gargantext.Core.NodeStory import Gargantext.Core.NodeStory
mergeNgramsElement :: NgramsRepoElement -> NgramsRepoElement -> NgramsRepoElement mergeNgramsElement :: NgramsRepoElement -> NgramsRepoElement -> NgramsRepoElement
...@@ -46,43 +45,32 @@ getRepo = do ...@@ -46,43 +45,32 @@ getRepo = do
getRepo' :: HasNodeStory env err m getRepo' :: HasNodeStory env err m
=> [ListId] -> m NodeListStory => [ListId] -> m NodeListStory
getRepo' listIds = do getRepo' listIds = do
maybeNodeListStory <- head <$> List.reverse <$> mapM getNodeListStory'' listIds f <- getNodeListStory
case maybeNodeListStory of v <- liftBase $ f listIds
Nothing -> panic "[G.A.N.Tools.getRepo']" v' <- liftBase $ readMVar v
Just nls -> pure nls pure $ v'
getRepoVar :: HasNodeStory env err m getRepoVar :: HasNodeStory env err m
=> ListId -> m (MVar NodeListStory) => [ListId] -> m (MVar NodeListStory)
getRepoVar l = do getRepoVar l = do
f <- getNodeListStory f <- getNodeListStory
v <- liftBase $ f l v <- liftBase $ f l
pure v pure v
getNodeListStory :: HasNodeStory env err m getNodeListStory :: HasNodeStory env err m
=> m (NodeId -> IO (MVar NodeListStory)) => m ([NodeId] -> IO (MVar NodeListStory))
getNodeListStory = do getNodeListStory = do
env <- view hasNodeStory env <- view hasNodeStory
pure $ view nse_getter env pure $ view nse_getter env
getNodeListStory' :: HasNodeStory env err m
=> NodeId -> m (IO NodeListStory)
getNodeListStory' n = do
f <- getNodeListStory
v <- liftBase $ f n
pure $ readMVar v
getNodeListStory'' :: HasNodeStory env err m
=> NodeId -> m NodeListStory
getNodeListStory'' n = do
f <- getNodeListStory
v <- liftBase $ f n
v' <- liftBase $ readMVar v
pure $ v'
listNgramsFromRepo :: [ListId] -> NgramsType listNgramsFromRepo :: [ListId]
-> NodeListStory -> HashMap NgramsTerm NgramsRepoElement -> NgramsType
-> NodeListStory
-> HashMap NgramsTerm NgramsRepoElement
listNgramsFromRepo nodeIds ngramsType repo = listNgramsFromRepo nodeIds ngramsType repo =
HM.fromList $ Map.toList HM.fromList $ Map.toList
$ Map.unionsWith mergeNgramsElement ngrams $ Map.unionsWith mergeNgramsElement ngrams
......
...@@ -7,6 +7,10 @@ Maintainer : team@gargantext.org ...@@ -7,6 +7,10 @@ Maintainer : team@gargantext.org
Stability : experimental Stability : experimental
Portability : POSIX Portability : POSIX
TODO:
- remove
- filter
- charger les listes
-} -}
{-# OPTIONS_GHC -fno-warn-orphans #-} {-# OPTIONS_GHC -fno-warn-orphans #-}
...@@ -35,7 +39,7 @@ import Gargantext.Core.Utils.Prefix (unPrefix) ...@@ -35,7 +39,7 @@ import Gargantext.Core.Utils.Prefix (unPrefix)
import Gargantext.Database.Prelude (CmdM', HasConnectionPool, HasConfig) import Gargantext.Database.Prelude (CmdM', HasConnectionPool, HasConfig)
import Gargantext.Database.Query.Table.Node.Error (HasNodeError()) import Gargantext.Database.Query.Table.Node.Error (HasNodeError())
import Gargantext.Prelude import Gargantext.Prelude
import System.Directory (renameFile, createDirectoryIfMissing, doesFileExist) import System.Directory (renameFile, createDirectoryIfMissing, doesFileExist, removeFile)
import System.IO (FilePath, hClose) import System.IO (FilePath, hClose)
import System.IO.Temp (withTempFile) import System.IO.Temp (withTempFile)
import qualified Data.ByteString.Lazy as DBL import qualified Data.ByteString.Lazy as DBL
...@@ -48,7 +52,7 @@ import qualified Gargantext.Database.Query.Table.Ngrams as TableNgrams ...@@ -48,7 +52,7 @@ import qualified Gargantext.Database.Query.Table.Ngrams as TableNgrams
data NodeStoryEnv = NodeStoryEnv data NodeStoryEnv = NodeStoryEnv
{ _nse_var :: !(MVar NodeListStory) { _nse_var :: !(MVar NodeListStory)
, _nse_saver :: !(IO ()) , _nse_saver :: !(IO ())
, _nse_getter :: NodeId -> IO (MVar NodeListStory) , _nse_getter :: [NodeId] -> IO (MVar NodeListStory)
--, _nse_cleaner :: !(IO ()) -- every 12 hours: cleans the repos of unused NodeStories --, _nse_cleaner :: !(IO ()) -- every 12 hours: cleans the repos of unused NodeStories
-- , _nse_lock :: !FileLock -- TODO (it depends on the option: if with database or file only) -- , _nse_lock :: !FileLock -- TODO (it depends on the option: if with database or file only)
} }
...@@ -68,7 +72,7 @@ class (HasNodeStoryVar env, HasNodeStorySaver env) ...@@ -68,7 +72,7 @@ class (HasNodeStoryVar env, HasNodeStorySaver env)
hasNodeStory :: Getter env NodeStoryEnv hasNodeStory :: Getter env NodeStoryEnv
class HasNodeStoryVar env where class HasNodeStoryVar env where
hasNodeStoryVar :: Getter env (NodeId -> IO (MVar NodeListStory)) hasNodeStoryVar :: Getter env ([NodeId] -> IO (MVar NodeListStory))
class HasNodeStorySaver env where class HasNodeStorySaver env where
hasNodeStorySaver :: Getter env (IO ()) hasNodeStorySaver :: Getter env (IO ())
...@@ -76,7 +80,7 @@ class HasNodeStorySaver env where ...@@ -76,7 +80,7 @@ class HasNodeStorySaver env where
------------------------------------------------------------------------ ------------------------------------------------------------------------
readNodeStoryEnv :: NodeStoryDir -> IO NodeStoryEnv readNodeStoryEnv :: NodeStoryDir -> IO NodeStoryEnv
readNodeStoryEnv nsd = do readNodeStoryEnv nsd = do
mvar <- nodeStoryVar nsd Nothing 0 mvar <- nodeStoryVar nsd Nothing [0]
saver <- mkNodeStorySaver nsd mvar saver <- mkNodeStorySaver nsd mvar
pure $ NodeStoryEnv mvar saver (nodeStoryVar nsd (Just mvar)) pure $ NodeStoryEnv mvar saver (nodeStoryVar nsd (Just mvar))
...@@ -94,11 +98,11 @@ mkNodeStorySaver nsd mvns = mkDebounce settings ...@@ -94,11 +98,11 @@ mkNodeStorySaver nsd mvns = mkDebounce settings
nodeStoryVar :: NodeStoryDir nodeStoryVar :: NodeStoryDir
-> Maybe (MVar NodeListStory) -> Maybe (MVar NodeListStory)
-> NodeId -> [NodeId]
-> IO (MVar NodeListStory) -> IO (MVar NodeListStory)
nodeStoryVar nsd Nothing ni = nodeStoryInc nsd Nothing ni >>= newMVar nodeStoryVar nsd Nothing ni = nodeStoryIncs nsd Nothing ni >>= newMVar
nodeStoryVar nsd (Just mv) ni = do nodeStoryVar nsd (Just mv) ni = do
_ <- modifyMVar_ mv $ \mv' -> (nodeStoryInc nsd (Just mv') ni) _ <- modifyMVar_ mv $ \mv' -> (nodeStoryIncs nsd (Just mv') ni)
pure mv pure mv
...@@ -112,6 +116,32 @@ nodeStoryInc nsd (Just ns@(NodeStory nls)) ni = do ...@@ -112,6 +116,32 @@ nodeStoryInc nsd (Just ns@(NodeStory nls)) ni = do
nodeStoryInc nsd Nothing ni = nodeStoryRead nsd ni nodeStoryInc nsd Nothing ni = nodeStoryRead nsd ni
nodeStoryIncs :: NodeStoryDir
-> Maybe NodeListStory
-> [NodeId]
-> IO NodeListStory
nodeStoryIncs _ Nothing [] = panic "nodeStoryIncs: Empty"
nodeStoryIncs nsd (Just nls) ns = foldM (\m n -> nodeStoryInc nsd (Just m) n) nls ns
nodeStoryIncs nsd Nothing (ni:ns) = do
m <- nodeStoryRead nsd ni
nodeStoryIncs nsd (Just m) ns
nodeStoryDec :: NodeStoryDir
-> NodeListStory
-> NodeId
-> IO NodeListStory
nodeStoryDec nsd ns@(NodeStory nls) ni = do
case Map.lookup ni nls of
Nothing -> do
-- we make sure the corresponding file repo is really removed
_ <- nodeStoryRemove nsd ni
pure ns
Just _ -> do
let ns' = Map.filterWithKey (\k _v -> k /= ni) nls
_ <- nodeStoryRemove nsd ni
pure $ NodeStory ns'
-- | TODO lock -- | TODO lock
nodeStoryRead :: NodeStoryDir -> NodeId -> IO NodeListStory nodeStoryRead :: NodeStoryDir -> NodeId -> IO NodeListStory
nodeStoryRead nsd ni = do nodeStoryRead nsd ni = do
...@@ -122,6 +152,16 @@ nodeStoryRead nsd ni = do ...@@ -122,6 +152,16 @@ nodeStoryRead nsd ni = do
then deserialise <$> DBL.readFile nsp then deserialise <$> DBL.readFile nsp
else pure (initNodeStory ni) else pure (initNodeStory ni)
nodeStoryRemove :: NodeStoryDir -> NodeId -> IO ()
nodeStoryRemove nsd ni = do
let nsp = nodeStoryPath nsd ni
exists <- doesFileExist nsp
if exists
then removeFile nsp
else pure ()
nodeStoryRead_test :: NodeStoryDir -> NodeId -> IO (Maybe [ TableNgrams.NgramsType ]) nodeStoryRead_test :: NodeStoryDir -> NodeId -> IO (Maybe [ TableNgrams.NgramsType ])
nodeStoryRead_test nsd ni = nodeStoryRead nsd ni >>= \n -> pure nodeStoryRead_test nsd ni = nodeStoryRead nsd ni >>= \n -> pure
$ fmap Map.keys $ fmap Map.keys
......
...@@ -178,7 +178,7 @@ putListNgrams' listId ngramsType ns = do ...@@ -178,7 +178,7 @@ putListNgrams' listId ngramsType ns = do
-- The modifyMVar_ would test the patch with applicable first. -- The modifyMVar_ would test the patch with applicable first.
-- If valid the rest would be atomic and no merge is required. -- If valid the rest would be atomic and no merge is required.
-} -}
var <- getRepoVar listId var <- getRepoVar [listId]
liftBase $ modifyMVar_ var $ \r -> do liftBase $ modifyMVar_ var $ \r -> do
pure $ r & unNodeStory . at listId . _Just . a_version +~ 1 pure $ r & unNodeStory . at listId . _Just . a_version +~ 1
& unNodeStory . at listId . _Just . a_history %~ (p :) & unNodeStory . at listId . _Just . a_history %~ (p :)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment