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(); }
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); }