Commit f260dc7b authored by Przemyslaw Kaminski's avatar Przemyslaw Kaminski

[nodeStory] saver db implementation, does not compile yet

parent 5d2c5e8e
Pipeline #2972 failed with stage
in 30 minutes and 22 seconds
...@@ -410,6 +410,7 @@ library ...@@ -410,6 +410,7 @@ library
, jose , jose
, json-stream , json-stream
, lens , lens
, lifted-base
, listsafe , listsafe
, located-base , located-base
, logging-effect , logging-effect
......
...@@ -195,6 +195,7 @@ library: ...@@ -195,6 +195,7 @@ library:
- jose - jose
- json-stream - json-stream
- lens - lens
- lifted-base
- listsafe - listsafe
- located-base - located-base
- logging-effect - logging-effect
......
...@@ -4,15 +4,15 @@ ...@@ -4,15 +4,15 @@
module Gargantext.Database.NodeStory where module Gargantext.Database.NodeStory where
import Control.Arrow (returnA) import Control.Arrow (returnA)
import Control.Concurrent (MVar(), withMVar, newMVar, modifyMVar_) import Control.Concurrent.MVar.Lifted (MVar(), withMVar, newMVar, modifyMVar_)
import Control.Debounce (mkDebounce, defaultDebounceSettings, debounceFreq, debounceAction) --import Control.Debounce (mkDebounce, defaultDebounceSettings, debounceFreq, debounceAction)
import Control.Monad (foldM) import Control.Monad (foldM)
import qualified Data.Map.Strict as Map import qualified Data.Map.Strict as Map
import Data.Profunctor.Product.TH (makeAdaptorAndInstance) import Data.Profunctor.Product.TH (makeAdaptorAndInstance)
import Gargantext.API.Ngrams.Tools (getRepo) import Gargantext.API.Ngrams.Tools (getRepo)
import Gargantext.Core (HasDBid) import Gargantext.Core (HasDBid)
import Gargantext.Core.Mail.Types (HasMail) import Gargantext.Core.Mail.Types (HasMail)
import Gargantext.Core.NodeStory (Archive(..), NodeStory(..), NodeStoryEnv(..), NodeListStory, NgramsState', NgramsStatePatch') import Gargantext.Core.NodeStory (Archive(..), NodeStory(..), NodeListStory, NgramsState', NgramsStatePatch')
import qualified Gargantext.Core.NodeStory as NS import qualified Gargantext.Core.NodeStory as NS
import Gargantext.Core.Types (NodeId(..), NodeType(..)) import Gargantext.Core.Types (NodeId(..), NodeType(..))
import Gargantext.Database.Prelude (Cmd, mkCmd, runOpaQuery) import Gargantext.Database.Prelude (Cmd, mkCmd, runOpaQuery)
...@@ -131,33 +131,55 @@ migrateFromDir = do ...@@ -131,33 +131,55 @@ migrateFromDir = do
False -> pure 0 False -> pure 0
True -> upsertNodeArchive nId a True -> upsertNodeArchive nId a
) $ Map.toList nls ) $ Map.toList nls
_ <- nodeStoryIncs (Just $ NodeStory nls) listIds --_ <- nodeStoryIncs (Just $ NodeStory nls) listIds
pure () pure ()
------------------------------------ ------------------------------------
nodeStoryEnv :: IO NodeStoryEnv data NodeStoryEnv err = NodeStoryEnv
{ _nse_var :: !(MVar NodeListStory)
, _nse_saver :: !(Cmd err ())
, _nse_getter :: [NodeId] -> Cmd err (MVar NodeListStory)
--, _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)
}
--deriving (Generic)
nodeStoryEnv :: Cmd err (NodeStoryEnv err)
nodeStoryEnv = do nodeStoryEnv = do
mvar <- nodeStoryVar Nothing [] mvar <- nodeStoryVar Nothing []
saver <- mkNodeStorySaver mvar --saver <- mkNodeStorySaver mvar
let saver = mkNodeStorySaver mvar
-- let saver = modifyMVar_ mvar $ \mv' -> do
-- writeNodeStories mv'
-- return mv'
pure $ NodeStoryEnv { _nse_var = mvar pure $ NodeStoryEnv { _nse_var = mvar
, _nse_saver = saver , _nse_saver = saver
, _nse_getter = nodeStoryVar (Just mvar) } , _nse_getter = nodeStoryVar (Just mvar) }
nodeStoryVar :: Maybe (MVar NodeListStory) -> [NodeId] -> IO (MVar NodeListStory) nodeStoryVar :: Maybe (MVar NodeListStory) -> [NodeId] -> Cmd err (MVar NodeListStory)
nodeStoryVar Nothing nis = (liftBase $ nodeStoryIncs Nothing nis) >>= newMVar nodeStoryVar Nothing nIds = do
nodeStoryVar (Just mv) nis = do state <- nodeStoryIncs Nothing nIds
_ <- modifyMVar_ mv $ \mv' -> (liftBase $ nodeStoryIncs (Just mv') nis) newMVar state
nodeStoryVar (Just mv) nIds = do
_ <- modifyMVar_ mv $ \nsl -> (nodeStoryIncs (Just nsl) nIds)
pure mv pure mv
mkNodeStorySaver :: MVar NodeListStory -> IO (IO ()) -- TODO No debounce since this is IO stuff.
mkNodeStorySaver mvns = mkDebounce settings -- debounce is useful since it could delay the saving to some later
where -- time, asynchronously and we keep operating on memory only.
settings = defaultDebounceSettings mkNodeStorySaver :: MVar NodeListStory -> Cmd err ()
{ debounceAction = withMVar mvns (liftBase $ writeNodeStories) mkNodeStorySaver mvns = withMVar mvns writeNodeStories
, debounceFreq = 1 * minute
-- , debounceEdge = trailingEdge -- Trigger on the trailing edge -- mkNodeStorySaver :: MVar NodeListStory -> Cmd err (Cmd err ())
} -- mkNodeStorySaver mvns = mkDebounce settings
minute = 60 * second -- where
second = 10^(6 :: Int) -- settings = defaultDebounceSettings
-- { debounceAction = withMVar mvns (\ns -> writeNodeStories ns)
-- , debounceFreq = 1 * minute
-- -- , debounceEdge = trailingEdge -- Trigger on the trailing edge
-- }
-- minute = 60 * second
-- second = 10^(6 :: Int)
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