コード例 #1
0
ファイル: ReteBuilder.cs プロジェクト: arastoul/NRules
        private void BuildJoinNode(ReteBuilderContext context, List <ExpressionElement> conditions = null)
        {
            var expressionElements = conditions ?? new List <ExpressionElement>();
            var node = context.BetaSource
                       .Sinks.OfType <JoinNode>()
                       .FirstOrDefault(x =>
                                       x.RightSource == context.AlphaSource &&
                                       x.LeftSource == context.BetaSource &&
                                       ExpressionElementComparer.AreEqual(
                                           x.Declarations, x.ExpressionElements,
                                           context.Declarations, expressionElements));

            if (node == null)
            {
                var compiledExpressions = new List <ILhsExpression <bool> >(expressionElements.Count);
                foreach (var expressionElement in expressionElements)
                {
                    var compiledExpression = _ruleExpressionCompiler.CompileLhsExpression <bool>(expressionElement, context.Declarations);
                    compiledExpressions.Add(compiledExpression);
                }
                node    = new JoinNode(context.BetaSource, context.AlphaSource, context.Declarations.ToList(), expressionElements, compiledExpressions, context.HasSubnet);
                node.Id = GetNodeId();
            }
            node.NodeInfo.Add(context.Rule);
            BuildBetaMemoryNode(context, node);
            context.ResetAlphaSource();
        }
コード例 #2
0
        private static void AssertNotEqual(List <Declaration> declarationsFirst, IEnumerable <NamedExpressionElement> first, List <Declaration> declarationsSecond, IEnumerable <NamedExpressionElement> second)
        {
            //Act
            bool result = ExpressionElementComparer.AreEqual(declarationsFirst, first, declarationsSecond, second);

            //Assert
            Assert.False(result);
        }
コード例 #3
0
        private static void AssertNotEqual(NamedExpressionElement first, NamedExpressionElement second)
        {
            //Act
            bool result = ExpressionElementComparer.AreEqual(first, second);

            //Assert
            Assert.False(result);
        }
コード例 #4
0
ファイル: ReteBuilder.cs プロジェクト: zhjrate/NRules
        private void BuildSelectionNode(ReteBuilderContext context, ExpressionElement element)
        {
            SelectionNode node = context.CurrentAlphaNode
                                 .ChildNodes.OfType <SelectionNode>()
                                 .FirstOrDefault(sn => ExpressionElementComparer.AreEqual(sn.ExpressionElement, element));

            if (node == null)
            {
                var compiledExpression = ExpressionCompiler.CompileLhsFactExpression <bool>(element);
                node = new SelectionNode(element, compiledExpression);
                context.CurrentAlphaNode.ChildNodes.Add(node);
            }
            node.NodeInfo.Add(context.Rule, element);
            context.CurrentAlphaNode = node;
        }
コード例 #5
0
ファイル: ReteBuilder.cs プロジェクト: zhjrate/NRules
        private void BuildBindingNode(ReteBuilderContext context, BindingElement element)
        {
            var node = context.BetaSource
                       .Sinks.OfType <BindingNode>()
                       .FirstOrDefault(x =>
                                       ExpressionElementComparer.AreEqual(x.ExpressionElement, element));

            if (node == null)
            {
                var compiledExpression = ExpressionCompiler.CompileLhsTupleExpression <object>(element, context.Declarations);
                node = new BindingNode(element, compiledExpression, element.ResultType, context.BetaSource);
            }
            node.NodeInfo.Add(context.Rule, element);
            BuildBetaMemoryNode(context, node);
            context.ResetAlphaSource();
        }
コード例 #6
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();
        }