package MCC.IR;
+import MCC.State;
class AbstractRepair {
public final static int ADDTOSET=1;
case ExprPredicate.COMPARISON:
{
RelationExpr re=((RelationExpr)((OpExpr)ep.expr).left);
- return ep.expr.getSet();
+ return re.expr.getSet();
}
default:
throw new Error("");
case ExprPredicate.COMPARISON:
{
RelationExpr re=((RelationExpr)((OpExpr)ep.expr).left);
- return ep.expr.getSet();
+ return re.expr.getSet();
}
default:
throw new Error("");
return null;
}
-
-
-
public int getType() {
return type;
}
return descriptor;
}
+
+ /** This method tells whether the repair needs to remove objects *
+ * from the relation, or whether the model definition rules make
+ * the remove unnecessary.*/
+
+ public boolean needsRemoves(State state) {
+ assert type==MODIFYRELATION;
+ SetDescriptor sd=getPredicate().getPredicate().inverted()?getRangeSet():getDomainSet();
+ return !ConstraintDependence.rulesensurefunction(state,(RelationDescriptor)getDescriptor(), sd, getPredicate().getPredicate().inverted(), true);
+ }
+
+ /** This method tells whether the repair needs to force the
+ * relation to be function-like. */
+
+ public boolean mayNeedFunctionEnforcement(State state) {
+ assert type==MODIFYRELATION;
+ SetDescriptor sd=getPredicate().getPredicate().inverted()?getRangeSet():getDomainSet();
+ if (ConstraintDependence.rulesensurefunction(state,(RelationDescriptor)getDescriptor(), sd, getPredicate().getPredicate().inverted(), false))
+ return false;
+ if (ConstraintDependence.constraintsensurefunction(state,(RelationDescriptor)getDescriptor(), sd, getPredicate().getPredicate().inverted()))
+ return false;
+ return true;
+ }
+
public AbstractRepair(DNFPredicate dp,int typ, Descriptor d, Sources s) {
torepair=dp;
type=typ;