2 Module : Gargantext.Core.Text.Corpus.API.Pubmed
3 Description : Pubmed API connection
4 Copyright : (c) CNRS, 2017
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
13 module Gargantext.Core.Text.Corpus.API.Pubmed
17 import Data.Either (Either)
19 import Data.Text (Text)
20 import qualified Data.Text as Text
21 import Servant.Client (ClientError)
23 import Gargantext.Prelude
24 import Gargantext.Core (Lang(..))
25 import Gargantext.Database.Admin.Types.Hyperdata (HyperdataDocument(..))
27 import qualified PUBMED as PubMed
28 import qualified PUBMED.Parser as PubMedDoc
32 type Limit = PubMed.Limit
35 -- | TODO put default pubmed query in gargantext.ini
36 -- by default: 10K docs
37 get :: Query -> Maybe Limit -> IO (Either ClientError (Maybe Integer, ConduitT () HyperdataDocument IO ()))
39 eRes <- PubMed.getMetadataWithC q l
40 pure $ (\(len, docsC) -> (len, docsC .| mapC (toDoc EN))) <$> eRes
41 --either (\e -> panic $ "CRAWL: PubMed" <> e) (map (toDoc EN))
42 -- <$> PubMed.getMetadataWithC q l
44 toDoc :: Lang -> PubMedDoc.PubMed -> HyperdataDocument
45 toDoc l (PubMedDoc.PubMed (PubMedDoc.PubMedArticle t j as aus)
46 (PubMedDoc.PubMedDate a y m d)
47 ) = HyperdataDocument { _hd_bdd = Just "PubMed"
50 , _hd_uniqId = Nothing
51 , _hd_uniqIdBdd = Nothing
54 , _hd_authors = authors aus
55 , _hd_institutes = institutes aus
57 , _hd_abstract = abstract as
58 , _hd_publication_date = Just $ Text.pack $ show a
59 , _hd_publication_year = Just $ fromIntegral y
60 , _hd_publication_month = Just m
61 , _hd_publication_day = Just d
62 , _hd_publication_hour = Nothing
63 , _hd_publication_minute = Nothing
64 , _hd_publication_second = Nothing
65 , _hd_language_iso2 = Just $ (Text.pack . show) l }
67 authors :: [PubMedDoc.Author] -> Maybe Text
69 authors au = Just $ (Text.intercalate ", ")
71 $ map (\n -> PubMedDoc.foreName n <> Just " " <> PubMedDoc.lastName n) au
73 institutes :: [PubMedDoc.Author] -> Maybe Text
74 institutes [] = Nothing
75 institutes au = Just $ (Text.intercalate ", ")
76 $ (map (Text.replace ", " " - "))
78 $ map PubMedDoc.affiliation au
81 abstract :: [Text] -> Maybe Text
83 abstract as' = Just $ Text.intercalate ", " as'