docs: def _make_key_from_series(self, flow_id, key):
          '''
          Get all series keys by calling
          self.series_keys, and validate 
          the key(dict) against it. Raises ValueError if
          a value does not occur in the respective
          set of dimension values. Multiple values per
          dimension can be provided as a list or in 'V1+V2' notation.
  
          Return: key(str) 
          '''
          # get all series keys
          all_keys = self.series_keys(flow_id)
          dim_names = list(all_keys)
          # Validate the key dict
          # First, check correctness of dimension names
          invalid = [d for d in key
                     if d not in dim_names]
          if invalid:
              raise ValueError(
                  'Invalid dimension name {0}, allowed are: {1}'.format(invalid, dim_names))
          # Pre-process key by expanding multiple values as list
          key = {k: v.split('+') if '+' in v else v for k, v in key.items()}
          # Check for each dimension name if values are correct and construct
          # string of the form 'value1.value2.value3+value4' etc.
          # First, wrap each single dim value in a list to allow
          # uniform treatment of single and multiple dim values.
          key_l = {k: [v] if isinstance(v, str_type) else v
                   for k, v in key.items()}
          # Iterate over the dimensions. If the key dict
          # contains an allowed value for the dimension,
          # it will become part of the string.
          invalid = list(chain.from_iterable((((k, v) for v in vl if v not in all_keys[k].values)
                                              for k, vl in key_l.items())))
          if invalid:
              raise ValueError("The following dimension values are invalid: {0}".
                               format(invalid))
          # Generate the 'Val1+Val2' notation for multiple dim values and remove the
          # lists
          for k, v in key_l.items():
              key_l[k] = '+'.join(v)
          # assemble the key string which goes into the URL
          parts = [key_l.get(name, '') for name in dim_names]
          return '.'.join(parts)