package org.drools.chance.reteoo.builder;
import org.drools.chance.common.ChanceStrategyFactory;
import org.drools.chance.rule.constraint.core.connectives.ConnectiveCore;
import org.drools.chance.rule.constraint.core.connectives.ConnectiveFactory;
import org.drools.chance.rule.constraint.core.connectives.impl.MvlFamilies;
import org.drools.chance.degree.ChanceDegreeTypeRegistry;
import org.drools.chance.degree.Degree;
import org.drools.chance.degree.DegreeType;
import org.drools.chance.distribution.ImpKind;
import org.drools.chance.distribution.ImpType;
import org.drools.factmodel.AnnotationDefinition;
import org.drools.reteoo.LeftTupleSource;
import org.drools.reteoo.ReteooComponentFactory;
import org.drools.reteoo.builder.BuildContext;
import org.drools.reteoo.builder.BuildUtils;
import org.drools.reteoo.builder.GroupElementBuilder;
import org.drools.rule.GroupElement;
import org.drools.rule.RuleConditionElement;
import java.util.Map;
public class ChanceGroupElementBuilder extends GroupElementBuilder {
public ChanceGroupElementBuilder() {
this.geBuilders.put( GroupElement.AND,
new ImperfectAndBuilder() );
this.geBuilders.put( GroupElement.OR,
new ImperfectOrBuilder() );
this.geBuilders.put( GroupElement.NOT,
new NotBuilder() );
this.geBuilders.put( GroupElement.EXISTS,
new ExistsBuilder() );
}
private class ImperfectAndBuilder extends AndBuilder {
public void build( final BuildContext context,
final BuildUtils utils,
final RuleConditionElement rce) {
super.build( context, utils, rce );
ChanceGroupElement cge = (ChanceGroupElement) rce;
String family = null;
ImpKind impKind = null;
ImpType impType = null;
DegreeType degT = null;
String label = null;
if ( cge.getMetadata() != null ) {
Map<String,AnnotationDefinition.AnnotationPropertyVal> params = cge.getMetadata().getValues();
family = params.containsKey( MvlFamilies.name ) ? MvlFamilies.parse( (String) cge.getMetadata().getValues().get( MvlFamilies.name ).getValue() ).value() : null;
impKind = params.containsKey( ImpKind.name ) ? ImpKind.parse( (String) cge.getMetadata().getValues().get( ImpKind.name ).getValue() ) : null;
impType = params.containsKey( ImpType.name ) ? ImpType.parse( (String) cge.getMetadata().getValues().get( ImpType.name ).getValue() ) : null;
degT = params.containsKey( DegreeType.name ) ? DegreeType.parse( (String) cge.getMetadata().getValues().get( DegreeType.name ).getValue() ) : null;
label = params.containsKey( "label" ) ? (String) cge.getMetadata().getValues().get( "label" ).getValue() : null;
}
ConnectiveFactory factory = ChanceStrategyFactory.getConnectiveFactory( impKind, impType );
ConnectiveCore and = family != null ? factory.getAnd( family ) : factory.getAnd();
Degree baseDegree = ChanceDegreeTypeRegistry.getSingleInstance().buildDegree( degT, 0 );
context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
( (ChanceNodeFactory ) context.getComponentFactory().getNodeFactoryService() ).
buildLogicalBetaOperatorNode(
context.getNextId(),
label,
and,
((GroupElement) rce).getChildren().size(),
context.getTupleSource(),
context ) ) );
}
}
// Beware : we extend ANDBuilder, the only difference here is the final operator
private class ImperfectOrBuilder extends AndBuilder {
public void build( final BuildContext context,
final BuildUtils utils,
final RuleConditionElement rce) {
super.build( context, utils, rce );
ChanceGroupElement cge = (ChanceGroupElement) rce;
String family = null;
ImpKind impKind = null;
ImpType impType = null;
DegreeType degT = null;
String label = null;
if ( cge.getMetadata() != null ) {
Map<String,AnnotationDefinition.AnnotationPropertyVal> params = cge.getMetadata().getValues();
family = params.containsKey( MvlFamilies.name ) ? MvlFamilies.parse( (String) cge.getMetadata().getValues().get( MvlFamilies.name ).getValue() ).value() : null;
impKind = params.containsKey( ImpKind.name ) ? ImpKind.parse( (String) cge.getMetadata().getValues().get( ImpKind.name ).getValue() ) : null;
impType = params.containsKey( ImpType.name ) ? ImpType.parse( (String) cge.getMetadata().getValues().get( ImpType.name ).getValue() ) : null;
degT = params.containsKey( DegreeType.name ) ? DegreeType.parse( (String) cge.getMetadata().getValues().get( DegreeType.name ).getValue() ) : null;
label = params.containsKey( "label" ) ? (String) cge.getMetadata().getValues().get( "label" ).getValue() : null;
}
ConnectiveFactory factory = ChanceStrategyFactory.getConnectiveFactory( impKind, impType );
ConnectiveCore or = family != null ? factory.getOr( family ) : factory.getOr();
Degree baseDegree = ChanceDegreeTypeRegistry.getSingleInstance().buildDegree( degT, 0 );
context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
( (ChanceNodeFactory ) context.getComponentFactory().getNodeFactoryService() ).
buildLogicalBetaOperatorNode(
context.getNextId(),
label,
or,
((GroupElement) rce).getChildren().size(),
context.getTupleSource(),
context ) ) );
}
}
}