NodeNgram.hs 3.83 KB
Newer Older
1
{-|
2
Module      : Gargantext.Database.NodeNgrams
3
Description : NodeNgram for Ngram indexation or Lists
4 5 6 7 8 9
Copyright   : (c) CNRS, 2017-Present
License     : AGPL + CECILL v3
Maintainer  : team@gargantext.org
Stability   : experimental
Portability : POSIX

10 11 12 13 14
NodeNgram: relation between a Node and a Ngrams

if Node is a Document then it is indexing
if Node is a List     then it is listing (either Stop, Candidate or Map)

15 16 17 18 19 20
-}

{-# OPTIONS_GHC -fno-warn-orphans   #-}

{-# LANGUAGE Arrows                 #-}
{-# LANGUAGE FlexibleInstances      #-}
21
{-# LANGUAGE FunctionalDependencies #-}
22 23
{-# LANGUAGE MultiParamTypeClasses  #-}
{-# LANGUAGE NoImplicitPrelude      #-}
24
{-# LANGUAGE OverloadedStrings      #-}
25
{-# LANGUAGE QuasiQuotes            #-}
26
{-# LANGUAGE TemplateHaskell        #-}
27 28


29
-- TODO NodeNgrams
30 31
module Gargantext.Database.NodeNgram where

32
import Data.Text (Text)
33
import Control.Lens.TH (makeLensesWith, abbreviatedFields)
34 35 36
import Data.Profunctor.Product.TH (makeAdaptorAndInstance)
import Database.PostgreSQL.Simple.Types (Values(..), QualifiedIdentifier(..))
import Database.PostgreSQL.Simple.SqlQQ (sql)
37 38
import Gargantext.Database.Ngrams (NgramsId)
import Gargantext.Text.List.Types (ListId, ListTypeId)
39
import Gargantext.Database.Node (mkCmd, Cmd(..))
40
import Gargantext.Prelude
41
import Opaleye
42
import qualified Database.PostgreSQL.Simple as PGS (Connection, query, Only(..))
43

44
-- | TODO : remove id
45
data NodeNgramPoly id node_id ngram_id weight ngrams_type
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
   = NodeNgram { nodeNgram_NodeNgramId      :: id
               , nodeNgram_NodeNgramNodeId  :: node_id
               , nodeNgram_NodeNgramNgramId :: ngram_id
               , nodeNgram_NodeNgramWeight  :: weight
               , nodeNgram_NodeNgramType    :: ngrams_type
               } deriving (Show)

type NodeNgramWrite =
     NodeNgramPoly
        (Maybe (Column PGInt4  ))
               (Column PGInt4  )
               (Column PGInt4  )
               (Column PGFloat8)
               (Column PGInt4  )

type NodeNgramRead =
     NodeNgramPoly
       (Column PGInt4  )
       (Column PGInt4  )
       (Column PGInt4  )
       (Column PGFloat8)
       (Column PGInt4  )

type NodeNgram =
     NodeNgramPoly (Maybe Int) Int Int Double Int
71 72 73 74 75 76

$(makeAdaptorAndInstance "pNodeNgram" ''NodeNgramPoly)
$(makeLensesWith abbreviatedFields    ''NodeNgramPoly)


nodeNgramTable :: Table NodeNgramWrite NodeNgramRead
77 78 79 80 81 82 83 84 85
nodeNgramTable  = Table "nodes_ngrams"
  ( pNodeNgram NodeNgram
    { nodeNgram_NodeNgramId      = optional "id"
    , nodeNgram_NodeNgramNodeId  = required "node_id"
    , nodeNgram_NodeNgramNgramId = required "ngram_id"
    , nodeNgram_NodeNgramWeight  = required "weight"
    , nodeNgram_NodeNgramType    = required "ngrams_type"
    }
  )
86 87 88 89

queryNodeNgramTable :: Query NodeNgramRead
queryNodeNgramTable = queryTable nodeNgramTable

90
insertNodeNgrams :: [NodeNgram] -> Cmd Int
91 92 93 94 95
insertNodeNgrams = insertNodeNgramW
                 . map (\(NodeNgram _ n g w t) ->
                          NodeNgram Nothing (pgInt4 n)   (pgInt4 g)
                                            (pgDouble w) (pgInt4 t)
                        )
96 97

insertNodeNgramW :: [NodeNgramWrite] -> Cmd Int
98 99 100
insertNodeNgramW nns =
  mkCmd $ \c -> fromIntegral
       <$> runInsertMany c nodeNgramTable nns
101

102
type NgramsText = Text
103

104
updateNodeNgrams :: PGS.Connection -> [(ListId, NgramsText, ListTypeId)] -> IO [PGS.Only Int]
105 106
updateNodeNgrams c input = PGS.query c updateQuery (PGS.Only $ Values fields $ input)
  where
107
    fields = map (\t-> QualifiedIdentifier Nothing t) ["int4","text","int4"]
108 109
    updateQuery = [sql| UPDATE nodes_ngrams as old SET
                 ngrams_type = new.typeList
110 111
                 from (?) as new(node_id,terms,typeList)
                 JOIN ngrams ON ngrams.terms = new.terms
112
                 WHERE old.node_id = new.node_id
113 114
                 AND   old.ngram_id = ngrams.id;
                 -- RETURNING new.ngram_id
115 116
                 |]