Commit 28e68956 authored by Alexandre Delanoë's avatar Alexandre Delanoë

[Annuaire] Contact adding uniq id.

parent ac3de094
...@@ -28,9 +28,9 @@ import Gargantext.Core.Types (NodePoly(..), ListType(..), listTypeId) ...@@ -28,9 +28,9 @@ import Gargantext.Core.Types (NodePoly(..), ListType(..), listTypeId)
import Gargantext.Database.Bashql (runCmd') -- , del) import Gargantext.Database.Bashql (runCmd') -- , del)
import Gargantext.Database.Config (userMaster, userArbitrary, corpusMasterName) import Gargantext.Database.Config (userMaster, userArbitrary, corpusMasterName)
import Gargantext.Database.Ngrams (insertNgrams, Ngrams(..), NgramsT(..), NgramsIndexed(..), indexNgramsT, ngramsTypeId, NgramsType(..), text2ngrams) import Gargantext.Database.Ngrams (insertNgrams, Ngrams(..), NgramsT(..), NgramsIndexed(..), indexNgramsT, ngramsTypeId, NgramsType(..), text2ngrams)
import Gargantext.Database.Node (getRoot, mkRoot, mkCorpus, Cmd(..), mkList)--, mkGraph, mkDashboard)--, mkAnnuaire) import Gargantext.Database.Node (getRoot, mkRoot, mkCorpus, Cmd(..), mkList, mkGraph, mkDashboard)--, mkAnnuaire)
import Gargantext.Database.Node.Document.Add (add) import Gargantext.Database.Node.Document.Add (add)
import Gargantext.Database.Node.Document.Insert (insertDocuments, ReturnId(..), addUniqIds, ToDbData(..)) import Gargantext.Database.Node.Document.Insert (insertDocuments, ReturnId(..), addUniqIdsDoc, ToDbData(..))
import Gargantext.Database.NodeNgram (NodeNgramPoly(..), insertNodeNgrams) import Gargantext.Database.NodeNgram (NodeNgramPoly(..), insertNodeNgrams)
import Gargantext.Database.NodeNgramsNgrams (NodeNgramsNgramsPoly(..), insertNodeNgramsNgramsNew) import Gargantext.Database.NodeNgramsNgrams (NodeNgramsNgramsPoly(..), insertNodeNgramsNgramsNew)
import Gargantext.Database.Types.Node (HyperdataDocument(..)) import Gargantext.Database.Types.Node (HyperdataDocument(..))
...@@ -44,23 +44,30 @@ type UserId = Int ...@@ -44,23 +44,30 @@ type UserId = Int
type RootId = Int type RootId = Int
type CorpusId = Int type CorpusId = Int
{-
flowCorpus :: [ToDbData] -> CorpusName -> IO CorpusId
flowCorpus = undefined
--}
flowDatabase :: FileFormat -> FilePath -> CorpusName -> IO Int flowDatabase :: FileFormat -> FilePath -> CorpusName -> IO Int
flowDatabase ff fp cName = do flowDatabase ff fp cName = do
-- Corpus Flow -- Corpus Flow
(masterUserId, _, corpusId) <- subFlowCorpus userMaster corpusMasterName (masterUserId, _, corpusId) <- subFlowCorpus userMaster corpusMasterName
-- Documents Flow -- Documents Flow
hyperdataDocuments <- map addUniqIds <$> parseDocs ff fp hyperdataDocuments <- map addUniqIdsDoc <$> parseDocs ff fp
let hyperdataDocuments' = map (\h -> ToDbDocument h) hyperdataDocuments let hyperdataDocuments' = map (\h -> ToDbDocument h) hyperdataDocuments
printDebug "hyperdataDocuments" (length hyperdataDocuments) printDebug "hyperdataDocuments" (length hyperdataDocuments)
ids <- runCmd' $ insertDocuments masterUserId corpusId hyperdataDocuments' ids <- runCmd' $ insertDocuments masterUserId corpusId hyperdataDocuments'
-- printDebug "Docs IDs : " (ids) -- printDebug "Docs IDs : " (ids)
-- idsRepeat <- runCmd' $ insertDocuments masterUserId corpusId hyperdataDocuments' -- idsRepeat <- runCmd' $ insertDocuments masterUserId corpusId hyperdataDocuments'
-- printDebug "Repeated Docs IDs : " (length idsRepeat) -- printDebug "Repeated Docs IDs : " (length idsRepeat)
let idsNotRepeated = filter (\r -> reInserted r == True) ids let idsNotRepeated = filter (\r -> reInserted r == True) ids
-- {- --{-
-- Ngrams Flow -- Ngrams Flow
-- todo: flow for new documents only -- todo: flow for new documents only
let tids = toInserted ids let tids = toInserted ids
...@@ -87,17 +94,16 @@ flowDatabase ff fp cName = do ...@@ -87,17 +94,16 @@ flowDatabase ff fp cName = do
listId2 <- runCmd' $ listFlow masterUserId corpusId indexedNgrams listId2 <- runCmd' $ listFlow masterUserId corpusId indexedNgrams
printDebug "list id : " listId2 printDebug "list id : " listId2
--(userId, rootUserId, corpusId2) <- subFlowCorpus userArbitrary cName
--} --}
(userId, _, corpusId2) <- subFlowCorpus userArbitrary cName (userId, _, corpusId2) <- subFlowCorpus userArbitrary cName
userListId <- runCmd' $ listFlowUser userId corpusId2 userListId <- runCmd' $ listFlowUser userId corpusId2
printDebug "UserList : " userListId printDebug "UserList : " userListId
inserted <- runCmd' $ add corpusId2 (map reId ids) inserted <- runCmd' $ add corpusId2 (map reId ids)
printDebug "Inserted : " (length inserted) printDebug "Added : " (length inserted)
--_ <- runCmd' $ mkDashboard corpusId2 userId _ <- runCmd' $ mkDashboard corpusId2 userId
--_ <- runCmd' $ mkGraph corpusId2 userId _ <- runCmd' $ mkGraph corpusId2 userId
-- Annuaire Flow -- Annuaire Flow
-- _ <- runCmd' $ mkAnnuaire rootUserId userId -- _ <- runCmd' $ mkAnnuaire rootUserId userId
......
...@@ -20,32 +20,35 @@ Portability : POSIX ...@@ -20,32 +20,35 @@ Portability : POSIX
module Gargantext.Database.Node.Contact module Gargantext.Database.Node.Contact
where where
import GHC.Generics (Generic) import Control.Lens (makeLenses)
import Data.Aeson.TH (deriveJSON) import Data.Aeson.TH (deriveJSON)
import Data.Text (Text) import Data.Text (Text)
import Data.Time (UTCTime) import Data.Time (UTCTime)
-- import Control.Lens (makeLenses) import Database.PostgreSQL.Simple.FromField (FromField, fromField)
import Opaleye (QueryRunnerColumnDefault, queryRunnerColumnDefault, PGJsonb, fieldQueryRunnerColumn) import GHC.Generics (Generic)
import Gargantext.Database.Utils (fromField')
import Gargantext.Core.Utils.Prefix (unPrefix) import Gargantext.Core.Utils.Prefix (unPrefix)
import Gargantext.Database.Node (NodeWrite', AnnuaireId, UserId, Name, node) import Gargantext.Database.Node (NodeWrite', AnnuaireId, UserId, Name, node)
import Gargantext.Prelude
import Gargantext.Database.Types.Node (Node,Hyperdata,NodeType(..)) import Gargantext.Database.Types.Node (Node,Hyperdata,NodeType(..))
import Database.PostgreSQL.Simple.FromField (FromField, fromField) import Gargantext.Database.Utils (fromField')
import Gargantext.Prelude
import Opaleye (QueryRunnerColumnDefault, queryRunnerColumnDefault, PGJsonb, fieldQueryRunnerColumn)
------------------------------------------------------------------------ ------------------------------------------------------------------------
type NodeContact = Node HyperdataContact type NodeContact = Node HyperdataContact
data HyperdataContact = data HyperdataContact =
HyperdataContact { _hc_who :: Maybe ContactWho HyperdataContact { _hc_bdd :: Maybe Text -- ID of Database source
, _hc_who :: Maybe ContactWho
, _hc_where :: Maybe [ContactWhere] , _hc_where :: Maybe [ContactWhere]
, _hc_lastValidation :: Maybe Text , _hc_lastValidation :: Maybe Text
, _hc_uniqIdBdd :: Maybe Text
, _hc_uniqId :: Maybe Text
} deriving (Eq, Show, Generic) } deriving (Eq, Show, Generic)
arbitraryHyperdataContact :: HyperdataContact arbitraryHyperdataContact :: HyperdataContact
arbitraryHyperdataContact = HyperdataContact Nothing Nothing Nothing arbitraryHyperdataContact = HyperdataContact Nothing Nothing Nothing Nothing Nothing Nothing
data ContactWho = data ContactWho =
ContactWho { _cw_id :: Maybe Int ContactWho { _cw_id :: Maybe Int
...@@ -90,12 +93,10 @@ instance FromField HyperdataContact where ...@@ -90,12 +93,10 @@ instance FromField HyperdataContact where
instance QueryRunnerColumnDefault PGJsonb HyperdataContact where instance QueryRunnerColumnDefault PGJsonb HyperdataContact where
queryRunnerColumnDefault = fieldQueryRunnerColumn queryRunnerColumnDefault = fieldQueryRunnerColumn
{-
makeLenses ''ContactWho makeLenses ''ContactWho
makeLenses ''ContactWhere makeLenses ''ContactWhere
makeLenses ''ContactTouch makeLenses ''ContactTouch
makeLenses ''HyperdataContact makeLenses ''HyperdataContact
-}
$(deriveJSON (unPrefix "_cw_") ''ContactWho) $(deriveJSON (unPrefix "_cw_") ''ContactWho)
$(deriveJSON (unPrefix "_cw_") ''ContactWhere) $(deriveJSON (unPrefix "_cw_") ''ContactWhere)
......
...@@ -59,7 +59,10 @@ the concatenation of the parameters defined by @hashParameters@. ...@@ -59,7 +59,10 @@ the concatenation of the parameters defined by @hashParameters@.
------------------------------------------------------------------------ ------------------------------------------------------------------------
module Gargantext.Database.Node.Document.Insert where module Gargantext.Database.Node.Document.Insert where
import Control.Lens (set) import Control.Lens (set, view)
import Control.Lens.Prism
import Control.Lens.Cons
import Control.Monad (join)
import Data.Aeson (toJSON, Value) import Data.Aeson (toJSON, Value)
import Data.Maybe (maybe) import Data.Maybe (maybe)
import Data.Text (Text) import Data.Text (Text)
...@@ -73,7 +76,7 @@ import Database.PostgreSQL.Simple.Types (Values(..), QualifiedIdentifier(..)) ...@@ -73,7 +76,7 @@ import Database.PostgreSQL.Simple.Types (Values(..), QualifiedIdentifier(..))
import GHC.Generics (Generic) import GHC.Generics (Generic)
import Gargantext.Database.Config (nodeTypeId) import Gargantext.Database.Config (nodeTypeId)
import Gargantext.Database.Node (mkCmd, Cmd(..)) import Gargantext.Database.Node (mkCmd, Cmd(..))
import Gargantext.Database.Node.Contact (HyperdataContact(..)) import Gargantext.Database.Node.Contact -- (HyperdataContact(..), ContactWho(..))
import Gargantext.Database.Types.Node import Gargantext.Database.Types.Node
import Gargantext.Prelude import Gargantext.Prelude
import qualified Data.ByteString.Lazy.Char8 as DC (pack) import qualified Data.ByteString.Lazy.Char8 as DC (pack)
...@@ -208,23 +211,44 @@ instance ToRow InputData where ...@@ -208,23 +211,44 @@ instance ToRow InputData where
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
-- * Uniqueness of document definition -- * Uniqueness of document definition
addUniqIds :: HyperdataDocument -> HyperdataDocument addUniqIdsDoc :: HyperdataDocument -> HyperdataDocument
addUniqIds doc = set hyperdataDocument_uniqIdBdd (Just hashBdd) addUniqIdsDoc doc = set hyperdataDocument_uniqIdBdd (Just hashBdd)
$ set hyperdataDocument_uniqId (Just hash) doc $ set hyperdataDocument_uniqId (Just hash) doc
where where
hash = uniqId $ DT.concat $ map ($ doc) hashParameters hash = uniqId $ DT.concat $ map ($ doc) hashParametersDoc
hashBdd = uniqId $ DT.concat $ map ($ doc) ([(\d -> maybe' (_hyperdataDocument_bdd d))] <> hashParameters) hashBdd = uniqId $ DT.concat $ map ($ doc) ([(\d -> maybe' (_hyperdataDocument_bdd d))] <> hashParametersDoc)
uniqId :: Text -> Text uniqId :: Text -> Text
uniqId = DT.pack . SHA.showDigest . SHA.sha256 . DC.pack . DT.unpack uniqId = DT.pack . SHA.showDigest . SHA.sha256 . DC.pack . DT.unpack
hashParameters :: [(HyperdataDocument -> Text)] hashParametersDoc :: [(HyperdataDocument -> Text)]
hashParameters = [ \d -> maybe' (_hyperdataDocument_title d) hashParametersDoc = [ \d -> maybe' (_hyperdataDocument_title d)
, \d -> maybe' (_hyperdataDocument_abstract d) , \d -> maybe' (_hyperdataDocument_abstract d)
, \d -> maybe' (_hyperdataDocument_source d) , \d -> maybe' (_hyperdataDocument_source d)
, \d -> maybe' (_hyperdataDocument_publication_date d) , \d -> maybe' (_hyperdataDocument_publication_date d)
] ]
---------------------------------------------------------------------------
-- * Uniqueness of document definition
-- TODO factorize with above (use the function below for tests)
addUniqIdsContact :: HyperdataContact -> HyperdataContact
addUniqIdsContact hc = set hc_uniqIdBdd (Just hashBdd)
$ set hc_uniqId (Just hash) hc
where
hash = uniqId $ DT.concat $ map ($ hc) hashParametersContact
hashBdd = uniqId $ DT.concat $ map ($ hc) ([(\d -> maybe' (view hc_bdd d))] <> hashParametersContact)
uniqId :: Text -> Text
uniqId = DT.pack . SHA.showDigest . SHA.sha256 . DC.pack . DT.unpack
-- | TODO add more hashparameters
hashParametersContact :: [(HyperdataContact -> Text)]
hashParametersContact = [ \d -> maybe' $ view (hc_who . _Just . cw_firstName) d
, \d -> maybe' $ view (hc_who . _Just . cw_lastName ) d
, \d -> maybe' $ view (hc_where . _Just . _head . cw_touch . _Just . ct_mail) d
]
maybe' :: Maybe Text -> Text maybe' :: Maybe Text -> Text
maybe' = maybe (DT.pack "") identity maybe' = maybe (DT.pack "") identity
......
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