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