Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
purescript-gargantext
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Grégoire Locqueville
purescript-gargantext
Commits
cbc4ab71
Verified
Commit
cbc4ab71
authored
Sep 02, 2021
by
Przemyslaw Kaminski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[search] fix deserialization of search rest API json
parent
218c15b8
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
112 additions
and
48 deletions
+112
-48
FacetsTable.purs
src/Gargantext/Components/FacetsTable.purs
+26
-28
Search.purs
src/Gargantext/Components/Search.purs
+22
-20
SimpleJSON.purs
src/Gargantext/Utils/SimpleJSON.purs
+64
-0
No files found.
src/Gargantext/Components/FacetsTable.purs
View file @
cbc4ab71
...
@@ -5,6 +5,7 @@ module Gargantext.Components.FacetsTable where
...
@@ -5,6 +5,7 @@ module Gargantext.Components.FacetsTable where
import Gargantext.Prelude
import Gargantext.Prelude
import DOM.Simple.Console (log2)
import Data.Either (Either(..))
import Data.Either (Either(..))
import Data.Eq.Generic (genericEq)
import Data.Eq.Generic (genericEq)
import Data.Generic.Rep (class Generic)
import Data.Generic.Rep (class Generic)
...
@@ -18,17 +19,13 @@ import Data.Show.Generic (genericShow)
...
@@ -18,17 +19,13 @@ import Data.Show.Generic (genericShow)
import Data.Tuple.Nested ((/\))
import Data.Tuple.Nested ((/\))
import Effect (Effect)
import Effect (Effect)
import Effect.Aff (Aff, launchAff_)
import Effect.Aff (Aff, launchAff_)
import Reactix as R
import Effect.Class (liftEffect)
import Reactix.DOM.HTML as H
import Simple.JSON as JSON
import Toestand as T
import Gargantext.Components.Category (CategoryQuery(..), putCategories)
import Gargantext.Components.Category (CategoryQuery(..), putCategories)
import Gargantext.Components.Category.Types (Category(..), decodeCategory, favCategory)
import Gargantext.Components.Category.Types (Category(..), decodeCategory, favCategory)
import Gargantext.Components.Search (Contact(..), Document(..), HyperdataRowContact(..), HyperdataRowDocument(..), SearchQuery, SearchResult(..), SearchResultTypes(..))
import Gargantext.Components.Search (Contact(..), Document(..), HyperdataRowContact(..), HyperdataRowDocument(..), SearchQuery, SearchResult(..), SearchResultTypes(..))
import Gargantext.Components.Table as T
import Gargantext.Components.Table as T
import Gargantext.Components.Table.Types as T
import Gargantext.Components.Table.Types as T
import Gargantext.Config.REST (RESTError)
import Gargantext.Config.REST (RESTError
(..)
)
import Gargantext.Ends (url, Frontends)
import Gargantext.Ends (url, Frontends)
import Gargantext.Hooks.Loader (useLoader)
import Gargantext.Hooks.Loader (useLoader)
import Gargantext.Routes (SessionRoute(Search, NodeAPI))
import Gargantext.Routes (SessionRoute(Search, NodeAPI))
...
@@ -37,6 +34,10 @@ import Gargantext.Sessions (Session, sessionId, post, deleteWithBody)
...
@@ -37,6 +34,10 @@ import Gargantext.Sessions (Session, sessionId, post, deleteWithBody)
import Gargantext.Types (NodeType(..), OrderBy(..), NodeID)
import Gargantext.Types (NodeType(..), OrderBy(..), NodeID)
import Gargantext.Utils (toggleSet, zeroPad)
import Gargantext.Utils (toggleSet, zeroPad)
import Gargantext.Utils.Reactix as R2
import Gargantext.Utils.Reactix as R2
import Reactix as R
import Reactix.DOM.HTML as H
import Simple.JSON as JSON
import Toestand as T
here :: R2.Here
here :: R2.Here
here = R2.here "Gargantext.Components.FacetsTable"
here = R2.here "Gargantext.Components.FacetsTable"
...
@@ -67,10 +68,8 @@ newtype Pair =
...
@@ -67,10 +68,8 @@ newtype Pair =
}
}
derive instance Generic Pair _
derive instance Generic Pair _
instance Eq Pair where
instance Eq Pair where eq = genericEq
eq = genericEq
instance Show Pair where show = genericShow
instance Show Pair where
show = genericShow
----------------------------------------------------------------------
----------------------------------------------------------------------
newtype DocumentsView =
newtype DocumentsView =
...
@@ -90,10 +89,8 @@ newtype DocumentsView =
...
@@ -90,10 +89,8 @@ newtype DocumentsView =
}
}
derive instance Generic DocumentsView _
derive instance Generic DocumentsView _
instance Eq DocumentsView where
instance Eq DocumentsView where eq = genericEq
eq = genericEq
instance Show DocumentsView where show = genericShow
instance Show DocumentsView where
show = genericShow
----------------------------------------------------------------------
----------------------------------------------------------------------
newtype ContactsView =
newtype ContactsView =
...
@@ -105,17 +102,14 @@ newtype ContactsView =
...
@@ -105,17 +102,14 @@ newtype ContactsView =
, delete :: Boolean
, delete :: Boolean
}
}
derive instance Generic ContactsView _
derive instance Generic ContactsView _
instance Eq ContactsView where
instance Eq ContactsView where eq = genericEq
eq = genericEq
instance Show ContactsView where show = genericShow
instance Show ContactsView where
show = genericShow
----------------------------------------------------------------------
----------------------------------------------------------------------
data Rows = Docs { docs :: Seq DocumentsView }
data Rows = Docs { docs :: Seq DocumentsView }
| Contacts { contacts :: Seq ContactsView }
| Contacts { contacts :: Seq ContactsView }
derive instance Generic Rows _
derive instance Generic Rows _
instance Eq Rows where
instance Eq Rows where eq = genericEq
eq = genericEq
----------------------------------------------------------------------
----------------------------------------------------------------------
...
@@ -212,7 +206,7 @@ initialPagePath :: {session :: Session, nodeId :: Int, listId :: Int, query :: S
...
@@ -212,7 +206,7 @@ initialPagePath :: {session :: Session, nodeId :: Int, listId :: Int, query :: S
initialPagePath {session, nodeId, listId, query} = {session, nodeId, listId, query, params: T.initialParams}
initialPagePath {session, nodeId, listId, query} = {session, nodeId, listId, query, params: T.initialParams}
loadPage :: PagePath -> Aff (Either RESTError Rows)
loadPage :: PagePath -> Aff (Either RESTError Rows)
loadPage { session, nodeId, listId, query, params: {limit, offset, orderBy }} = do
loadPage { session, nodeId, listId, query, params: {limit, offset, orderBy }
} = do
let
let
convOrderBy (T.ASC (T.ColumnName "Date")) = DateAsc
convOrderBy (T.ASC (T.ColumnName "Date")) = DateAsc
convOrderBy (T.DESC (T.ColumnName "Date")) = DateDesc
convOrderBy (T.DESC (T.ColumnName "Date")) = DateDesc
...
@@ -228,7 +222,8 @@ loadPage { session, nodeId, listId, query, params: {limit, offset, orderBy }} =
...
@@ -228,7 +222,8 @@ loadPage { session, nodeId, listId, query, params: {limit, offset, orderBy }} =
eSearchResult <- post session p query
eSearchResult <- post session p query
case eSearchResult of
case eSearchResult of
Left err -> pure $ Left err
Left err -> pure $ Left err
Right (SearchResult {result}) ->
Right (SearchResult {result}) -> do
liftEffect $ log2 "[loadPage] result" result
-- $ SearchQuery {query: concat query, expected: SearchDoc}
-- $ SearchQuery {query: concat query, expected: SearchDoc}
pure $ Right $ case result of
pure $ Right $ case result of
SearchResultDoc {docs} -> Docs {docs: doc2view <$> Seq.fromFoldable docs}
SearchResultDoc {docs} -> Docs {docs: doc2view <$> Seq.fromFoldable docs}
...
@@ -239,7 +234,6 @@ doc2view :: Document -> DocumentsView
...
@@ -239,7 +234,6 @@ doc2view :: Document -> DocumentsView
doc2view ( Document { id
doc2view ( Document { id
, created: date
, created: date
, hyperdata: HyperdataRowDocument { authors
, hyperdata: HyperdataRowDocument { authors
, title
, source
, source
, publication_year
, publication_year
, publication_month
, publication_month
...
@@ -247,10 +241,11 @@ doc2view ( Document { id
...
@@ -247,10 +241,11 @@ doc2view ( Document { id
}
}
, category
, category
, score
, score
, title
}
}
) = DocumentsView { id
) = DocumentsView { id
, date
, date
, title:
fromMaybe "Title"
title
, title: title
, source: fromMaybe "Source" source
, source: fromMaybe "Source" source
, score
, score
, authors: fromMaybe "Authors" authors
, authors: fromMaybe "Authors" authors
...
@@ -315,11 +310,14 @@ pageLayoutCpt = here.component "pageLayout" cpt
...
@@ -315,11 +310,14 @@ pageLayoutCpt = here.component "pageLayout" cpt
, loader: loadPage
, loader: loadPage
, path: path'
, path: path'
, render: \rowsLoaded -> page { container, deletions, frontends, path, rowsLoaded, session, totalRecords } [] }
, render: \rowsLoaded -> page { container, deletions, frontends, path, rowsLoaded, session, totalRecords } [] }
errorHandler err = here.log2 "[pageLayout] RESTError" err
errorHandler err = do
here.log2 "[pageLayout] RESTError" err
case err of
ReadJSONError err' -> here.log2 "[pageLayout] ReadJSONError" $ show err'
_ -> pure unit
page :: R2.Component PageProps
page :: R2.Component PageProps
page = R.createElement pageCpt
page = R.createElement pageCpt
pageCpt :: R.Component PageProps
pageCpt :: R.Component PageProps
pageCpt = here.component "page" cpt
pageCpt = here.component "page" cpt
where
where
...
@@ -350,8 +348,8 @@ pageCpt = here.component "page" cpt
...
@@ -350,8 +348,8 @@ pageCpt = here.component "page" cpt
}
}
where
where
colNames = case rowsLoaded of
colNames = case rowsLoaded of
Docs _ -> T.ColumnName <$> [ "", "Date", "Title", "Journal", "", "" ]
Docs _ -> T.ColumnName <$> [ "", "Date", "Title", "Journal", "", "" ]
Contacts _ -> T.ColumnName <$> [ "", "Contact", "Organization", "", "", "" ]
Contacts _ -> T.ColumnName <$> [ "", "Contact", "Organization", "", "", "" ]
wrapColElts = const identity
wrapColElts = const identity
-- TODO: how to interprete other scores?
-- TODO: how to interprete other scores?
...
...
src/Gargantext/Components/Search.purs
View file @
cbc4ab71
module Gargantext.Components.Search where
module Gargantext.Components.Search where
import Data.Generic.Rep (class Generic)
import Gargantext.Prelude
import Data.Either (Either(..))
import Data.Eq.Generic (genericEq)
import Data.Eq.Generic (genericEq)
import Data.
Show.Generic (genericShow
)
import Data.
Generic.Rep (class Generic
)
import Data.Maybe (Maybe)
import Data.Maybe (Maybe)
import Data.Newtype (class Newtype)
import Data.Newtype (class Newtype)
import Data.Show.Generic (genericShow)
import Gargantext.Utils.SimpleJSON as GUSJ
import Simple.JSON as JSON
import Simple.JSON as JSON
import Simple.JSON.Generics as JSONG
import Simple.JSON.Generics as JSONG
import Gargantext.Prelude
-- Example:
-- Example:
-- [["machine","learning"],["artificial","intelligence"]]
-- [["machine","learning"],["artificial","intelligence"]]
-- This searches for documents with "machine learning" or "artificial intelligence"
-- This searches for documents with "machine learning" or "artificial intelligence"
...
@@ -43,13 +45,13 @@ derive newtype instance JSON.ReadForeign SearchResult
...
@@ -43,13 +45,13 @@ derive newtype instance JSON.ReadForeign SearchResult
derive newtype instance JSON.WriteForeign SearchResult
derive newtype instance JSON.WriteForeign SearchResult
------------------------------------------------------------------------
------------------------------------------------------------------------
data SearchResultTypes = SearchResultDoc { docs :: Array Document}
data SearchResultTypes = SearchResultDoc { docs :: Array Document
}
| SearchNoResult { message :: String }
| SearchNoResult { message :: String
}
| SearchResultContact { contacts :: Array Contact }
| SearchResultContact { contacts :: Array Contact
}
derive instance Generic SearchResultTypes _
derive instance Generic SearchResultTypes _
instance Eq SearchResultTypes where eq = genericEq
instance Eq SearchResultTypes where eq = genericEq
instance Show SearchResultTypes where show = genericShow
instance Show SearchResultTypes where show = genericShow
instance JSON.ReadForeign SearchResultTypes where readImpl =
JSONG.un
taggedSumRep
instance JSON.ReadForeign SearchResultTypes where readImpl =
GUSJ.
taggedSumRep
instance JSON.WriteForeign SearchResultTypes where
instance JSON.WriteForeign SearchResultTypes where
writeImpl (SearchResultDoc s) = JSON.writeImpl s
writeImpl (SearchResultDoc s) = JSON.writeImpl s
writeImpl (SearchNoResult s) = JSON.writeImpl s
writeImpl (SearchNoResult s) = JSON.writeImpl s
...
@@ -73,25 +75,25 @@ derive newtype instance JSON.WriteForeign Document
...
@@ -73,25 +75,25 @@ derive newtype instance JSON.WriteForeign Document
------------------------------------------------------------------------
------------------------------------------------------------------------
newtype HyperdataRowDocument =
newtype HyperdataRowDocument =
HyperdataRowDocument { bdd :: Maybe String
HyperdataRowDocument { abstract :: Maybe String
, doi :: Maybe String
, url :: Maybe String
, uniqId :: Maybe String
, uniqIdBdd :: Maybe String
, page :: Maybe Int
, title :: Maybe String
, authors :: Maybe String
, authors :: Maybe String
, bdd :: Maybe String
, doi :: Maybe String
, institutes :: Maybe String
, institutes :: Maybe String
,
source
:: Maybe String
,
language_iso2
:: Maybe String
,
abstract :: Maybe String
,
page :: Maybe Int
, publication_date :: Maybe String
, publication_date :: Maybe String
, publication_year :: Maybe Int
, publication_month :: Maybe Int
, publication_day :: Maybe Int
, publication_day :: Maybe Int
, publication_hour :: Maybe Int
, publication_hour :: Maybe Int
, publication_minute :: Maybe Int
, publication_minute :: Maybe Int
, publication_month :: Maybe Int
, publication_second :: Maybe Int
, publication_second :: Maybe Int
, language_iso2 :: Maybe String
, publication_year :: Maybe Int
, source :: Maybe String
, title :: Maybe String
, url :: Maybe String
, uniqId :: Maybe String
, uniqIdBdd :: Maybe String
}
}
derive instance Generic HyperdataRowDocument _
derive instance Generic HyperdataRowDocument _
...
...
src/Gargantext/Utils/SimpleJSON.purs
0 → 100644
View file @
cbc4ab71
module Gargantext.Utils.SimpleJSON where
import Prelude
import Control.Alt ((<|>))
import Control.Monad.Except (withExcept)
import Data.Generic.Rep as GR
import Data.Maybe (Maybe(..))
import Data.Tuple (Tuple(..))
import Foreign (Foreign, ForeignError(..), fail)
import Foreign as Foreign
import Foreign.Object as FO
import Simple.JSON as JSON
import Type.Prelude (class IsSymbol, SProxy(..), reflectSymbol)
taggedSumRep :: forall a rep
. GR.Generic a rep
=> GenericTaggedSumRep rep
=> Foreign
-> Foreign.F a
taggedSumRep f = GR.to <$> genericTaggedSumRep f
-- | Generic Tagged Sum Representations, with "type" as key and rest
-- of key/values representing the object. Note that this is slightly
-- difrerent than what Simple.JSON generics provides as it wrapes the
-- tag in "type" and object under "value" key.
class GenericTaggedSumRep rep where
genericTaggedSumRep :: Foreign -> Foreign.F rep
instance ( GenericTaggedSumRep a
, GenericTaggedSumRep b
) => GenericTaggedSumRep (GR.Sum a b) where
genericTaggedSumRep f
= GR.Inl <$> genericTaggedSumRep f
<|> GR.Inr <$> genericTaggedSumRep f
instance ( GenericTaggedSumRep a
, IsSymbol name
) => GenericTaggedSumRep (GR.Constructor name a) where
genericTaggedSumRep f = do
-- r :: { "type" :: String } <- JSON.read' f
-- if r."type" == name
-- then withExcept (map $ ErrorAtProperty name) $ GR.Constructor <$> genericTaggedSumRep r
-- else fail $ ForeignError $ "Wrong type tag " <> r."type" <> " where " <> name <> " was expected."
r :: FO.Object Foreign <- JSON.read' f
case FO.pop "type" r of
Nothing -> fail $ ForeignError $ "Key 'type' not found."
Just (Tuple name' obj) -> do
n' <- Foreign.readString name'
if n' == name
then withExcept (map $ ErrorAtProperty name) $ GR.Constructor <$> (genericTaggedSumRep $ Foreign.unsafeToForeign obj)
else fail $ ForeignError $ "Wrong type tag " <> n' <> " where " <> name <> " was expected."
where
nameP = SProxy :: SProxy name
name = reflectSymbol nameP
instance ( JSON.ReadForeign a
) => GenericTaggedSumRep (GR.Argument a) where
genericTaggedSumRep f = GR.Argument <$> JSON.readImpl f
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment