Call the filter again with runtime data this time
authorBSRK Aditya <bsrk@google.com>
Fri, 19 Jun 2015 10:19:52 +0000 (12:19 +0200)
committerKlaus Aehlig <aehlig@google.com>
Fri, 19 Jun 2015 10:37:29 +0000 (12:37 +0200)
genericQuery filters objects without runtime data first.
We need to filter the objects again, this time with runtime data.

This fixes issue 1100.

Signed-off-by: BSRK Aditya <bsrk@google.com>
Signed-off-by: Klaus Aehlig <aehlig@google.com>
Reviewed-by: Klaus Aehlig <aehlig@google.com>

src/Ganeti/Query/Query.hs

index 135d660..9979858 100644 (file)
@@ -227,13 +227,15 @@ genericQuery fieldsMap collector nameFn configFn getFn cfg
              _  -> mapM (getFn cfg) wanted
   -- Run the first pass of the filter, without a runtime context; this will
   -- limit the objects that we'll contact for exports
-  fobjects <- toError $ filterM (\n -> evaluateFilter cfg Nothing n cfilter)
-                        objects
-  -- Gather the runtime data
-  runtimes <- case collector of
+  fobjects <- toError $
+    filterM (\n -> evaluateQueryFilter cfg Nothing n cfilter) objects
+  -- Gather the runtime data and filter the results again,
+  -- based on the gathered data
+  runtimes <- (case collector of
     CollectorSimple     collFn -> lift $ collFn live' cfg fobjects
-    CollectorFieldAware collFn -> lift $ collFn live' cfg fields fobjects
-  -- Filter the results again, based on the gathered data
+    CollectorFieldAware collFn -> lift $ collFn live' cfg fields fobjects) >>=
+    (toError . filterM (\(obj, runtime) ->
+      evaluateQueryFilter cfg (Just runtime) obj cfilter))
   let fdata = map (\(obj, runtime) ->
                      map (execGetter cfg runtime obj) fgetters)
               runtimes