2012-01-05 4 views
0

CRUDページを作成して、値の範囲を決定するための数値範囲ルールを管理する必要があります(値が<の場合は10、値が小さい場合は10を返します)。 & < 20、return "medium"など)。私はこれらのルールをMySQLに保存し、それらをJavaで評価する必要があります(特定の値のカテゴリを決定するなど)。私は、開始/終了範囲の値と開始/終了の演算子(VARCHARとして)を格納し、Javaの条件文などに変換するIF文の束を使用してホイールを再作成しているように感じます。テーブルドリブンレンジルールを保存して評価する方法

ここにあります私は...

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; 
    } 

はパターンがあり、および/私はこれをよりエレガントにするのに役立つライブラリですか?

UPDATE:いくつかのフィードバックをもとに、ここで私は、柔軟性の面で...上のわずかな妥協点を解決したものですが、非常にきれいで、大規模な過剰殺すより表現することができるもののために思わ

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 

したがって、smallmedium未満のものだろう、とmediumlarge未満のものだろう。

+0

tadmanに感謝しますが、他のカテゴリ/ルールのバリエーションには異なる演算子(==、!=、> =、>、<、<=)の柔軟性が必要です... –

+0

は、 ...どうも –

関連する問題