git.iko.soy/typeable/bloodhound
on master help sign in
Merge pull request #72 from centromere/parent-support

Added parent support to documentExists

commit08b36be5aee68bd410e0a3b261cde363aa874b9b authorChris Allen <cma@bitemyapp.com> dateFri 2 Oct 2015, 22:30 (11 years ago) parent7b0c801b6904b2
2 files changed+35−6
src/Database/Bloodhound/Client.hs+9−6 tests/tests.hs+26
src/Database/Bloodhound/Client.hs+9−6
@@ -68,7 +68,8 @@ import Data.ByteString.Lazy.Builder
6868import qualified Data.ByteString.Lazy.Char8 as L
6969import Data.Default.Class
7070import Data.Ix
71−import Data.Maybe (fromMaybe)
71+import qualified Data.List as LS (filter)
72+import Data.Maybe (fromMaybe, isJust)
7273import Data.Monoid
7374import Data.Text (Text)
7475import qualified Data.Text as T
@@ -499,14 +500,16 @@ getDocument (IndexName indexName)
499500-- | 'documentExists' enables you to check if a document exists. Returns 'Bool'
500501-- in IO
501502--
502−-- >>> exists <- runBH' $ documentExists testIndex testMapping (DocId "1")
503+-- >>> exists <- runBH' $ documentExists testIndex testMapping Nothing (DocId "1")
503504documentExists :: MonadBH m => IndexName -> MappingName
504− -> DocId -> m Bool
505−documentExists (IndexName indexName)
506− (MappingName mappingName) (DocId docId) = do
505+ -> Maybe DocumentParent -> DocId -> m Bool
506+documentExists (IndexName indexName) (MappingName mappingName)
507+ parent (DocId docId) = do
507508 (_, exists) <- existentialQuery =<< url
508509 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)]
510513
511514dispatchSearch :: MonadBH m => Text -> Search -> m Reply
512515dispatchSearch url search = post url' (Just (encode search))
tests/tests.hs+26
@@ -116,6 +116,20 @@ instance FromJSON Tweet
116116instance ToJSON Location
117117instance FromJSON Location
118118
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+
119133data TweetMapping = TweetMapping deriving (Eq, Show)
120134
121135instance ToJSON TweetMapping where
@@ -330,6 +344,18 @@ main = hspec $ do
330344 res' <- insertData' cfg
331345 liftIO $ isVersionConflict res' `shouldBe` True
332346
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+
333359 describe "template API" $ do
334360 it "can create a template" $ withTestEnv $ do
335361 let idxTpl = IndexTemplate (TemplatePattern "tweet-*") (Just (IndexSettings (ShardCount 1) (ReplicaCount 1))) [toJSON TweetMapping]