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; }
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, 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())); }