Commit 45d49b0f authored by Alexandre Delanoë's avatar Alexandre Delanoë

[FIX] Monads dependencies, flowSocialList integration to flow (WIP)

parent 1690d344
...@@ -131,6 +131,7 @@ import Gargantext.Database.Admin.Types.Node (NodeType(..)) ...@@ -131,6 +131,7 @@ import Gargantext.Database.Admin.Types.Node (NodeType(..))
import Gargantext.Database.Prelude (HasConnectionPool, HasConfig) import Gargantext.Database.Prelude (HasConnectionPool, HasConfig)
import qualified Gargantext.Database.Query.Table.Ngrams as TableNgrams import qualified Gargantext.Database.Query.Table.Ngrams as TableNgrams
import Gargantext.Database.Query.Table.Node (getNode) import Gargantext.Database.Query.Table.Node (getNode)
import Gargantext.Database.Query.Tree.Error (HasTreeError)
import Gargantext.Database.Schema.Node (node_id, node_parentId, node_userId) import Gargantext.Database.Schema.Node (node_id, node_parentId, node_userId)
{- {-
...@@ -318,12 +319,14 @@ tableNgramsPull listId ngramsType p_version = do ...@@ -318,12 +319,14 @@ tableNgramsPull listId ngramsType p_version = do
-- Apply the given patch to the DB and returns the patch to be applied on the -- Apply the given patch to the DB and returns the patch to be applied on the
-- client. -- client.
-- TODO-ACCESS check -- TODO-ACCESS check
tableNgramsPut :: (HasNodeError err, tableNgramsPut :: ( HasNodeError err
HasInvalidError err, , HasTreeError err
HasConfig env, , HasInvalidError err
HasConnectionPool env, , HasConfig env
HasSettings env, , HasConnectionPool env
RepoCmdM env err m) , HasSettings env
, RepoCmdM env err m
)
=> TabType => TabType
-> ListId -> ListId
-> Versioned NgramsTablePatch -> Versioned NgramsTablePatch
...@@ -668,9 +671,10 @@ getTableNgramsDoc dId tabType listId limit_ offset listType minSize maxSize orde ...@@ -668,9 +671,10 @@ getTableNgramsDoc dId tabType listId limit_ offset listType minSize maxSize orde
apiNgramsTableCorpus :: ( RepoCmdM env err m apiNgramsTableCorpus :: ( RepoCmdM env err m
, HasNodeError err , HasNodeError err
, HasInvalidError err , HasTreeError err
, HasInvalidError err
, HasConnectionPool env , HasConnectionPool env
, HasConfig env , HasConfig env
, HasSettings env , HasSettings env
...@@ -681,9 +685,10 @@ apiNgramsTableCorpus cId = getTableNgramsCorpus cId ...@@ -681,9 +685,10 @@ apiNgramsTableCorpus cId = getTableNgramsCorpus cId
:<|> scoresRecomputeTableNgrams cId :<|> scoresRecomputeTableNgrams cId
:<|> getTableNgramsVersion cId :<|> getTableNgramsVersion cId
apiNgramsTableDoc :: ( RepoCmdM env err m apiNgramsTableDoc :: ( RepoCmdM env err m
, HasNodeError err , HasNodeError err
, HasInvalidError err , HasTreeError err
, HasInvalidError err
, HasConnectionPool env , HasConnectionPool env
, HasConfig env , HasConfig env
, HasSettings env , HasSettings env
......
...@@ -14,6 +14,7 @@ Portability : POSIX ...@@ -14,6 +14,7 @@ Portability : POSIX
module Gargantext.Core.Text.List module Gargantext.Core.Text.List
where where
import Control.Lens (makeLenses) import Control.Lens (makeLenses)
import Data.Maybe (fromMaybe, catMaybes) import Data.Maybe (fromMaybe, catMaybes)
import Data.Ord (Down(..)) import Data.Ord (Down(..))
...@@ -26,23 +27,25 @@ import qualified Data.Map as Map ...@@ -26,23 +27,25 @@ import qualified Data.Map as Map
import qualified Data.Set as Set import qualified Data.Set as Set
import qualified Data.Text as Text import qualified Data.Text as Text
import Gargantext.API.Ngrams.Types (NgramsElement, mkNgramsElement, NgramsTerm(..), RootParent(..), mSetFromList)
-- import Gargantext.API.Ngrams.Tools (getCoocByNgrams', Diagonal(..)) -- import Gargantext.API.Ngrams.Tools (getCoocByNgrams', Diagonal(..))
import Gargantext.API.Ngrams.Types (NgramsElement, mkNgramsElement, NgramsTerm(..), RootParent(..), mSetFromList)
import Gargantext.Core (Lang(..)) import Gargantext.Core (Lang(..))
import Gargantext.Core.Types (ListType(..), MasterCorpusId, UserCorpusId) import Gargantext.Core.Text (size)
import Gargantext.Database.Admin.Types.Node (NodeId) import Gargantext.Core.Text.List.Learn (Model(..))
import Gargantext.Core.Text.List.Social (flowSocialList)
import Gargantext.Core.Text.Metrics (scored', Scored(..), normalizeGlobal, normalizeLocal) import Gargantext.Core.Text.Metrics (scored', Scored(..), normalizeGlobal, normalizeLocal)
import Gargantext.Core.Types (ListType(..), MasterCorpusId, UserCorpusId)
import Gargantext.Core.Types.Individu (User(..))
import Gargantext.Database.Action.Metrics.NgramsByNode (ngramsGroup, getNodesByNgramsUser, groupNodesByNgramsWith, getNodesByNgramsOnlyUser) import Gargantext.Database.Action.Metrics.NgramsByNode (ngramsGroup, getNodesByNgramsUser, groupNodesByNgramsWith, getNodesByNgramsOnlyUser)
import Gargantext.Database.Action.Metrics.TFICF (getTficf) import Gargantext.Database.Action.Metrics.TFICF (getTficf)
import Gargantext.API.Ngrams.Types (RepoCmdM)
import Gargantext.Database.Admin.Types.Node (NodeId)
import Gargantext.Database.Prelude (Cmd, CmdM)
import Gargantext.Database.Query.Table.Node (defaultList) import Gargantext.Database.Query.Table.Node (defaultList)
import Gargantext.Database.Query.Table.Node.Error (HasNodeError()) import Gargantext.Database.Query.Table.Node.Error (HasNodeError())
import Gargantext.Database.Prelude (Cmd) import Gargantext.Database.Query.Tree.Error (HasTreeError)
import Gargantext.Database.Schema.Ngrams (NgramsType(..)) import Gargantext.Database.Schema.Ngrams (NgramsType(..))
import Gargantext.Prelude import Gargantext.Prelude
import Gargantext.Core.Text (size)
import Gargantext.Core.Text.List.Learn (Model(..))
-- import Gargantext.Core.Text.Metrics (takeScored)
data NgramsListBuilder = BuilderStepO { stemSize :: !Int data NgramsListBuilder = BuilderStepO { stemSize :: !Int
...@@ -63,26 +66,37 @@ data NgramsListBuilder = BuilderStepO { stemSize :: !Int ...@@ -63,26 +66,37 @@ data NgramsListBuilder = BuilderStepO { stemSize :: !Int
data StopSize = StopSize {unStopSize :: !Int} data StopSize = StopSize {unStopSize :: !Int}
-- | TODO improve grouping functions of Authors, Sources, Institutes.. -- | TODO improve grouping functions of Authors, Sources, Institutes..
buildNgramsLists :: HasNodeError err buildNgramsLists :: ( RepoCmdM env err m
=> Lang , CmdM env err m
, HasTreeError err
, HasNodeError err
)
=> User
-> Lang
-> Int -> Int
-> Int -> Int
-> StopSize -> StopSize
-> UserCorpusId -> UserCorpusId
-> MasterCorpusId -> MasterCorpusId
-> Cmd err (Map NgramsType [NgramsElement]) -> m (Map NgramsType [NgramsElement])
buildNgramsLists l n m s uCid mCid = do buildNgramsLists user l n m s uCid mCid = do
ngTerms <- buildNgramsTermsList l n m s uCid mCid ngTerms <- buildNgramsTermsList user l n m s uCid mCid
othersTerms <- mapM (buildNgramsOthersList uCid identity) othersTerms <- mapM (buildNgramsOthersList user uCid identity)
[Authors, Sources, Institutes] [Authors, Sources, Institutes]
pure $ Map.unions $ othersTerms <> [ngTerms] pure $ Map.unions $ othersTerms <> [ngTerms]
buildNgramsOthersList :: UserCorpusId buildNgramsOthersList :: (-- RepoCmdM env err m
-- , CmdM env err m
HasNodeError err
-- , HasTreeError err
)
=> User
-> UserCorpusId
-> (Text -> Text) -> (Text -> Text)
-> NgramsType -> NgramsType
-> Cmd err (Map NgramsType [NgramsElement]) -> Cmd err (Map NgramsType [NgramsElement])
buildNgramsOthersList uCid groupIt nt = do buildNgramsOthersList user uCid groupIt nt = do
ngs <- groupNodesByNgramsWith groupIt <$> getNodesByNgramsUser uCid nt ngs <- groupNodesByNgramsWith groupIt <$> getNodesByNgramsUser uCid nt
let let
...@@ -105,15 +119,20 @@ buildNgramsOthersList uCid groupIt nt = do ...@@ -105,15 +119,20 @@ buildNgramsOthersList uCid groupIt nt = do
)] )]
-- TODO use ListIds -- TODO use ListIds
buildNgramsTermsList :: HasNodeError err buildNgramsTermsList :: ( HasNodeError err
=> Lang , CmdM env err m
-> Int , RepoCmdM env err m
-> Int , HasTreeError err
-> StopSize )
-> UserCorpusId => User
-> MasterCorpusId -> Lang
-> Cmd err (Map NgramsType [NgramsElement]) -> Int
buildNgramsTermsList l n m s uCid mCid = do -> Int
-> StopSize
-> UserCorpusId
-> MasterCorpusId
-> m (Map NgramsType [NgramsElement])
buildNgramsTermsList user l n m s uCid mCid = do
-- Computing global speGen score -- Computing global speGen score
allTerms <- Map.toList <$> getTficf uCid mCid NgramsTerms allTerms <- Map.toList <$> getTficf uCid mCid NgramsTerms
...@@ -122,6 +141,8 @@ buildNgramsTermsList l n m s uCid mCid = do ...@@ -122,6 +141,8 @@ buildNgramsTermsList l n m s uCid mCid = do
-- printDebug "tail candidates" (List.take 10 $ List.reverse $ allTerms) -- printDebug "tail candidates" (List.take 10 $ List.reverse $ allTerms)
-- First remove stops terms -- First remove stops terms
mapSocialList <- flowSocialList user NgramsTerms (Set.fromList $ map fst allTerms)
let let
-- stopTerms ignored for now (need to be tagged already) -- stopTerms ignored for now (need to be tagged already)
(_stopTerms, candidateTerms) = List.partition ((isStopTerm s) . fst) allTerms (_stopTerms, candidateTerms) = List.partition ((isStopTerm s) . fst) allTerms
......
...@@ -6,8 +6,6 @@ License : AGPL + CECILL v3 ...@@ -6,8 +6,6 @@ License : AGPL + CECILL v3
Maintainer : team@gargantext.org Maintainer : team@gargantext.org
Stability : experimental Stability : experimental
Portability : POSIX Portability : POSIX
-} -}
module Gargantext.Core.Text.List.Social module Gargantext.Core.Text.List.Social
...@@ -28,7 +26,6 @@ import Data.Maybe (fromMaybe) ...@@ -28,7 +26,6 @@ import Data.Maybe (fromMaybe)
import Data.Map (Map) import Data.Map (Map)
import Data.Set (Set) import Data.Set (Set)
import Data.Text (Text) import Data.Text (Text)
import Gargantext.API.Ngrams
import Gargantext.API.Ngrams.Tools -- (getListNgrams) import Gargantext.API.Ngrams.Tools -- (getListNgrams)
import Gargantext.API.Ngrams.Types import Gargantext.API.Ngrams.Types
import Gargantext.Core.Types.Main import Gargantext.Core.Types.Main
...@@ -39,12 +36,12 @@ import qualified Data.Set as Set ...@@ -39,12 +36,12 @@ import qualified Data.Set as Set
flowSocialList :: ( RepoCmdM env err m flowSocialList :: ( RepoCmdM env err m
, CmdM env err m , CmdM env err m
, HasNodeError err , HasNodeError err
, HasTreeError err , HasTreeError err
) )
=> User -> NgramsType -> Set Text => User -> NgramsType -> Set Text
-> m (Map ListType (Set Text)) -> m (Map ListType (Set Text))
flowSocialList user nt ngrams' = do flowSocialList user nt ngrams' = do
privateMapList <- flowSocialListByMode Private user nt ngrams' privateMapList <- flowSocialListByMode Private user nt ngrams'
sharedMapList <- flowSocialListByMode Shared user nt (termsByList CandidateTerm privateMapList) sharedMapList <- flowSocialListByMode Shared user nt (termsByList CandidateTerm privateMapList)
......
...@@ -79,19 +79,19 @@ import Gargantext.Database.Action.Search (searchDocInDatabase) ...@@ -79,19 +79,19 @@ import Gargantext.Database.Action.Search (searchDocInDatabase)
import Gargantext.Database.Admin.Config (userMaster, corpusMasterName) import Gargantext.Database.Admin.Config (userMaster, corpusMasterName)
import Gargantext.Database.Admin.Types.Hyperdata import Gargantext.Database.Admin.Types.Hyperdata
import Gargantext.Database.Admin.Types.Node -- (HyperdataDocument(..), NodeType(..), NodeId, UserId, ListId, CorpusId, RootId, MasterCorpusId, MasterUserId) import Gargantext.Database.Admin.Types.Node -- (HyperdataDocument(..), NodeType(..), NodeId, UserId, ListId, CorpusId, RootId, MasterCorpusId, MasterUserId)
import Gargantext.Database.Prelude
import Gargantext.Database.Query.Table.Ngrams
import Gargantext.Database.Query.Table.Node import Gargantext.Database.Query.Table.Node
import Gargantext.Database.Query.Table.Node.Document.Insert -- (insertDocuments, ReturnId(..), addUniqIdsDoc, addUniqIdsContact, ToDbData(..)) import Gargantext.Database.Query.Table.Node.Document.Insert -- (insertDocuments, ReturnId(..), addUniqIdsDoc, addUniqIdsContact, ToDbData(..))
import Gargantext.Database.Query.Tree.Root (getOrMkRoot, getOrMk_RootWithCorpus)
import Gargantext.Database.Query.Table.Node.Error (HasNodeError(..)) import Gargantext.Database.Query.Table.Node.Error (HasNodeError(..))
import Gargantext.Database.Query.Table.Ngrams
import Gargantext.Database.Query.Table.NodeNgrams (listInsertDb , getCgramsId) import Gargantext.Database.Query.Table.NodeNgrams (listInsertDb , getCgramsId)
import Gargantext.Database.Query.Table.NodeNodeNgrams2 import Gargantext.Database.Query.Table.NodeNodeNgrams2
import Gargantext.Database.Prelude import Gargantext.Database.Query.Tree.Root (getOrMkRoot, getOrMk_RootWithCorpus)
import Gargantext.Database.Schema.Node (NodePoly(..)) import Gargantext.Database.Schema.Node (NodePoly(..))
import Gargantext.Prelude import Gargantext.Prelude
import Gargantext.Prelude.Crypto.Hash (Hash) import Gargantext.Prelude.Crypto.Hash (Hash)
import qualified Gargantext.Database.Query.Table.Node.Document.Add as Doc (add)
import qualified Gargantext.Core.Text.Corpus.API as API import qualified Gargantext.Core.Text.Corpus.API as API
import qualified Gargantext.Database.Query.Table.Node.Document.Add as Doc (add)
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- TODO use internal with API name (could be old data) -- TODO use internal with API name (could be old data)
...@@ -132,12 +132,13 @@ getDataText (InternalOrigin _) _la q _li = do ...@@ -132,12 +132,13 @@ getDataText (InternalOrigin _) _la q _li = do
pure $ DataOld ids pure $ DataOld ids
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
flowDataText :: FlowCmdM env err m flowDataText :: ( FlowCmdM env err m
=> User )
-> DataText => User
-> TermType Lang -> DataText
-> CorpusId -> TermType Lang
-> m CorpusId -> CorpusId
-> m CorpusId
flowDataText u (DataOld ids) tt cid = flowCorpusUser (_tt_lang tt) u (Right [cid]) corpusType ids flowDataText u (DataOld ids) tt cid = flowCorpusUser (_tt_lang tt) u (Right [cid]) corpusType ids
where where
corpusType = (Nothing :: Maybe HyperdataCorpus) corpusType = (Nothing :: Maybe HyperdataCorpus)
...@@ -145,7 +146,7 @@ flowDataText u (DataNew txt) tt cid = flowCorpus u (Right [cid]) tt txt ...@@ -145,7 +146,7 @@ flowDataText u (DataNew txt) tt cid = flowCorpus u (Right [cid]) tt txt
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- TODO use proxy -- TODO use proxy
flowAnnuaire :: FlowCmdM env err m flowAnnuaire :: (FlowCmdM env err m)
=> User => User
-> Either CorpusName [CorpusId] -> Either CorpusName [CorpusId]
-> (TermType Lang) -> (TermType Lang)
...@@ -156,7 +157,7 @@ flowAnnuaire u n l filePath = do ...@@ -156,7 +157,7 @@ flowAnnuaire u n l filePath = do
flow (Nothing :: Maybe HyperdataAnnuaire) u n l docs flow (Nothing :: Maybe HyperdataAnnuaire) u n l docs
------------------------------------------------------------------------ ------------------------------------------------------------------------
flowCorpusFile :: FlowCmdM env err m flowCorpusFile :: (FlowCmdM env err m)
=> User => User
-> Either CorpusName [CorpusId] -> Either CorpusName [CorpusId]
-> Limit -- Limit the number of docs (for dev purpose) -> Limit -- Limit the number of docs (for dev purpose)
...@@ -181,20 +182,25 @@ flowCorpus :: (FlowCmdM env err m, FlowCorpus a) ...@@ -181,20 +182,25 @@ flowCorpus :: (FlowCmdM env err m, FlowCorpus a)
flowCorpus = flow (Nothing :: Maybe HyperdataCorpus) flowCorpus = flow (Nothing :: Maybe HyperdataCorpus)
flow :: (FlowCmdM env err m, FlowCorpus a, MkCorpus c) flow :: ( FlowCmdM env err m
=> Maybe c , FlowCorpus a
-> User , MkCorpus c
-> Either CorpusName [CorpusId] )
-> TermType Lang => Maybe c
-> [[a]] -> User
-> m CorpusId -> Either CorpusName [CorpusId]
-> TermType Lang
-> [[a]]
-> m CorpusId
flow c u cn la docs = do flow c u cn la docs = do
-- TODO if public insertMasterDocs else insertUserDocs -- TODO if public insertMasterDocs else insertUserDocs
ids <- traverse (insertMasterDocs c la) docs ids <- traverse (insertMasterDocs c la) docs
flowCorpusUser (la ^. tt_lang) u cn c (concat ids) flowCorpusUser (la ^. tt_lang) u cn c (concat ids)
------------------------------------------------------------------------ ------------------------------------------------------------------------
flowCorpusUser :: (FlowCmdM env err m, MkCorpus c) flowCorpusUser :: ( FlowCmdM env err m
, MkCorpus c
)
=> Lang => Lang
-> User -> User
-> Either CorpusName [CorpusId] -> Either CorpusName [CorpusId]
...@@ -214,7 +220,7 @@ flowCorpusUser l user corpusName ctype ids = do ...@@ -214,7 +220,7 @@ flowCorpusUser l user corpusName ctype ids = do
-- User List Flow -- User List Flow
(masterUserId, _masterRootId, masterCorpusId) <- getOrMk_RootWithCorpus (UserName userMaster) (Left "") ctype (masterUserId, _masterRootId, masterCorpusId) <- getOrMk_RootWithCorpus (UserName userMaster) (Left "") ctype
ngs <- buildNgramsLists l 2 3 (StopSize 3) userCorpusId masterCorpusId ngs <- buildNgramsLists user l 2 3 (StopSize 3) userCorpusId masterCorpusId
_userListId <- flowList_DbRepo listId ngs _userListId <- flowList_DbRepo listId ngs
_mastListId <- getOrMkList masterCorpusId masterUserId _mastListId <- getOrMkList masterCorpusId masterUserId
-- _ <- insertOccsUpdates userCorpusId mastListId -- _ <- insertOccsUpdates userCorpusId mastListId
......
...@@ -29,6 +29,7 @@ import Gargantext.Core.Text.Terms ...@@ -29,6 +29,7 @@ import Gargantext.Core.Text.Terms
import Gargantext.Database.Query.Table.Node.Error (HasNodeError) import Gargantext.Database.Query.Table.Node.Error (HasNodeError)
import Gargantext.Database.Prelude (CmdM) import Gargantext.Database.Prelude (CmdM)
import Gargantext.Database.Query.Table.Node.Document.Insert import Gargantext.Database.Query.Table.Node.Document.Insert
import Gargantext.Database.Query.Tree.Error (HasTreeError)
type FlowCmdM env err m = type FlowCmdM env err m =
( CmdM env err m ( CmdM env err m
...@@ -36,6 +37,7 @@ type FlowCmdM env err m = ...@@ -36,6 +37,7 @@ type FlowCmdM env err m =
, HasNodeError err , HasNodeError err
, HasInvalidError err , HasInvalidError err
, HasRepoVar env , HasRepoVar env
, HasTreeError err
) )
type FlowCorpus a = ( AddUniqId a type FlowCorpus a = ( AddUniqId a
......
...@@ -81,11 +81,8 @@ type CmdM env err m = ...@@ -81,11 +81,8 @@ type CmdM env err m =
) )
type Cmd'' env err a = forall m. CmdM'' env err m => m a type Cmd'' env err a = forall m. CmdM'' env err m => m a
type Cmd' env err a = forall m. CmdM' env err m => m a type Cmd' env err a = forall m. CmdM' env err m => m a
type Cmd err a = forall m env. CmdM env err m => m a type Cmd err a = forall m env. CmdM env err m => m a
......
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