/** * This method is used to pass an algorithm decorator factory that is used for tracing (for * example). See {@link #checkedRules(Object, Object[], IRuntimeEnv)} for full documentation * * @param target target object * @param params parameters of a test * @param env environment * @param decoratorFactory a decorator factory that will decorate an objects that are used to * calculate a rule * @return iterator over <b>rule indexes</b> - integer iterator. * @see #checkedRules(Object, Object[], IRuntimeEnv) */ protected final IIntIterator checkedRules( Object target, Object[] params, IRuntimeEnv env, DefaultAlgorithmDecoratorFactory decoratorFactory) { // Select rules set using indexed mode // // ICondition[] conditions = table.getConditionRows(); IIntIterator iterator = null; int conditionNumber = info.fromCondition; if (indexRoot == null) { iterator = info.makeRuleIterator(); } else { ARuleIndex index = indexRoot; for (; conditionNumber <= info.toCondition; conditionNumber++) { index = decoratorFactory.create(index, table.getCondition(conditionNumber)); Object testValue = evaluateTestValue(table.getCondition(conditionNumber), target, params, env); DecisionTableRuleNode node = index.findNode(testValue); if (!node.hasIndex()) { iterator = node.getRulesIterator(); conditionNumber += 1; break; } index = node.getNextIndex(); } } for (; conditionNumber <= info.toCondition; conditionNumber++) { ICondition condition = table.getCondition(conditionNumber); IConditionEvaluator evaluator = evaluators[conditionNumber]; IIntSelector sel = evaluator.getSelector(condition, target, params, env); sel = decoratorFactory.create(sel, condition); iterator = iterator.select(sel); } return iterator; }
int[] collectRules() { if (nextIndex == null) throw new RuntimeException("Internal Error: nextIndex is null when rules is null"); return nextIndex.collectRules(); }