use of org.drools.model.Binding in project drools by kiegroup.
the class ViewFlowBuilder method viewItems2Condition.
private static CompositePatterns viewItems2Condition(BuildContext ctx, Condition.Type type, boolean topLevel) {
List<Condition> conditions = new ArrayList<>();
Map<Variable<?>, Condition> conditionMap = new HashMap<>();
Map<String, Consequence> consequences = topLevel ? new LinkedHashMap<>() : null;
Iterator<RuleItem> ruleItemIterator = ctx.ruleItems.iterator();
while (ruleItemIterator.hasNext()) {
Map<Variable<?>, InputViewItemImpl<?>> scopedInputs = type.createsScope() ? new LinkedHashMap<>(ctx.inputs) : ctx.inputs;
RuleItem ruleItem = ruleItemIterator.next();
if (ruleItem instanceof FixedValueItem) {
conditions.add(new EvalImpl(((FixedValueItem) ruleItem).isValue()));
continue;
}
if (ruleItem instanceof Consequence) {
if (!topLevel) {
throw new IllegalStateException("A consequence can be only a top level item");
}
Consequence consequence = (Consequence) ruleItem;
String name = ruleItemIterator.hasNext() ? generateName("consequence") : RuleImpl.DEFAULT_CONSEQUENCE_NAME;
consequences.put(name, consequence);
conditions.add(new NamedConsequenceImpl(name, consequence.isBreaking()));
continue;
}
if (ruleItem instanceof ConditionalConsequence) {
if (!topLevel) {
throw new IllegalStateException("A consequence can be only a top level item");
}
conditions.add(createConditionalNamedConsequence(consequences, (ConditionalConsequence) ruleItem));
continue;
}
ViewItem viewItem = (ViewItem) ruleItem;
if (viewItem instanceof CombinedExprViewItem) {
CombinedExprViewItem combined = (CombinedExprViewItem) viewItem;
conditions.add(viewItems2Condition(new BuildContext(ctx, combined.getExpressions(), scopedInputs), combined.getType(), false));
continue;
}
if (viewItem instanceof QueryCallViewItem) {
QueryCallViewItem query = ((QueryCallViewItem) viewItem);
for (Argument arg : query.getArguments()) {
if (arg instanceof Variable) {
ctx.usedVars.add(((Variable) arg));
}
}
conditions.add(new QueryCallPattern(query));
continue;
}
if (viewItem instanceof Binding) {
Binding bindViewItem = (Binding) viewItem;
PatternImpl pattern = (PatternImpl) conditionMap.get(bindViewItem.getInputVariable());
if (pattern == null) {
// This should probably be the bindViewItem.getBoundVariable() instead of the input
// as the input variables can be many
pattern = new PatternImpl(bindViewItem.getInputVariable());
pattern.addWatchedProps(bindViewItem.getWatchedProps());
ctx.usedVars.add(bindViewItem.getInputVariable());
conditions.add(pattern);
conditionMap.put(bindViewItem.getInputVariable(), pattern);
}
pattern.addBinding(bindViewItem);
ctx.usedVars.add(viewItem.getFirstVariable());
ctx.addBinding(bindViewItem);
scopedInputs.putIfAbsent(viewItem.getFirstVariable(), (InputViewItemImpl) input(viewItem.getFirstVariable()));
continue;
}
Variable<?> patterVariable = findPatterVariable(viewItem, scopedInputs.keySet());
if (viewItem instanceof InputViewItemImpl) {
scopedInputs.put(patterVariable, (InputViewItemImpl) viewItem);
PatternImpl condition = new PatternImpl(patterVariable);
condition.addWatchedProps(((InputViewItemImpl) viewItem).getWatchedProps());
conditions.add(condition);
conditionMap.put(patterVariable, condition);
ctx.usedVars.add(patterVariable);
continue;
}
if (viewItem instanceof ExistentialExprViewItem) {
ExistentialExprViewItem existential = ((ExistentialExprViewItem) viewItem);
if (patterVariable != null && !existential.isQueryExpression()) {
registerInputsFromViewItem(existential.getExpression(), conditionMap, scopedInputs, patterVariable);
}
Condition condition = new PatternImpl(patterVariable, SingleConstraint.TRUE, ctx.bindings.get(patterVariable));
conditions.add(new ExistentialPatternImpl(viewItem2Condition(existential.getExpression(), condition, new BuildContext(ctx, new LinkedHashMap<>())), existential.getType()));
continue;
}
if (ruleItem instanceof ExprViewItem && ctx.boundVars.contains(patterVariable)) {
conditions.add(new EvalImpl(createConstraint((ExprViewItem) ruleItem)));
continue;
}
ctx.usedVars.add(patterVariable);
Condition condition;
if (type == Type.AND) {
condition = conditionMap.get(patterVariable);
if (condition == null) {
condition = new PatternImpl(patterVariable, SingleConstraint.TRUE, ctx.bindings.get(patterVariable));
conditions.add(condition);
if (!(viewItem instanceof AccumulateExprViewItem)) {
conditionMap.put(patterVariable, condition);
}
scopedInputs.putIfAbsent(patterVariable, (InputViewItemImpl) input(patterVariable));
}
} else {
condition = new PatternImpl(patterVariable);
conditions.add(condition);
}
addInputFromVariableSource(scopedInputs, patterVariable);
registerInputsFromViewItem(viewItem, conditionMap, scopedInputs, null);
Condition modifiedPattern = viewItem2Condition(viewItem, condition, new BuildContext(ctx, scopedInputs));
conditions.set(conditions.indexOf(condition), modifiedPattern);
if (type == Type.AND && !(viewItem instanceof AccumulateExprViewItem)) {
conditionMap.put(patterVariable, modifiedPattern);
}
}
return new CompositePatterns(type, conditions, ctx.usedVars, consequences);
}
use of org.drools.model.Binding in project drools by kiegroup.
the class KiePackagesBuilder method buildPattern.
private Pattern buildPattern(RuleContext ctx, GroupElement group, Condition condition) {
org.drools.model.Pattern<?> modelPattern = (org.drools.model.Pattern) condition;
Pattern pattern = addPatternForVariable(ctx, group, modelPattern.getPatternVariable());
for (Binding binding : modelPattern.getBindings()) {
Declaration declaration = new Declaration(binding.getBoundVariable().getName(), new LambdaReadAccessor(binding.getBoundVariable().getType(), binding.getBindingFunction()), pattern, true);
pattern.addDeclaration(declaration);
if (binding.getReactOn() != null) {
addFieldsToPatternWatchlist(pattern, binding.getReactOn());
}
ctx.addInnerDeclaration(binding.getBoundVariable(), declaration);
}
Declaration queryArgDecl = ctx.getQueryDeclaration(modelPattern.getPatternVariable());
if (queryArgDecl != null) {
pattern.addConstraint(new UnificationConstraint(queryArgDecl));
}
addConstraintsToPattern(ctx, pattern, modelPattern, modelPattern.getConstraint());
addFieldsToPatternWatchlist(pattern, modelPattern.getWatchedProps());
return pattern;
}
use of org.drools.model.Binding in project drools by kiegroup.
the class AccumulatePatternImpl method findPatternImplSource.
private Pattern findPatternImplSource() {
if (condition instanceof Pattern) {
return (Pattern) condition;
}
final Variable source = getAccumulateFunctions()[0].getSource();
for (Condition subCondition : condition.getSubConditions()) {
if (subCondition instanceof PatternImpl) {
PatternImpl patternImpl = (PatternImpl) subCondition;
boolean isSource = patternImpl.getBindings().stream().anyMatch(b -> (b instanceof Binding) && ((Binding) b).getBoundVariable().equals(source));
if (isSource) {
return patternImpl;
}
}
}
return null;
}
Aggregations