示例#1
0
        private RuleEngineItem createRuleEngineItem(string fullElementName, string op, string right, string dateType, string bitWiseOperation)
        {
            IoTHubAliasEventMessageReceiver receiver = new IoTHubAliasEventMessageReceiver("test");

            RuleEngineItem rei = new RuleEngineItem();

            rei.ElementName    = fullElementName;
            rei.DataType       = AlarmRuleItemEngineUtility.GetSupportDataType(dateType);
            rei.OrderOperation = bitWiseOperation;
            rei.Result         = false;

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

            if (rei.DataType == SupportDataTypeEnum.Numeric || rei.DataType == SupportDataTypeEnum.Bool)
            {
                rei.Equality = receiver.CreateCompiledRuleFuncTest(rei.DataType, op, right);
            }
            else
            {
                // SupportDataTypeEnum.String
                rei.StringRightValue     = right;
                rei.StringEqualOperation = op;
            }

            return(rei);
        }
示例#2
0
        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)));
            }
        }
示例#3
0
        private Func <DynamicMessageElement, bool> createCompiledRuleFunc(SupportDataTypeEnum supportedDataType, string op, string right)
        {
            EqualityRule rule;

            switch (supportedDataType)
            {
            case SupportDataTypeEnum.Bool:
                rule = new EqualityRule("StringValue", AlarmRuleItemEngineUtility.GetEqualityOperation(op), right.ToLower());
                break;

            case SupportDataTypeEnum.Numeric:
                decimal rightValue = Decimal.Parse(right);
                if (rightValue >= 0)
                {
                    rule = new EqualityRule("DecimalValue", AlarmRuleItemEngineUtility.GetEqualityOperation(op), right);
                }
                else
                {
                    rule = new EqualityRule("DecimalValue", AlarmRuleItemEngineUtility.GetEqualityOperation(op), "0-" + Decimal.Negate(rightValue).ToString());
                }
                break;

            case SupportDataTypeEnum.String:
                rule = new EqualityRule("StringValue", AlarmRuleItemEngineUtility.GetEqualityOperation(op), right);
                break;

            default:
                throw new NotSupportedException();
            }

            RuleBase rb = null;

            using (var mem = new MemoryStream())
            {
                Serializer.Serialize(mem, rule);
                mem.Position = 0;
                rb           = Serializer.Deserialize <RuleBase>(mem);
            }

            string ruleText;
            Func <DynamicMessageElement, bool> compiledRule = rb.CompileRule <DynamicMessageElement>(out ruleText);

            //_consoleLog.MessageAlarmDebug("----ruleText={0}", ruleText);
            //_consoleLog.MessageAlarmDebug("----ruleText="+ruleText);

            return(compiledRule);
        }
示例#4
0
        private Dictionary <string, RuleEngineItem> createRuleEngineItem(EventRuleCatalog eventRuleCatalog)
        {
            List <DetailForRuleEngineModel> detailForRuleEngineModelList = new List <DetailForRuleEngineModel>();

            foreach (EventRuleItem erItem in eventRuleCatalog.EventRuleItem)
            {
                DetailForRuleEngineModel returnData = new DetailForRuleEngineModel();
                returnData.Id = erItem.Id;
                returnData.EventRuleCatalogId = eventRuleCatalog.Id;
                returnData.Ordering           = erItem.Ordering;
                returnData.MessageElementId   = erItem.MessageElementId;
                returnData.EqualOperation     = erItem.EqualOperation;
                returnData.Value                  = erItem.Value;
                returnData.BitWiseOperation       = erItem.BitWiseOperation;
                returnData.MessageElementDataType = erItem.MessageElement1.ElementDataType;

                if (erItem.MessageElement != null)
                {
                    returnData.MessageElementFullName = erItem.MessageElement.ElementName + "_" + erItem.MessageElement1.ElementName;
                }
                else
                {
                    returnData.MessageElementFullName = erItem.MessageElement1.ElementName;
                }

                detailForRuleEngineModelList.Add(returnData);
            }

            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.MessageEventDebug("--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.MessageEventDebug("----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);
        }
示例#5
0
 private bool testBoolRule(bool left, string op, bool right)
 {
     return(AlarmRuleItemEngineUtility.ComplieBoolRule(left, op, right));
 }