Commit 9227265d authored by Alexandre Delanoë's avatar Alexandre Delanoë

[DB] optim cooc

parent b2d3294c
...@@ -259,7 +259,6 @@ insertMasterDocs c lang hs = do ...@@ -259,7 +259,6 @@ insertMasterDocs c lang hs = do
let let
ids' = map reId ids ids' = map reId ids
documentsWithId = mergeData (toInserted ids) (Map.fromList $ map viewUniqId' docs) documentsWithId = mergeData (toInserted ids) (Map.fromList $ map viewUniqId' docs)
_ <- Doc.add masterCorpusId ids'
-- TODO -- TODO
-- create a corpus with database name (CSV or PubMed) -- create a corpus with database name (CSV or PubMed)
-- add documents to the corpus (create node_node link) -- add documents to the corpus (create node_node link)
...@@ -288,6 +287,7 @@ insertMasterDocs c lang hs = do ...@@ -288,6 +287,7 @@ insertMasterDocs c lang hs = do
, (nId, w) <- Map.toList mapNodeIdWeight , (nId, w) <- Map.toList mapNodeIdWeight
] ]
_ <- Doc.add masterCorpusId ids'
_cooc <- mkNode NodeListCooc lId masterUserId _cooc <- mkNode NodeListCooc lId masterUserId
-- to be removed -- to be removed
_ <- insertDocNgrams lId indexedNgrams _ <- insertDocNgrams lId indexedNgrams
......
...@@ -23,8 +23,8 @@ module Gargantext.Database.Init ...@@ -23,8 +23,8 @@ module Gargantext.Database.Init
import Gargantext.Database.Utils (Cmd) import Gargantext.Database.Utils (Cmd)
import Gargantext.Prelude import Gargantext.Prelude
import Gargantext.Database.Triggers.Nodes (triggerSearchUpdate) import Gargantext.Database.Triggers.Nodes (triggerSearchUpdate)
import Gargantext.Database.Triggers.NodesNodes (triggerDeleteCount, triggerInsertCount, triggerUpdateAdd, triggerUpdateDel, MasterListId) import Gargantext.Database.Triggers.NodesNodes (triggerDeleteCount, triggerInsertCount, triggerUpdateAdd, triggerUpdateDel, MasterListId, triggerCoocInsert)
import Gargantext.Database.Triggers.NodeNodeNgrams (triggerCountInsert, triggerCountInsert2, triggerCoocInsert) import Gargantext.Database.Triggers.NodeNodeNgrams (triggerCountInsert, triggerCountInsert2)
------------------------------------------------------------------------ ------------------------------------------------------------------------
initTriggers :: MasterListId -> Cmd err [Int64] initTriggers :: MasterListId -> Cmd err [Int64]
...@@ -32,11 +32,18 @@ initTriggers lId = do ...@@ -32,11 +32,18 @@ initTriggers lId = do
t0 <- triggerSearchUpdate t0 <- triggerSearchUpdate
t1 <- triggerCountInsert t1 <- triggerCountInsert
t1' <- triggerCountInsert2 t1' <- triggerCountInsert2
t1'' <- triggerCoocInsert t1'' <- triggerCoocInsert lId
t2 <- triggerDeleteCount lId t2 <- triggerDeleteCount lId
t3 <- triggerInsertCount lId t3 <- triggerInsertCount lId
t4 <- triggerUpdateAdd lId t4 <- triggerUpdateAdd lId
t5 <- triggerUpdateDel lId t5 <- triggerUpdateDel lId
pure [t0,t1,t1',t1'',t2,t3,t4,t5] pure [t0
,t1
,t1'
,t1''
,t2
,t3
,t4
,t5]
...@@ -55,15 +55,15 @@ data NodeNgramsPoly id ...@@ -55,15 +55,15 @@ data NodeNgramsPoly id
ngrams_tag ngrams_tag
ngrams_class ngrams_class
weight weight
= NodeNgrams { _nng_id :: id = NodeNgrams { _nng_id :: !id
, _nng_node_id :: node_id' , _nng_node_id :: !node_id'
, _nng_node_subtype :: node_subtype , _nng_node_subtype :: !node_subtype
, _nng_ngrams_id :: ngrams_id , _nng_ngrams_id :: !ngrams_id
, _nng_ngrams_type :: ngrams_type , _nng_ngrams_type :: !ngrams_type
, _nng_ngrams_field :: ngrams_field , _nng_ngrams_field :: !ngrams_field
, _nng_ngrams_tag :: ngrams_tag , _nng_ngrams_tag :: !ngrams_tag
, _nng_ngrams_class :: ngrams_class , _nng_ngrams_class :: !ngrams_class
, _nng_ngrams_weight :: weight , _nng_ngrams_weight :: !weight
} deriving (Show, Eq, Ord) } deriving (Show, Eq, Ord)
{- {-
...@@ -113,9 +113,9 @@ type NodeNgramsW = ...@@ -113,9 +113,9 @@ type NodeNgramsW =
NgramsType (Maybe NgramsField) (Maybe NgramsTag) (Maybe NgramsClass) NgramsType (Maybe NgramsField) (Maybe NgramsTag) (Maybe NgramsClass)
Double Double
data Returning = Returning { re_type :: Maybe NgramsType data Returning = Returning { re_type :: !(Maybe NgramsType)
, re_terms :: Text , re_terms :: !Text
, re_ngrams_id :: Int , re_ngrams_id :: !Int
} }
deriving (Show) deriving (Show)
......
...@@ -23,6 +23,7 @@ import Database.PostgreSQL.Simple.SqlQQ (sql) ...@@ -23,6 +23,7 @@ import Database.PostgreSQL.Simple.SqlQQ (sql)
-- import Database.PostgreSQL.Simple.Types (Values(..), QualifiedIdentifier(..)) -- import Database.PostgreSQL.Simple.Types (Values(..), QualifiedIdentifier(..))
import Gargantext.Database.Config (nodeTypeId) import Gargantext.Database.Config (nodeTypeId)
import Gargantext.Database.Types.Node -- (ListId, CorpusId, NodeId) import Gargantext.Database.Types.Node -- (ListId, CorpusId, NodeId)
import Gargantext.Core.Types.Main (listTypeId, ListType(CandidateTerm))
import Gargantext.Database.Utils (Cmd, execPGSQuery) import Gargantext.Database.Utils (Cmd, execPGSQuery)
import Gargantext.Prelude import Gargantext.Prelude
import qualified Database.PostgreSQL.Simple as DPS import qualified Database.PostgreSQL.Simple as DPS
...@@ -157,3 +158,61 @@ triggerUpdateDel lId = execPGSQuery query (lId, nodeTypeId NodeList) ...@@ -157,3 +158,61 @@ triggerUpdateDel lId = execPGSQuery query (lId, nodeTypeId NodeList)
|] |]
-- TODO add groups
triggerCoocInsert :: MasterListId -> Cmd err Int64
triggerCoocInsert lid = execPGSQuery query ( lid
-- , nodeTypeId NodeCorpus
-- , nodeTypeId NodeDocument
-- , nodeTypeId NodeList
, listTypeId CandidateTerm
, listTypeId CandidateTerm
)
where
query :: DPS.Query
query = [sql|
CREATE OR REPLACE FUNCTION nodes_nodes_set_cooc() RETURNS trigger AS $$
BEGIN
IF pg_trigger_depth() <> 1 THEN
RETURN NEW;
END IF;
IF TG_OP = 'INSERT' THEN
INSERT INTO node_nodengrams_nodengrams (node_id, node_ngrams1_id, node_ngrams2_id, weight)
WITH input(corpus_id, nn1, nn2, weight) AS (
SELECT new1.node1_id, nn1.id, nn2.id, count(*) from NEW as new1
INNER JOIN node_ngrams nn1
ON nn1.node_id = ? -- COALESCE(?,?) --(masterList, userList)
INNER JOIN node_ngrams nn2
ON nn2.node_id = nn1.node_id
INNER JOIN node_node_ngrams2 nnn1
ON nnn1.node_id = new1.node2_id
INNER JOIN node_node_ngrams2 nnn2
ON nnn2.node_id = new1.node2_id
WHERE nnn1.nodengrams_id = nn1.id
AND nnn2.nodengrams_id = nn2.id
AND nn1.id < nn2.id
AND nn1.node_subtype >= ?
AND nn2.node_subtype >= ?
GROUP BY new1.node1_id, nn1.id, nn2.id
)
SELECT * from input where weight >= 1
ON CONFLICT (node_id, node_ngrams1_id, node_ngrams2_id)
DO UPDATE set weight = node_nodengrams_nodengrams.weight + excluded.weight
;
END IF;
RETURN NULL;
END
$$ LANGUAGE plpgsql;
-- DROP trigger trigger_cooc on node_node_ngrams2;
CREATE TRIGGER trigger_cooc_insert AFTER INSERT on nodes_nodes
REFERENCING NEW TABLE AS NEW
FOR EACH STATEMENT
EXECUTE PROCEDURE nodes_nodes_set_cooc();
|]
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