[FIX] Order 1 and Order 2, node size ok.
[gargantext.git] / src / Gargantext / Database / Admin / Trigger / Nodes.hs
index 9b86ce382939ec2881cb8fcf5b5c629936fa08d5..5c31003d7350d8a28b12e514b8c2f82794e94437 100644 (file)
@@ -11,31 +11,29 @@ Triggers on Nodes table.
 
 -}
 
-{-# LANGUAGE FlexibleContexts  #-}
 {-# LANGUAGE QuasiQuotes       #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE RankNTypes        #-}
 
 module Gargantext.Database.Admin.Trigger.Nodes
   where
 
+import Data.Text (Text)
 import Database.PostgreSQL.Simple.SqlQQ (sql)
-import Gargantext.Database.Admin.Config (nodeTypeId)
+import Gargantext.Core (HasDBid(..))
 import Gargantext.Database.Admin.Types.Node -- (ListId, CorpusId, NodeId)
-import Gargantext.Database.Admin.Utils (Cmd, execPGSQuery)
+import Gargantext.Database.Prelude (Cmd, execPGSQuery)
 import Gargantext.Prelude
 import qualified Database.PostgreSQL.Simple as DPS
 
 
-triggerSearchUpdate :: Cmd err Int64
-triggerSearchUpdate = execPGSQuery query ( nodeTypeId NodeDocument
-                                         , nodeTypeId NodeDocument
-                                         , nodeTypeId NodeContact
+triggerSearchUpdate :: HasDBid NodeType => Cmd err Int64
+triggerSearchUpdate = execPGSQuery query ( toDBid NodeDocument
+                                         , toDBid NodeDocument
+                                         , toDBid NodeContact
                                          )
   where
     query :: DPS.Query
     query = [sql|
+        -- DROP TRIGGER search_update_trigger on nodes;
         CREATE OR REPLACE FUNCTION public.search_update()
         RETURNS trigger AS $$
         begin
@@ -51,7 +49,7 @@ triggerSearchUpdate = execPGSQuery query ( nodeTypeId NodeDocument
                                          || ' ' || (new.hyperdata ->> 'fonction')
                                      );
           ELSE
-            new.search := to_tsvector( 'english' , new.name);
+            new.search := to_tsvector( 'english' , (new.hyperdata ->> 'title') || ' ' || (new.hyperdata ->> 'abstract'));
           END IF;
           return new;
         end
@@ -63,9 +61,58 @@ triggerSearchUpdate = execPGSQuery query ( nodeTypeId NodeDocument
           BEFORE INSERT OR UPDATE
           ON nodes FOR EACH ROW
           EXECUTE PROCEDURE search_update();
-      
+
       -- Initialize index with already existing data
       UPDATE nodes SET hyperdata = hyperdata;
 
   |]
 
+type Secret = Text
+
+triggerUpdateHash :: HasDBid NodeType => Secret -> Cmd err Int64
+triggerUpdateHash secret = execPGSQuery query ( toDBid NodeDocument
+                                              , toDBid NodeContact
+                                              , secret
+                                              , secret
+                                              , toDBid NodeDocument
+                                              , toDBid NodeContact
+                                              , secret
+                                              , secret
+                                              )
+  where
+    query :: DPS.Query
+    query = [sql|
+
+      CREATE OR REPLACE FUNCTION hash_insert_nodes()
+      RETURNS trigger AS $$
+      BEGIN
+       IF NEW.hash_id = ''
+         THEN
+           IF NEW.typename = ? OR NEW.typename = ?
+             THEN NEW.hash_id = digest(CONCAT(?, NEW.typename, NEW.name, NEW.parent_id, NEW.hyperdata), 'sha256');
+             ELSE NEW.hash_id = digest(CONCAT(?, NEW.typename, NEW.name, NEW.id, NEW.hyperdata), 'sha256');
+           END IF;
+        END IF;
+        RETURN NEW;
+      END
+      $$ LANGUAGE plpgsql;
+
+
+      CREATE OR REPLACE FUNCTION hash_update_nodes()
+      RETURNS trigger AS $$
+      BEGIN
+        IF NEW.typename = ? OR NEW.typename = ?
+             THEN NEW.hash_id = digest(CONCAT(?, NEW.typename, NEW.name, NEW.parent_id, NEW.hyperdata), 'sha256');
+             ELSE NEW.hash_id = digest(CONCAT(?, NEW.typename, NEW.name, NEW.id, NEW.hyperdata), 'sha256');
+        END IF;
+        RETURN NEW;
+      END
+      $$ LANGUAGE plpgsql;
+
+
+      CREATE TRIGGER nodes_hash_insert BEFORE INSERT ON nodes FOR EACH ROW EXECUTE PROCEDURE hash_insert_nodes();
+      CREATE TRIGGER nodes_hash_update BEFORE UPDATE ON nodes FOR EACH ROW EXECUTE PROCEDURE hash_update_nodes();
+
+  |]
+
+