Esempio n. 1
0
        public override void ExitRuleDeclaration(RuleDeclaration ruleDeclaration)
        {
            //Convert trigger and condition to lambda expressions
            var trigger   = ruleDeclaration.Trigger;
            var condition = ruleDeclaration.Condition;

            trigger.Remove();
            condition.Remove();

            ruleDeclaration.AddChildFirst(
                new LambdaExpression(
                    ruleDeclaration.Context,
                    new BlockStatement(
                        ruleDeclaration.Context,
                        new ReturnStatement(ruleDeclaration.Context, condition.Yield()).Yield()).Yield()
                    )
                );
            ruleDeclaration.AddChildFirst(
                new LambdaExpression(
                    ruleDeclaration.Context,
                    new BlockStatement(
                        ruleDeclaration.Context,
                        new ReturnStatement(ruleDeclaration.Context, trigger.Yield()).Yield()).Yield()
                    )
                );
        }
Esempio n. 2
0
        public void FirstTestName()
        {
            var engine = new MagnumRulesEngine();

            RuleDeclaration rule = CreateOnlineOrderRule();

            engine.Add(rule);
            rule = CreateCustomerExistsRule();
            engine.Add(rule);
            rule = CreateActiveNotPreferredRule();
            engine.Add(rule);
            rule = CreatePreferredRule();
            engine.Add(rule);

            var visitor = new StringNodeVisitor();

            engine.Visit(visitor);

            Trace.WriteLine(visitor.Result);


            using (StatefulSession session = engine.CreateSession())
            {
                session.Assert(CurrentOrder);

                session.Run();
            }
        }
Esempio n. 3
0
        public TypeDispatchNode Add(TypeDispatchNode root, RuleDeclaration declaration)
        {
            ConditionDeclaration[] conditions  = declaration.Conditions.ToArray();
            Expression[]           expressions = conditions.Select(x => _normalizer.Normalize(x.Expression)).ToArray();

            var visitor = new FindConditionVisitor(expressions);

            root.Visit(visitor);

            object[] conditionNodes = visitor.ExistingNodes;

            for (int i = 0; i < conditions.Length; i++)
            {
                if (conditionNodes[i] == null)
                {
                    conditionNodes[i] = CreateConditionNode(root, conditions[i].MatchType, expressions[i]);
                }
            }

            Node joinNode = CreateJoinNode(conditionNodes, conditions[0].MatchType);

            declaration.Consequences.Each(consequence =>
            {
                CreateActionNode(joinNode, consequence.Expression);
            });

            return(root);
        }
        public override bool IsAvailable(IDataContext dataContext)
        {
            var             textControl     = dataContext.GetData(TextControl.DataContext.DataConstants.TEXT_CONTROL);
            ISolution       solution        = dataContext.GetData(ProjectModel.DataContext.DataConstants.SOLUTION);
            var             token           = TextControlToPsi.GetSourceTokenAtCaret(solution, textControl);
            RuleDeclaration ruleDeclaration = null;

            if (token.Parent is IRuleDeclaredName)
            {
                ruleDeclaration = token.Parent.Parent as RuleDeclaration;
            }
            else if (token.Parent is IRuleName)
            {
                var reference       = (token.Parent as IRuleName).RuleNameReference;
                var declaredElement = reference.Resolve().DeclaredElement;
                ruleDeclaration = declaredElement as RuleDeclaration;
            }
            else if (token.Parent is IPathName)
            {
                var reference       = (token.Parent as IPathName).RuleNameReference;
                var declaredElement = reference.Resolve().DeclaredElement;
                ruleDeclaration = declaredElement as RuleDeclaration;
            }
            if (ruleDeclaration != null)
            {
                var psiFile = ruleDeclaration.GetContainingNode <PsiFile>();
                if (psiFile != null)
                {
                    psiFile.CollectDerivedElements(ruleDeclaration);
                }
                return(HasDerivedElements(ruleDeclaration));
            }

            return(false);
        }
Esempio n. 5
0
        public override void VisitRuleDeclaration(RuleDeclaration ruleDeclaration)
        {
            scopes_.Push(scopes_.Peek().CreateChildScope(ruleDeclaration));

            base.VisitRuleDeclaration(ruleDeclaration);

            scopes_.Pop();
        }
Esempio n. 6
0
        private RuleInfo CreateRuleInfo(RuleDeclaration ruleDeclaration)
        {
            var ruleInfo = new RuleInfo(ruleDeclaration.Name, CurrentDeclaringSymbol);

            CurrentDeclaringSymbol.AddDeclaration(ruleInfo);
            symbols_.Add(ruleDeclaration, ruleInfo);

            return(ruleInfo);
        }
Esempio n. 7
0
        private void AddUnderLimitRule()
        {
            Expression <Func <OrderSubmitted, bool> > exp = o => o.Amount < 50.00m;

            ConditionDeclaration condition = Declaration.Condition(exp);
            ConsequenceDeclaration <OrderSubmitted> consequence = Declaration.Consequence <OrderSubmitted>(o => _underLimit(o.Element.Object));

            RuleDeclaration rule = Declaration.Rule(new[] { condition }, new[] { consequence });

            _engine.Add(rule);
        }
Esempio n. 8
0
        public override void VisitRuleDeclaration(RuleDeclaration ruleDeclaration)
        {
            PushScope(CurrentScope.CreateChildScope(ruleDeclaration));

            var ruleInfo = CreateRuleInfo(ruleDeclaration);

            PushDeclaringSymbol(ruleInfo);

            base.VisitRuleDeclaration(ruleDeclaration);

            PopDeclaringSymbol();
            PopScope();
        }
        private void LoadCategoryDeclarations(XDocument doc)
        {
            lock (_lockConfigurationFile)
            {
                // Validate input...
                if (doc == null)
                {
                    throw new ArgumentNullException("doc");
                }

                foreach (XElement categoryDeclaration in doc.Descendants(CATEGORY_DECLARATION))
                {
                    CategoryDeclaration cd = new CategoryDeclaration();
                    cd.Id          = int.Parse(categoryDeclaration.Attribute(XName.Get(ID)).Value);
                    cd.Name        = categoryDeclaration.Attribute(XName.Get(NAME)).Value;
                    cd.Description = categoryDeclaration.Element(XName.Get(CATEGORY_DESCRIPTION)).Value;
                    cd.Rules       = new Dictionary <int, IRuleDeclaration>();

                    foreach (XElement ruleDeclaration in categoryDeclaration.Descendants(XName.Get(RULE_DECLARATION)))
                    {
                        RuleDeclaration rd = new RuleDeclaration();
                        rd.ParentDeclaration = cd;
                        rd.Id          = int.Parse(ruleDeclaration.Attribute(XName.Get(ID)).Value);
                        rd.Name        = ruleDeclaration.Attribute(XName.Get(NAME)).Value;
                        rd.Description = ruleDeclaration.Descendants(XName.Get(RULE_DESCRIPTION)).Single().Value;
                        rd.Severity    = RuleSeverityMapper.String2RuleSeverity(ruleDeclaration.Descendants(XName.Get(RULE_SEVERITY)).Single().Value);
                        rd.Expression  = ruleDeclaration.Descendants(XName.Get(RULE_EXPRESSION)).Single().Value;

                        IEnumerable <XElement> languages = ruleDeclaration.Descendants(XName.Get("Language"));
                        foreach (XElement l in languages)
                        {
                            int    id   = int.Parse(l.Attribute(XName.Get("RefId")).Value);
                            string name = l.Attribute(XName.Get("RefName")).Value;
                            rd.Languages.Add(id, Manager.Declarations.Languages[id]);
                        }

                        cd.Rules.Add(rd.Id, rd);

                        // Update 'Rule Declaration' statistics counters...
                        ProxyHome.Instance.RetrieveStatisticsProxy(ConfigKeyKeeper.Instance.AccessKey).IncrementCounter(CounterIds.RuleDeclarations);
                    }

                    Manager.Declarations.Categories.Add(cd.Id, cd);

                    // Update 'Category Declaration' statistics counters...
                    ProxyHome.Instance.RetrieveStatisticsProxy(ConfigKeyKeeper.Instance.AccessKey).IncrementCounter(CounterIds.CategoryDeclarations);
                }
            }
        }
Esempio n. 10
0
 internal override bool HasDerivedElements(RuleDeclaration ruleDeclaration)
 {
     return(ruleDeclaration.DerivedClasses.Any());
 }
 internal override bool HasDerivedElements(RuleDeclaration ruleDeclaration)
 {
     return(ruleDeclaration.DerivedParserMethods.Any());
 }
Esempio n. 12
0
        public static (DefinitionType defType, Declaration declaration) Build(int index, string line)
        {
            Declaration    declaration    = null;
            DefinitionType?definitionType = null;
            string         error          = null;
            var            tokens         = Regex.Split(line, "\\s+");

            try
            {
                var type = tokens[0].ToLower(); // Must be one of LV, FS, RULE
                if (type != RULE && type != LV && type != FS)
                {
                    error = string.Format("Unknown declaration type: must be one of ({0}, {1}, {2})", LV, FS, RULE);
                }

                var identifier = tokens[1];
                var op         = tokens[2];

                if (OPS != op)
                {
                    error = string.Format("Unknown value separator: must be '{0}'. Remember to put a space between the separator and the identifier", OPS);
                }


                if (error == null)
                {
                    var value = "";
                    var rest  = tokens.Skip(3);
                    foreach (var t in rest)
                    {
                        value += t + " ";
                    }

                    value.TrimEnd();


                    switch (type)
                    {
                    case LV:
                        definitionType = DefinitionType.Variable;
                        declaration    = new VariableDeclaration
                        {
                            Identifier = identifier,
                            Value      = ParseVariableValue(value)
                        };
                        break;

                    case FS:
                        definitionType = DefinitionType.FuzzySet;
                        declaration    = new FuzzySetDeclaration
                        {
                            Identifier = identifier,
                            Value      = ParseFuzzySetValue(value.Trim())
                        };
                        break;

                    case RULE:
                        definitionType = DefinitionType.Rule;
                        declaration    = new RuleDeclaration
                        {
                            Identifier = identifier,
                            Value      = value
                        };
                        break;
                    }
                }
            }
            catch (IndexOutOfRangeException)
            {
                error = "Malformed declaration";
            }


            if (error != null)
            {
                throw new InterpretationException(error, index);
            }

            if (declaration == null || definitionType == null || !definitionType.HasValue)
            {
                throw new InterpretationException("Could not interpret statement", index);
            }


            return(definitionType.Value, declaration);
        }
Esempio n. 13
0
 public virtual void ExitRuleDeclaration(RuleDeclaration ruleDeclaration)
 {
 }
Esempio n. 14
0
 public virtual void EnterRuleDeclaration(RuleDeclaration ruleDeclaration)
 {
 }
Esempio n. 15
0
        private void LoadCategoryDeclarations(XDocument doc)
        {
            lock (_lockConfigurationFile)
              {
            // Validate input...
            if (doc == null)
              throw new ArgumentNullException("doc");

            foreach (XElement categoryDeclaration in doc.Descendants(CATEGORY_DECLARATION))
            {
              CategoryDeclaration cd = new CategoryDeclaration();
              cd.Id = int.Parse(categoryDeclaration.Attribute(XName.Get(ID)).Value);
              cd.Name = categoryDeclaration.Attribute(XName.Get(NAME)).Value;
              cd.Description = categoryDeclaration.Element(XName.Get(CATEGORY_DESCRIPTION)).Value;
              cd.Rules = new Dictionary<int, IRuleDeclaration>();

              foreach (XElement ruleDeclaration in categoryDeclaration.Descendants(XName.Get(RULE_DECLARATION)))
              {
            RuleDeclaration rd = new RuleDeclaration();
            rd.ParentDeclaration = cd;
            rd.Id = int.Parse(ruleDeclaration.Attribute(XName.Get(ID)).Value);
            rd.Name = ruleDeclaration.Attribute(XName.Get(NAME)).Value;
            rd.Description = ruleDeclaration.Descendants(XName.Get(RULE_DESCRIPTION)).Single().Value;
            rd.Severity = RuleSeverityMapper.String2RuleSeverity(ruleDeclaration.Descendants(XName.Get(RULE_SEVERITY)).Single().Value);
            rd.Expression = ruleDeclaration.Descendants(XName.Get(RULE_EXPRESSION)).Single().Value;

            IEnumerable<XElement> languages = ruleDeclaration.Descendants(XName.Get("Language"));
            foreach (XElement l in languages)
            {
              int id = int.Parse(l.Attribute(XName.Get("RefId")).Value);
              string name = l.Attribute(XName.Get("RefName")).Value;
              rd.Languages.Add(id, Manager.Declarations.Languages[id]);
            }

            cd.Rules.Add(rd.Id, rd);

            // Update 'Rule Declaration' statistics counters...
            ProxyHome.Instance.RetrieveStatisticsProxy(ConfigKeyKeeper.Instance.AccessKey).IncrementCounter(CounterIds.RuleDeclarations);
              }

              Manager.Declarations.Categories.Add(cd.Id, cd);

              // Update 'Category Declaration' statistics counters...
              ProxyHome.Instance.RetrieveStatisticsProxy(ConfigKeyKeeper.Instance.AccessKey).IncrementCounter(CounterIds.CategoryDeclarations);
            }
              }
        }
Esempio n. 16
0
 public virtual T VisitRuleDeclaration(RuleDeclaration ruleDeclaration)
 {
     return(VisitChildren(ruleDeclaration));
 }
 internal abstract bool HasDerivedElements(RuleDeclaration ruleDeclaration);
Esempio n. 18
0
 public override INode VisitRuleDeclaration(RuleDeclaration ruleDeclaration)
 {
     return(new RuleDeclaration(ruleDeclaration.Context, ruleDeclaration.Name, ruleDeclaration.Children.Select(Visit)));
 }
Esempio n. 19
0
 public virtual void VisitRuleDeclaration(RuleDeclaration ruleDeclaration)
 {
     DefaultVisit(ruleDeclaration);
 }