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() ) ); }
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(); } }
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); }
public override void VisitRuleDeclaration(RuleDeclaration ruleDeclaration) { scopes_.Push(scopes_.Peek().CreateChildScope(ruleDeclaration)); base.VisitRuleDeclaration(ruleDeclaration); scopes_.Pop(); }
private RuleInfo CreateRuleInfo(RuleDeclaration ruleDeclaration) { var ruleInfo = new RuleInfo(ruleDeclaration.Name, CurrentDeclaringSymbol); CurrentDeclaringSymbol.AddDeclaration(ruleInfo); symbols_.Add(ruleDeclaration, ruleInfo); return(ruleInfo); }
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); }
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); } } }
internal override bool HasDerivedElements(RuleDeclaration ruleDeclaration) { return(ruleDeclaration.DerivedClasses.Any()); }
internal override bool HasDerivedElements(RuleDeclaration ruleDeclaration) { return(ruleDeclaration.DerivedParserMethods.Any()); }
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); }
public virtual void ExitRuleDeclaration(RuleDeclaration ruleDeclaration) { }
public virtual void EnterRuleDeclaration(RuleDeclaration ruleDeclaration) { }
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); } } }
public virtual T VisitRuleDeclaration(RuleDeclaration ruleDeclaration) { return(VisitChildren(ruleDeclaration)); }
internal abstract bool HasDerivedElements(RuleDeclaration ruleDeclaration);
public override INode VisitRuleDeclaration(RuleDeclaration ruleDeclaration) { return(new RuleDeclaration(ruleDeclaration.Context, ruleDeclaration.Name, ruleDeclaration.Children.Select(Visit))); }
public virtual void VisitRuleDeclaration(RuleDeclaration ruleDeclaration) { DefaultVisit(ruleDeclaration); }