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
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
41 import qualified Data.ByteString as DB
42 import qualified Data.List as List
43 import qualified Data.Map as Map
44 import qualified Data.Text as Text
46 type MinSizeBranch = Int
48 flowPhylo :: FlowCmdM env err m
53 list <- defaultList cId
54 termList <- Map.toList <$> getTermsWith Text.words [list] NgramsTerms GraphTerm
57 <$> map (\h -> (,) <$> _hyperdataDocument_publication_year h
58 <*> _hyperdataDocument_abstract h
63 patterns = buildPatterns termList
64 -- | To filter the Ngrams of a document based on the termList
65 filterTerms :: Patterns -> (Date, Text) -> (Date, [Text])
66 filterTerms patterns' (y,d) = (y,termsInText patterns' d)
68 --------------------------------------
69 termsInText :: Patterns -> Text -> [Text]
70 termsInText pats txt = List.nub $ List.concat $ map (map Text.unwords) $ extractTermsWithList pats txt
71 --------------------------------------
73 docs = map ( (\(y,t) -> Document y t) . filterTerms patterns) docs'
75 --liftBase $ flowPhylo' (List.sortOn date docs) termList l m fp
76 pure $ buildPhylo (List.sortOn date docs) termList
79 -- TODO SortedList Document
80 flowPhylo' :: [Document] -> TermList -- ^Build
81 -> Level -> MinSizeBranch -- ^View
84 flowPhylo' corpus terms l m fp = do
86 phylo = buildPhylo corpus terms
87 phVie = viewPhylo l m phylo
92 defaultQuery :: PhyloQueryBuild
93 defaultQuery = defaultQueryBuild'
97 buildPhylo :: [Document] -> TermList -> Phylo
98 buildPhylo = trace (show defaultQuery) $ buildPhylo' defaultQuery
100 buildPhylo' :: PhyloQueryBuild -> [Document] -> TermList -> Phylo
101 buildPhylo' q corpus termList = toPhylo q corpus termList Map.empty
103 queryView :: Level -> MinSizeBranch -> PhyloQueryView
104 queryView level _minSizeBranch = PhyloQueryView level Merge False 2
107 -- [SizeBranch $ SBParams minSizeBranch]
108 [BranchPeakFreq,GroupLabelCooc]
109 (Just (ByBranchAge,Asc))
112 viewPhylo :: Level -> MinSizeBranch -> Phylo -> PhyloView
113 viewPhylo l b phylo = toPhyloView (queryView l b) phylo
115 writePhylo :: FilePath -> PhyloView -> IO FilePath
116 writePhylo fp phview = runGraphviz (viewToDot phview) Svg fp
118 viewPhylo2Svg :: PhyloView -> IO DB.ByteString
119 viewPhylo2Svg p = graphvizWithHandle Dot (viewToDot p) Svg DB.hGetContents