private Terminal BuildTerminal(ReteBuilderContext context, RuleElement element, IEnumerable <Declaration> ruleDeclarations) { if (context.AlphaSource != null) { BuildJoinNode(context, element); } var factMap = IndexMap.CreateMap(ruleDeclarations, context.Declarations); var terminalNode = new Terminal(context.BetaSource, factMap); return(terminalNode); }
private void BuildJoinNode(ReteBuilderContext context, IEnumerable <ConditionElement> conditions = null) { var betaConditions = new List <BetaCondition>(); if (conditions != null) { foreach (var condition in conditions) { var factIndexMap = IndexMap.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); if (context.HasSubnet) { node.Conditions.Insert(0, new SubnetCondition()); } foreach (var betaCondition in betaConditions) { node.Conditions.Add(betaCondition); } } BuildBetaMemoryNode(context, node); context.ResetAlphaSource(); }