コード例 #1
0
ファイル: ExecuteData.cs プロジェクト: Anshul-G-Enest/nRule
        private bool ExecuteRuleForDynamicJson(ISession session, RuleEngineRequestModel ruleEngineRequestModel)
        {
            var ruleModel = JsonConvert.DeserializeObject <ExecuteRuleRequestModel>(ruleEngineRequestModel.JsonData);

            //foreach (var rule in ruleEngineRequestModel.Rules)
            //{
            //    switch (rule.EntityType)
            //    {
            //        case EntityTypeEnum.Country:
            //            ruleModel = JsonConvert.DeserializeObject<ExecuteRuleRequestModel>(ruleEngineRequestModel.JsonData);
            //            break;
            //        case EntityTypeEnum.Aircraft:
            //            ruleModel.Aircraft = JsonConvert.DeserializeObject<AircraftRequestModel>(ruleEngineRequestModel.JsonData);
            //            break;
            //        case EntityTypeEnum.Airport:
            //            ruleModel.Airport = JsonConvert.DeserializeObject<AirportRequestModel>(ruleEngineRequestModel.JsonData);
            //            break;
            //        case EntityTypeEnum.Trips:
            //            ruleModel.Trip = JsonConvert.DeserializeObject<TripRequestModel>(ruleEngineRequestModel.JsonData);
            //            break;
            //        case EntityTypeEnum.Person:
            //            ruleModel = JsonConvert.DeserializeObject<ExecuteRuleRequestModel>(ruleEngineRequestModel.JsonData);
            //            break;
            //    }
            //}

            session.Insert(ruleModel);
            return(session.Fire() == 1);
        }
コード例 #2
0
ファイル: ExecuteData.cs プロジェクト: Anshul-G-Enest/nRule
        public async Task <bool> ExecuteRuleWithDynamicData(RuleEngineRequestModel ruleEngineRequestModel)
        {
            if (!ruleEngineRequestModel.Rules.Any())
            {
                return(false);
            }

            return(ExecuteRuleForDynamicJson(CompileRule(ruleEngineRequestModel), ruleEngineRequestModel));
        }
コード例 #3
0
        public async Task <IActionResult> Put(RuleEngineRequestModel ruleEngineRequestModel)
        {
            var isSaved = await _ruleData.UpdateRule(ruleEngineRequestModel);

            if (isSaved)
            {
                return(Ok(ruleEngineRequestModel));
            }

            return(BadRequest("bad request"));
        }
コード例 #4
0
ファイル: ExecuteData.cs プロジェクト: Anshul-G-Enest/nRule
        private ISession CompileRule(RuleEngineRequestModel ruleEngineRequestModel)
        {
            foreach (var rule in ruleEngineRequestModel.Rules)
            {
                rule.EntityName.PropertyName = rule.EntityType.ToString();
            }
            _customRuleRepository.LoadRules <ExecuteRuleRequestModel>(ruleEngineRequestModel);

            var factory = _customRuleRepository.Compile();

            return(factory.CreateSession());
        }
コード例 #5
0
ファイル: RuleData.cs プロジェクト: Anshul-G-Enest/nRule
        public async Task <bool> SaveRule(RuleEngineRequestModel ruleEngineRequestModel)
        {
            ruleEngineRequestModel.Rules.ForEach(rule =>
            {
                _ruleDbContext.RuleEngines.Add(_mapper.Map <Model.RuleEngine>(rule));
            });

            _ruleDbContext.NRules.Add(new NRule()
            {
                Name = ruleEngineRequestModel.RuleName
            });

            return(await _ruleDbContext.SaveChangesAsync() > 0);
        }
コード例 #6
0
ファイル: ExecuteData.cs プロジェクト: Anshul-G-Enest/nRule
        public async Task <bool> ExecuteRuleWithDynamicDataAndByExistingRuleId(RuleEngineRequestModel ruleEngineRequestModel)
        {
            if (ruleEngineRequestModel.RuleId <= 0)
            {
                return(false);
            }

            var ruleEngines = _mapper.Map <IEnumerable <RuleEngineEntity> >(await _ruleDbContext.RuleEngines.Where(x => x.NRuleId == ruleEngineRequestModel.RuleId).ToListAsync());

            if (!ruleEngines.Any())
            {
                return(false);
            }

            return(ExecuteRuleForDynamicJson(CompileRule(ruleEngineRequestModel), ruleEngineRequestModel));
        }
コード例 #7
0
ファイル: RuleData.cs プロジェクト: Anshul-G-Enest/nRule
        public async Task <bool> UpdateRule(RuleEngineRequestModel ruleEngineRequestModel)
        {
            var nRule = await _ruleDbContext.NRules.FirstOrDefaultAsync(x => x.Id == ruleEngineRequestModel.RuleId);

            if (nRule == null)
            {
                return(false);
            }
            nRule.Name = ruleEngineRequestModel.RuleName;

            ruleEngineRequestModel.Rules.ForEach(rule =>
            {
                var dbRule = _ruleDbContext.RuleEngines.FirstOrDefault(x => x.Id == rule.Id);
                if (dbRule != null)
                {
                    _ruleDbContext.RuleEngines.Update(_mapper.Map(rule, dbRule));
                }
            });

            return(await _ruleDbContext.SaveChangesAsync() > 0);
        }
コード例 #8
0
 public async Task <IActionResult> ExecuteRuleWithDynamicDataAndByExistingRuleId(RuleEngineRequestModel ruleEngineRequestModel)
 {
     return(Ok(await _executeData.ExecuteRuleWithDynamicDataAndByExistingRuleId(ruleEngineRequestModel)));
 }
コード例 #9
0
        private List <IRuleDefinition> BuildRule <T>(RuleEngineRequestModel ruleEngineRequestModel)
        {
            var builder = new RuleBuilder();

            builder.Name("default");
            var            orGroup        = builder.LeftHandSide().Group(GroupType.Or);
            Expression     expression     = null;
            var            andGroup       = orGroup.Group(GroupType.And);
            PatternBuilder modelPattern   = andGroup.Pattern(typeof(T), "x");
            var            modelParameter = modelPattern.Declaration.ToParameterExpression();

            foreach (var item in ruleEngineRequestModel.Rules)
            {
                IDictionary <string, object> dictionary = item.EntityName;
                var        entityName = dictionary["PropertyName"];
                var        member     = Expression.Property(modelParameter, entityName.ToString());
                Expression condition  = null;
                switch (item.FilterOperation)
                {
                case FilterOperation.GreaterThan:
                    condition = Expression.GreaterThan(Expression.Property(member, item.PropertyName), Expression.Constant(Convert.ToInt32(item.Value.ToString())));
                    break;

                case FilterOperation.GreaterThanOrEqualTo:
                    condition = Expression.GreaterThanOrEqual(Expression.Property(member, item.PropertyName), Expression.Constant(Convert.ToInt32(item.Value.ToString())));
                    break;

                case FilterOperation.EqualTo:
                    if (Int32.TryParse(item.Value.ToString(), out int number))
                    {
                        condition = Expression.Equal(Expression.Property(member, item.PropertyName), Expression.Constant(Convert.ToInt32(item.Value.ToString())));
                    }
                    else if (Boolean.TryParse(item.Value.ToString(), out bool male))
                    {
                        condition = Expression.Equal(Expression.Property(member, item.PropertyName), Expression.Constant(Convert.ToBoolean(item.Value.ToString())));
                    }
                    else
                    {
                        condition = Expression.Equal(Expression.Property(member, item.PropertyName), Expression.Constant(item.Value.ToString().ToLower()));
                    }
                    break;

                case FilterOperation.NotEqualTo:
                    if (Int32.TryParse(item.Value.ToString(), out int num))
                    {
                        condition = Expression.NotEqual(Expression.Property(member, item.PropertyName), Expression.Constant(Convert.ToInt32(item.Value.ToString())));
                    }
                    else if (Boolean.TryParse(item.Value.ToString(), out bool male))
                    {
                        condition = Expression.NotEqual(Expression.Property(member, item.PropertyName), Expression.Constant(Convert.ToBoolean(item.Value.ToString())));
                    }
                    else
                    {
                        condition = Expression.NotEqual(Expression.Property(member, item.PropertyName), Expression.Constant(item.Value.ToString().ToLower()));
                    }
                    break;

                case FilterOperation.LessThan:
                    condition = Expression.LessThan(Expression.Property(member, item.PropertyName), Expression.Constant(Convert.ToInt32(item.Value.ToString())));
                    break;

                case FilterOperation.LessThanOrEqualTo:
                    condition = Expression.LessThanOrEqual(Expression.Property(member, item.PropertyName), Expression.Constant(Convert.ToInt32(item.Value.ToString())));
                    break;

                case FilterOperation.IsNull:
                case FilterOperation.IsNotNull:
                    condition = Expression.Equal(Expression.Property(member, item.PropertyName), Expression.Constant(null));
                    break;

                case FilterOperation.Contains:
                    var constantContainExpr = Expression.Constant(item.Value.ToString().ToLower());
                    condition = Expression.Call(Expression.Property(member, item.PropertyName), stringContainsMethod, constantContainExpr);
                    break;

                case FilterOperation.StartsWith:
                    var constantStartExpr = Expression.Constant(item.Value.ToString().ToLower());
                    condition = Expression.Call(Expression.Property(member, item.PropertyName), stringStartsWithMethod, constantStartExpr);
                    break;

                case FilterOperation.EndsWith:
                    var constantEndExpr = Expression.Constant(item.Value.ToString().ToLower());
                    condition = Expression.Call(Expression.Property(member, item.PropertyName), stringEndsWithMethod, constantEndExpr);
                    break;

                case FilterOperation.Between:
                    var constant  = Expression.Constant(item.Value.ToString().ToLower());
                    var constant2 = Expression.Constant(item.SecondValue.ToString().ToLower());
                    BinaryExpression leftBinaryExpression  = null;
                    BinaryExpression rightBinaryExpression = null;
                    if (Int32.TryParse(item.Value.ToString(), out int idField))
                    {
                        leftBinaryExpression  = Expression.GreaterThanOrEqual(Expression.Property(member, item.PropertyName), Expression.Constant(Convert.ToInt32(item.Value.ToString())));
                        rightBinaryExpression = Expression.LessThanOrEqual(Expression.Property(member, item.PropertyName), Expression.Constant(Convert.ToInt32(item.SecondValue.ToString())));
                    }
                    if (DateTime.TryParse(item.Value.ToString(), out DateTime dateTime))
                    {
                        leftBinaryExpression  = Expression.GreaterThanOrEqual(Expression.Property(member, item.PropertyName), Expression.Constant(Convert.ToDateTime(item.Value.ToString())));
                        rightBinaryExpression = Expression.LessThanOrEqual(Expression.Property(member, item.PropertyName), Expression.Constant(Convert.ToDateTime(item.SecondValue.ToString())));
                    }
                    condition = CombineExpressions(leftBinaryExpression, rightBinaryExpression, FilterStatementConnector.And);
                    break;

                case FilterOperation.In:
                    var values = new List <string>();
                    var obj    = JsonConvert.DeserializeObject <string[]>(item.Value.ToString().ToLower());
                    values.AddRange(obj);
                    var constantInExpr = Expression.Constant(values);
                    condition = Contains(Expression.Property(member, item.PropertyName), constantInExpr);
                    break;
                }
                expression = expression == null ? condition : CombineExpressions(expression, condition, item.FilterConnector);
            }
            var finalexpression = Expression.Lambda(expression, modelParameter);

            modelPattern.Condition(finalexpression);

            Expression <Action <IContext> > action = ctx => Console.WriteLine("Action triggered");

            builder.RightHandSide().Action(action);

            var rule = builder.Build();

            return(new List <IRuleDefinition> {
                rule
            });
        }
コード例 #10
0
 public void LoadRules <T>(RuleEngineRequestModel list)
 {
     _ruleSet.Add(
         BuildRule <T>(list)
         );
 }