package org.drools.chance.rule.constraint.core.evaluators;
import org.drools.base.ValueType;
import org.drools.base.evaluators.Operator;
import org.drools.chance.factmodel.ImperfectTraitProxy;
import org.drools.chance.rule.builder.ChanceOperators;
import org.drools.chance.degree.ChanceDegreeTypeRegistry;
import org.drools.chance.degree.Degree;
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.factmodel.traits.Thing;
import org.drools.factmodel.traits.TraitableBean;
import org.drools.rule.VariableRestriction;
import org.drools.spi.Evaluator;
import org.drools.spi.FieldValue;
import org.drools.spi.InternalReadAccessor;
public class IsAEvaluatorDefinition extends org.drools.base.evaluators.IsAEvaluatorDefinition {
public static final Operator ISA_IMP = Operator.addOperatorToRegistry(
ChanceOperators.makeImperfect( "isA" ), false);
public static final Operator NOT_ISA_IMP = Operator.addOperatorToRegistry(
ChanceOperators.makeImperfect( "isA" ), true);
private static final String[] CHANCE_IDS = new String[] { ISA.getOperatorString(), ISA_IMP.getOperatorString() };
/**
* @inheridDoc
*/
public String[] getEvaluatorIds() {
return CHANCE_IDS;
}
/**
* @inheridDoc
*/
public Evaluator getEvaluator(ValueType type, Operator operator) {
return this.getEvaluator(type, operator.getOperatorString(), operator
.isNegated(), null);
}
/**
* @inheridDoc
*/
public Evaluator getEvaluator(ValueType type, Operator operator,
String parameterText) {
return this.getEvaluator(type, operator.getOperatorString(), operator
.isNegated(), parameterText);
}
/**
* @inheridDoc
*/
public Evaluator getEvaluator(ValueType type, String operatorId,
boolean isNegated, String parameterText) {
return getEvaluator(type, operatorId, isNegated, parameterText,
Target.FACT, Target.FACT);
}
/**
* @inheridDoc
*/
public Evaluator getEvaluator(ValueType type, String operatorId,
boolean isNegated, String parameterText, Target leftTarget,
Target rightTarget) {
if ( ChanceOperators.isImperfect(operatorId) ) {
if ( isNegated ) { throw new UnsupportedOperationException( "Negated isA : Not implemented yet" ); }
IsAEvaluator evaluator = new ImperfectIsAEvaluator( type, isNegated );
evaluator.setParameterText( parameterText );
return evaluator;
} else {
IsAEvaluator evaluator = new IsAEvaluator(type, isNegated);
evaluator.setParameterText( parameterText );
return evaluator;
}
}
public static class ImperfectIsAEvaluator extends IsAEvaluator implements ImperfectEvaluator {
public ImperfectIsAEvaluator( ValueType type, boolean negated ) {
super( type, negated );
}
public Degree match( InternalWorkingMemory workingMemory, Object object, String typeName ) {
TraitableBean core = null;
if ( object instanceof Thing ) {
Thing thing = (Thing) object;
core = (TraitableBean) thing.getCore();
if ( core.hasTrait( typeName ) ) {
Thing proxy = core.getTrait( typeName.toString() );
return extractDegree( proxy );
} else {
return ChanceDegreeTypeRegistry.getSingleInstance().getDefaultOne().False();
}
} else if ( object instanceof TraitableBean ) {
core = (TraitableBean) object;
if ( core.hasTrait( typeName ) ) {
Thing proxy = core.getTrait( typeName.toString() );
return extractDegree( proxy );
} else {
return ChanceDegreeTypeRegistry.getSingleInstance().getDefaultOne().False();
}
} else {
core = lookForWrapper( object, workingMemory );
if ( core == null || ! core.hasTrait( typeName ) ) {
return ChanceDegreeTypeRegistry.getDefaultOne().False();
} else {
Thing proxy = core.getTrait( typeName.toString() );
return extractDegree(proxy);
}
}
}
public Degree match( InternalWorkingMemory workingMemory, InternalReadAccessor extractor, InternalFactHandle handle, FieldValue value ) {
Object typeName = value.getValue();
if ( typeName instanceof Class ) {
typeName = ((Class) typeName).getName();
}
return match( workingMemory, handle.getObject(), (String) typeName );
}
private Degree extractDegree( Thing proxy ) {
if ( proxy == null ) {
return ChanceDegreeTypeRegistry.getSingleInstance().getDefaultOne().False();
} else {
if ( proxy instanceof ImperfectTraitProxy ) {
return ( (ImperfectTraitProxy) proxy ).isA();
} else {
return ChanceDegreeTypeRegistry.getSingleInstance().getDefaultOne().True();
}
}
}
public Degree match( InternalWorkingMemory workingMemory, InternalReadAccessor leftExtractor, InternalFactHandle left, InternalReadAccessor rightExtractor, InternalFactHandle right ) {
throw new UnsupportedOperationException( "Not implemented yet" );
}
public Degree matchCachedLeft( InternalWorkingMemory workingMemory, VariableRestriction.VariableContextEntry context, InternalFactHandle right ) {
throw new UnsupportedOperationException( "Not implemented yet" );
}
public Degree matchCachedRight( InternalWorkingMemory workingMemory, VariableRestriction.VariableContextEntry context, InternalFactHandle left ) {
throw new UnsupportedOperationException( "Not implemented yet" );
}
}
}