Commit 42902202 authored by Alfredo Di Napoli's avatar Alfredo Di Napoli

Support improved document search

This commit also uses a temporary fork of boolexpr.
It allows to parse certain terms like "Niki" without choking.
parent f5bb11c9
Pipeline #4595 failed with stages
in 43 minutes and 31 seconds
...@@ -11,8 +11,8 @@ STORE_DIR="${1:-$DEFAULT_STORE}" ...@@ -11,8 +11,8 @@ STORE_DIR="${1:-$DEFAULT_STORE}"
# `expected_cabal_project_freeze_hash` with the # `expected_cabal_project_freeze_hash` with the
# `sha256sum` result calculated on the `cabal.project` and `cabal.project.freeze`. # `sha256sum` result calculated on the `cabal.project` and `cabal.project.freeze`.
# This ensures the files stay deterministic so that CI cache can kick in. # This ensures the files stay deterministic so that CI cache can kick in.
expected_cabal_project_hash="7b82fda55b0051a14b461ce3939e934da47e417794de69cb70973702c43e337e" expected_cabal_project_hash="297d2ac44b8a2e65a9d7bbbe1fb6e5e0ff46b144300501c14e5e424e77aa1abf"
expected_cabal_project_freeze_hash="b7acfd12c970323ffe2c6684a13130db09d8ec9fa5676a976afed329f1ef3436" expected_cabal_project_freeze_hash="2d3704d107bd8d08056ce4f0eb1f42202cb7f49a67c62a2445a6c70c7235f861"
cabal --store-dir=$STORE_DIR v2-update 'hackage.haskell.org,2023-06-24T21:28:46Z' cabal --store-dir=$STORE_DIR v2-update 'hackage.haskell.org,2023-06-24T21:28:46Z'
......
...@@ -7,6 +7,11 @@ with-compiler: ghc-8.10.7 ...@@ -7,6 +7,11 @@ with-compiler: ghc-8.10.7
packages: packages:
./ ./
source-repository-package
type: git
location: https://github.com/adinapoli/boolexpr.git
tag: 91928b5d7f9342e9865dde0d94862792d2b88779
source-repository-package source-repository-package
type: git type: git
location: https://github.com/adinapoli/haskell-opaleye.git location: https://github.com/adinapoli/haskell-opaleye.git
......
...@@ -384,7 +384,6 @@ constraints: any.AC-Angle ==1.0, ...@@ -384,7 +384,6 @@ constraints: any.AC-Angle ==1.0,
any.bodhi ==0.1.0, any.bodhi ==0.1.0,
any.boltzmann-samplers ==0.1.1.0, any.boltzmann-samplers ==0.1.1.0,
any.boolean-like ==0.1.1.0, any.boolean-like ==0.1.1.0,
any.boolexpr ==0.2,
any.boolsimplifier ==0.1.8, any.boolsimplifier ==0.1.8,
any.boots ==0.2.0.1, any.boots ==0.2.0.1,
any.bordacount ==0.1.0.0, any.bordacount ==0.1.0.0,
......
...@@ -44,7 +44,7 @@ import Test.QuickCheck.Arbitrary (Arbitrary, arbitrary) ...@@ -44,7 +44,7 @@ import Test.QuickCheck.Arbitrary (Arbitrary, arbitrary)
import Gargantext.API.HashedResponse import Gargantext.API.HashedResponse
import Gargantext.API.Ngrams.Types (TabType(..)) import Gargantext.API.Ngrams.Types (TabType(..))
import Gargantext.API.Prelude (GargServer) import Gargantext.API.Prelude (GargServer)
import Gargantext.Core.Text.Corpus.Query (RawQuery, parseQuery) import Gargantext.Core.Text.Corpus.Query (RawQuery, parseQuery, getRawQuery)
import Gargantext.Core.Types (TableResult(..)) import Gargantext.Core.Types (TableResult(..))
import Gargantext.Core.Types.Query (Offset, Limit) import Gargantext.Core.Types.Query (Offset, Limit)
import Gargantext.Core.Utils.Prefix (unPrefix, unPrefixSwagger) import Gargantext.Core.Utils.Prefix (unPrefix, unPrefixSwagger)
...@@ -55,6 +55,8 @@ import Gargantext.Database.Prelude -- (Cmd, CmdM) ...@@ -55,6 +55,8 @@ import Gargantext.Database.Prelude -- (Cmd, CmdM)
import Gargantext.Database.Query.Facet (FacetDoc , runViewDocuments, runCountDocuments, OrderBy(..), runViewAuthorsDoc) import Gargantext.Database.Query.Facet (FacetDoc , runViewDocuments, runCountDocuments, OrderBy(..), runViewAuthorsDoc)
import Gargantext.Database.Query.Table.Node.Error (HasNodeError) import Gargantext.Database.Query.Table.Node.Error (HasNodeError)
import Gargantext.Prelude import Gargantext.Prelude
import Gargantext.System.Logging
import qualified Data.Text as T
------------------------------------------------------------------------ ------------------------------------------------------------------------
...@@ -63,7 +65,7 @@ type TableApi = Summary "Table API" ...@@ -63,7 +65,7 @@ type TableApi = Summary "Table API"
:> QueryParam "limit" Limit :> QueryParam "limit" Limit
:> QueryParam "offset" Offset :> QueryParam "offset" Offset
:> QueryParam "orderBy" OrderBy :> QueryParam "orderBy" OrderBy
:> QueryParam "query" Text :> QueryParam "query" RawQuery
:> QueryParam "year" Text :> QueryParam "year" Text
:> Get '[JSON] (HashedResponse FacetTableResult) :> Get '[JSON] (HashedResponse FacetTableResult)
:<|> Summary "Table API (POST)" :<|> Summary "Table API (POST)"
...@@ -103,47 +105,67 @@ tableApi id' = getTableApi id' ...@@ -103,47 +105,67 @@ tableApi id' = getTableApi id'
:<|> getTableHashApi id' :<|> getTableHashApi id'
getTableApi :: HasNodeError err getTableApi :: (CmdM env err m, HasNodeError err, MonadLogger m)
=> NodeId => NodeId
-> Maybe TabType -> Maybe TabType
-> Maybe Limit -> Maybe Limit
-> Maybe Offset -> Maybe Offset
-> Maybe OrderBy -> Maybe OrderBy
-> Maybe RawQuery
-> Maybe Text -> Maybe Text
-> Maybe Text -> m (HashedResponse FacetTableResult)
-> Cmd err (HashedResponse FacetTableResult) getTableApi cId tabType mLimit mOffset mOrderBy mQuery mYear =
getTableApi cId tabType mLimit mOffset mOrderBy mQuery mYear = do case mQuery of
-- printDebug "[getTableApi] mQuery" mQuery Nothing -> get_table
-- printDebug "[getTableApi] mYear" mYear Just "" -> get_table
t <- getTable cId tabType mOffset mLimit mOrderBy mQuery mYear Just q -> case tabType of
pure $ constructHashedResponse t Just Docs
-> do
postTableApi :: HasNodeError err => NodeId -> TableQuery -> Cmd err FacetTableResult $(logLocM) DEBUG $ "New search with query " <> getRawQuery q
constructHashedResponse <$> searchInCorpus' cId False q mOffset mLimit mOrderBy
Just Trash
-> constructHashedResponse <$> searchInCorpus' cId True q mOffset mLimit mOrderBy
_ -> get_table
where
get_table = do
$(logLocM) DEBUG $ "getTable cId = " <> T.pack (show cId)
t <- getTable cId tabType mOffset mLimit mOrderBy mQuery mYear
pure $ constructHashedResponse t
postTableApi :: (CmdM env err m, MonadLogger m, HasNodeError err) => NodeId -> TableQuery -> m FacetTableResult
postTableApi cId tq = case tq of postTableApi cId tq = case tq of
TableQuery o l order ft "" -> getTable cId (Just ft) (Just o) (Just l) (Just order) Nothing Nothing TableQuery o l order ft "" -> do
$(logLocM) DEBUG $ "New search with no query"
getTable cId (Just ft) (Just o) (Just l) (Just order) Nothing Nothing
TableQuery o l order ft q -> case ft of TableQuery o l order ft q -> case ft of
Docs -> searchInCorpus' cId False q (Just o) (Just l) (Just order) Docs -> do
$(logLocM) DEBUG $ "New search with query " <> getRawQuery q
searchInCorpus' cId False q (Just o) (Just l) (Just order)
Trash -> searchInCorpus' cId True q (Just o) (Just l) (Just order) Trash -> searchInCorpus' cId True q (Just o) (Just l) (Just order)
x -> panic $ "not implemented in tableApi " <> (cs $ show x) x -> panic $ "not implemented in tableApi " <> (cs $ show x)
getTableHashApi :: HasNodeError err getTableHashApi :: (CmdM env err m, HasNodeError err, MonadLogger m)
=> NodeId -> Maybe TabType -> Cmd err Text => NodeId
-> Maybe TabType
-> m Text
getTableHashApi cId tabType = do getTableHashApi cId tabType = do
HashedResponse { hash = h } <- getTableApi cId tabType Nothing Nothing Nothing Nothing Nothing HashedResponse { hash = h } <- getTableApi cId tabType Nothing Nothing Nothing Nothing Nothing
pure h pure h
searchInCorpus' :: CorpusId searchInCorpus' :: (CmdM env err m, MonadLogger m)
=> CorpusId
-> Bool -> Bool
-> RawQuery -> RawQuery
-> Maybe Offset -> Maybe Offset
-> Maybe Limit -> Maybe Limit
-> Maybe OrderBy -> Maybe OrderBy
-> Cmd err FacetTableResult -> m FacetTableResult
searchInCorpus' cId t q o l order = do searchInCorpus' cId t q o l order = do
case parseQuery q of case parseQuery q of
-- FIXME(adn) The error handling needs to be monomorphic over GargErr. -- FIXME(adn) The error handling needs to be monomorphic over GargErr.
Left _noParseErr -> do Left noParseErr -> do
-- - $(logLocM) ERROR $ "Invalid input query " <> (getRawQuery q) <> " , error = " <> (T.pack noParseErr) $(logLocM) ERROR $ "Invalid input query " <> (getRawQuery q) <> " , error = " <> (T.pack noParseErr)
pure $ TableResult 0 [] pure $ TableResult 0 []
Right boolQuery -> do Right boolQuery -> do
docs <- searchInCorpus cId t boolQuery o l order docs <- searchInCorpus cId t boolQuery o l order
...@@ -157,13 +179,15 @@ getTable :: HasNodeError err ...@@ -157,13 +179,15 @@ getTable :: HasNodeError err
-> Maybe Offset -> Maybe Offset
-> Maybe Limit -> Maybe Limit
-> Maybe OrderBy -> Maybe OrderBy
-> Maybe Text -> Maybe RawQuery
-> Maybe Text -> Maybe Text
-> Cmd err FacetTableResult -> Cmd err FacetTableResult
getTable cId ft o l order query year = do getTable cId ft o l order raw_query year = do
docs <- getTable' cId ft o l order query year docs <- getTable' cId ft o l order query year
docsCount <- runCountDocuments cId (ft == Just Trash) query year docsCount <- runCountDocuments cId (ft == Just Trash) query year
pure $ TableResult { tr_docs = docs, tr_count = docsCount } pure $ TableResult { tr_docs = docs, tr_count = docsCount }
where
query = getRawQuery <$> raw_query
getTable' :: HasNodeError err getTable' :: HasNodeError err
=> NodeId => NodeId
......
...@@ -98,12 +98,14 @@ extra-deps: ...@@ -98,12 +98,14 @@ extra-deps:
commit: b9fca8beee0f23c17a6b2001ec834d071709e6e7 commit: b9fca8beee0f23c17a6b2001ec834d071709e6e7
subdirs: subdirs:
- packages/base - packages/base
# Temporary fork of boolexpr
- git: https://github.com/adinapoli/boolexpr.git
commit: 91928b5d7f9342e9865dde0d94862792d2b88779
# Others dependencies (using stack resolver) # Others dependencies (using stack resolver)
- HSvm-0.1.1.3.22 - HSvm-0.1.1.3.22
- KMP-0.2.0.0@sha256:6dfbac03ef00ebd9347234732cb86a40f62ab5a80c0cc6bedb8eb51766f7df28,2562 - KMP-0.2.0.0@sha256:6dfbac03ef00ebd9347234732cb86a40f62ab5a80c0cc6bedb8eb51766f7df28,2562
- MissingH-1.4.3.0@sha256:32f9892ec98cd21df4f4d3ed8d95a3831ae74287ea0641d6f09b2dc6ef061d39,4859 - MissingH-1.4.3.0@sha256:32f9892ec98cd21df4f4d3ed8d95a3831ae74287ea0641d6f09b2dc6ef061d39,4859
- Unique-0.4.7.8@sha256:9661f45aa31dde119a2114566166ea38b011a45653337045ee4ced75636533c0,2067 - Unique-0.4.7.8@sha256:9661f45aa31dde119a2114566166ea38b011a45653337045ee4ced75636533c0,2067
- boolexpr-0.2
- constraints-extras-0.3.1.0@sha256:12016ebb91ad5ed2c82bf7e48c6bd6947d164d33c9dca5ac3965de1bb6c780c0,1777 - constraints-extras-0.3.1.0@sha256:12016ebb91ad5ed2c82bf7e48c6bd6947d164d33c9dca5ac3965de1bb6c780c0,1777
- context-0.2.0.0@sha256:6b643adb4a64fe521873d08df0497f71f88e18b9ecff4b68b4eef938e446cfc9,1886 - context-0.2.0.0@sha256:6b643adb4a64fe521873d08df0497f71f88e18b9ecff4b68b4eef938e446cfc9,1886
- dependent-sum-0.7.1.0@sha256:0e419237f5b86da3659772afff9cab355c0f8d5b3fdb15a5b30e673d8dc83941,2147 - dependent-sum-0.7.1.0@sha256:0e419237f5b86da3659772afff9cab355c0f8d5b3fdb15a5b30e673d8dc83941,2147
......
...@@ -42,6 +42,10 @@ tests = withResource pubmedSettings (const (pure ())) $ \getPubmedKey -> ...@@ -42,6 +42,10 @@ tests = withResource pubmedSettings (const (pure ())) $ \getPubmedKey ->
, testProperty "Parses 'A AND B -C' (left associative)" testParse05 , testProperty "Parses 'A AND B -C' (left associative)" testParse05
, testProperty "Parses 'A AND (B -C)' (right associative)" testParse05_01 , testProperty "Parses 'A AND (B -C)' (right associative)" testParse05_01
, testProperty "Parses (A OR B OR NOT C) AND (D OR E OR F) -(G OR H OR I)" testParse06 , testProperty "Parses (A OR B OR NOT C) AND (D OR E OR F) -(G OR H OR I)" testParse06
, testProperty "It supports '\"Haskell\" AND \"Idris\"'" testParse07
, testProperty "It supports 'Haskell AND Idris'" testParse07_01
, testProperty "It supports 'Raphael'" testParse07_02
, testProperty "It supports 'Niki', 'Ajeje' and 'Orf'" testParse07_03
, testCase "Parses words into a single constant" testWordsIntoConst , testCase "Parses words into a single constant" testWordsIntoConst
, testGroup "Arxiv expression converter" [ , testGroup "Arxiv expression converter" [
testCase "It supports 'A AND B'" testArxiv01_01 testCase "It supports 'A AND B'" testArxiv01_01
...@@ -124,6 +128,27 @@ testParse06 = ...@@ -124,6 +128,27 @@ testParse06 =
) )
) )
testParse07 :: Property
testParse07 =
translatesInto "\"Haskell\" AND \"Agda\""
((BConst (Positive "Haskell") `BAnd` (BConst (Positive "Agda"))))
testParse07_01 :: Property
testParse07_01 =
translatesInto "Haskell AND Agda"
((BConst (Positive "Haskell") `BAnd` (BConst (Positive "Agda"))))
testParse07_02 :: Property
testParse07_02 =
translatesInto "Raphael"
((BConst (Positive "Raphael")))
testParse07_03 :: Property
testParse07_03 =
translatesInto "Niki" ((BConst (Positive "Niki"))) .&&.
translatesInto "Ajeje" ((BConst (Positive "Ajeje"))) .&&.
translatesInto "Orf" ((BConst (Positive "Orf")))
testWordsIntoConst :: Assertion testWordsIntoConst :: Assertion
testWordsIntoConst = testWordsIntoConst =
let (expected :: BoolExpr Term) = let (expected :: BoolExpr Term) =
......
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