2 Module : Gargantext.Database.Schema.Node
3 Description : Main requests of Node to the database
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
11 {-# OPTIONS_GHC -fno-warn-name-shadowing #-}
12 {-# OPTIONS_GHC -fno-warn-orphans #-}
14 {-# LANGUAGE Arrows #-}
15 {-# LANGUAGE DeriveGeneric #-}
16 {-# LANGUAGE ConstraintKinds #-}
17 {-# LANGUAGE FlexibleContexts #-}
18 {-# LANGUAGE FlexibleInstances #-}
19 {-# LANGUAGE FunctionalDependencies #-}
20 {-# LANGUAGE OverloadedStrings #-}
21 {-# LANGUAGE MultiParamTypeClasses #-}
22 {-# LANGUAGE NoImplicitPrelude #-}
23 {-# LANGUAGE RankNTypes #-}
24 {-# LANGUAGE TemplateHaskell #-}
25 {-# LANGUAGE TypeFamilies #-}
27 module Gargantext.Database.Schema.Node where
29 import Control.Arrow (returnA)
30 import Control.Lens (set, view)
31 import Control.Lens.TH (makeLensesWith, abbreviatedFields)
33 import Data.Maybe (Maybe(..), fromMaybe)
34 import Data.Profunctor.Product.TH (makeAdaptorAndInstance)
35 import Data.Text (Text)
36 import Database.PostgreSQL.Simple.FromField (FromField, fromField)
37 import GHC.Int (Int64)
38 import Gargantext.Core.Types
39 import Gargantext.Core.Types.Individu (User(..))
40 import Gargantext.Database.Action.Query.Filter (limit', offset')
41 import Gargantext.Database.Action.Query.Node.Contact (HyperdataContact(..), arbitraryHyperdataContact)
42 import Gargantext.Database.Admin.Config (nodeTypeId)
43 import Gargantext.Database.Admin.Types.Errors
44 import Gargantext.Database.Admin.Types.Node (NodeType(..), defaultCorpus, Hyperdata, HyperData(..))
45 import Gargantext.Database.Admin.Utils
46 import Gargantext.Prelude hiding (sum, head)
47 import Gargantext.Viz.Graph (HyperdataGraph(..))
48 import Opaleye hiding (FromField)
49 import Opaleye.Internal.QueryArr (Query)
50 import Prelude hiding (null, id, map, sum)
52 ------------------------------------------------------------------------
53 instance FromField HyperdataAny where
54 fromField = fromField'
56 instance FromField HyperdataCorpus
58 fromField = fromField'
60 instance FromField HyperdataDocument
62 fromField = fromField'
64 instance FromField HyperdataDocumentV3
66 fromField = fromField'
68 instance FromField HyperData
70 fromField = fromField'
72 instance FromField HyperdataListModel
74 fromField = fromField'
76 instance FromField HyperdataGraph
78 fromField = fromField'
80 instance FromField HyperdataPhylo
82 fromField = fromField'
84 instance FromField HyperdataAnnuaire
86 fromField = fromField'
88 instance FromField HyperdataList
90 fromField = fromField'
92 instance FromField (NodeId, Text)
94 fromField = fromField'
95 ------------------------------------------------------------------------
96 instance QueryRunnerColumnDefault PGJsonb HyperdataAny
98 queryRunnerColumnDefault = fieldQueryRunnerColumn
100 instance QueryRunnerColumnDefault PGJsonb HyperdataList
102 queryRunnerColumnDefault = fieldQueryRunnerColumn
104 instance QueryRunnerColumnDefault PGJsonb HyperData
106 queryRunnerColumnDefault = fieldQueryRunnerColumn
109 instance QueryRunnerColumnDefault PGJsonb HyperdataDocument
111 queryRunnerColumnDefault = fieldQueryRunnerColumn
113 instance QueryRunnerColumnDefault PGJsonb HyperdataDocumentV3
115 queryRunnerColumnDefault = fieldQueryRunnerColumn
117 instance QueryRunnerColumnDefault PGJsonb HyperdataCorpus
119 queryRunnerColumnDefault = fieldQueryRunnerColumn
121 instance QueryRunnerColumnDefault PGJsonb HyperdataListModel
123 queryRunnerColumnDefault = fieldQueryRunnerColumn
125 instance QueryRunnerColumnDefault PGJsonb HyperdataGraph
127 queryRunnerColumnDefault = fieldQueryRunnerColumn
129 instance QueryRunnerColumnDefault PGJsonb HyperdataPhylo
131 queryRunnerColumnDefault = fieldQueryRunnerColumn
133 instance QueryRunnerColumnDefault PGJsonb HyperdataAnnuaire
135 queryRunnerColumnDefault = fieldQueryRunnerColumn
137 instance QueryRunnerColumnDefault PGTSVector (Maybe TSVector)
139 queryRunnerColumnDefault = fieldQueryRunnerColumn
141 instance QueryRunnerColumnDefault PGInt4 (Maybe NodeId)
143 queryRunnerColumnDefault = fieldQueryRunnerColumn
145 instance QueryRunnerColumnDefault PGInt4 NodeId
147 queryRunnerColumnDefault = fieldQueryRunnerColumn
149 instance QueryRunnerColumnDefault (Nullable PGInt4) NodeId
151 queryRunnerColumnDefault = fieldQueryRunnerColumn
154 ------------------------------------------------------------------------
155 $(makeAdaptorAndInstance "pNode" ''NodePoly)
156 $(makeLensesWith abbreviatedFields ''NodePoly)
158 $(makeAdaptorAndInstance "pNodeSearch" ''NodePolySearch)
159 $(makeLensesWith abbreviatedFields ''NodePolySearch)
161 type NodeWrite = NodePoly (Maybe (Column PGInt4) )
164 (Maybe (Column PGInt4) )
166 (Maybe (Column PGTimestamptz))
169 type NodeRead = NodePoly (Column PGInt4 )
174 (Column PGTimestamptz )
177 type NodeReadNull = NodePoly (Column (Nullable PGInt4))
178 (Column (Nullable PGInt4))
179 (Column (Nullable PGInt4))
180 (Column (Nullable PGInt4))
181 (Column (Nullable PGText))
182 (Column (Nullable PGTimestamptz))
183 (Column (Nullable PGJsonb))
185 nodeTable :: Table NodeWrite NodeRead
186 nodeTable = Table "nodes" (pNode Node { _node_id = optional "id"
187 , _node_typename = required "typename"
188 , _node_userId = required "user_id"
190 , _node_parentId = optional "parent_id"
191 , _node_name = required "name"
192 , _node_date = optional "date"
194 , _node_hyperdata = required "hyperdata"
198 queryNodeTable :: Query NodeRead
199 queryNodeTable = queryTable nodeTable
201 ------------------------------------------------------------------------
202 -- | Node(Read|Write)Search is slower than Node(Write|Read) use it
203 -- for full text search only
204 type NodeSearchWrite =
206 (Maybe (Column PGInt4) )
209 (Column (Nullable PGInt4) )
211 (Maybe (Column PGTimestamptz))
213 (Maybe (Column PGTSVector) )
215 type NodeSearchRead =
220 (Column (Nullable PGInt4 ))
222 (Column PGTimestamptz )
226 type NodeSearchReadNull =
228 (Column (Nullable PGInt4) )
229 (Column (Nullable PGInt4) )
230 (Column (Nullable PGInt4) )
231 (Column (Nullable PGInt4) )
232 (Column (Nullable PGText) )
233 (Column (Nullable PGTimestamptz))
234 (Column (Nullable PGJsonb) )
235 (Column (Nullable PGTSVector) )
237 nodeTableSearch :: Table NodeSearchWrite NodeSearchRead
238 nodeTableSearch = Table "nodes" (pNodeSearch NodeSearch { _ns_id = optional "id"
239 , _ns_typename = required "typename"
240 , _ns_userId = required "user_id"
242 , _ns_parentId = required "parent_id"
243 , _ns_name = required "name"
244 , _ns_date = optional "date"
246 , _ns_hyperdata = required "hyperdata"
247 , _ns_search = optional "search"