use of org.drools.model.Constraint in project drools by kiegroup.
the class KiePackagesBuilder method addQueryPattern.
private void addQueryPattern(Query query, QueryImpl queryImpl, RuleContext ctx) {
Pattern pattern = new Pattern(ctx.getNextPatternIndex(), // offset is 0 by default
0, ClassObjectType.DroolsQuery_ObjectType, null);
InternalReadAccessor extractor = new LambdaReadAccessor(DroolsQuery.class, q -> ((DroolsQuery) q).getName());
QueryNameConstraint constraint = new QueryNameConstraint(extractor, query.getName());
pattern.addConstraint(constraint);
queryImpl.getLhs().addChild(pattern);
Variable<?>[] args = query.getArguments();
Declaration[] declarations = new Declaration[args.length];
for (int i = 0; i < args.length; i++) {
int index = i;
LambdaReadAccessor accessor = new LambdaReadAccessor(index, args[index].getType(), obj -> ((DroolsQuery) obj).getElements()[index]);
declarations[i] = new Declaration(args[i].getName(), accessor, pattern, true);
pattern.addDeclaration(declarations[i]);
ctx.addQueryDeclaration(args[i], declarations[i]);
}
queryImpl.setParameters(declarations);
}
use of org.drools.model.Constraint in project drools by kiegroup.
the class KiePackagesBuilder method addConstraintsToPattern.
private void addConstraintsToPattern(RuleContext ctx, Pattern pattern, org.drools.model.Pattern modelPattern, Constraint constraint) {
if (constraint.getType() == Constraint.Type.SINGLE) {
SingleConstraint singleConstraint = (SingleConstraint) constraint;
boolean isEqual = singleConstraint.getIndex() != null && singleConstraint.getIndex().getConstraintType() == Index.ConstraintType.EQUAL;
if (singleConstraint.getVariables().length > 0) {
Variable[] vars = singleConstraint.getVariables();
Declaration[] declarations = new Declaration[vars.length];
Declaration unificationDeclaration = null;
for (int i = 0; i < vars.length; i++) {
declarations[i] = ctx.getDeclaration(vars[i]);
if (isEqual && declarations[i].getPattern().getObjectType().equals(ClassObjectType.DroolsQuery_ObjectType)) {
unificationDeclaration = declarations[i];
} else if (pattern.getSource() instanceof MultiAccumulate) {
Declaration accDeclaration = pattern.getDeclarations().get(declarations[i].getBindingName());
if (accDeclaration != null) {
declarations[i].setReadAccessor(accDeclaration.getExtractor());
}
}
}
ConstraintEvaluator constraintEvaluator = singleConstraint.isTemporal() ? new TemporalConstraintEvaluator(declarations, pattern, singleConstraint) : new ConstraintEvaluator(declarations, pattern, singleConstraint);
org.drools.core.spi.Constraint droolsConstraint = unificationDeclaration != null ? new UnificationConstraint(unificationDeclaration, constraintEvaluator) : new LambdaConstraint(constraintEvaluator);
pattern.addConstraint(droolsConstraint);
}
} else if (modelPattern.getConstraint().getType() == Constraint.Type.AND) {
for (Constraint child : constraint.getChildren()) {
addConstraintsToPattern(ctx, pattern, modelPattern, child);
}
}
}
Aggregations