2 Module : Gargantext.Database.Flow.List
3 Description : List Flow
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
12 {-# OPTIONS_GHC -fno-warn-orphans #-}
14 {-# LANGUAGE ConstraintKinds #-}
15 {-# LANGUAGE RankNTypes #-}
16 {-# LANGUAGE ConstrainedClassMethods #-}
17 {-# LANGUAGE ConstraintKinds #-}
18 {-# LANGUAGE DeriveGeneric #-}
19 {-# LANGUAGE FlexibleContexts #-}
20 {-# LANGUAGE InstanceSigs #-}
21 {-# LANGUAGE NoImplicitPrelude #-}
22 {-# LANGUAGE OverloadedStrings #-}
24 module Gargantext.Database.Action.Flow.List
27 import Control.Monad (mapM_)
28 import Data.Map (Map, toList)
29 import Data.Maybe (Maybe(..), catMaybes)
30 import Data.Text (Text)
31 import Gargantext.API.Ngrams (NgramsElement(..), putListNgrams)
32 import Gargantext.Core.Types.Main (ListType(CandidateTerm))
33 import Gargantext.Core.Flow.Types
34 import Gargantext.Database.Action.Flow.Types
35 import Gargantext.Database.Admin.Types.Node -- (HyperdataDocument(..), NodeType(..), NodeId, UserId, ListId, CorpusId, RootId, MasterCorpusId, MasterUserId)
36 import Gargantext.Database.Schema.Ngrams -- (insertNgrams, Ngrams(..), NgramsIndexed(..), indexNgrams, NgramsType(..), text2ngrams, ngramsTypeId)
37 import Gargantext.Database.Schema.NodeNgrams (NodeNgramsPoly(..), NodeNgramsW, listInsertDb, getCgramsId)
38 import Gargantext.Database.Schema.Node_NodeNgramsNodeNgrams -- (insert_Node_NodeNgrams_NodeNgrams, Node_NodeNgrams_NodeNgrams(..))
39 import Gargantext.Prelude
40 import qualified Data.List as List
41 import qualified Data.Map as Map
45 -- | TODO check optimization
46 mapNodeIdNgrams :: [DocumentIdWithNgrams a]
47 -> Map Ngrams (Map NgramsType (Map NodeId Int))
48 mapNodeIdNgrams = Map.unionsWith (Map.unionWith (Map.unionWith (+))) . fmap f
50 f :: DocumentIdWithNgrams a
51 -> Map Ngrams (Map NgramsType (Map NodeId Int))
52 f d = fmap (fmap (Map.singleton nId)) $ document_ngrams d
54 nId = documentId $ documentWithId d
56 ------------------------------------------------------------------------
57 flowList_DbRepo :: FlowCmdM env err m
59 -> Map NgramsType [NgramsElement]
61 flowList_DbRepo lId ngs = do
62 -- printDebug "listId flowList" lId
63 mapCgramsId <- listInsertDb lId toNodeNgramsW (Map.toList ngs)
64 let toInsert = catMaybes [ (,) <$> (getCgramsId mapCgramsId ntype <$> parent)
65 <*> getCgramsId mapCgramsId ntype ngram
66 | (ntype, ngs') <- Map.toList ngs
67 , NgramsElement ngram _ _ _ _ parent _ <- ngs'
69 -- Inserting groups of ngrams
70 _r <- insert_Node_NodeNgrams_NodeNgrams
71 $ map (\(a,b) -> Node_NodeNgrams_NodeNgrams lId a b Nothing) toInsert
75 --trace (show $ List.filter (\n -> _ne_ngrams n == "versatile") $ List.concat $ Map.elems ngs) $ listInsert lId ngs
77 ------------------------------------------------------------------------
78 ------------------------------------------------------------------------
80 toNodeNgramsW :: ListId
81 -> [(NgramsType, [NgramsElement])]
83 toNodeNgramsW l ngs = List.concat $ map (toNodeNgramsW'' l) ngs
85 toNodeNgramsW'' :: ListId
86 -> (NgramsType, [NgramsElement])
88 toNodeNgramsW'' l' (ngrams_type, elms) =
89 [ NodeNgrams Nothing l' list_type ngrams_terms' ngrams_type Nothing Nothing Nothing 0 |
90 (NgramsElement ngrams_terms' _size list_type _occ _root _parent _children) <- elms
94 toNodeNgramsW' :: ListId
95 -> [(Text, [NgramsType])]
97 toNodeNgramsW' l'' ngs = [ NodeNgrams Nothing l'' CandidateTerm terms ngrams_type Nothing Nothing Nothing 0
98 | (terms, ngrams_types) <- ngs
99 , ngrams_type <- ngrams_types
103 listInsert :: FlowCmdM env err m
105 -> Map NgramsType [NgramsElement]
107 listInsert lId ngs = mapM_ (\(typeList, ngElmts)
108 -> putListNgrams lId typeList ngElmts) (toList ngs)
110 ------------------------------------------------------------------------
111 ------------------------------------------------------------------------