package org.drools.chance.rule.builder;
import org.drools.chance.rule.constraint.core.evaluators.ImperfectEvaluatorWrapper;
import org.drools.lang.MVELDumper;
import org.drools.lang.descr.*;
public class ChanceMVELDumper extends MVELDumper {
protected boolean lookupBasicOperator( String op ) {
return super.lookupBasicOperator( op ) || ChanceOperators.lookup(op);
}
// // @Override
// protected void processConnectiveDescr( StringBuilder sbuilder,
// BaseDescr base,
// int parentPriority,
// boolean isInsideRelCons,
// MVELDumperContext context ) {
// System.err.println( "Called CMVELDMPR processCCD, should not ");
// ConstraintConnectiveDescr ccd = (ConstraintConnectiveDescr) base;
//
// boolean isImperfect = false;
// for ( BaseDescr child : ccd.getDescrs() ) {
// if ( child instanceof RelationalExprDescr ) {
// if ( ChanceOperators.isImperfect( ((RelationalExprDescr) child).getOperator() ) ) {
// isImperfect = true;
// break;
// }
// }
// }
//
// if ( ! isImperfect ) {
// super.processConnectiveDescr( sbuilder, base, parentPriority, isInsideRelCons, context );
// return;
// }
//
// boolean first = true;
// boolean wrapParenthesis = parentPriority > ccd.getConnective().getPrecedence();
// if ( wrapParenthesis ) {
// sbuilder.append( "( " );
// }
//
// ImpType type = null;
// ImpKind kind = null;
// DegreeType degree = null;
// MvlFamilies family = null;
// if ( ccd.getAnnotation( "Imperfect" ) != null ) {
// AnnotationDescr ann = ccd.getAnnotation( "Imperfect" );
// type = ImpType.parse( ann.getValue( ImpType.name ) );
// kind = ImpKind.parse( ann.getValue( ImpKind.name ) );
// degree = DegreeType.parse( ann.getValue( DegreeType.name ) );
// family = MvlFamilies.parse( ann.getValue( MvlFamilies.name ) );
// }
//
// ConnectiveFactory factory = ChanceStrategyFactory.getConnectiveFactory( kind, type );
//
// ConnectiveCore conn = null;
// switch ( ccd.getConnective() ) {
// case INC_AND:
// case AND: conn = family != null ? factory.getAnd( family.value() ) : factory.getAnd();
// break;
// case INC_OR:
// case OR: conn = family != null ? factory.getOr( family.value() ) : factory.getOr();
// break;
// case XOR: conn = family != null ? factory.getXor( family.value() ) : factory.getXor();
// break;
// default: throw new IllegalStateException( "Unable to find connective for " + ccd.getConnective() );
// }
//
// sbuilder.append( "new " + conn.getClass().getName() + "().eval( " );
// for ( BaseDescr constr : ccd.getDescrs() ) {
//
// if ( !( constr instanceof BindingDescr) ) {
//
// if ( first ) {
// first = false;
// } else {
// sbuilder.append( ", " );
// }
//
// dump( sbuilder,
// constr,
// ccd.getConnective().getPrecedence(),
// isInsideRelCons,
// context );
// }
//
// }
//
// if( first == true ) {
// // means all children were actually only bindings, replace by just true
// sbuilder.append( ChanceDegreeTypeRegistry.defaultDegreeClass.getName() + ".TRUE" );
// }
//
// sbuilder.append( ")" );
//
// if ( wrapParenthesis ) {
// sbuilder.append( " )" );
// }
//
// }
public Class<?> getEvaluatorWrapperClass() {
return ImperfectEvaluatorWrapper.class;
}
// protected void rewriteBasicOperator( MVELDumperContext context,
// StringBuilder sbuilder,
// String left,
// OperatorDescr operator,
// String right) {
//
// rewriteOperator( context, sbuilder, left, operator, right );
// }
@Override
protected void rewriteOperator(MVELDumperContext context, StringBuilder sbuilder, String left, OperatorDescr operator, String right) {
boolean isImperfect = ChanceOperators.isImperfect( operator.getOperator() );
String alias = context.createAlias( operator );
if ( isImperfect ) {
// MVEL won't consume ope
alias = ChanceOperators.makePerfect( alias );
// this is basic operator, needs a better name
if ( ChanceOperators.lookup( operator.getOperator() ) ) {
alias = ChanceOperators.renameBasic( alias );
}
operator.setAlias( alias );
context.getAliases().put( alias, operator );
}
operator.setLeftString( left );
operator.setRightString( right );
sbuilder.append( evaluatorPrefix( operator.isNegated(), isImperfect ) )
.append( alias )
.append( isImperfect ? ".match( " : ".evaluate( " )
.append( left )
.append( ", " )
.append( right )
.append( " )" )
.append( evaluatorSufix( operator.isNegated() ) );
}
protected String evaluatorPrefix( final boolean isNegated, final boolean isImperfect ) {
if ( ! isImperfect ) {
return super.evaluatorPrefix( isNegated );
} else {
if ( isNegated ) {
// throw new UnsupportedOperationException("TODO : Negation with imperfaect evals");
// return "!( ";
return super.evaluatorPrefix( isNegated );
}
return "";
}
}
protected String evaluatorSufix( final boolean isNegated, final boolean isImperfect ) {
if ( ! isImperfect ) {
return super.evaluatorSufix( isNegated );
} else {
if ( isNegated ) {
// throw new UnsupportedOperationException("TODO : Negation with imperfaect evals");
// return " )";
return super.evaluatorSufix( isNegated );
}
return "";
}
}
}