2015-07-08 3 views
1

Я использую Drools 5.5.0, и у меня есть таблица решений, показано ниже:Drools - Как проверить факт существует в таблице решений

Example Drools Decision Table

Когда я запускаю двигатель правил, Я только когда-либо вставляю один SecurityContext и один раз JSONWrapper за раз.

Основываясь только на этой таблице, ни одно из моих правил никогда не срабатывает (однако все они оцениваются). Я считаю, что это потому, что для второго условия ячейки пусты для каждой роли/правила.

Это то, что я пытаюсь идти, в DRL:

package com.acme.security.rules.widget; 

import com.acme.test.RuleTableTest.SecurityContext; 
import com.acme.test.RuleTableTest.JSONWrapper; 

rule "widget_accessibility_store_manager" 
    when 
    $sc : SecurityContext() 
    $output : JSONWrapper() 
    eval($sc.hasRole("Store Manager")) 
    then 
    $output.setFeatureVisibility("feature1", "yes"); 
    $output.setFeatureVisibility("feature2", "yes"); 
    $output.setFeatureVisibility("feature3", "yes"); 
    $output.setFeatureVisibility("feature4", "yes"); 
    $output.setFeatureVisibility("feature5", "yes"); 
end 

Это правило срабатывает только штрафом.

Как у меня есть условие в моей таблице решений, которое проверяет наличие объекта без каких-либо ограничений? (Как и в моем DRL) Мне нужен этот объект, поэтому я могу использовать его в качестве вывода в операторах действий. Я также пытаюсь оставить ячейки для каждого правила в столбце пустым для простоты.

ответ

2

Было бы удобнее создать «выходной объект» справа и сбоку, и вы можете вставить его или передать его в глобальную коллекцию.

Несколько надуманный обходной путь для включения условия для простого присутствия факта выглядит следующим образом:

CONDITION 
$output : JSONWrapper 
/*$param*/ 
mark below to force inclusion 
x 

Обратите внимание, что вы можете присоединиться ячейки по вертикали.

+0

Это настолько глупо, что у Drools не было бы этого встроенного в более очевидный способ сделать что-то в таблице решений, что так легко сделать в DRL. Тем не менее, я думаю, что ваше решение стало более идеальным благодаря тому, что в моей ячейке описания я использую формулировку «Mark ниже, чтобы принудительно включить», чтобы было очевидно, что если ничего не существует, правило не будет уволено. Хорошая мысль. –

0

Я знаю, что на данный момент слишком поздно для оригинального плаката, но столкнувшись с аналогичной проблемой, я решил искать значение в этом объекте, которое наверняка не будет равным нулю. Например:

rule "widget_accessibility_store_manager" 
when 
    $sc : SecurityContext(role != null) 
    $output : JSONWrapper(featureVisibility!=null) 
    eval($sc.hasRole("Store Manager")) 

then 
    $output.setFeatureVisibility("feature1", "yes"); 
    $output.setFeatureVisibility("feature2", "yes"); 
    $output.setFeatureVisibility("feature3", "yes"); 
    $output.setFeatureVisibility("feature4", "yes"); 
    $output.setFeatureVisibility("feature5", "yes"); 
end 

и тогда ваш Excel файл будет выглядеть вроде этого:

enter image description here

Если у вас нет обязательных параметров на этих объектах, вы можете даже быть в состоянии пропустить внутренний параметр и проверьте, не является ли SecurityContext и его значением null. В качестве альтернативы вы можете проверить наличие «SecurityContext».