on master help sign in
Tag suggestions
commit3168e43aee2ee654a55f28191f28234913db1205 authoriko <ilyakooo0@gmail.com> dateSat 4 May 2019, 19:37 (7 years ago) parent900da89
5 files changed+57−16
denis/src/Data/Completions.hs → denis/src/Data/Tags/Completions.hs+1−1 denis/src/Data/Tags/Suggestions.hs+24 denis/src/Server/API.hs+2−2 denis/src/Server/API/Completions.hs+23−9 denis/src/Server/Query/ComplexQuery.hs+7−4
denis/src/Data/Completions.hs → denis/src/Data/Tags/Completions.hsrenamed+1−1
@@ -4,7 +4,7 @@
44 FlexibleInstances #-}
55{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
66
7−module Data.Completions (
7+module Data.Tags.Completions (
88 CompletionTree(..),
99 mkCompletionTree
1010 ) where
denis/src/Data/Tags/Suggestions.hsnew file+24
@@ -0,0 +1,24 @@
1+{-# LANGUAGE
2+ LambdaCase,
3+ FlexibleInstances,
4+ OverloadedStrings #-}
5+{-# OPTIONS_GHC -Wno-orphans #-}
6+
7+module Data.Tags.Suggestions (
8+ suggestTags
9+ ) where
10+
11+import qualified Data.Text as T
12+import Servant.Docs
13+import Data.List
14+
15+instance {-# Overlapping #-} ToSample [T.Text] where
16+ toSamples _ = singleSample ["machineLearning", "cs"]
17+
18+suggestTags :: T.Text -> [T.Text]
19+suggestTags t =
20+ let
21+ ws = T.words t
22+ l = length ws
23+ indecies = take (3 + (l `mod` 3)) . map (`mod` l) $ [8849, 11161, 12647, 14081, 16267]
24+ in nub . map (ws !!) $ indecies
denis/src/Server/API.hs+2−2
@@ -52,7 +52,7 @@ type API =
5252 "channels" :> ChannelsApi :<|>
5353 MessagesApi
5454 ) :<|>
55− CompletionsAPI
55+ "tags" :> TagsAPI
5656
5757serverProxy :: Proxy API
5858serverProxy = Proxy
@@ -68,4 +68,4 @@ mkServerAPI l =
6868 channelsApi uId :<|>
6969 messagesServer uId
7070 ) :<|>
71− completionServer
71+ tagsServer
denis/src/Server/API/Completions.hs+23−9
@@ -4,19 +4,25 @@
44 OverloadedLabels,
55 OverloadedStrings ,
66 TypeApplications ,
7− TypeOperators #-}
7+ TypeOperators,
8+ LambdaCase #-}
89
910module Server.API.Completions (
10− CompletionsAPI,
11− completionServer
11+ TagsAPI,
12+ tagsServer
1213 ) where
1314
1415import Servant.Server
1516import Servant
16−import Data.Completions
17+import Data.Tags.Completions
1718import Server.App
1819import Data.Connection
1920import Data.Query
21+import qualified Data.Text as T
22+import qualified Data.Post as P
23+import Data.PostElement
24+import Data.Tags.Suggestions
25+import Data.List
2026
2127type CompletionsDescription = Description "\
2228 \Gets tag completion tree\n\n\
@@ -57,10 +63,18 @@ type CompletionsDescription = Description "\
5763 \}\n\
5864 \```"
5965
60−type CompletionsAPI = "tagCompletions" :> CompletionsDescription :> Get '[JSON] (CompletionTree Char)
66+type SuggestionDescription = Description "Retuens suggested tags for given post element objects."
6167
62−completionServer :: ServerT CompletionsAPI App
63−completionServer = completionHandler
68+type TagsAPI = "completions" :> CompletionsDescription :> Get '[JSON] (CompletionTree Char)
69+ :<|> "suggest" :> SuggestionDescription :> ReqBody '[JSON] [PostElement P.Post] :> Post '[JSON] [T.Text]
6470
65−completionHandler :: ServerT CompletionsAPI App
66−completionHandler = runQerror $ mkCompletionTree <$> getTags
71+tagsServer :: ServerT TagsAPI App
72+tagsServer = completionHandler :<|> suggestionHandler
73+
74+completionHandler :: App (CompletionTree Char)
75+completionHandler = runQerror $ mkCompletionTree <$> getTags
76+
77+suggestionHandler :: [PostElement P.Post] -> App [T.Text]
78+suggestionHandler = return . suggestTags . T.concat . intersperse " " . concatMap (\case
79+ Markdown t -> T.words t
80+ _ -> [])
denis/src/Server/Query/ComplexQuery.hs+7−4
@@ -50,8 +50,8 @@ instance (HasDocs api) => HasDocs (ComplexQuery :> api) where
5050instance {-# Overlapping #-} ToSample [ComplexQueryRequest] where
5151 toSamples _ = singleSample $ [ComplexQueryRequest "channels/" "", ComplexQueryRequest "posts/last" "3"]
5252
53−instance {-# Overlapping #-} ToSample [T.Text] where
54− toSamples _ = singleSample ["[{\"people\":[1],\"name\":\"newChannelName\",\"id\":7,\"tags\":[]},{\"people\":[1],\"name\":\"newChannelName\",\"id\":6,\"tags\":[]},{\"people\":[1],\"name\":\"newChannelName\",\"id\":5,\"tags\":[]},{\"people\":[1,1,2,2,2],\"name\":\"sssss\",\"id\":4,\"tags\":[\"thisIsHashTag\",\"thisIsHashTag\",\"thisIsHashTag\",\"thisIsHashTag\",\"thisIsAlsoHashTag\",\"cs\"]},{\"people\":[1,7,2,19],\"name\":\"соытвототтоциология\",\"id\":1,\"tags\":[\"sos\"]}]","{\"users\":{\"1\":{\"middleName\":\"FirstUser\",\"lastName\":\"FirstUser\",\"firstName\":\"FirstUser\",\"id\":1}},\"response\":[{\"body\":[{\"markdown\":\"hello\"}],\"authorId\":1,\"id\":28,\"updated\":\"2019-04-13T16:14:38.495832Z\",\"tags\":[]},{\"body\":[{\"markdown\":\"Hello, blyat\"}],\"authorId\":1,\"id\":27,\"updated\":\"2005-01-03T12:34:56Z\",\"tags\":[]}]}"]
53+instance {-# Overlapping #-} ToSample [ComplexQueryRepsonse] where
54+ toSamples _ = singleSample $ map ComplexQueryRepsonse ["[{\"people\":[1],\"name\":\"newChannelName\",\"id\":7,\"tags\":[]},{\"people\":[1],\"name\":\"newChannelName\",\"id\":6,\"tags\":[]},{\"people\":[1],\"name\":\"newChannelName\",\"id\":5,\"tags\":[]},{\"people\":[1,1,2,2,2],\"name\":\"sssss\",\"id\":4,\"tags\":[\"thisIsHashTag\",\"thisIsHashTag\",\"thisIsHashTag\",\"thisIsHashTag\",\"thisIsAlsoHashTag\",\"cs\"]},{\"people\":[1,7,2,19],\"name\":\"соытвототтоциология\",\"id\":1,\"tags\":[\"sos\"]}]","{\"users\":{\"1\":{\"middleName\":\"FirstUser\",\"lastName\":\"FirstUser\",\"firstName\":\"FirstUser\",\"id\":1}},\"response\":[{\"body\":[{\"markdown\":\"hello\"}],\"authorId\":1,\"id\":28,\"updated\":\"2019-04-13T16:14:38.495832Z\",\"tags\":[]},{\"body\":[{\"markdown\":\"Hello, blyat\"}],\"authorId\":1,\"id\":27,\"updated\":\"2005-01-03T12:34:56Z\",\"tags\":[]}]}"]
5555
5656-- MARK: Implementation
5757
@@ -66,7 +66,10 @@ data ComplexQueryRequest = ComplexQueryRequest {
6666instance ToJSON ComplexQueryRequest
6767instance FromJSON ComplexQueryRequest
6868
69−type ComplexQueryRepsonse = T.Text
69+newtype ComplexQueryRepsonse = ComplexQueryRepsonse {responseText :: T.Text}
70+
71+instance ToJSON ComplexQueryRepsonse where
72+ toJSON = toJSON . responseText
7073
7174type ComplexQueryDescription = Description "Complex query\n\nAllows you to query several endpoints within one request.\n\nResponses are returned in the same order as the requests are sent.\n\nThe order of query execution is not determined. If one of the queries returns a non-2XX response, the first such response is returned.\n\n## Do not perform modifications in this query. You will have no way of telling whether it succeeded."
7275
@@ -92,7 +95,7 @@ instance HasServer api context => HasServer (ComplexQuery :> api :: *) context w
9295 result <- liftIO $ readTVarIO responses
9396 case result of
9497 Left err -> throwError err
95− Right resp -> sequence . map (throwMaybe . flip M.lookup resp) $ [0..((length query) - 1)]
98+ Right resp -> sequence . map (fmap ComplexQueryRepsonse . throwMaybe . flip M.lookup resp) $ [0..((length query) - 1)]
9699 where
97100 serverRest = runRouterEnv (route (Proxy :: Proxy api) context subserver) env
98101 respond :: TVar (Either ServantErr (M.Map Int T.Text)) -> Int -> RouteResult Response -> IO ResponseReceived