private boolean eval(PredicateContext ctx) { if (CriteriaType.EXISTS == criteriaType) { boolean exists = ((Boolean) right); try { Configuration c = Configuration.builder() .jsonProvider(ctx.configuration().jsonProvider()) .options(Option.REQUIRE_PROPERTIES) .build(); ((Path) left).evaluate(ctx.item(), ctx.root(), c).getValue(); return exists; } catch (PathNotFoundException e) { return !exists; } } else { try { Object leftVal = evaluateIfPath(left, ctx); Object rightVal = evaluateIfPath(right, ctx); return criteriaType.eval(rightVal, leftVal, ctx); } catch (ValueCompareException e) { return false; } catch (PathNotFoundException e) { return false; } } }
@Override boolean eval(Object left, Object right, PredicateContext ctx) { int size = (Integer) left; boolean res; if (ctx.configuration().jsonProvider().isArray(right)) { int length = ctx.configuration().jsonProvider().length(right); res = (length == size); if (logger.isDebugEnabled()) logger.debug("Array with size {} {} {} => {}", length, name(), size, res); } else if (right instanceof String) { int length = ((String) right).length(); res = length == size; if (logger.isDebugEnabled()) logger.debug("String with length {} {} {} => {}", length, name(), size, res); } else { res = false; if (logger.isDebugEnabled()) logger.debug( "{} {} {} => {}", right == null ? "null" : right.getClass().getName(), name(), size, res); } return res; }
@Override boolean eval(Object left, Object right, PredicateContext ctx) { boolean res = true; Collection exps = (Collection) left; if (ctx.configuration().jsonProvider().isArray(right)) { for (Object exp : exps) { boolean found = false; for (Object check : ctx.configuration().jsonProvider().toIterable(right)) { if (0 == safeCompare(exp, check)) { found = true; break; } } if (!found) { res = false; break; } } if (logger.isDebugEnabled()) logger.debug( "[{}] {} [{}] => {}", join(", ", ctx.configuration().jsonProvider().toIterable(right)), name(), join(", ", exps), res); } else { res = false; if (logger.isDebugEnabled()) logger.debug("[{}] {} [{}] => {}", "<NOT AN ARRAY>", name(), join(", ", exps), res); } return res; }
@Override boolean eval(Object left, final Object right, final PredicateContext ctx) { PredicateContextImpl pci = (PredicateContextImpl) ctx; Predicate exp = (Predicate) left; return exp.apply( new PredicateContextImpl( right, ctx.root(), ctx.configuration(), pci.documentPathCache())); }
private Object evaluateIfPath(Object target, PredicateContext ctx) { Object res = target; if (res instanceof Path) { Path leftPath = (Path) target; if (ctx instanceof PredicateContextImpl) { // This will use cache for document ($) queries PredicateContextImpl ctxi = (PredicateContextImpl) ctx; res = ctxi.evaluate(leftPath); } else { Object doc = leftPath.isRootPath() ? ctx.root() : ctx.item(); res = leftPath.evaluate(doc, ctx.root(), ctx.configuration()).getValue(); } } return res; }
@Override boolean eval(Object left, Object right, PredicateContext ctx) { boolean res = false; if (right != null) { if (ctx.configuration().jsonProvider().isArray(right)) { int len = ctx.configuration().jsonProvider().length(right); res = (0 != len); if (logger.isDebugEnabled()) logger.debug("array length = {} {} => {}", len, name(), res); } else if (right instanceof String) { int len = ((String) right).length(); res = (0 != len); if (logger.isDebugEnabled()) logger.debug("string length = {} {} => {}", len, name(), res); } } return res; }
@SuppressWarnings("unchecked") @Override public boolean apply(PredicateContext ctx) { final Map<String, Object> items = ctx.item(Map.class); if (items != null) { for (Map.Entry<String, Object> entry : items.entrySet()) { final String value = entry.getValue().toString(); if (isVariable(value)) { final String variable = extractVariable(value); final Object newValue = lookupContext.read(variable); entry.setValue(newValue); } } return isRootElement(items); } return false; }