2 Module : Gargantext.API.Node.Corpus.Export
3 Description : Get Metrics from Storage (Database like)
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
10 Main exports of Gargantext:
16 module Gargantext.API.Node.Corpus.Export
20 import Data.Maybe (fromMaybe)
22 import qualified Data.List as List
23 import qualified Data.Map as Map
24 import qualified Data.Set as Set
25 import qualified Data.HashMap.Strict as HashMap
27 import Gargantext.API.Node.Corpus.Export.Types
28 import Gargantext.API.Ngrams.Types
29 import Gargantext.API.Ngrams.Tools (filterListWithRoot, mapTermListRoot, getRepo')
30 import Gargantext.API.Prelude (GargNoServer)
31 import Gargantext.Prelude.Crypto.Hash (hash)
32 import Gargantext.Core.Types
33 import Gargantext.Core.NodeStory
34 import Gargantext.Database.Action.Metrics.NgramsByNode (getNgramsByNodeOnlyUser)
35 import Gargantext.Database.Admin.Config (userMaster)
36 import Gargantext.Database.Admin.Types.Hyperdata (HyperdataDocument(..))
37 import Gargantext.Database.Prelude (Cmd)
38 import Gargantext.Database.Query.Table.Node
39 import Gargantext.Database.Query.Table.Node.Error (HasNodeError)
40 import Gargantext.Database.Query.Table.Node.Select (selectNodesWithUsername)
41 import Gargantext.Database.Query.Table.NodeNode (selectDocNodes)
42 import Gargantext.Database.Schema.Ngrams (NgramsType(..))
43 import Gargantext.Database.Schema.Node (_node_id, _node_hyperdata)
44 import Gargantext.Prelude
46 --------------------------------------------------
47 -- | Hashes are ordered by Set
51 -> GargNoServer Corpus
52 getCorpus cId lId nt' = do
56 Nothing -> NgramsTerms
60 <$> map (\n -> (_node_id n, n))
61 <$> selectDocNodes cId
63 repo <- getRepo' [fromMaybe (panic "[Gargantext.API.Node.Corpus.Export]") lId]
64 ngs <- getNodeNgrams cId lId nt repo
65 let -- uniqId is hash computed already for each document imported in database
66 r = Map.intersectionWith
67 (\a b -> Document { _d_document = a
68 , _d_ngrams = Ngrams (Set.toList b) (hash b)
69 , _d_hash = d_hash a b }
70 ) ns (Map.map (Set.map unNgramsTerm) ngs)
72 d_hash a b = hash [ fromMaybe "" (_hd_uniqId $ _node_hyperdata a)
75 pure $ Corpus { _c_corpus = Map.elems r
76 , _c_hash = hash $ List.map _d_hash $ Map.elems r }
78 getNodeNgrams :: HasNodeError err
83 -> Cmd err (Map NodeId (Set NgramsTerm))
84 getNodeNgrams cId lId' nt repo = do
86 Nothing -> defaultList cId
89 lIds <- selectNodesWithUsername NodeList userMaster
90 let ngs = filterListWithRoot MapTerm $ mapTermListRoot [lId] nt repo
92 r <- getNgramsByNodeOnlyUser cId (lIds <> [lId]) nt (HashMap.keys ngs)
97 -- Version number of the list