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
27 toMaps :: Hyperdata a => (a -> Map (NgramsT Ngrams) Int) -> [Node a] -> Map (NgramsT Ngrams) (Map NodeId Int)
28 toMaps fun ns = mapNodeIdNgrams $ documentIdWithNgrams fun ns'
30 ns' = map (\(Node nId _ _ _ _ _ json) -> DocumentWithId nId json) ns
32 mapNodeIdNgrams :: Hyperdata a => [DocumentIdWithNgrams a] -> Map (NgramsT Ngrams) (Map NodeId Int)
33 mapNodeIdNgrams ds = DM.map (DM.fromListWith (+)) $ DM.fromListWith (<>) xs
35 xs = [(ng, [(nId, i)]) | (nId, n2i') <- n2i ds, (ng, i) <- DM.toList n2i']
36 n2i = map (\d -> ((documentId . documentWithId) d, document_ngrams d))
39 documentIdWithNgrams :: Hyperdata a => (a -> Map (NgramsT Ngrams) Int)
40 -> [DocumentWithId a] -> [DocumentIdWithNgrams a]
41 documentIdWithNgrams f = map (\d -> DocumentIdWithNgrams d ((f . documentData) d))
44 data DocumentWithId a =
45 DocumentWithId { documentId :: NodeId
50 data DocumentIdWithNgrams a =
52 { documentWithId :: DocumentWithId a
53 , document_ngrams :: Map (NgramsT Ngrams) Int
57 insertToNodeNgrams :: Map (NgramsT NgramsIndexed) (Map NodeId Int) -> Cmd err Int
58 insertToNodeNgrams m = insertNodeNgrams [ NodeNgram Nothing nId ((_ngramsId . _ngramsT ) ng)
59 (fromIntegral n) ((ngramsTypeId . _ngramsType) ng)
60 | (ng, nId2int) <- DM.toList m
61 , (nId, n) <- DM.toList nId2int