Revision 0122b96d
b/src/Ganeti/Query/Filter.hs | ||
---|---|---|
48 | 48 |
( compileFilter |
49 | 49 |
, evaluateFilter |
50 | 50 |
, requestedNames |
51 |
, FilterConstructor |
|
51 | 52 |
, makeSimpleFilter |
53 |
, makeHostnameFilter |
|
52 | 54 |
) where |
53 | 55 |
|
54 | 56 |
import Control.Applicative |
55 | 57 |
import Control.Monad (liftM) |
56 | 58 |
import qualified Data.Map as Map |
59 |
import Data.Maybe (fromJust) |
|
57 | 60 |
import Data.Traversable (traverse) |
58 | 61 |
import Text.JSON (JSValue(..), fromJSString) |
59 | 62 |
import Text.JSON.Pretty (pp_value) |
... | ... | |
215 | 218 |
else Nothing |
216 | 219 |
requestedNames _ _ = Nothing |
217 | 220 |
|
221 |
|
|
222 |
type FilterConstructor = String -> [Either String Integer] -> Filter FilterField |
|
223 |
|
|
218 | 224 |
-- | Builds a simple filter from a list of names. |
219 | 225 |
makeSimpleFilter :: String -> [Either String Integer] -> Filter FilterField |
220 | 226 |
makeSimpleFilter _ [] = EmptyFilter |
221 | 227 |
makeSimpleFilter namefield vals = |
222 | 228 |
OrFilter $ map (EQFilter namefield . either QuotedString NumericValue) vals |
229 |
|
|
230 |
-- | List of symbols with a special meaning for regular expressions. |
|
231 |
reSpecialSymbols :: String |
|
232 |
reSpecialSymbols = "\\.|()[]" |
|
233 |
|
|
234 |
-- | Quote symbols that have special meaning in regular expressions. |
|
235 |
quoteForRegex :: String -> String |
|
236 |
quoteForRegex s = s >>= \x -> |
|
237 |
if x `elem` reSpecialSymbols then ['\\', x] else [x] |
|
238 |
|
|
239 |
-- | Builds a filter for hostnames from a list of names. |
|
240 |
makeHostnameFilter :: String -> [Either String Integer] -> Filter FilterField |
|
241 |
makeHostnameFilter _ [] = EmptyFilter |
|
242 |
makeHostnameFilter namefield vals = |
|
243 |
OrFilter . flip map vals |
|
244 |
$ either (RegexpFilter namefield . fromJust . mkRegex |
|
245 |
. (\ s -> "^(" ++ s ++ "|" ++ s ++ "\\..*)$") |
|
246 |
. quoteForRegex) |
|
247 |
(EQFilter namefield . NumericValue) |
Also available in: Unified diff