2014-12-02 56 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%安全的解決方案用計算機代數系統的表達式來看看是否有數學上的相等。但這並不容易。

一個務實的做法,可以是測試兩個表達式是否類似

  • 檢查它們是否具有相同的變量
  • 比較它們的輸出爲多個不同的輸入,看是否輸出相等

您可以將預定義輸入集的變量列表和輸出存儲爲表達式的「散列」。這個散列並不保證兩個表達式是相等的,但是您可以向用戶呈現具有相同散列表達式的表達式,詢問這個新規則是否等於這些相似的一個。