Commit 9a203130 authored by Karen Konou's avatar Karen Konou

[Contexts for ngrams] Support AND search

parent e147c115
...@@ -94,6 +94,7 @@ data ContextsForNgramsArgs ...@@ -94,6 +94,7 @@ data ContextsForNgramsArgs
= ContextsForNgramsArgs = ContextsForNgramsArgs
{ corpus_id :: Int { corpus_id :: Int
, ngrams_terms :: [Text] , ngrams_terms :: [Text]
, and_logic :: Bool
} deriving (Generic, GQLType) } deriving (Generic, GQLType)
data NodeContextCategoryMArgs = NodeContextCategoryMArgs data NodeContextCategoryMArgs = NodeContextCategoryMArgs
...@@ -123,8 +124,8 @@ resolveNodeContext NodeContextArgs { context_id, node_id } = ...@@ -123,8 +124,8 @@ resolveNodeContext NodeContextArgs { context_id, node_id } =
resolveContextsForNgrams resolveContextsForNgrams
:: (CmdCommon env) :: (CmdCommon env)
=> ContextsForNgramsArgs -> GqlM e env [ContextGQL] => ContextsForNgramsArgs -> GqlM e env [ContextGQL]
resolveContextsForNgrams ContextsForNgramsArgs { corpus_id, ngrams_terms } = resolveContextsForNgrams ContextsForNgramsArgs { corpus_id, ngrams_terms, and_logic } =
dbContextForNgrams corpus_id ngrams_terms dbContextForNgrams corpus_id ngrams_terms and_logic
resolveContextNgrams resolveContextNgrams
:: (CmdCommon env) :: (CmdCommon env)
...@@ -149,9 +150,9 @@ dbNodeContext context_id node_id = do ...@@ -149,9 +150,9 @@ dbNodeContext context_id node_id = do
-- | Returns list of `ContextGQL` for given ngrams in given corpus id. -- | Returns list of `ContextGQL` for given ngrams in given corpus id.
dbContextForNgrams dbContextForNgrams
:: (CmdCommon env) :: (CmdCommon env)
=> Int -> [Text] -> GqlM e env [ContextGQL] => Int -> [Text] -> Bool -> GqlM e env [ContextGQL]
dbContextForNgrams node_id ngrams_terms = do dbContextForNgrams node_id ngrams_terms and_logic = do
contextsForNgramsTerms <- lift $ getContextsForNgramsTerms (UnsafeMkNodeId node_id) ngrams_terms contextsForNgramsTerms <- lift $ getContextsForNgramsTerms (UnsafeMkNodeId node_id) ngrams_terms and_logic
--lift $ printDebug "[dbContextForNgrams] contextsForNgramsTerms" contextsForNgramsTerms --lift $ printDebug "[dbContextForNgrams] contextsForNgramsTerms" contextsForNgramsTerms
pure $ toContextGQL <$> contextsForNgramsTerms pure $ toContextGQL <$> contextsForNgramsTerms
......
...@@ -152,9 +152,11 @@ data ContextForNgramsTerms = ...@@ -152,9 +152,11 @@ data ContextForNgramsTerms =
getContextsForNgramsTerms :: HasNodeError err getContextsForNgramsTerms :: HasNodeError err
=> NodeId => NodeId
-> [Text] -> [Text]
-> Bool
-> DBCmd err [ContextForNgramsTerms] -> DBCmd err [ContextForNgramsTerms]
getContextsForNgramsTerms cId ngramsTerms = do getContextsForNgramsTerms cId ngramsTerms and_logic = do
res <- runPGSQuery query (cId, PGS.In ngramsTerms) let terms_length = length ngramsTerms
res <- runPGSQuery (query and_logic) (cId, PGS.In ngramsTerms, terms_length)
pure $ (\( _cfnt_nodeId pure $ (\( _cfnt_nodeId
, _cfnt_hash , _cfnt_hash
, _cfnt_nodeTypeId , _cfnt_nodeTypeId
...@@ -166,8 +168,8 @@ getContextsForNgramsTerms cId ngramsTerms = do ...@@ -166,8 +168,8 @@ getContextsForNgramsTerms cId ngramsTerms = do
, _cfnt_score , _cfnt_score
, _cfnt_category) -> ContextForNgramsTerms { .. }) <$> res , _cfnt_category) -> ContextForNgramsTerms { .. }) <$> res
where where
query :: PGS.Query query :: Bool -> PGS.Query
query = [sql| SELECT t.id, t.hash_id, t.typename, t.user_id, t.parent_id, t.name, t.date, t.hyperdata, t.score, t.category query False = [sql| SELECT t.id, t.hash_id, t.typename, t.user_id, t.parent_id, t.name, t.date, t.hyperdata, t.score, t.category
FROM ( FROM (
SELECT DISTINCT ON (contexts.id) SELECT DISTINCT ON (contexts.id)
contexts.id AS id, contexts.id AS id,
...@@ -190,6 +192,31 @@ getContextsForNgramsTerms cId ngramsTerms = do ...@@ -190,6 +192,31 @@ getContextsForNgramsTerms cId ngramsTerms = do
-- ORDER BY t.doc_count DESC -- ORDER BY t.doc_count DESC
ORDER BY t.score DESC ORDER BY t.score DESC
|] |]
query True = [sql| SELECT t.id, t.hash_id, t.typename, t.user_id, t.parent_id, t.name, t.date, t.hyperdata, t.score, t.category
FROM (
SELECT DISTINCT ON (contexts.id)
contexts.id AS id,
hash_id,
typename,
user_id,
parent_id,
name,
date,
hyperdata,
nodes_contexts.score AS score,
nodes_contexts.category AS category --,
-- context_node_ngrams.doc_count AS doc_count
FROM contexts
JOIN context_node_ngrams ON contexts.id = context_node_ngrams.context_id
JOIN nodes_contexts ON contexts.id = nodes_contexts.context_id
JOIN ngrams ON context_node_ngrams.ngrams_id = ngrams.id
WHERE nodes_contexts.node_id = ?
AND ngrams.terms IN ?
GROUP BY contexts.id
HAVING COUNT(DISTINCT ngrams.terms) = ?) t
-- ORDER BY t.doc_count DESC
ORDER BY t.score DESC
|]
......
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