pextralabs / scene-platform

Rule-based platform for supporting of situation specification, detection and lifecycle control.
10 stars 3 forks source link

DSL for situation definition #4

Open pereirazc opened 7 years ago

pereirazc commented 7 years ago

A straightforward dialect for situation writing/designing to be transpiled at runtime into drl rules.

The so-famous Fever situation could be described like:

package br.ufes.lprm.scene.examples.fever

situation Fever
  when
    @febrile: Person(temperature > 37)
end

short-term downfalls:

pereirazc commented 7 years ago

The scene (.scn) code:

package br.ufes.lprm.scene.examples.fever

situation Fever
  when
    @febrile: Person(temperature > 37)

transpiles to drl code:

package br.ufes.lprm.scene.examples.fever

import ...

declare Fever extends SituationType
   febrile: Person @Role("febrile")
end
rule "Fever"
@role(situation)
@type(Fever)
  when
    $febrile: Person(temperature > 37)
  then
    SituationHelper.situationDetected(drools)
end
pereirazc commented 7 years ago

There's a way to add knowledge packages from strings into a kbuilder ResourceFactory.newByteArrayResource CommonTestMethodBase.java

PackageDescrBuilder packageBuilder = DescrFactory.newPackage();
packageBuilder
        .name("br.ufes.lprm.scene.examples.fever")
        .newDeclare().type()
            .name("Fever")
            .superType("SituationType")
                .newField("febrile")
                .type("Person")
                    .newAnnotation("Role").value("febrile")
                .end()
            .end()
        .end()
        .newRule().name("Fever")
            .newAnnotation("role").value("situation")
        .end()
            .newAnnotation("type").value("Fever")
        .end()
            .lhs()
                .pattern().id("$febrile", false)
                    .type("Person").constraint("temperature > 37")
                .end()
            .end()
            .rhs("SituationHelper.situationDetected(drools);")
        .end();

String rules = new DrlDumper().dump(packageBuilder.getDescr());
kbuilder.add(ResourceFactory.newByteArrayResource(rules.getBytes()), ResourceType.DRL);