Пример #1
0
        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;
        }
Пример #2
0
 public void RemoveSubRule(Rule subRule)
 {
     subRules.Remove(subRule);
 }
Пример #3
0
 public int CompareByPriority(Rule other)
 {
     return Priority.CompareTo(other.Priority);
 }
Пример #4
0
 public int CompareByWeight(Rule other)
 {
     return Weight.CompareTo(other.Weight);
 }
Пример #5
0
        public bool AddSubRule(Rule subRule)
        {
            if (SubRuleExists(s => s.Equals(subRule))) return false;

            if (ConditionConflict(subRule)) return false;

            subRules.Add(subRule);

            return true;
        }