[graphql] use FTS instead of context table match for context ngrams

parent 6645b901
Pipeline #4111 canceled with stages
...@@ -20,7 +20,7 @@ import Gargantext.Core.Types.Search (HyperdataRow(..), toHyperdataRow) ...@@ -20,7 +20,7 @@ import Gargantext.Core.Types.Search (HyperdataRow(..), toHyperdataRow)
import Gargantext.Database.Admin.Types.Hyperdata (HyperdataDocument) import Gargantext.Database.Admin.Types.Hyperdata (HyperdataDocument)
import Gargantext.Database.Admin.Types.Node (ContextTitle, NodeId(..), NodeTypeId, UserId, unNodeId) import Gargantext.Database.Admin.Types.Node (ContextTitle, NodeId(..), NodeTypeId, UserId, unNodeId)
import Gargantext.Database.Prelude (CmdCommon) 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 qualified Gargantext.Database.Query.Table.NodeContext as DNC
import Gargantext.Database.Schema.NodeContext (NodeContext, NodeContextPoly(..)) import Gargantext.Database.Schema.NodeContext (NodeContext, NodeContextPoly(..))
import Gargantext.Prelude import Gargantext.Prelude
...@@ -150,7 +150,7 @@ dbContextNgrams ...@@ -150,7 +150,7 @@ dbContextNgrams
:: (CmdCommon env) :: (CmdCommon env)
=> Int -> Int -> GqlM e env [Text] => Int -> Int -> GqlM e env [Text]
dbContextNgrams context_id list_id = do dbContextNgrams context_id list_id = do
lift $ getContextNgrams (NodeId context_id) (NodeId list_id) lift $ getContextNgramsMatchingFTS (NodeId context_id) (NodeId list_id)
-- Conversion functions -- Conversion functions
......
...@@ -34,6 +34,7 @@ module Gargantext.Database.Query.Table.NodeContext ...@@ -34,6 +34,7 @@ module Gargantext.Database.Query.Table.NodeContext
, ContextForNgrams(..) , ContextForNgrams(..)
, getContextsForNgramsTerms , getContextsForNgramsTerms
, getContextNgrams , getContextNgrams
, getContextNgramsMatchingFTS
, ContextForNgramsTerms(..) , ContextForNgramsTerms(..)
, insertNodeContext , insertNodeContext
, deleteNodeContext , deleteNodeContext
...@@ -191,6 +192,9 @@ getContextsForNgramsTerms cId ngramsTerms = do ...@@ -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 getContextNgrams :: HasNodeError err
=> NodeId => NodeId
-> NodeId -> NodeId
...@@ -206,6 +210,29 @@ getContextNgrams contextId listId = do ...@@ -206,6 +210,29 @@ getContextNgrams contextId listId = do
JOIN ngrams ON ngrams.id = ngrams_id JOIN ngrams ON ngrams.id = ngrams_id
WHERE context_id = ? WHERE context_id = ?
AND node_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 :: [NodeContext] -> Cmd err Int
insertNodeContext ns = mkCmd $ \conn -> fromIntegral <$> (runInsert_ conn insertNodeContext ns = mkCmd $ \conn -> fromIntegral <$> (runInsert_ conn
......
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