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 #-}
15 module Gargantext.Database.Flow.Utils
19 import qualified Data.Map as DM
20 import Gargantext.Prelude
21 import Gargantext.Database.Schema.Ngrams
22 import Gargantext.Database.Types.Node (NodeId, Node, NodePoly(..), Hyperdata)
23 import Gargantext.Database.Utils (Cmd)
24 import Gargantext.Database.Schema.NodeNgram
26 toMaps :: Hyperdata a => (a -> Map (NgramsT Ngrams) Int) -> [Node a] -> Map (NgramsT Ngrams) (Map NodeId Int)
27 toMaps fun ns = mapNodeIdNgrams $ documentIdWithNgrams fun ns'
29 ns' = map (\(Node nId _ _ _ _ _ json) -> DocumentWithId nId json) ns
31 mapNodeIdNgrams :: Hyperdata a => [DocumentIdWithNgrams a] -> Map (NgramsT Ngrams) (Map NodeId Int)
32 mapNodeIdNgrams ds = DM.map (DM.fromListWith (+)) $ DM.fromListWith (<>) xs
34 xs = [(ng, [(nId, i)]) | (nId, n2i') <- n2i ds, (ng, i) <- DM.toList n2i']
35 n2i = map (\d -> ((documentId . documentWithId) d, document_ngrams d))
38 documentIdWithNgrams :: Hyperdata a => (a -> Map (NgramsT Ngrams) Int)
39 -> [DocumentWithId a] -> [DocumentIdWithNgrams a]
40 documentIdWithNgrams f = map (\d -> DocumentIdWithNgrams d ((f . documentData) d))
43 data DocumentWithId a =
44 DocumentWithId { documentId :: NodeId
49 data DocumentIdWithNgrams a =
51 { documentWithId :: DocumentWithId a
52 , document_ngrams :: Map (NgramsT Ngrams) Int
56 insertToNodeNgrams :: Map (NgramsT NgramsIndexed) (Map NodeId Int) -> Cmd Int
57 insertToNodeNgrams m = insertNodeNgrams [ NodeNgram Nothing nId ((_ngramsId . _ngramsT ) ng)
58 (fromIntegral n) ((ngramsTypeId . _ngramsType) ng)
59 | (ng, nId2int) <- DM.toList m
60 , (nId, n) <- DM.toList nId2int