как я могу получить динамическое свойство в слюнях

У меня есть файл 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 для этого?

Спасибо


person Francis    schedule 19.03.2012    source источник


Ответы (2)


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

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

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.

person Jesvin Jose    schedule 20.03.2012
comment
Большое спасибо, я буду иметь в виду решение карты, к сожалению, оно не дает мне именно то, что мне нужно. - person Francis; 21.03.2012

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

person Francis    schedule 21.03.2012