Return multiple fields multiple times
authorKlaus Aehlig <aehlig@google.com>
Tue, 4 Aug 2015 16:03:03 +0000 (18:03 +0200)
committerKlaus Aehlig <aehlig@google.com>
Tue, 4 Aug 2015 16:25:14 +0000 (18:25 +0200)
While it is not very useful, our specification still says
that we should return the values for fields requested multiple
times also multiple times. Commit 237a43b added fetching of
fields not requested but needed to evaluate the filter; to
avoid overhead the list of fields was deduplicated, thereby
breaking the said property. Restore it by only deduplicating
and filtering the additional fields.

Signed-off-by: Klaus Aehlig <aehlig@google.com>
Reviewed-by: Petr Pudlak <pudlak@google.com>

src/Ganeti/Query/Query.hs

index 4d8fc83..1d6f8fb 100644 (file)
@@ -218,8 +218,9 @@ genericQuery fieldsMap collector nameFn configFn getFn cfg
              live fields qfilter wanted =
   runResultT $ do
   cfilter <- toError $ compileFilter fieldsMap qfilter
-  let allfields = ordNub $ fields ++ filterArguments qfilter
-      count = length $ ordNub fields
+  let allfields = (++) fields . filter (not . (`elem` fields))
+                  . ordNub $ filterArguments qfilter
+      count = length fields
       selected = getSelectedFields fieldsMap allfields
       (fdefs, fgetters, _) = unzip3 selected
       live' = live && needsLiveData fgetters