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