2 Module : Gargantext.Viz.Phylo.Main
3 Description : Phylomemy Main
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
12 {-# LANGUAGE FlexibleContexts #-}
13 {-# LANGUAGE NoImplicitPrelude #-}
14 {-# LANGUAGE OverloadedStrings #-}
15 {-# LANGUAGE RankNTypes #-}
16 {-# LANGUAGE ViewPatterns #-}
18 module Gargantext.Viz.Phylo.Main
21 import Control.Monad.IO.Class (liftIO)
24 import Data.Text (Text)
25 import Debug.Trace (trace)
26 import GHC.IO (FilePath)
27 import Gargantext.API.Ngrams.Tools (getTermsWith)
28 import Gargantext.Core.Types
29 import Gargantext.Database.Flow
30 import Gargantext.Database.Schema.Ngrams (NgramsType(..))
31 import Gargantext.Database.Schema.Node (defaultList)
32 import Gargantext.Database.Schema.NodeNode (selectDocs)
33 import Gargantext.Prelude
34 import Gargantext.Text.Context (TermList)
35 import Gargantext.Text.Terms.WithList
36 import Gargantext.Viz.Phylo hiding (Svg, Dot)
37 import Gargantext.Viz.Phylo.LevelMaker
38 import Gargantext.Viz.Phylo.Tools
39 import Gargantext.Viz.Phylo.View.Export
40 import Gargantext.Viz.Phylo.View.ViewMaker -- TODO Just Maker is fine
42 import qualified Data.ByteString as DB
43 import qualified Data.List as List
44 import qualified Data.Map as Map
45 import qualified Data.Text as Text
47 type MinSizeBranch = Int
49 flowPhylo :: FlowCmdM env ServantErr m
51 -> Level -> MinSizeBranch
54 flowPhylo cId l m fp = do
56 list <- defaultList cId
57 -- listMaster <- selectNodesWithUsername NodeList userMaster
58 termList <- Map.toList <$> getTermsWith Text.words [list] NgramsTerms GraphTerm
59 --printDebug "termList" termList
61 --x <- mapTermListRoot [list] NgramsTerms
62 --printDebug "mapTermListRoot" x
64 -- TODO optimize unwords
66 docs' <- catMaybes <$> map (\h -> (,) <$> _hyperdataDocument_publication_year h
67 <*> _hyperdataDocument_abstract h
70 let patterns = buildPatterns termList
71 let docs = map ( (\(y,t) -> Document y t) . filterTerms patterns) docs'
72 --printDebug "docs" docs
73 --printDebug "docs" termList
75 liftIO $ flowPhylo' (List.sortOn date docs) termList l m fp
80 parse :: TermList -> [(Date, Text)] -> IO [Document]
82 let patterns = buildPatterns l
83 pure $ map ( (\(y,t) -> Document y t) . filterTerms patterns) c
86 -- | To filter the Ngrams of a document based on the termList
87 filterTerms :: Patterns -> (Date, Text) -> (Date, [Text])
88 filterTerms patterns (y,d) = (y,termsInText patterns d)
90 --------------------------------------
91 termsInText :: Patterns -> Text -> [Text]
92 termsInText pats txt = List.nub $ List.concat $ map (map Text.unwords) $ extractTermsWithList pats txt
93 --------------------------------------
96 -- TODO SortedList Document
97 flowPhylo' :: [Document] -> TermList -- ^Build
98 -> Level -> MinSizeBranch -- ^View
101 flowPhylo' corpus terms l m fp = do
103 phylo = buildPhylo corpus terms
104 phVie = viewPhylo l m phylo
109 defaultQuery :: PhyloQueryBuild
110 defaultQuery = defaultQueryBuild'
112 "Default Description"
114 buildPhylo :: [Document] -> TermList -> Phylo
115 buildPhylo = trace (show defaultQuery) $ buildPhylo' defaultQuery
117 buildPhylo' :: PhyloQueryBuild -> [Document] -> TermList -> Phylo
118 buildPhylo' q corpus termList = toPhylo q corpus termList Map.empty
120 queryView :: Level -> MinSizeBranch -> PhyloQueryView
121 queryView level _minSizeBranch = PhyloQueryView level Merge False 2
124 -- [SizeBranch $ SBParams minSizeBranch]
125 [BranchPeakFreq,GroupLabelCooc]
126 (Just (ByBranchAge,Asc))
129 viewPhylo :: Level -> MinSizeBranch -> Phylo -> PhyloView
130 viewPhylo l b phylo = toPhyloView (queryView l b) phylo
132 writePhylo :: FilePath -> PhyloView -> IO FilePath
133 writePhylo fp phview = runGraphviz (viewToDot phview) Svg fp
135 viewPhylo2Svg :: PhyloView -> IO DB.ByteString
136 viewPhylo2Svg p = graphvizWithHandle Dot (viewToDot p) Svg DB.hGetContents