2014-12-02 58 views
0

我有结构如下图查找重复的表情/参数

Parameter -> Condition -> Rule

让我们说,我需要建立一个Business ruleCustomer Age > 18

我有两个参数,Customer Age (P1) and 18(P2),其中P1 is Field Parameter (Ognl)P2 is constant Parametervalue 18

所以我的Condition现在是,Customer Age > 18,所以我的Rule

问题陈述:避免用户创建重复的参数/条件和规则。

解决方案Constant Parameters, Field Parameters etc我可以检查数据库并比较是否已经存在。

现在的条件对我来说,

Customer Age > 1818 < Customer Age在业务方面相同。

上述情况可能会更复杂。

(a + b) * (c + d) is same as (b + a) * (d + c) 

我需要验证上述表达式。

第一种方法 - 加载来自DB的所有表达式(可以是10000的)并比较using Stack/Tree Structure,这将真正杀死我的目标。

第二种方法 - 我想建立电力十足,让说hashcode generator,或者我们可以说,一个int value对每一个表情(考虑到运营商/支架也可以)。应该以这种方式生成此值,以验证上述表达式。

手段a + bb + a应该产生相同的int valuea - bb - a应该产生不同。

回答

1

也许您的第一种方法的简化版本:通过查找您即将插入到数据库中的相似内容来仅筛选相关表达式,怎么办?

如果您知道您即将插入Customer Age,则可以找到包含此参数的所有表达式,并根据这组缩减的表达式构建堆栈/树。

+0

正确的,我可以减少输出/迭代,但仍然我的应用程序使用相同的参数在100年的条件,规则... – 2014-12-02 09:01:52

+0

我真的很喜欢你使用自定义散列函数的方法。问题是你必须确保散列值(例如字符串“客户年龄”)在使用时(而不是“客户年龄”等)完全相同。 – 2014-12-02 09:07:01

+0

我担心名字,用户可以给任何参数下的内容,我想在哈希码计算中使用的条件,如参数值为18,可以命名为18或18或18等。 – 2014-12-02 09:14:12

1

我认为你不能避免写表达式的解析器,建立表达式的AST和代码重写规则来检测表达式的等价性。

它可能没有你想象的那么耗时。

对于解析和AST建筑的一部分,你可以从exp4j开始: http://www.objecthunter.net/exp4j/

对于重写规则,你可以看看:Strategies for simplifying math expressions

+0

我提到的完全相同,但或多或​​少会非常耗时,在任何给定的时间,我可以有1000规则,3-5K条件,..... – 2014-12-02 08:59:49

+0

“耗时”:你的意思是编码或运行? – 2014-12-02 09:05:32

+0

这两种情况下,我都无法给客户一些东西,需要时间去创造一些东西。 – 2014-12-02 09:12:56

1

为你应该分析一个100%安全的解决方案用计算机代数系统的表达式来看看是否有数学上的相等。但这并不容易。

一个务实的做法,可以是测试两个表达式是否类似

  • 检查它们是否具有相同的变量
  • 比较它们的输出为多个不同的输入,看是否输出相等

您可以将预定义输入集的变量列表和输出存储为表达式的“散列”。这个散列并不保证两个表达式是相等的,但是您可以向用户呈现具有相同散列表达式的表达式,询问这个新规则是否等于这些相似的一个。