2 Module : Gargantext.Database.Schema.NodeNgrams
3 Description : NodeNgram for Ngram indexation or Lists
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
10 NodeNgram: relation between a Node and a Ngrams
12 if Node is a Document then it is indexing
13 if Node is a List then it is listing (either Stop, Candidate or Map)
17 {-# OPTIONS_GHC -fno-warn-orphans #-}
19 {-# LANGUAGE Arrows #-}
20 {-# LANGUAGE FlexibleInstances #-}
21 {-# LANGUAGE FunctionalDependencies #-}
22 {-# LANGUAGE MultiParamTypeClasses #-}
23 {-# LANGUAGE NoImplicitPrelude #-}
24 {-# LANGUAGE OverloadedStrings #-}
25 {-# LANGUAGE QuasiQuotes #-}
26 {-# LANGUAGE RankNTypes #-}
27 {-# LANGUAGE TemplateHaskell #-}
31 module Gargantext.Database.Schema.NodeNgram where
33 import Data.Text (Text)
34 import Control.Lens.TH (makeLensesWith, abbreviatedFields)
35 import Data.Profunctor.Product.TH (makeAdaptorAndInstance)
36 import Database.PostgreSQL.Simple.Types (Values(..), QualifiedIdentifier(..))
37 import Database.PostgreSQL.Simple.SqlQQ (sql)
38 import Gargantext.Core.Types.Main (ListId, ListTypeId)
39 import Gargantext.Database.Utils (mkCmd, Cmd, runPGSQuery)
40 import Gargantext.Prelude
42 import qualified Database.PostgreSQL.Simple as PGS (Only(..))
45 data NodeNgramPoly id node_id ngram_id weight ngrams_type
46 = NodeNgram { nodeNgram_id :: id
47 , nodeNgram_node_id :: node_id
48 , nodeNgram_ngrams_id :: ngram_id
49 , nodeNgram_weight :: weight
50 , nodeNgram_type :: ngrams_type
55 (Maybe (Column PGInt4 ))
69 type NodeNgramReadNull =
71 (Column (Nullable PGInt4 ))
72 (Column (Nullable PGInt4 ))
73 (Column (Nullable PGInt4 ))
74 (Column (Nullable PGFloat8))
75 (Column (Nullable PGInt4 ))
78 NodeNgramPoly (Maybe Int) Int Int Double Int
80 $(makeAdaptorAndInstance "pNodeNgram" ''NodeNgramPoly)
81 $(makeLensesWith abbreviatedFields ''NodeNgramPoly)
84 nodeNgramTable :: Table NodeNgramWrite NodeNgramRead
85 nodeNgramTable = Table "nodes_ngrams"
86 ( pNodeNgram NodeNgram
87 { nodeNgram_id = optional "id"
88 , nodeNgram_node_id = required "node_id"
89 , nodeNgram_ngrams_id = required "ngram_id"
90 , nodeNgram_weight = required "weight"
91 , nodeNgram_type = required "ngrams_type"
95 queryNodeNgramTable :: Query NodeNgramRead
96 queryNodeNgramTable = queryTable nodeNgramTable
98 insertNodeNgrams :: [NodeNgram] -> Cmd err Int
99 insertNodeNgrams = insertNodeNgramW
100 . map (\(NodeNgram _ n g w t) ->
101 NodeNgram Nothing (pgInt4 n) (pgInt4 g)
102 (pgDouble w) (pgInt4 t)
105 insertNodeNgramW :: [NodeNgramWrite] -> Cmd err Int
106 insertNodeNgramW nns =
107 mkCmd $ \c -> fromIntegral <$> runInsert_ c insertNothing
109 insertNothing = (Insert { iTable = nodeNgramTable
111 , iReturning = rCount
112 , iOnConflict = (Just DoNothing)
115 type NgramsText = Text
117 updateNodeNgrams :: [(ListId, NgramsText, ListTypeId)] -> Cmd err [PGS.Only Int]
118 updateNodeNgrams input = runPGSQuery updateQuery (PGS.Only $ Values fields $ input)
120 fields = map (\t-> QualifiedIdentifier Nothing t) ["int4","text","int4"]
121 updateQuery = [sql| UPDATE nodes_ngrams as old SET
122 ngrams_type = new.typeList
123 from (?) as new(node_id,terms,typeList)
124 JOIN ngrams ON ngrams.terms = new.terms
125 WHERE old.node_id = new.node_id
126 AND old.ngram_id = ngrams.id;
127 -- RETURNING new.ngram_id