Type Declaration

语法

drools reference typeDeclaration.png
Figure 1. meta_data
drools reference typeDeclaration 2.png
Figure 2. Type Declaration
Note
类型声明主要有两个目的:声明一个新类型,声明元数据

声明新类型示例

testDeclareNewTypes.drl
package org.drools.examples.newTypes;

import java.util.Date

global java.util.List myGlobalList;

declare Address
  number : int
  streetName : String
  city : String
end

declare Person
  name : String
  dateOfBirth : Date
  address : Address
end

declare enum DaysOfWeek
  SUN,MON,TUE,WED,THU,FRI,SAT;
end

declare Employee
  name : String
  dayOff : DaysOfWeek
end

rule "Declaing new Types"
  when
    eval(true)
  then
    Address address = new Address();
    address.setNumber(100);
    address.setStreetName("Bing He Road");
    address.setCity("LanZhou");
    Person person = new Person();
    person.setName("Bob");
    person.setAddress(address);
    myGlobalList.add(address);
    insert(person);
end

rule "Using a declared Type"
  when
    $p : Person( name == "Bob" )
  then
    myGlobalList.add($p);
    Employee employee = new Employee();
    employee.setName("Mr Yung");
    employee.setDayOff(DaysOfWeek.WED);
    insert(employee);
end

rule "Using a declared Enum"
  when
    $e : Employee( dayOff == DaysOfWeek.WED )
  then
    myGlobalList.add($e);
end
Example_DeclaringNewTypes.java
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules-newTypes");
List<Object> list = new ArrayList<>();
kSession.setGlobal( "myGlobalList", list );
kSession.fireAllRules();
kSession.dispose();
list.forEach(obj -> System.out.println("class: " + obj.getClass() + ", value: " + obj));

元数据表

类型 Level

@role( <fact / event> )

Class

@typesafe( <boolean> )

Class

@timestamp( <attribute name> )

Class

@duration( <attribute name> )

Class

@expires( <time interval> )

Class

@propertyChangeSupport

Class

@propertyReactive

Class

@key

Attribute

@position

Attribute

元数据声明示例

testMetadata.drl
package org.drools.examples.metadata;

import java.util.Date
import org.drools.examples.model.Customer;

declare Address
  @author( Kylin )
  @dateOfCreation( 23-Oct-2017 )

  number : int @key @position(0)
  streetName : String @key @position(1)
  city : String @key @position(2)
end

declare Person
  @author( Kylin )
  @dateOfCreation( 23-Oct-2017 )

  name : String @key @maxLength( 30 ) @position(0)
  dateOfBirth : Date @key @position(1)
  address : Address
end

declare Customer
  @author( Kylin )
  @dateOfCreation( 23-Oct-2017 )
end

declare GoldenCustomer extends Customer
  @author( Kylin )
  @dateOfCreation( 23-Oct-2017 )

  priority : int
end

rule "Declaring Metadata"
  when
    eval(true)
  then
    Person person = new Person("Bob", new Date());
    Customer customer = new Customer();
    System.out.println(person);
    System.out.println(customer);
end

rule "Accessing Declared Types from the Application Code"
  when
    $c : GoldenCustomer(id == 101)
  then
    System.out.println($c);
end
Example_Metadata.java
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieBase kbase = kContainer.getKieBase("rules-metadata");
KieSession kSession = kbase.newKieSession();

FactType factType = kbase.getFactType("org.drools.examples.metadata", "GoldenCustomer");
Object obj = factType.newInstance();
factType.set(obj, "id", 101);
factType.set(obj, "name", "Bob");
factType.set(obj, "discription", "this is a discription");
factType.set(obj, "priority", 1);
kSession.insert(obj);

kSession.fireAllRules();
kSession.dispose();

results matching ""

    No results matching ""