git.iko.soy/typeable/bloodhound
on master help sign in
Add support for template queries
fc6fe99Josh Berman
src/Database/V1/Bloodhound/Types.hs+40
@@ -195,6 +195,8 @@ module Database.V1.Bloodhound.Types
195 , RangeQuery(..)
195 , RangeQuery(..)
196 , RegexpQuery(..)
196 , RegexpQuery(..)
197 , QueryString(..)
197 , QueryString(..)
198+ , TemplateQueryInline(..)
199+ , TemplateQueryKeyValuePairs(..)
198 , BooleanOperator(..)
200 , BooleanOperator(..)
199 , ZeroTermsQuery(..)
201 , ZeroTermsQuery(..)
200 , CutoffFrequency(..)
202 , CutoffFrequency(..)
@@ -1211,6 +1213,7 @@ data Query =
1211 | QuerySimpleQueryStringQuery SimpleQueryStringQuery
1213 | QuerySimpleQueryStringQuery SimpleQueryStringQuery
1212 | QueryRangeQuery RangeQuery
1214 | QueryRangeQuery RangeQuery
1213 | QueryRegexpQuery RegexpQuery
1215 | QueryRegexpQuery RegexpQuery
1216+ | QueryTemplateQueryInline TemplateQueryInline
1214 deriving (Eq, Read, Show, Generic, Typeable)
1217 deriving (Eq, Read, Show, Generic, Typeable)
1215
1218
1216data RegexpQuery =
1219data RegexpQuery =
@@ -1635,6 +1638,38 @@ data DistanceRange =
1635 DistanceRange { distanceFrom :: Distance
1638 DistanceRange { distanceFrom :: Distance
1636 , distanceTo :: Distance } deriving (Eq, Read, Show, Generic, Typeable)
1639 , distanceTo :: Distance } deriving (Eq, Read, Show, Generic, Typeable)
1637
1640
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+
1638data SearchResult a =
1673data SearchResult a =
1639 SearchResult { took :: Int
1674 SearchResult { took :: Int
1640 , timedOut :: Bool
1675 , timedOut :: Bool
@@ -2404,6 +2439,9 @@ instance ToJSON Query where
2404 toJSON (QuerySimpleQueryStringQuery query) =
2439 toJSON (QuerySimpleQueryStringQuery query) =
2405 object [ "simple_query_string" .= query ]
2440 object [ "simple_query_string" .= query ]
2406
2441
2442+ toJSON (QueryTemplateQueryInline templateQuery) =
2443+ object [ "template" .= templateQuery ]
2444+
2407instance FromJSON Query where
2445instance FromJSON Query where
2408 parseJSON v = withObject "Query" parse v
2446 parseJSON v = withObject "Query" parse v
2409 where parse o = termQuery `taggedWith` "term"
2447 where parse o = termQuery `taggedWith` "term"
@@ -2433,6 +2471,7 @@ instance FromJSON Query where
2433 <|> queryRangeQuery `taggedWith` "range"
2471 <|> queryRangeQuery `taggedWith` "range"
2434 <|> queryRegexpQuery `taggedWith` "regexp"
2472 <|> queryRegexpQuery `taggedWith` "regexp"
2435 <|> querySimpleQueryStringQuery `taggedWith` "simple_query_string"
2473 <|> querySimpleQueryStringQuery `taggedWith` "simple_query_string"
2474+ <|> queryTemplateQueryInline `taggedWith` "template"
2436 where taggedWith parser k = parser =<< o .: k
2475 where taggedWith parser k = parser =<< o .: k
2437 termQuery = fieldTagged $ \(FieldName fn) o ->
2476 termQuery = fieldTagged $ \(FieldName fn) o ->
2438 TermQuery <$> (Term fn <$> o .: "value") <*> o .:? "boost"
2477 TermQuery <$> (Term fn <$> o .: "value") <*> o .:? "boost"
@@ -2474,6 +2513,7 @@ instance FromJSON Query where
2474 queryRangeQuery = pure . QueryRangeQuery
2513 queryRangeQuery = pure . QueryRangeQuery
2475 queryRegexpQuery = pure . QueryRegexpQuery
2514 queryRegexpQuery = pure . QueryRegexpQuery
2476 querySimpleQueryStringQuery = pure . QuerySimpleQueryStringQuery
2515 querySimpleQueryStringQuery = pure . QuerySimpleQueryStringQuery
2516+ queryTemplateQueryInline = pure . QueryTemplateQueryInline
2477
2517
2478
2518
2479omitNulls :: [(Text, Value)] -> Value
2519omitNulls :: [(Text, Value)] -> Value
src/Database/V5/Bloodhound/Types.hs+40
@@ -196,6 +196,8 @@ module Database.V5.Bloodhound.Types
196 , RangeQuery(..)
196 , RangeQuery(..)
197 , RegexpQuery(..)
197 , RegexpQuery(..)
198 , QueryString(..)
198 , QueryString(..)
199+ , TemplateQueryInline(..)
200+ , TemplateQueryKeyValuePairs(..)
199 , BooleanOperator(..)
201 , BooleanOperator(..)
200 , ZeroTermsQuery(..)
202 , ZeroTermsQuery(..)
201 , CutoffFrequency(..)
203 , CutoffFrequency(..)
@@ -1211,6 +1213,7 @@ data Query =
1211 | QueryRegexpQuery RegexpQuery
1213 | QueryRegexpQuery RegexpQuery
1212 | QueryExistsQuery FieldName
1214 | QueryExistsQuery FieldName
1213 | QueryMatchNoneQuery
1215 | QueryMatchNoneQuery
1216+ | QueryTemplateQueryInline TemplateQueryInline
1214 deriving (Eq, Read, Show, Generic, Typeable)
1217 deriving (Eq, Read, Show, Generic, Typeable)
1215
1218
1216-- | As of Elastic 2.0, 'Filters' are just 'Queries' housed in a Bool Query, and
1219-- | As of Elastic 2.0, 'Filters' are just 'Queries' housed in a Bool Query, and
@@ -1622,6 +1625,38 @@ data DistanceRange =
1622 DistanceRange { distanceFrom :: Distance
1625 DistanceRange { distanceFrom :: Distance
1623 , distanceTo :: Distance } deriving (Eq, Read, Show, Generic, Typeable)
1626 , distanceTo :: Distance } deriving (Eq, Read, Show, Generic, Typeable)
1624
1627
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+
1625data SearchResult a =
1660data SearchResult a =
1626 SearchResult { took :: Int
1661 SearchResult { took :: Int
1627 , timedOut :: Bool
1662 , timedOut :: Bool
@@ -2220,6 +2255,9 @@ instance ToJSON Query where
2220 toJSON QueryMatchNoneQuery =
2255 toJSON QueryMatchNoneQuery =
2221 object ["match_none" .= object []]
2256 object ["match_none" .= object []]
2222
2257
2258+ toJSON (QueryTemplateQueryInline templateQuery) =
2259+ object [ "template" .= templateQuery ]
2260+
2223instance FromJSON Query where
2261instance FromJSON Query where
2224 parseJSON v = withObject "Query" parse v
2262 parseJSON v = withObject "Query" parse v
2225 where parse o = termQuery `taggedWith` "term"
2263 where parse o = termQuery `taggedWith` "term"
@@ -2247,6 +2285,7 @@ instance FromJSON Query where
2247 <|> queryRangeQuery `taggedWith` "range"
2285 <|> queryRangeQuery `taggedWith` "range"
2248 <|> queryRegexpQuery `taggedWith` "regexp"
2286 <|> queryRegexpQuery `taggedWith` "regexp"
2249 <|> querySimpleQueryStringQuery `taggedWith` "simple_query_string"
2287 <|> querySimpleQueryStringQuery `taggedWith` "simple_query_string"
2288+ <|> queryTemplateQueryInline `taggedWith` "template"
2250 where taggedWith parser k = parser =<< o .: k
2289 where taggedWith parser k = parser =<< o .: k
2251 termQuery = fieldTagged $ \(FieldName fn) o ->
2290 termQuery = fieldTagged $ \(FieldName fn) o ->
2252 TermQuery <$> (Term fn <$> o .: "value") <*> o .:? "boost"
2291 TermQuery <$> (Term fn <$> o .: "value") <*> o .:? "boost"
@@ -2284,6 +2323,7 @@ instance FromJSON Query where
2284 queryRegexpQuery = pure . QueryRegexpQuery
2323 queryRegexpQuery = pure . QueryRegexpQuery
2285 querySimpleQueryStringQuery = pure . QuerySimpleQueryStringQuery
2324 querySimpleQueryStringQuery = pure . QuerySimpleQueryStringQuery
2286 queryExistsQuery o = QueryExistsQuery <$> o .: "field"
2325 queryExistsQuery o = QueryExistsQuery <$> o .: "field"
2326+ queryTemplateQueryInline = pure . QueryTemplateQueryInline
2287
2327
2288
2328
2289omitNulls :: [(Text, Value)] -> Value
2329omitNulls :: [(Text, Value)] -> Value
tests/V1/tests.hs+25
@@ -595,6 +595,9 @@ instance (ApproxEq l, ApproxEq r) => ApproxEq (Either l r) where
595instance ApproxEq NodeAttrFilter
595instance ApproxEq NodeAttrFilter
596instance ApproxEq NodeAttrName
596instance ApproxEq NodeAttrName
597instance ApproxEq BuildHash
597instance ApproxEq BuildHash
598+instance ApproxEq TemplateQueryKeyValuePairs where
599+ (=~) = (==)
600+instance ApproxEq TemplateQueryInline
598
601
599-- | Due to the way nodeattrfilters get serialized here, they may come
602-- | Due to the way nodeattrfilters get serialized here, they may come
600-- out in a different order, but they are morally equivalent
603-- out in a different order, but they are morally equivalent
@@ -746,6 +749,7 @@ instance Arbitrary Query where
746 , QuerySimpleQueryStringQuery <$> arbitrary
749 , QuerySimpleQueryStringQuery <$> arbitrary
747 , QueryRangeQuery <$> arbitrary
750 , QueryRangeQuery <$> arbitrary
748 , QueryRegexpQuery <$> arbitrary
751 , QueryRegexpQuery <$> arbitrary
752+ , QueryTemplateQueryInline <$> arbitrary
749 ]
753 ]
750 shrink = genericShrink
754 shrink = genericShrink
751
755
@@ -798,6 +802,10 @@ instance Arbitrary VersionNumber where
798 where
802 where
799 mk versions = VersionNumber (Vers.Version versions [])
803 mk versions = VersionNumber (Vers.Version versions [])
800
804
805+instance Arbitrary TemplateQueryKeyValuePairs where
806+ arbitrary = TemplateQueryKeyValuePairs . HM.fromList <$> arbitrary
807+ shrink (TemplateQueryKeyValuePairs x) = map (TemplateQueryKeyValuePairs . HM.fromList) . shrink $ HM.toList x
808+
801instance Arbitrary IndexName where arbitrary = sopArbitrary; shrink = genericShrink
809instance Arbitrary IndexName where arbitrary = sopArbitrary; shrink = genericShrink
802instance Arbitrary MappingName where arbitrary = sopArbitrary; shrink = genericShrink
810instance Arbitrary MappingName where arbitrary = sopArbitrary; shrink = genericShrink
803instance Arbitrary DocId where arbitrary = sopArbitrary; shrink = genericShrink
811instance Arbitrary DocId where arbitrary = sopArbitrary; shrink = genericShrink
@@ -913,6 +921,7 @@ instance Arbitrary FSType where arbitrary = sopArbitrary; shrink = genericShrink
913instance Arbitrary CompoundFormat where arbitrary = sopArbitrary; shrink = genericShrink
921instance Arbitrary CompoundFormat where arbitrary = sopArbitrary; shrink = genericShrink
914instance Arbitrary FsSnapshotRepo where arbitrary = sopArbitrary; shrink = genericShrink
922instance Arbitrary FsSnapshotRepo where arbitrary = sopArbitrary; shrink = genericShrink
915instance Arbitrary SnapshotRepoName where arbitrary = sopArbitrary; shrink = genericShrink
923instance Arbitrary SnapshotRepoName where arbitrary = sopArbitrary; shrink = genericShrink
924+instance Arbitrary TemplateQueryInline where arbitrary = sopArbitrary; shrink = genericShrink
916
925
917newtype UpdatableIndexSetting' = UpdatableIndexSetting' UpdatableIndexSetting
926newtype UpdatableIndexSetting' = UpdatableIndexSetting' UpdatableIndexSetting
918 deriving (Show, Eq, ToJSON, FromJSON, ApproxEq, Typeable)
927 deriving (Show, Eq, ToJSON, FromJSON, ApproxEq, Typeable)
@@ -1124,6 +1133,21 @@ main = hspec $ do
1124 liftIO $
1133 liftIO $
1125 myTweet `shouldBe` Right exampleTweet
1134 myTweet `shouldBe` Right exampleTweet
1126
1135
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+
1127
1151
1128 describe "sorting" $ do
1152 describe "sorting" $ do
1129 it "returns documents in the right order" $ withTestEnv $ do
1153 it "returns documents in the right order" $ withTestEnv $ do
@@ -1864,6 +1888,7 @@ main = hspec $ do
1864 propJSON (Proxy :: Proxy InitialShardCount)
1888 propJSON (Proxy :: Proxy InitialShardCount)
1865 propJSON (Proxy :: Proxy FSType)
1889 propJSON (Proxy :: Proxy FSType)
1866 propJSON (Proxy :: Proxy CompoundFormat)
1890 propJSON (Proxy :: Proxy CompoundFormat)
1891+ propJSON (Proxy :: Proxy TemplateQueryInline)
1867
1892
1868-- Temporary solution for lacking of generic derivation of Arbitrary
1893-- Temporary solution for lacking of generic derivation of Arbitrary
1869-- We use generics-sop, as it's much more concise than directly using GHC.Generics
1894-- 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
607instance ApproxEq NodeAttrFilter
607instance ApproxEq NodeAttrFilter
608instance ApproxEq NodeAttrName
608instance ApproxEq NodeAttrName
609instance ApproxEq BuildHash
609instance ApproxEq BuildHash
610+instance ApproxEq TemplateQueryKeyValuePairs where
611+ (=~) = (==)
612+instance ApproxEq TemplateQueryInline
610
613
611-- | Due to the way nodeattrfilters get serialized here, they may come
614-- | Due to the way nodeattrfilters get serialized here, they may come
612-- out in a different order, but they are morally equivalent
615-- out in a different order, but they are morally equivalent
@@ -756,6 +759,7 @@ instance Arbitrary Query where
756 , QuerySimpleQueryStringQuery <$> arbitrary
759 , QuerySimpleQueryStringQuery <$> arbitrary
757 , QueryRangeQuery <$> arbitrary
760 , QueryRangeQuery <$> arbitrary
758 , QueryRegexpQuery <$> arbitrary
761 , QueryRegexpQuery <$> arbitrary
762+ , QueryTemplateQueryInline <$> arbitrary
759 ]
763 ]
760 shrink = genericShrink
764 shrink = genericShrink
761
765
@@ -791,6 +795,10 @@ instance Arbitrary VersionNumber where
791 where
795 where
792 mk versions = VersionNumber (Vers.Version versions [])
796 mk versions = VersionNumber (Vers.Version versions [])
793
797
798+instance Arbitrary TemplateQueryKeyValuePairs where
799+ arbitrary = TemplateQueryKeyValuePairs . HM.fromList <$> arbitrary
800+ shrink (TemplateQueryKeyValuePairs x) = map (TemplateQueryKeyValuePairs . HM.fromList) . shrink $ HM.toList x
801+
794instance Arbitrary IndexName where arbitrary = sopArbitrary; shrink = genericShrink
802instance Arbitrary IndexName where arbitrary = sopArbitrary; shrink = genericShrink
795instance Arbitrary MappingName where arbitrary = sopArbitrary; shrink = genericShrink
803instance Arbitrary MappingName where arbitrary = sopArbitrary; shrink = genericShrink
796instance Arbitrary DocId where arbitrary = sopArbitrary; shrink = genericShrink
804instance Arbitrary DocId where arbitrary = sopArbitrary; shrink = genericShrink
@@ -898,6 +906,7 @@ instance Arbitrary FSType where arbitrary = sopArbitrary; shrink = genericShrink
898instance Arbitrary CompoundFormat where arbitrary = sopArbitrary; shrink = genericShrink
906instance Arbitrary CompoundFormat where arbitrary = sopArbitrary; shrink = genericShrink
899instance Arbitrary FsSnapshotRepo where arbitrary = sopArbitrary; shrink = genericShrink
907instance Arbitrary FsSnapshotRepo where arbitrary = sopArbitrary; shrink = genericShrink
900instance Arbitrary SnapshotRepoName where arbitrary = sopArbitrary; shrink = genericShrink
908instance Arbitrary SnapshotRepoName where arbitrary = sopArbitrary; shrink = genericShrink
909+instance Arbitrary TemplateQueryInline where arbitrary = sopArbitrary; shrink = genericShrink
901
910
902newtype UpdatableIndexSetting' = UpdatableIndexSetting' UpdatableIndexSetting
911newtype UpdatableIndexSetting' = UpdatableIndexSetting' UpdatableIndexSetting
903 deriving (Show, Eq, ToJSON, FromJSON, ApproxEq, Typeable)
912 deriving (Show, Eq, ToJSON, FromJSON, ApproxEq, Typeable)
@@ -1099,6 +1108,21 @@ main = hspec $ do
1099 liftIO $
1108 liftIO $
1100 myTweet `shouldBe` Right exampleTweet
1109 myTweet `shouldBe` Right exampleTweet
1101
1110
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+
1102
1126
1103 describe "sorting" $ do
1127 describe "sorting" $ do
1104 it "returns documents in the right order" $ withTestEnv $ do
1128 it "returns documents in the right order" $ withTestEnv $ do
@@ -1648,6 +1672,7 @@ main = hspec $ do
1648 propJSON (Proxy :: Proxy InitialShardCount)
1672 propJSON (Proxy :: Proxy InitialShardCount)
1649 propJSON (Proxy :: Proxy FSType)
1673 propJSON (Proxy :: Proxy FSType)
1650 propJSON (Proxy :: Proxy CompoundFormat)
1674 propJSON (Proxy :: Proxy CompoundFormat)
1675+ propJSON (Proxy :: Proxy TemplateQueryInline)
1651
1676
1652-- Temporary solution for lacking of generic derivation of Arbitrary
1677-- Temporary solution for lacking of generic derivation of Arbitrary
1653-- We use generics-sop, as it's much more concise than directly using GHC.Generics
1678-- We use generics-sop, as it's much more concise than directly using GHC.Generics