code: @SuppressWarnings("unchecked")
    public Query select(String selection) {
      checkNotEmpty(selection, "Selection must not be empty.");
  
      if (countDots(selection) >= 2) {
        throw new IllegalArgumentException("Cannot request children of fields. "
            + "('fields.author'(✔) vs. 'fields.author.name'(✖))");
      }
  
      if (selection.startsWith("fields.") && !hasContentTypeSet()) {
        throw new IllegalStateException("Cannot use field selection without "
            + "specifying a content type first. Use '.withContentType(\"{typeid}\")' first.");
      }
  
      if (selection.startsWith("sys.") || "sys".equals(selection)) {
        if (params.containsKey(PARAMETER_SELECT)) {
          // nothing to be done here, a select is already present
        } else {
          params.put(PARAMETER_SELECT, "sys");
        }
      } else if (params.containsKey(PARAMETER_SELECT)) {
        params.put(PARAMETER_SELECT, params.get(PARAMETER_SELECT) + "," + selection);
      } else {
        params.put(PARAMETER_SELECT, "sys," + selection);
      }
  
      return (Query) this;
    }
docs: Limit response to only selected properties.
  <p>
  Returns an object in which fields not specified will be <b>null</b>, resulting in potentially
  smaller response from Contentful.
  <p>
  The complete <b>sys</b> object will always be returned.
  
  @param selection to be used. Should be 'fields.name' or similar.
  @return the calling query for chaining.
  @throws NullPointerException     if selection is null.
  @throws IllegalArgumentException if selection is empty.
  @throws IllegalStateException    if no content type was queried for before.
  @throws IllegalArgumentException if tried to request deeper then the name of a selection.