use of org.drools.model.view.ViewItem 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.view.ViewItem in project drools by kiegroup.
the class PatternDSLTest method testTwoAccumulatesWithVarBindingModel.
@Test
public void testTwoAccumulatesWithVarBindingModel() {
Variable<Person> a = PatternDSL.declarationOf(Person.class);
Variable<Pair> accSource = PatternDSL.declarationOf(Pair.class);
Variable<Collection> accResult = PatternDSL.declarationOf(Collection.class);
Variable<Collection> accResult2 = PatternDSL.declarationOf(Collection.class);
Variable<Pair> wrapped = PatternDSL.declarationOf(Pair.class, PatternDSL.from(accResult));
Variable<Object> unwrapped1 = PatternDSL.declarationOf(Object.class);
PatternDSL.PatternDef aPattern = PatternDSL.pattern(a).bind(accSource, v -> Pair.create(v.getName(), v.getAge()));
ViewItem accumulate = PatternDSL.accumulate(aPattern, DSL.accFunction(CollectSetAccumulateFunction::new, accSource).as(accResult));
PatternDSL.PatternDef secondPattern = PatternDSL.pattern(accResult);
PatternDSL.PatternDef thirdPattern = // If binding removed, test will pass.
PatternDSL.pattern(wrapped).bind(unwrapped1, Pair::getKey);
ViewItem accumulate2 = PatternDSL.accumulate(PatternDSL.and(secondPattern, thirdPattern), DSL.accFunction(CollectSetAccumulateFunction::new, wrapped).as(accResult2));
Rule rule = PatternDSL.rule("R").build(accumulate, accumulate2, PatternDSL.on(accResult2).execute(obj -> {
boolean works = obj.contains(Pair.create("Lukas", 35));
if (!works) {
throw new IllegalStateException("Why is " + obj + " not Set<" + Pair.class + ">?");
}
}));
Model model = new ModelImpl().addRule(rule);
KieBase kieBase = KieBaseBuilder.createKieBaseFromModel(model);
KieSession session = kieBase.newKieSession();
session.insert(new Person("Lukas", 35));
session.fireAllRules();
}
use of org.drools.model.view.ViewItem in project drools by kiegroup.
the class GroupByTest method testWithGroupByAfterExists.
@Test
public void testWithGroupByAfterExists() {
Global<Map> groupResultVar = D.globalOf(Map.class, "defaultPkg", "glob");
Variable<Integer> patternVar = D.declarationOf(Integer.class);
Variable<String> existsVar = D.declarationOf(String.class);
Variable<Integer> keyVar = D.declarationOf(Integer.class);
Variable<Long> resultVar = D.declarationOf(Long.class);
D.PatternDef<Integer> pattern = D.pattern(patternVar);
D.PatternDef<String> exist = D.pattern(existsVar);
ViewItem patternAndExists = D.and(pattern, D.exists(exist));
ViewItem groupBy = D.groupBy(patternAndExists, patternVar, keyVar, Math::abs, DSL.accFunction(CountAccumulateFunction::new).as(resultVar));
ConsequenceBuilder._3 consequence = D.on(keyVar, resultVar, groupResultVar).execute((key, count, result) -> {
result.put(key, count.intValue());
});
Rule rule = D.rule("R").build(groupBy, consequence);
Model model = new ModelImpl().addRule(rule).addGlobal(groupResultVar);
KieBase kieBase = KieBaseBuilder.createKieBaseFromModel(model);
KieSession session = kieBase.newKieSession();
Map<Integer, Integer> global = new HashMap<>();
session.setGlobal("glob", global);
session.insert("Something");
session.insert(-1);
session.insert(1);
session.insert(2);
session.fireAllRules();
assertEquals(2, global.size());
// -1 and 1 will map to the same key, and count twice.
assertEquals(2, (int) global.get(1));
// 2 maps to a key, and counts once.
assertEquals(1, (int) global.get(2));
}
use of org.drools.model.view.ViewItem in project drools by kiegroup.
the class GroupByTest method testWithGroupByAfterExistsWithFrom.
@Test
public void testWithGroupByAfterExistsWithFrom() {
Global<Map> groupResultVar = D.globalOf(Map.class, "defaultPkg", "glob");
Variable<Integer> patternVar = D.declarationOf(Integer.class);
Variable<String> existsVar = D.declarationOf(String.class);
Variable<Integer> keyVar = D.declarationOf(Integer.class);
Variable<Long> resultVar = D.declarationOf(Long.class);
Variable<Integer> mappedResultVar = D.declarationOf(Integer.class);
D.PatternDef<Integer> pattern = D.pattern(patternVar);
D.PatternDef<String> exist = D.pattern(existsVar);
ViewItem patternAndExists = D.and(pattern, D.exists(exist));
ViewItem groupBy = D.groupBy(patternAndExists, patternVar, keyVar, Math::abs, DSL.accFunction(CountAccumulateFunction::new).as(resultVar));
PatternDSL.PatternDef mappedResult = D.pattern(resultVar).bind(mappedResultVar, Long::intValue);
ConsequenceBuilder._3 consequence = D.on(keyVar, mappedResultVar, groupResultVar).execute((key, count, result) -> {
result.put(key, count);
});
Rule rule = D.rule("R").build(groupBy, mappedResult, consequence);
Model model = new ModelImpl().addRule(rule).addGlobal(groupResultVar);
KieBase kieBase = KieBaseBuilder.createKieBaseFromModel(model);
KieSession session = kieBase.newKieSession();
Map<Integer, Integer> global = new HashMap<>();
session.setGlobal("glob", global);
session.insert("Something");
session.insert(-1);
session.insert(1);
session.insert(2);
session.fireAllRules();
assertEquals(2, global.size());
// -1 and 1 will map to the same key, and count twice.
assertEquals(2, (int) global.get(1));
// 2 maps to a key, and counts once.
assertEquals(1, (int) global.get(2));
}
use of org.drools.model.view.ViewItem in project drools by kiegroup.
the class ViewPatternBuilder method ruleItem2Condition.
public static Condition ruleItem2Condition(RuleItem ruleItem) {
if (ruleItem instanceof PatternDefImpl) {
PatternDefImpl<?> patternDef = (PatternDefImpl) ruleItem;
Variable<?> patternVariable = patternDef.getFirstVariable();
PatternImpl pattern = new PatternImpl(patternVariable, patternVariable instanceof Exchange ? Condition.Type.RECEIVER : Condition.Type.PATTERN);
for (PatternItem patternItem : patternDef.getItems()) {
if (patternItem instanceof PatternExprImpl) {
pattern.addConstraint(((PatternExprImpl) patternItem).asConstraint(patternDef));
} else if (patternItem instanceof PatternBindingImpl) {
pattern.addBinding(((PatternBindingImpl) patternItem).asBinding(patternDef));
} else {
throw new UnsupportedOperationException("Unknown pattern item type: " + patternItem);
}
}
pattern.addWatchedProps(patternDef.getWatch());
pattern.setPassive(patternDef.isPassive());
return pattern;
}
if (ruleItem instanceof FixedValueItem) {
return new EvalImpl(((FixedValueItem) ruleItem).isValue());
}
if (ruleItem instanceof QueryCallViewItem) {
return new QueryCallPattern((QueryCallViewItem) ruleItem);
}
if (ruleItem instanceof CombinedExprViewItem) {
CombinedExprViewItem combined = (CombinedExprViewItem) ruleItem;
List<Condition> conditions = new ArrayList<>();
for (ViewItem expr : combined.getExpressions()) {
conditions.add(ruleItem2Condition(expr));
}
return new CompositePatterns(combined.getType(), conditions);
}
if (ruleItem instanceof ExistentialExprViewItem) {
ExistentialExprViewItem existential = (ExistentialExprViewItem) ruleItem;
return new ExistentialPatternImpl(ruleItem2Condition(existential.getExpression()), existential.getType());
}
if (ruleItem instanceof GroupByExprViewItem) {
GroupByExprViewItem groupBy = (GroupByExprViewItem) ruleItem;
return new GroupByPatternImpl(ruleItem2Condition(groupBy.getExpr()), groupBy.getVars(), groupBy.getVarKey(), groupBy.getGroupingFunction(), groupBy.getAccumulateFunctions());
}
if (ruleItem instanceof AccumulateExprViewItem) {
AccumulateExprViewItem acc = (AccumulateExprViewItem) ruleItem;
return new AccumulatePatternImpl(ruleItem2Condition(acc.getExpr()), null, acc.getAccumulateFunctions());
}
if (ruleItem instanceof ExprViewItem) {
return new EvalImpl(createConstraint((ExprViewItem) ruleItem));
}
if (ruleItem instanceof ExchangeDefImpl) {
ExchangeDefImpl<?> exchangeDef = (ExchangeDefImpl) ruleItem;
return new PatternImpl(exchangeDef.getFirstVariable(), Condition.Type.SENDER);
}
throw new UnsupportedOperationException("Unknown " + ruleItem);
}
Aggregations