Rule Engine - How to store rules to avoid parsing on edit?

后端 未结 1 944
不知归路
不知归路 2021-02-10 04:45

My .NET application evaluates user defined rules at runtime. These rules are entered to system via GUI menus by user. I generate a logical statement that corresponds to it and s

1条回答
  •  孤城傲影
    2021-02-10 05:33

    You could store the rules as ASTs - implement a few classes that represent the nodes of the tree:

    interface INode
    {
    }
    
    enum BinaryOperator 
    {
        AND, OR, Equal, Greater, Lower;
    }
    
    class BinaryExpression : INode
    {
        BinaryOperator Operator { get; set; }
        INode Left { get; set; }
        INode Right { get; set; } 
    }
    
    class PropertyRerefence : INode
    {
        string PropertyName { get; set; }
    }
    
    class Constant : INode
    {
        string Value { get; set; }
    }
    

    The tree for your example would look like this:

    BinaryExpression(OR)
      Left=BinaryExpression(AND)
              Left=...
              Right=...
      Right=BinaryExpression(Greater)
              Left=PropertyReference("Number")
              Right=Constant("12")
    

    You could then use serialization (best JSON, or XML, maybe even binary if you don't care about readability in the db) to save such trees. On deserialization, you don't need to do any parsing and can traverse the tree to populate the menus.

    Printing "(Name = 'John' AND Surname = 'Smith') OR Number > 12" is also easy when you have the AST - for a BinaryExpression: print Left, print Operator, print Right.

    You say you already have the evaluation implemented so I'll leave this out. You can also look at this question.

    0 讨论(0)
提交回复
热议问题