Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
haskell-gargantext
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
160
Issues
160
List
Board
Labels
Milestones
Merge Requests
14
Merge Requests
14
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gargantext
haskell-gargantext
Commits
7b630704
Commit
7b630704
authored
Nov 04, 2024
by
Alexandre Delanoë
1
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/adinapoli/issue-409' into dev
parents
c1eede02
c08eb0a0
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
144 additions
and
33 deletions
+144
-33
Update.hs
src/Gargantext/API/Node/Update.hs
+11
-8
Phylo.hs
src/Gargantext/Core/Viz/Phylo.hs
+64
-4
API.hs
src/Gargantext/Core/Viz/Phylo/API.hs
+3
-1
Tools.hs
src/Gargantext/Core/Viz/Phylo/API/Tools.hs
+15
-11
PhyloMaker.hs
src/Gargantext/Core/Viz/Phylo/PhyloMaker.hs
+1
-0
UTCTime.hs
src/Gargantext/Utils/UTCTime.hs
+43
-8
187481.json
test-data/phylo/187481.json
+1
-0
cleopatre.golden.json
test-data/phylo/cleopatre.golden.json
+1
-0
nadal.golden.json
test-data/phylo/nadal.golden.json
+1
-0
JSON.hs
test/Test/Offline/JSON.hs
+4
-1
No files found.
src/Gargantext/API/Node/Update.hs
View file @
7b630704
...
...
@@ -9,12 +9,13 @@ Portability : POSIX
-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module
Gargantext.API.Node.Update
where
import
Control.Lens
(
view
)
import
Control.Lens
(
view
,
(
^?
),
_Just
)
import
Data.Set
qualified
as
Set
import
Gargantext.API.Admin.EnvTypes
(
GargJob
(
..
),
Env
)
import
Gargantext.API.Admin.Orchestrator.Types
(
AsyncJobs
(
..
))
...
...
@@ -28,16 +29,16 @@ import Gargantext.Core.NodeStory.Types (HasNodeStory)
import
Gargantext.Core.Text.Ngrams
(
NgramsType
(
NgramsTerms
))
import
Gargantext.Core.Types.Main
(
ListType
(
..
))
import
Gargantext.Core.Viz.Graph.API
(
recomputeGraph
)
import
Gargantext.Core.Viz.Phylo
(
subConfigAPI2config
)
import
Gargantext.Core.Viz.Phylo
(
subConfigAPI2config
,
phylo_computeTime
)
import
Gargantext.Core.Viz.Phylo.API.Tools
(
flowPhyloAPI
)
import
Gargantext.Database.Action.Flow
(
reIndexWith
)
import
Gargantext.Database.Action.Flow.Pairing
(
pairing
)
import
Gargantext.Database.Action.Metrics
(
updateNgramsOccurrences
,
updateContextScore
)
import
Gargantext.Database.Admin.Types.Hyperdata.Phylo
(
HyperdataPhylo
(
HyperdataPhylo
)
)
import
Gargantext.Database.Admin.Types.Hyperdata.Phylo
(
HyperdataPhylo
(
..
),
hp_data
)
import
Gargantext.Database.Admin.Types.Node
(
NodeId
,
NodeType
(
NodeCorpus
,
NodeAnnuaire
,
NodeTexts
,
NodeGraph
,
NodePhylo
,
NodeList
)
)
import
Gargantext.Database.Query.Table.Node
(
defaultList
,
getNode
,
getChildrenByType
)
import
Gargantext.Database.Query.Table.Node
(
defaultList
,
getNode
,
getChildrenByType
,
getNodeWith
)
import
Gargantext.Database.Query.Table.Node.UpdateOpaleye
(
updateHyperdata
)
import
Gargantext.Database.Schema.Node
(
node_parent_id
)
import
Gargantext.Database.Schema.Node
(
node_parent_id
,
node_hyperdata
)
import
Gargantext.Prelude
import
Gargantext.System.Logging
(
MonadLogger
)
import
Gargantext.Utils.Jobs
(
serveJobsAPI
,
MonadJobStatus
(
..
))
...
...
@@ -111,12 +112,14 @@ updateNode lId (UpdateNodeParamsList _mode) jobHandle = do
updateNode
phyloId
(
UpdateNodePhylo
config
)
jobHandle
=
do
markStarted
3
jobHandle
corpusId'
<-
view
node_parent_id
<$>
getNode
phyloId
oldPhylo
<-
getNodeWith
phyloId
(
Proxy
@
HyperdataPhylo
)
let
corpusId'
=
view
node_parent_id
oldPhylo
let
mbComputeHistory
=
oldPhylo
^?
node_hyperdata
.
hp_data
.
traverse
.
phylo_computeTime
.
_Just
markProgress
1
jobHandle
let
corpusId
=
fromMaybe
(
panicTrace
"no corpus id"
)
corpusId'
phy
<-
timeMeasured
"updateNode.flowPhyloAPI"
$
flowPhyloAPI
(
subConfigAPI2config
config
)
corpusId
phy
<-
timeMeasured
"updateNode.flowPhyloAPI"
$
flowPhyloAPI
(
subConfigAPI2config
config
)
mbComputeHistory
corpusId
markProgress
2
jobHandle
{-
...
...
src/Gargantext/Core/Viz/Phylo.hs
View file @
7b630704
...
...
@@ -23,16 +23,23 @@ one 8, e54847.
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE TypeApplications #-}
module
Gargantext.Core.Viz.Phylo
where
import
Control.Lens
(
over
)
import
Data.Swagger
import
Data.Text
(
pack
)
import
Data.Text.Lazy
qualified
as
TextLazy
import
Data.TreeDiff
(
ToExpr
)
import
Data.Text
(
pack
)
import
Data.TreeDiff
(
ToExpr
(
..
))
import
Data.Vector
(
Vector
)
import
Gargantext.Core.Utils.Prefix
(
unPrefix
,
unPrefixSwagger
)
import
Gargantext.Prelude
import
Gargantext.Utils.UTCTime
(
ElapsedSeconds
)
import
qualified
Data.Aeson.Types
as
JS
import
qualified
Data.List.NonEmpty
as
NE
import
Test.QuickCheck
import
Test.QuickCheck.Instances.Text
()
import
Test.QuickCheck.Instances.Vector
()
...
...
@@ -110,8 +117,6 @@ data Synchrony =
instance
ToSchema
Synchrony
where
declareNamedSchema
=
genericDeclareNamedSchema
(
unPrefixSwagger
"_"
)
data
TimeUnit
=
Epoch
{
_epoch_period
::
Int
...
...
@@ -425,7 +430,13 @@ type Period = (Date,Date)
type
PeriodStr
=
(
DateStr
,
DateStr
)
newtype
ComputeTimeHistory
=
ComputeTimeHistory
(
NonEmpty
ElapsedSeconds
)
deriving
stock
(
Show
,
Eq
,
Generic
)
deriving
newtype
ToExpr
instance
ToSchema
ComputeTimeHistory
where
declareNamedSchema
_
=
declareNamedSchema
(
Proxy
@
[
ElapsedSeconds
])
-- | Phylo datatype of a phylomemy
-- foundations : the foundations of the phylo
...
...
@@ -442,6 +453,12 @@ data Phylo =
,
_phylo_periods
::
Map
Period
PhyloPeriod
,
_phylo_quality
::
Double
,
_phylo_level
::
Double
-- See #409, store historical data on
-- how many seconds it took to generate
-- a given phylomemy graph, to give a rough
-- estimate to end users. The field is optional
-- to make it backward compatible.
,
_phylo_computeTime
::
!
(
Maybe
ComputeTimeHistory
)
}
deriving
(
Generic
,
Show
,
Eq
,
ToExpr
)
...
...
@@ -685,6 +702,15 @@ instance ToJSON Software
instance
FromJSON
PhyloGroup
instance
ToJSON
PhyloGroup
instance
ToJSON
ComputeTimeHistory
where
toJSON
=
\
case
ComputeTimeHistory
runs
->
toJSON
runs
instance
FromJSON
ComputeTimeHistory
where
parseJSON
(
JS
.
Array
runs
)
=
ComputeTimeHistory
<$>
parseJSON
(
JS
.
Array
runs
)
parseJSON
ty
=
JS
.
typeMismatch
"ComputeTimeHistory"
ty
$
(
deriveJSON
(
unPrefix
"_foundations_"
)
''
P
hyloFoundations
)
instance
FromJSON
Phylo
...
...
@@ -708,6 +734,7 @@ instance NFData PhyloParam
instance
NFData
PhyloFoundations
instance
NFData
PhyloCounts
instance
NFData
PhyloSources
instance
NFData
ComputeTimeHistory
instance
NFData
Phylo
instance
NFData
PhyloPeriod
instance
NFData
PhyloScale
...
...
@@ -798,3 +825,36 @@ instance Arbitrary Filter where
instance
Arbitrary
PhyloParam
where
arbitrary
=
pure
defaultPhyloParam
instance
Arbitrary
ComputeTimeHistory
where
arbitrary
=
oneof
[
ComputeTimeHistory
.
NE
.
fromList
.
getNonEmpty
<$>
arbitrary
]
-- The 'resize' ensure our tests won't take too long as
-- we won't be generating very long lists.
instance
Arbitrary
Phylo
where
arbitrary
=
Phylo
<$>
resize
6
arbitrary
<*>
resize
6
arbitrary
<*>
resize
6
arbitrary
<*>
resize
6
arbitrary
<*>
resize
6
arbitrary
<*>
resize
6
arbitrary
<*>
resize
6
arbitrary
<*>
resize
6
arbitrary
<*>
resize
6
arbitrary
--
-- Functions that uses the lenses
--
-- | Adds the input 'ElapsedSeconds' to the 'Philo', in the 'ComputeTimeHistory'.
trackComputeTime
::
ElapsedSeconds
->
Phylo
->
Phylo
trackComputeTime
elapsedSecs
=
over
phylo_computeTime
update_time
where
-- In case we have more than one historical data available, we take only the last 5
-- runs, to not make the list unbounded.
update_time
::
Maybe
ComputeTimeHistory
->
Maybe
ComputeTimeHistory
update_time
Nothing
=
Just
$
ComputeTimeHistory
(
NE
.
singleton
elapsedSecs
)
update_time
(
Just
(
ComputeTimeHistory
(
r
NE
.:|
runs
)))
=
Just
$
ComputeTimeHistory
(
elapsedSecs
NE
.:|
(
r
:
take
3
runs
))
src/Gargantext/Core/Viz/Phylo/API.hs
View file @
7b630704
...
...
@@ -101,7 +101,9 @@ postPhylo phyloId = Named.PostPhylo $ \_lId -> do
-- _sft = Just (Software "Gargantext" "4")
-- _prm = initPhyloParam vrs sft (Just q)
corpusId
<-
getClosestParentIdByType
phyloId
NodeCorpus
phy
<-
flowPhyloAPI
defaultConfig
(
fromMaybe
(
panicTrace
"[G.C.V.P.API] no corpus ID found"
)
corpusId
)
-- params
-- Being the first time we ask for the Phylo, there is no historical data
-- available about computing time, so we pass 'Nothing'.
phy
<-
flowPhyloAPI
defaultConfig
Nothing
(
fromMaybe
(
panicTrace
"[G.C.V.P.API] no corpus ID found"
)
corpusId
)
-- params
-- phyloId <- insertNodes [node NodePhylo "Phylo" (HyperdataPhylo Nothing (Just phy)) (Just corpusId) userId]
_
<-
updateHyperdata
phyloId
(
HyperdataPhylo
Nothing
(
Just
phy
))
pure
phyloId
...
...
src/Gargantext/Core/Viz/Phylo/API/Tools.hs
View file @
7b630704
...
...
@@ -33,7 +33,7 @@ import Gargantext.Core.NodeStory.Types (HasNodeStory)
import
Gargantext.Core.Text.Ngrams
(
NgramsType
(
..
))
import
Gargantext.Core.Text.Terms.WithList
(
Patterns
,
buildPatterns
,
termsInText
)
import
Gargantext.Core.Types.Main
(
ListType
(
MapTerm
))
import
Gargantext.Core.Viz.Phylo
(
TimeUnit
(
..
),
Date
,
Document
(
..
),
PhyloConfig
(
..
),
Phylo
)
import
Gargantext.Core.Viz.Phylo
(
TimeUnit
(
..
),
Date
,
Document
(
..
),
PhyloConfig
(
..
),
Phylo
(
_phylo_computeTime
),
trackComputeTime
,
ComputeTimeHistory
)
import
Gargantext.Core.Viz.Phylo.PhyloExport
(
toPhyloExport
,
dotToFile
)
import
Gargantext.Core.Viz.Phylo.PhyloMaker
(
toPhylo
,
toPhyloWithoutLink
)
import
Gargantext.Core.Viz.Phylo.PhyloTools
(
{-printIOMsg, printIOComment,-}
setConfig
)
...
...
@@ -49,7 +49,7 @@ import Gargantext.Database.Schema.Context ( ContextPoly(_context_hyperdata, _con
import
Gargantext.Database.Schema.Node
(
NodePoly
(
_node_hyperdata
),
node_hyperdata
)
import
Gargantext.Prelude
hiding
(
to
)
import
Gargantext.System.Logging
(
MonadLogger
,
LogLevel
(
DEBUG
),
logLocM
)
import
Gargantext.Utils.UTCTime
(
timeMeasured
)
import
Gargantext.Utils.UTCTime
(
timeMeasured
,
timeMeasured''
)
import
Prelude
qualified
import
System.FilePath
((
</>
))
import
System.IO.Temp
(
withTempDirectory
)
...
...
@@ -111,19 +111,23 @@ phylo2dot phylo = do
flowPhyloAPI
::
(
HasNodeStory
env
err
m
,
HasNodeError
err
,
MonadLogger
m
)
=>
PhyloConfig
->
CorpusId
->
m
Phylo
flowPhyloAPI
config
cId
=
do
corpus
<-
corpusIdtoDocuments
(
timeUnit
config
)
cId
let
!
phyloWithCliques
=
toPhyloWithoutLink
corpus
config
=>
PhyloConfig
->
Maybe
ComputeTimeHistory
-- ^ Previous compute time historical data, if any.
->
CorpusId
->
m
Phylo
flowPhyloAPI
config
mbOldComputeHistory
cId
=
do
corpus
<-
timeMeasured
"flowPhyloAPI.corpusIdtoDocuments"
$
corpusIdtoDocuments
(
timeUnit
config
)
cId
-- writePhylo phyloWithCliquesFile phyloWithCliques
$
(
logLocM
)
DEBUG
$
"PhyloConfig old: "
<>
show
config
_
<-
timeMeasured
"flowPhyloAPI.phyloWithCliques"
(
pure
$!
phyloWithCliques
)
(
t1
,
phyloWithCliques
)
<-
timeMeasured''
DEBUG
"flowPhyloAPI.phyloWithCliques"
(
pure
$!
toPhyloWithoutLink
corpus
config
)
(
t2
,
phyloConfigured
)
<-
timeMeasured''
DEBUG
"flowPhyloAPI.phyloConfigured"
(
pure
$!
setConfig
config
phyloWithCliques
)
(
t3
,
finalPhylo
)
<-
timeMeasured''
DEBUG
"flowPhyloAPI.toPhylo"
(
pure
$!
toPhylo
phyloConfigured
)
let
!
phyloConfigured
=
setConfig
config
phyloWithCliques
_
<-
timeMeasured
"flowPhyloAPI.phyloConfigured"
(
pure
$!
phyloConfigured
)
pure
$!
toPhylo
phyloConfigured
-- As the phylo is computed fresh every time, without looking at the one stored (if any), we
-- have to manually propagate computing time across.
pure
$!
trackComputeTime
(
t1
+
t2
+
t3
)
(
finalPhylo
{
_phylo_computeTime
=
mbOldComputeHistory
})
--------------------------------------------------------------------
corpusIdtoDocuments
::
(
HasNodeStory
env
err
m
,
HasNodeError
err
)
...
...
src/Gargantext/Core/Viz/Phylo/PhyloMaker.hs
View file @
7b630704
...
...
@@ -551,3 +551,4 @@ initPhylo docs conf =
(
fromList
$
map
(
\
prd
->
(
prd
,
PhyloPeriod
prd
(
""
,
""
)
(
initPhyloScales
1
prd
)))
periods
)
0
(
_qua_granularity
$
phyloQuality
$
_phyloParam_config
params
)
Nothing
src/Gargantext/Utils/UTCTime.hs
View file @
7b630704
...
...
@@ -12,20 +12,25 @@ Portability : POSIX
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE TypeApplications #-}
module
Gargantext.Utils.UTCTime
where
import
Data.Fixed
(
Fixed
(
..
))
import
Data.Morpheus.Kind
(
SCALAR
)
import
Data.Morpheus.Types
(
GQLType
(
..
),
DecodeScalar
(
..
),
EncodeScalar
(
..
))
import
Data.Morpheus.Types
qualified
as
DMT
import
Data.String
(
fromString
)
import
Data.Swagger
(
ToSchema
)
import
Data.Swagger
(
ToSchema
(
..
)
)
import
Data.Text
qualified
as
T
import
Data.Time
(
UTCTime
)
import
Data.Time.Clock.POSIX
(
getPOSIXTime
)
import
Data.Time.Clock.POSIX
(
getPOSIXTime
,
POSIXTime
)
import
Data.Time
(
UTCTime
,
nominalDiffTimeToSeconds
)
import
Data.TreeDiff.Class
import
Gargantext.Prelude
import
Gargantext.System.Logging
import
Prelude
(
String
)
import
Test.QuickCheck
hiding
(
label
)
newtype
NUTCTime
=
NUTCTime
UTCTime
...
...
@@ -43,6 +48,23 @@ instance FromJSON NUTCTime
instance
ToJSON
NUTCTime
instance
ToSchema
NUTCTime
newtype
ElapsedSeconds
=
ElapsedSeconds
{
_Seconds
::
POSIXTime
}
deriving
stock
(
Show
,
Eq
,
Generic
)
deriving
newtype
(
FromJSON
,
ToJSON
,
Num
)
instance
NFData
ElapsedSeconds
instance
ToExpr
ElapsedSeconds
where
toExpr
(
ElapsedSeconds
x
)
=
let
(
MkFixed
secs
)
=
nominalDiffTimeToSeconds
x
in
toExpr
secs
instance
ToSchema
ElapsedSeconds
where
declareNamedSchema
_
=
declareNamedSchema
(
Proxy
@
Int
)
instance
Arbitrary
ElapsedSeconds
where
arbitrary
=
ElapsedSeconds
.
fromInteger
.
getPositive
<$>
arbitrary
timeMeasured
::
(
MonadLogger
m
,
MonadBase
IO
m
,
HasCallStack
)
=>
String
-- ^ A label
...
...
@@ -51,18 +73,31 @@ timeMeasured :: (MonadLogger m, MonadBase IO m, HasCallStack)
->
m
a
timeMeasured
=
withFrozenCallStack
$
timeMeasured'
DEBUG
timeMeasured'
::
(
MonadLogger
m
,
MonadBase
IO
m
,
HasCallStack
)
-- | A version of timeMeasured that also returns the elapsed time, in seconds.
timeMeasured''
::
(
MonadLogger
m
,
MonadBase
IO
m
,
HasCallStack
)
=>
LogLevel
-- ^ The severity of the log
->
String
-- ^ A label to identify the action.
->
m
a
-- ^ The action to run
->
m
a
timeMeasured'
severity
label
action
=
withFrozenCallStack
$
do
->
m
(
ElapsedSeconds
,
a
)
timeMeasured'
'
severity
label
action
=
withFrozenCallStack
$
do
startTime
<-
liftBase
getPOSIXTime
res
<-
action
endTime
<-
liftBase
getPOSIXTime
let
msg
=
label
<>
" took "
<>
(
show
$
endTime
-
startTime
)
<>
" seconds to execute."
let
finalTime
=
endTime
-
startTime
let
msg
=
label
<>
" took "
<>
(
show
finalTime
)
<>
" seconds to execute."
$
(
logLocM
)
severity
(
fromString
msg
)
return
res
pure
(
ElapsedSeconds
finalTime
,
res
)
timeMeasured'
::
(
MonadLogger
m
,
MonadBase
IO
m
,
HasCallStack
)
=>
LogLevel
-- ^ The severity of the log
->
String
-- ^ A label to identify the action.
->
m
a
-- ^ The action to run
->
m
a
timeMeasured'
severity
label
action
=
withFrozenCallStack
$
snd
<$>
timeMeasured''
severity
label
action
test-data/phylo/187481.json
View file @
7b630704
{
"_phylo_computeTime": null,
"_phylo_counts": {
"coocByDate": {
"2006": [
test-data/phylo/cleopatre.golden.json
View file @
7b630704
{
"_phylo_computeTime"
:
null
,
"_phylo_counts"
:
{
"coocByDate"
:
{
"1"
:
[
...
...
test-data/phylo/nadal.golden.json
View file @
7b630704
{
"_phylo_computeTime": null,
"_phylo_counts": {
"coocByDate": {
"1000": [],
test/Test/Offline/JSON.hs
View file @
7b630704
...
...
@@ -6,14 +6,15 @@
module
Test.Offline.JSON
(
tests
)
where
import
Data.Aeson
import
Data.ByteString
qualified
as
B
import
Data.ByteString.Lazy.Char8
qualified
as
C8
import
Data.ByteString
qualified
as
B
import
Data.Either
import
Gargantext.API.Errors
import
Gargantext.API.Node.Corpus.Types
import
Gargantext.API.Node.Types
import
Gargantext.API.Viz.Types
import
Gargantext.Core.Types.Phylo
import
qualified
Gargantext.Core.Viz.Phylo
as
VizPhylo
import
Gargantext.Database.Admin.Types.Node
import
Paths_gargantext
import
Prelude
...
...
@@ -62,6 +63,8 @@ tests = testGroup "JSON" [
,
testProperty
"GraphDataData"
(
jsonRoundtrip
@
GraphDataData
)
,
testProperty
"ObjectData"
(
jsonRoundtrip
@
ObjectData
)
,
testProperty
"PhyloData"
(
jsonRoundtrip
@
PhyloData
)
,
testProperty
"ComputeTimeHistory"
(
jsonRoundtrip
@
VizPhylo
.
ComputeTimeHistory
)
,
testProperty
"Phylo"
(
jsonRoundtrip
@
VizPhylo
.
Phylo
)
,
testProperty
"LayerData"
(
jsonRoundtrip
@
LayerData
)
,
testCase
"can parse bpa_phylo_test.json"
testParseBpaPhylo
,
testCase
"can parse open_science.json"
testOpenSciencePhylo
...
...
Przemyslaw Kaminski
@cgenie
mentioned in commit
83c8708f
·
Nov 07, 2024
mentioned in commit
83c8708f
mentioned in commit 83c8708f08e563243a0ff361e51a46c7d7822bb7
Toggle commit list
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment