private QEIteration[] initializeContexts(EvaluationContext ctx, List<IterationContextCompiled> iterationContexts) { QEIteration[] ictx = new QEIteration[iterationContexts.size()]; int i = 0; for (IterationContextCompiled icn : iterationContexts) { ictx[i] = createQuantifiedExpressionIterationContext(ctx, icn); if (i < ictx.length - 1) { // initalize all contexts except the very last one, as it will be initialized in the nextIteration() method QuantifiedExpressionNode.setValueIntoContext(ctx, ictx[i]); } i++; } return ictx; }
private Boolean iterateContexts(EvaluationContext ctx, List<IterationContextCompiled> iterationContexts, Function<EvaluationContext, Object> expression, Quantifier quantifier) { try { ctx.enterFrame(); QEIteration[] ictx = initializeContexts(ctx, iterationContexts); while (QuantifiedExpressionNode.nextIteration(ctx, ictx)) { Boolean result = (Boolean) expression.apply(ctx); if (result != null && result.equals(quantifier.positiveTest())) { return quantifier.positiveTest(); } } return quantifier.defaultValue(); } finally { ctx.exitFrame(); } }
public static QuantBuilder quant(Quantifier quantOp, EvaluationContext ctx) { return new QuantBuilder(quantOp, ctx); }
public Object satisfies(Function<EvaluationContext, Object> expression) { if (quantOp == Quantifier.SOME || quantOp == Quantifier.EVERY) { return iterateContexts(ctx, iterationContexts, expression, quantOp); } // can never happen, but anyway: ctx.notifyEvt(() -> new ASTEventBase(Severity.ERROR, Msg.createMessage(Msg.IS_NULL, "Quantifier"), null)); return null; }
/** FEEL: some price in [ 80, 11, 110 ] satisfies price > 100 */ @Override public Object apply(EvaluationContext feelExprCtx) { return CompiledFEELSupport.quant(Quantifier.SOME, feelExprCtx) .with(c -> "price", c -> Arrays.asList(K_80, K_11, K_110)) .satisfies(c -> gt(feelExprCtx.getValue("price"), K_100)); }