diff --git a/src/Gargantext/API/GraphQL/Context.hs b/src/Gargantext/API/GraphQL/Context.hs index 3157ce385a83cfb1dd64abe2a51ca50ce95674a9..fe5e0e52e13d56cfdabc102b1d9fc0044922b73c 100644 --- a/src/Gargantext/API/GraphQL/Context.hs +++ b/src/Gargantext/API/GraphQL/Context.hs @@ -20,7 +20,7 @@ import Gargantext.Core.Types.Search (HyperdataRow(..), toHyperdataRow) import Gargantext.Database.Admin.Types.Hyperdata (HyperdataDocument) import Gargantext.Database.Admin.Types.Node (ContextTitle, NodeId(..), NodeTypeId, UserId, unNodeId) import Gargantext.Database.Prelude (CmdCommon) -import Gargantext.Database.Query.Table.NodeContext (getNodeContext, getContextsForNgramsTerms, ContextForNgramsTerms(..), getContextNgrams) +import Gargantext.Database.Query.Table.NodeContext (getNodeContext, getContextsForNgramsTerms, ContextForNgramsTerms(..), {- getContextNgrams, -} getContextNgramsMatchingFTS) import qualified Gargantext.Database.Query.Table.NodeContext as DNC import Gargantext.Database.Schema.NodeContext (NodeContext, NodeContextPoly(..)) import Gargantext.Prelude @@ -150,7 +150,7 @@ dbContextNgrams :: (CmdCommon env) => Int -> Int -> GqlM e env [Text] dbContextNgrams context_id list_id = do - lift $ getContextNgrams (NodeId context_id) (NodeId list_id) + lift $ getContextNgramsMatchingFTS (NodeId context_id) (NodeId list_id) -- Conversion functions diff --git a/src/Gargantext/Database/Query/Table/NodeContext.hs b/src/Gargantext/Database/Query/Table/NodeContext.hs index 0bd5f3927dcdb9ff5ebedc3b02c510a563203c0f..8136194ce3d1c93661c6203d7d921571baff65d5 100644 --- a/src/Gargantext/Database/Query/Table/NodeContext.hs +++ b/src/Gargantext/Database/Query/Table/NodeContext.hs @@ -34,6 +34,7 @@ module Gargantext.Database.Query.Table.NodeContext , ContextForNgrams(..) , getContextsForNgramsTerms , getContextNgrams + , getContextNgramsMatchingFTS , ContextForNgramsTerms(..) , insertNodeContext , deleteNodeContext @@ -191,6 +192,9 @@ getContextsForNgramsTerms cId ngramsTerms = do +-- | Query the `context_node_ngrams` table and return ngrams for given +-- `context_id` and `list_id`. +-- WARNING: `context_node_ngrams` can be outdated. getContextNgrams :: HasNodeError err => NodeId -> NodeId @@ -206,6 +210,29 @@ getContextNgrams contextId listId = do JOIN ngrams ON ngrams.id = ngrams_id WHERE context_id = ? AND node_id = ? |] + + +-- | Query the `contexts` table and return ngrams for given context_id +-- and list_id that match the search tsvector. +-- NOTE This is poor man's tokenization that is used as a hint for the +-- frontend highlighter. +getContextNgramsMatchingFTS :: HasNodeError err + => NodeId + -> NodeId + -> Cmd err [Text] +getContextNgramsMatchingFTS contextId listId = do + res <- runPGSQuery query (contextId, listId) + pure $ (\(PGS.Only term) -> term) <$> res + + where + query :: PGS.Query + query = [sql| SELECT ngrams.terms + FROM ngrams + JOIN node_ngrams ON node_ngrams.ngrams_id = ngrams.id + CROSS JOIN contexts + WHERE contexts.id = ? + AND node_ngrams.node_id = ? + AND contexts.search @@ phraseto_tsquery(ngrams.terms) |] ------------------------------------------------------------------------ insertNodeContext :: [NodeContext] -> Cmd err Int insertNodeContext ns = mkCmd $ \conn -> fromIntegral <$> (runInsert_ conn