private boolean checkFilteredObject()

in hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/ldb/DBScanner.java [406:504]


  private boolean checkFilteredObject(Object obj, Class<?> clazz, Map<String, Filter> fieldsSplitMap) {
    for (Map.Entry<String, Filter> field : fieldsSplitMap.entrySet()) {
      try {
        Field valueClassField = getRequiredFieldFromAllFields(clazz, field.getKey());
        Object valueObject = valueClassField.get(obj);
        Filter fieldValue = field.getValue();

        if (valueObject == null) {
          // there is no such field in the record. This filter will be ignored for the current record.
          continue;
        }
        if (fieldValue == null) {
          err().println("Malformed filter. Check input");
          throw new IOException("Invalid filter passed");
        } else if (fieldValue.getNextLevel() == null) {
          // reached the end of fields hierarchy, check if they match the filter
          try {
            switch (fieldValue.getOperator()) {
            case EQUALS:
              if (!String.valueOf(valueObject).equals(fieldValue.getValue())) {
                return false;
              }
              break;
            case GREATER:
              if (Double.parseDouble(String.valueOf(valueObject))
                  < Double.parseDouble(String.valueOf(fieldValue.getValue()))) {
                return false;
              }
              break;
            case LESSER:
              if (Double.parseDouble(String.valueOf(valueObject))
                  > Double.parseDouble(String.valueOf(fieldValue.getValue()))) {
                return false;
              }
              break;
            case REGEX:
              Pattern p = Pattern.compile(String.valueOf(fieldValue.getValue()));
              Matcher m = p.matcher(String.valueOf(valueObject));
              if (!m.find()) {
                return false;
              }
              break;
            default:
              err().println("Only EQUALS/LESSER/GREATER/REGEX operator is supported currently.");
              throw new IOException("Invalid filter passed");
            }
          } catch (NumberFormatException ex) {
            err().println("LESSER or GREATER operation can be performed only on numeric values.");
            throw new IOException("Invalid filter passed");
          }
        } else {
          Map<String, Filter> subfields = fieldValue.getNextLevel();
          if (Collection.class.isAssignableFrom(valueObject.getClass())) {
            if (!checkFilteredObjectCollection((Collection) valueObject, subfields)) {
              return false;
            }
          } else if (Map.class.isAssignableFrom(valueObject.getClass())) {
            Map<?, ?> valueObjectMap = (Map<?, ?>) valueObject;
            boolean flag = false;
            for (Map.Entry<?, ?> ob : valueObjectMap.entrySet()) {
              boolean subflag;
              if (Collection.class.isAssignableFrom(ob.getValue().getClass())) {
                subflag = checkFilteredObjectCollection((Collection)ob.getValue(), subfields);
              } else {
                subflag = checkFilteredObject(ob.getValue(), ob.getValue().getClass(), subfields);
              }
              if (subflag) {
                // atleast one item in the map/list of the record has matched the filter,
                // so record passes the filter.
                flag = true;
                break;
              }
            }
            if (!flag) {
              // none of the items in the map/list passed the filter => record doesn't pass the filter
              return false;
            }
          } else {
            if (!checkFilteredObject(valueObject, valueClassField.getType(), subfields)) {
              return false;
            }
          }
        }
      } catch (NoSuchFieldException ex) {
        err().println("ERROR: no such field: " + field);
        exception = true;
        return false;
      } catch (IllegalAccessException e) {
        err().println("ERROR: Cannot get field \"" + field + "\" from record.");
        exception = true;
        return false;
      } catch (Exception ex) {
        err().println("ERROR: field: " + field + ", ex: " + ex);
        exception = true;
        return false;
      }
    }
    return true;
  }