Суммирование значений карты объекта дает мне ошибки - PullRequest
1 голос
/ 25 февраля 2012

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

Ошибка:

jesvin@Jesvin-Technovia:~/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 Ответ

1 голос
/ 25 февраля 2012

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

$total : num_attribute_map[$attribute]

Свяжите это с:

$total : num_attribute_map

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

sum( $total[$attribute] )

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

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