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
200
Issues
200
List
Board
Labels
Milestones
Merge Requests
12
Merge Requests
12
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
db8df6bb
Commit
db8df6bb
authored
Jan 07, 2019
by
Alexandre Delanoë
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'dev-ngrams-table' into dev
parents
827fbaf9
854cc11f
Pipeline
#99
failed with stage
Changes
3
Pipelines
1
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
80 additions
and
60 deletions
+80
-60
Ngrams.hs
src/Gargantext/API/Ngrams.hs
+56
-54
NodeNgram.hs
src/Gargantext/Database/Schema/NodeNgram.hs
+18
-2
NodeNgramsNgrams.hs
src/Gargantext/Database/Schema/NodeNgramsNgrams.hs
+6
-4
No files found.
src/Gargantext/API/Ngrams.hs
View file @
db8df6bb
...
...
@@ -10,10 +10,6 @@ Portability : POSIX
Ngrams API
-- | TODO
-- get data of NgramsTable
-- post :: update NodeNodeNgrams
-- group ngrams
get ngrams filtered by NgramsType
add get
...
...
@@ -37,7 +33,7 @@ module Gargantext.API.Ngrams
import
Prelude
(
round
)
-- import Gargantext.Database.Schema.User (UserId)
import
Data.Functor
((
$>
))
import
Data.Patch.Class
(
Replace
,
replace
)
import
Data.Patch.Class
(
Replace
,
replace
,
new
)
--import qualified Data.Map.Strict.Patch as PM
import
Data.Monoid
--import Data.Semigroup
...
...
@@ -47,25 +43,26 @@ import qualified Data.Set as Set
-- import qualified Data.Map.Strict as DM
import
Data.Map.Strict
(
Map
)
--import qualified Data.Set as Set
import
Control.Lens
(
Prism
'
,
prism'
,
(
.~
),
(
#
)
)
import
Control.Monad
(
guard
)
import
Control.Lens
(
makeLenses
,
Prism
'
,
prism'
,
(
^..
),
(
.~
),
(
#
),
to
,
withIndex
,
folded
,
ifolded
)
import
Control.Monad
(
guard
,
void
)
import
Control.Monad.Error.Class
(
MonadError
,
throwError
)
import
Data.Aeson
import
Data.Aeson.TH
(
deriveJSON
)
import
Data.Either
(
Either
(
Left
))
import
Data.Map
(
lookup
)
import
qualified
Data.HashMap.Strict.InsOrd
as
InsOrdHashMap
import
Data.Swagger
hiding
(
version
)
import
Data.Swagger
hiding
(
version
,
patch
)
import
Data.Text
(
Text
)
import
GHC.Generics
(
Generic
)
--import Gargantext.Core.Types.Main (Tree(..))
import
Gargantext.Core.Utils.Prefix
(
unPrefix
)
import
Gargantext.Database.Types.Node
(
NodeType
(
..
))
import
Gargantext.Database.Schema.Node
(
defaultList
,
HasNodeError
)
import
qualified
Gargantext.Database.Schema.Ngrams
as
Ngrams
import
Gargantext.Database.Schema.NodeNgram
import
Gargantext.Database.Schema.NodeNgramsNgrams
import
Gargantext.Database.Utils
(
Cmd
)
import
Gargantext.Prelude
import
Gargantext.Core.Types
(
ListType
(
..
),
List
Id
,
CorpusId
,
Limit
,
Offset
)
import
Gargantext.Core.Types
(
ListType
(
..
),
List
TypeId
,
ListId
,
CorpusId
,
Limit
,
Offset
,
listTypeId
)
import
Prelude
(
Enum
,
Bounded
,
minBound
,
maxBound
)
import
Servant
hiding
(
Patch
)
import
Test.QuickCheck
(
elements
)
...
...
@@ -109,7 +106,9 @@ data NgramsElement =
,
_ne_children
::
Set
NgramsTerm
}
deriving
(
Ord
,
Eq
,
Show
,
Generic
)
$
(
deriveJSON
(
unPrefix
"_ne_"
)
''
N
gramsElement
)
deriveJSON
(
unPrefix
"_ne_"
)
''
N
gramsElement
makeLenses
''
N
gramsElement
instance
ToSchema
NgramsElement
instance
Arbitrary
NgramsElement
where
...
...
@@ -179,7 +178,8 @@ data NgramsPatch =
,
_patch_list
::
Replace
ListType
-- TODO Map UserId ListType
}
deriving
(
Ord
,
Eq
,
Show
,
Generic
)
$
(
deriveJSON
(
unPrefix
"_"
)
''
N
gramsPatch
)
deriveJSON
(
unPrefix
"_"
)
''
N
gramsPatch
makeLenses
''
N
gramsPatch
-- instance Semigroup NgramsPatch where
...
...
@@ -188,13 +188,10 @@ instance ToSchema NgramsPatch
instance
Arbitrary
NgramsPatch
where
arbitrary
=
NgramsPatch
<$>
arbitrary
<*>
(
replace
<$>
arbitrary
<*>
arbitrary
)
-- TODO:
-- * This should be a Map NgramsId NgramsPatch
-- * Patchs -> Patches
newtype
NgramsTablePatch
=
NgramsTablePatch
{
_n
ip_ngramsIdPatch
s
::
Map
NgramsTerm
NgramsPatch
}
deriving
(
Ord
,
Eq
,
Show
,
Generic
,
Arbitrary
)
$
(
deriveJSON
(
unPrefix
"_nip_"
)
''
N
gramsTablePatch
)
NgramsTablePatch
{
_n
tp_ngrams_patche
s
::
Map
NgramsTerm
NgramsPatch
}
deriving
(
Ord
,
Eq
,
Show
,
Generic
,
Arbitrary
,
ToJSON
,
FromJSON
)
makeLenses
''
N
gramsTablePatch
instance
ToSchema
NgramsTablePatch
-- TODO: replace by mempty once we have the Monoid instance
...
...
@@ -209,6 +206,12 @@ data Versioned a = Versioned
{
_v_version
::
Version
,
_v_data
::
a
}
deriving
(
Generic
)
deriveJSON
(
unPrefix
"_v_"
)
''
V
ersioned
makeLenses
''
V
ersioned
instance
ToSchema
a
=>
ToSchema
(
Versioned
a
)
instance
Arbitrary
a
=>
Arbitrary
(
Versioned
a
)
where
arbitrary
=
Versioned
1
<$>
arbitrary
-- TODO 1 is constant so far
{-
-- TODO sequencs of modifications (Patchs)
...
...
@@ -237,12 +240,12 @@ type TableNgramsApiGet = Summary " Table Ngrams API Get"
:>
QueryParam
"list"
ListId
:>
QueryParam
"limit"
Limit
:>
QueryParam
"offset"
Offset
:>
Get
'[
J
SON
]
NgramsTable
:>
Get
'[
J
SON
]
(
Versioned
NgramsTable
)
type
TableNgramsApi
=
Summary
" Table Ngrams API Change"
:>
QueryParam
"list"
ListId
:>
ReqBody
'[
J
SON
]
NgramsTablePatch
--
(Versioned NgramsTablePatch)
:>
Put
'[
J
SON
]
NgramsTablePatch
--
(Versioned NgramsTablePatch)
:>
ReqBody
'[
J
SON
]
(
Versioned
NgramsTablePatch
)
:>
Put
'[
J
SON
]
(
Versioned
NgramsTablePatch
)
data
NgramError
=
UnsupportedVersion
deriving
(
Show
)
...
...
@@ -260,23 +263,26 @@ instance HasNgramError ServantErr where
ngramError
::
(
MonadError
e
m
,
HasNgramError
e
)
=>
NgramError
->
m
a
ngramError
nne
=
throwError
$
_NgramError
#
nne
{-
toLists :: ListId -> NgramsTablePatch -> [(ListId, NgramsId, ListTypeId)]
-- toLists = undefined
toLists lId np = [ (lId,ngId,listTypeId lt) | map (toList lId) (_nip_ngramsIdPatchs np) ]
toList :: ListId -> NgramsIdPatch -> (ListId, NgramsId, ListTypeId)
toList = undefined
toGroups :: ListId -> (NgramsPatch -> Set NgramsId) -> NgramsTablePatch -> [NodeNgramsNgrams]
toGroups lId addOrRem ps = concat $ map (toGroup lId addOrRem) $ _nip_ngramsIdPatchs ps
toGroup :: ListId -> (NgramsPatch -> Set NgramsId) -> NgramsIdPatch -> [NodeNgramsNgrams]
-- toGroup = undefined
toGroup lId addOrRem (NgramsIdPatch ngId patch) =
map (\ng -> (NodeNgramsNgrams lId ngId ng (Just 1))) (Set.toList $ addOrRem patch)
-- TODO: Replace.old is ignored which means that if the current list
-- `GraphList` and that the patch is `Replace CandidateList StopList` then
-- the list is going to be `StopList` while it should keep `GraphList`.
-- However this should not happen in non conflicting situations.
mkListsUpdate
::
ListId
->
NgramsTablePatch
->
[(
ListId
,
NgramsTerm
,
ListTypeId
)]
mkListsUpdate
lId
patches
=
[
(
lId
,
ng
,
listTypeId
lt
)
|
(
ng
,
patch
)
<-
patches
^..
ntp_ngrams_patches
.
ifolded
.
withIndex
,
lt
<-
patch
^..
patch_list
.
new
]
-}
mkChildrenGroups
::
ListId
->
(
PatchSet
NgramsElement
->
Set
NgramsElement
)
->
NgramsTablePatch
->
[(
ListId
,
NgramsParent
,
NgramsChild
,
Maybe
Double
)]
mkChildrenGroups
lId
addOrRem
patches
=
[
(
lId
,
parent
,
child
,
Just
1
)
|
(
parent
,
patch
)
<-
patches
^..
ntp_ngrams_patches
.
ifolded
.
withIndex
,
child
<-
patch
^..
patch_children
.
to
addOrRem
.
folded
.
ne_ngrams
]
-- Apply the given patch to the DB and returns the patch to be applied on the
-- cilent.
...
...
@@ -285,29 +291,24 @@ toGroup lId addOrRem (NgramsIdPatch ngId patch) =
-- number is always 1 and the returned patch is always empty.
tableNgramsPatch
::
(
HasNgramError
err
,
HasNodeError
err
)
=>
CorpusId
->
Maybe
ListId
-- -> Versioned NgramsTablePatch
-- -> Cmd err (Versioned NgramsTablePatch)
->
any
->
Cmd
err
any
tableNgramsPatch
_
_
_
=
undefined
{-
tableNgramsPatch corpusId maybeList (Versioned version _patch) = do
->
Versioned
NgramsTablePatch
->
Cmd
err
(
Versioned
NgramsTablePatch
)
tableNgramsPatch
corpusId
maybeList
(
Versioned
version
patch
)
=
do
when
(
version
/=
1
)
$
ngramError
UnsupportedVersion
_
listId <- maybe (defaultList corpusId) pure maybeList
{-
_ <- ngramsGroup' Add $ toGroups listId _np_add_children
patch
_ <- ngramsGroup' Del $ toGroups listId _np_rem_children
patch
_ <- updateNodeNgrams (toLists listId patch)
-
}
listId
<-
maybe
(
defaultList
corpusId
)
pure
maybeList
void
$
updateNodeNgrams
$
NodeNgramsUpdate
{
_nnu_lists_update
=
mkListsUpdate
listId
patch
,
_nnu_rem_children
=
mkChildrenGroups
listId
_rem
patch
,
_nnu_add_children
=
mkChildrenGroups
listId
_add
patch
}
pure
$
Versioned
1
emptyNgramsTablePatch
-}
-- | TODO Errors management
-- TODO: polymorphic for Annuaire or Corpus or ...
getTableNgrams
::
HasNodeError
err
=>
CorpusId
->
Maybe
TabType
->
Maybe
ListId
->
Maybe
Limit
->
Maybe
Offset
->
Cmd
err
NgramsTable
->
Cmd
err
(
Versioned
NgramsTable
)
getTableNgrams
cId
maybeTabType
maybeListId
mlimit
moffset
=
do
let
lieu
=
"Garg.API.Ngrams: "
::
Text
let
ngramsType
=
case
maybeTabType
of
...
...
@@ -331,7 +332,8 @@ getTableNgrams cId maybeTabType maybeListId mlimit moffset = do
-- printDebug "ngramsTableDatas" ngramsTableDatas
pure
$
NgramsTable
$
map
(
\
(
Ngrams
.
NgramsTableData
ngs
_
lt
w
)
->
pure
$
Versioned
1
$
NgramsTable
$
map
(
\
(
Ngrams
.
NgramsTableData
ngs
_
lt
w
)
->
NgramsElement
ngs
(
maybe
(
panic
$
lieu
<>
"listType"
)
identity
lt
)
(
round
w
)
...
...
src/Gargantext/Database/Schema/NodeNgram.hs
View file @
db8df6bb
...
...
@@ -37,6 +37,7 @@ import Database.PostgreSQL.Simple.Types (Values(..), QualifiedIdentifier(..))
import
Database.PostgreSQL.Simple.SqlQQ
(
sql
)
import
Gargantext.Core.Types.Main
(
ListId
,
ListTypeId
)
import
Gargantext.Database.Utils
(
mkCmd
,
Cmd
,
runPGSQuery
)
import
Gargantext.Database.Schema.NodeNgramsNgrams
import
Gargantext.Prelude
import
Opaleye
import
qualified
Database.PostgreSQL.Simple
as
PGS
(
Only
(
..
))
...
...
@@ -114,8 +115,10 @@ insertNodeNgramW nns =
type
NgramsText
=
Text
updateNodeNgrams
::
[(
ListId
,
NgramsText
,
ListTypeId
)]
->
Cmd
err
[
PGS
.
Only
Int
]
updateNodeNgrams
input
=
runPGSQuery
updateQuery
(
PGS
.
Only
$
Values
fields
$
input
)
updateNodeNgrams'
::
[(
ListId
,
NgramsText
,
ListTypeId
)]
->
Cmd
err
[
Int
]
updateNodeNgrams'
[]
=
pure
[]
updateNodeNgrams'
input
=
map
(
\
(
PGS
.
Only
a
)
->
a
)
<$>
runPGSQuery
updateQuery
(
PGS
.
Only
$
Values
fields
$
input
)
where
fields
=
map
(
\
t
->
QualifiedIdentifier
Nothing
t
)
[
"int4"
,
"text"
,
"int4"
]
updateQuery
=
[
sql
|
UPDATE nodes_ngrams as old SET
...
...
@@ -127,3 +130,16 @@ updateNodeNgrams input = runPGSQuery updateQuery (PGS.Only $ Values fields $ inp
-- RETURNING new.ngram_id
|]
data
NodeNgramsUpdate
=
NodeNgramsUpdate
{
_nnu_lists_update
::
[(
ListId
,
NgramsText
,
ListTypeId
)]
,
_nnu_add_children
::
[(
ListId
,
NgramsParent
,
NgramsChild
,
Maybe
Double
)]
,
_nnu_rem_children
::
[(
ListId
,
NgramsParent
,
NgramsChild
,
Maybe
Double
)]
}
-- TODO wrap these updates in a transaction.
updateNodeNgrams
::
NodeNgramsUpdate
->
Cmd
err
[
Int
]
updateNodeNgrams
nnu
=
do
xs
<-
updateNodeNgrams'
$
_nnu_lists_update
nnu
ys
<-
ngramsGroup
Del
$
_nnu_rem_children
nnu
zs
<-
ngramsGroup
Add
$
_nnu_add_children
nnu
pure
$
xs
<>
ys
<>
zs
src/Gargantext/Database/Schema/NodeNgramsNgrams.hs
View file @
db8df6bb
...
...
@@ -41,6 +41,7 @@ import Data.Profunctor.Product.TH (makeAdaptorAndInstance)
import
Database.PostgreSQL.Simple.SqlQQ
(
sql
)
import
Database.PostgreSQL.Simple.Types
(
Values
(
..
),
QualifiedIdentifier
(
..
))
import
Gargantext.Database.Utils
(
Cmd
,
runOpaQuery
,
runPGSQuery
,
connection
)
import
Gargantext.Core.Types.Main
(
ListId
)
import
Gargantext.Prelude
import
Opaleye
import
qualified
Database.PostgreSQL.Simple
as
PGS
...
...
@@ -52,7 +53,6 @@ data NodeNgramsNgramsPoly node_id ngram1_id ngram2_id weight =
,
_nng_Weight
::
weight
}
deriving
(
Show
)
type
NodeNgramsNgramsWrite
=
NodeNgramsNgramsPoly
(
Column
PGInt4
)
(
Column
PGInt4
)
...
...
@@ -124,16 +124,18 @@ data Action = Del | Add
type
NgramsParent
=
Text
type
NgramsChild
=
Text
ngramsGroup'
::
Action
->
[(
Int
,
NgramsParent
,
NgramsChild
,
Maybe
Double
)]
ngramsGroup
::
Action
->
[(
ListId
,
NgramsParent
,
NgramsChild
,
Maybe
Double
)]
->
Cmd
err
[
Int
]
ngramsGroup'
action
ngs
=
runNodeNgramsNgrams
q
ngs
ngramsGroup
_
[]
=
pure
[]
ngramsGroup
action
ngs
=
runNodeNgramsNgrams
q
ngs
where
q
=
case
action
of
Del
->
queryDelNodeNgramsNgrams
Add
->
queryInsertNodeNgramsNgrams
runNodeNgramsNgrams
::
PGS
.
Query
->
[(
Int
,
NgramsParent
,
NgramsChild
,
Maybe
Double
)]
->
Cmd
err
[
Int
]
runNodeNgramsNgrams
::
PGS
.
Query
->
[(
ListId
,
NgramsParent
,
NgramsChild
,
Maybe
Double
)]
->
Cmd
err
[
Int
]
runNodeNgramsNgrams
q
ngs
=
map
(
\
(
PGS
.
Only
a
)
->
a
)
<$>
runPGSQuery
q
(
PGS
.
Only
$
Values
fields
ngs'
)
where
ngs'
=
map
(
\
(
n
,
ng1
,
ng2
,
w
)
->
(
n
,
ng1
,
ng2
,
maybe
0
identity
w
))
ngs
...
...
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