No need to pass the unmodified QffMode `qff` supplied by the caller unmodified to a function supplied by the caller. --- src/Ganeti/Query/Filter.hs | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-)
diff --git a/src/Ganeti/Query/Filter.hs b/src/Ganeti/Query/Filter.hs index fc695b4..d8a8e0e 100644 --- a/src/Ganeti/Query/Filter.hs +++ b/src/Ganeti/Query/Filter.hs @@ -103,23 +103,19 @@ wrapGetter :: ConfigData -> Maybe b -> a -> (FieldGetter a b, QffMode) - -> (QffMode -> JSValue -> ErrorResult Bool) + -> (JSValue -> ErrorResult Bool) -> ErrorResult Bool wrapGetter cfg b a (getter, qff) faction = case tryGetter cfg b a getter of Nothing -> Ok True -- runtime missing, accepting the value Just v -> case v of - ResultEntry RSNormal (Just fval) -> qffField qff fval >>= faction qff + ResultEntry RSNormal (Just fval) -> qffField qff fval >>= faction ResultEntry RSNormal Nothing -> Bad $ ProgrammerError "Internal error: Getter returned RSNormal/Nothing" _ -> Ok True -- filter has no data to work, accepting it --- | Wrapper alias over field functions to ignore their first Qff argument. -ignoreMode :: a -> QffMode -> a -ignoreMode = const - -- | Helper to evaluate a filter getter (and the value it generates) in -- a boolean context. trueFilter :: JSValue -> ErrorResult Bool @@ -137,20 +133,20 @@ type Comparator = (Eq a, Ord a) => a -> a -> Bool -- -- This will handle hostnames correctly, if the mode is set to -- 'QffHostname'. -eqFilter :: FilterValue -> QffMode -> JSValue -> ErrorResult Bool +eqFilter :: QffMode -> FilterValue -> JSValue -> ErrorResult Bool -- send 'QffNormal' queries to 'binOpFilter' -eqFilter flv QffNormal jsv = binOpFilter (==) flv jsv +eqFilter QffNormal flv jsv = binOpFilter (==) flv jsv -- and 'QffTimestamp' as well -eqFilter flv QffTimestamp jsv = binOpFilter (==) flv jsv +eqFilter QffTimestamp flv jsv = binOpFilter (==) flv jsv -- error out if we set 'QffHostname' on a non-string field -eqFilter _ QffHostname (JSRational _ _) = +eqFilter QffHostname _ (JSRational _ _) = Bad . ProgrammerError $ "QffHostname field returned a numeric value" -- test strings via 'compareNameComponent' -eqFilter (QuotedString y) QffHostname (JSString x) = +eqFilter QffHostname (QuotedString y) (JSString x) = Ok $ goodLookupResult (fromJSString x `compareNameComponent` y) -- send all other combinations (all errors) to 'binOpFilter', which -- has good error messages -eqFilter flv _ jsv = binOpFilter (==) flv jsv +eqFilter _ flv jsv = binOpFilter (==) flv jsv -- | Helper to evaluate a filder getter (and the value it generates) -- in a boolean context. Note the order of arguments is reversed from @@ -191,18 +187,18 @@ evaluateFilter :: ConfigData -> Maybe b -> a -> Filter (FieldGetter a b, QffMode) -> ErrorResult Bool evaluateFilter c mb a fil = case fil of - EmptyFilter -> Ok True - AndFilter flts -> allM (evaluateFilter c mb a) flts - OrFilter flts -> anyM (evaluateFilter c mb a) flts - NotFilter flt -> not <$> evaluateFilter c mb a flt - TrueFilter getter -> wrap getter $ ignoreMode trueFilter - EQFilter getter val -> wrap getter $ eqFilter val - LTFilter getter val -> wrap getter $ ignoreMode (binOpFilter (<) val) - LEFilter getter val -> wrap getter $ ignoreMode (binOpFilter (<=) val) - GTFilter getter val -> wrap getter $ ignoreMode (binOpFilter (>) val) - GEFilter getter val -> wrap getter $ ignoreMode (binOpFilter (>=) val) - RegexpFilter getter re -> wrap getter $ ignoreMode (regexpFilter re) - ContainsFilter getter val -> wrap getter $ ignoreMode (containsFilter val) + EmptyFilter -> Ok True + AndFilter flts -> allM (evaluateFilter c mb a) flts + OrFilter flts -> anyM (evaluateFilter c mb a) flts + NotFilter flt -> not <$> evaluateFilter c mb a flt + TrueFilter getter -> wrap getter trueFilter + EQFilter getter@(_, qff) val -> wrap getter $ eqFilter qff val + LTFilter getter val -> wrap getter $ binOpFilter (<) val + LEFilter getter val -> wrap getter $ binOpFilter (<=) val + GTFilter getter val -> wrap getter $ binOpFilter (>) val + GEFilter getter val -> wrap getter $ binOpFilter (>=) val + RegexpFilter getter re -> wrap getter $ regexpFilter re + ContainsFilter getter val -> wrap getter $ containsFilter val where wrap = wrapGetter c mb a -- 2.1.0.rc2.206.gedb03e5