예제 #1
0
        private void BuildJoinNode(ReteBuilderContext context, IEnumerable <ConditionElement> conditions = null)
        {
            var betaConditions = new List <BetaCondition>();

            if (conditions != null)
            {
                foreach (var condition in conditions)
                {
                    var factIndexMap  = FactIndexMap.CreateMap(condition.References, context.Declarations);
                    var betaCondition = new BetaCondition(condition.Expression, factIndexMap);
                    betaConditions.Add(betaCondition);
                }
            }

            var node = context.BetaSource
                       .Sinks.OfType <JoinNode>()
                       .FirstOrDefault(x =>
                                       x.RightSource == context.AlphaSource &&
                                       x.LeftSource == context.BetaSource &&
                                       ConditionComparer.AreEqual(x.Conditions, betaConditions));

            if (node == null)
            {
                node = new JoinNode(context.BetaSource, context.AlphaSource);
                foreach (var betaCondition in betaConditions)
                {
                    node.Conditions.Add(betaCondition);
                }
            }
            BuildBetaMemoryNode(context, node);
            context.ResetAlphaSource();
        }
예제 #2
0
        private JoinNode BuildJoinNode(ReteBuilderContext context, IEnumerable <ConditionElement> conditions = null)
        {
            var betaNode = new JoinNode(context.BetaSource, context.AlphaSource);

            context.AlphaSource = null;

            if (conditions != null)
            {
                foreach (var condition in conditions)
                {
                    var mask          = context.GetTupleMask(condition.Declarations);
                    var betaCondition = new BetaCondition(condition.Expression, mask.ToArray());
                    betaNode.Conditions.Add(betaCondition);
                }
            }

            return(betaNode);
        }