...
[repair.git] / Repair / RepairCompiler / MCC / IR / AbstractRepair.java
index d8888490324097dc8f1ee304b01af91fd2cee2a4..1d32666322f3c4bf40cbb47e3bfc52f7de922a20 100755 (executable)
@@ -1,4 +1,5 @@
 package MCC.IR;
+import MCC.State;
 
 class AbstractRepair {
     public final static int ADDTOSET=1;
@@ -78,7 +79,7 @@ class AbstractRepair {
                case ExprPredicate.COMPARISON:
                    {
                        RelationExpr re=((RelationExpr)((OpExpr)ep.expr).left);
-                       return ep.expr.getSet();
+                       return re.expr.getSet();
                    }
                default:
                    throw new Error("");
@@ -128,7 +129,7 @@ class AbstractRepair {
                case ExprPredicate.COMPARISON:
                    {
                        RelationExpr re=((RelationExpr)((OpExpr)ep.expr).left);
-                       return ep.expr.getSet();
+                       return re.expr.getSet();
                    }
                default:
                    throw new Error("");
@@ -138,9 +139,6 @@ class AbstractRepair {
        return null;
     }
 
-
-    
-
     public int getType() {
        return type;
     }
@@ -153,6 +151,30 @@ class AbstractRepair {
        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;