Author: tirelli Date: 2006-05-20 17:21:11 -0400 (Sat, 20 May 2006) New Revision: 4333 Added: labs/jbossrules/trunk/drools-core/src/test/resources/manners128.dat Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleBaseImpl.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/WorkingMemoryImpl.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Chosen.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Context.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Count.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Guest.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Hobby.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/LastSeat.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Path.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Seating.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Sex.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CrossProductTest.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java Log: Fixing JBRULES-233 and JBRULES-266: * Adding RuleBaseConfiguration object * Making working memory assert configurable * Centralizing indexing and hashing configurations Also: * improving manners test classes Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java 2006-05-20 21:21:11 UTC (rev 4333) @@ -16,58 +16,163 @@ package org.drools; -import java.util.Properties; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; /** * RuleBaseConfiguration - * A class to store RuleBase related configuration * - * IMPORTANT NOTE: This API is under review and may change in the future. + * A class to store RuleBase related configuration. It must be used at rule base instantiation time + * or not used at all. + * This class will automatically load default values from system properties, so if you want to set + * a default configuration value for all your new rule bases, you can simply set the property as + * a System property. + * + * After RuleBase is created, it makes the configuration immutable and there is no way to make it + * mutable again. This is to avoid inconsistent behavior inside rulebase. + * + * NOTE: This API is under review and may change in the future. * * Created: 16/05/2006 * @author <a href="mailto:ti...@po...">Edson Tirelli</a> * * @version $Id$ */ -public class RuleBaseConfiguration extends Properties { +public class RuleBaseConfiguration implements Serializable { + private Map properties; + + private boolean immutable; + /** * Property to enable/disable left beta memory indexing * Defaults to false */ public static final String PROPERTY_INDEX_LEFT_BETA_MEMORY = "org.drools.reteoo.beta.index-left"; + /** * Property to enable/disable right beta memory indexing * Defaults to true */ public static final String PROPERTY_INDEX_RIGHT_BETA_MEMORY = "org.drools.reteoo.beta.index-right"; + /** * Property to enable/disable alpha node hashing inside object type nodes * Defaults to true */ public static final String PROPERTY_HASH_OBJECT_TYPE_NODES = "org.drools.reteoo.alpha.hash-type-node"; + /** * Property to enable/disable alpha node hashing inside alpha nodes * Defaults to false */ public static final String PROPERTY_HASH_ALPHA_NODES = "org.drools.reteoo.alpha.hash-alpha-node"; + + /** + * Property to define working memory assert behavior. Valid values are "identity" or "equals". + * Defaults to identity + */ + public static final String PROPERTY_ASSERT_BEHAVIOR = "org.drools.wm.assert-behavior"; + + /** + * Property to define working memory logical assert behavior. Valid values are "identity" or "equals". + * + * IMPORTANT NODE: if you set LOGICAL_ASSERT_BEHAVIOR to IDENTITY, then ASSERT_BEHAVIOR will be + * automatically set to IDENTITY also, as it is not possible to have ASSERT_BEHAVIOR EQUALS and + * LOGICAL_ASSERT_BEHAVIOR IDENTITY. + * + * Defaults to equals + */ + public static final String PROPERTY_LOGICAL_ASSERT_BEHAVIOR = "org.drools.wm.logical-assert-behavior"; + + public static final String WM_BEHAVIOR_IDENTITY = "identity"; + public static final String WM_BEHAVIOR_EQUALS = "equals"; // a generated serial version id private static final long serialVersionUID = 2989084670778336973L; public RuleBaseConfiguration() { + this.properties = new HashMap(); + this.immutable = false; + // default values - this.setProperty( PROPERTY_INDEX_LEFT_BETA_MEMORY, + this.properties.put( PROPERTY_INDEX_LEFT_BETA_MEMORY, System.getProperty( PROPERTY_INDEX_LEFT_BETA_MEMORY, "false" ) ); - this.setProperty( PROPERTY_INDEX_RIGHT_BETA_MEMORY, + this.properties.put( PROPERTY_INDEX_RIGHT_BETA_MEMORY, System.getProperty( PROPERTY_INDEX_RIGHT_BETA_MEMORY, "true" ) ); - this.setProperty( PROPERTY_HASH_OBJECT_TYPE_NODES, + this.properties.put( PROPERTY_HASH_OBJECT_TYPE_NODES, System.getProperty( PROPERTY_HASH_OBJECT_TYPE_NODES, "true" ) ); - this.setProperty( PROPERTY_HASH_ALPHA_NODES, + this.properties.put( PROPERTY_HASH_ALPHA_NODES, System.getProperty( PROPERTY_HASH_ALPHA_NODES, "false" ) ); + this.properties.put( PROPERTY_ASSERT_BEHAVIOR, + System.getProperty( PROPERTY_ASSERT_BEHAVIOR, WM_BEHAVIOR_IDENTITY) ); + if (WM_BEHAVIOR_IDENTITY.equals( this.properties.get( PROPERTY_ASSERT_BEHAVIOR ) ) ) { + // if assert behavior is IDENTITY, logical assert can be either EQUALS or IDENTITY + this.properties.put( PROPERTY_LOGICAL_ASSERT_BEHAVIOR, + System.getProperty( PROPERTY_LOGICAL_ASSERT_BEHAVIOR, WM_BEHAVIOR_EQUALS ) ); + } else { + // if assert behavior is EQUALS, logical assert must also be EQUALS + this.properties.put( PROPERTY_LOGICAL_ASSERT_BEHAVIOR, + WM_BEHAVIOR_EQUALS); + } } - public boolean getBooleanProperty(String prop) { + /** + * Returns the current value for the given property or null if it is not set + * @param prop + * @return + */ + public String getProperty( String prop ) { + return (String) this.properties.get( prop ); + } + + /** + * Convenience method that calls get() method and returns a boolean for the + * given property. + * + * @param prop + * @return + */ + public boolean getBooleanProperty( String prop ) { return Boolean.valueOf( prop ).booleanValue(); } + /** + * Sets the value of the given property + * + * @param prop + * @param value + */ + public void setProperty(String prop, String value) { + if( ! this.immutable ) { + // if setting logical assert behavior to identity then + // assert behavior is also set to identity + if( PROPERTY_LOGICAL_ASSERT_BEHAVIOR.equals( prop ) && + WM_BEHAVIOR_IDENTITY.equals( value ) ) { + this.properties.put( PROPERTY_ASSERT_BEHAVIOR, + WM_BEHAVIOR_IDENTITY); + } + this.properties.put( prop, value ); + } else { + throw new UnsupportedOperationException("Can't set a property after configuration becomes immutable"); + } + } + + /** + * Makes the configuration object immutable. Once it becomes immutable, + * there is no way to make it mutable again. + * This is done to keep consistency. + */ + public void makeImmutable() { + this.immutable = true; + } + + /** + * Returns true if this configuration object is immutable or false otherwise. + * @return + */ + public boolean isImmutable() { + return this.immutable; + } + } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleBaseImpl.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleBaseImpl.java 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleBaseImpl.java 2006-05-20 21:21:11 UTC (rev 4333) @@ -21,7 +21,6 @@ import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; -import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.util.HashMap; @@ -41,7 +40,6 @@ import org.drools.WorkingMemory; import org.drools.common.ObjectInputStreamWithLoader; import org.drools.common.PropagationContextImpl; -import org.drools.reteoo.beta.BetaMemoryFactory; import org.drools.rule.CompositePackageClassLoader; import org.drools.rule.InvalidPatternException; import org.drools.rule.Package; @@ -129,6 +127,8 @@ */ public RuleBaseImpl(RuleBaseConfiguration config, FactHandleFactory factHandleFactory) { this.config = ( config != null ) ? config : new RuleBaseConfiguration(); + this.config.makeImmutable(); + ObjectTypeResolver resolver = new ClassObjectTypeResolver(); this.rete = new Rete( resolver ); this.reteooBuilder = new ReteooBuilder( this, Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/WorkingMemoryImpl.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/WorkingMemoryImpl.java 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/WorkingMemoryImpl.java 2006-05-20 21:21:11 UTC (rev 4333) @@ -35,6 +35,7 @@ import org.drools.NoSuchFactObjectException; import org.drools.QueryResults; import org.drools.RuleBase; +import org.drools.RuleBaseConfiguration; import org.drools.WorkingMemory; import org.drools.base.DroolsQuery; import org.drools.common.Agenda; @@ -97,8 +98,8 @@ // 8 ); /** Object-to-handle mapping. */ - private final Map identityMap = new IdentityMap(); - private final Map equalsMap = new HashMap(); + private final Map assertMap; + private final Map logicalAssertMap; private final PrimitiveLongMap justified = new PrimitiveLongMap( 8, 32 ); @@ -131,7 +132,7 @@ private boolean firing; private long propagationIdCounter; - + private List factQueue = new ArrayList(); // ------------------------------------------------------------ @@ -148,6 +149,20 @@ this.ruleBase = ruleBase; this.agenda = new Agenda( this ); this.handleFactory = this.ruleBase.newFactHandleFactory(); + RuleBaseConfiguration conf = this.ruleBase.getConfiguration(); + + if ( RuleBaseConfiguration.WM_BEHAVIOR_EQUALS.equals( conf.getProperty( RuleBaseConfiguration.PROPERTY_ASSERT_BEHAVIOR ) ) ) { + this.assertMap = new HashMap(); + } else { + this.assertMap = new IdentityMap(); + } + + if ( RuleBaseConfiguration.WM_BEHAVIOR_IDENTITY.equals( conf.getProperty( RuleBaseConfiguration.PROPERTY_LOGICAL_ASSERT_BEHAVIOR ) ) ) { + this.logicalAssertMap = new IdentityMap(); + } else { + this.logicalAssertMap = new HashMap(); + } + } // ------------------------------------------------------------ @@ -202,7 +217,7 @@ * @see WorkingMemory */ public void setGlobal(String name, - Object value) { + Object value) { // Make sure the global has been declared in the RuleBase Map globalDefintions = this.ruleBase.getGlobals(); Class type = (Class) globalDefintions.get( name ); @@ -241,13 +256,13 @@ public void clearAgenda() { this.agenda.clearAgenda(); } - + /** * Clear the Agenda Group */ public void clearAgendaGroup(String group) { - this.agenda.clearAgendaGroup(group); - } + this.agenda.clearAgendaGroup( group ); + } /** * @see WorkingMemory @@ -303,7 +318,7 @@ * @see WorkingMemory */ public FactHandle getFactHandle(Object object) { - FactHandle factHandle = (FactHandle) this.identityMap.get( object ); + FactHandle factHandle = (FactHandle) this.assertMap.get( object ); if ( factHandle == null ) { throw new NoSuchFactHandleException( object ); @@ -313,7 +328,7 @@ } public List getFactHandles() { - return new ArrayList( this.identityMap.values() ); + return new ArrayList( this.assertMap.values() ); } /** @@ -324,19 +339,19 @@ * @return */ Map getFactHandleMap() { - return Collections.unmodifiableMap( this.identityMap ); + return Collections.unmodifiableMap( this.assertMap ); } /** * @see WorkingMemory */ public List getObjects() { - return new ArrayList( this.identityMap.keySet() ); + return new ArrayList( this.assertMap.keySet() ); } public List getObjects(Class objectClass) { List matching = new java.util.LinkedList(); - for ( Iterator objIter = this.identityMap.keySet().iterator(); objIter.hasNext(); ) { + for ( Iterator objIter = this.assertMap.keySet().iterator(); objIter.hasNext(); ) { Object obj = objIter.next(); if ( objectClass.isInstance( obj ) ) { @@ -391,7 +406,7 @@ * @see WorkingMemory */ public boolean containsObject(FactHandle handle) { - return this.identityMap.containsKey( getObject( handle ) ); + return this.assertMap.containsKey( getObject( handle ) ); } /** @@ -444,10 +459,10 @@ try { // check if the object already exists in the WM - handle = (FactHandleImpl) this.identityMap.get( object ); + handle = (FactHandleImpl) this.assertMap.get( object ); // lets see if the object is already logical asserted - FactStatus logicalState = (FactStatus) this.equalsMap.get( object ); + FactStatus logicalState = (FactStatus) this.logicalAssertMap.get( object ); if ( logicalState == null ) { logicalState = STATUS_NEW; } @@ -475,10 +490,13 @@ // If this stated assertion already has justifications then we need // to cancel them if ( logicalState.getStatus() == WorkingMemoryImpl.JUSTIFIED ) { - handle = logicalState.getHandle(); - removeLogicalDependencies( handle ); + FactHandleImpl handle2 = logicalState.getHandle(); + removeLogicalDependencies( handle2 ); + if( handle == null) { + handle = handle2; + } } else { - handle = (FactHandleImpl) newFactHandle(); + handle = (handle == null) ? (FactHandleImpl) newFactHandle() : handle; } putObject( handle, @@ -489,7 +507,7 @@ logicalState.setStatus( WorkingMemoryImpl.STATED ); logicalState.incCounter(); } else { - this.equalsMap.put( object, + this.logicalAssertMap.put( object, new FactStatus( WorkingMemoryImpl.STATED, 1 ) ); } @@ -508,7 +526,7 @@ putObject( handle, object ); - this.equalsMap.put( object, + this.logicalAssertMap.put( object, new FactStatus( WorkingMemoryImpl.JUSTIFIED, handle ) ); } @@ -533,10 +551,10 @@ this.workingMemoryEventSupport.fireObjectAsserted( propagationContext, handle, object ); - + if ( !this.factQueue.isEmpty() ) { propagateQueuedActions(); - } + } } finally { this.lock.unlock(); } @@ -608,7 +626,7 @@ // Object oldValue = this.objects.put( ((FactHandleImpl) handle).getId(), // object ); - this.identityMap.put( object, + this.assertMap.put( object, handle ); ((FactHandleImpl) handle).setObject( object ); @@ -619,7 +637,7 @@ //Object object = this.objects.remove( ((FactHandleImpl) handle).getId() ); Object object = getObject( handle ); - this.identityMap.remove( object ); + this.assertMap.remove( object ); return object; } @@ -662,11 +680,11 @@ } if ( removeLogical || updateEqualsMap ) { - FactStatus status = (FactStatus) this.equalsMap.get( oldObject ); + FactStatus status = (FactStatus) this.logicalAssertMap.get( oldObject ); if ( status != null ) { status.decCounter(); if ( status.getCounter() <= 0 ) { - this.equalsMap.remove( oldObject ); + this.logicalAssertMap.remove( oldObject ); } } } @@ -678,7 +696,7 @@ oldObject ); ((FactHandleImpl) handle).invalidate(); - + if ( !this.factQueue.isEmpty() ) { propagateQueuedActions(); } @@ -718,8 +736,8 @@ /* check to see if this is a logically asserted object */ FactHandleImpl handleImpl = (FactHandleImpl) handle; if ( this.justified.get( handleImpl.getId() ) != null ) { - this.equalsMap.remove( originalObject ); - this.equalsMap.put( object, + this.logicalAssertMap.remove( originalObject ); + this.logicalAssertMap.put( object, new FactStatus( WorkingMemoryImpl.JUSTIFIED, handleImpl ) ); } @@ -748,7 +766,7 @@ handle, originalObject, object ); - + if ( !this.factQueue.isEmpty() ) { propagateQueuedActions(); } @@ -756,15 +774,14 @@ this.lock.unlock(); } } - + void propagateQueuedActions() { for ( Iterator it = this.factQueue.iterator(); it.hasNext(); ) { WorkingMemoryAction action = (WorkingMemoryAction) it.next(); it.remove(); action.propagate(); } - - + } /** @@ -894,20 +911,20 @@ public Lock getLock() { return this.lock; } - + private interface WorkingMemoryAction { public void propagate(); } - - private class WorkingMemoryRetractAction implements WorkingMemoryAction { + + private class WorkingMemoryRetractAction + implements + WorkingMemoryAction { private InternalFactHandle factHandle; - private boolean removeLogical; - private boolean updateEqualsMap; - private Rule ruleOrigin; - private Activation activationOrigin; - - - + private boolean removeLogical; + private boolean updateEqualsMap; + private Rule ruleOrigin; + private Activation activationOrigin; + public WorkingMemoryRetractAction(InternalFactHandle factHandle, boolean removeLogical, boolean updateEqualsMap, Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Chosen.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Chosen.java 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Chosen.java 2006-05-20 21:21:11 UTC (rev 4333) @@ -1,4 +1,3 @@ -package org.drools.examples.manners; /* * Copyright 2005 JBoss Inc * @@ -14,11 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.drools.examples.manners; - - - - import java.io.Serializable; public final class Chosen Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Context.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Context.java 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Context.java 2006-05-20 21:21:11 UTC (rev 4333) @@ -1,4 +1,3 @@ -package org.drools.examples.manners; /* * Copyright 2005 JBoss Inc * @@ -14,11 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.drools.examples.manners; - - - - import java.io.Serializable; public final class Context Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Count.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Count.java 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Count.java 2006-05-20 21:21:11 UTC (rev 4333) @@ -1,4 +1,3 @@ -package org.drools.examples.manners; /* * Copyright 2005 JBoss Inc * @@ -14,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.drools.examples.manners; - - public final class Count { private int value; Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Guest.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Guest.java 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Guest.java 2006-05-20 21:21:11 UTC (rev 4333) @@ -1,4 +1,3 @@ -package org.drools.examples.manners; /* * Copyright 2005 JBoss Inc * @@ -14,11 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.drools.examples.manners; - - - - import java.io.Serializable; public final class Guest Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Hobby.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Hobby.java 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Hobby.java 2006-05-20 21:21:11 UTC (rev 4333) @@ -1,4 +1,3 @@ -package org.drools.examples.manners; /* * Copyright 2005 JBoss Inc * @@ -14,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.drools.examples.manners; - - public class Hobby { public static final String stringH1 = "h1"; public static final String stringH2 = "h2"; Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/LastSeat.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/LastSeat.java 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/LastSeat.java 2006-05-20 21:21:11 UTC (rev 4333) @@ -1,4 +1,3 @@ -package org.drools.examples.manners; /* * Copyright 2005 JBoss Inc * @@ -14,11 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.drools.examples.manners; - - - - import java.io.Serializable; public final class LastSeat Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Path.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Path.java 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Path.java 2006-05-20 21:21:11 UTC (rev 4333) @@ -1,4 +1,3 @@ -package org.drools.examples.manners; /* * Copyright 2005 JBoss Inc * @@ -14,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.drools.examples.manners; - - public final class Path { private final int id; private final String guestName; Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Seating.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Seating.java 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Seating.java 2006-05-20 21:21:11 UTC (rev 4333) @@ -1,4 +1,3 @@ -package org.drools.examples.manners; /* * Copyright 2005 JBoss Inc * @@ -14,11 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.drools.examples.manners; - - - - import java.io.Serializable; public final class Seating Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Sex.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Sex.java 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Sex.java 2006-05-20 21:21:11 UTC (rev 4333) @@ -1,4 +1,3 @@ -package org.drools.examples.manners; /* * Copyright 2005 JBoss Inc * @@ -14,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.drools.examples.manners; - - public final class Sex { public static final Sex M = new Sex( 0 ); public static final Sex F = new Sex( 1 ); Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CrossProductTest.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CrossProductTest.java 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CrossProductTest.java 2006-05-20 21:21:11 UTC (rev 4333) @@ -37,23 +37,23 @@ public class CrossProductTest extends TestCase { public void test1() throws Exception { - ObjectType list1ObjectType = new ClassObjectType( List.class ); - ObjectType list2ObjectType = new ClassObjectType( List.class ); + ObjectType list1ObjectType = new ClassObjectType( String.class ); + ObjectType list2ObjectType = new ClassObjectType( String.class ); Rule rule = new Rule( "rule-1" ); Column list1Column = new Column( 0, list1ObjectType, - "list1" ); + "s1" ); Column list2Column = new Column( 1, list2ObjectType, - "list2" ); + "s2" ); rule.addPattern( list1Column ); rule.addPattern( list2Column ); - final Declaration list1Declaration = rule.getDeclaration( "list1" ); - final Declaration list2Declaration = rule.getDeclaration( "list2" ); + final Declaration s1Declaration = rule.getDeclaration( "s1" ); + final Declaration s2Declaration = rule.getDeclaration( "s2" ); final List values = new ArrayList(); @@ -61,9 +61,9 @@ public void evaluate(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory) throws Exception { - List list1 = (List) knowledgeHelper.get( list1Declaration ); - List list2 = (List) knowledgeHelper.get( list2Declaration ); - values.add( new List[]{list1, list2} ); + String s1 = (String) knowledgeHelper.get( s1Declaration ); + String s2 = (String) knowledgeHelper.get( s2Declaration ); + values.add( new String[]{s1, s2} ); } } ); @@ -75,10 +75,10 @@ ruleBase.addPackage( pkg ); WorkingMemory workingMemory = ruleBase.newWorkingMemory(); - workingMemory.assertObject( new ArrayList() ); - workingMemory.assertObject( new ArrayList() ); - workingMemory.assertObject( new LinkedList() ); - workingMemory.assertObject( new LinkedList() ); + workingMemory.assertObject( "F1" ); + workingMemory.assertObject( "F2" ); + workingMemory.assertObject( "F3" ); + workingMemory.assertObject( "F4" ); workingMemory.fireAllRules(); Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java 2006-05-20 21:21:11 UTC (rev 4333) @@ -1,4 +1,5 @@ package org.drools.reteoo; + /* * Copyright 2005 JBoss Inc * @@ -15,12 +16,11 @@ * limitations under the License. */ - - import org.drools.DroolsTestCase; import org.drools.FactException; import org.drools.FactHandle; import org.drools.RuleBase; +import org.drools.RuleBaseConfiguration; import org.drools.WorkingMemory; import org.drools.base.ClassObjectType; import org.drools.common.Agenda; @@ -84,7 +84,7 @@ node.retractTuple( tuple1, context1, workingMemory ); - + workingMemory.propagateQueuedActions(); assertLength( 1, @@ -112,7 +112,7 @@ node.retractTuple( tuple1, context1, workingMemory ); - + workingMemory.propagateQueuedActions(); assertLength( 2, @@ -181,14 +181,36 @@ rule1, tuple1.getActivation() ); - assertSame( logicalHandle1, - logicalHandle2 ); + // If logical assert behavior in working memory is EQUALS, + // it must return the same handle + if ( RuleBaseConfiguration.WM_BEHAVIOR_EQUALS.equals( + ((RuleBaseImpl) ruleBase).getConfiguration().getProperty( + RuleBaseConfiguration.PROPERTY_LOGICAL_ASSERT_BEHAVIOR) ) ) { + assertSame( logicalHandle1, + logicalHandle2 ); + } else { + // otherwise, it must not return the same handle + assertNotSame( logicalHandle1, + logicalHandle2 ); + } // little sanity check using normal assert logicalHandle1 = workingMemory.assertObject( logicalString1 ); logicalHandle2 = workingMemory.assertObject( logicalString2 ); - assertNotSame( logicalHandle1, - logicalHandle2 ); + + // If assert behavior in working memory is IDENTITY, + // returned handles must not be the same + if ( RuleBaseConfiguration.WM_BEHAVIOR_IDENTITY.equals( + ((RuleBaseImpl) ruleBase).getConfiguration().getProperty( + RuleBaseConfiguration.PROPERTY_ASSERT_BEHAVIOR ) ) ) { + + assertNotSame( logicalHandle1, + logicalHandle2 ); + } else { + // in case behavior is EQUALS, handles should be the same + assertSame( logicalHandle1, + logicalHandle2 ); + } } /** @@ -255,10 +277,19 @@ assertLength( 0, sink.getRetracted() ); - // Should keep the same handle when overriding - assertSame( logicalHandle1, - logicalHandle2 ); + // If logical assert behavior in working memory is IDENTITY, + // returned handles must not be the same + if ( RuleBaseConfiguration.WM_BEHAVIOR_IDENTITY.equals( + ((RuleBaseImpl) ruleBase).getConfiguration().getProperty( + RuleBaseConfiguration.PROPERTY_LOGICAL_ASSERT_BEHAVIOR ) ) ) { + assertNotSame( logicalHandle2, + logicalHandle1 ); + } else { + assertSame( logicalHandle2, + logicalHandle1 ); + } + // so while new STATED assertion is equal assertEquals( logicalString1, workingMemory.getObject( logicalHandle2 ) ); @@ -282,10 +313,19 @@ true, rule1, tuple1.getActivation() ); - // Already an equals object but not identity same, so will do nothing - // and return null - assertNull( logicalHandle1 ); + // If logical assert behavior in working memory is IDENTITY, + // must return a handle + if ( RuleBaseConfiguration.WM_BEHAVIOR_IDENTITY.equals( + ((RuleBaseImpl) ruleBase).getConfiguration().getProperty( + RuleBaseConfiguration.PROPERTY_LOGICAL_ASSERT_BEHAVIOR ) ) ) { + + assertNotNull( logicalHandle1 ); + } else { + assertNull( logicalHandle1 ); + } + + // Alreyad identify same so return previously assigned handle logicalHandle1 = workingMemory.assertObject( logicalString2, false, @@ -293,6 +333,7 @@ rule1, tuple1.getActivation() ); // return the matched handle + assertSame( logicalHandle2, logicalHandle1 ); @@ -390,17 +431,40 @@ rule2, tuple2.getActivation() ); - // "logical" should only appear once - assertLength( 1, - workingMemory.getJustified().values() ); + // If logical assert behavior in working memory is IDENTITY, + // must have 2 justified facts + if ( RuleBaseConfiguration.WM_BEHAVIOR_IDENTITY.equals( + ((RuleBaseImpl) ruleBase).getConfiguration().getProperty( + RuleBaseConfiguration.PROPERTY_LOGICAL_ASSERT_BEHAVIOR ) ) ) { + // "logical" should only appear twice + assertLength( 2, + workingMemory.getJustified().values() ); + } else { + // "logical" should only appear once + assertLength( 1, + workingMemory.getJustified().values() ); + } + // retract the logical object workingMemory.retractObject( logicalHandle2 ); - // The logical object should never appear - assertLength( 0, - workingMemory.getJustified().values() ); + // If logical assert behavior in working memory is IDENTITY, + // must have 2 justified facts + if ( RuleBaseConfiguration.WM_BEHAVIOR_IDENTITY.equals( + ((RuleBaseImpl) ruleBase).getConfiguration().getProperty( + RuleBaseConfiguration.PROPERTY_LOGICAL_ASSERT_BEHAVIOR ) ) ) { + // "logical" should only appear once + assertLength( 1, + workingMemory.getJustified().values() ); + } else { + // The logical object should never appear + assertLength( 0, + workingMemory.getJustified().values() ); + } + + } public void testMultipleLogicalRelationships() throws FactException { @@ -481,19 +545,43 @@ rule2, tuple2.getActivation() ); - // "logical" should only appear once - assertLength( 1, - workingMemory.getJustified().values() ); + // If logical assert behavior in working memory is IDENTITY, + // must have 2 justified facts + if ( RuleBaseConfiguration.WM_BEHAVIOR_IDENTITY.equals( + ((RuleBaseImpl) ruleBase).getConfiguration().getProperty( + RuleBaseConfiguration.PROPERTY_LOGICAL_ASSERT_BEHAVIOR ) ) ) { + // "logical" should only appear twice + assertLength( 2, + workingMemory.getJustified().values() ); + } else { + // "logical" should only appear once + assertLength( 1, + workingMemory.getJustified().values() ); + } + // Now lets cancel the first activation node2.retractTuple( tuple2, context2, workingMemory ); - // because this logical fact has two relationships it shouldn't retract yet - assertLength( 0, - sink.getRetracted() ); + workingMemory.propagateQueuedActions(); + // If logical assert behavior in working memory is IDENTITY, + // must have 1 retracted + if ( RuleBaseConfiguration.WM_BEHAVIOR_IDENTITY.equals( + ((RuleBaseImpl) ruleBase).getConfiguration().getProperty( + RuleBaseConfiguration.PROPERTY_LOGICAL_ASSERT_BEHAVIOR ) ) ) { + + // because this logical fact has two relationships it shouldn't retract yet + assertLength( 1, + sink.getRetracted() ); + } else { + // because this logical fact has two relationships it shouldn't retract yet + assertLength( 0, + sink.getRetracted() ); + } + // check "logical" is still in the system assertLength( 1, workingMemory.getJustified().values() ); @@ -502,18 +590,30 @@ node.retractTuple( tuple1, context1, workingMemory ); - + workingMemory.propagateQueuedActions(); - // Should cause the logical fact to be retracted - assertLength( 1, - sink.getRetracted() ); + // If logical assert behavior in working memory is IDENTITY, + // must have 1 retracted + if ( RuleBaseConfiguration.WM_BEHAVIOR_IDENTITY.equals( + ((RuleBaseImpl) ruleBase).getConfiguration().getProperty( + RuleBaseConfiguration.PROPERTY_LOGICAL_ASSERT_BEHAVIOR ) ) ) { + // Should cause the logical fact to be retracted + assertLength( 2, + sink.getRetracted() ); + } else { + // Should cause the logical fact to be retracted + assertLength( 1, + sink.getRetracted() ); + } + + // "logical" fact should no longer be in the system assertLength( 0, workingMemory.getJustified().values() ); } - + /** * This tests that when multiple not identical, but equals facts, are asserted * into WM, only when all are removed, a logical assert will succeed @@ -574,35 +674,60 @@ rule1, tuple1.getActivation() ); - // Checks that previous LogicalAssert failed - assertNull( logicalHandle3 ); - - workingMemory.retractObject( statedHandle2 ); + // if logical assert behavior is identity, must return + // a handle, otherwise, must return null + if ( RuleBaseConfiguration.WM_BEHAVIOR_IDENTITY.equals( + ((RuleBaseImpl) ruleBase).getConfiguration().getProperty( + RuleBaseConfiguration.PROPERTY_LOGICAL_ASSERT_BEHAVIOR ) ) ) { - logicalHandle3 = workingMemory.assertObject( logicalString3, - false, - true, - rule1, - tuple1.getActivation() ); + // Checks that previous LogicalAssert failed + assertNotNull( logicalHandle3 ); + } else { + // Checks that previous LogicalAssert failed + assertNull( logicalHandle3 ); + } - // Checks that previous LogicalAssert failed as there is still one - // stated string in the working memory - assertNull( logicalHandle3 ); - + // If assert behavior in working memory is IDENTITY, + // we need to retract object 2 times before being able to + // succesfully logically assert a new fact + if ( RuleBaseConfiguration.WM_BEHAVIOR_IDENTITY.equals( + ((RuleBaseImpl) ruleBase).getConfiguration().getProperty( + RuleBaseConfiguration.PROPERTY_ASSERT_BEHAVIOR ) ) ) { + + workingMemory.retractObject( statedHandle2 ); + + logicalHandle3 = workingMemory.assertObject( logicalString3, + false, + true, + rule1, + tuple1.getActivation() ); + + // if logical assert behavior is identity, must return + // a handle, otherwise, must return null + if ( RuleBaseConfiguration.WM_BEHAVIOR_IDENTITY.equals( + ((RuleBaseImpl) ruleBase).getConfiguration().getProperty( + RuleBaseConfiguration.PROPERTY_LOGICAL_ASSERT_BEHAVIOR ) ) ) { + + // Checks that previous LogicalAssert failed + assertNotNull( logicalHandle3 ); + } else { + // Checks that previous LogicalAssert failed + assertNull( logicalHandle3 ); + } + } + workingMemory.retractObject( statedHandle1 ); logicalHandle3 = workingMemory.assertObject( logicalString3, - false, - true, - rule1, - tuple1.getActivation() ); + false, + true, + rule1, + tuple1.getActivation() ); // Checks that previous LogicalAssert succeeded as there are no more // stated strings in the working memory assertNotNull( logicalHandle3 ); - + } - - } \ No newline at end of file Added: labs/jbossrules/trunk/drools-core/src/test/resources/manners128.dat =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/resources/manners128.dat 2006-05-20 12:55:37 UTC (rev 4332) +++ labs/jbossrules/trunk/drools-core/src/test/resources/manners128.dat 2006-05-20 21:21:11 UTC (rev 4333) @@ -0,0 +1,440 @@ +(guest (name 1) (sex m) (hobby h2) ) +(guest (name 1) (sex m) (hobby h3) ) +(guest (name 1) (sex m) (hobby h1) ) +(guest (name 1) (sex m) (hobby h4) ) +(guest (name 1) (sex m) (hobby h5) ) +(guest (name 2) (sex f) (hobby h3) ) +(guest (name 2) (sex f) (hobby h2) ) +(guest (name 2) (sex f) (hobby h1) ) +(guest (name 2) (sex f) (hobby h4) ) +(guest (name 2) (sex f) (hobby h5) ) +(guest (name 3) (sex f) (hobby h5) ) +(guest (name 3) (sex f) (hobby h4) ) +(guest (name 3) (sex f) (hobby h2) ) +(guest (name 4) (sex m) (hobby h3) ) +(guest (name 4) (sex m) (hobby h2) ) +(guest (name 4) (sex m) (hobby h1) ) +(guest (name 4) (sex m) (hobby h4) ) +(guest (name 5) (sex m) (hobby h2) ) +(guest (name 5) (sex m) (hobby h5) ) +(guest (name 5) (sex m) (hobby h3) ) +(guest (name 6) (sex f) (hobby h1) ) +(guest (name 6) (sex f) (hobby h4) ) +(guest (name 6) (sex f) (hobby h2) ) +(guest (name 6) (sex f) (hobby h5) ) +(guest (name 6) (sex f) (hobby h3) ) +(guest (name 7) (sex f) (hobby h1) ) +(guest (name 7) (sex f) (hobby h2) ) +(guest (name 7) (sex f) (hobby h3) ) +(guest (name 7) (sex f) (hobby h5) ) +(guest (name 8) (sex m) (hobby h3) ) +(guest (name 8) (sex m) (hobby h5) ) +(guest (name 9) (sex m) (hobby h3) ) +(guest (name 9) (sex m) (hobby h5) ) +(guest (name 9) (sex m) (hobby h2) ) +(guest (name 9) (sex m) (hobby h4) ) +(guest (name 10) (sex m) (hobby h2) ) +(guest (name 10) (sex m) (hobby h3) ) +(guest (name 10) (sex m) (hobby h4) ) +(guest (name 10) (sex m) (hobby h5) ) +(guest (name 10) (sex m) (hobby h1) ) +(guest (name 11) (sex m) (hobby h2) ) +(guest (name 11) (sex m) (hobby h4) ) +(guest (name 11) (sex m) (hobby h5) ) +(guest (name 11) (sex m) (hobby h1) ) +(guest (name 12) (sex f) (hobby h3) ) +(guest (name 12) (sex f) (hobby h5) ) +(guest (name 12) (sex f) (hobby h2) ) +(guest (name 13) (sex f) (hobby h5) ) +(guest (name 13) (sex f) (hobby h1) ) +(guest (name 14) (sex m) (hobby h3) ) +(guest (name 14) (sex m) (hobby h5) ) +(guest (name 14) (sex m) (hobby h1) ) +(guest (name 14) (sex m) (hobby h4) ) +(guest (name 15) (sex m) (hobby h5) ) +(guest (name 15) (sex m) (hobby h2) ) +(guest (name 15) (sex m) (hobby h1) ) +(guest (name 15) (sex m) (hobby h3) ) +(guest (name 15) (sex m) (hobby h4) ) +(guest (name 16) (sex m) (hobby h2) ) +(guest (name 16) (sex m) (hobby h5) ) +(guest (name 16) (sex m) (hobby h4) ) +(guest (name 17) (sex m) (hobby h4) ) +(guest (name 17) (sex m) (hobby h3) ) +(guest (name 18) (sex f) (hobby h2) ) +(guest (name 18) (sex f) (hobby h4) ) +(guest (name 18) (sex f) (hobby h5) ) +(guest (name 18) (sex f) (hobby h1) ) +(guest (name 19) (sex m) (hobby h5) ) +(guest (name 19) (sex m) (hobby h2) ) +(guest (name 20) (sex m) (hobby h2) ) +(guest (name 20) (sex m) (hobby h3) ) +(guest (name 21) (sex m) (hobby h4) ) +(guest (name 21) (sex m) (hobby h3) ) +(guest (name 21) (sex m) (hobby h2) ) +(guest (name 21) (sex m) (hobby h1) ) +(guest (name 22) (sex m) (hobby h1) ) +(guest (name 22) (sex m) (hobby h2) ) +(guest (name 22) (sex m) (hobby h4) ) +(guest (name 23) (sex f) (hobby h4) ) +(guest (name 23) (sex f) (hobby h5) ) +(guest (name 23) (sex f) (hobby h2) ) +(guest (name 24) (sex f) (hobby h4) ) +(guest (name 24) (sex f) (hobby h3) ) +(guest (name 24) (sex f) (hobby h2) ) +(guest (name 24) (sex f) (hobby h1) ) +(guest (name 24) (sex f) (hobby h5) ) +(guest (name 25) (sex m) (hobby h4) ) +(guest (name 25) (sex m) (hobby h5) ) +(guest (name 26) (sex m) (hobby h1) ) +(guest (name 26) (sex m) (hobby h2) ) +(guest (name 27) (sex m) (hobby h3) ) +(guest (name 27) (sex m) (hobby h5) ) +(guest (name 27) (sex m) (hobby h2) ) +(guest (name 28) (sex f) (hobby h4) ) +(guest (name 28) (sex f) (hobby h1) ) +(guest (name 28) (sex f) (hobby h3) ) +(guest (name 28) (sex f) (hobby h2) ) +(guest (name 28) (sex f) (hobby h5) ) +(guest (name 29) (sex f) (hobby h3) ) +(guest (name 29) (sex f) (hobby h5) ) +(guest (name 30) (sex m) (hobby h2) ) +(guest (name 30) (sex m) (hobby h1) ) +(guest (name 31) (sex m) (hobby h3) ) +(guest (name 31) (sex m) (hobby h1) ) +(guest (name 31) (sex m) (hobby h4) ) +(guest (name 32) (sex f) (hobby h2) ) +(guest (name 32) (sex f) (hobby h1) ) +(guest (name 32) (sex f) (hobby h5) ) +(guest (name 33) (sex f) (hobby h5) ) +(guest (name 33) (sex f) (hobby h4) ) +(guest (name 34) (sex m) (hobby h4) ) +(guest (name 34) (sex m) (hobby h5) ) +(guest (name 34) (sex m) (hobby h2) ) +(guest (name 35) (sex f) (hobby h3) ) +(guest (name 35) (sex f) (hobby h1) ) +(guest (name 35) (sex f) (hobby h4) ) +(guest (name 35) (sex f) (hobby h5) ) +(guest (name 35) (sex f) (hobby h2) ) +(guest (name 36) (sex m) (hobby h1) ) +(guest (name 36) (sex m) (hobby h4) ) +(guest (name 36) (sex m) (hobby h2) ) +(guest (name 36) (sex m) (hobby h3) ) +(guest (name 37) (sex f) (hobby h4) ) +(guest (name 37) (sex f) (hobby h2) ) +(guest (name 37) (sex f) (hobby h1) ) +(guest (name 38) (sex f) (hobby h3) ) +(guest (name 38) (sex f) (hobby h1) ) +(guest (name 38) (sex f) (hobby h2) ) +(guest (name 38) (sex f) (hobby h4) ) +(guest (name 39) (sex m) (hobby h5) ) +(guest (name 39) (sex m) (hobby h2) ) +(guest (name 40) (sex m) (hobby h2) ) +(guest (name 40) (sex m) (hobby h3) ) +(guest (name 41) (sex f) (hobby h5) ) +(guest (name 41) (sex f) (hobby h3) ) +(guest (name 42) (sex m) (hobby h5) ) +(guest (name 42) (sex m) (hobby h4) ) +(guest (name 43) (sex m) (hobby h3) ) +(guest (name 43) (sex m) (hobby h4) ) +(guest (name 43) (sex m) (hobby h5) ) +(guest (name 44) (sex f) (hobby h2) ) +(guest (name 44) (sex f) (hobby h4) ) +(guest (name 44) (sex f) (hobby h3) ) +(guest (name 44) (sex f) (hobby h1) ) +(guest (name 45) (sex m) (hobby h2) ) +(guest (name 45) (sex m) (hobby h4) ) +(guest (name 46) (sex m) (hobby h4) ) +(guest (name 46) (sex m) (hobby h1) ) +(guest (name 46) (sex m) (hobby h5) ) +(guest (name 47) (sex m) (hobby h2) ) +(guest (name 47) (sex m) (hobby h5) ) +(guest (name 47) (sex m) (hobby h4) ) +(guest (name 48) (sex f) (hobby h3) ) +(guest (name 48) (sex f) (hobby h1) ) +(guest (name 49) (sex m) (hobby h1) ) +(guest (name 49) (sex m) (hobby h5) ) +(guest (name 49) (sex m) (hobby h4) ) +(guest (name 49) (sex m) (hobby h3) ) +(guest (name 49) (sex m) (hobby h2) ) +(guest (name 50) (sex m) (hobby h2) ) +(guest (name 50) (sex m) (hobby h4) ) +(guest (name 50) (sex m) (hobby h3) ) +(guest (name 51) (sex m) (hobby h1) ) +(guest (name 51) (sex m) (hobby h2) ) +(guest (name 51) (sex m) (hobby h5) ) +(guest (name 51) (sex m) (hobby h4) ) +(guest (name 52) (sex f) (hobby h5) ) +(guest (name 52) (sex f) (hobby h3) ) +(guest (name 52) (sex f) (hobby h1) ) +(guest (name 52) (sex f) (hobby h4) ) +(guest (name 53) (sex f) (hobby h5) ) +(guest (name 53) (sex f) (hobby h1) ) +(guest (name 53) (sex f) (hobby h4) ) +(guest (name 53) (sex f) (hobby h2) ) +(guest (name 53) (sex f) (hobby h3) ) +(guest (name 54) (sex f) (hobby h1) ) +(guest (name 54) (sex f) (hobby h3) ) +(guest (name 55) (sex m) (hobby h2) ) +(guest (name 55) (sex m) (hobby h4) ) +(guest (name 56) (sex m) (hobby h2) ) +(guest (name 56) (sex m) (hobby h3) ) +(guest (name 57) (sex f) (hobby h2) ) +(guest (name 57) (sex f) (hobby h1) ) +(guest (name 57) (sex f) (hobby h4) ) +(guest (name 58) (sex m) (hobby h5) ) +(guest (name 58) (sex m) (hobby h3) ) +(guest (name 58) (sex m) (hobby h2) ) +(guest (name 58) (sex m) (hobby h1) ) +(guest (name 58) (sex m) (hobby h4) ) +(guest (name 59) (sex f) (hobby h2) ) +(guest (name 59) (sex f) (hobby h3) ) +(guest (name 59) (sex f) (hobby h5) ) +(guest (name 60) (sex f) (hobby h4) ) +(guest (name 60) (sex f) (hobby h2) ) +(guest (name 60) (sex f) (hobby h3) ) +(guest (name 60) (sex f) (hobby h5) ) +(guest (name 61) (sex m) (hobby h1) ) +(guest (name 61) (sex m) (hobby h2) ) +(guest (name 61) (sex m) (hobby h4) ) +(guest (name 61) (sex m) (hobby h3) ) +(guest (name 62) (sex f) (hobby h3) ) +(guest (name 62) (sex f) (hobby h2) ) +(guest (name 62) (sex f) (hobby h5) ) +(guest (name 62) (sex f) (hobby h4) ) +(guest (name 62) (sex f) (hobby h1) ) +(guest (name 63) (sex f) (hobby h2) ) +(guest (name 63) (sex f) (hobby h3) ) +(guest (name 63) (sex f) (hobby h4) ) +(guest (name 63) (sex f) (hobby h1) ) +(guest (name 63) (sex f) (hobby h5) ) +(guest (name 64) (sex f) (hobby h2) ) +(guest (name 64) (sex f) (hobby h4) ) +(guest (name 64) (sex f) (hobby h1) ) +(guest (name 64) (sex f) (hobby h5) ) +(guest (name 64) (sex f) (hobby h3) ) +(guest (name 65) (sex m) (hobby h5) ) +(guest (name 65) (sex m) (hobby h3) ) +(guest (name 65) (sex m) (hobby h2) ) +(guest (name 65) (sex m) (hobby h1) ) +(guest (name 65) (sex m) (hobby h4) ) +(guest (name 66) (sex f) (hobby h5) ) +(guest (name 66) (sex f) (hobby h3) ) +(guest (name 66) (sex f) (hobby h4) ) +(guest (name 67) (sex f) (hobby h1) ) +(guest (name 67) (sex f) (hobby h4) ) +(guest (name 68) (sex m) (hobby h4) ) +(guest (name 68) (sex m) (hobby h2) ) +(guest (name 68) (sex m) (hobby h1) ) +(guest (name 68) (sex m) (hobby h5) ) +(guest (name 69) (sex m) (hobby h3) ) +(guest (name 69) (sex m) (hobby h4) ) +(guest (name 69) (sex m) (hobby h1) ) +(guest (name 70) (sex f) (hobby h3) ) +(guest (name 70) (sex f) (hobby h5) ) +(guest (name 70) (sex f) (hobby h1) ) +(guest (name 70) (sex f) (hobby h4) ) +(guest (name 70) (sex f) (hobby h2) ) +(guest (name 71) (sex m) (hobby h3) ) +(guest (name 71) (sex m) (hobby h1) ) +(guest (name 71) (sex m) (hobby h4) ) +(guest (name 72) (sex m) (hobby h4) ) +(guest (name 72) (sex m) (hobby h3) ) +(guest (name 72) (sex m) (hobby h1) ) +(guest (name 73) (sex f) (hobby h4) ) +(guest (name 73) (sex f) (hobby h1) ) +(guest (name 73) (sex f) (hobby h3) ) +(guest (name 74) (sex f) (hobby h1) ) +(guest (name 74) (sex f) (hobby h4) ) +(guest (name 74) (sex f) (hobby h2) ) +(guest (name 74) (sex f) (hobby h5) ) +(guest (name 74) (sex f) (hobby h3) ) +(guest (name 75) (sex f) (hobby h4) ) +(guest (name 75) (sex f) (hobby h2) ) +(guest (name 76) (sex f) (hobby h5) ) +(guest (name 76) (sex f) (hobby h4) ) +(guest (name 76) (sex f) (hobby h3) ) +(guest (name 76) (sex f) (hobby h2) ) +(guest (name 76) (sex f) (hobby h1) ) +(guest (name 77) (sex m) (hobby h1) ) +(guest (name 77) (sex m) (hobby h5) ) +(guest (name 78) (sex m) (hobby h5) ) +(guest (name 78) (sex m) (hobby h1) ) +(guest (name 79) (sex f) (hobby h1) ) +(guest (name 79) (sex f) (hobby h3) ) +(guest (name 79) (sex f) (hobby h4) ) +(guest (name 79) (sex f) (hobby h2) ) +(guest (name 79) (sex f) (hobby h5) ) +(guest (name 80) (sex m) (hobby h5) ) +(guest (name 80) (sex m) (hobby h1) ) +(guest (name 80) (sex m) (hobby h2) ) +(guest (name 80) (sex m) (hobby h4) ) +(guest (name 81) (sex m) (hobby h4) ) +(guest (name 81) (sex m) (hobby h1) ) +(guest (name 82) (sex m) (hobby h3) ) +(guest (name 82) (sex m) (hobby h4) ) +(guest (name 82) (sex m) (hobby h1) ) +(guest (name 82) (sex m) (hobby h2) ) +(guest (name 82) (sex m) (hobby h5) ) +(guest (name 83) (sex f) (hobby h1) ) +(guest (name 83) (sex f) (hobby h3) ) +(guest (name 83) (sex f) (hobby h4) ) +(guest (name 84) (sex m) (hobby h3) ) +(guest (name 84) (sex m) (hobby h4) ) +(guest (name 85) (sex f) (hobby h4) ) +(guest (name 85) (sex f) (hobby h1) ) +(guest (name 86) (sex m) (hobby h3) ) +(guest (name 86) (sex m) (hobby h4) ) +(guest (name 87) (sex m) (hobby h5) ) +(guest (name 87) (sex m) (hobby h4) ) +(guest (name 87) (sex m) (hobby h2) ) +(guest (name 87) (sex m) (hobby h3) ) +(guest (name 88) (sex m) (hobby h2) ) +(guest (name 88) (sex m) (hobby h5) ) +(guest (name 88) (sex m) (hobby h3) ) +(guest (name 88) (sex m) (hobby h1) ) +(guest (name 88) (sex m) (hobby h4) ) +(guest (name 89) (sex f) (hobby h5) ) +(guest (name 89) (sex f) (hobby h2) ) +(guest (name 89) (sex f) (hobby h4) ) +(guest (name 89) (sex f) (hobby h1) ) +(guest (name 90) (sex m) (hobby h2) ) +(guest (name 90) (sex m) (hobby h4) ) +(guest (name 90) (sex m) (hobby h5) ) +(guest (name 91) (sex f) (hobby h2) ) +(guest (name 91) (sex f) (hobby h3) ) +(guest (name 91) (sex f) (hobby h5) ) +(guest (name 91) (sex f) (hobby h1) ) +(guest (name 91) (sex f) (hobby h4) ) +(guest (name 92) (sex f) (hobby h3) ) +(guest (name 92) (sex f) (hobby h1) ) +(guest (name 92) (sex f) (hobby h2) ) +(guest (name 92) (sex f) (hobby h5) ) +(guest (name 93) (sex f) (hobby h3) ) +(guest (name 93) (sex f) (hobby h1) ) +(guest (name 93) (sex f) (hobby h2) ) +(guest (name 94) (sex f) (hobby h2) ) +(guest (name 94) (sex f) (hobby h5) ) +(guest (name 95) (sex f) (hobby h3) ) +(guest (name 95) (sex f) (hobby h4) ) +(guest (name 96) (sex m) (hobby h1) ) +(guest (name 96) (sex m) (hobby h4) ) +(guest (name 96) (sex m) (hobby h2) ) +(guest (name 96) (sex m) (hobby h5) ) +(guest (name 96) (sex m) (hobby h3) ) +(guest (name 97) (sex f) (hobby h4) ) +(guest (name 97) (sex f) (hobby h2) ) +(guest (name 97) (sex f) (hobby h5) ) +(guest (name 98) (sex m) (hobby h5) ) +(guest (name 98) (sex m) (hobby h4) ) +(guest (name 99) (sex f) (hobby h2) ) +(guest (name 99) (sex f) (hobby h5) ) +(guest (name 100) (sex m) (hobby h2) ) +(guest (name 100) (sex m) (hobby h3) ) +(guest (name 100) (sex m) (hobby h5) ) +(guest (name 100) (sex m) (hobby h4) ) +(guest (name 101) (sex f) (hobby h2) ) +(guest (name 101) (sex f) (hobby h1) ) +(guest (name 101) (sex f) (hobby h5) ) +(guest (name 101) (sex f) (hobby h3) ) +(guest (name 101) (sex f) (hobby h4) ) +(guest (name 102) (sex f) (hobby h2) ) +(guest (name 102) (sex f) (hobby h1) ) +(guest (name 102) (sex f) (hobby h5) ) +(guest (name 102) (sex f) (hobby h3) ) +(guest (name 102) (sex f) (hobby h4) ) +(guest (name 103) (sex m) (hobby h2) ) +(guest (name 103) (sex m) (hobby h1) ) +(guest (name 103) (sex m) (hobby h4) ) +(guest (name 103) (sex m) (hobby h3) ) +(guest (name 103) (sex m) (hobby h5) ) +(guest (name 104) (sex m) (hobby h5) ) +(guest (name 104) (sex m) (hobby h3) ) +(guest (name 104) (sex m) (hobby h4) ) +(guest (name 104) (sex m) (hobby h1) ) +(guest (name 104) (sex m) (hobby h2) ) +(guest (name 105) (sex f) (hobby h4) ) +(guest (name 105) (sex f) (hobby h2) ) +(guest (name 106) (sex f) (hobby h4) ) +(guest (name 106) (sex f) (hobby h5) ) +(guest (name 106) (sex f) (hobby h1) ) +(guest (name 107) (sex f) (hobby h3) ) +(guest (name 107) (sex f) (hobby... [truncated message content] |