@Override
  public Filter parse(QueryParseContext parseContext) throws IOException, QueryParsingException {
    XContentParser parser = parseContext.parser();

    Filter filter = null;
    boolean cache = true;

    String currentFieldName = null;
    XContentParser.Token token;
    while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
      if (token == XContentParser.Token.FIELD_NAME) {
        currentFieldName = parser.currentName();
      } else if (token == XContentParser.Token.START_OBJECT) {
        if ("filter".equals(currentFieldName)) {
          filter = parseContext.parseInnerFilter();
        }
      } else if (token.isValue()) {
        if ("cache".equals(currentFieldName)) {
          cache = parser.booleanValue();
        }
      }
    }

    if (filter == null) {
      throw new QueryParsingException(index, "filter is required when using `not` filter");
    }

    if (cache) {
      filter = parseContext.cacheFilterIfPossible(filter);
    }
    // no need to cache this one
    return new NotFilter(filter);
  }