package org.drools.chance.reteoo.builder;
import org.drools.base.ClassObjectType;
import org.drools.base.DroolsQuery;
import org.drools.chance.rule.constraint.OperatorConstraint;
import org.drools.chance.reteoo.nodes.ChanceAlphaNode;
import org.drools.reteoo.ObjectSource;
import org.drools.reteoo.ReteooComponentFactory;
import org.drools.reteoo.builder.BuildContext;
import org.drools.reteoo.builder.BuildUtils;
import org.drools.reteoo.builder.PatternBuilder;
import org.drools.rule.Pattern;
import org.drools.spi.AlphaNodeFieldConstraint;
import org.drools.spi.Constraint;
import java.util.List;
public class ChancePatternBuilder extends PatternBuilder {
protected void buildAlphaNodeChain( BuildContext context, BuildUtils utils, Pattern pattern, List<AlphaNodeFieldConstraint> alphaConstraints ) {
for ( final Constraint constraint : pattern.getConstraints() ) {
context.pushRuleComponent( constraint );
if ( constraint.getType().equals( Constraint.ConstraintType.ALPHA ) ) {
if ( constraint instanceof OperatorConstraint) {
OperatorConstraint opc = (OperatorConstraint) constraint;
context.setObjectSource( (ObjectSource) utils.attachNode( context,
((ChanceNodeFactory) context.getComponentFactory().getNodeFactoryService()).buildLogicalAlphaOperatorNode(
context.getNextId(),
opc.getLabel(),
opc.getConnective(),
opc.getArity(),
context.getObjectSource(),
context) ) );
} else {
ChanceAlphaNode alpha = (ChanceAlphaNode) context.getComponentFactory().getNodeFactoryService().buildAlphaNode(
context.getNextId(),
(AlphaNodeFieldConstraint) constraint,
context.getObjectSource(),
context);
if ( ((ClassObjectType) pattern.getObjectType()).getClassType().equals( DroolsQuery.class ) ) {
alpha.setAlwaysPropagate( false );
}
context.setObjectSource( (ObjectSource) utils.attachNode( context, alpha ) );
}
} else {
context.setObjectSource( (ObjectSource) utils.attachNode( context,
((ChanceNodeFactory) context.getComponentFactory().getNodeFactoryService()).buildDelayedEvaluationNode(
context.getNextId(),
constraint,
context.getObjectSource(),
context) ) );
}
context.popRuleComponent();
}
}
}