]> Git — Sourcephile - gargantext.git/blob - src/Gargantext/Database/Schema/Node.hs
[FACTO/WIP] files org and import fix in Database/*
[gargantext.git] / src / Gargantext / Database / Schema / Node.hs
1 {-|
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
8 Portability : POSIX
9 -}
10
11 {-# OPTIONS_GHC -fno-warn-name-shadowing #-}
12 {-# OPTIONS_GHC -fno-warn-orphans #-}
13
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 #-}
26
27 module Gargantext.Database.Schema.Node where
28
29 import Control.Arrow (returnA)
30 import Control.Lens (set, view)
31 import Control.Lens.TH (makeLensesWith, abbreviatedFields)
32 import Data.Aeson
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)
51
52 ------------------------------------------------------------------------
53 instance FromField HyperdataAny where
54 fromField = fromField'
55
56 instance FromField HyperdataCorpus
57 where
58 fromField = fromField'
59
60 instance FromField HyperdataDocument
61 where
62 fromField = fromField'
63
64 instance FromField HyperdataDocumentV3
65 where
66 fromField = fromField'
67
68 instance FromField HyperData
69 where
70 fromField = fromField'
71
72 instance FromField HyperdataListModel
73 where
74 fromField = fromField'
75
76 instance FromField HyperdataGraph
77 where
78 fromField = fromField'
79
80 instance FromField HyperdataPhylo
81 where
82 fromField = fromField'
83
84 instance FromField HyperdataAnnuaire
85 where
86 fromField = fromField'
87
88 instance FromField HyperdataList
89 where
90 fromField = fromField'
91
92 instance FromField (NodeId, Text)
93 where
94 fromField = fromField'
95 ------------------------------------------------------------------------
96 instance QueryRunnerColumnDefault PGJsonb HyperdataAny
97 where
98 queryRunnerColumnDefault = fieldQueryRunnerColumn
99
100 instance QueryRunnerColumnDefault PGJsonb HyperdataList
101 where
102 queryRunnerColumnDefault = fieldQueryRunnerColumn
103
104 instance QueryRunnerColumnDefault PGJsonb HyperData
105 where
106 queryRunnerColumnDefault = fieldQueryRunnerColumn
107
108
109 instance QueryRunnerColumnDefault PGJsonb HyperdataDocument
110 where
111 queryRunnerColumnDefault = fieldQueryRunnerColumn
112
113 instance QueryRunnerColumnDefault PGJsonb HyperdataDocumentV3
114 where
115 queryRunnerColumnDefault = fieldQueryRunnerColumn
116
117 instance QueryRunnerColumnDefault PGJsonb HyperdataCorpus
118 where
119 queryRunnerColumnDefault = fieldQueryRunnerColumn
120
121 instance QueryRunnerColumnDefault PGJsonb HyperdataListModel
122 where
123 queryRunnerColumnDefault = fieldQueryRunnerColumn
124
125 instance QueryRunnerColumnDefault PGJsonb HyperdataGraph
126 where
127 queryRunnerColumnDefault = fieldQueryRunnerColumn
128
129 instance QueryRunnerColumnDefault PGJsonb HyperdataPhylo
130 where
131 queryRunnerColumnDefault = fieldQueryRunnerColumn
132
133 instance QueryRunnerColumnDefault PGJsonb HyperdataAnnuaire
134 where
135 queryRunnerColumnDefault = fieldQueryRunnerColumn
136
137 instance QueryRunnerColumnDefault PGTSVector (Maybe TSVector)
138 where
139 queryRunnerColumnDefault = fieldQueryRunnerColumn
140
141 instance QueryRunnerColumnDefault PGInt4 (Maybe NodeId)
142 where
143 queryRunnerColumnDefault = fieldQueryRunnerColumn
144
145 instance QueryRunnerColumnDefault PGInt4 NodeId
146 where
147 queryRunnerColumnDefault = fieldQueryRunnerColumn
148
149 instance QueryRunnerColumnDefault (Nullable PGInt4) NodeId
150 where
151 queryRunnerColumnDefault = fieldQueryRunnerColumn
152
153
154 ------------------------------------------------------------------------
155 $(makeAdaptorAndInstance "pNode" ''NodePoly)
156 $(makeLensesWith abbreviatedFields ''NodePoly)
157
158 $(makeAdaptorAndInstance "pNodeSearch" ''NodePolySearch)
159 $(makeLensesWith abbreviatedFields ''NodePolySearch)
160
161 type NodeWrite = NodePoly (Maybe (Column PGInt4) )
162 (Column PGInt4)
163 (Column PGInt4)
164 (Maybe (Column PGInt4) )
165 (Column PGText)
166 (Maybe (Column PGTimestamptz))
167 (Column PGJsonb)
168
169 type NodeRead = NodePoly (Column PGInt4 )
170 (Column PGInt4 )
171 (Column PGInt4 )
172 (Column PGInt4 )
173 (Column PGText )
174 (Column PGTimestamptz )
175 (Column PGJsonb )
176
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))
184
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"
189
190 , _node_parentId = optional "parent_id"
191 , _node_name = required "name"
192 , _node_date = optional "date"
193
194 , _node_hyperdata = required "hyperdata"
195 }
196 )
197
198 queryNodeTable :: Query NodeRead
199 queryNodeTable = queryTable nodeTable
200
201 ------------------------------------------------------------------------
202 -- | Node(Read|Write)Search is slower than Node(Write|Read) use it
203 -- for full text search only
204 type NodeSearchWrite =
205 NodePolySearch
206 (Maybe (Column PGInt4) )
207 (Column PGInt4 )
208 (Column PGInt4 )
209 (Column (Nullable PGInt4) )
210 (Column PGText )
211 (Maybe (Column PGTimestamptz))
212 (Column PGJsonb )
213 (Maybe (Column PGTSVector) )
214
215 type NodeSearchRead =
216 NodePolySearch
217 (Column PGInt4 )
218 (Column PGInt4 )
219 (Column PGInt4 )
220 (Column (Nullable PGInt4 ))
221 (Column PGText )
222 (Column PGTimestamptz )
223 (Column PGJsonb )
224 (Column PGTSVector )
225
226 type NodeSearchReadNull =
227 NodePolySearch
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) )
236
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"
241
242 , _ns_parentId = required "parent_id"
243 , _ns_name = required "name"
244 , _ns_date = optional "date"
245
246 , _ns_hyperdata = required "hyperdata"
247 , _ns_search = optional "search"
248 }
249 )
250
251