@@ -1,13 +1,22 @@
11{-# LANGUAGE DeriveGeneric #-}
22{-# LANGUAGE OverloadedStrings #-}
33
4−module Database.Bloodhound.Client where
4+module Database.Bloodhound.Client
5+ ( createIndex
6+ , deleteIndex
7+ , IndexSettings(..)
8+ , Server(..)
9+ , defaultIndexSettings
10+ , indexDocument
11+ )
12+ where
513
614import Control.Applicative
715import Control.Monad (liftM)
816import Data.Aeson
917import Data.Aeson.TH (deriveJSON)
1018import qualified Data.ByteString.Lazy.Char8 as L
19+import Data.List (intersperse)
1120import Data.Maybe (fromMaybe)
1221import qualified Data.Text as T
1322import Data.Time.Clock as DTC
@@ -60,12 +69,6 @@ pathFromType index docType = "/" ++ index ++ docType
6069rollUp :: [String] -> String
6170rollUp = Prelude.concat
6271
63−getStatus :: String -> IO (Maybe (Status Version))
64−getStatus server = do
65− request <- parseUrl $ server ++ rootPath
66− response <- withManager $ httpLbs request
67− return $ (decode $ responseBody response)
68−
6972main = simpleHttp "http://localhost:9200/events/event/_search?q=hostname:localhost&size=1" >>= L.putStrLn
7073
7174-- data Response = Response { blah :: T.Text } deriving (Show)
@@ -146,6 +149,15 @@ dispatch url method body = do
146149
147150type IndexName = String
148151
152+joinPath :: [String] -> String
153+joinPath path = concat $ intersperse "/" path
154+
155+getStatus :: Server -> IO (Maybe (Status Version))
156+getStatus (Server server) = do
157+ request <- parseUrl $ server ++ rootPath
158+ response <- withManager $ httpLbs request
159+ return $ (decode $ responseBody response)
160+
149161createIndex :: Server -> IndexSettings -> IndexName -> IO Reply
150162createIndex (Server server) indexSettings indexName =
151163 dispatch url method body where
@@ -193,13 +205,50 @@ openIndex = openOrCloseIndexes OpenIndex
193205closeIndex :: Server -> IndexName -> IO Reply
194206closeIndex = openOrCloseIndexes CloseIndex
195207
196−createMapping :: ToJSON a => Server -> IndexName -> a -> IO Reply
197−createMapping (Server server) indexName mapping =
208+type MappingName = String
209+
210+createMapping :: ToJSON a => Server -> IndexName
211+ -> MappingName -> a -> IO Reply
212+createMapping (Server server) indexName mappingName mapping =
198213 dispatch url method body where
199− url = server ++ "/" ++ indexName ++ "/" ++ "_mapping"
214+ url = server ++ "/" ++ indexName ++ "/"
215+ ++ mappingName ++ "/" ++ "_mapping"
200216 method = NHTM.methodPut
201217 body = Just $ encode mapping
202218
219+deleteMapping :: Server -> IndexName -> MappingName -> IO Reply
220+deleteMapping (Server server) indexName mappingName =
221+ dispatch url method body where
222+ url = server ++ "/" ++ indexName ++ "/" ++ mappingName ++ "/" ++ "_mapping"
223+ method = NHTM.methodDelete
224+ body = Nothing
225+
226+type DocumentID = String
227+
228+indexDocument :: ToJSON doc => Server -> IndexName -> MappingName
229+ -> doc -> DocumentID -> IO Reply
230+indexDocument (Server server) indexName mappingName document docId =
231+ dispatch url method body where
232+ url = joinPath [server, indexName, mappingName, docId]
233+ method = NHTM.methodPut
234+ body = Just (encode document)
235+
236+deleteDocument :: Server -> IndexName -> MappingName
237+ -> DocumentID -> IO Reply
238+deleteDocument (Server server) indexName mappingName docId =
239+ dispatch url method body where
240+ url = joinPath [server, indexName, mappingName, docId]
241+ method = NHTM.methodDelete
242+ body = Nothing
243+
244+getDocument :: Server -> IndexName -> MappingName
245+ -> DocumentID -> IO Reply
246+getDocument (Server server) indexName mappingName docId =
247+ dispatch url method body where
248+ url = joinPath [server, indexName, mappingName, docId]
249+ method = NHTM.methodGet
250+ body = Nothing
251+
203252-- getStatus :: String -> IO (Maybe (Status Version))
204253-- getStatus server = do
205254-- request <- parseUrl $ server ++ rootPath