Commit 45283b1f authored by Alexandre Delanoë's avatar Alexandre Delanoë

[TYPES/Structure Database] Fixing the types for database interaction.

parent 73447a4d
...@@ -22,3 +22,5 @@ instance QueryRunnerColumnDefault PGInt4 (Maybe Int) where ...@@ -22,3 +22,5 @@ instance QueryRunnerColumnDefault PGInt4 (Maybe Int) where
instance QueryRunnerColumnDefault PGTimestamptz (Maybe UTCTime) where instance QueryRunnerColumnDefault PGTimestamptz (Maybe UTCTime) where
queryRunnerColumnDefault = fieldQueryRunnerColumn queryRunnerColumnDefault = fieldQueryRunnerColumn
...@@ -9,32 +9,38 @@ ...@@ -9,32 +9,38 @@
module Data.Gargantext.Database.Node where module Data.Gargantext.Database.Node where
import Database.PostgreSQL.Simple.FromField (Conversion, ResultError(ConversionFailed), FromField, fromField, returnError) import Database.PostgreSQL.Simple.FromField ( Conversion
import Database.PostgreSQL.Simple.Internal (Field) , ResultError(ConversionFailed)
, FromField
, fromField
, returnError
)
import Database.PostgreSQL.Simple.Internal (Field)
import Control.Arrow (returnA) import Control.Arrow (returnA)
import Control.Lens.TH (makeLensesWith, abbreviatedFields) import Control.Lens.TH (makeLensesWith, abbreviatedFields)
import Data.Aeson import Data.Aeson
import Data.Gargantext.Database.Private (infoGargandb) import Data.Gargantext.Database.Private (infoGargandb)
import Data.Gargantext.Types import Data.Gargantext.Types
import Data.Maybe (Maybe) import Data.Maybe (Maybe)
import Data.Text (Text)
import Data.Profunctor.Product.TH (makeAdaptorAndInstance) import Data.Profunctor.Product.TH (makeAdaptorAndInstance)
import Data.Typeable (Typeable) import Data.Typeable (Typeable)
import qualified Data.ByteString.Internal as DBI import qualified Data.ByteString.Internal as DBI
import qualified Database.PostgreSQL.Simple as PGS import qualified Database.PostgreSQL.Simple as PGS
import Opaleye import Opaleye
-- | Types for Node Database Management -- | Types for Node Database Management
data PGTSVector
type NodeWrite = NodePoly (Maybe (Column PGInt4)) (Column PGInt4) type NodeWrite = NodePoly (Maybe (Column PGInt4)) (Column PGInt4)
(Column PGInt4) (Column PGInt4) (Column PGInt4) (Maybe (Column (Nullable PGInt4)))
(Column PGText) (Maybe (Column PGTimestamptz)) (Column (PGText)) (Maybe (Column PGTimestamptz))
(Column PGJsonb) (Column PGJsonb) -- (Maybe (Column PGTSVector))
type NodeRead = NodePoly (Column PGInt4) (Column PGInt4) type NodeRead = NodePoly (Column PGInt4) (Column PGInt4)
(Column PGInt4) (Column PGInt4) (Column PGInt4) (Column (Nullable PGInt4))
(Column PGText) (Column PGTimestamptz) (Column (PGText)) (Column PGTimestamptz)
(Column PGJsonb) (Column PGJsonb) -- (Column PGTSVector)
instance FromField HyperdataCorpus where instance FromField HyperdataCorpus where
fromField = fromField' fromField = fromField'
...@@ -42,11 +48,11 @@ instance FromField HyperdataCorpus where ...@@ -42,11 +48,11 @@ instance FromField HyperdataCorpus where
instance FromField HyperdataDocument where instance FromField HyperdataDocument where
fromField = fromField' fromField = fromField'
--instance FromField HyperdataProject where instance FromField HyperdataProject where
-- fromField = fromField' fromField = fromField'
--instance FromField HyperdataUser where instance FromField HyperdataUser where
-- fromField = fromField' fromField = fromField'
fromField' :: (Typeable b, FromJSON b) => Field -> Maybe DBI.ByteString -> Conversion b fromField' :: (Typeable b, FromJSON b) => Field -> Maybe DBI.ByteString -> Conversion b
...@@ -55,16 +61,30 @@ fromField' field mb = do ...@@ -55,16 +61,30 @@ fromField' field mb = do
valueToHyperdata v valueToHyperdata v
where where
valueToHyperdata v = case fromJSON v of valueToHyperdata v = case fromJSON v of
Success a -> pure a Success a -> pure a
Error _err -> returnError ConversionFailed field "cannot parse hyperdata" Error _err -> returnError ConversionFailed field "cannot parse hyperdata"
instance QueryRunnerColumnDefault PGJsonb HyperdataDocument where instance QueryRunnerColumnDefault PGJsonb HyperdataDocument where
queryRunnerColumnDefault = fieldQueryRunnerColumn queryRunnerColumnDefault = fieldQueryRunnerColumn
instance QueryRunnerColumnDefault PGJsonb HyperdataCorpus where instance QueryRunnerColumnDefault PGJsonb HyperdataCorpus where
queryRunnerColumnDefault = fieldQueryRunnerColumn
instance QueryRunnerColumnDefault PGJsonb HyperdataProject where
queryRunnerColumnDefault = fieldQueryRunnerColumn
instance QueryRunnerColumnDefault PGJsonb HyperdataUser where
queryRunnerColumnDefault = fieldQueryRunnerColumn
instance QueryRunnerColumnDefault (Nullable PGInt4) Int where
queryRunnerColumnDefault = fieldQueryRunnerColumn queryRunnerColumnDefault = fieldQueryRunnerColumn
instance QueryRunnerColumnDefault (Nullable PGText) Text where
queryRunnerColumnDefault = fieldQueryRunnerColumn
instance QueryRunnerColumnDefault PGInt4 Integer where
queryRunnerColumnDefault = fieldQueryRunnerColumn
...@@ -73,27 +93,24 @@ $(makeLensesWith abbreviatedFields ''NodePoly) ...@@ -73,27 +93,24 @@ $(makeLensesWith abbreviatedFields ''NodePoly)
nodeTable :: Table NodeWrite NodeRead nodeTable :: Table NodeWrite NodeRead
nodeTable = Table "nodes" (pNode Node { node_id = optional "id" nodeTable = Table "nodes" (pNode Node { node_id = optional "id"
, node_typename = required "typename" , node_typename = required "typename"
, node_userId = required "user_id" , node_userId = required "user_id"
, node_parentId = required "parent_id" , node_parentId = optional "parent_id"
, node_name = required "name" , node_name = required "name"
, node_date = optional "date" , node_date = optional "date"
, node_hyperdata = required "hyperdata" , node_hyperdata = required "hyperdata"
-- , node_titleAbstract = optional "title_abstract"
} }
) )
selectNodes :: Column PGInt4 -> Query (Column PGText) selectNodes :: Column PGInt4 -> Query (Column (PGText))
selectNodes node_id = proc () -> do selectNodes node_id = proc () -> do
(Node n_id _tn _u _p n _d _h) <- queryNodeTable -< () (Node n_id _tn _u _p n _d _h ) <- queryNodeTable -< ()
restrict -< n_id .== node_id restrict -< n_id .== node_id
returnA -< n returnA -< n
instance QueryRunnerColumnDefault PGInt4 Integer where
queryRunnerColumnDefault = fieldQueryRunnerColumn
runGetNodes :: PGS.Connection -> Query NodeRead -> IO [Document] runGetNodes :: PGS.Connection -> Query NodeRead -> IO [Document]
runGetNodes = runQuery runGetNodes = runQuery
...@@ -102,23 +119,35 @@ queryNodeTable :: Query NodeRead ...@@ -102,23 +119,35 @@ queryNodeTable :: Query NodeRead
queryNodeTable = queryTable nodeTable queryNodeTable = queryTable nodeTable
selectNode :: Column PGInt4 -> Query NodeRead selectNodeWithParentID :: Column (Nullable PGInt4) -> Query NodeRead
selectNode node_id = proc () -> do selectNodeWithParentID node_id = proc () -> do
row@(Node _id _tn _u p_id _n _d _h) <- queryNodeTable -< () row@(Node _id _tn _u p_id _n _d _h) <- queryNodeTable -< ()
restrict -< p_id .== node_id restrict -< p_id .== node_id
returnA -< row returnA -< row
selectNodesWithType :: Column PGInt4 -> Query NodeRead
selectNodesWithType type_id = proc () -> do
row@(Node _id _tn _uid p_id n _d _h) <- queryNodeTable -< ()
restrict -< _tn .== type_id
--let noParent = ifThenElse (isNull nullableBoss) (pgString "no") (pgString "a")
--returnA -< Node _id _tn _uid (pgInt4 0) (pgString "") _d _h
returnA -< row
getNodesWithType :: Column PGInt4 -> IO [NodeUser]
getNodesWithType type_id = do
conn <- PGS.connect infoGargandb
runQuery conn $ selectNodesWithType type_id
getNodes :: Column PGInt4 -> IO [Document] getNodesWithParentId :: Column (Nullable PGInt4) -> IO [Document]
getNodes node_id = do getNodesWithParentId node_id = do
conn <- PGS.connect infoGargandb conn <- PGS.connect infoGargandb
runQuery conn $ selectNode node_id runQuery conn $ selectNodeWithParentID node_id
getCorpusDocument :: Column PGInt4 -> IO [Document] getCorpusDocument :: Column (Nullable PGInt4) -> IO [Document]
getCorpusDocument node_id = PGS.connect infoGargandb >>= getCorpusDocument node_id = PGS.connect infoGargandb >>=
\conn -> runQuery conn (selectNode node_id) \conn -> runQuery conn (selectNodeWithParentID node_id)
getProjectCorpora :: Column PGInt4 -> IO [Corpus] getProjectCorpora :: Column (Nullable PGInt4) -> IO [Corpus]
getProjectCorpora node_id = do getProjectCorpora node_id = do
conn <- PGS.connect infoGargandb conn <- PGS.connect infoGargandb
runQuery conn $ selectNode node_id runQuery conn $ selectNodeWithParentID node_id
...@@ -5,6 +5,7 @@ module Data.Gargantext.Database.Private where ...@@ -5,6 +5,7 @@ module Data.Gargantext.Database.Private where
import qualified Database.PostgreSQL.Simple as PGS import qualified Database.PostgreSQL.Simple as PGS
-- TODO add a reader Monad here -- TODO add a reader Monad here
-- read this in the init file
infoGargandb :: PGS.ConnectInfo infoGargandb :: PGS.ConnectInfo
infoGargandb = PGS.ConnectInfo { PGS.connectHost = "127.0.0.1" infoGargandb = PGS.ConnectInfo { PGS.connectHost = "127.0.0.1"
, PGS.connectPort = 5432 , PGS.connectPort = 5432
......
...@@ -10,7 +10,7 @@ import Protolude (fromMaybe) ...@@ -10,7 +10,7 @@ import Protolude (fromMaybe)
--import Data.ByteString (ByteString()) --import Data.ByteString (ByteString())
import Data.Text (Text) import Data.Text (Text)
import Data.Time (UTCTime) import Data.Time (UTCTime)
import Data.Gargantext.Types.Node ( NodePoly import Data.Gargantext.Types.Node ( NodePoly, HyperdataUser
, HyperdataFolder , HyperdataCorpus , HyperdataDocument , HyperdataFolder , HyperdataCorpus , HyperdataDocument
, HyperdataFavorites, HyperdataResource , HyperdataFavorites, HyperdataResource
, HyperdataList , HyperdataScore , HyperdataList , HyperdataScore
...@@ -35,13 +35,17 @@ type Ngrams = (Text, Text, Text) ...@@ -35,13 +35,17 @@ type Ngrams = (Text, Text, Text)
type ErrorMessage = String type ErrorMessage = String
-- All the Database is structred like a hierachical Tree -- All the Database is structred like a hierarchical Tree
data Tree b a = LeafT a | NodeT b [Tree b a] data Tree b a = LeafT a | NodeT b [Tree b a]
deriving (Show, Read, Eq) deriving (Show, Read, Eq)
-- Garg Database Schema Typed as specification -- Garg Network is a network of all Garg nodes
gargDatabase :: [Tree NodeType NodeType] --gargNetwork = undefined
gargDatabase = [userTree]
-- | Garg Node is Database Schema Typed as specification
-- gargNode gathers all the Nodes of all users on one Node
gargNode :: [Tree NodeType NodeType]
gargNode = [userTree]
-- | User Tree simplified -- | User Tree simplified
userTree :: Tree NodeType NodeType userTree :: Tree NodeType NodeType
...@@ -59,7 +63,6 @@ corpusTree = NodeT Corpus ( [ LeafT Document ] ...@@ -59,7 +63,6 @@ corpusTree = NodeT Corpus ( [ LeafT Document ]
<> [ LeafT Classification] <> [ LeafT Classification]
) )
-- | TODO add Symbolic Node / Document
-- TODO make instances of Nodes -- TODO make instances of Nodes
data NodeType = NodeUser | Project | Corpus | Document | DocumentCopy data NodeType = NodeUser | Project | Corpus | Document | DocumentCopy
| Classification | Classification
...@@ -76,22 +79,20 @@ data Metrics = Occurrences | Cooccurrences | Specclusion | Genclusion | Cvalue ...@@ -76,22 +79,20 @@ data Metrics = Occurrences | Cooccurrences | Specclusion | Genclusion | Cvalue
-- | NodePoly indicates that Node has a Polymorphism Type -- | NodePoly indicates that Node has a Polymorphism Type
type Node json = NodePoly NodeId NodeTypeId NodeUserId NodeParentId NodeName UTCTime json type Node json = NodePoly NodeId NodeTypeId NodeUserId NodeParentId NodeName UTCTime json -- NodeVector
-- type Node json = NodePoly NodeId NodeTypeId UserId ParentId NodeName UTCTime json -- type Node json = NodePoly NodeId NodeTypeId UserId ParentId NodeName UTCTime json
type NodeTypeId = Int type NodeTypeId = Int
type NodeId = Int type NodeId = Int
type NodeParentId = Int type NodeParentId = Int
type NodeUserId = Int type NodeUserId = Int
type NodeName = Text type NodeName = Text
--type NodeVector = Vector
--type NodeUser = Node HyperdataUser --type NodeUser = Node HyperdataUser
-- | Then a Node can be either a Folder or a Corpus or a Document -- | Then a Node can be either a Folder or a Corpus or a Document
type NodeUser = Node HyperdataUser
type Folder = Node HyperdataFolder type Folder = Node HyperdataFolder
type Project = Folder type Project = Folder
type Corpus = Node HyperdataCorpus type Corpus = Node HyperdataCorpus
...@@ -115,34 +116,32 @@ type MapList = List ...@@ -115,34 +116,32 @@ type MapList = List
type GroupList = List type GroupList = List
-- | Then a Node can be a Score which as some synonyms -- | Then a Node can be a Score which as some synonyms
--type Score = Node HyperdataScore type Score = Node HyperdataScore
--type Occurrences = Score type Occurrences = Score
--type Cooccurrences = Score type Cooccurrences = Score
--type Specclusion = Score type Specclusion = Score
--type Genclusion = Score type Genclusion = Score
--type Cvalue = Score type Cvalue = Score
--type Tficf = Score type Tficf = Score
---- TODO All these Tfidf* will be replaced with TFICF ---- TODO All these Tfidf* will be replaced with TFICF
--type TfidfCorpus = Tficf type TfidfCorpus = Tficf
--type TfidfGlobal = Tficf type TfidfGlobal = Tficf
--type TirankLocal = Tficf type TirankLocal = Tficf
--type TirankGlobal = Tficf type TirankGlobal = Tficf
-- --
---- | Then a Node can be either a Graph or a Phylo or a Notebook ---- | Then a Node can be either a Graph or a Phylo or a Notebook
--type Graph = Node HyperdataGraph type Graph = Node HyperdataGraph
--type Phylo = Node HyperdataPhylo type Phylo = Node HyperdataPhylo
--type Notebook = Node HyperdataNotebook type Notebook = Node HyperdataNotebook
--nodeTypes :: [(NodeType, NodeTypeId)] nodeTypes :: [(NodeType, NodeTypeId)]
--nodeTypes = [ nodeTypes = [ (NodeUser , 1)
-- --(NodeUser , 1) , (Project , 2)
---- , (Corpus , 3)
-- (Project , 2) , (Document , 4)
-- , (NodeSwap , 19) --, (NodeSwap , 19)
-- , (Corpus , 3) ------ Lists
-- , (Document , 4)
-------- Lists
-- , (StopList , 5) -- , (StopList , 5)
-- , (GroupList , 6) -- , (GroupList , 6)
-- , (MainList , 7) -- , (MainList , 7)
...@@ -164,7 +163,7 @@ type GroupList = List ...@@ -164,7 +163,7 @@ type GroupList = List
---- Node management ---- Node management
-- , (Favorites , 15) -- , (Favorites , 15)
-- --
-- ] ]
---- --
--nodeTypeId :: NodeType -> NodeTypeId nodeTypeId :: NodeType -> NodeTypeId
--nodeTypeId tn = fromMaybe (error ("Typename " ++ show tn ++ " does not exist")) (lookup tn nodeTypes) nodeTypeId tn = fromMaybe (error ("Typename " ++ show tn ++ " does not exist")) (lookup tn nodeTypes)
...@@ -12,12 +12,13 @@ import Data.Aeson.TH (deriveJSON) ...@@ -12,12 +12,13 @@ import Data.Aeson.TH (deriveJSON)
data NodePoly id typename userId parentId name date hyperdata = Node { node_id :: id data NodePoly id typename userId parentId name date hyperdata = Node { node_id :: id
, node_typename :: typename , node_typename :: typename
, node_userId:: userId , node_userId :: userId
-- , nodeHashId :: hashId -- , nodeHashId :: hashId
, node_parentId :: parentId , node_parentId :: parentId
, node_name :: name , node_name :: name
, node_date :: date , node_date :: date
, node_hyperdata :: hyperdata , node_hyperdata :: hyperdata
-- , node_titleAbstract :: titleAbstract
} deriving (Show) } deriving (Show)
...@@ -71,11 +72,23 @@ data HyperdataCorpus = HyperdataCorpus { hyperdataCorpus_Action :: Maybe T ...@@ -71,11 +72,23 @@ data HyperdataCorpus = HyperdataCorpus { hyperdataCorpus_Action :: Maybe T
$(deriveJSON (unPrefix "hyperdataCorpus_") ''HyperdataCorpus) $(deriveJSON (unPrefix "hyperdataCorpus_") ''HyperdataCorpus)
data HyperdataUser = HyperdataUser { hyperdataUser_language :: Maybe Text
} deriving (Show, Generic)
$(deriveJSON (unPrefix "hyperdataUser_") ''HyperdataUser)
data HyperdataFolder = HyperdataFolder { hyperdataFolder_Preferences :: Maybe Text data HyperdataFolder = HyperdataFolder { hyperdataFolder_Preferences :: Maybe Text
} deriving (Show, Generic) } deriving (Show, Generic)
$(deriveJSON (unPrefix "hyperdataFolder_") ''HyperdataFolder) $(deriveJSON (unPrefix "hyperdataFolder_") ''HyperdataFolder)
data HyperdataProject = HyperdataProject { hyperdataProject_Preferences :: Maybe Text
} deriving (Show, Generic)
$(deriveJSON (unPrefix "hyperdataProject_") ''HyperdataProject)
data HyperdataList = HyperdataList { hyperdataList_Preferences :: Maybe Text data HyperdataList = HyperdataList { hyperdataList_Preferences :: Maybe Text
} deriving (Show, Generic) } deriving (Show, Generic)
$(deriveJSON (unPrefix "hyperdataList_") ''HyperdataList) $(deriveJSON (unPrefix "hyperdataList_") ''HyperdataList)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment