2 Module : Gargantext.Database.Flow.Utils
3 Description : Database Flow
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
12 {-# LANGUAGE NoImplicitPrelude #-}
13 {-# LANGUAGE OverloadedStrings #-}
14 {-# LANGUAGE RankNTypes #-}
16 module Gargantext.Database.Flow.Utils
20 import qualified Data.Map as DM
21 import Gargantext.Prelude
22 import Gargantext.Database.Schema.Ngrams
23 import Gargantext.Database.Types.Node (NodeId, Node, NodePoly(..), Hyperdata)
24 import Gargantext.Database.Utils (Cmd)
25 import Gargantext.Database.Schema.NodeNgram
26 import Gargantext.Core.Types.Main (ListType(..), listTypeId)
28 toMaps :: Hyperdata a => (a -> Map (NgramsT Ngrams) Int) -> [Node a] -> Map (NgramsT Ngrams) (Map NodeId Int)
29 toMaps fun ns = mapNodeIdNgrams $ documentIdWithNgrams fun ns'
31 ns' = map (\(Node nId _ _ _ _ _ json) -> DocumentWithId nId json) ns
33 mapNodeIdNgrams :: Hyperdata a => [DocumentIdWithNgrams a] -> Map (NgramsT Ngrams) (Map NodeId Int)
34 mapNodeIdNgrams ds = DM.map (DM.fromListWith (+)) $ DM.fromListWith (<>) xs
36 xs = [(ng, [(nId, i)]) | (nId, n2i') <- n2i ds, (ng, i) <- DM.toList n2i']
37 n2i = map (\d -> ((documentId . documentWithId) d, document_ngrams d))
40 documentIdWithNgrams :: Hyperdata a => (a -> Map (NgramsT Ngrams) Int)
41 -> [DocumentWithId a] -> [DocumentIdWithNgrams a]
42 documentIdWithNgrams f = map (\d -> DocumentIdWithNgrams d ((f . documentData) d))
45 data DocumentWithId a =
46 DocumentWithId { documentId :: NodeId
51 data DocumentIdWithNgrams a =
53 { documentWithId :: DocumentWithId a
54 , document_ngrams :: Map (NgramsT Ngrams) Int
57 -- | TODO for now, list Type is CandidateList, why ?
58 insertToNodeNgrams :: Map (NgramsT NgramsIndexed) (Map NodeId Int) -> Cmd err Int
59 insertToNodeNgrams m = insertNodeNgrams [ NodeNgram nId ((_ngramsId . _ngramsT) ng) ((ngramsTypeId . _ngramsType) ng) (listTypeId CandidateList) (fromIntegral n)
60 | (ng, nId2int) <- DM.toList m
61 , (nId, n) <- DM.toList nId2int