public static boolean isCompatibleForOperator(Class<?> type, FilterOperator op, Object value) { if (value == null || type == null) return true; else if (op.equals(FilterOperator.EXISTS) && (value instanceof Boolean)) return true; else if (op.equals(FilterOperator.IN) && (value.getClass().isArray() || Iterable.class.isAssignableFrom(value.getClass()) || Map.class.isAssignableFrom(value.getClass()))) return true; else if (op.equals(FilterOperator.NOT_IN) && (value.getClass().isArray() || Iterable.class.isAssignableFrom(value.getClass()) || Map.class.isAssignableFrom(value.getClass()))) return true; else if (op.equals(FilterOperator.ALL) && (value.getClass().isArray() || Iterable.class.isAssignableFrom(value.getClass()) || Map.class.isAssignableFrom(value.getClass()))) return true; else if (value instanceof Integer && (int.class.equals(type) || long.class.equals(type) || Long.class.equals(type))) return true; else if ((value instanceof Integer || value instanceof Long) && (double.class.equals(type) || Double.class.equals(type))) return true; else if (value instanceof Pattern && String.class.equals(type)) return true; else if (value.getClass().getAnnotation(Entity.class) != null && Key.class.equals(type)) return true; else if (value instanceof List<?>) return true; else if (!value.getClass().isAssignableFrom(type) && //hack to let Long match long, and so on !value.getClass().getSimpleName().toLowerCase().equals(type.getSimpleName().toLowerCase())) { return false; } return true; }
public static FilterOperator fromString(String val) { for (int i = 0; i < values().length; i++) { FilterOperator fo = values()[i]; if (fo.equals(val)) return fo; } return null; } }
@SuppressWarnings("unchecked") public void addTo(DBObject obj) { if (FilterOperator.EQUAL.equals(operator)) { obj.put(this.field, value); // no operator, prop equals value } else { Object inner = obj.get(field); // operator within inner object if (!(inner instanceof Map)) { inner = new HashMap<String, Object>(); obj.put(field, inner); } Object val = not ? new BasicDBObject("$not", value) : value; ((Map<String, Object>) inner).put(operator.val(), val); } }