Queries are affected by two forms of fields: - those the user wishes to see, and - those needed to evaluate the filter provided. For internal handling, we do have to fetch the fields of either category to avoid wrong results, even if we only output fields of the first category. Ensure this fetch.
Signed-off-by: Klaus Aehlig <[email protected]> --- src/Ganeti/Query/Query.hs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Ganeti/Query/Query.hs b/src/Ganeti/Query/Query.hs index 09cadf9..bdbfa08 100644 --- a/src/Ganeti/Query/Query.hs +++ b/src/Ganeti/Query/Query.hs @@ -218,7 +218,9 @@ genericQuery fieldsMap collector nameFn configFn getFn cfg live fields qfilter wanted = runResultT $ do cfilter <- toError $ compileFilter fieldsMap qfilter - let selected = getSelectedFields fieldsMap fields + let allfields = ordNub $ fields ++ filterArguments qfilter + count = length fields + selected = getSelectedFields fieldsMap allfields (fdefs, fgetters, _) = unzip3 selected live' = live && needsLiveData fgetters objects <- toError $ case wanted of @@ -233,13 +235,14 @@ genericQuery fieldsMap collector nameFn configFn getFn cfg -- based on the gathered data runtimes <- (case collector of CollectorSimple collFn -> lift $ collFn live' cfg fobjects - CollectorFieldAware collFn -> lift $ collFn live' cfg fields fobjects) >>= - (toError . filterM (\(obj, runtime) -> + CollectorFieldAware collFn -> lift $ collFn live' cfg allfields fobjects) + >>= (toError . filterM (\(obj, runtime) -> evaluateFilter cfg (Just runtime) obj cfilter)) let fdata = map (\(obj, runtime) -> map (execGetter cfg runtime obj) fgetters) runtimes - return QueryResult { qresFields = fdefs, qresData = fdata } + return QueryResult { qresFields = take count fdefs + , qresData = map (take count) fdata } -- | Dummy recollection of the data for a lock from the prefected -- data for all locks. -- 2.5.0.rc2.392.g76e840b
