git.iko.soy/typeable/bloodhound
on master help sign in
Add support for template queries
commitfc6fe99a68563e70b189e5ddb67080abd7bbff33 authorJosh Berman <berman.josh@gmail.com> dateTue 18 Apr 2017, 16:42 (9 years ago) parentbab3565
4 files changed+130
src/Database/V1/Bloodhound/Types.hs+40 src/Database/V5/Bloodhound/Types.hs+40 tests/V1/tests.hs+25 tests/V5/tests.hs+25
src/Database/V1/Bloodhound/Types.hs+40
@@ -195,6 +195,8 @@ module Database.V1.Bloodhound.Types
195195 , RangeQuery(..)
196196 , RegexpQuery(..)
197197 , QueryString(..)
198+ , TemplateQueryInline(..)
199+ , TemplateQueryKeyValuePairs(..)
198200 , BooleanOperator(..)
199201 , ZeroTermsQuery(..)
200202 , CutoffFrequency(..)
@@ -1211,6 +1213,7 @@ data Query =
12111213 | QuerySimpleQueryStringQuery SimpleQueryStringQuery
12121214 | QueryRangeQuery RangeQuery
12131215 | QueryRegexpQuery RegexpQuery
1216+ | QueryTemplateQueryInline TemplateQueryInline
12141217 deriving (Eq, Read, Show, Generic, Typeable)
12151218
12161219data RegexpQuery =
@@ -1635,6 +1638,38 @@ data DistanceRange =
16351638 DistanceRange { distanceFrom :: Distance
16361639 , distanceTo :: Distance } deriving (Eq, Read, Show, Generic, Typeable)
16371640
1641+type TemplateQueryKey = Text
1642+type TemplateQueryValue = Text
1643+
1644+newtype TemplateQueryKeyValuePairs = TemplateQueryKeyValuePairs (HM.HashMap TemplateQueryKey TemplateQueryValue)
1645+ deriving (Eq, Read, Show, Generic)
1646+
1647+instance ToJSON TemplateQueryKeyValuePairs where
1648+ toJSON (TemplateQueryKeyValuePairs x) = Object $ HM.map toJSON x
1649+
1650+instance FromJSON TemplateQueryKeyValuePairs where
1651+ parseJSON (Object o) = pure . TemplateQueryKeyValuePairs $ HM.mapMaybe getValue o
1652+ where getValue (String x) = Just x
1653+ getValue _ = Nothing
1654+ parseJSON _ = fail "error parsing TemplateQueryKeyValuePairs"
1655+
1656+data TemplateQueryInline =
1657+ TemplateQueryInline { inline :: Query
1658+ , params :: TemplateQueryKeyValuePairs
1659+ }
1660+ deriving (Eq, Read, Show, Generic, Typeable)
1661+
1662+instance ToJSON TemplateQueryInline where
1663+ toJSON TemplateQueryInline{..} = object [ "query" .= inline
1664+ , "params" .= params
1665+ ]
1666+
1667+instance FromJSON TemplateQueryInline where
1668+ parseJSON = withObject "TemplateQueryInline" parse
1669+ where parse o = TemplateQueryInline
1670+ <$> o .: "query"
1671+ <*> o .: "params"
1672+
16381673data SearchResult a =
16391674 SearchResult { took :: Int
16401675 , timedOut :: Bool
@@ -2404,6 +2439,9 @@ instance ToJSON Query where
24042439 toJSON (QuerySimpleQueryStringQuery query) =
24052440 object [ "simple_query_string" .= query ]
24062441
2442+ toJSON (QueryTemplateQueryInline templateQuery) =
2443+ object [ "template" .= templateQuery ]
2444+
24072445instance FromJSON Query where
24082446 parseJSON v = withObject "Query" parse v
24092447 where parse o = termQuery `taggedWith` "term"
@@ -2433,6 +2471,7 @@ instance FromJSON Query where
24332471 <|> queryRangeQuery `taggedWith` "range"
24342472 <|> queryRegexpQuery `taggedWith` "regexp"
24352473 <|> querySimpleQueryStringQuery `taggedWith` "simple_query_string"
2474+ <|> queryTemplateQueryInline `taggedWith` "template"
24362475 where taggedWith parser k = parser =<< o .: k
24372476 termQuery = fieldTagged $ \(FieldName fn) o ->
24382477 TermQuery <$> (Term fn <$> o .: "value") <*> o .:? "boost"
@@ -2474,6 +2513,7 @@ instance FromJSON Query where
24742513 queryRangeQuery = pure . QueryRangeQuery
24752514 queryRegexpQuery = pure . QueryRegexpQuery
24762515 querySimpleQueryStringQuery = pure . QuerySimpleQueryStringQuery
2516+ queryTemplateQueryInline = pure . QueryTemplateQueryInline
24772517
24782518
24792519omitNulls :: [(Text, Value)] -> Value
src/Database/V5/Bloodhound/Types.hs+40
@@ -196,6 +196,8 @@ module Database.V5.Bloodhound.Types
196196 , RangeQuery(..)
197197 , RegexpQuery(..)
198198 , QueryString(..)
199+ , TemplateQueryInline(..)
200+ , TemplateQueryKeyValuePairs(..)
199201 , BooleanOperator(..)
200202 , ZeroTermsQuery(..)
201203 , CutoffFrequency(..)
@@ -1211,6 +1213,7 @@ data Query =
12111213 | QueryRegexpQuery RegexpQuery
12121214 | QueryExistsQuery FieldName
12131215 | QueryMatchNoneQuery
1216+ | QueryTemplateQueryInline TemplateQueryInline
12141217 deriving (Eq, Read, Show, Generic, Typeable)
12151218
12161219-- | As of Elastic 2.0, 'Filters' are just 'Queries' housed in a Bool Query, and
@@ -1622,6 +1625,38 @@ data DistanceRange =
16221625 DistanceRange { distanceFrom :: Distance
16231626 , distanceTo :: Distance } deriving (Eq, Read, Show, Generic, Typeable)
16241627
1628+type TemplateQueryKey = Text
1629+type TemplateQueryValue = Text
1630+
1631+newtype TemplateQueryKeyValuePairs = TemplateQueryKeyValuePairs (HM.HashMap TemplateQueryKey TemplateQueryValue)
1632+ deriving (Eq, Read, Show, Generic)
1633+
1634+instance ToJSON TemplateQueryKeyValuePairs where
1635+ toJSON (TemplateQueryKeyValuePairs x) = Object $ HM.map toJSON x
1636+
1637+instance FromJSON TemplateQueryKeyValuePairs where
1638+ parseJSON (Object o) = pure . TemplateQueryKeyValuePairs $ HM.mapMaybe getValue o
1639+ where getValue (String x) = Just x
1640+ getValue _ = Nothing
1641+ parseJSON _ = fail "error parsing TemplateQueryKeyValuePairs"
1642+
1643+data TemplateQueryInline =
1644+ TemplateQueryInline { inline :: Query
1645+ , params :: TemplateQueryKeyValuePairs
1646+ }
1647+ deriving (Eq, Read, Show, Generic, Typeable)
1648+
1649+instance ToJSON TemplateQueryInline where
1650+ toJSON TemplateQueryInline{..} = object [ "inline" .= inline
1651+ , "params" .= params
1652+ ]
1653+
1654+instance FromJSON TemplateQueryInline where
1655+ parseJSON = withObject "TemplateQueryInline" parse
1656+ where parse o = TemplateQueryInline
1657+ <$> o .: "inline"
1658+ <*> o .: "params"
1659+
16251660data SearchResult a =
16261661 SearchResult { took :: Int
16271662 , timedOut :: Bool
@@ -2220,6 +2255,9 @@ instance ToJSON Query where
22202255 toJSON QueryMatchNoneQuery =
22212256 object ["match_none" .= object []]
22222257
2258+ toJSON (QueryTemplateQueryInline templateQuery) =
2259+ object [ "template" .= templateQuery ]
2260+
22232261instance FromJSON Query where
22242262 parseJSON v = withObject "Query" parse v
22252263 where parse o = termQuery `taggedWith` "term"
@@ -2247,6 +2285,7 @@ instance FromJSON Query where
22472285 <|> queryRangeQuery `taggedWith` "range"
22482286 <|> queryRegexpQuery `taggedWith` "regexp"
22492287 <|> querySimpleQueryStringQuery `taggedWith` "simple_query_string"
2288+ <|> queryTemplateQueryInline `taggedWith` "template"
22502289 where taggedWith parser k = parser =<< o .: k
22512290 termQuery = fieldTagged $ \(FieldName fn) o ->
22522291 TermQuery <$> (Term fn <$> o .: "value") <*> o .:? "boost"
@@ -2284,6 +2323,7 @@ instance FromJSON Query where
22842323 queryRegexpQuery = pure . QueryRegexpQuery
22852324 querySimpleQueryStringQuery = pure . QuerySimpleQueryStringQuery
22862325 queryExistsQuery o = QueryExistsQuery <$> o .: "field"
2326+ queryTemplateQueryInline = pure . QueryTemplateQueryInline
22872327
22882328
22892329omitNulls :: [(Text, Value)] -> Value
tests/V1/tests.hs+25
@@ -595,6 +595,9 @@ instance (ApproxEq l, ApproxEq r) => ApproxEq (Either l r) where
595595instance ApproxEq NodeAttrFilter
596596instance ApproxEq NodeAttrName
597597instance ApproxEq BuildHash
598+instance ApproxEq TemplateQueryKeyValuePairs where
599+ (=~) = (==)
600+instance ApproxEq TemplateQueryInline
598601
599602-- | Due to the way nodeattrfilters get serialized here, they may come
600603-- out in a different order, but they are morally equivalent
@@ -746,6 +749,7 @@ instance Arbitrary Query where
746749 , QuerySimpleQueryStringQuery <$> arbitrary
747750 , QueryRangeQuery <$> arbitrary
748751 , QueryRegexpQuery <$> arbitrary
752+ , QueryTemplateQueryInline <$> arbitrary
749753 ]
750754 shrink = genericShrink
751755
@@ -798,6 +802,10 @@ instance Arbitrary VersionNumber where
798802 where
799803 mk versions = VersionNumber (Vers.Version versions [])
800804
805+instance Arbitrary TemplateQueryKeyValuePairs where
806+ arbitrary = TemplateQueryKeyValuePairs . HM.fromList <$> arbitrary
807+ shrink (TemplateQueryKeyValuePairs x) = map (TemplateQueryKeyValuePairs . HM.fromList) . shrink $ HM.toList x
808+
801809instance Arbitrary IndexName where arbitrary = sopArbitrary; shrink = genericShrink
802810instance Arbitrary MappingName where arbitrary = sopArbitrary; shrink = genericShrink
803811instance Arbitrary DocId where arbitrary = sopArbitrary; shrink = genericShrink
@@ -913,6 +921,7 @@ instance Arbitrary FSType where arbitrary = sopArbitrary; shrink = genericShrink
913921instance Arbitrary CompoundFormat where arbitrary = sopArbitrary; shrink = genericShrink
914922instance Arbitrary FsSnapshotRepo where arbitrary = sopArbitrary; shrink = genericShrink
915923instance Arbitrary SnapshotRepoName where arbitrary = sopArbitrary; shrink = genericShrink
924+instance Arbitrary TemplateQueryInline where arbitrary = sopArbitrary; shrink = genericShrink
916925
917926newtype UpdatableIndexSetting' = UpdatableIndexSetting' UpdatableIndexSetting
918927 deriving (Show, Eq, ToJSON, FromJSON, ApproxEq, Typeable)
@@ -1124,6 +1133,21 @@ main = hspec $ do
11241133 liftIO $
11251134 myTweet `shouldBe` Right exampleTweet
11261135
1136+ it "returns document for for inline template query" $ withTestEnv $ do
1137+ _ <- insertData
1138+ let innerQuery = QueryMatchQuery $
1139+ mkMatchQuery (FieldName "{{userKey}}")
1140+ (QueryString "{{bitemyappKey}}")
1141+ templateParams = TemplateQueryKeyValuePairs $ HM.fromList
1142+ [ ("userKey", "user")
1143+ , ("bitemyappKey", "bitemyapp")
1144+ ]
1145+ templateQuery = QueryTemplateQueryInline $
1146+ TemplateQueryInline innerQuery templateParams
1147+ search = mkSearch (Just templateQuery) Nothing
1148+ myTweet <- searchTweet search
1149+ liftIO $ myTweet `shouldBe` Right exampleTweet
1150+
11271151
11281152 describe "sorting" $ do
11291153 it "returns documents in the right order" $ withTestEnv $ do
@@ -1864,6 +1888,7 @@ main = hspec $ do
18641888 propJSON (Proxy :: Proxy InitialShardCount)
18651889 propJSON (Proxy :: Proxy FSType)
18661890 propJSON (Proxy :: Proxy CompoundFormat)
1891+ propJSON (Proxy :: Proxy TemplateQueryInline)
18671892
18681893-- Temporary solution for lacking of generic derivation of Arbitrary
18691894-- We use generics-sop, as it's much more concise than directly using GHC.Generics
tests/V5/tests.hs+25
@@ -607,6 +607,9 @@ instance (ApproxEq l, Show l, ApproxEq r, Show r) => ApproxEq (Either l r) where
607607instance ApproxEq NodeAttrFilter
608608instance ApproxEq NodeAttrName
609609instance ApproxEq BuildHash
610+instance ApproxEq TemplateQueryKeyValuePairs where
611+ (=~) = (==)
612+instance ApproxEq TemplateQueryInline
610613
611614-- | Due to the way nodeattrfilters get serialized here, they may come
612615-- out in a different order, but they are morally equivalent
@@ -756,6 +759,7 @@ instance Arbitrary Query where
756759 , QuerySimpleQueryStringQuery <$> arbitrary
757760 , QueryRangeQuery <$> arbitrary
758761 , QueryRegexpQuery <$> arbitrary
762+ , QueryTemplateQueryInline <$> arbitrary
759763 ]
760764 shrink = genericShrink
761765
@@ -791,6 +795,10 @@ instance Arbitrary VersionNumber where
791795 where
792796 mk versions = VersionNumber (Vers.Version versions [])
793797
798+instance Arbitrary TemplateQueryKeyValuePairs where
799+ arbitrary = TemplateQueryKeyValuePairs . HM.fromList <$> arbitrary
800+ shrink (TemplateQueryKeyValuePairs x) = map (TemplateQueryKeyValuePairs . HM.fromList) . shrink $ HM.toList x
801+
794802instance Arbitrary IndexName where arbitrary = sopArbitrary; shrink = genericShrink
795803instance Arbitrary MappingName where arbitrary = sopArbitrary; shrink = genericShrink
796804instance Arbitrary DocId where arbitrary = sopArbitrary; shrink = genericShrink
@@ -898,6 +906,7 @@ instance Arbitrary FSType where arbitrary = sopArbitrary; shrink = genericShrink
898906instance Arbitrary CompoundFormat where arbitrary = sopArbitrary; shrink = genericShrink
899907instance Arbitrary FsSnapshotRepo where arbitrary = sopArbitrary; shrink = genericShrink
900908instance Arbitrary SnapshotRepoName where arbitrary = sopArbitrary; shrink = genericShrink
909+instance Arbitrary TemplateQueryInline where arbitrary = sopArbitrary; shrink = genericShrink
901910
902911newtype UpdatableIndexSetting' = UpdatableIndexSetting' UpdatableIndexSetting
903912 deriving (Show, Eq, ToJSON, FromJSON, ApproxEq, Typeable)
@@ -1099,6 +1108,21 @@ main = hspec $ do
10991108 liftIO $
11001109 myTweet `shouldBe` Right exampleTweet
11011110
1111+ it "returns document for for inline template query" $ withTestEnv $ do
1112+ _ <- insertData
1113+ let innerQuery = QueryMatchQuery $
1114+ mkMatchQuery (FieldName "{{userKey}}")
1115+ (QueryString "{{bitemyappKey}}")
1116+ templateParams = TemplateQueryKeyValuePairs $ HM.fromList
1117+ [ ("userKey", "user")
1118+ , ("bitemyappKey", "bitemyapp")
1119+ ]
1120+ templateQuery = QueryTemplateQueryInline $
1121+ TemplateQueryInline innerQuery templateParams
1122+ search = mkSearch (Just templateQuery) Nothing
1123+ myTweet <- searchTweet search
1124+ liftIO $ myTweet `shouldBe` Right exampleTweet
1125+
11021126
11031127 describe "sorting" $ do
11041128 it "returns documents in the right order" $ withTestEnv $ do
@@ -1648,6 +1672,7 @@ main = hspec $ do
16481672 propJSON (Proxy :: Proxy InitialShardCount)
16491673 propJSON (Proxy :: Proxy FSType)
16501674 propJSON (Proxy :: Proxy CompoundFormat)
1675+ propJSON (Proxy :: Proxy TemplateQueryInline)
16511676
16521677-- Temporary solution for lacking of generic derivation of Arbitrary
16531678-- We use generics-sop, as it's much more concise than directly using GHC.Generics