From 946a8d8bcbd7350679186215e340ced2d2c090d3 Mon Sep 17 00:00:00 2001
From: Bert Palm <bert.palm@ufz.de>
Date: Tue, 16 Apr 2019 17:02:48 +0200
Subject: [PATCH] modified evaluator to new assign keyword

---
 core.py            |  6 +++---
 dsl/evaluator.py   | 42 ++++++++++++++++++++++++++++++++++--------
 funcs/functions.py |  2 ++
 3 files changed, 39 insertions(+), 11 deletions(-)

diff --git a/core.py b/core.py
index 82e90c98a..d1a49056f 100644
--- a/core.py
+++ b/core.py
@@ -82,12 +82,12 @@ def runner(meta, flagger, data, flags=None, nodata=np.nan):
             # create a flag column if this is explicitly stated
             # or if a variable is checked but no corresponding
             # flag column exists
-            if (flag_params.get(FlagParams.ASSIGN) or
-                ((varname in data) and (varname not in flags))):
+            if flag_params.get(FlagParams.ASSIGN) or \
+                    (varname in data and varname not in flags):
                 dummy = pd.DataFrame(index=data.index, columns=[varname])
                 flags = flags.join(flagger.initFlags(dummy))
 
-            if varname not in data:
+            elif varname not in data and varname not in flags:
                 continue
 
             dchunk = data.loc[start_date:end_date]
diff --git a/dsl/evaluator.py b/dsl/evaluator.py
index 1f6dee768..f91586190 100644
--- a/dsl/evaluator.py
+++ b/dsl/evaluator.py
@@ -103,15 +103,41 @@ def evalExpression(expr: str, flagger: BaseFlagger,
                 # name is not referring to an DataFrame field
                 return field
 
-            try:
-                flagcol = namespace["flags"][field]
-                if namespace.get("target") == "flags":
-                    out = flagcol
-                else:
+            fidx = namespace["flags"].columns
+            if isinstance(fidx, pd.MultiIndex):
+                fcols = fidx.get_level_values(0).unique()
+            else:
+                fcols = fidx.values
+            dcols = namespace["data"].columns.values
+
+            if namespace.get("target") == "flags":
+                # We are forced to work on flags
+                if field in fcols:
+                    out = namespace["flags"][field]
+                elif field in dcols:
+                    # Up to now there are no flagging information on the requested
+                    # field, so return a fresh new unflagged vector
                     datacol = namespace["data"][field]
-                    out = np.ma.masked_array(datacol,
-                                             mask=flagger.isFlagged(flagcol))
-            except KeyError:
+                    dummy = pd.DataFrame(index=datacol.index, columns=[field])
+                    out = flagger.initFlags(dummy)
+                else:
+                    _raiseNameError(field, expr)
+
+            elif field in dcols and field in fcols:
+                # Return all unflagged (original) data
+                datacol = namespace["data"][field]
+                flagcol = namespace["flags"][field]
+                out = np.ma.masked_array(datacol, mask=flagger.isFlagged(flagcol))
+
+            elif field in dcols and field not in fcols:
+                # Return all data, because we have no flagging information
+                out = namespace["data"][field].values
+
+            elif field not in dcols and field in fcols:
+                # Return only flag information, because we have no data
+                out = namespace["flags"][field].values
+
+            else:
                 _raiseNameError(field, expr)
 
             return out
diff --git a/funcs/functions.py b/funcs/functions.py
index 94a65119d..a2c872cc0 100644
--- a/funcs/functions.py
+++ b/funcs/functions.py
@@ -29,6 +29,8 @@ def flagGeneric(data, flags, field, flagger, nodata=np.nan, **flag_params):
                             data, flags, field,
                             nodata=nodata)
 
+    result = result.squeeze()
+
     if np.isscalar(result):
         raise TypeError(f"expression '{expression}' does not return an array")
 
-- 
GitLab