* @throws IntrospectionException
* @throws InvalidRuleException
*/
private Rule getFindSeating() throws IntrospectionException,
InvalidRuleException {
final Rule rule = new Rule( "findSeating" );
// ---------------
// context : Context( state == Context.ASSIGN_SEATS )
// ---------------
final Pattern contextPattern = new Pattern( 0,
this.contextType,
"context" );
contextPattern.addConstraint( getLiteralConstraint( contextPattern,
"state",
Context.ASSIGN_SEATS ) );
rule.addPattern( contextPattern );
final Declaration contextDeclaration = rule.getDeclaration( "context" );
// -------------------------------
// Seating( seatingId:id, seatingPid:pid, pathDone == true
// seatingRightSeat:rightSeat seatingRightGuestName:rightGuestName )
// -------------------------------
final Pattern seatingPattern = new Pattern( 1,
this.seatingType );
setFieldDeclaration( seatingPattern,
"id",
"seatingId" );
setFieldDeclaration( seatingPattern,
"pid",
"seatingPid" );
seatingPattern.addConstraint( getLiteralConstraint( seatingPattern,
"pathDone",
true ) );
setFieldDeclaration( seatingPattern,
"rightSeat",
"seatingRightSeat" );
setFieldDeclaration( seatingPattern,
"rightGuestName",
"seatingRightGuestName" );
rule.addPattern( seatingPattern );
final Declaration seatingIdDeclaration = rule.getDeclaration( "seatingId" );
final Declaration seatingPidDeclaration = rule.getDeclaration( "seatingPid" );
final Declaration seatingRightGuestNameDeclaration = rule.getDeclaration( "seatingRightGuestName" );
final Declaration seatingRightSeatDeclaration = rule.getDeclaration( "seatingRightSeat" );
// --------------
// Guest( name == seatingRightGuestName, rightGuestSex:sex,
// rightGuestHobby:hobby )
// ---------------
final Pattern rightGuestPattern = new Pattern( 2,
this.guestType );
rightGuestPattern.addConstraint( getBoundVariableConstraint( rightGuestPattern,
"name",
seatingRightGuestNameDeclaration,
"==" ) );
setFieldDeclaration( rightGuestPattern,
"sex",
"rightGuestSex" );
setFieldDeclaration( rightGuestPattern,
"hobby",
"rightGuestHobby" );
rule.addPattern( rightGuestPattern );
final Declaration rightGuestSexDeclaration = rule.getDeclaration( "rightGuestSex" );
final Declaration rightGuestHobbyDeclaration = rule.getDeclaration( "rightGuestHobby" );
// ----------------
// Guest( leftGuestName:name , sex != rightGuestSex, hobby ==
// rightGuestHobby )
// ----------------
final Pattern leftGuestPattern = new Pattern( 3,
this.guestType );
setFieldDeclaration( leftGuestPattern,
"name",
"leftGuestName" );
leftGuestPattern.addConstraint( getBoundVariableConstraint( rightGuestPattern,
"hobby",
rightGuestHobbyDeclaration,
"==" ) );
leftGuestPattern.addConstraint( getBoundVariableConstraint( leftGuestPattern,
"sex",
rightGuestSexDeclaration,
"!=" ) );
rule.addPattern( leftGuestPattern );
final Declaration leftGuestNameDeclaration = rule.getDeclaration( "leftGuestName" );
// ---------------
// count : Count()
// ---------------
final Pattern count = new Pattern( 4,
this.countType,
"count" );
rule.addPattern( count );
final Declaration countDeclaration = rule.getDeclaration( "count" );
// --------------
// not ( Path( id == seatingId, guestName == leftGuestName) )
// --------------
final Pattern notPathPattern = new Pattern( 5,
this.pathType );
notPathPattern.addConstraint( getBoundVariableConstraint( notPathPattern,
"id",
seatingIdDeclaration,
"==" ) );
notPathPattern.addConstraint( getBoundVariableConstraint( notPathPattern,
"guestName",
leftGuestNameDeclaration,
"==" ) );
final GroupElement notPath = GroupElementFactory.newNotInstance();
notPath.addChild( notPathPattern );
rule.addPattern( notPath );
// ------------
// not ( Chosen( id == seatingId, guestName == leftGuestName, hobby ==
// rightGuestHobby ) )
// ------------
final Pattern notChosenPattern = new Pattern( 6,
this.chosenType );
notChosenPattern.addConstraint( getBoundVariableConstraint( notChosenPattern,
"id",
seatingIdDeclaration,
"==" ) );
notChosenPattern.addConstraint( getBoundVariableConstraint( notChosenPattern,
"guestName",
leftGuestNameDeclaration,
"==" ) );
notChosenPattern.addConstraint( getBoundVariableConstraint( notChosenPattern,
"hobby",
rightGuestHobbyDeclaration,
"==" ) );
final GroupElement notChosen = GroupElementFactory.newNotInstance();
notChosen.addChild( notChosenPattern );
rule.addPattern( notChosen );
// ------------
// int newSeat = rightSeat + 1;
// drools.assert( new Seating( coung.getValue(), rightSeat,
// rightSeatName, leftGuestName, newSeat, countValue, id, false );
// drools.assert( new Path( countValue, leftGuestName, newSeat );
// drools.assert( new Chosen( id, leftGuestName, rightGuestHobby ) );
//
// System.err.println( "seat " + rightSeat + " " + rightSeatName + " " +
// leftGuestName );
//
// count.setCount( countValue + 1 );
// context.setPath( Context.MAKE_PATH );
// ------------
final Consequence consequence = new Consequence() {
public void evaluate(KnowledgeHelper drools,
WorkingMemory workingMemory) throws ConsequenceException {
try {
// MemoryVisitor visitor = new MemoryVisitor( ( InternalWorkingMemory ) workingMemory );
// visitor.visit( workingMemory.getRuleBase() );
Rule rule = drools.getRule();
Tuple tuple = drools.getTuple();
Context context = (Context) drools.get( contextDeclaration );
Count count = (Count) drools.get( countDeclaration );
int seatId = seatingIdDeclaration.getExtractor().getIntValue( (InternalWorkingMemory) workingMemory,
tuple.get( seatingIdDeclaration ).getObject() );
int seatingRightSeat = seatingRightSeatDeclaration.getExtractor().getIntValue( (InternalWorkingMemory) workingMemory,
tuple.get( seatingRightSeatDeclaration ).getObject() );
String leftGuestName = (String) drools.get( leftGuestNameDeclaration );
String rightGuestName = (String) drools.get( seatingRightGuestNameDeclaration );
Hobby rightGuestHobby = (Hobby) drools.get( rightGuestHobbyDeclaration );
Seating seating = new Seating( count.getValue(),
seatId,
false,
seatingRightSeat,
rightGuestName,
seatingRightSeat + 1,
leftGuestName );
drools.insert( seating );
Path path = new Path( count.getValue(),
seatingRightSeat + 1,
leftGuestName );
drools.insert( path );
Chosen chosen = new Chosen( seatId,
leftGuestName,
rightGuestHobby );
drools.insert( chosen );
count.setValue( count.getValue() + 1 );
// if ( count.getValue() == 5 ) {
// drools.retractObject( tuple.getFactHandleForDeclaration( countDeclaration ) );
// } else {
// drools.update( tuple.getFactHandleForDeclaration( countDeclaration ),
// count );
// }
drools.update( tuple.get( countDeclaration ),
count );
context.setState( Context.MAKE_PATH );
drools.update( tuple.get( contextDeclaration ),
context );
System.err.println( "find seating : " + seating + " : " + path + " : " + chosen );
} catch ( Exception e ) {
e.printStackTrace();
throw new ConsequenceException( e );
}
}
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
}
public void writeExternal(ObjectOutput out) throws IOException {
}
public String getName() {
return "default";
}
};
rule.setConsequence( consequence );
return rule;
}