Example #1
0
        GroupElement IBuilder <GroupElement> .Build()
        {
            Validate();
            var childElements = new List <RuleLeftElement>();

            foreach (var nestedBuilder in _nestedBuilders)
            {
                RuleLeftElement childElement = nestedBuilder.Build();
                childElements.Add(childElement);
            }
            GroupElement groupElement;

            switch (_groupType)
            {
            case GroupType.And:
                groupElement = new AndElement(childElements);
                break;

            case GroupType.Or:
                groupElement = new OrElement(childElements);
                break;

            case GroupType.Not:
                groupElement = new NotElement(childElements);
                break;

            case GroupType.Exists:
                groupElement = new ExistsElement(childElements);
                break;

            default:
                throw new InvalidOperationException(string.Format("Unrecognized group type. GroupType={0}", _groupType));
            }
            return(groupElement);
        }
Example #2
0
        GroupElement IBuilder <GroupElement> .Build()
        {
            Validate();
            var childElements = new List <RuleLeftElement>();

            foreach (var nestedBuilder in _nestedBuilders)
            {
                var             builder      = (IBuilder <RuleLeftElement>)nestedBuilder;
                RuleLeftElement childElement = builder.Build();
                childElements.Add(childElement);
            }
            GroupElement groupElement;

            switch (_groupType)
            {
            case GroupType.And:
                groupElement = new AndElement(Scope.VisibleDeclarations, childElements);
                break;

            case GroupType.Or:
                groupElement = new OrElement(Scope.VisibleDeclarations, childElements);
                break;

            default:
                throw new InvalidOperationException($"Unrecognized group type. GroupType={_groupType}");
            }
            return(groupElement);
        }
Example #3
0
 protected override void VisitAnd(ReteBuilderContext context, AndElement element)
 {
     foreach (var childElement in element.ChildElements)
     {
         if (context.AlphaSource != null)
         {
             BuildJoinNode(context, childElement);
         }
         Visit(context, childElement);
     }
 }
Example #4
0
        /// <summary>
        /// Creates a left-hand side group element that combines contained elements using an AND operator.
        /// </summary>
        /// <param name="childElements">Child elements contained in the group.</param>
        /// <returns>Created element.</returns>
        /// <see cref="RuleElement"/>
        public static AndElement AndGroup(IEnumerable <RuleElement> childElements)
        {
            if (childElements == null)
            {
                throw new ArgumentNullException(nameof(childElements), "Child elements not provided");
            }

            var element = new AndElement(childElements);

            ElementValidator.ValidateGroup(element);
            ElementValidator.ValidateUniqueDeclarations(element.ChildElements);
            return(element);
        }
Example #5
0
 protected override void VisitAnd(ReteBuilderContext context, AndElement element)
 {
     context.BetaSource = BuildDummyNode();
     foreach (var childElement in element.ChildElements)
     {
         Visit(context, childElement);
         if (context.AlphaSource != null)
         {
             var betaNode = BuildJoinNode(context);
             context.BetaSource = BuildBetaMemoryNode(context, betaNode);
         }
     }
 }
Example #6
0
        /// <summary>
        /// Creates a left-hand side group element that combines contained elements using an AND operator.
        /// </summary>
        /// <param name="childElements">Child elements contained in the group.</param>
        /// <returns>Created element.</returns>
        /// <see cref="RuleLeftElement"/>
        public static AndElement AndGroup(IEnumerable <RuleLeftElement> childElements)
        {
            if (childElements == null)
            {
                throw new ArgumentNullException(nameof(childElements), "Child elements not provided");
            }

            var element = new AndElement(childElements);

            if (!element.ChildElements.Any())
            {
                throw new InvalidOperationException("Group element AND requires at least one child element");
            }
            ElementValidator.ValidateUniqueDeclarations(element.ChildElements);
            return(element);
        }
Example #7
0
        private bool SplitOrGroup(Context context, AndElement element, IList <RuleLeftElement> childElements)
        {
            if (!childElements.OfType <OrElement>().Any())
            {
                return(false);
            }

            var groups = new List <IList <RuleLeftElement> >();

            groups.Add(new List <RuleLeftElement>());
            ExpandOrElements(groups, childElements, 0);

            var andElements = groups.Select(x => new AndElement(element.Declarations, x)).ToList();
            var orElement   = new OrElement(element.Declarations, andElements);

            Result(context, orElement);
            return(true);
        }
Example #8
0
        protected internal override void VisitAnd(Context context, AndElement element)
        {
            var childElements = element.ChildElements.Select(x => Transform <RuleLeftElement>(context, x)).ToList();

            if (CollapseSingleGroup(context, childElements))
            {
                return;
            }
            if (SplitOrGroup(context, element, childElements))
            {
                return;
            }
            if (context.IsModified)
            {
                var newElement = new AndElement(element.Declarations, childElements);
                Result(context, newElement);
            }
        }
Example #9
0
        private bool SplitOrGroup(Context context, AndElement element, IList <RuleElement> childElements)
        {
            if (!childElements.OfType <OrElement>().Any())
            {
                return(false);
            }

            var groups = new List <IList <RuleElement> >();

            groups.Add(new List <RuleElement>());
            ExpandOrElements(groups, childElements, 0);

            var andElements = groups.Select(Element.AndGroup).ToList();
            var orElement   = Element.OrGroup(andElements);

            Result(context, orElement);
            return(true);
        }
Example #10
0
        private static void setUserControl(SerializableUserControl control, Form1 form1)
        {
            switch (control.type)
            {
            case "LogicScheme.SignalBoxes.SignalBoxTrue":
                ((MyUserControl)form1.userControls[0]).Output.Checked = control.Output;
                break;

            case "LogicScheme.SignalBoxes.SignalBoxFalse":
                ((MyUserControl)form1.userControls[1]).Output.Checked = control.Output;
                break;

            case "LogicScheme.AndElement":
                var and = new AndElement();
                recoverFields(form1, and, control);
                break;

            case "LogicScheme.NandElement":
                var nand = new NandElement();
                recoverFields(form1, nand, control);
                break;

            case "LogicScheme.OrElement":
                var or = new OrElement();
                recoverFields(form1, or, control);
                break;

            case "LogicScheme.NorElement":
                var nor = new NorElement();
                recoverFields(form1, nor, control);
                break;

            case "LogicScheme.XorElement":
                var xor = new XorElement();
                recoverFields(form1, xor, control);
                break;

            case "LogicScheme.NotElement":
                var not = new NotElement();
                recoverFields(form1, not, control);
                break;
            }
        }
Example #11
0
 protected internal virtual void VisitAnd(TContext context, AndElement element)
 {
     VisitGroup(context, element);
 }