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

Reply via email to