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 Gargantext.API.Node.Corpus.Export.Types
23 import Gargantext.API.Ngrams.Types
24 import Gargantext.API.Ngrams.Tools (filterListWithRoot, mapTermListRoot, getRepo)
25 import Gargantext.API.Prelude (GargNoServer)
26 import Gargantext.Prelude.Crypto.Hash (hash)
27 import Gargantext.Core.Types
28 import Gargantext.Database.Action.Metrics.NgramsByNode (getNgramsByNodeOnlyUser)
29 import Gargantext.Database.Admin.Config (userMaster)
30 import Gargantext.Database.Admin.Types.Hyperdata (HyperdataDocument(..))
31 import Gargantext.Database.Prelude (Cmd)
32 import Gargantext.Database.Query.Table.Node
33 import Gargantext.Database.Query.Table.Node.Error (HasNodeError)
34 import Gargantext.Database.Query.Table.Node.Select (selectNodesWithUsername)
35 import Gargantext.Database.Query.Table.NodeNode (selectDocNodes)
36 import Gargantext.Database.Schema.Ngrams (NgramsType(..))
37 import Gargantext.Database.Schema.Node (_node_id, _node_hyperdata)
38 import Gargantext.Prelude
39 import qualified Data.List as List
40 import qualified Data.Map as Map
41 import qualified Data.Set as Set
42 import qualified Data.HashMap.Strict as HashMap
44 --------------------------------------------------
45 -- | Hashes are ordered by Set
49 -> GargNoServer Corpus
50 getCorpus cId lId nt' = do
54 Nothing -> NgramsTerms
58 <$> map (\n -> (_node_id n, n))
59 <$> selectDocNodes cId
61 ngs <- getNodeNgrams cId lId nt repo
62 let -- uniqId is hash computed already for each document imported in database
63 r = Map.intersectionWith (\a b -> Document a (Ngrams (Set.toList b) (hash b)) (d_hash a b)
64 ) ns (Map.map (Set.map unNgramsTerm) ngs)
66 d_hash a b = hash [ fromMaybe "" (_hd_uniqId $ _node_hyperdata a)
69 pure $ Corpus (Map.elems r) (hash $ List.map _d_hash
73 getNodeNgrams :: HasNodeError err
78 -> Cmd err (Map NodeId (Set NgramsTerm))
79 getNodeNgrams cId lId' nt repo = do
81 Nothing -> defaultList cId
84 lIds <- selectNodesWithUsername NodeList userMaster
85 let ngs = filterListWithRoot MapTerm $ mapTermListRoot [lId] nt repo
87 r <- getNgramsByNodeOnlyUser cId (lIds <> [lId]) nt (HashMap.keys ngs)
92 -- Version number of the list