2012-02-25 5 views
1

A SubjectTeacherPeriod имеет num_attribute_map, который представляет собой карту, которая отображает определенные атрибуты (например, «скучность») с их соответствующими оценками. Я использую следующий код, чтобы суммировать атрибуты (например, «скучность») в течение каждого дня недели.Суммирующие значения карты объекта дают мне ошибки

Но определенная строка вызывает ошибку.

rule "insertAttributeDayTotal" 
     //salience 1 // Do these rules first (optional, for performance) 
    when 
    $sum_regression_constraint : SumRegressionConstraint(
        $class : class_, 
        $attribute : attribute//, 
        //$weight : weight; 
        ) 
    $day_of_week : DayOfWeek() 
    $attribute_day_total : Number() from accumulate(
     SubjectTeacherPeriod(
      //period != null, 
       period.class_ == $class, 
      period.dayOfWeek == $day_of_week, 
       $total : num_attribute_map[$attribute] //PROBLEM LINE 
      ), 
      sum($total) 
     ) 

    then 
    //System.out.println("BUCKET TOTAL "+$id+" "+$bucket_total.intValue()); 
     insertLogical(new AttributeDaySum($class, $attribute, $day_of_week, $attribute_day_total.intValue())); 
end 

Ошибка:

[email protected]:~/dev/drools/timetabler$ java -server in.co.technovia.timetabler.TimeTableApp 
Exception in thread "main" java.lang.IllegalStateException: There are errors in the scoreDrl's: 
Variables can not be used inside bindings. Variable [$attribute] is being used in binding 'num_attribute_map[$attribute]' : [Rule name='insertAttributeDayTotal'] 

Rule Compilation error : [Rule name='insertAttributeDayTotal'] 
    in/co/technovia/timetabler/domain/Rule_insertAttributeDayTotal_bb39fd28b3c8457cb8d86fc15b34a0e7.java (7:905) : Syntax error on token "null", invalid Type 
    in/co/technovia/timetabler/domain/Rule_insertAttributeDayTotal_bb39fd28b3c8457cb8d86fc15b34a0e7.java (9:1050) : $total cannot be resolved 

SubjectTeacherPeriod имеет любопытную num_attribute_map, так что я могу определить атрибуты во время выполнения. Если бы мне нужен атрибут boringness (int) для SubjectTeacherPeriod, я могу сделать num_attribute_map.put("boringness",1) вместо добавления нового атрибута в SubjectTeacherPeriod.

A SumRegressionConstraint заботится о конкретном $attribute. Значение этого атрибута хранится в num_attribute_map от SubjectTeacherPeriod. Я хочу получить доступ к num_attribute_map[$attribute], но эта проблема возникает.

Что я делаю неправильно?


Есть ли другой способ заставить динамические атрибуты работать?

ответ

1

В настоящий момент вы не можете привязать переменную к выражениям, только к именам полей. Таким образом, вместо того, чтобы связывать его:

$total : num_attribute_map[$attribute] 

Bind ней:

$total : num_attribute_map 

Затем, вы можете использовать выражение функции. Если вы используете MVEL диалект:

sum($total[$attribute]) 

Или, если вы используете Java диалект:

sum($total.get($attribute)) 
+0

Пожалуйста уточюните: это просуммировать 'num_attribute_map [$ атрибут]' от ** отчетливого ** ' Объекты SubjectTeacherPeriod'? – aitchnyu

+0

Да, поведение такое же. Функция будет выполняться для каждого объекта SubjectTeacherPeriod, и вы можете написать любое выражение в нем. например: sum ($ x [$ y] + 2 * $ foo.bar). Просто случается, что обычно люди используют простое выражение, например sum ($ x). –