Drools:从LHS模式中获取标识符

时间:2016-03-22 12:14:41

标签: drools

我正在使用Drools 6.3.0 Final。假设我有这样的规则

    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:id="@+id/map"

    tools:context=".MapsActivity"
    android:name="com.google.android.gms.maps.SupportMapFragment" 
    />

让我们进一步假设我使用此规则构建我的KieSession,添加一些事实,现在我想知道所有规则中使用的标识符/所有符合我事实的规则。

所以我想要的是$ person和$ child。

我知道我可以获得使用AgendaEventListener触发的规则,从事件中我可以得到规则的名称,以及$ person和$ child的对象。但我找不到从我的匹配中获取标识符$ person和$ child的方法。使用调试器我可以看到信息在那里......实际上我从事件中得到的规则是一个RuleImpl,它有一个lhsRoot,在其中我可以找到那些信息......但这听起来要比它应该复杂得多是和不是预期的方式。

所以我想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:2)

使用Drools'可以轻松实现您的要求。公共API。您正在查找正确的位置(AgendaEventListener),但Match.getObjects()不是您需要的。您需要的是Match.getDeclarationIds()(获取标识符列表)和Match.getDeclarationValue(String id)(获取每个标识符的值)的组合。例如,这是在控制台中记录此信息的AgendaEventListener的外观如下:

import org.kie.api.event.rule.BeforeMatchFiredEvent;
import org.kie.api.event.rule.DefaultAgendaEventListener;

...

ksession.addEventListener(new DefaultAgendaEventListener() {

    @Override
    public void beforeMatchFired(BeforeMatchFiredEvent event) {

        String ruleName = event.getMatch().getRule().getName();
        List<String> declarationIds = event.getMatch().getDeclarationIds();

        System.out.println("\n\n\tRule: "+ruleName);

        for (String declarationId : declarationIds) {
            Object declarationValue = event.getMatch().getDeclarationValue(declarationId);

            System.out.println("\t\tId: "+declarationId);
            System.out.println("\t\tValue: "+declarationValue);
        }
        System.out.println("\n\n");
    }
});

正如@laune所提到的,您还可以获得在规则的RHS中激活规则的匹配实例。在这种情况下,可以通过drools.getMatch()访问Match对象。

希望它有所帮助,