package MCC.IR;
+import MCC.State;
class AbstractRepair {
public final static int ADDTOSET=1;
return "Unknown";
}
}
-
+
+ public boolean isNewObject(boolean isdomain) {
+ if (getType()==ADDTOSET) {
+ return sources.allocSource((SetDescriptor)descriptor);
+ } else if (getType()==ADDTORELATION) {
+ RelationDescriptor rd=(RelationDescriptor)descriptor;
+ return sources.relallocSource(rd,isdomain);
+ } else throw new Error(type());
+ }
+
public SetDescriptor getDomainSet() {
if (torepair==null)
return null;
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;