protected override void VisitAggregate(ReteBuilderContext context, AggregateElement element) { BuildSubnet(context, element.Source); var betaNode = new AggregateNode(context.BetaSource, context.AlphaSource, element.AggregateType); if (context.HasSubnet) { betaNode.Conditions.Add(new SubnetCondition()); } context.BetaSource = BuildBetaMemoryNode(context, betaNode); context.ResetAlphaSource(); }
private void BuildAggregateNode(ReteBuilderContext context, AggregateElement element) { var node = context.AlphaSource .Sinks.OfType <AggregateNode>() .FirstOrDefault(x => x.RightSource == context.AlphaSource && x.LeftSource == context.BetaSource && x.Name == element.Name && ExpressionElementComparer.AreEqual(x.Expressions, element.Expressions)); if (node == null) { var aggregatorFactory = BuildAggregatorFactory(context, element); node = new AggregateNode(context.BetaSource, context.AlphaSource, element.Name, element.Expressions, aggregatorFactory, context.HasSubnet); } node.NodeInfo.Add(context.Rule, element); BuildBetaMemoryNode(context, node); context.ResetAlphaSource(); }
private void BuildAggregateNode(ReteBuilderContext context, Type aggregateType) { var node = context.AlphaSource .Sinks.OfType <AggregateNode>() .FirstOrDefault(x => x.RightSource == context.AlphaSource && x.LeftSource == context.BetaSource && x.AggregateType == aggregateType); if (node == null) { node = new AggregateNode(context.BetaSource, context.AlphaSource, aggregateType); if (context.HasSubnet) { node.Conditions.Insert(0, new SubnetCondition()); } } BuildBetaMemoryNode(context, node); context.ResetAlphaSource(); }
private void BuildAggregateNode(ReteBuilderContext context, AggregateElement element) { var node = context.AlphaSource .Sinks.OfType <AggregateNode>() .FirstOrDefault(x => x.RightSource == context.AlphaSource && x.LeftSource == context.BetaSource && x.Name == element.Name && ExpressionMapComparer.AreEqual(x.ExpressionMap, element.ExpressionMap)); if (node == null) { node = new AggregateNode(context.BetaSource, context.AlphaSource, element.Name, element.ExpressionMap, element.AggregatorFactory); if (context.HasSubnet) { node.Conditions.Insert(0, new SubnetCondition()); } } BuildBetaMemoryNode(context, node); context.ResetAlphaSource(); }