On Tue, Aug 04, 2015 at 03:39:28PM +0200, 'Klaus Aehlig' via ganeti-devel wrote:
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
I'm not that familiar with this part of the code, so my (only) concern here
is: are we sure that the `fields` argument passed to the function never
contains duplicates? If we are, LGTM, if not, using `take count` later
could return additional fields from the filter.
+ 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