Revision 56bbc5b0
b/src/Ganeti/Query/Filter.hs | ||
---|---|---|
48 | 48 |
( compileFilter |
49 | 49 |
, evaluateFilter |
50 | 50 |
, requestedNames |
51 |
, FilterConstructor |
|
52 | 51 |
, makeSimpleFilter |
53 |
, makeHostnameFilter |
|
54 | 52 |
) where |
55 | 53 |
|
56 | 54 |
import Control.Applicative |
57 | 55 |
import Control.Monad (liftM) |
58 | 56 |
import qualified Data.Map as Map |
59 |
import Data.Maybe (fromJust) |
|
60 | 57 |
import Data.Traversable (traverse) |
61 | 58 |
import Text.JSON (JSValue(..), fromJSString) |
62 | 59 |
import Text.JSON.Pretty (pp_value) |
... | ... | |
242 | 239 |
else Nothing |
243 | 240 |
requestedNames _ _ = Nothing |
244 | 241 |
|
245 |
|
|
246 |
type FilterConstructor = String -> [Either String Integer] -> Filter FilterField |
|
247 |
|
|
248 | 242 |
-- | Builds a simple filter from a list of names. |
249 | 243 |
makeSimpleFilter :: String -> [Either String Integer] -> Filter FilterField |
250 | 244 |
makeSimpleFilter _ [] = EmptyFilter |
251 | 245 |
makeSimpleFilter namefield vals = |
252 | 246 |
OrFilter $ map (EQFilter namefield . either QuotedString NumericValue) vals |
253 |
|
|
254 |
-- | List of symbols with a special meaning for regular expressions. |
|
255 |
reSpecialSymbols :: String |
|
256 |
reSpecialSymbols = "\\.|()[]" |
|
257 |
|
|
258 |
-- | Quote symbols that have special meaning in regular expressions. |
|
259 |
quoteForRegex :: String -> String |
|
260 |
quoteForRegex s = s >>= \x -> |
|
261 |
if x `elem` reSpecialSymbols then ['\\', x] else [x] |
|
262 |
|
|
263 |
-- | Builds a filter for hostnames from a list of names. |
|
264 |
makeHostnameFilter :: String -> [Either String Integer] -> Filter FilterField |
|
265 |
makeHostnameFilter _ [] = EmptyFilter |
|
266 |
makeHostnameFilter namefield vals = |
|
267 |
OrFilter . flip map vals |
|
268 |
$ either (RegexpFilter namefield . fromJust . mkRegex |
|
269 |
. (\ s -> "^(" ++ s ++ "|" ++ s ++ "\\..*)$") |
|
270 |
. quoteForRegex) |
|
271 |
(EQFilter namefield . NumericValue) |
Also available in: Unified diff