private void runSingleRuleItem(RuleEngineItem ruleEngineItem, JObject payload)
        {
            string elementName = ruleEngineItem.ElementName;

            try
            {
                var value = payload[elementName];

                DynamicMessageElement dm = new DynamicMessageElement();
                dm.Name = elementName;
                switch (ruleEngineItem.DataType)
                {
                case SupportDataTypeEnum.Bool:
                    dm.StringValue = value.ToString().ToLower();
                    break;

                case SupportDataTypeEnum.String:
                    dm.StringValue = (string)value;
                    if (string.IsNullOrEmpty(dm.StringValue))
                    {
                        dm.StringValue = "null";
                    }
                    break;

                case SupportDataTypeEnum.Numeric:
                    dm.DecimalValue = (decimal)value;
                    break;

                default:
                    throw new NotSupportedException();
                }

                if (ruleEngineItem.DataType == SupportDataTypeEnum.Numeric || ruleEngineItem.DataType == SupportDataTypeEnum.Bool)
                {
                    ruleEngineItem.Result = ruleEngineItem.Equality(dm);
                }
                else
                {
                    // SupportDataTypeEnum.String
                    bool equal = string.Equals(dm.StringValue, ruleEngineItem.StringRightValue);
                    if (ruleEngineItem.StringEqualOperation.Equals("="))
                    {
                        ruleEngineItem.Result = equal;
                    }
                    else if (ruleEngineItem.StringEqualOperation.Equals("!="))
                    {
                        ruleEngineItem.Result = !equal;
                    }
                    else
                    {
                        throw new ArgumentNullException("String equal operation is not supported - " + ruleEngineItem.StringEqualOperation);
                    }
                }
            }
            catch (Exception)
            {
                ruleEngineItem.Result = false;
            }
        }
Example #2
0
        private Dictionary <string, RuleEngineItem> createRuleEngineItem(int alarmRuleCatalogId)
        {
            DBHelper._AlarmRuleItem dbhelperAlarmRuleItem = new DBHelper._AlarmRuleItem();
            var detailForRuleEngineModelList = dbhelperAlarmRuleItem.GetAllByAlarmRuleCatalogIdForRuleEngine(alarmRuleCatalogId);

            Dictionary <string, RuleEngineItem> ruleEngineItems = new Dictionary <string, RuleEngineItem>();

            int index = 0;

            foreach (var detailForRuleEngineModel in detailForRuleEngineModelList)
            {
                RuleEngineItem rei = new RuleEngineItem();
                rei.ElementName    = detailForRuleEngineModel.MessageElementFullName;
                rei.DataType       = AlarmRuleItemEngineUtility.GetSupportDataType(detailForRuleEngineModel.MessageElementDataType);
                rei.OrderOperation = detailForRuleEngineModel.BitWiseOperation;
                rei.Result         = false;

                ConsoleLog.WriteMessageAlarmLogToConsole("--ElementName={0}, BitWiseOperation={1}", rei.ElementName, rei.OrderOperation);

                if (rei.DataType == SupportDataTypeEnum.String &&
                    (string.IsNullOrEmpty(detailForRuleEngineModel.Value) || detailForRuleEngineModel.Value.ToLower().Equals("null")))
                {
                    detailForRuleEngineModel.Value = "null";
                }

                if (rei.DataType == SupportDataTypeEnum.Numeric || rei.DataType == SupportDataTypeEnum.Bool)
                {
                    rei.Equality = createCompiledRuleFunc(rei.DataType, detailForRuleEngineModel.EqualOperation, detailForRuleEngineModel.Value);
                }
                else
                {
                    // SupportDataTypeEnum.String
                    rei.Equality         = null;
                    rei.StringRightValue = detailForRuleEngineModel.Value;

                    if (detailForRuleEngineModel.EqualOperation.Equals("=") || detailForRuleEngineModel.EqualOperation.Equals("!="))
                    {
                        rei.StringEqualOperation = detailForRuleEngineModel.EqualOperation;
                    }
                    else
                    {
                        throw new ArgumentNullException("String equal operation is not supported - " + detailForRuleEngineModel.EqualOperation);
                    }

                    ConsoleLog.WriteMessageAlarmLogToConsole("----ruleText=({0} {1} {2})", rei.ElementName, detailForRuleEngineModel.EqualOperation, rei.StringRightValue);
                }

                // Add the index to avoid the duplicate key
                ruleEngineItems.Add(rei.ElementName + "-" + index, rei);
                index++;
            }

            return(ruleEngineItems);
        }
        private bool compileBitWiseRules(int offset, Dictionary <string, RuleEngineItem> ruleEngineItems)
        {
            RuleEngineItem rei = ruleEngineItems.ElementAt(offset).Value;

            if (offset == 0)
            {
                return(rei.Result);
            }
            else
            {
                offset--;
                RuleEngineItem previousRei = ruleEngineItems.ElementAt(offset).Value;
                return(AlarmRuleItemEngineUtility.ComplieBoolRule(rei.Result, previousRei.OrderOperation, compileBitWiseRules(offset, ruleEngineItems)));
            }
        }
 public void RunSingleRuleItemTest(RuleEngineItem ruleEngineItem, JObject payload)
 {
     runSingleRuleItem(ruleEngineItem, payload);
 }