コード例 #1
0
ファイル: ReteBuilder.cs プロジェクト: starnovsky/NRules
        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();
        }
コード例 #2
0
ファイル: ReteBuilder.cs プロジェクト: zhjrate/NRules
        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();
        }
コード例 #3
0
        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();
        }
コード例 #4
0
ファイル: ReteBuilder.cs プロジェクト: guojianbin/NRules
        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();
        }