Как я могу получить динамическое свойство в слюни - PullRequest
2 голосов
/ 20 марта 2012

У меня есть XML-файл, содержащий метаданные, такие как максимальная длина поля.Я должен использовать слюни для создания правил, чтобы проверить эти метаданные по списку фактов.Я не хочу жестко задавать имя каждого поля, которое может или не может быть указано в XML.

Я пытался сделать это:

when
   $metadata: Metadata(maxLength != null);
   $obj: Object(eval($metadata.getFieldName()).length > $metadata.maxLength);
then
   // TODO
end

Это не работает, и яполучить следующую ошибку:

java.lang.IllegalStateException: Errors while building rules : Unable
to Analyse Expression $metadata.getFieldName() > $metadata.maxLength:
[Error: Comparison operation requires compatible types. Found class
java.lang.String and class java.lang.Integer] [Near : {...
$metadata.getFieldName() > $metadata.maxLength ....}]

Можно ли динамически получить имя поля и сравнить его максимальную длину?Должен ли я создать объект Java для этого?

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 марта 2012

Наконец, я решил сгенерировать мой файл drools динамически из моего XML, используя шаблоны правил.

0 голосов
/ 20 марта 2012

Вы говорите об XML и метаданных.Вы можете различить все сущности?Например, если речь идет о заказах, можете ли вы извлечь каждый заказ и атрибуты каждого заказа?

Я решил аналогичную проблему с помощью maps для хранения каждого атрибута.

public class Order{
    private int id;
    private Map<String, Integer> num_attribute_map = new HashMap<String, Integer>();
    public Map getNumAttributeMap(){
          return this.num_attribute_map;
    }

Если заказ имеет customer_satisfaction = 5,

order_obj.getNumAttributeMap().put("customer_satisfaction" , 5);

И, таким образом, вы создали Order с их атрибутами, хранящимися в numAttributeMap.


Для реализации правила для Order

$ord : Order(
             getNumAttributeMap[$attribute] >= $value
       )

, где $attribute будет, конечно, "customer_satisfaction".Обозначение [] используется для доступа к элементам списка, заданному индексу или значениям карты, заданному ключу.


Надеюсь, вы «поймете» понятия карт.Кроме того, поищите поддержку языка Drools для доступа к спискам и картам.

Я также реализовал карты списков строк для выполнения операции «включено», в дополнение к картам целых чисел, которые выполняют операции сравнения.Пожалуйста, обратитесь https://stackoverflow.com/a/9241089/604511 тоже

...