protected bool ConditionConflict(Rule other) { List<bool> conditionIsUnique = new List<bool>(); List<bool> conditionIsEqual = new List<bool>(); List<bool> conditionIsSubset = new List<bool>(); List<Condition> ancestorConditions = new List<Condition>(); Rule ancestor = this; while (ancestor != null) { foreach (Condition condition in ancestor.Conditions) if (!ancestorConditions.Any(c => c.IsEqualSetTo(condition))) ancestorConditions.Add(condition); ancestor = ancestor.Parent; } for (int i = 0; i < other.Conditions.Count; i++) { conditionIsUnique.Add(true); conditionIsEqual.Add(true); conditionIsSubset.Add(true); } for (int i = 0; i < other.Conditions.Count; i++) { conditionIsUnique[i] = !(ancestorConditions.Any(c => c.SimilarTo(other.Conditions[i]))); conditionIsEqual[i] = ancestorConditions.Any(c => c.IsEqualSetTo(other.Conditions[i])); conditionIsSubset[i] = ancestorConditions.Any(c => c.IsProperSubsetOf(other.Conditions[i])); } for (int i = 0; i < conditionIsUnique.Count; i++) if (!conditionIsUnique[i]) if (!(conditionIsEqual[i] || conditionIsSubset[i])) return true; if (conditionIsUnique.All(c => c == false)) if (conditionIsSubset.Any(c => c == false)) return true; return false; }
public void RemoveSubRule(Rule subRule) { subRules.Remove(subRule); }
public int CompareByPriority(Rule other) { return Priority.CompareTo(other.Priority); }
public int CompareByWeight(Rule other) { return Weight.CompareTo(other.Weight); }
public bool AddSubRule(Rule subRule) { if (SubRuleExists(s => s.Equals(subRule))) return false; if (ConditionConflict(subRule)) return false; subRules.Add(subRule); return true; }