Java - Generi c Правило слюняв - PullRequest
0 голосов
/ 28 мая 2020

Я хотел бы создать свое правило в формате Generi c, что означает, что оно должно проверять поля и значения. Следуя моей структуре POJO.

 public class RulesModel
private String field;
private List<String> values;
// other stuff  

И мое правило

rule "sample"
when
    $rule : RulesModel( field == "source", values contains "facebook", values contains "youtube", value not contains "instagram" )  
then
    // actions
end  

Оно отлично работает для проверки одного поля, но я хочу проверить несколько полей RulesModel. Итак, я хочу создать POJO

public class RulesModelList {

    private List<RulesModel> ruleList;
    // Getter & Setter
}

Итак, теперь, когда я передаю список RulesModel с помощью класса RulesModelList, правило должно быть проверено, как показано ниже

$rule : RulesModel( field == "source", values contains "facebook") && $rule : RulesModel( field == "createdBy", values contains "admin")

Как проверить это в Слюни?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 31 мая 2020

Если все, что вы хотите сделать, это убедиться, что эти две (или три, или любое другое количество) RulesModel находятся в списке, это довольно просто: RulesModelList введите и назначьте $list. Затем я проверяю, существует ли экземпляр RulesModel, который соответствует моим критериям «источника», а затем тот, который соответствует критерию createdBy.

В примере я использовал exists() вместо присвоения переменной, потому что в моем примере правила не нужно использовать экземпляр RulesModel с правой стороны. Если вам do нужно что-то сделать с экземпляром RulesModel, просто замените exists() назначением вроде этого:

$source: RulesModel( field == "source", values contains "facebook") from $list
$createdBy: RulesModel( field == "createdBy", values contains "admin") from $list

Нет необходимости выполнять накопление, если только вы не пытается перебрать список и найти вещи, соответствующие определенным критериям. Например, предположим, что одно из значений «field» - «updatedBy», и может быть несколько экземпляров RulesModel с этим именем поля. Чтобы получить подмножество экземпляров RulesModel с именем поля «updatedBy», вы должны использовать накопление, как показал Михаил в своем ответе. 1014

0 голосов
/ 28 мая 2020

Вы можете анализировать набор элементов с помощью forAll и накапливать

RulesModelList($ruleList: ruleList)
$matchingList: List() from accumulate (
    $model: RulesModel(field == "source", values contains "facebook", values contains "youtube", value not contains "instagram") from $ruleList,
    accumulateList($model)
)
0 голосов
/ 28 мая 2020

Вы можете использовать java методы в блоке when, например CollectionUtils.intersection

import static org.apache.commons.collections4.CollectionUtils.intersection;
...
$rule : RulesModel( field == "source", !intersection(values, valuesToCheck).isEmpty())
...