我的结构如下
Parameter -> Condition -> Rule
假设我需要创建Business rule
,Customer Age > 18
我有两个参数,Customer Age (P1) and 18(P2)
,P1 is Field Parameter (Ognl)
和P2 is constant Parameter
value 18
。
所以我的Condition
现在是Customer Age > 18
,而我的Rule
也是如此。
问题陈述:避免用户创建重复的参数/条件和规则。
解决方案:Constant Parameters, Field Parameters etc
我可以检入数据库并比较是否已存在。
现在适合我,
商业术语中 Customer Age > 18
和18 < Customer Age
相同。
上述情况可能更复杂。
(a + b) * (c + d) is same as (b + a) * (d + c)
我需要验证上面的表达式。
第一种方法 - 从DB加载所有表达式(可以是10000&#39; s)并比较using Stack/Tree Structure
,这将真正杀死我的目标。
第二种方法 - 我正在考虑建立权力,让我们说hashcode generator
或者我们可以对每个表达式说一个int value
(也考虑运算符/括号)。应该以验证上述表达式的方式生成此值。
方法a + b
和b + a
应生成相同的int value
,而a - b
和b - a
应生成不同的内容。
答案 0 :(得分:1)
也许是您的第一种方法的简化版本:如何通过查找与您要插入数据库中相似的内容来仅过滤相关表达式?
如果您知道要插入Customer Age
,则可以找到包含此参数的所有表达式,并根据此缩减的表达式构建堆栈/树。
答案 1 :(得分:1)
我认为你不能避免编写表达式解析器,构建表达式的AST和代码重写规则来检测表达式的等价。
它可能不像你想象的那么耗时。
对于解析和AST构建部分,您可以从exp4j开始: http://www.objecthunter.net/exp4j/
对于重写规则,您可以查看:Strategies for simplifying math expressions
答案 2 :(得分:1)
对于100%安全的解决方案,您应该使用计算机代数系统分析表达式,以确定是否存在数学上相同的表达式。但那并不容易。
一种实用的方法,可以测试两个表达式是否相似:
您可以将预定义输入集的变量列表和输出存储为表达式的“哈希”。此哈希不会保证两个表达式相等,但您可以向用户显示具有相同哈希值的表达式,询问此新规则是否等于这些相似的表达式之一。