git.iko.soy/typeable/bloodhound
on master help sign in
Merge pull request #72 from centromere/parent-support
08b36beChris Allen
src/Database/Bloodhound/Client.hs+9−6
@@ -68,7 +68,8 @@ import Data.ByteString.Lazy.Builder
68import qualified Data.ByteString.Lazy.Char8 as L
68import qualified Data.ByteString.Lazy.Char8 as L
69import Data.Default.Class
69import Data.Default.Class
70import Data.Ix
70import Data.Ix
71+import qualified Data.List as LS (filter)
71−import Data.Maybe (fromMaybe)
72+import Data.Maybe (fromMaybe, isJust)
72import Data.Monoid
73import Data.Monoid
73import Data.Text (Text)
74import Data.Text (Text)
74import qualified Data.Text as T
75import qualified Data.Text as T
@@ -499,14 +500,16 @@ getDocument (IndexName indexName)
499-- | 'documentExists' enables you to check if a document exists. Returns 'Bool'
500-- | 'documentExists' enables you to check if a document exists. Returns 'Bool'
500-- in IO
501-- in IO
501--
502--
502−-- >>> exists <- runBH' $ documentExists testIndex testMapping (DocId "1")
503+-- >>> exists <- runBH' $ documentExists testIndex testMapping Nothing (DocId "1")
503documentExists :: MonadBH m => IndexName -> MappingName
504documentExists :: MonadBH m => IndexName -> MappingName
504− -> DocId -> m Bool
505+ -> Maybe DocumentParent -> DocId -> m Bool
505−documentExists (IndexName indexName)
506+documentExists (IndexName indexName) (MappingName mappingName)
506− (MappingName mappingName) (DocId docId) = do
507+ parent (DocId docId) = do
507 (_, exists) <- existentialQuery =<< url
508 (_, exists) <- existentialQuery =<< url
508 return exists
509 return exists
509− where url = joinPath [indexName, mappingName, docId]
510+ where url = addQuery params <$> joinPath [indexName, mappingName, docId]
511+ parentParam = fmap (\(DocumentParent (DocId p)) -> p) parent
512+ params = LS.filter (\(_, v) -> isJust v) [("parent", parentParam)]
510
513
511dispatchSearch :: MonadBH m => Text -> Search -> m Reply
514dispatchSearch :: MonadBH m => Text -> Search -> m Reply
512dispatchSearch url search = post url' (Just (encode search))
515dispatchSearch url search = post url' (Just (encode search))
tests/tests.hs+26
@@ -116,6 +116,20 @@ instance FromJSON Tweet
116instance ToJSON Location
116instance ToJSON Location
117instance FromJSON Location
117instance FromJSON Location
118
118
119+data ParentMapping = ParentMapping deriving (Eq, Show)
120+
121+instance ToJSON ParentMapping where
122+ toJSON ParentMapping =
123+ object ["parent" .= Null ]
124+
125+data ChildMapping = ChildMapping deriving (Eq, Show)
126+
127+instance ToJSON ChildMapping where
128+ toJSON ChildMapping =
129+ object ["child" .=
130+ object ["_parent" .= object ["type" .= ("parent" :: Text)]]
131+ ]
132+
119data TweetMapping = TweetMapping deriving (Eq, Show)
133data TweetMapping = TweetMapping deriving (Eq, Show)
120
134
121instance ToJSON TweetMapping where
135instance ToJSON TweetMapping where
@@ -330,6 +344,18 @@ main = hspec $ do
330 res' <- insertData' cfg
344 res' <- insertData' cfg
331 liftIO $ isVersionConflict res' `shouldBe` True
345 liftIO $ isVersionConflict res' `shouldBe` True
332
346
347+ it "indexes two documents in a parent/child relationship and checks that the child exists" $ withTestEnv $ do
348+ resetIndex
349+ _ <- putMapping testIndex (MappingName "parent") ParentMapping
350+ _ <- putMapping testIndex (MappingName "child") ChildMapping
351+ _ <- indexDocument testIndex (MappingName "parent") defaultIndexDocumentSettings exampleTweet (DocId "1")
352+ let parent = (Just . DocumentParent . DocId) "1"
353+ ids = IndexDocumentSettings NoVersionControl parent
354+ _ <- indexDocument testIndex (MappingName "child") ids otherTweet (DocId "2")
355+ _ <- refreshIndex testIndex
356+ exists <- documentExists testIndex (MappingName "child") parent (DocId "2")
357+ liftIO $ exists `shouldBe` True
358+
333 describe "template API" $ do
359 describe "template API" $ do
334 it "can create a template" $ withTestEnv $ do
360 it "can create a template" $ withTestEnv $ do
335 let idxTpl = IndexTemplate (TemplatePattern "tweet-*") (Just (IndexSettings (ShardCount 1) (ReplicaCount 1))) [toJSON TweetMapping]
361 let idxTpl = IndexTemplate (TemplatePattern "tweet-*") (Just (IndexSettings (ShardCount 1) (ReplicaCount 1))) [toJSON TweetMapping]