2012-01-05 50 views
0

我要創建一個CRUD頁面管理數值範圍的規則來確定的值應該去哪個類別中(對於值< 10,返回「小」,對值> = 10 & < 20,回 「中」,等等)。我需要這些規則存儲在MySQL和評估他們的Java(確定給定值的類別等)。我覺得我正在通過存儲開始/結束範圍值和開始/結束運算符(如VARCHAR)並使用一堆IF語句轉換爲Java條件等來重新發明輪子...如何存儲和評估表驅動範圍規則

這裏是我在考慮的表結構...

CREATE TABLE `category_range` (
    `category_name` varchar(36) NOT NULL, 
    `range_start_op` varchar(2), 
    `range_start_val` decimal(10,2), 
    `range_end_op` varchar(2), 
    `range_end_val` decimal(10,2)); 

--example values 
    'Small', null, null, '<', 10.0 
    'Medium', '>=', 10.0, '<', 20.0 
    'Large', '>=', 20, null, null 

然後在Java中,定義一些常量,運營商,然後做這個決定一場比賽...

if (operation.equals(OP_EQUAL)) { 
     return value == rangeValue; 
    } else if (operation.equals(OP_NOT_EQUAL)) { 
     return value != rangeValue; 
    } else if (operation.equals(OP_GREATER_THAN)) { 
     return value > rangeValue; 
    } else if (operation.equals(OP_GREATER_THAN_OR_EQUAL)) { 
     return value >= rangeValue; 
    } else if (operation.equals(OP_LESS_THAN)) { 
     return value < rangeValue; 
    } else if (operation.equals(OP_LESS_THAN_OR_EQUAL)) { 
     return value <= rangeValue; 
    } 

是否有一個圖案和/或圖書館,以幫助我更優雅地做到這一點?

更新:根據一些反饋,這裏是我看中了...輕微的妥協在靈活性方面,但更乾淨

CREATE TABLE `category_range` (
    `category_name` varchar(36) NOT NULL, 
    `min_value` decimal(10,2), 
    `max_value' decimal(10,2)); 

/** 
* determines if the specified value matches the given range 
* minValue is inclusive (value >= min) 
* maxValue is exclusive (value < max) 
* min/max both the same assumes exact value match 
* min/max both null assumes match all values 
* @param value 
* @return 
*/ 
public boolean doesValueMatchRange(double value) { 

    if (minValue == null && maxValue == null) { 
     return true; 
    } 
    else if (minValue == null) { 
     return value < maxValue; 
    } 
    else if (maxValue == null) { 
     return value >= minValue; 
    } 
    else if (minValue.equals(maxValue)) { 
     return value == minValue.doubleValue(); 
    } 
    else { 
     return (value > minValue) && (value <= maxValue); 
    } 
} 

回答

1

這似乎是大規模超殺什麼可以表達更多簡單地說是一個有界的範圍,你有一個從最低到最高的表格,從最高到最低匹配。定義截止參數,忘記其餘部分。例如:

label  min_size 
--------------------- 
small  0 
medium  10 
large  20 

因此,small將任何低於medium,並medium將任何低於large

+0

感謝tadman,但我確實需要不同的運營商(==,!=,> =,>,<,<=)用於其他類別/規則變化的靈活性... – 2012-01-05 21:00:05

+0

了基於你的建議的混合方法...謝謝 – 2012-01-06 18:35:54